@ai-devkit/agent-manager 0.32.0 → 0.33.1
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 +13 -4
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +116 -84
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +623 -391
- 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/GrokCliAdapter.test.js +114 -114
- package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
- package/dist/__tests__/adapters/OpenCodeAdapter.test.js +170 -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/copilot/CopilotAdapter.test.js +641 -0
- package/dist/__tests__/providers/copilot/CopilotAdapter.test.js.map +1 -0
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js +1398 -0
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.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 +134 -134
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
- package/dist/__tests__/runtime/AgentRuntime.test.js +13 -0
- package/dist/__tests__/runtime/AgentRuntime.test.js.map +1 -0
- package/dist/__tests__/runtime/HerdrAgentDiscovery.test.js +164 -0
- package/dist/__tests__/runtime/HerdrAgentDiscovery.test.js.map +1 -0
- package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +488 -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 +343 -218
- 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/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 +2 -1
- package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
- package/dist/adapters/OpenCodeAdapter.js +41 -37
- 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 +48 -43
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -26
- 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/{adapters → providers/copilot}/CopilotAdapter.d.ts +11 -25
- package/dist/providers/copilot/CopilotAdapter.d.ts.map +1 -0
- package/dist/providers/copilot/CopilotAdapter.js +108 -0
- package/dist/providers/copilot/CopilotAdapter.js.map +1 -0
- package/dist/providers/copilot/CopilotAgentMapper.d.ts +9 -0
- package/dist/providers/copilot/CopilotAgentMapper.d.ts.map +1 -0
- package/dist/providers/copilot/CopilotAgentMapper.js +37 -0
- package/dist/providers/copilot/CopilotAgentMapper.js.map +1 -0
- package/dist/providers/copilot/CopilotSessionLocator.d.ts +19 -0
- package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +1 -0
- package/dist/providers/copilot/CopilotSessionLocator.js +41 -0
- package/dist/providers/copilot/CopilotSessionLocator.js.map +1 -0
- package/dist/providers/copilot/CopilotSessionParser.d.ts +30 -0
- package/dist/providers/copilot/CopilotSessionParser.d.ts.map +1 -0
- package/dist/providers/copilot/CopilotSessionParser.js +181 -0
- package/dist/providers/copilot/CopilotSessionParser.js.map +1 -0
- package/dist/providers/gemini/GeminiAgentMapper.d.ts +9 -0
- package/dist/providers/gemini/GeminiAgentMapper.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiAgentMapper.js +37 -0
- package/dist/providers/gemini/GeminiAgentMapper.js.map +1 -0
- package/dist/providers/gemini/GeminiCliAdapter.d.ts +52 -0
- package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiCliAdapter.js +188 -0
- package/dist/providers/gemini/GeminiCliAdapter.js.map +1 -0
- package/dist/providers/gemini/GeminiSessionLocator.d.ts +30 -0
- package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiSessionLocator.js +142 -0
- package/dist/providers/gemini/GeminiSessionLocator.js.map +1 -0
- package/dist/providers/gemini/GeminiSessionParser.d.ts +94 -0
- package/dist/providers/gemini/GeminiSessionParser.d.ts.map +1 -0
- package/dist/providers/gemini/GeminiSessionParser.js +166 -0
- package/dist/providers/gemini/GeminiSessionParser.js.map +1 -0
- 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 +6 -6
- package/dist/readiness/AgentReadiness.d.ts.map +1 -1
- package/dist/readiness/AgentReadiness.js +130 -130
- package/dist/readiness/AgentReadiness.js.map +1 -1
- 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/HerdrAgentDiscovery.d.ts +18 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.js +183 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +36 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrAgentRuntime.js +202 -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 +16 -0
- package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
- package/dist/runtime/herdr/HerdrResponseParsers.js +107 -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 +59 -26
- 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 +338 -274
- package/src/__tests__/AgentManager.test.ts +1143 -907
- package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
- package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
- package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
- package/src/__tests__/adapters/OpenCodeAdapter.test.ts +511 -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/copilot/CopilotAdapter.test.ts +602 -0
- package/src/__tests__/providers/gemini/GeminiCliAdapter.test.ts +1299 -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 +217 -169
- package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
- package/src/__tests__/runtime/HerdrAgentDiscovery.test.ts +131 -0
- package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +377 -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 +516 -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/GrokCliAdapter.ts +353 -342
- package/src/adapters/OpenCodeAdapter.ts +289 -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 +151 -103
- 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/copilot/CopilotAdapter.ts +145 -0
- package/src/providers/copilot/CopilotAgentMapper.ts +36 -0
- package/src/providers/copilot/CopilotSessionLocator.ts +57 -0
- package/src/providers/copilot/CopilotSessionParser.ts +289 -0
- package/src/providers/gemini/GeminiAgentMapper.ts +36 -0
- package/src/providers/gemini/GeminiCliAdapter.ts +266 -0
- package/src/providers/gemini/GeminiSessionLocator.ts +183 -0
- package/src/providers/gemini/GeminiSessionParser.ts +271 -0
- 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 +585 -513
- 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/HerdrAgentDiscovery.ts +178 -0
- package/src/runtime/herdr/HerdrAgentRuntime.ts +216 -0
- package/src/runtime/herdr/HerdrCliClient.ts +78 -0
- package/src/runtime/herdr/HerdrErrors.ts +9 -0
- package/src/runtime/herdr/HerdrResponseParsers.ts +86 -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 +301 -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/CopilotAdapter.test.js +0 -630
- package/dist/__tests__/adapters/CopilotAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js +0 -1384
- package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +0 -1
- 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/CopilotAdapter.d.ts.map +0 -1
- package/dist/adapters/CopilotAdapter.js +0 -329
- package/dist/adapters/CopilotAdapter.js.map +0 -1
- package/dist/adapters/GeminiCliAdapter.d.ts +0 -98
- package/dist/adapters/GeminiCliAdapter.d.ts.map +0 -1
- package/dist/adapters/GeminiCliAdapter.js +0 -513
- package/dist/adapters/GeminiCliAdapter.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/CopilotAdapter.test.ts +0 -510
- package/src/__tests__/adapters/GeminiCliAdapter.test.ts +0 -1259
- 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/CopilotAdapter.ts +0 -473
- package/src/adapters/GeminiCliAdapter.ts +0 -701
- package/src/adapters/PiAdapter.ts +0 -598
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ProcessInfo } from "../../adapters/AgentAdapter.js";
|
|
2
|
+
export interface PiTrackerMatch {
|
|
3
|
+
process: ProcessInfo;
|
|
4
|
+
filePath: string;
|
|
5
|
+
}
|
|
6
|
+
export interface PiTrackerMatchResult {
|
|
7
|
+
matches: PiTrackerMatch[];
|
|
8
|
+
fallback: ProcessInfo[];
|
|
9
|
+
}
|
|
10
|
+
export interface PiSessionTrackerOptions {
|
|
11
|
+
sessionsDir?: string;
|
|
12
|
+
trackerPath?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class PiSessionTracker {
|
|
15
|
+
private readonly sessionsDir;
|
|
16
|
+
private readonly trackerPath;
|
|
17
|
+
constructor(options?: PiSessionTrackerOptions);
|
|
18
|
+
match(processes: ProcessInfo[]): PiTrackerMatchResult;
|
|
19
|
+
private readTracker;
|
|
20
|
+
private toPid;
|
|
21
|
+
private isTrustedSessionPath;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=PiSessionTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PiSessionTracker.d.ts","sourceRoot":"","sources":["../../../src/providers/pi/PiSessionTracker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAGlE,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,WAAW,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,GAAE,uBAA4B;IAOjD,KAAK,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,oBAAoB;IAoBrD,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,KAAK;IAOb,OAAO,CAAC,oBAAoB;CAK7B"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import { safeReadFile } from "../../utils/session.js";
|
|
4
|
+
export class PiSessionTracker {
|
|
5
|
+
sessionsDir;
|
|
6
|
+
trackerPath;
|
|
7
|
+
constructor(options = {}){
|
|
8
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || "";
|
|
9
|
+
const agentDir = path.join(homeDir, ".pi", "agent");
|
|
10
|
+
this.sessionsDir = options.sessionsDir ?? path.join(agentDir, "sessions");
|
|
11
|
+
this.trackerPath = options.trackerPath ?? path.join(agentDir, "sessions.json");
|
|
12
|
+
}
|
|
13
|
+
match(processes) {
|
|
14
|
+
const tracker = this.readTracker();
|
|
15
|
+
if (tracker.size === 0) return {
|
|
16
|
+
matches: [],
|
|
17
|
+
fallback: processes
|
|
18
|
+
};
|
|
19
|
+
const matches = [];
|
|
20
|
+
const fallback = [];
|
|
21
|
+
for (const processInfo of processes){
|
|
22
|
+
const filePath = tracker.get(processInfo.pid);
|
|
23
|
+
if (!filePath || !this.isTrustedSessionPath(filePath) || !fs.existsSync(filePath)) {
|
|
24
|
+
fallback.push(processInfo);
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
matches.push({
|
|
28
|
+
process: processInfo,
|
|
29
|
+
filePath
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
matches,
|
|
34
|
+
fallback
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
readTracker() {
|
|
38
|
+
const content = safeReadFile(this.trackerPath);
|
|
39
|
+
if (content === undefined) return new Map();
|
|
40
|
+
let parsed;
|
|
41
|
+
try {
|
|
42
|
+
parsed = JSON.parse(content);
|
|
43
|
+
} catch {
|
|
44
|
+
return new Map();
|
|
45
|
+
}
|
|
46
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return new Map();
|
|
47
|
+
const map = new Map();
|
|
48
|
+
for (const [key, value] of Object.entries(parsed)){
|
|
49
|
+
const keyPid = this.toPid(key);
|
|
50
|
+
if (keyPid !== null && typeof value === "string" && value) {
|
|
51
|
+
map.set(keyPid, value);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return map;
|
|
55
|
+
}
|
|
56
|
+
toPid(value) {
|
|
57
|
+
if (typeof value === "number" && Number.isInteger(value) && value > 0) return value;
|
|
58
|
+
if (typeof value !== "string" || !/^\d+$/.test(value)) return null;
|
|
59
|
+
const parsed = Number(value);
|
|
60
|
+
return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null;
|
|
61
|
+
}
|
|
62
|
+
isTrustedSessionPath(filePath) {
|
|
63
|
+
const resolvedRoot = path.resolve(this.sessionsDir);
|
|
64
|
+
const resolvedPath = path.resolve(filePath);
|
|
65
|
+
return resolvedPath === resolvedRoot || resolvedPath.startsWith(`${resolvedRoot}${path.sep}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=PiSessionTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/providers/pi/PiSessionTracker.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { safeReadFile } from \"../../utils/session.js\";\n\nexport interface PiTrackerMatch {\n process: ProcessInfo;\n filePath: string;\n}\n\nexport interface PiTrackerMatchResult {\n matches: PiTrackerMatch[];\n fallback: ProcessInfo[];\n}\n\nexport interface PiSessionTrackerOptions {\n sessionsDir?: string;\n trackerPath?: string;\n}\n\nexport class PiSessionTracker {\n private readonly sessionsDir: string;\n private readonly trackerPath: string;\n\n constructor(options: PiSessionTrackerOptions = {}) {\n const homeDir = process.env.HOME || process.env.USERPROFILE || \"\";\n const agentDir = path.join(homeDir, \".pi\", \"agent\");\n this.sessionsDir = options.sessionsDir ?? path.join(agentDir, \"sessions\");\n this.trackerPath = options.trackerPath ?? path.join(agentDir, \"sessions.json\");\n }\n\n match(processes: ProcessInfo[]): PiTrackerMatchResult {\n const tracker = this.readTracker();\n if (tracker.size === 0) return { matches: [], fallback: processes };\n\n const matches: PiTrackerMatch[] = [];\n const fallback: ProcessInfo[] = [];\n\n for (const processInfo of processes) {\n const filePath = tracker.get(processInfo.pid);\n if (!filePath || !this.isTrustedSessionPath(filePath) || !fs.existsSync(filePath)) {\n fallback.push(processInfo);\n continue;\n }\n\n matches.push({ process: processInfo, filePath });\n }\n\n return { matches, fallback };\n }\n\n private readTracker(): Map<number, string> {\n const content = safeReadFile(this.trackerPath);\n if (content === undefined) return new Map();\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n return new Map();\n }\n\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return new Map();\n\n const map = new Map<number, string>();\n for (const [key, value] of Object.entries(parsed)) {\n const keyPid = this.toPid(key);\n if (keyPid !== null && typeof value === \"string\" && value) {\n map.set(keyPid, value);\n }\n }\n return map;\n }\n\n private toPid(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isInteger(value) && value > 0) return value;\n if (typeof value !== \"string\" || !/^\\d+$/.test(value)) return null;\n const parsed = Number(value);\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : null;\n }\n\n private isTrustedSessionPath(filePath: string): boolean {\n const resolvedRoot = path.resolve(this.sessionsDir);\n const resolvedPath = path.resolve(filePath);\n return resolvedPath === resolvedRoot || resolvedPath.startsWith(`${resolvedRoot}${path.sep}`);\n }\n}\n"],"names":["fs","path","safeReadFile","PiSessionTracker","sessionsDir","trackerPath","options","homeDir","process","env","HOME","USERPROFILE","agentDir","join","match","processes","tracker","readTracker","size","matches","fallback","processInfo","filePath","get","pid","isTrustedSessionPath","existsSync","push","content","undefined","Map","parsed","JSON","parse","Array","isArray","map","key","value","Object","entries","keyPid","toPid","set","Number","isInteger","test","isSafeInteger","resolvedRoot","resolve","resolvedPath","startsWith","sep"],"mappings":"AAAA,YAAYA,QAAQ,KAAK;AACzB,YAAYC,UAAU,OAAO;AAE7B,SAASC,YAAY,QAAQ,yBAAyB;AAiBtD,OAAO,MAAMC;IACMC,YAAoB;IACpBC,YAAoB;IAErC,YAAYC,UAAmC,CAAC,CAAC,CAAE;QACjD,MAAMC,UAAUC,QAAQC,GAAG,CAACC,IAAI,IAAIF,QAAQC,GAAG,CAACE,WAAW,IAAI;QAC/D,MAAMC,WAAWX,KAAKY,IAAI,CAACN,SAAS,OAAO;QAC3C,IAAI,CAACH,WAAW,GAAGE,QAAQF,WAAW,IAAIH,KAAKY,IAAI,CAACD,UAAU;QAC9D,IAAI,CAACP,WAAW,GAAGC,QAAQD,WAAW,IAAIJ,KAAKY,IAAI,CAACD,UAAU;IAChE;IAEAE,MAAMC,SAAwB,EAAwB;QACpD,MAAMC,UAAU,IAAI,CAACC,WAAW;QAChC,IAAID,QAAQE,IAAI,KAAK,GAAG,OAAO;YAAEC,SAAS,EAAE;YAAEC,UAAUL;QAAU;QAElE,MAAMI,UAA4B,EAAE;QACpC,MAAMC,WAA0B,EAAE;QAElC,KAAK,MAAMC,eAAeN,UAAW;YACnC,MAAMO,WAAWN,QAAQO,GAAG,CAACF,YAAYG,GAAG;YAC5C,IAAI,CAACF,YAAY,CAAC,IAAI,CAACG,oBAAoB,CAACH,aAAa,CAACtB,GAAG0B,UAAU,CAACJ,WAAW;gBACjFF,SAASO,IAAI,CAACN;gBACd;YACF;YAEAF,QAAQQ,IAAI,CAAC;gBAAEnB,SAASa;gBAAaC;YAAS;QAChD;QAEA,OAAO;YAAEH;YAASC;QAAS;IAC7B;IAEQH,cAAmC;QACzC,MAAMW,UAAU1B,aAAa,IAAI,CAACG,WAAW;QAC7C,IAAIuB,YAAYC,WAAW,OAAO,IAAIC;QAEtC,IAAIC;QACJ,IAAI;YACFA,SAASC,KAAKC,KAAK,CAACL;QACtB,EAAE,OAAM;YACN,OAAO,IAAIE;QACb;QAEA,IAAI,CAACC,UAAU,OAAOA,WAAW,YAAYG,MAAMC,OAAO,CAACJ,SAAS,OAAO,IAAID;QAE/E,MAAMM,MAAM,IAAIN;QAChB,KAAK,MAAM,CAACO,KAAKC,MAAM,IAAIC,OAAOC,OAAO,CAACT,QAAS;YACjD,MAAMU,SAAS,IAAI,CAACC,KAAK,CAACL;YAC1B,IAAII,WAAW,QAAQ,OAAOH,UAAU,YAAYA,OAAO;gBACzDF,IAAIO,GAAG,CAACF,QAAQH;YAClB;QACF;QACA,OAAOF;IACT;IAEQM,MAAMJ,KAAc,EAAiB;QAC3C,IAAI,OAAOA,UAAU,YAAYM,OAAOC,SAAS,CAACP,UAAUA,QAAQ,GAAG,OAAOA;QAC9E,IAAI,OAAOA,UAAU,YAAY,CAAC,QAAQQ,IAAI,CAACR,QAAQ,OAAO;QAC9D,MAAMP,SAASa,OAAON;QACtB,OAAOM,OAAOG,aAAa,CAAChB,WAAWA,SAAS,IAAIA,SAAS;IAC/D;IAEQN,qBAAqBH,QAAgB,EAAW;QACtD,MAAM0B,eAAe/C,KAAKgD,OAAO,CAAC,IAAI,CAAC7C,WAAW;QAClD,MAAM8C,eAAejD,KAAKgD,OAAO,CAAC3B;QAClC,OAAO4B,iBAAiBF,gBAAgBE,aAAaC,UAAU,CAAC,GAAGH,eAAe/C,KAAKmD,GAAG,EAAE;IAC9F;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PiCliProbe.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiCliProbe.ts"],"names":[],"mappings":"AAKA,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACrD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAIlE,MAAM,WAAW,iBAAiB;
|
|
1
|
+
{"version":3,"file":"PiCliProbe.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiCliProbe.ts"],"names":[],"mappings":"AAKA,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACrD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAIlE,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;gBAEhB,OAAO,GAAE,iBAAsB;IAarC,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAuBnE"}
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { execFile } from
|
|
2
|
-
import { promisify } from
|
|
3
|
-
import { PiPrintError } from
|
|
4
|
-
import { sanitizeText } from
|
|
1
|
+
import { execFile } from "child_process";
|
|
2
|
+
import { promisify } from "util";
|
|
3
|
+
import { PiPrintError } from "../../../durable/DurableAgent.js";
|
|
4
|
+
import { sanitizeText } from "../../../durable/utils.js";
|
|
5
5
|
const execFileAsync = promisify(execFile);
|
|
6
6
|
const REQUIRED = [
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
"--mode",
|
|
8
|
+
"json",
|
|
9
|
+
"--session-id",
|
|
10
|
+
"--session"
|
|
11
11
|
];
|
|
12
12
|
export class PiCliProbe {
|
|
13
13
|
executable;
|
|
14
14
|
exec;
|
|
15
15
|
constructor(options = {}){
|
|
16
|
-
this.executable = options.executable ??
|
|
16
|
+
this.executable = options.executable ?? "pi";
|
|
17
17
|
this.exec = options.exec ?? (async (file, args)=>{
|
|
18
18
|
const result = await execFileAsync(file, args, {
|
|
19
|
-
encoding:
|
|
19
|
+
encoding: "utf8",
|
|
20
20
|
maxBuffer: 1024 * 1024
|
|
21
21
|
});
|
|
22
22
|
return {
|
|
@@ -28,22 +28,22 @@ export class PiCliProbe {
|
|
|
28
28
|
async validate() {
|
|
29
29
|
try {
|
|
30
30
|
const version = await this.exec(this.executable, [
|
|
31
|
-
|
|
31
|
+
"--version"
|
|
32
32
|
]);
|
|
33
33
|
const help = await this.exec(this.executable, [
|
|
34
|
-
|
|
34
|
+
"--help"
|
|
35
35
|
]);
|
|
36
36
|
const missing = REQUIRED.filter((capability)=>!help.stdout.includes(capability));
|
|
37
37
|
if (missing.length > 0) {
|
|
38
|
-
throw new PiPrintError(`Pi CLI does not support required print-mode capabilities: ${missing.join(
|
|
38
|
+
throw new PiPrintError(`Pi CLI does not support required print-mode capabilities: ${missing.join(", ")}.`, "PI_CLI_UNSUPPORTED");
|
|
39
39
|
}
|
|
40
40
|
return {
|
|
41
41
|
executable: this.executable,
|
|
42
|
-
version: sanitizeText(version.stdout, 256) ||
|
|
42
|
+
version: sanitizeText(version.stdout, 256) || "unknown"
|
|
43
43
|
};
|
|
44
44
|
} catch (error) {
|
|
45
45
|
if (error instanceof PiPrintError) throw error;
|
|
46
|
-
throw new PiPrintError(`Pi CLI validation failed: ${sanitizeText(error.message, 512)}`,
|
|
46
|
+
throw new PiPrintError(`Pi CLI validation failed: ${sanitizeText(error.message, 512)}`, "PI_CLI_UNAVAILABLE");
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/providers/pi/durable/PiCliProbe.ts"],"sourcesContent":["import { execFile } from
|
|
1
|
+
{"version":3,"sources":["../../../../src/providers/pi/durable/PiCliProbe.ts"],"sourcesContent":["import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\nimport { PiPrintError } from \"../../../durable/DurableAgent.js\";\nimport { sanitizeText } from \"../../../durable/utils.js\";\n\ntype ExecResult = { stdout: string; stderr: string };\ntype Exec = (file: string, args: string[]) => Promise<ExecResult>;\nconst execFileAsync = promisify(execFile);\nconst REQUIRED = [\"--mode\", \"json\", \"--session-id\", \"--session\"];\n\nexport interface PiCliProbeOptions {\n executable?: string;\n exec?: Exec;\n}\n\nexport class PiCliProbe {\n private readonly executable: string;\n private readonly exec: Exec;\n\n constructor(options: PiCliProbeOptions = {}) {\n this.executable = options.executable ?? \"pi\";\n this.exec =\n options.exec ??\n (async (file, args) => {\n const result = await execFileAsync(file, args, {\n encoding: \"utf8\",\n maxBuffer: 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n });\n }\n\n async validate(): Promise<{ executable: string; version: string }> {\n try {\n const version = await this.exec(this.executable, [\"--version\"]);\n const help = await this.exec(this.executable, [\"--help\"]);\n const missing = REQUIRED.filter((capability) => !help.stdout.includes(capability));\n if (missing.length > 0) {\n throw new PiPrintError(\n `Pi CLI does not support required print-mode capabilities: ${missing.join(\", \")}.`,\n \"PI_CLI_UNSUPPORTED\",\n );\n }\n return {\n executable: this.executable,\n version: sanitizeText(version.stdout, 256) || \"unknown\",\n };\n } catch (error) {\n if (error instanceof PiPrintError) throw error;\n throw new PiPrintError(\n `Pi CLI validation failed: ${sanitizeText((error as Error).message, 512)}`,\n \"PI_CLI_UNAVAILABLE\",\n );\n }\n }\n}\n"],"names":["execFile","promisify","PiPrintError","sanitizeText","execFileAsync","REQUIRED","PiCliProbe","executable","exec","options","file","args","result","encoding","maxBuffer","stdout","stderr","validate","version","help","missing","filter","capability","includes","length","join","error","message"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,YAAY,QAAQ,mCAAmC;AAChE,SAASC,YAAY,QAAQ,4BAA4B;AAIzD,MAAMC,gBAAgBH,UAAUD;AAChC,MAAMK,WAAW;IAAC;IAAU;IAAQ;IAAgB;CAAY;AAOhE,OAAO,MAAMC;IACMC,WAAmB;IACnBC,KAAW;IAE5B,YAAYC,UAA6B,CAAC,CAAC,CAAE;QAC3C,IAAI,CAACF,UAAU,GAAGE,QAAQF,UAAU,IAAI;QACxC,IAAI,CAACC,IAAI,GACPC,QAAQD,IAAI,IACX,CAAA,OAAOE,MAAMC;YACZ,MAAMC,SAAS,MAAMR,cAAcM,MAAMC,MAAM;gBAC7CE,UAAU;gBACVC,WAAW,OAAO;YACpB;YACA,OAAO;gBAAEC,QAAQH,OAAOG,MAAM;gBAAEC,QAAQJ,OAAOI,MAAM;YAAC;QACxD,CAAA;IACJ;IAEA,MAAMC,WAA6D;QACjE,IAAI;YACF,MAAMC,UAAU,MAAM,IAAI,CAACV,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;aAAY;YAC9D,MAAMY,OAAO,MAAM,IAAI,CAACX,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;aAAS;YACxD,MAAMa,UAAUf,SAASgB,MAAM,CAAC,CAACC,aAAe,CAACH,KAAKJ,MAAM,CAACQ,QAAQ,CAACD;YACtE,IAAIF,QAAQI,MAAM,GAAG,GAAG;gBACtB,MAAM,IAAItB,aACR,CAAC,0DAA0D,EAAEkB,QAAQK,IAAI,CAAC,MAAM,CAAC,CAAC,EAClF;YAEJ;YACA,OAAO;gBACLlB,YAAY,IAAI,CAACA,UAAU;gBAC3BW,SAASf,aAAae,QAAQH,MAAM,EAAE,QAAQ;YAChD;QACF,EAAE,OAAOW,OAAO;YACd,IAAIA,iBAAiBxB,cAAc,MAAMwB;YACzC,MAAM,IAAIxB,aACR,CAAC,0BAA0B,EAAEC,aAAa,AAACuB,MAAgBC,OAAO,EAAE,MAAM,EAC1E;QAEJ;IACF;AACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { DurableAgent, ProcessIdentity } from
|
|
2
|
-
import { PiPrintRunner, type PiPrintRunResult } from
|
|
3
|
-
import { type CreateDurableAgentInput } from
|
|
4
|
-
import { type DurableRunRepository } from
|
|
1
|
+
import type { DurableAgent, ProcessIdentity } from "../../../durable/DurableAgent.js";
|
|
2
|
+
import { PiPrintRunner, type PiPrintRunResult } from "./PiPrintRunner.js";
|
|
3
|
+
import { type CreateDurableAgentInput } from "../../../durable/DurableAgentRepository.js";
|
|
4
|
+
import { type DurableRunRepository } from "../../../durable/run.js";
|
|
5
5
|
interface RepositoryLike extends DurableRunRepository {
|
|
6
6
|
create(input: CreateDurableAgentInput): Promise<DurableAgent>;
|
|
7
7
|
list(): Promise<DurableAgent[]>;
|
|
@@ -14,7 +14,7 @@ interface ProbeLike {
|
|
|
14
14
|
}>;
|
|
15
15
|
}
|
|
16
16
|
interface RunnerLike {
|
|
17
|
-
run(request: Parameters<PiPrintRunner[
|
|
17
|
+
run(request: Parameters<PiPrintRunner["run"]>[0]): Promise<PiPrintRunResult>;
|
|
18
18
|
}
|
|
19
19
|
export interface PiPrintAgentServiceOptions {
|
|
20
20
|
repository?: RepositoryLike;
|
|
@@ -32,7 +32,7 @@ export declare class PiPrintAgentService {
|
|
|
32
32
|
private readonly runner;
|
|
33
33
|
private readonly executable?;
|
|
34
34
|
constructor(options?: PiPrintAgentServiceOptions);
|
|
35
|
-
create(input: Omit<CreateDurableAgentInput,
|
|
35
|
+
create(input: Omit<CreateDurableAgentInput, "provider">): Promise<DurableAgent>;
|
|
36
36
|
send(reference: string, prompt: string): Promise<PiPrintSendResult>;
|
|
37
37
|
}
|
|
38
38
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PiPrintAgentService.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiPrintAgentService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGtF,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,
|
|
1
|
+
{"version":3,"file":"PiPrintAgentService.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiPrintAgentService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGtF,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAErF,UAAU,cAAe,SAAQ,oBAAoB;IACnD,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAChC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5F;AAED,UAAU,SAAS;IACjB,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D;AACD,UAAU,UAAU;IAClB,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC9E;AAED,MAAM,WAAW,0BAA0B;IACzC,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;gBAEzB,OAAO,GAAE,0BAA+B;IAO9C,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAK/E,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAuB1E"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { PiPrintError } from
|
|
2
|
-
import { PiCliProbe } from
|
|
3
|
-
import { PiPrintRunner } from
|
|
4
|
-
import { DurableAgentRepository } from
|
|
5
|
-
import { runDurableAgent } from
|
|
1
|
+
import { PiPrintError } from "../../../durable/DurableAgent.js";
|
|
2
|
+
import { PiCliProbe } from "./PiCliProbe.js";
|
|
3
|
+
import { PiPrintRunner } from "./PiPrintRunner.js";
|
|
4
|
+
import { DurableAgentRepository } from "../../../durable/DurableAgentRepository.js";
|
|
5
|
+
import { runDurableAgent } from "../../../durable/run.js";
|
|
6
6
|
export class PiPrintAgentService {
|
|
7
7
|
repository;
|
|
8
8
|
probe;
|
|
@@ -18,23 +18,23 @@ export class PiPrintAgentService {
|
|
|
18
18
|
await this.probe.validate();
|
|
19
19
|
return this.repository.create({
|
|
20
20
|
...input,
|
|
21
|
-
provider:
|
|
21
|
+
provider: "pi"
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
24
|
async send(reference, prompt) {
|
|
25
25
|
const completed = await runDurableAgent({
|
|
26
26
|
reference,
|
|
27
|
-
provider:
|
|
27
|
+
provider: "pi",
|
|
28
28
|
repository: this.repository,
|
|
29
|
-
ambiguousError: ()=>new PiPrintError(
|
|
30
|
-
providerError: ()=>new PiPrintError(
|
|
29
|
+
ambiguousError: ()=>new PiPrintError("Multiple print agents match.", "PI_UNSUPPORTED"),
|
|
30
|
+
providerError: ()=>new PiPrintError("Print agent provider is not Pi.", "PI_UNSUPPORTED"),
|
|
31
31
|
execute: (agent, token)=>this.runner.run({
|
|
32
32
|
agent,
|
|
33
33
|
prompt,
|
|
34
34
|
executable: this.executable,
|
|
35
35
|
onSpawn: (identity)=>this.repository.recordProviderProcess(agent.id, token, identity)
|
|
36
36
|
}),
|
|
37
|
-
isSessionMismatch: (error)=>error instanceof PiPrintError && error.code ===
|
|
37
|
+
isSessionMismatch: (error)=>error instanceof PiPrintError && error.code === "PI_SESSION_MISMATCH"
|
|
38
38
|
});
|
|
39
39
|
return {
|
|
40
40
|
...completed.result,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/providers/pi/durable/PiPrintAgentService.ts"],"sourcesContent":["import type { DurableAgent, ProcessIdentity } from
|
|
1
|
+
{"version":3,"sources":["../../../../src/providers/pi/durable/PiPrintAgentService.ts"],"sourcesContent":["import type { DurableAgent, ProcessIdentity } from \"../../../durable/DurableAgent.js\";\nimport { PiPrintError } from \"../../../durable/DurableAgent.js\";\nimport { PiCliProbe } from \"./PiCliProbe.js\";\nimport { PiPrintRunner, type PiPrintRunResult } from \"./PiPrintRunner.js\";\nimport {\n DurableAgentRepository,\n type CreateDurableAgentInput,\n} from \"../../../durable/DurableAgentRepository.js\";\nimport { runDurableAgent, type DurableRunRepository } from \"../../../durable/run.js\";\n\ninterface RepositoryLike extends DurableRunRepository {\n create(input: CreateDurableAgentInput): Promise<DurableAgent>;\n list(): Promise<DurableAgent[]>;\n recordProviderProcess(id: string, token: string, identity: ProcessIdentity): Promise<void>;\n}\n\ninterface ProbeLike {\n validate(): Promise<{ executable: string; version: string }>;\n}\ninterface RunnerLike {\n run(request: Parameters<PiPrintRunner[\"run\"]>[0]): Promise<PiPrintRunResult>;\n}\n\nexport interface PiPrintAgentServiceOptions {\n repository?: RepositoryLike;\n probe?: ProbeLike;\n runner?: RunnerLike;\n executable?: string;\n}\n\nexport interface PiPrintSendResult extends PiPrintRunResult {\n agentId: string;\n agentName: string;\n}\n\nexport class PiPrintAgentService {\n readonly repository: RepositoryLike;\n private readonly probe: ProbeLike;\n private readonly runner: RunnerLike;\n private readonly executable?: string;\n\n constructor(options: PiPrintAgentServiceOptions = {}) {\n this.repository = options.repository ?? new DurableAgentRepository();\n this.probe = options.probe ?? new PiCliProbe();\n this.runner = options.runner ?? new PiPrintRunner();\n this.executable = options.executable;\n }\n\n async create(input: Omit<CreateDurableAgentInput, \"provider\">): Promise<DurableAgent> {\n await this.probe.validate();\n return this.repository.create({ ...input, provider: \"pi\" });\n }\n\n async send(reference: string, prompt: string): Promise<PiPrintSendResult> {\n const completed = await runDurableAgent({\n reference,\n provider: \"pi\",\n repository: this.repository,\n ambiguousError: () => new PiPrintError(\"Multiple print agents match.\", \"PI_UNSUPPORTED\"),\n providerError: () => new PiPrintError(\"Print agent provider is not Pi.\", \"PI_UNSUPPORTED\"),\n execute: (agent, token) =>\n this.runner.run({\n agent,\n prompt,\n executable: this.executable,\n onSpawn: (identity) => this.repository.recordProviderProcess(agent.id, token, identity),\n }),\n isSessionMismatch: (error) =>\n error instanceof PiPrintError && error.code === \"PI_SESSION_MISMATCH\",\n });\n return {\n ...completed.result,\n agentId: completed.agent.id,\n agentName: completed.agent.name,\n };\n }\n}\n"],"names":["PiPrintError","PiCliProbe","PiPrintRunner","DurableAgentRepository","runDurableAgent","PiPrintAgentService","repository","probe","runner","executable","options","create","input","validate","provider","send","reference","prompt","completed","ambiguousError","providerError","execute","agent","token","run","onSpawn","identity","recordProviderProcess","id","isSessionMismatch","error","code","result","agentId","agentName","name"],"mappings":"AACA,SAASA,YAAY,QAAQ,mCAAmC;AAChE,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,aAAa,QAA+B,qBAAqB;AAC1E,SACEC,sBAAsB,QAEjB,6CAA6C;AACpD,SAASC,eAAe,QAAmC,0BAA0B;AA2BrF,OAAO,MAAMC;IACFC,WAA2B;IACnBC,MAAiB;IACjBC,OAAmB;IACnBC,WAAoB;IAErC,YAAYC,UAAsC,CAAC,CAAC,CAAE;QACpD,IAAI,CAACJ,UAAU,GAAGI,QAAQJ,UAAU,IAAI,IAAIH;QAC5C,IAAI,CAACI,KAAK,GAAGG,QAAQH,KAAK,IAAI,IAAIN;QAClC,IAAI,CAACO,MAAM,GAAGE,QAAQF,MAAM,IAAI,IAAIN;QACpC,IAAI,CAACO,UAAU,GAAGC,QAAQD,UAAU;IACtC;IAEA,MAAME,OAAOC,KAAgD,EAAyB;QACpF,MAAM,IAAI,CAACL,KAAK,CAACM,QAAQ;QACzB,OAAO,IAAI,CAACP,UAAU,CAACK,MAAM,CAAC;YAAE,GAAGC,KAAK;YAAEE,UAAU;QAAK;IAC3D;IAEA,MAAMC,KAAKC,SAAiB,EAAEC,MAAc,EAA8B;QACxE,MAAMC,YAAY,MAAMd,gBAAgB;YACtCY;YACAF,UAAU;YACVR,YAAY,IAAI,CAACA,UAAU;YAC3Ba,gBAAgB,IAAM,IAAInB,aAAa,gCAAgC;YACvEoB,eAAe,IAAM,IAAIpB,aAAa,mCAAmC;YACzEqB,SAAS,CAACC,OAAOC,QACf,IAAI,CAACf,MAAM,CAACgB,GAAG,CAAC;oBACdF;oBACAL;oBACAR,YAAY,IAAI,CAACA,UAAU;oBAC3BgB,SAAS,CAACC,WAAa,IAAI,CAACpB,UAAU,CAACqB,qBAAqB,CAACL,MAAMM,EAAE,EAAEL,OAAOG;gBAChF;YACFG,mBAAmB,CAACC,QAClBA,iBAAiB9B,gBAAgB8B,MAAMC,IAAI,KAAK;QACpD;QACA,OAAO;YACL,GAAGb,UAAUc,MAAM;YACnBC,SAASf,UAAUI,KAAK,CAACM,EAAE;YAC3BM,WAAWhB,UAAUI,KAAK,CAACa,IAAI;QACjC;IACF;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PiPrintProtocol.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiPrintProtocol.ts"],"names":[],"mappings":"AAGA,wBAAgB,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAIvF;AAED,wBAAgB,eAAe,
|
|
1
|
+
{"version":3,"file":"PiPrintProtocol.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiPrintProtocol.ts"],"names":[],"mappings":"AAGA,wBAAgB,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,MAAM,EAAE,CAIvF;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,gBAAgB,EAAE,MAAM,GAAG,IAAI,EAC/B,iBAAiB,EAAE,MAAM,GACxB,MAAM,CASR;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAgBjF"}
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
import { PiPrintError } from
|
|
2
|
-
import { isUuid } from
|
|
1
|
+
import { PiPrintError } from "../../../durable/DurableAgent.js";
|
|
2
|
+
import { isUuid } from "../../../durable/utils.js";
|
|
3
3
|
export function buildPiPrintArgs(providerSessionId, firstRun) {
|
|
4
4
|
return firstRun ? [
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
"--mode",
|
|
6
|
+
"json",
|
|
7
|
+
"--session-id",
|
|
8
8
|
providerSessionId
|
|
9
9
|
] : [
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
"--mode",
|
|
11
|
+
"json",
|
|
12
|
+
"--session",
|
|
13
13
|
providerSessionId
|
|
14
14
|
];
|
|
15
15
|
}
|
|
16
16
|
export function readPiSessionId(event, currentSessionId, expectedSessionId) {
|
|
17
|
-
if (currentSessionId !== null || typeof event.id !==
|
|
18
|
-
throw new PiPrintError(
|
|
17
|
+
if (currentSessionId !== null || typeof event.id !== "string" || !isUuid(event.id)) {
|
|
18
|
+
throw new PiPrintError("Pi emitted an invalid session identity.", "PI_PROTOCOL");
|
|
19
19
|
}
|
|
20
20
|
const sessionId = event.id;
|
|
21
21
|
if (expectedSessionId !== sessionId) {
|
|
22
|
-
throw new PiPrintError(
|
|
22
|
+
throw new PiPrintError("Pi returned a different session identity.", "PI_SESSION_MISMATCH");
|
|
23
23
|
}
|
|
24
24
|
return sessionId;
|
|
25
25
|
}
|
|
26
26
|
export function readPiAssistantText(event) {
|
|
27
|
-
if (event.type !==
|
|
27
|
+
if (event.type !== "message_end") return null;
|
|
28
28
|
const message = event.message;
|
|
29
|
-
if (!message || typeof message !==
|
|
29
|
+
if (!message || typeof message !== "object" || Array.isArray(message)) return null;
|
|
30
30
|
const record = message;
|
|
31
|
-
if (record.role !==
|
|
32
|
-
if (typeof record.content ===
|
|
31
|
+
if (record.role !== "assistant") return null;
|
|
32
|
+
if (typeof record.content === "string") return record.content.trim() ? record.content : null;
|
|
33
33
|
if (!Array.isArray(record.content)) return null;
|
|
34
34
|
const text = record.content.flatMap((part)=>{
|
|
35
|
-
if (!part || typeof part !==
|
|
35
|
+
if (!part || typeof part !== "object" || Array.isArray(part)) return [];
|
|
36
36
|
const block = part;
|
|
37
|
-
return block.type ===
|
|
37
|
+
return block.type === "text" && typeof block.text === "string" ? [
|
|
38
38
|
block.text
|
|
39
39
|
] : [];
|
|
40
|
-
}).join(
|
|
40
|
+
}).join("");
|
|
41
41
|
return text.trim() ? text : null;
|
|
42
42
|
}
|
|
43
43
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/providers/pi/durable/PiPrintProtocol.ts"],"sourcesContent":["import { PiPrintError } from
|
|
1
|
+
{"version":3,"sources":["../../../../src/providers/pi/durable/PiPrintProtocol.ts"],"sourcesContent":["import { PiPrintError } from \"../../../durable/DurableAgent.js\";\nimport { isUuid } from \"../../../durable/utils.js\";\n\nexport function buildPiPrintArgs(providerSessionId: string, firstRun: boolean): string[] {\n return firstRun\n ? [\"--mode\", \"json\", \"--session-id\", providerSessionId]\n : [\"--mode\", \"json\", \"--session\", providerSessionId];\n}\n\nexport function readPiSessionId(\n event: Record<string, unknown>,\n currentSessionId: string | null,\n expectedSessionId: string,\n): string {\n if (currentSessionId !== null || typeof event.id !== \"string\" || !isUuid(event.id)) {\n throw new PiPrintError(\"Pi emitted an invalid session identity.\", \"PI_PROTOCOL\");\n }\n const sessionId = event.id;\n if (expectedSessionId !== sessionId) {\n throw new PiPrintError(\"Pi returned a different session identity.\", \"PI_SESSION_MISMATCH\");\n }\n return sessionId;\n}\n\nexport function readPiAssistantText(event: Record<string, unknown>): string | null {\n if (event.type !== \"message_end\") return null;\n const message = event.message;\n if (!message || typeof message !== \"object\" || Array.isArray(message)) return null;\n const record = message as Record<string, unknown>;\n if (record.role !== \"assistant\") return null;\n if (typeof record.content === \"string\") return record.content.trim() ? record.content : null;\n if (!Array.isArray(record.content)) return null;\n const text = record.content\n .flatMap((part) => {\n if (!part || typeof part !== \"object\" || Array.isArray(part)) return [];\n const block = part as Record<string, unknown>;\n return block.type === \"text\" && typeof block.text === \"string\" ? [block.text] : [];\n })\n .join(\"\");\n return text.trim() ? text : null;\n}\n"],"names":["PiPrintError","isUuid","buildPiPrintArgs","providerSessionId","firstRun","readPiSessionId","event","currentSessionId","expectedSessionId","id","sessionId","readPiAssistantText","type","message","Array","isArray","record","role","content","trim","text","flatMap","part","block","join"],"mappings":"AAAA,SAASA,YAAY,QAAQ,mCAAmC;AAChE,SAASC,MAAM,QAAQ,4BAA4B;AAEnD,OAAO,SAASC,iBAAiBC,iBAAyB,EAAEC,QAAiB;IAC3E,OAAOA,WACH;QAAC;QAAU;QAAQ;QAAgBD;KAAkB,GACrD;QAAC;QAAU;QAAQ;QAAaA;KAAkB;AACxD;AAEA,OAAO,SAASE,gBACdC,KAA8B,EAC9BC,gBAA+B,EAC/BC,iBAAyB;IAEzB,IAAID,qBAAqB,QAAQ,OAAOD,MAAMG,EAAE,KAAK,YAAY,CAACR,OAAOK,MAAMG,EAAE,GAAG;QAClF,MAAM,IAAIT,aAAa,2CAA2C;IACpE;IACA,MAAMU,YAAYJ,MAAMG,EAAE;IAC1B,IAAID,sBAAsBE,WAAW;QACnC,MAAM,IAAIV,aAAa,6CAA6C;IACtE;IACA,OAAOU;AACT;AAEA,OAAO,SAASC,oBAAoBL,KAA8B;IAChE,IAAIA,MAAMM,IAAI,KAAK,eAAe,OAAO;IACzC,MAAMC,UAAUP,MAAMO,OAAO;IAC7B,IAAI,CAACA,WAAW,OAAOA,YAAY,YAAYC,MAAMC,OAAO,CAACF,UAAU,OAAO;IAC9E,MAAMG,SAASH;IACf,IAAIG,OAAOC,IAAI,KAAK,aAAa,OAAO;IACxC,IAAI,OAAOD,OAAOE,OAAO,KAAK,UAAU,OAAOF,OAAOE,OAAO,CAACC,IAAI,KAAKH,OAAOE,OAAO,GAAG;IACxF,IAAI,CAACJ,MAAMC,OAAO,CAACC,OAAOE,OAAO,GAAG,OAAO;IAC3C,MAAME,OAAOJ,OAAOE,OAAO,CACxBG,OAAO,CAAC,CAACC;QACR,IAAI,CAACA,QAAQ,OAAOA,SAAS,YAAYR,MAAMC,OAAO,CAACO,OAAO,OAAO,EAAE;QACvE,MAAMC,QAAQD;QACd,OAAOC,MAAMX,IAAI,KAAK,UAAU,OAAOW,MAAMH,IAAI,KAAK,WAAW;YAACG,MAAMH,IAAI;SAAC,GAAG,EAAE;IACpF,GACCI,IAAI,CAAC;IACR,OAAOJ,KAAKD,IAAI,KAAKC,OAAO;AAC9B"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { type ChildProcessWithoutNullStreams, type SpawnOptionsWithoutStdio } from
|
|
2
|
-
import type { PiDurableAgent, ProcessIdentity } from
|
|
3
|
-
import { type ProcessInspector } from
|
|
1
|
+
import { type ChildProcessWithoutNullStreams, type SpawnOptionsWithoutStdio } from "child_process";
|
|
2
|
+
import type { PiDurableAgent, ProcessIdentity } from "../../../durable/DurableAgent.js";
|
|
3
|
+
import { type ProcessInspector } from "../../../durable/process.js";
|
|
4
4
|
type Spawn = (command: string, args: readonly string[], options: SpawnOptionsWithoutStdio & {
|
|
5
|
-
stdio: [
|
|
5
|
+
stdio: ["pipe", "pipe", "pipe"];
|
|
6
6
|
}) => ChildProcessWithoutNullStreams;
|
|
7
7
|
export interface PiPrintRunRequest {
|
|
8
8
|
agent: PiDurableAgent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PiPrintRunner.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiPrintRunner.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"PiPrintRunner.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiPrintRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExF,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAK3F,KAAK,KAAK,GAAG,CACX,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,wBAAwB,GAAG;IAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,KACpE,8BAA8B,CAAC;AAEpC,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,cAAc,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,GAAE,oBAAyB;IAMxC,GAAG,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC;CA6CjE"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { spawn as nodeSpawn } from
|
|
2
|
-
import { PiPrintError } from
|
|
3
|
-
import { LocalProcessInspector } from
|
|
4
|
-
import { waitForChildClose } from
|
|
5
|
-
import { buildPiPrintArgs } from
|
|
6
|
-
import { PiStreamParser } from
|
|
1
|
+
import { spawn as nodeSpawn } from "child_process";
|
|
2
|
+
import { PiPrintError } from "../../../durable/DurableAgent.js";
|
|
3
|
+
import { LocalProcessInspector } from "../../../durable/process.js";
|
|
4
|
+
import { waitForChildClose } from "../../../durable/utils.js";
|
|
5
|
+
import { buildPiPrintArgs } from "./PiPrintProtocol.js";
|
|
6
|
+
import { PiStreamParser } from "./PiStreamParser.js";
|
|
7
7
|
export class PiPrintRunner {
|
|
8
8
|
spawn;
|
|
9
9
|
processInspector;
|
|
@@ -14,27 +14,27 @@ export class PiPrintRunner {
|
|
|
14
14
|
this.maxLineBytes = options.maxLineBytes ?? 1024 * 1024;
|
|
15
15
|
}
|
|
16
16
|
async run(request) {
|
|
17
|
-
const args = buildPiPrintArgs(request.agent.providerSessionId, request.agent.sessionHealth ===
|
|
18
|
-
const child = this.spawn(request.executable ??
|
|
17
|
+
const args = buildPiPrintArgs(request.agent.providerSessionId, request.agent.sessionHealth === "uninitialized");
|
|
18
|
+
const child = this.spawn(request.executable ?? "pi", args, {
|
|
19
19
|
cwd: request.agent.cwd,
|
|
20
20
|
shell: false,
|
|
21
21
|
stdio: [
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
"pipe",
|
|
23
|
+
"pipe",
|
|
24
|
+
"pipe"
|
|
25
25
|
]
|
|
26
26
|
});
|
|
27
27
|
if (!child.pid) {
|
|
28
28
|
child.kill();
|
|
29
|
-
throw new PiPrintError(
|
|
29
|
+
throw new PiPrintError("Pi process did not provide a PID.", "PI_PROCESS");
|
|
30
30
|
}
|
|
31
31
|
const identity = this.processInspector.getIdentity(child.pid);
|
|
32
32
|
if (!identity) {
|
|
33
33
|
child.kill();
|
|
34
|
-
throw new PiPrintError(
|
|
34
|
+
throw new PiPrintError("Cannot verify Pi process identity.", "PI_PROCESS");
|
|
35
35
|
}
|
|
36
36
|
const parser = new PiStreamParser(request.agent.providerSessionId, this.maxLineBytes);
|
|
37
|
-
child.stdout.on(
|
|
37
|
+
child.stdout.on("data", (chunk)=>{
|
|
38
38
|
if (parser.hasFailed()) return;
|
|
39
39
|
try {
|
|
40
40
|
parser.accept(chunk);
|
|
@@ -52,7 +52,7 @@ export class PiPrintRunner {
|
|
|
52
52
|
}
|
|
53
53
|
child.stdin.end(request.prompt);
|
|
54
54
|
const close = await closed.catch(()=>{
|
|
55
|
-
throw new PiPrintError(
|
|
55
|
+
throw new PiPrintError("Pi process failed to start or communicate.", "PI_PROCESS");
|
|
56
56
|
});
|
|
57
57
|
return parser.result(close);
|
|
58
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/providers/pi/durable/PiPrintRunner.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../../src/providers/pi/durable/PiPrintRunner.ts"],"sourcesContent":["import {\n spawn as nodeSpawn,\n type ChildProcessWithoutNullStreams,\n type SpawnOptionsWithoutStdio,\n} from \"child_process\";\nimport type { PiDurableAgent, ProcessIdentity } from \"../../../durable/DurableAgent.js\";\nimport { PiPrintError } from \"../../../durable/DurableAgent.js\";\nimport { LocalProcessInspector, type ProcessInspector } from \"../../../durable/process.js\";\nimport { waitForChildClose } from \"../../../durable/utils.js\";\nimport { buildPiPrintArgs } from \"./PiPrintProtocol.js\";\nimport { PiStreamParser } from \"./PiStreamParser.js\";\n\ntype Spawn = (\n command: string,\n args: readonly string[],\n options: SpawnOptionsWithoutStdio & { stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n) => ChildProcessWithoutNullStreams;\n\nexport interface PiPrintRunRequest {\n agent: PiDurableAgent;\n prompt: string;\n executable?: string;\n onSpawn(identity: ProcessIdentity): Promise<void>;\n}\n\nexport interface PiPrintRunResult {\n sessionId: string;\n result: string;\n messages: string[];\n exitCode: number;\n}\n\nexport interface PiPrintRunnerOptions {\n spawn?: Spawn;\n processInspector?: ProcessInspector;\n maxLineBytes?: number;\n}\n\nexport class PiPrintRunner {\n private readonly spawn: Spawn;\n private readonly processInspector: ProcessInspector;\n private readonly maxLineBytes: number;\n\n constructor(options: PiPrintRunnerOptions = {}) {\n this.spawn = options.spawn ?? (nodeSpawn as Spawn);\n this.processInspector = options.processInspector ?? new LocalProcessInspector();\n this.maxLineBytes = options.maxLineBytes ?? 1024 * 1024;\n }\n\n async run(request: PiPrintRunRequest): Promise<PiPrintRunResult> {\n const args = buildPiPrintArgs(\n request.agent.providerSessionId,\n request.agent.sessionHealth === \"uninitialized\",\n );\n const child = this.spawn(request.executable ?? \"pi\", args, {\n cwd: request.agent.cwd,\n shell: false,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n if (!child.pid) {\n child.kill();\n throw new PiPrintError(\"Pi process did not provide a PID.\", \"PI_PROCESS\");\n }\n const identity = this.processInspector.getIdentity(child.pid);\n if (!identity) {\n child.kill();\n throw new PiPrintError(\"Cannot verify Pi process identity.\", \"PI_PROCESS\");\n }\n\n const parser = new PiStreamParser(request.agent.providerSessionId, this.maxLineBytes);\n child.stdout.on(\"data\", (chunk: Buffer | string) => {\n if (parser.hasFailed()) return;\n try {\n parser.accept(chunk);\n } catch (error) {\n parser.fail(error);\n }\n });\n child.stderr.resume();\n\n const closed = waitForChildClose(child);\n try {\n await request.onSpawn(identity);\n } catch (error) {\n child.kill();\n throw error;\n }\n\n child.stdin.end(request.prompt);\n const close = await closed.catch(() => {\n throw new PiPrintError(\"Pi process failed to start or communicate.\", \"PI_PROCESS\");\n });\n return parser.result(close);\n }\n}\n"],"names":["spawn","nodeSpawn","PiPrintError","LocalProcessInspector","waitForChildClose","buildPiPrintArgs","PiStreamParser","PiPrintRunner","processInspector","maxLineBytes","options","run","request","args","agent","providerSessionId","sessionHealth","child","executable","cwd","shell","stdio","pid","kill","identity","getIdentity","parser","stdout","on","chunk","hasFailed","accept","error","fail","stderr","resume","closed","onSpawn","stdin","end","prompt","close","catch","result"],"mappings":"AAAA,SACEA,SAASC,SAAS,QAGb,gBAAgB;AAEvB,SAASC,YAAY,QAAQ,mCAAmC;AAChE,SAASC,qBAAqB,QAA+B,8BAA8B;AAC3F,SAASC,iBAAiB,QAAQ,4BAA4B;AAC9D,SAASC,gBAAgB,QAAQ,uBAAuB;AACxD,SAASC,cAAc,QAAQ,sBAAsB;AA4BrD,OAAO,MAAMC;IACMP,MAAa;IACbQ,iBAAmC;IACnCC,aAAqB;IAEtC,YAAYC,UAAgC,CAAC,CAAC,CAAE;QAC9C,IAAI,CAACV,KAAK,GAAGU,QAAQV,KAAK,IAAKC;QAC/B,IAAI,CAACO,gBAAgB,GAAGE,QAAQF,gBAAgB,IAAI,IAAIL;QACxD,IAAI,CAACM,YAAY,GAAGC,QAAQD,YAAY,IAAI,OAAO;IACrD;IAEA,MAAME,IAAIC,OAA0B,EAA6B;QAC/D,MAAMC,OAAOR,iBACXO,QAAQE,KAAK,CAACC,iBAAiB,EAC/BH,QAAQE,KAAK,CAACE,aAAa,KAAK;QAElC,MAAMC,QAAQ,IAAI,CAACjB,KAAK,CAACY,QAAQM,UAAU,IAAI,MAAML,MAAM;YACzDM,KAAKP,QAAQE,KAAK,CAACK,GAAG;YACtBC,OAAO;YACPC,OAAO;gBAAC;gBAAQ;gBAAQ;aAAO;QACjC;QACA,IAAI,CAACJ,MAAMK,GAAG,EAAE;YACdL,MAAMM,IAAI;YACV,MAAM,IAAIrB,aAAa,qCAAqC;QAC9D;QACA,MAAMsB,WAAW,IAAI,CAAChB,gBAAgB,CAACiB,WAAW,CAACR,MAAMK,GAAG;QAC5D,IAAI,CAACE,UAAU;YACbP,MAAMM,IAAI;YACV,MAAM,IAAIrB,aAAa,sCAAsC;QAC/D;QAEA,MAAMwB,SAAS,IAAIpB,eAAeM,QAAQE,KAAK,CAACC,iBAAiB,EAAE,IAAI,CAACN,YAAY;QACpFQ,MAAMU,MAAM,CAACC,EAAE,CAAC,QAAQ,CAACC;YACvB,IAAIH,OAAOI,SAAS,IAAI;YACxB,IAAI;gBACFJ,OAAOK,MAAM,CAACF;YAChB,EAAE,OAAOG,OAAO;gBACdN,OAAOO,IAAI,CAACD;YACd;QACF;QACAf,MAAMiB,MAAM,CAACC,MAAM;QAEnB,MAAMC,SAAShC,kBAAkBa;QACjC,IAAI;YACF,MAAML,QAAQyB,OAAO,CAACb;QACxB,EAAE,OAAOQ,OAAO;YACdf,MAAMM,IAAI;YACV,MAAMS;QACR;QAEAf,MAAMqB,KAAK,CAACC,GAAG,CAAC3B,QAAQ4B,MAAM;QAC9B,MAAMC,QAAQ,MAAML,OAAOM,KAAK,CAAC;YAC/B,MAAM,IAAIxC,aAAa,8CAA8C;QACvE;QACA,OAAOwB,OAAOiB,MAAM,CAACF;IACvB;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PiStreamParser.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiStreamParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG9E,qBAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"PiStreamParser.d.ts","sourceRoot":"","sources":["../../../../src/providers/pi/durable/PiStreamParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAG9E,qBAAa,cAAc;IAQvB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAPpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,OAAO,CAA6B;gBAGzB,iBAAiB,EAAE,MAAM,EAC1C,YAAY,EAAE,MAAM;IAQtB,SAAS,IAAI,OAAO;IAIpB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAOpC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAO1B,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG;QAC/B,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB;IA2BD,OAAO,CAAC,UAAU;CAsBnB"}
|