@ai-devkit/agent-manager 0.35.0 → 0.37.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 -4
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +21 -2
- 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/claude.test.js +485 -0
- package/dist/__tests__/capacity/claude.test.js.map +1 -0
- package/dist/__tests__/capacity/openai.test.js +670 -0
- package/dist/__tests__/capacity/openai.test.js.map +1 -0
- package/dist/__tests__/capacity/wham.test.js +144 -0
- package/dist/__tests__/capacity/wham.test.js.map +1 -0
- 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__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
- package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
- package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
- package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
- 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__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
- package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
- package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
- 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__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
- 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__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
- package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
- package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
- package/dist/__tests__/readiness/AgentReadiness.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__/utils/IncrementalJsonlSummary.test.js +650 -0
- package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
- package/dist/__tests__/utils/agents.test.js +72 -2
- package/dist/__tests__/utils/agents.test.js.map +1 -1
- 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/claude.d.ts +17 -0
- package/dist/capacity/claude.d.ts.map +1 -0
- package/dist/capacity/claude.js +271 -0
- package/dist/capacity/claude.js.map +1 -0
- package/dist/capacity/codex.d.ts +1 -2
- package/dist/capacity/codex.d.ts.map +1 -1
- package/dist/capacity/codex.js +5 -47
- package/dist/capacity/codex.js.map +1 -1
- package/dist/capacity/index.d.ts +11 -0
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +17 -0
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/openai.d.ts +47 -0
- package/dist/capacity/openai.d.ts.map +1 -0
- package/dist/capacity/openai.js +307 -0
- package/dist/capacity/openai.js.map +1 -0
- package/dist/capacity/wham.d.ts +16 -0
- package/dist/capacity/wham.d.ts.map +1 -0
- package/dist/capacity/wham.js +66 -0
- package/dist/capacity/wham.js.map +1 -0
- 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/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
- package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
- package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
- package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
- package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
- package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
- package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
- package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
- package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
- 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/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
- 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/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
- package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
- package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
- package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
- package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
- 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/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
- package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
- package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
- 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/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
- 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/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
- package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
- package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
- package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
- 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/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
- package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
- package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
- package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
- package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
- package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
- package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
- package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
- package/dist/harnesses/pi/PiAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
- 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/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
- package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
- package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
- 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 +28 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -16
- package/dist/index.js.map +1 -1
- package/dist/readiness/AgentReadiness.d.ts +1 -1
- package/dist/readiness/AgentReadiness.d.ts.map +1 -1
- package/dist/readiness/AgentReadiness.js.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.js +3 -1
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
- package/dist/runtime/herdr/HerdrAgentDiscovery.js +10 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
- 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/agents.d.ts +3 -2
- package/dist/utils/agents.d.ts.map +1 -1
- package/dist/utils/agents.js +61 -15
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- 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 +26 -5
- 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/claude.test.ts +467 -0
- package/src/__tests__/capacity/fixtures/claude-credentials.json +7 -0
- package/src/__tests__/capacity/fixtures/claude-usage-malformed.json +1 -0
- package/src/__tests__/capacity/fixtures/claude-usage-partial.json +15 -0
- package/src/__tests__/capacity/fixtures/claude-usage.json +63 -0
- package/src/__tests__/capacity/fixtures/openai-auth.json +6 -0
- package/src/__tests__/capacity/fixtures/openai-codex-auth.json +9 -0
- package/src/__tests__/capacity/fixtures/openai-usage-completions.json +67 -0
- package/src/__tests__/capacity/fixtures/openai-usage-responses.json +20 -0
- package/src/__tests__/capacity/fixtures/wham-usage.json +32 -0
- package/src/__tests__/capacity/openai.test.ts +560 -0
- package/src/__tests__/capacity/wham.test.ts +104 -0
- 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__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
- package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
- package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
- package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
- package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
- package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
- package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
- package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
- package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
- package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
- package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
- package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
- package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
- package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
- package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
- package/src/__tests__/harnesses/kiro/KiroAdapter.test.ts +552 -0
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
- package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
- package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
- package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
- package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
- package/src/__tests__/utils/agents.test.ts +83 -2
- 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 -12
- package/src/capacity/claude.ts +313 -0
- package/src/capacity/codex.ts +25 -134
- package/src/capacity/index.ts +33 -4
- package/src/capacity/openai.ts +355 -0
- package/src/capacity/wham.ts +84 -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/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
- package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
- package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
- package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
- package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
- package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
- package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
- package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
- package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
- package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
- package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
- package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
- package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
- package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
- package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
- package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
- package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
- package/src/harnesses/gemini/fileSignature.ts +10 -0
- package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
- package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
- package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
- 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/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
- package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
- package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
- package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
- package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
- package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
- package/src/harnesses/pi/PiSessionLocator.ts +288 -0
- package/src/harnesses/pi/PiSessionParser.ts +488 -0
- package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
- package/src/harnesses/shared.ts +119 -0
- package/src/index.ts +34 -23
- package/src/readiness/AgentReadiness.ts +4 -1
- package/src/runtime/ManagedAgentRuntime.ts +2 -0
- package/src/runtime/herdr/HerdrAgentDiscovery.ts +5 -1
- package/src/utils/IncrementalJsonlSummary.ts +306 -0
- package/src/utils/agents.ts +62 -20
- package/src/utils/index.ts +2 -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/ClaudeCodeAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.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/gemini/GeminiCliAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -10
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -10
- package/dist/adapters/index.js.map +0 -1
- package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
- package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
- package/dist/providers/codex/CodexAdapter.js.map +0 -1
- 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.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.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
- 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.js.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
- 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.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.js.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
- 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.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
- package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
- package/dist/providers/pi/PiAdapter.js.map +0 -1
- 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.js.map +0 -1
- package/src/__tests__/fixtures/fake-claude.cjs +0 -31
- package/src/__tests__/fixtures/fake-codex.cjs +0 -56
- package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
- package/src/adapters/index.ts +0 -15
- package/src/providers/codex/CodexSessionLocator.ts +0 -279
- package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
- package/src/providers/copilot/CopilotSessionParser.ts +0 -289
- package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
- package/src/providers/grok/GrokSessionParser.ts +0 -166
- package/src/providers/pi/PiSessionLocator.ts +0 -110
- package/src/providers/pi/PiSessionParser.ts +0 -284
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.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/PiCliProbe.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/readiness/AgentReadiness.ts"],"sourcesContent":["import { constants } from \"node:fs\";\nimport { access as fsAccess, readFile as fsReadFile } from \"node:fs/promises\";\nimport { execFile } from \"node:child_process\";\nimport { delimiter, join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { getCodexCapacityReport } from \"../capacity/index.js\";\nimport { AGENTS, type StartableAgentType } from \"../utils/agents.js\";\n\nconst execFileAsync = promisify(execFile);\nconst READINESS_AGENT_TYPES = [\"claude\", \"codex\", \"copilot\", \"grok_cli\", \"opencode\", \"pi\"] as const;\nconst ANSI_ESCAPE_PATTERN = new RegExp(`${String.fromCharCode(27)}\\\\[[0-?]*[ -/]*[@-~]`, \"g\");\n\nexport type ReadinessStatus = \"pass\" | \"warn\" | \"fail\";\nexport type ReadinessAuthState = \"authenticated\" | \"unauthenticated\" | \"unknown\";\nexport type ReadinessAgentType = Exclude<StartableAgentType, \"gemini_cli\">;\ntype ReadinessInfoStatus = ReadinessStatus | \"info\";\n\ntype CommandResult = { stdout: string; stderr: string };\ntype ReadFile = (target: string) => Promise<string>;\ntype Access = (target: string, mode?: number) => Promise<void>;\ntype RunCommand = (command: string, args: string[]) => Promise<CommandResult>;\n\nexport interface ReadinessCheck<S extends ReadinessInfoStatus = ReadinessStatus> {\n status: S;\n errors: string[];\n}\n\nexport interface ExecutableReadinessCheck extends ReadinessCheck {\n command: string;\n path: string | null;\n}\n\nexport interface DirectoryReadinessCheck extends ReadinessCheck {\n path: string;\n present: boolean;\n readable: boolean;\n}\n\nexport interface BuiltInSkillsReadinessCheck extends ReadinessCheck<\"info\"> {\n path: string | null;\n required: number;\n present: number;\n missing: string[];\n}\n\nexport interface AuthReadinessCheck extends ReadinessCheck {\n state: ReadinessAuthState;\n source: string;\n provider: string | null;\n availableProviders: string[];\n}\n\nexport interface IntegrationReadinessCheck extends ReadinessCheck {\n label: string;\n installed: boolean;\n details?: Record<string, unknown>;\n}\n\nexport interface AgentReadinessReport {\n type: ReadinessAgentType;\n executable: ExecutableReadinessCheck;\n globalConfig: DirectoryReadinessCheck;\n builtInSkills: BuiltInSkillsReadinessCheck;\n auth?: AuthReadinessCheck;\n integration?: IntegrationReadinessCheck;\n status: ReadinessStatus;\n}\n\nexport interface AgentReadinessOptions {\n homeDir?: string;\n path?: string;\n assetRoot?: string;\n builtInSkillNames?: readonly string[];\n skillRoots?: Partial<Record<ReadinessAgentType, string>>;\n readFile?: ReadFile;\n access?: Access;\n runCommand?: RunCommand;\n codexAuth?: () => Promise<boolean | null>;\n}\n\ntype Runtime = Required<\n Omit<AgentReadinessOptions, \"assetRoot\" | \"builtInSkillNames\" | \"skillRoots\">\n> & {\n assetRoot: string | null;\n builtInSkillNames: readonly string[];\n skillRoots: Partial<Record<ReadinessAgentType, string>>;\n};\n\nconst AGENT_HOME_DIRS: Record<ReadinessAgentType, string> = {\n claude: \".claude\",\n codex: \".codex\",\n copilot: \".copilot\",\n grok_cli: \".grok\",\n opencode: \".config/opencode\",\n pi: \".pi\",\n};\n\nfunction runtime(options: AgentReadinessOptions): Runtime {\n return {\n homeDir: options.homeDir ?? process.env.HOME ?? \"\",\n path: options.path ?? process.env.PATH ?? \"\",\n assetRoot: options.assetRoot ?? null,\n builtInSkillNames: options.builtInSkillNames ?? [],\n skillRoots: options.skillRoots ?? {},\n readFile: options.readFile ?? ((target) => fsReadFile(target, \"utf8\")),\n access: options.access ?? ((target, mode = constants.R_OK) => fsAccess(target, mode)),\n runCommand: options.runCommand ?? defaultRunCommand,\n codexAuth: options.codexAuth ?? (async () => (await getCodexCapacityReport()).authenticated),\n };\n}\n\nasync function defaultRunCommand(command: string, args: string[]): Promise<CommandResult> {\n const result = await execFileAsync(command, args, {\n encoding: \"utf8\",\n timeout: 5000,\n maxBuffer: 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n}\n\nfunction statusRank(status: ReadinessStatus): number {\n return status === \"fail\" ? 2 : status === \"warn\" ? 1 : 0;\n}\n\nexport function worstReadinessStatus(statuses: ReadinessStatus[]): ReadinessStatus {\n return statuses.reduce<ReadinessStatus>(\n (worst, current) => (statusRank(current) > statusRank(worst) ? current : worst),\n \"pass\",\n );\n}\n\nfunction displayHome(target: string, homeDir: string): string {\n return target === homeDir\n ? \"~\"\n : target.startsWith(`${homeDir}/`)\n ? `~${target.slice(homeDir.length)}`\n : target;\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction nonEmpty(value: unknown): boolean {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nasync function accessible(target: string, rt: Runtime, mode = constants.R_OK): Promise<boolean> {\n try {\n await rt.access(target, mode);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function resolveExecutable(command: string, rt: Runtime): Promise<string | null> {\n const candidates = rt.path\n .split(delimiter)\n .filter(Boolean)\n .map((directory) => join(directory, command));\n const checks = await Promise.all(\n candidates.map(async (target) => ({\n target,\n available: await accessible(target, rt, constants.X_OK),\n })),\n );\n return checks.find((check) => check.available)?.target ?? null;\n}\n\nasync function executableCheck(\n agent: ReadinessAgentType,\n rt: Runtime,\n): Promise<ExecutableReadinessCheck> {\n const command = AGENTS[agent].command;\n const resolvedPath = await resolveExecutable(command, rt);\n return {\n command,\n path: resolvedPath,\n status: resolvedPath ? \"pass\" : \"fail\",\n errors: resolvedPath ? [] : [`${command} was not found on PATH`],\n };\n}\n\nasync function directoryCheck(\n agent: ReadinessAgentType,\n rt: Runtime,\n): Promise<DirectoryReadinessCheck> {\n const target = join(rt.homeDir, AGENT_HOME_DIRS[agent]);\n const readable = await accessible(target, rt);\n return {\n path: displayHome(target, rt.homeDir),\n present: readable,\n readable,\n status: readable ? \"pass\" : \"fail\",\n errors: readable ? [] : [\"global configuration directory is unavailable\"],\n };\n}\n\nasync function builtInSkillsCheck(\n agent: ReadinessAgentType,\n rt: Runtime,\n): Promise<BuiltInSkillsReadinessCheck> {\n const relativeRoot = rt.skillRoots[agent];\n if (!relativeRoot) {\n return {\n path: null,\n required: rt.builtInSkillNames.length,\n present: 0,\n missing: [...rt.builtInSkillNames],\n status: \"info\",\n errors: [],\n };\n }\n const root = join(rt.homeDir, relativeRoot);\n const checks = await Promise.all(\n rt.builtInSkillNames.map(async (name) => ({\n name,\n present: await accessible(join(root, name, \"SKILL.md\"), rt),\n })),\n );\n const present = checks.filter((check) => check.present).map((check) => check.name);\n const missing = rt.builtInSkillNames.filter((name) => !present.includes(name));\n return {\n path: displayHome(root, rt.homeDir),\n required: rt.builtInSkillNames.length,\n present: present.length,\n missing: [...missing],\n status: \"info\",\n errors: [],\n };\n}\n\nasync function scriptCheck(\n installed: string,\n bundled: string,\n rt: Runtime,\n): Promise<\n ReadinessCheck & {\n path: string;\n present: boolean;\n readable: boolean;\n matchesBundledAsset: boolean;\n }\n> {\n let installedText: string;\n try {\n installedText = await rt.readFile(installed);\n } catch {\n return {\n path: displayHome(installed, rt.homeDir),\n present: false,\n readable: false,\n matchesBundledAsset: false,\n status: \"fail\",\n errors: [\"hook script is unavailable\"],\n };\n }\n try {\n const bundledText = await rt.readFile(bundled);\n const matches = installedText === bundledText;\n return {\n path: displayHome(installed, rt.homeDir),\n present: true,\n readable: true,\n matchesBundledAsset: matches,\n status: matches ? \"pass\" : \"fail\",\n errors: matches ? [] : [\"hook script differs from the bundled AI DevKit asset\"],\n };\n } catch {\n return {\n path: displayHome(installed, rt.homeDir),\n present: true,\n readable: true,\n matchesBundledAsset: false,\n status: \"fail\",\n errors: [\"bundled hook asset is unavailable\"],\n };\n }\n}\n\nfunction containsHook(root: unknown, event: string, command: string): boolean {\n const hooks = record(record(root)?.hooks);\n const entries = hooks?.[event];\n if (!Array.isArray(entries)) return false;\n return entries.some((entry) => {\n const commands = record(entry)?.hooks;\n return (\n Array.isArray(commands) &&\n commands.some((hook) => {\n const item = record(hook);\n return item?.type === \"command\" && item.command === command;\n })\n );\n });\n}\n\nasync function registrationCheck(\n target: string,\n event: string,\n command: string,\n rt: Runtime,\n): Promise<\n ReadinessCheck & {\n path: string;\n event: string;\n command: string;\n present: boolean;\n valid: boolean;\n }\n> {\n try {\n const parsed = JSON.parse(await rt.readFile(target));\n const valid = containsHook(parsed, event, command);\n return {\n path: displayHome(target, rt.homeDir),\n event,\n command,\n present: true,\n valid,\n status: valid ? \"pass\" : \"fail\",\n errors: valid ? [] : [\"required hook registration is missing\"],\n };\n } catch {\n return {\n path: displayHome(target, rt.homeDir),\n event,\n command,\n present: false,\n valid: false,\n status: \"fail\",\n errors: [\"hook configuration is missing or invalid\"],\n };\n }\n}\n\nasync function mappingCheck(\n target: string,\n rt: Runtime,\n): Promise<\n ReadinessCheck & {\n path: string;\n present: boolean;\n valid: boolean;\n invalidEntries: number;\n staleEntries: number;\n }\n> {\n let text: string;\n try {\n text = await rt.readFile(target);\n } catch {\n return {\n path: displayHome(target, rt.homeDir),\n present: false,\n valid: false,\n invalidEntries: 0,\n staleEntries: 0,\n status: \"warn\",\n errors: [\"session mapping has not been created\"],\n };\n }\n let parsed: Record<string, unknown> | null = null;\n try {\n parsed = record(JSON.parse(text));\n } catch {\n // Fixed safe error below.\n }\n if (!parsed) {\n return {\n path: displayHome(target, rt.homeDir),\n present: true,\n valid: false,\n invalidEntries: 0,\n staleEntries: 0,\n status: \"fail\",\n errors: [\"session mapping is invalid\"],\n };\n }\n const entries = await Promise.all(\n Object.entries(parsed).map(async ([pid, sessionPath]) => {\n if (!/^\\d+$/.test(pid) || typeof sessionPath !== \"string\" || !sessionPath) {\n return { valid: false, stale: false };\n }\n return { valid: true, stale: !(await accessible(sessionPath, rt)) };\n }),\n );\n const invalidEntries = entries.filter((entry) => !entry.valid).length;\n const staleEntries = entries.filter((entry) => entry.stale).length;\n const valid = invalidEntries === 0;\n return {\n path: displayHome(target, rt.homeDir),\n present: true,\n valid,\n invalidEntries,\n staleEntries,\n status: !valid ? \"fail\" : staleEntries ? \"warn\" : \"pass\",\n errors: !valid\n ? [\"session mapping contains invalid entries\"]\n : staleEntries\n ? [\"session mapping contains stale entries\"]\n : [],\n };\n}\n\nasync function codexAuthCheck(rt: Runtime): Promise<AuthReadinessCheck> {\n try {\n const value = await rt.codexAuth();\n return {\n state: value === true ? \"authenticated\" : value === false ? \"unauthenticated\" : \"unknown\",\n source: displayHome(join(rt.homeDir, \".codex\", \"auth.json\"), rt.homeDir),\n provider: null,\n availableProviders: [],\n status: value === true ? \"pass\" : value === false ? \"fail\" : \"warn\",\n errors:\n value === true\n ? []\n : [value === false ? \"Codex is not authenticated\" : \"Codex authentication is unknown\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"~/.codex/auth.json\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"Codex authentication probe failed\"],\n };\n }\n}\n\nasync function claudeAuthCheck(rt: Runtime): Promise<AuthReadinessCheck> {\n try {\n const result = await rt.runCommand(\"claude\", [\"auth\", \"status\", \"--json\"]);\n const parsed = record(JSON.parse(result.stdout));\n const authenticated = parsed?.loggedIn === true || parsed?.authenticated === true;\n const unauthenticated = parsed?.loggedIn === false || parsed?.authenticated === false;\n return {\n state: authenticated ? \"authenticated\" : unauthenticated ? \"unauthenticated\" : \"unknown\",\n source: \"claude auth status --json\",\n provider: null,\n availableProviders: [],\n status: authenticated ? \"pass\" : unauthenticated ? \"fail\" : \"warn\",\n errors: authenticated\n ? []\n : [unauthenticated ? \"Claude is not authenticated\" : \"Claude authentication is unknown\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"claude auth status --json\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"Claude authentication probe failed\"],\n };\n }\n}\n\nfunction piProviderNames(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 piAuthCheck(rt: Runtime): Promise<AuthReadinessCheck> {\n const sourcePath = join(rt.homeDir, \".pi\", \"agent\", \"auth.json\");\n try {\n const parsed = record(JSON.parse(await rt.readFile(sourcePath)));\n if (!parsed) throw new Error(\"invalid\");\n const availableProviders = piProviderNames(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, rt.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, rt.homeDir),\n provider: null,\n availableProviders: [],\n status: \"fail\",\n errors: [\"Pi credential file is missing or invalid\"],\n };\n }\n}\n\nasync function opencodeAuthCheck(rt: Runtime): Promise<AuthReadinessCheck> {\n try {\n const result = await rt.runCommand(\"opencode\", [\"auth\", \"list\"]);\n const availableProviders = opencodeAuthProviderNames(result.stdout);\n const authenticated = availableProviders.length > 0;\n return {\n state: authenticated ? \"authenticated\" : \"unauthenticated\",\n source: \"opencode auth list\",\n provider: null,\n availableProviders,\n status: authenticated ? \"pass\" : \"fail\",\n errors: authenticated ? [] : [\"OpenCode has no configured credentials\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"opencode auth list\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"OpenCode authentication probe failed\"],\n };\n }\n}\n\nasync function copilotAuthCheck(rt: Runtime): Promise<AuthReadinessCheck> {\n try {\n await rt.runCommand(\"gh\", [\"auth\", \"status\", \"--hostname\", \"github.com\"]);\n return {\n state: \"authenticated\",\n source: \"gh auth status --hostname github.com\",\n provider: \"github\",\n availableProviders: [\"GitHub\"],\n status: \"pass\",\n errors: [],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"gh auth status --hostname github.com\",\n provider: null,\n availableProviders: [\"GitHub\"],\n status: \"warn\",\n errors: [\"Copilot authentication could not be verified through GitHub CLI\"],\n };\n }\n}\n\nfunction opencodeAuthProviderNames(output: string): string[] {\n const names = new Set<string>();\n for (const line of stripAnsi(output).split(/\\r?\\n/)) {\n const match = /^\\s*[●*+-]\\s+(.+?)\\s*$/.exec(line);\n if (!match) continue;\n const name = match[1].replace(/\\s+(?:api|oauth|[\\w-]*token|[A-Z][A-Z0-9_]+)$/i, \"\").trim();\n if (name && !/^\\d+\\s+(?:credentials?|environment variables?)$/i.test(name)) names.add(name);\n }\n return [...names].sort();\n}\n\nfunction stripAnsi(value: string): string {\n return value.replace(ANSI_ESCAPE_PATTERN, \"\");\n}\n\nasync function codexIntegrationCheck(rt: Runtime): Promise<IntegrationReadinessCheck> {\n const script = await scriptCheck(\n join(rt.homeDir, \".codex\", \"hooks\", \"codex-session-mapping.cjs\"),\n join(rt.assetRoot ?? \"\", \"codex\", \"codex-session-mapping.cjs\"),\n rt,\n );\n const registration = await registrationCheck(\n join(rt.homeDir, \".codex\", \"hooks.json\"),\n \"SessionStart\",\n \"node ~/.codex/hooks/codex-session-mapping.cjs\",\n rt,\n );\n const mappingFile = await mappingCheck(\n join(rt.homeDir, \".codex\", \"ai-devkit\", \"sessions.json\"),\n rt,\n );\n const installed = script.status === \"pass\" && registration.status === \"pass\";\n return {\n label: \"ai-devkit hook\",\n installed,\n status: worstReadinessStatus([script.status, registration.status, mappingFile.status]),\n errors: [...script.errors, ...registration.errors, ...mappingFile.errors],\n details: { sessionMappingScript: script, registration, mappingFile },\n };\n}\n\nasync function claudeIntegrationCheck(rt: Runtime): Promise<IntegrationReadinessCheck> {\n const script = await scriptCheck(\n join(rt.homeDir, \".claude\", \"hooks\", \"claude-prompt-hook.js\"),\n join(rt.assetRoot ?? \"\", \"claude\", \"claude-prompt-hook.js\"),\n rt,\n );\n const registration = await registrationCheck(\n join(rt.homeDir, \".claude\", \"settings.json\"),\n \"PreToolUse\",\n \"node ~/.claude/hooks/claude-prompt-hook.js\",\n rt,\n );\n const installed = script.status === \"pass\" && registration.status === \"pass\";\n return {\n label: \"ai-devkit hook\",\n installed,\n status: worstReadinessStatus([script.status, registration.status]),\n errors: [...script.errors, ...registration.errors],\n details: { promptScript: script, registration },\n };\n}\n\nasync function piIntegrationCheck(rt: Runtime): Promise<IntegrationReadinessCheck> {\n let installed = false;\n try {\n const result = await rt.runCommand(\"pi\", [\"list\"]);\n installed = isPiSessionTrackerListed(result.stdout);\n } catch {\n // Safe fixed result below.\n }\n const mapping = await mappingCheck(join(rt.homeDir, \".pi\", \"agent\", \"sessions.json\"), rt);\n const mappingStatus: ReadinessStatus = 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\nfunction isPiSessionTrackerListed(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\ntype AuthCheck = (rt: Runtime) => Promise<AuthReadinessCheck>;\ntype IntegrationCheck = (rt: Runtime) => Promise<IntegrationReadinessCheck>;\n\nconst AUTH_CHECKS: Partial<Record<ReadinessAgentType, AuthCheck>> = {\n claude: claudeAuthCheck,\n codex: codexAuthCheck,\n copilot: copilotAuthCheck,\n opencode: opencodeAuthCheck,\n pi: piAuthCheck,\n};\n\nconst INTEGRATION_CHECKS: Partial<Record<ReadinessAgentType, IntegrationCheck>> = {\n claude: claudeIntegrationCheck,\n codex: codexIntegrationCheck,\n pi: piIntegrationCheck,\n};\n\nasync function authCheck(\n agent: ReadinessAgentType,\n rt: Runtime,\n): Promise<AuthReadinessCheck | undefined> {\n return AUTH_CHECKS[agent]?.(rt);\n}\n\nasync function integrationCheck(\n agent: ReadinessAgentType,\n rt: Runtime,\n): Promise<IntegrationReadinessCheck | undefined> {\n return INTEGRATION_CHECKS[agent]?.(rt);\n}\n\nexport async function getAgentReadinessReport(\n agent: ReadinessAgentType,\n options: AgentReadinessOptions = {},\n): Promise<AgentReadinessReport> {\n return agentReadiness(agent, runtime(options));\n}\n\nasync function agentReadiness(\n agent: ReadinessAgentType,\n rt: Runtime,\n): Promise<AgentReadinessReport> {\n const [executable, globalConfig, builtInSkills, auth, integration] = await Promise.all([\n executableCheck(agent, rt),\n directoryCheck(agent, rt),\n builtInSkillsCheck(agent, rt),\n authCheck(agent, rt),\n integrationCheck(agent, rt),\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 rt = runtime(options);\n const entries = await Promise.all(\n READINESS_AGENT_TYPES.map(async (agent) => [agent, await agentReadiness(agent, rt)] as const),\n );\n return Object.fromEntries(entries) as Record<ReadinessAgentType, AgentReadinessReport>;\n}\n"],"names":["constants","access","fsAccess","readFile","fsReadFile","execFile","delimiter","join","promisify","getCodexCapacityReport","AGENTS","execFileAsync","READINESS_AGENT_TYPES","ANSI_ESCAPE_PATTERN","RegExp","String","fromCharCode","AGENT_HOME_DIRS","claude","codex","copilot","grok_cli","opencode","pi","runtime","options","homeDir","process","env","HOME","path","PATH","assetRoot","builtInSkillNames","skillRoots","target","mode","R_OK","runCommand","defaultRunCommand","codexAuth","authenticated","command","args","result","encoding","timeout","maxBuffer","stdout","stderr","statusRank","status","worstReadinessStatus","statuses","reduce","worst","current","displayHome","startsWith","slice","length","record","value","Array","isArray","nonEmpty","trim","accessible","rt","resolveExecutable","candidates","split","filter","Boolean","map","directory","checks","Promise","all","available","X_OK","find","check","executableCheck","agent","resolvedPath","errors","directoryCheck","readable","present","builtInSkillsCheck","relativeRoot","required","missing","root","name","includes","scriptCheck","installed","bundled","installedText","matchesBundledAsset","bundledText","matches","containsHook","event","hooks","entries","some","entry","commands","hook","item","type","registrationCheck","parsed","JSON","parse","valid","mappingCheck","text","invalidEntries","staleEntries","Object","pid","sessionPath","test","stale","codexAuthCheck","state","source","provider","availableProviders","claudeAuthCheck","loggedIn","unauthenticated","piProviderNames","names","Set","add","providers","keys","sort","piAuthCheck","sourcePath","Error","opencodeAuthCheck","opencodeAuthProviderNames","copilotAuthCheck","output","line","stripAnsi","match","exec","replace","codexIntegrationCheck","script","registration","mappingFile","label","details","sessionMappingScript","claudeIntegrationCheck","promptScript","piIntegrationCheck","isPiSessionTrackerListed","mapping","mappingStatus","package","registryPath","registryValid","normalized","toLowerCase","AUTH_CHECKS","INTEGRATION_CHECKS","authCheck","integrationCheck","getAgentReadinessReport","agentReadiness","executable","globalConfig","builtInSkills","auth","integration","getAgentReadinessReports","fromEntries"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/readiness/AgentReadiness.ts"],"sourcesContent":["import { constants } from \"node:fs\";\nimport { access as fsAccess, readFile as fsReadFile } from \"node:fs/promises\";\nimport { execFile } from \"node:child_process\";\nimport { delimiter, join } from \"node:path\";\nimport { promisify } from \"node:util\";\nimport { getCodexCapacityReport } from \"../capacity/index.js\";\nimport { AGENTS, type StartableAgentType } from \"../utils/agents.js\";\n\nconst execFileAsync = promisify(execFile);\nconst READINESS_AGENT_TYPES = [\"claude\", \"codex\", \"copilot\", \"grok_cli\", \"opencode\", \"pi\"] as const;\nconst ANSI_ESCAPE_PATTERN = new RegExp(`${String.fromCharCode(27)}\\\\[[0-?]*[ -/]*[@-~]`, \"g\");\n\nexport type ReadinessStatus = \"pass\" | \"warn\" | \"fail\";\nexport type ReadinessAuthState = \"authenticated\" | \"unauthenticated\" | \"unknown\";\nexport type ReadinessAgentType = Exclude<\n StartableAgentType,\n \"gemini_cli\" | \"kiro\" | \"antigravity_cli\"\n>;\ntype ReadinessInfoStatus = ReadinessStatus | \"info\";\n\ntype CommandResult = { stdout: string; stderr: string };\ntype ReadFile = (target: string) => Promise<string>;\ntype Access = (target: string, mode?: number) => Promise<void>;\ntype RunCommand = (command: string, args: string[]) => Promise<CommandResult>;\n\nexport interface ReadinessCheck<S extends ReadinessInfoStatus = ReadinessStatus> {\n status: S;\n errors: string[];\n}\n\nexport interface ExecutableReadinessCheck extends ReadinessCheck {\n command: string;\n path: string | null;\n}\n\nexport interface DirectoryReadinessCheck extends ReadinessCheck {\n path: string;\n present: boolean;\n readable: boolean;\n}\n\nexport interface BuiltInSkillsReadinessCheck extends ReadinessCheck<\"info\"> {\n path: string | null;\n required: number;\n present: number;\n missing: string[];\n}\n\nexport interface AuthReadinessCheck extends ReadinessCheck {\n state: ReadinessAuthState;\n source: string;\n provider: string | null;\n availableProviders: string[];\n}\n\nexport interface IntegrationReadinessCheck extends ReadinessCheck {\n label: string;\n installed: boolean;\n details?: Record<string, unknown>;\n}\n\nexport interface AgentReadinessReport {\n type: ReadinessAgentType;\n executable: ExecutableReadinessCheck;\n globalConfig: DirectoryReadinessCheck;\n builtInSkills: BuiltInSkillsReadinessCheck;\n auth?: AuthReadinessCheck;\n integration?: IntegrationReadinessCheck;\n status: ReadinessStatus;\n}\n\nexport interface AgentReadinessOptions {\n homeDir?: string;\n path?: string;\n assetRoot?: string;\n builtInSkillNames?: readonly string[];\n skillRoots?: Partial<Record<ReadinessAgentType, string>>;\n readFile?: ReadFile;\n access?: Access;\n runCommand?: RunCommand;\n codexAuth?: () => Promise<boolean | null>;\n}\n\ntype Runtime = Required<\n Omit<AgentReadinessOptions, \"assetRoot\" | \"builtInSkillNames\" | \"skillRoots\">\n> & {\n assetRoot: string | null;\n builtInSkillNames: readonly string[];\n skillRoots: Partial<Record<ReadinessAgentType, string>>;\n};\n\nconst AGENT_HOME_DIRS: Record<ReadinessAgentType, string> = {\n claude: \".claude\",\n codex: \".codex\",\n copilot: \".copilot\",\n grok_cli: \".grok\",\n opencode: \".config/opencode\",\n pi: \".pi\",\n};\n\nfunction runtime(options: AgentReadinessOptions): Runtime {\n return {\n homeDir: options.homeDir ?? process.env.HOME ?? \"\",\n path: options.path ?? process.env.PATH ?? \"\",\n assetRoot: options.assetRoot ?? null,\n builtInSkillNames: options.builtInSkillNames ?? [],\n skillRoots: options.skillRoots ?? {},\n readFile: options.readFile ?? ((target) => fsReadFile(target, \"utf8\")),\n access: options.access ?? ((target, mode = constants.R_OK) => fsAccess(target, mode)),\n runCommand: options.runCommand ?? defaultRunCommand,\n codexAuth: options.codexAuth ?? (async () => (await getCodexCapacityReport()).authenticated),\n };\n}\n\nasync function defaultRunCommand(command: string, args: string[]): Promise<CommandResult> {\n const result = await execFileAsync(command, args, {\n encoding: \"utf8\",\n timeout: 5000,\n maxBuffer: 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n}\n\nfunction statusRank(status: ReadinessStatus): number {\n return status === \"fail\" ? 2 : status === \"warn\" ? 1 : 0;\n}\n\nexport function worstReadinessStatus(statuses: ReadinessStatus[]): ReadinessStatus {\n return statuses.reduce<ReadinessStatus>(\n (worst, current) => (statusRank(current) > statusRank(worst) ? current : worst),\n \"pass\",\n );\n}\n\nfunction displayHome(target: string, homeDir: string): string {\n return target === homeDir\n ? \"~\"\n : target.startsWith(`${homeDir}/`)\n ? `~${target.slice(homeDir.length)}`\n : target;\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction nonEmpty(value: unknown): boolean {\n return typeof value === \"string\" && value.trim().length > 0;\n}\n\nasync function accessible(target: string, rt: Runtime, mode = constants.R_OK): Promise<boolean> {\n try {\n await rt.access(target, mode);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function resolveExecutable(command: string, rt: Runtime): Promise<string | null> {\n const candidates = rt.path\n .split(delimiter)\n .filter(Boolean)\n .map((directory) => join(directory, command));\n const checks = await Promise.all(\n candidates.map(async (target) => ({\n target,\n available: await accessible(target, rt, constants.X_OK),\n })),\n );\n return checks.find((check) => check.available)?.target ?? null;\n}\n\nasync function executableCheck(\n agent: ReadinessAgentType,\n rt: Runtime,\n): Promise<ExecutableReadinessCheck> {\n const command = AGENTS[agent].command;\n const resolvedPath = await resolveExecutable(command, rt);\n return {\n command,\n path: resolvedPath,\n status: resolvedPath ? \"pass\" : \"fail\",\n errors: resolvedPath ? [] : [`${command} was not found on PATH`],\n };\n}\n\nasync function directoryCheck(\n agent: ReadinessAgentType,\n rt: Runtime,\n): Promise<DirectoryReadinessCheck> {\n const target = join(rt.homeDir, AGENT_HOME_DIRS[agent]);\n const readable = await accessible(target, rt);\n return {\n path: displayHome(target, rt.homeDir),\n present: readable,\n readable,\n status: readable ? \"pass\" : \"fail\",\n errors: readable ? [] : [\"global configuration directory is unavailable\"],\n };\n}\n\nasync function builtInSkillsCheck(\n agent: ReadinessAgentType,\n rt: Runtime,\n): Promise<BuiltInSkillsReadinessCheck> {\n const relativeRoot = rt.skillRoots[agent];\n if (!relativeRoot) {\n return {\n path: null,\n required: rt.builtInSkillNames.length,\n present: 0,\n missing: [...rt.builtInSkillNames],\n status: \"info\",\n errors: [],\n };\n }\n const root = join(rt.homeDir, relativeRoot);\n const checks = await Promise.all(\n rt.builtInSkillNames.map(async (name) => ({\n name,\n present: await accessible(join(root, name, \"SKILL.md\"), rt),\n })),\n );\n const present = checks.filter((check) => check.present).map((check) => check.name);\n const missing = rt.builtInSkillNames.filter((name) => !present.includes(name));\n return {\n path: displayHome(root, rt.homeDir),\n required: rt.builtInSkillNames.length,\n present: present.length,\n missing: [...missing],\n status: \"info\",\n errors: [],\n };\n}\n\nasync function scriptCheck(\n installed: string,\n bundled: string,\n rt: Runtime,\n): Promise<\n ReadinessCheck & {\n path: string;\n present: boolean;\n readable: boolean;\n matchesBundledAsset: boolean;\n }\n> {\n let installedText: string;\n try {\n installedText = await rt.readFile(installed);\n } catch {\n return {\n path: displayHome(installed, rt.homeDir),\n present: false,\n readable: false,\n matchesBundledAsset: false,\n status: \"fail\",\n errors: [\"hook script is unavailable\"],\n };\n }\n try {\n const bundledText = await rt.readFile(bundled);\n const matches = installedText === bundledText;\n return {\n path: displayHome(installed, rt.homeDir),\n present: true,\n readable: true,\n matchesBundledAsset: matches,\n status: matches ? \"pass\" : \"fail\",\n errors: matches ? [] : [\"hook script differs from the bundled AI DevKit asset\"],\n };\n } catch {\n return {\n path: displayHome(installed, rt.homeDir),\n present: true,\n readable: true,\n matchesBundledAsset: false,\n status: \"fail\",\n errors: [\"bundled hook asset is unavailable\"],\n };\n }\n}\n\nfunction containsHook(root: unknown, event: string, command: string): boolean {\n const hooks = record(record(root)?.hooks);\n const entries = hooks?.[event];\n if (!Array.isArray(entries)) return false;\n return entries.some((entry) => {\n const commands = record(entry)?.hooks;\n return (\n Array.isArray(commands) &&\n commands.some((hook) => {\n const item = record(hook);\n return item?.type === \"command\" && item.command === command;\n })\n );\n });\n}\n\nasync function registrationCheck(\n target: string,\n event: string,\n command: string,\n rt: Runtime,\n): Promise<\n ReadinessCheck & {\n path: string;\n event: string;\n command: string;\n present: boolean;\n valid: boolean;\n }\n> {\n try {\n const parsed = JSON.parse(await rt.readFile(target));\n const valid = containsHook(parsed, event, command);\n return {\n path: displayHome(target, rt.homeDir),\n event,\n command,\n present: true,\n valid,\n status: valid ? \"pass\" : \"fail\",\n errors: valid ? [] : [\"required hook registration is missing\"],\n };\n } catch {\n return {\n path: displayHome(target, rt.homeDir),\n event,\n command,\n present: false,\n valid: false,\n status: \"fail\",\n errors: [\"hook configuration is missing or invalid\"],\n };\n }\n}\n\nasync function mappingCheck(\n target: string,\n rt: Runtime,\n): Promise<\n ReadinessCheck & {\n path: string;\n present: boolean;\n valid: boolean;\n invalidEntries: number;\n staleEntries: number;\n }\n> {\n let text: string;\n try {\n text = await rt.readFile(target);\n } catch {\n return {\n path: displayHome(target, rt.homeDir),\n present: false,\n valid: false,\n invalidEntries: 0,\n staleEntries: 0,\n status: \"warn\",\n errors: [\"session mapping has not been created\"],\n };\n }\n let parsed: Record<string, unknown> | null = null;\n try {\n parsed = record(JSON.parse(text));\n } catch {\n // Fixed safe error below.\n }\n if (!parsed) {\n return {\n path: displayHome(target, rt.homeDir),\n present: true,\n valid: false,\n invalidEntries: 0,\n staleEntries: 0,\n status: \"fail\",\n errors: [\"session mapping is invalid\"],\n };\n }\n const entries = await Promise.all(\n Object.entries(parsed).map(async ([pid, sessionPath]) => {\n if (!/^\\d+$/.test(pid) || typeof sessionPath !== \"string\" || !sessionPath) {\n return { valid: false, stale: false };\n }\n return { valid: true, stale: !(await accessible(sessionPath, rt)) };\n }),\n );\n const invalidEntries = entries.filter((entry) => !entry.valid).length;\n const staleEntries = entries.filter((entry) => entry.stale).length;\n const valid = invalidEntries === 0;\n return {\n path: displayHome(target, rt.homeDir),\n present: true,\n valid,\n invalidEntries,\n staleEntries,\n status: !valid ? \"fail\" : staleEntries ? \"warn\" : \"pass\",\n errors: !valid\n ? [\"session mapping contains invalid entries\"]\n : staleEntries\n ? [\"session mapping contains stale entries\"]\n : [],\n };\n}\n\nasync function codexAuthCheck(rt: Runtime): Promise<AuthReadinessCheck> {\n try {\n const value = await rt.codexAuth();\n return {\n state: value === true ? \"authenticated\" : value === false ? \"unauthenticated\" : \"unknown\",\n source: displayHome(join(rt.homeDir, \".codex\", \"auth.json\"), rt.homeDir),\n provider: null,\n availableProviders: [],\n status: value === true ? \"pass\" : value === false ? \"fail\" : \"warn\",\n errors:\n value === true\n ? []\n : [value === false ? \"Codex is not authenticated\" : \"Codex authentication is unknown\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"~/.codex/auth.json\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"Codex authentication probe failed\"],\n };\n }\n}\n\nasync function claudeAuthCheck(rt: Runtime): Promise<AuthReadinessCheck> {\n try {\n const result = await rt.runCommand(\"claude\", [\"auth\", \"status\", \"--json\"]);\n const parsed = record(JSON.parse(result.stdout));\n const authenticated = parsed?.loggedIn === true || parsed?.authenticated === true;\n const unauthenticated = parsed?.loggedIn === false || parsed?.authenticated === false;\n return {\n state: authenticated ? \"authenticated\" : unauthenticated ? \"unauthenticated\" : \"unknown\",\n source: \"claude auth status --json\",\n provider: null,\n availableProviders: [],\n status: authenticated ? \"pass\" : unauthenticated ? \"fail\" : \"warn\",\n errors: authenticated\n ? []\n : [unauthenticated ? \"Claude is not authenticated\" : \"Claude authentication is unknown\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"claude auth status --json\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"Claude authentication probe failed\"],\n };\n }\n}\n\nfunction piProviderNames(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 piAuthCheck(rt: Runtime): Promise<AuthReadinessCheck> {\n const sourcePath = join(rt.homeDir, \".pi\", \"agent\", \"auth.json\");\n try {\n const parsed = record(JSON.parse(await rt.readFile(sourcePath)));\n if (!parsed) throw new Error(\"invalid\");\n const availableProviders = piProviderNames(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, rt.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, rt.homeDir),\n provider: null,\n availableProviders: [],\n status: \"fail\",\n errors: [\"Pi credential file is missing or invalid\"],\n };\n }\n}\n\nasync function opencodeAuthCheck(rt: Runtime): Promise<AuthReadinessCheck> {\n try {\n const result = await rt.runCommand(\"opencode\", [\"auth\", \"list\"]);\n const availableProviders = opencodeAuthProviderNames(result.stdout);\n const authenticated = availableProviders.length > 0;\n return {\n state: authenticated ? \"authenticated\" : \"unauthenticated\",\n source: \"opencode auth list\",\n provider: null,\n availableProviders,\n status: authenticated ? \"pass\" : \"fail\",\n errors: authenticated ? [] : [\"OpenCode has no configured credentials\"],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"opencode auth list\",\n provider: null,\n availableProviders: [],\n status: \"warn\",\n errors: [\"OpenCode authentication probe failed\"],\n };\n }\n}\n\nasync function copilotAuthCheck(rt: Runtime): Promise<AuthReadinessCheck> {\n try {\n await rt.runCommand(\"gh\", [\"auth\", \"status\", \"--hostname\", \"github.com\"]);\n return {\n state: \"authenticated\",\n source: \"gh auth status --hostname github.com\",\n provider: \"github\",\n availableProviders: [\"GitHub\"],\n status: \"pass\",\n errors: [],\n };\n } catch {\n return {\n state: \"unknown\",\n source: \"gh auth status --hostname github.com\",\n provider: null,\n availableProviders: [\"GitHub\"],\n status: \"warn\",\n errors: [\"Copilot authentication could not be verified through GitHub CLI\"],\n };\n }\n}\n\nfunction opencodeAuthProviderNames(output: string): string[] {\n const names = new Set<string>();\n for (const line of stripAnsi(output).split(/\\r?\\n/)) {\n const match = /^\\s*[●*+-]\\s+(.+?)\\s*$/.exec(line);\n if (!match) continue;\n const name = match[1].replace(/\\s+(?:api|oauth|[\\w-]*token|[A-Z][A-Z0-9_]+)$/i, \"\").trim();\n if (name && !/^\\d+\\s+(?:credentials?|environment variables?)$/i.test(name)) names.add(name);\n }\n return [...names].sort();\n}\n\nfunction stripAnsi(value: string): string {\n return value.replace(ANSI_ESCAPE_PATTERN, \"\");\n}\n\nasync function codexIntegrationCheck(rt: Runtime): Promise<IntegrationReadinessCheck> {\n const script = await scriptCheck(\n join(rt.homeDir, \".codex\", \"hooks\", \"codex-session-mapping.cjs\"),\n join(rt.assetRoot ?? \"\", \"codex\", \"codex-session-mapping.cjs\"),\n rt,\n );\n const registration = await registrationCheck(\n join(rt.homeDir, \".codex\", \"hooks.json\"),\n \"SessionStart\",\n \"node ~/.codex/hooks/codex-session-mapping.cjs\",\n rt,\n );\n const mappingFile = await mappingCheck(\n join(rt.homeDir, \".codex\", \"ai-devkit\", \"sessions.json\"),\n rt,\n );\n const installed = script.status === \"pass\" && registration.status === \"pass\";\n return {\n label: \"ai-devkit hook\",\n installed,\n status: worstReadinessStatus([script.status, registration.status, mappingFile.status]),\n errors: [...script.errors, ...registration.errors, ...mappingFile.errors],\n details: { sessionMappingScript: script, registration, mappingFile },\n };\n}\n\nasync function claudeIntegrationCheck(rt: Runtime): Promise<IntegrationReadinessCheck> {\n const script = await scriptCheck(\n join(rt.homeDir, \".claude\", \"hooks\", \"claude-prompt-hook.js\"),\n join(rt.assetRoot ?? \"\", \"claude\", \"claude-prompt-hook.js\"),\n rt,\n );\n const registration = await registrationCheck(\n join(rt.homeDir, \".claude\", \"settings.json\"),\n \"PreToolUse\",\n \"node ~/.claude/hooks/claude-prompt-hook.js\",\n rt,\n );\n const installed = script.status === \"pass\" && registration.status === \"pass\";\n return {\n label: \"ai-devkit hook\",\n installed,\n status: worstReadinessStatus([script.status, registration.status]),\n errors: [...script.errors, ...registration.errors],\n details: { promptScript: script, registration },\n };\n}\n\nasync function piIntegrationCheck(rt: Runtime): Promise<IntegrationReadinessCheck> {\n let installed = false;\n try {\n const result = await rt.runCommand(\"pi\", [\"list\"]);\n installed = isPiSessionTrackerListed(result.stdout);\n } catch {\n // Safe fixed result below.\n }\n const mapping = await mappingCheck(join(rt.homeDir, \".pi\", \"agent\", \"sessions.json\"), rt);\n const mappingStatus: ReadinessStatus = 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\nfunction isPiSessionTrackerListed(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\ntype AuthCheck = (rt: Runtime) => Promise<AuthReadinessCheck>;\ntype IntegrationCheck = (rt: Runtime) => Promise<IntegrationReadinessCheck>;\n\nconst AUTH_CHECKS: Partial<Record<ReadinessAgentType, AuthCheck>> = {\n claude: claudeAuthCheck,\n codex: codexAuthCheck,\n copilot: copilotAuthCheck,\n opencode: opencodeAuthCheck,\n pi: piAuthCheck,\n};\n\nconst INTEGRATION_CHECKS: Partial<Record<ReadinessAgentType, IntegrationCheck>> = {\n claude: claudeIntegrationCheck,\n codex: codexIntegrationCheck,\n pi: piIntegrationCheck,\n};\n\nasync function authCheck(\n agent: ReadinessAgentType,\n rt: Runtime,\n): Promise<AuthReadinessCheck | undefined> {\n return AUTH_CHECKS[agent]?.(rt);\n}\n\nasync function integrationCheck(\n agent: ReadinessAgentType,\n rt: Runtime,\n): Promise<IntegrationReadinessCheck | undefined> {\n return INTEGRATION_CHECKS[agent]?.(rt);\n}\n\nexport async function getAgentReadinessReport(\n agent: ReadinessAgentType,\n options: AgentReadinessOptions = {},\n): Promise<AgentReadinessReport> {\n return agentReadiness(agent, runtime(options));\n}\n\nasync function agentReadiness(\n agent: ReadinessAgentType,\n rt: Runtime,\n): Promise<AgentReadinessReport> {\n const [executable, globalConfig, builtInSkills, auth, integration] = await Promise.all([\n executableCheck(agent, rt),\n directoryCheck(agent, rt),\n builtInSkillsCheck(agent, rt),\n authCheck(agent, rt),\n integrationCheck(agent, rt),\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 rt = runtime(options);\n const entries = await Promise.all(\n READINESS_AGENT_TYPES.map(async (agent) => [agent, await agentReadiness(agent, rt)] as const),\n );\n return Object.fromEntries(entries) as Record<ReadinessAgentType, AgentReadinessReport>;\n}\n"],"names":["constants","access","fsAccess","readFile","fsReadFile","execFile","delimiter","join","promisify","getCodexCapacityReport","AGENTS","execFileAsync","READINESS_AGENT_TYPES","ANSI_ESCAPE_PATTERN","RegExp","String","fromCharCode","AGENT_HOME_DIRS","claude","codex","copilot","grok_cli","opencode","pi","runtime","options","homeDir","process","env","HOME","path","PATH","assetRoot","builtInSkillNames","skillRoots","target","mode","R_OK","runCommand","defaultRunCommand","codexAuth","authenticated","command","args","result","encoding","timeout","maxBuffer","stdout","stderr","statusRank","status","worstReadinessStatus","statuses","reduce","worst","current","displayHome","startsWith","slice","length","record","value","Array","isArray","nonEmpty","trim","accessible","rt","resolveExecutable","candidates","split","filter","Boolean","map","directory","checks","Promise","all","available","X_OK","find","check","executableCheck","agent","resolvedPath","errors","directoryCheck","readable","present","builtInSkillsCheck","relativeRoot","required","missing","root","name","includes","scriptCheck","installed","bundled","installedText","matchesBundledAsset","bundledText","matches","containsHook","event","hooks","entries","some","entry","commands","hook","item","type","registrationCheck","parsed","JSON","parse","valid","mappingCheck","text","invalidEntries","staleEntries","Object","pid","sessionPath","test","stale","codexAuthCheck","state","source","provider","availableProviders","claudeAuthCheck","loggedIn","unauthenticated","piProviderNames","names","Set","add","providers","keys","sort","piAuthCheck","sourcePath","Error","opencodeAuthCheck","opencodeAuthProviderNames","copilotAuthCheck","output","line","stripAnsi","match","exec","replace","codexIntegrationCheck","script","registration","mappingFile","label","details","sessionMappingScript","claudeIntegrationCheck","promptScript","piIntegrationCheck","isPiSessionTrackerListed","mapping","mappingStatus","package","registryPath","registryValid","normalized","toLowerCase","AUTH_CHECKS","INTEGRATION_CHECKS","authCheck","integrationCheck","getAgentReadinessReport","agentReadiness","executable","globalConfig","builtInSkills","auth","integration","getAgentReadinessReports","fromEntries"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/runtime/ManagedAgentRuntime.ts"],"sourcesContent":["import type { AgentInfo } from \"../adapters/AgentAdapter.js\";\nimport type { TerminalLocation } from \"../terminal/TerminalFocusManager.js\";\nimport { TmuxManager } from \"../terminal/TmuxManager.js\";\nimport {\n AgentRegistry,\n type AgentRuntimeProvider,\n type RegistryEntry,\n} from \"../utils/AgentRegistry.js\";\nimport { AGENTS, type StartableAgentType } from \"../utils/agents.js\";\nimport { createInteractiveRuntime } from \"./RuntimeFactory.js\";\nimport { DEFAULT_PID_POLL_INTERVAL_MS, DEFAULT_PID_POLL_TIMEOUT_MS } from \"./tmux/PidPolling.js\";\nimport { TmuxAgentRuntime } from \"./tmux/TmuxAgentRuntime.js\";\nimport type { InteractiveAgentRuntime } from \"./types.js\";\nimport {\n AgentNameInUseError,\n AgentPidPollTimeoutError,\n AgentRuntimeUnavailableError,\n AgentTerminalNotFoundError,\n TmuxUnavailableError,\n} from \"./errors.js\";\n\nexport {\n AgentNameInUseError,\n AgentPidPollTimeoutError,\n AgentRuntimeUnavailableError,\n AgentTerminalNotFoundError,\n TmuxUnavailableError,\n};\nexport { DEFAULT_PID_POLL_INTERVAL_MS, DEFAULT_PID_POLL_TIMEOUT_MS };\n\nexport interface StartAgentOptions {\n type: StartableAgentType;\n name: string;\n cwd: string;\n runtimeProvider?: AgentRuntimeProvider;\n pollIntervalMs?: number;\n pollTimeoutMs?: number;\n}\n\nexport interface StartAgentDeps {\n tmux?: TmuxManager;\n runtime?: InteractiveAgentRuntime;\n registry?: AgentRegistry;\n /** Called for non-fatal events (e.g., replacing an orphan tmux session). */\n onWarning?: (message: string) => void;\n}\n\nexport interface StopAgentDeps {\n tmux?: Pick<TmuxManager, \"killSession\">;\n runtime?: InteractiveAgentRuntime;\n registry?: Pick<AgentRegistry, \"lookup\">;\n killProcess?: (pid: number, signal: NodeJS.Signals) => void;\n}\n\nexport interface StopAgentResult {\n agentName: string;\n pid: number;\n runtime: AgentRuntimeProvider;\n runtimeRef: unknown | null;\n}\n\nexport interface FocusAgentDeps {\n runtime?: InteractiveAgentRuntime;\n registry?: Pick<AgentRegistry, \"lookup\">;\n focusManager: {\n findTerminal(pid: number): Promise<TerminalLocation | null>;\n focusTerminal(location: TerminalLocation): Promise<boolean>;\n };\n}\n\nexport type FocusAgentResult =\n | { focused: true }\n | { focused: false; reason: \"terminal-not-found\" | \"focus-failed\" };\n\nexport interface SendAgentPromptDeps {\n runtime?: InteractiveAgentRuntime;\n registry?: Pick<AgentRegistry, \"lookup\">;\n focusManager: {\n findTerminal(pid: number): Promise<TerminalLocation | null>;\n };\n writer?: (location: TerminalLocation, text: string) => Promise<void>;\n}\n\n/**\n * Orchestrate `agent start`: ensure the configured runtime is available,\n * create the runtime session, detect the agent PID, and register the entry.\n * Callers are responsible for user input validation before invoking this.\n */\nexport async function startAgent(\n opts: StartAgentOptions,\n deps: StartAgentDeps = {},\n): Promise<RegistryEntry> {\n const registry = deps.registry ?? AgentRegistry.default();\n const agent = AGENTS[opts.type];\n const intervalMs = opts.pollIntervalMs ?? DEFAULT_PID_POLL_INTERVAL_MS;\n const timeoutMs = opts.pollTimeoutMs ?? DEFAULT_PID_POLL_TIMEOUT_MS;\n const provider = opts.runtimeProvider ?? deps.runtime?.provider ?? \"tmux\";\n const tmux = provider === \"tmux\" ? (deps.tmux ?? new TmuxManager()) : undefined;\n const runtime = resolveStartRuntime(provider, { ...deps, tmux });\n\n const availability = await runtime.isAvailable();\n if (!availability.ok) {\n if (provider === \"tmux\") throw new TmuxUnavailableError();\n throw new AgentRuntimeUnavailableError(provider, availability.reason, availability.detail);\n }\n\n registry.prune();\n const existing = registry.lookup(opts.name);\n if (existing) {\n throw new AgentNameInUseError(opts.name, existing.pid);\n }\n\n if (provider === \"tmux\" && tmux && (await tmux.sessionExists(opts.name))) {\n deps.onWarning?.(\n `tmux session \"${opts.name}\" already exists but has no live registry entry — it will be replaced.`,\n );\n }\n\n const result = await runtime.startAgent({\n name: opts.name,\n cwd: opts.cwd,\n kind: agentRuntimeKind(opts.type, provider),\n args: [],\n timeoutMs,\n ...(provider === \"tmux\"\n ? {\n command: agent.command,\n matches: agent.matches,\n pollIntervalMs: intervalMs,\n }\n : {}),\n });\n\n const entry: RegistryEntry = {\n name: opts.name,\n type: opts.type,\n pid: result.pid,\n runtime: runtime.provider,\n runtimeRef: result.runtimeRef,\n cwd: opts.cwd,\n startedAt: new Date().toISOString(),\n sessionId: \"\",\n sessionFilePath: \"\",\n pinned: false,\n };\n registry.register(entry);\n return entry;\n}\n\nexport async function stopAgent(\n agent: Pick<AgentInfo, \"name\" | \"pid\">,\n deps: StopAgentDeps = {},\n): Promise<StopAgentResult> {\n const registry = deps.registry ?? AgentRegistry.default();\n const registryEntry = registry.lookup(agent.name);\n const runtime = resolveRuntimeForEntry(registryEntry, deps);\n const runtimeRef = registryEntry?.runtimeRef ?? null;\n\n await runtime.stop({\n agent,\n runtimeRef,\n killProcess: deps.killProcess,\n });\n\n return {\n agentName: agent.name,\n pid: agent.pid,\n runtime: runtime.provider,\n runtimeRef,\n };\n}\n\nexport async function focusAgent(\n agent: Pick<AgentInfo, \"name\" | \"pid\">,\n deps: FocusAgentDeps,\n): Promise<FocusAgentResult> {\n const registry = deps.registry ?? AgentRegistry.default();\n const registryEntry = registry.lookup(agent.name);\n const runtime = resolveRuntimeForEntry(registryEntry, deps);\n if (runtime.provider === \"tmux\") {\n const location = await deps.focusManager.findTerminal(agent.pid);\n if (!location) return { focused: false, reason: \"terminal-not-found\" };\n\n const focused = await deps.focusManager.focusTerminal(location);\n return focused ? { focused: true } : { focused: false, reason: \"focus-failed\" };\n }\n\n const focused = await runtime.focus({\n agent,\n runtimeRef: registryEntry?.runtimeRef ?? null,\n focusManager: deps.focusManager,\n });\n\n if (focused) return { focused: true };\n return { focused: false, reason: \"focus-failed\" };\n}\n\nexport async function sendAgentPrompt(\n agent: Pick<AgentInfo, \"name\" | \"pid\">,\n prompt: string,\n deps: SendAgentPromptDeps,\n): Promise<void> {\n const registry = deps.registry ?? AgentRegistry.default();\n const registryEntry = registry.lookup(agent.name);\n const runtime = resolveRuntimeForEntry(registryEntry, deps);\n\n await runtime.send(\n {\n agent,\n runtimeRef: registryEntry?.runtimeRef ?? null,\n prompt,\n },\n {\n focusManager: deps.focusManager,\n writer: deps.writer,\n },\n );\n}\n\nfunction resolveStartRuntime(\n provider: AgentRuntimeProvider,\n deps: StartAgentDeps,\n): InteractiveAgentRuntime {\n if (deps.runtime && deps.runtime.provider === provider) {\n return deps.runtime;\n }\n if (provider === \"tmux\") return new TmuxAgentRuntime(deps.tmux);\n return createInteractiveRuntime(provider);\n}\n\nfunction resolveRuntimeForEntry(\n registryEntry: RegistryEntry | null,\n deps: { runtime?: InteractiveAgentRuntime; tmux?: Pick<TmuxManager, \"killSession\"> },\n): InteractiveAgentRuntime {\n if (isHerdrRegistryEntry(registryEntry)) {\n return deps.runtime?.provider === \"herdr\" ? deps.runtime : createInteractiveRuntime(\"herdr\");\n }\n if (deps.runtime?.provider === \"tmux\") return deps.runtime;\n return deps.tmux\n ? new TmuxAgentRuntime(deps.tmux as TmuxManager)\n : createInteractiveRuntime(\"tmux\");\n}\n\nfunction isHerdrRegistryEntry(\n entry: unknown,\n): entry is RegistryEntry & { runtime: \"herdr\"; runtimeRef: unknown } {\n return (\n typeof entry === \"object\" &&\n entry !== null &&\n (entry as { runtime?: unknown }).runtime === \"herdr\" &&\n \"runtimeRef\" in entry\n );\n}\n\nfunction agentRuntimeKind(type: StartableAgentType, provider: AgentRuntimeProvider): string {\n if (provider === \"tmux\") return type;\n return {\n claude: \"claude\",\n codex: \"codex\",\n copilot: \"copilot\",\n gemini_cli: \"gemini\",\n grok_cli: \"grok\",\n opencode: \"opencode\",\n pi: \"pi\",\n }[type];\n}\n"],"names":["TmuxManager","AgentRegistry","AGENTS","createInteractiveRuntime","DEFAULT_PID_POLL_INTERVAL_MS","DEFAULT_PID_POLL_TIMEOUT_MS","TmuxAgentRuntime","AgentNameInUseError","AgentPidPollTimeoutError","AgentRuntimeUnavailableError","AgentTerminalNotFoundError","TmuxUnavailableError","startAgent","opts","deps","registry","default","agent","type","intervalMs","pollIntervalMs","timeoutMs","pollTimeoutMs","provider","runtimeProvider","runtime","tmux","undefined","resolveStartRuntime","availability","isAvailable","ok","reason","detail","prune","existing","lookup","name","pid","sessionExists","onWarning","result","cwd","kind","agentRuntimeKind","args","command","matches","entry","runtimeRef","startedAt","Date","toISOString","sessionId","sessionFilePath","pinned","register","stopAgent","registryEntry","resolveRuntimeForEntry","stop","killProcess","agentName","focusAgent","location","focusManager","findTerminal","focused","focusTerminal","focus","sendAgentPrompt","prompt","send","writer","isHerdrRegistryEntry","claude","codex","copilot","gemini_cli","grok_cli","opencode","pi"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/runtime/ManagedAgentRuntime.ts"],"sourcesContent":["import type { AgentInfo } from \"../adapters/AgentAdapter.js\";\nimport type { TerminalLocation } from \"../terminal/TerminalFocusManager.js\";\nimport { TmuxManager } from \"../terminal/TmuxManager.js\";\nimport {\n AgentRegistry,\n type AgentRuntimeProvider,\n type RegistryEntry,\n} from \"../utils/AgentRegistry.js\";\nimport { AGENTS, type StartableAgentType } from \"../utils/agents.js\";\nimport { createInteractiveRuntime } from \"./RuntimeFactory.js\";\nimport { DEFAULT_PID_POLL_INTERVAL_MS, DEFAULT_PID_POLL_TIMEOUT_MS } from \"./tmux/PidPolling.js\";\nimport { TmuxAgentRuntime } from \"./tmux/TmuxAgentRuntime.js\";\nimport type { InteractiveAgentRuntime } from \"./types.js\";\nimport {\n AgentNameInUseError,\n AgentPidPollTimeoutError,\n AgentRuntimeUnavailableError,\n AgentTerminalNotFoundError,\n TmuxUnavailableError,\n} from \"./errors.js\";\n\nexport {\n AgentNameInUseError,\n AgentPidPollTimeoutError,\n AgentRuntimeUnavailableError,\n AgentTerminalNotFoundError,\n TmuxUnavailableError,\n};\nexport { DEFAULT_PID_POLL_INTERVAL_MS, DEFAULT_PID_POLL_TIMEOUT_MS };\n\nexport interface StartAgentOptions {\n type: StartableAgentType;\n name: string;\n cwd: string;\n runtimeProvider?: AgentRuntimeProvider;\n pollIntervalMs?: number;\n pollTimeoutMs?: number;\n}\n\nexport interface StartAgentDeps {\n tmux?: TmuxManager;\n runtime?: InteractiveAgentRuntime;\n registry?: AgentRegistry;\n /** Called for non-fatal events (e.g., replacing an orphan tmux session). */\n onWarning?: (message: string) => void;\n}\n\nexport interface StopAgentDeps {\n tmux?: Pick<TmuxManager, \"killSession\">;\n runtime?: InteractiveAgentRuntime;\n registry?: Pick<AgentRegistry, \"lookup\">;\n killProcess?: (pid: number, signal: NodeJS.Signals) => void;\n}\n\nexport interface StopAgentResult {\n agentName: string;\n pid: number;\n runtime: AgentRuntimeProvider;\n runtimeRef: unknown | null;\n}\n\nexport interface FocusAgentDeps {\n runtime?: InteractiveAgentRuntime;\n registry?: Pick<AgentRegistry, \"lookup\">;\n focusManager: {\n findTerminal(pid: number): Promise<TerminalLocation | null>;\n focusTerminal(location: TerminalLocation): Promise<boolean>;\n };\n}\n\nexport type FocusAgentResult =\n | { focused: true }\n | { focused: false; reason: \"terminal-not-found\" | \"focus-failed\" };\n\nexport interface SendAgentPromptDeps {\n runtime?: InteractiveAgentRuntime;\n registry?: Pick<AgentRegistry, \"lookup\">;\n focusManager: {\n findTerminal(pid: number): Promise<TerminalLocation | null>;\n };\n writer?: (location: TerminalLocation, text: string) => Promise<void>;\n}\n\n/**\n * Orchestrate `agent start`: ensure the configured runtime is available,\n * create the runtime session, detect the agent PID, and register the entry.\n * Callers are responsible for user input validation before invoking this.\n */\nexport async function startAgent(\n opts: StartAgentOptions,\n deps: StartAgentDeps = {},\n): Promise<RegistryEntry> {\n const registry = deps.registry ?? AgentRegistry.default();\n const agent = AGENTS[opts.type];\n const intervalMs = opts.pollIntervalMs ?? DEFAULT_PID_POLL_INTERVAL_MS;\n const timeoutMs = opts.pollTimeoutMs ?? DEFAULT_PID_POLL_TIMEOUT_MS;\n const provider = opts.runtimeProvider ?? deps.runtime?.provider ?? \"tmux\";\n const tmux = provider === \"tmux\" ? (deps.tmux ?? new TmuxManager()) : undefined;\n const runtime = resolveStartRuntime(provider, { ...deps, tmux });\n\n const availability = await runtime.isAvailable();\n if (!availability.ok) {\n if (provider === \"tmux\") throw new TmuxUnavailableError();\n throw new AgentRuntimeUnavailableError(provider, availability.reason, availability.detail);\n }\n\n registry.prune();\n const existing = registry.lookup(opts.name);\n if (existing) {\n throw new AgentNameInUseError(opts.name, existing.pid);\n }\n\n if (provider === \"tmux\" && tmux && (await tmux.sessionExists(opts.name))) {\n deps.onWarning?.(\n `tmux session \"${opts.name}\" already exists but has no live registry entry — it will be replaced.`,\n );\n }\n\n const result = await runtime.startAgent({\n name: opts.name,\n cwd: opts.cwd,\n kind: agentRuntimeKind(opts.type, provider),\n args: [],\n timeoutMs,\n ...(provider === \"tmux\"\n ? {\n command: agent.command,\n matches: agent.matches,\n pollIntervalMs: intervalMs,\n }\n : {}),\n });\n\n const entry: RegistryEntry = {\n name: opts.name,\n type: opts.type,\n pid: result.pid,\n runtime: runtime.provider,\n runtimeRef: result.runtimeRef,\n cwd: opts.cwd,\n startedAt: new Date().toISOString(),\n sessionId: \"\",\n sessionFilePath: \"\",\n pinned: false,\n };\n registry.register(entry);\n return entry;\n}\n\nexport async function stopAgent(\n agent: Pick<AgentInfo, \"name\" | \"pid\">,\n deps: StopAgentDeps = {},\n): Promise<StopAgentResult> {\n const registry = deps.registry ?? AgentRegistry.default();\n const registryEntry = registry.lookup(agent.name);\n const runtime = resolveRuntimeForEntry(registryEntry, deps);\n const runtimeRef = registryEntry?.runtimeRef ?? null;\n\n await runtime.stop({\n agent,\n runtimeRef,\n killProcess: deps.killProcess,\n });\n\n return {\n agentName: agent.name,\n pid: agent.pid,\n runtime: runtime.provider,\n runtimeRef,\n };\n}\n\nexport async function focusAgent(\n agent: Pick<AgentInfo, \"name\" | \"pid\">,\n deps: FocusAgentDeps,\n): Promise<FocusAgentResult> {\n const registry = deps.registry ?? AgentRegistry.default();\n const registryEntry = registry.lookup(agent.name);\n const runtime = resolveRuntimeForEntry(registryEntry, deps);\n if (runtime.provider === \"tmux\") {\n const location = await deps.focusManager.findTerminal(agent.pid);\n if (!location) return { focused: false, reason: \"terminal-not-found\" };\n\n const focused = await deps.focusManager.focusTerminal(location);\n return focused ? { focused: true } : { focused: false, reason: \"focus-failed\" };\n }\n\n const focused = await runtime.focus({\n agent,\n runtimeRef: registryEntry?.runtimeRef ?? null,\n focusManager: deps.focusManager,\n });\n\n if (focused) return { focused: true };\n return { focused: false, reason: \"focus-failed\" };\n}\n\nexport async function sendAgentPrompt(\n agent: Pick<AgentInfo, \"name\" | \"pid\">,\n prompt: string,\n deps: SendAgentPromptDeps,\n): Promise<void> {\n const registry = deps.registry ?? AgentRegistry.default();\n const registryEntry = registry.lookup(agent.name);\n const runtime = resolveRuntimeForEntry(registryEntry, deps);\n\n await runtime.send(\n {\n agent,\n runtimeRef: registryEntry?.runtimeRef ?? null,\n prompt,\n },\n {\n focusManager: deps.focusManager,\n writer: deps.writer,\n },\n );\n}\n\nfunction resolveStartRuntime(\n provider: AgentRuntimeProvider,\n deps: StartAgentDeps,\n): InteractiveAgentRuntime {\n if (deps.runtime && deps.runtime.provider === provider) {\n return deps.runtime;\n }\n if (provider === \"tmux\") return new TmuxAgentRuntime(deps.tmux);\n return createInteractiveRuntime(provider);\n}\n\nfunction resolveRuntimeForEntry(\n registryEntry: RegistryEntry | null,\n deps: { runtime?: InteractiveAgentRuntime; tmux?: Pick<TmuxManager, \"killSession\"> },\n): InteractiveAgentRuntime {\n if (isHerdrRegistryEntry(registryEntry)) {\n return deps.runtime?.provider === \"herdr\" ? deps.runtime : createInteractiveRuntime(\"herdr\");\n }\n if (deps.runtime?.provider === \"tmux\") return deps.runtime;\n return deps.tmux\n ? new TmuxAgentRuntime(deps.tmux as TmuxManager)\n : createInteractiveRuntime(\"tmux\");\n}\n\nfunction isHerdrRegistryEntry(\n entry: unknown,\n): entry is RegistryEntry & { runtime: \"herdr\"; runtimeRef: unknown } {\n return (\n typeof entry === \"object\" &&\n entry !== null &&\n (entry as { runtime?: unknown }).runtime === \"herdr\" &&\n \"runtimeRef\" in entry\n );\n}\n\nfunction agentRuntimeKind(type: StartableAgentType, provider: AgentRuntimeProvider): string {\n if (provider === \"tmux\") return type;\n return {\n claude: \"claude\",\n codex: \"codex\",\n copilot: \"copilot\",\n gemini_cli: \"gemini\",\n grok_cli: \"grok\",\n antigravity_cli: \"agy\",\n opencode: \"opencode\",\n pi: \"pi\",\n kiro: \"kiro\",\n }[type];\n}\n"],"names":["TmuxManager","AgentRegistry","AGENTS","createInteractiveRuntime","DEFAULT_PID_POLL_INTERVAL_MS","DEFAULT_PID_POLL_TIMEOUT_MS","TmuxAgentRuntime","AgentNameInUseError","AgentPidPollTimeoutError","AgentRuntimeUnavailableError","AgentTerminalNotFoundError","TmuxUnavailableError","startAgent","opts","deps","registry","default","agent","type","intervalMs","pollIntervalMs","timeoutMs","pollTimeoutMs","provider","runtimeProvider","runtime","tmux","undefined","resolveStartRuntime","availability","isAvailable","ok","reason","detail","prune","existing","lookup","name","pid","sessionExists","onWarning","result","cwd","kind","agentRuntimeKind","args","command","matches","entry","runtimeRef","startedAt","Date","toISOString","sessionId","sessionFilePath","pinned","register","stopAgent","registryEntry","resolveRuntimeForEntry","stop","killProcess","agentName","focusAgent","location","focusManager","findTerminal","focused","focusTerminal","focus","sendAgentPrompt","prompt","send","writer","isHerdrRegistryEntry","claude","codex","copilot","gemini_cli","grok_cli","antigravity_cli","opencode","pi","kiro"],"mappings":"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"}
|
|
@@ -98,6 +98,16 @@ function herdrAgentMatchesType(herdrAgent, agentType) {
|
|
|
98
98
|
"grok",
|
|
99
99
|
"grok_cli"
|
|
100
100
|
],
|
|
101
|
+
antigravity_cli: [
|
|
102
|
+
"agy",
|
|
103
|
+
"antigravity",
|
|
104
|
+
"antigravity_cli"
|
|
105
|
+
],
|
|
106
|
+
kiro: [
|
|
107
|
+
"kiro",
|
|
108
|
+
"kiro_cli",
|
|
109
|
+
"kiro-cli"
|
|
110
|
+
],
|
|
101
111
|
opencode: [
|
|
102
112
|
"opencode"
|
|
103
113
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/runtime/herdr/HerdrAgentDiscovery.ts"],"sourcesContent":["import type { AgentInfo, AgentType } from \"../../adapters/AgentAdapter.js\";\nimport { HerdrCliClient, type HerdrCommandRunner } from \"./HerdrCliClient.js\";\nimport type { HerdrRuntimeRef } from \"./HerdrRuntimeRef.js\";\n\nexport interface HerdrAgentPane {\n agent: string;\n agentSessionId?: string;\n cwd?: string;\n paneId: string;\n workspaceId?: string;\n tabId?: string;\n foregroundPids?: number[];\n shellPid?: number;\n}\n\nexport async function fetchHerdrAgentPanes(runner?: HerdrCommandRunner): Promise<HerdrAgentPane[]> {\n const client = new HerdrCliClient(runner);\n const response = await client.runJson([\"pane\", \"list\"]);\n return enrichHerdrAgentPanes(client, extractHerdrAgentPanes(response));\n}\n\nexport function extractHerdrAgentPanes(value: unknown): HerdrAgentPane[] {\n const snapshot = getObject(value, [\"result\", \"snapshot\"]);\n const rawPanes = getArray(value, [\"result\", \"panes\"]) ?? snapshot?.agents;\n if (!Array.isArray(rawPanes)) return [];\n\n const panes: HerdrAgentPane[] = [];\n for (const rawPane of rawPanes) {\n if (!rawPane || typeof rawPane !== \"object\" || Array.isArray(rawPane)) continue;\n const pane = rawPane as Record<string, unknown>;\n const agent = nonEmptyString(pane.agent);\n const paneId = nonEmptyString(pane.pane_id);\n if (!agent || !paneId) continue;\n\n const session = getObject(pane, [\"agent_session\"]);\n const agentSessionId = nonEmptyString(session?.value);\n const cwd = nonEmptyString(pane.cwd);\n const workspaceId = nonEmptyString(pane.workspace_id);\n const tabId = nonEmptyString(pane.tab_id);\n\n panes.push({\n agent,\n paneId,\n ...(agentSessionId ? { agentSessionId } : {}),\n ...(cwd ? { cwd } : {}),\n ...(workspaceId ? { workspaceId } : {}),\n ...(tabId ? { tabId } : {}),\n });\n }\n\n return panes;\n}\n\nexport function findMatchingHerdrPane(\n agent: Pick<AgentInfo, \"type\" | \"projectPath\" | \"sessionId\" | \"pid\">,\n panes: readonly HerdrAgentPane[],\n): HerdrAgentPane | null {\n if (agent.sessionId) {\n const sessionMatches = panes.filter((pane) => pane.agentSessionId === agent.sessionId);\n if (sessionMatches.length === 1) return sessionMatches[0]!;\n if (sessionMatches.length > 1) return null;\n }\n\n const foregroundPidMatches = panes.filter((pane) => pane.foregroundPids?.includes(agent.pid));\n if (foregroundPidMatches.length === 1) return foregroundPidMatches[0]!;\n if (foregroundPidMatches.length > 1) return null;\n\n const shellPidMatches = panes.filter((pane) => pane.shellPid === agent.pid);\n if (shellPidMatches.length === 1) return shellPidMatches[0]!;\n if (shellPidMatches.length > 1) return null;\n\n const cwdMatches = panes.filter(\n (pane) => pane.cwd === agent.projectPath && herdrAgentMatchesType(pane.agent, agent.type),\n );\n return cwdMatches.length === 1 ? cwdMatches[0]! : null;\n}\n\nexport function herdrPaneToRuntimeRef(pane: HerdrAgentPane, agentName: string): HerdrRuntimeRef {\n return {\n session: \"default\",\n paneId: pane.paneId,\n agentName,\n ...(pane.workspaceId ? { workspaceId: pane.workspaceId } : {}),\n ...(pane.tabId ? { tabId: pane.tabId } : {}),\n };\n}\n\nfunction herdrAgentMatchesType(herdrAgent: string, agentType: AgentType): boolean {\n const normalized = herdrAgent.toLowerCase();\n const candidates: Record<AgentType, readonly string[]> = {\n claude: [\"claude\"],\n codex: [\"codex\"],\n copilot: [\"copilot\"],\n gemini_cli: [\"gemini\", \"gemini_cli\"],\n grok_cli: [\"grok\", \"grok_cli\"],\n opencode: [\"opencode\"],\n pi: [\"pi\"],\n other: [\"other\"],\n };\n return candidates[agentType]?.includes(normalized) ?? false;\n}\n\nasync function enrichHerdrAgentPanes(\n client: HerdrCliClient,\n panes: HerdrAgentPane[],\n): Promise<HerdrAgentPane[]> {\n return Promise.all(\n panes.map(async (pane) => {\n try {\n const response = await client.runJson([\"pane\", \"process-info\", \"--pane\", pane.paneId]);\n return {\n ...pane,\n ...extractPaneProcessIds(response),\n };\n } catch {\n return pane;\n }\n }),\n );\n}\n\nfunction extractPaneProcessIds(value: unknown): Pick<HerdrAgentPane, \"foregroundPids\" | \"shellPid\"> {\n const processInfo = getObject(value, [\"result\", \"process_info\"]);\n if (!processInfo) return {};\n\n const foregroundProcesses = processInfo.foreground_processes;\n const foregroundPids: number[] = [];\n if (Array.isArray(foregroundProcesses)) {\n for (const foregroundProcess of foregroundProcesses) {\n if (\n !foregroundProcess ||\n typeof foregroundProcess !== \"object\" ||\n Array.isArray(foregroundProcess)\n )\n continue;\n const pid = positiveIntegerOrNull((foregroundProcess as { pid?: unknown }).pid);\n if (pid !== null) foregroundPids.push(pid);\n }\n }\n const shellPid = positiveIntegerOrNull(processInfo.shell_pid);\n\n return {\n ...(foregroundPids.length > 0 ? { foregroundPids } : {}),\n ...(shellPid !== null ? { shellPid } : {}),\n };\n}\n\nfunction getArray(value: unknown, path: string[]): unknown[] | null {\n let current = value;\n for (const part of path) {\n if (!current || typeof current !== \"object\" || Array.isArray(current) || !(part in current)) {\n return null;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return Array.isArray(current) ? current : null;\n}\n\nfunction getObject(value: unknown, path: string[]): Record<string, unknown> | null {\n let current = value;\n for (const part of path) {\n if (!current || typeof current !== \"object\" || Array.isArray(current) || !(part in current)) {\n return null;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current && typeof current === \"object\" && !Array.isArray(current)\n ? (current as Record<string, unknown>)\n : null;\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction positiveIntegerOrNull(value: unknown): number | null {\n return typeof value === \"number\" && Number.isInteger(value) && value > 0 ? value : null;\n}\n"],"names":["HerdrCliClient","fetchHerdrAgentPanes","runner","client","response","runJson","enrichHerdrAgentPanes","extractHerdrAgentPanes","value","snapshot","getObject","rawPanes","getArray","agents","Array","isArray","panes","rawPane","pane","agent","nonEmptyString","paneId","pane_id","session","agentSessionId","cwd","workspaceId","workspace_id","tabId","tab_id","push","findMatchingHerdrPane","sessionId","sessionMatches","filter","length","foregroundPidMatches","foregroundPids","includes","pid","shellPidMatches","shellPid","cwdMatches","projectPath","herdrAgentMatchesType","type","herdrPaneToRuntimeRef","agentName","herdrAgent","agentType","normalized","toLowerCase","candidates","claude","codex","copilot","gemini_cli","grok_cli","opencode","pi","other","Promise","all","map","extractPaneProcessIds","processInfo","foregroundProcesses","foreground_processes","foregroundProcess","positiveIntegerOrNull","shell_pid","path","current","part","trim","undefined","Number","isInteger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/runtime/herdr/HerdrAgentDiscovery.ts"],"sourcesContent":["import type { AgentInfo, AgentType } from \"../../adapters/AgentAdapter.js\";\nimport { HerdrCliClient, type HerdrCommandRunner } from \"./HerdrCliClient.js\";\nimport type { HerdrRuntimeRef } from \"./HerdrRuntimeRef.js\";\n\nexport interface HerdrAgentPane {\n agent: string;\n agentSessionId?: string;\n cwd?: string;\n paneId: string;\n workspaceId?: string;\n tabId?: string;\n foregroundPids?: number[];\n shellPid?: number;\n}\n\nexport async function fetchHerdrAgentPanes(runner?: HerdrCommandRunner): Promise<HerdrAgentPane[]> {\n const client = new HerdrCliClient(runner);\n const response = await client.runJson([\"pane\", \"list\"]);\n return enrichHerdrAgentPanes(client, extractHerdrAgentPanes(response));\n}\n\nexport function extractHerdrAgentPanes(value: unknown): HerdrAgentPane[] {\n const snapshot = getObject(value, [\"result\", \"snapshot\"]);\n const rawPanes = getArray(value, [\"result\", \"panes\"]) ?? snapshot?.agents;\n if (!Array.isArray(rawPanes)) return [];\n\n const panes: HerdrAgentPane[] = [];\n for (const rawPane of rawPanes) {\n if (!rawPane || typeof rawPane !== \"object\" || Array.isArray(rawPane)) continue;\n const pane = rawPane as Record<string, unknown>;\n const agent = nonEmptyString(pane.agent);\n const paneId = nonEmptyString(pane.pane_id);\n if (!agent || !paneId) continue;\n\n const session = getObject(pane, [\"agent_session\"]);\n const agentSessionId = nonEmptyString(session?.value);\n const cwd = nonEmptyString(pane.cwd);\n const workspaceId = nonEmptyString(pane.workspace_id);\n const tabId = nonEmptyString(pane.tab_id);\n\n panes.push({\n agent,\n paneId,\n ...(agentSessionId ? { agentSessionId } : {}),\n ...(cwd ? { cwd } : {}),\n ...(workspaceId ? { workspaceId } : {}),\n ...(tabId ? { tabId } : {}),\n });\n }\n\n return panes;\n}\n\nexport function findMatchingHerdrPane(\n agent: Pick<AgentInfo, \"type\" | \"projectPath\" | \"sessionId\" | \"pid\">,\n panes: readonly HerdrAgentPane[],\n): HerdrAgentPane | null {\n if (agent.sessionId) {\n const sessionMatches = panes.filter((pane) => pane.agentSessionId === agent.sessionId);\n if (sessionMatches.length === 1) return sessionMatches[0]!;\n if (sessionMatches.length > 1) return null;\n }\n\n const foregroundPidMatches = panes.filter((pane) => pane.foregroundPids?.includes(agent.pid));\n if (foregroundPidMatches.length === 1) return foregroundPidMatches[0]!;\n if (foregroundPidMatches.length > 1) return null;\n\n const shellPidMatches = panes.filter((pane) => pane.shellPid === agent.pid);\n if (shellPidMatches.length === 1) return shellPidMatches[0]!;\n if (shellPidMatches.length > 1) return null;\n\n const cwdMatches = panes.filter(\n (pane) => pane.cwd === agent.projectPath && herdrAgentMatchesType(pane.agent, agent.type),\n );\n return cwdMatches.length === 1 ? cwdMatches[0]! : null;\n}\n\nexport function herdrPaneToRuntimeRef(pane: HerdrAgentPane, agentName: string): HerdrRuntimeRef {\n return {\n session: \"default\",\n paneId: pane.paneId,\n agentName,\n ...(pane.workspaceId ? { workspaceId: pane.workspaceId } : {}),\n ...(pane.tabId ? { tabId: pane.tabId } : {}),\n };\n}\n\nfunction herdrAgentMatchesType(herdrAgent: string, agentType: AgentType): boolean {\n const normalized = herdrAgent.toLowerCase();\n const candidates: Record<AgentType, readonly string[]> = {\n claude: [\"claude\"],\n codex: [\"codex\"],\n copilot: [\"copilot\"],\n gemini_cli: [\"gemini\", \"gemini_cli\"],\n grok_cli: [\"grok\", \"grok_cli\"],\n antigravity_cli: [\"agy\", \"antigravity\", \"antigravity_cli\"],\n kiro: [\"kiro\", \"kiro_cli\", \"kiro-cli\"],\n opencode: [\"opencode\"],\n pi: [\"pi\"],\n other: [\"other\"],\n };\n return candidates[agentType]?.includes(normalized) ?? false;\n}\n\nasync function enrichHerdrAgentPanes(\n client: HerdrCliClient,\n panes: HerdrAgentPane[],\n): Promise<HerdrAgentPane[]> {\n return Promise.all(\n panes.map(async (pane) => {\n try {\n const response = await client.runJson([\"pane\", \"process-info\", \"--pane\", pane.paneId]);\n return {\n ...pane,\n ...extractPaneProcessIds(response),\n };\n } catch {\n return pane;\n }\n }),\n );\n}\n\nfunction extractPaneProcessIds(\n value: unknown,\n): Pick<HerdrAgentPane, \"foregroundPids\" | \"shellPid\"> {\n const processInfo = getObject(value, [\"result\", \"process_info\"]);\n if (!processInfo) return {};\n\n const foregroundProcesses = processInfo.foreground_processes;\n const foregroundPids: number[] = [];\n if (Array.isArray(foregroundProcesses)) {\n for (const foregroundProcess of foregroundProcesses) {\n if (\n !foregroundProcess ||\n typeof foregroundProcess !== \"object\" ||\n Array.isArray(foregroundProcess)\n )\n continue;\n const pid = positiveIntegerOrNull((foregroundProcess as { pid?: unknown }).pid);\n if (pid !== null) foregroundPids.push(pid);\n }\n }\n const shellPid = positiveIntegerOrNull(processInfo.shell_pid);\n\n return {\n ...(foregroundPids.length > 0 ? { foregroundPids } : {}),\n ...(shellPid !== null ? { shellPid } : {}),\n };\n}\n\nfunction getArray(value: unknown, path: string[]): unknown[] | null {\n let current = value;\n for (const part of path) {\n if (!current || typeof current !== \"object\" || Array.isArray(current) || !(part in current)) {\n return null;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return Array.isArray(current) ? current : null;\n}\n\nfunction getObject(value: unknown, path: string[]): Record<string, unknown> | null {\n let current = value;\n for (const part of path) {\n if (!current || typeof current !== \"object\" || Array.isArray(current) || !(part in current)) {\n return null;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current && typeof current === \"object\" && !Array.isArray(current)\n ? (current as Record<string, unknown>)\n : null;\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction positiveIntegerOrNull(value: unknown): number | null {\n return typeof value === \"number\" && Number.isInteger(value) && value > 0 ? value : null;\n}\n"],"names":["HerdrCliClient","fetchHerdrAgentPanes","runner","client","response","runJson","enrichHerdrAgentPanes","extractHerdrAgentPanes","value","snapshot","getObject","rawPanes","getArray","agents","Array","isArray","panes","rawPane","pane","agent","nonEmptyString","paneId","pane_id","session","agentSessionId","cwd","workspaceId","workspace_id","tabId","tab_id","push","findMatchingHerdrPane","sessionId","sessionMatches","filter","length","foregroundPidMatches","foregroundPids","includes","pid","shellPidMatches","shellPid","cwdMatches","projectPath","herdrAgentMatchesType","type","herdrPaneToRuntimeRef","agentName","herdrAgent","agentType","normalized","toLowerCase","candidates","claude","codex","copilot","gemini_cli","grok_cli","antigravity_cli","kiro","opencode","pi","other","Promise","all","map","extractPaneProcessIds","processInfo","foregroundProcesses","foreground_processes","foregroundProcess","positiveIntegerOrNull","shell_pid","path","current","part","trim","undefined","Number","isInteger"],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Incremental JSONL Summary
|
|
3
|
+
*
|
|
4
|
+
* Keeps a small per-file summary of append-only JSONL transcripts so repeated
|
|
5
|
+
* refreshes only parse bytes that were appended since the previous read.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* ```ts
|
|
9
|
+
* const summaries = new IncrementalJsonlSummary<MyState>({
|
|
10
|
+
* initial: () => ({ lastType: undefined }),
|
|
11
|
+
* reduce: (state, entry) => ({ ...state, lastType: (entry as any)?.type }),
|
|
12
|
+
* });
|
|
13
|
+
*
|
|
14
|
+
* const result = summaries.read(filePath); // { state, size, mtime, skippedBytes } | null
|
|
15
|
+
* summaries.prune(); // once per refresh: evict paths not read since the last prune
|
|
16
|
+
* ```
|
|
17
|
+
*
|
|
18
|
+
* Read rules, keyed by file path:
|
|
19
|
+
* - dev, ino, size and mtimeMs unchanged → cached state, 0 bytes read.
|
|
20
|
+
* - same dev/ino and size grew → read only the bytes after the last complete line.
|
|
21
|
+
* - anything else (first read, shrink, rotation, in-place rewrite) → rebuild.
|
|
22
|
+
*
|
|
23
|
+
* A rebuild of a file larger than `headBytes + tailBytes` (default 1 MiB +
|
|
24
|
+
* 4 MiB) is a bounded cold start rather than a full parse: it folds the
|
|
25
|
+
* complete lines in `[0, headBytes)`, calls `reducer.skip(state)`, then folds
|
|
26
|
+
* the lines that start inside `[size - tailBytes, size)`, including a line
|
|
27
|
+
* that starts exactly at `size - tailBytes` (one extra byte before the window
|
|
28
|
+
* is read to tell). Lines straddling a window edge are dropped. A field whose
|
|
29
|
+
* entries all sit in the skipped middle keeps whatever `skip` leaves; there is
|
|
30
|
+
* never a hidden full scan. The result's `skippedBytes` reports the unread
|
|
31
|
+
* middle, and the cache is seeded at end of file so later appends stay
|
|
32
|
+
* incremental.
|
|
33
|
+
*
|
|
34
|
+
* An unterminated last line is never folded into the committed state. If it
|
|
35
|
+
* already parses as JSON it is applied to the returned state only, and it is
|
|
36
|
+
* re-read (from its start offset) once more bytes arrive.
|
|
37
|
+
*/
|
|
38
|
+
/**
|
|
39
|
+
* Pure fold over the entries of a JSONL file.
|
|
40
|
+
*
|
|
41
|
+
* `reduce` receives each non-blank line in file order: the parsed JSON value,
|
|
42
|
+
* or `undefined` when the line is not valid JSON. It must return a new state
|
|
43
|
+
* rather than mutate `state`, and the state should stay O(1) in file size
|
|
44
|
+
* (no entry arrays or raw file contents).
|
|
45
|
+
*
|
|
46
|
+
* `skip` is called once when a bounded cold start skips the middle of a file,
|
|
47
|
+
* between the head lines and the tail lines. It returns the state the tail
|
|
48
|
+
* lines fold onto: keep what the head established (e.g. the first entry) and
|
|
49
|
+
* reset fields that track the latest entry, so those come only from lines
|
|
50
|
+
* actually read. Without `skip`, tail lines fold straight onto the head state.
|
|
51
|
+
*/
|
|
52
|
+
export interface JsonlSummaryReducer<S> {
|
|
53
|
+
initial(): S;
|
|
54
|
+
reduce(state: S, entry: unknown): S;
|
|
55
|
+
skip?(state: S): S;
|
|
56
|
+
}
|
|
57
|
+
export interface JsonlSummaryResult<S> {
|
|
58
|
+
state: S;
|
|
59
|
+
/** File size in bytes when the state was computed. */
|
|
60
|
+
size: number;
|
|
61
|
+
/** File mtime (`fs.Stats.mtime`) when the state was computed. */
|
|
62
|
+
mtime: Date;
|
|
63
|
+
/** Bytes the bounded cold start did not read; 0 when the whole file was parsed. */
|
|
64
|
+
skippedBytes: number;
|
|
65
|
+
}
|
|
66
|
+
export interface JsonlSummaryBounds {
|
|
67
|
+
/** Bytes scanned from the start of the file on a cold start. */
|
|
68
|
+
headBytes: number;
|
|
69
|
+
/** Bytes scanned at the end of the file on a cold start. */
|
|
70
|
+
tailBytes: number;
|
|
71
|
+
}
|
|
72
|
+
export interface IncrementalJsonlSummaryOptions {
|
|
73
|
+
/** Bytes read per `fs.readSync` call. */
|
|
74
|
+
chunkSize?: number;
|
|
75
|
+
/** Cold-start scan bounds; `false` parses rebuilt files from byte 0. */
|
|
76
|
+
bounds?: JsonlSummaryBounds | false;
|
|
77
|
+
}
|
|
78
|
+
export declare const DEFAULT_HEAD_BYTES: number;
|
|
79
|
+
export declare const DEFAULT_TAIL_BYTES: number;
|
|
80
|
+
/** Fold a whole JSONL string with a reducer (one-shot, uncached). */
|
|
81
|
+
export declare function reduceJsonlContent<S>(reducer: JsonlSummaryReducer<S>, content: string): S;
|
|
82
|
+
export declare class IncrementalJsonlSummary<S> {
|
|
83
|
+
private readonly reducer;
|
|
84
|
+
private readonly entries;
|
|
85
|
+
private readonly chunkSize;
|
|
86
|
+
private readonly bounds;
|
|
87
|
+
private generation;
|
|
88
|
+
constructor(reducer: JsonlSummaryReducer<S>, options?: IncrementalJsonlSummaryOptions);
|
|
89
|
+
/** Number of cached files. */
|
|
90
|
+
get size(): number;
|
|
91
|
+
/** Return the summary of `filePath`, reading only what changed. Null if unreadable. */
|
|
92
|
+
read(filePath: string): JsonlSummaryResult<S> | null;
|
|
93
|
+
/** Evict entries not read since the previous `prune()` call. Call once per refresh. */
|
|
94
|
+
prune(): void;
|
|
95
|
+
/** Cold start: fold the head lines, `skip`, then the lines starting in the tail window. */
|
|
96
|
+
private readBounded;
|
|
97
|
+
/** Fold complete lines in `[entry.offset, end)` into `entry`. */
|
|
98
|
+
private readRange;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=IncrementalJsonlSummary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IncrementalJsonlSummary.d.ts","sourceRoot":"","sources":["../../src/utils/IncrementalJsonlSummary.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAIH;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC,OAAO,IAAI,CAAC,CAAC;IACb,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;CACpB;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,KAAK,EAAE,CAAC,CAAC;IACT,sDAAsD;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,KAAK,EAAE,IAAI,CAAC;IACZ,mFAAmF;IACnF,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,8BAA8B;IAC7C,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wEAAwE;IACxE,MAAM,CAAC,EAAE,kBAAkB,GAAG,KAAK,CAAC;CACrC;AAsBD,eAAO,MAAM,kBAAkB,QAAc,CAAC;AAC9C,eAAO,MAAM,kBAAkB,QAAkB,CAAC;AAIlD,qEAAqE;AACrE,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,CAAC,CAMzF;AAED,qBAAa,uBAAuB,CAAC,CAAC;IAOlC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoC;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,UAAU,CAAK;gBAGJ,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAChD,OAAO,GAAE,8BAAmC;IAS9C,8BAA8B;IAC9B,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,uFAAuF;IACvF,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI;IA0DpD,uFAAuF;IACvF,KAAK,IAAI,IAAI;IASb,2FAA2F;IAC3F,OAAO,CAAC,WAAW;IAsBnB,iEAAiE;IACjE,OAAO,CAAC,SAAS;CA0ClB"}
|