@ai-devkit/agent-manager 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AgentManager.d.ts +9 -4
- package/dist/AgentManager.d.ts.map +1 -1
- package/dist/AgentManager.js +21 -2
- package/dist/AgentManager.js.map +1 -1
- package/dist/__tests__/AgentManager.test.js +151 -3
- package/dist/__tests__/AgentManager.test.js.map +1 -1
- package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js +486 -0
- package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js.map +1 -0
- package/dist/__tests__/adapters/adapterProcessImports.test.js +52 -0
- package/dist/__tests__/adapters/adapterProcessImports.test.js.map +1 -0
- package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js +247 -0
- package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js.map +1 -0
- package/dist/__tests__/capacity/claude.test.js +485 -0
- package/dist/__tests__/capacity/claude.test.js.map +1 -0
- package/dist/__tests__/capacity/openai.test.js +670 -0
- package/dist/__tests__/capacity/openai.test.js.map +1 -0
- package/dist/__tests__/capacity/wham.test.js +144 -0
- package/dist/__tests__/capacity/wham.test.js.map +1 -0
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
- package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
- package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js +462 -0
- package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
- package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
- package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
- package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
- package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
- package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
- package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
- package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
- package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
- package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
- package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
- package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
- package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
- package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
- package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
- package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
- package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
- package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
- package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
- package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
- package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js +662 -0
- package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
- package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
- package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
- package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
- package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
- package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
- package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
- package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
- package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
- package/dist/__tests__/utils/agents.test.js +72 -2
- package/dist/__tests__/utils/agents.test.js.map +1 -1
- package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
- package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
- package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
- package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
- package/dist/__tests__/utils/jsonlTail.test.js +360 -0
- package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
- package/dist/__tests__/utils/matchingConstants.test.js +35 -0
- package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
- package/dist/__tests__/utils/process.test.js +436 -2
- package/dist/__tests__/utils/process.test.js.map +1 -1
- package/dist/adapters/AgentAdapter.d.ts +25 -6
- package/dist/adapters/AgentAdapter.d.ts.map +1 -1
- package/dist/adapters/AgentAdapter.js +12 -3
- package/dist/adapters/AgentAdapter.js.map +1 -1
- package/dist/capacity/claude.d.ts +17 -0
- package/dist/capacity/claude.d.ts.map +1 -0
- package/dist/capacity/claude.js +271 -0
- package/dist/capacity/claude.js.map +1 -0
- package/dist/capacity/codex.d.ts +1 -2
- package/dist/capacity/codex.d.ts.map +1 -1
- package/dist/capacity/codex.js +5 -47
- package/dist/capacity/codex.js.map +1 -1
- package/dist/capacity/index.d.ts +11 -0
- package/dist/capacity/index.d.ts.map +1 -1
- package/dist/capacity/index.js +17 -0
- package/dist/capacity/index.js.map +1 -1
- package/dist/capacity/openai.d.ts +47 -0
- package/dist/capacity/openai.d.ts.map +1 -0
- package/dist/capacity/openai.js +307 -0
- package/dist/capacity/openai.js.map +1 -0
- package/dist/capacity/wham.d.ts +16 -0
- package/dist/capacity/wham.d.ts.map +1 -0
- package/dist/capacity/wham.js +66 -0
- package/dist/capacity/wham.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
- package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
- package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
- package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
- package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
- package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
- package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
- package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
- package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
- package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
- package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
- package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
- package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
- package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
- package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
- package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
- package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
- package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
- package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
- package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
- package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
- package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
- package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
- package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
- package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
- package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
- package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
- package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
- package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
- package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
- package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
- package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
- package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
- package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
- package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
- package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
- package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
- package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
- package/dist/harnesses/gemini/fileSignature.js +9 -0
- package/dist/harnesses/gemini/fileSignature.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
- package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
- package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
- package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
- package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
- package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
- package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
- package/dist/harnesses/grok/GrokSessionParser.js +185 -0
- package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
- package/dist/harnesses/index.d.ts +7 -0
- package/dist/harnesses/index.d.ts.map +1 -0
- package/dist/harnesses/index.js +27 -0
- package/dist/harnesses/index.js.map +1 -0
- package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
- package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroAdapter.js +125 -0
- package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
- package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
- package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
- package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
- package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
- package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
- package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
- package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
- package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
- package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
- package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
- package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
- package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
- package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
- package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
- package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
- package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
- package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
- package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
- package/dist/harnesses/pi/PiAdapter.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
- package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
- package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
- package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionLocator.js +212 -0
- package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
- package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
- package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
- package/dist/harnesses/pi/PiSessionParser.js +318 -0
- package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
- package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
- package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
- package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
- package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
- package/dist/harnesses/shared.d.ts +41 -0
- package/dist/harnesses/shared.d.ts.map +1 -0
- package/dist/harnesses/shared.js +71 -0
- package/dist/harnesses/shared.js.map +1 -0
- package/dist/index.d.ts +28 -25
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -16
- package/dist/index.js.map +1 -1
- package/dist/readiness/AgentReadiness.d.ts +1 -1
- package/dist/readiness/AgentReadiness.d.ts.map +1 -1
- package/dist/readiness/AgentReadiness.js.map +1 -1
- package/dist/runtime/ManagedAgentRuntime.js +3 -1
- package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
- package/dist/runtime/herdr/HerdrAgentDiscovery.js +10 -0
- package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
- package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
- package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
- package/dist/utils/IncrementalJsonlSummary.js +209 -0
- package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
- package/dist/utils/agents.d.ts +3 -2
- package/dist/utils/agents.d.ts.map +1 -1
- package/dist/utils/agents.js +61 -15
- package/dist/utils/agents.js.map +1 -1
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/jsonlTail.d.ts +73 -0
- package/dist/utils/jsonlTail.d.ts.map +1 -0
- package/dist/utils/jsonlTail.js +238 -0
- package/dist/utils/jsonlTail.js.map +1 -0
- package/dist/utils/matching.d.ts +2 -0
- package/dist/utils/matching.d.ts.map +1 -1
- package/dist/utils/matching.js +3 -2
- package/dist/utils/matching.js.map +1 -1
- package/dist/utils/matchingConstants.d.ts +15 -0
- package/dist/utils/matchingConstants.d.ts.map +1 -0
- package/dist/utils/matchingConstants.js +14 -0
- package/dist/utils/matchingConstants.js.map +1 -0
- package/dist/utils/process.d.ts +38 -2
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +131 -43
- package/dist/utils/process.js.map +1 -1
- package/package.json +2 -1
- package/scripts/benchmark-cold-start.mjs +350 -0
- package/src/AgentManager.ts +26 -5
- package/src/__tests__/AgentManager.test.ts +141 -3
- package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
- package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
- package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
- package/src/__tests__/capacity/claude.test.ts +467 -0
- package/src/__tests__/capacity/fixtures/claude-credentials.json +7 -0
- package/src/__tests__/capacity/fixtures/claude-usage-malformed.json +1 -0
- package/src/__tests__/capacity/fixtures/claude-usage-partial.json +15 -0
- package/src/__tests__/capacity/fixtures/claude-usage.json +63 -0
- package/src/__tests__/capacity/fixtures/openai-auth.json +6 -0
- package/src/__tests__/capacity/fixtures/openai-codex-auth.json +9 -0
- package/src/__tests__/capacity/fixtures/openai-usage-completions.json +67 -0
- package/src/__tests__/capacity/fixtures/openai-usage-responses.json +20 -0
- package/src/__tests__/capacity/fixtures/wham-usage.json +32 -0
- package/src/__tests__/capacity/openai.test.ts +560 -0
- package/src/__tests__/capacity/wham.test.ts +104 -0
- package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
- package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
- package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
- package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.ts +396 -0
- package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
- package/src/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
- package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
- package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
- package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
- package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
- package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
- package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
- package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
- package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
- package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
- package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
- package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
- package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
- package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
- package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
- package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
- package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
- package/src/__tests__/harnesses/kiro/KiroAdapter.test.ts +552 -0
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
- package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
- package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
- package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
- package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
- package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
- package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
- package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
- package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
- package/src/__tests__/utils/agents.test.ts +83 -2
- package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
- package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
- package/src/__tests__/utils/jsonlTail.test.ts +317 -0
- package/src/__tests__/utils/matchingConstants.test.ts +40 -0
- package/src/__tests__/utils/process.test.ts +254 -0
- package/src/adapters/AgentAdapter.ts +37 -12
- package/src/capacity/claude.ts +313 -0
- package/src/capacity/codex.ts +25 -134
- package/src/capacity/index.ts +33 -4
- package/src/capacity/openai.ts +355 -0
- package/src/capacity/wham.ts +84 -0
- package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
- package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
- package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
- package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
- package/src/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
- package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
- package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
- package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
- package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
- package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
- package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
- package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
- package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
- package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
- package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
- package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
- package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
- package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
- package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
- package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
- package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
- package/src/harnesses/gemini/fileSignature.ts +10 -0
- package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
- package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
- package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
- package/src/harnesses/grok/GrokSessionParser.ts +251 -0
- package/src/harnesses/index.ts +28 -0
- package/src/harnesses/kiro/KiroAdapter.ts +143 -0
- package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
- package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
- package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
- package/src/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
- package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
- package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
- package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
- package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
- package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
- package/src/harnesses/pi/PiSessionLocator.ts +288 -0
- package/src/harnesses/pi/PiSessionParser.ts +488 -0
- package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
- package/src/harnesses/shared.ts +119 -0
- package/src/index.ts +34 -23
- package/src/readiness/AgentReadiness.ts +4 -1
- package/src/runtime/ManagedAgentRuntime.ts +2 -0
- package/src/runtime/herdr/HerdrAgentDiscovery.ts +5 -1
- package/src/utils/IncrementalJsonlSummary.ts +306 -0
- package/src/utils/agents.ts +62 -20
- package/src/utils/index.ts +2 -0
- package/src/utils/jsonlTail.ts +349 -0
- package/src/utils/matching.ts +3 -3
- package/src/utils/matchingConstants.ts +15 -0
- package/src/utils/process.ts +189 -45
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
- package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
- package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
- package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -10
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -10
- package/dist/adapters/index.js.map +0 -1
- package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
- package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
- package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
- package/dist/providers/codex/CodexAdapter.js.map +0 -1
- package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
- package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
- package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionLocator.js +0 -207
- package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
- package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
- package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
- package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
- package/dist/providers/codex/CodexSessionParser.js.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
- package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
- package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
- package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
- package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
- package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
- package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
- package/dist/providers/copilot/CopilotSessionParser.js +0 -181
- package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
- package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
- package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
- package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
- package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
- package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
- package/dist/providers/gemini/GeminiSessionParser.js +0 -166
- package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
- package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
- package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
- package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
- package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
- package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
- package/dist/providers/grok/GrokSessionParser.js +0 -122
- package/dist/providers/grok/GrokSessionParser.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
- package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
- package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
- package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
- package/dist/providers/pi/PiAdapter.js.map +0 -1
- package/dist/providers/pi/PiAgentMapper.js.map +0 -1
- package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
- package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionLocator.js +0 -86
- package/dist/providers/pi/PiSessionLocator.js.map +0 -1
- package/dist/providers/pi/PiSessionParser.d.ts +0 -36
- package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
- package/dist/providers/pi/PiSessionParser.js +0 -191
- package/dist/providers/pi/PiSessionParser.js.map +0 -1
- package/dist/providers/pi/PiSessionTracker.js.map +0 -1
- package/src/__tests__/fixtures/fake-claude.cjs +0 -31
- package/src/__tests__/fixtures/fake-codex.cjs +0 -56
- package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
- package/src/adapters/index.ts +0 -15
- package/src/providers/codex/CodexSessionLocator.ts +0 -279
- package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
- package/src/providers/copilot/CopilotSessionParser.ts +0 -289
- package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
- package/src/providers/grok/GrokSessionParser.ts +0 -166
- package/src/providers/pi/PiSessionLocator.ts +0 -110
- package/src/providers/pi/PiSessionParser.ts +0 -284
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
- /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js +0 -0
- /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
- /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
- /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
- /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
- /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
- /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tail reader for append-only JSONL transcripts.
|
|
3
|
+
*
|
|
4
|
+
* Reading the last N conversation messages from a large transcript should not
|
|
5
|
+
* require reading (and JSON-parsing) the whole file. This reader:
|
|
6
|
+
*
|
|
7
|
+
* 1. On the first call for a file, reads backward from the end in fixed-size
|
|
8
|
+
* chunks until enough messages are collected (or the start is reached).
|
|
9
|
+
* 2. Remembers `{dev, ino, offset}` plus a small window of parsed items, and
|
|
10
|
+
* on later calls parses only bytes appended since `offset`.
|
|
11
|
+
* 3. Resets (re-reads from the end) when the file is truncated or replaced by
|
|
12
|
+
* a different inode.
|
|
13
|
+
*
|
|
14
|
+
* Each adapter supplies a {@link JsonlTailSource}: `parseLine` maps one raw
|
|
15
|
+
* line to a candidate item (or null) and the optional `finalize` turns a
|
|
16
|
+
* contiguous window of items into messages. `finalize` exists for formats
|
|
17
|
+
* where one line's visibility depends on other lines (e.g. Codex drops an
|
|
18
|
+
* `event_msg` mirrored by a `response_item`); line-independent formats can
|
|
19
|
+
* omit it and return a {@link ConversationMessage} directly from `parseLine`.
|
|
20
|
+
*/ import * as fs from "fs";
|
|
21
|
+
/**
|
|
22
|
+
* Normalize a `tail` option: a positive integer, or undefined for "full
|
|
23
|
+
* conversation" (the pre-existing behaviour).
|
|
24
|
+
*/ export function normalizeTail(tail) {
|
|
25
|
+
if (tail === undefined || !Number.isFinite(tail)) return undefined;
|
|
26
|
+
const n = Math.floor(tail);
|
|
27
|
+
return n > 0 ? n : undefined;
|
|
28
|
+
}
|
|
29
|
+
/** Keep the last `tail` messages of an already fully-parsed conversation. */ export function sliceTail(messages, tail) {
|
|
30
|
+
const n = normalizeTail(tail);
|
|
31
|
+
return n !== undefined && messages.length > n ? messages.slice(-n) : messages;
|
|
32
|
+
}
|
|
33
|
+
export const DEFAULT_TAIL_CHUNK_SIZE = 64 * 1024;
|
|
34
|
+
const DEFAULT_MAX_FILES = 16;
|
|
35
|
+
const NEWLINE = 0x0a;
|
|
36
|
+
const ANCHOR_BYTES = 32;
|
|
37
|
+
export class JsonlTailReader {
|
|
38
|
+
chunkSize;
|
|
39
|
+
maxFiles;
|
|
40
|
+
cache = new Map();
|
|
41
|
+
constructor(options = {}){
|
|
42
|
+
this.chunkSize = Math.max(1, options.chunkSize ?? DEFAULT_TAIL_CHUNK_SIZE);
|
|
43
|
+
this.maxFiles = Math.max(1, options.maxFiles ?? DEFAULT_MAX_FILES);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Return the last `tail` messages of `filePath`.
|
|
47
|
+
*
|
|
48
|
+
* @param variant Cache discriminator for sources whose output differs by
|
|
49
|
+
* option (e.g. verbose vs. non-verbose).
|
|
50
|
+
* @param overscan Extra messages collected beyond `tail` before trimming,
|
|
51
|
+
* for sources whose `finalize` looks at neighbouring lines.
|
|
52
|
+
*/ read(filePath, tail, source, variant = "", overscan = 0) {
|
|
53
|
+
const key = `${variant}\0${tail}\0${filePath}`;
|
|
54
|
+
const threshold = tail + Math.max(0, overscan);
|
|
55
|
+
let stat;
|
|
56
|
+
try {
|
|
57
|
+
stat = fs.statSync(filePath);
|
|
58
|
+
} catch {
|
|
59
|
+
this.cache.delete(key);
|
|
60
|
+
return [];
|
|
61
|
+
}
|
|
62
|
+
const cached = this.cache.get(key);
|
|
63
|
+
if (cached && cached.dev === stat.dev && cached.ino === stat.ino && cached.size === stat.size && cached.mtimeMs === stat.mtimeMs) {
|
|
64
|
+
this.touch(key, cached);
|
|
65
|
+
return cached.result.slice();
|
|
66
|
+
}
|
|
67
|
+
let fd;
|
|
68
|
+
try {
|
|
69
|
+
fd = fs.openSync(filePath, "r");
|
|
70
|
+
} catch {
|
|
71
|
+
this.cache.delete(key);
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const current = fs.fstatSync(fd);
|
|
76
|
+
const canAppend = cached !== undefined && cached.dev === current.dev && cached.ino === current.ino && current.size >= cached.offset && // A very large append is cheaper to re-read from the end.
|
|
77
|
+
current.size - cached.offset <= Math.max(this.chunkSize * 16, 1024 * 1024);
|
|
78
|
+
const state = canAppend && this.readAppended(fd, current, cached, tail, threshold, source) || this.readBackward(fd, current, tail, threshold, source);
|
|
79
|
+
this.touch(key, state);
|
|
80
|
+
return state.result.slice();
|
|
81
|
+
} catch {
|
|
82
|
+
this.cache.delete(key);
|
|
83
|
+
return [];
|
|
84
|
+
} finally{
|
|
85
|
+
fs.closeSync(fd);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/** Forget all cached windows. */ clear() {
|
|
89
|
+
this.cache.clear();
|
|
90
|
+
}
|
|
91
|
+
readBackward(fd, stat, tail, threshold, source) {
|
|
92
|
+
const reversed = [];
|
|
93
|
+
let partial = null;
|
|
94
|
+
let offset = 0;
|
|
95
|
+
let sawNewline = false;
|
|
96
|
+
// Pieces of the line currently being assembled, in file order.
|
|
97
|
+
let pending = [];
|
|
98
|
+
let pos = stat.size;
|
|
99
|
+
const takeLine = (piece)=>{
|
|
100
|
+
const lineBuf = pending.length === 0 ? piece : Buffer.concat([
|
|
101
|
+
piece,
|
|
102
|
+
...pending
|
|
103
|
+
]);
|
|
104
|
+
pending = [];
|
|
105
|
+
if (!sawNewline) {
|
|
106
|
+
// Bytes after the file's last newline: an unterminated (possibly
|
|
107
|
+
// still being written) line. Parsed tentatively, never cached.
|
|
108
|
+
sawNewline = true;
|
|
109
|
+
partial = this.parse(lineBuf, source);
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const item = this.parse(lineBuf, source);
|
|
113
|
+
if (item !== null) reversed.push(item);
|
|
114
|
+
};
|
|
115
|
+
while(pos > 0){
|
|
116
|
+
const len = Math.min(this.chunkSize, pos);
|
|
117
|
+
pos -= len;
|
|
118
|
+
const buf = readExactly(fd, pos, len);
|
|
119
|
+
let end = len;
|
|
120
|
+
let nl = end > 0 ? buf.lastIndexOf(NEWLINE, end - 1) : -1;
|
|
121
|
+
while(nl !== -1){
|
|
122
|
+
if (!sawNewline) offset = pos + nl + 1;
|
|
123
|
+
takeLine(buf.subarray(nl + 1, end));
|
|
124
|
+
end = nl;
|
|
125
|
+
nl = end > 0 ? buf.lastIndexOf(NEWLINE, end - 1) : -1;
|
|
126
|
+
}
|
|
127
|
+
if (end > 0) pending.unshift(buf.subarray(0, end));
|
|
128
|
+
if (this.countMessages(reversed, partial, source, threshold) >= threshold) break;
|
|
129
|
+
}
|
|
130
|
+
if (pos === 0 && pending.length > 0) {
|
|
131
|
+
// The first line of the file (no newline before it).
|
|
132
|
+
const first = pending.shift();
|
|
133
|
+
takeLine(first);
|
|
134
|
+
}
|
|
135
|
+
const items = reversed.reverse();
|
|
136
|
+
return {
|
|
137
|
+
dev: stat.dev,
|
|
138
|
+
ino: stat.ino,
|
|
139
|
+
size: stat.size,
|
|
140
|
+
mtimeMs: stat.mtimeMs,
|
|
141
|
+
offset,
|
|
142
|
+
anchor: readAnchor(fd, offset),
|
|
143
|
+
items,
|
|
144
|
+
result: this.finish(items, partial, source, tail)
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Parse bytes appended since the cached offset. Returns null when the
|
|
149
|
+
* bytes before the offset no longer match (file rewritten in place).
|
|
150
|
+
*/ readAppended(fd, stat, cached, tail, threshold, source) {
|
|
151
|
+
let items = cached.items;
|
|
152
|
+
let offset = cached.offset;
|
|
153
|
+
let partial = null;
|
|
154
|
+
const anchorLength = cached.anchor.length;
|
|
155
|
+
const raw = readExactly(fd, cached.offset - anchorLength, stat.size - offset + anchorLength);
|
|
156
|
+
if (!raw.subarray(0, anchorLength).equals(cached.anchor)) return null;
|
|
157
|
+
const buf = raw.subarray(anchorLength);
|
|
158
|
+
let anchor = cached.anchor;
|
|
159
|
+
if (buf.length > 0) {
|
|
160
|
+
const added = [];
|
|
161
|
+
let start = 0;
|
|
162
|
+
let nl = buf.indexOf(NEWLINE, start);
|
|
163
|
+
while(nl !== -1){
|
|
164
|
+
const item = this.parse(buf.subarray(start, nl), source);
|
|
165
|
+
if (item !== null) added.push(item);
|
|
166
|
+
start = nl + 1;
|
|
167
|
+
nl = buf.indexOf(NEWLINE, start);
|
|
168
|
+
}
|
|
169
|
+
offset = cached.offset + start;
|
|
170
|
+
if (start > 0) anchor = tailBytes(raw.subarray(0, anchorLength + start));
|
|
171
|
+
if (start < buf.length) partial = this.parse(buf.subarray(start), source);
|
|
172
|
+
if (added.length > 0) {
|
|
173
|
+
items = items.concat(added);
|
|
174
|
+
// Bound the retained window; keep a generous margin so sources whose
|
|
175
|
+
// finalize() drops items (e.g. de-duplication) still cover `tail`.
|
|
176
|
+
if (items.length > threshold * 4) items = items.slice(-threshold * 2);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
dev: stat.dev,
|
|
181
|
+
ino: stat.ino,
|
|
182
|
+
size: stat.size,
|
|
183
|
+
mtimeMs: stat.mtimeMs,
|
|
184
|
+
offset,
|
|
185
|
+
anchor,
|
|
186
|
+
items,
|
|
187
|
+
result: this.finish(items, partial, source, tail)
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
parse(lineBuf, source) {
|
|
191
|
+
const line = lineBuf.toString("utf-8");
|
|
192
|
+
if (line.trim().length === 0) return null;
|
|
193
|
+
return source.parseLine(line);
|
|
194
|
+
}
|
|
195
|
+
countMessages(reversed, partial, source, threshold) {
|
|
196
|
+
const available = reversed.length + (partial === null ? 0 : 1);
|
|
197
|
+
if (!source.finalize || available < threshold) return available;
|
|
198
|
+
const window = reversed.slice().reverse();
|
|
199
|
+
if (partial !== null) window.push(partial);
|
|
200
|
+
return source.finalize(window).length;
|
|
201
|
+
}
|
|
202
|
+
finish(items, partial, source, tail) {
|
|
203
|
+
const window = partial === null ? items : [
|
|
204
|
+
...items,
|
|
205
|
+
partial
|
|
206
|
+
];
|
|
207
|
+
const messages = source.finalize ? source.finalize(window) : window.slice();
|
|
208
|
+
return messages.length > tail ? messages.slice(-tail) : messages;
|
|
209
|
+
}
|
|
210
|
+
touch(key, state) {
|
|
211
|
+
this.cache.delete(key);
|
|
212
|
+
this.cache.set(key, state);
|
|
213
|
+
while(this.cache.size > this.maxFiles){
|
|
214
|
+
const oldest = this.cache.keys().next().value;
|
|
215
|
+
if (oldest === undefined) break;
|
|
216
|
+
this.cache.delete(oldest);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
function readExactly(fd, position, length) {
|
|
221
|
+
const buf = Buffer.allocUnsafe(length);
|
|
222
|
+
let filled = 0;
|
|
223
|
+
while(filled < length){
|
|
224
|
+
const n = fs.readSync(fd, buf, filled, length - filled, position + filled);
|
|
225
|
+
if (n === 0) break;
|
|
226
|
+
filled += n;
|
|
227
|
+
}
|
|
228
|
+
return filled === length ? buf : buf.subarray(0, filled);
|
|
229
|
+
}
|
|
230
|
+
function readAnchor(fd, offset) {
|
|
231
|
+
const start = Math.max(0, offset - ANCHOR_BYTES);
|
|
232
|
+
return Buffer.from(readExactly(fd, start, offset - start));
|
|
233
|
+
}
|
|
234
|
+
function tailBytes(buf) {
|
|
235
|
+
return Buffer.from(buf.subarray(Math.max(0, buf.length - ANCHOR_BYTES)));
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
//# sourceMappingURL=jsonlTail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/jsonlTail.ts"],"sourcesContent":["/**\n * Tail reader for append-only JSONL transcripts.\n *\n * Reading the last N conversation messages from a large transcript should not\n * require reading (and JSON-parsing) the whole file. This reader:\n *\n * 1. On the first call for a file, reads backward from the end in fixed-size\n * chunks until enough messages are collected (or the start is reached).\n * 2. Remembers `{dev, ino, offset}` plus a small window of parsed items, and\n * on later calls parses only bytes appended since `offset`.\n * 3. Resets (re-reads from the end) when the file is truncated or replaced by\n * a different inode.\n *\n * Each adapter supplies a {@link JsonlTailSource}: `parseLine` maps one raw\n * line to a candidate item (or null) and the optional `finalize` turns a\n * contiguous window of items into messages. `finalize` exists for formats\n * where one line's visibility depends on other lines (e.g. Codex drops an\n * `event_msg` mirrored by a `response_item`); line-independent formats can\n * omit it and return a {@link ConversationMessage} directly from `parseLine`.\n */\n\nimport * as fs from \"fs\";\nimport type { ConversationMessage } from \"../adapters/AgentAdapter.js\";\n\n/**\n * Normalize a `tail` option: a positive integer, or undefined for \"full\n * conversation\" (the pre-existing behaviour).\n */\nexport function normalizeTail(tail: number | undefined): number | undefined {\n if (tail === undefined || !Number.isFinite(tail)) return undefined;\n const n = Math.floor(tail);\n return n > 0 ? n : undefined;\n}\n\n/** Keep the last `tail` messages of an already fully-parsed conversation. */\nexport function sliceTail<T>(messages: T[], tail: number | undefined): T[] {\n const n = normalizeTail(tail);\n return n !== undefined && messages.length > n ? messages.slice(-n) : messages;\n}\n\nexport const DEFAULT_TAIL_CHUNK_SIZE = 64 * 1024;\nconst DEFAULT_MAX_FILES = 16;\nconst NEWLINE = 0x0a;\nconst ANCHOR_BYTES = 32;\n\nexport interface JsonlTailSource<Item> {\n /** Map one raw JSONL line (no trailing newline) to an item, or null to skip it. */\n parseLine(line: string): Item | null;\n /**\n * Convert a contiguous window of items (oldest first) into messages. Must\n * behave like the adapter's full parse restricted to that window. Defaults\n * to treating every item as a {@link ConversationMessage}.\n */\n finalize?(items: Item[]): ConversationMessage[];\n}\n\nexport interface JsonlTailReaderOptions {\n /** Bytes read per backward step. Defaults to 64 KiB. */\n chunkSize?: number;\n /** Number of (file, variant, tail) windows kept in the LRU cache. */\n maxFiles?: number;\n}\n\ninterface TailState {\n dev: number;\n ino: number;\n size: number;\n mtimeMs: number;\n /** Byte offset just past the last newline consumed; appends are read from here. */\n offset: number;\n /**\n * Up to {@link ANCHOR_BYTES} bytes ending at `offset`. Re-checked before an\n * incremental read so a same-inode truncate-and-regrow is detected.\n */\n anchor: Buffer;\n /** Parsed items from complete (newline-terminated) lines, oldest first. */\n items: unknown[];\n /** Last computed result, returned as-is while the file is unchanged. */\n result: ConversationMessage[];\n}\n\nexport class JsonlTailReader {\n private readonly chunkSize: number;\n private readonly maxFiles: number;\n private readonly cache = new Map<string, TailState>();\n\n constructor(options: JsonlTailReaderOptions = {}) {\n this.chunkSize = Math.max(1, options.chunkSize ?? DEFAULT_TAIL_CHUNK_SIZE);\n this.maxFiles = Math.max(1, options.maxFiles ?? DEFAULT_MAX_FILES);\n }\n\n /**\n * Return the last `tail` messages of `filePath`.\n *\n * @param variant Cache discriminator for sources whose output differs by\n * option (e.g. verbose vs. non-verbose).\n * @param overscan Extra messages collected beyond `tail` before trimming,\n * for sources whose `finalize` looks at neighbouring lines.\n */\n read<Item>(\n filePath: string,\n tail: number,\n source: JsonlTailSource<Item>,\n variant = \"\",\n overscan = 0,\n ): ConversationMessage[] {\n const key = `${variant}\\0${tail}\\0${filePath}`;\n const threshold = tail + Math.max(0, overscan);\n\n let stat: fs.Stats;\n try {\n stat = fs.statSync(filePath);\n } catch {\n this.cache.delete(key);\n return [];\n }\n\n const cached = this.cache.get(key);\n if (\n cached &&\n cached.dev === stat.dev &&\n cached.ino === stat.ino &&\n cached.size === stat.size &&\n cached.mtimeMs === stat.mtimeMs\n ) {\n this.touch(key, cached);\n return cached.result.slice();\n }\n\n let fd: number;\n try {\n fd = fs.openSync(filePath, \"r\");\n } catch {\n this.cache.delete(key);\n return [];\n }\n\n try {\n const current = fs.fstatSync(fd);\n const canAppend =\n cached !== undefined &&\n cached.dev === current.dev &&\n cached.ino === current.ino &&\n current.size >= cached.offset &&\n // A very large append is cheaper to re-read from the end.\n current.size - cached.offset <= Math.max(this.chunkSize * 16, 1024 * 1024);\n\n const state =\n (canAppend && this.readAppended(fd, current, cached, tail, threshold, source)) ||\n this.readBackward(fd, current, tail, threshold, source);\n this.touch(key, state);\n return state.result.slice();\n } catch {\n this.cache.delete(key);\n return [];\n } finally {\n fs.closeSync(fd);\n }\n }\n\n /** Forget all cached windows. */\n clear(): void {\n this.cache.clear();\n }\n\n private readBackward<Item>(\n fd: number,\n stat: fs.Stats,\n tail: number,\n threshold: number,\n source: JsonlTailSource<Item>,\n ): TailState {\n const reversed: Item[] = [];\n let partial: Item | null = null;\n let offset = 0;\n let sawNewline = false;\n // Pieces of the line currently being assembled, in file order.\n let pending: Buffer[] = [];\n let pos = stat.size;\n\n const takeLine = (piece: Buffer): void => {\n const lineBuf = pending.length === 0 ? piece : Buffer.concat([piece, ...pending]);\n pending = [];\n if (!sawNewline) {\n // Bytes after the file's last newline: an unterminated (possibly\n // still being written) line. Parsed tentatively, never cached.\n sawNewline = true;\n partial = this.parse(lineBuf, source);\n return;\n }\n const item = this.parse(lineBuf, source);\n if (item !== null) reversed.push(item);\n };\n\n while (pos > 0) {\n const len = Math.min(this.chunkSize, pos);\n pos -= len;\n const buf = readExactly(fd, pos, len);\n\n let end = len;\n let nl = end > 0 ? buf.lastIndexOf(NEWLINE, end - 1) : -1;\n while (nl !== -1) {\n if (!sawNewline) offset = pos + nl + 1;\n takeLine(buf.subarray(nl + 1, end));\n end = nl;\n nl = end > 0 ? buf.lastIndexOf(NEWLINE, end - 1) : -1;\n }\n if (end > 0) pending.unshift(buf.subarray(0, end));\n\n if (this.countMessages(reversed, partial, source, threshold) >= threshold) break;\n }\n\n if (pos === 0 && pending.length > 0) {\n // The first line of the file (no newline before it).\n const first = pending.shift()!;\n takeLine(first);\n }\n\n const items = reversed.reverse();\n return {\n dev: stat.dev,\n ino: stat.ino,\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n offset,\n anchor: readAnchor(fd, offset),\n items,\n result: this.finish(items, partial, source, tail),\n };\n }\n\n /**\n * Parse bytes appended since the cached offset. Returns null when the\n * bytes before the offset no longer match (file rewritten in place).\n */\n private readAppended<Item>(\n fd: number,\n stat: fs.Stats,\n cached: TailState,\n tail: number,\n threshold: number,\n source: JsonlTailSource<Item>,\n ): TailState | null {\n let items = cached.items as Item[];\n let offset = cached.offset;\n let partial: Item | null = null;\n\n const anchorLength = cached.anchor.length;\n const raw = readExactly(fd, cached.offset - anchorLength, stat.size - offset + anchorLength);\n if (!raw.subarray(0, anchorLength).equals(cached.anchor)) return null;\n const buf = raw.subarray(anchorLength);\n let anchor = cached.anchor;\n\n if (buf.length > 0) {\n const added: Item[] = [];\n let start = 0;\n let nl = buf.indexOf(NEWLINE, start);\n while (nl !== -1) {\n const item = this.parse(buf.subarray(start, nl), source);\n if (item !== null) added.push(item);\n start = nl + 1;\n nl = buf.indexOf(NEWLINE, start);\n }\n offset = cached.offset + start;\n if (start > 0) anchor = tailBytes(raw.subarray(0, anchorLength + start));\n if (start < buf.length) partial = this.parse(buf.subarray(start), source);\n\n if (added.length > 0) {\n items = items.concat(added);\n // Bound the retained window; keep a generous margin so sources whose\n // finalize() drops items (e.g. de-duplication) still cover `tail`.\n if (items.length > threshold * 4) items = items.slice(-threshold * 2);\n }\n }\n\n return {\n dev: stat.dev,\n ino: stat.ino,\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n offset,\n anchor,\n items,\n result: this.finish(items, partial, source, tail),\n };\n }\n\n private parse<Item>(lineBuf: Buffer, source: JsonlTailSource<Item>): Item | null {\n const line = lineBuf.toString(\"utf-8\");\n if (line.trim().length === 0) return null;\n return source.parseLine(line);\n }\n\n private countMessages<Item>(\n reversed: Item[],\n partial: Item | null,\n source: JsonlTailSource<Item>,\n threshold: number,\n ): number {\n const available = reversed.length + (partial === null ? 0 : 1);\n if (!source.finalize || available < threshold) return available;\n const window = reversed.slice().reverse();\n if (partial !== null) window.push(partial);\n return source.finalize(window).length;\n }\n\n private finish<Item>(\n items: Item[],\n partial: Item | null,\n source: JsonlTailSource<Item>,\n tail: number,\n ): ConversationMessage[] {\n const window = partial === null ? items : [...items, partial];\n const messages = source.finalize\n ? source.finalize(window)\n : (window as unknown as ConversationMessage[]).slice();\n return messages.length > tail ? messages.slice(-tail) : messages;\n }\n\n private touch(key: string, state: TailState): void {\n this.cache.delete(key);\n this.cache.set(key, state);\n while (this.cache.size > this.maxFiles) {\n const oldest = this.cache.keys().next().value;\n if (oldest === undefined) break;\n this.cache.delete(oldest);\n }\n }\n}\n\nfunction readExactly(fd: number, position: number, length: number): Buffer {\n const buf = Buffer.allocUnsafe(length);\n let filled = 0;\n while (filled < length) {\n const n = fs.readSync(fd, buf, filled, length - filled, position + filled);\n if (n === 0) break;\n filled += n;\n }\n return filled === length ? buf : buf.subarray(0, filled);\n}\n\nfunction readAnchor(fd: number, offset: number): Buffer {\n const start = Math.max(0, offset - ANCHOR_BYTES);\n return Buffer.from(readExactly(fd, start, offset - start));\n}\n\nfunction tailBytes(buf: Buffer): Buffer {\n return Buffer.from(buf.subarray(Math.max(0, buf.length - ANCHOR_BYTES)));\n}\n"],"names":["fs","normalizeTail","tail","undefined","Number","isFinite","n","Math","floor","sliceTail","messages","length","slice","DEFAULT_TAIL_CHUNK_SIZE","DEFAULT_MAX_FILES","NEWLINE","ANCHOR_BYTES","JsonlTailReader","chunkSize","maxFiles","cache","Map","options","max","read","filePath","source","variant","overscan","key","threshold","stat","statSync","delete","cached","get","dev","ino","size","mtimeMs","touch","result","fd","openSync","current","fstatSync","canAppend","offset","state","readAppended","readBackward","closeSync","clear","reversed","partial","sawNewline","pending","pos","takeLine","piece","lineBuf","Buffer","concat","parse","item","push","len","min","buf","readExactly","end","nl","lastIndexOf","subarray","unshift","countMessages","first","shift","items","reverse","anchor","readAnchor","finish","anchorLength","raw","equals","added","start","indexOf","tailBytes","line","toString","trim","parseLine","available","finalize","window","set","oldest","keys","next","value","position","allocUnsafe","filled","readSync","from"],"mappings":"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"}
|
package/dist/utils/matching.d.ts
CHANGED
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
* based on CWD and birth-time proximity to process start time.
|
|
6
6
|
*/
|
|
7
7
|
import type { ProcessInfo } from "../adapters/AgentAdapter.js";
|
|
8
|
+
import { MATCH_TOLERANCE_MS } from "./matchingConstants.js";
|
|
8
9
|
import type { SessionFile } from "./session.js";
|
|
10
|
+
export { MATCH_TOLERANCE_MS };
|
|
9
11
|
/**
|
|
10
12
|
* Result of matching a process to a session file.
|
|
11
13
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"matching.d.ts","sourceRoot":"","sources":["../../src/utils/matching.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"matching.d.ts","sourceRoot":"","sources":["../../src/utils/matching.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,0BAA0B;IAC1B,OAAO,EAAE,WAAW,CAAC;IAErB,+BAA+B;IAC/B,OAAO,EAAE,WAAW,CAAC;IAErB,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,WAAW,EAAE,EACxB,QAAQ,EAAE,WAAW,EAAE,GACtB,WAAW,EAAE,CAsCf;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOlE"}
|
package/dist/utils/matching.js
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* Shared 1:1 greedy matching algorithm that pairs running processes with session files
|
|
5
5
|
* based on CWD and birth-time proximity to process start time.
|
|
6
6
|
*/ import * as path from "path";
|
|
7
|
-
|
|
7
|
+
import { MATCH_TOLERANCE_MS } from "./matchingConstants.js";
|
|
8
|
+
export { MATCH_TOLERANCE_MS };
|
|
8
9
|
/**
|
|
9
10
|
* Match processes to session files using 1:1 greedy assignment.
|
|
10
11
|
*
|
|
@@ -26,7 +27,7 @@
|
|
|
26
27
|
if (!session.resolvedCwd) continue;
|
|
27
28
|
if (proc.cwd !== session.resolvedCwd) continue;
|
|
28
29
|
const deltaMs = Math.abs(processStartMs - session.birthtimeMs);
|
|
29
|
-
if (deltaMs >
|
|
30
|
+
if (deltaMs > MATCH_TOLERANCE_MS) continue;
|
|
30
31
|
candidates.push({
|
|
31
32
|
process: proc,
|
|
32
33
|
session,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/matching.ts"],"sourcesContent":["/**\n * Session Matching Utilities\n *\n * Shared 1:1 greedy matching algorithm that pairs running processes with session files\n * based on CWD and birth-time proximity to process start time.\n */\n\nimport * as path from \"path\";\nimport type { ProcessInfo } from \"../adapters/AgentAdapter.js\";\nimport
|
|
1
|
+
{"version":3,"sources":["../../src/utils/matching.ts"],"sourcesContent":["/**\n * Session Matching Utilities\n *\n * Shared 1:1 greedy matching algorithm that pairs running processes with session files\n * based on CWD and birth-time proximity to process start time.\n */\n\nimport * as path from \"path\";\nimport type { ProcessInfo } from \"../adapters/AgentAdapter.js\";\nimport { MATCH_TOLERANCE_MS } from \"./matchingConstants.js\";\nimport type { SessionFile } from \"./session.js\";\n\nexport { MATCH_TOLERANCE_MS };\n\n/**\n * Result of matching a process to a session file.\n */\nexport interface MatchResult {\n /** The matched process */\n process: ProcessInfo;\n\n /** The matched session file */\n session: SessionFile;\n\n /** Absolute time delta in ms between process start and session birth time */\n deltaMs: number;\n}\n\n/**\n * Match processes to session files using 1:1 greedy assignment.\n *\n * Algorithm:\n * 1. Exclude processes without startTime (they become process-only fallback).\n * 2. Build candidate pairs where process.cwd === session.resolvedCwd\n * and |process.startTime - session.birthtimeMs| <= 3 minutes.\n * 3. Sort candidates by deltaMs ascending (best matches first).\n * 4. Greedily assign: once a process or session is matched, skip it.\n *\n * Adapters must set session.resolvedCwd before calling this function.\n */\nexport function matchProcessesToSessions(\n processes: ProcessInfo[],\n sessions: SessionFile[],\n): MatchResult[] {\n // Build all candidate pairs\n const candidates: Array<{ process: ProcessInfo; session: SessionFile; deltaMs: number }> = [];\n\n for (const proc of processes) {\n if (!proc.startTime || !proc.cwd) continue;\n\n const processStartMs = proc.startTime.getTime();\n\n for (const session of sessions) {\n if (!session.resolvedCwd) continue;\n if (proc.cwd !== session.resolvedCwd) continue;\n\n const deltaMs = Math.abs(processStartMs - session.birthtimeMs);\n if (deltaMs > MATCH_TOLERANCE_MS) continue;\n\n candidates.push({ process: proc, session, deltaMs });\n }\n }\n\n // Sort by smallest delta first\n candidates.sort((a, b) => a.deltaMs - b.deltaMs);\n\n // Greedy 1:1 assignment\n const matchedPids = new Set<number>();\n const matchedSessionIds = new Set<string>();\n const results: MatchResult[] = [];\n\n for (const candidate of candidates) {\n if (matchedPids.has(candidate.process.pid)) continue;\n if (matchedSessionIds.has(candidate.session.sessionId)) continue;\n\n matchedPids.add(candidate.process.pid);\n matchedSessionIds.add(candidate.session.sessionId);\n results.push(candidate);\n }\n\n return results;\n}\n\n/**\n * Generate a deterministic agent name from CWD and PID.\n *\n * Format: \"folder-name-pid\" (lowercase kebab-case)\n */\nexport function generateAgentName(cwd: string, pid: number): string {\n const folderName = path.basename(cwd) || \"unknown\";\n const kebab = folderName\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return `${kebab || \"unknown\"}-${pid}`;\n}\n"],"names":["path","MATCH_TOLERANCE_MS","matchProcessesToSessions","processes","sessions","candidates","proc","startTime","cwd","processStartMs","getTime","session","resolvedCwd","deltaMs","Math","abs","birthtimeMs","push","process","sort","a","b","matchedPids","Set","matchedSessionIds","results","candidate","has","pid","sessionId","add","generateAgentName","folderName","basename","kebab","toLowerCase","replace"],"mappings":"AAAA;;;;;CAKC,GAED,YAAYA,UAAU,OAAO;AAE7B,SAASC,kBAAkB,QAAQ,yBAAyB;AAG5D,SAASA,kBAAkB,GAAG;AAgB9B;;;;;;;;;;;CAWC,GACD,OAAO,SAASC,yBACdC,SAAwB,EACxBC,QAAuB;IAEvB,4BAA4B;IAC5B,MAAMC,aAAqF,EAAE;IAE7F,KAAK,MAAMC,QAAQH,UAAW;QAC5B,IAAI,CAACG,KAAKC,SAAS,IAAI,CAACD,KAAKE,GAAG,EAAE;QAElC,MAAMC,iBAAiBH,KAAKC,SAAS,CAACG,OAAO;QAE7C,KAAK,MAAMC,WAAWP,SAAU;YAC9B,IAAI,CAACO,QAAQC,WAAW,EAAE;YAC1B,IAAIN,KAAKE,GAAG,KAAKG,QAAQC,WAAW,EAAE;YAEtC,MAAMC,UAAUC,KAAKC,GAAG,CAACN,iBAAiBE,QAAQK,WAAW;YAC7D,IAAIH,UAAUZ,oBAAoB;YAElCI,WAAWY,IAAI,CAAC;gBAAEC,SAASZ;gBAAMK;gBAASE;YAAQ;QACpD;IACF;IAEA,+BAA+B;IAC/BR,WAAWc,IAAI,CAAC,CAACC,GAAGC,IAAMD,EAAEP,OAAO,GAAGQ,EAAER,OAAO;IAE/C,wBAAwB;IACxB,MAAMS,cAAc,IAAIC;IACxB,MAAMC,oBAAoB,IAAID;IAC9B,MAAME,UAAyB,EAAE;IAEjC,KAAK,MAAMC,aAAarB,WAAY;QAClC,IAAIiB,YAAYK,GAAG,CAACD,UAAUR,OAAO,CAACU,GAAG,GAAG;QAC5C,IAAIJ,kBAAkBG,GAAG,CAACD,UAAUf,OAAO,CAACkB,SAAS,GAAG;QAExDP,YAAYQ,GAAG,CAACJ,UAAUR,OAAO,CAACU,GAAG;QACrCJ,kBAAkBM,GAAG,CAACJ,UAAUf,OAAO,CAACkB,SAAS;QACjDJ,QAAQR,IAAI,CAACS;IACf;IAEA,OAAOD;AACT;AAEA;;;;CAIC,GACD,OAAO,SAASM,kBAAkBvB,GAAW,EAAEoB,GAAW;IACxD,MAAMI,aAAahC,KAAKiC,QAAQ,CAACzB,QAAQ;IACzC,MAAM0B,QAAQF,WACXG,WAAW,GACXC,OAAO,CAAC,eAAe,KACvBA,OAAO,CAAC,YAAY;IACvB,OAAO,GAAGF,SAAS,UAAU,CAAC,EAAEN,KAAK;AACvC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Matching Constants
|
|
3
|
+
*
|
|
4
|
+
* Kept apart from matching.ts so session locators can import them even when
|
|
5
|
+
* adapter tests fully mock matching.ts.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Maximum allowed delta between process start time and session file birth time.
|
|
9
|
+
*
|
|
10
|
+
* Single source of truth for matchProcessesToSessions and for locator
|
|
11
|
+
* discovery windows: a window narrower than this would skip files the matcher
|
|
12
|
+
* would accept.
|
|
13
|
+
*/
|
|
14
|
+
export declare const MATCH_TOLERANCE_MS: number;
|
|
15
|
+
//# sourceMappingURL=matchingConstants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matchingConstants.d.ts","sourceRoot":"","sources":["../../src/utils/matchingConstants.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,QAAgB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session Matching Constants
|
|
3
|
+
*
|
|
4
|
+
* Kept apart from matching.ts so session locators can import them even when
|
|
5
|
+
* adapter tests fully mock matching.ts.
|
|
6
|
+
*/ /**
|
|
7
|
+
* Maximum allowed delta between process start time and session file birth time.
|
|
8
|
+
*
|
|
9
|
+
* Single source of truth for matchProcessesToSessions and for locator
|
|
10
|
+
* discovery windows: a window narrower than this would skip files the matcher
|
|
11
|
+
* would accept.
|
|
12
|
+
*/ export const MATCH_TOLERANCE_MS = 3 * 60 * 1000; // 3 minutes
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=matchingConstants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/matchingConstants.ts"],"sourcesContent":["/**\n * Session Matching Constants\n *\n * Kept apart from matching.ts so session locators can import them even when\n * adapter tests fully mock matching.ts.\n */\n\n/**\n * Maximum allowed delta between process start time and session file birth time.\n *\n * Single source of truth for matchProcessesToSessions and for locator\n * discovery windows: a window narrower than this would skip files the matcher\n * would accept.\n */\nexport const MATCH_TOLERANCE_MS = 3 * 60 * 1000; // 3 minutes\n"],"names":["MATCH_TOLERANCE_MS"],"mappings":"AAAA;;;;;CAKC,GAED;;;;;;CAMC,GACD,OAAO,MAAMA,qBAAqB,IAAI,KAAK,KAAK,CAAC,YAAY"}
|
package/dist/utils/process.d.ts
CHANGED
|
@@ -6,6 +6,18 @@
|
|
|
6
6
|
* remain exported for compatibility with existing consumers.
|
|
7
7
|
*/
|
|
8
8
|
import type { ProcessInfo } from "../adapters/AgentAdapter.js";
|
|
9
|
+
/**
|
|
10
|
+
* Resolve argv[0] from a `ps` command line.
|
|
11
|
+
*
|
|
12
|
+
* `ps` joins argv with spaces, so an executable installed under a directory
|
|
13
|
+
* containing spaces (`/Applications/Some App.app/Contents/Resources/codex`)
|
|
14
|
+
* spans several whitespace tokens. When the first token of an absolute path
|
|
15
|
+
* is not itself a file, longer space-joined prefixes ending in a token with a
|
|
16
|
+
* path separator are tried, and the first one that exists on disk wins.
|
|
17
|
+
* Otherwise the first token is returned, so arguments are never folded into
|
|
18
|
+
* the executable path unless that combined path really is a file.
|
|
19
|
+
*/
|
|
20
|
+
export declare function executablePath(command: string): string;
|
|
9
21
|
export declare function executableBasename(command: string): string;
|
|
10
22
|
export declare function filterByProcessNames(processes: readonly ProcessInfo[], namePatterns: readonly string[]): ProcessInfo[];
|
|
11
23
|
/**
|
|
@@ -18,11 +30,35 @@ export declare function filterByProcessNames(processes: readonly ProcessInfo[],
|
|
|
18
30
|
* cwd and startTime are NOT populated — call enrichProcesses() to fill them.
|
|
19
31
|
*/
|
|
20
32
|
export declare function listAgentProcesses(namePattern: string): ProcessInfo[];
|
|
33
|
+
/** Runs an executable and resolves with its stdout. Injectable for tests. */
|
|
34
|
+
export type ProcessExec = (file: string, args: readonly string[]) => Promise<string>;
|
|
35
|
+
export interface ProcessSnapshotOptions {
|
|
36
|
+
/**
|
|
37
|
+
* Decides which name-matched processes are worth enriching with cwd and
|
|
38
|
+
* start time. Non-candidates are still returned (pid, ppid, tty, command
|
|
39
|
+
* only) so adapters can walk parent chains. Omitted = enrich everything.
|
|
40
|
+
*/
|
|
41
|
+
isCandidate?: (process: ProcessInfo) => boolean;
|
|
42
|
+
}
|
|
43
|
+
export type ProcessSnapshotCapture = (namePatterns: readonly string[], options?: ProcessSnapshotOptions) => Promise<ProcessInfo[]>;
|
|
44
|
+
/**
|
|
45
|
+
* Create a snapshot capture function with its own start-time cache.
|
|
46
|
+
*
|
|
47
|
+
* Start times never change for a live process, so each PID is queried with
|
|
48
|
+
* `ps lstart` once and reused on later refreshes. A cache entry is dropped
|
|
49
|
+
* when its PID disappears from the base listing, and ignored when the PID's
|
|
50
|
+
* ppid/command no longer match (PID reuse). cwd is re-read every refresh
|
|
51
|
+
* because a process can change directory.
|
|
52
|
+
*/
|
|
53
|
+
export declare function createProcessSnapshotCapture(deps?: {
|
|
54
|
+
exec?: ProcessExec;
|
|
55
|
+
}): ProcessSnapshotCapture;
|
|
21
56
|
/**
|
|
22
57
|
* Capture and enrich relevant processes without blocking the event loop.
|
|
23
|
-
* One base process listing is shared by every requested executable name
|
|
58
|
+
* One base process listing is shared by every requested executable name;
|
|
59
|
+
* only processes accepted by `options.isCandidate` are enriched.
|
|
24
60
|
*/
|
|
25
|
-
export declare
|
|
61
|
+
export declare const captureProcessSnapshot: ProcessSnapshotCapture;
|
|
26
62
|
/**
|
|
27
63
|
* Batch-get current working directories for multiple PIDs.
|
|
28
64
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../../src/utils/process.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAmB/D;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWtD;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAkCD,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,SAAS,WAAW,EAAE,EACjC,YAAY,EAAE,SAAS,MAAM,EAAE,GAC9B,WAAW,EAAE,CAIf;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,EAAE,CA0CrE;AAED,6EAA6E;AAC7E,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAErF,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,CAAC;CACjD;AAED,MAAM,MAAM,sBAAsB,GAAG,CACnC,YAAY,EAAE,SAAS,MAAM,EAAE,EAC/B,OAAO,CAAC,EAAE,sBAAsB,KAC7B,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AA8H5B;;;;;;;;GAQG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,WAAW,CAAA;CAAO,GAChC,sBAAsB,CAwDxB;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,sBAAuD,CAAC;AAE7F;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAuCvE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAiC3E;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAavE;AAaD,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,WAAW,EAAE,EACxB,KAAK,EAAE,WAAW,GACjB,WAAW,GAAG,SAAS,CAKzB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,WAAW,EAAE,EACxB,gBAAgB,GAAE,WAAW,EAAO,GACnC,GAAG,CAAC,MAAM,CAAC,CAqBb;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CASjD"}
|