@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
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { ConversationMessage, ConversationOptions } from "../../adapters/AgentAdapter.js";
|
|
2
|
+
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
3
|
+
import { type JsonlSummaryBounds } from "../../utils/IncrementalJsonlSummary.js";
|
|
4
|
+
export declare const CHAT_HISTORY_FILE = "chat_history.jsonl";
|
|
5
|
+
/** Parsed state for a single ~/.grok/sessions/<cwd>/<id>/ directory. */
|
|
6
|
+
export interface GrokSession {
|
|
7
|
+
sessionId: string;
|
|
8
|
+
projectPath: string;
|
|
9
|
+
sessionFilePath: string;
|
|
10
|
+
sessionStart: Date;
|
|
11
|
+
lastActive: Date;
|
|
12
|
+
firstUserMessage?: string;
|
|
13
|
+
lastUserMessage?: string;
|
|
14
|
+
lastRole?: ConversationMessage["role"];
|
|
15
|
+
}
|
|
16
|
+
export interface GrokSessionParserOptions {
|
|
17
|
+
/** Cold-start scan bounds for `readSessionIncremental` (see IncrementalJsonlSummary). */
|
|
18
|
+
summaryBounds?: JsonlSummaryBounds | false;
|
|
19
|
+
}
|
|
20
|
+
export declare class GrokSessionParser {
|
|
21
|
+
/** Incremental reader backing `getConversation({ tail })`. */
|
|
22
|
+
private readonly tailReader;
|
|
23
|
+
private readonly sessionCache;
|
|
24
|
+
constructor(options?: GrokSessionParserOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Parse a session directory into a {@link GrokSession} from its
|
|
27
|
+
* chat_history.jsonl transcript. Returns null when the transcript is
|
|
28
|
+
* missing — i.e. there is no real session to surface.
|
|
29
|
+
*/
|
|
30
|
+
readSession(sessionDir: string, defaultCwd: string): GrokSession | null;
|
|
31
|
+
/**
|
|
32
|
+
* Same result as `readSession`, but backed by a per-instance incremental
|
|
33
|
+
* cache so repeated refreshes only parse bytes appended since the last call.
|
|
34
|
+
* Call `pruneSessionCache()` once per refresh to evict files no longer read.
|
|
35
|
+
*
|
|
36
|
+
* The first read of a large transcript is a bounded head + tail scan (see
|
|
37
|
+
* `summaryReducer.skip`); fields whose entries lie only in the skipped
|
|
38
|
+
* middle fall back to their defaults instead of forcing a full parse.
|
|
39
|
+
*/
|
|
40
|
+
readSessionIncremental(sessionDir: string, defaultCwd: string): GrokSession | null;
|
|
41
|
+
/** Evict cached summaries for files not read since the previous prune. */
|
|
42
|
+
pruneSessionCache(): void;
|
|
43
|
+
/** Accepts a session dir or an explicit chat_history.jsonl path. */
|
|
44
|
+
getConversation(sessionPath: string, options?: ConversationOptions): ConversationMessage[];
|
|
45
|
+
/**
|
|
46
|
+
* Determine agent status from parsed session state.
|
|
47
|
+
*
|
|
48
|
+
* - past the idle threshold → IDLE
|
|
49
|
+
* - last transcript turn is an assistant message → WAITING (awaiting user)
|
|
50
|
+
* - otherwise (last turn was a user message, or unknown) → RUNNING
|
|
51
|
+
*/
|
|
52
|
+
determineStatus(session: GrokSession): AgentStatus;
|
|
53
|
+
/**
|
|
54
|
+
* Fold one chat_history.jsonl entry into the O(1) summary. Uses the same
|
|
55
|
+
* record rules as `getConversation` (see `toMessage`), minus system records.
|
|
56
|
+
*
|
|
57
|
+
* `skip` (bounded cold start) keeps the head's first user message and
|
|
58
|
+
* clears the last user message and last role, so those come from the tail
|
|
59
|
+
* only. A first user message beyond the head stays undefined rather than
|
|
60
|
+
* being filled from the tail; latest fields before the tail window stay
|
|
61
|
+
* undefined.
|
|
62
|
+
*/
|
|
63
|
+
private readonly summaryReducer;
|
|
64
|
+
private toSession;
|
|
65
|
+
/** Full pass over chat_history.jsonl building every conversation turn. */
|
|
66
|
+
private parseChatHistory;
|
|
67
|
+
/**
|
|
68
|
+
* Map one parsed chat record to a conversation turn, or null to skip it.
|
|
69
|
+
* Each record is a { type: 'system' | 'user' | 'assistant', content } object
|
|
70
|
+
* where content is either a string or an array of { type: 'text', text } blocks.
|
|
71
|
+
*
|
|
72
|
+
* Grok wraps the real user prompt in <user_query>...</user_query>; the other
|
|
73
|
+
* user records are context injections (<user_info>, <system-reminder>, ...)
|
|
74
|
+
* and are skipped so the summary is the actual prompt, not boilerplate.
|
|
75
|
+
*/
|
|
76
|
+
private toMessage;
|
|
77
|
+
/** Convert one chat_history.jsonl line into a message, or null when it is not one. */
|
|
78
|
+
private lineToMessage;
|
|
79
|
+
/**
|
|
80
|
+
* Extract the prompt inside <user_query>...</user_query>. Returns null when
|
|
81
|
+
* the record has no such tag (a context injection rather than a prompt).
|
|
82
|
+
*/
|
|
83
|
+
private extractUserQuery;
|
|
84
|
+
/** Resolve a session dir or an explicit chat_history.jsonl path to the file. */
|
|
85
|
+
private resolveChatPath;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=GrokSessionParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GrokSessionParser.d.ts","sourceRoot":"","sources":["../../../src/harnesses/grok/GrokSessionParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAGL,KAAK,kBAAkB,EAExB,MAAM,wCAAwC,CAAC;AAKhD,eAAO,MAAM,iBAAiB,uBAAuB,CAAC;AAoBtD,wEAAwE;AACxE,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,IAAI,CAAC;IACnB,UAAU,EAAE,IAAI,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,wBAAwB;IACvC,yFAAyF;IACzF,aAAa,CAAC,EAAE,kBAAkB,GAAG,KAAK,CAAC;CAC5C;AAED,qBAAa,iBAAiB;IAC5B,8DAA8D;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IAEpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4C;gBAE7D,OAAO,GAAE,wBAA6B;IAMlD;;;;OAIG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAUvE;;;;;;;;OAQG;IACH,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAWlF,0EAA0E;IAC1E,iBAAiB,IAAI,IAAI;IAIzB,oEAAoE;IACpE,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE;IAe1F;;;;;;OAMG;IACH,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW;IAUlD;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAiB7B;IAEF,OAAO,CAAC,SAAS;IAoBjB,0EAA0E;IAC1E,OAAO,CAAC,gBAAgB;IAYxB;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IAkBjB,sFAAsF;IACtF,OAAO,CAAC,aAAa;IAYrB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAKxB,gFAAgF;IAChF,OAAO,CAAC,eAAe;CAGxB"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
3
|
+
import { IncrementalJsonlSummary, reduceJsonlContent } from "../../utils/IncrementalJsonlSummary.js";
|
|
4
|
+
import { JsonlTailReader, normalizeTail } from "../../utils/jsonlTail.js";
|
|
5
|
+
import { safeReadFile, safeStat } from "../../utils/session.js";
|
|
6
|
+
import { flattenTextBlocks, isIdle } from "../shared.js";
|
|
7
|
+
export const CHAT_HISTORY_FILE = "chat_history.jsonl";
|
|
8
|
+
export class GrokSessionParser {
|
|
9
|
+
/** Incremental reader backing `getConversation({ tail })`. */ tailReader = new JsonlTailReader();
|
|
10
|
+
sessionCache;
|
|
11
|
+
constructor(options = {}){
|
|
12
|
+
this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {
|
|
13
|
+
bounds: options.summaryBounds
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Parse a session directory into a {@link GrokSession} from its
|
|
18
|
+
* chat_history.jsonl transcript. Returns null when the transcript is
|
|
19
|
+
* missing — i.e. there is no real session to surface.
|
|
20
|
+
*/ readSession(sessionDir, defaultCwd) {
|
|
21
|
+
const chatPath = path.join(sessionDir, CHAT_HISTORY_FILE);
|
|
22
|
+
const chatStat = safeStat(chatPath);
|
|
23
|
+
if (!chatStat) return null;
|
|
24
|
+
const content = safeReadFile(chatPath);
|
|
25
|
+
const state = content === undefined ? {} : reduceJsonlContent(this.summaryReducer, content);
|
|
26
|
+
return this.toSession(sessionDir, defaultCwd, chatPath, chatStat.mtime, state);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Same result as `readSession`, but backed by a per-instance incremental
|
|
30
|
+
* cache so repeated refreshes only parse bytes appended since the last call.
|
|
31
|
+
* Call `pruneSessionCache()` once per refresh to evict files no longer read.
|
|
32
|
+
*
|
|
33
|
+
* The first read of a large transcript is a bounded head + tail scan (see
|
|
34
|
+
* `summaryReducer.skip`); fields whose entries lie only in the skipped
|
|
35
|
+
* middle fall back to their defaults instead of forcing a full parse.
|
|
36
|
+
*/ readSessionIncremental(sessionDir, defaultCwd) {
|
|
37
|
+
const chatPath = path.join(sessionDir, CHAT_HISTORY_FILE);
|
|
38
|
+
const result = this.sessionCache.read(chatPath);
|
|
39
|
+
if (result) {
|
|
40
|
+
return this.toSession(sessionDir, defaultCwd, chatPath, result.mtime, result.state);
|
|
41
|
+
}
|
|
42
|
+
// Present but unreadable: surface the session without a summary, like readSession.
|
|
43
|
+
const chatStat = safeStat(chatPath);
|
|
44
|
+
return chatStat ? this.toSession(sessionDir, defaultCwd, chatPath, chatStat.mtime, {}) : null;
|
|
45
|
+
}
|
|
46
|
+
/** Evict cached summaries for files not read since the previous prune. */ pruneSessionCache() {
|
|
47
|
+
this.sessionCache.prune();
|
|
48
|
+
}
|
|
49
|
+
/** Accepts a session dir or an explicit chat_history.jsonl path. */ getConversation(sessionPath, options) {
|
|
50
|
+
const chatPath = this.resolveChatPath(sessionPath);
|
|
51
|
+
const verbose = options?.verbose ?? false;
|
|
52
|
+
const tail = normalizeTail(options?.tail);
|
|
53
|
+
if (tail !== undefined) {
|
|
54
|
+
return this.tailReader.read(chatPath, tail, {
|
|
55
|
+
parseLine: (line)=>this.lineToMessage(line, verbose)
|
|
56
|
+
}, String(verbose));
|
|
57
|
+
}
|
|
58
|
+
return this.parseChatHistory(chatPath, verbose);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Determine agent status from parsed session state.
|
|
62
|
+
*
|
|
63
|
+
* - past the idle threshold → IDLE
|
|
64
|
+
* - last transcript turn is an assistant message → WAITING (awaiting user)
|
|
65
|
+
* - otherwise (last turn was a user message, or unknown) → RUNNING
|
|
66
|
+
*/ determineStatus(session) {
|
|
67
|
+
if (isIdle(session.lastActive)) {
|
|
68
|
+
return AgentStatus.IDLE;
|
|
69
|
+
}
|
|
70
|
+
if (session.lastRole === "assistant") {
|
|
71
|
+
return AgentStatus.WAITING;
|
|
72
|
+
}
|
|
73
|
+
return AgentStatus.RUNNING;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Fold one chat_history.jsonl entry into the O(1) summary. Uses the same
|
|
77
|
+
* record rules as `getConversation` (see `toMessage`), minus system records.
|
|
78
|
+
*
|
|
79
|
+
* `skip` (bounded cold start) keeps the head's first user message and
|
|
80
|
+
* clears the last user message and last role, so those come from the tail
|
|
81
|
+
* only. A first user message beyond the head stays undefined rather than
|
|
82
|
+
* being filled from the tail; latest fields before the tail window stay
|
|
83
|
+
* undefined.
|
|
84
|
+
*/ summaryReducer = {
|
|
85
|
+
initial: ()=>({}),
|
|
86
|
+
reduce: (state, value)=>{
|
|
87
|
+
const message = this.toMessage(value, false);
|
|
88
|
+
if (!message) return state;
|
|
89
|
+
if (message.role === "user") {
|
|
90
|
+
return {
|
|
91
|
+
...state,
|
|
92
|
+
firstUserMessage: state.firstUserMessage ?? (state.pastHead ? undefined : message.content),
|
|
93
|
+
lastUserMessage: message.content,
|
|
94
|
+
lastRole: "user"
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
...state,
|
|
99
|
+
lastRole: message.role
|
|
100
|
+
};
|
|
101
|
+
},
|
|
102
|
+
skip: (state)=>({
|
|
103
|
+
pastHead: true,
|
|
104
|
+
firstUserMessage: state.firstUserMessage
|
|
105
|
+
})
|
|
106
|
+
};
|
|
107
|
+
toSession(sessionDir, defaultCwd, chatPath, lastActive, state) {
|
|
108
|
+
const dirStat = safeStat(sessionDir);
|
|
109
|
+
return {
|
|
110
|
+
sessionId: path.basename(sessionDir),
|
|
111
|
+
projectPath: defaultCwd,
|
|
112
|
+
sessionFilePath: chatPath,
|
|
113
|
+
sessionStart: dirStat?.birthtime || lastActive,
|
|
114
|
+
lastActive,
|
|
115
|
+
firstUserMessage: state.firstUserMessage,
|
|
116
|
+
lastUserMessage: state.lastUserMessage,
|
|
117
|
+
lastRole: state.lastRole
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/** Full pass over chat_history.jsonl building every conversation turn. */ parseChatHistory(chatPath, verbose) {
|
|
121
|
+
const content = safeReadFile(chatPath);
|
|
122
|
+
if (content === undefined) return [];
|
|
123
|
+
const messages = [];
|
|
124
|
+
for (const line of content.trim().split("\n")){
|
|
125
|
+
const message = this.lineToMessage(line, verbose);
|
|
126
|
+
if (message) messages.push(message);
|
|
127
|
+
}
|
|
128
|
+
return messages;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Map one parsed chat record to a conversation turn, or null to skip it.
|
|
132
|
+
* Each record is a { type: 'system' | 'user' | 'assistant', content } object
|
|
133
|
+
* where content is either a string or an array of { type: 'text', text } blocks.
|
|
134
|
+
*
|
|
135
|
+
* Grok wraps the real user prompt in <user_query>...</user_query>; the other
|
|
136
|
+
* user records are context injections (<user_info>, <system-reminder>, ...)
|
|
137
|
+
* and are skipped so the summary is the actual prompt, not boilerplate.
|
|
138
|
+
*/ toMessage(value, verbose) {
|
|
139
|
+
if (!value || typeof value !== "object") return null;
|
|
140
|
+
const record = value;
|
|
141
|
+
const text = flattenTextBlocks(record.content);
|
|
142
|
+
if (record.type === "user") {
|
|
143
|
+
const query = this.extractUserQuery(text);
|
|
144
|
+
return query === null ? null : {
|
|
145
|
+
role: "user",
|
|
146
|
+
content: query
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
if (record.type === "assistant") {
|
|
150
|
+
return text ? {
|
|
151
|
+
role: "assistant",
|
|
152
|
+
content: text
|
|
153
|
+
} : null;
|
|
154
|
+
}
|
|
155
|
+
if (verbose && record.type === "system") {
|
|
156
|
+
return text ? {
|
|
157
|
+
role: "system",
|
|
158
|
+
content: text
|
|
159
|
+
} : null;
|
|
160
|
+
}
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
/** Convert one chat_history.jsonl line into a message, or null when it is not one. */ lineToMessage(line, verbose) {
|
|
164
|
+
if (!line.trim()) return null;
|
|
165
|
+
let record;
|
|
166
|
+
try {
|
|
167
|
+
record = JSON.parse(line);
|
|
168
|
+
} catch {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
return this.toMessage(record, verbose);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Extract the prompt inside <user_query>...</user_query>. Returns null when
|
|
175
|
+
* the record has no such tag (a context injection rather than a prompt).
|
|
176
|
+
*/ extractUserQuery(text) {
|
|
177
|
+
const match = text.match(/<user_query>\s*([\s\S]*?)\s*<\/user_query>/);
|
|
178
|
+
return match ? match[1].trim() : null;
|
|
179
|
+
}
|
|
180
|
+
/** Resolve a session dir or an explicit chat_history.jsonl path to the file. */ resolveChatPath(sessionPath) {
|
|
181
|
+
return sessionPath.endsWith(".jsonl") ? sessionPath : path.join(sessionPath, CHAT_HISTORY_FILE);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
//# sourceMappingURL=GrokSessionParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/grok/GrokSessionParser.ts"],"sourcesContent":["import * as path from \"path\";\nimport type { ConversationMessage, ConversationOptions } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport {\n IncrementalJsonlSummary,\n reduceJsonlContent,\n type JsonlSummaryBounds,\n type JsonlSummaryReducer,\n} from \"../../utils/IncrementalJsonlSummary.js\";\nimport { JsonlTailReader, normalizeTail } from \"../../utils/jsonlTail.js\";\nimport { safeReadFile, safeStat } from \"../../utils/session.js\";\nimport { flattenTextBlocks, isIdle } from \"../shared.js\";\n\nexport const CHAT_HISTORY_FILE = \"chat_history.jsonl\";\n\n/** One line of chat_history.jsonl. */\ninterface ChatRecord {\n type?: string;\n content?: unknown;\n}\n\n/**\n * O(1) running summary folded from chat records: only the first/last real\n * prompt and the role of the last user/assistant turn, never the turns.\n */\ninterface GrokSummaryState {\n /** A bounded cold start skipped the middle: later lines are not the session's first. */\n pastHead?: boolean;\n firstUserMessage?: string;\n lastUserMessage?: string;\n lastRole?: ConversationMessage[\"role\"];\n}\n\n/** Parsed state for a single ~/.grok/sessions/<cwd>/<id>/ directory. */\nexport interface GrokSession {\n sessionId: string;\n projectPath: string;\n sessionFilePath: string;\n sessionStart: Date;\n lastActive: Date;\n firstUserMessage?: string;\n lastUserMessage?: string;\n lastRole?: ConversationMessage[\"role\"];\n}\n\nexport interface GrokSessionParserOptions {\n /** Cold-start scan bounds for `readSessionIncremental` (see IncrementalJsonlSummary). */\n summaryBounds?: JsonlSummaryBounds | false;\n}\n\nexport class GrokSessionParser {\n /** Incremental reader backing `getConversation({ tail })`. */\n private readonly tailReader = new JsonlTailReader();\n\n private readonly sessionCache: IncrementalJsonlSummary<GrokSummaryState>;\n\n constructor(options: GrokSessionParserOptions = {}) {\n this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {\n bounds: options.summaryBounds,\n });\n }\n\n /**\n * Parse a session directory into a {@link GrokSession} from its\n * chat_history.jsonl transcript. Returns null when the transcript is\n * missing — i.e. there is no real session to surface.\n */\n readSession(sessionDir: string, defaultCwd: string): GrokSession | null {\n const chatPath = path.join(sessionDir, CHAT_HISTORY_FILE);\n const chatStat = safeStat(chatPath);\n if (!chatStat) return null;\n\n const content = safeReadFile(chatPath);\n const state = content === undefined ? {} : reduceJsonlContent(this.summaryReducer, content);\n return this.toSession(sessionDir, defaultCwd, chatPath, chatStat.mtime, state);\n }\n\n /**\n * Same result as `readSession`, but backed by a per-instance incremental\n * cache so repeated refreshes only parse bytes appended since the last call.\n * Call `pruneSessionCache()` once per refresh to evict files no longer read.\n *\n * The first read of a large transcript is a bounded head + tail scan (see\n * `summaryReducer.skip`); fields whose entries lie only in the skipped\n * middle fall back to their defaults instead of forcing a full parse.\n */\n readSessionIncremental(sessionDir: string, defaultCwd: string): GrokSession | null {\n const chatPath = path.join(sessionDir, CHAT_HISTORY_FILE);\n const result = this.sessionCache.read(chatPath);\n if (result) {\n return this.toSession(sessionDir, defaultCwd, chatPath, result.mtime, result.state);\n }\n // Present but unreadable: surface the session without a summary, like readSession.\n const chatStat = safeStat(chatPath);\n return chatStat ? this.toSession(sessionDir, defaultCwd, chatPath, chatStat.mtime, {}) : null;\n }\n\n /** Evict cached summaries for files not read since the previous prune. */\n pruneSessionCache(): void {\n this.sessionCache.prune();\n }\n\n /** Accepts a session dir or an explicit chat_history.jsonl path. */\n getConversation(sessionPath: string, options?: ConversationOptions): ConversationMessage[] {\n const chatPath = this.resolveChatPath(sessionPath);\n const verbose = options?.verbose ?? false;\n const tail = normalizeTail(options?.tail);\n if (tail !== undefined) {\n return this.tailReader.read(\n chatPath,\n tail,\n { parseLine: (line) => this.lineToMessage(line, verbose) },\n String(verbose),\n );\n }\n return this.parseChatHistory(chatPath, verbose);\n }\n\n /**\n * Determine agent status from parsed session state.\n *\n * - past the idle threshold → IDLE\n * - last transcript turn is an assistant message → WAITING (awaiting user)\n * - otherwise (last turn was a user message, or unknown) → RUNNING\n */\n determineStatus(session: GrokSession): AgentStatus {\n if (isIdle(session.lastActive)) {\n return AgentStatus.IDLE;\n }\n if (session.lastRole === \"assistant\") {\n return AgentStatus.WAITING;\n }\n return AgentStatus.RUNNING;\n }\n\n /**\n * Fold one chat_history.jsonl entry into the O(1) summary. Uses the same\n * record rules as `getConversation` (see `toMessage`), minus system records.\n *\n * `skip` (bounded cold start) keeps the head's first user message and\n * clears the last user message and last role, so those come from the tail\n * only. A first user message beyond the head stays undefined rather than\n * being filled from the tail; latest fields before the tail window stay\n * undefined.\n */\n private readonly summaryReducer: JsonlSummaryReducer<GrokSummaryState> = {\n initial: () => ({}),\n reduce: (state, value) => {\n const message = this.toMessage(value, false);\n if (!message) return state;\n if (message.role === \"user\") {\n return {\n ...state,\n firstUserMessage:\n state.firstUserMessage ?? (state.pastHead ? undefined : message.content),\n lastUserMessage: message.content,\n lastRole: \"user\",\n };\n }\n return { ...state, lastRole: message.role };\n },\n skip: (state) => ({ pastHead: true, firstUserMessage: state.firstUserMessage }),\n };\n\n private toSession(\n sessionDir: string,\n defaultCwd: string,\n chatPath: string,\n lastActive: Date,\n state: GrokSummaryState,\n ): GrokSession {\n const dirStat = safeStat(sessionDir);\n return {\n sessionId: path.basename(sessionDir),\n projectPath: defaultCwd,\n sessionFilePath: chatPath,\n sessionStart: dirStat?.birthtime || lastActive,\n lastActive,\n firstUserMessage: state.firstUserMessage,\n lastUserMessage: state.lastUserMessage,\n lastRole: state.lastRole,\n };\n }\n\n /** Full pass over chat_history.jsonl building every conversation turn. */\n private parseChatHistory(chatPath: string, verbose: boolean): ConversationMessage[] {\n const content = safeReadFile(chatPath);\n if (content === undefined) return [];\n\n const messages: ConversationMessage[] = [];\n for (const line of content.trim().split(\"\\n\")) {\n const message = this.lineToMessage(line, verbose);\n if (message) messages.push(message);\n }\n return messages;\n }\n\n /**\n * Map one parsed chat record to a conversation turn, or null to skip it.\n * Each record is a { type: 'system' | 'user' | 'assistant', content } object\n * where content is either a string or an array of { type: 'text', text } blocks.\n *\n * Grok wraps the real user prompt in <user_query>...</user_query>; the other\n * user records are context injections (<user_info>, <system-reminder>, ...)\n * and are skipped so the summary is the actual prompt, not boilerplate.\n */\n private toMessage(value: unknown, verbose: boolean): ConversationMessage | null {\n if (!value || typeof value !== \"object\") return null;\n const record = value as ChatRecord;\n\n const text = flattenTextBlocks(record.content);\n if (record.type === \"user\") {\n const query = this.extractUserQuery(text);\n return query === null ? null : { role: \"user\", content: query };\n }\n if (record.type === \"assistant\") {\n return text ? { role: \"assistant\", content: text } : null;\n }\n if (verbose && record.type === \"system\") {\n return text ? { role: \"system\", content: text } : null;\n }\n return null;\n }\n\n /** Convert one chat_history.jsonl line into a message, or null when it is not one. */\n private lineToMessage(line: string, verbose: boolean): ConversationMessage | null {\n if (!line.trim()) return null;\n\n let record: unknown;\n try {\n record = JSON.parse(line);\n } catch {\n return null;\n }\n return this.toMessage(record, verbose);\n }\n\n /**\n * Extract the prompt inside <user_query>...</user_query>. Returns null when\n * the record has no such tag (a context injection rather than a prompt).\n */\n private extractUserQuery(text: string): string | null {\n const match = text.match(/<user_query>\\s*([\\s\\S]*?)\\s*<\\/user_query>/);\n return match ? match[1].trim() : null;\n }\n\n /** Resolve a session dir or an explicit chat_history.jsonl path to the file. */\n private resolveChatPath(sessionPath: string): string {\n return sessionPath.endsWith(\".jsonl\") ? sessionPath : path.join(sessionPath, CHAT_HISTORY_FILE);\n }\n}\n"],"names":["path","AgentStatus","IncrementalJsonlSummary","reduceJsonlContent","JsonlTailReader","normalizeTail","safeReadFile","safeStat","flattenTextBlocks","isIdle","CHAT_HISTORY_FILE","GrokSessionParser","tailReader","sessionCache","options","summaryReducer","bounds","summaryBounds","readSession","sessionDir","defaultCwd","chatPath","join","chatStat","content","state","undefined","toSession","mtime","readSessionIncremental","result","read","pruneSessionCache","prune","getConversation","sessionPath","resolveChatPath","verbose","tail","parseLine","line","lineToMessage","String","parseChatHistory","determineStatus","session","lastActive","IDLE","lastRole","WAITING","RUNNING","initial","reduce","value","message","toMessage","role","firstUserMessage","pastHead","lastUserMessage","skip","dirStat","sessionId","basename","projectPath","sessionFilePath","sessionStart","birthtime","messages","trim","split","push","record","text","type","query","extractUserQuery","JSON","parse","match","endsWith"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AgentAdapter } from "../adapters/AgentAdapter.js";
|
|
2
|
+
/**
|
|
3
|
+
* One instance of every built-in harness adapter, in registration order
|
|
4
|
+
* (which is also the order agents are listed in). Register a new harness here.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createBuiltinAdapters(): AgentAdapter[];
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harnesses/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAWhE;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,YAAY,EAAE,CAYtD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { AntigravityCliAdapter } from "./antigravity/AntigravityCliAdapter.js";
|
|
2
|
+
import { ClaudeCodeAdapter } from "./claude/ClaudeCodeAdapter.js";
|
|
3
|
+
import { CodexAdapter } from "./codex/CodexAdapter.js";
|
|
4
|
+
import { CopilotAdapter } from "./copilot/CopilotAdapter.js";
|
|
5
|
+
import { GeminiCliAdapter } from "./gemini/GeminiCliAdapter.js";
|
|
6
|
+
import { GrokCliAdapter } from "./grok/GrokCliAdapter.js";
|
|
7
|
+
import { KiroAdapter } from "./kiro/KiroAdapter.js";
|
|
8
|
+
import { OpenCodeAdapter } from "./opencode/OpenCodeAdapter.js";
|
|
9
|
+
import { PiAdapter } from "./pi/PiAdapter.js";
|
|
10
|
+
/**
|
|
11
|
+
* One instance of every built-in harness adapter, in registration order
|
|
12
|
+
* (which is also the order agents are listed in). Register a new harness here.
|
|
13
|
+
*/ export function createBuiltinAdapters() {
|
|
14
|
+
return [
|
|
15
|
+
new ClaudeCodeAdapter(),
|
|
16
|
+
new CodexAdapter(),
|
|
17
|
+
new CopilotAdapter(),
|
|
18
|
+
new GeminiCliAdapter(),
|
|
19
|
+
new GrokCliAdapter(),
|
|
20
|
+
new KiroAdapter(),
|
|
21
|
+
new AntigravityCliAdapter(),
|
|
22
|
+
new OpenCodeAdapter(),
|
|
23
|
+
new PiAdapter()
|
|
24
|
+
];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/harnesses/index.ts"],"sourcesContent":["import type { AgentAdapter } from \"../adapters/AgentAdapter.js\";\nimport { AntigravityCliAdapter } from \"./antigravity/AntigravityCliAdapter.js\";\nimport { ClaudeCodeAdapter } from \"./claude/ClaudeCodeAdapter.js\";\nimport { CodexAdapter } from \"./codex/CodexAdapter.js\";\nimport { CopilotAdapter } from \"./copilot/CopilotAdapter.js\";\nimport { GeminiCliAdapter } from \"./gemini/GeminiCliAdapter.js\";\nimport { GrokCliAdapter } from \"./grok/GrokCliAdapter.js\";\nimport { KiroAdapter } from \"./kiro/KiroAdapter.js\";\nimport { OpenCodeAdapter } from \"./opencode/OpenCodeAdapter.js\";\nimport { PiAdapter } from \"./pi/PiAdapter.js\";\n\n/**\n * One instance of every built-in harness adapter, in registration order\n * (which is also the order agents are listed in). Register a new harness here.\n */\nexport function createBuiltinAdapters(): AgentAdapter[] {\n return [\n new ClaudeCodeAdapter(),\n new CodexAdapter(),\n new CopilotAdapter(),\n new GeminiCliAdapter(),\n new GrokCliAdapter(),\n new KiroAdapter(),\n new AntigravityCliAdapter(),\n new OpenCodeAdapter(),\n new PiAdapter(),\n ];\n}\n"],"names":["AntigravityCliAdapter","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","KiroAdapter","OpenCodeAdapter","PiAdapter","createBuiltinAdapters"],"mappings":"AACA,SAASA,qBAAqB,QAAQ,yCAAyC;AAC/E,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,SAASC,YAAY,QAAQ,0BAA0B;AACvD,SAASC,cAAc,QAAQ,8BAA8B;AAC7D,SAASC,gBAAgB,QAAQ,+BAA+B;AAChE,SAASC,cAAc,QAAQ,2BAA2B;AAC1D,SAASC,WAAW,QAAQ,wBAAwB;AACpD,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,oBAAoB;AAE9C;;;CAGC,GACD,OAAO,SAASC;IACd,OAAO;QACL,IAAIR;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIN;QACJ,IAAIO;QACJ,IAAIC;KACL;AACH"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, ConversationOptions, SessionSummary, ListSessionsOptions, AgentDetectionContext } from "../../adapters/AgentAdapter.js";
|
|
2
|
+
/**
|
|
3
|
+
* Kiro Adapter
|
|
4
|
+
*
|
|
5
|
+
* Detects running Kiro agents by matching the PID in each
|
|
6
|
+
* ~/.kiro/sessions/cli/<session-id>.lock to a running Kiro process (walking up
|
|
7
|
+
* from helper processes such as `kiro-cli-chat acp`), then reading the sibling
|
|
8
|
+
* <session-id>.json metadata and <session-id>.jsonl transcript.
|
|
9
|
+
*/
|
|
10
|
+
export declare class KiroAdapter implements AgentAdapter {
|
|
11
|
+
readonly type: "kiro";
|
|
12
|
+
/**
|
|
13
|
+
* Also collects the helpers between a lock holder and its kiro-cli, such as
|
|
14
|
+
* the bundled `bun … tui.js`; `canHandle` still decides which are agents.
|
|
15
|
+
*/
|
|
16
|
+
readonly processNames: readonly ["kiro-cli", "kiro", "kiro-cli-chat", "node", "bun"];
|
|
17
|
+
private parser;
|
|
18
|
+
private mapper;
|
|
19
|
+
private locator;
|
|
20
|
+
constructor();
|
|
21
|
+
canHandle(processInfo: ProcessInfo): boolean;
|
|
22
|
+
detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;
|
|
23
|
+
private detectRunningAgents;
|
|
24
|
+
getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[];
|
|
25
|
+
listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
|
|
26
|
+
findSessionsById(sessionId: string): Promise<SessionSummary[]>;
|
|
27
|
+
private toSessionSummary;
|
|
28
|
+
/** `kiro-cli` / `kiro`, directly or as a script run by node or bun. */
|
|
29
|
+
private isKiroExecutable;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=KiroAdapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KiroAdapter.d.ts","sourceRoot":"","sources":["../../../src/harnesses/kiro/KiroAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AAUxC;;;;;;;GAOG;AACH,qBAAa,WAAY,YAAW,YAAY;IAC9C,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAChC;;;OAGG;IACH,QAAQ,CAAC,YAAY,gEAAiE;IAEtF,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAqB;;IAQpC,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAItC,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YAS3D,mBAAmB;IAwBjC,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE;IAIxF,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAYnE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAOpE,OAAO,CAAC,gBAAgB;IAYxB,uEAAuE;IACvE,OAAO,CAAC,gBAAgB;CAgBzB"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import { executablePath } from "../../utils/process.js";
|
|
3
|
+
import { findHarnessProcesses } from "../shared.js";
|
|
4
|
+
import { KiroAgentMapper } from "./KiroAgentMapper.js";
|
|
5
|
+
import { KiroSessionLocator } from "./KiroSessionLocator.js";
|
|
6
|
+
import { KiroSessionParser } from "./KiroSessionParser.js";
|
|
7
|
+
const KIRO_BASENAMES = new Set([
|
|
8
|
+
"kiro-cli",
|
|
9
|
+
"kiro"
|
|
10
|
+
]);
|
|
11
|
+
const SCRIPT_RUNTIMES = new Set([
|
|
12
|
+
"node",
|
|
13
|
+
"bun"
|
|
14
|
+
]);
|
|
15
|
+
/**
|
|
16
|
+
* Kiro Adapter
|
|
17
|
+
*
|
|
18
|
+
* Detects running Kiro agents by matching the PID in each
|
|
19
|
+
* ~/.kiro/sessions/cli/<session-id>.lock to a running Kiro process (walking up
|
|
20
|
+
* from helper processes such as `kiro-cli-chat acp`), then reading the sibling
|
|
21
|
+
* <session-id>.json metadata and <session-id>.jsonl transcript.
|
|
22
|
+
*/ export class KiroAdapter {
|
|
23
|
+
type = "kiro";
|
|
24
|
+
/**
|
|
25
|
+
* Also collects the helpers between a lock holder and its kiro-cli, such as
|
|
26
|
+
* the bundled `bun … tui.js`; `canHandle` still decides which are agents.
|
|
27
|
+
*/ processNames = [
|
|
28
|
+
"kiro-cli",
|
|
29
|
+
"kiro",
|
|
30
|
+
"kiro-cli-chat",
|
|
31
|
+
"node",
|
|
32
|
+
"bun"
|
|
33
|
+
];
|
|
34
|
+
parser;
|
|
35
|
+
mapper;
|
|
36
|
+
locator;
|
|
37
|
+
constructor(){
|
|
38
|
+
this.parser = new KiroSessionParser();
|
|
39
|
+
this.mapper = new KiroAgentMapper(this.parser);
|
|
40
|
+
this.locator = new KiroSessionLocator();
|
|
41
|
+
}
|
|
42
|
+
canHandle(processInfo) {
|
|
43
|
+
return this.isKiroExecutable(processInfo.command);
|
|
44
|
+
}
|
|
45
|
+
async detectAgents(context) {
|
|
46
|
+
try {
|
|
47
|
+
return await this.detectRunningAgents(context);
|
|
48
|
+
} finally{
|
|
49
|
+
// Drop cached summaries for sessions that were not part of this refresh
|
|
50
|
+
this.parser.pruneSessionCache();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async detectRunningAgents(context) {
|
|
54
|
+
const { relevant, processes } = await findHarnessProcesses(this, context);
|
|
55
|
+
if (processes.length === 0) return [];
|
|
56
|
+
const agents = [];
|
|
57
|
+
const matchedPids = new Set();
|
|
58
|
+
for (const match of this.locator.matchRunningProcesses(relevant, processes, (process)=>this.canHandle(process))){
|
|
59
|
+
const session = this.parser.readSessionIncremental(match.session, match.process.cwd);
|
|
60
|
+
if (!session) continue;
|
|
61
|
+
agents.push(this.mapper.mapSessionToAgent({
|
|
62
|
+
session,
|
|
63
|
+
processInfo: match.process
|
|
64
|
+
}));
|
|
65
|
+
matchedPids.add(match.process.pid);
|
|
66
|
+
}
|
|
67
|
+
for (const proc of processes){
|
|
68
|
+
if (!matchedPids.has(proc.pid)) {
|
|
69
|
+
agents.push(this.mapper.mapProcessOnlyAgent(proc));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return agents;
|
|
73
|
+
}
|
|
74
|
+
getConversation(sessionFilePath, options) {
|
|
75
|
+
return this.parser.getConversation(sessionFilePath, options);
|
|
76
|
+
}
|
|
77
|
+
async listSessions(opts) {
|
|
78
|
+
const summaries = [];
|
|
79
|
+
for (const paths of this.locator.listSessions()){
|
|
80
|
+
const session = this.parser.readSession(paths);
|
|
81
|
+
if (!session) continue;
|
|
82
|
+
if (opts?.cwd !== undefined && session.projectPath !== opts.cwd) continue;
|
|
83
|
+
summaries.push(this.toSessionSummary(session));
|
|
84
|
+
}
|
|
85
|
+
return summaries;
|
|
86
|
+
}
|
|
87
|
+
async findSessionsById(sessionId) {
|
|
88
|
+
const paths = this.locator.findSession(sessionId);
|
|
89
|
+
const session = paths ? this.parser.readSession(paths) : null;
|
|
90
|
+
// listSessions reports the metadata's id, so only an exact match counts.
|
|
91
|
+
return session?.sessionId === sessionId ? [
|
|
92
|
+
this.toSessionSummary(session)
|
|
93
|
+
] : [];
|
|
94
|
+
}
|
|
95
|
+
toSessionSummary(session) {
|
|
96
|
+
return {
|
|
97
|
+
type: this.type,
|
|
98
|
+
sessionId: session.sessionId,
|
|
99
|
+
cwd: session.projectPath,
|
|
100
|
+
firstUserMessage: session.firstUserMessage,
|
|
101
|
+
lastActive: session.lastActive,
|
|
102
|
+
startedAt: session.sessionStart,
|
|
103
|
+
sessionFilePath: session.sessionFilePath
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/** `kiro-cli` / `kiro`, directly or as a script run by node or bun. */ isKiroExecutable(command) {
|
|
107
|
+
const trimmed = command.trim();
|
|
108
|
+
const executable = executablePath(trimmed);
|
|
109
|
+
if (!executable) return false;
|
|
110
|
+
const executableName = kiroBasename(executable);
|
|
111
|
+
if (KIRO_BASENAMES.has(executableName)) return true;
|
|
112
|
+
if (!SCRIPT_RUNTIMES.has(executableName)) return false;
|
|
113
|
+
const args = trimmed.slice(executable.length).trim().split(/\s+/);
|
|
114
|
+
const scriptIndex = args.findIndex((token)=>token !== "" && !token.startsWith("-"));
|
|
115
|
+
if (scriptIndex === -1) return false;
|
|
116
|
+
// The script path may also contain spaces; resolve it like argv[0].
|
|
117
|
+
const script = executablePath(args.slice(scriptIndex).join(" "));
|
|
118
|
+
return KIRO_BASENAMES.has(kiroBasename(script));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function kiroBasename(executable) {
|
|
122
|
+
return path.basename(executable.replace(/\\/g, "/")).toLowerCase().replace(/\.(exe|js)$/, "");
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
//# sourceMappingURL=KiroAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/kiro/KiroAdapter.ts"],"sourcesContent":["import * as path from \"path\";\nimport type {\n AgentAdapter,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n ConversationOptions,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"../../adapters/AgentAdapter.js\";\nimport { executablePath } from \"../../utils/process.js\";\nimport { findHarnessProcesses } from \"../shared.js\";\nimport { KiroAgentMapper } from \"./KiroAgentMapper.js\";\nimport { KiroSessionLocator } from \"./KiroSessionLocator.js\";\nimport { KiroSessionParser, type KiroSession } from \"./KiroSessionParser.js\";\n\nconst KIRO_BASENAMES = new Set([\"kiro-cli\", \"kiro\"]);\nconst SCRIPT_RUNTIMES = new Set([\"node\", \"bun\"]);\n\n/**\n * Kiro Adapter\n *\n * Detects running Kiro agents by matching the PID in each\n * ~/.kiro/sessions/cli/<session-id>.lock to a running Kiro process (walking up\n * from helper processes such as `kiro-cli-chat acp`), then reading the sibling\n * <session-id>.json metadata and <session-id>.jsonl transcript.\n */\nexport class KiroAdapter implements AgentAdapter {\n readonly type = \"kiro\" as const;\n /**\n * Also collects the helpers between a lock holder and its kiro-cli, such as\n * the bundled `bun … tui.js`; `canHandle` still decides which are agents.\n */\n readonly processNames = [\"kiro-cli\", \"kiro\", \"kiro-cli-chat\", \"node\", \"bun\"] as const;\n\n private parser: KiroSessionParser;\n private mapper: KiroAgentMapper;\n private locator: KiroSessionLocator;\n\n constructor() {\n this.parser = new KiroSessionParser();\n this.mapper = new KiroAgentMapper(this.parser);\n this.locator = new KiroSessionLocator();\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return this.isKiroExecutable(processInfo.command);\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n try {\n return await this.detectRunningAgents(context);\n } finally {\n // Drop cached summaries for sessions that were not part of this refresh\n this.parser.pruneSessionCache();\n }\n }\n\n private async detectRunningAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const { relevant, processes } = await findHarnessProcesses(this, context);\n if (processes.length === 0) return [];\n\n const agents: AgentInfo[] = [];\n const matchedPids = new Set<number>();\n for (const match of this.locator.matchRunningProcesses(relevant, processes, (process) =>\n this.canHandle(process),\n )) {\n const session = this.parser.readSessionIncremental(match.session, match.process.cwd);\n if (!session) continue;\n\n agents.push(this.mapper.mapSessionToAgent({ session, processInfo: match.process }));\n matchedPids.add(match.process.pid);\n }\n\n for (const proc of processes) {\n if (!matchedPids.has(proc.pid)) {\n agents.push(this.mapper.mapProcessOnlyAgent(proc));\n }\n }\n return agents;\n }\n\n getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {\n return this.parser.getConversation(sessionFilePath, options);\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const summaries: SessionSummary[] = [];\n for (const paths of this.locator.listSessions()) {\n const session = this.parser.readSession(paths);\n if (!session) continue;\n if (opts?.cwd !== undefined && session.projectPath !== opts.cwd) continue;\n\n summaries.push(this.toSessionSummary(session));\n }\n return summaries;\n }\n\n async findSessionsById(sessionId: string): Promise<SessionSummary[]> {\n const paths = this.locator.findSession(sessionId);\n const session = paths ? this.parser.readSession(paths) : null;\n // listSessions reports the metadata's id, so only an exact match counts.\n return session?.sessionId === sessionId ? [this.toSessionSummary(session)] : [];\n }\n\n private toSessionSummary(session: KiroSession): SessionSummary {\n return {\n type: this.type,\n sessionId: session.sessionId,\n cwd: session.projectPath,\n firstUserMessage: session.firstUserMessage,\n lastActive: session.lastActive,\n startedAt: session.sessionStart,\n sessionFilePath: session.sessionFilePath,\n };\n }\n\n /** `kiro-cli` / `kiro`, directly or as a script run by node or bun. */\n private isKiroExecutable(command: string): boolean {\n const trimmed = command.trim();\n const executable = executablePath(trimmed);\n if (!executable) return false;\n\n const executableName = kiroBasename(executable);\n if (KIRO_BASENAMES.has(executableName)) return true;\n if (!SCRIPT_RUNTIMES.has(executableName)) return false;\n\n const args = trimmed.slice(executable.length).trim().split(/\\s+/);\n const scriptIndex = args.findIndex((token) => token !== \"\" && !token.startsWith(\"-\"));\n if (scriptIndex === -1) return false;\n // The script path may also contain spaces; resolve it like argv[0].\n const script = executablePath(args.slice(scriptIndex).join(\" \"));\n return KIRO_BASENAMES.has(kiroBasename(script));\n }\n}\n\nfunction kiroBasename(executable: string): string {\n return path\n .basename(executable.replace(/\\\\/g, \"/\"))\n .toLowerCase()\n .replace(/\\.(exe|js)$/, \"\");\n}\n"],"names":["path","executablePath","findHarnessProcesses","KiroAgentMapper","KiroSessionLocator","KiroSessionParser","KIRO_BASENAMES","Set","SCRIPT_RUNTIMES","KiroAdapter","type","processNames","parser","mapper","locator","canHandle","processInfo","isKiroExecutable","command","detectAgents","context","detectRunningAgents","pruneSessionCache","relevant","processes","length","agents","matchedPids","match","matchRunningProcesses","process","session","readSessionIncremental","cwd","push","mapSessionToAgent","add","pid","proc","has","mapProcessOnlyAgent","getConversation","sessionFilePath","options","listSessions","opts","summaries","paths","readSession","undefined","projectPath","toSessionSummary","findSessionsById","sessionId","findSession","firstUserMessage","lastActive","startedAt","sessionStart","trimmed","trim","executable","executableName","kiroBasename","args","slice","split","scriptIndex","findIndex","token","startsWith","script","join","basename","replace","toLowerCase"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AgentInfo, ProcessInfo } from "../../adapters/AgentAdapter.js";
|
|
2
|
+
import { KiroSessionParser, type KiroSession } from "./KiroSessionParser.js";
|
|
3
|
+
export interface KiroSessionAgentInput {
|
|
4
|
+
session: KiroSession;
|
|
5
|
+
processInfo: ProcessInfo;
|
|
6
|
+
}
|
|
7
|
+
export declare class KiroAgentMapper {
|
|
8
|
+
private readonly parser;
|
|
9
|
+
constructor(parser?: KiroSessionParser);
|
|
10
|
+
mapSessionToAgent({ session, processInfo }: KiroSessionAgentInput): AgentInfo;
|
|
11
|
+
mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=KiroAgentMapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KiroAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/harnesses/kiro/KiroAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAG7E,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE7E,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,iBAA2C;IAEhF,iBAAiB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,qBAAqB,GAAG,SAAS;IAiB7E,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAGzD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { generateAgentName } from "../../utils/matching.js";
|
|
2
|
+
import { processOnlyAgent, SUMMARY_MAX_LENGTH, truncate } from "../shared.js";
|
|
3
|
+
import { KiroSessionParser } from "./KiroSessionParser.js";
|
|
4
|
+
export class KiroAgentMapper {
|
|
5
|
+
parser;
|
|
6
|
+
constructor(parser = new KiroSessionParser()){
|
|
7
|
+
this.parser = parser;
|
|
8
|
+
}
|
|
9
|
+
mapSessionToAgent({ session, processInfo }) {
|
|
10
|
+
return {
|
|
11
|
+
name: generateAgentName(session.projectPath, processInfo.pid),
|
|
12
|
+
type: "kiro",
|
|
13
|
+
status: this.parser.determineStatus(session),
|
|
14
|
+
summary: truncate(session.lastUserMessage || session.title || "Kiro session active", SUMMARY_MAX_LENGTH),
|
|
15
|
+
pid: processInfo.pid,
|
|
16
|
+
projectPath: session.projectPath,
|
|
17
|
+
sessionId: session.sessionId,
|
|
18
|
+
lastActive: session.lastActive,
|
|
19
|
+
sessionFilePath: session.sessionFilePath
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
mapProcessOnlyAgent(processInfo) {
|
|
23
|
+
return processOnlyAgent("kiro", processInfo, {
|
|
24
|
+
summary: "Kiro process running"
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=KiroAgentMapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/kiro/KiroAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\nimport { processOnlyAgent, SUMMARY_MAX_LENGTH, truncate } from \"../shared.js\";\nimport { KiroSessionParser, type KiroSession } from \"./KiroSessionParser.js\";\n\nexport interface KiroSessionAgentInput {\n session: KiroSession;\n processInfo: ProcessInfo;\n}\n\nexport class KiroAgentMapper {\n constructor(private readonly parser: KiroSessionParser = new KiroSessionParser()) {}\n\n mapSessionToAgent({ session, processInfo }: KiroSessionAgentInput): AgentInfo {\n return {\n name: generateAgentName(session.projectPath, processInfo.pid),\n type: \"kiro\",\n status: this.parser.determineStatus(session),\n summary: truncate(\n session.lastUserMessage || session.title || \"Kiro session active\",\n SUMMARY_MAX_LENGTH,\n ),\n pid: processInfo.pid,\n projectPath: session.projectPath,\n sessionId: session.sessionId,\n lastActive: session.lastActive,\n sessionFilePath: session.sessionFilePath,\n };\n }\n\n mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {\n return processOnlyAgent(\"kiro\", processInfo, { summary: \"Kiro process running\" });\n }\n}\n"],"names":["generateAgentName","processOnlyAgent","SUMMARY_MAX_LENGTH","truncate","KiroSessionParser","KiroAgentMapper","parser","mapSessionToAgent","session","processInfo","name","projectPath","pid","type","status","determineStatus","summary","lastUserMessage","title","sessionId","lastActive","sessionFilePath","mapProcessOnlyAgent"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,0BAA0B;AAC5D,SAASC,gBAAgB,EAAEC,kBAAkB,EAAEC,QAAQ,QAAQ,eAAe;AAC9E,SAASC,iBAAiB,QAA0B,yBAAyB;AAO7E,OAAO,MAAMC;;IACX,YAAY,AAAiBC,SAA4B,IAAIF,mBAAmB,CAAE;aAArDE,SAAAA;IAAsD;IAEnFC,kBAAkB,EAAEC,OAAO,EAAEC,WAAW,EAAyB,EAAa;QAC5E,OAAO;YACLC,MAAMV,kBAAkBQ,QAAQG,WAAW,EAAEF,YAAYG,GAAG;YAC5DC,MAAM;YACNC,QAAQ,IAAI,CAACR,MAAM,CAACS,eAAe,CAACP;YACpCQ,SAASb,SACPK,QAAQS,eAAe,IAAIT,QAAQU,KAAK,IAAI,uBAC5ChB;YAEFU,KAAKH,YAAYG,GAAG;YACpBD,aAAaH,QAAQG,WAAW;YAChCQ,WAAWX,QAAQW,SAAS;YAC5BC,YAAYZ,QAAQY,UAAU;YAC9BC,iBAAiBb,QAAQa,eAAe;QAC1C;IACF;IAEAC,oBAAoBb,WAAwB,EAAa;QACvD,OAAOR,iBAAiB,QAAQQ,aAAa;YAAEO,SAAS;QAAuB;IACjF;AACF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ProcessInfo } from "../../adapters/AgentAdapter.js";
|
|
2
|
+
import { type KiroSessionPaths } from "./KiroSessionParser.js";
|
|
3
|
+
/** A live Kiro process and the session whose lock it holds. */
|
|
4
|
+
export interface KiroProcessMatch {
|
|
5
|
+
process: ProcessInfo;
|
|
6
|
+
session: KiroSessionPaths;
|
|
7
|
+
}
|
|
8
|
+
export interface KiroSessionLocatorOptions {
|
|
9
|
+
/** Overrides ~/.kiro/sessions/cli. */
|
|
10
|
+
sessionsDir?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class KiroSessionLocator {
|
|
13
|
+
private readonly sessionsDir;
|
|
14
|
+
constructor(options?: KiroSessionLocatorOptions);
|
|
15
|
+
/**
|
|
16
|
+
* Pair `<session-id>.lock` files with running Kiro processes.
|
|
17
|
+
*
|
|
18
|
+
* @param snapshot every process collected for Kiro's process names, used to
|
|
19
|
+
* walk up from the lock's PID (often a `kiro-cli-chat acp` helper)
|
|
20
|
+
* @param kiroProcesses the top-level Kiro processes that become agents
|
|
21
|
+
* @param isKiro whether a process is a top-level Kiro process
|
|
22
|
+
*/
|
|
23
|
+
matchRunningProcesses(snapshot: readonly ProcessInfo[], kiroProcesses: readonly ProcessInfo[], isKiro: (process: ProcessInfo) => boolean): KiroProcessMatch[];
|
|
24
|
+
/** Every session with a transcript under the sessions dir. */
|
|
25
|
+
listSessions(): KiroSessionPaths[];
|
|
26
|
+
/** The session stored as `<sessionId>.jsonl`, if it exists. */
|
|
27
|
+
findSession(sessionId: string): KiroSessionPaths | null;
|
|
28
|
+
private sessionPaths;
|
|
29
|
+
private discoverActiveLocks;
|
|
30
|
+
/** The outermost Kiro process on the lock PID's parent chain, if collected. */
|
|
31
|
+
private findKiroAncestor;
|
|
32
|
+
/**
|
|
33
|
+
* Fallback when the chain is broken (an uncollected intermediate process):
|
|
34
|
+
* attach to the only Kiro process on the lock holder's terminal.
|
|
35
|
+
*/
|
|
36
|
+
private matchSoleProcessOnTty;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=KiroSessionLocator.d.ts.map
|