@machina.ai/cell-cli-core 1.38.1-rc2 → 1.40.1-rc2
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/docs/AFTER_MERGE_PROMPT.md +1 -1
- package/dist/docs/admin/enterprise-controls.md +1 -1
- package/dist/docs/changelogs/index.md +42 -0
- package/dist/docs/changelogs/latest.md +254 -361
- package/dist/docs/changelogs/preview.md +237 -406
- package/dist/docs/cli/acp-mode.md +6 -6
- package/dist/docs/cli/auto-memory.md +143 -0
- package/dist/docs/cli/checkpointing.md +5 -5
- package/dist/docs/cli/cli-reference.md +12 -11
- package/dist/docs/cli/creating-skills.md +2 -2
- package/dist/docs/cli/custom-commands.md +15 -14
- package/dist/docs/cli/enterprise.md +17 -14
- package/dist/docs/cli/gemini-ignore.md +2 -2
- package/dist/docs/cli/generation-settings.md +21 -20
- package/dist/docs/cli/model-routing.md +2 -2
- package/dist/docs/cli/model-steering.md +1 -1
- package/dist/docs/cli/plan-mode.md +11 -6
- package/dist/docs/cli/sandbox.md +7 -5
- package/dist/docs/cli/settings.md +32 -28
- package/dist/docs/cli/system-prompt.md +8 -8
- package/dist/docs/cli/telemetry.md +18 -11
- package/dist/docs/cli/themes.md +2 -2
- package/dist/docs/cli/trusted-folders.md +41 -13
- package/dist/docs/cli/tutorials/mcp-setup.md +1 -1
- package/dist/docs/cli/tutorials/memory-management.md +3 -1
- package/dist/docs/cli/tutorials/plan-mode-steering.md +2 -2
- package/dist/docs/cli/tutorials/session-management.md +1 -1
- package/dist/docs/cli/tutorials/shell-commands.md +1 -1
- package/dist/docs/cli/tutorials/task-planning.md +3 -3
- package/dist/docs/core/index.md +5 -6
- package/dist/docs/core/local-model-routing.md +1 -1
- package/dist/docs/core/remote-agents.md +1 -1
- package/dist/docs/core/subagents.md +38 -8
- package/dist/docs/extensions/best-practices.md +5 -4
- package/dist/docs/extensions/reference.md +6 -5
- package/dist/docs/extensions/releasing.md +6 -5
- package/dist/docs/extensions/writing-extensions.md +11 -11
- package/dist/docs/get-started/{authentication.md → authentication.mdx} +139 -93
- package/dist/docs/get-started/gemini-3.md +1 -1
- package/dist/docs/get-started/index.md +4 -4
- package/dist/docs/get-started/installation.mdx +201 -0
- package/dist/docs/hooks/best-practices.md +18 -17
- package/dist/docs/hooks/index.md +10 -8
- package/dist/docs/hooks/reference.md +10 -10
- package/dist/docs/ide-integration/ide-companion-spec.md +14 -14
- package/dist/docs/ide-integration/index.md +4 -4
- package/dist/docs/index.md +2 -2
- package/dist/docs/integration-tests.md +84 -2
- package/dist/docs/issue-and-pr-automation.md +8 -7
- package/dist/docs/npm.md +2 -2
- package/dist/docs/reference/commands.md +11 -11
- package/dist/docs/reference/configuration.md +150 -47
- package/dist/docs/reference/keyboard-shortcuts.md +79 -2
- package/dist/docs/reference/memport.md +2 -3
- package/dist/docs/reference/policy-engine.md +60 -26
- package/dist/docs/reference/tools.md +38 -4
- package/dist/docs/release-confidence.md +1 -1
- package/dist/docs/releases.md +19 -19
- package/dist/docs/resources/faq.md +5 -5
- package/dist/docs/resources/tos-privacy.md +10 -9
- package/dist/docs/resources/troubleshooting.md +17 -16
- package/dist/docs/resources/uninstall.md +5 -4
- package/dist/docs/sidebar.json +13 -1
- package/dist/docs/tools/ask-user.md +3 -3
- package/dist/docs/tools/file-system.md +7 -7
- package/dist/docs/tools/mcp-resources.md +44 -0
- package/dist/docs/tools/mcp-server.md +42 -39
- package/dist/docs/tools/shell.md +5 -5
- package/dist/docs/tools/tracker.md +61 -0
- package/dist/package.json +5 -4
- package/dist/src/agent/content-utils.d.ts +0 -6
- package/dist/src/agent/content-utils.js +0 -14
- package/dist/src/agent/content-utils.js.map +1 -1
- package/dist/src/agent/content-utils.test.js +1 -18
- package/dist/src/agent/content-utils.test.js.map +1 -1
- package/dist/src/agent/event-translator.js +8 -3
- package/dist/src/agent/event-translator.js.map +1 -1
- package/dist/src/agent/event-translator.test.js +14 -9
- package/dist/src/agent/event-translator.test.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.js +9 -3
- package/dist/src/agent/legacy-agent-session.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.test.js +4 -3
- package/dist/src/agent/legacy-agent-session.test.js.map +1 -1
- package/dist/src/agent/tool-display-utils.d.ts +30 -0
- package/dist/src/agent/tool-display-utils.js +69 -0
- package/dist/src/agent/tool-display-utils.js.map +1 -0
- package/dist/src/agent/tool-display-utils.test.js +101 -0
- package/dist/src/agent/tool-display-utils.test.js.map +1 -0
- package/dist/src/agent/types.d.ts +25 -5
- package/dist/src/agents/a2aUtils.js +28 -15
- package/dist/src/agents/a2aUtils.js.map +1 -1
- package/dist/src/agents/a2aUtils.test.js +43 -0
- package/dist/src/agents/a2aUtils.test.js.map +1 -1
- package/dist/src/agents/agent-tool.d.ts +31 -0
- package/dist/src/agents/agent-tool.js +155 -0
- package/dist/src/agents/agent-tool.js.map +1 -0
- package/dist/src/agents/agent-tool.test.js +110 -0
- package/dist/src/agents/agent-tool.test.js.map +1 -0
- package/dist/src/agents/agentLoader.d.ts +79 -4
- package/dist/src/agents/agentLoader.js +40 -2
- package/dist/src/agents/agentLoader.js.map +1 -1
- package/dist/src/agents/agentLoader.test.js +32 -0
- package/dist/src/agents/agentLoader.test.js.map +1 -1
- package/dist/src/agents/browser/analyzeScreenshot.js +1 -1
- package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -1
- package/dist/src/agents/browser/analyzeScreenshot.test.js +19 -7
- package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.d.ts +2 -2
- package/dist/src/agents/browser/browserAgentInvocation.js +2 -1
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
- package/dist/src/agents/browser/browserAgentInvocation.test.js +61 -17
- package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.js +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -1
- package/dist/src/agents/browser/mcpToolWrapper.test.js +22 -10
- package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -1
- package/dist/src/agents/codebase-investigator.js +2 -2
- package/dist/src/agents/codebase-investigator.js.map +1 -1
- package/dist/src/agents/generalist-agent.js +3 -2
- package/dist/src/agents/generalist-agent.js.map +1 -1
- package/dist/src/agents/generalist-agent.test.js +1 -0
- package/dist/src/agents/generalist-agent.test.js.map +1 -1
- package/dist/src/agents/local-executor.d.ts +1 -1
- package/dist/src/agents/local-executor.js +10 -7
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +5 -3
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/local-invocation.d.ts +2 -2
- package/dist/src/agents/local-invocation.js +8 -2
- package/dist/src/agents/local-invocation.js.map +1 -1
- package/dist/src/agents/local-invocation.test.js +29 -13
- package/dist/src/agents/local-invocation.test.js.map +1 -1
- package/dist/src/agents/registry.d.ts +2 -0
- package/dist/src/agents/registry.js +20 -19
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +19 -30
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.d.ts +3 -4
- package/dist/src/agents/remote-invocation.js +2 -1
- package/dist/src/agents/remote-invocation.js.map +1 -1
- package/dist/src/agents/remote-invocation.test.js +45 -18
- package/dist/src/agents/remote-invocation.test.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.d.ts +3 -2
- package/dist/src/agents/skill-extraction-agent.js +99 -56
- package/dist/src/agents/skill-extraction-agent.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.test.js +54 -0
- package/dist/src/agents/skill-extraction-agent.test.js.map +1 -0
- package/dist/src/availability/policyCatalog.js +1 -1
- package/dist/src/availability/policyCatalog.js.map +1 -1
- package/dist/src/availability/policyCatalog.test.js +1 -1
- package/dist/src/availability/policyCatalog.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +14 -4
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/commands/memory.d.ts +77 -0
- package/dist/src/commands/memory.js +494 -0
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/memory.test.js +720 -1
- package/dist/src/commands/memory.test.js.map +1 -1
- package/dist/src/config/config-agents-reload.test.js +26 -31
- package/dist/src/config/config-agents-reload.test.js.map +1 -1
- package/dist/src/config/config.d.ts +24 -10
- package/dist/src/config/config.js +148 -82
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +373 -10
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/constants.d.ts +1 -0
- package/dist/src/config/constants.js +2 -0
- package/dist/src/config/constants.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +7 -7
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/memory.js +1 -1
- package/dist/src/config/memory.js.map +1 -1
- package/dist/src/config/path-validation.test.js +15 -6
- package/dist/src/config/path-validation.test.js.map +1 -1
- package/dist/src/config/projectRegistry.js +113 -32
- package/dist/src/config/projectRegistry.js.map +1 -1
- package/dist/src/config/projectRegistry.test.js +51 -0
- package/dist/src/config/projectRegistry.test.js.map +1 -1
- package/dist/src/config/storage.d.ts +5 -1
- package/dist/src/config/storage.js +14 -1
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/config/storage.test.js +12 -0
- package/dist/src/config/storage.test.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.d.ts +4 -1
- package/dist/src/confirmation-bus/message-bus.js +39 -1
- package/dist/src/confirmation-bus/message-bus.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.test.js +43 -0
- package/dist/src/confirmation-bus/message-bus.test.js.map +1 -1
- package/dist/src/context/config/configLoader.d.ts +13 -0
- package/dist/src/context/config/configLoader.js +65 -0
- package/dist/src/context/config/configLoader.js.map +1 -0
- package/dist/src/context/config/configLoader.test.d.ts +6 -0
- package/dist/src/context/config/configLoader.test.js +79 -0
- package/dist/src/context/config/configLoader.test.js.map +1 -0
- package/dist/src/context/config/profiles.d.ts +17 -0
- package/dist/src/context/config/profiles.js +93 -0
- package/dist/src/context/config/profiles.js.map +1 -0
- package/dist/src/context/config/registry.d.ts +21 -0
- package/dist/src/context/config/registry.js +32 -0
- package/dist/src/context/config/registry.js.map +1 -0
- package/dist/src/context/config/schema.d.ts +45 -0
- package/dist/src/context/config/schema.js +47 -0
- package/dist/src/context/config/schema.js.map +1 -0
- package/dist/src/context/config/types.d.ts +39 -0
- package/dist/src/context/config/types.js +7 -0
- package/dist/src/context/config/types.js.map +1 -0
- package/dist/src/context/contextManager.barrier.test.d.ts +6 -0
- package/dist/src/context/contextManager.barrier.test.js +56 -0
- package/dist/src/context/contextManager.barrier.test.js.map +1 -0
- package/dist/src/context/contextManager.d.ts +49 -0
- package/dist/src/context/contextManager.js +120 -0
- package/dist/src/context/contextManager.js.map +1 -0
- package/dist/src/context/eventBus.d.ts +28 -0
- package/dist/src/context/eventBus.js +27 -0
- package/dist/src/context/eventBus.js.map +1 -0
- package/dist/src/context/graph/behaviorRegistry.d.ts +28 -0
- package/dist/src/context/graph/behaviorRegistry.js +14 -0
- package/dist/src/context/graph/behaviorRegistry.js.map +1 -0
- package/dist/src/context/graph/builtinBehaviors.d.ts +11 -0
- package/dist/src/context/graph/builtinBehaviors.js +145 -0
- package/dist/src/context/graph/builtinBehaviors.js.map +1 -0
- package/dist/src/context/graph/fromGraph.d.ts +9 -0
- package/dist/src/context/graph/fromGraph.js +34 -0
- package/dist/src/context/graph/fromGraph.js.map +1 -0
- package/dist/src/context/graph/mapper.d.ts +16 -0
- package/dist/src/context/graph/mapper.js +16 -0
- package/dist/src/context/graph/mapper.js.map +1 -0
- package/dist/src/context/graph/render.d.ts +15 -0
- package/dist/src/context/graph/render.js +72 -0
- package/dist/src/context/graph/render.js.map +1 -0
- package/dist/src/context/graph/toGraph.d.ts +10 -0
- package/dist/src/context/graph/toGraph.js +172 -0
- package/dist/src/context/graph/toGraph.js.map +1 -0
- package/dist/src/context/graph/types.d.ts +139 -0
- package/dist/src/context/graph/types.js +36 -0
- package/dist/src/context/graph/types.js.map +1 -0
- package/dist/src/context/historyObserver.d.ts +27 -0
- package/dist/src/context/historyObserver.js +64 -0
- package/dist/src/context/historyObserver.js.map +1 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.d.ts +33 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.js +197 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.js.map +1 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.test.d.ts +6 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.test.js +89 -0
- package/dist/src/context/pipeline/contextWorkingBuffer.test.js.map +1 -0
- package/dist/src/context/pipeline/environment.d.ts +27 -0
- package/dist/src/context/pipeline/environment.js +2 -0
- package/dist/src/context/pipeline/environment.js.map +1 -0
- package/dist/src/context/pipeline/environmentImpl.d.ts +28 -0
- package/dist/src/context/pipeline/environmentImpl.js +40 -0
- package/dist/src/context/pipeline/environmentImpl.js.map +1 -0
- package/dist/src/context/pipeline/environmentImpl.test.d.ts +1 -0
- package/dist/src/context/pipeline/environmentImpl.test.js +32 -0
- package/dist/src/context/pipeline/environmentImpl.test.js.map +1 -0
- package/dist/src/context/pipeline/inbox.d.ts +15 -0
- package/dist/src/context/pipeline/inbox.js +52 -0
- package/dist/src/context/pipeline/inbox.js.map +1 -0
- package/dist/src/context/pipeline/inbox.test.d.ts +1 -0
- package/dist/src/context/pipeline/inbox.test.js +36 -0
- package/dist/src/context/pipeline/inbox.test.js.map +1 -0
- package/dist/src/context/pipeline/orchestrator.d.ts +22 -0
- package/dist/src/context/pipeline/orchestrator.js +126 -0
- package/dist/src/context/pipeline/orchestrator.js.map +1 -0
- package/dist/src/context/pipeline/orchestrator.test.d.ts +6 -0
- package/dist/src/context/pipeline/orchestrator.test.js +154 -0
- package/dist/src/context/pipeline/orchestrator.test.js.map +1 -0
- package/dist/src/context/pipeline.d.ts +52 -0
- package/dist/src/context/pipeline.js +7 -0
- package/dist/src/context/pipeline.js.map +1 -0
- package/dist/src/context/processors/blobDegradationProcessor.d.ts +6 -0
- package/dist/src/context/processors/blobDegradationProcessor.js +127 -0
- package/dist/src/context/processors/blobDegradationProcessor.js.map +1 -0
- package/dist/src/context/processors/blobDegradationProcessor.test.d.ts +6 -0
- package/dist/src/context/processors/blobDegradationProcessor.test.js +72 -0
- package/dist/src/context/processors/blobDegradationProcessor.test.js.map +1 -0
- package/dist/src/context/processors/historyTruncationProcessor.d.ts +11 -0
- package/dist/src/context/processors/historyTruncationProcessor.js +61 -0
- package/dist/src/context/processors/historyTruncationProcessor.js.map +1 -0
- package/dist/src/context/processors/nodeDistillationProcessor.d.ts +8 -0
- package/dist/src/context/processors/nodeDistillationProcessor.js +167 -0
- package/dist/src/context/processors/nodeDistillationProcessor.js.map +1 -0
- package/dist/src/context/processors/nodeDistillationProcessor.test.d.ts +6 -0
- package/dist/src/context/processors/nodeDistillationProcessor.test.js +77 -0
- package/dist/src/context/processors/nodeDistillationProcessor.test.js.map +1 -0
- package/dist/src/context/processors/nodeTruncationProcessor.d.ts +8 -0
- package/dist/src/context/processors/nodeTruncationProcessor.js +109 -0
- package/dist/src/context/processors/nodeTruncationProcessor.js.map +1 -0
- package/dist/src/context/processors/nodeTruncationProcessor.test.d.ts +6 -0
- package/dist/src/context/processors/nodeTruncationProcessor.test.js +71 -0
- package/dist/src/context/processors/nodeTruncationProcessor.test.js.map +1 -0
- package/dist/src/context/processors/rollingSummaryProcessor.d.ts +8 -0
- package/dist/src/context/processors/rollingSummaryProcessor.js +129 -0
- package/dist/src/context/processors/rollingSummaryProcessor.js.map +1 -0
- package/dist/src/context/processors/rollingSummaryProcessor.test.d.ts +1 -0
- package/dist/src/context/processors/rollingSummaryProcessor.test.js +60 -0
- package/dist/src/context/processors/rollingSummaryProcessor.test.js.map +1 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.d.ts +9 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.js +75 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.js.map +1 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.d.ts +1 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js +80 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js.map +1 -0
- package/dist/src/context/processors/stateSnapshotProcessor.d.ts +9 -0
- package/dist/src/context/processors/stateSnapshotProcessor.js +130 -0
- package/dist/src/context/processors/stateSnapshotProcessor.js.map +1 -0
- package/dist/src/context/processors/stateSnapshotProcessor.test.d.ts +1 -0
- package/dist/src/context/processors/stateSnapshotProcessor.test.js +91 -0
- package/dist/src/context/processors/stateSnapshotProcessor.test.js.map +1 -0
- package/dist/src/context/processors/toolMaskingProcessor.d.ts +8 -0
- package/dist/src/context/processors/toolMaskingProcessor.js +194 -0
- package/dist/src/context/processors/toolMaskingProcessor.js.map +1 -0
- package/dist/src/context/processors/toolMaskingProcessor.test.d.ts +1 -0
- package/dist/src/context/processors/toolMaskingProcessor.test.js +50 -0
- package/dist/src/context/processors/toolMaskingProcessor.test.js.map +1 -0
- package/dist/src/context/system-tests/lifecycle.golden.test.d.ts +6 -0
- package/dist/src/context/system-tests/lifecycle.golden.test.js +195 -0
- package/dist/src/context/system-tests/lifecycle.golden.test.js.map +1 -0
- package/dist/src/context/system-tests/simulationHarness.d.ts +41 -0
- package/dist/src/context/system-tests/simulationHarness.js +88 -0
- package/dist/src/context/system-tests/simulationHarness.js.map +1 -0
- package/dist/src/context/testing/contextTestUtils.d.ts +44 -0
- package/dist/src/context/testing/contextTestUtils.js +176 -0
- package/dist/src/context/testing/contextTestUtils.js.map +1 -0
- package/dist/src/context/testing/testProfile.d.ts +7 -0
- package/dist/src/context/testing/testProfile.js +20 -0
- package/dist/src/context/testing/testProfile.js.map +1 -0
- package/dist/src/context/tracer.d.ts +19 -0
- package/dist/src/context/tracer.js +79 -0
- package/dist/src/context/tracer.js.map +1 -0
- package/dist/src/context/tracer.test.d.ts +6 -0
- package/dist/src/context/tracer.test.js +71 -0
- package/dist/src/context/tracer.test.js.map +1 -0
- package/dist/src/context/utils/contextTokenCalculator.d.ts +53 -0
- package/dist/src/context/utils/contextTokenCalculator.js +97 -0
- package/dist/src/context/utils/contextTokenCalculator.js.map +1 -0
- package/dist/src/context/utils/snapshotGenerator.d.ts +12 -0
- package/dist/src/context/utils/snapshotGenerator.js +43 -0
- package/dist/src/context/utils/snapshotGenerator.js.map +1 -0
- package/dist/src/core/agentChatHistory.d.ts +26 -0
- package/dist/src/core/agentChatHistory.js +50 -0
- package/dist/src/core/agentChatHistory.js.map +1 -0
- package/dist/src/core/client.js +3 -1
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +4 -0
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.d.ts +8 -1
- package/dist/src/core/contentGenerator.js +46 -4
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +174 -8
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/coreToolHookTriggers.d.ts +1 -1
- package/dist/src/core/coreToolHookTriggers.js +5 -1
- package/dist/src/core/coreToolHookTriggers.js.map +1 -1
- package/dist/src/core/coreToolHookTriggers.test.js +1 -1
- package/dist/src/core/coreToolHookTriggers.test.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +2 -1
- package/dist/src/core/geminiChat.js +7 -2
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +19 -6
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChat_network_retry.test.js +42 -0
- package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
- package/dist/src/core/localLiteRtLmClient.js +2 -0
- package/dist/src/core/localLiteRtLmClient.js.map +1 -1
- package/dist/src/core/localLiteRtLmClient.test.js +7 -0
- package/dist/src/core/localLiteRtLmClient.test.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.js +19 -6
- package/dist/src/core/loggingContentGenerator.js.map +1 -1
- package/dist/src/core/loggingContentGenerator.test.js +55 -0
- package/dist/src/core/loggingContentGenerator.test.js.map +1 -1
- package/dist/src/core/prompts-substitution.test.js +1 -0
- package/dist/src/core/prompts-substitution.test.js.map +1 -1
- package/dist/src/core/prompts.d.ts +1 -1
- package/dist/src/core/prompts.js +2 -2
- package/dist/src/core/prompts.js.map +1 -1
- package/dist/src/core/prompts.test.js +39 -8
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/hooks/hookRunner.js +8 -0
- package/dist/src/hooks/hookRunner.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js +23 -0
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/ide/ide-client.js +3 -4
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/index.d.ts +7 -3
- package/dist/src/index.js +7 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/mcpLauncher.js +1 -1
- package/dist/src/mcp/mcpLauncher.js.map +1 -1
- package/dist/src/mcp/oauth-provider.test.js +24 -17
- package/dist/src/mcp/oauth-provider.test.js.map +1 -1
- package/dist/src/policy/config.d.ts +2 -0
- package/dist/src/policy/config.js +67 -12
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/core-tools-mapping.test.d.ts +6 -0
- package/dist/src/policy/core-tools-mapping.test.js +44 -0
- package/dist/src/policy/core-tools-mapping.test.js.map +1 -0
- package/dist/src/policy/policies/agents.toml +10 -0
- package/dist/src/policy/policies/plan.toml +17 -43
- package/dist/src/policy/policies/read-only.toml +24 -38
- package/dist/src/policy/policy-engine.d.ts +1 -1
- package/dist/src/policy/policy-engine.js +72 -67
- package/dist/src/policy/policy-engine.js.map +1 -1
- package/dist/src/policy/policy-engine.test.js +71 -4
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/sandboxPolicyManager.js +4 -4
- package/dist/src/policy/sandboxPolicyManager.js.map +1 -1
- package/dist/src/policy/shell-safety-regression.test.d.ts +6 -0
- package/dist/src/policy/shell-safety-regression.test.js +86 -0
- package/dist/src/policy/shell-safety-regression.test.js.map +1 -0
- package/dist/src/policy/shell-safety.test.js +24 -0
- package/dist/src/policy/shell-safety.test.js.map +1 -1
- package/dist/src/policy/shell-substitution.test.d.ts +6 -0
- package/dist/src/policy/shell-substitution.test.js +75 -0
- package/dist/src/policy/shell-substitution.test.js.map +1 -0
- package/dist/src/policy/toml-loader.test.js +25 -11
- package/dist/src/policy/toml-loader.test.js.map +1 -1
- package/dist/src/policy/types.d.ts +6 -2
- package/dist/src/policy/types.js +4 -2
- package/dist/src/policy/types.js.map +1 -1
- package/dist/src/prompts/promptProvider.d.ts +1 -1
- package/dist/src/prompts/promptProvider.js +41 -24
- package/dist/src/prompts/promptProvider.js.map +1 -1
- package/dist/src/prompts/promptProvider.test.js +36 -2
- package/dist/src/prompts/promptProvider.test.js.map +1 -1
- package/dist/src/prompts/snippets-memory-v2.test.d.ts +6 -0
- package/dist/src/prompts/snippets-memory-v2.test.js +94 -0
- package/dist/src/prompts/snippets-memory-v2.test.js.map +1 -0
- package/dist/src/prompts/snippets.d.ts +19 -1
- package/dist/src/prompts/snippets.js +33 -6
- package/dist/src/prompts/snippets.js.map +1 -1
- package/dist/src/prompts/snippets.legacy.d.ts +6 -1
- package/dist/src/prompts/snippets.legacy.js +14 -7
- package/dist/src/prompts/snippets.legacy.js.map +1 -1
- package/dist/src/prompts/utils.test.js +1 -0
- package/dist/src/prompts/utils.test.js.map +1 -1
- package/dist/src/routing/modelRouterService.js +1 -1
- package/dist/src/routing/modelRouterService.js.map +1 -1
- package/dist/src/sandbox/linux/LinuxSandboxManager.d.ts +2 -0
- package/dist/src/sandbox/linux/LinuxSandboxManager.js +43 -19
- package/dist/src/sandbox/linux/LinuxSandboxManager.js.map +1 -1
- package/dist/src/sandbox/linux/LinuxSandboxManager.test.js +16 -0
- package/dist/src/sandbox/linux/LinuxSandboxManager.test.js.map +1 -1
- package/dist/src/sandbox/linux/bwrapArgsBuilder.d.ts +3 -7
- package/dist/src/sandbox/linux/bwrapArgsBuilder.js +96 -105
- package/dist/src/sandbox/linux/bwrapArgsBuilder.js.map +1 -1
- package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js +144 -41
- package/dist/src/sandbox/linux/bwrapArgsBuilder.test.js.map +1 -1
- package/dist/src/sandbox/macos/MacOsSandboxManager.js +19 -10
- package/dist/src/sandbox/macos/MacOsSandboxManager.js.map +1 -1
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js +24 -37
- package/dist/src/sandbox/macos/MacOsSandboxManager.test.js.map +1 -1
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.d.ts +3 -9
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js +129 -96
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.js.map +1 -1
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js +78 -77
- package/dist/src/sandbox/macos/seatbeltArgsBuilder.test.js.map +1 -1
- package/dist/src/sandbox/utils/fsUtils.d.ts +2 -3
- package/dist/src/sandbox/utils/fsUtils.js +12 -27
- package/dist/src/sandbox/utils/fsUtils.js.map +1 -1
- package/dist/src/sandbox/utils/fsUtils.test.js +87 -29
- package/dist/src/sandbox/utils/fsUtils.test.js.map +1 -1
- package/dist/src/sandbox/windows/GeminiSandbox.cs +186 -77
- package/dist/src/sandbox/windows/WindowsSandboxManager.d.ts +4 -16
- package/dist/src/sandbox/windows/WindowsSandboxManager.js +138 -204
- package/dist/src/sandbox/windows/WindowsSandboxManager.js.map +1 -1
- package/dist/src/sandbox/windows/WindowsSandboxManager.test.js +105 -122
- package/dist/src/sandbox/windows/WindowsSandboxManager.test.js.map +1 -1
- package/dist/src/scheduler/policy.js +1 -2
- package/dist/src/scheduler/policy.js.map +1 -1
- package/dist/src/scheduler/policy.test.js +58 -2
- package/dist/src/scheduler/policy.test.js.map +1 -1
- package/dist/src/scheduler/scheduler.d.ts +2 -1
- package/dist/src/scheduler/scheduler.js +13 -14
- package/dist/src/scheduler/scheduler.js.map +1 -1
- package/dist/src/scheduler/scheduler.test.js +66 -0
- package/dist/src/scheduler/scheduler.test.js.map +1 -1
- package/dist/src/scheduler/scheduler_hooks.test.js +1 -0
- package/dist/src/scheduler/scheduler_hooks.test.js.map +1 -1
- package/dist/src/scheduler/scheduler_parallel.test.js +2 -0
- package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -1
- package/dist/src/scheduler/tool-executor.js +2 -0
- package/dist/src/scheduler/tool-executor.js.map +1 -1
- package/dist/src/services/chatRecordingService.d.ts +12 -153
- package/dist/src/services/chatRecordingService.js +444 -350
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/chatRecordingService.test.js +174 -128
- package/dist/src/services/chatRecordingService.test.js.map +1 -1
- package/dist/src/services/chatRecordingTypes.d.ts +111 -0
- package/dist/src/services/chatRecordingTypes.js +10 -0
- package/dist/src/services/chatRecordingTypes.js.map +1 -0
- package/dist/src/services/gitService.d.ts +2 -0
- package/dist/src/services/gitService.js +10 -1
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/gitService.test.js +6 -2
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/keychainService.d.ts +2 -2
- package/dist/src/services/keychainService.js +9 -9
- package/dist/src/services/keychainService.js.map +1 -1
- package/dist/src/services/keychainService.test.js +7 -7
- package/dist/src/services/keychainService.test.js.map +1 -1
- package/dist/src/services/keychainTypes.d.ts +1 -1
- package/dist/src/services/memoryPatchUtils.d.ts +42 -0
- package/dist/src/services/memoryPatchUtils.js +216 -0
- package/dist/src/services/memoryPatchUtils.js.map +1 -0
- package/dist/src/services/memoryService.d.ts +21 -1
- package/dist/src/services/memoryService.js +405 -64
- package/dist/src/services/memoryService.js.map +1 -1
- package/dist/src/services/memoryService.test.js +686 -2
- package/dist/src/services/memoryService.test.js.map +1 -1
- package/dist/src/services/sandboxManager.d.ts +33 -19
- package/dist/src/services/sandboxManager.integration.test.js +728 -266
- package/dist/src/services/sandboxManager.integration.test.js.map +1 -1
- package/dist/src/services/sandboxManager.js +65 -62
- package/dist/src/services/sandboxManager.js.map +1 -1
- package/dist/src/services/sandboxManager.test.js +17 -114
- package/dist/src/services/sandboxManager.test.js.map +1 -1
- package/dist/src/services/sandboxedFileSystemService.js +72 -62
- package/dist/src/services/sandboxedFileSystemService.js.map +1 -1
- package/dist/src/services/sessionSummaryUtils.d.ts +1 -1
- package/dist/src/services/sessionSummaryUtils.js +111 -38
- package/dist/src/services/sessionSummaryUtils.js.map +1 -1
- package/dist/src/services/sessionSummaryUtils.test.js +204 -51
- package/dist/src/services/sessionSummaryUtils.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.d.ts +19 -0
- package/dist/src/services/shellExecutionService.js +88 -34
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +38 -4
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/telemetry/activity-monitor.js +1 -0
- package/dist/src/telemetry/activity-monitor.js.map +1 -1
- package/dist/src/telemetry/config.js +3 -0
- package/dist/src/telemetry/config.js.map +1 -1
- package/dist/src/telemetry/conseca-logger.js +18 -20
- package/dist/src/telemetry/conseca-logger.js.map +1 -1
- package/dist/src/telemetry/conseca-logger.test.js +100 -0
- package/dist/src/telemetry/conseca-logger.test.js.map +1 -1
- package/dist/src/telemetry/event-loop-monitor.d.ts +17 -0
- package/dist/src/telemetry/event-loop-monitor.js +76 -0
- package/dist/src/telemetry/event-loop-monitor.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +2 -1
- package/dist/src/telemetry/index.js +2 -1
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/llmRole.d.ts +2 -1
- package/dist/src/telemetry/llmRole.js +1 -0
- package/dist/src/telemetry/llmRole.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +184 -8
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/memory-monitor.d.ts +1 -0
- package/dist/src/telemetry/memory-monitor.js +8 -1
- package/dist/src/telemetry/memory-monitor.js.map +1 -1
- package/dist/src/telemetry/memory-monitor.test.js +6 -1
- package/dist/src/telemetry/memory-monitor.test.js.map +1 -1
- package/dist/src/telemetry/metrics.d.ts +12 -0
- package/dist/src/telemetry/metrics.js +19 -0
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/sdk.js +20 -1
- package/dist/src/telemetry/sdk.js.map +1 -1
- package/dist/src/telemetry/trace.d.ts +23 -6
- package/dist/src/telemetry/trace.js +71 -22
- package/dist/src/telemetry/trace.js.map +1 -1
- package/dist/src/telemetry/trace.test.js +79 -15
- package/dist/src/telemetry/trace.test.js.map +1 -1
- package/dist/src/telemetry/types.js +61 -15
- package/dist/src/telemetry/types.js.map +1 -1
- package/dist/src/test-utils/mock-tool.d.ts +3 -2
- package/dist/src/test-utils/mock-tool.js +4 -3
- package/dist/src/test-utils/mock-tool.js.map +1 -1
- package/dist/src/tools/activate-skill.js +1 -1
- package/dist/src/tools/activate-skill.js.map +1 -1
- package/dist/src/tools/activate-skill.test.js +6 -2
- package/dist/src/tools/activate-skill.test.js.map +1 -1
- package/dist/src/tools/ask-user.d.ts +2 -2
- package/dist/src/tools/ask-user.js +1 -1
- package/dist/src/tools/ask-user.js.map +1 -1
- package/dist/src/tools/ask-user.test.js +9 -3
- package/dist/src/tools/ask-user.test.js.map +1 -1
- package/dist/src/tools/complete-task.d.ts +2 -2
- package/dist/src/tools/complete-task.js +1 -1
- package/dist/src/tools/complete-task.js.map +1 -1
- package/dist/src/tools/complete-task.test.js +9 -3
- package/dist/src/tools/complete-task.test.js.map +1 -1
- package/dist/src/tools/definitions/base-declarations.d.ts +2 -0
- package/dist/src/tools/definitions/base-declarations.js +3 -0
- package/dist/src/tools/definitions/base-declarations.js.map +1 -1
- package/dist/src/tools/definitions/coreTools.d.ts +3 -1
- package/dist/src/tools/definitions/coreTools.js +13 -1
- package/dist/src/tools/definitions/coreTools.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js +29 -1
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js +29 -1
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
- package/dist/src/tools/definitions/types.d.ts +2 -0
- package/dist/src/tools/edit.js +20 -4
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +41 -18
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/enter-plan-mode.d.ts +2 -2
- package/dist/src/tools/enter-plan-mode.js +1 -1
- package/dist/src/tools/enter-plan-mode.js.map +1 -1
- package/dist/src/tools/enter-plan-mode.test.js +10 -4
- package/dist/src/tools/enter-plan-mode.test.js.map +1 -1
- package/dist/src/tools/exit-plan-mode.d.ts +2 -2
- package/dist/src/tools/exit-plan-mode.js +9 -12
- package/dist/src/tools/exit-plan-mode.js.map +1 -1
- package/dist/src/tools/exit-plan-mode.test.js +44 -17
- package/dist/src/tools/exit-plan-mode.test.js.map +1 -1
- package/dist/src/tools/get-internal-docs.js +6 -3
- package/dist/src/tools/get-internal-docs.js.map +1 -1
- package/dist/src/tools/get-internal-docs.test.js +4 -4
- package/dist/src/tools/get-internal-docs.test.js.map +1 -1
- package/dist/src/tools/glob.js +1 -1
- package/dist/src/tools/glob.js.map +1 -1
- package/dist/src/tools/glob.test.js +16 -16
- package/dist/src/tools/glob.test.js.map +1 -1
- package/dist/src/tools/grep.js +21 -12
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +18 -18
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/line-endings.test.js +3 -3
- package/dist/src/tools/line-endings.test.js.map +1 -1
- package/dist/src/tools/list-mcp-resources.d.ts +24 -0
- package/dist/src/tools/list-mcp-resources.js +74 -0
- package/dist/src/tools/list-mcp-resources.js.map +1 -0
- package/dist/src/tools/list-mcp-resources.test.d.ts +6 -0
- package/dist/src/tools/list-mcp-resources.test.js +79 -0
- package/dist/src/tools/list-mcp-resources.test.js.map +1 -0
- package/dist/src/tools/ls.js +2 -2
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/ls.test.js +21 -21
- package/dist/src/tools/ls.test.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.d.ts +3 -1
- package/dist/src/tools/mcp-client-manager.js +24 -1
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +43 -0
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.js +10 -12
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +14 -2
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/mcp-tool.d.ts +2 -2
- package/dist/src/tools/mcp-tool.js +1 -1
- package/dist/src/tools/mcp-tool.js.map +1 -1
- package/dist/src/tools/mcp-tool.test.js +51 -21
- package/dist/src/tools/mcp-tool.test.js.map +1 -1
- package/dist/src/tools/memoryTool.d.ts +4 -3
- package/dist/src/tools/memoryTool.js +43 -14
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +29 -9
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/read-file.js +1 -1
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +17 -17
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.js +4 -4
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/read-many-files.test.js +70 -24
- package/dist/src/tools/read-many-files.test.js.map +1 -1
- package/dist/src/tools/read-mcp-resource.d.ts +25 -0
- package/dist/src/tools/read-mcp-resource.js +120 -0
- package/dist/src/tools/read-mcp-resource.js.map +1 -0
- package/dist/src/tools/read-mcp-resource.test.d.ts +6 -0
- package/dist/src/tools/read-mcp-resource.test.js +110 -0
- package/dist/src/tools/read-mcp-resource.test.js.map +1 -0
- package/dist/src/tools/ripGrep.d.ts +3 -2
- package/dist/src/tools/ripGrep.js +26 -55
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +113 -167
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +2 -2
- package/dist/src/tools/shell.js +51 -21
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +479 -76
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/shellBackgroundTools.d.ts +3 -3
- package/dist/src/tools/shellBackgroundTools.integration.test.js +6 -2
- package/dist/src/tools/shellBackgroundTools.integration.test.js.map +1 -1
- package/dist/src/tools/shellBackgroundTools.js +2 -2
- package/dist/src/tools/shellBackgroundTools.js.map +1 -1
- package/dist/src/tools/shellBackgroundTools.test.js +30 -10
- package/dist/src/tools/shellBackgroundTools.test.js.map +1 -1
- package/dist/src/tools/tool-error.d.ts +1 -0
- package/dist/src/tools/tool-error.js +1 -0
- package/dist/src/tools/tool-error.js.map +1 -1
- package/dist/src/tools/tool-names.d.ts +5 -4
- package/dist/src/tools/tool-names.js +8 -2
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tool-registry.js +137 -114
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tool-registry.test.js +3 -1
- package/dist/src/tools/tool-registry.test.js.map +1 -1
- package/dist/src/tools/tools.d.ts +6 -6
- package/dist/src/tools/tools.js +6 -2
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/topicTool.d.ts +2 -2
- package/dist/src/tools/topicTool.js +1 -1
- package/dist/src/tools/topicTool.js.map +1 -1
- package/dist/src/tools/topicTool.test.js +6 -2
- package/dist/src/tools/topicTool.test.js.map +1 -1
- package/dist/src/tools/trackerTools.d.ts +7 -7
- package/dist/src/tools/trackerTools.js +6 -6
- package/dist/src/tools/trackerTools.js.map +1 -1
- package/dist/src/tools/web-fetch.js +1 -1
- package/dist/src/tools/web-fetch.js.map +1 -1
- package/dist/src/tools/web-fetch.test.js +59 -23
- package/dist/src/tools/web-fetch.test.js.map +1 -1
- package/dist/src/tools/web-search.js +1 -1
- package/dist/src/tools/web-search.js.map +1 -1
- package/dist/src/tools/web-search.test.js +5 -5
- package/dist/src/tools/web-search.test.js.map +1 -1
- package/dist/src/tools/write-file.js +22 -4
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +29 -11
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/tools/write-todos.js +1 -1
- package/dist/src/tools/write-todos.js.map +1 -1
- package/dist/src/utils/compatibility.js +6 -1
- package/dist/src/utils/compatibility.js.map +1 -1
- package/dist/src/utils/compatibility.test.js +23 -0
- package/dist/src/utils/compatibility.test.js.map +1 -1
- package/dist/src/utils/errors.d.ts +3 -0
- package/dist/src/utils/errors.js +6 -0
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/fileUtils.d.ts +1 -2
- package/dist/src/utils/fileUtils.js +80 -40
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/fileUtils.test.js +61 -0
- package/dist/src/utils/fileUtils.test.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.d.ts +2 -0
- package/dist/src/utils/filesearch/fileSearch.js +97 -6
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.test.js +54 -0
- package/dist/src/utils/filesearch/fileSearch.test.js.map +1 -1
- package/dist/src/utils/filesearch/fileWatcher.d.ts +25 -0
- package/dist/src/utils/filesearch/fileWatcher.js +86 -0
- package/dist/src/utils/filesearch/fileWatcher.js.map +1 -0
- package/dist/src/utils/filesearch/fileWatcher.test.js +142 -0
- package/dist/src/utils/filesearch/fileWatcher.test.js.map +1 -0
- package/dist/src/utils/getFolderStructure.js +4 -2
- package/dist/src/utils/getFolderStructure.js.map +1 -1
- package/dist/src/utils/gitIgnoreParser.js +1 -1
- package/dist/src/utils/gitIgnoreParser.js.map +1 -1
- package/dist/src/utils/googleQuotaErrors.d.ts +2 -1
- package/dist/src/utils/googleQuotaErrors.js +30 -35
- package/dist/src/utils/googleQuotaErrors.js.map +1 -1
- package/dist/src/utils/googleQuotaErrors.test.js +24 -0
- package/dist/src/utils/googleQuotaErrors.test.js.map +1 -1
- package/dist/src/utils/ignoreFileParser.js +1 -1
- package/dist/src/utils/ignoreFileParser.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.js +15 -5
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/oauth-flow.js +17 -5
- package/dist/src/utils/oauth-flow.js.map +1 -1
- package/dist/src/utils/oauth-flow.test.js +20 -0
- package/dist/src/utils/oauth-flow.test.js.map +1 -1
- package/dist/src/utils/paths.d.ts +9 -0
- package/dist/src/utils/paths.js +37 -0
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +45 -1
- package/dist/src/utils/paths.test.js.map +1 -1
- package/dist/src/utils/planUtils.d.ts +11 -2
- package/dist/src/utils/planUtils.js +43 -11
- package/dist/src/utils/planUtils.js.map +1 -1
- package/dist/src/utils/planUtils.test.js +10 -9
- package/dist/src/utils/planUtils.test.js.map +1 -1
- package/dist/src/utils/process-utils.d.ts +2 -1
- package/dist/src/utils/process-utils.js +64 -33
- package/dist/src/utils/process-utils.js.map +1 -1
- package/dist/src/utils/process-utils.test.js +9 -0
- package/dist/src/utils/process-utils.test.js.map +1 -1
- package/dist/src/utils/retry.js +18 -6
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +30 -0
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/sessionOperations.js +3 -2
- package/dist/src/utils/sessionOperations.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +2 -0
- package/dist/src/utils/shell-utils.js +237 -107
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/tool-utils.d.ts +1 -29
- package/dist/src/utils/tool-utils.js +0 -39
- package/dist/src/utils/tool-utils.js.map +1 -1
- package/dist/src/utils/tool-utils.test.js +2 -76
- package/dist/src/utils/tool-utils.test.js.map +1 -1
- package/dist/src/utils/tool-visibility.d.ts +40 -0
- package/dist/src/utils/tool-visibility.js +111 -0
- package/dist/src/utils/tool-visibility.js.map +1 -0
- package/dist/src/utils/tool-visibility.test.d.ts +6 -0
- package/dist/src/utils/tool-visibility.test.js +96 -0
- package/dist/src/utils/tool-visibility.test.js.map +1 -0
- package/dist/src/utils/trust.d.ts +64 -0
- package/dist/src/utils/trust.js +276 -0
- package/dist/src/utils/trust.js.map +1 -0
- package/dist/src/utils/trust.test.d.ts +6 -0
- package/dist/src/utils/trust.test.js +159 -0
- package/dist/src/utils/trust.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +5 -4
- package/dist/docs/get-started/installation.md +0 -181
- package/dist/src/agents/memory-manager-agent.d.ts +0 -25
- package/dist/src/agents/memory-manager-agent.js +0 -138
- package/dist/src/agents/memory-manager-agent.js.map +0 -1
- package/dist/src/agents/memory-manager-agent.test.js +0 -123
- package/dist/src/agents/memory-manager-agent.test.js.map +0 -1
- package/dist/src/agents/subagent-tool-wrapper.d.ts +0 -38
- package/dist/src/agents/subagent-tool-wrapper.js +0 -58
- package/dist/src/agents/subagent-tool-wrapper.js.map +0 -1
- package/dist/src/agents/subagent-tool-wrapper.test.js +0 -123
- package/dist/src/agents/subagent-tool-wrapper.test.js.map +0 -1
- package/dist/src/agents/subagent-tool.d.ts +0 -18
- package/dist/src/agents/subagent-tool.js +0 -134
- package/dist/src/agents/subagent-tool.js.map +0 -1
- package/dist/src/agents/subagent-tool.test.js +0 -287
- package/dist/src/agents/subagent-tool.test.js.map +0 -1
- package/dist/src/policy/policies/tracker.toml +0 -34
- package/dist/src/prompts/snippets-memory-manager.test.js +0 -31
- package/dist/src/prompts/snippets-memory-manager.test.js.map +0 -1
- /package/dist/src/{agents/memory-manager-agent.test.d.ts → agent/tool-display-utils.test.d.ts} +0 -0
- /package/dist/src/agents/{subagent-tool.test.d.ts → agent-tool.test.d.ts} +0 -0
- /package/dist/src/{prompts/snippets-memory-manager.test.d.ts → agents/skill-extraction-agent.test.d.ts} +0 -0
- /package/dist/src/{agents/subagent-tool-wrapper.test.d.ts → utils/filesearch/fileWatcher.test.d.ts} +0 -0
|
@@ -4,16 +4,46 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { expect, it, describe, vi, beforeEach, afterEach } from 'vitest';
|
|
7
|
-
import fs from 'node:fs';
|
|
7
|
+
import * as fs from 'node:fs';
|
|
8
8
|
import path from 'node:path';
|
|
9
9
|
import os from 'node:os';
|
|
10
|
-
|
|
10
|
+
vi.mock('node:fs', async (importOriginal) => {
|
|
11
|
+
const actual = await importOriginal();
|
|
12
|
+
const fsModule = {
|
|
13
|
+
...actual,
|
|
14
|
+
mkdirSync: vi.fn(actual.mkdirSync),
|
|
15
|
+
appendFileSync: vi.fn(actual.appendFileSync),
|
|
16
|
+
writeFileSync: vi.fn(actual.writeFileSync),
|
|
17
|
+
readFileSync: vi.fn(actual.readFileSync),
|
|
18
|
+
unlinkSync: vi.fn(actual.unlinkSync),
|
|
19
|
+
existsSync: vi.fn(actual.existsSync),
|
|
20
|
+
readdirSync: vi.fn(actual.readdirSync),
|
|
21
|
+
promises: {
|
|
22
|
+
...actual.promises,
|
|
23
|
+
stat: vi.fn(actual.promises.stat),
|
|
24
|
+
readFile: vi.fn(actual.promises.readFile),
|
|
25
|
+
unlink: vi.fn(actual.promises.unlink),
|
|
26
|
+
readdir: vi.fn(actual.promises.readdir),
|
|
27
|
+
open: vi.fn(actual.promises.open),
|
|
28
|
+
rm: vi.fn(actual.promises.rm),
|
|
29
|
+
mkdir: vi.fn(actual.promises.mkdir),
|
|
30
|
+
writeFile: vi.fn(actual.promises.writeFile),
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
...fsModule,
|
|
35
|
+
default: fsModule,
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
import { ChatRecordingService, loadConversationRecord, } from './chatRecordingService.js';
|
|
11
39
|
import { CoreToolCallStatus } from '../scheduler/types.js';
|
|
12
40
|
import { getProjectHash } from '../utils/paths.js';
|
|
13
41
|
vi.mock('../utils/paths.js');
|
|
14
|
-
vi.mock('node:crypto', () => {
|
|
42
|
+
vi.mock('node:crypto', async (importOriginal) => {
|
|
43
|
+
const actual = await importOriginal();
|
|
15
44
|
let count = 0;
|
|
16
45
|
return {
|
|
46
|
+
...actual,
|
|
17
47
|
randomUUID: vi.fn(() => `test-uuid-${count++}`),
|
|
18
48
|
createHash: vi.fn(() => ({
|
|
19
49
|
update: vi.fn(() => ({
|
|
@@ -26,6 +56,9 @@ describe('ChatRecordingService', () => {
|
|
|
26
56
|
let chatRecordingService;
|
|
27
57
|
let mockConfig;
|
|
28
58
|
let testTempDir;
|
|
59
|
+
afterEach(() => {
|
|
60
|
+
vi.restoreAllMocks();
|
|
61
|
+
});
|
|
29
62
|
beforeEach(async () => {
|
|
30
63
|
testTempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'chat-recording-test-'));
|
|
31
64
|
mockConfig = {
|
|
@@ -70,8 +103,8 @@ describe('ChatRecordingService', () => {
|
|
|
70
103
|
}
|
|
71
104
|
});
|
|
72
105
|
describe('initialize', () => {
|
|
73
|
-
it('should create a new session if none is provided', () => {
|
|
74
|
-
chatRecordingService.initialize();
|
|
106
|
+
it('should create a new session if none is provided', async () => {
|
|
107
|
+
await chatRecordingService.initialize();
|
|
75
108
|
chatRecordingService.recordMessage({
|
|
76
109
|
type: 'user',
|
|
77
110
|
content: 'ping',
|
|
@@ -81,27 +114,27 @@ describe('ChatRecordingService', () => {
|
|
|
81
114
|
expect(fs.existsSync(chatsDir)).toBe(true);
|
|
82
115
|
const files = fs.readdirSync(chatsDir);
|
|
83
116
|
expect(files.length).toBeGreaterThan(0);
|
|
84
|
-
expect(files[0]).toMatch(/^session-.*-test-ses\.
|
|
117
|
+
expect(files[0]).toMatch(/^session-.*-test-ses\.jsonl$/);
|
|
85
118
|
});
|
|
86
|
-
it('should include the conversation kind when specified', () => {
|
|
87
|
-
chatRecordingService.initialize(undefined, 'subagent');
|
|
119
|
+
it('should include the conversation kind when specified', async () => {
|
|
120
|
+
await chatRecordingService.initialize(undefined, 'subagent');
|
|
88
121
|
chatRecordingService.recordMessage({
|
|
89
122
|
type: 'user',
|
|
90
123
|
content: 'ping',
|
|
91
124
|
model: 'm',
|
|
92
125
|
});
|
|
93
126
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
94
|
-
const conversation =
|
|
127
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
95
128
|
expect(conversation.kind).toBe('subagent');
|
|
96
129
|
});
|
|
97
|
-
it('should create a subdirectory for subagents if parentSessionId is present', () => {
|
|
130
|
+
it('should create a subdirectory for subagents if parentSessionId is present', async () => {
|
|
98
131
|
const parentSessionId = 'test-parent-uuid';
|
|
99
132
|
Object.defineProperty(mockConfig, 'parentSessionId', {
|
|
100
133
|
value: parentSessionId,
|
|
101
134
|
writable: true,
|
|
102
135
|
configurable: true,
|
|
103
136
|
});
|
|
104
|
-
chatRecordingService.initialize(undefined, 'subagent');
|
|
137
|
+
await chatRecordingService.initialize(undefined, 'subagent');
|
|
105
138
|
chatRecordingService.recordMessage({
|
|
106
139
|
type: 'user',
|
|
107
140
|
content: 'ping',
|
|
@@ -112,51 +145,56 @@ describe('ChatRecordingService', () => {
|
|
|
112
145
|
expect(fs.existsSync(subagentDir)).toBe(true);
|
|
113
146
|
const files = fs.readdirSync(subagentDir);
|
|
114
147
|
expect(files.length).toBeGreaterThan(0);
|
|
115
|
-
expect(files[0]).toBe('test-session-id.
|
|
148
|
+
expect(files[0]).toBe('test-session-id.jsonl');
|
|
116
149
|
});
|
|
117
|
-
it('should inherit workspace directories for subagents during initialization', () => {
|
|
150
|
+
it('should inherit workspace directories for subagents during initialization', async () => {
|
|
118
151
|
const mockDirectories = ['/project/dir1', '/project/dir2'];
|
|
119
152
|
vi.mocked(mockConfig.getWorkspaceContext).mockReturnValue({
|
|
120
153
|
getDirectories: vi.fn().mockReturnValue(mockDirectories),
|
|
121
154
|
});
|
|
122
155
|
// Initialize as a subagent
|
|
123
|
-
chatRecordingService.initialize(undefined, 'subagent');
|
|
124
|
-
// Recording a message triggers the disk write
|
|
156
|
+
await chatRecordingService.initialize(undefined, 'subagent');
|
|
157
|
+
// Recording a message triggers the disk write
|
|
125
158
|
chatRecordingService.recordMessage({
|
|
126
159
|
type: 'user',
|
|
127
160
|
content: 'ping',
|
|
128
161
|
model: 'm',
|
|
129
162
|
});
|
|
130
163
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
131
|
-
const conversation =
|
|
164
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
132
165
|
expect(conversation.kind).toBe('subagent');
|
|
133
166
|
expect(conversation.directories).toEqual(mockDirectories);
|
|
134
167
|
});
|
|
135
|
-
it('should resume from an existing session if provided', () => {
|
|
168
|
+
it('should resume from an existing session if provided', async () => {
|
|
136
169
|
const chatsDir = path.join(testTempDir, 'chats');
|
|
137
170
|
fs.mkdirSync(chatsDir, { recursive: true });
|
|
138
|
-
const sessionFile = path.join(chatsDir, 'session.
|
|
171
|
+
const sessionFile = path.join(chatsDir, 'session.jsonl');
|
|
139
172
|
const initialData = {
|
|
140
173
|
sessionId: 'old-session-id',
|
|
141
174
|
projectHash: 'test-project-hash',
|
|
142
175
|
messages: [],
|
|
143
176
|
};
|
|
144
|
-
fs.writeFileSync(sessionFile, JSON.stringify(initialData)
|
|
145
|
-
|
|
177
|
+
fs.writeFileSync(sessionFile, JSON.stringify({ ...initialData, messages: undefined }) +
|
|
178
|
+
'\n' +
|
|
179
|
+
(initialData.messages || [])
|
|
180
|
+
.map((m) => JSON.stringify(m))
|
|
181
|
+
.join('\n') +
|
|
182
|
+
'\n');
|
|
183
|
+
await chatRecordingService.initialize({
|
|
146
184
|
filePath: sessionFile,
|
|
147
185
|
conversation: {
|
|
148
186
|
sessionId: 'old-session-id',
|
|
149
187
|
},
|
|
150
188
|
});
|
|
151
|
-
const conversation =
|
|
189
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
152
190
|
expect(conversation.sessionId).toBe('old-session-id');
|
|
153
191
|
});
|
|
154
192
|
});
|
|
155
193
|
describe('recordMessage', () => {
|
|
156
|
-
beforeEach(() => {
|
|
157
|
-
chatRecordingService.initialize();
|
|
194
|
+
beforeEach(async () => {
|
|
195
|
+
await chatRecordingService.initialize();
|
|
158
196
|
});
|
|
159
|
-
it('should record a new message', () => {
|
|
197
|
+
it('should record a new message', async () => {
|
|
160
198
|
chatRecordingService.recordMessage({
|
|
161
199
|
type: 'user',
|
|
162
200
|
content: 'Hello',
|
|
@@ -164,27 +202,27 @@ describe('ChatRecordingService', () => {
|
|
|
164
202
|
model: 'gemini-pro',
|
|
165
203
|
});
|
|
166
204
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
167
|
-
const conversation =
|
|
205
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
168
206
|
expect(conversation.messages).toHaveLength(1);
|
|
169
207
|
expect(conversation.messages[0].content).toBe('Hello');
|
|
170
208
|
expect(conversation.messages[0].displayContent).toBe('User Hello');
|
|
171
209
|
expect(conversation.messages[0].type).toBe('user');
|
|
172
210
|
});
|
|
173
|
-
it('should create separate messages when recording multiple messages', () => {
|
|
211
|
+
it('should create separate messages when recording multiple messages', async () => {
|
|
174
212
|
chatRecordingService.recordMessage({
|
|
175
213
|
type: 'user',
|
|
176
214
|
content: 'World',
|
|
177
215
|
model: 'gemini-pro',
|
|
178
216
|
});
|
|
179
217
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
180
|
-
const conversation =
|
|
218
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
181
219
|
expect(conversation.messages).toHaveLength(1);
|
|
182
220
|
expect(conversation.messages[0].content).toBe('World');
|
|
183
221
|
});
|
|
184
222
|
});
|
|
185
223
|
describe('recordThought', () => {
|
|
186
|
-
it('should queue a thought', () => {
|
|
187
|
-
chatRecordingService.initialize();
|
|
224
|
+
it('should queue a thought', async () => {
|
|
225
|
+
await chatRecordingService.initialize();
|
|
188
226
|
chatRecordingService.recordThought({
|
|
189
227
|
subject: 'Thinking',
|
|
190
228
|
description: 'Thinking...',
|
|
@@ -196,10 +234,10 @@ describe('ChatRecordingService', () => {
|
|
|
196
234
|
});
|
|
197
235
|
});
|
|
198
236
|
describe('recordMessageTokens', () => {
|
|
199
|
-
beforeEach(() => {
|
|
200
|
-
chatRecordingService.initialize();
|
|
237
|
+
beforeEach(async () => {
|
|
238
|
+
await chatRecordingService.initialize();
|
|
201
239
|
});
|
|
202
|
-
it('should update the last message with token info', () => {
|
|
240
|
+
it('should update the last message with token info', async () => {
|
|
203
241
|
chatRecordingService.recordMessage({
|
|
204
242
|
type: 'gemini',
|
|
205
243
|
content: 'Response',
|
|
@@ -212,7 +250,7 @@ describe('ChatRecordingService', () => {
|
|
|
212
250
|
cachedContentTokenCount: 0,
|
|
213
251
|
});
|
|
214
252
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
215
|
-
const conversation =
|
|
253
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
216
254
|
const geminiMsg = conversation.messages[0];
|
|
217
255
|
expect(geminiMsg.tokens).toEqual({
|
|
218
256
|
input: 1,
|
|
@@ -223,7 +261,7 @@ describe('ChatRecordingService', () => {
|
|
|
223
261
|
tool: 0,
|
|
224
262
|
});
|
|
225
263
|
});
|
|
226
|
-
it('should queue token info if the last message already has tokens', () => {
|
|
264
|
+
it('should queue token info if the last message already has tokens', async () => {
|
|
227
265
|
chatRecordingService.recordMessage({
|
|
228
266
|
type: 'gemini',
|
|
229
267
|
content: 'Response',
|
|
@@ -251,10 +289,10 @@ describe('ChatRecordingService', () => {
|
|
|
251
289
|
tool: 0,
|
|
252
290
|
});
|
|
253
291
|
});
|
|
254
|
-
it('should not write to disk when queuing tokens (no last gemini message)', () => {
|
|
255
|
-
const
|
|
292
|
+
it('should not write to disk when queuing tokens (no last gemini message)', async () => {
|
|
293
|
+
const appendFileSyncSpy = vi.mocked(fs.appendFileSync);
|
|
256
294
|
// Clear spy call count after initialize writes the initial file
|
|
257
|
-
|
|
295
|
+
appendFileSyncSpy.mockClear();
|
|
258
296
|
// No gemini message recorded yet, so tokens should only be queued
|
|
259
297
|
chatRecordingService.recordMessageTokens({
|
|
260
298
|
promptTokenCount: 5,
|
|
@@ -263,7 +301,7 @@ describe('ChatRecordingService', () => {
|
|
|
263
301
|
cachedContentTokenCount: 0,
|
|
264
302
|
});
|
|
265
303
|
// writeFileSync should NOT have been called since we only queued
|
|
266
|
-
expect(
|
|
304
|
+
expect(appendFileSyncSpy).not.toHaveBeenCalled();
|
|
267
305
|
// @ts-expect-error private property
|
|
268
306
|
expect(chatRecordingService.queuedTokens).toEqual({
|
|
269
307
|
input: 5,
|
|
@@ -273,9 +311,8 @@ describe('ChatRecordingService', () => {
|
|
|
273
311
|
thoughts: 0,
|
|
274
312
|
tool: 0,
|
|
275
313
|
});
|
|
276
|
-
writeFileSyncSpy.mockRestore();
|
|
277
314
|
});
|
|
278
|
-
it('should not write to disk when queuing tokens (last message already has tokens)', () => {
|
|
315
|
+
it('should not write to disk when queuing tokens (last message already has tokens)', async () => {
|
|
279
316
|
chatRecordingService.recordMessage({
|
|
280
317
|
type: 'gemini',
|
|
281
318
|
content: 'Response',
|
|
@@ -288,8 +325,8 @@ describe('ChatRecordingService', () => {
|
|
|
288
325
|
totalTokenCount: 2,
|
|
289
326
|
cachedContentTokenCount: 0,
|
|
290
327
|
});
|
|
291
|
-
const
|
|
292
|
-
|
|
328
|
+
const appendFileSyncSpy = vi.mocked(fs.appendFileSync);
|
|
329
|
+
appendFileSyncSpy.mockClear();
|
|
293
330
|
// Second call should only queue, NOT write to disk
|
|
294
331
|
chatRecordingService.recordMessageTokens({
|
|
295
332
|
promptTokenCount: 2,
|
|
@@ -297,16 +334,15 @@ describe('ChatRecordingService', () => {
|
|
|
297
334
|
totalTokenCount: 4,
|
|
298
335
|
cachedContentTokenCount: 0,
|
|
299
336
|
});
|
|
300
|
-
expect(
|
|
301
|
-
writeFileSyncSpy.mockRestore();
|
|
337
|
+
expect(appendFileSyncSpy).not.toHaveBeenCalled();
|
|
302
338
|
});
|
|
303
|
-
it('should use in-memory cache and not re-read from disk on subsequent operations', () => {
|
|
339
|
+
it('should use in-memory cache and not re-read from disk on subsequent operations', async () => {
|
|
304
340
|
chatRecordingService.recordMessage({
|
|
305
341
|
type: 'gemini',
|
|
306
342
|
content: 'Response',
|
|
307
343
|
model: 'gemini-pro',
|
|
308
344
|
});
|
|
309
|
-
const readFileSyncSpy = vi.
|
|
345
|
+
const readFileSyncSpy = vi.mocked(fs.readFileSync);
|
|
310
346
|
readFileSyncSpy.mockClear();
|
|
311
347
|
// These operations should all use the in-memory cache
|
|
312
348
|
chatRecordingService.recordMessageTokens({
|
|
@@ -323,14 +359,13 @@ describe('ChatRecordingService', () => {
|
|
|
323
359
|
chatRecordingService.saveSummary('Test summary');
|
|
324
360
|
// readFileSync should NOT have been called since we use the in-memory cache
|
|
325
361
|
expect(readFileSyncSpy).not.toHaveBeenCalled();
|
|
326
|
-
readFileSyncSpy.mockRestore();
|
|
327
362
|
});
|
|
328
363
|
});
|
|
329
364
|
describe('recordToolCalls', () => {
|
|
330
|
-
beforeEach(() => {
|
|
331
|
-
chatRecordingService.initialize();
|
|
365
|
+
beforeEach(async () => {
|
|
366
|
+
await chatRecordingService.initialize();
|
|
332
367
|
});
|
|
333
|
-
it('should add new tool calls to the last message', () => {
|
|
368
|
+
it('should add new tool calls to the last message', async () => {
|
|
334
369
|
chatRecordingService.recordMessage({
|
|
335
370
|
type: 'gemini',
|
|
336
371
|
content: '',
|
|
@@ -345,12 +380,12 @@ describe('ChatRecordingService', () => {
|
|
|
345
380
|
};
|
|
346
381
|
chatRecordingService.recordToolCalls('gemini-pro', [toolCall]);
|
|
347
382
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
348
|
-
const conversation =
|
|
383
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
349
384
|
const geminiMsg = conversation.messages[0];
|
|
350
385
|
expect(geminiMsg.toolCalls).toHaveLength(1);
|
|
351
386
|
expect(geminiMsg.toolCalls[0].name).toBe('testTool');
|
|
352
387
|
});
|
|
353
|
-
it('should preserve dynamic description and NOT overwrite with generic one', () => {
|
|
388
|
+
it('should preserve dynamic description and NOT overwrite with generic one', async () => {
|
|
354
389
|
chatRecordingService.recordMessage({
|
|
355
390
|
type: 'gemini',
|
|
356
391
|
content: '',
|
|
@@ -367,11 +402,11 @@ describe('ChatRecordingService', () => {
|
|
|
367
402
|
};
|
|
368
403
|
chatRecordingService.recordToolCalls('gemini-pro', [toolCall]);
|
|
369
404
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
370
|
-
const conversation =
|
|
405
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
371
406
|
const geminiMsg = conversation.messages[0];
|
|
372
407
|
expect(geminiMsg.toolCalls[0].description).toBe(dynamicDescription);
|
|
373
408
|
});
|
|
374
|
-
it('should create a new message if the last message is not from gemini', () => {
|
|
409
|
+
it('should create a new message if the last message is not from gemini', async () => {
|
|
375
410
|
chatRecordingService.recordMessage({
|
|
376
411
|
type: 'user',
|
|
377
412
|
content: 'call a tool',
|
|
@@ -386,12 +421,33 @@ describe('ChatRecordingService', () => {
|
|
|
386
421
|
};
|
|
387
422
|
chatRecordingService.recordToolCalls('gemini-pro', [toolCall]);
|
|
388
423
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
389
|
-
const conversation =
|
|
424
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
390
425
|
expect(conversation.messages).toHaveLength(2);
|
|
391
426
|
expect(conversation.messages[1].type).toBe('gemini');
|
|
392
427
|
expect(conversation.messages[1]
|
|
393
428
|
.toolCalls).toHaveLength(1);
|
|
394
429
|
});
|
|
430
|
+
it('should record agentId when provided', async () => {
|
|
431
|
+
chatRecordingService.recordMessage({
|
|
432
|
+
type: 'gemini',
|
|
433
|
+
content: '',
|
|
434
|
+
model: 'gemini-pro',
|
|
435
|
+
});
|
|
436
|
+
const toolCall = {
|
|
437
|
+
id: 'tool-1',
|
|
438
|
+
name: 'testTool',
|
|
439
|
+
args: {},
|
|
440
|
+
status: CoreToolCallStatus.Success,
|
|
441
|
+
timestamp: new Date().toISOString(),
|
|
442
|
+
agentId: 'test-agent-id',
|
|
443
|
+
};
|
|
444
|
+
chatRecordingService.recordToolCalls('gemini-pro', [toolCall]);
|
|
445
|
+
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
446
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
447
|
+
const geminiMsg = conversation.messages[0];
|
|
448
|
+
expect(geminiMsg.toolCalls).toHaveLength(1);
|
|
449
|
+
expect(geminiMsg.toolCalls[0].agentId).toBe('test-agent-id');
|
|
450
|
+
});
|
|
395
451
|
});
|
|
396
452
|
describe('deleteSession', () => {
|
|
397
453
|
it('should delete the session file, tool outputs, session directory, and logs if they exist', async () => {
|
|
@@ -406,8 +462,8 @@ describe('ChatRecordingService', () => {
|
|
|
406
462
|
fs.mkdirSync(toolOutputsDir, { recursive: true });
|
|
407
463
|
fs.mkdirSync(sessionDir, { recursive: true });
|
|
408
464
|
// Create main session file with timestamp
|
|
409
|
-
const sessionFile = path.join(chatsDir, `session-2023-01-01T00-00-${shortId}.
|
|
410
|
-
fs.writeFileSync(sessionFile, JSON.stringify({ sessionId }));
|
|
465
|
+
const sessionFile = path.join(chatsDir, `session-2023-01-01T00-00-${shortId}.jsonl`);
|
|
466
|
+
fs.writeFileSync(sessionFile, JSON.stringify({ sessionId }) + '\n');
|
|
411
467
|
const logFile = path.join(logsDir, `session-${sessionId}.jsonl`);
|
|
412
468
|
fs.writeFileSync(logFile, '{}');
|
|
413
469
|
const toolOutputDir = path.join(toolOutputsDir, `session-${sessionId}`);
|
|
@@ -430,13 +486,14 @@ describe('ChatRecordingService', () => {
|
|
|
430
486
|
fs.mkdirSync(logsDir, { recursive: true });
|
|
431
487
|
fs.mkdirSync(toolOutputsDir, { recursive: true });
|
|
432
488
|
// Create parent session file
|
|
433
|
-
const parentFile = path.join(chatsDir, `session-2023-01-01T00-00-${shortId}.
|
|
434
|
-
fs.writeFileSync(parentFile, JSON.stringify({ sessionId: parentSessionId }));
|
|
489
|
+
const parentFile = path.join(chatsDir, `session-2023-01-01T00-00-${shortId}.jsonl`);
|
|
490
|
+
fs.writeFileSync(parentFile, JSON.stringify({ sessionId: parentSessionId }) + '\n');
|
|
435
491
|
// Create subagent session file in subdirectory
|
|
436
492
|
const subagentDir = path.join(chatsDir, parentSessionId);
|
|
437
493
|
fs.mkdirSync(subagentDir, { recursive: true });
|
|
438
|
-
const subagentFile = path.join(subagentDir, `${subagentSessionId}.
|
|
439
|
-
fs.writeFileSync(subagentFile, JSON.stringify({ sessionId: subagentSessionId, kind: 'subagent' })
|
|
494
|
+
const subagentFile = path.join(subagentDir, `${subagentSessionId}.jsonl`);
|
|
495
|
+
fs.writeFileSync(subagentFile, JSON.stringify({ sessionId: subagentSessionId, kind: 'subagent' }) +
|
|
496
|
+
'\n');
|
|
440
497
|
// Create logs for both
|
|
441
498
|
const parentLog = path.join(logsDir, `session-${parentSessionId}.jsonl`);
|
|
442
499
|
fs.writeFileSync(parentLog, '{}');
|
|
@@ -466,11 +523,12 @@ describe('ChatRecordingService', () => {
|
|
|
466
523
|
fs.mkdirSync(chatsDir, { recursive: true });
|
|
467
524
|
fs.mkdirSync(logsDir, { recursive: true });
|
|
468
525
|
// Create parent session file
|
|
469
|
-
const parentFile = path.join(chatsDir, `session-2023-01-01T00-00-${shortId}.
|
|
470
|
-
fs.writeFileSync(parentFile, JSON.stringify({ sessionId: parentSessionId }));
|
|
526
|
+
const parentFile = path.join(chatsDir, `session-2023-01-01T00-00-${shortId}.jsonl`);
|
|
527
|
+
fs.writeFileSync(parentFile, JSON.stringify({ sessionId: parentSessionId }) + '\n');
|
|
471
528
|
// Create legacy subagent session file (flat in chatsDir)
|
|
472
|
-
const subagentFile = path.join(chatsDir, `session-2023-01-01T00-01-${shortId}.
|
|
473
|
-
fs.writeFileSync(subagentFile, JSON.stringify({ sessionId: subagentSessionId, kind: 'subagent' })
|
|
529
|
+
const subagentFile = path.join(chatsDir, `session-2023-01-01T00-01-${shortId}.jsonl`);
|
|
530
|
+
fs.writeFileSync(subagentFile, JSON.stringify({ sessionId: subagentSessionId, kind: 'subagent' }) +
|
|
531
|
+
'\n');
|
|
474
532
|
// Call with parent sessionId
|
|
475
533
|
await chatRecordingService.deleteSession(parentSessionId);
|
|
476
534
|
expect(fs.existsSync(parentFile)).toBe(false);
|
|
@@ -484,8 +542,8 @@ describe('ChatRecordingService', () => {
|
|
|
484
542
|
fs.mkdirSync(chatsDir, { recursive: true });
|
|
485
543
|
fs.mkdirSync(logsDir, { recursive: true });
|
|
486
544
|
const basename = `session-2023-01-01T00-00-${shortId}`;
|
|
487
|
-
const sessionFile = path.join(chatsDir, `${basename}.
|
|
488
|
-
fs.writeFileSync(sessionFile, JSON.stringify({ sessionId }));
|
|
545
|
+
const sessionFile = path.join(chatsDir, `${basename}.jsonl`);
|
|
546
|
+
fs.writeFileSync(sessionFile, JSON.stringify({ sessionId }) + '\n');
|
|
489
547
|
const logFile = path.join(logsDir, `session-${sessionId}.jsonl`);
|
|
490
548
|
fs.writeFileSync(logFile, '{}');
|
|
491
549
|
// Call with basename
|
|
@@ -498,10 +556,10 @@ describe('ChatRecordingService', () => {
|
|
|
498
556
|
});
|
|
499
557
|
});
|
|
500
558
|
describe('recordDirectories', () => {
|
|
501
|
-
beforeEach(() => {
|
|
502
|
-
chatRecordingService.initialize();
|
|
559
|
+
beforeEach(async () => {
|
|
560
|
+
await chatRecordingService.initialize();
|
|
503
561
|
});
|
|
504
|
-
it('should save directories to the conversation', () => {
|
|
562
|
+
it('should save directories to the conversation', async () => {
|
|
505
563
|
chatRecordingService.recordMessage({
|
|
506
564
|
type: 'user',
|
|
507
565
|
content: 'ping',
|
|
@@ -512,13 +570,13 @@ describe('ChatRecordingService', () => {
|
|
|
512
570
|
'/path/to/dir2',
|
|
513
571
|
]);
|
|
514
572
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
515
|
-
const conversation =
|
|
573
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
516
574
|
expect(conversation.directories).toEqual([
|
|
517
575
|
'/path/to/dir1',
|
|
518
576
|
'/path/to/dir2',
|
|
519
577
|
]);
|
|
520
578
|
});
|
|
521
|
-
it('should overwrite existing directories', () => {
|
|
579
|
+
it('should overwrite existing directories', async () => {
|
|
522
580
|
chatRecordingService.recordMessage({
|
|
523
581
|
type: 'user',
|
|
524
582
|
content: 'ping',
|
|
@@ -527,13 +585,13 @@ describe('ChatRecordingService', () => {
|
|
|
527
585
|
chatRecordingService.recordDirectories(['/old/dir']);
|
|
528
586
|
chatRecordingService.recordDirectories(['/new/dir1', '/new/dir2']);
|
|
529
587
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
530
|
-
const conversation =
|
|
588
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
531
589
|
expect(conversation.directories).toEqual(['/new/dir1', '/new/dir2']);
|
|
532
590
|
});
|
|
533
591
|
});
|
|
534
592
|
describe('rewindTo', () => {
|
|
535
|
-
it('should rewind the conversation to a specific message ID', () => {
|
|
536
|
-
chatRecordingService.initialize();
|
|
593
|
+
it('should rewind the conversation to a specific message ID', async () => {
|
|
594
|
+
await chatRecordingService.initialize();
|
|
537
595
|
// Record some messages
|
|
538
596
|
chatRecordingService.recordMessage({
|
|
539
597
|
type: 'user',
|
|
@@ -551,17 +609,17 @@ describe('ChatRecordingService', () => {
|
|
|
551
609
|
model: 'm',
|
|
552
610
|
});
|
|
553
611
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
554
|
-
let conversation =
|
|
612
|
+
let conversation = (await loadConversationRecord(sessionFile));
|
|
555
613
|
const secondMsgId = conversation.messages[1].id;
|
|
556
614
|
const result = chatRecordingService.rewindTo(secondMsgId);
|
|
557
615
|
expect(result).not.toBeNull();
|
|
558
616
|
expect(result.messages).toHaveLength(1);
|
|
559
617
|
expect(result.messages[0].content).toBe('msg1');
|
|
560
|
-
conversation =
|
|
618
|
+
conversation = (await loadConversationRecord(sessionFile));
|
|
561
619
|
expect(conversation.messages).toHaveLength(1);
|
|
562
620
|
});
|
|
563
|
-
it('should return the original conversation if the message ID is not found', () => {
|
|
564
|
-
chatRecordingService.initialize();
|
|
621
|
+
it('should return the original conversation if the message ID is not found', async () => {
|
|
622
|
+
await chatRecordingService.initialize();
|
|
565
623
|
chatRecordingService.recordMessage({
|
|
566
624
|
type: 'user',
|
|
567
625
|
content: 'msg1',
|
|
@@ -573,25 +631,23 @@ describe('ChatRecordingService', () => {
|
|
|
573
631
|
});
|
|
574
632
|
});
|
|
575
633
|
describe('ENOSPC (disk full) graceful degradation - issue #16266', () => {
|
|
576
|
-
it('should disable recording and not throw when ENOSPC occurs during initialize', () => {
|
|
634
|
+
it('should disable recording and not throw when ENOSPC occurs during initialize', async () => {
|
|
577
635
|
const enospcError = new Error('ENOSPC: no space left on device');
|
|
578
636
|
enospcError.code = 'ENOSPC';
|
|
579
|
-
const mkdirSyncSpy = vi.
|
|
637
|
+
const mkdirSyncSpy = vi.mocked(fs.mkdirSync).mockImplementation(() => {
|
|
580
638
|
throw enospcError;
|
|
581
639
|
});
|
|
582
640
|
// Should not throw
|
|
583
|
-
expect(
|
|
641
|
+
await expect(chatRecordingService.initialize()).resolves.not.toThrow();
|
|
584
642
|
// Recording should be disabled (conversationFile set to null)
|
|
585
643
|
expect(chatRecordingService.getConversationFilePath()).toBeNull();
|
|
586
644
|
mkdirSyncSpy.mockRestore();
|
|
587
645
|
});
|
|
588
|
-
it('should disable recording and not throw when ENOSPC occurs during writeConversation', () => {
|
|
589
|
-
chatRecordingService.initialize();
|
|
646
|
+
it('should disable recording and not throw when ENOSPC occurs during writeConversation', async () => {
|
|
647
|
+
await chatRecordingService.initialize();
|
|
590
648
|
const enospcError = new Error('ENOSPC: no space left on device');
|
|
591
649
|
enospcError.code = 'ENOSPC';
|
|
592
|
-
|
|
593
|
-
.spyOn(fs, 'writeFileSync')
|
|
594
|
-
.mockImplementation(() => {
|
|
650
|
+
vi.mocked(fs.appendFileSync).mockImplementation(() => {
|
|
595
651
|
throw enospcError;
|
|
596
652
|
});
|
|
597
653
|
// Should not throw when recording a message
|
|
@@ -602,14 +658,13 @@ describe('ChatRecordingService', () => {
|
|
|
602
658
|
})).not.toThrow();
|
|
603
659
|
// Recording should be disabled (conversationFile set to null)
|
|
604
660
|
expect(chatRecordingService.getConversationFilePath()).toBeNull();
|
|
605
|
-
writeFileSyncSpy.mockRestore();
|
|
606
661
|
});
|
|
607
|
-
it('should skip recording operations when recording is disabled', () => {
|
|
608
|
-
chatRecordingService.initialize();
|
|
662
|
+
it('should skip recording operations when recording is disabled', async () => {
|
|
663
|
+
await chatRecordingService.initialize();
|
|
609
664
|
const enospcError = new Error('ENOSPC: no space left on device');
|
|
610
665
|
enospcError.code = 'ENOSPC';
|
|
611
|
-
const
|
|
612
|
-
.
|
|
666
|
+
const appendFileSyncSpy = vi
|
|
667
|
+
.mocked(fs.appendFileSync)
|
|
613
668
|
.mockImplementationOnce(() => {
|
|
614
669
|
throw enospcError;
|
|
615
670
|
});
|
|
@@ -619,7 +674,7 @@ describe('ChatRecordingService', () => {
|
|
|
619
674
|
model: 'gemini-pro',
|
|
620
675
|
});
|
|
621
676
|
// Reset mock to track subsequent calls
|
|
622
|
-
|
|
677
|
+
appendFileSyncSpy.mockClear();
|
|
623
678
|
// Subsequent calls should be no-ops (not call writeFileSync)
|
|
624
679
|
chatRecordingService.recordMessage({
|
|
625
680
|
type: 'user',
|
|
@@ -632,16 +687,13 @@ describe('ChatRecordingService', () => {
|
|
|
632
687
|
});
|
|
633
688
|
chatRecordingService.saveSummary('Test summary');
|
|
634
689
|
// writeFileSync should not have been called for any of these
|
|
635
|
-
expect(
|
|
636
|
-
writeFileSyncSpy.mockRestore();
|
|
690
|
+
expect(appendFileSyncSpy).not.toHaveBeenCalled();
|
|
637
691
|
});
|
|
638
|
-
it('should return null from getConversation when recording is disabled', () => {
|
|
639
|
-
chatRecordingService.initialize();
|
|
692
|
+
it('should return null from getConversation when recording is disabled', async () => {
|
|
693
|
+
await chatRecordingService.initialize();
|
|
640
694
|
const enospcError = new Error('ENOSPC: no space left on device');
|
|
641
695
|
enospcError.code = 'ENOSPC';
|
|
642
|
-
|
|
643
|
-
.spyOn(fs, 'writeFileSync')
|
|
644
|
-
.mockImplementation(() => {
|
|
696
|
+
vi.mocked(fs.appendFileSync).mockImplementation(() => {
|
|
645
697
|
throw enospcError;
|
|
646
698
|
});
|
|
647
699
|
// Trigger ENOSPC
|
|
@@ -653,15 +705,12 @@ describe('ChatRecordingService', () => {
|
|
|
653
705
|
// getConversation should return null when disabled
|
|
654
706
|
expect(chatRecordingService.getConversation()).toBeNull();
|
|
655
707
|
expect(chatRecordingService.getConversationFilePath()).toBeNull();
|
|
656
|
-
writeFileSyncSpy.mockRestore();
|
|
657
708
|
});
|
|
658
|
-
it('should still throw for non-ENOSPC errors', () => {
|
|
659
|
-
chatRecordingService.initialize();
|
|
709
|
+
it('should still throw for non-ENOSPC errors', async () => {
|
|
710
|
+
await chatRecordingService.initialize();
|
|
660
711
|
const otherError = new Error('Permission denied');
|
|
661
712
|
otherError.code = 'EACCES';
|
|
662
|
-
|
|
663
|
-
.spyOn(fs, 'writeFileSync')
|
|
664
|
-
.mockImplementation(() => {
|
|
713
|
+
vi.mocked(fs.appendFileSync).mockImplementation(() => {
|
|
665
714
|
throw otherError;
|
|
666
715
|
});
|
|
667
716
|
// Should throw for non-ENOSPC errors
|
|
@@ -672,14 +721,13 @@ describe('ChatRecordingService', () => {
|
|
|
672
721
|
})).toThrow('Permission denied');
|
|
673
722
|
// Recording should NOT be disabled for non-ENOSPC errors (file path still exists)
|
|
674
723
|
expect(chatRecordingService.getConversationFilePath()).not.toBeNull();
|
|
675
|
-
writeFileSyncSpy.mockRestore();
|
|
676
724
|
});
|
|
677
725
|
});
|
|
678
726
|
describe('updateMessagesFromHistory', () => {
|
|
679
|
-
beforeEach(() => {
|
|
680
|
-
chatRecordingService.initialize();
|
|
727
|
+
beforeEach(async () => {
|
|
728
|
+
await chatRecordingService.initialize();
|
|
681
729
|
});
|
|
682
|
-
it('should update tool results from API history (masking sync)', () => {
|
|
730
|
+
it('should update tool results from API history (masking sync)', async () => {
|
|
683
731
|
// 1. Record an initial message and tool call
|
|
684
732
|
chatRecordingService.recordMessage({
|
|
685
733
|
type: 'gemini',
|
|
@@ -724,7 +772,7 @@ describe('ChatRecordingService', () => {
|
|
|
724
772
|
chatRecordingService.updateMessagesFromHistory(history);
|
|
725
773
|
// 4. Verify disk content
|
|
726
774
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
727
|
-
const conversation =
|
|
775
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
728
776
|
const geminiMsg = conversation.messages[0];
|
|
729
777
|
if (geminiMsg.type !== 'gemini')
|
|
730
778
|
throw new Error('Expected gemini message');
|
|
@@ -741,8 +789,8 @@ describe('ChatRecordingService', () => {
|
|
|
741
789
|
output: maskedSnippet,
|
|
742
790
|
});
|
|
743
791
|
});
|
|
744
|
-
it('should preserve multi-modal sibling parts during sync', () => {
|
|
745
|
-
chatRecordingService.initialize();
|
|
792
|
+
it('should preserve multi-modal sibling parts during sync', async () => {
|
|
793
|
+
await chatRecordingService.initialize();
|
|
746
794
|
const callId = 'multi-modal-call';
|
|
747
795
|
const originalResult = [
|
|
748
796
|
{
|
|
@@ -787,7 +835,7 @@ describe('ChatRecordingService', () => {
|
|
|
787
835
|
];
|
|
788
836
|
chatRecordingService.updateMessagesFromHistory(history);
|
|
789
837
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
790
|
-
const conversation =
|
|
838
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
791
839
|
const lastMsg = conversation.messages[0];
|
|
792
840
|
const result = lastMsg.toolCalls[0].result;
|
|
793
841
|
expect(result).toHaveLength(2);
|
|
@@ -797,8 +845,8 @@ describe('ChatRecordingService', () => {
|
|
|
797
845
|
expect(result[1].inlineData).toBeDefined();
|
|
798
846
|
expect(result[1].inlineData.mimeType).toBe('image/png');
|
|
799
847
|
});
|
|
800
|
-
it('should handle parts appearing BEFORE the functionResponse in a content block', () => {
|
|
801
|
-
chatRecordingService.initialize();
|
|
848
|
+
it('should handle parts appearing BEFORE the functionResponse in a content block', async () => {
|
|
849
|
+
await chatRecordingService.initialize();
|
|
802
850
|
const callId = 'prefix-part-call';
|
|
803
851
|
chatRecordingService.recordMessage({
|
|
804
852
|
type: 'gemini',
|
|
@@ -832,21 +880,21 @@ describe('ChatRecordingService', () => {
|
|
|
832
880
|
];
|
|
833
881
|
chatRecordingService.updateMessagesFromHistory(history);
|
|
834
882
|
const sessionFile = chatRecordingService.getConversationFilePath();
|
|
835
|
-
const conversation =
|
|
883
|
+
const conversation = (await loadConversationRecord(sessionFile));
|
|
836
884
|
const lastMsg = conversation.messages[0];
|
|
837
885
|
const result = lastMsg.toolCalls[0].result;
|
|
838
886
|
expect(result).toHaveLength(2);
|
|
839
887
|
expect(result[0].text).toBe('Prefix metadata or text');
|
|
840
888
|
expect(result[1].functionResponse.id).toBe(callId);
|
|
841
889
|
});
|
|
842
|
-
it('should not write to disk when no tool calls match', () => {
|
|
890
|
+
it('should not write to disk when no tool calls match', async () => {
|
|
843
891
|
chatRecordingService.recordMessage({
|
|
844
892
|
type: 'gemini',
|
|
845
893
|
content: 'Response with no tool calls',
|
|
846
894
|
model: 'gemini-pro',
|
|
847
895
|
});
|
|
848
|
-
const
|
|
849
|
-
|
|
896
|
+
const appendFileSyncSpy = vi.mocked(fs.appendFileSync);
|
|
897
|
+
appendFileSyncSpy.mockClear();
|
|
850
898
|
// History with a tool call ID that doesn't exist in the conversation
|
|
851
899
|
const history = [
|
|
852
900
|
{
|
|
@@ -864,15 +912,14 @@ describe('ChatRecordingService', () => {
|
|
|
864
912
|
];
|
|
865
913
|
chatRecordingService.updateMessagesFromHistory(history);
|
|
866
914
|
// No tool calls matched, so writeFileSync should NOT have been called
|
|
867
|
-
expect(
|
|
868
|
-
writeFileSyncSpy.mockRestore();
|
|
915
|
+
expect(appendFileSyncSpy).not.toHaveBeenCalled();
|
|
869
916
|
});
|
|
870
917
|
});
|
|
871
918
|
describe('ENOENT (missing directory) handling', () => {
|
|
872
|
-
it('should ensure directory exists before writing conversation file', () => {
|
|
873
|
-
chatRecordingService.initialize();
|
|
874
|
-
const mkdirSyncSpy = vi.
|
|
875
|
-
const
|
|
919
|
+
it('should ensure directory exists before writing conversation file', async () => {
|
|
920
|
+
await chatRecordingService.initialize();
|
|
921
|
+
const mkdirSyncSpy = vi.mocked(fs.mkdirSync);
|
|
922
|
+
const appendFileSyncSpy = vi.mocked(fs.appendFileSync);
|
|
876
923
|
chatRecordingService.recordMessage({
|
|
877
924
|
type: 'user',
|
|
878
925
|
content: 'Hello after dir cleanup',
|
|
@@ -883,12 +930,11 @@ describe('ChatRecordingService', () => {
|
|
|
883
930
|
expect(mkdirSyncSpy).toHaveBeenCalledWith(path.dirname(conversationFile), { recursive: true });
|
|
884
931
|
// mkdirSync should be called before writeFileSync
|
|
885
932
|
const mkdirCallOrder = mkdirSyncSpy.mock.invocationCallOrder;
|
|
886
|
-
const writeCallOrder =
|
|
933
|
+
const writeCallOrder = appendFileSyncSpy.mock.invocationCallOrder;
|
|
887
934
|
const lastMkdir = mkdirCallOrder[mkdirCallOrder.length - 1];
|
|
888
935
|
const lastWrite = writeCallOrder[writeCallOrder.length - 1];
|
|
889
936
|
expect(lastMkdir).toBeLessThan(lastWrite);
|
|
890
937
|
mkdirSyncSpy.mockRestore();
|
|
891
|
-
writeFileSyncSpy.mockRestore();
|
|
892
938
|
});
|
|
893
939
|
});
|
|
894
940
|
});
|