@ai-devkit/agent-manager 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentManager.d.ts +9 -4
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +21 -2
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +151 -3
- package/dist/__tests__/AgentManager.test.js.map +1 -1
- package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js +486 -0
- package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js.map +1 -0
- package/dist/__tests__/adapters/adapterProcessImports.test.js +52 -0
- package/dist/__tests__/adapters/adapterProcessImports.test.js.map +1 -0
- package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js +247 -0
- package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js.map +1 -0
- package/dist/__tests__/capacity/claude.test.js +485 -0
- package/dist/__tests__/capacity/claude.test.js.map +1 -0
- package/dist/__tests__/capacity/openai.test.js +670 -0
- package/dist/__tests__/capacity/openai.test.js.map +1 -0
- package/dist/__tests__/capacity/wham.test.js +144 -0
- package/dist/__tests__/capacity/wham.test.js.map +1 -0
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js +462 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
- package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
- package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
- package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
- package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
- package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
- package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
- package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
- package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
- package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
- package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
- package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js +662 -0
- package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
- package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
- package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
- package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
- package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
- package/dist/__tests__/utils/agents.test.js +72 -2
- package/dist/__tests__/utils/agents.test.js.map +1 -1
- package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
- package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
- package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
- package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
- package/dist/__tests__/utils/jsonlTail.test.js +360 -0
- package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
- package/dist/__tests__/utils/matchingConstants.test.js +35 -0
- package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
- package/dist/__tests__/utils/process.test.js +436 -2
- package/dist/__tests__/utils/process.test.js.map +1 -1
- package/dist/adapters/AgentAdapter.d.ts +25 -6
- package/dist/adapters/AgentAdapter.d.ts.map +1 -1
- package/dist/adapters/AgentAdapter.js +12 -3
- package/dist/adapters/AgentAdapter.js.map +1 -1
- package/dist/capacity/claude.d.ts +17 -0
- package/dist/capacity/claude.d.ts.map +1 -0
- package/dist/capacity/claude.js +271 -0
- package/dist/capacity/claude.js.map +1 -0
- package/dist/capacity/codex.d.ts +1 -2
- package/dist/capacity/codex.d.ts.map +1 -1
- package/dist/capacity/codex.js +5 -47
- package/dist/capacity/codex.js.map +1 -1
- package/dist/capacity/index.d.ts +11 -0
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +17 -0
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/openai.d.ts +47 -0
- package/dist/capacity/openai.d.ts.map +1 -0
- package/dist/capacity/openai.js +307 -0
- package/dist/capacity/openai.js.map +1 -0
- package/dist/capacity/wham.d.ts +16 -0
- package/dist/capacity/wham.d.ts.map +1 -0
- package/dist/capacity/wham.js +66 -0
- package/dist/capacity/wham.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
- package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
- package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
- package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
- package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
- package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
- package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
- package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
- package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
- package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
- package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
- package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
- package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
- package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
- package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
- package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
- package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
- package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
- package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
- package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
- package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
- package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
- package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
- package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
- package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
- package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
- package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
- package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
- package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
- package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
- package/dist/harnesses/gemini/fileSignature.js +9 -0
- package/dist/harnesses/gemini/fileSignature.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
- package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
- package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
- package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
- package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
- package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
- package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
- package/dist/harnesses/grok/GrokSessionParser.js +185 -0
- package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
- package/dist/harnesses/index.d.ts +7 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +27 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
- package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroAdapter.js +125 -0
- package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
- package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
- package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
- package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
- package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
- package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
- package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
- package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
- package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
- package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
- package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
- package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
- package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
- package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
- package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
- package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
- package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
- package/dist/harnesses/pi/PiAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
- package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
- package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
- package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionLocator.js +212 -0
- package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
- package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
- package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionParser.js +318 -0
- package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
- package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
- package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
- package/dist/harnesses/shared.d.ts +41 -0
- package/dist/harnesses/shared.d.ts.map +1 -0
- package/dist/harnesses/shared.js +71 -0
- package/dist/harnesses/shared.js.map +1 -0
- package/dist/index.d.ts +28 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -16
- package/dist/index.js.map +1 -1
- package/dist/readiness/AgentReadiness.d.ts +1 -1
- package/dist/readiness/AgentReadiness.d.ts.map +1 -1
- package/dist/readiness/AgentReadiness.js.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.js +3 -1
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
- package/dist/runtime/herdr/HerdrAgentDiscovery.js +10 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
- package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
- package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
- package/dist/utils/IncrementalJsonlSummary.js +209 -0
- package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
- package/dist/utils/agents.d.ts +3 -2
- package/dist/utils/agents.d.ts.map +1 -1
- package/dist/utils/agents.js +61 -15
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/jsonlTail.d.ts +73 -0
- package/dist/utils/jsonlTail.d.ts.map +1 -0
- package/dist/utils/jsonlTail.js +238 -0
- package/dist/utils/jsonlTail.js.map +1 -0
- package/dist/utils/matching.d.ts +2 -0
- package/dist/utils/matching.d.ts.map +1 -1
- package/dist/utils/matching.js +3 -2
- package/dist/utils/matching.js.map +1 -1
- package/dist/utils/matchingConstants.d.ts +15 -0
- package/dist/utils/matchingConstants.d.ts.map +1 -0
- package/dist/utils/matchingConstants.js +14 -0
- package/dist/utils/matchingConstants.js.map +1 -0
- package/dist/utils/process.d.ts +38 -2
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +131 -43
- package/dist/utils/process.js.map +1 -1
- package/package.json +2 -1
- package/scripts/benchmark-cold-start.mjs +350 -0
- package/src/AgentManager.ts +26 -5
- package/src/__tests__/AgentManager.test.ts +141 -3
- package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
- package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
- package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
- package/src/__tests__/capacity/claude.test.ts +467 -0
- package/src/__tests__/capacity/fixtures/claude-credentials.json +7 -0
- package/src/__tests__/capacity/fixtures/claude-usage-malformed.json +1 -0
- package/src/__tests__/capacity/fixtures/claude-usage-partial.json +15 -0
- package/src/__tests__/capacity/fixtures/claude-usage.json +63 -0
- package/src/__tests__/capacity/fixtures/openai-auth.json +6 -0
- package/src/__tests__/capacity/fixtures/openai-codex-auth.json +9 -0
- package/src/__tests__/capacity/fixtures/openai-usage-completions.json +67 -0
- package/src/__tests__/capacity/fixtures/openai-usage-responses.json +20 -0
- package/src/__tests__/capacity/fixtures/wham-usage.json +32 -0
- package/src/__tests__/capacity/openai.test.ts +560 -0
- package/src/__tests__/capacity/wham.test.ts +104 -0
- package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
- package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
- package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
- package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.ts +396 -0
- package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
- package/src/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
- package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
- package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
- package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
- package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
- package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
- package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
- package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
- package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
- package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
- package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
- package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
- package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
- package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
- package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
- package/src/__tests__/harnesses/kiro/KiroAdapter.test.ts +552 -0
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
- package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
- package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
- package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
- package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
- package/src/__tests__/utils/agents.test.ts +83 -2
- package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
- package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
- package/src/__tests__/utils/jsonlTail.test.ts +317 -0
- package/src/__tests__/utils/matchingConstants.test.ts +40 -0
- package/src/__tests__/utils/process.test.ts +254 -0
- package/src/adapters/AgentAdapter.ts +37 -12
- package/src/capacity/claude.ts +313 -0
- package/src/capacity/codex.ts +25 -134
- package/src/capacity/index.ts +33 -4
- package/src/capacity/openai.ts +355 -0
- package/src/capacity/wham.ts +84 -0
- package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
- package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
- package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
- package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
- package/src/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
- package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
- package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
- package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
- package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
- package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
- package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
- package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
- package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
- package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
- package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
- package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
- package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
- package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
- package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
- package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
- package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
- package/src/harnesses/gemini/fileSignature.ts +10 -0
- package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
- package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
- package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
- package/src/harnesses/grok/GrokSessionParser.ts +251 -0
- package/src/harnesses/index.ts +28 -0
- package/src/harnesses/kiro/KiroAdapter.ts +143 -0
- package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
- package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
- package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
- package/src/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
- package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
- package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
- package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
- package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
- package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
- package/src/harnesses/pi/PiSessionLocator.ts +288 -0
- package/src/harnesses/pi/PiSessionParser.ts +488 -0
- package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
- package/src/harnesses/shared.ts +119 -0
- package/src/index.ts +34 -23
- package/src/readiness/AgentReadiness.ts +4 -1
- package/src/runtime/ManagedAgentRuntime.ts +2 -0
- package/src/runtime/herdr/HerdrAgentDiscovery.ts +5 -1
- package/src/utils/IncrementalJsonlSummary.ts +306 -0
- package/src/utils/agents.ts +62 -20
- package/src/utils/index.ts +2 -0
- package/src/utils/jsonlTail.ts +349 -0
- package/src/utils/matching.ts +3 -3
- package/src/utils/matchingConstants.ts +15 -0
- package/src/utils/process.ts +189 -45
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -10
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -10
- package/dist/adapters/index.js.map +0 -1
- package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
- package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
- package/dist/providers/codex/CodexAdapter.js.map +0 -1
- package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
- package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
- package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionLocator.js +0 -207
- package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
- package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
- package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
- package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionParser.js.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
- package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
- package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
- package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
- package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
- package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
- package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotSessionParser.js +0 -181
- package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
- package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
- package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
- package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
- package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
- package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiSessionParser.js +0 -166
- package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
- package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
- package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
- package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
- package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
- package/dist/providers/grok/GrokSessionParser.js +0 -122
- package/dist/providers/grok/GrokSessionParser.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
- package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
- package/dist/providers/pi/PiAdapter.js.map +0 -1
- package/dist/providers/pi/PiAgentMapper.js.map +0 -1
- package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
- package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionLocator.js +0 -86
- package/dist/providers/pi/PiSessionLocator.js.map +0 -1
- package/dist/providers/pi/PiSessionParser.d.ts +0 -36
- package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionParser.js +0 -191
- package/dist/providers/pi/PiSessionParser.js.map +0 -1
- package/dist/providers/pi/PiSessionTracker.js.map +0 -1
- package/src/__tests__/fixtures/fake-claude.cjs +0 -31
- package/src/__tests__/fixtures/fake-codex.cjs +0 -56
- package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
- package/src/adapters/index.ts +0 -15
- package/src/providers/codex/CodexSessionLocator.ts +0 -279
- package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
- package/src/providers/copilot/CopilotSessionParser.ts +0 -289
- package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
- package/src/providers/grok/GrokSessionParser.ts +0 -166
- package/src/providers/pi/PiSessionLocator.ts +0 -110
- package/src/providers/pi/PiSessionParser.ts +0 -284
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js +0 -0
- /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
- /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
- /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenCodeSessionLocator.d.ts","sourceRoot":"","sources":["../../../src/
|
|
1
|
+
{"version":3,"file":"OpenCodeSessionLocator.d.ts","sourceRoot":"","sources":["../../../src/harnesses/opencode/OpenCodeSessionLocator.ts"],"names":[],"mappings":"AAEA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AASnE,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAQD,qBAAa,sBAAsB;IAM/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,EAAE,CAAkC;gBAG1C,MAAM,SAAyC,EAC9B,MAAM,GAAE,qBAAmD;IAK9E,MAAM,CAAC,aAAa,IAAI,MAAM;IAM9B,MAAM,IAAI,QAAQ,CAAC,QAAQ,GAAG,IAAI;IAYlC,KAAK,IAAI,IAAI;IAWb,uBAAuB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAmBzF,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,cAAc,EAAE;IA4B1D,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,EAAE;IAmBrD,OAAO,CAAC,gBAAgB;IAgBxB,IAAI,UAAU,IAAI,MAAM,CAEvB;CACF"}
|
|
@@ -2,6 +2,7 @@ import * as fs from "fs";
|
|
|
2
2
|
import * as path from "path";
|
|
3
3
|
import Database from "better-sqlite3";
|
|
4
4
|
import { OpenCodeSessionParser } from "./OpenCodeSessionParser.js";
|
|
5
|
+
import { homeDir } from "../shared.js";
|
|
5
6
|
const SESSION_REF_SEP = "::";
|
|
6
7
|
function encodeOpenCodeSessionRef(dbPath, sessionId) {
|
|
7
8
|
return `${dbPath}${SESSION_REF_SEP}${sessionId}`;
|
|
@@ -16,8 +17,7 @@ export class OpenCodeSessionLocator {
|
|
|
16
17
|
}
|
|
17
18
|
static resolveDbPath() {
|
|
18
19
|
const xdg = process.env.XDG_DATA_HOME;
|
|
19
|
-
const
|
|
20
|
-
const base = xdg || path.join(home, ".local", "share");
|
|
20
|
+
const base = xdg || path.join(homeDir(), ".local", "share");
|
|
21
21
|
return path.join(base, "opencode", "opencode.db");
|
|
22
22
|
}
|
|
23
23
|
openDb() {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/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\";\nimport { homeDir } from \"../shared.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 base = xdg || path.join(homeDir(), \".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","homeDir","SESSION_REF_SEP","encodeOpenCodeSessionRef","dbPath","sessionId","OpenCodeSessionLocator","db","resolveDbPath","parser","xdg","process","env","XDG_DATA_HOME","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,4 +1,4 @@
|
|
|
1
|
-
import type { ConversationMessage } from "../../adapters/AgentAdapter.js";
|
|
1
|
+
import type { ConversationMessage, ConversationOptions } from "../../adapters/AgentAdapter.js";
|
|
2
2
|
import type Database from "better-sqlite3";
|
|
3
3
|
export interface OpenCodeSessionStats {
|
|
4
4
|
lastRole: string | null;
|
|
@@ -9,9 +9,7 @@ export interface OpenCodeSessionStats {
|
|
|
9
9
|
summary: string;
|
|
10
10
|
}
|
|
11
11
|
export declare class OpenCodeSessionParser {
|
|
12
|
-
getConversation(db: Database.Database, sessionId: string, options?:
|
|
13
|
-
verbose?: boolean;
|
|
14
|
-
}): ConversationMessage[];
|
|
12
|
+
getConversation(db: Database.Database, sessionId: string, options?: ConversationOptions): ConversationMessage[];
|
|
15
13
|
getSessionStats(db: Database.Database, sessionId: string): OpenCodeSessionStats;
|
|
16
14
|
private parsePartData;
|
|
17
15
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OpenCodeSessionParser.d.ts","sourceRoot":"","sources":["../../../src/harnesses/opencode/OpenCodeSessionParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAE/F,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,mBAAmB,GAC5B,mBAAmB,EAAE;IAyCxB,eAAe,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,oBAAoB;IAgE/E,OAAO,CAAC,aAAa;CAOtB"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { sliceTail } from "../../utils/jsonlTail.js";
|
|
1
2
|
const EMPTY_STATS = {
|
|
2
3
|
lastRole: null,
|
|
3
4
|
lastTimeUpdated: 0,
|
|
@@ -42,7 +43,7 @@ export class OpenCodeSessionParser {
|
|
|
42
43
|
});
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
|
-
return messages;
|
|
46
|
+
return sliceTail(messages, options?.tail);
|
|
46
47
|
} catch {
|
|
47
48
|
return [];
|
|
48
49
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/opencode/OpenCodeSessionParser.ts"],"sourcesContent":["import type { ConversationMessage, ConversationOptions } from \"../../adapters/AgentAdapter.js\";\nimport { sliceTail } from \"../../utils/jsonlTail.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?: ConversationOptions,\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 sliceTail(messages, options?.tail);\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":["sliceTail","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","tail","getSessionStats","last","get","heartbeat","lastAssistant","first","maxUpdated","timeUpdated","completed","errored","trim","JSON","parse"],"mappings":"AACA,SAASA,SAAS,QAAQ,2BAA2B;AAmBrD,MAAMC,cAAoC;IACxCC,UAAU;IACVC,iBAAiB;IACjBC,wBAAwB;IACxBC,sBAAsB;IACtBC,SAAS;AACX;AAEA,OAAO,MAAMC;IACXC,gBACEC,EAAqB,EACrBC,SAAiB,EACjBC,OAA6B,EACN;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,OAAO1B,UAAUgB,UAAUL,SAASiB;QACtC,EAAE,OAAM;YACN,OAAO,EAAE;QACX;IACF;IAEAC,gBAAgBpB,EAAqB,EAAEC,SAAiB,EAAwB;QAC9E,IAAI;YACF,qEAAqE;YACrE,wEAAwE;YACxE,MAAMoB,OAAOrB,GACVK,OAAO,CAAkD,CAAC;;;;;;;YAOvD,CAAC,EACJiB,GAAG,CAACrB;YAEP,MAAMsB,YAAYvB,GACfK,OAAO,CAAmC,CAAC;;YAExC,CAAC,EACJiB,GAAG,CAACrB;YAEP,MAAMuB,gBAAgBxB,GACnBK,OAAO,CAMN,CAAC;;;;;;;YAOC,CAAC,EACJiB,GAAG,CAACrB;YAEP,MAAMwB,QAAQzB,GACXK,OAAO,CAA6B,CAAC;;;;;;;;;;YAUlC,CAAC,EACJiB,GAAG,CAACrB;YAEP,OAAO;gBACLR,UAAU4B,MAAMV,QAAQ;gBACxBjB,iBAAiB6B,WAAWG,cAAcL,MAAMM,eAAe;gBAC/DhC,wBAAwB6B,eAAeI,aAAa;gBACpDhC,sBAAsB4B,eAAeK,WAAW;gBAChDhC,SAAS4B,OAAOZ,MAAMiB,UAAU;YAClC;QACF,EAAE,OAAM;YACN,OAAOtC;QACT;IACF;IAEQkB,cAAcD,QAAgB,EAA2B;QAC/D,IAAI;YACF,OAAOsB,KAAKC,KAAK,CAACvB;QACpB,EAAE,OAAM;YACN,OAAO;QACT;IACF;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, SessionSummary, ListSessionsOptions, AgentDetectionContext } from "../../adapters/AgentAdapter.js";
|
|
1
|
+
import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, ConversationOptions, SessionSummary, ListSessionsOptions, AgentDetectionContext } from "../../adapters/AgentAdapter.js";
|
|
2
2
|
import { AgentRegistry } from "../../utils/AgentRegistry.js";
|
|
3
3
|
export declare class PiAdapter implements AgentAdapter {
|
|
4
4
|
readonly type: "pi";
|
|
@@ -8,12 +8,13 @@ export declare class PiAdapter implements AgentAdapter {
|
|
|
8
8
|
private readonly registry;
|
|
9
9
|
private readonly parser;
|
|
10
10
|
private readonly mapper;
|
|
11
|
+
/** Kept across refreshes so live discovery can reuse its head and no-match caches. */
|
|
12
|
+
private readonly liveLocator;
|
|
11
13
|
constructor(registry?: AgentRegistry);
|
|
12
14
|
canHandle(processInfo: ProcessInfo): boolean;
|
|
13
15
|
detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}): ConversationMessage[];
|
|
16
|
+
private detectRunningAgents;
|
|
17
|
+
getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[];
|
|
17
18
|
listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
|
|
18
19
|
findSessionsById(sessionId: string): Promise<SessionSummary[]>;
|
|
19
20
|
private getPiProcesses;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PiAdapter.d.ts","sourceRoot":"","sources":["../../../src/harnesses/pi/PiAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAiB7D,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;IACvC,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;gBAEnC,QAAQ,GAAE,aAAuC;IAU7D,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAItC,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YAS3D,mBAAmB;IAqBjC,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE;IAIxF,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAanE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAYtD,cAAc;IAI5B,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,11 +1,12 @@
|
|
|
1
1
|
import * as fs from "fs";
|
|
2
2
|
import * as path from "path";
|
|
3
|
-
import {
|
|
3
|
+
import { executableBasename } from "../../utils/process.js";
|
|
4
4
|
import { AgentRegistry } from "../../utils/AgentRegistry.js";
|
|
5
5
|
import { PiAgentMapper } from "./PiAgentMapper.js";
|
|
6
6
|
import { PiSessionLocator } from "./PiSessionLocator.js";
|
|
7
7
|
import { PiSessionParser } from "./PiSessionParser.js";
|
|
8
8
|
import { PiSessionTracker } from "./PiSessionTracker.js";
|
|
9
|
+
import { findHarnessProcesses, homeDir } from "../shared.js";
|
|
9
10
|
export class PiAdapter {
|
|
10
11
|
type = "pi";
|
|
11
12
|
processNames = [
|
|
@@ -17,24 +18,33 @@ export class PiAdapter {
|
|
|
17
18
|
registry;
|
|
18
19
|
parser;
|
|
19
20
|
mapper;
|
|
21
|
+
/** Kept across refreshes so live discovery can reuse its head and no-match caches. */ liveLocator;
|
|
20
22
|
constructor(registry = AgentRegistry.default()){
|
|
21
|
-
const
|
|
22
|
-
const piAgentDir = path.join(homeDir, ".pi", "agent");
|
|
23
|
+
const piAgentDir = path.join(homeDir(), ".pi", "agent");
|
|
23
24
|
this.piSessionsDir = path.join(piAgentDir, "sessions");
|
|
24
25
|
this.trackerPath = path.join(piAgentDir, "sessions.json");
|
|
25
26
|
this.registry = registry;
|
|
26
27
|
this.parser = new PiSessionParser();
|
|
27
28
|
this.mapper = new PiAgentMapper(this.parser);
|
|
29
|
+
this.liveLocator = this.createLocator();
|
|
28
30
|
}
|
|
29
31
|
canHandle(processInfo) {
|
|
30
32
|
return this.isPiExecutable(processInfo.command);
|
|
31
33
|
}
|
|
32
34
|
async detectAgents(context) {
|
|
35
|
+
try {
|
|
36
|
+
return await this.detectRunningAgents(context);
|
|
37
|
+
} finally{
|
|
38
|
+
// Drop cached summaries for sessions that were not part of this refresh
|
|
39
|
+
this.parser.pruneSessionCache();
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async detectRunningAgents(context) {
|
|
33
43
|
const processes = await this.getPiProcesses(context);
|
|
34
44
|
if (processes.length === 0) return [];
|
|
35
45
|
const cacheResult = this.mapRegistryCache(processes);
|
|
36
46
|
const trackerResult = this.mapTrackerMatches(cacheResult.fallback);
|
|
37
|
-
const locatorResult = this.
|
|
47
|
+
const locatorResult = this.liveLocator.matchRunningProcesses(trackerResult.fallback);
|
|
38
48
|
const legacyResult = this.mapLegacyMatches(locatorResult.legacyMatches);
|
|
39
49
|
const unmatchedProcesses = this.findUnmatchedProcesses(locatorResult.fallback, legacyResult.agents);
|
|
40
50
|
return [
|
|
@@ -68,13 +78,7 @@ export class PiAdapter {
|
|
|
68
78
|
return (await this.listSessions()).filter((summary)=>summary.sessionId === sessionId);
|
|
69
79
|
}
|
|
70
80
|
async getPiProcesses(context) {
|
|
71
|
-
|
|
72
|
-
const relevant = filterByProcessNames(snapshot, this.processNames);
|
|
73
|
-
const byPid = new Map();
|
|
74
|
-
for (const processInfo of relevant){
|
|
75
|
-
if (this.canHandle(processInfo)) byPid.set(processInfo.pid, processInfo);
|
|
76
|
-
}
|
|
77
|
-
return Array.from(byPid.values());
|
|
81
|
+
return (await findHarnessProcesses(this, context)).processes;
|
|
78
82
|
}
|
|
79
83
|
createLocator() {
|
|
80
84
|
return new PiSessionLocator({
|
|
@@ -135,7 +139,7 @@ export class PiAdapter {
|
|
|
135
139
|
const agents = [];
|
|
136
140
|
const fallback = [];
|
|
137
141
|
for (const match of matches){
|
|
138
|
-
const session = this.parser.
|
|
142
|
+
const session = this.parser.readSessionIncremental(match.filePath, match.process.cwd);
|
|
139
143
|
if (session) {
|
|
140
144
|
agents.push(this.mapper.mapSessionToAgent(session, match.process, match.filePath));
|
|
141
145
|
} else {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/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 ConversationOptions,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"../../adapters/AgentAdapter.js\";\nimport { executableBasename } 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\";\nimport { findHarnessProcesses, homeDir } from \"../shared.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 /** Kept across refreshes so live discovery can reuse its head and no-match caches. */\n private readonly liveLocator: PiSessionLocator;\n\n constructor(registry: AgentRegistry = AgentRegistry.default()) {\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 this.liveLocator = this.createLocator();\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return this.isPiExecutable(processInfo.command);\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n try {\n return await this.detectRunningAgents(context);\n } finally {\n // Drop cached summaries for sessions that were not part of this refresh\n this.parser.pruneSessionCache();\n }\n }\n\n private async detectRunningAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const 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.liveLocator.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?: ConversationOptions): 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 return (await findHarnessProcesses(this, context)).processes;\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.readSessionIncremental(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","executableBasename","AgentRegistry","PiAgentMapper","PiSessionLocator","PiSessionParser","PiSessionTracker","findHarnessProcesses","homeDir","PiAdapter","type","processNames","piSessionsDir","trackerPath","registry","parser","mapper","liveLocator","default","piAgentDir","join","createLocator","canHandle","processInfo","isPiExecutable","command","detectAgents","context","detectRunningAgents","pruneSessionCache","processes","getPiProcesses","length","cacheResult","mapRegistryCache","trackerResult","mapTrackerMatches","fallback","locatorResult","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","sessionsDir","createTracker","matches","byPid","Map","list","entry","pid","get","existsSync","process","mapped","mapSessionFileMatches","match","session","readSessionIncremental","mapSessionToAgent","matchedPids","Set","agent","has","token","trim","split","base"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PiAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/
|
|
1
|
+
{"version":3,"file":"PiAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/harnesses/pi/PiAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7E,OAAO,EAAE,KAAK,SAAS,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvE,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,eAAuC;IAE5E,iBAAiB,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS;IAe5F,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAGzD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { AgentStatus } from "../../adapters/AgentAdapter.js";
|
|
2
1
|
import { generateAgentName } from "../../utils/matching.js";
|
|
3
2
|
import { PiSessionParser } from "./PiSessionParser.js";
|
|
3
|
+
import { processOnlyAgent } from "../shared.js";
|
|
4
4
|
export class PiAgentMapper {
|
|
5
5
|
parser;
|
|
6
6
|
constructor(parser = new PiSessionParser()){
|
|
@@ -21,16 +21,9 @@ export class PiAgentMapper {
|
|
|
21
21
|
};
|
|
22
22
|
}
|
|
23
23
|
mapProcessOnlyAgent(processInfo) {
|
|
24
|
-
return {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
status: AgentStatus.RUNNING,
|
|
28
|
-
summary: "Pi process running",
|
|
29
|
-
pid: processInfo.pid,
|
|
30
|
-
projectPath: processInfo.cwd || "",
|
|
31
|
-
sessionId: `pid-${processInfo.pid}`,
|
|
32
|
-
lastActive: new Date()
|
|
33
|
-
};
|
|
24
|
+
return processOnlyAgent("pi", processInfo, {
|
|
25
|
+
summary: "Pi process running"
|
|
26
|
+
});
|
|
34
27
|
}
|
|
35
28
|
}
|
|
36
29
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/pi/PiAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\nimport { type PiSession, PiSessionParser } from \"./PiSessionParser.js\";\nimport { processOnlyAgent } from \"../shared.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 processOnlyAgent(\"pi\", processInfo, { summary: \"Pi process running\" });\n }\n}\n"],"names":["generateAgentName","PiSessionParser","processOnlyAgent","PiAgentMapper","parser","mapSessionToAgent","session","processInfo","filePath","projectPath","cwd","name","pid","type","status","determineStatus","summary","sessionId","lastActive","sessionFilePath","mapProcessOnlyAgent"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,0BAA0B;AAC5D,SAAyBC,eAAe,QAAQ,uBAAuB;AACvE,SAASC,gBAAgB,QAAQ,eAAe;AAEhD,OAAO,MAAMC;;IACX,YAAY,AAAiBC,SAA0B,IAAIH,iBAAiB,CAAE;aAAjDG,SAAAA;IAAkD;IAE/EC,kBAAkBC,OAAkB,EAAEC,WAAwB,EAAEC,QAAgB,EAAa;QAC3F,MAAMC,cAAcH,QAAQG,WAAW,IAAIF,YAAYG,GAAG,IAAI;QAC9D,OAAO;YACLC,MAAMX,kBAAkBS,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,OAAOL,iBAAiB,MAAMK,aAAa;YAAES,SAAS;QAAqB;IAC7E;AACF"}
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
/**
|
|
13
|
+
* Finds Pi session files for running processes that the registry and the
|
|
14
|
+
* sessions.json tracker could not resolve.
|
|
15
|
+
*
|
|
16
|
+
* Live discovery is scoped so its cost follows live agents, not Pi history:
|
|
17
|
+
* - only the project dir Pi derives from each process cwd is listed;
|
|
18
|
+
* - only files created within MATCH_TOLERANCE_MS (the matcher's tolerance) of a
|
|
19
|
+
* process start are opened,
|
|
20
|
+
* and only their head (<= 64 KiB) is read for session id and cwd;
|
|
21
|
+
* - heads are cached per file (dev/ino/size) across calls on one instance;
|
|
22
|
+
* - a project dir whose scan matched none of its processes is skipped until
|
|
23
|
+
* its mtime changes (a session file was added or removed) or a process it
|
|
24
|
+
* has not seen needs it.
|
|
25
|
+
*
|
|
26
|
+
* Reuse one instance across refreshes to benefit from the caches.
|
|
27
|
+
*/
|
|
28
|
+
export declare class PiSessionLocator {
|
|
29
|
+
private readonly parser;
|
|
30
|
+
private readonly sessionsDir;
|
|
31
|
+
private readonly heads;
|
|
32
|
+
private readonly noMatchDirs;
|
|
33
|
+
private generation;
|
|
34
|
+
constructor(options?: PiSessionLocatorOptions, parser?: PiSessionParser);
|
|
35
|
+
matchRunningProcesses(processes: ProcessInfo[]): PiProcessSessionMatches;
|
|
36
|
+
/**
|
|
37
|
+
* Session files that could match `processes`: files in each process's
|
|
38
|
+
* project dir created within the start-time window, with session id and
|
|
39
|
+
* cwd taken from a bounded head read.
|
|
40
|
+
*/
|
|
41
|
+
discoverLiveSessions(processes?: ProcessInfo[]): SessionFile[];
|
|
42
|
+
discoverHistoricalSessionFiles(): string[];
|
|
43
|
+
findHistoricalSessionFilesById(sessionId: string): string[];
|
|
44
|
+
/**
|
|
45
|
+
* Group matchable processes (cwd and start time set) by the project dir Pi
|
|
46
|
+
* stores their sessions in. With `skipUnchanged`, dirs whose previous scan
|
|
47
|
+
* matched nothing and that have not changed since are left out.
|
|
48
|
+
*/
|
|
49
|
+
private groupByProjectDir;
|
|
50
|
+
private discoverSessionsInDirs;
|
|
51
|
+
/** Head metadata for `filePath`, re-read only when appended bytes could change it. */
|
|
52
|
+
private readHead;
|
|
53
|
+
/** Appending to a file cannot change a head that found both fields or hit the byte cap. */
|
|
54
|
+
private isHeadSettled;
|
|
55
|
+
private rememberUnmatchedDirs;
|
|
56
|
+
private pruneHeads;
|
|
57
|
+
private fileNameTimestamp;
|
|
58
|
+
private collectJsonlFiles;
|
|
59
|
+
private encodeProjectDir;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=PiSessionLocator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PiSessionLocator.d.ts","sourceRoot":"","sources":["../../../src/harnesses/pi/PiSessionLocator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAErF,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,eAAe,EAEhB,MAAM,sBAAsB,CAAC;AAG9B,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;AAwBD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,gBAAgB;IAQzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmC;IAC/D,OAAO,CAAC,UAAU,CAAK;gBAGrB,OAAO,GAAE,uBAA4B,EACpB,MAAM,GAAE,eAAuC;IAKlE,qBAAqB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,uBAAuB;IAoBxE;;;;OAIG;IACH,oBAAoB,CAAC,SAAS,GAAE,WAAW,EAAO,GAAG,WAAW,EAAE;IAIlE,8BAA8B,IAAI,MAAM,EAAE;IAI1C,8BAA8B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE;IAS3D;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IA2CzB,OAAO,CAAC,sBAAsB;IAiC9B,sFAAsF;IACtF,OAAO,CAAC,QAAQ;IA2BhB,2FAA2F;IAC3F,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,gBAAgB;CAIzB"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import * as path from "path";
|
|
2
|
+
import { matchProcessesToSessions } from "../../utils/matching.js";
|
|
3
|
+
import { MATCH_TOLERANCE_MS } from "../../utils/matchingConstants.js";
|
|
4
|
+
import { isDirectory, isSafePathSegment, listJsonl, safeReaddir, safeStat } from "../../utils/session.js";
|
|
5
|
+
import { PI_SESSION_HEAD_MAX_BYTES, PiSessionParser } from "./PiSessionParser.js";
|
|
6
|
+
import { homeDir } from "../shared.js";
|
|
7
|
+
/** Pi session file names start with their creation time: `2026-06-10T08-58-20-754Z_<id>.jsonl`. */ const FILE_NAME_TIMESTAMP = /^(\d{4}-\d{2}-\d{2})T(\d{2})-(\d{2})-(\d{2})-(\d{3})Z_/;
|
|
8
|
+
/**
|
|
9
|
+
* Finds Pi session files for running processes that the registry and the
|
|
10
|
+
* sessions.json tracker could not resolve.
|
|
11
|
+
*
|
|
12
|
+
* Live discovery is scoped so its cost follows live agents, not Pi history:
|
|
13
|
+
* - only the project dir Pi derives from each process cwd is listed;
|
|
14
|
+
* - only files created within MATCH_TOLERANCE_MS (the matcher's tolerance) of a
|
|
15
|
+
* process start are opened,
|
|
16
|
+
* and only their head (<= 64 KiB) is read for session id and cwd;
|
|
17
|
+
* - heads are cached per file (dev/ino/size) across calls on one instance;
|
|
18
|
+
* - a project dir whose scan matched none of its processes is skipped until
|
|
19
|
+
* its mtime changes (a session file was added or removed) or a process it
|
|
20
|
+
* has not seen needs it.
|
|
21
|
+
*
|
|
22
|
+
* Reuse one instance across refreshes to benefit from the caches.
|
|
23
|
+
*/ export class PiSessionLocator {
|
|
24
|
+
parser;
|
|
25
|
+
sessionsDir;
|
|
26
|
+
heads = new Map();
|
|
27
|
+
noMatchDirs = new Map();
|
|
28
|
+
generation = 0;
|
|
29
|
+
constructor(options = {}, parser = new PiSessionParser()){
|
|
30
|
+
this.parser = parser;
|
|
31
|
+
this.sessionsDir = options.sessionsDir ?? path.join(homeDir(), ".pi", "agent", "sessions");
|
|
32
|
+
}
|
|
33
|
+
matchRunningProcesses(processes) {
|
|
34
|
+
this.generation++;
|
|
35
|
+
try {
|
|
36
|
+
if (processes.length === 0) return {
|
|
37
|
+
legacyMatches: [],
|
|
38
|
+
fallback: []
|
|
39
|
+
};
|
|
40
|
+
const scans = this.groupByProjectDir(processes, true);
|
|
41
|
+
const sessions = this.discoverSessionsInDirs(scans);
|
|
42
|
+
if (sessions.length === 0) {
|
|
43
|
+
this.rememberUnmatchedDirs(scans, []);
|
|
44
|
+
return {
|
|
45
|
+
legacyMatches: [],
|
|
46
|
+
fallback: processes
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
const legacyMatches = matchProcessesToSessions(processes, sessions);
|
|
50
|
+
this.rememberUnmatchedDirs(scans, legacyMatches);
|
|
51
|
+
return {
|
|
52
|
+
legacyMatches,
|
|
53
|
+
fallback: processes
|
|
54
|
+
};
|
|
55
|
+
} finally{
|
|
56
|
+
this.pruneHeads();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Session files that could match `processes`: files in each process's
|
|
61
|
+
* project dir created within the start-time window, with session id and
|
|
62
|
+
* cwd taken from a bounded head read.
|
|
63
|
+
*/ discoverLiveSessions(processes = []) {
|
|
64
|
+
return this.discoverSessionsInDirs(this.groupByProjectDir(processes, false));
|
|
65
|
+
}
|
|
66
|
+
discoverHistoricalSessionFiles() {
|
|
67
|
+
return this.collectJsonlFiles(this.sessionsDir);
|
|
68
|
+
}
|
|
69
|
+
findHistoricalSessionFilesById(sessionId) {
|
|
70
|
+
if (!isSafePathSegment(sessionId)) return [];
|
|
71
|
+
return this.collectJsonlFiles(this.sessionsDir).filter((filePath)=>{
|
|
72
|
+
const basename = path.basename(filePath, ".jsonl");
|
|
73
|
+
return basename === sessionId || basename.endsWith(`_${sessionId}`);
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Group matchable processes (cwd and start time set) by the project dir Pi
|
|
78
|
+
* stores their sessions in. With `skipUnchanged`, dirs whose previous scan
|
|
79
|
+
* matched nothing and that have not changed since are left out.
|
|
80
|
+
*/ groupByProjectDir(processes, skipUnchanged) {
|
|
81
|
+
const scans = new Map();
|
|
82
|
+
if (!isDirectory(this.sessionsDir)) return scans;
|
|
83
|
+
for (const proc of processes){
|
|
84
|
+
if (!proc.cwd || !proc.startTime) continue;
|
|
85
|
+
const projectDir = path.join(this.sessionsDir, this.encodeProjectDir(proc.cwd));
|
|
86
|
+
const scan = scans.get(projectDir);
|
|
87
|
+
if (scan) {
|
|
88
|
+
scan.processes.push(proc);
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
const stat = safeStat(projectDir);
|
|
92
|
+
if (stat?.isDirectory()) {
|
|
93
|
+
scans.set(projectDir, {
|
|
94
|
+
dirMtimeMs: stat.mtimeMs,
|
|
95
|
+
processes: [
|
|
96
|
+
proc
|
|
97
|
+
]
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (!skipUnchanged) return scans;
|
|
102
|
+
for (const projectDir of this.noMatchDirs.keys()){
|
|
103
|
+
if (!scans.has(projectDir)) this.noMatchDirs.delete(projectDir);
|
|
104
|
+
}
|
|
105
|
+
for (const [projectDir, scan] of scans){
|
|
106
|
+
const noMatch = this.noMatchDirs.get(projectDir);
|
|
107
|
+
// An unmatched process never held a session, so dropping one cannot free
|
|
108
|
+
// a session for another; only a dir change or an unseen process can.
|
|
109
|
+
const unchanged = noMatch !== undefined && noMatch.dirMtimeMs === scan.dirMtimeMs && scan.processes.every((proc)=>noMatch.processKeys.has(processKey(proc)));
|
|
110
|
+
if (unchanged) {
|
|
111
|
+
scans.delete(projectDir);
|
|
112
|
+
} else {
|
|
113
|
+
this.noMatchDirs.delete(projectDir);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return scans;
|
|
117
|
+
}
|
|
118
|
+
discoverSessionsInDirs(scans) {
|
|
119
|
+
const sessions = [];
|
|
120
|
+
for (const [projectDir, scan] of scans){
|
|
121
|
+
const cwd = scan.processes[0]?.cwd ?? "";
|
|
122
|
+
const startTimes = scan.processes.map((proc)=>proc.startTime?.getTime() ?? 0);
|
|
123
|
+
for (const fileName of listJsonl(projectDir)){
|
|
124
|
+
const filePath = path.join(projectDir, fileName);
|
|
125
|
+
const stat = safeStat(filePath);
|
|
126
|
+
if (!stat?.isFile()) continue;
|
|
127
|
+
const birthtimeMs = stat.birthtimeMs || stat.mtimeMs;
|
|
128
|
+
const createdMs = this.fileNameTimestamp(fileName);
|
|
129
|
+
const inWindow = startTimes.some((startMs)=>Math.abs(startMs - birthtimeMs) <= MATCH_TOLERANCE_MS || createdMs !== undefined && Math.abs(startMs - createdMs) <= MATCH_TOLERANCE_MS);
|
|
130
|
+
if (!inWindow) continue;
|
|
131
|
+
const head = this.readHead(filePath, stat);
|
|
132
|
+
sessions.push({
|
|
133
|
+
sessionId: head?.sessionId || this.parser.sessionIdFromFile(filePath),
|
|
134
|
+
filePath,
|
|
135
|
+
projectDir,
|
|
136
|
+
birthtimeMs,
|
|
137
|
+
resolvedCwd: head?.projectPath || cwd
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return sessions;
|
|
142
|
+
}
|
|
143
|
+
/** Head metadata for `filePath`, re-read only when appended bytes could change it. */ readHead(filePath, stat) {
|
|
144
|
+
const cached = this.heads.get(filePath);
|
|
145
|
+
const reusable = cached !== undefined && cached.dev === stat.dev && cached.ino === stat.ino && (cached.size === stat.size || stat.size > cached.size && this.isHeadSettled(cached.head));
|
|
146
|
+
if (reusable) {
|
|
147
|
+
cached.seen = this.generation;
|
|
148
|
+
return cached.head;
|
|
149
|
+
}
|
|
150
|
+
const head = this.parser.readSessionHead(filePath);
|
|
151
|
+
if (head) {
|
|
152
|
+
this.heads.set(filePath, {
|
|
153
|
+
dev: stat.dev,
|
|
154
|
+
ino: stat.ino,
|
|
155
|
+
size: stat.size,
|
|
156
|
+
head,
|
|
157
|
+
seen: this.generation
|
|
158
|
+
});
|
|
159
|
+
} else {
|
|
160
|
+
this.heads.delete(filePath);
|
|
161
|
+
}
|
|
162
|
+
return head;
|
|
163
|
+
}
|
|
164
|
+
/** Appending to a file cannot change a head that found both fields or hit the byte cap. */ isHeadSettled(head) {
|
|
165
|
+
return Boolean(head.sessionId) && Boolean(head.projectPath) || head.bytesRead >= PI_SESSION_HEAD_MAX_BYTES;
|
|
166
|
+
}
|
|
167
|
+
rememberUnmatchedDirs(scans, matches) {
|
|
168
|
+
const matchedPids = new Set(matches.map((match)=>match.process.pid));
|
|
169
|
+
for (const [projectDir, scan] of scans){
|
|
170
|
+
if (scan.processes.some((proc)=>matchedPids.has(proc.pid))) continue;
|
|
171
|
+
this.noMatchDirs.set(projectDir, {
|
|
172
|
+
dirMtimeMs: scan.dirMtimeMs,
|
|
173
|
+
processKeys: new Set(scan.processes.map(processKey))
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
pruneHeads() {
|
|
178
|
+
for (const [filePath, entry] of this.heads){
|
|
179
|
+
if (entry.seen !== this.generation) this.heads.delete(filePath);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
fileNameTimestamp(fileName) {
|
|
183
|
+
const match = FILE_NAME_TIMESTAMP.exec(fileName);
|
|
184
|
+
if (!match) return undefined;
|
|
185
|
+
const [, date, hours, minutes, seconds, millis] = match;
|
|
186
|
+
const ms = Date.parse(`${date}T${hours}:${minutes}:${seconds}.${millis}Z`);
|
|
187
|
+
return Number.isNaN(ms) ? undefined : ms;
|
|
188
|
+
}
|
|
189
|
+
collectJsonlFiles(dir) {
|
|
190
|
+
const files = [];
|
|
191
|
+
for (const entry of safeReaddir(dir)){
|
|
192
|
+
const fullPath = path.join(dir, entry);
|
|
193
|
+
const stat = safeStat(fullPath);
|
|
194
|
+
if (!stat) continue;
|
|
195
|
+
if (stat.isDirectory()) {
|
|
196
|
+
files.push(...this.collectJsonlFiles(fullPath));
|
|
197
|
+
} else if (stat.isFile() && entry.endsWith(".jsonl")) {
|
|
198
|
+
files.push(fullPath);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return files;
|
|
202
|
+
}
|
|
203
|
+
encodeProjectDir(cwd) {
|
|
204
|
+
const normalized = path.resolve(cwd);
|
|
205
|
+
return `--${normalized.replace(/^\//, "").replace(/\//g, "-")}--`;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function processKey(proc) {
|
|
209
|
+
return `${proc.pid}:${proc.startTime?.getTime() ?? ""}`;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
//# sourceMappingURL=PiSessionLocator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/harnesses/pi/PiSessionLocator.ts"],"sourcesContent":["import type * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { matchProcessesToSessions, type MatchResult } from \"../../utils/matching.js\";\nimport { MATCH_TOLERANCE_MS } from \"../../utils/matchingConstants.js\";\nimport {\n isDirectory,\n isSafePathSegment,\n listJsonl,\n safeReaddir,\n safeStat,\n type SessionFile,\n} from \"../../utils/session.js\";\nimport {\n PI_SESSION_HEAD_MAX_BYTES,\n PiSessionParser,\n type PiSessionHead,\n} from \"./PiSessionParser.js\";\nimport { homeDir } from \"../shared.js\";\n\nexport interface PiSessionLocatorOptions {\n sessionsDir?: string;\n}\n\nexport interface PiProcessSessionMatches {\n legacyMatches: MatchResult[];\n fallback: ProcessInfo[];\n}\n\n/** Pi session file names start with their creation time: `2026-06-10T08-58-20-754Z_<id>.jsonl`. */\nconst FILE_NAME_TIMESTAMP = /^(\\d{4}-\\d{2}-\\d{2})T(\\d{2})-(\\d{2})-(\\d{2})-(\\d{3})Z_/;\n\ninterface ProjectDirScan {\n dirMtimeMs: number;\n processes: ProcessInfo[];\n}\n\ninterface CachedHead {\n dev: number;\n ino: number;\n size: number;\n head: PiSessionHead;\n seen: number;\n}\n\n/** A project dir whose last scan matched none of the processes that scanned it. */\ninterface NoMatchEntry {\n dirMtimeMs: number;\n processKeys: Set<string>;\n}\n\n/**\n * Finds Pi session files for running processes that the registry and the\n * sessions.json tracker could not resolve.\n *\n * Live discovery is scoped so its cost follows live agents, not Pi history:\n * - only the project dir Pi derives from each process cwd is listed;\n * - only files created within MATCH_TOLERANCE_MS (the matcher's tolerance) of a\n * process start are opened,\n * and only their head (<= 64 KiB) is read for session id and cwd;\n * - heads are cached per file (dev/ino/size) across calls on one instance;\n * - a project dir whose scan matched none of its processes is skipped until\n * its mtime changes (a session file was added or removed) or a process it\n * has not seen needs it.\n *\n * Reuse one instance across refreshes to benefit from the caches.\n */\nexport class PiSessionLocator {\n private readonly sessionsDir: string;\n private readonly heads = new Map<string, CachedHead>();\n private readonly noMatchDirs = new Map<string, NoMatchEntry>();\n private generation = 0;\n\n constructor(\n options: PiSessionLocatorOptions = {},\n private readonly parser: PiSessionParser = new PiSessionParser(),\n ) {\n this.sessionsDir = options.sessionsDir ?? path.join(homeDir(), \".pi\", \"agent\", \"sessions\");\n }\n\n matchRunningProcesses(processes: ProcessInfo[]): PiProcessSessionMatches {\n this.generation++;\n try {\n if (processes.length === 0) return { legacyMatches: [], fallback: [] };\n\n const scans = this.groupByProjectDir(processes, true);\n const sessions = this.discoverSessionsInDirs(scans);\n if (sessions.length === 0) {\n this.rememberUnmatchedDirs(scans, []);\n return { legacyMatches: [], fallback: processes };\n }\n\n const legacyMatches = matchProcessesToSessions(processes, sessions);\n this.rememberUnmatchedDirs(scans, legacyMatches);\n return { legacyMatches, fallback: processes };\n } finally {\n this.pruneHeads();\n }\n }\n\n /**\n * Session files that could match `processes`: files in each process's\n * project dir created within the start-time window, with session id and\n * cwd taken from a bounded head read.\n */\n discoverLiveSessions(processes: ProcessInfo[] = []): SessionFile[] {\n return this.discoverSessionsInDirs(this.groupByProjectDir(processes, false));\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 /**\n * Group matchable processes (cwd and start time set) by the project dir Pi\n * stores their sessions in. With `skipUnchanged`, dirs whose previous scan\n * matched nothing and that have not changed since are left out.\n */\n private groupByProjectDir(\n processes: ProcessInfo[],\n skipUnchanged: boolean,\n ): Map<string, ProjectDirScan> {\n const scans = new Map<string, ProjectDirScan>();\n if (!isDirectory(this.sessionsDir)) return scans;\n\n for (const proc of processes) {\n if (!proc.cwd || !proc.startTime) continue;\n const projectDir = path.join(this.sessionsDir, this.encodeProjectDir(proc.cwd));\n const scan = scans.get(projectDir);\n if (scan) {\n scan.processes.push(proc);\n continue;\n }\n const stat = safeStat(projectDir);\n if (stat?.isDirectory()) {\n scans.set(projectDir, { dirMtimeMs: stat.mtimeMs, processes: [proc] });\n }\n }\n\n if (!skipUnchanged) return scans;\n\n for (const projectDir of this.noMatchDirs.keys()) {\n if (!scans.has(projectDir)) this.noMatchDirs.delete(projectDir);\n }\n for (const [projectDir, scan] of scans) {\n const noMatch = this.noMatchDirs.get(projectDir);\n // An unmatched process never held a session, so dropping one cannot free\n // a session for another; only a dir change or an unseen process can.\n const unchanged =\n noMatch !== undefined &&\n noMatch.dirMtimeMs === scan.dirMtimeMs &&\n scan.processes.every((proc) => noMatch.processKeys.has(processKey(proc)));\n if (unchanged) {\n scans.delete(projectDir);\n } else {\n this.noMatchDirs.delete(projectDir);\n }\n }\n return scans;\n }\n\n private discoverSessionsInDirs(scans: Map<string, ProjectDirScan>): SessionFile[] {\n const sessions: SessionFile[] = [];\n for (const [projectDir, scan] of scans) {\n const cwd = scan.processes[0]?.cwd ?? \"\";\n const startTimes = scan.processes.map((proc) => proc.startTime?.getTime() ?? 0);\n\n for (const fileName of listJsonl(projectDir)) {\n const filePath = path.join(projectDir, fileName);\n const stat = safeStat(filePath);\n if (!stat?.isFile()) continue;\n\n const birthtimeMs = stat.birthtimeMs || stat.mtimeMs;\n const createdMs = this.fileNameTimestamp(fileName);\n const inWindow = startTimes.some(\n (startMs) =>\n Math.abs(startMs - birthtimeMs) <= MATCH_TOLERANCE_MS ||\n (createdMs !== undefined && Math.abs(startMs - createdMs) <= MATCH_TOLERANCE_MS),\n );\n if (!inWindow) continue;\n\n const head = this.readHead(filePath, stat);\n sessions.push({\n sessionId: head?.sessionId || this.parser.sessionIdFromFile(filePath),\n filePath,\n projectDir,\n birthtimeMs,\n resolvedCwd: head?.projectPath || cwd,\n });\n }\n }\n return sessions;\n }\n\n /** Head metadata for `filePath`, re-read only when appended bytes could change it. */\n private readHead(filePath: string, stat: fs.Stats): PiSessionHead | null {\n const cached = this.heads.get(filePath);\n const reusable =\n cached !== undefined &&\n cached.dev === stat.dev &&\n cached.ino === stat.ino &&\n (cached.size === stat.size || (stat.size > cached.size && this.isHeadSettled(cached.head)));\n if (reusable) {\n cached.seen = this.generation;\n return cached.head;\n }\n\n const head = this.parser.readSessionHead(filePath);\n if (head) {\n this.heads.set(filePath, {\n dev: stat.dev,\n ino: stat.ino,\n size: stat.size,\n head,\n seen: this.generation,\n });\n } else {\n this.heads.delete(filePath);\n }\n return head;\n }\n\n /** Appending to a file cannot change a head that found both fields or hit the byte cap. */\n private isHeadSettled(head: PiSessionHead): boolean {\n return (\n (Boolean(head.sessionId) && Boolean(head.projectPath)) ||\n head.bytesRead >= PI_SESSION_HEAD_MAX_BYTES\n );\n }\n\n private rememberUnmatchedDirs(scans: Map<string, ProjectDirScan>, matches: MatchResult[]): void {\n const matchedPids = new Set(matches.map((match) => match.process.pid));\n for (const [projectDir, scan] of scans) {\n if (scan.processes.some((proc) => matchedPids.has(proc.pid))) continue;\n this.noMatchDirs.set(projectDir, {\n dirMtimeMs: scan.dirMtimeMs,\n processKeys: new Set(scan.processes.map(processKey)),\n });\n }\n }\n\n private pruneHeads(): void {\n for (const [filePath, entry] of this.heads) {\n if (entry.seen !== this.generation) this.heads.delete(filePath);\n }\n }\n\n private fileNameTimestamp(fileName: string): number | undefined {\n const match = FILE_NAME_TIMESTAMP.exec(fileName);\n if (!match) return undefined;\n const [, date, hours, minutes, seconds, millis] = match;\n const ms = Date.parse(`${date}T${hours}:${minutes}:${seconds}.${millis}Z`);\n return Number.isNaN(ms) ? undefined : ms;\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\nfunction processKey(proc: ProcessInfo): string {\n return `${proc.pid}:${proc.startTime?.getTime() ?? \"\"}`;\n}\n"],"names":["path","matchProcessesToSessions","MATCH_TOLERANCE_MS","isDirectory","isSafePathSegment","listJsonl","safeReaddir","safeStat","PI_SESSION_HEAD_MAX_BYTES","PiSessionParser","homeDir","FILE_NAME_TIMESTAMP","PiSessionLocator","sessionsDir","heads","Map","noMatchDirs","generation","options","parser","join","matchRunningProcesses","processes","length","legacyMatches","fallback","scans","groupByProjectDir","sessions","discoverSessionsInDirs","rememberUnmatchedDirs","pruneHeads","discoverLiveSessions","discoverHistoricalSessionFiles","collectJsonlFiles","findHistoricalSessionFilesById","sessionId","filter","filePath","basename","endsWith","skipUnchanged","proc","cwd","startTime","projectDir","encodeProjectDir","scan","get","push","stat","set","dirMtimeMs","mtimeMs","keys","has","delete","noMatch","unchanged","undefined","every","processKeys","processKey","startTimes","map","getTime","fileName","isFile","birthtimeMs","createdMs","fileNameTimestamp","inWindow","some","startMs","Math","abs","head","readHead","sessionIdFromFile","resolvedCwd","projectPath","cached","reusable","dev","ino","size","isHeadSettled","seen","readSessionHead","Boolean","bytesRead","matches","matchedPids","Set","match","process","pid","entry","exec","date","hours","minutes","seconds","millis","ms","Date","parse","Number","isNaN","dir","files","fullPath","normalized","resolve","replace"],"mappings":"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"}
|