@google/gemini-cli-core 0.42.0 → 0.43.0-preview.1
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/changelogs/index.md +14 -0
- package/dist/docs/changelogs/latest.md +108 -166
- package/dist/docs/changelogs/preview.md +227 -103
- package/dist/docs/cli/auto-memory.md +60 -38
- package/dist/docs/cli/settings.md +1 -1
- package/dist/docs/cli/tutorials/memory-management.md +1 -1
- package/dist/docs/extensions/releasing.md +58 -24
- package/dist/docs/reference/configuration.md +14 -1
- package/dist/docs/reference/keyboard-shortcuts.md +23 -0
- package/dist/google-gemini-cli-core-0.43.0-preview.0.tgz +0 -0
- package/dist/src/agent/content-utils.js +2 -0
- 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 +7 -6
- package/dist/src/agent/event-translator.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.js +4 -0
- package/dist/src/agent/legacy-agent-session.js.map +1 -1
- package/dist/src/agent/legacy-agent-session.test.js +9 -1
- 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 +4 -3
- package/dist/src/agents/a2aUtils.js.map +1 -1
- package/dist/src/agents/agentLoader.d.ts +2 -2
- package/dist/src/agents/browser/browserAgentInvocation.js +24 -19
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -1
- package/dist/src/agents/local-executor.d.ts +1 -0
- package/dist/src/agents/local-executor.js +46 -32
- package/dist/src/agents/local-executor.js.map +1 -1
- package/dist/src/agents/local-executor.test.js +127 -0
- package/dist/src/agents/local-executor.test.js.map +1 -1
- package/dist/src/agents/local-invocation.js +24 -20
- package/dist/src/agents/local-invocation.js.map +1 -1
- package/dist/src/agents/local-invocation.test.js +9 -9
- package/dist/src/agents/local-invocation.test.js.map +1 -1
- 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.d.ts +6 -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/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-subagent-protocol.d.ts +31 -0
- package/dist/src/agents/remote-subagent-protocol.js +330 -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.js +1 -0
- package/dist/src/agents/skill-extraction-agent.js.map +1 -1
- package/dist/src/agents/skill-extraction-agent.test.js +1 -0
- package/dist/src/agents/skill-extraction-agent.test.js.map +1 -1
- package/dist/src/agents/types.d.ts +13 -2
- package/dist/src/agents/types.js +7 -0
- package/dist/src/agents/types.js.map +1 -1
- package/dist/src/availability/modelAvailabilityService.d.ts +6 -6
- package/dist/src/availability/modelAvailabilityService.js +14 -7
- package/dist/src/availability/modelAvailabilityService.js.map +1 -1
- package/dist/src/availability/modelAvailabilityService.test.js +34 -0
- package/dist/src/availability/modelAvailabilityService.test.js.map +1 -1
- package/dist/src/availability/policyHelpers.js +24 -12
- package/dist/src/availability/policyHelpers.js.map +1 -1
- package/dist/src/availability/policyHelpers.test.js +3 -2
- package/dist/src/availability/policyHelpers.test.js.map +1 -1
- package/dist/src/code_assist/oauth2.js +3 -0
- package/dist/src/code_assist/oauth2.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 +9 -1
- package/dist/src/code_assist/setup.test.js.map +1 -1
- package/dist/src/commands/memory.d.ts +5 -14
- package/dist/src/commands/memory.js +19 -141
- package/dist/src/commands/memory.js.map +1 -1
- package/dist/src/commands/memory.test.js +62 -0
- package/dist/src/commands/memory.test.js.map +1 -1
- package/dist/src/config/config.d.ts +6 -2
- package/dist/src/config/config.js +63 -8
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +48 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/config/defaultModelConfigs.js +13 -0
- package/dist/src/config/defaultModelConfigs.js.map +1 -1
- package/dist/src/config/models.js +1 -1
- package/dist/src/config/models.js.map +1 -1
- package/dist/src/config/projectRegistry.d.ts +1 -0
- package/dist/src/config/projectRegistry.js +13 -2
- 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/context/config/profiles.js +4 -0
- package/dist/src/context/config/profiles.js.map +1 -1
- package/dist/src/context/contextManager.barrier.test.js +4 -3
- package/dist/src/context/contextManager.barrier.test.js.map +1 -1
- package/dist/src/context/contextManager.d.ts +9 -2
- package/dist/src/context/contextManager.hotstart.test.d.ts +6 -0
- package/dist/src/context/contextManager.hotstart.test.js +61 -0
- package/dist/src/context/contextManager.hotstart.test.js.map +1 -0
- package/dist/src/context/contextManager.js +96 -21
- package/dist/src/context/contextManager.js.map +1 -1
- package/dist/src/context/eventBus.d.ts +6 -0
- package/dist/src/context/eventBus.js +6 -0
- package/dist/src/context/eventBus.js.map +1 -1
- package/dist/src/context/graph/render.d.ts +3 -1
- package/dist/src/context/graph/render.js +33 -9
- 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 +203 -0
- package/dist/src/context/graph/render.test.js.map +1 -0
- package/dist/src/context/graph/toGraph.js +3 -3
- 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 +35 -0
- package/dist/src/context/graph/toGraph.test.js.map +1 -0
- package/dist/src/context/initializer.js +11 -2
- package/dist/src/context/initializer.js.map +1 -1
- package/dist/src/context/pipeline/contextWorkingBuffer.d.ts +5 -7
- package/dist/src/context/pipeline/contextWorkingBuffer.js +105 -29
- package/dist/src/context/pipeline/contextWorkingBuffer.js.map +1 -1
- package/dist/src/context/pipeline/contextWorkingBuffer.test.js +67 -0
- 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 +6 -8
- 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 +1 -0
- package/dist/src/context/pipeline/orchestrator.js +59 -24
- package/dist/src/context/pipeline/orchestrator.js.map +1 -1
- package/dist/src/context/processors/blobDegradationProcessor.test.js +2 -2
- package/dist/src/context/processors/rollingSummaryProcessor.js +2 -15
- package/dist/src/context/processors/rollingSummaryProcessor.js.map +1 -1
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.d.ts +7 -0
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.js +33 -21
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.js.map +1 -1
- package/dist/src/context/processors/stateSnapshotAsyncProcessor.test.js +31 -7
- 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 +28 -4
- package/dist/src/context/processors/stateSnapshotProcessor.js.map +1 -1
- package/dist/src/context/processors/stateSnapshotProcessor.test.js +40 -1
- package/dist/src/context/processors/stateSnapshotProcessor.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 +98 -0
- package/dist/src/context/system-tests/hysteresis.test.js.map +1 -0
- package/dist/src/context/system-tests/lifecycle.golden.test.js +90 -69
- package/dist/src/context/system-tests/lifecycle.golden.test.js.map +1 -1
- package/dist/src/context/system-tests/simulationHarness.d.ts +1 -4
- package/dist/src/context/system-tests/simulationHarness.js +16 -30
- package/dist/src/context/system-tests/simulationHarness.js.map +1 -1
- package/dist/src/context/testing/contextTestUtils.d.ts +1 -0
- package/dist/src/context/testing/contextTestUtils.js +48 -25
- package/dist/src/context/testing/contextTestUtils.js.map +1 -1
- package/dist/src/context/utils/adaptiveTokenCalculator.d.ts +61 -0
- package/dist/src/context/utils/adaptiveTokenCalculator.js +116 -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 +85 -0
- package/dist/src/context/utils/adaptiveTokenCalculator.test.js.map +1 -0
- package/dist/src/context/utils/contextTokenCalculator.d.ts +47 -1
- package/dist/src/context/utils/contextTokenCalculator.js +20 -3
- package/dist/src/context/utils/contextTokenCalculator.js.map +1 -1
- package/dist/src/context/utils/contextTokenCalculator.test.js +8 -8
- package/dist/src/context/utils/contextTokenCalculator.test.js.map +1 -1
- 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/snapshotGenerator.d.ts +23 -1
- package/dist/src/context/utils/snapshotGenerator.js +249 -31
- 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 +255 -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/baseLlmClient.d.ts +8 -0
- package/dist/src/core/baseLlmClient.js +14 -0
- package/dist/src/core/baseLlmClient.js.map +1 -1
- package/dist/src/core/client.js +12 -1
- package/dist/src/core/client.js.map +1 -1
- package/dist/src/core/client.test.js +4 -4
- package/dist/src/core/contentGenerator.js +12 -10
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/geminiChat.d.ts +2 -0
- package/dist/src/core/geminiChat.js +60 -5
- package/dist/src/core/geminiChat.js.map +1 -1
- package/dist/src/core/geminiChat.test.js +195 -2
- package/dist/src/core/geminiChat.test.js.map +1 -1
- package/dist/src/core/turn.js +30 -2
- package/dist/src/core/turn.js.map +1 -1
- package/dist/src/core/turn.test.js +13 -8
- package/dist/src/core/turn.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/generated/git-commit.js.map +1 -1
- 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/index.d.ts +2 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/prompts/snippets.js +1 -1
- package/dist/src/prompts/snippets.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 +2 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.js +8 -1
- package/dist/src/routing/strategies/classifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/classifierStrategy.test.js +4 -0
- package/dist/src/routing/strategies/classifierStrategy.test.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 +4 -0
- 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 +22 -3
- package/dist/src/routing/strategies/numericalClassifierStrategy.js.map +1 -1
- package/dist/src/routing/strategies/numericalClassifierStrategy.test.js +168 -23
- package/dist/src/routing/strategies/numericalClassifierStrategy.test.js.map +1 -1
- package/dist/src/scheduler/scheduler.js +11 -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/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/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 +8 -1
- package/dist/src/services/gitService.js.map +1 -1
- package/dist/src/services/gitService.test.js +104 -0
- 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 +66 -4
- package/dist/src/services/memoryPatchUtils.js +267 -5
- package/dist/src/services/memoryPatchUtils.js.map +1 -1
- package/dist/src/services/memoryService.js +25 -1
- package/dist/src/services/memoryService.js.map +1 -1
- package/dist/src/services/memoryService.test.js +61 -1
- package/dist/src/services/memoryService.test.js.map +1 -1
- package/dist/src/services/test-data/resolved-aliases-retry.golden.json +11 -0
- package/dist/src/services/test-data/resolved-aliases.golden.json +11 -0
- package/dist/src/telemetry/gcp-exporters.d.ts +2 -0
- package/dist/src/telemetry/gcp-exporters.js +69 -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/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/tools/definitions/model-family-sets/default-legacy.js +5 -2
- 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 +7 -4
- package/dist/src/tools/definitions/model-family-sets/gemini-3.js.map +1 -1
- package/dist/src/tools/edit.js +19 -0
- package/dist/src/tools/edit.js.map +1 -1
- package/dist/src/tools/edit.test.js +9 -0
- package/dist/src/tools/edit.test.js.map +1 -1
- package/dist/src/tools/grep.js +13 -1
- package/dist/src/tools/grep.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.js +17 -3
- package/dist/src/tools/mcp-client.js.map +1 -1
- package/dist/src/tools/mcp-client.test.js +24 -0
- package/dist/src/tools/mcp-client.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/ripGrep.js +13 -1
- package/dist/src/tools/ripGrep.js.map +1 -1
- package/dist/src/tools/shell.js +14 -0
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/shell.test.js +5 -0
- package/dist/src/tools/shell.test.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/errors.js +3 -8
- package/dist/src/utils/errors.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/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.js +55 -40
- package/dist/src/utils/memoryDiscovery.js.map +1 -1
- package/dist/src/utils/memoryDiscovery.test.js +77 -9
- 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/paths.d.ts +15 -1
- package/dist/src/utils/paths.js +22 -7
- package/dist/src/utils/paths.js.map +1 -1
- package/dist/src/utils/paths.test.js +25 -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/shell-utils.js +9 -1
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +7 -3
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/tokenCalculation.js +2 -1
- 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 +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextTestUtils.js","sourceRoot":"","sources":["../../../../src/context/testing/contextTestUtils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAGL,QAAQ,GACT,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"contextTestUtils.js","sourceRoot":"","sources":["../../../../src/context/testing/contextTestUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { Content, Part } from '@google/genai';
|
|
7
|
+
import type { ConcreteNode } from '../graph/types.js';
|
|
8
|
+
import { type AdvancedTokenCalculator } from './contextTokenCalculator.js';
|
|
9
|
+
import type { NodeBehaviorRegistry } from '../graph/behaviorRegistry.js';
|
|
10
|
+
import type { ContextEventBus } from '../eventBus.js';
|
|
11
|
+
/**
|
|
12
|
+
* An Adaptive Token Calculator that dynamically learns the true token cost of the user's
|
|
13
|
+
* conversation by applying an Exponential Moving Average (EMA) gradient descent to
|
|
14
|
+
* real usage metadata returned from the Gemini API.
|
|
15
|
+
*
|
|
16
|
+
* It wraps the deterministic `StaticTokenCalculator` base heuristic to ensure
|
|
17
|
+
* immutable node cost caching while still surfacing a self-corrected estimate
|
|
18
|
+
* to the pipeline processors.
|
|
19
|
+
*/
|
|
20
|
+
export declare class AdaptiveTokenCalculator implements AdvancedTokenCalculator {
|
|
21
|
+
private learnedWeight;
|
|
22
|
+
private readonly baseCalculator;
|
|
23
|
+
constructor(charsPerToken: number, registry: NodeBehaviorRegistry, eventBus: ContextEventBus);
|
|
24
|
+
private handleGroundTruth;
|
|
25
|
+
/**
|
|
26
|
+
* Retrieves the current learned weight multiplier.
|
|
27
|
+
*/
|
|
28
|
+
getLearnedWeight(): number;
|
|
29
|
+
/**
|
|
30
|
+
* Returns the exact, unweighted Base Heuristic Units for the graph.
|
|
31
|
+
* This is used exactly once per interaction to capture the baseline sent to the API.
|
|
32
|
+
*/
|
|
33
|
+
getRawBaseUnits(nodes: readonly ConcreteNode[]): number;
|
|
34
|
+
/**
|
|
35
|
+
* Returns the exact, unweighted Base Heuristic Units for a raw content chunk.
|
|
36
|
+
*/
|
|
37
|
+
getRawBaseUnitsForContent(content: Content): number;
|
|
38
|
+
calculateTokensAndBaseUnits(nodes: readonly ConcreteNode[]): {
|
|
39
|
+
tokens: number;
|
|
40
|
+
baseUnits: number;
|
|
41
|
+
};
|
|
42
|
+
calculateContentTokensAndBaseUnits(content: Content): {
|
|
43
|
+
tokens: number;
|
|
44
|
+
baseUnits: number;
|
|
45
|
+
};
|
|
46
|
+
garbageCollectCache(liveNodeIds: ReadonlySet<string>): void;
|
|
47
|
+
cacheNodeTokens(node: ConcreteNode): number;
|
|
48
|
+
calculateTokenBreakdown(nodes: readonly ConcreteNode[]): {
|
|
49
|
+
text: number;
|
|
50
|
+
media: number;
|
|
51
|
+
tool: number;
|
|
52
|
+
overhead: number;
|
|
53
|
+
total: number;
|
|
54
|
+
};
|
|
55
|
+
estimateTokensForParts(parts: Part[]): number;
|
|
56
|
+
getTokenCost(node: ConcreteNode): number;
|
|
57
|
+
calculateConcreteListTokens(nodes: readonly ConcreteNode[]): number;
|
|
58
|
+
calculateContentTokens(content: Content): number;
|
|
59
|
+
estimateTokensForString(text: string): number;
|
|
60
|
+
tokensToChars(tokens: number): number;
|
|
61
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { StaticTokenCalculator, } from './contextTokenCalculator.js';
|
|
7
|
+
import { debugLogger } from '../../utils/debugLogger.js';
|
|
8
|
+
/**
|
|
9
|
+
* An Adaptive Token Calculator that dynamically learns the true token cost of the user's
|
|
10
|
+
* conversation by applying an Exponential Moving Average (EMA) gradient descent to
|
|
11
|
+
* real usage metadata returned from the Gemini API.
|
|
12
|
+
*
|
|
13
|
+
* It wraps the deterministic `StaticTokenCalculator` base heuristic to ensure
|
|
14
|
+
* immutable node cost caching while still surfacing a self-corrected estimate
|
|
15
|
+
* to the pipeline processors.
|
|
16
|
+
*/
|
|
17
|
+
export class AdaptiveTokenCalculator {
|
|
18
|
+
learnedWeight = 1.0;
|
|
19
|
+
baseCalculator;
|
|
20
|
+
constructor(charsPerToken, registry, eventBus) {
|
|
21
|
+
this.baseCalculator = new StaticTokenCalculator(charsPerToken, registry);
|
|
22
|
+
eventBus.onTokenGroundTruth((event) => {
|
|
23
|
+
this.handleGroundTruth(event.actualTokens, event.promptBaseUnits);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
handleGroundTruth(actualTokens, promptBaseUnits) {
|
|
27
|
+
if (promptBaseUnits <= 0)
|
|
28
|
+
return;
|
|
29
|
+
// Determine what ratio we should have used
|
|
30
|
+
const targetWeight = actualTokens / promptBaseUnits;
|
|
31
|
+
const oldWeight = this.learnedWeight;
|
|
32
|
+
// Apply Momentum (Learning Rate)
|
|
33
|
+
const learningRate = 0.2;
|
|
34
|
+
const newWeight = oldWeight * (1 - learningRate) + targetWeight * learningRate;
|
|
35
|
+
// Clamp to reasonable safety bounds to prevent rogue metadata poisoning the system
|
|
36
|
+
this.learnedWeight = Math.max(0.5, Math.min(newWeight, 2.0));
|
|
37
|
+
debugLogger.log(`[AdaptiveTokenCalculator] Learned weight updated to ${this.learnedWeight.toFixed(3)} ` +
|
|
38
|
+
`(API Tokens: ${actualTokens}, Base Units: ${promptBaseUnits}, Target Ratio: ${targetWeight.toFixed(3)})`);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Retrieves the current learned weight multiplier.
|
|
42
|
+
*/
|
|
43
|
+
getLearnedWeight() {
|
|
44
|
+
return this.learnedWeight;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Returns the exact, unweighted Base Heuristic Units for the graph.
|
|
48
|
+
* This is used exactly once per interaction to capture the baseline sent to the API.
|
|
49
|
+
*/
|
|
50
|
+
getRawBaseUnits(nodes) {
|
|
51
|
+
return this.baseCalculator.calculateConcreteListTokens(nodes);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Returns the exact, unweighted Base Heuristic Units for a raw content chunk.
|
|
55
|
+
*/
|
|
56
|
+
getRawBaseUnitsForContent(content) {
|
|
57
|
+
return this.baseCalculator.calculateContentTokens(content);
|
|
58
|
+
}
|
|
59
|
+
calculateTokensAndBaseUnits(nodes) {
|
|
60
|
+
const baseUnits = this.baseCalculator.calculateConcreteListTokens(nodes);
|
|
61
|
+
return {
|
|
62
|
+
tokens: Math.round(baseUnits * this.learnedWeight),
|
|
63
|
+
baseUnits,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
calculateContentTokensAndBaseUnits(content) {
|
|
67
|
+
const baseUnits = this.baseCalculator.calculateContentTokens(content);
|
|
68
|
+
return {
|
|
69
|
+
tokens: Math.round(baseUnits * this.learnedWeight),
|
|
70
|
+
baseUnits,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// --- Delegation and Weighting ---
|
|
74
|
+
garbageCollectCache(liveNodeIds) {
|
|
75
|
+
this.baseCalculator.garbageCollectCache(liveNodeIds);
|
|
76
|
+
}
|
|
77
|
+
cacheNodeTokens(node) {
|
|
78
|
+
return this.baseCalculator.cacheNodeTokens(node);
|
|
79
|
+
}
|
|
80
|
+
calculateTokenBreakdown(nodes) {
|
|
81
|
+
const raw = this.baseCalculator.calculateTokenBreakdown(nodes);
|
|
82
|
+
return {
|
|
83
|
+
text: Math.round(raw.text * this.learnedWeight),
|
|
84
|
+
media: Math.round(raw.media * this.learnedWeight),
|
|
85
|
+
tool: Math.round(raw.tool * this.learnedWeight),
|
|
86
|
+
overhead: Math.round(raw.overhead * this.learnedWeight),
|
|
87
|
+
total: Math.round(raw.total * this.learnedWeight),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
estimateTokensForParts(parts) {
|
|
91
|
+
const baseUnits = this.baseCalculator.estimateTokensForParts(parts);
|
|
92
|
+
return Math.round(baseUnits * this.learnedWeight);
|
|
93
|
+
}
|
|
94
|
+
getTokenCost(node) {
|
|
95
|
+
const baseUnits = this.baseCalculator.getTokenCost(node);
|
|
96
|
+
return Math.round(baseUnits * this.learnedWeight);
|
|
97
|
+
}
|
|
98
|
+
calculateConcreteListTokens(nodes) {
|
|
99
|
+
const baseUnits = this.baseCalculator.calculateConcreteListTokens(nodes);
|
|
100
|
+
return Math.round(baseUnits * this.learnedWeight);
|
|
101
|
+
}
|
|
102
|
+
calculateContentTokens(content) {
|
|
103
|
+
const baseUnits = this.baseCalculator.calculateContentTokens(content);
|
|
104
|
+
return Math.round(baseUnits * this.learnedWeight);
|
|
105
|
+
}
|
|
106
|
+
estimateTokensForString(text) {
|
|
107
|
+
const baseUnits = this.baseCalculator.estimateTokensForString(text);
|
|
108
|
+
return Math.round(baseUnits * this.learnedWeight);
|
|
109
|
+
}
|
|
110
|
+
tokensToChars(tokens) {
|
|
111
|
+
// If weight is > 1.0 (we are inflating tokens), a single returned token is worth fewer chars.
|
|
112
|
+
// We reverse the math: convert requested tokens to target base units, then get chars.
|
|
113
|
+
return this.baseCalculator.tokensToChars(tokens / this.learnedWeight);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=adaptiveTokenCalculator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adaptiveTokenCalculator.js","sourceRoot":"","sources":["../../../../src/context/utils/adaptiveTokenCalculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect } from 'vitest';
|
|
7
|
+
import { AdaptiveTokenCalculator } from './adaptiveTokenCalculator.js';
|
|
8
|
+
import { NodeBehaviorRegistry } from '../graph/behaviorRegistry.js';
|
|
9
|
+
import { registerBuiltInBehaviors } from '../graph/builtinBehaviors.js';
|
|
10
|
+
import { ContextEventBus } from '../eventBus.js';
|
|
11
|
+
import { createDummyNode } from '../testing/contextTestUtils.js';
|
|
12
|
+
import { NodeType } from '../graph/types.js';
|
|
13
|
+
describe('AdaptiveTokenCalculator', () => {
|
|
14
|
+
const registry = new NodeBehaviorRegistry();
|
|
15
|
+
registerBuiltInBehaviors(registry);
|
|
16
|
+
const charsPerToken = 1; // Simplifies math
|
|
17
|
+
it('should initialize with a learned weight of 1.0', () => {
|
|
18
|
+
const eventBus = new ContextEventBus();
|
|
19
|
+
const calculator = new AdaptiveTokenCalculator(charsPerToken, registry, eventBus);
|
|
20
|
+
expect(calculator.getLearnedWeight()).toBe(1.0);
|
|
21
|
+
});
|
|
22
|
+
it('should dynamically update learned weight based on token ground truth events', () => {
|
|
23
|
+
const eventBus = new ContextEventBus();
|
|
24
|
+
const calculator = new AdaptiveTokenCalculator(charsPerToken, registry, eventBus);
|
|
25
|
+
// Initial state: weight = 1.0
|
|
26
|
+
// Simulate an event where the API reported fewer tokens than our base units
|
|
27
|
+
// targetWeight = 50 / 100 = 0.5
|
|
28
|
+
// newWeight = 1.0 * 0.8 + 0.5 * 0.2 = 0.8 + 0.1 = 0.9
|
|
29
|
+
eventBus.emitTokenGroundTruth({
|
|
30
|
+
actualTokens: 50,
|
|
31
|
+
promptBaseUnits: 100,
|
|
32
|
+
});
|
|
33
|
+
// JavaScript floating point precision means we should use toBeCloseTo
|
|
34
|
+
expect(calculator.getLearnedWeight()).toBeCloseTo(0.9, 5);
|
|
35
|
+
// Simulate another event
|
|
36
|
+
// newWeight = 0.9 * 0.8 + (150 / 100) * 0.2 = 0.72 + 0.3 = 1.02
|
|
37
|
+
eventBus.emitTokenGroundTruth({
|
|
38
|
+
actualTokens: 150,
|
|
39
|
+
promptBaseUnits: 100,
|
|
40
|
+
});
|
|
41
|
+
expect(calculator.getLearnedWeight()).toBeCloseTo(1.02, 5);
|
|
42
|
+
});
|
|
43
|
+
it('should clamp the learned weight between 0.5 and 2.0', () => {
|
|
44
|
+
const eventBus = new ContextEventBus();
|
|
45
|
+
const calculator = new AdaptiveTokenCalculator(charsPerToken, registry, eventBus);
|
|
46
|
+
// Push weight up extremely high (API returns 10x tokens)
|
|
47
|
+
for (let i = 0; i < 20; i++) {
|
|
48
|
+
eventBus.emitTokenGroundTruth({
|
|
49
|
+
actualTokens: 1000,
|
|
50
|
+
promptBaseUnits: 100,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
expect(calculator.getLearnedWeight()).toBe(2.0);
|
|
54
|
+
// Push weight down extremely low (API returns 0 tokens)
|
|
55
|
+
for (let i = 0; i < 20; i++) {
|
|
56
|
+
eventBus.emitTokenGroundTruth({ actualTokens: 0, promptBaseUnits: 100 });
|
|
57
|
+
}
|
|
58
|
+
expect(calculator.getLearnedWeight()).toBe(0.5);
|
|
59
|
+
});
|
|
60
|
+
it('should correctly apply the learned weight to node calculations while keeping raw base units stable', () => {
|
|
61
|
+
const eventBus = new ContextEventBus();
|
|
62
|
+
const calculator = new AdaptiveTokenCalculator(charsPerToken, registry, eventBus);
|
|
63
|
+
// Decrease the weight to exactly 0.5
|
|
64
|
+
for (let i = 0; i < 20; i++) {
|
|
65
|
+
eventBus.emitTokenGroundTruth({ actualTokens: 0, promptBaseUnits: 100 });
|
|
66
|
+
}
|
|
67
|
+
const turn1Id = 'turn-1';
|
|
68
|
+
const node1 = createDummyNode(turn1Id, NodeType.USER_PROMPT);
|
|
69
|
+
// Get raw base units directly
|
|
70
|
+
const rawTokens = calculator.calculateTokensAndBaseUnits([node1]).baseUnits;
|
|
71
|
+
// Get adjusted tokens
|
|
72
|
+
const adjustedTokens = calculator.calculateConcreteListTokens([node1]);
|
|
73
|
+
expect(adjustedTokens).toBe(Math.round(rawTokens * 0.5));
|
|
74
|
+
});
|
|
75
|
+
it('should ignore ground truth events with 0 promptBaseUnits to prevent division by zero', () => {
|
|
76
|
+
const eventBus = new ContextEventBus();
|
|
77
|
+
const calculator = new AdaptiveTokenCalculator(charsPerToken, registry, eventBus);
|
|
78
|
+
eventBus.emitTokenGroundTruth({
|
|
79
|
+
actualTokens: 100,
|
|
80
|
+
promptBaseUnits: 0,
|
|
81
|
+
});
|
|
82
|
+
expect(calculator.getLearnedWeight()).toBe(1.0);
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
//# sourceMappingURL=adaptiveTokenCalculator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adaptiveTokenCalculator.test.js","sourceRoot":"","sources":["../../../../src/context/utils/adaptiveTokenCalculator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,39 @@ import type { NodeBehaviorRegistry } from '../graph/behaviorRegistry.js';
|
|
|
10
10
|
* The flat token cost assigned to a single multi-modal asset (like an image tile)
|
|
11
11
|
* by the Gemini API. We use this as a baseline heuristic for inlineData/fileData.
|
|
12
12
|
*/
|
|
13
|
-
export
|
|
13
|
+
export interface ContextTokenCalculator {
|
|
14
|
+
estimateTokensForString(text: string): number;
|
|
15
|
+
tokensToChars(tokens: number): number;
|
|
16
|
+
garbageCollectCache(liveNodeIds: ReadonlySet<string>): void;
|
|
17
|
+
cacheNodeTokens(node: ConcreteNode): number;
|
|
18
|
+
getTokenCost(node: ConcreteNode): number;
|
|
19
|
+
calculateTokenBreakdown(nodes: readonly ConcreteNode[]): {
|
|
20
|
+
text: number;
|
|
21
|
+
media: number;
|
|
22
|
+
tool: number;
|
|
23
|
+
overhead: number;
|
|
24
|
+
total: number;
|
|
25
|
+
};
|
|
26
|
+
calculateConcreteListTokens(nodes: readonly ConcreteNode[]): number;
|
|
27
|
+
calculateContentTokens(content: Content): number;
|
|
28
|
+
estimateTokensForParts(parts: Part[]): number;
|
|
29
|
+
}
|
|
30
|
+
export interface AdvancedTokenCalculator extends ContextTokenCalculator {
|
|
31
|
+
getRawBaseUnits(nodes: readonly ConcreteNode[]): number;
|
|
32
|
+
getRawBaseUnitsForContent(content: Content): number;
|
|
33
|
+
calculateTokensAndBaseUnits(nodes: readonly ConcreteNode[]): {
|
|
34
|
+
tokens: number;
|
|
35
|
+
baseUnits: number;
|
|
36
|
+
};
|
|
37
|
+
calculateContentTokensAndBaseUnits(content: Content): {
|
|
38
|
+
tokens: number;
|
|
39
|
+
baseUnits: number;
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A fast, deterministic token heuristic calculator.
|
|
44
|
+
*/
|
|
45
|
+
export declare class StaticTokenCalculator implements AdvancedTokenCalculator {
|
|
14
46
|
private readonly charsPerToken;
|
|
15
47
|
private readonly registry;
|
|
16
48
|
private readonly tokenCache;
|
|
@@ -51,6 +83,20 @@ export declare class ContextTokenCalculator {
|
|
|
51
83
|
tool: number;
|
|
52
84
|
overhead: number;
|
|
53
85
|
};
|
|
86
|
+
/**
|
|
87
|
+
* For the static calculator, Raw Base Units are exactly the same as the final tokens,
|
|
88
|
+
* because there is no dynamic learned weight (the multiplier is effectively 1.0).
|
|
89
|
+
*/
|
|
90
|
+
getRawBaseUnits(nodes: readonly ConcreteNode[]): number;
|
|
91
|
+
getRawBaseUnitsForContent(content: Content): number;
|
|
92
|
+
calculateTokensAndBaseUnits(nodes: readonly ConcreteNode[]): {
|
|
93
|
+
tokens: number;
|
|
94
|
+
baseUnits: number;
|
|
95
|
+
};
|
|
96
|
+
calculateContentTokensAndBaseUnits(content: Content): {
|
|
97
|
+
tokens: number;
|
|
98
|
+
baseUnits: number;
|
|
99
|
+
};
|
|
54
100
|
/**
|
|
55
101
|
* Fast calculation for a flat array of ConcreteNodes (The Nodes).
|
|
56
102
|
* It relies entirely on the O(1) sidecar token cache.
|
|
@@ -5,10 +5,9 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { estimateTokenCountSync, MSG_OVERHEAD_TOKENS, } from '../../utils/tokenCalculation.js';
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
9
|
-
* by the Gemini API. We use this as a baseline heuristic for inlineData/fileData.
|
|
8
|
+
* A fast, deterministic token heuristic calculator.
|
|
10
9
|
*/
|
|
11
|
-
export class
|
|
10
|
+
export class StaticTokenCalculator {
|
|
12
11
|
charsPerToken;
|
|
13
12
|
registry;
|
|
14
13
|
tokenCache = new Map();
|
|
@@ -103,6 +102,24 @@ export class ContextTokenCalculator {
|
|
|
103
102
|
}
|
|
104
103
|
return breakdown;
|
|
105
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* For the static calculator, Raw Base Units are exactly the same as the final tokens,
|
|
107
|
+
* because there is no dynamic learned weight (the multiplier is effectively 1.0).
|
|
108
|
+
*/
|
|
109
|
+
getRawBaseUnits(nodes) {
|
|
110
|
+
return this.calculateConcreteListTokens(nodes);
|
|
111
|
+
}
|
|
112
|
+
getRawBaseUnitsForContent(content) {
|
|
113
|
+
return this.calculateContentTokens(content);
|
|
114
|
+
}
|
|
115
|
+
calculateTokensAndBaseUnits(nodes) {
|
|
116
|
+
const baseUnits = this.calculateConcreteListTokens(nodes);
|
|
117
|
+
return { tokens: baseUnits, baseUnits };
|
|
118
|
+
}
|
|
119
|
+
calculateContentTokensAndBaseUnits(content) {
|
|
120
|
+
const baseUnits = this.calculateContentTokens(content);
|
|
121
|
+
return { tokens: baseUnits, baseUnits };
|
|
122
|
+
}
|
|
106
123
|
/**
|
|
107
124
|
* Fast calculation for a flat array of ConcreteNodes (The Nodes).
|
|
108
125
|
* It relies entirely on the O(1) sidecar token cache.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextTokenCalculator.js","sourceRoot":"","sources":["../../../../src/context/utils/contextTokenCalculator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"contextTokenCalculator.js","sourceRoot":"","sources":["../../../../src/context/utils/contextTokenCalculator.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { describe, it, expect } from 'vitest';
|
|
7
|
-
import {
|
|
7
|
+
import { StaticTokenCalculator } from './contextTokenCalculator.js';
|
|
8
8
|
import { NodeBehaviorRegistry } from '../graph/behaviorRegistry.js';
|
|
9
9
|
import { registerBuiltInBehaviors } from '../graph/builtinBehaviors.js';
|
|
10
10
|
import { createDummyNode } from '../testing/contextTestUtils.js';
|
|
@@ -14,7 +14,7 @@ describe('ContextTokenCalculator', () => {
|
|
|
14
14
|
const registry = new NodeBehaviorRegistry();
|
|
15
15
|
registerBuiltInBehaviors(registry);
|
|
16
16
|
const charsPerToken = 1; // Simplifies math for text nodes in tests
|
|
17
|
-
const calculator = new
|
|
17
|
+
const calculator = new StaticTokenCalculator(charsPerToken, registry);
|
|
18
18
|
it('should include structural overhead for each unique turn', () => {
|
|
19
19
|
const turn1Id = 'turn-1';
|
|
20
20
|
const turn2Id = 'turn-2';
|
|
@@ -22,15 +22,15 @@ describe('ContextTokenCalculator', () => {
|
|
|
22
22
|
const node2 = createDummyNode(turn1Id, NodeType.USER_PROMPT); // Same turn
|
|
23
23
|
const node3 = createDummyNode(turn2Id, NodeType.AGENT_THOUGHT); // Different turn
|
|
24
24
|
const nodes = [node1, node2, node3];
|
|
25
|
-
// Estimated tokens (using
|
|
26
|
-
// node1:
|
|
27
|
-
// node2:
|
|
28
|
-
// node3:
|
|
25
|
+
// Estimated tokens (using charsPerToken = 1):
|
|
26
|
+
// node1: 17 chars / 1 = 17 tokens
|
|
27
|
+
// node2: 17 chars / 1 = 17 tokens
|
|
28
|
+
// node3: 19 chars / 1 = 19 tokens
|
|
29
29
|
// Turn 1 overhead: 5 tokens
|
|
30
30
|
// Turn 2 overhead: 5 tokens
|
|
31
|
-
// Total:
|
|
31
|
+
// Total: 17 + 17 + 19 + 5 + 5 = 63
|
|
32
32
|
const total = calculator.calculateConcreteListTokens(nodes);
|
|
33
|
-
expect(total).toBe(
|
|
33
|
+
expect(total).toBe(63);
|
|
34
34
|
});
|
|
35
35
|
it('should handle categorical breakdown with overhead', () => {
|
|
36
36
|
const turn1Id = 'turn-1';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextTokenCalculator.test.js","sourceRoot":"","sources":["../../../../src/context/utils/contextTokenCalculator.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"contextTokenCalculator.test.js","sourceRoot":"","sources":["../../../../src/context/utils/contextTokenCalculator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { ConcreteNode } from '../graph/types.js';
|
|
7
|
+
export interface FormatNodesOptions {
|
|
8
|
+
/**
|
|
9
|
+
* The maximum number of characters to retain from a tool response.
|
|
10
|
+
* Tool responses larger than this will be truncated to preserve LLM attention span
|
|
11
|
+
* and avoid context limits during summarization operations.
|
|
12
|
+
* Defaults to 2000.
|
|
13
|
+
*/
|
|
14
|
+
maxToolResponseChars?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Formats a sequence of Context Graph nodes into a dense, human/LLM-readable text transcript.
|
|
18
|
+
* This is used by summarization processors (like SnapshotGenerator and RollingSummaryProcessor)
|
|
19
|
+
* to serialize the graph before passing it to an LLM.
|
|
20
|
+
*/
|
|
21
|
+
export declare function formatNodesForLlm(nodes: readonly ConcreteNode[], options?: FormatNodesOptions): string;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Maps common tool names to semantic wrappers that improve LLM reading comprehension.
|
|
8
|
+
*/
|
|
9
|
+
function getSemanticToolWrapper(toolName) {
|
|
10
|
+
if (toolName.includes('search') || toolName.includes('grep'))
|
|
11
|
+
return `SEARCH RESULTS`;
|
|
12
|
+
if (toolName.includes('list') || toolName.includes('dir'))
|
|
13
|
+
return `WORKSPACE STRUCTURE`;
|
|
14
|
+
if (toolName.includes('shell') || toolName.includes('cmd'))
|
|
15
|
+
return `SHELL EXECUTION`;
|
|
16
|
+
if (toolName.includes('read') || toolName.includes('fetch'))
|
|
17
|
+
return `FILE/WEB CONTENT`;
|
|
18
|
+
return `TOOL RESPONSE`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Formats a sequence of Context Graph nodes into a dense, human/LLM-readable text transcript.
|
|
22
|
+
* This is used by summarization processors (like SnapshotGenerator and RollingSummaryProcessor)
|
|
23
|
+
* to serialize the graph before passing it to an LLM.
|
|
24
|
+
*/
|
|
25
|
+
export function formatNodesForLlm(nodes, options = {}) {
|
|
26
|
+
const maxToolChars = options.maxToolResponseChars ?? 2000;
|
|
27
|
+
let transcript = '';
|
|
28
|
+
// Extract unique chronological turn IDs
|
|
29
|
+
const uniqueTurns = Array.from(new Set(nodes.map((n) => n.turnId).filter(Boolean)));
|
|
30
|
+
for (const node of nodes) {
|
|
31
|
+
const payload = node.payload;
|
|
32
|
+
let nodeContent = '';
|
|
33
|
+
if (payload.text) {
|
|
34
|
+
nodeContent = payload.text;
|
|
35
|
+
}
|
|
36
|
+
else if (payload.functionCall) {
|
|
37
|
+
nodeContent = `CALL: ${payload.functionCall.name}(${JSON.stringify(payload.functionCall.args)})`;
|
|
38
|
+
}
|
|
39
|
+
else if (payload.functionResponse) {
|
|
40
|
+
const toolName = payload.functionResponse.name || 'unknown_tool';
|
|
41
|
+
const rawResponse = JSON.stringify(payload.functionResponse.response);
|
|
42
|
+
const semanticWrapper = getSemanticToolWrapper(toolName);
|
|
43
|
+
let formattedResponse = rawResponse;
|
|
44
|
+
if (rawResponse.length > maxToolChars) {
|
|
45
|
+
const half = Math.floor(maxToolChars / 2);
|
|
46
|
+
const truncatedCount = rawResponse.length - maxToolChars;
|
|
47
|
+
formattedResponse = `${rawResponse.substring(0, half)}... [TRUNCATED ${truncatedCount} chars] ...${rawResponse.substring(rawResponse.length - half)}`;
|
|
48
|
+
}
|
|
49
|
+
nodeContent = `[${semanticWrapper} (${toolName})]: ${formattedResponse}`;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
// Fallback for unexpected node shapes
|
|
53
|
+
nodeContent = JSON.stringify(payload);
|
|
54
|
+
}
|
|
55
|
+
const role = (node.role || 'system').toUpperCase();
|
|
56
|
+
// Calculate relative turn index (e.g., -2, -1, 0)
|
|
57
|
+
let turnMarker = '';
|
|
58
|
+
if (node.turnId) {
|
|
59
|
+
const idx = uniqueTurns.indexOf(node.turnId);
|
|
60
|
+
if (idx !== -1) {
|
|
61
|
+
const relativeIdx = idx - (uniqueTurns.length - 1);
|
|
62
|
+
turnMarker = `[Turn ${relativeIdx}] `;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
transcript += `${turnMarker}[${role}] [${node.type}]: ${nodeContent}\n`;
|
|
66
|
+
}
|
|
67
|
+
return transcript;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=formatNodesForLlm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatNodesForLlm.js","sourceRoot":"","sources":["../../../../src/context/utils/formatNodesForLlm.ts"],"names":[],"mappings":"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"}
|