@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/__tests__/terminal/TtyWriter.test.ts"],"sourcesContent":["import type { Mock } from 'vitest';\n\nimport { TtyWriter } from '../../terminal/TtyWriter.js';\nimport { TerminalType } from '../../terminal/TerminalFocusManager.js';\nimport type { TerminalLocation } from '../../terminal/TerminalFocusManager.js';\nimport { execFile } from 'child_process';\n\nvi.mock('child_process', async () => {\n const actual = await vi.importActual<typeof import('child_process')>('child_process');\n return {\n ...actual,\n execFile: vi.fn(),\n };\n});\n\nconst mockedExecFile = execFile as unknown as Mock;\n\nfunction mockExecFileSuccess(stdout = '') {\n mockedExecFile.mockImplementation((...args: unknown[]) => {\n const cb = args[args.length - 1] as (err: Error | null, result: { stdout: string }, stderr: string) => void;\n cb(null, { stdout }, '');\n return { stdin: { end: vi.fn() } };\n });\n}\n\nfunction mockExecFileError(message: string) {\n mockedExecFile.mockImplementation((...args: unknown[]) => {\n const cb = args[args.length - 1] as (err: Error | null, result: null, stderr: string) => void;\n cb(new Error(message), null, '');\n });\n}\n\ndescribe('TtyWriter', () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n describe('tmux', () => {\n const location: TerminalLocation = {\n type: TerminalType.TMUX,\n identifier: 'main:0.1',\n tty: '/dev/ttys030',\n };\n\n it('pastes message in bracketed paste mode and sends Enter separately', async () => {\n mockExecFileSuccess();\n const message = 'line 1\\nline 2\\n';\n\n await TtyWriter.send(location, message);\n\n const loadArgs = mockedExecFile.mock.calls[0]?.[1] as string[];\n const bufferName = loadArgs[2];\n expect(bufferName).toMatch(/^ai-devkit-send-/);\n expect(mockedExecFile).toHaveBeenNthCalledWith(\n 1,\n 'tmux',\n ['load-buffer', '-b', bufferName, '-'],\n expect.any(Function),\n );\n expect(mockedExecFile.mock.results[0]?.value.stdin.end)\n .toHaveBeenCalledWith(message);\n expect(mockedExecFile).toHaveBeenNthCalledWith(\n 2,\n 'tmux',\n ['paste-buffer', '-t', 'main:0.1', '-b', bufferName, '-p', '-d'],\n expect.any(Function),\n );\n expect(mockedExecFile).toHaveBeenNthCalledWith(\n 3,\n 'tmux',\n ['send-keys', '-t', 'main:0.1', 'Enter'],\n expect.any(Function),\n );\n expect(mockedExecFile).toHaveBeenCalledTimes(3);\n });\n\n it('throws on tmux failure', async () => {\n mockExecFileError('tmux not running');\n\n await expect(TtyWriter.send(location, 'hello'))\n .rejects.toThrow('tmux not running');\n });\n });\n\n describe('iTerm2', () => {\n const location: TerminalLocation = {\n type: TerminalType.ITERM2,\n identifier: '/dev/ttys030',\n tty: '/dev/ttys030',\n };\n\n it('sends message via osascript with execFile (no shell)', async () => {\n mockExecFileSuccess('ok');\n\n await TtyWriter.send(location, 'hello');\n\n // First call: send text without newline\n expect(mockedExecFile).toHaveBeenCalledWith(\n 'osascript',\n ['-e', expect.stringContaining('write text \"hello\" newline no')],\n expect.any(Function),\n );\n // Second call: send Enter via separate write text with newline\n expect(mockedExecFile).toHaveBeenCalledWith(\n 'osascript',\n ['-e', expect.stringContaining('write text \"\" newline yes')],\n expect.any(Function),\n );\n expect(mockedExecFile).toHaveBeenCalledTimes(2);\n });\n\n it('escapes special characters in message', async () => {\n mockExecFileSuccess('ok');\n\n await TtyWriter.send(location, 'say \"hi\" \\\\ there');\n\n expect(mockedExecFile).toHaveBeenCalledWith(\n 'osascript',\n ['-e', expect.stringContaining('write text \"say \\\\\"hi\\\\\" \\\\\\\\ there\" newline no')],\n expect.any(Function),\n );\n });\n\n it('escapes newlines in message', async () => {\n mockExecFileSuccess('ok');\n\n await TtyWriter.send(location, 'line1\\nline2');\n\n expect(mockedExecFile).toHaveBeenCalledWith(\n 'osascript',\n ['-e', expect.stringContaining('write text \"line1\\\\nline2\" newline no')],\n expect.any(Function),\n );\n });\n\n it('throws when session not found', async () => {\n mockExecFileSuccess('not_found');\n\n await expect(TtyWriter.send(location, 'test'))\n .rejects.toThrow('iTerm2 session not found');\n });\n\n it('throws when session disappears before Enter', async () => {\n // First call succeeds (text sent), second returns not_found\n let callCount = 0;\n mockedExecFile.mockImplementation((...args: unknown[]) => {\n const cb = args[args.length - 1] as (err: Error | null, result: { stdout: string }, stderr: string) => void;\n callCount++;\n cb(null, { stdout: callCount === 1 ? 'ok' : 'not_found' }, '');\n });\n\n await expect(TtyWriter.send(location, 'test'))\n .rejects.toThrow('iTerm2 session disappeared before Enter');\n });\n });\n\n describe('Terminal.app', () => {\n const location: TerminalLocation = {\n type: TerminalType.TERMINAL_APP,\n identifier: '/dev/ttys030',\n tty: '/dev/ttys030',\n };\n\n it('sends message via do script (not System Events)', async () => {\n mockExecFileSuccess('ok');\n\n await TtyWriter.send(location, 'hello');\n\n // First call: send text via do script\n const firstCallArgs = (mockedExecFile.mock.calls[0] as unknown[])[1] as string[];\n const textScript = firstCallArgs[1];\n expect(textScript).toContain('do script \"hello\" in targetTab');\n expect(textScript).not.toContain('keystroke');\n expect(textScript).not.toContain('key code 36');\n\n // Second call: send Enter via separate do script\n const secondCallArgs = (mockedExecFile.mock.calls[1] as unknown[])[1] as string[];\n const enterScript = secondCallArgs[1];\n expect(enterScript).toContain('do script \"\" in targetTab');\n\n expect(mockedExecFile).toHaveBeenCalledTimes(2);\n });\n\n it('throws when tab not found', async () => {\n mockExecFileSuccess('not_found');\n\n await expect(TtyWriter.send(location, 'test'))\n .rejects.toThrow('Terminal.app tab not found');\n });\n\n it('throws when tab disappears before Enter', async () => {\n let callCount = 0;\n mockedExecFile.mockImplementation((...args: unknown[]) => {\n const cb = args[args.length - 1] as (err: Error | null, result: { stdout: string }, stderr: string) => void;\n callCount++;\n cb(null, { stdout: callCount === 1 ? 'ok' : 'not_found' }, '');\n });\n\n await expect(TtyWriter.send(location, 'test'))\n .rejects.toThrow('Terminal.app tab disappeared before Enter');\n });\n });\n\n describe('WezTerm', () => {\n const location: TerminalLocation = {\n type: TerminalType.WEZTERM,\n identifier: '7',\n tty: '/dev/ttys030',\n };\n\n it('sends the message via stdin and Enter as a separate send-text call', async () => {\n mockExecFileSuccess();\n\n await TtyWriter.send(location, 'continue');\n\n // Step 1: message body via stdin, not argv, so prompt contents are\n // not exposed through process listings.\n expect(mockedExecFile).toHaveBeenCalledWith(\n 'wezterm',\n ['cli', 'send-text', '--pane-id', '7'],\n expect.any(Function),\n );\n expect(mockedExecFile.mock.results[0]?.value.stdin.end)\n .toHaveBeenCalledWith('continue');\n // Step 2: Enter as a single carriage return (0x0d) with --no-paste,\n // so the CR is delivered literally (not wrapped in paste brackets).\n // execFile passes the actual CR byte (JS '\\x0d'); the equivalent\n // shell command is:\n // wezterm cli send-text --pane-id <id> --no-paste $'\\x0d'\n expect(mockedExecFile).toHaveBeenCalledWith(\n 'wezterm',\n ['cli', 'send-text', '--pane-id', '7', '--no-paste', '\\x0d'],\n expect.any(Function),\n );\n expect(mockedExecFile).toHaveBeenCalledTimes(2);\n });\n\n it('passes the Enter byte as the carriage return (0x0d), not newline', async () => {\n mockExecFileSuccess();\n\n await TtyWriter.send(location, 'continue');\n\n // The Enter call is the second invocation; its last argv element is\n // a single byte equal to char code 13 (0x0d).\n const enterCall = mockedExecFile.mock.calls[1];\n const enterArgs = enterCall[1] as string[];\n const enterByte = enterArgs[enterArgs.length - 1];\n expect(enterByte).toHaveLength(1);\n expect(enterByte.charCodeAt(0)).toBe(0x0d);\n expect(enterArgs).toContain('--no-paste');\n });\n\n it('keeps the whole message out of argv and writes it verbatim to stdin', async () => {\n mockExecFileSuccess();\n const hostile = 'echo pwned; $(rm -rf /) `whoami` | cat\\nline2';\n\n await TtyWriter.send(location, hostile);\n\n // The message is written verbatim to stdin, not built into a shell\n // string or exposed as a process argument.\n const textCall = mockedExecFile.mock.calls[0];\n const textArgs = textCall[1] as string[];\n expect(textArgs).toEqual(\n ['cli', 'send-text', '--pane-id', '7'],\n );\n expect(textCall[2]).toBeTypeOf('function');\n expect(mockedExecFile.mock.results[0]?.value.stdin.end)\n .toHaveBeenCalledWith(hostile);\n });\n\n it('uses the pane id from location.identifier', async () => {\n mockExecFileSuccess();\n const pane42 = { ...location, identifier: '42' };\n\n await TtyWriter.send(pane42, 'hi');\n\n expect(mockedExecFile).toHaveBeenCalledWith(\n 'wezterm',\n ['cli', 'send-text', '--pane-id', '42'],\n expect.any(Function),\n );\n expect(mockedExecFile.mock.results[0]?.value.stdin.end)\n .toHaveBeenCalledWith('hi');\n });\n\n it('throws when the text send fails', async () => {\n mockExecFileError('wezterm send-text failed');\n\n await expect(TtyWriter.send(location, 'hello'))\n .rejects.toThrow('wezterm send-text failed');\n });\n });\n\n describe('unsupported terminal', () => {\n it('throws for unknown terminal type', async () => {\n const location: TerminalLocation = {\n type: TerminalType.UNKNOWN,\n identifier: '',\n tty: '/dev/ttys030',\n };\n\n await expect(TtyWriter.send(location, 'test'))\n .rejects.toThrow('Cannot send input: unsupported terminal type');\n });\n });\n\n describe('sendKey — tmux', () => {\n const location: TerminalLocation = {\n type: TerminalType.TMUX,\n identifier: 'main:0.1',\n tty: '/dev/ttys030',\n };\n\n it('sends key via tmux send-keys directly (no paste buffer, no auto-Enter)', async () => {\n mockExecFileSuccess();\n\n await TtyWriter.sendKey(location, '1');\n\n expect(mockedExecFile).toHaveBeenCalledTimes(1);\n expect(mockedExecFile).toHaveBeenCalledWith(\n 'tmux',\n ['send-keys', '-t', 'main:0.1', '1'],\n expect.any(Function),\n );\n });\n\n it('passes through named keys like Enter', async () => {\n mockExecFileSuccess();\n await TtyWriter.sendKey(location, 'Enter');\n expect(mockedExecFile).toHaveBeenCalledWith(\n 'tmux',\n ['send-keys', '-t', 'main:0.1', 'Enter'],\n expect.any(Function),\n );\n });\n\n it('translates Esc byte (\\\\x1b) to the named \"Escape\" key', async () => {\n mockExecFileSuccess();\n await TtyWriter.sendKey(location, '\\x1b');\n expect(mockedExecFile).toHaveBeenCalledWith(\n 'tmux',\n ['send-keys', '-t', 'main:0.1', 'Escape'],\n expect.any(Function),\n );\n });\n });\n\n describe('sendKey — WezTerm', () => {\n const location: TerminalLocation = {\n type: TerminalType.WEZTERM,\n identifier: '7',\n tty: '/dev/ttys030',\n };\n\n it('uses wezterm cli send-text --no-paste to deliver a raw key', async () => {\n mockExecFileSuccess();\n\n await TtyWriter.sendKey(location, '1');\n\n expect(mockedExecFile).toHaveBeenCalledTimes(1);\n expect(mockedExecFile).toHaveBeenCalledWith(\n 'wezterm',\n ['cli', 'send-text', '--pane-id', '7', '--no-paste', '1'],\n expect.any(Function),\n );\n });\n });\n\n describe('sendKey — iTerm2', () => {\n const location: TerminalLocation = {\n type: TerminalType.ITERM2,\n identifier: '/dev/ttys030',\n tty: '/dev/ttys030',\n };\n\n it('uses System Events keystroke after activating the iTerm2 session', async () => {\n mockExecFileSuccess('ok');\n\n await TtyWriter.sendKey(location, '2');\n\n const args = (mockedExecFile.mock.calls[0] as unknown[])[1] as string[];\n const script = args[1];\n expect(script).toContain('tell application \"iTerm\"');\n expect(script).toContain('tell application \"System Events\" to keystroke \"2\"');\n expect(mockedExecFile).toHaveBeenCalledTimes(1);\n });\n\n it('translates Esc byte (\\\\x1b) to AppleScript `key code 53`', async () => {\n mockExecFileSuccess('ok');\n await TtyWriter.sendKey(location, '\\x1b');\n const args = (mockedExecFile.mock.calls[0] as unknown[])[1] as string[];\n const script = args[1];\n expect(script).toContain('tell application \"System Events\" to key code 53');\n expect(script).not.toContain('keystroke');\n });\n\n it('throws when session not found', async () => {\n mockExecFileSuccess('not_found');\n await expect(TtyWriter.sendKey(location, '1'))\n .rejects.toThrow('iTerm2 session not found');\n });\n });\n\n describe('sendKey — Terminal.app', () => {\n const location: TerminalLocation = {\n type: TerminalType.TERMINAL_APP,\n identifier: '/dev/ttys030',\n tty: '/dev/ttys030',\n };\n\n it('uses System Events keystroke after selecting the Terminal.app tab', async () => {\n mockExecFileSuccess('ok');\n\n await TtyWriter.sendKey(location, '3');\n\n const args = (mockedExecFile.mock.calls[0] as unknown[])[1] as string[];\n const script = args[1];\n expect(script).toContain('tell application \"Terminal\"');\n expect(script).toContain('tell application \"System Events\" to keystroke \"3\"');\n expect(mockedExecFile).toHaveBeenCalledTimes(1);\n });\n\n it('translates Esc byte (\\\\x1b) to AppleScript `key code 53`', async () => {\n mockExecFileSuccess('ok');\n await TtyWriter.sendKey(location, '\\x1b');\n const args = (mockedExecFile.mock.calls[0] as unknown[])[1] as string[];\n const script = args[1];\n expect(script).toContain('tell application \"System Events\" to key code 53');\n expect(script).not.toContain('keystroke');\n });\n\n it('throws when tab not found', async () => {\n mockExecFileSuccess('not_found');\n await expect(TtyWriter.sendKey(location, '1'))\n .rejects.toThrow('Terminal.app tab not found');\n });\n });\n\n describe('sendKey — unsupported terminal', () => {\n it('throws for unknown terminal type', async () => {\n const location: TerminalLocation = {\n type: TerminalType.UNKNOWN,\n identifier: '',\n tty: '/dev/ttys030',\n };\n await expect(TtyWriter.sendKey(location, '1'))\n .rejects.toThrow('Cannot send key: unsupported terminal type');\n });\n });\n});\n"],"names":["TtyWriter","TerminalType","execFile","vi","mock","actual","importActual","fn","mockedExecFile","mockExecFileSuccess","stdout","mockImplementation","args","cb","length","stdin","end","mockExecFileError","message","Error","describe","beforeEach","clearAllMocks","location","type","TMUX","identifier","tty","it","send","loadArgs","calls","bufferName","expect","toMatch","toHaveBeenNthCalledWith","any","Function","results","value","toHaveBeenCalledWith","toHaveBeenCalledTimes","rejects","toThrow","ITERM2","stringContaining","callCount","TERMINAL_APP","firstCallArgs","textScript","toContain","not","secondCallArgs","enterScript","WEZTERM","enterCall","enterArgs","enterByte","toHaveLength","charCodeAt","toBe","hostile","textCall","textArgs","toEqual","toBeTypeOf","pane42","UNKNOWN","sendKey","script"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/__tests__/terminal/TtyWriter.test.ts"],"sourcesContent":["import type { Mock } from \"vitest\";\n\nimport { TtyWriter } from \"../../terminal/TtyWriter.js\";\nimport { TerminalType } from \"../../terminal/TerminalFocusManager.js\";\nimport type { TerminalLocation } from \"../../terminal/TerminalFocusManager.js\";\nimport { execFile } from \"child_process\";\n\nvi.mock(\"child_process\", async () => {\n const actual = await vi.importActual<typeof import(\"child_process\")>(\"child_process\");\n return {\n ...actual,\n execFile: vi.fn(),\n };\n});\n\nconst mockedExecFile = execFile as unknown as Mock;\n\nfunction mockExecFileSuccess(stdout = \"\") {\n mockedExecFile.mockImplementation((...args: unknown[]) => {\n const cb = args[args.length - 1] as (\n err: Error | null,\n result: { stdout: string },\n stderr: string,\n ) => void;\n cb(null, { stdout }, \"\");\n return { stdin: { end: vi.fn() } };\n });\n}\n\nfunction mockExecFileError(message: string) {\n mockedExecFile.mockImplementation((...args: unknown[]) => {\n const cb = args[args.length - 1] as (err: Error | null, result: null, stderr: string) => void;\n cb(new Error(message), null, \"\");\n });\n}\n\ndescribe(\"TtyWriter\", () => {\n beforeEach(() => {\n vi.clearAllMocks();\n });\n\n describe(\"tmux\", () => {\n const location: TerminalLocation = {\n type: TerminalType.TMUX,\n identifier: \"main:0.1\",\n tty: \"/dev/ttys030\",\n };\n\n it(\"pastes message in bracketed paste mode and sends Enter separately\", async () => {\n mockExecFileSuccess();\n const message = \"line 1\\nline 2\\n\";\n\n await TtyWriter.send(location, message);\n\n const loadArgs = mockedExecFile.mock.calls[0]?.[1] as string[];\n const bufferName = loadArgs[2];\n expect(bufferName).toMatch(/^ai-devkit-send-/);\n expect(mockedExecFile).toHaveBeenNthCalledWith(\n 1,\n \"tmux\",\n [\"load-buffer\", \"-b\", bufferName, \"-\"],\n expect.any(Function),\n );\n expect(mockedExecFile.mock.results[0]?.value.stdin.end).toHaveBeenCalledWith(message);\n expect(mockedExecFile).toHaveBeenNthCalledWith(\n 2,\n \"tmux\",\n [\"paste-buffer\", \"-t\", \"main:0.1\", \"-b\", bufferName, \"-p\", \"-d\"],\n expect.any(Function),\n );\n expect(mockedExecFile).toHaveBeenNthCalledWith(\n 3,\n \"tmux\",\n [\"send-keys\", \"-t\", \"main:0.1\", \"Enter\"],\n expect.any(Function),\n );\n expect(mockedExecFile).toHaveBeenCalledTimes(3);\n });\n\n it(\"throws on tmux failure\", async () => {\n mockExecFileError(\"tmux not running\");\n\n await expect(TtyWriter.send(location, \"hello\")).rejects.toThrow(\"tmux not running\");\n });\n });\n\n describe(\"iTerm2\", () => {\n const location: TerminalLocation = {\n type: TerminalType.ITERM2,\n identifier: \"/dev/ttys030\",\n tty: \"/dev/ttys030\",\n };\n\n it(\"sends message via osascript with execFile (no shell)\", async () => {\n mockExecFileSuccess(\"ok\");\n\n await TtyWriter.send(location, \"hello\");\n\n // First call: send text without newline\n expect(mockedExecFile).toHaveBeenCalledWith(\n \"osascript\",\n [\"-e\", expect.stringContaining('write text \"hello\" newline no')],\n expect.any(Function),\n );\n // Second call: send Enter via separate write text with newline\n expect(mockedExecFile).toHaveBeenCalledWith(\n \"osascript\",\n [\"-e\", expect.stringContaining('write text \"\" newline yes')],\n expect.any(Function),\n );\n expect(mockedExecFile).toHaveBeenCalledTimes(2);\n });\n\n it(\"escapes special characters in message\", async () => {\n mockExecFileSuccess(\"ok\");\n\n await TtyWriter.send(location, 'say \"hi\" \\\\ there');\n\n expect(mockedExecFile).toHaveBeenCalledWith(\n \"osascript\",\n [\"-e\", expect.stringContaining('write text \"say \\\\\"hi\\\\\" \\\\\\\\ there\" newline no')],\n expect.any(Function),\n );\n });\n\n it(\"escapes newlines in message\", async () => {\n mockExecFileSuccess(\"ok\");\n\n await TtyWriter.send(location, \"line1\\nline2\");\n\n expect(mockedExecFile).toHaveBeenCalledWith(\n \"osascript\",\n [\"-e\", expect.stringContaining('write text \"line1\\\\nline2\" newline no')],\n expect.any(Function),\n );\n });\n\n it(\"throws when session not found\", async () => {\n mockExecFileSuccess(\"not_found\");\n\n await expect(TtyWriter.send(location, \"test\")).rejects.toThrow(\"iTerm2 session not found\");\n });\n\n it(\"throws when session disappears before Enter\", async () => {\n // First call succeeds (text sent), second returns not_found\n let callCount = 0;\n mockedExecFile.mockImplementation((...args: unknown[]) => {\n const cb = args[args.length - 1] as (\n err: Error | null,\n result: { stdout: string },\n stderr: string,\n ) => void;\n callCount++;\n cb(null, { stdout: callCount === 1 ? \"ok\" : \"not_found\" }, \"\");\n });\n\n await expect(TtyWriter.send(location, \"test\")).rejects.toThrow(\n \"iTerm2 session disappeared before Enter\",\n );\n });\n });\n\n describe(\"Terminal.app\", () => {\n const location: TerminalLocation = {\n type: TerminalType.TERMINAL_APP,\n identifier: \"/dev/ttys030\",\n tty: \"/dev/ttys030\",\n };\n\n it(\"sends message via do script (not System Events)\", async () => {\n mockExecFileSuccess(\"ok\");\n\n await TtyWriter.send(location, \"hello\");\n\n // First call: send text via do script\n const firstCallArgs = (mockedExecFile.mock.calls[0] as unknown[])[1] as string[];\n const textScript = firstCallArgs[1];\n expect(textScript).toContain('do script \"hello\" in targetTab');\n expect(textScript).not.toContain(\"keystroke\");\n expect(textScript).not.toContain(\"key code 36\");\n\n // Second call: send Enter via separate do script\n const secondCallArgs = (mockedExecFile.mock.calls[1] as unknown[])[1] as string[];\n const enterScript = secondCallArgs[1];\n expect(enterScript).toContain('do script \"\" in targetTab');\n\n expect(mockedExecFile).toHaveBeenCalledTimes(2);\n });\n\n it(\"throws when tab not found\", async () => {\n mockExecFileSuccess(\"not_found\");\n\n await expect(TtyWriter.send(location, \"test\")).rejects.toThrow(\"Terminal.app tab not found\");\n });\n\n it(\"throws when tab disappears before Enter\", async () => {\n let callCount = 0;\n mockedExecFile.mockImplementation((...args: unknown[]) => {\n const cb = args[args.length - 1] as (\n err: Error | null,\n result: { stdout: string },\n stderr: string,\n ) => void;\n callCount++;\n cb(null, { stdout: callCount === 1 ? \"ok\" : \"not_found\" }, \"\");\n });\n\n await expect(TtyWriter.send(location, \"test\")).rejects.toThrow(\n \"Terminal.app tab disappeared before Enter\",\n );\n });\n });\n\n describe(\"WezTerm\", () => {\n const location: TerminalLocation = {\n type: TerminalType.WEZTERM,\n identifier: \"7\",\n tty: \"/dev/ttys030\",\n };\n\n it(\"sends the message via stdin and Enter as a separate send-text call\", async () => {\n mockExecFileSuccess();\n\n await TtyWriter.send(location, \"continue\");\n\n // Step 1: message body via stdin, not argv, so prompt contents are\n // not exposed through process listings.\n expect(mockedExecFile).toHaveBeenCalledWith(\n \"wezterm\",\n [\"cli\", \"send-text\", \"--pane-id\", \"7\"],\n expect.any(Function),\n );\n expect(mockedExecFile.mock.results[0]?.value.stdin.end).toHaveBeenCalledWith(\"continue\");\n // Step 2: Enter as a single carriage return (0x0d) with --no-paste,\n // so the CR is delivered literally (not wrapped in paste brackets).\n // execFile passes the actual CR byte (JS '\\x0d'); the equivalent\n // shell command is:\n // wezterm cli send-text --pane-id <id> --no-paste $'\\x0d'\n expect(mockedExecFile).toHaveBeenCalledWith(\n \"wezterm\",\n [\"cli\", \"send-text\", \"--pane-id\", \"7\", \"--no-paste\", \"\\x0d\"],\n expect.any(Function),\n );\n expect(mockedExecFile).toHaveBeenCalledTimes(2);\n });\n\n it(\"passes the Enter byte as the carriage return (0x0d), not newline\", async () => {\n mockExecFileSuccess();\n\n await TtyWriter.send(location, \"continue\");\n\n // The Enter call is the second invocation; its last argv element is\n // a single byte equal to char code 13 (0x0d).\n const enterCall = mockedExecFile.mock.calls[1];\n const enterArgs = enterCall[1] as string[];\n const enterByte = enterArgs[enterArgs.length - 1];\n expect(enterByte).toHaveLength(1);\n expect(enterByte.charCodeAt(0)).toBe(0x0d);\n expect(enterArgs).toContain(\"--no-paste\");\n });\n\n it(\"keeps the whole message out of argv and writes it verbatim to stdin\", async () => {\n mockExecFileSuccess();\n const hostile = \"echo pwned; $(rm -rf /) `whoami` | cat\\nline2\";\n\n await TtyWriter.send(location, hostile);\n\n // The message is written verbatim to stdin, not built into a shell\n // string or exposed as a process argument.\n const textCall = mockedExecFile.mock.calls[0];\n const textArgs = textCall[1] as string[];\n expect(textArgs).toEqual([\"cli\", \"send-text\", \"--pane-id\", \"7\"]);\n expect(textCall[2]).toBeTypeOf(\"function\");\n expect(mockedExecFile.mock.results[0]?.value.stdin.end).toHaveBeenCalledWith(hostile);\n });\n\n it(\"uses the pane id from location.identifier\", async () => {\n mockExecFileSuccess();\n const pane42 = { ...location, identifier: \"42\" };\n\n await TtyWriter.send(pane42, \"hi\");\n\n expect(mockedExecFile).toHaveBeenCalledWith(\n \"wezterm\",\n [\"cli\", \"send-text\", \"--pane-id\", \"42\"],\n expect.any(Function),\n );\n expect(mockedExecFile.mock.results[0]?.value.stdin.end).toHaveBeenCalledWith(\"hi\");\n });\n\n it(\"throws when the text send fails\", async () => {\n mockExecFileError(\"wezterm send-text failed\");\n\n await expect(TtyWriter.send(location, \"hello\")).rejects.toThrow(\"wezterm send-text failed\");\n });\n });\n\n describe(\"unsupported terminal\", () => {\n it(\"throws for unknown terminal type\", async () => {\n const location: TerminalLocation = {\n type: TerminalType.UNKNOWN,\n identifier: \"\",\n tty: \"/dev/ttys030\",\n };\n\n await expect(TtyWriter.send(location, \"test\")).rejects.toThrow(\n \"Cannot send input: unsupported terminal type\",\n );\n });\n });\n\n describe(\"sendKey — tmux\", () => {\n const location: TerminalLocation = {\n type: TerminalType.TMUX,\n identifier: \"main:0.1\",\n tty: \"/dev/ttys030\",\n };\n\n it(\"sends key via tmux send-keys directly (no paste buffer, no auto-Enter)\", async () => {\n mockExecFileSuccess();\n\n await TtyWriter.sendKey(location, \"1\");\n\n expect(mockedExecFile).toHaveBeenCalledTimes(1);\n expect(mockedExecFile).toHaveBeenCalledWith(\n \"tmux\",\n [\"send-keys\", \"-t\", \"main:0.1\", \"1\"],\n expect.any(Function),\n );\n });\n\n it(\"passes through named keys like Enter\", async () => {\n mockExecFileSuccess();\n await TtyWriter.sendKey(location, \"Enter\");\n expect(mockedExecFile).toHaveBeenCalledWith(\n \"tmux\",\n [\"send-keys\", \"-t\", \"main:0.1\", \"Enter\"],\n expect.any(Function),\n );\n });\n\n it('translates Esc byte (\\\\x1b) to the named \"Escape\" key', async () => {\n mockExecFileSuccess();\n await TtyWriter.sendKey(location, \"\\x1b\");\n expect(mockedExecFile).toHaveBeenCalledWith(\n \"tmux\",\n [\"send-keys\", \"-t\", \"main:0.1\", \"Escape\"],\n expect.any(Function),\n );\n });\n });\n\n describe(\"sendKey — WezTerm\", () => {\n const location: TerminalLocation = {\n type: TerminalType.WEZTERM,\n identifier: \"7\",\n tty: \"/dev/ttys030\",\n };\n\n it(\"uses wezterm cli send-text --no-paste to deliver a raw key\", async () => {\n mockExecFileSuccess();\n\n await TtyWriter.sendKey(location, \"1\");\n\n expect(mockedExecFile).toHaveBeenCalledTimes(1);\n expect(mockedExecFile).toHaveBeenCalledWith(\n \"wezterm\",\n [\"cli\", \"send-text\", \"--pane-id\", \"7\", \"--no-paste\", \"1\"],\n expect.any(Function),\n );\n });\n });\n\n describe(\"sendKey — iTerm2\", () => {\n const location: TerminalLocation = {\n type: TerminalType.ITERM2,\n identifier: \"/dev/ttys030\",\n tty: \"/dev/ttys030\",\n };\n\n it(\"uses System Events keystroke after activating the iTerm2 session\", async () => {\n mockExecFileSuccess(\"ok\");\n\n await TtyWriter.sendKey(location, \"2\");\n\n const args = (mockedExecFile.mock.calls[0] as unknown[])[1] as string[];\n const script = args[1];\n expect(script).toContain('tell application \"iTerm\"');\n expect(script).toContain('tell application \"System Events\" to keystroke \"2\"');\n expect(mockedExecFile).toHaveBeenCalledTimes(1);\n });\n\n it(\"translates Esc byte (\\\\x1b) to AppleScript `key code 53`\", async () => {\n mockExecFileSuccess(\"ok\");\n await TtyWriter.sendKey(location, \"\\x1b\");\n const args = (mockedExecFile.mock.calls[0] as unknown[])[1] as string[];\n const script = args[1];\n expect(script).toContain('tell application \"System Events\" to key code 53');\n expect(script).not.toContain(\"keystroke\");\n });\n\n it(\"throws when session not found\", async () => {\n mockExecFileSuccess(\"not_found\");\n await expect(TtyWriter.sendKey(location, \"1\")).rejects.toThrow(\"iTerm2 session not found\");\n });\n });\n\n describe(\"sendKey — Terminal.app\", () => {\n const location: TerminalLocation = {\n type: TerminalType.TERMINAL_APP,\n identifier: \"/dev/ttys030\",\n tty: \"/dev/ttys030\",\n };\n\n it(\"uses System Events keystroke after selecting the Terminal.app tab\", async () => {\n mockExecFileSuccess(\"ok\");\n\n await TtyWriter.sendKey(location, \"3\");\n\n const args = (mockedExecFile.mock.calls[0] as unknown[])[1] as string[];\n const script = args[1];\n expect(script).toContain('tell application \"Terminal\"');\n expect(script).toContain('tell application \"System Events\" to keystroke \"3\"');\n expect(mockedExecFile).toHaveBeenCalledTimes(1);\n });\n\n it(\"translates Esc byte (\\\\x1b) to AppleScript `key code 53`\", async () => {\n mockExecFileSuccess(\"ok\");\n await TtyWriter.sendKey(location, \"\\x1b\");\n const args = (mockedExecFile.mock.calls[0] as unknown[])[1] as string[];\n const script = args[1];\n expect(script).toContain('tell application \"System Events\" to key code 53');\n expect(script).not.toContain(\"keystroke\");\n });\n\n it(\"throws when tab not found\", async () => {\n mockExecFileSuccess(\"not_found\");\n await expect(TtyWriter.sendKey(location, \"1\")).rejects.toThrow(\"Terminal.app tab not found\");\n });\n });\n\n describe(\"sendKey — unsupported terminal\", () => {\n it(\"throws for unknown terminal type\", async () => {\n const location: TerminalLocation = {\n type: TerminalType.UNKNOWN,\n identifier: \"\",\n tty: \"/dev/ttys030\",\n };\n await expect(TtyWriter.sendKey(location, \"1\")).rejects.toThrow(\n \"Cannot send key: unsupported terminal type\",\n );\n });\n });\n});\n"],"names":["TtyWriter","TerminalType","execFile","vi","mock","actual","importActual","fn","mockedExecFile","mockExecFileSuccess","stdout","mockImplementation","args","cb","length","stdin","end","mockExecFileError","message","Error","describe","beforeEach","clearAllMocks","location","type","TMUX","identifier","tty","it","send","loadArgs","calls","bufferName","expect","toMatch","toHaveBeenNthCalledWith","any","Function","results","value","toHaveBeenCalledWith","toHaveBeenCalledTimes","rejects","toThrow","ITERM2","stringContaining","callCount","TERMINAL_APP","firstCallArgs","textScript","toContain","not","secondCallArgs","enterScript","WEZTERM","enterCall","enterArgs","enterByte","toHaveLength","charCodeAt","toBe","hostile","textCall","textArgs","toEqual","toBeTypeOf","pane42","UNKNOWN","sendKey","script"],"mappings":"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"}
|