@ai-devkit/agent-manager 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentManager.d.ts +9 -4
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +21 -2
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +151 -3
- package/dist/__tests__/AgentManager.test.js.map +1 -1
- package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js +486 -0
- package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js.map +1 -0
- package/dist/__tests__/adapters/adapterProcessImports.test.js +52 -0
- package/dist/__tests__/adapters/adapterProcessImports.test.js.map +1 -0
- package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js +247 -0
- package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js.map +1 -0
- package/dist/__tests__/capacity/claude.test.js +485 -0
- package/dist/__tests__/capacity/claude.test.js.map +1 -0
- package/dist/__tests__/capacity/openai.test.js +670 -0
- package/dist/__tests__/capacity/openai.test.js.map +1 -0
- package/dist/__tests__/capacity/wham.test.js +144 -0
- package/dist/__tests__/capacity/wham.test.js.map +1 -0
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js +462 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
- package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
- package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
- package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
- package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
- package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
- package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
- package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
- package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
- package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
- package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
- package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js +662 -0
- package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
- package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
- package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
- package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
- package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
- package/dist/__tests__/utils/agents.test.js +72 -2
- package/dist/__tests__/utils/agents.test.js.map +1 -1
- package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
- package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
- package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
- package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
- package/dist/__tests__/utils/jsonlTail.test.js +360 -0
- package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
- package/dist/__tests__/utils/matchingConstants.test.js +35 -0
- package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
- package/dist/__tests__/utils/process.test.js +436 -2
- package/dist/__tests__/utils/process.test.js.map +1 -1
- package/dist/adapters/AgentAdapter.d.ts +25 -6
- package/dist/adapters/AgentAdapter.d.ts.map +1 -1
- package/dist/adapters/AgentAdapter.js +12 -3
- package/dist/adapters/AgentAdapter.js.map +1 -1
- package/dist/capacity/claude.d.ts +17 -0
- package/dist/capacity/claude.d.ts.map +1 -0
- package/dist/capacity/claude.js +271 -0
- package/dist/capacity/claude.js.map +1 -0
- package/dist/capacity/codex.d.ts +1 -2
- package/dist/capacity/codex.d.ts.map +1 -1
- package/dist/capacity/codex.js +5 -47
- package/dist/capacity/codex.js.map +1 -1
- package/dist/capacity/index.d.ts +11 -0
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +17 -0
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/openai.d.ts +47 -0
- package/dist/capacity/openai.d.ts.map +1 -0
- package/dist/capacity/openai.js +307 -0
- package/dist/capacity/openai.js.map +1 -0
- package/dist/capacity/wham.d.ts +16 -0
- package/dist/capacity/wham.d.ts.map +1 -0
- package/dist/capacity/wham.js +66 -0
- package/dist/capacity/wham.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
- package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
- package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
- package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
- package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
- package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
- package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
- package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
- package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
- package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
- package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
- package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
- package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
- package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
- package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
- package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
- package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
- package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
- package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
- package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
- package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
- package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
- package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
- package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
- package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
- package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
- package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
- package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
- package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
- package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
- package/dist/harnesses/gemini/fileSignature.js +9 -0
- package/dist/harnesses/gemini/fileSignature.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
- package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
- package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
- package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
- package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
- package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
- package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
- package/dist/harnesses/grok/GrokSessionParser.js +185 -0
- package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
- package/dist/harnesses/index.d.ts +7 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +27 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
- package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroAdapter.js +125 -0
- package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
- package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
- package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
- package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
- package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
- package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
- package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
- package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
- package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
- package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
- package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
- package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
- package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
- package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
- package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
- package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
- package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
- package/dist/harnesses/pi/PiAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
- package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
- package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
- package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionLocator.js +212 -0
- package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
- package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
- package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionParser.js +318 -0
- package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
- package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
- package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
- package/dist/harnesses/shared.d.ts +41 -0
- package/dist/harnesses/shared.d.ts.map +1 -0
- package/dist/harnesses/shared.js +71 -0
- package/dist/harnesses/shared.js.map +1 -0
- package/dist/index.d.ts +28 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -16
- package/dist/index.js.map +1 -1
- package/dist/readiness/AgentReadiness.d.ts +1 -1
- package/dist/readiness/AgentReadiness.d.ts.map +1 -1
- package/dist/readiness/AgentReadiness.js.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.js +3 -1
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
- package/dist/runtime/herdr/HerdrAgentDiscovery.js +10 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
- package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
- package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
- package/dist/utils/IncrementalJsonlSummary.js +209 -0
- package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
- package/dist/utils/agents.d.ts +3 -2
- package/dist/utils/agents.d.ts.map +1 -1
- package/dist/utils/agents.js +61 -15
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/jsonlTail.d.ts +73 -0
- package/dist/utils/jsonlTail.d.ts.map +1 -0
- package/dist/utils/jsonlTail.js +238 -0
- package/dist/utils/jsonlTail.js.map +1 -0
- package/dist/utils/matching.d.ts +2 -0
- package/dist/utils/matching.d.ts.map +1 -1
- package/dist/utils/matching.js +3 -2
- package/dist/utils/matching.js.map +1 -1
- package/dist/utils/matchingConstants.d.ts +15 -0
- package/dist/utils/matchingConstants.d.ts.map +1 -0
- package/dist/utils/matchingConstants.js +14 -0
- package/dist/utils/matchingConstants.js.map +1 -0
- package/dist/utils/process.d.ts +38 -2
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +131 -43
- package/dist/utils/process.js.map +1 -1
- package/package.json +2 -1
- package/scripts/benchmark-cold-start.mjs +350 -0
- package/src/AgentManager.ts +26 -5
- package/src/__tests__/AgentManager.test.ts +141 -3
- package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
- package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
- package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
- package/src/__tests__/capacity/claude.test.ts +467 -0
- package/src/__tests__/capacity/fixtures/claude-credentials.json +7 -0
- package/src/__tests__/capacity/fixtures/claude-usage-malformed.json +1 -0
- package/src/__tests__/capacity/fixtures/claude-usage-partial.json +15 -0
- package/src/__tests__/capacity/fixtures/claude-usage.json +63 -0
- package/src/__tests__/capacity/fixtures/openai-auth.json +6 -0
- package/src/__tests__/capacity/fixtures/openai-codex-auth.json +9 -0
- package/src/__tests__/capacity/fixtures/openai-usage-completions.json +67 -0
- package/src/__tests__/capacity/fixtures/openai-usage-responses.json +20 -0
- package/src/__tests__/capacity/fixtures/wham-usage.json +32 -0
- package/src/__tests__/capacity/openai.test.ts +560 -0
- package/src/__tests__/capacity/wham.test.ts +104 -0
- package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
- package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
- package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
- package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.ts +396 -0
- package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
- package/src/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
- package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
- package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
- package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
- package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
- package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
- package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
- package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
- package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
- package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
- package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
- package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
- package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
- package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
- package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
- package/src/__tests__/harnesses/kiro/KiroAdapter.test.ts +552 -0
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
- package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
- package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
- package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
- package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
- package/src/__tests__/utils/agents.test.ts +83 -2
- package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
- package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
- package/src/__tests__/utils/jsonlTail.test.ts +317 -0
- package/src/__tests__/utils/matchingConstants.test.ts +40 -0
- package/src/__tests__/utils/process.test.ts +254 -0
- package/src/adapters/AgentAdapter.ts +37 -12
- package/src/capacity/claude.ts +313 -0
- package/src/capacity/codex.ts +25 -134
- package/src/capacity/index.ts +33 -4
- package/src/capacity/openai.ts +355 -0
- package/src/capacity/wham.ts +84 -0
- package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
- package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
- package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
- package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
- package/src/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
- package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
- package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
- package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
- package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
- package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
- package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
- package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
- package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
- package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
- package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
- package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
- package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
- package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
- package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
- package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
- package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
- package/src/harnesses/gemini/fileSignature.ts +10 -0
- package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
- package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
- package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
- package/src/harnesses/grok/GrokSessionParser.ts +251 -0
- package/src/harnesses/index.ts +28 -0
- package/src/harnesses/kiro/KiroAdapter.ts +143 -0
- package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
- package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
- package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
- package/src/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
- package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
- package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
- package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
- package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
- package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
- package/src/harnesses/pi/PiSessionLocator.ts +288 -0
- package/src/harnesses/pi/PiSessionParser.ts +488 -0
- package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
- package/src/harnesses/shared.ts +119 -0
- package/src/index.ts +34 -23
- package/src/readiness/AgentReadiness.ts +4 -1
- package/src/runtime/ManagedAgentRuntime.ts +2 -0
- package/src/runtime/herdr/HerdrAgentDiscovery.ts +5 -1
- package/src/utils/IncrementalJsonlSummary.ts +306 -0
- package/src/utils/agents.ts +62 -20
- package/src/utils/index.ts +2 -0
- package/src/utils/jsonlTail.ts +349 -0
- package/src/utils/matching.ts +3 -3
- package/src/utils/matchingConstants.ts +15 -0
- package/src/utils/process.ts +189 -45
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -10
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -10
- package/dist/adapters/index.js.map +0 -1
- package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
- package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
- package/dist/providers/codex/CodexAdapter.js.map +0 -1
- package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
- package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
- package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionLocator.js +0 -207
- package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
- package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
- package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
- package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionParser.js.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
- package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
- package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
- package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
- package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
- package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
- package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotSessionParser.js +0 -181
- package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
- package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
- package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
- package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
- package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
- package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiSessionParser.js +0 -166
- package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
- package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
- package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
- package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
- package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
- package/dist/providers/grok/GrokSessionParser.js +0 -122
- package/dist/providers/grok/GrokSessionParser.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
- package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
- package/dist/providers/pi/PiAdapter.js.map +0 -1
- package/dist/providers/pi/PiAgentMapper.js.map +0 -1
- package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
- package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionLocator.js +0 -86
- package/dist/providers/pi/PiSessionLocator.js.map +0 -1
- package/dist/providers/pi/PiSessionParser.d.ts +0 -36
- package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionParser.js +0 -191
- package/dist/providers/pi/PiSessionParser.js.map +0 -1
- package/dist/providers/pi/PiSessionTracker.js.map +0 -1
- package/src/__tests__/fixtures/fake-claude.cjs +0 -31
- package/src/__tests__/fixtures/fake-codex.cjs +0 -56
- package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
- package/src/adapters/index.ts +0 -15
- package/src/providers/codex/CodexSessionLocator.ts +0 -279
- package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
- package/src/providers/copilot/CopilotSessionParser.ts +0 -289
- package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
- package/src/providers/grok/GrokSessionParser.ts +0 -166
- package/src/providers/pi/PiSessionLocator.ts +0 -110
- package/src/providers/pi/PiSessionParser.ts +0 -284
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js +0 -0
- /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
- /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
- /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/gemini/GeminiSessionParser.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport type { ConversationMessage, SessionSummary } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport { safeReadFile, safeStat } from \"../../utils/session.js\";\n\n/**\n * A single Gemini CLI message content part. Mirrors the `{text?: string}`\n * shape that Gemini writes for user message parts (derived from the\n * Gemini API `Content.parts[]` schema). Non-text part variants (data,\n * file, etc.) are preserved via the index signature but ignored by\n * `resolveContent` since the adapter only surfaces human-readable text.\n */\ninterface GeminiContentPart {\n text?: string;\n [key: string]: unknown;\n}\n\ntype GeminiMessageContent = string | GeminiContentPart[];\n\nexport interface GeminiMessageEntry {\n id?: string;\n timestamp?: string;\n type?: string;\n /**\n * Gemini CLI stores two different content shapes depending on the\n * message origin:\n * - `type: \"user\"` messages carry the raw Part[] from userContent.parts\n * (e.g. `[{ text: \"hello\" }]`).\n * - `type: \"gemini\"` (assistant) messages carry a pre-joined string\n * built from `consolidatedParts.filter(p => p.text).join('').trim()`.\n * Both forms must be normalized via resolveContent before any string\n * operation is applied.\n */\n content?: GeminiMessageContent;\n displayContent?: GeminiMessageContent;\n}\n\nexport interface GeminiSessionFile {\n sessionId?: string;\n projectHash?: string;\n startTime?: string;\n lastUpdated?: string;\n messages?: GeminiMessageEntry[];\n directories?: string[];\n kind?: string;\n}\n\nexport interface GeminiSession {\n sessionId: string;\n projectPath: string;\n summary: string;\n sessionStart: Date;\n lastActive: Date;\n lastMessageType?: string;\n}\n\nconst IDLE_THRESHOLD_MINUTES = 5;\n\nexport class GeminiSessionParser {\n /**\n * Parse session file content into GeminiSession.\n * Uses cached content if available, otherwise reads from disk.\n */\n parseSession(cachedContent: string | undefined, filePath: string): GeminiSession | null {\n const content = cachedContent ?? this.readSessionFile(filePath);\n if (content === null) return null;\n\n const parsed = this.parseSessionJson(content);\n if (!parsed?.sessionId) return null;\n\n const messages = Array.isArray(parsed.messages) ? parsed.messages : [];\n const lastEntry = messages.length > 0 ? messages[messages.length - 1] : undefined;\n const fileStat = safeStat(filePath);\n\n const lastActive =\n this.parseTimestamp(parsed.lastUpdated) ||\n this.parseTimestamp(lastEntry?.timestamp) ||\n fileStat?.mtime ||\n new Date();\n\n const sessionStart = this.parseTimestamp(parsed.startTime) || lastActive;\n const projectPath =\n Array.isArray(parsed.directories) && parsed.directories.length > 0\n ? parsed.directories[0]\n : \"\";\n\n return {\n sessionId: parsed.sessionId,\n projectPath,\n summary: this.extractSummary(messages),\n sessionStart,\n lastActive,\n lastMessageType: lastEntry?.type,\n };\n }\n\n determineStatus(session: GeminiSession): AgentStatus {\n const diffMs = Date.now() - session.lastActive.getTime();\n const diffMinutes = diffMs / 60000;\n\n if (diffMinutes > IDLE_THRESHOLD_MINUTES) {\n return AgentStatus.IDLE;\n }\n\n if (session.lastMessageType === \"gemini\" || session.lastMessageType === \"assistant\") {\n return AgentStatus.WAITING;\n }\n\n return AgentStatus.RUNNING;\n }\n\n /**\n * Read the full conversation from a Gemini CLI session JSON file.\n *\n * Gemini sessions store messages in an array with `type` field — typically\n * 'user' or 'gemini' for visible turns, with tool and system entries mixed in.\n */\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {\n const verbose = options?.verbose ?? false;\n const content = safeReadFile(sessionFilePath);\n if (content === undefined) return [];\n\n const parsed = this.parseSessionJson(content);\n if (!Array.isArray(parsed?.messages)) return [];\n\n const messages: ConversationMessage[] = [];\n for (const entry of parsed.messages) {\n const role = this.roleForEntry(entry?.type, verbose);\n if (!role) continue;\n\n const text = this.messageText(entry).trim();\n if (!text) continue;\n\n messages.push({\n role,\n content: text,\n timestamp: entry.timestamp,\n });\n }\n\n return messages;\n }\n\n /**\n * Read a Gemini session JSON file and produce a {@link SessionSummary}.\n * Returns null when the file is unreadable, the JSON doesn't parse,\n * or the body lacks a sessionId.\n */\n fileToSessionSummary(filePath: string): SessionSummary | null {\n const content = safeReadFile(filePath);\n if (content === undefined) return null;\n\n const parsed = this.parseSessionJson(content);\n if (!parsed?.sessionId) return null;\n\n const messages = Array.isArray(parsed.messages) ? parsed.messages : [];\n const firstUserMessage = this.extractFirstUserMessage(messages);\n const cwd =\n Array.isArray(parsed.directories) && parsed.directories.length > 0\n ? parsed.directories[0]\n : \"\";\n\n const stat = safeStat(filePath);\n const lastEntryTimestamp = this.parseTimestamp(\n messages.length > 0 ? messages[messages.length - 1]?.timestamp : undefined,\n );\n const lastActive =\n this.parseTimestamp(parsed.lastUpdated) || lastEntryTimestamp || stat?.mtime || new Date();\n const startedAt =\n this.parseTimestamp(parsed.startTime) || stat?.birthtime || stat?.mtime || lastActive;\n\n return {\n type: \"gemini_cli\",\n sessionId: parsed.sessionId,\n cwd,\n firstUserMessage,\n lastActive,\n startedAt,\n sessionFilePath: filePath,\n };\n }\n\n private parseSessionJson(content: string): GeminiSessionFile | null {\n try {\n return JSON.parse(content) as GeminiSessionFile;\n } catch {\n return null;\n }\n }\n\n private readSessionFile(filePath: string): string | null {\n try {\n return fs.readFileSync(filePath, \"utf-8\");\n } catch {\n return null;\n }\n }\n\n private roleForEntry(\n entryType: string | undefined,\n verbose: boolean,\n ): ConversationMessage[\"role\"] | null {\n if (entryType === \"user\") return \"user\";\n if (entryType === \"gemini\" || entryType === \"assistant\") return \"assistant\";\n if (verbose && entryType) return \"system\";\n return null;\n }\n\n private extractSummary(messages: GeminiMessageEntry[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const entry = messages[i];\n if (entry?.type !== \"user\") continue;\n const text = this.messageText(entry).trim();\n if (text) return this.truncate(text, 120);\n }\n\n return \"Gemini CLI session active\";\n }\n\n /**\n * Normalize an entry's content/displayContent into a plain string.\n * Prefers displayContent when both are present (matches Gemini CLI's\n * own rendering priority for the /chat UI).\n */\n private messageText(entry: GeminiMessageEntry): string {\n const displayText = this.resolveContent(entry.displayContent);\n if (displayText) return displayText;\n return this.resolveContent(entry.content);\n }\n\n /**\n * Collapse a Gemini message content field into plain text.\n * Accepts either a pre-joined string (assistant turns) or a Part[]\n * list (user turns carrying `[{text: \"...\"}]`). Non-text part\n * variants (data, file) are dropped since this helper is only used\n * for summary/conversation rendering.\n */\n private resolveContent(content: GeminiMessageContent | undefined): string {\n if (!content) return \"\";\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n\n const parts: string[] = [];\n for (const part of content) {\n if (part && typeof part.text === \"string\" && part.text) {\n parts.push(part.text);\n }\n }\n return parts.join(\"\");\n }\n\n private extractFirstUserMessage(messages: GeminiMessageEntry[]): string {\n for (const entry of messages) {\n if (entry?.type !== \"user\") continue;\n const text = this.messageText(entry).trim();\n if (text) return text;\n }\n return \"\";\n }\n\n private parseTimestamp(value?: string): Date | null {\n if (!value) return null;\n const timestamp = new Date(value);\n return Number.isNaN(timestamp.getTime()) ? null : timestamp;\n }\n\n private truncate(value: string, maxLength: number): string {\n if (value.length <= maxLength) return value;\n return `${value.slice(0, maxLength - 3)}...`;\n }\n}\n"],"names":["fs","AgentStatus","safeReadFile","safeStat","IDLE_THRESHOLD_MINUTES","GeminiSessionParser","parseSession","cachedContent","filePath","content","readSessionFile","parsed","parseSessionJson","sessionId","messages","Array","isArray","lastEntry","length","undefined","fileStat","lastActive","parseTimestamp","lastUpdated","timestamp","mtime","Date","sessionStart","startTime","projectPath","directories","summary","extractSummary","lastMessageType","type","determineStatus","session","diffMs","now","getTime","diffMinutes","IDLE","WAITING","RUNNING","getConversation","sessionFilePath","options","verbose","entry","role","roleForEntry","text","messageText","trim","push","fileToSessionSummary","firstUserMessage","extractFirstUserMessage","cwd","stat","lastEntryTimestamp","startedAt","birthtime","JSON","parse","readFileSync","entryType","i","truncate","displayText","resolveContent","displayContent","parts","part","join","value","Number","isNaN","maxLength","slice"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/grok/GrokAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\nimport { GrokSessionParser, type GrokSession } from \"./GrokSessionParser.js\";\n\nexport interface GrokSessionAgentInput {\n session: GrokSession;\n processInfo: ProcessInfo;\n}\n\nexport class GrokAgentMapper {\n constructor(private readonly parser: GrokSessionParser = new GrokSessionParser()) {}\n\n mapSessionToAgent({ session, processInfo }: GrokSessionAgentInput): AgentInfo {\n return {\n name: generateAgentName(session.projectPath, processInfo.pid),\n type: \"grok_cli\",\n status: this.parser.determineStatus(session),\n summary: session.lastUserMessage || \"Grok CLI session active\",\n pid: processInfo.pid,\n projectPath: session.projectPath,\n sessionId: session.sessionId,\n lastActive: session.lastActive,\n sessionFilePath: session.sessionFilePath,\n };\n }\n\n /** `cwd` is already resolved by the locator (registry first, then process cwd). */\n mapProcessOnlyAgent(processInfo: ProcessInfo, cwd: string): AgentInfo {\n return {\n name: generateAgentName(cwd, processInfo.pid),\n type: \"grok_cli\",\n status: AgentStatus.RUNNING,\n summary: \"Grok CLI process running\",\n pid: processInfo.pid,\n projectPath: cwd,\n sessionId: `pid-${processInfo.pid}`,\n lastActive: new Date(),\n };\n }\n}\n"],"names":["AgentStatus","generateAgentName","GrokSessionParser","GrokAgentMapper","parser","mapSessionToAgent","session","processInfo","name","projectPath","pid","type","status","determineStatus","summary","lastUserMessage","sessionId","lastActive","sessionFilePath","mapProcessOnlyAgent","cwd","RUNNING","Date"],"mappings":"AACA,SAASA,WAAW,QAAQ,iCAAiC;AAC7D,SAASC,iBAAiB,QAAQ,0BAA0B;AAC5D,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,MAAMP,kBAAkBK,QAAQG,WAAW,EAAEF,YAAYG,GAAG;YAC5DC,MAAM;YACNC,QAAQ,IAAI,CAACR,MAAM,CAACS,eAAe,CAACP;YACpCQ,SAASR,QAAQS,eAAe,IAAI;YACpCL,KAAKH,YAAYG,GAAG;YACpBD,aAAaH,QAAQG,WAAW;YAChCO,WAAWV,QAAQU,SAAS;YAC5BC,YAAYX,QAAQW,UAAU;YAC9BC,iBAAiBZ,QAAQY,eAAe;QAC1C;IACF;IAEA,iFAAiF,GACjFC,oBAAoBZ,WAAwB,EAAEa,GAAW,EAAa;QACpE,OAAO;YACLZ,MAAMP,kBAAkBmB,KAAKb,YAAYG,GAAG;YAC5CC,MAAM;YACNC,QAAQZ,YAAYqB,OAAO;YAC3BP,SAAS;YACTJ,KAAKH,YAAYG,GAAG;YACpBD,aAAaW;YACbJ,WAAW,CAAC,IAAI,EAAET,YAAYG,GAAG,EAAE;YACnCO,YAAY,IAAIK;QAClB;IACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GrokCliAdapter.d.ts","sourceRoot":"","sources":["../../../src/providers/grok/GrokCliAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AAUxC;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,cAAe,YAAW,YAAY;IACjD,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,QAAQ,CAAC,YAAY,oBAAqB;IAE1C,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAqB;;IAQpC,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAI5C,OAAO,CAAC,gBAAgB;IAKlB,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsBzE,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IAI1F,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAgBnE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAapE,OAAO,CAAC,gBAAgB;CAWzB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/grok/GrokCliAdapter.ts"],"sourcesContent":["import type {\n AgentAdapter,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"../../adapters/AgentAdapter.js\";\nimport {\n captureProcessSnapshot,\n executableBasename,\n filterByProcessNames,\n} from \"../../utils/process.js\";\nimport { GrokAgentMapper } from \"./GrokAgentMapper.js\";\nimport { GrokSessionLocator } from \"./GrokSessionLocator.js\";\nimport { GrokSessionParser, type GrokSession } from \"./GrokSessionParser.js\";\n\n/**\n * Grok Build CLI Adapter\n *\n * Detects running Grok Build CLI agents by:\n * 1. Filtering `grok` processes from a shared asynchronous snapshot — Grok is\n * a native binary at ~/.grok/bin/grok, so argv[0] basename is `grok`.\n * 2. Resolving each live process to its working directory via\n * ~/.grok/active_sessions.json, which Grok maintains as a list of\n * { pid, cwd, opened_at } for every running session. The cwd is then encoded\n * into the session group dir ~/.grok/sessions/<encodeURIComponent(cwd)>/, and\n * the most recently active session subdirectory is picked from it. The\n * process cwd from lsof is only a fallback when the PID is not registered.\n * 3. Reading the session transcript from chat_history.jsonl (the authoritative\n * record of the conversation). The last user turn (the text inside\n * <user_query>...</user_query>) is the summary; the file's mtime is the last\n * activity time. summary.json / updates.jsonl are intentionally not used.\n */\nexport class GrokCliAdapter implements AgentAdapter {\n readonly type = \"grok_cli\" as const;\n readonly processNames = [\"grok\"] as const;\n\n private parser: GrokSessionParser;\n private mapper: GrokAgentMapper;\n private locator: GrokSessionLocator;\n\n constructor() {\n this.parser = new GrokSessionParser();\n this.mapper = new GrokAgentMapper(this.parser);\n this.locator = new GrokSessionLocator();\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return this.isGrokExecutable(processInfo.command);\n }\n\n private isGrokExecutable(command: string): boolean {\n const base = executableBasename(command);\n return base === \"grok\" || base === \"grok.exe\";\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const snapshot = context?.processes ?? (await captureProcessSnapshot(this.processNames));\n const relevant = filterByProcessNames(snapshot, this.processNames);\n const processes = relevant.filter((process) => this.canHandle(process));\n if (processes.length === 0) {\n return [];\n }\n\n const agents: AgentInfo[] = [];\n for (const { process: proc, cwd, sessionDir } of this.locator.matchRunningProcesses(\n processes,\n )) {\n const session = sessionDir ? this.parser.readSession(sessionDir, cwd) : null;\n if (session) {\n agents.push(this.mapper.mapSessionToAgent({ session, processInfo: proc }));\n } else {\n agents.push(this.mapper.mapProcessOnlyAgent(proc, cwd));\n }\n }\n return agents;\n }\n\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {\n return this.parser.getConversation(sessionFilePath, options);\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const filterCwd = opts?.cwd;\n const summaries: SessionSummary[] = [];\n\n for (const { sessionDir, defaultCwd } of this.locator.discoverHistoricalSessionDirs()) {\n const session = this.parser.readSession(sessionDir, defaultCwd);\n if (!session) continue;\n\n if (filterCwd !== undefined && session.projectPath !== filterCwd) continue;\n\n summaries.push(this.toSessionSummary(session));\n }\n\n return summaries;\n }\n\n async findSessionsById(sessionId: string): Promise<SessionSummary[]> {\n const summaries: SessionSummary[] = [];\n for (const { sessionDir, defaultCwd } of this.locator.findHistoricalSessionDirsById(\n sessionId,\n )) {\n const session = this.parser.readSession(sessionDir, defaultCwd);\n if (!session) continue;\n\n summaries.push(this.toSessionSummary(session));\n }\n return summaries;\n }\n\n private toSessionSummary(session: GrokSession): 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"],"names":["captureProcessSnapshot","executableBasename","filterByProcessNames","GrokAgentMapper","GrokSessionLocator","GrokSessionParser","GrokCliAdapter","type","processNames","parser","mapper","locator","canHandle","processInfo","isGrokExecutable","command","base","detectAgents","context","snapshot","processes","relevant","filter","process","length","agents","proc","cwd","sessionDir","matchRunningProcesses","session","readSession","push","mapSessionToAgent","mapProcessOnlyAgent","getConversation","sessionFilePath","options","listSessions","opts","filterCwd","summaries","defaultCwd","discoverHistoricalSessionDirs","undefined","projectPath","toSessionSummary","findSessionsById","sessionId","findHistoricalSessionDirsById","firstUserMessage","lastActive","startedAt","sessionStart"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/grok/GrokSessionLocator.ts"],"sourcesContent":["import * as path from \"path\";\nimport type { ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport {\n isDirectory,\n isSafePathSegment,\n safeReadFile,\n safeReaddir,\n safeStat,\n} from \"../../utils/session.js\";\nimport { CHAT_HISTORY_FILE } from \"./GrokSessionParser.js\";\n\nconst ACTIVE_SESSIONS_FILE = \"active_sessions.json\";\nconst CWD_FILE = \".cwd\";\n\n/** One entry of ~/.grok/active_sessions.json. */\ninterface ActiveSessionEntry {\n pid?: number;\n cwd?: string;\n opened_at?: number | string;\n}\n\n/** A live Grok process paired with its resolved cwd and (if any) session dir. */\nexport interface GrokProcessMatch {\n process: ProcessInfo;\n cwd: string;\n sessionDir: string | null;\n}\n\n/** A historical session dir plus the cwd decoded from its group dir. */\nexport interface GrokSessionDir {\n sessionDir: string;\n defaultCwd: string;\n}\n\nexport interface GrokSessionLocatorOptions {\n /** Overrides the ~/.grok base directory (defaults to GROK_HOME or ~/.grok). */\n baseDir?: string;\n}\n\nexport class GrokSessionLocator {\n private readonly baseDir: string;\n private readonly sessionsDir: string;\n\n constructor(options: GrokSessionLocatorOptions = {}) {\n // GROK_HOME overrides the ~/.grok base directory; sessions live under\n // <base>/sessions/ and the active-session registry at\n // <base>/active_sessions.json.\n const homeDir = process.env.HOME || process.env.USERPROFILE || \"\";\n this.baseDir = options.baseDir ?? (process.env.GROK_HOME || path.join(homeDir, \".grok\"));\n this.sessionsDir = path.join(this.baseDir, \"sessions\");\n }\n\n /**\n * Pair live Grok processes with their session dirs.\n *\n * active_sessions.json is the authoritative pid -> cwd map for live\n * sessions; the lsof-derived process cwd is only a fallback. The most\n * recently active session under that cwd's group dir is picked.\n */\n matchRunningProcesses(processes: ProcessInfo[]): GrokProcessMatch[] {\n const pidToCwd = this.readActiveSessions();\n return processes.map((proc) => {\n const cwd = pidToCwd.get(proc.pid) || proc.cwd || \"\";\n return { process: proc, cwd, sessionDir: cwd ? this.latestSessionDir(cwd) : null };\n });\n }\n\n /** Every session dir under ~/.grok/sessions/, across all project groups. */\n discoverHistoricalSessionDirs(): GrokSessionDir[] {\n const results: GrokSessionDir[] = [];\n for (const { groupDir, defaultCwd } of this.listGroups()) {\n for (const sessionDir of this.listSessionDirs(groupDir)) {\n results.push({ sessionDir, defaultCwd });\n }\n }\n return results;\n }\n\n /** Session dirs named exactly `sessionId`, across all project groups. */\n findHistoricalSessionDirsById(sessionId: string): GrokSessionDir[] {\n if (!isSafePathSegment(sessionId)) return [];\n\n const results: GrokSessionDir[] = [];\n for (const { groupDir, defaultCwd } of this.listGroups()) {\n const sessionDir = path.join(groupDir, sessionId);\n if (isDirectory(sessionDir)) {\n results.push({ sessionDir, defaultCwd });\n }\n }\n return results;\n }\n\n /**\n * Read ~/.grok/active_sessions.json into a pid -> cwd map. Grok writes one\n * { pid, cwd, opened_at } entry per running session and removes it on exit,\n * so this is the reliable way to learn a live process's working directory.\n */\n private readActiveSessions(): Map<number, string> {\n const map = new Map<number, string>();\n const content = safeReadFile(path.join(this.baseDir, ACTIVE_SESSIONS_FILE));\n if (content === undefined) return map;\n\n let entries: unknown;\n try {\n entries = JSON.parse(content);\n } catch {\n return map;\n }\n if (!Array.isArray(entries)) return map;\n\n for (const entry of entries as ActiveSessionEntry[]) {\n if (typeof entry?.pid === \"number\" && typeof entry?.cwd === \"string\" && entry.cwd) {\n map.set(entry.pid, entry.cwd);\n }\n }\n return map;\n }\n\n /**\n * Return the most recently active session subdirectory for a cwd, i.e. the\n * ~/.grok/sessions/<encodeURIComponent(cwd)>/<id>/ whose chat_history.jsonl\n * was written last. Returns null when the group dir or any transcript is\n * missing.\n */\n private latestSessionDir(cwd: string): string | null {\n const groupDir = path.join(this.sessionsDir, encodeURIComponent(cwd));\n if (!isDirectory(groupDir)) return null;\n\n let best: { dir: string; mtimeMs: number } | null = null;\n for (const sessionDir of this.listSessionDirs(groupDir)) {\n const stat = safeStat(path.join(sessionDir, CHAT_HISTORY_FILE));\n if (!stat) continue;\n if (!best || stat.mtimeMs > best.mtimeMs) {\n best = { dir: sessionDir, mtimeMs: stat.mtimeMs };\n }\n }\n return best?.dir ?? null;\n }\n\n private listGroups(): Array<{ groupDir: string; defaultCwd: string }> {\n if (!isDirectory(this.sessionsDir)) return [];\n\n const groups: Array<{ groupDir: string; defaultCwd: string }> = [];\n for (const groupName of safeReaddir(this.sessionsDir)) {\n const groupDir = path.join(this.sessionsDir, groupName);\n if (!isDirectory(groupDir)) continue;\n groups.push({ groupDir, defaultCwd: this.decodeGroupCwd(groupName, groupDir) });\n }\n return groups;\n }\n\n /**\n * Full paths of the session subdirectories directly under a group dir,\n * skipping any non-directory entries (e.g. prompt_history.jsonl).\n */\n private listSessionDirs(groupDir: string): string[] {\n return safeReaddir(groupDir)\n .map((sessionId) => path.join(groupDir, sessionId))\n .filter((sessionDir) => isDirectory(sessionDir));\n }\n\n /**\n * Resolve the working directory a session group dir was created for.\n *\n * The common case is `decodeURIComponent(<group-name>)`. For paths whose\n * encoded form exceeds the filesystem limit Grok uses a slug+hash and records\n * the original path in a `.cwd` file inside the group — prefer that when\n * present.\n */\n private decodeGroupCwd(groupName: string, groupDir: string): string {\n const fromFile = safeReadFile(path.join(groupDir, CWD_FILE));\n if (fromFile !== undefined && fromFile.trim()) return fromFile.trim();\n try {\n return decodeURIComponent(groupName);\n } catch {\n return \"\";\n }\n }\n}\n"],"names":["path","isDirectory","isSafePathSegment","safeReadFile","safeReaddir","safeStat","CHAT_HISTORY_FILE","ACTIVE_SESSIONS_FILE","CWD_FILE","GrokSessionLocator","baseDir","sessionsDir","options","homeDir","process","env","HOME","USERPROFILE","GROK_HOME","join","matchRunningProcesses","processes","pidToCwd","readActiveSessions","map","proc","cwd","get","pid","sessionDir","latestSessionDir","discoverHistoricalSessionDirs","results","groupDir","defaultCwd","listGroups","listSessionDirs","push","findHistoricalSessionDirsById","sessionId","Map","content","undefined","entries","JSON","parse","Array","isArray","entry","set","encodeURIComponent","best","stat","mtimeMs","dir","groups","groupName","decodeGroupCwd","filter","fromFile","trim","decodeURIComponent"],"mappings":"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"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import type { ConversationMessage } from "../../adapters/AgentAdapter.js";
|
|
2
|
-
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
3
|
-
export declare const CHAT_HISTORY_FILE = "chat_history.jsonl";
|
|
4
|
-
/** Parsed state for a single ~/.grok/sessions/<cwd>/<id>/ directory. */
|
|
5
|
-
export interface GrokSession {
|
|
6
|
-
sessionId: string;
|
|
7
|
-
projectPath: string;
|
|
8
|
-
sessionFilePath: string;
|
|
9
|
-
sessionStart: Date;
|
|
10
|
-
lastActive: Date;
|
|
11
|
-
firstUserMessage?: string;
|
|
12
|
-
lastUserMessage?: string;
|
|
13
|
-
lastRole?: ConversationMessage["role"];
|
|
14
|
-
}
|
|
15
|
-
export declare class GrokSessionParser {
|
|
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
|
-
*/
|
|
21
|
-
readSession(sessionDir: string, defaultCwd: string): GrokSession | null;
|
|
22
|
-
/** Accepts a session dir or an explicit chat_history.jsonl path. */
|
|
23
|
-
getConversation(sessionPath: string, options?: {
|
|
24
|
-
verbose?: boolean;
|
|
25
|
-
}): ConversationMessage[];
|
|
26
|
-
/**
|
|
27
|
-
* Determine agent status from parsed session state.
|
|
28
|
-
*
|
|
29
|
-
* - past the idle threshold → IDLE
|
|
30
|
-
* - last transcript turn is an assistant message → WAITING (awaiting user)
|
|
31
|
-
* - otherwise (last turn was a user message, or unknown) → RUNNING
|
|
32
|
-
*/
|
|
33
|
-
determineStatus(session: GrokSession): AgentStatus;
|
|
34
|
-
/**
|
|
35
|
-
* Single pass over chat_history.jsonl. Each line is a
|
|
36
|
-
* { type: 'system' | 'user' | 'assistant', content } record where content is
|
|
37
|
-
* either a string or an array of { type: 'text', text } blocks.
|
|
38
|
-
*
|
|
39
|
-
* Grok wraps the real user prompt in <user_query>...</user_query>; the other
|
|
40
|
-
* user records are context injections (<user_info>, <system-reminder>, ...)
|
|
41
|
-
* and are skipped so the summary is the actual prompt, not boilerplate.
|
|
42
|
-
*/
|
|
43
|
-
private parseChatHistory;
|
|
44
|
-
/** Flatten a chat record's content (string or text-block array) to text. */
|
|
45
|
-
private extractText;
|
|
46
|
-
/**
|
|
47
|
-
* Extract the prompt inside <user_query>...</user_query>. Returns null when
|
|
48
|
-
* the record has no such tag (a context injection rather than a prompt).
|
|
49
|
-
*/
|
|
50
|
-
private extractUserQuery;
|
|
51
|
-
/** Resolve a session dir or an explicit chat_history.jsonl path to the file. */
|
|
52
|
-
private resolveChatPath;
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=GrokSessionParser.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GrokSessionParser.d.ts","sourceRoot":"","sources":["../../../src/providers/grok/GrokSessionParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAG7D,eAAO,MAAM,iBAAiB,uBAAuB,CAAC;AAgBtD,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,qBAAa,iBAAiB;IAC5B;;;;OAIG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAqBvE,oEAAoE;IACpE,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IAK5F;;;;;;OAMG;IACH,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW;IAWlD;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IA0CxB,4EAA4E;IAC5E,OAAO,CAAC,WAAW;IAgBnB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAKxB,gFAAgF;IAChF,OAAO,CAAC,eAAe;CAGxB"}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
import * as path from "path";
|
|
2
|
-
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
3
|
-
import { safeReadFile, safeStat } from "../../utils/session.js";
|
|
4
|
-
export const CHAT_HISTORY_FILE = "chat_history.jsonl";
|
|
5
|
-
const IDLE_THRESHOLD_MINUTES = 5;
|
|
6
|
-
export class GrokSessionParser {
|
|
7
|
-
/**
|
|
8
|
-
* Parse a session directory into a {@link GrokSession} from its
|
|
9
|
-
* chat_history.jsonl transcript. Returns null when the transcript is
|
|
10
|
-
* missing — i.e. there is no real session to surface.
|
|
11
|
-
*/ readSession(sessionDir, defaultCwd) {
|
|
12
|
-
const chatPath = path.join(sessionDir, CHAT_HISTORY_FILE);
|
|
13
|
-
const chatStat = safeStat(chatPath);
|
|
14
|
-
if (!chatStat) return null;
|
|
15
|
-
const scan = this.parseChatHistory(chatPath, false);
|
|
16
|
-
const dirStat = safeStat(sessionDir);
|
|
17
|
-
const lastActive = chatStat.mtime;
|
|
18
|
-
return {
|
|
19
|
-
sessionId: path.basename(sessionDir),
|
|
20
|
-
projectPath: defaultCwd,
|
|
21
|
-
sessionFilePath: chatPath,
|
|
22
|
-
sessionStart: dirStat?.birthtime || lastActive,
|
|
23
|
-
lastActive,
|
|
24
|
-
firstUserMessage: scan.firstUserMessage,
|
|
25
|
-
lastUserMessage: scan.lastUserMessage,
|
|
26
|
-
lastRole: scan.lastRole
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
/** Accepts a session dir or an explicit chat_history.jsonl path. */ getConversation(sessionPath, options) {
|
|
30
|
-
return this.parseChatHistory(this.resolveChatPath(sessionPath), options?.verbose ?? false).messages;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Determine agent status from parsed session state.
|
|
34
|
-
*
|
|
35
|
-
* - past the idle threshold → IDLE
|
|
36
|
-
* - last transcript turn is an assistant message → WAITING (awaiting user)
|
|
37
|
-
* - otherwise (last turn was a user message, or unknown) → RUNNING
|
|
38
|
-
*/ determineStatus(session) {
|
|
39
|
-
const diffMinutes = (Date.now() - session.lastActive.getTime()) / 60000;
|
|
40
|
-
if (diffMinutes > IDLE_THRESHOLD_MINUTES) {
|
|
41
|
-
return AgentStatus.IDLE;
|
|
42
|
-
}
|
|
43
|
-
if (session.lastRole === "assistant") {
|
|
44
|
-
return AgentStatus.WAITING;
|
|
45
|
-
}
|
|
46
|
-
return AgentStatus.RUNNING;
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Single pass over chat_history.jsonl. Each line is a
|
|
50
|
-
* { type: 'system' | 'user' | 'assistant', content } record where content is
|
|
51
|
-
* either a string or an array of { type: 'text', text } blocks.
|
|
52
|
-
*
|
|
53
|
-
* Grok wraps the real user prompt in <user_query>...</user_query>; the other
|
|
54
|
-
* user records are context injections (<user_info>, <system-reminder>, ...)
|
|
55
|
-
* and are skipped so the summary is the actual prompt, not boilerplate.
|
|
56
|
-
*/ parseChatHistory(chatPath, verbose) {
|
|
57
|
-
const content = safeReadFile(chatPath);
|
|
58
|
-
if (content === undefined) return {
|
|
59
|
-
messages: []
|
|
60
|
-
};
|
|
61
|
-
const messages = [];
|
|
62
|
-
let lastRole;
|
|
63
|
-
for (const line of content.trim().split("\n")){
|
|
64
|
-
if (!line.trim()) continue;
|
|
65
|
-
let record;
|
|
66
|
-
try {
|
|
67
|
-
record = JSON.parse(line);
|
|
68
|
-
} catch {
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
const text = this.extractText(record.content);
|
|
72
|
-
if (record.type === "user") {
|
|
73
|
-
const query = this.extractUserQuery(text);
|
|
74
|
-
if (query === null) continue; // context injection, not a real prompt
|
|
75
|
-
messages.push({
|
|
76
|
-
role: "user",
|
|
77
|
-
content: query
|
|
78
|
-
});
|
|
79
|
-
lastRole = "user";
|
|
80
|
-
} else if (record.type === "assistant") {
|
|
81
|
-
if (!text) continue;
|
|
82
|
-
messages.push({
|
|
83
|
-
role: "assistant",
|
|
84
|
-
content: text
|
|
85
|
-
});
|
|
86
|
-
lastRole = "assistant";
|
|
87
|
-
} else if (verbose && record.type === "system") {
|
|
88
|
-
if (!text) continue;
|
|
89
|
-
messages.push({
|
|
90
|
-
role: "system",
|
|
91
|
-
content: text
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
const userTurns = messages.filter((m)=>m.role === "user");
|
|
96
|
-
return {
|
|
97
|
-
messages,
|
|
98
|
-
firstUserMessage: userTurns[0]?.content,
|
|
99
|
-
lastUserMessage: userTurns[userTurns.length - 1]?.content,
|
|
100
|
-
lastRole
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
/** Flatten a chat record's content (string or text-block array) to text. */ extractText(content) {
|
|
104
|
-
if (typeof content === "string") return content;
|
|
105
|
-
if (Array.isArray(content)) {
|
|
106
|
-
return content.map((block)=>block && typeof block === "object" && typeof block.text === "string" ? block.text : "").join("");
|
|
107
|
-
}
|
|
108
|
-
return "";
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* Extract the prompt inside <user_query>...</user_query>. Returns null when
|
|
112
|
-
* the record has no such tag (a context injection rather than a prompt).
|
|
113
|
-
*/ extractUserQuery(text) {
|
|
114
|
-
const match = text.match(/<user_query>\s*([\s\S]*?)\s*<\/user_query>/);
|
|
115
|
-
return match ? match[1].trim() : null;
|
|
116
|
-
}
|
|
117
|
-
/** Resolve a session dir or an explicit chat_history.jsonl path to the file. */ resolveChatPath(sessionPath) {
|
|
118
|
-
return sessionPath.endsWith(".jsonl") ? sessionPath : path.join(sessionPath, CHAT_HISTORY_FILE);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
//# sourceMappingURL=GrokSessionParser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/grok/GrokSessionParser.ts"],"sourcesContent":["import * as path from \"path\";\nimport type { ConversationMessage } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport { safeReadFile, safeStat } from \"../../utils/session.js\";\n\nexport const CHAT_HISTORY_FILE = \"chat_history.jsonl\";\nconst IDLE_THRESHOLD_MINUTES = 5;\n\n/** One line of chat_history.jsonl. */\ninterface ChatRecord {\n type?: string;\n content?: unknown;\n}\n\ninterface ChatScan {\n messages: ConversationMessage[];\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 class GrokSessionParser {\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 scan = this.parseChatHistory(chatPath, false);\n const dirStat = safeStat(sessionDir);\n const lastActive = chatStat.mtime;\n\n return {\n sessionId: path.basename(sessionDir),\n projectPath: defaultCwd,\n sessionFilePath: chatPath,\n sessionStart: dirStat?.birthtime || lastActive,\n lastActive,\n firstUserMessage: scan.firstUserMessage,\n lastUserMessage: scan.lastUserMessage,\n lastRole: scan.lastRole,\n };\n }\n\n /** Accepts a session dir or an explicit chat_history.jsonl path. */\n getConversation(sessionPath: string, options?: { verbose?: boolean }): ConversationMessage[] {\n return this.parseChatHistory(this.resolveChatPath(sessionPath), options?.verbose ?? false)\n .messages;\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 const diffMinutes = (Date.now() - session.lastActive.getTime()) / 60000;\n if (diffMinutes > IDLE_THRESHOLD_MINUTES) {\n return AgentStatus.IDLE;\n }\n if (session.lastRole === \"assistant\") {\n return AgentStatus.WAITING;\n }\n return AgentStatus.RUNNING;\n }\n\n /**\n * Single pass over chat_history.jsonl. Each line is a\n * { type: 'system' | 'user' | 'assistant', content } record where content is\n * 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 parseChatHistory(chatPath: string, verbose: boolean): ChatScan {\n const content = safeReadFile(chatPath);\n if (content === undefined) return { messages: [] };\n\n const messages: ConversationMessage[] = [];\n let lastRole: ConversationMessage[\"role\"] | undefined;\n\n for (const line of content.trim().split(\"\\n\")) {\n if (!line.trim()) continue;\n\n let record: ChatRecord;\n try {\n record = JSON.parse(line);\n } catch {\n continue;\n }\n\n const text = this.extractText(record.content);\n if (record.type === \"user\") {\n const query = this.extractUserQuery(text);\n if (query === null) continue; // context injection, not a real prompt\n messages.push({ role: \"user\", content: query });\n lastRole = \"user\";\n } else if (record.type === \"assistant\") {\n if (!text) continue;\n messages.push({ role: \"assistant\", content: text });\n lastRole = \"assistant\";\n } else if (verbose && record.type === \"system\") {\n if (!text) continue;\n messages.push({ role: \"system\", content: text });\n }\n }\n\n const userTurns = messages.filter((m) => m.role === \"user\");\n return {\n messages,\n firstUserMessage: userTurns[0]?.content,\n lastUserMessage: userTurns[userTurns.length - 1]?.content,\n lastRole,\n };\n }\n\n /** Flatten a chat record's content (string or text-block array) to text. */\n private extractText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((block) =>\n block &&\n typeof block === \"object\" &&\n typeof (block as { text?: unknown }).text === \"string\"\n ? (block as { text: string }).text\n : \"\",\n )\n .join(\"\");\n }\n return \"\";\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","safeReadFile","safeStat","CHAT_HISTORY_FILE","IDLE_THRESHOLD_MINUTES","GrokSessionParser","readSession","sessionDir","defaultCwd","chatPath","join","chatStat","scan","parseChatHistory","dirStat","lastActive","mtime","sessionId","basename","projectPath","sessionFilePath","sessionStart","birthtime","firstUserMessage","lastUserMessage","lastRole","getConversation","sessionPath","options","resolveChatPath","verbose","messages","determineStatus","session","diffMinutes","Date","now","getTime","IDLE","WAITING","RUNNING","content","undefined","line","trim","split","record","JSON","parse","text","extractText","type","query","extractUserQuery","push","role","userTurns","filter","m","length","Array","isArray","map","block","match","endsWith"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OpenCodeAdapter.d.ts","sourceRoot":"","sources":["../../../src/providers/opencode/OpenCodeAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AAkBxC,qBAAa,eAAgB,YAAW,YAAY;IAClD,QAAQ,CAAC,IAAI,EAAG,UAAU,CAAU;IACpC,QAAQ,CAAC,YAAY,wBAAyB;IAE9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;gBAExC,MAAM,CAAC,EAAE,MAAM;IAS3B,KAAK,IAAI,IAAI;IAOb,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAKtC,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA6BzE,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IAU1F,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAInE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAGrE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/opencode/OpenCodeAdapter.ts"],"sourcesContent":["/**\n * OpenCode Adapter\n *\n * Detects running OpenCode agents by:\n * 1. Filtering OpenCode processes from a shared asynchronous process snapshot\n * 2. Using snapshot CWD and start-time enrichment\n * 3. Querying OpenCode's SQLite DB (~/.local/share/opencode/opencode.db) to\n * find the session matching each process's CWD and read status from message.time.completed\n *\n * sessionFilePath encodes \"<dbPath>::<sessionId>\" so getConversation() can open the right\n * DB row without extending the AgentAdapter interface.\n */\n\nimport type {\n AgentAdapter,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"../../adapters/AgentAdapter.js\";\nimport {\n captureProcessSnapshot,\n executableBasename,\n filterByProcessNames,\n} from \"../../utils/process.js\";\nimport { OpenCodeAgentMapper } from \"./OpenCodeAgentMapper.js\";\nimport { OpenCodeSessionLocator } from \"./OpenCodeSessionLocator.js\";\nimport { OpenCodeSessionParser } from \"./OpenCodeSessionParser.js\";\n\nconst SESSION_REF_SEP = \"::\";\n\nfunction decodeSessionRef(ref: string): { sessionId: string } | null {\n const idx = ref.lastIndexOf(SESSION_REF_SEP);\n if (idx === -1) return null;\n return { sessionId: ref.slice(idx + SESSION_REF_SEP.length) };\n}\n\nexport class OpenCodeAdapter implements AgentAdapter {\n readonly type = \"opencode\" as const;\n readonly processNames = [\"opencode\"] as const;\n\n private readonly parser: OpenCodeSessionParser;\n private readonly locator: OpenCodeSessionLocator;\n private readonly mapper: OpenCodeAgentMapper;\n private readonly cleanup = (): void => this.close();\n\n constructor(dbPath?: string) {\n this.parser = new OpenCodeSessionParser();\n this.locator = new OpenCodeSessionLocator(dbPath, this.parser);\n this.mapper = new OpenCodeAgentMapper(this.locator.dbFilePath);\n process.once(\"exit\", this.cleanup);\n process.once(\"SIGINT\", this.cleanup);\n process.once(\"SIGTERM\", this.cleanup);\n }\n\n close(): void {\n process.off(\"exit\", this.cleanup);\n process.off(\"SIGINT\", this.cleanup);\n process.off(\"SIGTERM\", this.cleanup);\n this.locator.close();\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n const base = executableBasename(processInfo.command);\n return base === \"opencode\" || base === \"opencode.exe\";\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const snapshot = context?.processes ?? (await captureProcessSnapshot(this.processNames));\n const relevant = filterByProcessNames(snapshot, this.processNames);\n const processes = relevant.filter((process) => this.canHandle(process));\n if (processes.length === 0) return [];\n\n const db = this.locator.openDb();\n if (!db) return processes.map((process) => this.mapper.mapProcessOnlyAgent(process));\n\n const agents: AgentInfo[] = [];\n for (const proc of processes) {\n if (!proc.cwd) {\n agents.push(this.mapper.mapProcessOnlyAgent(proc));\n continue;\n }\n\n const session = this.locator.findSessionForDirectory(db, proc.cwd);\n if (!session) {\n agents.push(this.mapper.mapProcessOnlyAgent(proc));\n continue;\n }\n\n const stats = this.parser.getSessionStats(db, session.sessionId);\n agents.push(this.mapper.mapSessionToAgent(session, stats, proc));\n }\n\n return agents;\n }\n\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {\n const ref = decodeSessionRef(sessionFilePath);\n if (!ref) return [];\n\n const db = this.locator.openDb();\n if (!db) return [];\n\n return this.parser.getConversation(db, ref.sessionId, options);\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n return this.locator.listSessions(opts);\n }\n\n async findSessionsById(sessionId: string): Promise<SessionSummary[]> {\n return this.locator.findSessionsById(sessionId);\n }\n}\n"],"names":["captureProcessSnapshot","executableBasename","filterByProcessNames","OpenCodeAgentMapper","OpenCodeSessionLocator","OpenCodeSessionParser","SESSION_REF_SEP","decodeSessionRef","ref","idx","lastIndexOf","sessionId","slice","length","OpenCodeAdapter","type","processNames","parser","locator","mapper","cleanup","close","dbPath","dbFilePath","process","once","off","canHandle","processInfo","base","command","detectAgents","context","snapshot","processes","relevant","filter","db","openDb","map","mapProcessOnlyAgent","agents","proc","cwd","push","session","findSessionForDirectory","stats","getSessionStats","mapSessionToAgent","getConversation","sessionFilePath","options","listSessions","opts","findSessionsById"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/opencode/OpenCodeAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\nimport type { OpenCodeSession } from \"./OpenCodeSessionLocator.js\";\nimport type { OpenCodeSessionStats } from \"./OpenCodeSessionParser.js\";\n\nconst SESSION_REF_SEP = \"::\";\nconst IDLE_THRESHOLD_MINUTES = 5;\n\nfunction encodeSessionRef(dbPath: string, sessionId: string): string {\n return `${dbPath}${SESSION_REF_SEP}${sessionId}`;\n}\n\nexport class OpenCodeAgentMapper {\n constructor(private readonly dbPath: string) {}\n\n mapSessionToAgent(\n session: OpenCodeSession,\n stats: OpenCodeSessionStats,\n proc: ProcessInfo,\n ): AgentInfo {\n const lastActive =\n stats.lastTimeUpdated > 0 ? new Date(stats.lastTimeUpdated) : new Date(session.timeCreated);\n\n return {\n name: generateAgentName(session.directory || proc.cwd || \"\", proc.pid),\n type: \"opencode\",\n status: this.determineStatus(stats, lastActive),\n summary: stats.summary || \"OpenCode session active\",\n pid: proc.pid,\n projectPath: session.directory || proc.cwd || \"\",\n sessionId: session.sessionId,\n lastActive,\n sessionFilePath: encodeSessionRef(this.dbPath, session.sessionId),\n };\n }\n\n mapProcessOnlyAgent(proc: ProcessInfo): AgentInfo {\n return {\n name: generateAgentName(proc.cwd || \"\", proc.pid),\n type: \"opencode\",\n status: AgentStatus.RUNNING,\n summary: \"OpenCode process running\",\n pid: proc.pid,\n projectPath: proc.cwd || \"\",\n sessionId: `pid-${proc.pid}`,\n lastActive: new Date(),\n };\n }\n\n private determineStatus(stats: OpenCodeSessionStats, lastActive: Date): AgentStatus {\n const ageMin = (Date.now() - lastActive.getTime()) / 60000;\n if (ageMin > IDLE_THRESHOLD_MINUTES) return AgentStatus.IDLE;\n\n if (stats.lastRole === \"assistant\" && !stats.lastAssistantCompleted) {\n return AgentStatus.RUNNING;\n }\n if (stats.lastRole === \"assistant\") return AgentStatus.WAITING;\n return AgentStatus.RUNNING;\n }\n}\n"],"names":["AgentStatus","generateAgentName","SESSION_REF_SEP","IDLE_THRESHOLD_MINUTES","encodeSessionRef","dbPath","sessionId","OpenCodeAgentMapper","mapSessionToAgent","session","stats","proc","lastActive","lastTimeUpdated","Date","timeCreated","name","directory","cwd","pid","type","status","determineStatus","summary","projectPath","sessionFilePath","mapProcessOnlyAgent","RUNNING","ageMin","now","getTime","IDLE","lastRole","lastAssistantCompleted","WAITING"],"mappings":"AACA,SAASA,WAAW,QAAQ,iCAAiC;AAC7D,SAASC,iBAAiB,QAAQ,0BAA0B;AAI5D,MAAMC,kBAAkB;AACxB,MAAMC,yBAAyB;AAE/B,SAASC,iBAAiBC,MAAc,EAAEC,SAAiB;IACzD,OAAO,GAAGD,SAASH,kBAAkBI,WAAW;AAClD;AAEA,OAAO,MAAMC;;IACX,YAAY,AAAiBF,MAAc,CAAE;aAAhBA,SAAAA;IAAiB;IAE9CG,kBACEC,OAAwB,EACxBC,KAA2B,EAC3BC,IAAiB,EACN;QACX,MAAMC,aACJF,MAAMG,eAAe,GAAG,IAAI,IAAIC,KAAKJ,MAAMG,eAAe,IAAI,IAAIC,KAAKL,QAAQM,WAAW;QAE5F,OAAO;YACLC,MAAMf,kBAAkBQ,QAAQQ,SAAS,IAAIN,KAAKO,GAAG,IAAI,IAAIP,KAAKQ,GAAG;YACrEC,MAAM;YACNC,QAAQ,IAAI,CAACC,eAAe,CAACZ,OAAOE;YACpCW,SAASb,MAAMa,OAAO,IAAI;YAC1BJ,KAAKR,KAAKQ,GAAG;YACbK,aAAaf,QAAQQ,SAAS,IAAIN,KAAKO,GAAG,IAAI;YAC9CZ,WAAWG,QAAQH,SAAS;YAC5BM;YACAa,iBAAiBrB,iBAAiB,IAAI,CAACC,MAAM,EAAEI,QAAQH,SAAS;QAClE;IACF;IAEAoB,oBAAoBf,IAAiB,EAAa;QAChD,OAAO;YACLK,MAAMf,kBAAkBU,KAAKO,GAAG,IAAI,IAAIP,KAAKQ,GAAG;YAChDC,MAAM;YACNC,QAAQrB,YAAY2B,OAAO;YAC3BJ,SAAS;YACTJ,KAAKR,KAAKQ,GAAG;YACbK,aAAab,KAAKO,GAAG,IAAI;YACzBZ,WAAW,CAAC,IAAI,EAAEK,KAAKQ,GAAG,EAAE;YAC5BP,YAAY,IAAIE;QAClB;IACF;IAEQQ,gBAAgBZ,KAA2B,EAAEE,UAAgB,EAAe;QAClF,MAAMgB,SAAS,AAACd,CAAAA,KAAKe,GAAG,KAAKjB,WAAWkB,OAAO,EAAC,IAAK;QACrD,IAAIF,SAASzB,wBAAwB,OAAOH,YAAY+B,IAAI;QAE5D,IAAIrB,MAAMsB,QAAQ,KAAK,eAAe,CAACtB,MAAMuB,sBAAsB,EAAE;YACnE,OAAOjC,YAAY2B,OAAO;QAC5B;QACA,IAAIjB,MAAMsB,QAAQ,KAAK,aAAa,OAAOhC,YAAYkC,OAAO;QAC9D,OAAOlC,YAAY2B,OAAO;IAC5B;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/opencode/OpenCodeSessionLocator.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport Database from \"better-sqlite3\";\nimport type { ListSessionsOptions, SessionSummary } from \"../../adapters/AgentAdapter.js\";\nimport { OpenCodeSessionParser } from \"./OpenCodeSessionParser.js\";\n\nconst SESSION_REF_SEP = \"::\";\n\nfunction encodeOpenCodeSessionRef(dbPath: string, sessionId: string): string {\n return `${dbPath}${SESSION_REF_SEP}${sessionId}`;\n}\n\nexport interface OpenCodeSession {\n sessionId: string;\n directory: string;\n timeCreated: number;\n}\n\ninterface OpenCodeSessionRow {\n id: string;\n directory: string;\n timeCreated: number;\n}\n\nexport class OpenCodeSessionLocator {\n private readonly dbPath: string;\n private db: Database.Database | null = null;\n\n constructor(\n dbPath = OpenCodeSessionLocator.resolveDbPath(),\n private readonly parser: OpenCodeSessionParser = new OpenCodeSessionParser(),\n ) {\n this.dbPath = dbPath;\n }\n\n static resolveDbPath(): string {\n const xdg = process.env.XDG_DATA_HOME;\n const home = process.env.HOME || process.env.USERPROFILE || \"\";\n const base = xdg || path.join(home, \".local\", \"share\");\n return path.join(base, \"opencode\", \"opencode.db\");\n }\n\n openDb(): Database.Database | null {\n if (this.db) return this.db;\n if (!fs.existsSync(this.dbPath)) return null;\n\n try {\n this.db = new Database(this.dbPath, { readonly: true });\n return this.db;\n } catch {\n return null;\n }\n }\n\n close(): void {\n if (this.db) {\n try {\n this.db.close();\n } catch {\n /* ignore */\n }\n this.db = null;\n }\n }\n\n findSessionForDirectory(db: Database.Database, directory: string): OpenCodeSession | null {\n try {\n const row = db\n .prepare<[string], { id: string; directory: string; time_created: number }>(`\n SELECT id, directory, time_created\n FROM session\n WHERE directory = ?\n ORDER BY time_created DESC\n LIMIT 1\n `)\n .get(directory);\n\n if (!row) return null;\n return { sessionId: row.id, directory: row.directory, timeCreated: row.time_created };\n } catch {\n return null;\n }\n }\n\n listSessions(opts?: ListSessionsOptions): SessionSummary[] {\n const db = this.openDb();\n if (!db) return [];\n\n try {\n const rows = db\n .prepare<[], OpenCodeSessionRow>(`\n SELECT id, directory, time_created AS timeCreated\n FROM session\n ORDER BY time_created DESC\n `)\n .all();\n\n const summaries: SessionSummary[] = [];\n\n for (const row of rows) {\n if (opts?.cwd !== undefined && row.directory !== opts.cwd) continue;\n\n summaries.push(this.toSessionSummary(db, row));\n }\n\n return summaries;\n } catch {\n this.close();\n return [];\n }\n }\n\n findSessionsById(sessionId: string): SessionSummary[] {\n const db = this.openDb();\n if (!db) return [];\n\n try {\n const row = db\n .prepare<[string], OpenCodeSessionRow>(`\n SELECT id, directory, time_created AS timeCreated\n FROM session\n WHERE id = ?\n `)\n .get(sessionId);\n return row ? [this.toSessionSummary(db, row)] : [];\n } catch {\n this.close();\n return [];\n }\n }\n\n private toSessionSummary(db: Database.Database, row: OpenCodeSessionRow): SessionSummary {\n const stats = this.parser.getSessionStats(db, row.id);\n const lastActive =\n stats.lastTimeUpdated > 0 ? new Date(stats.lastTimeUpdated) : new Date(row.timeCreated);\n\n return {\n type: \"opencode\",\n sessionId: row.id,\n cwd: row.directory,\n firstUserMessage: stats.summary,\n lastActive,\n startedAt: new Date(row.timeCreated),\n sessionFilePath: encodeOpenCodeSessionRef(this.dbPath, row.id),\n };\n }\n\n get dbFilePath(): string {\n return this.dbPath;\n }\n}\n"],"names":["fs","path","Database","OpenCodeSessionParser","SESSION_REF_SEP","encodeOpenCodeSessionRef","dbPath","sessionId","OpenCodeSessionLocator","db","resolveDbPath","parser","xdg","process","env","XDG_DATA_HOME","home","HOME","USERPROFILE","base","join","openDb","existsSync","readonly","close","findSessionForDirectory","directory","row","prepare","get","id","timeCreated","time_created","listSessions","opts","rows","all","summaries","cwd","undefined","push","toSessionSummary","findSessionsById","stats","getSessionStats","lastActive","lastTimeUpdated","Date","type","firstUserMessage","summary","startedAt","sessionFilePath","dbFilePath"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"OpenCodeSessionParser.d.ts","sourceRoot":"","sources":["../../../src/providers/opencode/OpenCodeSessionParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,6FAA6F;IAC7F,sBAAsB,EAAE,OAAO,CAAC;IAChC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAiBD,qBAAa,qBAAqB;IAChC,eAAe,CACb,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAC9B,mBAAmB,EAAE;IAyCxB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,oBAAoB;IAgE/E,OAAO,CAAC,aAAa;CAOtB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/opencode/OpenCodeSessionParser.ts"],"sourcesContent":["import type { ConversationMessage } from \"../../adapters/AgentAdapter.js\";\nimport type Database from \"better-sqlite3\";\n\nexport interface OpenCodeSessionStats {\n lastRole: string | null;\n lastTimeUpdated: number;\n /** OpenCode writes `time.completed` on the assistant message only when the turn finishes. */\n lastAssistantCompleted: boolean;\n lastAssistantErrored: boolean;\n summary: string;\n}\n\ninterface OpenCodePartData {\n type?: string;\n text?: string;\n reasoning?: string;\n tool?: string;\n}\n\nconst EMPTY_STATS: OpenCodeSessionStats = {\n lastRole: null,\n lastTimeUpdated: 0,\n lastAssistantCompleted: false,\n lastAssistantErrored: false,\n summary: \"\",\n};\n\nexport class OpenCodeSessionParser {\n getConversation(\n db: Database.Database,\n sessionId: string,\n options?: { verbose?: boolean },\n ): ConversationMessage[] {\n const verbose = options?.verbose ?? false;\n\n try {\n const rows = db\n .prepare<[string], { role: string; partData: string; timeCreated: number }>(`\n SELECT json_extract(m.data, '$.role') AS role,\n p.data AS partData,\n p.time_created AS timeCreated\n FROM part p\n JOIN message m ON p.message_id = m.id\n WHERE p.session_id = ?\n ORDER BY p.time_created ASC\n `)\n .all(sessionId);\n\n const messages: ConversationMessage[] = [];\n\n for (const row of rows) {\n const partData = this.parsePartData(row.partData);\n if (!partData) continue;\n\n const role = row.role === \"user\" ? \"user\" : \"assistant\";\n\n if (partData.type === \"text\" && partData.text) {\n messages.push({ role, content: partData.text });\n } else if (partData.type === \"reasoning\" && verbose) {\n const text = partData.reasoning || partData.text || \"\";\n if (text) messages.push({ role: \"assistant\", content: `[thinking] ${text}` });\n } else if (partData.type === \"tool\" && verbose) {\n const toolName = partData.tool || \"tool\";\n messages.push({ role: \"assistant\", content: `[tool: ${toolName}]` });\n }\n }\n\n return messages;\n } catch {\n return [];\n }\n }\n\n getSessionStats(db: Database.Database, sessionId: string): OpenCodeSessionStats {\n try {\n // Order by time_created — time_updated can lag when OpenCode appends\n // metadata (e.g. summary diffs) to user messages after a turn finishes.\n const last = db\n .prepare<[string], { role: string; timeUpdated: number }>(`\n SELECT json_extract(data, '$.role') AS role,\n time_updated AS timeUpdated\n FROM message\n WHERE session_id = ?\n ORDER BY time_created DESC\n LIMIT 1\n `)\n .get(sessionId);\n\n const heartbeat = db\n .prepare<[string], { maxUpdated: number }>(`\n SELECT MAX(time_updated) AS maxUpdated FROM message WHERE session_id = ?\n `)\n .get(sessionId);\n\n const lastAssistant = db\n .prepare<\n [string],\n {\n completed: number | null;\n errored: number | null;\n }\n >(`\n SELECT json_extract(data, '$.time.completed') AS completed,\n json_extract(data, '$.time.error') AS errored\n FROM message\n WHERE session_id = ? AND json_extract(data, '$.role') = 'assistant'\n ORDER BY time_created DESC\n LIMIT 1\n `)\n .get(sessionId);\n\n const first = db\n .prepare<[string], { text: string }>(`\n SELECT json_extract(p.data, '$.text') AS text\n FROM part p\n JOIN message m ON p.message_id = m.id\n WHERE p.session_id = ?\n AND json_extract(m.data, '$.role') = 'user'\n AND json_extract(p.data, '$.type') = 'text'\n AND json_extract(p.data, '$.text') IS NOT NULL\n ORDER BY p.time_created ASC\n LIMIT 1\n `)\n .get(sessionId);\n\n return {\n lastRole: last?.role ?? null,\n lastTimeUpdated: heartbeat?.maxUpdated ?? last?.timeUpdated ?? 0,\n lastAssistantCompleted: lastAssistant?.completed != null,\n lastAssistantErrored: lastAssistant?.errored != null,\n summary: first?.text?.trim() ?? \"\",\n };\n } catch {\n return EMPTY_STATS;\n }\n }\n\n private parsePartData(partData: string): OpenCodePartData | null {\n try {\n return JSON.parse(partData) as OpenCodePartData;\n } catch {\n return null;\n }\n }\n}\n"],"names":["EMPTY_STATS","lastRole","lastTimeUpdated","lastAssistantCompleted","lastAssistantErrored","summary","OpenCodeSessionParser","getConversation","db","sessionId","options","verbose","rows","prepare","all","messages","row","partData","parsePartData","role","type","text","push","content","reasoning","toolName","tool","getSessionStats","last","get","heartbeat","lastAssistant","first","maxUpdated","timeUpdated","completed","errored","trim","JSON","parse"],"mappings":"AAmBA,MAAMA,cAAoC;IACxCC,UAAU;IACVC,iBAAiB;IACjBC,wBAAwB;IACxBC,sBAAsB;IACtBC,SAAS;AACX;AAEA,OAAO,MAAMC;IACXC,gBACEC,EAAqB,EACrBC,SAAiB,EACjBC,OAA+B,EACR;QACvB,MAAMC,UAAUD,SAASC,WAAW;QAEpC,IAAI;YACF,MAAMC,OAAOJ,GACVK,OAAO,CAAoE,CAAC;;;;;;;;YAQzE,CAAC,EACJC,GAAG,CAACL;YAEP,MAAMM,WAAkC,EAAE;YAE1C,KAAK,MAAMC,OAAOJ,KAAM;gBACtB,MAAMK,WAAW,IAAI,CAACC,aAAa,CAACF,IAAIC,QAAQ;gBAChD,IAAI,CAACA,UAAU;gBAEf,MAAME,OAAOH,IAAIG,IAAI,KAAK,SAAS,SAAS;gBAE5C,IAAIF,SAASG,IAAI,KAAK,UAAUH,SAASI,IAAI,EAAE;oBAC7CN,SAASO,IAAI,CAAC;wBAAEH;wBAAMI,SAASN,SAASI,IAAI;oBAAC;gBAC/C,OAAO,IAAIJ,SAASG,IAAI,KAAK,eAAeT,SAAS;oBACnD,MAAMU,OAAOJ,SAASO,SAAS,IAAIP,SAASI,IAAI,IAAI;oBACpD,IAAIA,MAAMN,SAASO,IAAI,CAAC;wBAAEH,MAAM;wBAAaI,SAAS,CAAC,WAAW,EAAEF,MAAM;oBAAC;gBAC7E,OAAO,IAAIJ,SAASG,IAAI,KAAK,UAAUT,SAAS;oBAC9C,MAAMc,WAAWR,SAASS,IAAI,IAAI;oBAClCX,SAASO,IAAI,CAAC;wBAAEH,MAAM;wBAAaI,SAAS,CAAC,OAAO,EAAEE,SAAS,CAAC,CAAC;oBAAC;gBACpE;YACF;YAEA,OAAOV;QACT,EAAE,OAAM;YACN,OAAO,EAAE;QACX;IACF;IAEAY,gBAAgBnB,EAAqB,EAAEC,SAAiB,EAAwB;QAC9E,IAAI;YACF,qEAAqE;YACrE,wEAAwE;YACxE,MAAMmB,OAAOpB,GACVK,OAAO,CAAkD,CAAC;;;;;;;YAOvD,CAAC,EACJgB,GAAG,CAACpB;YAEP,MAAMqB,YAAYtB,GACfK,OAAO,CAAmC,CAAC;;YAExC,CAAC,EACJgB,GAAG,CAACpB;YAEP,MAAMsB,gBAAgBvB,GACnBK,OAAO,CAMN,CAAC;;;;;;;YAOC,CAAC,EACJgB,GAAG,CAACpB;YAEP,MAAMuB,QAAQxB,GACXK,OAAO,CAA6B,CAAC;;;;;;;;;;YAUlC,CAAC,EACJgB,GAAG,CAACpB;YAEP,OAAO;gBACLR,UAAU2B,MAAMT,QAAQ;gBACxBjB,iBAAiB4B,WAAWG,cAAcL,MAAMM,eAAe;gBAC/D/B,wBAAwB4B,eAAeI,aAAa;gBACpD/B,sBAAsB2B,eAAeK,WAAW;gBAChD/B,SAAS2B,OAAOX,MAAMgB,UAAU;YAClC;QACF,EAAE,OAAM;YACN,OAAOrC;QACT;IACF;IAEQkB,cAAcD,QAAgB,EAA2B;QAC/D,IAAI;YACF,OAAOqB,KAAKC,KAAK,CAACtB;QACpB,EAAE,OAAM;YACN,OAAO;QACT;IACF;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PiAdapter.d.ts","sourceRoot":"","sources":["../../../src/providers/pi/PiAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AAMxC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAgB7D,qBAAa,SAAU,YAAW,YAAY;IAC5C,QAAQ,CAAC,IAAI,EAAG,IAAI,CAAU;IAC9B,QAAQ,CAAC,YAAY,0BAA2B;IAEhD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,QAAQ,GAAE,aAAuC;IAU7D,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAItC,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAqBzE,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IAI1F,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAanE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAYtD,cAAc;IAW5B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,gBAAgB;IAwBxB,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,gBAAgB;IAQxB,OAAO,CAAC,qBAAqB;IAgB7B,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,cAAc;CAOvB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/pi/PiAdapter.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport type {\n AgentAdapter,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"../../adapters/AgentAdapter.js\";\nimport {\n captureProcessSnapshot,\n executableBasename,\n filterByProcessNames,\n} from \"../../utils/process.js\";\nimport { AgentRegistry } from \"../../utils/AgentRegistry.js\";\nimport { PiAgentMapper } from \"./PiAgentMapper.js\";\nimport { PiSessionLocator } from \"./PiSessionLocator.js\";\nimport { PiSessionParser } from \"./PiSessionParser.js\";\nimport { PiSessionTracker } from \"./PiSessionTracker.js\";\n\ninterface MappedAgentResult {\n agents: AgentInfo[];\n fallback: ProcessInfo[];\n}\n\ninterface SessionFileMatch {\n process: ProcessInfo;\n filePath: string;\n}\n\nexport class PiAdapter implements AgentAdapter {\n readonly type = \"pi\" as const;\n readonly processNames = [\"pi\", \"node\"] as const;\n\n private readonly piSessionsDir: string;\n private readonly trackerPath: string;\n private readonly registry: AgentRegistry;\n private readonly parser: PiSessionParser;\n private readonly mapper: PiAgentMapper;\n\n constructor(registry: AgentRegistry = AgentRegistry.default()) {\n const homeDir = process.env.HOME || process.env.USERPROFILE || \"\";\n const piAgentDir = path.join(homeDir, \".pi\", \"agent\");\n this.piSessionsDir = path.join(piAgentDir, \"sessions\");\n this.trackerPath = path.join(piAgentDir, \"sessions.json\");\n this.registry = registry;\n this.parser = new PiSessionParser();\n this.mapper = new PiAgentMapper(this.parser);\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return this.isPiExecutable(processInfo.command);\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const processes = await this.getPiProcesses(context);\n if (processes.length === 0) return [];\n\n const cacheResult = this.mapRegistryCache(processes);\n const trackerResult = this.mapTrackerMatches(cacheResult.fallback);\n const locatorResult = this.createLocator().matchRunningProcesses(trackerResult.fallback);\n const legacyResult = this.mapLegacyMatches(locatorResult.legacyMatches);\n const unmatchedProcesses = this.findUnmatchedProcesses(\n locatorResult.fallback,\n legacyResult.agents,\n );\n\n return [\n ...cacheResult.agents,\n ...trackerResult.agents,\n ...legacyResult.agents,\n ...unmatchedProcesses.map((processInfo) => this.mapper.mapProcessOnlyAgent(processInfo)),\n ];\n }\n\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {\n return this.parser.getConversation(sessionFilePath, options);\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const summaries: SessionSummary[] = [];\n\n for (const filePath of this.createLocator().discoverHistoricalSessionFiles()) {\n const summary = this.parser.fileToSessionSummary(filePath);\n if (!summary) continue;\n if (opts?.cwd !== undefined && summary.cwd !== opts.cwd) continue;\n summaries.push(summary);\n }\n\n return summaries;\n }\n\n async findSessionsById(sessionId: string): Promise<SessionSummary[]> {\n const summaries: SessionSummary[] = [];\n const filePaths = this.createLocator().findHistoricalSessionFilesById(sessionId);\n for (const filePath of filePaths) {\n const summary = this.parser.fileToSessionSummary(filePath);\n if (summary?.sessionId === sessionId) summaries.push(summary);\n }\n\n if (summaries.length > 0) return summaries;\n return (await this.listSessions()).filter((summary) => summary.sessionId === sessionId);\n }\n\n private async getPiProcesses(context?: AgentDetectionContext): Promise<ProcessInfo[]> {\n const snapshot = context?.processes ?? (await captureProcessSnapshot(this.processNames));\n const relevant = filterByProcessNames(snapshot, this.processNames);\n\n const byPid = new Map<number, ProcessInfo>();\n for (const processInfo of relevant) {\n if (this.canHandle(processInfo)) byPid.set(processInfo.pid, processInfo);\n }\n return Array.from(byPid.values());\n }\n\n private createLocator(): PiSessionLocator {\n return new PiSessionLocator({ sessionsDir: this.piSessionsDir }, this.parser);\n }\n\n private createTracker(): PiSessionTracker {\n return new PiSessionTracker({\n sessionsDir: this.piSessionsDir,\n trackerPath: this.trackerPath,\n });\n }\n\n private mapRegistryCache(processes: ProcessInfo[]): MappedAgentResult {\n const matches: SessionFileMatch[] = [];\n const fallback: ProcessInfo[] = [];\n const byPid = new Map(this.registry.list().map((entry) => [entry.pid, entry]));\n\n for (const processInfo of processes) {\n const entry = byPid.get(processInfo.pid);\n if (\n !entry ||\n entry.type !== this.type ||\n !entry.sessionFilePath ||\n !fs.existsSync(entry.sessionFilePath)\n ) {\n fallback.push(processInfo);\n continue;\n }\n\n matches.push({ process: processInfo, filePath: entry.sessionFilePath });\n }\n\n const mapped = this.mapSessionFileMatches(matches);\n return { agents: mapped.agents, fallback: [...fallback, ...mapped.fallback] };\n }\n\n private mapTrackerMatches(processes: ProcessInfo[]): MappedAgentResult {\n const { matches, fallback } = this.createTracker().match(processes);\n const mapped = this.mapSessionFileMatches(matches);\n return { agents: mapped.agents, fallback: [...fallback, ...mapped.fallback] };\n }\n\n private mapLegacyMatches(\n matches: Array<{ process: ProcessInfo; session: { filePath: string } }>,\n ): MappedAgentResult {\n return this.mapSessionFileMatches(\n matches.map((match) => ({ process: match.process, filePath: match.session.filePath })),\n );\n }\n\n private mapSessionFileMatches(matches: SessionFileMatch[]): MappedAgentResult {\n const agents: AgentInfo[] = [];\n const fallback: ProcessInfo[] = [];\n\n for (const match of matches) {\n const session = this.parser.readSession(match.filePath, match.process.cwd);\n if (session) {\n agents.push(this.mapper.mapSessionToAgent(session, match.process, match.filePath));\n } else {\n fallback.push(match.process);\n }\n }\n\n return { agents, fallback };\n }\n\n private findUnmatchedProcesses(processes: ProcessInfo[], agents: AgentInfo[]): ProcessInfo[] {\n const matchedPids = new Set(agents.map((agent) => agent.pid));\n return processes.filter((processInfo) => !matchedPids.has(processInfo.pid));\n }\n\n private isPiExecutable(command: string): boolean {\n for (const token of command.trim().split(/\\s+/)) {\n const base = executableBasename(token);\n if (base === \"pi\" || base === \"pi.exe\" || base === \"pi.js\") return true;\n }\n return false;\n }\n}\n"],"names":["fs","path","captureProcessSnapshot","executableBasename","filterByProcessNames","AgentRegistry","PiAgentMapper","PiSessionLocator","PiSessionParser","PiSessionTracker","PiAdapter","type","processNames","piSessionsDir","trackerPath","registry","parser","mapper","default","homeDir","process","env","HOME","USERPROFILE","piAgentDir","join","canHandle","processInfo","isPiExecutable","command","detectAgents","context","processes","getPiProcesses","length","cacheResult","mapRegistryCache","trackerResult","mapTrackerMatches","fallback","locatorResult","createLocator","matchRunningProcesses","legacyResult","mapLegacyMatches","legacyMatches","unmatchedProcesses","findUnmatchedProcesses","agents","map","mapProcessOnlyAgent","getConversation","sessionFilePath","options","listSessions","opts","summaries","filePath","discoverHistoricalSessionFiles","summary","fileToSessionSummary","cwd","undefined","push","findSessionsById","sessionId","filePaths","findHistoricalSessionFilesById","filter","snapshot","relevant","byPid","Map","set","pid","Array","from","values","sessionsDir","createTracker","matches","list","entry","get","existsSync","mapped","mapSessionFileMatches","match","session","readSession","mapSessionToAgent","matchedPids","Set","agent","has","token","trim","split","base"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/pi/PiAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\nimport { type PiSession, PiSessionParser } from \"./PiSessionParser.js\";\n\nexport class PiAgentMapper {\n constructor(private readonly parser: PiSessionParser = new PiSessionParser()) {}\n\n mapSessionToAgent(session: PiSession, processInfo: ProcessInfo, filePath: string): AgentInfo {\n const projectPath = session.projectPath || processInfo.cwd || \"\";\n return {\n name: generateAgentName(projectPath, processInfo.pid),\n type: \"pi\",\n status: this.parser.determineStatus(session),\n summary: session.summary || \"Pi session active\",\n pid: processInfo.pid,\n projectPath,\n sessionId: session.sessionId,\n lastActive: session.lastActive,\n sessionFilePath: filePath,\n };\n }\n\n mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {\n return {\n name: generateAgentName(processInfo.cwd || \"\", processInfo.pid),\n type: \"pi\",\n status: AgentStatus.RUNNING,\n summary: \"Pi process running\",\n pid: processInfo.pid,\n projectPath: processInfo.cwd || \"\",\n sessionId: `pid-${processInfo.pid}`,\n lastActive: new Date(),\n };\n }\n}\n"],"names":["AgentStatus","generateAgentName","PiSessionParser","PiAgentMapper","parser","mapSessionToAgent","session","processInfo","filePath","projectPath","cwd","name","pid","type","status","determineStatus","summary","sessionId","lastActive","sessionFilePath","mapProcessOnlyAgent","RUNNING","Date"],"mappings":"AACA,SAASA,WAAW,QAAQ,iCAAiC;AAC7D,SAASC,iBAAiB,QAAQ,0BAA0B;AAC5D,SAAyBC,eAAe,QAAQ,uBAAuB;AAEvE,OAAO,MAAMC;;IACX,YAAY,AAAiBC,SAA0B,IAAIF,iBAAiB,CAAE;aAAjDE,SAAAA;IAAkD;IAE/EC,kBAAkBC,OAAkB,EAAEC,WAAwB,EAAEC,QAAgB,EAAa;QAC3F,MAAMC,cAAcH,QAAQG,WAAW,IAAIF,YAAYG,GAAG,IAAI;QAC9D,OAAO;YACLC,MAAMV,kBAAkBQ,aAAaF,YAAYK,GAAG;YACpDC,MAAM;YACNC,QAAQ,IAAI,CAACV,MAAM,CAACW,eAAe,CAACT;YACpCU,SAASV,QAAQU,OAAO,IAAI;YAC5BJ,KAAKL,YAAYK,GAAG;YACpBH;YACAQ,WAAWX,QAAQW,SAAS;YAC5BC,YAAYZ,QAAQY,UAAU;YAC9BC,iBAAiBX;QACnB;IACF;IAEAY,oBAAoBb,WAAwB,EAAa;QACvD,OAAO;YACLI,MAAMV,kBAAkBM,YAAYG,GAAG,IAAI,IAAIH,YAAYK,GAAG;YAC9DC,MAAM;YACNC,QAAQd,YAAYqB,OAAO;YAC3BL,SAAS;YACTJ,KAAKL,YAAYK,GAAG;YACpBH,aAAaF,YAAYG,GAAG,IAAI;YAChCO,WAAW,CAAC,IAAI,EAAEV,YAAYK,GAAG,EAAE;YACnCM,YAAY,IAAII;QAClB;IACF;AACF"}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { ProcessInfo } from "../../adapters/AgentAdapter.js";
|
|
2
|
-
import { type MatchResult } from "../../utils/matching.js";
|
|
3
|
-
import { type SessionFile } from "../../utils/session.js";
|
|
4
|
-
import { PiSessionParser } from "./PiSessionParser.js";
|
|
5
|
-
export interface PiSessionLocatorOptions {
|
|
6
|
-
sessionsDir?: string;
|
|
7
|
-
}
|
|
8
|
-
export interface PiProcessSessionMatches {
|
|
9
|
-
legacyMatches: MatchResult[];
|
|
10
|
-
fallback: ProcessInfo[];
|
|
11
|
-
}
|
|
12
|
-
export declare class PiSessionLocator {
|
|
13
|
-
private readonly parser;
|
|
14
|
-
private readonly sessionsDir;
|
|
15
|
-
constructor(options?: PiSessionLocatorOptions, parser?: PiSessionParser);
|
|
16
|
-
matchRunningProcesses(processes: ProcessInfo[]): PiProcessSessionMatches;
|
|
17
|
-
discoverLiveSessions(processes?: ProcessInfo[]): SessionFile[];
|
|
18
|
-
discoverHistoricalSessionFiles(): string[];
|
|
19
|
-
findHistoricalSessionFilesById(sessionId: string): string[];
|
|
20
|
-
private buildProjectDirCwdMap;
|
|
21
|
-
private collectJsonlFiles;
|
|
22
|
-
private encodeProjectDir;
|
|
23
|
-
}
|
|
24
|
-
//# sourceMappingURL=PiSessionLocator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PiSessionLocator.d.ts","sourceRoot":"","sources":["../../../src/providers/pi/PiSessionLocator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAKL,KAAK,WAAW,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,qBAAa,gBAAgB;IAKzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAJzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAGnC,OAAO,GAAE,uBAA4B,EACpB,MAAM,GAAE,eAAuC;IAMlE,qBAAqB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,uBAAuB;IAYxE,oBAAoB,CAAC,SAAS,GAAE,WAAW,EAAO,GAAG,WAAW,EAAE;IAwBlE,8BAA8B,IAAI,MAAM,EAAE;IAI1C,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAS3D,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,gBAAgB;CAIzB"}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import * as path from "path";
|
|
2
|
-
import { matchProcessesToSessions } from "../../utils/matching.js";
|
|
3
|
-
import { isDirectory, isSafePathSegment, safeReaddir, safeStat } from "../../utils/session.js";
|
|
4
|
-
import { PiSessionParser } from "./PiSessionParser.js";
|
|
5
|
-
export class PiSessionLocator {
|
|
6
|
-
parser;
|
|
7
|
-
sessionsDir;
|
|
8
|
-
constructor(options = {}, parser = new PiSessionParser()){
|
|
9
|
-
this.parser = parser;
|
|
10
|
-
const homeDir = process.env.HOME || process.env.USERPROFILE || "";
|
|
11
|
-
this.sessionsDir = options.sessionsDir ?? path.join(homeDir, ".pi", "agent", "sessions");
|
|
12
|
-
}
|
|
13
|
-
matchRunningProcesses(processes) {
|
|
14
|
-
if (processes.length === 0) return {
|
|
15
|
-
legacyMatches: [],
|
|
16
|
-
fallback: []
|
|
17
|
-
};
|
|
18
|
-
const sessions = this.discoverLiveSessions(processes);
|
|
19
|
-
if (sessions.length === 0) return {
|
|
20
|
-
legacyMatches: [],
|
|
21
|
-
fallback: processes
|
|
22
|
-
};
|
|
23
|
-
return {
|
|
24
|
-
legacyMatches: matchProcessesToSessions(processes, sessions),
|
|
25
|
-
fallback: processes
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
discoverLiveSessions(processes = []) {
|
|
29
|
-
if (!isDirectory(this.sessionsDir)) return [];
|
|
30
|
-
const cwdByProjectDir = this.buildProjectDirCwdMap(processes);
|
|
31
|
-
const sessions = [];
|
|
32
|
-
for (const filePath of this.discoverHistoricalSessionFiles()){
|
|
33
|
-
const stat = safeStat(filePath);
|
|
34
|
-
if (!stat) continue;
|
|
35
|
-
const session = this.parser.readSession(filePath);
|
|
36
|
-
const sessionId = session?.sessionId || this.parser.sessionIdFromFile(filePath);
|
|
37
|
-
const projectDir = path.dirname(filePath);
|
|
38
|
-
sessions.push({
|
|
39
|
-
sessionId,
|
|
40
|
-
filePath,
|
|
41
|
-
projectDir,
|
|
42
|
-
birthtimeMs: stat.birthtimeMs || stat.mtimeMs,
|
|
43
|
-
resolvedCwd: session?.projectPath || cwdByProjectDir.get(path.basename(projectDir)) || ""
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
return sessions;
|
|
47
|
-
}
|
|
48
|
-
discoverHistoricalSessionFiles() {
|
|
49
|
-
return this.collectJsonlFiles(this.sessionsDir);
|
|
50
|
-
}
|
|
51
|
-
findHistoricalSessionFilesById(sessionId) {
|
|
52
|
-
if (!isSafePathSegment(sessionId)) return [];
|
|
53
|
-
return this.collectJsonlFiles(this.sessionsDir).filter((filePath)=>{
|
|
54
|
-
const basename = path.basename(filePath, ".jsonl");
|
|
55
|
-
return basename === sessionId || basename.endsWith(`_${sessionId}`);
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
buildProjectDirCwdMap(processes) {
|
|
59
|
-
const map = new Map();
|
|
60
|
-
for (const proc of processes){
|
|
61
|
-
if (!proc.cwd) continue;
|
|
62
|
-
map.set(this.encodeProjectDir(proc.cwd), proc.cwd);
|
|
63
|
-
}
|
|
64
|
-
return map;
|
|
65
|
-
}
|
|
66
|
-
collectJsonlFiles(dir) {
|
|
67
|
-
const files = [];
|
|
68
|
-
for (const entry of safeReaddir(dir)){
|
|
69
|
-
const fullPath = path.join(dir, entry);
|
|
70
|
-
const stat = safeStat(fullPath);
|
|
71
|
-
if (!stat) continue;
|
|
72
|
-
if (stat.isDirectory()) {
|
|
73
|
-
files.push(...this.collectJsonlFiles(fullPath));
|
|
74
|
-
} else if (stat.isFile() && entry.endsWith(".jsonl")) {
|
|
75
|
-
files.push(fullPath);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return files;
|
|
79
|
-
}
|
|
80
|
-
encodeProjectDir(cwd) {
|
|
81
|
-
const normalized = path.resolve(cwd);
|
|
82
|
-
return `--${normalized.replace(/^\//, "").replace(/\//g, "-")}--`;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
//# sourceMappingURL=PiSessionLocator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/pi/PiSessionLocator.ts"],"sourcesContent":["import * as path from \"path\";\nimport type { ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { matchProcessesToSessions, type MatchResult } from \"../../utils/matching.js\";\nimport {\n isDirectory,\n isSafePathSegment,\n safeReaddir,\n safeStat,\n type SessionFile,\n} from \"../../utils/session.js\";\nimport { PiSessionParser } from \"./PiSessionParser.js\";\n\nexport interface PiSessionLocatorOptions {\n sessionsDir?: string;\n}\n\nexport interface PiProcessSessionMatches {\n legacyMatches: MatchResult[];\n fallback: ProcessInfo[];\n}\n\nexport class PiSessionLocator {\n private readonly sessionsDir: string;\n\n constructor(\n options: PiSessionLocatorOptions = {},\n private readonly parser: PiSessionParser = new PiSessionParser(),\n ) {\n const homeDir = process.env.HOME || process.env.USERPROFILE || \"\";\n this.sessionsDir = options.sessionsDir ?? path.join(homeDir, \".pi\", \"agent\", \"sessions\");\n }\n\n matchRunningProcesses(processes: ProcessInfo[]): PiProcessSessionMatches {\n if (processes.length === 0) return { legacyMatches: [], fallback: [] };\n\n const sessions = this.discoverLiveSessions(processes);\n if (sessions.length === 0) return { legacyMatches: [], fallback: processes };\n\n return {\n legacyMatches: matchProcessesToSessions(processes, sessions),\n fallback: processes,\n };\n }\n\n discoverLiveSessions(processes: ProcessInfo[] = []): SessionFile[] {\n if (!isDirectory(this.sessionsDir)) return [];\n\n const cwdByProjectDir = this.buildProjectDirCwdMap(processes);\n const sessions: SessionFile[] = [];\n for (const filePath of this.discoverHistoricalSessionFiles()) {\n const stat = safeStat(filePath);\n if (!stat) continue;\n\n const session = this.parser.readSession(filePath);\n const sessionId = session?.sessionId || this.parser.sessionIdFromFile(filePath);\n const projectDir = path.dirname(filePath);\n sessions.push({\n sessionId,\n filePath,\n projectDir,\n birthtimeMs: stat.birthtimeMs || stat.mtimeMs,\n resolvedCwd: session?.projectPath || cwdByProjectDir.get(path.basename(projectDir)) || \"\",\n });\n }\n\n return sessions;\n }\n\n discoverHistoricalSessionFiles(): string[] {\n return this.collectJsonlFiles(this.sessionsDir);\n }\n\n findHistoricalSessionFilesById(sessionId: string): string[] {\n if (!isSafePathSegment(sessionId)) return [];\n\n return this.collectJsonlFiles(this.sessionsDir).filter((filePath) => {\n const basename = path.basename(filePath, \".jsonl\");\n return basename === sessionId || basename.endsWith(`_${sessionId}`);\n });\n }\n\n private buildProjectDirCwdMap(processes: ProcessInfo[]): Map<string, string> {\n const map = new Map<string, string>();\n for (const proc of processes) {\n if (!proc.cwd) continue;\n map.set(this.encodeProjectDir(proc.cwd), proc.cwd);\n }\n return map;\n }\n\n private collectJsonlFiles(dir: string): string[] {\n const files: string[] = [];\n for (const entry of safeReaddir(dir)) {\n const fullPath = path.join(dir, entry);\n const stat = safeStat(fullPath);\n if (!stat) continue;\n if (stat.isDirectory()) {\n files.push(...this.collectJsonlFiles(fullPath));\n } else if (stat.isFile() && entry.endsWith(\".jsonl\")) {\n files.push(fullPath);\n }\n }\n return files;\n }\n\n private encodeProjectDir(cwd: string): string {\n const normalized = path.resolve(cwd);\n return `--${normalized.replace(/^\\//, \"\").replace(/\\//g, \"-\")}--`;\n }\n}\n"],"names":["path","matchProcessesToSessions","isDirectory","isSafePathSegment","safeReaddir","safeStat","PiSessionParser","PiSessionLocator","sessionsDir","options","parser","homeDir","process","env","HOME","USERPROFILE","join","matchRunningProcesses","processes","length","legacyMatches","fallback","sessions","discoverLiveSessions","cwdByProjectDir","buildProjectDirCwdMap","filePath","discoverHistoricalSessionFiles","stat","session","readSession","sessionId","sessionIdFromFile","projectDir","dirname","push","birthtimeMs","mtimeMs","resolvedCwd","projectPath","get","basename","collectJsonlFiles","findHistoricalSessionFilesById","filter","endsWith","map","Map","proc","cwd","set","encodeProjectDir","dir","files","entry","fullPath","isFile","normalized","resolve","replace"],"mappings":"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"}
|