@machina.ai/cell-cli-core 1.41.1-rc2 → 1.45.1-rc1
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/changelogs/index.md +63 -0
- package/dist/docs/changelogs/latest.md +200 -244
- package/dist/docs/changelogs/preview.md +198 -385
- package/dist/docs/cli/auto-memory.md +61 -40
- package/dist/docs/cli/cli-reference.md +2 -1
- package/dist/docs/cli/creating-skills.md +165 -38
- package/dist/docs/cli/custom-commands.md +1 -0
- package/dist/docs/cli/gemini-md.md +0 -3
- package/dist/docs/cli/model-routing.md +3 -3
- package/dist/docs/cli/plan-mode.md +2 -2
- package/dist/docs/cli/settings.md +20 -19
- package/dist/docs/cli/skills-best-practices.md +78 -0
- package/dist/docs/cli/skills.md +98 -176
- package/dist/docs/cli/tutorials/memory-management.md +3 -3
- package/dist/docs/cli/tutorials/session-management.md +13 -0
- package/dist/docs/cli/tutorials/skills-getting-started.md +140 -92
- package/dist/docs/cli/using-agent-skills.md +90 -0
- package/dist/docs/core/gemma-setup.md +83 -0
- package/dist/docs/core/index.md +3 -2
- package/dist/docs/core/local-model-routing.md +14 -7
- package/dist/docs/extensions/reference.md +16 -0
- package/dist/docs/extensions/releasing.md +58 -24
- package/dist/docs/extensions/writing-extensions.md +7 -0
- package/dist/docs/get-started/installation.mdx +2 -2
- package/dist/docs/model-routing-spec.md +683 -0
- package/dist/docs/reference/commands.md +14 -7
- package/dist/docs/reference/configuration.md +264 -88
- package/dist/docs/reference/keyboard-shortcuts.md +24 -1
- package/dist/docs/reference/policy-engine.md +14 -3
- package/dist/docs/reference/tools.md +48 -1
- package/dist/docs/releases.md +2 -2
- package/dist/docs/sidebar.json +24 -2
- package/dist/docs/tools/activate-skill.md +1 -1
- package/dist/docs/tools/mcp-server.md +24 -3
- package/dist/docs/tools/memory.md +10 -13
- package/dist/docs/tools/shell.md +17 -0
- package/dist/package.json +18 -18
- package/dist/src/agent/content-utils.js +6 -1
- package/dist/src/agent/content-utils.js.map +1 -1
- package/dist/src/agent/content-utils.test.js +5 -1
- package/dist/src/agent/content-utils.test.js.map +1 -1
- package/dist/src/agent/event-translator.js +8 -7
- package/dist/src/agent/event-translator.js.map +1 -1
- package/dist/src/agent/event-translator.test.js +2 -2
- package/dist/src/agent/event-translator.test.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.js +5 -1
- package/dist/src/agent/legacy-agent-session.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.test.js +11 -3
- package/dist/src/agent/legacy-agent-session.test.js.map +1 -1
- package/dist/src/agent/tool-display-utils.d.ts +3 -2
- package/dist/src/agent/tool-display-utils.js +3 -2
- package/dist/src/agent/tool-display-utils.js.map +1 -1
- package/dist/src/agent/types.d.ts +33 -3
- package/dist/src/agents/a2aUtils.d.ts +1 -1
- package/dist/src/agents/a2aUtils.js +5 -4
- package/dist/src/agents/a2aUtils.js.map +1 -1
- package/dist/src/agents/a2aUtils.test.js +18 -0
- package/dist/src/agents/a2aUtils.test.js.map +1 -1
- package/dist/src/agents/agent-tool.d.ts +3 -1
- package/dist/src/agents/agent-tool.js +19 -3
- package/dist/src/agents/agent-tool.js.map +1 -1
- package/dist/src/agents/agent-tool.test.js +76 -0
- package/dist/src/agents/agent-tool.test.js.map +1 -1
- package/dist/src/agents/agentLoader.d.ts +127 -22
- package/dist/src/agents/agentLoader.js +20 -0
- package/dist/src/agents/agentLoader.js.map +1 -1
- package/dist/src/agents/agentLoader.test.js +60 -0
- package/dist/src/agents/agentLoader.test.js.map +1 -1
- package/dist/src/agents/auth-provider/types.d.ts +5 -0
- package/dist/src/agents/browser/browserAgentInvocation.js +24 -19
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
- package/dist/src/agents/browser/snapshotSuperseder.js +11 -8
- package/dist/src/agents/browser/snapshotSuperseder.js.map +1 -1
- package/dist/src/agents/browser/snapshotSuperseder.test.js +6 -1
- package/dist/src/agents/browser/snapshotSuperseder.test.js.map +1 -1
- package/dist/src/agents/generalist-agent.js +8 -1
- package/dist/src/agents/generalist-agent.js.map +1 -1
- package/dist/src/agents/generalist-agent.test.js +24 -0
- package/dist/src/agents/generalist-agent.test.js.map +1 -1
- package/dist/src/agents/local-executor.d.ts +1 -0
- package/dist/src/agents/local-executor.js +76 -45
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +199 -27
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/local-invocation.d.ts +1 -1
- package/dist/src/agents/local-invocation.js +47 -48
- package/dist/src/agents/local-invocation.js.map +1 -1
- package/dist/src/agents/local-invocation.test.js +13 -15
- package/dist/src/agents/local-invocation.test.js.map +1 -1
- package/dist/src/agents/local-session-invocation.d.ts +51 -0
- package/dist/src/agents/local-session-invocation.js +320 -0
- package/dist/src/agents/local-session-invocation.js.map +1 -0
- package/dist/src/agents/local-session-invocation.test.js +512 -0
- package/dist/src/agents/local-session-invocation.test.js.map +1 -0
- package/dist/src/agents/local-subagent-protocol.d.ts +18 -0
- package/dist/src/agents/local-subagent-protocol.js +357 -0
- package/dist/src/agents/local-subagent-protocol.js.map +1 -0
- package/dist/src/agents/local-subagent-protocol.test.js +676 -0
- package/dist/src/agents/local-subagent-protocol.test.js.map +1 -0
- package/dist/src/agents/registry.d.ts +8 -4
- package/dist/src/agents/registry.js +112 -47
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/agents/registry.test.js +9 -20
- package/dist/src/agents/registry.test.js.map +1 -1
- package/dist/src/agents/remote-invocation.js +6 -6
- package/dist/src/agents/remote-invocation.js.map +1 -1
- package/dist/src/agents/remote-invocation.test.js +23 -12
- package/dist/src/agents/remote-invocation.test.js.map +1 -1
- package/dist/src/agents/remote-session-invocation.d.ts +48 -0
- package/dist/src/agents/remote-session-invocation.js +193 -0
- package/dist/src/agents/remote-session-invocation.js.map +1 -0
- package/dist/src/agents/remote-session-invocation.test.d.ts +6 -0
- package/dist/src/agents/remote-session-invocation.test.js +405 -0
- package/dist/src/agents/remote-session-invocation.test.js.map +1 -0
- package/dist/src/agents/remote-subagent-protocol.d.ts +42 -0
- package/dist/src/agents/remote-subagent-protocol.js +348 -0
- package/dist/src/agents/remote-subagent-protocol.js.map +1 -0
- package/dist/src/agents/remote-subagent-protocol.test.d.ts +6 -0
- package/dist/src/agents/remote-subagent-protocol.test.js +652 -0
- package/dist/src/agents/remote-subagent-protocol.test.js.map +1 -0
- package/dist/src/agents/skill-extraction-agent.d.ts +8 -1
- package/dist/src/agents/skill-extraction-agent.js +171 -21
- package/dist/src/agents/skill-extraction-agent.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.test.js +66 -2
- package/dist/src/agents/skill-extraction-agent.test.js.map +1 -1
- package/dist/src/agents/types.d.ts +38 -2
- package/dist/src/agents/types.js +7 -0
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/availability/autoRoutingFallback.integration.test.d.ts +6 -0
- package/dist/src/availability/autoRoutingFallback.integration.test.js +288 -0
- package/dist/src/availability/autoRoutingFallback.integration.test.js.map +1 -0
- package/dist/src/availability/fallbackIntegration.test.js +29 -0
- package/dist/src/availability/fallbackIntegration.test.js.map +1 -1
- package/dist/src/availability/modelAvailabilityService.d.ts +6 -6
- package/dist/src/availability/modelAvailabilityService.js +16 -8
- package/dist/src/availability/modelAvailabilityService.js.map +1 -1
- package/dist/src/availability/modelAvailabilityService.test.js +39 -0
- package/dist/src/availability/modelAvailabilityService.test.js.map +1 -1
- package/dist/src/availability/modelPolicy.d.ts +1 -0
- package/dist/src/availability/policyCatalog.d.ts +2 -0
- package/dist/src/availability/policyCatalog.js +38 -9
- package/dist/src/availability/policyCatalog.js.map +1 -1
- package/dist/src/availability/policyCatalog.test.js +5 -4
- package/dist/src/availability/policyCatalog.test.js.map +1 -1
- package/dist/src/availability/policyHelpers.js +42 -27
- package/dist/src/availability/policyHelpers.js.map +1 -1
- package/dist/src/availability/policyHelpers.test.js +47 -7
- package/dist/src/availability/policyHelpers.test.js.map +1 -1
- package/dist/src/availability/testUtils.js +1 -1
- package/dist/src/availability/testUtils.js.map +1 -1
- package/dist/src/code_assist/admin/admin_controls.js +3 -1
- package/dist/src/code_assist/admin/admin_controls.js.map +1 -1
- package/dist/src/code_assist/experiments/flagNames.d.ts +1 -1
- package/dist/src/code_assist/experiments/flagNames.js +1 -1
- package/dist/src/code_assist/experiments/flagNames.js.map +1 -1
- package/dist/src/code_assist/oauth-credential-storage.js +12 -3
- package/dist/src/code_assist/oauth-credential-storage.js.map +1 -1
- package/dist/src/code_assist/oauth-credential-storage.test.js +29 -2
- package/dist/src/code_assist/oauth-credential-storage.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +12 -3
- package/dist/src/code_assist/oauth2.js.map +1 -1
- package/dist/src/code_assist/oauth2.test.js +38 -0
- package/dist/src/code_assist/oauth2.test.js.map +1 -1
- package/dist/src/code_assist/setup.d.ts +3 -0
- package/dist/src/code_assist/setup.js +9 -0
- package/dist/src/code_assist/setup.js.map +1 -1
- package/dist/src/code_assist/setup.test.js +10 -1
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/commands/memory.d.ts +83 -2
- package/dist/src/commands/memory.js +479 -28
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/memory.test.js +414 -58
- package/dist/src/commands/memory.test.js.map +1 -1
- package/dist/src/config/config.d.ts +61 -37
- package/dist/src/config/config.js +294 -101
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +365 -113
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +185 -61
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/flashFallback.test.js +31 -0
- package/dist/src/config/flashFallback.test.js.map +1 -1
- package/dist/src/config/models.d.ts +20 -10
- package/dist/src/config/models.js +105 -34
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/models.test.js +204 -47
- package/dist/src/config/models.test.js.map +1 -1
- package/dist/src/config/projectRegistry.d.ts +1 -0
- package/dist/src/config/projectRegistry.js +14 -3
- package/dist/src/config/projectRegistry.js.map +1 -1
- package/dist/src/config/projectRegistry.test.js +43 -0
- package/dist/src/config/projectRegistry.test.js.map +1 -1
- package/dist/src/config/scoped-config.d.ts +22 -0
- package/dist/src/config/scoped-config.js +32 -0
- package/dist/src/config/scoped-config.js.map +1 -1
- package/dist/src/config/storage.d.ts +0 -1
- package/dist/src/config/storage.js +0 -3
- package/dist/src/config/storage.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.d.ts +3 -1
- package/dist/src/confirmation-bus/message-bus.js +14 -5
- package/dist/src/confirmation-bus/message-bus.js.map +1 -1
- package/dist/src/confirmation-bus/message-bus.test.js +34 -0
- package/dist/src/confirmation-bus/message-bus.test.js.map +1 -1
- package/dist/src/context/chatCompressionService.js +7 -5
- package/dist/src/context/chatCompressionService.js.map +1 -1
- package/dist/src/context/chatCompressionService.test.js +1 -1
- package/dist/src/context/chatCompressionService.test.js.map +1 -1
- package/dist/src/context/config/configLoader.js +4 -1
- package/dist/src/context/config/configLoader.js.map +1 -1
- package/dist/src/context/config/profiles.d.ts +10 -0
- package/dist/src/context/config/profiles.js +98 -3
- package/dist/src/context/config/profiles.js.map +1 -1
- package/dist/src/context/config/schema.d.ts +4 -0
- package/dist/src/context/config/schema.js +4 -0
- package/dist/src/context/config/schema.js.map +1 -1
- package/dist/src/context/config/types.d.ts +13 -1
- package/dist/src/context/contextCompressionService.test.js +7 -3
- package/dist/src/context/contextCompressionService.test.js.map +1 -1
- package/dist/src/context/contextManager.barrier.test.js +39 -16
- package/dist/src/context/contextManager.barrier.test.js.map +1 -1
- package/dist/src/context/contextManager.d.ts +25 -28
- package/dist/src/context/contextManager.hotstart.test.d.ts +6 -0
- package/dist/src/context/contextManager.hotstart.test.js +65 -0
- package/dist/src/context/contextManager.hotstart.test.js.map +1 -0
- package/dist/src/context/contextManager.incremental.test.d.ts +6 -0
- package/dist/src/context/contextManager.incremental.test.js +101 -0
- package/dist/src/context/contextManager.incremental.test.js.map +1 -0
- package/dist/src/context/contextManager.js +276 -79
- package/dist/src/context/contextManager.js.map +1 -1
- package/dist/src/context/contextManager.test.d.ts +6 -0
- package/dist/src/context/contextManager.test.js +142 -0
- package/dist/src/context/contextManager.test.js.map +1 -0
- package/dist/src/context/eventBus.d.ts +13 -0
- package/dist/src/context/eventBus.js +12 -0
- package/dist/src/context/eventBus.js.map +1 -1
- package/dist/src/context/graph/behaviorRegistry.d.ts +4 -12
- package/dist/src/context/graph/behaviorRegistry.js.map +1 -1
- package/dist/src/context/graph/builtinBehaviors.d.ts +6 -1
- package/dist/src/context/graph/builtinBehaviors.js +23 -108
- package/dist/src/context/graph/builtinBehaviors.js.map +1 -1
- package/dist/src/context/graph/fromGraph.d.ts +8 -3
- package/dist/src/context/graph/fromGraph.js +46 -30
- package/dist/src/context/graph/fromGraph.js.map +1 -1
- package/dist/src/context/graph/fromGraph.test.d.ts +6 -0
- package/dist/src/context/graph/fromGraph.test.js +186 -0
- package/dist/src/context/graph/fromGraph.test.js.map +1 -0
- package/dist/src/context/graph/mapper.d.ts +8 -10
- package/dist/src/context/graph/mapper.js +11 -19
- package/dist/src/context/graph/mapper.js.map +1 -1
- package/dist/src/context/graph/mapper.test.d.ts +6 -0
- package/dist/src/context/graph/mapper.test.js +101 -0
- package/dist/src/context/graph/mapper.test.js.map +1 -0
- package/dist/src/context/graph/nodeIdService.d.ts +17 -0
- package/dist/src/context/graph/nodeIdService.js +24 -0
- package/dist/src/context/graph/nodeIdService.js.map +1 -0
- package/dist/src/context/graph/render.d.ts +24 -5
- package/dist/src/context/graph/render.js +129 -34
- package/dist/src/context/graph/render.js.map +1 -1
- package/dist/src/context/graph/render.test.d.ts +6 -0
- package/dist/src/context/graph/render.test.js +280 -0
- package/dist/src/context/graph/render.test.js.map +1 -0
- package/dist/src/context/graph/toGraph.d.ts +16 -14
- package/dist/src/context/graph/toGraph.js +180 -202
- package/dist/src/context/graph/toGraph.js.map +1 -1
- package/dist/src/context/graph/toGraph.test.d.ts +6 -0
- package/dist/src/context/graph/toGraph.test.js +116 -0
- package/dist/src/context/graph/toGraph.test.js.map +1 -0
- package/dist/src/context/graph/types.d.ts +36 -73
- package/dist/src/context/graph/types.js +23 -14
- package/dist/src/context/graph/types.js.map +1 -1
- package/dist/src/context/initializer.js +26 -5
- package/dist/src/context/initializer.js.map +1 -1
- package/dist/src/context/pipeline/contextWorkingBuffer.d.ts +5 -8
- package/dist/src/context/pipeline/contextWorkingBuffer.js +105 -35
- package/dist/src/context/pipeline/contextWorkingBuffer.js.map +1 -1
- package/dist/src/context/pipeline/contextWorkingBuffer.test.js +81 -13
- package/dist/src/context/pipeline/contextWorkingBuffer.test.js.map +1 -1
- package/dist/src/context/pipeline/environment.d.ts +4 -0
- package/dist/src/context/pipeline/environmentImpl.d.ts +6 -5
- package/dist/src/context/pipeline/environmentImpl.js +7 -9
- package/dist/src/context/pipeline/environmentImpl.js.map +1 -1
- package/dist/src/context/pipeline/environmentImpl.test.js +5 -1
- package/dist/src/context/pipeline/environmentImpl.test.js.map +1 -1
- package/dist/src/context/pipeline/orchestrator.d.ts +20 -6
- package/dist/src/context/pipeline/orchestrator.js +97 -80
- package/dist/src/context/pipeline/orchestrator.js.map +1 -1
- package/dist/src/context/pipeline/orchestrator.test.js +33 -36
- package/dist/src/context/pipeline/orchestrator.test.js.map +1 -1
- package/dist/src/context/pipeline.d.ts +0 -1
- package/dist/src/context/processors/blobDegradationProcessor.js +43 -84
- package/dist/src/context/processors/blobDegradationProcessor.js.map +1 -1
- package/dist/src/context/processors/blobDegradationProcessor.test.js +33 -37
- package/dist/src/context/processors/blobDegradationProcessor.test.js.map +1 -1
- package/dist/src/context/processors/nodeDistillationProcessor.js +58 -80
- package/dist/src/context/processors/nodeDistillationProcessor.js.map +1 -1
- package/dist/src/context/processors/nodeDistillationProcessor.test.js +21 -15
- package/dist/src/context/processors/nodeDistillationProcessor.test.js.map +1 -1
- package/dist/src/context/processors/nodeTruncationProcessor.js +16 -60
- package/dist/src/context/processors/nodeTruncationProcessor.js.map +1 -1
- package/dist/src/context/processors/nodeTruncationProcessor.test.js +16 -19
- package/dist/src/context/processors/nodeTruncationProcessor.test.js.map +1 -1
- package/dist/src/context/processors/rollingSummaryProcessor.js +12 -25
- package/dist/src/context/processors/rollingSummaryProcessor.js.map +1 -1
- package/dist/src/context/processors/rollingSummaryProcessor.test.js +10 -9
- package/dist/src/context/processors/rollingSummaryProcessor.test.js.map +1 -1
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.d.ts +7 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.js +37 -19
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.js.map +1 -1
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js +35 -10
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js.map +1 -1
- package/dist/src/context/processors/stateSnapshotProcessor.d.ts +2 -0
- package/dist/src/context/processors/stateSnapshotProcessor.js +53 -21
- package/dist/src/context/processors/stateSnapshotProcessor.js.map +1 -1
- package/dist/src/context/processors/stateSnapshotProcessor.test.js +52 -12
- package/dist/src/context/processors/stateSnapshotProcessor.test.js.map +1 -1
- package/dist/src/context/processors/toolMaskingProcessor.js +96 -117
- package/dist/src/context/processors/toolMaskingProcessor.js.map +1 -1
- package/dist/src/context/processors/toolMaskingProcessor.test.js +50 -17
- package/dist/src/context/processors/toolMaskingProcessor.test.js.map +1 -1
- package/dist/src/context/system-tests/hysteresis.test.d.ts +6 -0
- package/dist/src/context/system-tests/hysteresis.test.js +100 -0
- package/dist/src/context/system-tests/hysteresis.test.js.map +1 -0
- package/dist/src/context/system-tests/lifecycle.golden.test.js +107 -72
- package/dist/src/context/system-tests/lifecycle.golden.test.js.map +1 -1
- package/dist/src/context/system-tests/powerUserLifecycle.test.d.ts +6 -0
- package/dist/src/context/system-tests/powerUserLifecycle.test.js +91 -0
- package/dist/src/context/system-tests/powerUserLifecycle.test.js.map +1 -0
- package/dist/src/context/system-tests/simulationHarness.d.ts +2 -5
- package/dist/src/context/system-tests/simulationHarness.js +34 -35
- package/dist/src/context/system-tests/simulationHarness.js.map +1 -1
- package/dist/src/context/testing/contextTestUtils.d.ts +5 -3
- package/dist/src/context/testing/contextTestUtils.js +74 -53
- package/dist/src/context/testing/contextTestUtils.js.map +1 -1
- package/dist/src/context/testing/testProfile.js +1 -0
- package/dist/src/context/testing/testProfile.js.map +1 -1
- package/dist/src/context/toolOutputMaskingService.js +1 -2
- package/dist/src/context/toolOutputMaskingService.js.map +1 -1
- package/dist/src/context/toolOutputMaskingService.test.js +5 -20
- package/dist/src/context/toolOutputMaskingService.test.js.map +1 -1
- package/dist/src/context/utils/adaptiveTokenCalculator.d.ts +70 -0
- package/dist/src/context/utils/adaptiveTokenCalculator.js +138 -0
- package/dist/src/context/utils/adaptiveTokenCalculator.js.map +1 -0
- package/dist/src/context/utils/adaptiveTokenCalculator.test.d.ts +6 -0
- package/dist/src/context/utils/adaptiveTokenCalculator.test.js +129 -0
- package/dist/src/context/utils/adaptiveTokenCalculator.test.js.map +1 -0
- package/dist/src/context/utils/contextTokenCalculator.d.ts +63 -2
- package/dist/src/context/utils/contextTokenCalculator.js +80 -5
- package/dist/src/context/utils/contextTokenCalculator.js.map +1 -1
- package/dist/src/context/utils/contextTokenCalculator.test.d.ts +6 -0
- package/dist/src/context/utils/contextTokenCalculator.test.js +54 -0
- package/dist/src/context/utils/contextTokenCalculator.test.js.map +1 -0
- package/dist/src/context/utils/formatNodesForLlm.d.ts +21 -0
- package/dist/src/context/utils/formatNodesForLlm.js +69 -0
- package/dist/src/context/utils/formatNodesForLlm.js.map +1 -0
- package/dist/src/context/utils/formatNodesForLlm.test.d.ts +6 -0
- package/dist/src/context/utils/formatNodesForLlm.test.js +110 -0
- package/dist/src/context/utils/formatNodesForLlm.test.js.map +1 -0
- package/dist/src/context/utils/invariantChecker.d.ts +11 -0
- package/dist/src/context/utils/invariantChecker.js +36 -0
- package/dist/src/context/utils/invariantChecker.js.map +1 -0
- package/dist/src/context/utils/snapshotGenerator.d.ts +43 -1
- package/dist/src/context/utils/snapshotGenerator.js +332 -33
- package/dist/src/context/utils/snapshotGenerator.js.map +1 -1
- package/dist/src/context/utils/snapshotGenerator.test.d.ts +6 -0
- package/dist/src/context/utils/snapshotGenerator.test.js +362 -0
- package/dist/src/context/utils/snapshotGenerator.test.js.map +1 -0
- package/dist/src/context/utils/tokenCalibration.d.ts +9 -0
- package/dist/src/context/utils/tokenCalibration.js +30 -0
- package/dist/src/context/utils/tokenCalibration.js.map +1 -0
- package/dist/src/core/agentChatHistory.d.ts +29 -14
- package/dist/src/core/agentChatHistory.js +27 -27
- package/dist/src/core/agentChatHistory.js.map +1 -1
- package/dist/src/core/baseLlmClient.d.ts +8 -0
- package/dist/src/core/baseLlmClient.js +23 -3
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/baseLlmClient.test.js +27 -23
- package/dist/src/core/baseLlmClient.test.js.map +1 -1
- package/dist/src/core/client.d.ts +7 -5
- package/dist/src/core/client.js +65 -40
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +35 -131
- package/dist/src/core/client.test.js.map +1 -1
- package/dist/src/core/contentGenerator.js +46 -21
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/contentGenerator.test.js +191 -13
- package/dist/src/core/contentGenerator.test.js.map +1 -1
- package/dist/src/core/fakeContentGenerator.d.ts +15 -3
- package/dist/src/core/fakeContentGenerator.js +29 -9
- package/dist/src/core/fakeContentGenerator.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +18 -7
- package/dist/src/core/geminiChat.js +312 -54
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +448 -54
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/geminiChat_network_retry.test.js +39 -0
- package/dist/src/core/geminiChat_network_retry.test.js.map +1 -1
- package/dist/src/core/localLiteRtLmClient.js +6 -2
- package/dist/src/core/localLiteRtLmClient.js.map +1 -1
- package/dist/src/core/prompts.test.js +12 -7
- package/dist/src/core/prompts.test.js.map +1 -1
- package/dist/src/core/turn.d.ts +7 -2
- package/dist/src/core/turn.js +61 -4
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +19 -10
- package/dist/src/core/turn.test.js.map +1 -1
- package/dist/src/fallback/handler.js +16 -6
- package/dist/src/fallback/handler.js.map +1 -1
- package/dist/src/fallback/handler.test.js +8 -2
- package/dist/src/fallback/handler.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/hookEventHandler.js +3 -2
- package/dist/src/hooks/hookEventHandler.js.map +1 -1
- package/dist/src/hooks/hookEventHandler.test.js +80 -0
- package/dist/src/hooks/hookEventHandler.test.js.map +1 -1
- package/dist/src/hooks/hookRunner.test.js +3 -3
- package/dist/src/hooks/hookRunner.test.js.map +1 -1
- package/dist/src/hooks/hookTranslator.js +95 -5
- package/dist/src/hooks/hookTranslator.js.map +1 -1
- package/dist/src/hooks/hookTranslator.test.js +171 -0
- package/dist/src/hooks/hookTranslator.test.js.map +1 -1
- package/dist/src/ide/ide-client.js +5 -3
- package/dist/src/ide/ide-client.js.map +1 -1
- package/dist/src/ide/ide-connection-utils.js +12 -10
- package/dist/src/ide/ide-connection-utils.js.map +1 -1
- package/dist/src/ide/ide-connection-utils.test.js +25 -2
- package/dist/src/ide/ide-connection-utils.test.js.map +1 -1
- package/dist/src/ide/types.d.ts +16 -16
- package/dist/src/index.d.ts +5 -2
- package/dist/src/index.js +5 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/mcp/oauth-provider.d.ts +8 -0
- package/dist/src/mcp/oauth-provider.js +41 -0
- package/dist/src/mcp/oauth-provider.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.js +7 -1
- package/dist/src/mcp/oauth-token-storage.js.map +1 -1
- package/dist/src/mcp/oauth-token-storage.test.js +55 -0
- package/dist/src/mcp/oauth-token-storage.test.js.map +1 -1
- package/dist/src/mcp/stored-token-provider.d.ts +27 -0
- package/dist/src/mcp/stored-token-provider.js +76 -0
- package/dist/src/mcp/stored-token-provider.js.map +1 -0
- package/dist/src/mcp/token-storage/keychain-token-storage.js +2 -2
- package/dist/src/mcp/token-storage/keychain-token-storage.js.map +1 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.test.js +14 -1
- package/dist/src/mcp/token-storage/keychain-token-storage.test.js.map +1 -1
- package/dist/src/output/json-formatter.d.ts +1 -1
- package/dist/src/output/json-formatter.js +4 -1
- package/dist/src/output/json-formatter.js.map +1 -1
- package/dist/src/output/json-formatter.test.js +7 -0
- package/dist/src/output/json-formatter.test.js.map +1 -1
- package/dist/src/output/types.d.ts +1 -0
- package/dist/src/output/types.js.map +1 -1
- package/dist/src/policy/config.js +25 -0
- package/dist/src/policy/config.js.map +1 -1
- package/dist/src/policy/config.test.js +80 -0
- package/dist/src/policy/config.test.js.map +1 -1
- package/dist/src/policy/core-tools-mapping.test.js +9 -1
- package/dist/src/policy/core-tools-mapping.test.js.map +1 -1
- package/dist/src/policy/policies/plan.toml +1 -1
- package/dist/src/policy/policies/write.toml +0 -7
- package/dist/src/policy/policy-engine.test.js +0 -8
- package/dist/src/policy/policy-engine.test.js.map +1 -1
- package/dist/src/policy/sandboxPolicyManager.d.ts +20 -20
- package/dist/src/policy/stable-stringify.js +10 -6
- package/dist/src/policy/stable-stringify.js.map +1 -1
- package/dist/src/policy/stable-stringify.test.js +157 -0
- package/dist/src/policy/stable-stringify.test.js.map +1 -0
- package/dist/src/policy/types.d.ts +1 -0
- package/dist/src/policy/types.js.map +1 -1
- package/dist/src/prompts/promptProvider.js +8 -9
- package/dist/src/prompts/promptProvider.js.map +1 -1
- package/dist/src/prompts/promptProvider.test.js +3 -1
- package/dist/src/prompts/promptProvider.test.js.map +1 -1
- package/dist/src/prompts/snippets-memory.test.d.ts +6 -0
- package/dist/src/prompts/{snippets-memory-v2.test.js → snippets-memory.test.js} +5 -23
- package/dist/src/prompts/snippets-memory.test.js.map +1 -0
- package/dist/src/prompts/snippets.d.ts +6 -11
- package/dist/src/prompts/snippets.js +28 -30
- package/dist/src/prompts/snippets.js.map +1 -1
- package/dist/src/prompts/snippets.legacy.d.ts +0 -1
- package/dist/src/prompts/snippets.legacy.js +8 -15
- package/dist/src/prompts/snippets.legacy.js.map +1 -1
- package/dist/src/routing/strategies/approvalModeStrategy.js +5 -3
- package/dist/src/routing/strategies/approvalModeStrategy.js.map +1 -1
- package/dist/src/routing/strategies/approvalModeStrategy.test.js +9 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.js +18 -4
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js +77 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/defaultStrategy.js +1 -1
- package/dist/src/routing/strategies/defaultStrategy.js.map +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.js +1 -1
- package/dist/src/routing/strategies/fallbackStrategy.js.map +1 -1
- package/dist/src/routing/strategies/gemmaClassifierStrategy.js +7 -1
- package/dist/src/routing/strategies/gemmaClassifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js +15 -1
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/numericalClassifierStrategy.d.ts +1 -0
- package/dist/src/routing/strategies/numericalClassifierStrategy.js +32 -5
- package/dist/src/routing/strategies/numericalClassifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/numericalClassifierStrategy.test.js +247 -25
- package/dist/src/routing/strategies/numericalClassifierStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js +1 -1
- package/dist/src/routing/strategies/overrideStrategy.js.map +1 -1
- package/dist/src/sandbox/utils/commandSafety.js +22 -2
- package/dist/src/sandbox/utils/commandSafety.js.map +1 -1
- package/dist/src/sandbox/utils/commandSafety.test.d.ts +6 -0
- package/dist/src/sandbox/utils/commandSafety.test.js +85 -0
- package/dist/src/sandbox/utils/commandSafety.test.js.map +1 -0
- package/dist/src/scheduler/confirmation.test.js +29 -0
- package/dist/src/scheduler/confirmation.test.js.map +1 -1
- package/dist/src/scheduler/scheduler.js +15 -0
- package/dist/src/scheduler/scheduler.js.map +1 -1
- package/dist/src/scheduler/scheduler.test.js +1 -1
- package/dist/src/scheduler/scheduler.test.js.map +1 -1
- package/dist/src/scheduler/scheduler_parallel.test.js +37 -0
- package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -1
- package/dist/src/scheduler/state-manager.js +5 -1
- package/dist/src/scheduler/state-manager.js.map +1 -1
- package/dist/src/scheduler/tool-executor.js +7 -4
- package/dist/src/scheduler/tool-executor.js.map +1 -1
- package/dist/src/scheduler/types.d.ts +5 -1
- package/dist/src/scheduler/types.js.map +1 -1
- package/dist/src/services/chatRecordingService.d.ts +14 -7
- package/dist/src/services/chatRecordingService.js +157 -133
- package/dist/src/services/chatRecordingService.js.map +1 -1
- package/dist/src/services/chatRecordingService.test.js +189 -52
- package/dist/src/services/chatRecordingService.test.js.map +1 -1
- package/dist/src/services/fileDiscoveryService.js +2 -1
- package/dist/src/services/fileDiscoveryService.js.map +1 -1
- package/dist/src/services/fileDiscoveryService.test.js +36 -0
- package/dist/src/services/fileDiscoveryService.test.js.map +1 -1
- package/dist/src/services/gitService.js +43 -4
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/gitService.test.js +105 -1
- package/dist/src/services/gitService.test.js.map +1 -1
- package/dist/src/services/keychainService.js +14 -5
- package/dist/src/services/keychainService.js.map +1 -1
- package/dist/src/services/memoryPatchUtils.d.ts +93 -0
- package/dist/src/services/memoryPatchUtils.js +310 -2
- package/dist/src/services/memoryPatchUtils.js.map +1 -1
- package/dist/src/services/memoryService.d.ts +2 -0
- package/dist/src/services/memoryService.js +214 -9
- package/dist/src/services/memoryService.js.map +1 -1
- package/dist/src/services/memoryService.test.js +133 -0
- package/dist/src/services/memoryService.test.js.map +1 -1
- package/dist/src/services/modelConfigService.d.ts +3 -0
- package/dist/src/services/modelConfigService.js +22 -13
- package/dist/src/services/modelConfigService.js.map +1 -1
- package/dist/src/services/modelConfigService.test.js +73 -0
- package/dist/src/services/modelConfigService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.js +88 -41
- package/dist/src/services/shellExecutionService.js.map +1 -1
- package/dist/src/services/shellExecutionService.test.js +22 -9
- package/dist/src/services/shellExecutionService.test.js.map +1 -1
- package/dist/src/services/shellExecutionService.windows.integration.test.d.ts +6 -0
- package/dist/src/services/shellExecutionService.windows.integration.test.js +63 -0
- package/dist/src/services/shellExecutionService.windows.integration.test.js.map +1 -0
- package/dist/src/services/test-data/resolved-aliases-retry.golden.json +85 -7
- package/dist/src/services/test-data/resolved-aliases.golden.json +85 -7
- package/dist/src/services/trackerTypes.d.ts +4 -4
- package/dist/src/skills/skillManager.d.ts +4 -0
- package/dist/src/skills/skillManager.js +6 -0
- package/dist/src/skills/skillManager.js.map +1 -1
- package/dist/src/skills/skillManager.test.js +10 -0
- package/dist/src/skills/skillManager.test.js.map +1 -1
- package/dist/src/telemetry/file-exporters.d.ts +4 -1
- package/dist/src/telemetry/file-exporters.js +21 -3
- package/dist/src/telemetry/file-exporters.js.map +1 -1
- package/dist/src/telemetry/file-exporters.test.js +32 -2
- package/dist/src/telemetry/file-exporters.test.js.map +1 -1
- package/dist/src/telemetry/gcp-exporters.d.ts +3 -0
- package/dist/src/telemetry/gcp-exporters.js +72 -5
- package/dist/src/telemetry/gcp-exporters.js.map +1 -1
- package/dist/src/telemetry/gcp-exporters.test.js +52 -0
- package/dist/src/telemetry/gcp-exporters.test.js.map +1 -1
- package/dist/src/telemetry/heap-snapshot.d.ts +12 -0
- package/dist/src/telemetry/heap-snapshot.js +35 -0
- package/dist/src/telemetry/heap-snapshot.js.map +1 -0
- package/dist/src/telemetry/heap-snapshot.test.d.ts +6 -0
- package/dist/src/telemetry/heap-snapshot.test.js +38 -0
- package/dist/src/telemetry/heap-snapshot.test.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +1 -0
- package/dist/src/telemetry/index.js +1 -0
- package/dist/src/telemetry/index.js.map +1 -1
- package/dist/src/telemetry/loggers.test.js +1 -0
- package/dist/src/telemetry/loggers.test.js.map +1 -1
- package/dist/src/telemetry/memory-monitor.d.ts +5 -0
- package/dist/src/telemetry/memory-monitor.js +8 -0
- package/dist/src/telemetry/memory-monitor.js.map +1 -1
- package/dist/src/telemetry/metrics.js +13 -2
- package/dist/src/telemetry/metrics.js.map +1 -1
- package/dist/src/telemetry/metrics.test.js +61 -1
- package/dist/src/telemetry/metrics.test.js.map +1 -1
- package/dist/src/test-utils/config.js +10 -1
- package/dist/src/test-utils/config.js.map +1 -1
- package/dist/src/tools/ask-user.js +25 -1
- package/dist/src/tools/ask-user.js.map +1 -1
- package/dist/src/tools/ask-user.test.js +46 -1
- package/dist/src/tools/ask-user.test.js.map +1 -1
- package/dist/src/tools/definitions/base-declarations.d.ts +0 -3
- package/dist/src/tools/definitions/base-declarations.js +0 -4
- package/dist/src/tools/definitions/base-declarations.js.map +1 -1
- package/dist/src/tools/definitions/coreTools.d.ts +1 -2
- package/dist/src/tools/definitions/coreTools.js +2 -8
- package/dist/src/tools/definitions/coreTools.js.map +1 -1
- package/dist/src/tools/definitions/coreToolsModelSnapshots.test.js +1 -2
- package/dist/src/tools/definitions/coreToolsModelSnapshots.test.js.map +1 -1
- package/dist/src/tools/definitions/model-family-sets/default-legacy.js +7 -31
- 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 +9 -26
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
- package/dist/src/tools/definitions/types.d.ts +0 -1
- package/dist/src/tools/edit.js +27 -5
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +37 -0
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/grep.js +14 -2
- package/dist/src/tools/grep.js.map +1 -1
- package/dist/src/tools/grep.test.js +17 -0
- package/dist/src/tools/grep.test.js.map +1 -1
- package/dist/src/tools/jit-context.d.ts +1 -1
- package/dist/src/tools/jit-context.js +1 -4
- package/dist/src/tools/jit-context.js.map +1 -1
- package/dist/src/tools/jit-context.test.js +1 -13
- package/dist/src/tools/jit-context.test.js.map +1 -1
- package/dist/src/tools/ls.js +5 -0
- package/dist/src/tools/ls.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.js +2 -1
- package/dist/src/tools/mcp-client-manager.js.map +1 -1
- package/dist/src/tools/mcp-client-manager.test.js +29 -0
- package/dist/src/tools/mcp-client-manager.test.js.map +1 -1
- package/dist/src/tools/mcp-client.js +89 -50
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +353 -59
- package/dist/src/tools/mcp-client.test.js.map +1 -1
- package/dist/src/tools/{xcode-mcp-fix-transport.d.ts → mcp-compliance-transport.d.ts} +6 -6
- package/dist/src/tools/{xcode-mcp-fix-transport.js → mcp-compliance-transport.js} +6 -6
- package/dist/src/tools/mcp-compliance-transport.js.map +1 -0
- package/dist/src/tools/mcp-compliance-transport.test.d.ts +6 -0
- package/dist/src/tools/mcp-compliance-transport.test.js +162 -0
- package/dist/src/tools/mcp-compliance-transport.test.js.map +1 -0
- package/dist/src/tools/memoryTool.d.ts +9 -31
- package/dist/src/tools/memoryTool.js +47 -262
- package/dist/src/tools/memoryTool.js.map +1 -1
- package/dist/src/tools/memoryTool.test.js +41 -312
- package/dist/src/tools/memoryTool.test.js.map +1 -1
- package/dist/src/tools/read-file.js +11 -6
- package/dist/src/tools/read-file.js.map +1 -1
- package/dist/src/tools/read-file.test.js +20 -8
- package/dist/src/tools/read-file.test.js.map +1 -1
- package/dist/src/tools/read-many-files.js +2 -2
- package/dist/src/tools/read-many-files.js.map +1 -1
- package/dist/src/tools/ripGrep.d.ts +3 -7
- package/dist/src/tools/ripGrep.js +57 -35
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/ripGrep.test.js +197 -276
- package/dist/src/tools/ripGrep.test.js.map +1 -1
- package/dist/src/tools/shell.d.ts +5 -3
- package/dist/src/tools/shell.js +130 -36
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +186 -14
- package/dist/src/tools/shell.test.js.map +1 -1
- package/dist/src/tools/shell_proactive.test.js +1 -0
- package/dist/src/tools/shell_proactive.test.js.map +1 -1
- package/dist/src/tools/tool-names.d.ts +3 -3
- package/dist/src/tools/tool-names.js +4 -5
- package/dist/src/tools/tool-names.js.map +1 -1
- package/dist/src/tools/tool-registry.js +1 -1
- package/dist/src/tools/tool-registry.js.map +1 -1
- package/dist/src/tools/tools.d.ts +6 -0
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/tools/topicTool.js +5 -0
- package/dist/src/tools/topicTool.js.map +1 -1
- package/dist/src/tools/write-file.js +13 -0
- package/dist/src/tools/write-file.js.map +1 -1
- package/dist/src/tools/write-file.test.js +8 -0
- package/dist/src/tools/write-file.test.js.map +1 -1
- package/dist/src/utils/atCommandUtils.d.ts +35 -0
- package/dist/src/utils/atCommandUtils.js +163 -0
- package/dist/src/utils/atCommandUtils.js.map +1 -0
- package/dist/src/utils/atCommandUtils.test.d.ts +6 -0
- package/dist/src/utils/atCommandUtils.test.js +292 -0
- package/dist/src/utils/atCommandUtils.test.js.map +1 -0
- package/dist/src/utils/channel.d.ts +8 -0
- package/dist/src/utils/channel.js +21 -10
- package/dist/src/utils/channel.js.map +1 -1
- package/dist/src/utils/cryptoUtils.d.ts +11 -0
- package/dist/src/utils/cryptoUtils.js +19 -0
- package/dist/src/utils/cryptoUtils.js.map +1 -0
- package/dist/src/utils/cryptoUtils.test.d.ts +6 -0
- package/dist/src/utils/cryptoUtils.test.js +31 -0
- package/dist/src/utils/cryptoUtils.test.js.map +1 -0
- package/dist/src/utils/editor.d.ts +29 -3
- package/dist/src/utils/editor.js +94 -3
- package/dist/src/utils/editor.js.map +1 -1
- package/dist/src/utils/editor.test.js +176 -2
- package/dist/src/utils/editor.test.js.map +1 -1
- package/dist/src/utils/environmentContext.d.ts +2 -1
- package/dist/src/utils/environmentContext.js +15 -8
- package/dist/src/utils/environmentContext.js.map +1 -1
- package/dist/src/utils/environmentContext.test.js +4 -14
- package/dist/src/utils/environmentContext.test.js.map +1 -1
- package/dist/src/utils/errors.js +3 -8
- package/dist/src/utils/errors.js.map +1 -1
- package/dist/src/utils/events.d.ts +26 -1
- package/dist/src/utils/events.js +21 -2
- package/dist/src/utils/events.js.map +1 -1
- package/dist/src/utils/events.test.js +39 -0
- package/dist/src/utils/events.test.js.map +1 -1
- package/dist/src/utils/extensionLoader.js +2 -2
- package/dist/src/utils/extensionLoader.js.map +1 -1
- package/dist/src/utils/extensionLoader.test.js +22 -15
- package/dist/src/utils/extensionLoader.test.js.map +1 -1
- package/dist/src/utils/fetch.d.ts +3 -3
- package/dist/src/utils/fetch.js +41 -17
- package/dist/src/utils/fetch.js.map +1 -1
- package/dist/src/utils/fetch.test.js +93 -17
- package/dist/src/utils/fetch.test.js.map +1 -1
- package/dist/src/utils/fileUtils.js +4 -1
- package/dist/src/utils/fileUtils.js.map +1 -1
- package/dist/src/utils/filesearch/fileSearch.js +20 -9
- package/dist/src/utils/filesearch/fileSearch.js.map +1 -1
- package/dist/src/utils/filesearch/ignore.js +4 -1
- package/dist/src/utils/filesearch/ignore.js.map +1 -1
- package/dist/src/utils/generateContentResponseUtilities.d.ts +1 -0
- package/dist/src/utils/generateContentResponseUtilities.js +37 -7
- package/dist/src/utils/generateContentResponseUtilities.js.map +1 -1
- package/dist/src/utils/generateContentResponseUtilities.test.js +33 -0
- package/dist/src/utils/generateContentResponseUtilities.test.js.map +1 -1
- package/dist/src/utils/gitUtils.d.ts +5 -0
- package/dist/src/utils/gitUtils.js +11 -0
- package/dist/src/utils/gitUtils.js.map +1 -1
- package/dist/src/utils/historyHardening.d.ts +37 -0
- package/dist/src/utils/historyHardening.js +332 -0
- package/dist/src/utils/historyHardening.js.map +1 -0
- package/dist/src/utils/historyHardening.test.d.ts +6 -0
- package/dist/src/utils/historyHardening.test.js +317 -0
- package/dist/src/utils/historyHardening.test.js.map +1 -0
- package/dist/src/utils/ignoreFileParser.js +1 -1
- package/dist/src/utils/ignoreFileParser.js.map +1 -1
- package/dist/src/utils/ignorePatterns.js +2 -0
- package/dist/src/utils/ignorePatterns.js.map +1 -1
- package/dist/src/utils/ignorePatterns.test.js +1 -0
- package/dist/src/utils/ignorePatterns.test.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.d.ts +0 -20
- package/dist/src/utils/memoryDiscovery.js +57 -220
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +112 -403
- package/dist/src/utils/memoryDiscovery.test.js.map +1 -1
- package/dist/src/utils/modelUtils.d.ts +14 -0
- package/dist/src/utils/modelUtils.js +17 -0
- package/dist/src/utils/modelUtils.js.map +1 -0
- package/dist/src/utils/modelUtils.test.d.ts +6 -0
- package/dist/src/utils/modelUtils.test.js +23 -0
- package/dist/src/utils/modelUtils.test.js.map +1 -0
- package/dist/src/utils/partUtils.d.ts +26 -1
- package/dist/src/utils/partUtils.js +37 -0
- package/dist/src/utils/partUtils.js.map +1 -1
- package/dist/src/utils/path-validator.d.ts +17 -0
- package/dist/src/utils/path-validator.js +76 -0
- package/dist/src/utils/path-validator.js.map +1 -0
- package/dist/src/utils/path-validator.test.d.ts +6 -0
- package/dist/src/utils/path-validator.test.js +91 -0
- package/dist/src/utils/path-validator.test.js.map +1 -0
- package/dist/src/utils/pathReader.js +12 -0
- package/dist/src/utils/pathReader.js.map +1 -1
- package/dist/src/utils/pathReader.test.js +95 -0
- package/dist/src/utils/pathReader.test.js.map +1 -1
- package/dist/src/utils/paths.d.ts +19 -1
- package/dist/src/utils/paths.js +74 -9
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +111 -1
- package/dist/src/utils/paths.test.js.map +1 -1
- package/dist/src/utils/quotaErrorDetection.js +23 -12
- package/dist/src/utils/quotaErrorDetection.js.map +1 -1
- package/dist/src/utils/ragLogger.d.ts +32 -0
- package/dist/src/utils/ragLogger.js +56 -0
- package/dist/src/utils/ragLogger.js.map +1 -0
- package/dist/src/utils/ragLogger.test.d.ts +6 -0
- package/dist/src/utils/ragLogger.test.js +97 -0
- package/dist/src/utils/ragLogger.test.js.map +1 -0
- package/dist/src/utils/retry.js +8 -3
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/utils/retry.test.js +17 -0
- package/dist/src/utils/retry.test.js.map +1 -1
- package/dist/src/utils/safeJsonStringify.js +0 -2
- package/dist/src/utils/safeJsonStringify.js.map +1 -1
- package/dist/src/utils/sessionOperations.d.ts +26 -0
- package/dist/src/utils/sessionOperations.js +177 -8
- package/dist/src/utils/sessionOperations.js.map +1 -1
- package/dist/src/utils/sessionUtils.d.ts +11 -5
- package/dist/src/utils/sessionUtils.js +139 -68
- package/dist/src/utils/sessionUtils.js.map +1 -1
- package/dist/src/utils/sessionUtils.test.js +31 -5
- package/dist/src/utils/sessionUtils.test.js.map +1 -1
- package/dist/src/utils/shell-utils.d.ts +9 -1
- package/dist/src/utils/shell-utils.js +51 -20
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +87 -46
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/textUtils.d.ts +12 -2
- package/dist/src/utils/textUtils.js +30 -3
- package/dist/src/utils/textUtils.js.map +1 -1
- package/dist/src/utils/textUtils.test.js +96 -1
- package/dist/src/utils/textUtils.test.js.map +1 -1
- package/dist/src/utils/tokenCalculation.d.ts +3 -2
- package/dist/src/utils/tokenCalculation.js +9 -5
- package/dist/src/utils/tokenCalculation.js.map +1 -1
- package/dist/src/utils/tokenCalculation.test.js +15 -0
- package/dist/src/utils/tokenCalculation.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -18
- package/dist/src/context/historyObserver.d.ts +0 -28
- package/dist/src/context/historyObserver.js +0 -63
- package/dist/src/context/historyObserver.js.map +0 -1
- package/dist/src/policy/memory-manager-policy.test.js +0 -80
- package/dist/src/policy/memory-manager-policy.test.js.map +0 -1
- package/dist/src/policy/policies/memory-manager.toml +0 -20
- package/dist/src/prompts/snippets-memory-v2.test.js.map +0 -1
- package/dist/src/tools/xcode-mcp-fix-transport.js.map +0 -1
- package/dist/src/tools/xcode-mcp-fix-transport.test.d.ts +0 -1
- package/dist/src/tools/xcode-mcp-fix-transport.test.js +0 -98
- package/dist/src/tools/xcode-mcp-fix-transport.test.js.map +0 -1
- package/dist/src/utils/systemEncoding.d.ts +0 -40
- package/dist/src/utils/systemEncoding.js +0 -150
- package/dist/src/utils/systemEncoding.js.map +0 -1
- package/dist/src/utils/systemEncoding.test.js +0 -369
- package/dist/src/utils/systemEncoding.test.js.map +0 -1
- /package/dist/src/{policy/memory-manager-policy.test.d.ts → agents/local-session-invocation.test.d.ts} +0 -0
- /package/dist/src/{prompts/snippets-memory-v2.test.d.ts → agents/local-subagent-protocol.test.d.ts} +0 -0
- /package/dist/src/{utils/systemEncoding.test.d.ts → policy/stable-stringify.test.d.ts} +0 -0
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
// DISCLAIMER: This is a copied version of https://github.com/googleapis/js-genai/blob/main/src/chats.ts with the intention of working around a key bug
|
|
7
7
|
// where function responses are not treated as "valid" responses: https://b.corp.google.com/issues/420354090
|
|
8
8
|
import { createUserContent, FinishReason, } from '@google/genai';
|
|
9
|
+
export { AgentChatHistory } from './agentChatHistory.js';
|
|
9
10
|
import { AgentChatHistory } from './agentChatHistory.js';
|
|
11
|
+
import { randomUUID } from 'node:crypto';
|
|
10
12
|
import { toParts } from '../code_assist/converter.js';
|
|
11
13
|
import { retryWithBackoff, isRetryableError, getRetryErrorType, } from '../utils/retry.js';
|
|
12
14
|
import { resolveModel, supportsModernFeatures } from '../config/models.js';
|
|
@@ -16,7 +18,9 @@ import { ChatRecordingService, } from '../services/chatRecordingService.js';
|
|
|
16
18
|
import { ContentRetryEvent, ContentRetryFailureEvent, NetworkRetryAttemptEvent, } from '../telemetry/types.js';
|
|
17
19
|
import { handleFallback } from '../fallback/handler.js';
|
|
18
20
|
import { isFunctionResponse } from '../utils/messageInspectors.js';
|
|
19
|
-
import {
|
|
21
|
+
import { scrubHistory, scrubContents } from '../utils/historyHardening.js';
|
|
22
|
+
import { partListUnionToString, ensureStableToolIds, } from '../utils/sessionUtils.js';
|
|
23
|
+
import { BINARY_INJECTION_KEY } from '../utils/generateContentResponseUtilities.js';
|
|
20
24
|
import { estimateTokenCountSync } from '../utils/tokenCalculation.js';
|
|
21
25
|
import { applyModelSelection, createAvailabilityContextProvider, } from '../availability/policyHelpers.js';
|
|
22
26
|
import { coreEvents } from '../utils/events.js';
|
|
@@ -38,6 +42,9 @@ const MID_STREAM_RETRY_OPTIONS = {
|
|
|
38
42
|
useExponentialBackoff: true,
|
|
39
43
|
};
|
|
40
44
|
export const SYNTHETIC_THOUGHT_SIGNATURE = 'skip_thought_signature_validator';
|
|
45
|
+
function isIndexedPart(part) {
|
|
46
|
+
return 'callIndex' in part;
|
|
47
|
+
}
|
|
41
48
|
/**
|
|
42
49
|
* Returns true if the response is valid, false otherwise.
|
|
43
50
|
*/
|
|
@@ -82,7 +89,8 @@ function isValidContent(content) {
|
|
|
82
89
|
* @throws Error if the history contains an invalid role.
|
|
83
90
|
*/
|
|
84
91
|
function validateHistory(history) {
|
|
85
|
-
for (const
|
|
92
|
+
for (const item of history) {
|
|
93
|
+
const content = 'content' in item ? item.content : item;
|
|
86
94
|
if (content.role !== 'user' && content.role !== 'model') {
|
|
87
95
|
throw new Error(`Role must be user or model, but got ${content.role}.`);
|
|
88
96
|
}
|
|
@@ -104,16 +112,16 @@ function extractCuratedHistory(comprehensiveHistory) {
|
|
|
104
112
|
const length = comprehensiveHistory.length;
|
|
105
113
|
let i = 0;
|
|
106
114
|
while (i < length) {
|
|
107
|
-
if (comprehensiveHistory[i].role === 'user') {
|
|
115
|
+
if (comprehensiveHistory[i].content.role === 'user') {
|
|
108
116
|
curatedHistory.push(comprehensiveHistory[i]);
|
|
109
117
|
i++;
|
|
110
118
|
}
|
|
111
119
|
else {
|
|
112
120
|
const modelOutput = [];
|
|
113
121
|
let isValid = true;
|
|
114
|
-
while (i < length && comprehensiveHistory[i].role === 'model') {
|
|
122
|
+
while (i < length && comprehensiveHistory[i].content.role === 'model') {
|
|
115
123
|
modelOutput.push(comprehensiveHistory[i]);
|
|
116
|
-
if (isValid && !isValidContent(comprehensiveHistory[i])) {
|
|
124
|
+
if (isValid && !isValidContent(comprehensiveHistory[i].content)) {
|
|
117
125
|
isValid = false;
|
|
118
126
|
}
|
|
119
127
|
i++;
|
|
@@ -178,6 +186,7 @@ export class GeminiChat {
|
|
|
178
186
|
sendPromise = Promise.resolve();
|
|
179
187
|
chatRecordingService;
|
|
180
188
|
lastPromptTokenCount;
|
|
189
|
+
callCounter = 0;
|
|
181
190
|
agentHistory;
|
|
182
191
|
constructor(context, systemInstruction = '', tools = [], history = [], resumedSessionData, onModelChanged) {
|
|
183
192
|
this.context = context;
|
|
@@ -185,16 +194,53 @@ export class GeminiChat {
|
|
|
185
194
|
this.tools = tools;
|
|
186
195
|
this.onModelChanged = onModelChanged;
|
|
187
196
|
validateHistory(history);
|
|
188
|
-
|
|
197
|
+
let initialHistory;
|
|
198
|
+
// If history is passed, it is the most up-to-date in-memory state and takes precedence.
|
|
199
|
+
// This is critical for hot-restarts after operations like context compression.
|
|
200
|
+
if (history.length > 0) {
|
|
201
|
+
initialHistory = history.map((item) => 'id' in item && 'content' in item
|
|
202
|
+
? item
|
|
203
|
+
: { id: randomUUID(), content: item });
|
|
204
|
+
}
|
|
205
|
+
else if (resumedSessionData) {
|
|
206
|
+
// Otherwise, if resuming from disk, build from the persisted record.
|
|
207
|
+
initialHistory = resumedSessionData.conversation.messages
|
|
208
|
+
.filter((m) => m.type === 'user' || m.type === 'gemini')
|
|
209
|
+
.map((m) => ({
|
|
210
|
+
id: m.id,
|
|
211
|
+
content: {
|
|
212
|
+
role: m.type === 'user' ? 'user' : 'model',
|
|
213
|
+
parts: Array.isArray(m.content)
|
|
214
|
+
? // eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
215
|
+
m.content
|
|
216
|
+
: [{ text: String(m.content) }],
|
|
217
|
+
},
|
|
218
|
+
}));
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
initialHistory = [];
|
|
222
|
+
}
|
|
223
|
+
this.agentHistory = new AgentChatHistory(initialHistory);
|
|
224
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
225
|
+
ensureStableToolIds(this.agentHistory.get());
|
|
189
226
|
this.chatRecordingService = new ChatRecordingService(context);
|
|
190
|
-
this.lastPromptTokenCount = estimateTokenCountSync(this.agentHistory.flatMap((c) => c.parts || []));
|
|
227
|
+
this.lastPromptTokenCount = estimateTokenCountSync(this.agentHistory.flatMap((c) => c.content.parts || []));
|
|
228
|
+
}
|
|
229
|
+
get loopContext() {
|
|
230
|
+
return this.context;
|
|
191
231
|
}
|
|
192
232
|
async initialize(resumedSessionData, kind = 'main') {
|
|
193
233
|
await this.chatRecordingService.initialize(resumedSessionData, kind);
|
|
234
|
+
// Sync initial history with the recorder to ensure all turns (even bootstrapped ones)
|
|
235
|
+
// are durable and coordinated.
|
|
236
|
+
this.chatRecordingService.updateMessagesFromHistory(this.agentHistory.get());
|
|
194
237
|
}
|
|
195
238
|
setSystemInstruction(sysInstr) {
|
|
196
239
|
this.systemInstruction = sysInstr;
|
|
197
240
|
}
|
|
241
|
+
getSystemInstruction() {
|
|
242
|
+
return this.systemInstruction;
|
|
243
|
+
}
|
|
198
244
|
/**
|
|
199
245
|
* Sends a message to the model and returns the response in chunks.
|
|
200
246
|
*
|
|
@@ -221,15 +267,16 @@ export class GeminiChat {
|
|
|
221
267
|
* }
|
|
222
268
|
* ```
|
|
223
269
|
*/
|
|
224
|
-
async sendMessageStream(modelConfigKey, message, prompt_id, signal, role, displayContent) {
|
|
270
|
+
async sendMessageStream(modelConfigKey, message, prompt_id, signal, role, displayContent, apiHistoryOverride) {
|
|
225
271
|
await this.sendPromise;
|
|
226
272
|
let streamDoneResolver;
|
|
227
273
|
const streamDonePromise = new Promise((resolve) => {
|
|
228
274
|
streamDoneResolver = resolve;
|
|
229
275
|
});
|
|
230
276
|
this.sendPromise = streamDonePromise;
|
|
231
|
-
|
|
277
|
+
let userContent = createUserContent(message);
|
|
232
278
|
const { model } = this.context.config.modelConfigService.getResolvedConfig(modelConfigKey);
|
|
279
|
+
const isContextManagementEnabled = this.context.config.isContextManagementEnabled();
|
|
233
280
|
// Record user input - capture complete message with all parts (text, files, images, etc.)
|
|
234
281
|
// but skip recording function responses (tool call results) as they should be stored in tool call records
|
|
235
282
|
if (!isFunctionResponse(userContent)) {
|
|
@@ -243,16 +290,89 @@ export class GeminiChat {
|
|
|
243
290
|
finalDisplayContent = displayParts;
|
|
244
291
|
}
|
|
245
292
|
}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
293
|
+
if (!isContextManagementEnabled) {
|
|
294
|
+
const id = this.chatRecordingService.recordMessage({
|
|
295
|
+
model,
|
|
296
|
+
type: 'user',
|
|
297
|
+
content: userMessageParts,
|
|
298
|
+
displayContent: finalDisplayContent,
|
|
299
|
+
});
|
|
300
|
+
this.agentHistory.push({ id, content: userContent });
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
// With Context Management, the client has already recorded the user message
|
|
304
|
+
// and called setHistory to ensure the graph is in sync.
|
|
305
|
+
// We just verify it's there.
|
|
306
|
+
const history = this.agentHistory.get();
|
|
307
|
+
const lastTurn = history[history.length - 1];
|
|
308
|
+
if (!lastTurn ||
|
|
309
|
+
partListUnionToString(lastTurn.content.parts || []) !==
|
|
310
|
+
userMessageContent) {
|
|
311
|
+
const id = this.chatRecordingService.recordMessage({
|
|
312
|
+
model,
|
|
313
|
+
type: 'user',
|
|
314
|
+
content: userMessageParts,
|
|
315
|
+
displayContent: finalDisplayContent,
|
|
316
|
+
});
|
|
317
|
+
this.agentHistory.push({ id, content: userContent });
|
|
318
|
+
}
|
|
319
|
+
}
|
|
252
320
|
}
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
321
|
+
else {
|
|
322
|
+
// Record tool response as a message to ensure durable ID and linear history for resume.
|
|
323
|
+
const id = this.chatRecordingService.recordSyntheticMessage('user', userContent.parts || []);
|
|
324
|
+
if (!isContextManagementEnabled) {
|
|
325
|
+
// Binary injections: If the tool output contains binary data, we expand the history.
|
|
326
|
+
const binaryParts = this.extractBinaryInjections(userContent.parts);
|
|
327
|
+
if (binaryParts) {
|
|
328
|
+
// Turn 1: The original tool response (now cleaned)
|
|
329
|
+
this.agentHistory.push({ id, content: userContent });
|
|
330
|
+
// Turn 2: Synthetic Model Acknowledgment
|
|
331
|
+
const modelId = this.chatRecordingService.recordSyntheticMessage('gemini', [
|
|
332
|
+
{
|
|
333
|
+
text: 'Binary content received. Proceeding with analysis.',
|
|
334
|
+
thought: true,
|
|
335
|
+
thoughtSignature: SYNTHETIC_THOUGHT_SIGNATURE,
|
|
336
|
+
},
|
|
337
|
+
]);
|
|
338
|
+
this.agentHistory.push({
|
|
339
|
+
id: modelId,
|
|
340
|
+
content: {
|
|
341
|
+
role: 'model',
|
|
342
|
+
parts: [
|
|
343
|
+
{
|
|
344
|
+
text: 'Binary content received. Proceeding with analysis.',
|
|
345
|
+
thought: true,
|
|
346
|
+
thoughtSignature: SYNTHETIC_THOUGHT_SIGNATURE,
|
|
347
|
+
},
|
|
348
|
+
],
|
|
349
|
+
},
|
|
350
|
+
});
|
|
351
|
+
// Turn 3: The actual binary data (becomes the current request message)
|
|
352
|
+
const binaryId = this.chatRecordingService.recordSyntheticMessage('info', binaryParts);
|
|
353
|
+
userContent = {
|
|
354
|
+
role: 'user',
|
|
355
|
+
parts: binaryParts,
|
|
356
|
+
};
|
|
357
|
+
this.agentHistory.push({ id: binaryId, content: userContent });
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
this.agentHistory.push({ id, content: userContent });
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
// With Context Management, we just push it to the history if not already there.
|
|
365
|
+
// (The client should have handled this, but we're defensive).
|
|
366
|
+
const history = this.agentHistory.get();
|
|
367
|
+
const lastTurn = history[history.length - 1];
|
|
368
|
+
if (!lastTurn ||
|
|
369
|
+
partListUnionToString(lastTurn.content.parts || []) !==
|
|
370
|
+
partListUnionToString(userContent.parts || [])) {
|
|
371
|
+
this.agentHistory.push({ id, content: userContent });
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
const requestHistory = this.getHistoryTurns(true);
|
|
256
376
|
const streamWithRetries = async function* () {
|
|
257
377
|
try {
|
|
258
378
|
const maxAttempts = this.context.config.getMaxAttempts();
|
|
@@ -267,7 +387,7 @@ export class GeminiChat {
|
|
|
267
387
|
? { ...modelConfigKey, isRetry: true }
|
|
268
388
|
: modelConfigKey;
|
|
269
389
|
isConnectionPhase = true;
|
|
270
|
-
const stream = await this.makeApiCallAndProcessStream(currentConfigKey,
|
|
390
|
+
const stream = await this.makeApiCallAndProcessStream(currentConfigKey, requestHistory, prompt_id, signal, role, apiHistoryOverride);
|
|
271
391
|
isConnectionPhase = false;
|
|
272
392
|
for await (const chunk of stream) {
|
|
273
393
|
yield { type: StreamEventType.CHUNK, value: chunk };
|
|
@@ -304,10 +424,11 @@ export class GeminiChat {
|
|
|
304
424
|
// like ERR_SSL_SSLV3_ALERT_BAD_RECORD_MAC or ApiError)
|
|
305
425
|
const isRetryable = isRetryableError(error, this.context.config.getRetryFetchErrors());
|
|
306
426
|
const isContentError = error instanceof InvalidStreamError;
|
|
427
|
+
const isRetryableContentError = isContentError && error.type !== 'NO_RESPONSE_TEXT';
|
|
307
428
|
const errorType = isContentError
|
|
308
429
|
? error.type
|
|
309
430
|
: getRetryErrorType(error);
|
|
310
|
-
if (
|
|
431
|
+
if (isRetryableContentError || (isRetryable && !signal.aborted)) {
|
|
311
432
|
// The issue requests exactly 3 retries (4 attempts) for API errors during stream iteration.
|
|
312
433
|
// Regardless of the global maxAttempts (e.g. 10), we only want to retry these mid-stream API errors
|
|
313
434
|
// up to 3 times before finally throwing the error to the user.
|
|
@@ -350,7 +471,33 @@ export class GeminiChat {
|
|
|
350
471
|
};
|
|
351
472
|
return streamWithRetries.call(this);
|
|
352
473
|
}
|
|
353
|
-
|
|
474
|
+
extractBinaryInjections(parts) {
|
|
475
|
+
const binaryParts = [];
|
|
476
|
+
if (parts) {
|
|
477
|
+
for (const part of parts) {
|
|
478
|
+
const response = part.functionResponse?.response;
|
|
479
|
+
if (response && BINARY_INJECTION_KEY in response) {
|
|
480
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
481
|
+
const injected = response[BINARY_INJECTION_KEY];
|
|
482
|
+
delete response[BINARY_INJECTION_KEY];
|
|
483
|
+
if (Array.isArray(injected)) {
|
|
484
|
+
binaryParts.push(...injected);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
return binaryParts.length > 0 ? binaryParts : undefined;
|
|
490
|
+
}
|
|
491
|
+
async makeApiCallAndProcessStream(modelConfigKey, requestHistory, prompt_id, abortSignal, role, apiHistoryOverride) {
|
|
492
|
+
// Last mile scrubbing to remove internal tracking properties (e.g. callIndex)
|
|
493
|
+
// before sending to the Gemini API. This whitelists only standard Gemini fields.
|
|
494
|
+
const scrubbedHistory = this.context.config.isContextManagementEnabled()
|
|
495
|
+
? scrubHistory([...requestHistory])
|
|
496
|
+
: [...requestHistory];
|
|
497
|
+
const scrubbedContents = scrubbedHistory.map((h) => h.content);
|
|
498
|
+
const requestContents = apiHistoryOverride
|
|
499
|
+
? scrubContents(apiHistoryOverride)
|
|
500
|
+
: scrubbedContents;
|
|
354
501
|
const contentsForPreviewModel = this.ensureActiveLoopHasThoughtSignatures(requestContents);
|
|
355
502
|
// Track final request parameters for AfterModel hooks
|
|
356
503
|
const { model: availabilityFinalModel, config: newAvailabilityConfig, maxAttempts: availabilityMaxAttempts, } = applyModelSelection(this.context.config, modelConfigKey);
|
|
@@ -363,14 +510,13 @@ export class GeminiChat {
|
|
|
363
510
|
const initialActiveModel = this.context.config.getActiveModel();
|
|
364
511
|
const apiCall = async () => {
|
|
365
512
|
const useGemini3_1 = (await this.context.config.getGemini31Launched?.()) ?? false;
|
|
366
|
-
const useGemini3_1FlashLite = (await this.context.config.getGemini31FlashLiteLaunched?.()) ?? false;
|
|
367
513
|
const hasAccessToPreview = this.context.config.getHasAccessToPreviewModel?.() ?? true;
|
|
368
514
|
// Default to the last used model (which respects arguments/availability selection)
|
|
369
|
-
let modelToUse = resolveModel(lastModelToUse, useGemini3_1,
|
|
515
|
+
let modelToUse = resolveModel(lastModelToUse, useGemini3_1, false, hasAccessToPreview, this.context.config, this.context.config.hasGemini35FlashGAAccess?.() ?? false);
|
|
370
516
|
// If the active model has changed (e.g. due to a fallback updating the config),
|
|
371
517
|
// we switch to the new active model.
|
|
372
518
|
if (this.context.config.getActiveModel() !== initialActiveModel) {
|
|
373
|
-
modelToUse = resolveModel(this.context.config.getActiveModel(), useGemini3_1,
|
|
519
|
+
modelToUse = resolveModel(this.context.config.getActiveModel(), useGemini3_1, false, hasAccessToPreview, this.context.config, this.context.config.hasGemini35FlashGAAccess?.() ?? false);
|
|
374
520
|
}
|
|
375
521
|
if (modelToUse !== lastModelToUse) {
|
|
376
522
|
const { generateContentConfig: newConfig } = this.context.config.modelConfigService.getResolvedConfig({
|
|
@@ -411,7 +557,7 @@ export class GeminiChat {
|
|
|
411
557
|
throw new AgentExecutionBlockedError(beforeModelResult.reason || 'Model call blocked by hook', syntheticResponse);
|
|
412
558
|
}
|
|
413
559
|
if (beforeModelResult.modifiedModel) {
|
|
414
|
-
modelToUse = resolveModel(beforeModelResult.modifiedModel, useGemini3_1,
|
|
560
|
+
modelToUse = resolveModel(beforeModelResult.modifiedModel, useGemini3_1, false, hasAccessToPreview, this.context.config, this.context.config.hasGemini35FlashGAAccess?.() ?? false);
|
|
415
561
|
lastModelToUse = modelToUse;
|
|
416
562
|
// Re-evaluate contentsToUse based on the new model's feature support
|
|
417
563
|
contentsToUse = supportsModernFeatures(modelToUse)
|
|
@@ -447,9 +593,10 @@ export class GeminiChat {
|
|
|
447
593
|
lastModelToUse = modelToUse;
|
|
448
594
|
lastConfig = config;
|
|
449
595
|
lastContentsToUse = contentsToUse;
|
|
596
|
+
const finalContents = stripToolCallIdPrefixes(contentsToUse);
|
|
450
597
|
return this.context.config.getContentGenerator().generateContentStream({
|
|
451
598
|
model: modelToUse,
|
|
452
|
-
contents:
|
|
599
|
+
contents: finalContents,
|
|
453
600
|
config,
|
|
454
601
|
}, prompt_id, role);
|
|
455
602
|
};
|
|
@@ -512,10 +659,18 @@ export class GeminiChat {
|
|
|
512
659
|
* chat session.
|
|
513
660
|
*/
|
|
514
661
|
getHistory(curated = false) {
|
|
662
|
+
return this.getHistoryTurns(curated).map((h) => h.content);
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* Returns the chat history as HistoryTurns.
|
|
666
|
+
*/
|
|
667
|
+
getHistoryTurns(curated = false) {
|
|
515
668
|
const history = curated
|
|
516
|
-
? extractCuratedHistory(
|
|
517
|
-
: this.agentHistory.get();
|
|
518
|
-
return
|
|
669
|
+
? extractCuratedHistory(this.agentHistory.get())
|
|
670
|
+
: [...this.agentHistory.get()];
|
|
671
|
+
return this.context.config.isContextManagementEnabled()
|
|
672
|
+
? scrubHistory(history)
|
|
673
|
+
: history;
|
|
519
674
|
}
|
|
520
675
|
/**
|
|
521
676
|
* Clears the chat history.
|
|
@@ -527,16 +682,32 @@ export class GeminiChat {
|
|
|
527
682
|
* Adds a new entry to the chat history.
|
|
528
683
|
*/
|
|
529
684
|
addHistory(content) {
|
|
530
|
-
|
|
685
|
+
if ('id' in content && 'content' in content) {
|
|
686
|
+
this.agentHistory.push(content);
|
|
687
|
+
}
|
|
688
|
+
else {
|
|
689
|
+
const id = this.chatRecordingService.recordSyntheticMessage(content.role === 'user' ? 'user' : 'gemini', content.parts || []);
|
|
690
|
+
this.agentHistory.push({ id, content });
|
|
691
|
+
}
|
|
692
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
693
|
+
ensureStableToolIds(this.agentHistory.get());
|
|
531
694
|
}
|
|
532
695
|
setHistory(history) {
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
696
|
+
const wrappedHistory = history.map((item) => {
|
|
697
|
+
if ('id' in item && 'content' in item) {
|
|
698
|
+
return item;
|
|
699
|
+
}
|
|
700
|
+
const id = this.chatRecordingService.recordSyntheticMessage(item.role === 'user' ? 'user' : 'gemini', item.parts || []);
|
|
701
|
+
return { id, content: item };
|
|
702
|
+
});
|
|
703
|
+
ensureStableToolIds(wrappedHistory);
|
|
704
|
+
this.agentHistory.set(wrappedHistory);
|
|
705
|
+
this.lastPromptTokenCount = estimateTokenCountSync(this.agentHistory.flatMap((c) => c.content.parts || []));
|
|
706
|
+
this.chatRecordingService.updateMessagesFromHistory(this.agentHistory.get());
|
|
536
707
|
}
|
|
537
708
|
stripThoughtsFromHistory() {
|
|
538
|
-
this.agentHistory.map((
|
|
539
|
-
const newContent = { ...content };
|
|
709
|
+
const newHistory = this.agentHistory.map((turn) => {
|
|
710
|
+
const newContent = { ...turn.content };
|
|
540
711
|
if (newContent.parts) {
|
|
541
712
|
newContent.parts = newContent.parts.map((part) => {
|
|
542
713
|
if (part && typeof part === 'object' && 'thoughtSignature' in part) {
|
|
@@ -547,8 +718,9 @@ export class GeminiChat {
|
|
|
547
718
|
return part;
|
|
548
719
|
});
|
|
549
720
|
}
|
|
550
|
-
return newContent;
|
|
721
|
+
return { id: turn.id, content: newContent };
|
|
551
722
|
});
|
|
723
|
+
this.agentHistory.set(newHistory);
|
|
552
724
|
}
|
|
553
725
|
// To ensure our requests validate, the first function call in every model
|
|
554
726
|
// turn within the active loop must have a `thoughtSignature` property.
|
|
@@ -599,6 +771,9 @@ export class GeminiChat {
|
|
|
599
771
|
setTools(tools) {
|
|
600
772
|
this.tools = tools;
|
|
601
773
|
}
|
|
774
|
+
getTools() {
|
|
775
|
+
return this.tools;
|
|
776
|
+
}
|
|
602
777
|
async maybeIncludeSchemaDepthContext(error) {
|
|
603
778
|
// Check for potentially problematic cyclic tools with cyclic schemas
|
|
604
779
|
// and include a recommendation to remove potentially problematic tools.
|
|
@@ -627,15 +802,49 @@ export class GeminiChat {
|
|
|
627
802
|
let hasThoughts = false;
|
|
628
803
|
let finishReason;
|
|
629
804
|
// The SDK provides fully assembled FunctionCall objects in chunk.functionCalls
|
|
630
|
-
|
|
805
|
+
// We use a Map to ensure we only keep the latest version of each call (by ID)
|
|
806
|
+
const finalFunctionCallsMap = new Map();
|
|
807
|
+
const legacyFunctionCalls = [];
|
|
808
|
+
// Map to track synthetic IDs assigned to each call index across chunks
|
|
809
|
+
const callIndexToId = new Map();
|
|
810
|
+
let runningFunctionCallCounter = 0;
|
|
631
811
|
for await (const chunk of streamResponse) {
|
|
812
|
+
const currentChunkStartCounter = runningFunctionCallCounter;
|
|
632
813
|
const candidateWithReason = chunk?.candidates?.find((candidate) => candidate.finishReason);
|
|
633
814
|
if (candidateWithReason) {
|
|
634
815
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion
|
|
635
816
|
finishReason = candidateWithReason.finishReason;
|
|
636
817
|
}
|
|
637
818
|
if (chunk.functionCalls && chunk.functionCalls.length > 0) {
|
|
638
|
-
|
|
819
|
+
if (this.context.config.isContextManagementEnabled()) {
|
|
820
|
+
for (let i = 0; i < chunk.functionCalls.length; i++) {
|
|
821
|
+
const fnCall = chunk.functionCalls[i];
|
|
822
|
+
const globalIndex = currentChunkStartCounter + i;
|
|
823
|
+
if (!fnCall.id) {
|
|
824
|
+
let id = callIndexToId.get(globalIndex);
|
|
825
|
+
if (!id) {
|
|
826
|
+
id = `synth_${this.context.promptId}_${Date.now()}_${this.callCounter++}`;
|
|
827
|
+
callIndexToId.set(globalIndex, id);
|
|
828
|
+
}
|
|
829
|
+
fnCall.id = id;
|
|
830
|
+
}
|
|
831
|
+
const name = fnCall.name?.trim() || 'generic_tool';
|
|
832
|
+
if (fnCall.id && !fnCall.id.startsWith(`${name}__`)) {
|
|
833
|
+
fnCall.id = `${name}__${fnCall.id}`;
|
|
834
|
+
}
|
|
835
|
+
finalFunctionCallsMap.set(fnCall.id, fnCall);
|
|
836
|
+
}
|
|
837
|
+
runningFunctionCallCounter += chunk.functionCalls.length;
|
|
838
|
+
}
|
|
839
|
+
else {
|
|
840
|
+
for (const fnCall of chunk.functionCalls) {
|
|
841
|
+
const name = fnCall.name?.trim() || 'generic_tool';
|
|
842
|
+
if (fnCall.id && !fnCall.id.startsWith(`${name}__`)) {
|
|
843
|
+
fnCall.id = `${name}__${fnCall.id}`;
|
|
844
|
+
}
|
|
845
|
+
}
|
|
846
|
+
legacyFunctionCalls.push(...chunk.functionCalls);
|
|
847
|
+
}
|
|
639
848
|
}
|
|
640
849
|
if (isValidResponse(chunk)) {
|
|
641
850
|
const content = chunk.candidates?.[0]?.content;
|
|
@@ -648,7 +857,23 @@ export class GeminiChat {
|
|
|
648
857
|
if (content.parts.some((part) => part.functionCall)) {
|
|
649
858
|
hasToolCall = true;
|
|
650
859
|
}
|
|
651
|
-
|
|
860
|
+
let localFunctionCallCounter = 0;
|
|
861
|
+
modelResponseParts.push(...content.parts
|
|
862
|
+
.filter((part) => !part.thought)
|
|
863
|
+
.map((part) => {
|
|
864
|
+
if (!this.context.config.isContextManagementEnabled()) {
|
|
865
|
+
return part;
|
|
866
|
+
}
|
|
867
|
+
let callIndex;
|
|
868
|
+
if (part.functionCall) {
|
|
869
|
+
callIndex =
|
|
870
|
+
currentChunkStartCounter + localFunctionCallCounter++;
|
|
871
|
+
}
|
|
872
|
+
return {
|
|
873
|
+
...part,
|
|
874
|
+
callIndex,
|
|
875
|
+
};
|
|
876
|
+
}));
|
|
652
877
|
}
|
|
653
878
|
}
|
|
654
879
|
// Record token usage if this chunk has usageMetadata
|
|
@@ -675,23 +900,17 @@ export class GeminiChat {
|
|
|
675
900
|
}
|
|
676
901
|
// String thoughts and consolidate text parts.
|
|
677
902
|
const consolidatedParts = [];
|
|
903
|
+
const finalFunctionCalls = this.context.config.isContextManagementEnabled()
|
|
904
|
+
? Array.from(finalFunctionCallsMap.values())
|
|
905
|
+
: legacyFunctionCalls;
|
|
906
|
+
let currentCallSourceIndex = -1;
|
|
678
907
|
if (this.context.config.isContextManagementEnabled()) {
|
|
679
908
|
for (const part of modelResponseParts) {
|
|
680
909
|
if (part.functionCall) {
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
// (finalFunctionCalls) immediately below. We only push the very first
|
|
684
|
-
// partial chunk of a sequence as a placeholder so we know *where*
|
|
685
|
-
// in the sequence of parts the tool call happened.
|
|
686
|
-
const lastPart = consolidatedParts[consolidatedParts.length - 1];
|
|
687
|
-
const currentId = part.functionCall.id;
|
|
688
|
-
const lastId = lastPart?.functionCall?.id;
|
|
689
|
-
const isNewCall = !lastPart?.functionCall ||
|
|
690
|
-
(currentId !== undefined &&
|
|
691
|
-
lastId !== undefined &&
|
|
692
|
-
currentId !== lastId) ||
|
|
693
|
-
lastPart.functionCall.name !== part.functionCall.name;
|
|
910
|
+
const partIndex = isIndexedPart(part) ? part.callIndex : undefined;
|
|
911
|
+
const isNewCall = partIndex !== undefined && partIndex > currentCallSourceIndex;
|
|
694
912
|
if (isNewCall) {
|
|
913
|
+
currentCallSourceIndex = partIndex;
|
|
695
914
|
consolidatedParts.push({ ...part }); // Push placeholder
|
|
696
915
|
}
|
|
697
916
|
}
|
|
@@ -737,16 +956,21 @@ export class GeminiChat {
|
|
|
737
956
|
.map((part) => part.text)
|
|
738
957
|
.join('')
|
|
739
958
|
.trim();
|
|
959
|
+
let id;
|
|
740
960
|
// Record model response text from the collected parts.
|
|
741
961
|
// Also flush when there are thoughts or a tool call (even with no text)
|
|
742
962
|
// so that BeforeTool hooks always see the latest transcript state.
|
|
743
963
|
if (responseText || hasThoughts || hasToolCall) {
|
|
744
|
-
this.chatRecordingService.recordMessage({
|
|
964
|
+
id = this.chatRecordingService.recordMessage({
|
|
745
965
|
model,
|
|
746
966
|
type: 'gemini',
|
|
747
967
|
content: responseText,
|
|
748
968
|
});
|
|
749
969
|
}
|
|
970
|
+
else {
|
|
971
|
+
// Still need a durable ID even if response is empty (e.g. only tool calls)
|
|
972
|
+
id = this.chatRecordingService.recordSyntheticMessage('gemini', consolidatedParts);
|
|
973
|
+
}
|
|
750
974
|
// Stream validation logic: A stream is considered successful if:
|
|
751
975
|
// 1. There's a tool call OR
|
|
752
976
|
// 2. A not MALFORMED_FUNCTION_CALL finish reason and a non-mepty resp
|
|
@@ -769,7 +993,10 @@ export class GeminiChat {
|
|
|
769
993
|
throw new InvalidStreamError('Model stream ended with empty response text.', 'NO_RESPONSE_TEXT');
|
|
770
994
|
}
|
|
771
995
|
}
|
|
772
|
-
this.agentHistory.push({
|
|
996
|
+
this.agentHistory.push({
|
|
997
|
+
id,
|
|
998
|
+
content: { role: 'model', parts: consolidatedParts },
|
|
999
|
+
});
|
|
773
1000
|
}
|
|
774
1001
|
getLastPromptTokenCount() {
|
|
775
1002
|
return this.lastPromptTokenCount;
|
|
@@ -837,4 +1064,35 @@ export function isSchemaDepthError(errorMessage) {
|
|
|
837
1064
|
export function isInvalidArgumentError(errorMessage) {
|
|
838
1065
|
return errorMessage.includes('Request contains an invalid argument');
|
|
839
1066
|
}
|
|
1067
|
+
export function stripToolCallIdPrefixes(contents) {
|
|
1068
|
+
return contents.map((content) => ({
|
|
1069
|
+
...content,
|
|
1070
|
+
parts: (content.parts || []).map((part) => {
|
|
1071
|
+
const newPart = { ...part };
|
|
1072
|
+
if (newPart.functionCall) {
|
|
1073
|
+
const fc = newPart.functionCall;
|
|
1074
|
+
const name = fc.name?.trim() || 'generic_tool';
|
|
1075
|
+
if (fc.id && fc.id.startsWith(`${name}__`)) {
|
|
1076
|
+
newPart.functionCall = {
|
|
1077
|
+
name: fc.name,
|
|
1078
|
+
args: fc.args,
|
|
1079
|
+
id: fc.id.substring(name.length + 2),
|
|
1080
|
+
};
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
if (newPart.functionResponse) {
|
|
1084
|
+
const fr = newPart.functionResponse;
|
|
1085
|
+
const name = fr.name?.trim() || 'generic_tool';
|
|
1086
|
+
if (fr.id && fr.id.startsWith(`${name}__`)) {
|
|
1087
|
+
newPart.functionResponse = {
|
|
1088
|
+
name: fr.name,
|
|
1089
|
+
response: fr.response,
|
|
1090
|
+
id: fr.id.substring(name.length + 2),
|
|
1091
|
+
};
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
return newPart;
|
|
1095
|
+
}),
|
|
1096
|
+
}));
|
|
1097
|
+
}
|
|
840
1098
|
//# sourceMappingURL=geminiChat.js.map
|