@ai-devkit/agent-manager 0.36.0 → 0.38.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 +9 -8
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +23 -4
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +151 -3
- package/dist/__tests__/AgentManager.test.js.map +1 -1
- package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js +486 -0
- package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js.map +1 -0
- package/dist/__tests__/adapters/adapterProcessImports.test.js +52 -0
- package/dist/__tests__/adapters/adapterProcessImports.test.js.map +1 -0
- package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js +247 -0
- package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js.map +1 -0
- package/dist/__tests__/capacity/anthropic.test.js +115 -0
- package/dist/__tests__/capacity/anthropic.test.js.map +1 -0
- package/dist/__tests__/capacity/boundaries.test.js +45 -0
- package/dist/__tests__/capacity/boundaries.test.js.map +1 -0
- package/dist/__tests__/capacity/claude.test.js +3 -3
- package/dist/__tests__/capacity/claude.test.js.map +1 -1
- package/dist/__tests__/capacity/codex.test.js +3 -1
- package/dist/__tests__/capacity/codex.test.js.map +1 -1
- package/dist/__tests__/capacity/openai.test.js +32 -25
- package/dist/__tests__/capacity/openai.test.js.map +1 -1
- package/dist/__tests__/capacity/wham.test.js +1 -1
- package/dist/__tests__/capacity/wham.test.js.map +1 -1
- package/dist/__tests__/capacity/zai.test.js +7 -8
- package/dist/__tests__/capacity/zai.test.js.map +1 -1
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js +462 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
- package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js +79 -0
- package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js +1881 -0
- package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/ClaudeSessionLocator.test.js +425 -0
- package/dist/__tests__/harnesses/claude/ClaudeSessionLocator.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js +314 -0
- package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js +49 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js +76 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js +173 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js +181 -0
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/CodexAdapter.test.js +685 -0
- package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
- package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/CodexSessionMapping.test.js +86 -0
- package/dist/__tests__/harnesses/codex/CodexSessionMapping.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/CodexSessionParser.test.js +254 -0
- package/dist/__tests__/harnesses/codex/CodexSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js +121 -0
- package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js +84 -0
- package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js +128 -0
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js +246 -0
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js +384 -0
- package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
- package/dist/__tests__/harnesses/copilot/CopilotAdapter.test.js +659 -0
- package/dist/__tests__/harnesses/copilot/CopilotAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js +1443 -0
- package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
- package/dist/__tests__/harnesses/grok/GrokAgentMapper.test.js +56 -0
- package/dist/__tests__/harnesses/grok/GrokAgentMapper.test.js.map +1 -0
- package/dist/__tests__/harnesses/grok/GrokCliAdapter.test.js +421 -0
- package/dist/__tests__/harnesses/grok/GrokCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
- package/dist/__tests__/harnesses/grok/GrokSessionLocator.test.js +133 -0
- package/dist/__tests__/harnesses/grok/GrokSessionLocator.test.js.map +1 -0
- package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
- package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js +662 -0
- package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeAdapter.test.js +213 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeAgentMapper.test.js +89 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeAgentMapper.test.js.map +1 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeSessionLocator.test.js +94 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeSessionLocator.test.js.map +1 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeSessionParser.test.js +147 -0
- package/dist/__tests__/harnesses/opencode/OpenCodeSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/PiAdapter.test.js +367 -0
- package/dist/__tests__/harnesses/pi/PiAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/PiSessionParser.test.js +416 -0
- package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/PiSessionTracker.test.js +108 -0
- package/dist/__tests__/harnesses/pi/PiSessionTracker.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/durable/PiCliProbe.test.js +70 -0
- package/dist/__tests__/harnesses/pi/durable/PiCliProbe.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/durable/PiDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/durable/PiPrintAgentService.test.js +192 -0
- package/dist/__tests__/harnesses/pi/durable/PiPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/durable/PiPrintProtocol.test.js +119 -0
- package/dist/__tests__/harnesses/pi/durable/PiPrintProtocol.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/durable/PiPrintRunner.test.js +382 -0
- package/dist/__tests__/harnesses/pi/durable/PiPrintRunner.test.js.map +1 -0
- package/dist/__tests__/harnesses/pi/durable/PiStreamParser.test.js +34 -0
- package/dist/__tests__/harnesses/pi/durable/PiStreamParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/readiness/AgentReadiness.test.js +342 -0
- package/dist/__tests__/harnesses/readiness/AgentReadiness.test.js.map +1 -0
- package/dist/__tests__/harnesses/runtimeProfiles.test.js +89 -0
- package/dist/__tests__/harnesses/runtimeProfiles.test.js.map +1 -0
- package/dist/__tests__/print/DurableAgent.test.js +4 -6
- package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
- package/dist/__tests__/print/DurableAgentRepository.test.js +1 -12
- package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
- package/dist/__tests__/terminal/TmuxManager.test.js +1 -1
- package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
- package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
- package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
- package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
- package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
- package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
- package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
- package/dist/__tests__/utils/jsonlTail.test.js +360 -0
- package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
- package/dist/__tests__/utils/matchingConstants.test.js +35 -0
- package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
- package/dist/__tests__/utils/process.test.js +436 -2
- package/dist/__tests__/utils/process.test.js.map +1 -1
- package/dist/adapters/AgentAdapter.d.ts +25 -6
- package/dist/adapters/AgentAdapter.d.ts.map +1 -1
- package/dist/adapters/AgentAdapter.js +12 -3
- package/dist/adapters/AgentAdapter.js.map +1 -1
- package/dist/capacity/index.d.ts +9 -19
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +11 -4
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/providers/anthropic.d.ts +9 -0
- package/dist/capacity/providers/anthropic.d.ts.map +1 -0
- package/dist/capacity/providers/anthropic.js +153 -0
- package/dist/capacity/providers/anthropic.js.map +1 -0
- package/dist/capacity/providers/openai-platform.d.ts +14 -0
- package/dist/capacity/providers/openai-platform.d.ts.map +1 -0
- package/dist/capacity/providers/openai-platform.js +120 -0
- package/dist/capacity/providers/openai-platform.js.map +1 -0
- package/dist/capacity/providers/openai-subscription.d.ts +20 -0
- package/dist/capacity/providers/openai-subscription.d.ts.map +1 -0
- package/dist/capacity/providers/openai-subscription.js +129 -0
- package/dist/capacity/providers/openai-subscription.js.map +1 -0
- package/dist/capacity/providers/zai.d.ts +8 -0
- package/dist/capacity/providers/zai.d.ts.map +1 -0
- package/dist/capacity/providers/zai.js +158 -0
- package/dist/capacity/providers/zai.js.map +1 -0
- package/dist/capacity/sources/claude.d.ts +9 -0
- package/dist/capacity/sources/claude.d.ts.map +1 -0
- package/dist/capacity/sources/claude.js +17 -0
- package/dist/capacity/sources/claude.js.map +1 -0
- package/dist/capacity/sources/codex.d.ts +32 -0
- package/dist/capacity/sources/codex.d.ts.map +1 -0
- package/dist/capacity/sources/codex.js +227 -0
- package/dist/capacity/sources/codex.js.map +1 -0
- package/dist/capacity/sources/pi.d.ts +30 -0
- package/dist/capacity/sources/pi.d.ts.map +1 -0
- package/dist/capacity/sources/pi.js +81 -0
- package/dist/capacity/sources/pi.js.map +1 -0
- package/dist/capacity/types.d.ts +2 -0
- package/dist/capacity/types.d.ts.map +1 -1
- package/dist/capacity/types.js +1 -1
- package/dist/capacity/types.js.map +1 -1
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
- package/dist/harnesses/claude/ClaudeAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/claude/ClaudeAgentMapper.js +36 -0
- package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
- package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts +30 -0
- package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
- package/dist/harnesses/claude/ClaudeCodeAdapter.js +134 -0
- package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
- package/dist/harnesses/claude/ClaudeSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/claude/ClaudeSessionLocator.js +260 -0
- package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
- package/dist/harnesses/claude/ClaudeSessionParser.d.ts +148 -0
- package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
- package/dist/harnesses/claude/ClaudeSessionParser.js +365 -0
- package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
- package/dist/harnesses/claude/credentials.d.ts +10 -0
- package/dist/harnesses/claude/credentials.d.ts.map +1 -0
- package/dist/harnesses/claude/credentials.js +112 -0
- package/dist/harnesses/claude/credentials.js.map +1 -0
- package/dist/harnesses/claude/durable/ClaudeCliProbe.d.ts.map +1 -0
- package/dist/harnesses/claude/durable/ClaudeCliProbe.js.map +1 -0
- package/dist/harnesses/claude/durable/ClaudePrintAgentService.d.ts.map +1 -0
- package/dist/harnesses/claude/durable/ClaudePrintAgentService.js.map +1 -0
- package/dist/harnesses/claude/durable/ClaudePrintRunner.d.ts.map +1 -0
- package/dist/harnesses/claude/durable/ClaudePrintRunner.js.map +1 -0
- package/dist/harnesses/claude/durable/ClaudeStreamParser.d.ts.map +1 -0
- package/dist/harnesses/claude/durable/ClaudeStreamParser.js.map +1 -0
- package/dist/harnesses/claude/readiness.d.ts +3 -0
- package/dist/harnesses/claude/readiness.d.ts.map +1 -0
- package/dist/harnesses/claude/readiness.js +63 -0
- package/dist/harnesses/claude/readiness.js.map +1 -0
- package/dist/harnesses/codex/CodexAdapter.d.ts +29 -0
- package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/harnesses/codex/CodexAdapter.js +290 -0
- package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
- package/dist/harnesses/codex/CodexAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/codex/CodexAgentMapper.js +28 -0
- package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
- package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
- package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
- package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
- package/dist/harnesses/codex/CodexSessionMapping.d.ts.map +1 -0
- package/dist/harnesses/codex/CodexSessionMapping.js +68 -0
- package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
- package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
- package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
- package/dist/harnesses/codex/CodexSessionParser.js +308 -0
- package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
- package/dist/harnesses/codex/credentials.d.ts +15 -0
- package/dist/harnesses/codex/credentials.d.ts.map +1 -0
- package/dist/harnesses/codex/credentials.js +58 -0
- package/dist/harnesses/codex/credentials.js.map +1 -0
- package/dist/harnesses/codex/durable/CodexCliProbe.d.ts.map +1 -0
- package/dist/harnesses/codex/durable/CodexCliProbe.js.map +1 -0
- package/dist/harnesses/codex/durable/CodexPrintAgentService.d.ts.map +1 -0
- package/dist/harnesses/codex/durable/CodexPrintAgentService.js.map +1 -0
- package/dist/harnesses/codex/durable/CodexPrintRunner.d.ts.map +1 -0
- package/dist/harnesses/codex/durable/CodexPrintRunner.js.map +1 -0
- package/dist/harnesses/codex/durable/CodexStreamParser.d.ts.map +1 -0
- package/dist/harnesses/codex/durable/CodexStreamParser.js.map +1 -0
- package/dist/harnesses/codex/readiness.d.ts +3 -0
- package/dist/harnesses/codex/readiness.d.ts.map +1 -0
- package/dist/harnesses/codex/readiness.js +60 -0
- package/dist/harnesses/codex/readiness.js.map +1 -0
- package/dist/harnesses/copilot/CopilotAdapter.d.ts +36 -0
- package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotAdapter.js +128 -0
- package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
- package/dist/harnesses/copilot/CopilotAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotAgentMapper.js +30 -0
- package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
- package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
- package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
- package/dist/harnesses/copilot/readiness.d.ts +3 -0
- package/dist/harnesses/copilot/readiness.d.ts.map +1 -0
- package/dist/harnesses/copilot/readiness.js +39 -0
- package/dist/harnesses/copilot/readiness.js.map +1 -0
- package/dist/harnesses/gemini/GeminiAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiAgentMapper.js +30 -0
- package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
- package/dist/harnesses/gemini/GeminiCliAdapter.d.ts +52 -0
- package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiCliAdapter.js +196 -0
- package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionParser.d.ts +121 -0
- package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
- package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
- package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
- package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
- package/dist/harnesses/gemini/fileSignature.js +9 -0
- package/dist/harnesses/gemini/fileSignature.js.map +1 -0
- package/dist/harnesses/grok/GrokAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/grok/GrokAgentMapper.js +30 -0
- package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
- package/dist/harnesses/grok/GrokCliAdapter.d.ts +36 -0
- package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
- package/dist/harnesses/grok/GrokCliAdapter.js +102 -0
- package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
- package/dist/harnesses/grok/GrokSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/grok/GrokSessionLocator.js +140 -0
- package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
- package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
- package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
- package/dist/harnesses/grok/GrokSessionParser.js +185 -0
- package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
- package/dist/harnesses/index.d.ts +7 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +27 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
- package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroAdapter.js +125 -0
- package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
- package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
- package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
- package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
- package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
- package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
- package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
- package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
- package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
- package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
- package/dist/harnesses/opencode/OpenCodeAdapter.d.ts +29 -0
- package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
- package/dist/harnesses/opencode/OpenCodeAdapter.js +86 -0
- package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
- package/dist/harnesses/opencode/OpenCodeAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/opencode/OpenCodeAgentMapper.js +42 -0
- package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
- package/dist/harnesses/opencode/OpenCodeSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/opencode/OpenCodeSessionLocator.js +118 -0
- package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
- package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts +16 -0
- package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
- package/dist/harnesses/opencode/OpenCodeSessionParser.js +105 -0
- package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
- package/dist/harnesses/opencode/readiness.d.ts +3 -0
- package/dist/harnesses/opencode/readiness.d.ts.map +1 -0
- package/dist/harnesses/opencode/readiness.js +50 -0
- package/dist/harnesses/opencode/readiness.js.map +1 -0
- package/dist/harnesses/pi/PiAdapter.d.ts +30 -0
- package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
- package/dist/harnesses/pi/PiAdapter.js +167 -0
- package/dist/harnesses/pi/PiAdapter.js.map +1 -0
- package/dist/harnesses/pi/PiAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/pi/PiAgentMapper.js +30 -0
- package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
- package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
- package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionLocator.js +212 -0
- package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
- package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
- package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionParser.js +318 -0
- package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
- package/dist/harnesses/pi/PiSessionTracker.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionTracker.js +69 -0
- package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
- package/dist/harnesses/pi/credentials.d.ts +22 -0
- package/dist/harnesses/pi/credentials.d.ts.map +1 -0
- package/dist/harnesses/pi/credentials.js +98 -0
- package/dist/harnesses/pi/credentials.js.map +1 -0
- package/dist/harnesses/pi/durable/PiCliProbe.d.ts.map +1 -0
- package/dist/harnesses/pi/durable/PiCliProbe.js.map +1 -0
- package/dist/harnesses/pi/durable/PiPrintAgentService.d.ts.map +1 -0
- package/dist/harnesses/pi/durable/PiPrintAgentService.js.map +1 -0
- package/dist/harnesses/pi/durable/PiPrintProtocol.d.ts.map +1 -0
- package/dist/harnesses/pi/durable/PiPrintProtocol.js.map +1 -0
- package/dist/harnesses/pi/durable/PiPrintRunner.d.ts.map +1 -0
- package/dist/harnesses/pi/durable/PiPrintRunner.js.map +1 -0
- package/dist/harnesses/pi/durable/PiStreamParser.d.ts.map +1 -0
- package/dist/harnesses/pi/durable/PiStreamParser.js.map +1 -0
- package/dist/harnesses/pi/readiness.d.ts +3 -0
- package/dist/harnesses/pi/readiness.d.ts.map +1 -0
- package/dist/harnesses/pi/readiness.js +96 -0
- package/dist/harnesses/pi/readiness.js.map +1 -0
- package/dist/harnesses/readiness/AgentReadiness.d.ts +6 -0
- package/dist/harnesses/readiness/AgentReadiness.d.ts.map +1 -0
- package/dist/harnesses/readiness/AgentReadiness.js +68 -0
- package/dist/harnesses/readiness/AgentReadiness.js.map +1 -0
- package/dist/harnesses/readiness/checks.d.ts +31 -0
- package/dist/harnesses/readiness/checks.d.ts.map +1 -0
- package/dist/harnesses/readiness/checks.js +270 -0
- package/dist/harnesses/readiness/checks.js.map +1 -0
- package/dist/harnesses/readiness/types.d.ts +76 -0
- package/dist/harnesses/readiness/types.d.ts.map +1 -0
- package/dist/harnesses/readiness/types.js +4 -0
- package/dist/harnesses/readiness/types.js.map +1 -0
- package/dist/harnesses/runtimeProfiles.d.ts +11 -0
- package/dist/harnesses/runtimeProfiles.d.ts.map +1 -0
- package/dist/harnesses/runtimeProfiles.js +99 -0
- package/dist/harnesses/runtimeProfiles.js.map +1 -0
- package/dist/harnesses/shared.d.ts +41 -0
- package/dist/harnesses/shared.d.ts.map +1 -0
- package/dist/harnesses/shared.js +71 -0
- package/dist/harnesses/shared.js.map +1 -0
- package/dist/index.d.ts +21 -46
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -27
- package/dist/index.js.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.d.ts +3 -3
- package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.js +6 -20
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
- package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts.map +1 -1
- package/dist/runtime/herdr/HerdrAgentDiscovery.js +2 -43
- package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
- package/dist/runtime/tmux/PidPolling.d.ts +1 -1
- package/dist/runtime/tmux/PidPolling.d.ts.map +1 -1
- package/dist/runtime/tmux/PidPolling.js.map +1 -1
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +1 -1
- package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -1
- package/dist/runtime/tmux/TmuxAgentRuntime.js +1 -1
- package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -1
- package/dist/runtime/tmux/TmuxManager.d.ts +12 -0
- package/dist/runtime/tmux/TmuxManager.d.ts.map +1 -0
- package/dist/runtime/tmux/TmuxManager.js +116 -0
- package/dist/runtime/tmux/TmuxManager.js.map +1 -0
- package/dist/runtime/types.d.ts +1 -1
- package/dist/runtime/types.d.ts.map +1 -1
- package/dist/runtime/types.js.map +1 -1
- package/dist/terminal/TerminalFocusManager.d.ts +4 -32
- package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
- package/dist/terminal/TerminalFocusManager.js +17 -267
- package/dist/terminal/TerminalFocusManager.js.map +1 -1
- package/dist/terminal/TtyWriter.d.ts +1 -44
- package/dist/terminal/TtyWriter.d.ts.map +1 -1
- package/dist/terminal/TtyWriter.js +11 -347
- package/dist/terminal/TtyWriter.js.map +1 -1
- package/dist/terminal/backends/index.d.ts +5 -0
- package/dist/terminal/backends/index.d.ts.map +1 -0
- package/dist/terminal/backends/index.js +19 -0
- package/dist/terminal/backends/index.js.map +1 -0
- package/dist/terminal/backends/iterm2.d.ts +3 -0
- package/dist/terminal/backends/iterm2.d.ts.map +1 -0
- package/dist/terminal/backends/iterm2.js +135 -0
- package/dist/terminal/backends/iterm2.js.map +1 -0
- package/dist/terminal/backends/shared.d.ts +7 -0
- package/dist/terminal/backends/shared.d.ts.map +1 -0
- package/dist/terminal/backends/shared.js +35 -0
- package/dist/terminal/backends/shared.js.map +1 -0
- package/dist/terminal/backends/terminal-app.d.ts +3 -0
- package/dist/terminal/backends/terminal-app.d.ts.map +1 -0
- package/dist/terminal/backends/terminal-app.js +129 -0
- package/dist/terminal/backends/terminal-app.js.map +1 -0
- package/dist/terminal/backends/tmux.d.ts +3 -0
- package/dist/terminal/backends/tmux.d.ts.map +1 -0
- package/dist/terminal/backends/tmux.js +76 -0
- package/dist/terminal/backends/tmux.js.map +1 -0
- package/dist/terminal/backends/wezterm.d.ts +3 -0
- package/dist/terminal/backends/wezterm.d.ts.map +1 -0
- package/dist/terminal/backends/wezterm.js +71 -0
- package/dist/terminal/backends/wezterm.js.map +1 -0
- package/dist/terminal/types.d.ts +21 -0
- package/dist/terminal/types.d.ts.map +1 -0
- package/dist/terminal/types.js +10 -0
- package/dist/terminal/types.js.map +1 -0
- package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
- package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
- package/dist/utils/IncrementalJsonlSummary.js +209 -0
- package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
- package/dist/utils/jsonlTail.d.ts +73 -0
- package/dist/utils/jsonlTail.d.ts.map +1 -0
- package/dist/utils/jsonlTail.js +238 -0
- package/dist/utils/jsonlTail.js.map +1 -0
- package/dist/utils/matching.d.ts +2 -0
- package/dist/utils/matching.d.ts.map +1 -1
- package/dist/utils/matching.js +3 -2
- package/dist/utils/matching.js.map +1 -1
- package/dist/utils/matchingConstants.d.ts +15 -0
- package/dist/utils/matchingConstants.d.ts.map +1 -0
- package/dist/utils/matchingConstants.js +14 -0
- package/dist/utils/matchingConstants.js.map +1 -0
- package/dist/utils/process.d.ts +38 -2
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +131 -43
- package/dist/utils/process.js.map +1 -1
- package/package.json +2 -1
- package/scripts/benchmark-cold-start.mjs +350 -0
- package/src/AgentManager.ts +27 -6
- package/src/__tests__/AgentManager.test.ts +141 -3
- package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
- package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
- package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
- package/src/__tests__/capacity/anthropic.test.ts +105 -0
- package/src/__tests__/capacity/boundaries.test.ts +36 -0
- package/src/__tests__/capacity/claude.test.ts +3 -8
- package/src/__tests__/capacity/codex.test.ts +12 -35
- package/src/__tests__/capacity/fixtures/openai-codex-auth.json +1 -1
- package/src/__tests__/capacity/openai.test.ts +20 -30
- package/src/__tests__/capacity/wham.test.ts +1 -1
- package/src/__tests__/capacity/zai.test.ts +27 -62
- package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
- package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
- package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
- package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.ts +396 -0
- package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
- package/src/__tests__/harnesses/claude/ClaudeAgentMapper.test.ts +84 -0
- package/src/__tests__/harnesses/claude/ClaudeCodeAdapter.test.ts +1793 -0
- package/src/__tests__/harnesses/claude/ClaudeSessionLocator.test.ts +423 -0
- package/src/__tests__/harnesses/claude/ClaudeSessionParser.test.ts +300 -0
- package/src/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.ts +34 -0
- package/src/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.ts +61 -0
- package/src/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.ts +129 -0
- package/src/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.ts +152 -0
- package/src/__tests__/harnesses/codex/CodexAdapter.test.ts +652 -0
- package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
- package/src/__tests__/harnesses/codex/CodexSessionMapping.test.ts +63 -0
- package/src/__tests__/harnesses/codex/CodexSessionParser.test.ts +192 -0
- package/src/__tests__/harnesses/codex/durable/CodexCliProbe.test.ts +80 -0
- package/src/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.ts +65 -0
- package/src/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.ts +104 -0
- package/src/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.ts +201 -0
- package/src/__tests__/harnesses/codex/durable/CodexPrintRunner.test.ts +299 -0
- package/src/__tests__/harnesses/copilot/CopilotAdapter.test.ts +614 -0
- package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
- package/src/__tests__/harnesses/gemini/GeminiCliAdapter.test.ts +1324 -0
- package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
- package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
- package/src/__tests__/harnesses/grok/GrokAgentMapper.test.ts +57 -0
- package/src/__tests__/harnesses/grok/GrokCliAdapter.test.ts +376 -0
- package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
- package/src/__tests__/harnesses/grok/GrokSessionLocator.test.ts +106 -0
- package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
- package/src/__tests__/harnesses/kiro/KiroAdapter.test.ts +552 -0
- package/src/__tests__/harnesses/opencode/OpenCodeAdapter.test.ts +215 -0
- package/src/__tests__/harnesses/opencode/OpenCodeAgentMapper.test.ts +83 -0
- package/src/__tests__/harnesses/opencode/OpenCodeSessionLocator.test.ts +84 -0
- package/src/__tests__/harnesses/opencode/OpenCodeSessionParser.test.ts +148 -0
- package/src/__tests__/harnesses/pi/PiAdapter.test.ts +325 -0
- package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
- package/src/__tests__/harnesses/pi/PiSessionParser.test.ts +280 -0
- package/src/__tests__/harnesses/pi/PiSessionTracker.test.ts +79 -0
- package/src/__tests__/harnesses/pi/durable/PiCliProbe.test.ts +50 -0
- package/src/__tests__/harnesses/pi/durable/PiPrintAgentService.test.ts +138 -0
- package/src/__tests__/harnesses/pi/durable/PiPrintProtocol.test.ts +71 -0
- package/src/__tests__/harnesses/pi/durable/PiPrintRunner.test.ts +252 -0
- package/src/__tests__/harnesses/pi/durable/PiStreamParser.test.ts +26 -0
- package/src/__tests__/harnesses/readiness/AgentReadiness.test.ts +285 -0
- package/src/__tests__/harnesses/runtimeProfiles.test.ts +110 -0
- package/src/__tests__/print/DurableAgent.test.ts +4 -13
- package/src/__tests__/print/DurableAgentRepository.test.ts +1 -13
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +31 -1
- package/src/__tests__/terminal/TmuxManager.test.ts +1 -1
- package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
- package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
- package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
- package/src/__tests__/utils/jsonlTail.test.ts +317 -0
- package/src/__tests__/utils/matchingConstants.test.ts +40 -0
- package/src/__tests__/utils/process.test.ts +254 -0
- package/src/adapters/AgentAdapter.ts +37 -14
- package/src/capacity/index.ts +29 -23
- package/src/capacity/providers/anthropic.ts +198 -0
- package/src/capacity/providers/openai-platform.ts +150 -0
- package/src/capacity/providers/openai-subscription.ts +162 -0
- package/src/capacity/providers/zai.ts +155 -0
- package/src/capacity/sources/claude.ts +30 -0
- package/src/capacity/sources/codex.ts +262 -0
- package/src/capacity/sources/pi.ts +131 -0
- package/src/capacity/types.ts +3 -0
- package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
- package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
- package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
- package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
- package/src/harnesses/claude/ClaudeAgentMapper.ts +55 -0
- package/src/harnesses/claude/ClaudeCodeAdapter.ts +175 -0
- package/src/harnesses/claude/ClaudeSessionLocator.ts +358 -0
- package/src/harnesses/claude/ClaudeSessionParser.ts +524 -0
- package/src/harnesses/claude/credentials.ts +122 -0
- package/src/harnesses/claude/readiness.ts +69 -0
- package/src/harnesses/codex/CodexAdapter.ts +337 -0
- package/src/harnesses/codex/CodexAgentMapper.ts +26 -0
- package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
- package/src/harnesses/codex/CodexSessionMapping.ts +89 -0
- package/src/harnesses/codex/CodexSessionParser.ts +462 -0
- package/src/harnesses/codex/credentials.ts +81 -0
- package/src/harnesses/codex/readiness.ts +72 -0
- package/src/harnesses/copilot/CopilotAdapter.ts +161 -0
- package/src/harnesses/copilot/CopilotAgentMapper.ts +27 -0
- package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
- package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
- package/src/harnesses/copilot/readiness.ts +33 -0
- package/src/harnesses/gemini/GeminiAgentMapper.ts +27 -0
- package/src/harnesses/gemini/GeminiCliAdapter.ts +272 -0
- package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
- package/src/harnesses/gemini/GeminiSessionParser.ts +395 -0
- package/src/harnesses/gemini/fileSignature.ts +10 -0
- package/src/harnesses/grok/GrokAgentMapper.ts +32 -0
- package/src/harnesses/grok/GrokCliAdapter.ts +126 -0
- package/src/harnesses/grok/GrokSessionLocator.ts +179 -0
- package/src/harnesses/grok/GrokSessionParser.ts +251 -0
- package/src/harnesses/index.ts +28 -0
- package/src/harnesses/kiro/KiroAdapter.ts +143 -0
- package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
- package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
- package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
- package/src/harnesses/opencode/OpenCodeAdapter.ts +110 -0
- package/src/harnesses/opencode/OpenCodeAgentMapper.ts +51 -0
- package/src/harnesses/opencode/OpenCodeSessionLocator.ts +151 -0
- package/src/harnesses/opencode/OpenCodeSessionParser.ts +146 -0
- package/src/harnesses/opencode/readiness.ts +48 -0
- package/src/harnesses/pi/PiAdapter.ts +197 -0
- package/src/harnesses/pi/PiAgentMapper.ts +27 -0
- package/src/harnesses/pi/PiSessionLocator.ts +288 -0
- package/src/harnesses/pi/PiSessionParser.ts +488 -0
- package/src/harnesses/pi/PiSessionTracker.ts +87 -0
- package/src/harnesses/pi/credentials.ts +129 -0
- package/src/harnesses/pi/readiness.ts +104 -0
- package/src/harnesses/readiness/AgentReadiness.ts +87 -0
- package/src/harnesses/readiness/checks.ts +336 -0
- package/src/harnesses/readiness/types.ts +90 -0
- package/src/harnesses/runtimeProfiles.ts +103 -0
- package/src/harnesses/shared.ts +119 -0
- package/src/index.ts +20 -131
- package/src/runtime/ManagedAgentRuntime.ts +7 -22
- package/src/runtime/herdr/HerdrAgentDiscovery.ts +3 -19
- package/src/runtime/tmux/PidPolling.ts +1 -1
- package/src/runtime/tmux/TmuxAgentRuntime.ts +1 -1
- package/src/runtime/tmux/TmuxManager.ts +102 -0
- package/src/runtime/types.ts +1 -1
- package/src/terminal/TerminalFocusManager.ts +19 -292
- package/src/terminal/TtyWriter.ts +16 -336
- package/src/terminal/backends/index.ts +21 -0
- package/src/terminal/backends/iterm2.ts +126 -0
- package/src/terminal/backends/shared.ts +42 -0
- package/src/terminal/backends/terminal-app.ts +122 -0
- package/src/terminal/backends/tmux.ts +62 -0
- package/src/terminal/backends/wezterm.ts +65 -0
- package/src/terminal/types.ts +22 -0
- package/src/utils/IncrementalJsonlSummary.ts +306 -0
- package/src/utils/jsonlTail.ts +349 -0
- package/src/utils/matching.ts +3 -3
- package/src/utils/matchingConstants.ts +15 -0
- package/src/utils/process.ts +189 -45
- package/dist/__tests__/adapters/AntigravityCliAdapter.test.js +0 -381
- package/dist/__tests__/adapters/AntigravityCliAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +0 -1853
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js +0 -391
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/KiroAdapter.test.js +0 -607
- package/dist/__tests__/adapters/KiroAdapter.test.js.map +0 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js +0 -129
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +0 -84
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +0 -126
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgentService.test.js +0 -271
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintRunner.test.js +0 -393
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
- package/dist/__tests__/print/ClaudeCliProbe.test.js +0 -49
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +0 -75
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js +0 -173
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js +0 -181
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +0 -79
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +0 -436
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +0 -1
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
- package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +0 -86
- package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +0 -1
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js +0 -254
- package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +0 -1
- package/dist/__tests__/providers/copilot/CopilotAdapter.test.js +0 -659
- package/dist/__tests__/providers/copilot/CopilotAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js +0 -1434
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/grok/GrokAgentMapper.test.js +0 -56
- package/dist/__tests__/providers/grok/GrokAgentMapper.test.js.map +0 -1
- package/dist/__tests__/providers/grok/GrokCliAdapter.test.js +0 -421
- package/dist/__tests__/providers/grok/GrokCliAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/grok/GrokSessionLocator.test.js +0 -133
- package/dist/__tests__/providers/grok/GrokSessionLocator.test.js.map +0 -1
- package/dist/__tests__/providers/opencode/OpenCodeAdapter.test.js +0 -213
- package/dist/__tests__/providers/opencode/OpenCodeAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/opencode/OpenCodeAgentMapper.test.js +0 -89
- package/dist/__tests__/providers/opencode/OpenCodeAgentMapper.test.js.map +0 -1
- package/dist/__tests__/providers/opencode/OpenCodeSessionLocator.test.js +0 -94
- package/dist/__tests__/providers/opencode/OpenCodeSessionLocator.test.js.map +0 -1
- package/dist/__tests__/providers/opencode/OpenCodeSessionParser.test.js +0 -147
- package/dist/__tests__/providers/opencode/OpenCodeSessionParser.test.js.map +0 -1
- package/dist/__tests__/providers/pi/PiAdapter.test.js +0 -367
- package/dist/__tests__/providers/pi/PiAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/pi/PiSessionParser.test.js +0 -246
- package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js +0 -108
- package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +0 -1
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +0 -76
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +0 -1
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +0 -1
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +0 -202
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +0 -1
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +0 -119
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +0 -1
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +0 -386
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +0 -1
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +0 -34
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +0 -1
- package/dist/__tests__/readiness/AgentReadiness.test.js +0 -301
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +0 -1
- package/dist/__tests__/utils/ClaudeSessionParser.test.js +0 -314
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
- package/dist/__tests__/utils/agents.test.js +0 -29
- package/dist/__tests__/utils/agents.test.js.map +0 -1
- package/dist/adapters/AntigravityCliAdapter.d.ts +0 -57
- package/dist/adapters/AntigravityCliAdapter.d.ts.map +0 -1
- package/dist/adapters/AntigravityCliAdapter.js +0 -273
- package/dist/adapters/AntigravityCliAdapter.js.map +0 -1
- package/dist/adapters/KiroAdapter.d.ts +0 -46
- package/dist/adapters/KiroAdapter.d.ts.map +0 -1
- package/dist/adapters/KiroAdapter.js +0 -344
- package/dist/adapters/KiroAdapter.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -12
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -12
- package/dist/adapters/index.js.map +0 -1
- package/dist/capacity/claude.d.ts +0 -17
- package/dist/capacity/claude.d.ts.map +0 -1
- package/dist/capacity/claude.js +0 -271
- package/dist/capacity/claude.js.map +0 -1
- package/dist/capacity/codex.d.ts +0 -36
- package/dist/capacity/codex.d.ts.map +0 -1
- package/dist/capacity/codex.js +0 -280
- package/dist/capacity/codex.js.map +0 -1
- package/dist/capacity/openai.d.ts +0 -48
- package/dist/capacity/openai.d.ts.map +0 -1
- package/dist/capacity/openai.js +0 -312
- package/dist/capacity/openai.js.map +0 -1
- package/dist/capacity/wham.d.ts +0 -16
- package/dist/capacity/wham.d.ts.map +0 -1
- package/dist/capacity/wham.js +0 -66
- package/dist/capacity/wham.js.map +0 -1
- package/dist/capacity/zai.d.ts +0 -14
- package/dist/capacity/zai.d.ts.map +0 -1
- package/dist/capacity/zai.js +0 -203
- package/dist/capacity/zai.js.map +0 -1
- package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeAgentMapper.js +0 -42
- package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts +0 -31
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js +0 -132
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeSessionLocator.js +0 -260
- package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts +0 -114
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.js +0 -309
- package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +0 -1
- package/dist/providers/claude/durable/ClaudeCliProbe.js.map +0 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +0 -1
- package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +0 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +0 -1
- package/dist/providers/claude/durable/ClaudePrintRunner.js.map +0 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +0 -1
- package/dist/providers/claude/durable/ClaudeStreamParser.js.map +0 -1
- package/dist/providers/codex/CodexAdapter.d.ts +0 -28
- package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
- package/dist/providers/codex/CodexAdapter.js +0 -170
- package/dist/providers/codex/CodexAdapter.js.map +0 -1
- package/dist/providers/codex/CodexAgentMapper.d.ts.map +0 -1
- package/dist/providers/codex/CodexAgentMapper.js +0 -35
- package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
- package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
- package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionLocator.js +0 -207
- package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
- package/dist/providers/codex/CodexSessionMapping.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionMapping.js +0 -68
- package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
- package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
- package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionParser.js +0 -262
- package/dist/providers/codex/CodexSessionParser.js.map +0 -1
- package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +0 -1
- package/dist/providers/codex/durable/CodexCliProbe.js.map +0 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +0 -1
- package/dist/providers/codex/durable/CodexPrintAgentService.js.map +0 -1
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +0 -1
- package/dist/providers/codex/durable/CodexPrintRunner.js.map +0 -1
- package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +0 -1
- package/dist/providers/codex/durable/CodexStreamParser.js.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.d.ts +0 -35
- package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.js +0 -123
- package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
- package/dist/providers/copilot/CopilotAgentMapper.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotAgentMapper.js +0 -37
- package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
- package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
- package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
- package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
- package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
- package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotSessionParser.js +0 -181
- package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
- package/dist/providers/gemini/GeminiAgentMapper.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiAgentMapper.js +0 -37
- package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.d.ts +0 -53
- package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.js +0 -197
- package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
- package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
- package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
- package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
- package/dist/providers/gemini/GeminiSessionParser.d.ts +0 -94
- package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiSessionParser.js +0 -166
- package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
- package/dist/providers/grok/GrokAgentMapper.d.ts.map +0 -1
- package/dist/providers/grok/GrokAgentMapper.js +0 -36
- package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.d.ts +0 -36
- package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.js +0 -98
- package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
- package/dist/providers/grok/GrokSessionLocator.d.ts.map +0 -1
- package/dist/providers/grok/GrokSessionLocator.js +0 -140
- package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
- package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
- package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
- package/dist/providers/grok/GrokSessionParser.js +0 -122
- package/dist/providers/grok/GrokSessionParser.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.d.ts +0 -31
- package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.js +0 -89
- package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAgentMapper.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeAgentMapper.js +0 -50
- package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionLocator.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionLocator.js +0 -118
- package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.d.ts +0 -18
- package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.js +0 -104
- package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
- package/dist/providers/pi/PiAdapter.d.ts +0 -29
- package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
- package/dist/providers/pi/PiAdapter.js +0 -163
- package/dist/providers/pi/PiAdapter.js.map +0 -1
- package/dist/providers/pi/PiAgentMapper.d.ts.map +0 -1
- package/dist/providers/pi/PiAgentMapper.js +0 -37
- package/dist/providers/pi/PiAgentMapper.js.map +0 -1
- package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
- package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionLocator.js +0 -86
- package/dist/providers/pi/PiSessionLocator.js.map +0 -1
- package/dist/providers/pi/PiSessionParser.d.ts +0 -36
- package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionParser.js +0 -191
- package/dist/providers/pi/PiSessionParser.js.map +0 -1
- package/dist/providers/pi/PiSessionTracker.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionTracker.js +0 -69
- package/dist/providers/pi/PiSessionTracker.js.map +0 -1
- package/dist/providers/pi/durable/PiCliProbe.d.ts.map +0 -1
- package/dist/providers/pi/durable/PiCliProbe.js.map +0 -1
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +0 -1
- package/dist/providers/pi/durable/PiPrintAgentService.js.map +0 -1
- package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +0 -1
- package/dist/providers/pi/durable/PiPrintProtocol.js.map +0 -1
- package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +0 -1
- package/dist/providers/pi/durable/PiPrintRunner.js.map +0 -1
- package/dist/providers/pi/durable/PiStreamParser.d.ts.map +0 -1
- package/dist/providers/pi/durable/PiStreamParser.js.map +0 -1
- package/dist/readiness/AgentReadiness.d.ts +0 -67
- package/dist/readiness/AgentReadiness.d.ts.map +0 -1
- package/dist/readiness/AgentReadiness.js +0 -614
- package/dist/readiness/AgentReadiness.js.map +0 -1
- package/dist/terminal/TmuxManager.d.ts +0 -28
- package/dist/terminal/TmuxManager.d.ts.map +0 -1
- package/dist/terminal/TmuxManager.js +0 -135
- package/dist/terminal/TmuxManager.js.map +0 -1
- package/dist/terminal/index.d.ts +0 -5
- package/dist/terminal/index.d.ts.map +0 -1
- package/dist/terminal/index.js +0 -5
- package/dist/terminal/index.js.map +0 -1
- package/dist/utils/agents.d.ts +0 -15
- package/dist/utils/agents.d.ts.map +0 -1
- package/dist/utils/agents.js +0 -82
- package/dist/utils/agents.js.map +0 -1
- package/dist/utils/index.d.ts +0 -7
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/index.js +0 -6
- package/dist/utils/index.js.map +0 -1
- package/src/__tests__/adapters/AntigravityCliAdapter.test.ts +0 -324
- package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +0 -1763
- package/src/__tests__/adapters/CodexAdapter.test.ts +0 -387
- package/src/__tests__/adapters/KiroAdapter.test.ts +0 -534
- package/src/__tests__/durable/CodexCliProbe.test.ts +0 -85
- package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +0 -65
- package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +0 -104
- package/src/__tests__/durable/CodexPrintAgentService.test.ts +0 -217
- package/src/__tests__/durable/CodexPrintRunner.test.ts +0 -309
- package/src/__tests__/fixtures/fake-claude.cjs +0 -31
- package/src/__tests__/fixtures/fake-codex.cjs +0 -56
- package/src/__tests__/print/ClaudeCliProbe.test.ts +0 -34
- package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +0 -61
- package/src/__tests__/print/ClaudePrintAgentService.test.ts +0 -129
- package/src/__tests__/print/ClaudePrintRunner.test.ts +0 -152
- package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +0 -84
- package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +0 -434
- package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
- package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +0 -63
- package/src/__tests__/providers/codex/CodexSessionParser.test.ts +0 -192
- package/src/__tests__/providers/copilot/CopilotAdapter.test.ts +0 -614
- package/src/__tests__/providers/gemini/GeminiCliAdapter.test.ts +0 -1320
- package/src/__tests__/providers/grok/GrokAgentMapper.test.ts +0 -57
- package/src/__tests__/providers/grok/GrokCliAdapter.test.ts +0 -376
- package/src/__tests__/providers/grok/GrokSessionLocator.test.ts +0 -106
- package/src/__tests__/providers/opencode/OpenCodeAdapter.test.ts +0 -215
- package/src/__tests__/providers/opencode/OpenCodeAgentMapper.test.ts +0 -83
- package/src/__tests__/providers/opencode/OpenCodeSessionLocator.test.ts +0 -84
- package/src/__tests__/providers/opencode/OpenCodeSessionParser.test.ts +0 -148
- package/src/__tests__/providers/pi/PiAdapter.test.ts +0 -325
- package/src/__tests__/providers/pi/PiSessionParser.test.ts +0 -190
- package/src/__tests__/providers/pi/PiSessionTracker.test.ts +0 -79
- package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +0 -54
- package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +0 -141
- package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +0 -71
- package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +0 -253
- package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +0 -26
- package/src/__tests__/readiness/AgentReadiness.test.ts +0 -242
- package/src/__tests__/utils/ClaudeSessionParser.test.ts +0 -300
- package/src/__tests__/utils/agents.test.ts +0 -31
- package/src/adapters/AntigravityCliAdapter.ts +0 -356
- package/src/adapters/KiroAdapter.ts +0 -456
- package/src/adapters/index.ts +0 -17
- package/src/capacity/claude.ts +0 -313
- package/src/capacity/codex.ts +0 -332
- package/src/capacity/openai.ts +0 -361
- package/src/capacity/wham.ts +0 -84
- package/src/capacity/zai.ts +0 -237
- package/src/providers/claude/ClaudeAgentMapper.ts +0 -63
- package/src/providers/claude/ClaudeCodeAdapter.ts +0 -173
- package/src/providers/claude/ClaudeSessionLocator.ts +0 -358
- package/src/providers/claude/ClaudeSessionParser.ts +0 -432
- package/src/providers/codex/CodexAdapter.ts +0 -213
- package/src/providers/codex/CodexAgentMapper.ts +0 -35
- package/src/providers/codex/CodexSessionLocator.ts +0 -279
- package/src/providers/codex/CodexSessionMapping.ts +0 -89
- package/src/providers/codex/CodexSessionParser.ts +0 -385
- package/src/providers/copilot/CopilotAdapter.ts +0 -161
- package/src/providers/copilot/CopilotAgentMapper.ts +0 -36
- package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
- package/src/providers/copilot/CopilotSessionParser.ts +0 -289
- package/src/providers/gemini/GeminiAgentMapper.ts +0 -36
- package/src/providers/gemini/GeminiCliAdapter.ts +0 -274
- package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
- package/src/providers/gemini/GeminiSessionParser.ts +0 -271
- package/src/providers/grok/GrokAgentMapper.ts +0 -41
- package/src/providers/grok/GrokCliAdapter.ts +0 -125
- package/src/providers/grok/GrokSessionLocator.ts +0 -179
- package/src/providers/grok/GrokSessionParser.ts +0 -166
- package/src/providers/opencode/OpenCodeAdapter.ts +0 -116
- package/src/providers/opencode/OpenCodeAgentMapper.ts +0 -61
- package/src/providers/opencode/OpenCodeSessionLocator.ts +0 -151
- package/src/providers/opencode/OpenCodeSessionParser.ts +0 -145
- package/src/providers/pi/PiAdapter.ts +0 -195
- package/src/providers/pi/PiAgentMapper.ts +0 -36
- package/src/providers/pi/PiSessionLocator.ts +0 -110
- package/src/providers/pi/PiSessionParser.ts +0 -284
- package/src/providers/pi/PiSessionTracker.ts +0 -87
- package/src/readiness/AgentReadiness.ts +0 -730
- package/src/terminal/TmuxManager.ts +0 -123
- package/src/terminal/index.ts +0 -4
- package/src/utils/agents.ts +0 -75
- package/src/utils/index.ts +0 -12
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
- /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
- /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
- /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/pi/PiSessionParser.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport type {\n ConversationMessage,\n ConversationOptions,\n SessionSummary,\n} from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport {\n IncrementalJsonlSummary,\n reduceJsonlContent,\n type JsonlSummaryBounds,\n type JsonlSummaryReducer,\n} from \"../../utils/IncrementalJsonlSummary.js\";\nimport { JsonlTailReader, normalizeTail } from \"../../utils/jsonlTail.js\";\nimport { safeReadFile, safeStat } from \"../../utils/session.js\";\nimport { isIdle, parseTimestamp, SUMMARY_MAX_LENGTH, truncate } from \"../shared.js\";\n\nexport interface PiSession {\n sessionId: string;\n projectPath: string;\n summary: string;\n sessionStart: Date;\n lastActive: Date;\n lastRole?: ConversationMessage[\"role\"];\n}\n\ninterface PiLine {\n timestamp?: string;\n role?: string;\n type?: string;\n content?: unknown;\n text?: unknown;\n message?: unknown;\n sessionId?: string;\n session_id?: string;\n id?: string;\n cwd?: string;\n projectPath?: string;\n project_path?: string;\n payload?: Record<string, unknown>;\n data?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ntype PiRecord = Record<string, unknown>;\n\n/**\n * Session identity read from the start of a file, without parsing the rest.\n * Fields are undefined when not found in the head.\n */\nexport interface PiSessionHead {\n sessionId?: string;\n projectPath?: string;\n /** Bytes read from the file. */\n bytesRead: number;\n /** True when the whole file fit in the head read. */\n complete: boolean;\n}\n\n/**\n * O(1) running summary folded from session entries; `toSession` turns it into\n * a `PiSession`. Timestamps are epoch ms so cached state stays immutable.\n */\ninterface PiSummaryState {\n entryCount: number;\n /** A bounded cold start skipped the middle: later lines are not the session's first. */\n pastHead?: boolean;\n sessionId?: string;\n projectPath?: string;\n firstTimestampMs?: number;\n lastTimestampMs?: number;\n firstUserMessage?: string;\n lastUserMessage?: string;\n lastRole?: ConversationMessage[\"role\"];\n}\n\n/** Upper bound for `readSessionHead`; Pi writes its session header as the first line. */\nexport const PI_SESSION_HEAD_MAX_BYTES = 64 * 1024;\nconst HEAD_CHUNK_BYTES = 4 * 1024;\n\nexport interface PiSessionParserOptions {\n /** Cold-start scan bounds for `readSessionIncremental` (see IncrementalJsonlSummary). */\n summaryBounds?: JsonlSummaryBounds | false;\n}\n\nexport class PiSessionParser {\n /** Incremental reader backing `getConversation({ tail })`. */\n private readonly tailReader = new JsonlTailReader();\n\n private readonly sessionCache: IncrementalJsonlSummary<PiSummaryState>;\n\n constructor(options: PiSessionParserOptions = {}) {\n this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {\n bounds: options.summaryBounds,\n });\n }\n\n readSession(filePath: string, fallbackCwd = \"\"): PiSession | null {\n const content = safeReadFile(filePath);\n if (content === undefined) return null;\n return this.toSession(filePath, fallbackCwd, reduceJsonlContent(this.summaryReducer, content));\n }\n\n /**\n * Same result as `readSession`, but backed by a per-instance incremental\n * cache so repeated refreshes only parse bytes appended since the last call.\n * Call `pruneSessionCache()` once per refresh to evict files no longer read.\n *\n * The first read of a large transcript is a bounded head + tail scan (see\n * `summaryReducer.skip`); fields whose entries lie only in the skipped\n * middle fall back to their defaults instead of forcing a full parse.\n */\n readSessionIncremental(filePath: string, fallbackCwd = \"\"): PiSession | null {\n const result = this.sessionCache.read(filePath);\n return result ? this.toSession(filePath, fallbackCwd, result.state) : null;\n }\n\n /** Evict cached summaries for files not read since the previous prune. */\n pruneSessionCache(): void {\n this.sessionCache.prune();\n }\n\n /**\n * Read the session id and project path from the first complete lines of a\n * file, stopping once both are found or after `maxBytes`. Null if unreadable.\n */\n readSessionHead(filePath: string, maxBytes = PI_SESSION_HEAD_MAX_BYTES): PiSessionHead | null {\n let fd: number;\n try {\n fd = fs.openSync(filePath, \"r\");\n } catch {\n return null;\n }\n\n try {\n const head: PiSessionHead = { bytesRead: 0, complete: false };\n const buffer = Buffer.alloc(maxBytes);\n let lineStart = 0;\n\n while (head.bytesRead < maxBytes) {\n const bytesRead = fs.readSync(\n fd,\n buffer,\n head.bytesRead,\n Math.min(HEAD_CHUNK_BYTES, maxBytes - head.bytesRead),\n head.bytesRead,\n );\n if (bytesRead === 0) {\n head.complete = true;\n break;\n }\n head.bytesRead += bytesRead;\n\n let newline = buffer.indexOf(0x0a, lineStart);\n while (newline !== -1 && newline < head.bytesRead) {\n this.applyHeadLine(head, buffer.toString(\"utf8\", lineStart, newline));\n lineStart = newline + 1;\n if (head.sessionId && head.projectPath) return head;\n newline = buffer.indexOf(0x0a, lineStart);\n }\n }\n\n // The unterminated last line is only trusted when it ends the file\n if (head.complete && lineStart < head.bytesRead) {\n this.applyHeadLine(head, buffer.toString(\"utf8\", lineStart, head.bytesRead));\n }\n return head;\n } catch {\n return null;\n } finally {\n fs.closeSync(fd);\n }\n }\n\n determineStatus(session: PiSession): AgentStatus {\n if (isIdle(session.lastActive)) return AgentStatus.IDLE;\n if (session.lastRole === \"assistant\") return AgentStatus.WAITING;\n return AgentStatus.RUNNING;\n }\n\n getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {\n const includeSystem = options?.verbose ?? false;\n const tail = normalizeTail(options?.tail);\n if (tail !== undefined) {\n return this.tailReader.read(\n sessionFilePath,\n tail,\n {\n parseLine: (line) => {\n const entry = this.parseJsonlLine(line);\n return entry ? this.entryToMessage(entry, includeSystem) : null;\n },\n },\n String(includeSystem),\n );\n }\n return this.entriesToMessages(this.readJsonl(sessionFilePath), includeSystem);\n }\n\n fileToSessionSummary(filePath: string): SessionSummary | null {\n const content = safeReadFile(filePath);\n if (content === undefined) return null;\n\n const state = reduceJsonlContent(this.summaryReducer, content);\n const session = this.toSession(filePath, \"\", state);\n if (!session) return null;\n return {\n type: \"pi\",\n sessionId: session.sessionId,\n cwd: session.projectPath,\n firstUserMessage: state.firstUserMessage ?? \"\",\n lastActive: session.lastActive,\n startedAt: session.sessionStart,\n sessionFilePath: filePath,\n };\n }\n\n sessionIdFromFile(filePath: string): string {\n const base = path.basename(filePath, \".jsonl\");\n const underscore = base.lastIndexOf(\"_\");\n return underscore >= 0 ? base.slice(underscore + 1) : base;\n }\n\n /**\n * Fold one JSONL entry into the O(1) session summary. Mirrors the previous\n * whole-file scan: id, cwd and start come from the first entry that has\n * them; last active, last user message and last role track the latest one.\n *\n * `skip` (bounded cold start) keeps the head's first-* fields (id, cwd,\n * start, first user message) and clears the latest ones, so those come from\n * the tail only. Tail entries never fill a first-* field: Pi message entries\n * carry their own `id`, which must not become the session id. A first-*\n * value beyond the head falls back like a missing one (filename id,\n * `fallbackCwd`, file birthtime, no first user message); a latest value\n * before the tail window stays unset (file mtime for last active).\n */\n private readonly summaryReducer: JsonlSummaryReducer<PiSummaryState> = {\n initial: () => ({ entryCount: 0 }),\n reduce: (state, value) => {\n const entry = this.asRecord(value) as PiLine | null;\n if (!entry) return state;\n\n const next: PiSummaryState = { ...state, entryCount: state.entryCount + 1 };\n const inHead = !state.pastHead;\n if (inHead) {\n next.sessionId ??= this.entrySessionId(entry);\n next.projectPath ??= this.entryCwd(entry);\n }\n\n const timestamp = parseTimestamp(this.entryTimestamp(entry));\n if (timestamp) {\n if (inHead) next.firstTimestampMs ??= timestamp.getTime();\n next.lastTimestampMs = timestamp.getTime();\n }\n\n const message = this.entryToMessage(entry, true);\n if (message) {\n next.lastRole = message.role;\n if (message.role === \"user\") {\n next.lastUserMessage = message.content;\n if (inHead) next.firstUserMessage ??= message.content;\n }\n }\n return next;\n },\n skip: (state) => ({\n entryCount: state.entryCount,\n pastHead: true,\n sessionId: state.sessionId,\n projectPath: state.projectPath,\n firstTimestampMs: state.firstTimestampMs,\n firstUserMessage: state.firstUserMessage,\n }),\n };\n\n private toSession(\n filePath: string,\n fallbackCwd: string,\n state: PiSummaryState,\n ): PiSession | null {\n if (state.entryCount === 0) return null;\n\n const needsStat = state.firstTimestampMs === undefined || state.lastTimestampMs === undefined;\n const stat = needsStat ? safeStat(filePath) : undefined;\n const sessionStart =\n state.firstTimestampMs !== undefined\n ? new Date(state.firstTimestampMs)\n : (stat?.birthtime ?? stat?.mtime ?? new Date());\n const lastActive =\n state.lastTimestampMs !== undefined\n ? new Date(state.lastTimestampMs)\n : (stat?.mtime ?? sessionStart);\n\n return {\n sessionId: state.sessionId || this.sessionIdFromFile(filePath),\n projectPath: state.projectPath || fallbackCwd,\n summary: state.lastUserMessage\n ? truncate(state.lastUserMessage, SUMMARY_MAX_LENGTH)\n : \"Pi session active\",\n sessionStart,\n lastActive,\n lastRole: state.lastRole,\n };\n }\n\n private applyHeadLine(head: PiSessionHead, line: string): void {\n const trimmed = line.trim();\n if (!trimmed) return;\n let entry: PiLine | null;\n try {\n entry = this.asRecord(JSON.parse(trimmed)) as PiLine | null;\n } catch {\n return;\n }\n if (!entry) return;\n head.sessionId ??= this.entrySessionId(entry);\n head.projectPath ??= this.entryCwd(entry);\n }\n\n private readJsonl(filePath: string): PiLine[] {\n const content = safeReadFile(filePath);\n if (content === undefined) return [];\n\n const entries: PiLine[] = [];\n for (const line of content.split(/\\r?\\n/)) {\n const entry = this.parseJsonlLine(line);\n if (entry) entries.push(entry);\n }\n return entries;\n }\n\n private parseJsonlLine(line: string): PiLine | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n try {\n const parsed = JSON.parse(trimmed);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as PiLine;\n }\n } catch {\n return null;\n }\n return null;\n }\n\n private entriesToMessages(entries: PiLine[], includeSystem: boolean): ConversationMessage[] {\n return entries\n .map((entry) => this.entryToMessage(entry, includeSystem))\n .filter((msg): msg is ConversationMessage => msg !== null);\n }\n\n private entryToMessage(entry: PiLine, includeSystem: boolean): ConversationMessage | null {\n const role = this.entryRole(entry);\n if (!role) return null;\n if (role === \"system\" && !includeSystem) return null;\n\n const content = this.entryContent(entry).trim();\n if (!content) return null;\n\n return {\n role,\n content,\n timestamp: this.entryTimestamp(entry),\n };\n }\n\n private entryRole(entry: PiLine): ConversationMessage[\"role\"] | null {\n const message = this.messageRecord(entry);\n const raw = this.firstString(\n entry.role,\n message?.role,\n this.roleLikeType(entry.type),\n entry.payload?.role,\n entry.payload?.type,\n entry.data?.role,\n entry.data?.type,\n );\n if (!raw) return null;\n const normalized = raw.toLowerCase();\n if (normalized === \"user\" || normalized === \"human\") return \"user\";\n if (normalized === \"assistant\" || normalized === \"ai\" || normalized === \"pi\")\n return \"assistant\";\n if (normalized === \"system\") return \"system\";\n return null;\n }\n\n private entryContent(entry: PiLine): string {\n const message = this.messageRecord(entry);\n const candidates = [\n entry.content,\n entry.text,\n message?.content,\n message?.text,\n message?.message,\n entry.message,\n entry.payload?.content,\n entry.payload?.text,\n entry.payload?.message,\n entry.data?.content,\n entry.data?.text,\n entry.data?.message,\n ];\n\n for (const candidate of candidates) {\n const text = this.contentToString(candidate);\n if (text) return text;\n }\n return \"\";\n }\n\n private contentToString(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) {\n return value\n .map((item) => this.contentToString(item))\n .filter(Boolean)\n .join(\"\");\n }\n if (!value || typeof value !== \"object\") return \"\";\n\n const record = value as Record<string, unknown>;\n return this.contentToString(record.content ?? record.text ?? record.value);\n }\n\n private messageRecord(entry: PiLine): PiRecord | null {\n return this.asRecord(entry.message);\n }\n\n private asRecord(value: unknown): PiRecord | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as PiRecord;\n }\n\n private roleLikeType(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.toLowerCase();\n if ([\"user\", \"human\", \"assistant\", \"ai\", \"pi\", \"system\"].includes(normalized)) {\n return value;\n }\n return undefined;\n }\n\n private entryTimestamp(entry: PiLine): string | undefined {\n return this.firstString(\n entry.timestamp,\n entry.payload?.timestamp,\n entry.data?.timestamp,\n entry.createdAt,\n entry.created_at,\n );\n }\n\n private entrySessionId(entry: PiLine): string | undefined {\n return this.firstString(\n entry.sessionId,\n entry.session_id,\n entry.id,\n entry.payload?.sessionId,\n entry.payload?.session_id,\n entry.payload?.id,\n entry.data?.sessionId,\n entry.data?.session_id,\n entry.data?.id,\n );\n }\n\n private entryCwd(entry: PiLine): string | undefined {\n return this.firstString(\n entry.cwd,\n entry.projectPath,\n entry.project_path,\n entry.payload?.cwd,\n entry.payload?.projectPath,\n entry.payload?.project_path,\n entry.data?.cwd,\n entry.data?.projectPath,\n entry.data?.project_path,\n );\n }\n\n private firstString(...values: unknown[]): string | undefined {\n for (const value of values) {\n if (typeof value === \"string\" && value) return value;\n }\n return undefined;\n }\n}\n"],"names":["fs","path","AgentStatus","IncrementalJsonlSummary","reduceJsonlContent","JsonlTailReader","normalizeTail","safeReadFile","safeStat","isIdle","parseTimestamp","SUMMARY_MAX_LENGTH","truncate","PI_SESSION_HEAD_MAX_BYTES","HEAD_CHUNK_BYTES","PiSessionParser","tailReader","sessionCache","options","summaryReducer","bounds","summaryBounds","readSession","filePath","fallbackCwd","content","undefined","toSession","readSessionIncremental","result","read","state","pruneSessionCache","prune","readSessionHead","maxBytes","fd","openSync","head","bytesRead","complete","buffer","Buffer","alloc","lineStart","readSync","Math","min","newline","indexOf","applyHeadLine","toString","sessionId","projectPath","closeSync","determineStatus","session","lastActive","IDLE","lastRole","WAITING","RUNNING","getConversation","sessionFilePath","includeSystem","verbose","tail","parseLine","line","entry","parseJsonlLine","entryToMessage","String","entriesToMessages","readJsonl","fileToSessionSummary","type","cwd","firstUserMessage","startedAt","sessionStart","sessionIdFromFile","base","basename","underscore","lastIndexOf","slice","initial","entryCount","reduce","value","asRecord","next","inHead","pastHead","entrySessionId","entryCwd","timestamp","entryTimestamp","firstTimestampMs","getTime","lastTimestampMs","message","role","lastUserMessage","skip","needsStat","stat","Date","birthtime","mtime","summary","trimmed","trim","JSON","parse","entries","split","push","parsed","Array","isArray","map","filter","msg","entryRole","entryContent","messageRecord","raw","firstString","roleLikeType","payload","data","normalized","toLowerCase","candidates","text","candidate","contentToString","item","Boolean","join","record","includes","createdAt","created_at","session_id","id","project_path","values"],"mappings":"AAAA,YAAYA,QAAQ,KAAK;AACzB,YAAYC,UAAU,OAAO;AAM7B,SAASC,WAAW,QAAQ,iCAAiC;AAC7D,SACEC,uBAAuB,EACvBC,kBAAkB,QAGb,yCAAyC;AAChD,SAASC,eAAe,EAAEC,aAAa,QAAQ,2BAA2B;AAC1E,SAASC,YAAY,EAAEC,QAAQ,QAAQ,yBAAyB;AAChE,SAASC,MAAM,EAAEC,cAAc,EAAEC,kBAAkB,EAAEC,QAAQ,QAAQ,eAAe;AA6DpF,uFAAuF,GACvF,OAAO,MAAMC,4BAA4B,KAAK,KAAK;AACnD,MAAMC,mBAAmB,IAAI;AAO7B,OAAO,MAAMC;IACX,4DAA4D,GAC5D,AAAiBC,aAAa,IAAIX,kBAAkB;IAEnCY,aAAsD;IAEvE,YAAYC,UAAkC,CAAC,CAAC,CAAE;QAChD,IAAI,CAACD,YAAY,GAAG,IAAId,wBAAwB,IAAI,CAACgB,cAAc,EAAE;YACnEC,QAAQF,QAAQG,aAAa;QAC/B;IACF;IAEAC,YAAYC,QAAgB,EAAEC,cAAc,EAAE,EAAoB;QAChE,MAAMC,UAAUlB,aAAagB;QAC7B,IAAIE,YAAYC,WAAW,OAAO;QAClC,OAAO,IAAI,CAACC,SAAS,CAACJ,UAAUC,aAAapB,mBAAmB,IAAI,CAACe,cAAc,EAAEM;IACvF;IAEA;;;;;;;;GAQC,GACDG,uBAAuBL,QAAgB,EAAEC,cAAc,EAAE,EAAoB;QAC3E,MAAMK,SAAS,IAAI,CAACZ,YAAY,CAACa,IAAI,CAACP;QACtC,OAAOM,SAAS,IAAI,CAACF,SAAS,CAACJ,UAAUC,aAAaK,OAAOE,KAAK,IAAI;IACxE;IAEA,wEAAwE,GACxEC,oBAA0B;QACxB,IAAI,CAACf,YAAY,CAACgB,KAAK;IACzB;IAEA;;;GAGC,GACDC,gBAAgBX,QAAgB,EAAEY,WAAWtB,yBAAyB,EAAwB;QAC5F,IAAIuB;QACJ,IAAI;YACFA,KAAKpC,GAAGqC,QAAQ,CAACd,UAAU;QAC7B,EAAE,OAAM;YACN,OAAO;QACT;QAEA,IAAI;YACF,MAAMe,OAAsB;gBAAEC,WAAW;gBAAGC,UAAU;YAAM;YAC5D,MAAMC,SAASC,OAAOC,KAAK,CAACR;YAC5B,IAAIS,YAAY;YAEhB,MAAON,KAAKC,SAAS,GAAGJ,SAAU;gBAChC,MAAMI,YAAYvC,GAAG6C,QAAQ,CAC3BT,IACAK,QACAH,KAAKC,SAAS,EACdO,KAAKC,GAAG,CAACjC,kBAAkBqB,WAAWG,KAAKC,SAAS,GACpDD,KAAKC,SAAS;gBAEhB,IAAIA,cAAc,GAAG;oBACnBD,KAAKE,QAAQ,GAAG;oBAChB;gBACF;gBACAF,KAAKC,SAAS,IAAIA;gBAElB,IAAIS,UAAUP,OAAOQ,OAAO,CAAC,MAAML;gBACnC,MAAOI,YAAY,CAAC,KAAKA,UAAUV,KAAKC,SAAS,CAAE;oBACjD,IAAI,CAACW,aAAa,CAACZ,MAAMG,OAAOU,QAAQ,CAAC,QAAQP,WAAWI;oBAC5DJ,YAAYI,UAAU;oBACtB,IAAIV,KAAKc,SAAS,IAAId,KAAKe,WAAW,EAAE,OAAOf;oBAC/CU,UAAUP,OAAOQ,OAAO,CAAC,MAAML;gBACjC;YACF;YAEA,mEAAmE;YACnE,IAAIN,KAAKE,QAAQ,IAAII,YAAYN,KAAKC,SAAS,EAAE;gBAC/C,IAAI,CAACW,aAAa,CAACZ,MAAMG,OAAOU,QAAQ,CAAC,QAAQP,WAAWN,KAAKC,SAAS;YAC5E;YACA,OAAOD;QACT,EAAE,OAAM;YACN,OAAO;QACT,SAAU;YACRtC,GAAGsD,SAAS,CAAClB;QACf;IACF;IAEAmB,gBAAgBC,OAAkB,EAAe;QAC/C,IAAI/C,OAAO+C,QAAQC,UAAU,GAAG,OAAOvD,YAAYwD,IAAI;QACvD,IAAIF,QAAQG,QAAQ,KAAK,aAAa,OAAOzD,YAAY0D,OAAO;QAChE,OAAO1D,YAAY2D,OAAO;IAC5B;IAEAC,gBAAgBC,eAAuB,EAAE7C,OAA6B,EAAyB;QAC7F,MAAM8C,gBAAgB9C,SAAS+C,WAAW;QAC1C,MAAMC,OAAO5D,cAAcY,SAASgD;QACpC,IAAIA,SAASxC,WAAW;YACtB,OAAO,IAAI,CAACV,UAAU,CAACc,IAAI,CACzBiC,iBACAG,MACA;gBACEC,WAAW,CAACC;oBACV,MAAMC,QAAQ,IAAI,CAACC,cAAc,CAACF;oBAClC,OAAOC,QAAQ,IAAI,CAACE,cAAc,CAACF,OAAOL,iBAAiB;gBAC7D;YACF,GACAQ,OAAOR;QAEX;QACA,OAAO,IAAI,CAACS,iBAAiB,CAAC,IAAI,CAACC,SAAS,CAACX,kBAAkBC;IACjE;IAEAW,qBAAqBpD,QAAgB,EAAyB;QAC5D,MAAME,UAAUlB,aAAagB;QAC7B,IAAIE,YAAYC,WAAW,OAAO;QAElC,MAAMK,QAAQ3B,mBAAmB,IAAI,CAACe,cAAc,EAAEM;QACtD,MAAM+B,UAAU,IAAI,CAAC7B,SAAS,CAACJ,UAAU,IAAIQ;QAC7C,IAAI,CAACyB,SAAS,OAAO;QACrB,OAAO;YACLoB,MAAM;YACNxB,WAAWI,QAAQJ,SAAS;YAC5ByB,KAAKrB,QAAQH,WAAW;YACxByB,kBAAkB/C,MAAM+C,gBAAgB,IAAI;YAC5CrB,YAAYD,QAAQC,UAAU;YAC9BsB,WAAWvB,QAAQwB,YAAY;YAC/BjB,iBAAiBxC;QACnB;IACF;IAEA0D,kBAAkB1D,QAAgB,EAAU;QAC1C,MAAM2D,OAAOjF,KAAKkF,QAAQ,CAAC5D,UAAU;QACrC,MAAM6D,aAAaF,KAAKG,WAAW,CAAC;QACpC,OAAOD,cAAc,IAAIF,KAAKI,KAAK,CAACF,aAAa,KAAKF;IACxD;IAEA;;;;;;;;;;;;GAYC,GACD,AAAiB/D,iBAAsD;QACrEoE,SAAS,IAAO,CAAA;gBAAEC,YAAY;YAAE,CAAA;QAChCC,QAAQ,CAAC1D,OAAO2D;YACd,MAAMrB,QAAQ,IAAI,CAACsB,QAAQ,CAACD;YAC5B,IAAI,CAACrB,OAAO,OAAOtC;YAEnB,MAAM6D,OAAuB;gBAAE,GAAG7D,KAAK;gBAAEyD,YAAYzD,MAAMyD,UAAU,GAAG;YAAE;YAC1E,MAAMK,SAAS,CAAC9D,MAAM+D,QAAQ;YAC9B,IAAID,QAAQ;gBACVD,KAAKxC,SAAS,KAAK,IAAI,CAAC2C,cAAc,CAAC1B;gBACvCuB,KAAKvC,WAAW,KAAK,IAAI,CAAC2C,QAAQ,CAAC3B;YACrC;YAEA,MAAM4B,YAAYvF,eAAe,IAAI,CAACwF,cAAc,CAAC7B;YACrD,IAAI4B,WAAW;gBACb,IAAIJ,QAAQD,KAAKO,gBAAgB,KAAKF,UAAUG,OAAO;gBACvDR,KAAKS,eAAe,GAAGJ,UAAUG,OAAO;YAC1C;YAEA,MAAME,UAAU,IAAI,CAAC/B,cAAc,CAACF,OAAO;YAC3C,IAAIiC,SAAS;gBACXV,KAAKjC,QAAQ,GAAG2C,QAAQC,IAAI;gBAC5B,IAAID,QAAQC,IAAI,KAAK,QAAQ;oBAC3BX,KAAKY,eAAe,GAAGF,QAAQ7E,OAAO;oBACtC,IAAIoE,QAAQD,KAAKd,gBAAgB,KAAKwB,QAAQ7E,OAAO;gBACvD;YACF;YACA,OAAOmE;QACT;QACAa,MAAM,CAAC1E,QAAW,CAAA;gBAChByD,YAAYzD,MAAMyD,UAAU;gBAC5BM,UAAU;gBACV1C,WAAWrB,MAAMqB,SAAS;gBAC1BC,aAAatB,MAAMsB,WAAW;gBAC9B8C,kBAAkBpE,MAAMoE,gBAAgB;gBACxCrB,kBAAkB/C,MAAM+C,gBAAgB;YAC1C,CAAA;IACF,EAAE;IAEMnD,UACNJ,QAAgB,EAChBC,WAAmB,EACnBO,KAAqB,EACH;QAClB,IAAIA,MAAMyD,UAAU,KAAK,GAAG,OAAO;QAEnC,MAAMkB,YAAY3E,MAAMoE,gBAAgB,KAAKzE,aAAaK,MAAMsE,eAAe,KAAK3E;QACpF,MAAMiF,OAAOD,YAAYlG,SAASe,YAAYG;QAC9C,MAAMsD,eACJjD,MAAMoE,gBAAgB,KAAKzE,YACvB,IAAIkF,KAAK7E,MAAMoE,gBAAgB,IAC9BQ,MAAME,aAAaF,MAAMG,SAAS,IAAIF;QAC7C,MAAMnD,aACJ1B,MAAMsE,eAAe,KAAK3E,YACtB,IAAIkF,KAAK7E,MAAMsE,eAAe,IAC7BM,MAAMG,SAAS9B;QAEtB,OAAO;YACL5B,WAAWrB,MAAMqB,SAAS,IAAI,IAAI,CAAC6B,iBAAiB,CAAC1D;YACrD8B,aAAatB,MAAMsB,WAAW,IAAI7B;YAClCuF,SAAShF,MAAMyE,eAAe,GAC1B5F,SAASmB,MAAMyE,eAAe,EAAE7F,sBAChC;YACJqE;YACAvB;YACAE,UAAU5B,MAAM4B,QAAQ;QAC1B;IACF;IAEQT,cAAcZ,IAAmB,EAAE8B,IAAY,EAAQ;QAC7D,MAAM4C,UAAU5C,KAAK6C,IAAI;QACzB,IAAI,CAACD,SAAS;QACd,IAAI3C;QACJ,IAAI;YACFA,QAAQ,IAAI,CAACsB,QAAQ,CAACuB,KAAKC,KAAK,CAACH;QACnC,EAAE,OAAM;YACN;QACF;QACA,IAAI,CAAC3C,OAAO;QACZ/B,KAAKc,SAAS,KAAK,IAAI,CAAC2C,cAAc,CAAC1B;QACvC/B,KAAKe,WAAW,KAAK,IAAI,CAAC2C,QAAQ,CAAC3B;IACrC;IAEQK,UAAUnD,QAAgB,EAAY;QAC5C,MAAME,UAAUlB,aAAagB;QAC7B,IAAIE,YAAYC,WAAW,OAAO,EAAE;QAEpC,MAAM0F,UAAoB,EAAE;QAC5B,KAAK,MAAMhD,QAAQ3C,QAAQ4F,KAAK,CAAC,SAAU;YACzC,MAAMhD,QAAQ,IAAI,CAACC,cAAc,CAACF;YAClC,IAAIC,OAAO+C,QAAQE,IAAI,CAACjD;QAC1B;QACA,OAAO+C;IACT;IAEQ9C,eAAeF,IAAY,EAAiB;QAClD,MAAM4C,UAAU5C,KAAK6C,IAAI;QACzB,IAAI,CAACD,SAAS,OAAO;QACrB,IAAI;YACF,MAAMO,SAASL,KAAKC,KAAK,CAACH;YAC1B,IAAIO,UAAU,OAAOA,WAAW,YAAY,CAACC,MAAMC,OAAO,CAACF,SAAS;gBAClE,OAAOA;YACT;QACF,EAAE,OAAM;YACN,OAAO;QACT;QACA,OAAO;IACT;IAEQ9C,kBAAkB2C,OAAiB,EAAEpD,aAAsB,EAAyB;QAC1F,OAAOoD,QACJM,GAAG,CAAC,CAACrD,QAAU,IAAI,CAACE,cAAc,CAACF,OAAOL,gBAC1C2D,MAAM,CAAC,CAACC,MAAoCA,QAAQ;IACzD;IAEQrD,eAAeF,KAAa,EAAEL,aAAsB,EAA8B;QACxF,MAAMuC,OAAO,IAAI,CAACsB,SAAS,CAACxD;QAC5B,IAAI,CAACkC,MAAM,OAAO;QAClB,IAAIA,SAAS,YAAY,CAACvC,eAAe,OAAO;QAEhD,MAAMvC,UAAU,IAAI,CAACqG,YAAY,CAACzD,OAAO4C,IAAI;QAC7C,IAAI,CAACxF,SAAS,OAAO;QAErB,OAAO;YACL8E;YACA9E;YACAwE,WAAW,IAAI,CAACC,cAAc,CAAC7B;QACjC;IACF;IAEQwD,UAAUxD,KAAa,EAAsC;QACnE,MAAMiC,UAAU,IAAI,CAACyB,aAAa,CAAC1D;QACnC,MAAM2D,MAAM,IAAI,CAACC,WAAW,CAC1B5D,MAAMkC,IAAI,EACVD,SAASC,MACT,IAAI,CAAC2B,YAAY,CAAC7D,MAAMO,IAAI,GAC5BP,MAAM8D,OAAO,EAAE5B,MACflC,MAAM8D,OAAO,EAAEvD,MACfP,MAAM+D,IAAI,EAAE7B,MACZlC,MAAM+D,IAAI,EAAExD;QAEd,IAAI,CAACoD,KAAK,OAAO;QACjB,MAAMK,aAAaL,IAAIM,WAAW;QAClC,IAAID,eAAe,UAAUA,eAAe,SAAS,OAAO;QAC5D,IAAIA,eAAe,eAAeA,eAAe,QAAQA,eAAe,MACtE,OAAO;QACT,IAAIA,eAAe,UAAU,OAAO;QACpC,OAAO;IACT;IAEQP,aAAazD,KAAa,EAAU;QAC1C,MAAMiC,UAAU,IAAI,CAACyB,aAAa,CAAC1D;QACnC,MAAMkE,aAAa;YACjBlE,MAAM5C,OAAO;YACb4C,MAAMmE,IAAI;YACVlC,SAAS7E;YACT6E,SAASkC;YACTlC,SAASA;YACTjC,MAAMiC,OAAO;YACbjC,MAAM8D,OAAO,EAAE1G;YACf4C,MAAM8D,OAAO,EAAEK;YACfnE,MAAM8D,OAAO,EAAE7B;YACfjC,MAAM+D,IAAI,EAAE3G;YACZ4C,MAAM+D,IAAI,EAAEI;YACZnE,MAAM+D,IAAI,EAAE9B;SACb;QAED,KAAK,MAAMmC,aAAaF,WAAY;YAClC,MAAMC,OAAO,IAAI,CAACE,eAAe,CAACD;YAClC,IAAID,MAAM,OAAOA;QACnB;QACA,OAAO;IACT;IAEQE,gBAAgBhD,KAAc,EAAU;QAC9C,IAAI,OAAOA,UAAU,UAAU,OAAOA;QACtC,IAAI8B,MAAMC,OAAO,CAAC/B,QAAQ;YACxB,OAAOA,MACJgC,GAAG,CAAC,CAACiB,OAAS,IAAI,CAACD,eAAe,CAACC,OACnChB,MAAM,CAACiB,SACPC,IAAI,CAAC;QACV;QACA,IAAI,CAACnD,SAAS,OAAOA,UAAU,UAAU,OAAO;QAEhD,MAAMoD,SAASpD;QACf,OAAO,IAAI,CAACgD,eAAe,CAACI,OAAOrH,OAAO,IAAIqH,OAAON,IAAI,IAAIM,OAAOpD,KAAK;IAC3E;IAEQqC,cAAc1D,KAAa,EAAmB;QACpD,OAAO,IAAI,CAACsB,QAAQ,CAACtB,MAAMiC,OAAO;IACpC;IAEQX,SAASD,KAAc,EAAmB;QAChD,IAAI,CAACA,SAAS,OAAOA,UAAU,YAAY8B,MAAMC,OAAO,CAAC/B,QAAQ,OAAO;QACxE,OAAOA;IACT;IAEQwC,aAAaxC,KAAc,EAAsB;QACvD,IAAI,OAAOA,UAAU,UAAU,OAAOhE;QACtC,MAAM2G,aAAa3C,MAAM4C,WAAW;QACpC,IAAI;YAAC;YAAQ;YAAS;YAAa;YAAM;YAAM;SAAS,CAACS,QAAQ,CAACV,aAAa;YAC7E,OAAO3C;QACT;QACA,OAAOhE;IACT;IAEQwE,eAAe7B,KAAa,EAAsB;QACxD,OAAO,IAAI,CAAC4D,WAAW,CACrB5D,MAAM4B,SAAS,EACf5B,MAAM8D,OAAO,EAAElC,WACf5B,MAAM+D,IAAI,EAAEnC,WACZ5B,MAAM2E,SAAS,EACf3E,MAAM4E,UAAU;IAEpB;IAEQlD,eAAe1B,KAAa,EAAsB;QACxD,OAAO,IAAI,CAAC4D,WAAW,CACrB5D,MAAMjB,SAAS,EACfiB,MAAM6E,UAAU,EAChB7E,MAAM8E,EAAE,EACR9E,MAAM8D,OAAO,EAAE/E,WACfiB,MAAM8D,OAAO,EAAEe,YACf7E,MAAM8D,OAAO,EAAEgB,IACf9E,MAAM+D,IAAI,EAAEhF,WACZiB,MAAM+D,IAAI,EAAEc,YACZ7E,MAAM+D,IAAI,EAAEe;IAEhB;IAEQnD,SAAS3B,KAAa,EAAsB;QAClD,OAAO,IAAI,CAAC4D,WAAW,CACrB5D,MAAMQ,GAAG,EACTR,MAAMhB,WAAW,EACjBgB,MAAM+E,YAAY,EAClB/E,MAAM8D,OAAO,EAAEtD,KACfR,MAAM8D,OAAO,EAAE9E,aACfgB,MAAM8D,OAAO,EAAEiB,cACf/E,MAAM+D,IAAI,EAAEvD,KACZR,MAAM+D,IAAI,EAAE/E,aACZgB,MAAM+D,IAAI,EAAEgB;IAEhB;IAEQnB,YAAY,GAAGoB,MAAiB,EAAsB;QAC5D,KAAK,MAAM3D,SAAS2D,OAAQ;YAC1B,IAAI,OAAO3D,UAAU,YAAYA,OAAO,OAAOA;QACjD;QACA,OAAOhE;IACT;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PiSessionTracker.d.ts","sourceRoot":"","sources":["../../../src/harnesses/pi/PiSessionTracker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAIlE,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;IAMjD,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
|
+
import { homeDir } from "../shared.js";
|
|
5
|
+
export class PiSessionTracker {
|
|
6
|
+
sessionsDir;
|
|
7
|
+
trackerPath;
|
|
8
|
+
constructor(options = {}){
|
|
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/harnesses/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\";\nimport { homeDir } from \"../shared.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 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","homeDir","PiSessionTracker","sessionsDir","trackerPath","options","agentDir","join","match","processes","tracker","readTracker","size","matches","fallback","processInfo","filePath","get","pid","isTrustedSessionPath","existsSync","push","process","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;AACtD,SAASC,OAAO,QAAQ,eAAe;AAiBvC,OAAO,MAAMC;IACMC,YAAoB;IACpBC,YAAoB;IAErC,YAAYC,UAAmC,CAAC,CAAC,CAAE;QACjD,MAAMC,WAAWP,KAAKQ,IAAI,CAACN,WAAW,OAAO;QAC7C,IAAI,CAACE,WAAW,GAAGE,QAAQF,WAAW,IAAIJ,KAAKQ,IAAI,CAACD,UAAU;QAC9D,IAAI,CAACF,WAAW,GAAGC,QAAQD,WAAW,IAAIL,KAAKQ,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,CAAClB,GAAGsB,UAAU,CAACJ,WAAW;gBACjFF,SAASO,IAAI,CAACN;gBACd;YACF;YAEAF,QAAQQ,IAAI,CAAC;gBAAEC,SAASP;gBAAaC;YAAS;QAChD;QAEA,OAAO;YAAEH;YAASC;QAAS;IAC7B;IAEQH,cAAmC;QACzC,MAAMY,UAAUvB,aAAa,IAAI,CAACI,WAAW;QAC7C,IAAImB,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;IAEQP,qBAAqBH,QAAgB,EAAW;QACtD,MAAM2B,eAAe5C,KAAK6C,OAAO,CAAC,IAAI,CAACzC,WAAW;QAClD,MAAM0C,eAAe9C,KAAK6C,OAAO,CAAC5B;QAClC,OAAO6B,iBAAiBF,gBAAgBE,aAAaC,UAAU,CAAC,GAAGH,eAAe5C,KAAKgD,GAAG,EAAE;IAC9F;AACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type PiCredentialOptions = {
|
|
2
|
+
env?: NodeJS.ProcessEnv;
|
|
3
|
+
readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;
|
|
4
|
+
};
|
|
5
|
+
export type PiAnthropicCredential = {
|
|
6
|
+
kind: "oauth";
|
|
7
|
+
access: string;
|
|
8
|
+
expiresMs: number | null;
|
|
9
|
+
};
|
|
10
|
+
export type PiOpenAiCredential = {
|
|
11
|
+
kind: "platform";
|
|
12
|
+
key: string;
|
|
13
|
+
} | {
|
|
14
|
+
kind: "oauth";
|
|
15
|
+
access: string;
|
|
16
|
+
accountId: string;
|
|
17
|
+
expiresMs: number | null;
|
|
18
|
+
};
|
|
19
|
+
export declare function resolvePiAnthropicCredential(options?: PiCredentialOptions): Promise<PiAnthropicCredential>;
|
|
20
|
+
export declare function resolvePiOpenAiCredential(options?: PiCredentialOptions): Promise<PiOpenAiCredential>;
|
|
21
|
+
export declare function resolvePiZaiApiKey(options?: PiCredentialOptions): Promise<string>;
|
|
22
|
+
//# sourceMappingURL=credentials.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/harnesses/pi/credentials.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,mBAAmB,GAAG;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACxE,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AA+BnF,wBAAsB,4BAA4B,CAChD,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAoBhC;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,kBAAkB,CAAC,CAgC7B;AAED,wBAAsB,kBAAkB,CAAC,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB3F"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
const OPENAI_CREDENTIALS_MISSING = "OpenAI credentials not found; set OPENAI_API_KEY, configure the Pi openai provider, or log in to OpenAI via Pi";
|
|
5
|
+
const ZAI_CREDENTIAL_MISSING = "z.ai API key not found; set Z_AI_API_KEY or configure Pi provider zai";
|
|
6
|
+
function record(value) {
|
|
7
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
8
|
+
}
|
|
9
|
+
function nonEmptyText(value) {
|
|
10
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
11
|
+
}
|
|
12
|
+
function epochMilliseconds(value) {
|
|
13
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) return null;
|
|
14
|
+
return value > 1e12 ? value : value * 1000;
|
|
15
|
+
}
|
|
16
|
+
async function readPiAuthRoot(options) {
|
|
17
|
+
const env = options.env ?? process.env;
|
|
18
|
+
const authPath = join(env.HOME || homedir(), ".pi", "agent", "auth.json");
|
|
19
|
+
const contents = await (options.readFile ?? readFile)(authPath, "utf8");
|
|
20
|
+
const parsed = record(JSON.parse(contents));
|
|
21
|
+
if (!parsed) throw new Error("Pi auth file is malformed");
|
|
22
|
+
return parsed;
|
|
23
|
+
}
|
|
24
|
+
export async function resolvePiAnthropicCredential(options = {}) {
|
|
25
|
+
let root;
|
|
26
|
+
try {
|
|
27
|
+
root = await readPiAuthRoot(options);
|
|
28
|
+
} catch (error) {
|
|
29
|
+
if (record(error)?.code === "ENOENT") {
|
|
30
|
+
throw new Error("Pi Anthropic OAuth credentials not found");
|
|
31
|
+
}
|
|
32
|
+
throw new Error("Pi Anthropic auth file is malformed");
|
|
33
|
+
}
|
|
34
|
+
const credential = record(root.anthropic);
|
|
35
|
+
if (!credential) throw new Error("Pi Anthropic OAuth credentials not found");
|
|
36
|
+
const access = credential.type === "oauth" ? nonEmptyText(credential.access) : null;
|
|
37
|
+
if (!access) throw new Error("Pi Anthropic OAuth credential is malformed");
|
|
38
|
+
return {
|
|
39
|
+
kind: "oauth",
|
|
40
|
+
access,
|
|
41
|
+
expiresMs: epochMilliseconds(credential.expires)
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export async function resolvePiOpenAiCredential(options = {}) {
|
|
45
|
+
const env = options.env ?? process.env;
|
|
46
|
+
const environmentKey = nonEmptyText(env.OPENAI_API_KEY);
|
|
47
|
+
if (environmentKey) return {
|
|
48
|
+
kind: "platform",
|
|
49
|
+
key: environmentKey
|
|
50
|
+
};
|
|
51
|
+
let root;
|
|
52
|
+
try {
|
|
53
|
+
root = await readPiAuthRoot(options);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
if (record(error)?.code === "ENOENT") throw new Error(OPENAI_CREDENTIALS_MISSING);
|
|
56
|
+
throw new Error("OpenAI Pi auth file is malformed");
|
|
57
|
+
}
|
|
58
|
+
const platform = record(root.openai);
|
|
59
|
+
if (platform) {
|
|
60
|
+
const key = platform.type === "api_key" ? nonEmptyText(platform.key) : null;
|
|
61
|
+
if (!key) throw new Error("OpenAI Pi auth file has a malformed openai credential");
|
|
62
|
+
return {
|
|
63
|
+
kind: "platform",
|
|
64
|
+
key
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const oauth = record(root["openai-codex"]);
|
|
68
|
+
const access = oauth?.type === "oauth" ? nonEmptyText(oauth.access) : null;
|
|
69
|
+
const accountId = nonEmptyText(oauth?.accountId);
|
|
70
|
+
if (oauth && access && accountId) {
|
|
71
|
+
return {
|
|
72
|
+
kind: "oauth",
|
|
73
|
+
access,
|
|
74
|
+
accountId,
|
|
75
|
+
expiresMs: epochMilliseconds(oauth.expires)
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
throw new Error(OPENAI_CREDENTIALS_MISSING);
|
|
79
|
+
}
|
|
80
|
+
export async function resolvePiZaiApiKey(options = {}) {
|
|
81
|
+
const env = options.env ?? process.env;
|
|
82
|
+
const environmentKey = nonEmptyText(env.Z_AI_API_KEY);
|
|
83
|
+
if (environmentKey) return environmentKey;
|
|
84
|
+
let root;
|
|
85
|
+
try {
|
|
86
|
+
root = await readPiAuthRoot(options);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
if (record(error)?.code === "ENOENT") throw new Error(ZAI_CREDENTIAL_MISSING);
|
|
89
|
+
throw new Error("z.ai Pi auth file is malformed");
|
|
90
|
+
}
|
|
91
|
+
const credential = record(root.zai);
|
|
92
|
+
if (!credential) throw new Error(ZAI_CREDENTIAL_MISSING);
|
|
93
|
+
const key = credential.type === "api_key" ? nonEmptyText(credential.key) : null;
|
|
94
|
+
if (!key) throw new Error("z.ai Pi auth file has a malformed zai credential");
|
|
95
|
+
return key;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/pi/credentials.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\ntype UnknownRecord = Record<string, unknown>;\n\nexport type PiCredentialOptions = {\n env?: NodeJS.ProcessEnv;\n readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;\n};\n\nexport type PiAnthropicCredential = {\n kind: \"oauth\";\n access: string;\n expiresMs: number | null;\n};\n\nexport type PiOpenAiCredential =\n | { kind: \"platform\"; key: string }\n | { kind: \"oauth\"; access: string; accountId: string; expiresMs: number | null };\n\nconst OPENAI_CREDENTIALS_MISSING =\n \"OpenAI credentials not found; set OPENAI_API_KEY, configure the Pi openai provider, or log in to OpenAI via Pi\";\nconst ZAI_CREDENTIAL_MISSING =\n \"z.ai API key not found; set Z_AI_API_KEY or configure Pi provider zai\";\n\nfunction record(value: unknown): UnknownRecord | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as UnknownRecord)\n : null;\n}\n\nfunction nonEmptyText(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction epochMilliseconds(value: unknown): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value) || value <= 0) return null;\n return value > 1e12 ? value : value * 1000;\n}\n\nasync function readPiAuthRoot(options: PiCredentialOptions): Promise<UnknownRecord> {\n const env = options.env ?? process.env;\n const authPath = join(env.HOME || homedir(), \".pi\", \"agent\", \"auth.json\");\n const contents = await (options.readFile ?? readFile)(authPath, \"utf8\");\n const parsed = record(JSON.parse(contents));\n if (!parsed) throw new Error(\"Pi auth file is malformed\");\n return parsed;\n}\n\nexport async function resolvePiAnthropicCredential(\n options: PiCredentialOptions = {},\n): Promise<PiAnthropicCredential> {\n let root: UnknownRecord;\n try {\n root = await readPiAuthRoot(options);\n } catch (error) {\n if (record(error)?.code === \"ENOENT\") {\n throw new Error(\"Pi Anthropic OAuth credentials not found\");\n }\n throw new Error(\"Pi Anthropic auth file is malformed\");\n }\n\n const credential = record(root.anthropic);\n if (!credential) throw new Error(\"Pi Anthropic OAuth credentials not found\");\n const access = credential.type === \"oauth\" ? nonEmptyText(credential.access) : null;\n if (!access) throw new Error(\"Pi Anthropic OAuth credential is malformed\");\n return {\n kind: \"oauth\",\n access,\n expiresMs: epochMilliseconds(credential.expires),\n };\n}\n\nexport async function resolvePiOpenAiCredential(\n options: PiCredentialOptions = {},\n): Promise<PiOpenAiCredential> {\n const env = options.env ?? process.env;\n const environmentKey = nonEmptyText(env.OPENAI_API_KEY);\n if (environmentKey) return { kind: \"platform\", key: environmentKey };\n\n let root: UnknownRecord;\n try {\n root = await readPiAuthRoot(options);\n } catch (error) {\n if (record(error)?.code === \"ENOENT\") throw new Error(OPENAI_CREDENTIALS_MISSING);\n throw new Error(\"OpenAI Pi auth file is malformed\");\n }\n\n const platform = record(root.openai);\n if (platform) {\n const key = platform.type === \"api_key\" ? nonEmptyText(platform.key) : null;\n if (!key) throw new Error(\"OpenAI Pi auth file has a malformed openai credential\");\n return { kind: \"platform\", key };\n }\n\n const oauth = record(root[\"openai-codex\"]);\n const access = oauth?.type === \"oauth\" ? nonEmptyText(oauth.access) : null;\n const accountId = nonEmptyText(oauth?.accountId);\n if (oauth && access && accountId) {\n return {\n kind: \"oauth\",\n access,\n accountId,\n expiresMs: epochMilliseconds(oauth.expires),\n };\n }\n throw new Error(OPENAI_CREDENTIALS_MISSING);\n}\n\nexport async function resolvePiZaiApiKey(options: PiCredentialOptions = {}): Promise<string> {\n const env = options.env ?? process.env;\n const environmentKey = nonEmptyText(env.Z_AI_API_KEY);\n if (environmentKey) return environmentKey;\n\n let root: UnknownRecord;\n try {\n root = await readPiAuthRoot(options);\n } catch (error) {\n if (record(error)?.code === \"ENOENT\") throw new Error(ZAI_CREDENTIAL_MISSING);\n throw new Error(\"z.ai Pi auth file is malformed\");\n }\n\n const credential = record(root.zai);\n if (!credential) throw new Error(ZAI_CREDENTIAL_MISSING);\n const key = credential.type === \"api_key\" ? nonEmptyText(credential.key) : null;\n if (!key) throw new Error(\"z.ai Pi auth file has a malformed zai credential\");\n return key;\n}\n"],"names":["readFile","homedir","join","OPENAI_CREDENTIALS_MISSING","ZAI_CREDENTIAL_MISSING","record","value","Array","isArray","nonEmptyText","trim","epochMilliseconds","Number","isFinite","readPiAuthRoot","options","env","process","authPath","HOME","contents","parsed","JSON","parse","Error","resolvePiAnthropicCredential","root","error","code","credential","anthropic","access","type","kind","expiresMs","expires","resolvePiOpenAiCredential","environmentKey","OPENAI_API_KEY","key","platform","openai","oauth","accountId","resolvePiZaiApiKey","Z_AI_API_KEY","zai"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,mBAAmB;AAC5C,SAASC,OAAO,QAAQ,UAAU;AAClC,SAASC,IAAI,QAAQ,YAAY;AAmBjC,MAAMC,6BACJ;AACF,MAAMC,yBACJ;AAEF,SAASC,OAAOC,KAAc;IAC5B,OAAOA,UAAU,QAAQ,OAAOA,UAAU,YAAY,CAACC,MAAMC,OAAO,CAACF,SAChEA,QACD;AACN;AAEA,SAASG,aAAaH,KAAc;IAClC,OAAO,OAAOA,UAAU,YAAYA,MAAMI,IAAI,KAAKJ,MAAMI,IAAI,KAAK;AACpE;AAEA,SAASC,kBAAkBL,KAAc;IACvC,IAAI,OAAOA,UAAU,YAAY,CAACM,OAAOC,QAAQ,CAACP,UAAUA,SAAS,GAAG,OAAO;IAC/E,OAAOA,QAAQ,OAAOA,QAAQA,QAAQ;AACxC;AAEA,eAAeQ,eAAeC,OAA4B;IACxD,MAAMC,MAAMD,QAAQC,GAAG,IAAIC,QAAQD,GAAG;IACtC,MAAME,WAAWhB,KAAKc,IAAIG,IAAI,IAAIlB,WAAW,OAAO,SAAS;IAC7D,MAAMmB,WAAW,MAAM,AAACL,CAAAA,QAAQf,QAAQ,IAAIA,QAAO,EAAGkB,UAAU;IAChE,MAAMG,SAAShB,OAAOiB,KAAKC,KAAK,CAACH;IACjC,IAAI,CAACC,QAAQ,MAAM,IAAIG,MAAM;IAC7B,OAAOH;AACT;AAEA,OAAO,eAAeI,6BACpBV,UAA+B,CAAC,CAAC;IAEjC,IAAIW;IACJ,IAAI;QACFA,OAAO,MAAMZ,eAAeC;IAC9B,EAAE,OAAOY,OAAO;QACd,IAAItB,OAAOsB,QAAQC,SAAS,UAAU;YACpC,MAAM,IAAIJ,MAAM;QAClB;QACA,MAAM,IAAIA,MAAM;IAClB;IAEA,MAAMK,aAAaxB,OAAOqB,KAAKI,SAAS;IACxC,IAAI,CAACD,YAAY,MAAM,IAAIL,MAAM;IACjC,MAAMO,SAASF,WAAWG,IAAI,KAAK,UAAUvB,aAAaoB,WAAWE,MAAM,IAAI;IAC/E,IAAI,CAACA,QAAQ,MAAM,IAAIP,MAAM;IAC7B,OAAO;QACLS,MAAM;QACNF;QACAG,WAAWvB,kBAAkBkB,WAAWM,OAAO;IACjD;AACF;AAEA,OAAO,eAAeC,0BACpBrB,UAA+B,CAAC,CAAC;IAEjC,MAAMC,MAAMD,QAAQC,GAAG,IAAIC,QAAQD,GAAG;IACtC,MAAMqB,iBAAiB5B,aAAaO,IAAIsB,cAAc;IACtD,IAAID,gBAAgB,OAAO;QAAEJ,MAAM;QAAYM,KAAKF;IAAe;IAEnE,IAAIX;IACJ,IAAI;QACFA,OAAO,MAAMZ,eAAeC;IAC9B,EAAE,OAAOY,OAAO;QACd,IAAItB,OAAOsB,QAAQC,SAAS,UAAU,MAAM,IAAIJ,MAAMrB;QACtD,MAAM,IAAIqB,MAAM;IAClB;IAEA,MAAMgB,WAAWnC,OAAOqB,KAAKe,MAAM;IACnC,IAAID,UAAU;QACZ,MAAMD,MAAMC,SAASR,IAAI,KAAK,YAAYvB,aAAa+B,SAASD,GAAG,IAAI;QACvE,IAAI,CAACA,KAAK,MAAM,IAAIf,MAAM;QAC1B,OAAO;YAAES,MAAM;YAAYM;QAAI;IACjC;IAEA,MAAMG,QAAQrC,OAAOqB,IAAI,CAAC,eAAe;IACzC,MAAMK,SAASW,OAAOV,SAAS,UAAUvB,aAAaiC,MAAMX,MAAM,IAAI;IACtE,MAAMY,YAAYlC,aAAaiC,OAAOC;IACtC,IAAID,SAASX,UAAUY,WAAW;QAChC,OAAO;YACLV,MAAM;YACNF;YACAY;YACAT,WAAWvB,kBAAkB+B,MAAMP,OAAO;QAC5C;IACF;IACA,MAAM,IAAIX,MAAMrB;AAClB;AAEA,OAAO,eAAeyC,mBAAmB7B,UAA+B,CAAC,CAAC;IACxE,MAAMC,MAAMD,QAAQC,GAAG,IAAIC,QAAQD,GAAG;IACtC,MAAMqB,iBAAiB5B,aAAaO,IAAI6B,YAAY;IACpD,IAAIR,gBAAgB,OAAOA;IAE3B,IAAIX;IACJ,IAAI;QACFA,OAAO,MAAMZ,eAAeC;IAC9B,EAAE,OAAOY,OAAO;QACd,IAAItB,OAAOsB,QAAQC,SAAS,UAAU,MAAM,IAAIJ,MAAMpB;QACtD,MAAM,IAAIoB,MAAM;IAClB;IAEA,MAAMK,aAAaxB,OAAOqB,KAAKoB,GAAG;IAClC,IAAI,CAACjB,YAAY,MAAM,IAAIL,MAAMpB;IACjC,MAAMmC,MAAMV,WAAWG,IAAI,KAAK,YAAYvB,aAAaoB,WAAWU,GAAG,IAAI;IAC3E,IAAI,CAACA,KAAK,MAAM,IAAIf,MAAM;IAC1B,OAAOe;AACT"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PiCliProbe.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/harnesses/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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PiPrintAgentService.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/harnesses/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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PiPrintProtocol.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/harnesses/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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PiPrintRunner.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/harnesses/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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PiStreamParser.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/harnesses/pi/durable/PiStreamParser.ts"],"sourcesContent":["import { PiPrintError } from \"../../../durable/DurableAgent.js\";\nimport { LineBuffer, type ChildCloseResult } from \"../../../durable/utils.js\";\nimport { readPiAssistantText, readPiSessionId } from \"./PiPrintProtocol.js\";\n\nexport class PiStreamParser {\n private readonly lines: LineBuffer;\n private sessionId: string | null = null;\n private ended = false;\n private readonly messages: string[] = [];\n private failure: PiPrintError | null = null;\n\n constructor(\n private readonly expectedSessionId: string,\n maxLineBytes: number,\n ) {\n this.lines = new LineBuffer(\n maxLineBytes,\n () => new PiPrintError(\"Pi stream line exceeded the safety limit.\", \"PI_PROTOCOL\"),\n );\n }\n\n hasFailed(): boolean {\n return this.failure !== null;\n }\n\n accept(chunk: Buffer | string): void {\n for (const line of this.lines.accept(chunk)) {\n if (line.length === 0) continue;\n this.acceptLine(line);\n }\n }\n\n fail(error: unknown): void {\n this.failure =\n error instanceof PiPrintError\n ? error\n : new PiPrintError(\"Pi stream processing failed.\", \"PI_PROTOCOL\");\n }\n\n result(close: ChildCloseResult): {\n sessionId: string;\n result: string;\n messages: string[];\n exitCode: number;\n } {\n if (this.failure) throw this.failure;\n this.lines.assertComplete(\n () => new PiPrintError(\"Pi stream ended with incomplete JSON.\", \"PI_PROTOCOL\"),\n );\n if (close.code !== 0) {\n throw new PiPrintError(\n `Pi print run failed${close.signal ? ` (${close.signal})` : \".\"}`,\n \"PI_PROCESS\",\n );\n }\n if (this.sessionId === null) {\n throw new PiPrintError(\"Pi stream ended without a session identity.\", \"PI_PROTOCOL\");\n }\n if (!this.ended)\n throw new PiPrintError(\"Pi stream ended before agent completion.\", \"PI_PROTOCOL\");\n if (this.messages.length === 0) {\n throw new PiPrintError(\"Pi stream ended without an assistant result.\", \"PI_RESULT_MISSING\");\n }\n return {\n sessionId: this.sessionId,\n result: this.messages.at(-1)!,\n messages: this.messages,\n exitCode: close.code,\n };\n }\n\n private acceptLine(line: Buffer): void {\n let value: unknown;\n try {\n value = JSON.parse(line.toString(\"utf8\"));\n } catch {\n throw new PiPrintError(\"Pi emitted malformed stream JSON.\", \"PI_PROTOCOL\");\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new PiPrintError(\"Pi emitted a non-object stream message.\", \"PI_PROTOCOL\");\n }\n const event = value as Record<string, unknown>;\n if (event.type === \"session\") {\n this.sessionId = readPiSessionId(event, this.sessionId, this.expectedSessionId);\n return;\n }\n if (event.type === \"agent_end\") {\n this.ended = true;\n return;\n }\n const text = readPiAssistantText(event);\n if (text !== null) this.messages.push(text);\n }\n}\n"],"names":["PiPrintError","LineBuffer","readPiAssistantText","readPiSessionId","PiStreamParser","lines","sessionId","ended","messages","failure","expectedSessionId","maxLineBytes","hasFailed","accept","chunk","line","length","acceptLine","fail","error","result","close","assertComplete","code","signal","at","exitCode","value","JSON","parse","toString","Array","isArray","event","type","text","push"],"mappings":"AAAA,SAASA,YAAY,QAAQ,mCAAmC;AAChE,SAASC,UAAU,QAA+B,4BAA4B;AAC9E,SAASC,mBAAmB,EAAEC,eAAe,QAAQ,uBAAuB;AAE5E,OAAO,MAAMC;;IACMC,MAAkB;IAC3BC,YAA2B,KAAK;IAChCC,QAAQ,MAAM;IACLC,WAAqB,EAAE,CAAC;IACjCC,UAA+B,KAAK;IAE5C,YACE,AAAiBC,iBAAyB,EAC1CC,YAAoB,CACpB;aAFiBD,oBAAAA;QAGjB,IAAI,CAACL,KAAK,GAAG,IAAIJ,WACfU,cACA,IAAM,IAAIX,aAAa,6CAA6C;IAExE;IAEAY,YAAqB;QACnB,OAAO,IAAI,CAACH,OAAO,KAAK;IAC1B;IAEAI,OAAOC,KAAsB,EAAQ;QACnC,KAAK,MAAMC,QAAQ,IAAI,CAACV,KAAK,CAACQ,MAAM,CAACC,OAAQ;YAC3C,IAAIC,KAAKC,MAAM,KAAK,GAAG;YACvB,IAAI,CAACC,UAAU,CAACF;QAClB;IACF;IAEAG,KAAKC,KAAc,EAAQ;QACzB,IAAI,CAACV,OAAO,GACVU,iBAAiBnB,eACbmB,QACA,IAAInB,aAAa,gCAAgC;IACzD;IAEAoB,OAAOC,KAAuB,EAK5B;QACA,IAAI,IAAI,CAACZ,OAAO,EAAE,MAAM,IAAI,CAACA,OAAO;QACpC,IAAI,CAACJ,KAAK,CAACiB,cAAc,CACvB,IAAM,IAAItB,aAAa,yCAAyC;QAElE,IAAIqB,MAAME,IAAI,KAAK,GAAG;YACpB,MAAM,IAAIvB,aACR,CAAC,mBAAmB,EAAEqB,MAAMG,MAAM,GAAG,CAAC,EAAE,EAAEH,MAAMG,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,EACjE;QAEJ;QACA,IAAI,IAAI,CAAClB,SAAS,KAAK,MAAM;YAC3B,MAAM,IAAIN,aAAa,+CAA+C;QACxE;QACA,IAAI,CAAC,IAAI,CAACO,KAAK,EACb,MAAM,IAAIP,aAAa,4CAA4C;QACrE,IAAI,IAAI,CAACQ,QAAQ,CAACQ,MAAM,KAAK,GAAG;YAC9B,MAAM,IAAIhB,aAAa,gDAAgD;QACzE;QACA,OAAO;YACLM,WAAW,IAAI,CAACA,SAAS;YACzBc,QAAQ,IAAI,CAACZ,QAAQ,CAACiB,EAAE,CAAC,CAAC;YAC1BjB,UAAU,IAAI,CAACA,QAAQ;YACvBkB,UAAUL,MAAME,IAAI;QACtB;IACF;IAEQN,WAAWF,IAAY,EAAQ;QACrC,IAAIY;QACJ,IAAI;YACFA,QAAQC,KAAKC,KAAK,CAACd,KAAKe,QAAQ,CAAC;QACnC,EAAE,OAAM;YACN,MAAM,IAAI9B,aAAa,qCAAqC;QAC9D;QACA,IAAI,CAAC2B,SAAS,OAAOA,UAAU,YAAYI,MAAMC,OAAO,CAACL,QAAQ;YAC/D,MAAM,IAAI3B,aAAa,2CAA2C;QACpE;QACA,MAAMiC,QAAQN;QACd,IAAIM,MAAMC,IAAI,KAAK,WAAW;YAC5B,IAAI,CAAC5B,SAAS,GAAGH,gBAAgB8B,OAAO,IAAI,CAAC3B,SAAS,EAAE,IAAI,CAACI,iBAAiB;YAC9E;QACF;QACA,IAAIuB,MAAMC,IAAI,KAAK,aAAa;YAC9B,IAAI,CAAC3B,KAAK,GAAG;YACb;QACF;QACA,MAAM4B,OAAOjC,oBAAoB+B;QACjC,IAAIE,SAAS,MAAM,IAAI,CAAC3B,QAAQ,CAAC4B,IAAI,CAACD;IACxC;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/pi/readiness.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,uBAAuB,EAGxB,MAAM,uBAAuB,CAAC;AAsF/B,eAAO,MAAM,WAAW,EAAE,uBAIzB,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { displayHome, mappingCheck, nonEmpty, record, worstReadinessStatus } from "../readiness/checks.js";
|
|
3
|
+
function providerNames(parsed) {
|
|
4
|
+
const names = new Set();
|
|
5
|
+
if (nonEmpty(parsed.provider)) names.add(parsed.provider.trim());
|
|
6
|
+
const providers = record(parsed.providers);
|
|
7
|
+
if (providers) {
|
|
8
|
+
for (const name of Object.keys(providers)){
|
|
9
|
+
if (name.trim()) names.add(name);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
for (const [name, value] of Object.entries(parsed)){
|
|
13
|
+
if (name === "provider" || name === "providers") continue;
|
|
14
|
+
if (record(value) && name.trim()) names.add(name);
|
|
15
|
+
}
|
|
16
|
+
return [
|
|
17
|
+
...names
|
|
18
|
+
].sort();
|
|
19
|
+
}
|
|
20
|
+
async function authCheck(runtime) {
|
|
21
|
+
const sourcePath = join(runtime.homeDir, ".pi", "agent", "auth.json");
|
|
22
|
+
try {
|
|
23
|
+
const parsed = record(JSON.parse(await runtime.readFile(sourcePath)));
|
|
24
|
+
if (!parsed) throw new Error("invalid");
|
|
25
|
+
const availableProviders = providerNames(parsed);
|
|
26
|
+
const provider = nonEmpty(parsed.provider) ? parsed.provider.trim() : null;
|
|
27
|
+
const authenticated = availableProviders.length > 0;
|
|
28
|
+
return {
|
|
29
|
+
state: authenticated ? "authenticated" : "unauthenticated",
|
|
30
|
+
source: displayHome(sourcePath, runtime.homeDir),
|
|
31
|
+
provider,
|
|
32
|
+
availableProviders,
|
|
33
|
+
status: authenticated ? "pass" : "fail",
|
|
34
|
+
errors: authenticated ? [] : [
|
|
35
|
+
"Pi credential file has no configured model provider"
|
|
36
|
+
]
|
|
37
|
+
};
|
|
38
|
+
} catch {
|
|
39
|
+
return {
|
|
40
|
+
state: "unauthenticated",
|
|
41
|
+
source: displayHome(sourcePath, runtime.homeDir),
|
|
42
|
+
provider: null,
|
|
43
|
+
availableProviders: [],
|
|
44
|
+
status: "fail",
|
|
45
|
+
errors: [
|
|
46
|
+
"Pi credential file is missing or invalid"
|
|
47
|
+
]
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function isSessionTrackerListed(output) {
|
|
52
|
+
const normalized = output.toLowerCase();
|
|
53
|
+
return normalized.includes("@ai-devkit/pi-session-tracker") || /\bsession[\s-]+tracker\b/.test(normalized);
|
|
54
|
+
}
|
|
55
|
+
async function integrationCheck(runtime) {
|
|
56
|
+
let installed = false;
|
|
57
|
+
try {
|
|
58
|
+
const result = await runtime.runCommand("pi", [
|
|
59
|
+
"list"
|
|
60
|
+
]);
|
|
61
|
+
installed = isSessionTrackerListed(result.stdout);
|
|
62
|
+
} catch {
|
|
63
|
+
// Safe fixed result below.
|
|
64
|
+
}
|
|
65
|
+
const mapping = await mappingCheck(join(runtime.homeDir, ".pi", "agent", "sessions.json"), runtime);
|
|
66
|
+
const mappingStatus = mapping.valid || !mapping.present ? "pass" : "fail";
|
|
67
|
+
const status = worstReadinessStatus([
|
|
68
|
+
installed ? "pass" : "fail",
|
|
69
|
+
mappingStatus
|
|
70
|
+
]);
|
|
71
|
+
return {
|
|
72
|
+
label: "ai-devkit plugin",
|
|
73
|
+
installed,
|
|
74
|
+
status,
|
|
75
|
+
errors: [
|
|
76
|
+
...!installed ? [
|
|
77
|
+
"Pi session tracker is not registered"
|
|
78
|
+
] : [],
|
|
79
|
+
...mappingStatus === "fail" ? mapping.errors : []
|
|
80
|
+
],
|
|
81
|
+
details: {
|
|
82
|
+
package: "@ai-devkit/pi-session-tracker",
|
|
83
|
+
registryPath: mapping.path,
|
|
84
|
+
registryValid: mapping.valid,
|
|
85
|
+
invalidEntries: mapping.invalidEntries,
|
|
86
|
+
staleEntries: mapping.staleEntries
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export const piReadiness = {
|
|
91
|
+
configDir: ".pi",
|
|
92
|
+
auth: authCheck,
|
|
93
|
+
integration: integrationCheck
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
//# sourceMappingURL=readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/pi/readiness.ts"],"sourcesContent":["import { join } from \"node:path\";\nimport {\n displayHome,\n mappingCheck,\n nonEmpty,\n record,\n worstReadinessStatus,\n} from \"../readiness/checks.js\";\nimport type {\n AuthReadinessCheck,\n HarnessReadinessProfile,\n IntegrationReadinessCheck,\n ReadinessRuntime,\n} from \"../readiness/types.js\";\n\nfunction providerNames(parsed: Record<string, unknown>): string[] {\n const names = new Set<string>();\n if (nonEmpty(parsed.provider)) names.add((parsed.provider as string).trim());\n const providers = record(parsed.providers);\n if (providers) {\n for (const name of Object.keys(providers)) {\n if (name.trim()) names.add(name);\n }\n }\n for (const [name, value] of Object.entries(parsed)) {\n if (name === \"provider\" || name === \"providers\") continue;\n if (record(value) && name.trim()) names.add(name);\n }\n return [...names].sort();\n}\n\nasync function authCheck(runtime: ReadinessRuntime): Promise<AuthReadinessCheck> {\n const sourcePath = join(runtime.homeDir, \".pi\", \"agent\", \"auth.json\");\n try {\n const parsed = record(JSON.parse(await runtime.readFile(sourcePath)));\n if (!parsed) throw new Error(\"invalid\");\n const availableProviders = providerNames(parsed);\n const provider = nonEmpty(parsed.provider) ? (parsed.provider as string).trim() : null;\n const authenticated = availableProviders.length > 0;\n return {\n state: authenticated ? \"authenticated\" : \"unauthenticated\",\n source: displayHome(sourcePath, runtime.homeDir),\n provider,\n availableProviders,\n status: authenticated ? \"pass\" : \"fail\",\n errors: authenticated ? [] : [\"Pi credential file has no configured model provider\"],\n };\n } catch {\n return {\n state: \"unauthenticated\",\n source: displayHome(sourcePath, runtime.homeDir),\n provider: null,\n availableProviders: [],\n status: \"fail\",\n errors: [\"Pi credential file is missing or invalid\"],\n };\n }\n}\n\nfunction isSessionTrackerListed(output: string): boolean {\n const normalized = output.toLowerCase();\n return (\n normalized.includes(\"@ai-devkit/pi-session-tracker\") ||\n /\\bsession[\\s-]+tracker\\b/.test(normalized)\n );\n}\n\nasync function integrationCheck(runtime: ReadinessRuntime): Promise<IntegrationReadinessCheck> {\n let installed = false;\n try {\n const result = await runtime.runCommand(\"pi\", [\"list\"]);\n installed = isSessionTrackerListed(result.stdout);\n } catch {\n // Safe fixed result below.\n }\n const mapping = await mappingCheck(\n join(runtime.homeDir, \".pi\", \"agent\", \"sessions.json\"),\n runtime,\n );\n const mappingStatus = mapping.valid || !mapping.present ? \"pass\" : \"fail\";\n const status = worstReadinessStatus([installed ? \"pass\" : \"fail\", mappingStatus]);\n return {\n label: \"ai-devkit plugin\",\n installed,\n status,\n errors: [\n ...(!installed ? [\"Pi session tracker is not registered\"] : []),\n ...(mappingStatus === \"fail\" ? mapping.errors : []),\n ],\n details: {\n package: \"@ai-devkit/pi-session-tracker\",\n registryPath: mapping.path,\n registryValid: mapping.valid,\n invalidEntries: mapping.invalidEntries,\n staleEntries: mapping.staleEntries,\n },\n };\n}\n\nexport const piReadiness: HarnessReadinessProfile = {\n configDir: \".pi\",\n auth: authCheck,\n integration: integrationCheck,\n};\n"],"names":["join","displayHome","mappingCheck","nonEmpty","record","worstReadinessStatus","providerNames","parsed","names","Set","provider","add","trim","providers","name","Object","keys","value","entries","sort","authCheck","runtime","sourcePath","homeDir","JSON","parse","readFile","Error","availableProviders","authenticated","length","state","source","status","errors","isSessionTrackerListed","output","normalized","toLowerCase","includes","test","integrationCheck","installed","result","runCommand","stdout","mapping","mappingStatus","valid","present","label","details","package","registryPath","path","registryValid","invalidEntries","staleEntries","piReadiness","configDir","auth","integration"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type AgentReadinessOptions, type AgentReadinessReport, type ReadinessAgentType } from "./types.js";
|
|
2
|
+
export declare function getAgentReadinessReport(agent: ReadinessAgentType, options?: AgentReadinessOptions): Promise<AgentReadinessReport>;
|
|
3
|
+
export declare function getAgentReadinessReports(options?: AgentReadinessOptions): Promise<Record<ReadinessAgentType, AgentReadinessReport>>;
|
|
4
|
+
export { worstReadinessStatus } from "./checks.js";
|
|
5
|
+
export type { AgentReadinessOptions, AgentReadinessReport, ReadinessAgentType, ReadinessStatus, } from "./types.js";
|
|
6
|
+
//# sourceMappingURL=AgentReadiness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentReadiness.d.ts","sourceRoot":"","sources":["../../../src/harnesses/readiness/AgentReadiness.ts"],"names":[],"mappings":"AAYA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EAEzB,KAAK,kBAAkB,EAExB,MAAM,YAAY,CAAC;AAcpB,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAE/B;AA8BD,wBAAsB,wBAAwB,CAC5C,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,MAAM,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAAC,CAQ3D;AAED,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { claudeReadiness } from "../claude/readiness.js";
|
|
2
|
+
import { codexReadiness } from "../codex/readiness.js";
|
|
3
|
+
import { copilotReadiness } from "../copilot/readiness.js";
|
|
4
|
+
import { openCodeReadiness } from "../opencode/readiness.js";
|
|
5
|
+
import { piReadiness } from "../pi/readiness.js";
|
|
6
|
+
import { builtInSkillsCheck, createReadinessRuntime, directoryCheck, executableCheck, worstReadinessStatus } from "./checks.js";
|
|
7
|
+
import { READINESS_AGENT_TYPES } from "./types.js";
|
|
8
|
+
const READINESS_PROFILES = {
|
|
9
|
+
claude: claudeReadiness,
|
|
10
|
+
codex: codexReadiness,
|
|
11
|
+
gemini_cli: {
|
|
12
|
+
configDir: ".gemini"
|
|
13
|
+
},
|
|
14
|
+
grok_cli: {
|
|
15
|
+
configDir: ".grok"
|
|
16
|
+
},
|
|
17
|
+
kiro: {
|
|
18
|
+
configDir: ".kiro"
|
|
19
|
+
},
|
|
20
|
+
antigravity_cli: {
|
|
21
|
+
configDir: ".gemini/antigravity-cli"
|
|
22
|
+
},
|
|
23
|
+
opencode: openCodeReadiness,
|
|
24
|
+
copilot: copilotReadiness,
|
|
25
|
+
pi: piReadiness
|
|
26
|
+
};
|
|
27
|
+
export async function getAgentReadinessReport(agent, options = {}) {
|
|
28
|
+
return agentReadiness(agent, createReadinessRuntime(options));
|
|
29
|
+
}
|
|
30
|
+
async function agentReadiness(agent, runtime) {
|
|
31
|
+
const profile = READINESS_PROFILES[agent];
|
|
32
|
+
const [executable, globalConfig, builtInSkills, auth, integration] = await Promise.all([
|
|
33
|
+
executableCheck(agent, runtime),
|
|
34
|
+
directoryCheck(profile.configDir, runtime),
|
|
35
|
+
builtInSkillsCheck(agent, runtime),
|
|
36
|
+
profile.auth?.(runtime),
|
|
37
|
+
profile.integration?.(runtime)
|
|
38
|
+
]);
|
|
39
|
+
return {
|
|
40
|
+
type: agent,
|
|
41
|
+
executable,
|
|
42
|
+
globalConfig,
|
|
43
|
+
builtInSkills,
|
|
44
|
+
auth,
|
|
45
|
+
integration,
|
|
46
|
+
status: worstReadinessStatus([
|
|
47
|
+
executable.status,
|
|
48
|
+
globalConfig.status,
|
|
49
|
+
...auth ? [
|
|
50
|
+
auth.status
|
|
51
|
+
] : [],
|
|
52
|
+
...integration ? [
|
|
53
|
+
integration.status
|
|
54
|
+
] : []
|
|
55
|
+
])
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export async function getAgentReadinessReports(options = {}) {
|
|
59
|
+
const runtime = createReadinessRuntime(options);
|
|
60
|
+
const entries = await Promise.all(READINESS_AGENT_TYPES.map(async (agent)=>[
|
|
61
|
+
agent,
|
|
62
|
+
await agentReadiness(agent, runtime)
|
|
63
|
+
]));
|
|
64
|
+
return Object.fromEntries(entries);
|
|
65
|
+
}
|
|
66
|
+
export { worstReadinessStatus } from "./checks.js";
|
|
67
|
+
|
|
68
|
+
//# sourceMappingURL=AgentReadiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/readiness/AgentReadiness.ts"],"sourcesContent":["import { claudeReadiness } from \"../claude/readiness.js\";\nimport { codexReadiness } from \"../codex/readiness.js\";\nimport { copilotReadiness } from \"../copilot/readiness.js\";\nimport { openCodeReadiness } from \"../opencode/readiness.js\";\nimport { piReadiness } from \"../pi/readiness.js\";\nimport {\n builtInSkillsCheck,\n createReadinessRuntime,\n directoryCheck,\n executableCheck,\n worstReadinessStatus,\n} from \"./checks.js\";\nimport {\n READINESS_AGENT_TYPES,\n type AgentReadinessOptions,\n type AgentReadinessReport,\n type HarnessReadinessProfile,\n type ReadinessAgentType,\n type ReadinessRuntime,\n} from \"./types.js\";\n\nconst READINESS_PROFILES: Record<ReadinessAgentType, HarnessReadinessProfile> = {\n claude: claudeReadiness,\n codex: codexReadiness,\n gemini_cli: { configDir: \".gemini\" },\n grok_cli: { configDir: \".grok\" },\n kiro: { configDir: \".kiro\" },\n antigravity_cli: { configDir: \".gemini/antigravity-cli\" },\n opencode: openCodeReadiness,\n copilot: copilotReadiness,\n pi: piReadiness,\n};\n\nexport async function getAgentReadinessReport(\n agent: ReadinessAgentType,\n options: AgentReadinessOptions = {},\n): Promise<AgentReadinessReport> {\n return agentReadiness(agent, createReadinessRuntime(options));\n}\n\nasync function agentReadiness(\n agent: ReadinessAgentType,\n runtime: ReadinessRuntime,\n): Promise<AgentReadinessReport> {\n const profile = READINESS_PROFILES[agent];\n const [executable, globalConfig, builtInSkills, auth, integration] = await Promise.all([\n executableCheck(agent, runtime),\n directoryCheck(profile.configDir, runtime),\n builtInSkillsCheck(agent, runtime),\n profile.auth?.(runtime),\n profile.integration?.(runtime),\n ]);\n return {\n type: agent,\n executable,\n globalConfig,\n builtInSkills,\n auth,\n integration,\n status: worstReadinessStatus([\n executable.status,\n globalConfig.status,\n ...(auth ? [auth.status] : []),\n ...(integration ? [integration.status] : []),\n ]),\n };\n}\n\nexport async function getAgentReadinessReports(\n options: AgentReadinessOptions = {},\n): Promise<Record<ReadinessAgentType, AgentReadinessReport>> {\n const runtime = createReadinessRuntime(options);\n const entries = await Promise.all(\n READINESS_AGENT_TYPES.map(\n async (agent) => [agent, await agentReadiness(agent, runtime)] as const,\n ),\n );\n return Object.fromEntries(entries) as Record<ReadinessAgentType, AgentReadinessReport>;\n}\n\nexport { worstReadinessStatus } from \"./checks.js\";\nexport type {\n AgentReadinessOptions,\n AgentReadinessReport,\n ReadinessAgentType,\n ReadinessStatus,\n} from \"./types.js\";\n"],"names":["claudeReadiness","codexReadiness","copilotReadiness","openCodeReadiness","piReadiness","builtInSkillsCheck","createReadinessRuntime","directoryCheck","executableCheck","worstReadinessStatus","READINESS_AGENT_TYPES","READINESS_PROFILES","claude","codex","gemini_cli","configDir","grok_cli","kiro","antigravity_cli","opencode","copilot","pi","getAgentReadinessReport","agent","options","agentReadiness","runtime","profile","executable","globalConfig","builtInSkills","auth","integration","Promise","all","type","status","getAgentReadinessReports","entries","map","Object","fromEntries"],"mappings":"AAAA,SAASA,eAAe,QAAQ,yBAAyB;AACzD,SAASC,cAAc,QAAQ,wBAAwB;AACvD,SAASC,gBAAgB,QAAQ,0BAA0B;AAC3D,SAASC,iBAAiB,QAAQ,2BAA2B;AAC7D,SAASC,WAAW,QAAQ,qBAAqB;AACjD,SACEC,kBAAkB,EAClBC,sBAAsB,EACtBC,cAAc,EACdC,eAAe,EACfC,oBAAoB,QACf,cAAc;AACrB,SACEC,qBAAqB,QAMhB,aAAa;AAEpB,MAAMC,qBAA0E;IAC9EC,QAAQZ;IACRa,OAAOZ;IACPa,YAAY;QAAEC,WAAW;IAAU;IACnCC,UAAU;QAAED,WAAW;IAAQ;IAC/BE,MAAM;QAAEF,WAAW;IAAQ;IAC3BG,iBAAiB;QAAEH,WAAW;IAA0B;IACxDI,UAAUhB;IACViB,SAASlB;IACTmB,IAAIjB;AACN;AAEA,OAAO,eAAekB,wBACpBC,KAAyB,EACzBC,UAAiC,CAAC,CAAC;IAEnC,OAAOC,eAAeF,OAAOjB,uBAAuBkB;AACtD;AAEA,eAAeC,eACbF,KAAyB,EACzBG,OAAyB;IAEzB,MAAMC,UAAUhB,kBAAkB,CAACY,MAAM;IACzC,MAAM,CAACK,YAAYC,cAAcC,eAAeC,MAAMC,YAAY,GAAG,MAAMC,QAAQC,GAAG,CAAC;QACrF1B,gBAAgBe,OAAOG;QACvBnB,eAAeoB,QAAQZ,SAAS,EAAEW;QAClCrB,mBAAmBkB,OAAOG;QAC1BC,QAAQI,IAAI,GAAGL;QACfC,QAAQK,WAAW,GAAGN;KACvB;IACD,OAAO;QACLS,MAAMZ;QACNK;QACAC;QACAC;QACAC;QACAC;QACAI,QAAQ3B,qBAAqB;YAC3BmB,WAAWQ,MAAM;YACjBP,aAAaO,MAAM;eACfL,OAAO;gBAACA,KAAKK,MAAM;aAAC,GAAG,EAAE;eACzBJ,cAAc;gBAACA,YAAYI,MAAM;aAAC,GAAG,EAAE;SAC5C;IACH;AACF;AAEA,OAAO,eAAeC,yBACpBb,UAAiC,CAAC,CAAC;IAEnC,MAAME,UAAUpB,uBAAuBkB;IACvC,MAAMc,UAAU,MAAML,QAAQC,GAAG,CAC/BxB,sBAAsB6B,GAAG,CACvB,OAAOhB,QAAU;YAACA;YAAO,MAAME,eAAeF,OAAOG;SAAS;IAGlE,OAAOc,OAAOC,WAAW,CAACH;AAC5B;AAEA,SAAS7B,oBAAoB,QAAQ,cAAc"}
|