@ai-devkit/agent-manager 0.31.0 → 0.33.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentManager.d.ts +3 -3
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +80 -79
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +413 -388
- package/dist/__tests__/AgentManager.test.js.map +1 -1
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +642 -642
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js +322 -2321
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/CopilotAdapter.test.js +254 -248
- package/dist/__tests__/adapters/CopilotAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js +564 -558
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/GrokCliAdapter.test.js +114 -114
- package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/OpenCodeAdapter.test.js +169 -169
- package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/capacity/codex.test.js +93 -93
- package/dist/__tests__/capacity/codex.test.js.map +1 -1
- package/dist/__tests__/capacity/index.test.js +17 -17
- package/dist/__tests__/capacity/index.test.js.map +1 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js +60 -60
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -1
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +28 -28
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +30 -30
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintAgentService.test.js +71 -71
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/durable/CodexPrintRunner.test.js +125 -125
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -1
- package/dist/__tests__/print/ClaudeCliProbe.test.js +20 -20
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +20 -20
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js +58 -58
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js +55 -55
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgent.test.js +9 -9
- package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js +40 -40
- package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgentRepository.test.js +66 -66
- package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +34 -34
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -1
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +132 -132
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +194 -0
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +1 -0
- package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +86 -0
- package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +1 -0
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js +254 -0
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiAdapter.test.js +337 -0
- package/dist/__tests__/providers/pi/PiAdapter.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiSessionParser.test.js +246 -0
- package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +1 -0
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js +108 -0
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +33 -33
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +16 -16
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +52 -52
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +44 -44
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +126 -126
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -1
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +14 -14
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -1
- package/dist/__tests__/readiness/AgentReadiness.test.js +301 -0
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -0
- package/dist/__tests__/runtime/AgentRuntime.test.js +13 -0
- package/dist/__tests__/runtime/AgentRuntime.test.js.map +1 -0
- package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +452 -0
- package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +588 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -0
- package/dist/__tests__/terminal/TerminalFocusManager.test.js +100 -100
- package/dist/__tests__/terminal/TerminalFocusManager.test.js.map +1 -1
- package/dist/__tests__/terminal/TmuxManager.test.js +101 -101
- package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
- package/dist/__tests__/terminal/TtyWriter.test.js +185 -185
- package/dist/__tests__/terminal/TtyWriter.test.js.map +1 -1
- package/dist/__tests__/utils/AgentRegistry.test.js +335 -217
- package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
- package/dist/__tests__/utils/ClaudeSessionParser.test.js +103 -101
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
- package/dist/__tests__/utils/agent-requests.test.js +43 -43
- package/dist/__tests__/utils/agent-requests.test.js.map +1 -1
- package/dist/__tests__/utils/agents.test.js +17 -17
- package/dist/__tests__/utils/agents.test.js.map +1 -1
- package/dist/__tests__/utils/matching.test.js +92 -92
- package/dist/__tests__/utils/matching.test.js.map +1 -1
- package/dist/__tests__/utils/process.test.js +108 -108
- package/dist/__tests__/utils/process.test.js.map +1 -1
- package/dist/__tests__/utils/session.test.js +53 -53
- package/dist/__tests__/utils/session.test.js.map +1 -1
- package/dist/adapters/AgentAdapter.d.ts +2 -2
- package/dist/adapters/AgentAdapter.d.ts.map +1 -1
- package/dist/adapters/AgentAdapter.js +1 -1
- package/dist/adapters/AgentAdapter.js.map +1 -1
- package/dist/adapters/CopilotAdapter.d.ts +2 -2
- package/dist/adapters/CopilotAdapter.d.ts.map +1 -1
- package/dist/adapters/CopilotAdapter.js +51 -51
- package/dist/adapters/CopilotAdapter.js.map +1 -1
- package/dist/adapters/GeminiCliAdapter.d.ts +2 -2
- package/dist/adapters/GeminiCliAdapter.d.ts.map +1 -1
- package/dist/adapters/GeminiCliAdapter.js +86 -86
- package/dist/adapters/GeminiCliAdapter.js.map +1 -1
- package/dist/adapters/GrokCliAdapter.d.ts +1 -1
- package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
- package/dist/adapters/GrokCliAdapter.js +80 -80
- package/dist/adapters/GrokCliAdapter.js.map +1 -1
- package/dist/adapters/OpenCodeAdapter.d.ts +1 -1
- package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenCodeAdapter.js +37 -36
- package/dist/adapters/OpenCodeAdapter.js.map +1 -1
- package/dist/adapters/index.d.ts +9 -9
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +8 -8
- package/dist/adapters/index.js.map +1 -1
- package/dist/capacity/codex.d.ts +3 -3
- package/dist/capacity/codex.d.ts.map +1 -1
- package/dist/capacity/codex.js +57 -57
- package/dist/capacity/codex.js.map +1 -1
- package/dist/capacity/index.d.ts +3 -3
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +8 -8
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/types.d.ts +1 -1
- package/dist/capacity/types.js.map +1 -1
- package/dist/database/connection.d.ts +1 -1
- package/dist/database/connection.d.ts.map +1 -1
- package/dist/database/connection.js +15 -15
- package/dist/database/connection.js.map +1 -1
- package/dist/database/index.d.ts +3 -3
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +2 -2
- package/dist/database/index.js.map +1 -1
- package/dist/database/migrations/005_agent_runtime.sql +2 -0
- package/dist/database/schema.d.ts +1 -1
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +7 -7
- package/dist/database/schema.js.map +1 -1
- package/dist/durable/DurableAgent.d.ts +9 -9
- package/dist/durable/DurableAgent.d.ts.map +1 -1
- package/dist/durable/DurableAgent.js +16 -16
- package/dist/durable/DurableAgent.js.map +1 -1
- package/dist/durable/DurableAgentRepository.d.ts +4 -4
- package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
- package/dist/durable/DurableAgentRepository.js +49 -48
- package/dist/durable/DurableAgentRepository.js.map +1 -1
- package/dist/durable/process.d.ts +1 -1
- package/dist/durable/process.d.ts.map +1 -1
- package/dist/durable/process.js +14 -14
- package/dist/durable/process.js.map +1 -1
- package/dist/durable/run.d.ts +2 -2
- package/dist/durable/run.d.ts.map +1 -1
- package/dist/durable/run.js +6 -6
- package/dist/durable/run.js.map +1 -1
- package/dist/durable/utils.d.ts +1 -1
- package/dist/durable/utils.d.ts.map +1 -1
- package/dist/durable/utils.js +4 -4
- package/dist/durable/utils.js.map +1 -1
- package/dist/index.d.ts +46 -41
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -25
- package/dist/index.js.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
- package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
- package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
- package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
- package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
- package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
- package/dist/providers/claude/ClaudeSessionParser.js +99 -99
- package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
- package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
- package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
- package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
- package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
- package/dist/providers/codex/CodexAdapter.d.ts +27 -0
- package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/providers/codex/CodexAdapter.js +162 -0
- package/dist/providers/codex/CodexAdapter.js.map +1 -0
- package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
- package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
- package/dist/providers/codex/CodexAgentMapper.js +35 -0
- package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
- package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
- package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionLocator.js +207 -0
- package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
- package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
- package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionMapping.js +68 -0
- package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
- package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
- package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
- package/dist/providers/codex/CodexSessionParser.js +262 -0
- package/dist/providers/codex/CodexSessionParser.js.map +1 -0
- package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
- package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
- package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
- package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
- package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
- package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
- package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
- package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
- package/dist/providers/pi/PiAdapter.d.ts +28 -0
- package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
- package/dist/providers/pi/PiAdapter.js +153 -0
- package/dist/providers/pi/PiAdapter.js.map +1 -0
- package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
- package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
- package/dist/providers/pi/PiAgentMapper.js +37 -0
- package/dist/providers/pi/PiAgentMapper.js.map +1 -0
- package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
- package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionLocator.js +79 -0
- package/dist/providers/pi/PiSessionLocator.js.map +1 -0
- package/dist/providers/pi/PiSessionParser.d.ts +36 -0
- package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionParser.js +191 -0
- package/dist/providers/pi/PiSessionParser.js.map +1 -0
- package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
- package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
- package/dist/providers/pi/PiSessionTracker.js +69 -0
- package/dist/providers/pi/PiSessionTracker.js.map +1 -0
- package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiCliProbe.js +15 -15
- package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
- package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
- package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
- package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
- package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
- package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
- package/dist/providers/pi/durable/PiStreamParser.js +16 -16
- package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
- package/dist/readiness/AgentReadiness.d.ts +67 -0
- package/dist/readiness/AgentReadiness.d.ts.map +1 -0
- package/dist/readiness/AgentReadiness.js +614 -0
- package/dist/readiness/AgentReadiness.js.map +1 -0
- package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
- package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/ManagedAgentRuntime.js +156 -0
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
- package/dist/runtime/RuntimeFactory.d.ts +4 -0
- package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
- package/dist/runtime/RuntimeFactory.js +11 -0
- package/dist/runtime/RuntimeFactory.js.map +1 -0
- package/dist/runtime/errors.d.ts +27 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/errors.js +42 -0
- package/dist/runtime/errors.js.map +1 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +31 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.js +184 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -0
- package/dist/runtime/herdr/HerdrCliClient.d.ts +13 -0
- package/dist/runtime/herdr/HerdrCliClient.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrCliClient.js +60 -0
- package/dist/runtime/herdr/HerdrCliClient.js.map +1 -0
- package/dist/runtime/herdr/HerdrErrors.d.ts +7 -0
- package/dist/runtime/herdr/HerdrErrors.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrErrors.js +10 -0
- package/dist/runtime/herdr/HerdrErrors.js.map +1 -0
- package/dist/runtime/herdr/HerdrResponseParsers.d.ts +14 -0
- package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrResponseParsers.js +96 -0
- package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.d.ts +9 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.js +33 -0
- package/dist/runtime/herdr/HerdrRuntimeRef.js.map +1 -0
- package/dist/runtime/tmux/PidPolling.d.ts +5 -0
- package/dist/runtime/tmux/PidPolling.d.ts.map +1 -0
- package/dist/runtime/tmux/PidPolling.js +24 -0
- package/dist/runtime/tmux/PidPolling.js.map +1 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +17 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.js +80 -0
- package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.d.ts +5 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.d.ts.map +1 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.js +9 -0
- package/dist/runtime/tmux/TmuxRuntimeRef.js.map +1 -0
- package/dist/runtime/types.d.ts +54 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +3 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
- package/dist/terminal/TerminalFocusManager.js +50 -50
- package/dist/terminal/TerminalFocusManager.js.map +1 -1
- package/dist/terminal/TmuxManager.d.ts.map +1 -1
- package/dist/terminal/TmuxManager.js +47 -47
- package/dist/terminal/TmuxManager.js.map +1 -1
- package/dist/terminal/TtyWriter.d.ts +1 -1
- package/dist/terminal/TtyWriter.d.ts.map +1 -1
- package/dist/terminal/TtyWriter.js +89 -89
- package/dist/terminal/TtyWriter.js.map +1 -1
- package/dist/terminal/index.d.ts +4 -4
- package/dist/terminal/index.js +3 -3
- package/dist/terminal/index.js.map +1 -1
- package/dist/utils/AgentRegistry.d.ts +10 -2
- package/dist/utils/AgentRegistry.d.ts.map +1 -1
- package/dist/utils/AgentRegistry.js +57 -24
- package/dist/utils/AgentRegistry.js.map +1 -1
- package/dist/utils/agent-requests.d.ts.map +1 -1
- package/dist/utils/agent-requests.js +5 -5
- package/dist/utils/agent-requests.js.map +1 -1
- package/dist/utils/agents.d.ts +2 -2
- package/dist/utils/agents.d.ts.map +1 -1
- package/dist/utils/agents.js +15 -15
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/applescript.js +1 -1
- package/dist/utils/applescript.js.map +1 -1
- package/dist/utils/index.d.ts +6 -6
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +4 -4
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/matching.d.ts +2 -2
- package/dist/utils/matching.d.ts.map +1 -1
- package/dist/utils/matching.js +4 -4
- package/dist/utils/matching.js.map +1 -1
- package/dist/utils/process.d.ts +1 -1
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +74 -74
- package/dist/utils/process.js.map +1 -1
- package/dist/utils/session.d.ts +1 -1
- package/dist/utils/session.d.ts.map +1 -1
- package/dist/utils/session.js +7 -7
- package/dist/utils/session.js.map +1 -1
- package/dist/utils/sortAgents.d.ts +2 -2
- package/dist/utils/sortAgents.d.ts.map +1 -1
- package/dist/utils/sortAgents.js +5 -5
- package/dist/utils/sortAgents.js.map +1 -1
- package/package.json +18 -19
- package/src/AgentManager.ts +283 -281
- package/src/__tests__/AgentManager.test.ts +917 -907
- package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
- package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
- package/src/__tests__/adapters/CopilotAdapter.test.ts +576 -481
- package/src/__tests__/adapters/GeminiCliAdapter.test.ts +1189 -1157
- package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
- package/src/__tests__/adapters/OpenCodeAdapter.test.ts +510 -455
- package/src/__tests__/capacity/codex.test.ts +178 -91
- package/src/__tests__/capacity/index.test.ts +27 -18
- package/src/__tests__/durable/CodexCliProbe.test.ts +75 -53
- package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +51 -40
- package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +89 -64
- package/src/__tests__/durable/CodexPrintAgentService.test.ts +196 -118
- package/src/__tests__/durable/CodexPrintRunner.test.ts +282 -162
- package/src/__tests__/fixtures/fake-claude.cjs +20 -13
- package/src/__tests__/fixtures/fake-codex.cjs +41 -30
- package/src/__tests__/print/ClaudeCliProbe.test.ts +27 -21
- package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +48 -40
- package/src/__tests__/print/ClaudePrintAgentService.test.ts +118 -67
- package/src/__tests__/print/ClaudePrintRunner.test.ts +136 -83
- package/src/__tests__/print/DurableAgent.test.ts +19 -16
- package/src/__tests__/print/DurableAgentRepository.sqlite.test.ts +109 -86
- package/src/__tests__/print/DurableAgentRepository.test.ts +170 -137
- package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +65 -65
- package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +400 -377
- package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +182 -0
- package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +63 -0
- package/src/__tests__/providers/codex/CodexSessionParser.test.ts +192 -0
- package/src/__tests__/providers/pi/PiAdapter.test.ts +310 -0
- package/src/__tests__/providers/pi/PiSessionParser.test.ts +190 -0
- package/src/__tests__/providers/pi/PiSessionTracker.test.ts +79 -0
- package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +48 -32
- package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +24 -23
- package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +131 -59
- package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +66 -28
- package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +236 -90
- package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +20 -18
- package/src/__tests__/readiness/AgentReadiness.test.ts +242 -0
- package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
- package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +358 -0
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +555 -0
- package/src/__tests__/terminal/TerminalFocusManager.test.ts +254 -253
- package/src/__tests__/terminal/TmuxManager.test.ts +157 -157
- package/src/__tests__/terminal/TtyWriter.test.ts +423 -419
- package/src/__tests__/utils/AgentRegistry.test.ts +506 -402
- package/src/__tests__/utils/ClaudeSessionParser.test.ts +276 -242
- package/src/__tests__/utils/agent-requests.test.ts +76 -56
- package/src/__tests__/utils/agents.test.ts +20 -20
- package/src/__tests__/utils/matching.test.ts +206 -171
- package/src/__tests__/utils/process.test.ts +276 -262
- package/src/__tests__/utils/session.test.ts +133 -139
- package/src/adapters/AgentAdapter.ts +134 -126
- package/src/adapters/CopilotAdapter.ts +405 -395
- package/src/adapters/GeminiCliAdapter.ts +598 -600
- package/src/adapters/GrokCliAdapter.ts +353 -342
- package/src/adapters/OpenCodeAdapter.ts +285 -259
- package/src/adapters/index.ts +15 -9
- package/src/capacity/codex.ts +137 -84
- package/src/capacity/index.ts +18 -13
- package/src/capacity/types.ts +1 -1
- package/src/database/connection.ts +73 -68
- package/src/database/index.ts +6 -6
- package/src/database/migrations/005_agent_runtime.sql +2 -0
- package/src/database/schema.ts +40 -38
- package/src/durable/DurableAgent.ts +85 -85
- package/src/durable/DurableAgentRepository.ts +409 -260
- package/src/durable/process.ts +22 -21
- package/src/durable/run.ts +61 -51
- package/src/durable/utils.ts +46 -41
- package/src/index.ts +145 -86
- package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
- package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
- package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
- package/src/providers/claude/ClaudeSessionParser.ts +322 -338
- package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
- package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
- package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
- package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
- package/src/providers/codex/CodexAdapter.ts +205 -0
- package/src/providers/codex/CodexAgentMapper.ts +35 -0
- package/src/providers/codex/CodexSessionLocator.ts +279 -0
- package/src/providers/codex/CodexSessionMapping.ts +89 -0
- package/src/providers/codex/CodexSessionParser.ts +385 -0
- package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
- package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
- package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
- package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
- package/src/providers/pi/PiAdapter.ts +183 -0
- package/src/providers/pi/PiAgentMapper.ts +36 -0
- package/src/providers/pi/PiSessionLocator.ts +95 -0
- package/src/providers/pi/PiSessionParser.ts +284 -0
- package/src/providers/pi/PiSessionTracker.ts +87 -0
- package/src/providers/pi/durable/PiCliProbe.ts +42 -34
- package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
- package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
- package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
- package/src/providers/pi/durable/PiStreamParser.ts +82 -72
- package/src/readiness/AgentReadiness.ts +727 -0
- package/src/runtime/ManagedAgentRuntime.ts +266 -0
- package/src/runtime/RuntimeFactory.ts +13 -0
- package/src/runtime/errors.ts +50 -0
- package/src/runtime/herdr/HerdrAgentRuntime.ts +190 -0
- package/src/runtime/herdr/HerdrCliClient.ts +78 -0
- package/src/runtime/herdr/HerdrErrors.ts +9 -0
- package/src/runtime/herdr/HerdrResponseParsers.ts +76 -0
- package/src/runtime/herdr/HerdrRuntimeRef.ts +41 -0
- package/src/runtime/tmux/PidPolling.ts +34 -0
- package/src/runtime/tmux/TmuxAgentRuntime.ts +113 -0
- package/src/runtime/tmux/TmuxRuntimeRef.ts +9 -0
- package/src/runtime/types.ts +56 -0
- package/src/terminal/TerminalFocusManager.ts +215 -212
- package/src/terminal/TmuxManager.ts +99 -92
- package/src/terminal/TtyWriter.ts +203 -194
- package/src/terminal/index.ts +4 -4
- package/src/utils/AgentRegistry.ts +299 -238
- package/src/utils/agent-requests.ts +16 -16
- package/src/utils/agents.ts +41 -38
- package/src/utils/applescript.ts +4 -4
- package/src/utils/index.ts +12 -6
- package/src/utils/matching.ts +43 -43
- package/src/utils/process.ts +261 -258
- package/src/utils/session.ts +66 -66
- package/src/utils/sortAgents.ts +35 -33
- package/tsconfig.json +2 -8
- package/vitest.config.ts +16 -16
- package/.eslintrc.json +0 -31
- package/dist/__tests__/adapters/PiAdapter.test.js +0 -618
- package/dist/__tests__/adapters/PiAdapter.test.js.map +0 -1
- package/dist/__tests__/database/DurableAgentsDatabase.test.js +0 -128
- package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +0 -1
- package/dist/adapters/CodexAdapter.d.ts +0 -109
- package/dist/adapters/CodexAdapter.d.ts.map +0 -1
- package/dist/adapters/CodexAdapter.js +0 -710
- package/dist/adapters/CodexAdapter.js.map +0 -1
- package/dist/adapters/PiAdapter.d.ts +0 -63
- package/dist/adapters/PiAdapter.d.ts.map +0 -1
- package/dist/adapters/PiAdapter.js +0 -453
- package/dist/adapters/PiAdapter.js.map +0 -1
- package/src/__tests__/adapters/PiAdapter.test.ts +0 -458
- package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
- package/src/adapters/CodexAdapter.ts +0 -923
- package/src/adapters/PiAdapter.ts +0 -598
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
*
|
|
4
4
|
* The adapter resolves a live process to its cwd via ~/.grok/active_sessions.json
|
|
5
5
|
* and reads session details from chat_history.jsonl (not summary.json/updates.jsonl).
|
|
6
|
-
*/ import * as fs from
|
|
7
|
-
import * as os from
|
|
8
|
-
import * as path from
|
|
9
|
-
import { GrokCliAdapter } from
|
|
10
|
-
import { AgentStatus } from
|
|
11
|
-
import { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from
|
|
12
|
-
import { generateAgentName } from
|
|
13
|
-
vi.mock(
|
|
6
|
+
*/ import * as fs from "fs";
|
|
7
|
+
import * as os from "os";
|
|
8
|
+
import * as path from "path";
|
|
9
|
+
import { GrokCliAdapter } from "../../adapters/GrokCliAdapter.js";
|
|
10
|
+
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
11
|
+
import { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from "../../utils/process.js";
|
|
12
|
+
import { generateAgentName } from "../../utils/matching.js";
|
|
13
|
+
vi.mock("../../utils/process.js", async (importOriginal)=>{
|
|
14
14
|
const actual = await importOriginal();
|
|
15
15
|
return {
|
|
16
16
|
...actual,
|
|
@@ -19,7 +19,7 @@ vi.mock('../../utils/process.js', async (importOriginal)=>{
|
|
|
19
19
|
captureProcessSnapshot: vi.fn()
|
|
20
20
|
};
|
|
21
21
|
});
|
|
22
|
-
vi.mock(
|
|
22
|
+
vi.mock("../../utils/matching.js", async (importOriginal)=>{
|
|
23
23
|
const actual = await importOriginal();
|
|
24
24
|
return {
|
|
25
25
|
...actual,
|
|
@@ -30,47 +30,47 @@ const mockedListAgentProcesses = listAgentProcesses;
|
|
|
30
30
|
const mockedEnrichProcesses = enrichProcesses;
|
|
31
31
|
const mockedCaptureProcessSnapshot = captureProcessSnapshot;
|
|
32
32
|
const mockedGenerateAgentName = generateAgentName;
|
|
33
|
-
const SESSION_ID =
|
|
33
|
+
const SESSION_ID = "019f16c3-5d5d-7dc3-85d1-bc629416ca2d";
|
|
34
34
|
/** A user transcript record: the real prompt wrapped in <user_query> like Grok writes it. */ const userRecord = (text)=>({
|
|
35
|
-
type:
|
|
35
|
+
type: "user",
|
|
36
36
|
content: [
|
|
37
37
|
{
|
|
38
|
-
type:
|
|
38
|
+
type: "text",
|
|
39
39
|
text: `<user_query>\n${text}\n</user_query>`
|
|
40
40
|
}
|
|
41
41
|
]
|
|
42
42
|
});
|
|
43
43
|
/** A user context-injection record (no <user_query>) — should be ignored as a prompt. */ const contextRecord = (text)=>({
|
|
44
|
-
type:
|
|
44
|
+
type: "user",
|
|
45
45
|
content: [
|
|
46
46
|
{
|
|
47
|
-
type:
|
|
47
|
+
type: "text",
|
|
48
48
|
text
|
|
49
49
|
}
|
|
50
50
|
]
|
|
51
51
|
});
|
|
52
52
|
const assistantRecord = (text)=>({
|
|
53
|
-
type:
|
|
53
|
+
type: "assistant",
|
|
54
54
|
content: [
|
|
55
55
|
{
|
|
56
|
-
type:
|
|
56
|
+
type: "text",
|
|
57
57
|
text
|
|
58
58
|
}
|
|
59
59
|
]
|
|
60
60
|
});
|
|
61
61
|
const systemRecord = (text)=>({
|
|
62
|
-
type:
|
|
62
|
+
type: "system",
|
|
63
63
|
content: text
|
|
64
64
|
});
|
|
65
|
-
describe(
|
|
65
|
+
describe("GrokCliAdapter", ()=>{
|
|
66
66
|
let adapter;
|
|
67
67
|
let tmpHome;
|
|
68
68
|
let cwd;
|
|
69
69
|
beforeEach(()=>{
|
|
70
|
-
tmpHome = fs.mkdtempSync(path.join(os.tmpdir(),
|
|
70
|
+
tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), "grok-adapter-test-"));
|
|
71
71
|
process.env.HOME = tmpHome;
|
|
72
72
|
delete process.env.GROK_HOME;
|
|
73
|
-
cwd =
|
|
73
|
+
cwd = "/Users/dev/my-project";
|
|
74
74
|
adapter = new GrokCliAdapter();
|
|
75
75
|
mockedListAgentProcesses.mockReset();
|
|
76
76
|
mockedEnrichProcesses.mockReset();
|
|
@@ -79,7 +79,7 @@ describe('GrokCliAdapter', ()=>{
|
|
|
79
79
|
mockedEnrichProcesses.mockImplementation((procs)=>procs);
|
|
80
80
|
// Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.
|
|
81
81
|
mockedCaptureProcessSnapshot.mockImplementation(async (names)=>enrichProcesses(names.flatMap((name)=>listAgentProcesses(name))));
|
|
82
|
-
mockedGenerateAgentName.mockImplementation((c, pid)=>`${path.basename(c) ||
|
|
82
|
+
mockedGenerateAgentName.mockImplementation((c, pid)=>`${path.basename(c) || "unknown"}-${pid}`);
|
|
83
83
|
});
|
|
84
84
|
afterEach(()=>{
|
|
85
85
|
fs.rmSync(tmpHome, {
|
|
@@ -90,71 +90,71 @@ describe('GrokCliAdapter', ()=>{
|
|
|
90
90
|
/** Write a session dir under ~/.grok/sessions/<enc(cwd)>/<id>/chat_history.jsonl. */ function writeSession(opts) {
|
|
91
91
|
const sessionCwd = opts.sessionCwd ?? cwd;
|
|
92
92
|
const id = opts.id ?? SESSION_ID;
|
|
93
|
-
const sessionDir = path.join(tmpHome,
|
|
93
|
+
const sessionDir = path.join(tmpHome, ".grok", "sessions", encodeURIComponent(sessionCwd), id);
|
|
94
94
|
fs.mkdirSync(sessionDir, {
|
|
95
95
|
recursive: true
|
|
96
96
|
});
|
|
97
97
|
if (opts.chat !== false) {
|
|
98
98
|
const records = opts.records ?? [
|
|
99
|
-
userRecord(
|
|
99
|
+
userRecord("fix the bug")
|
|
100
100
|
];
|
|
101
|
-
const chatPath = path.join(sessionDir,
|
|
102
|
-
fs.writeFileSync(chatPath, records.map((r)=>JSON.stringify(r)).join(
|
|
101
|
+
const chatPath = path.join(sessionDir, "chat_history.jsonl");
|
|
102
|
+
fs.writeFileSync(chatPath, records.map((r)=>JSON.stringify(r)).join("\n"));
|
|
103
103
|
if (opts.mtime) fs.utimesSync(chatPath, opts.mtime, opts.mtime);
|
|
104
104
|
}
|
|
105
105
|
return sessionDir;
|
|
106
106
|
}
|
|
107
107
|
/** Write ~/.grok/active_sessions.json (the live pid -> cwd registry). */ function writeActiveSessions(entries) {
|
|
108
|
-
fs.mkdirSync(path.join(tmpHome,
|
|
108
|
+
fs.mkdirSync(path.join(tmpHome, ".grok"), {
|
|
109
109
|
recursive: true
|
|
110
110
|
});
|
|
111
|
-
fs.writeFileSync(path.join(tmpHome,
|
|
111
|
+
fs.writeFileSync(path.join(tmpHome, ".grok", "active_sessions.json"), JSON.stringify(entries));
|
|
112
112
|
}
|
|
113
113
|
function proc(overrides = {}) {
|
|
114
114
|
return {
|
|
115
115
|
pid: 4242,
|
|
116
116
|
ppid: 1,
|
|
117
|
-
command:
|
|
117
|
+
command: "grok",
|
|
118
118
|
cwd,
|
|
119
|
-
tty:
|
|
119
|
+
tty: "ttys010",
|
|
120
120
|
startTime: new Date(),
|
|
121
121
|
...overrides
|
|
122
122
|
};
|
|
123
123
|
}
|
|
124
|
-
describe(
|
|
125
|
-
it(
|
|
126
|
-
expect(adapter.type).toBe(
|
|
124
|
+
describe("initialization", ()=>{
|
|
125
|
+
it("exposes the grok_cli type", ()=>{
|
|
126
|
+
expect(adapter.type).toBe("grok_cli");
|
|
127
127
|
});
|
|
128
128
|
});
|
|
129
|
-
describe(
|
|
130
|
-
it(
|
|
129
|
+
describe("canHandle", ()=>{
|
|
130
|
+
it("returns true for a plain grok command", ()=>{
|
|
131
131
|
expect(adapter.canHandle(proc({
|
|
132
|
-
command:
|
|
132
|
+
command: "grok"
|
|
133
133
|
}))).toBe(true);
|
|
134
134
|
});
|
|
135
|
-
it(
|
|
135
|
+
it("returns true for grok with a full path and args", ()=>{
|
|
136
136
|
expect(adapter.canHandle(proc({
|
|
137
|
-
command:
|
|
137
|
+
command: "/Users/dev/.grok/bin/grok --always-approve"
|
|
138
138
|
}))).toBe(true);
|
|
139
139
|
});
|
|
140
|
-
it(
|
|
140
|
+
it("returns false for non-grok processes", ()=>{
|
|
141
141
|
expect(adapter.canHandle(proc({
|
|
142
|
-
command:
|
|
142
|
+
command: "node app.js"
|
|
143
143
|
}))).toBe(false);
|
|
144
144
|
});
|
|
145
145
|
it('returns false when "grok" appears only in an argument path', ()=>{
|
|
146
146
|
expect(adapter.canHandle(proc({
|
|
147
|
-
command:
|
|
147
|
+
command: "node /path/to/grok-thing.js"
|
|
148
148
|
}))).toBe(false);
|
|
149
149
|
});
|
|
150
150
|
});
|
|
151
|
-
describe(
|
|
152
|
-
it(
|
|
151
|
+
describe("detectAgents", ()=>{
|
|
152
|
+
it("returns [] when there are no grok processes", async ()=>{
|
|
153
153
|
mockedListAgentProcesses.mockReturnValue([]);
|
|
154
154
|
expect(await adapter.detectAgents()).toEqual([]);
|
|
155
155
|
});
|
|
156
|
-
it(
|
|
157
|
-
const realCwd =
|
|
156
|
+
it("resolves the cwd via active_sessions.json (authoritative over the process cwd)", async ()=>{
|
|
157
|
+
const realCwd = "/Users/dev/real-project";
|
|
158
158
|
writeSession({
|
|
159
159
|
sessionCwd: realCwd
|
|
160
160
|
});
|
|
@@ -168,26 +168,26 @@ describe('GrokCliAdapter', ()=>{
|
|
|
168
168
|
]);
|
|
169
169
|
mockedListAgentProcesses.mockReturnValue([
|
|
170
170
|
proc({
|
|
171
|
-
cwd:
|
|
171
|
+
cwd: "/wrong/path"
|
|
172
172
|
})
|
|
173
173
|
]);
|
|
174
174
|
const agents = await adapter.detectAgents();
|
|
175
175
|
expect(agents).toHaveLength(1);
|
|
176
176
|
expect(agents[0]).toMatchObject({
|
|
177
|
-
type:
|
|
177
|
+
type: "grok_cli",
|
|
178
178
|
pid: 4242,
|
|
179
179
|
projectPath: realCwd,
|
|
180
180
|
sessionId: SESSION_ID,
|
|
181
|
-
summary:
|
|
181
|
+
summary: "fix the bug"
|
|
182
182
|
});
|
|
183
|
-
expect(agents[0].sessionFilePath).toBe(path.join(tmpHome,
|
|
183
|
+
expect(agents[0].sessionFilePath).toBe(path.join(tmpHome, ".grok", "sessions", encodeURIComponent(realCwd), SESSION_ID, "chat_history.jsonl"));
|
|
184
184
|
});
|
|
185
|
-
it(
|
|
185
|
+
it("falls back to the process cwd when the pid is not in active_sessions.json", async ()=>{
|
|
186
186
|
writeSession({});
|
|
187
187
|
writeActiveSessions([
|
|
188
188
|
{
|
|
189
189
|
pid: 9999,
|
|
190
|
-
cwd:
|
|
190
|
+
cwd: "/somewhere/else"
|
|
191
191
|
}
|
|
192
192
|
]);
|
|
193
193
|
mockedListAgentProcesses.mockReturnValue([
|
|
@@ -199,39 +199,39 @@ describe('GrokCliAdapter', ()=>{
|
|
|
199
199
|
sessionId: SESSION_ID
|
|
200
200
|
});
|
|
201
201
|
});
|
|
202
|
-
it(
|
|
202
|
+
it("picks the most recently active session dir when a cwd has several", async ()=>{
|
|
203
203
|
const older = new Date(Date.now() - 60 * 60 * 1000);
|
|
204
204
|
writeSession({
|
|
205
|
-
id:
|
|
205
|
+
id: "019f0000-0000-7000-8000-00000000000a",
|
|
206
206
|
records: [
|
|
207
|
-
userRecord(
|
|
207
|
+
userRecord("old one")
|
|
208
208
|
],
|
|
209
209
|
mtime: older
|
|
210
210
|
});
|
|
211
211
|
writeSession({
|
|
212
|
-
id:
|
|
212
|
+
id: "019f0000-0000-7000-8000-00000000000b",
|
|
213
213
|
records: [
|
|
214
|
-
userRecord(
|
|
214
|
+
userRecord("newest one")
|
|
215
215
|
]
|
|
216
216
|
});
|
|
217
217
|
mockedListAgentProcesses.mockReturnValue([
|
|
218
218
|
proc()
|
|
219
219
|
]);
|
|
220
220
|
const agents = await adapter.detectAgents();
|
|
221
|
-
expect(agents[0].sessionId).toBe(
|
|
222
|
-
expect(agents[0].summary).toBe(
|
|
221
|
+
expect(agents[0].sessionId).toBe("019f0000-0000-7000-8000-00000000000b");
|
|
222
|
+
expect(agents[0].summary).toBe("newest one");
|
|
223
223
|
});
|
|
224
|
-
it(
|
|
224
|
+
it("falls back to a process-only RUNNING agent when no session matches", async ()=>{
|
|
225
225
|
mockedListAgentProcesses.mockReturnValue([
|
|
226
226
|
proc()
|
|
227
227
|
]);
|
|
228
228
|
const agents = await adapter.detectAgents();
|
|
229
229
|
expect(agents).toHaveLength(1);
|
|
230
230
|
expect(agents[0].status).toBe(AgentStatus.RUNNING);
|
|
231
|
-
expect(agents[0].sessionId).toBe(
|
|
231
|
+
expect(agents[0].sessionId).toBe("pid-4242");
|
|
232
232
|
expect(agents[0].sessionFilePath).toBeUndefined();
|
|
233
233
|
});
|
|
234
|
-
it(
|
|
234
|
+
it("treats a session dir without chat_history.jsonl as no match (process-only)", async ()=>{
|
|
235
235
|
writeSession({
|
|
236
236
|
chat: false
|
|
237
237
|
});
|
|
@@ -240,84 +240,84 @@ describe('GrokCliAdapter', ()=>{
|
|
|
240
240
|
]);
|
|
241
241
|
const agents = await adapter.detectAgents();
|
|
242
242
|
expect(agents).toHaveLength(1);
|
|
243
|
-
expect(agents[0].sessionId).toBe(
|
|
243
|
+
expect(agents[0].sessionId).toBe("pid-4242");
|
|
244
244
|
});
|
|
245
245
|
});
|
|
246
|
-
describe(
|
|
247
|
-
it(
|
|
246
|
+
describe("getConversation", ()=>{
|
|
247
|
+
it("maps user (<user_query>) and assistant records to roles", ()=>{
|
|
248
248
|
const dir = writeSession({
|
|
249
249
|
records: [
|
|
250
|
-
userRecord(
|
|
251
|
-
assistantRecord(
|
|
250
|
+
userRecord("hi"),
|
|
251
|
+
assistantRecord("hello")
|
|
252
252
|
]
|
|
253
253
|
});
|
|
254
|
-
expect(adapter.getConversation(path.join(dir,
|
|
254
|
+
expect(adapter.getConversation(path.join(dir, "chat_history.jsonl"))).toEqual([
|
|
255
255
|
{
|
|
256
|
-
role:
|
|
257
|
-
content:
|
|
256
|
+
role: "user",
|
|
257
|
+
content: "hi"
|
|
258
258
|
},
|
|
259
259
|
{
|
|
260
|
-
role:
|
|
261
|
-
content:
|
|
260
|
+
role: "assistant",
|
|
261
|
+
content: "hello"
|
|
262
262
|
}
|
|
263
263
|
]);
|
|
264
264
|
});
|
|
265
|
-
it(
|
|
265
|
+
it("accepts a session dir path and skips context-injection user records", ()=>{
|
|
266
266
|
const dir = writeSession({
|
|
267
267
|
records: [
|
|
268
|
-
contextRecord(
|
|
269
|
-
userRecord(
|
|
268
|
+
contextRecord("<user_info>OS: macos</user_info>"),
|
|
269
|
+
userRecord("do the thing")
|
|
270
270
|
]
|
|
271
271
|
});
|
|
272
272
|
expect(adapter.getConversation(dir)).toEqual([
|
|
273
273
|
{
|
|
274
|
-
role:
|
|
275
|
-
content:
|
|
274
|
+
role: "user",
|
|
275
|
+
content: "do the thing"
|
|
276
276
|
}
|
|
277
277
|
]);
|
|
278
278
|
});
|
|
279
|
-
it(
|
|
279
|
+
it("skips malformed lines", ()=>{
|
|
280
280
|
const dir = writeSession({
|
|
281
281
|
records: [
|
|
282
|
-
userRecord(
|
|
282
|
+
userRecord("hi")
|
|
283
283
|
]
|
|
284
284
|
});
|
|
285
|
-
fs.appendFileSync(path.join(dir,
|
|
285
|
+
fs.appendFileSync(path.join(dir, "chat_history.jsonl"), "\n{bad json");
|
|
286
286
|
expect(adapter.getConversation(dir)).toEqual([
|
|
287
287
|
{
|
|
288
|
-
role:
|
|
289
|
-
content:
|
|
288
|
+
role: "user",
|
|
289
|
+
content: "hi"
|
|
290
290
|
}
|
|
291
291
|
]);
|
|
292
292
|
});
|
|
293
|
-
it(
|
|
293
|
+
it("excludes system records unless verbose", ()=>{
|
|
294
294
|
const dir = writeSession({
|
|
295
295
|
records: [
|
|
296
|
-
systemRecord(
|
|
297
|
-
userRecord(
|
|
296
|
+
systemRecord("You are Grok"),
|
|
297
|
+
userRecord("go")
|
|
298
298
|
]
|
|
299
299
|
});
|
|
300
300
|
expect(adapter.getConversation(dir)).toEqual([
|
|
301
301
|
{
|
|
302
|
-
role:
|
|
303
|
-
content:
|
|
302
|
+
role: "user",
|
|
303
|
+
content: "go"
|
|
304
304
|
}
|
|
305
305
|
]);
|
|
306
306
|
expect(adapter.getConversation(dir, {
|
|
307
307
|
verbose: true
|
|
308
308
|
}).map((m)=>m.role)).toEqual([
|
|
309
|
-
|
|
310
|
-
|
|
309
|
+
"system",
|
|
310
|
+
"user"
|
|
311
311
|
]);
|
|
312
312
|
});
|
|
313
313
|
});
|
|
314
|
-
describe(
|
|
314
|
+
describe("detectAgents status + summary mapping", ()=>{
|
|
315
315
|
const detectFirst = async ()=>(await adapter.detectAgents())[0];
|
|
316
|
-
it(
|
|
316
|
+
it("marks WAITING when the last transcript turn is an assistant message", async ()=>{
|
|
317
317
|
writeSession({
|
|
318
318
|
records: [
|
|
319
|
-
userRecord(
|
|
320
|
-
assistantRecord(
|
|
319
|
+
userRecord("go"),
|
|
320
|
+
assistantRecord("done")
|
|
321
321
|
]
|
|
322
322
|
});
|
|
323
323
|
mockedListAgentProcesses.mockReturnValue([
|
|
@@ -325,10 +325,10 @@ describe('GrokCliAdapter', ()=>{
|
|
|
325
325
|
]);
|
|
326
326
|
expect((await detectFirst()).status).toBe(AgentStatus.WAITING);
|
|
327
327
|
});
|
|
328
|
-
it(
|
|
328
|
+
it("marks RUNNING when the last transcript turn is a user message", async ()=>{
|
|
329
329
|
writeSession({
|
|
330
330
|
records: [
|
|
331
|
-
userRecord(
|
|
331
|
+
userRecord("still there?")
|
|
332
332
|
]
|
|
333
333
|
});
|
|
334
334
|
mockedListAgentProcesses.mockReturnValue([
|
|
@@ -336,11 +336,11 @@ describe('GrokCliAdapter', ()=>{
|
|
|
336
336
|
]);
|
|
337
337
|
expect((await detectFirst()).status).toBe(AgentStatus.RUNNING);
|
|
338
338
|
});
|
|
339
|
-
it(
|
|
339
|
+
it("marks IDLE when chat_history.jsonl is older than the threshold", async ()=>{
|
|
340
340
|
const old = new Date(Date.now() - 10 * 60 * 1000);
|
|
341
341
|
writeSession({
|
|
342
342
|
records: [
|
|
343
|
-
userRecord(
|
|
343
|
+
userRecord("go")
|
|
344
344
|
],
|
|
345
345
|
mtime: old
|
|
346
346
|
});
|
|
@@ -349,56 +349,56 @@ describe('GrokCliAdapter', ()=>{
|
|
|
349
349
|
]);
|
|
350
350
|
expect((await detectFirst()).status).toBe(AgentStatus.IDLE);
|
|
351
351
|
});
|
|
352
|
-
it(
|
|
352
|
+
it("uses the last user prompt as the agent summary", async ()=>{
|
|
353
353
|
writeSession({
|
|
354
354
|
records: [
|
|
355
|
-
userRecord(
|
|
356
|
-
assistantRecord(
|
|
355
|
+
userRecord("refactor the parser"),
|
|
356
|
+
assistantRecord("on it")
|
|
357
357
|
]
|
|
358
358
|
});
|
|
359
359
|
mockedListAgentProcesses.mockReturnValue([
|
|
360
360
|
proc()
|
|
361
361
|
]);
|
|
362
|
-
expect((await detectFirst()).summary).toBe(
|
|
362
|
+
expect((await detectFirst()).summary).toBe("refactor the parser");
|
|
363
363
|
});
|
|
364
364
|
});
|
|
365
|
-
describe(
|
|
366
|
-
it(
|
|
365
|
+
describe("listSessions", ()=>{
|
|
366
|
+
it("returns [] when the sessions dir does not exist", async ()=>{
|
|
367
367
|
expect(await adapter.listSessions()).toEqual([]);
|
|
368
368
|
});
|
|
369
|
-
it(
|
|
369
|
+
it("lists historical sessions with cwd decoded from the group dir", async ()=>{
|
|
370
370
|
writeSession({});
|
|
371
371
|
const summaries = await adapter.listSessions();
|
|
372
372
|
expect(summaries).toHaveLength(1);
|
|
373
373
|
expect(summaries[0]).toMatchObject({
|
|
374
|
-
type:
|
|
374
|
+
type: "grok_cli",
|
|
375
375
|
sessionId: SESSION_ID,
|
|
376
376
|
cwd,
|
|
377
|
-
firstUserMessage:
|
|
377
|
+
firstUserMessage: "fix the bug"
|
|
378
378
|
});
|
|
379
|
-
expect(summaries[0].sessionFilePath).toBe(path.join(tmpHome,
|
|
379
|
+
expect(summaries[0].sessionFilePath).toBe(path.join(tmpHome, ".grok", "sessions", encodeURIComponent(cwd), SESSION_ID, "chat_history.jsonl"));
|
|
380
380
|
});
|
|
381
|
-
it(
|
|
381
|
+
it("applies the cwd filter against the decoded cwd", async ()=>{
|
|
382
382
|
writeSession({
|
|
383
|
-
sessionCwd:
|
|
384
|
-
id:
|
|
383
|
+
sessionCwd: "/Users/dev/project-a",
|
|
384
|
+
id: "019f0000-0000-7000-8000-00000000000a"
|
|
385
385
|
});
|
|
386
386
|
writeSession({
|
|
387
|
-
sessionCwd:
|
|
388
|
-
id:
|
|
387
|
+
sessionCwd: "/Users/dev/project-b",
|
|
388
|
+
id: "019f0000-0000-7000-8000-00000000000b"
|
|
389
389
|
});
|
|
390
390
|
const all = await adapter.listSessions();
|
|
391
391
|
expect(all).toHaveLength(2);
|
|
392
392
|
const filtered = await adapter.listSessions({
|
|
393
|
-
cwd:
|
|
393
|
+
cwd: "/Users/dev/project-a"
|
|
394
394
|
});
|
|
395
395
|
expect(filtered).toHaveLength(1);
|
|
396
|
-
expect(filtered[0].cwd).toBe(
|
|
396
|
+
expect(filtered[0].cwd).toBe("/Users/dev/project-a");
|
|
397
397
|
});
|
|
398
|
-
it(
|
|
398
|
+
it("skips non-session entries (e.g. prompt_history.jsonl) in a group dir", async ()=>{
|
|
399
399
|
writeSession({});
|
|
400
400
|
// Grok writes a group-level prompt_history.jsonl alongside session dirs.
|
|
401
|
-
fs.writeFileSync(path.join(tmpHome,
|
|
401
|
+
fs.writeFileSync(path.join(tmpHome, ".grok", "sessions", encodeURIComponent(cwd), "prompt_history.jsonl"), '{"text":"noise"}');
|
|
402
402
|
const summaries = await adapter.listSessions();
|
|
403
403
|
expect(summaries).toHaveLength(1);
|
|
404
404
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/__tests__/adapters/GrokCliAdapter.test.ts"],"sourcesContent":["/**\n * Tests for GrokCliAdapter\n *\n * The adapter resolves a live process to its cwd via ~/.grok/active_sessions.json\n * and reads session details from chat_history.jsonl (not summary.json/updates.jsonl).\n */\n\nimport type { MockedFunction } from 'vitest';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nimport { GrokCliAdapter } from '../../adapters/GrokCliAdapter.js';\nimport type { ProcessInfo } from '../../adapters/AgentAdapter.js';\nimport { AgentStatus } from '../../adapters/AgentAdapter.js';\nimport { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from '../../utils/process.js';\nimport { generateAgentName } from '../../utils/matching.js';\n\nvi.mock('../../utils/process.js', async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import('../../utils/process.js');\n return {\n ...actual,\n listAgentProcesses: vi.fn(),\n enrichProcesses: vi.fn(),\n captureProcessSnapshot: vi.fn(),\n };\n});\n\nvi.mock('../../utils/matching.js', async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import('../../utils/matching.js');\n return {\n ...actual,\n generateAgentName: vi.fn(),\n };\n});\n\nconst mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;\nconst mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;\nconst mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<typeof captureProcessSnapshot>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\nconst SESSION_ID = '019f16c3-5d5d-7dc3-85d1-bc629416ca2d';\n\n/** A user transcript record: the real prompt wrapped in <user_query> like Grok writes it. */\nconst userRecord = (text: string) => ({\n type: 'user',\n content: [{ type: 'text', text: `<user_query>\\n${text}\\n</user_query>` }],\n});\n/** A user context-injection record (no <user_query>) — should be ignored as a prompt. */\nconst contextRecord = (text: string) => ({ type: 'user', content: [{ type: 'text', text }] });\nconst assistantRecord = (text: string) => ({ type: 'assistant', content: [{ type: 'text', text }] });\nconst systemRecord = (text: string) => ({ type: 'system', content: text });\n\ndescribe('GrokCliAdapter', () => {\n let adapter: GrokCliAdapter;\n let tmpHome: string;\n let cwd: string;\n\n beforeEach(() => {\n tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'grok-adapter-test-'));\n process.env.HOME = tmpHome;\n delete process.env.GROK_HOME;\n cwd = '/Users/dev/my-project';\n\n adapter = new GrokCliAdapter();\n\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedGenerateAgentName.mockReset();\n\n mockedEnrichProcesses.mockImplementation((procs) => procs);\n // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.\n mockedCaptureProcessSnapshot.mockImplementation(async (names) => (\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name)))\n ));\n mockedGenerateAgentName.mockImplementation((c: string, pid: number) => `${path.basename(c) || 'unknown'}-${pid}`);\n });\n\n afterEach(() => {\n fs.rmSync(tmpHome, { recursive: true, force: true });\n });\n\n /** Write a session dir under ~/.grok/sessions/<enc(cwd)>/<id>/chat_history.jsonl. */\n function writeSession(opts: {\n sessionCwd?: string;\n id?: string;\n records?: object[];\n chat?: boolean;\n mtime?: Date;\n }): string {\n const sessionCwd = opts.sessionCwd ?? cwd;\n const id = opts.id ?? SESSION_ID;\n const sessionDir = path.join(tmpHome, '.grok', 'sessions', encodeURIComponent(sessionCwd), id);\n fs.mkdirSync(sessionDir, { recursive: true });\n\n if (opts.chat !== false) {\n const records = opts.records ?? [userRecord('fix the bug')];\n const chatPath = path.join(sessionDir, 'chat_history.jsonl');\n fs.writeFileSync(chatPath, records.map((r) => JSON.stringify(r)).join('\\n'));\n if (opts.mtime) fs.utimesSync(chatPath, opts.mtime, opts.mtime);\n }\n\n return sessionDir;\n }\n\n /** Write ~/.grok/active_sessions.json (the live pid -> cwd registry). */\n function writeActiveSessions(entries: Array<{ pid: number; cwd: string; opened_at?: number }>): void {\n fs.mkdirSync(path.join(tmpHome, '.grok'), { recursive: true });\n fs.writeFileSync(path.join(tmpHome, '.grok', 'active_sessions.json'), JSON.stringify(entries));\n }\n\n function proc(overrides: Partial<ProcessInfo> = {}): ProcessInfo {\n return { pid: 4242, ppid: 1, command: 'grok', cwd, tty: 'ttys010', startTime: new Date(), ...overrides };\n }\n\n describe('initialization', () => {\n it('exposes the grok_cli type', () => {\n expect(adapter.type).toBe('grok_cli');\n });\n });\n\n describe('canHandle', () => {\n it('returns true for a plain grok command', () => {\n expect(adapter.canHandle(proc({ command: 'grok' }))).toBe(true);\n });\n\n it('returns true for grok with a full path and args', () => {\n expect(adapter.canHandle(proc({ command: '/Users/dev/.grok/bin/grok --always-approve' }))).toBe(true);\n });\n\n it('returns false for non-grok processes', () => {\n expect(adapter.canHandle(proc({ command: 'node app.js' }))).toBe(false);\n });\n\n it('returns false when \"grok\" appears only in an argument path', () => {\n expect(adapter.canHandle(proc({ command: 'node /path/to/grok-thing.js' }))).toBe(false);\n });\n });\n\n describe('detectAgents', () => {\n it('returns [] when there are no grok processes', async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n expect(await adapter.detectAgents()).toEqual([]);\n });\n\n it('resolves the cwd via active_sessions.json (authoritative over the process cwd)', async () => {\n const realCwd = '/Users/dev/real-project';\n writeSession({ sessionCwd: realCwd });\n // The process cwd is stale/wrong; active_sessions.json has the truth.\n writeActiveSessions([{ pid: 4242, cwd: realCwd, opened_at: 1 }]);\n mockedListAgentProcesses.mockReturnValue([proc({ cwd: '/wrong/path' })]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'grok_cli',\n pid: 4242,\n projectPath: realCwd,\n sessionId: SESSION_ID,\n summary: 'fix the bug',\n });\n expect(agents[0].sessionFilePath).toBe(\n path.join(tmpHome, '.grok', 'sessions', encodeURIComponent(realCwd), SESSION_ID, 'chat_history.jsonl'),\n );\n });\n\n it('falls back to the process cwd when the pid is not in active_sessions.json', async () => {\n writeSession({});\n writeActiveSessions([{ pid: 9999, cwd: '/somewhere/else' }]);\n mockedListAgentProcesses.mockReturnValue([proc()]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents[0]).toMatchObject({ projectPath: cwd, sessionId: SESSION_ID });\n });\n\n it('picks the most recently active session dir when a cwd has several', async () => {\n const older = new Date(Date.now() - 60 * 60 * 1000);\n writeSession({ id: '019f0000-0000-7000-8000-00000000000a', records: [userRecord('old one')], mtime: older });\n writeSession({ id: '019f0000-0000-7000-8000-00000000000b', records: [userRecord('newest one')] });\n mockedListAgentProcesses.mockReturnValue([proc()]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents[0].sessionId).toBe('019f0000-0000-7000-8000-00000000000b');\n expect(agents[0].summary).toBe('newest one');\n });\n\n it('falls back to a process-only RUNNING agent when no session matches', async () => {\n mockedListAgentProcesses.mockReturnValue([proc()]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].status).toBe(AgentStatus.RUNNING);\n expect(agents[0].sessionId).toBe('pid-4242');\n expect(agents[0].sessionFilePath).toBeUndefined();\n });\n\n it('treats a session dir without chat_history.jsonl as no match (process-only)', async () => {\n writeSession({ chat: false });\n mockedListAgentProcesses.mockReturnValue([proc()]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].sessionId).toBe('pid-4242');\n });\n });\n\n describe('getConversation', () => {\n it('maps user (<user_query>) and assistant records to roles', () => {\n const dir = writeSession({ records: [userRecord('hi'), assistantRecord('hello')] });\n expect(adapter.getConversation(path.join(dir, 'chat_history.jsonl'))).toEqual([\n { role: 'user', content: 'hi' },\n { role: 'assistant', content: 'hello' },\n ]);\n });\n\n it('accepts a session dir path and skips context-injection user records', () => {\n const dir = writeSession({\n records: [contextRecord('<user_info>OS: macos</user_info>'), userRecord('do the thing')],\n });\n expect(adapter.getConversation(dir)).toEqual([{ role: 'user', content: 'do the thing' }]);\n });\n\n it('skips malformed lines', () => {\n const dir = writeSession({ records: [userRecord('hi')] });\n fs.appendFileSync(path.join(dir, 'chat_history.jsonl'), '\\n{bad json');\n expect(adapter.getConversation(dir)).toEqual([{ role: 'user', content: 'hi' }]);\n });\n\n it('excludes system records unless verbose', () => {\n const dir = writeSession({ records: [systemRecord('You are Grok'), userRecord('go')] });\n expect(adapter.getConversation(dir)).toEqual([{ role: 'user', content: 'go' }]);\n expect(adapter.getConversation(dir, { verbose: true }).map((m) => m.role)).toEqual(['system', 'user']);\n });\n });\n\n describe('detectAgents status + summary mapping', () => {\n const detectFirst = async () => (await adapter.detectAgents())[0];\n\n it('marks WAITING when the last transcript turn is an assistant message', async () => {\n writeSession({ records: [userRecord('go'), assistantRecord('done')] });\n mockedListAgentProcesses.mockReturnValue([proc()]);\n expect((await detectFirst()).status).toBe(AgentStatus.WAITING);\n });\n\n it('marks RUNNING when the last transcript turn is a user message', async () => {\n writeSession({ records: [userRecord('still there?')] });\n mockedListAgentProcesses.mockReturnValue([proc()]);\n expect((await detectFirst()).status).toBe(AgentStatus.RUNNING);\n });\n\n it('marks IDLE when chat_history.jsonl is older than the threshold', async () => {\n const old = new Date(Date.now() - 10 * 60 * 1000);\n writeSession({ records: [userRecord('go')], mtime: old });\n mockedListAgentProcesses.mockReturnValue([proc()]);\n expect((await detectFirst()).status).toBe(AgentStatus.IDLE);\n });\n\n it('uses the last user prompt as the agent summary', async () => {\n writeSession({ records: [userRecord('refactor the parser'), assistantRecord('on it')] });\n mockedListAgentProcesses.mockReturnValue([proc()]);\n expect((await detectFirst()).summary).toBe('refactor the parser');\n });\n });\n\n describe('listSessions', () => {\n it('returns [] when the sessions dir does not exist', async () => {\n expect(await adapter.listSessions()).toEqual([]);\n });\n\n it('lists historical sessions with cwd decoded from the group dir', async () => {\n writeSession({});\n const summaries = await adapter.listSessions();\n expect(summaries).toHaveLength(1);\n expect(summaries[0]).toMatchObject({\n type: 'grok_cli',\n sessionId: SESSION_ID,\n cwd,\n firstUserMessage: 'fix the bug',\n });\n expect(summaries[0].sessionFilePath).toBe(\n path.join(tmpHome, '.grok', 'sessions', encodeURIComponent(cwd), SESSION_ID, 'chat_history.jsonl'),\n );\n });\n\n it('applies the cwd filter against the decoded cwd', async () => {\n writeSession({ sessionCwd: '/Users/dev/project-a', id: '019f0000-0000-7000-8000-00000000000a' });\n writeSession({ sessionCwd: '/Users/dev/project-b', id: '019f0000-0000-7000-8000-00000000000b' });\n\n const all = await adapter.listSessions();\n expect(all).toHaveLength(2);\n\n const filtered = await adapter.listSessions({ cwd: '/Users/dev/project-a' });\n expect(filtered).toHaveLength(1);\n expect(filtered[0].cwd).toBe('/Users/dev/project-a');\n });\n\n it('skips non-session entries (e.g. prompt_history.jsonl) in a group dir', async () => {\n writeSession({});\n // Grok writes a group-level prompt_history.jsonl alongside session dirs.\n fs.writeFileSync(\n path.join(tmpHome, '.grok', 'sessions', encodeURIComponent(cwd), 'prompt_history.jsonl'),\n '{\"text\":\"noise\"}',\n );\n const summaries = await adapter.listSessions();\n expect(summaries).toHaveLength(1);\n });\n });\n});\n"],"names":["fs","os","path","GrokCliAdapter","AgentStatus","listAgentProcesses","enrichProcesses","captureProcessSnapshot","generateAgentName","vi","mock","importOriginal","actual","fn","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedGenerateAgentName","SESSION_ID","userRecord","text","type","content","contextRecord","assistantRecord","systemRecord","describe","adapter","tmpHome","cwd","beforeEach","mkdtempSync","join","tmpdir","process","env","HOME","GROK_HOME","mockReset","mockImplementation","procs","names","flatMap","name","c","pid","basename","afterEach","rmSync","recursive","force","writeSession","opts","sessionCwd","id","sessionDir","encodeURIComponent","mkdirSync","chat","records","chatPath","writeFileSync","map","r","JSON","stringify","mtime","utimesSync","writeActiveSessions","entries","proc","overrides","ppid","command","tty","startTime","Date","it","expect","toBe","canHandle","mockReturnValue","detectAgents","toEqual","realCwd","opened_at","agents","toHaveLength","toMatchObject","projectPath","sessionId","summary","sessionFilePath","older","now","status","RUNNING","toBeUndefined","dir","getConversation","role","appendFileSync","verbose","m","detectFirst","WAITING","old","IDLE","listSessions","summaries","firstUserMessage","all","filtered"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/__tests__/adapters/GrokCliAdapter.test.ts"],"sourcesContent":["/**\n * Tests for GrokCliAdapter\n *\n * The adapter resolves a live process to its cwd via ~/.grok/active_sessions.json\n * and reads session details from chat_history.jsonl (not summary.json/updates.jsonl).\n */\n\nimport type { MockedFunction } from \"vitest\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport { GrokCliAdapter } from \"../../adapters/GrokCliAdapter.js\";\nimport type { ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport {\n listAgentProcesses,\n enrichProcesses,\n captureProcessSnapshot,\n} from \"../../utils/process.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\n\nvi.mock(\"../../utils/process.js\", async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import(\"../../utils/process.js\");\n return {\n ...actual,\n listAgentProcesses: vi.fn(),\n enrichProcesses: vi.fn(),\n captureProcessSnapshot: vi.fn(),\n };\n});\n\nvi.mock(\"../../utils/matching.js\", async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import(\"../../utils/matching.js\");\n return {\n ...actual,\n generateAgentName: vi.fn(),\n };\n});\n\nconst mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;\nconst mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;\nconst mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<\n typeof captureProcessSnapshot\n>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\nconst SESSION_ID = \"019f16c3-5d5d-7dc3-85d1-bc629416ca2d\";\n\n/** A user transcript record: the real prompt wrapped in <user_query> like Grok writes it. */\nconst userRecord = (text: string) => ({\n type: \"user\",\n content: [{ type: \"text\", text: `<user_query>\\n${text}\\n</user_query>` }],\n});\n/** A user context-injection record (no <user_query>) — should be ignored as a prompt. */\nconst contextRecord = (text: string) => ({ type: \"user\", content: [{ type: \"text\", text }] });\nconst assistantRecord = (text: string) => ({\n type: \"assistant\",\n content: [{ type: \"text\", text }],\n});\nconst systemRecord = (text: string) => ({ type: \"system\", content: text });\n\ndescribe(\"GrokCliAdapter\", () => {\n let adapter: GrokCliAdapter;\n let tmpHome: string;\n let cwd: string;\n\n beforeEach(() => {\n tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), \"grok-adapter-test-\"));\n process.env.HOME = tmpHome;\n delete process.env.GROK_HOME;\n cwd = \"/Users/dev/my-project\";\n\n adapter = new GrokCliAdapter();\n\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedGenerateAgentName.mockReset();\n\n mockedEnrichProcesses.mockImplementation((procs) => procs);\n // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.\n mockedCaptureProcessSnapshot.mockImplementation(async (names) =>\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name))),\n );\n mockedGenerateAgentName.mockImplementation(\n (c: string, pid: number) => `${path.basename(c) || \"unknown\"}-${pid}`,\n );\n });\n\n afterEach(() => {\n fs.rmSync(tmpHome, { recursive: true, force: true });\n });\n\n /** Write a session dir under ~/.grok/sessions/<enc(cwd)>/<id>/chat_history.jsonl. */\n function writeSession(opts: {\n sessionCwd?: string;\n id?: string;\n records?: object[];\n chat?: boolean;\n mtime?: Date;\n }): string {\n const sessionCwd = opts.sessionCwd ?? cwd;\n const id = opts.id ?? SESSION_ID;\n const sessionDir = path.join(tmpHome, \".grok\", \"sessions\", encodeURIComponent(sessionCwd), id);\n fs.mkdirSync(sessionDir, { recursive: true });\n\n if (opts.chat !== false) {\n const records = opts.records ?? [userRecord(\"fix the bug\")];\n const chatPath = path.join(sessionDir, \"chat_history.jsonl\");\n fs.writeFileSync(chatPath, records.map((r) => JSON.stringify(r)).join(\"\\n\"));\n if (opts.mtime) fs.utimesSync(chatPath, opts.mtime, opts.mtime);\n }\n\n return sessionDir;\n }\n\n /** Write ~/.grok/active_sessions.json (the live pid -> cwd registry). */\n function writeActiveSessions(\n entries: Array<{ pid: number; cwd: string; opened_at?: number }>,\n ): void {\n fs.mkdirSync(path.join(tmpHome, \".grok\"), { recursive: true });\n fs.writeFileSync(path.join(tmpHome, \".grok\", \"active_sessions.json\"), JSON.stringify(entries));\n }\n\n function proc(overrides: Partial<ProcessInfo> = {}): ProcessInfo {\n return {\n pid: 4242,\n ppid: 1,\n command: \"grok\",\n cwd,\n tty: \"ttys010\",\n startTime: new Date(),\n ...overrides,\n };\n }\n\n describe(\"initialization\", () => {\n it(\"exposes the grok_cli type\", () => {\n expect(adapter.type).toBe(\"grok_cli\");\n });\n });\n\n describe(\"canHandle\", () => {\n it(\"returns true for a plain grok command\", () => {\n expect(adapter.canHandle(proc({ command: \"grok\" }))).toBe(true);\n });\n\n it(\"returns true for grok with a full path and args\", () => {\n expect(\n adapter.canHandle(proc({ command: \"/Users/dev/.grok/bin/grok --always-approve\" })),\n ).toBe(true);\n });\n\n it(\"returns false for non-grok processes\", () => {\n expect(adapter.canHandle(proc({ command: \"node app.js\" }))).toBe(false);\n });\n\n it('returns false when \"grok\" appears only in an argument path', () => {\n expect(adapter.canHandle(proc({ command: \"node /path/to/grok-thing.js\" }))).toBe(false);\n });\n });\n\n describe(\"detectAgents\", () => {\n it(\"returns [] when there are no grok processes\", async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n expect(await adapter.detectAgents()).toEqual([]);\n });\n\n it(\"resolves the cwd via active_sessions.json (authoritative over the process cwd)\", async () => {\n const realCwd = \"/Users/dev/real-project\";\n writeSession({ sessionCwd: realCwd });\n // The process cwd is stale/wrong; active_sessions.json has the truth.\n writeActiveSessions([{ pid: 4242, cwd: realCwd, opened_at: 1 }]);\n mockedListAgentProcesses.mockReturnValue([proc({ cwd: \"/wrong/path\" })]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"grok_cli\",\n pid: 4242,\n projectPath: realCwd,\n sessionId: SESSION_ID,\n summary: \"fix the bug\",\n });\n expect(agents[0].sessionFilePath).toBe(\n path.join(\n tmpHome,\n \".grok\",\n \"sessions\",\n encodeURIComponent(realCwd),\n SESSION_ID,\n \"chat_history.jsonl\",\n ),\n );\n });\n\n it(\"falls back to the process cwd when the pid is not in active_sessions.json\", async () => {\n writeSession({});\n writeActiveSessions([{ pid: 9999, cwd: \"/somewhere/else\" }]);\n mockedListAgentProcesses.mockReturnValue([proc()]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents[0]).toMatchObject({ projectPath: cwd, sessionId: SESSION_ID });\n });\n\n it(\"picks the most recently active session dir when a cwd has several\", async () => {\n const older = new Date(Date.now() - 60 * 60 * 1000);\n writeSession({\n id: \"019f0000-0000-7000-8000-00000000000a\",\n records: [userRecord(\"old one\")],\n mtime: older,\n });\n writeSession({\n id: \"019f0000-0000-7000-8000-00000000000b\",\n records: [userRecord(\"newest one\")],\n });\n mockedListAgentProcesses.mockReturnValue([proc()]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents[0].sessionId).toBe(\"019f0000-0000-7000-8000-00000000000b\");\n expect(agents[0].summary).toBe(\"newest one\");\n });\n\n it(\"falls back to a process-only RUNNING agent when no session matches\", async () => {\n mockedListAgentProcesses.mockReturnValue([proc()]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].status).toBe(AgentStatus.RUNNING);\n expect(agents[0].sessionId).toBe(\"pid-4242\");\n expect(agents[0].sessionFilePath).toBeUndefined();\n });\n\n it(\"treats a session dir without chat_history.jsonl as no match (process-only)\", async () => {\n writeSession({ chat: false });\n mockedListAgentProcesses.mockReturnValue([proc()]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].sessionId).toBe(\"pid-4242\");\n });\n });\n\n describe(\"getConversation\", () => {\n it(\"maps user (<user_query>) and assistant records to roles\", () => {\n const dir = writeSession({ records: [userRecord(\"hi\"), assistantRecord(\"hello\")] });\n expect(adapter.getConversation(path.join(dir, \"chat_history.jsonl\"))).toEqual([\n { role: \"user\", content: \"hi\" },\n { role: \"assistant\", content: \"hello\" },\n ]);\n });\n\n it(\"accepts a session dir path and skips context-injection user records\", () => {\n const dir = writeSession({\n records: [contextRecord(\"<user_info>OS: macos</user_info>\"), userRecord(\"do the thing\")],\n });\n expect(adapter.getConversation(dir)).toEqual([{ role: \"user\", content: \"do the thing\" }]);\n });\n\n it(\"skips malformed lines\", () => {\n const dir = writeSession({ records: [userRecord(\"hi\")] });\n fs.appendFileSync(path.join(dir, \"chat_history.jsonl\"), \"\\n{bad json\");\n expect(adapter.getConversation(dir)).toEqual([{ role: \"user\", content: \"hi\" }]);\n });\n\n it(\"excludes system records unless verbose\", () => {\n const dir = writeSession({ records: [systemRecord(\"You are Grok\"), userRecord(\"go\")] });\n expect(adapter.getConversation(dir)).toEqual([{ role: \"user\", content: \"go\" }]);\n expect(adapter.getConversation(dir, { verbose: true }).map((m) => m.role)).toEqual([\n \"system\",\n \"user\",\n ]);\n });\n });\n\n describe(\"detectAgents status + summary mapping\", () => {\n const detectFirst = async () => (await adapter.detectAgents())[0];\n\n it(\"marks WAITING when the last transcript turn is an assistant message\", async () => {\n writeSession({ records: [userRecord(\"go\"), assistantRecord(\"done\")] });\n mockedListAgentProcesses.mockReturnValue([proc()]);\n expect((await detectFirst()).status).toBe(AgentStatus.WAITING);\n });\n\n it(\"marks RUNNING when the last transcript turn is a user message\", async () => {\n writeSession({ records: [userRecord(\"still there?\")] });\n mockedListAgentProcesses.mockReturnValue([proc()]);\n expect((await detectFirst()).status).toBe(AgentStatus.RUNNING);\n });\n\n it(\"marks IDLE when chat_history.jsonl is older than the threshold\", async () => {\n const old = new Date(Date.now() - 10 * 60 * 1000);\n writeSession({ records: [userRecord(\"go\")], mtime: old });\n mockedListAgentProcesses.mockReturnValue([proc()]);\n expect((await detectFirst()).status).toBe(AgentStatus.IDLE);\n });\n\n it(\"uses the last user prompt as the agent summary\", async () => {\n writeSession({ records: [userRecord(\"refactor the parser\"), assistantRecord(\"on it\")] });\n mockedListAgentProcesses.mockReturnValue([proc()]);\n expect((await detectFirst()).summary).toBe(\"refactor the parser\");\n });\n });\n\n describe(\"listSessions\", () => {\n it(\"returns [] when the sessions dir does not exist\", async () => {\n expect(await adapter.listSessions()).toEqual([]);\n });\n\n it(\"lists historical sessions with cwd decoded from the group dir\", async () => {\n writeSession({});\n const summaries = await adapter.listSessions();\n expect(summaries).toHaveLength(1);\n expect(summaries[0]).toMatchObject({\n type: \"grok_cli\",\n sessionId: SESSION_ID,\n cwd,\n firstUserMessage: \"fix the bug\",\n });\n expect(summaries[0].sessionFilePath).toBe(\n path.join(\n tmpHome,\n \".grok\",\n \"sessions\",\n encodeURIComponent(cwd),\n SESSION_ID,\n \"chat_history.jsonl\",\n ),\n );\n });\n\n it(\"applies the cwd filter against the decoded cwd\", async () => {\n writeSession({\n sessionCwd: \"/Users/dev/project-a\",\n id: \"019f0000-0000-7000-8000-00000000000a\",\n });\n writeSession({\n sessionCwd: \"/Users/dev/project-b\",\n id: \"019f0000-0000-7000-8000-00000000000b\",\n });\n\n const all = await adapter.listSessions();\n expect(all).toHaveLength(2);\n\n const filtered = await adapter.listSessions({ cwd: \"/Users/dev/project-a\" });\n expect(filtered).toHaveLength(1);\n expect(filtered[0].cwd).toBe(\"/Users/dev/project-a\");\n });\n\n it(\"skips non-session entries (e.g. prompt_history.jsonl) in a group dir\", async () => {\n writeSession({});\n // Grok writes a group-level prompt_history.jsonl alongside session dirs.\n fs.writeFileSync(\n path.join(tmpHome, \".grok\", \"sessions\", encodeURIComponent(cwd), \"prompt_history.jsonl\"),\n '{\"text\":\"noise\"}',\n );\n const summaries = await adapter.listSessions();\n expect(summaries).toHaveLength(1);\n });\n });\n});\n"],"names":["fs","os","path","GrokCliAdapter","AgentStatus","listAgentProcesses","enrichProcesses","captureProcessSnapshot","generateAgentName","vi","mock","importOriginal","actual","fn","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedGenerateAgentName","SESSION_ID","userRecord","text","type","content","contextRecord","assistantRecord","systemRecord","describe","adapter","tmpHome","cwd","beforeEach","mkdtempSync","join","tmpdir","process","env","HOME","GROK_HOME","mockReset","mockImplementation","procs","names","flatMap","name","c","pid","basename","afterEach","rmSync","recursive","force","writeSession","opts","sessionCwd","id","sessionDir","encodeURIComponent","mkdirSync","chat","records","chatPath","writeFileSync","map","r","JSON","stringify","mtime","utimesSync","writeActiveSessions","entries","proc","overrides","ppid","command","tty","startTime","Date","it","expect","toBe","canHandle","mockReturnValue","detectAgents","toEqual","realCwd","opened_at","agents","toHaveLength","toMatchObject","projectPath","sessionId","summary","sessionFilePath","older","now","status","RUNNING","toBeUndefined","dir","getConversation","role","appendFileSync","verbose","m","detectFirst","WAITING","old","IDLE","listSessions","summaries","firstUserMessage","all","filtered"],"mappings":"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"}
|