{"version":3,"file":"interactive-mode-session-command.test.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/interactive-mode-session-command.test.ts"],"names":[],"mappings":"","sourcesContent":["import { Container } from \"@apholdings/jensen-tui\";\nimport stripAnsi from \"strip-ansi\";\nimport { beforeAll, describe, expect, it, vi } from \"vitest\";\nimport type { AgentSession } from \"../../core/agent-session.js\";\nimport type { WorkingContext } from \"../../core/working-context.js\";\nimport { InteractiveMode } from \"./interactive-mode.js\";\nimport { initTheme } from \"./theme/theme.js\";\n\ntype SessionCommandHarness = {\n\thandleSessionCommand: () => void;\n\tchatContainer: Container;\n};\n\nbeforeAll(() => {\n\tinitTheme(\"dark\");\n});\n\nfunction createMockSession(workingContext: Partial<WorkingContext>): AgentSession {\n\treturn {\n\t\tgetSessionStats: () => ({\n\t\t\tsessionFile: undefined,\n\t\t\tsessionId: \"test-session-id\",\n\t\t\tuserMessages: 1,\n\t\t\tassistantMessages: 1,\n\t\t\ttoolCalls: 0,\n\t\t\ttoolResults: 0,\n\t\t\ttotalMessages: 2,\n\t\t\ttokens: { input: 100, output: 50, cacheRead: 0, cacheWrite: 0, total: 150 },\n\t\t\tcost: 0,\n\t\t}),\n\t\tgetWorkingContext: () =>\n\t\t\t({\n\t\t\t\tmemory: {\n\t\t\t\t\titemCount: 0,\n\t\t\t\t\tstaleCount: 0,\n\t\t\t\t\tkeyPreview: [],\n\t\t\t\t\tisPersisted: true,\n\t\t\t\t\tscope: \"current_branch_session_state\",\n\t\t\t\t},\n\t\t\t\ttodo: { total: 0, completed: 0, isPersisted: true, scope: \"current_branch_session_state\" },\n\t\t\t\ttasks: workingContext.tasks ?? {\n\t\t\t\t\ttotal: 0,\n\t\t\t\t\tpending: 0,\n\t\t\t\t\tinProgress: 0,\n\t\t\t\t\tcompleted: 0,\n\t\t\t\t\tisPersisted: true,\n\t\t\t\t\tscope: \"current_branch_session_state\",\n\t\t\t\t},\n\t\t\t\tdelegatedWork: {\n\t\t\t\t\tactiveCount: 0,\n\t\t\t\t\tcompletedCount: 0,\n\t\t\t\t\tfailedCount: 0,\n\t\t\t\t\tactiveAgents: [],\n\t\t\t\t\tfailurePreview: [],\n\t\t\t\t\tisPersisted: false,\n\t\t\t\t\tscope: \"current_process_runtime_state\",\n\t\t\t\t\tnote: \"live current-process state only; not persisted and resets on session switch/resume\",\n\t\t\t\t},\n\t\t\t}) as WorkingContext,\n\t\tgetRecentDelegatedTasks: () => [],\n\t\tsessionManager: { getSessionName: () => undefined },\n\t} as unknown as AgentSession;\n}\n\nfunction createModeInstance(session: AgentSession): SessionCommandHarness {\n\treturn Object.assign(Object.create(InteractiveMode.prototype), {\n\t\tpendingTools: new Map(),\n\t\tchatContainer: new Container(),\n\t\tui: { requestRender: vi.fn(), terminal: { columns: 160 } },\n\t\teditor: { setText: vi.fn() },\n\t\tsession,\n\t}) as unknown as SessionCommandHarness;\n}\n\ndescribe(\"handleSessionCommand task visibility\", () => {\n\tit(\"renders task summary when tasks exist\", () => {\n\t\tconst session = createMockSession({\n\t\t\ttasks: {\n\t\t\t\ttotal: 3,\n\t\t\t\tpending: 1,\n\t\t\t\tinProgress: 1,\n\t\t\t\tcompleted: 1,\n\t\t\t\tinProgressTask: { id: \"task_2\", subject: \"Test task 2\", activeForm: \"Testing\" },\n\t\t\t\tisPersisted: true,\n\t\t\t\tscope: \"current_branch_session_state\",\n\t\t\t},\n\t\t});\n\t\tconst mode = createModeInstance(session);\n\n\t\tmode.handleSessionCommand();\n\n\t\tconst textChild = mode.chatContainer.children.find(\n\t\t\t(c) => \"text\" in c && typeof c.text === \"string\" && c.text.includes(\"Tasks:\"),\n\t\t);\n\t\texpect(textChild).toBeDefined();\n\t\tconst output = stripAnsi((textChild as unknown as { text: string }).text);\n\t\texpect(output).toContain(\"Tasks:\");\n\t\texpect(output).toContain(\"1/3 completed\");\n\t\texpect(output).toContain(\"1 in progress\");\n\t});\n\n\tit(\"renders empty task state correctly\", () => {\n\t\tconst session = createMockSession({\n\t\t\ttasks: {\n\t\t\t\ttotal: 0,\n\t\t\t\tpending: 0,\n\t\t\t\tinProgress: 0,\n\t\t\t\tcompleted: 0,\n\t\t\t\tisPersisted: true,\n\t\t\t\tscope: \"current_branch_session_state\",\n\t\t\t},\n\t\t});\n\t\tconst mode = createModeInstance(session);\n\n\t\tmode.handleSessionCommand();\n\n\t\tconst textChild = mode.chatContainer.children.find(\n\t\t\t(c) => \"text\" in c && typeof c.text === \"string\" && c.text.includes(\"Tasks:\"),\n\t\t);\n\t\texpect(textChild).toBeDefined();\n\t\tconst output = stripAnsi((textChild as unknown as { text: string }).text);\n\t\texpect(output).toContain(\"0/0 completed\");\n\t});\n\n\tit(\"surfaces in-progress task subject\", () => {\n\t\tconst session = createMockSession({\n\t\t\ttasks: {\n\t\t\t\ttotal: 2,\n\t\t\t\tpending: 1,\n\t\t\t\tinProgress: 1,\n\t\t\t\tcompleted: 0,\n\t\t\t\tinProgressTask: { id: \"task_1\", subject: \"Implement feature X\", activeForm: \"Implementing feature X\" },\n\t\t\t\tisPersisted: true,\n\t\t\t\tscope: \"current_branch_session_state\",\n\t\t\t},\n\t\t});\n\t\tconst mode = createModeInstance(session);\n\n\t\tmode.handleSessionCommand();\n\n\t\tconst textChild = mode.chatContainer.children.find(\n\t\t\t(c) => \"text\" in c && typeof c.text === \"string\" && c.text.includes(\"Tasks:\"),\n\t\t);\n\t\texpect(textChild).toBeDefined();\n\t\tconst output = stripAnsi((textChild as unknown as { text: string }).text);\n\t\texpect(output).toContain(\"Implement feature X\");\n\t});\n\n\tit(\"does not regress existing session sections\", () => {\n\t\tconst session = createMockSession({});\n\t\tconst mode = createModeInstance(session);\n\n\t\tmode.handleSessionCommand();\n\n\t\tconst textChild = mode.chatContainer.children.find((c) => \"text\" in c && typeof c.text === \"string\");\n\t\texpect(textChild).toBeDefined();\n\t\tconst output = stripAnsi((textChild as unknown as { text: string }).text);\n\t\texpect(output).toContain(\"Session Info\");\n\t\texpect(output).toContain(\"Memory:\");\n\t\texpect(output).toContain(\"Plan:\");\n\t\texpect(output).toContain(\"Delegated:\");\n\t\texpect(output).toContain(\"Tokens\");\n\t});\n});\n"]}