@office-ai/aioncli-core 0.30.0 → 0.30.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/assets/theme-ansi-dark.png +0 -0
- package/dist/docs/assets/theme-atom-one-dark.png +0 -0
- package/dist/docs/assets/theme-ayu-dark.png +0 -0
- package/dist/docs/assets/theme-default-dark.png +0 -0
- package/dist/docs/assets/theme-dracula-dark.png +0 -0
- package/dist/docs/assets/theme-github-dark.png +0 -0
- package/dist/docs/assets/theme-holiday-dark.png +0 -0
- package/dist/docs/assets/theme-shades-of-purple-dark.png +0 -0
- package/dist/docs/assets/theme-solarized-dark.png +0 -0
- package/dist/docs/assets/theme-solarized-light.png +0 -0
- package/dist/docs/cli/notifications.md +58 -0
- package/dist/docs/redirects.json +20 -0
- package/dist/docs/reference/commands.md +563 -0
- package/dist/docs/reference/configuration.md +1804 -0
- package/dist/docs/reference/keyboard-shortcuts.md +168 -0
- package/dist/docs/reference/memport.md +246 -0
- package/dist/docs/reference/policy-engine.md +386 -0
- package/dist/docs/reference/tools.md +106 -0
- package/dist/docs/resources/faq.md +175 -0
- package/dist/docs/resources/quota-and-pricing.md +199 -0
- package/dist/docs/resources/tos-privacy.md +102 -0
- package/dist/docs/resources/troubleshooting.md +176 -0
- package/dist/docs/resources/uninstall.md +56 -0
- package/dist/src/agents/a2a-errors.d.ts +65 -0
- package/dist/src/agents/a2a-errors.js +164 -0
- package/dist/src/agents/a2a-errors.js.map +1 -0
- package/dist/src/agents/a2a-errors.test.d.ts +6 -0
- package/dist/src/agents/a2a-errors.test.js +183 -0
- package/dist/src/agents/a2a-errors.test.js.map +1 -0
- package/dist/src/agents/auth-provider/api-key-provider.d.ts +30 -0
- package/dist/src/agents/auth-provider/api-key-provider.js +66 -0
- package/dist/src/agents/auth-provider/api-key-provider.js.map +1 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.d.ts +6 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.js +130 -0
- package/dist/src/agents/auth-provider/api-key-provider.test.js.map +1 -0
- package/dist/src/agents/auth-provider/http-provider.d.ts +28 -0
- package/dist/src/agents/auth-provider/http-provider.js +73 -0
- package/dist/src/agents/auth-provider/http-provider.js.map +1 -0
- package/dist/src/agents/auth-provider/http-provider.test.d.ts +6 -0
- package/dist/src/agents/auth-provider/http-provider.test.js +112 -0
- package/dist/src/agents/auth-provider/http-provider.test.js.map +1 -0
- package/dist/src/agents/auth-provider/oauth2-provider.d.ts +65 -0
- package/dist/src/agents/auth-provider/oauth2-provider.js +233 -0
- package/dist/src/agents/auth-provider/oauth2-provider.js.map +1 -0
- package/dist/src/agents/auth-provider/oauth2-provider.test.d.ts +6 -0
- package/dist/src/agents/auth-provider/oauth2-provider.test.js +490 -0
- package/dist/src/agents/auth-provider/oauth2-provider.test.js.map +1 -0
- package/dist/src/agents/browser/analyzeScreenshot.d.ts +35 -0
- package/dist/src/agents/browser/analyzeScreenshot.js +183 -0
- package/dist/src/agents/browser/analyzeScreenshot.js.map +1 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.d.ts +6 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.js +161 -0
- package/dist/src/agents/browser/analyzeScreenshot.test.js.map +1 -0
- package/dist/src/agents/browser/automationOverlay.d.ts +26 -0
- package/dist/src/agents/browser/automationOverlay.js +100 -0
- package/dist/src/agents/browser/automationOverlay.js.map +1 -0
- package/dist/src/agents/browser/browserAgentDefinition.d.ts +50 -0
- package/dist/src/agents/browser/browserAgentDefinition.js +141 -0
- package/dist/src/agents/browser/browserAgentDefinition.js.map +1 -0
- package/dist/src/agents/browser/browserAgentFactory.d.ts +42 -0
- package/dist/src/agents/browser/browserAgentFactory.js +116 -0
- package/dist/src/agents/browser/browserAgentFactory.js.map +1 -0
- package/dist/src/agents/browser/browserAgentFactory.test.d.ts +6 -0
- package/dist/src/agents/browser/browserAgentFactory.test.js +240 -0
- package/dist/src/agents/browser/browserAgentFactory.test.js.map +1 -0
- package/dist/src/agents/browser/browserAgentInvocation.d.ts +34 -0
- package/dist/src/agents/browser/browserAgentInvocation.js +386 -0
- package/dist/src/agents/browser/browserAgentInvocation.js.map +1 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.d.ts +6 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.js +382 -0
- package/dist/src/agents/browser/browserAgentInvocation.test.js.map +1 -0
- package/dist/src/agents/browser/browserManager.d.ts +115 -0
- package/dist/src/agents/browser/browserManager.js +370 -0
- package/dist/src/agents/browser/browserManager.js.map +1 -0
- package/dist/src/agents/browser/browserManager.test.d.ts +6 -0
- package/dist/src/agents/browser/browserManager.test.js +382 -0
- package/dist/src/agents/browser/browserManager.test.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapper.d.ts +45 -0
- package/dist/src/agents/browser/mcpToolWrapper.js +358 -0
- package/dist/src/agents/browser/mcpToolWrapper.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.d.ts +6 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.js +126 -0
- package/dist/src/agents/browser/mcpToolWrapper.test.js.map +1 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.d.ts +6 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js +59 -0
- package/dist/src/agents/browser/mcpToolWrapperConfirmation.test.js.map +1 -0
- package/dist/src/agents/browser/modelAvailability.d.ts +23 -0
- package/dist/src/agents/browser/modelAvailability.js +23 -0
- package/dist/src/agents/browser/modelAvailability.js.map +1 -0
- package/dist/src/agents/cli-help-agent.d.ts +2 -2
- package/dist/src/billing/billing.d.ts +80 -0
- package/dist/src/billing/billing.js +128 -0
- package/dist/src/billing/billing.js.map +1 -0
- package/dist/src/billing/billing.test.d.ts +6 -0
- package/dist/src/billing/billing.test.js +182 -0
- package/dist/src/billing/billing.test.js.map +1 -0
- package/dist/src/billing/index.d.ts +6 -0
- package/dist/src/billing/index.js +7 -0
- package/dist/src/billing/index.js.map +1 -0
- package/dist/src/code_assist/oauth2.d.ts +1 -1
- package/dist/src/code_assist/types.d.ts +26 -26
- package/dist/src/config/agent-loop-context.d.ts +22 -0
- package/dist/src/config/agent-loop-context.js +7 -0
- package/dist/src/config/agent-loop-context.js.map +1 -0
- package/dist/src/config/trackerFeatureFlag.test.d.ts +6 -0
- package/dist/src/config/trackerFeatureFlag.test.js +43 -0
- package/dist/src/config/trackerFeatureFlag.test.js.map +1 -0
- package/dist/src/config/userHintService.d.ts +46 -0
- package/dist/src/config/userHintService.js +81 -0
- package/dist/src/config/userHintService.js.map +1 -0
- package/dist/src/config/userHintService.test.d.ts +6 -0
- package/dist/src/config/userHintService.test.js +62 -0
- package/dist/src/config/userHintService.test.js.map +1 -0
- package/dist/src/core/localLiteRtLmClient.d.ts +24 -0
- package/dist/src/core/localLiteRtLmClient.js +77 -0
- package/dist/src/core/localLiteRtLmClient.js.map +1 -0
- package/dist/src/core/localLiteRtLmClient.test.d.ts +6 -0
- package/dist/src/core/localLiteRtLmClient.test.js +87 -0
- package/dist/src/core/localLiteRtLmClient.test.js.map +1 -0
- package/dist/src/core/openaiContentGenerator.d.ts +1 -0
- package/dist/src/core/openaiContentGenerator.js +13 -13
- package/dist/src/core/openaiContentGenerator.js.map +1 -1
- package/dist/src/hooks/runtimeHooks.test.d.ts +6 -0
- package/dist/src/hooks/runtimeHooks.test.js +100 -0
- package/dist/src/hooks/runtimeHooks.test.js.map +1 -0
- package/dist/src/ide/types.d.ts +6 -6
- package/dist/src/mcp/mcp-oauth-provider.d.ts +43 -0
- package/dist/src/mcp/mcp-oauth-provider.js +67 -0
- package/dist/src/mcp/mcp-oauth-provider.js.map +1 -0
- package/dist/src/mcp/mcp-oauth-provider.test.d.ts +6 -0
- package/dist/src/mcp/mcp-oauth-provider.test.js +63 -0
- package/dist/src/mcp/mcp-oauth-provider.test.js.map +1 -0
- package/dist/src/policy/integrity.d.ts +45 -0
- package/dist/src/policy/integrity.js +121 -0
- package/dist/src/policy/integrity.js.map +1 -0
- package/dist/src/policy/integrity.test.d.ts +6 -0
- package/dist/src/policy/integrity.test.js +132 -0
- package/dist/src/policy/integrity.test.js.map +1 -0
- package/dist/src/policy/policies/conseca.toml +6 -0
- package/dist/src/policy/workspace-policy.test.js +231 -0
- package/dist/src/policy/workspace-policy.test.js.map +1 -0
- package/dist/src/routing/strategies/approvalModeStrategy.d.ts +18 -0
- package/dist/src/routing/strategies/approvalModeStrategy.js +59 -0
- package/dist/src/routing/strategies/approvalModeStrategy.js.map +1 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.d.ts +6 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.js +140 -0
- package/dist/src/routing/strategies/approvalModeStrategy.test.js.map +1 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.d.ts +14 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.js +182 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.js.map +1 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.d.ts +6 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js +218 -0
- package/dist/src/routing/strategies/gemmaClassifierStrategy.test.js.map +1 -0
- package/dist/src/safety/conseca/conseca.d.ts +31 -0
- package/dist/src/safety/conseca/conseca.js +105 -0
- package/dist/src/safety/conseca/conseca.js.map +1 -0
- package/dist/src/safety/conseca/conseca.test.js +226 -0
- package/dist/src/safety/conseca/conseca.test.js.map +1 -0
- package/dist/src/safety/conseca/integration.test.js +19 -0
- package/dist/src/safety/conseca/integration.test.js.map +1 -0
- package/dist/src/safety/conseca/policy-enforcer.d.ts +13 -0
- package/dist/src/safety/conseca/policy-enforcer.js +135 -0
- package/dist/src/safety/conseca/policy-enforcer.js.map +1 -0
- package/dist/src/safety/conseca/policy-enforcer.test.js +141 -0
- package/dist/src/safety/conseca/policy-enforcer.test.js.map +1 -0
- package/dist/src/safety/conseca/policy-generator.d.ts +15 -0
- package/dist/src/safety/conseca/policy-generator.js +144 -0
- package/dist/src/safety/conseca/policy-generator.js.map +1 -0
- package/dist/src/safety/conseca/policy-generator.test.d.ts +6 -0
- package/dist/src/safety/conseca/policy-generator.test.js +84 -0
- package/dist/src/safety/conseca/policy-generator.test.js.map +1 -0
- package/dist/src/safety/conseca/types.d.ts +15 -0
- package/dist/src/safety/conseca/types.js +7 -0
- package/dist/src/safety/conseca/types.js.map +1 -0
- package/dist/src/scheduler/scheduler_parallel.test.d.ts +6 -0
- package/dist/src/scheduler/scheduler_parallel.test.js +401 -0
- package/dist/src/scheduler/scheduler_parallel.test.js.map +1 -0
- package/dist/src/services/FolderTrustDiscoveryService.d.ts +32 -0
- package/dist/src/services/FolderTrustDiscoveryService.js +169 -0
- package/dist/src/services/FolderTrustDiscoveryService.js.map +1 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.d.ts +6 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.js +118 -0
- package/dist/src/services/FolderTrustDiscoveryService.test.js.map +1 -0
- package/dist/src/services/fileKeychain.d.ts +24 -0
- package/dist/src/services/fileKeychain.js +123 -0
- package/dist/src/services/fileKeychain.js.map +1 -0
- package/dist/src/services/keychainService.d.ts +51 -0
- package/dist/src/services/keychainService.js +133 -0
- package/dist/src/services/keychainService.js.map +1 -0
- package/dist/src/services/keychainService.test.d.ts +6 -0
- package/dist/src/services/keychainService.test.js +150 -0
- package/dist/src/services/keychainService.test.js.map +1 -0
- package/dist/src/services/keychainTypes.d.ts +41 -0
- package/dist/src/services/keychainTypes.js +18 -0
- package/dist/src/services/keychainTypes.js.map +1 -0
- package/dist/src/services/trackerService.d.ts +49 -0
- package/dist/src/services/trackerService.js +193 -0
- package/dist/src/services/trackerService.js.map +1 -0
- package/dist/src/services/trackerService.test.d.ts +6 -0
- package/dist/src/services/trackerService.test.js +117 -0
- package/dist/src/services/trackerService.test.js.map +1 -0
- package/dist/src/services/trackerTypes.d.ts +51 -0
- package/dist/src/services/trackerTypes.js +33 -0
- package/dist/src/services/trackerTypes.js.map +1 -0
- package/dist/src/telemetry/billingEvents.d.ts +75 -0
- package/dist/src/telemetry/billingEvents.js +181 -0
- package/dist/src/telemetry/billingEvents.js.map +1 -0
- package/dist/src/telemetry/billingEvents.test.d.ts +6 -0
- package/dist/src/telemetry/billingEvents.test.js +139 -0
- package/dist/src/telemetry/billingEvents.test.js.map +1 -0
- package/dist/src/telemetry/conseca-logger.d.ts +9 -0
- package/dist/src/telemetry/conseca-logger.js +91 -0
- package/dist/src/telemetry/conseca-logger.js.map +1 -0
- package/dist/src/telemetry/conseca-logger.test.d.ts +6 -0
- package/dist/src/telemetry/conseca-logger.test.js +90 -0
- package/dist/src/telemetry/conseca-logger.test.js.map +1 -0
- package/dist/src/telemetry/trace.test.d.ts +6 -0
- package/dist/src/telemetry/trace.test.js +116 -0
- package/dist/src/telemetry/trace.test.js.map +1 -0
- package/dist/src/tools/definitions/trackerTools.d.ts +12 -0
- package/dist/src/tools/definitions/trackerTools.js +146 -0
- package/dist/src/tools/definitions/trackerTools.js.map +1 -0
- package/dist/src/tools/diff-utils.d.ts +9 -0
- package/dist/src/tools/diff-utils.js +66 -0
- package/dist/src/tools/diff-utils.js.map +1 -0
- package/dist/src/tools/diff-utils.test.d.ts +6 -0
- package/dist/src/tools/diff-utils.test.js +53 -0
- package/dist/src/tools/diff-utils.test.js.map +1 -0
- package/dist/src/tools/grep-utils.d.ts +49 -0
- package/dist/src/tools/grep-utils.js +147 -0
- package/dist/src/tools/grep-utils.js.map +1 -0
- package/dist/src/tools/omissionPlaceholderDetector.d.ts +15 -0
- package/dist/src/tools/omissionPlaceholderDetector.js +90 -0
- package/dist/src/tools/omissionPlaceholderDetector.js.map +1 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.d.ts +6 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.js +49 -0
- package/dist/src/tools/omissionPlaceholderDetector.test.js.map +1 -0
- package/dist/src/tools/trackerTools.d.ts +122 -0
- package/dist/src/tools/trackerTools.js +365 -0
- package/dist/src/tools/trackerTools.js.map +1 -0
- package/dist/src/tools/trackerTools.test.d.ts +6 -0
- package/dist/src/tools/trackerTools.test.js +97 -0
- package/dist/src/tools/trackerTools.test.js.map +1 -0
- package/dist/src/utils/approvalModeUtils.d.ts +14 -0
- package/dist/src/utils/approvalModeUtils.js +35 -0
- package/dist/src/utils/approvalModeUtils.js.map +1 -0
- package/dist/src/utils/approvalModeUtils.test.d.ts +6 -0
- package/dist/src/utils/approvalModeUtils.test.js +36 -0
- package/dist/src/utils/approvalModeUtils.test.js.map +1 -0
- package/dist/src/utils/cache.d.ts +63 -0
- package/dist/src/utils/cache.js +103 -0
- package/dist/src/utils/cache.js.map +1 -0
- package/dist/src/utils/cache.test.d.ts +6 -0
- package/dist/src/utils/cache.test.js +158 -0
- package/dist/src/utils/cache.test.js.map +1 -0
- package/dist/src/utils/checkpointUtils.d.ts +2 -2
- package/dist/src/utils/compatibility.d.ts +41 -0
- package/dist/src/utils/compatibility.js +112 -0
- package/dist/src/utils/compatibility.js.map +1 -0
- package/dist/src/utils/compatibility.test.d.ts +6 -0
- package/dist/src/utils/compatibility.test.js +233 -0
- package/dist/src/utils/compatibility.test.js.map +1 -0
- package/dist/src/utils/envExpansion.d.ts +18 -0
- package/dist/src/utils/envExpansion.js +46 -0
- package/dist/src/utils/envExpansion.js.map +1 -0
- package/dist/src/utils/envExpansion.test.d.ts +6 -0
- package/dist/src/utils/envExpansion.test.js +110 -0
- package/dist/src/utils/envExpansion.test.js.map +1 -0
- package/dist/src/utils/errors_timeout.test.d.ts +6 -0
- package/dist/src/utils/errors_timeout.test.js +40 -0
- package/dist/src/utils/errors_timeout.test.js.map +1 -0
- package/dist/src/utils/fetch.test.d.ts +6 -0
- package/dist/src/utils/fetch.test.js +206 -0
- package/dist/src/utils/fetch.test.js.map +1 -0
- package/dist/src/utils/markdownUtils.d.ts +22 -0
- package/dist/src/utils/markdownUtils.js +126 -0
- package/dist/src/utils/markdownUtils.js.map +1 -0
- package/dist/src/utils/markdownUtils.test.d.ts +6 -0
- package/dist/src/utils/markdownUtils.test.js +107 -0
- package/dist/src/utils/markdownUtils.test.js.map +1 -0
- package/dist/src/utils/oauth-flow.d.ts +105 -0
- package/dist/src/utils/oauth-flow.js +370 -0
- package/dist/src/utils/oauth-flow.js.map +1 -0
- package/dist/src/utils/oauth-flow.test.d.ts +6 -0
- package/dist/src/utils/oauth-flow.test.js +360 -0
- package/dist/src/utils/oauth-flow.test.js.map +1 -0
- package/dist/src/utils/sessionUtils.d.ts +14 -0
- package/dist/src/utils/sessionUtils.js +122 -0
- package/dist/src/utils/sessionUtils.js.map +1 -0
- package/dist/src/utils/sessionUtils.test.d.ts +1 -0
- package/dist/src/utils/sessionUtils.test.js +171 -0
- package/dist/src/utils/sessionUtils.test.js.map +1 -0
- package/dist/src/voice/responseFormatter.d.ts +38 -0
- package/dist/src/voice/responseFormatter.js +130 -0
- package/dist/src/voice/responseFormatter.js.map +1 -0
- package/dist/src/voice/responseFormatter.test.d.ts +6 -0
- package/dist/src/voice/responseFormatter.test.js +214 -0
- package/dist/src/voice/responseFormatter.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/dist/docs/CONTRIBUTING.md +0 -555
- package/dist/src/agents/executor.d.ts +0 -114
- package/dist/src/agents/executor.js +0 -779
- package/dist/src/agents/executor.js.map +0 -1
- package/dist/src/agents/executor.test.js +0 -1362
- package/dist/src/agents/executor.test.js.map +0 -1
- package/dist/src/agents/invocation.d.ts +0 -46
- package/dist/src/agents/invocation.js +0 -102
- package/dist/src/agents/invocation.js.map +0 -1
- package/dist/src/agents/invocation.test.js +0 -215
- package/dist/src/agents/invocation.test.js.map +0 -1
- package/dist/src/core/subagent.d.ts +0 -236
- package/dist/src/core/subagent.js +0 -482
- package/dist/src/core/subagent.js.map +0 -1
- package/dist/src/core/subagent.test.js +0 -530
- package/dist/src/core/subagent.test.js.map +0 -1
- package/dist/src/tools/smart-edit.d.ts +0 -78
- package/dist/src/tools/smart-edit.js +0 -717
- package/dist/src/tools/smart-edit.js.map +0 -1
- package/dist/src/tools/smart-edit.test.js +0 -592
- package/dist/src/tools/smart-edit.test.js.map +0 -1
- /package/dist/src/{agents/executor.test.d.ts → policy/workspace-policy.test.d.ts} +0 -0
- /package/dist/src/{agents/invocation.test.d.ts → safety/conseca/conseca.test.d.ts} +0 -0
- /package/dist/src/{core/subagent.test.d.ts → safety/conseca/integration.test.d.ts} +0 -0
- /package/dist/src/{tools/smart-edit.test.d.ts → safety/conseca/policy-enforcer.test.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-loop-context.js","sourceRoot":"","sources":["../../../src/config/agent-loop-context.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,43 @@
|
|
|
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 { Config } from './config.js';
|
|
8
|
+
import { TRACKER_CREATE_TASK_TOOL_NAME } from '../tools/tool-names.js';
|
|
9
|
+
import * as os from 'node:os';
|
|
10
|
+
describe('Config Tracker Feature Flag', () => {
|
|
11
|
+
const baseParams = {
|
|
12
|
+
sessionId: 'test-session',
|
|
13
|
+
targetDir: os.tmpdir(),
|
|
14
|
+
cwd: os.tmpdir(),
|
|
15
|
+
model: 'gemini-1.5-pro',
|
|
16
|
+
debugMode: false,
|
|
17
|
+
};
|
|
18
|
+
it('should not register tracker tools by default', async () => {
|
|
19
|
+
const config = new Config(baseParams);
|
|
20
|
+
await config.initialize();
|
|
21
|
+
const registry = config.getToolRegistry();
|
|
22
|
+
expect(registry.getTool(TRACKER_CREATE_TASK_TOOL_NAME)).toBeUndefined();
|
|
23
|
+
});
|
|
24
|
+
it('should register tracker tools when tracker is enabled', async () => {
|
|
25
|
+
const config = new Config({
|
|
26
|
+
...baseParams,
|
|
27
|
+
tracker: true,
|
|
28
|
+
});
|
|
29
|
+
await config.initialize();
|
|
30
|
+
const registry = config.getToolRegistry();
|
|
31
|
+
expect(registry.getTool(TRACKER_CREATE_TASK_TOOL_NAME)).toBeDefined();
|
|
32
|
+
});
|
|
33
|
+
it('should not register tracker tools when tracker is explicitly disabled', async () => {
|
|
34
|
+
const config = new Config({
|
|
35
|
+
...baseParams,
|
|
36
|
+
tracker: false,
|
|
37
|
+
});
|
|
38
|
+
await config.initialize();
|
|
39
|
+
const registry = config.getToolRegistry();
|
|
40
|
+
expect(registry.getTool(TRACKER_CREATE_TASK_TOOL_NAME)).toBeUndefined();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=trackerFeatureFlag.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trackerFeatureFlag.test.js","sourceRoot":"","sources":["../../../src/config/trackerFeatureFlag.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,MAAM,UAAU,GAAG;QACjB,SAAS,EAAE,cAAc;QACzB,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE;QACtB,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,gBAAgB;QACvB,SAAS,EAAE,KAAK;KACjB,CAAC;IAEF,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,GAAG,UAAU;YACb,OAAO,EAAE,IAAI;SACd,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,GAAG,UAAU;YACb,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,eAAe,EAAE,CAAC;QAC1C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Service for managing user steering hints during a session.
|
|
8
|
+
*/
|
|
9
|
+
export declare class UserHintService {
|
|
10
|
+
private readonly isEnabled;
|
|
11
|
+
private readonly userHints;
|
|
12
|
+
private readonly userHintListeners;
|
|
13
|
+
constructor(isEnabled: () => boolean);
|
|
14
|
+
/**
|
|
15
|
+
* Adds a new steering hint from the user.
|
|
16
|
+
*/
|
|
17
|
+
addUserHint(hint: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Registers a listener for new user hints.
|
|
20
|
+
*/
|
|
21
|
+
onUserHint(listener: (hint: string) => void): void;
|
|
22
|
+
/**
|
|
23
|
+
* Unregisters a listener for new user hints.
|
|
24
|
+
*/
|
|
25
|
+
offUserHint(listener: (hint: string) => void): void;
|
|
26
|
+
/**
|
|
27
|
+
* Returns all collected hints.
|
|
28
|
+
*/
|
|
29
|
+
getUserHints(): string[];
|
|
30
|
+
/**
|
|
31
|
+
* Returns hints added after a specific index.
|
|
32
|
+
*/
|
|
33
|
+
getUserHintsAfter(index: number): string[];
|
|
34
|
+
/**
|
|
35
|
+
* Returns the index of the latest hint.
|
|
36
|
+
*/
|
|
37
|
+
getLatestHintIndex(): number;
|
|
38
|
+
/**
|
|
39
|
+
* Returns the timestamp of the last user hint.
|
|
40
|
+
*/
|
|
41
|
+
getLastUserHintAt(): number | null;
|
|
42
|
+
/**
|
|
43
|
+
* Clears all collected hints.
|
|
44
|
+
*/
|
|
45
|
+
clear(): void;
|
|
46
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Service for managing user steering hints during a session.
|
|
8
|
+
*/
|
|
9
|
+
export class UserHintService {
|
|
10
|
+
isEnabled;
|
|
11
|
+
userHints = [];
|
|
12
|
+
userHintListeners = new Set();
|
|
13
|
+
constructor(isEnabled) {
|
|
14
|
+
this.isEnabled = isEnabled;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Adds a new steering hint from the user.
|
|
18
|
+
*/
|
|
19
|
+
addUserHint(hint) {
|
|
20
|
+
if (!this.isEnabled()) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const trimmed = hint.trim();
|
|
24
|
+
if (trimmed.length === 0) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
this.userHints.push({ text: trimmed, timestamp: Date.now() });
|
|
28
|
+
for (const listener of this.userHintListeners) {
|
|
29
|
+
listener(trimmed);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Registers a listener for new user hints.
|
|
34
|
+
*/
|
|
35
|
+
onUserHint(listener) {
|
|
36
|
+
this.userHintListeners.add(listener);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Unregisters a listener for new user hints.
|
|
40
|
+
*/
|
|
41
|
+
offUserHint(listener) {
|
|
42
|
+
this.userHintListeners.delete(listener);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Returns all collected hints.
|
|
46
|
+
*/
|
|
47
|
+
getUserHints() {
|
|
48
|
+
return this.userHints.map((h) => h.text);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Returns hints added after a specific index.
|
|
52
|
+
*/
|
|
53
|
+
getUserHintsAfter(index) {
|
|
54
|
+
if (index < 0) {
|
|
55
|
+
return this.getUserHints();
|
|
56
|
+
}
|
|
57
|
+
return this.userHints.slice(index + 1).map((h) => h.text);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Returns the index of the latest hint.
|
|
61
|
+
*/
|
|
62
|
+
getLatestHintIndex() {
|
|
63
|
+
return this.userHints.length - 1;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Returns the timestamp of the last user hint.
|
|
67
|
+
*/
|
|
68
|
+
getLastUserHintAt() {
|
|
69
|
+
if (this.userHints.length === 0) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
return this.userHints[this.userHints.length - 1].timestamp;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Clears all collected hints.
|
|
76
|
+
*/
|
|
77
|
+
clear() {
|
|
78
|
+
this.userHints.length = 0;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=userHintService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userHintService.js","sourceRoot":"","sources":["../../../src/config/userHintService.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,OAAO,eAAe;IAIG;IAHZ,SAAS,GAA+C,EAAE,CAAC;IAC3D,iBAAiB,GAAgC,IAAI,GAAG,EAAE,CAAC;IAE5E,YAA6B,SAAwB;QAAxB,cAAS,GAAT,SAAS,CAAe;IAAG,CAAC;IAEzD;;OAEG;IACH,WAAW,CAAC,IAAY;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC9D,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC9C,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,QAAgC;QACzC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,QAAgC;QAC1C,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,KAAa;QAC7B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;QAC7B,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
7
|
+
import { UserHintService } from './userHintService.js';
|
|
8
|
+
describe('UserHintService', () => {
|
|
9
|
+
it('is disabled by default and ignores hints', () => {
|
|
10
|
+
const service = new UserHintService(() => false);
|
|
11
|
+
service.addUserHint('this hint should be ignored');
|
|
12
|
+
expect(service.getUserHints()).toEqual([]);
|
|
13
|
+
expect(service.getLatestHintIndex()).toBe(-1);
|
|
14
|
+
});
|
|
15
|
+
it('stores trimmed hints and exposes them via indexing when enabled', () => {
|
|
16
|
+
const service = new UserHintService(() => true);
|
|
17
|
+
service.addUserHint(' first hint ');
|
|
18
|
+
service.addUserHint('second hint');
|
|
19
|
+
service.addUserHint(' ');
|
|
20
|
+
expect(service.getUserHints()).toEqual(['first hint', 'second hint']);
|
|
21
|
+
expect(service.getLatestHintIndex()).toBe(1);
|
|
22
|
+
expect(service.getUserHintsAfter(-1)).toEqual([
|
|
23
|
+
'first hint',
|
|
24
|
+
'second hint',
|
|
25
|
+
]);
|
|
26
|
+
expect(service.getUserHintsAfter(0)).toEqual(['second hint']);
|
|
27
|
+
expect(service.getUserHintsAfter(1)).toEqual([]);
|
|
28
|
+
});
|
|
29
|
+
it('tracks the last hint timestamp', () => {
|
|
30
|
+
const service = new UserHintService(() => true);
|
|
31
|
+
expect(service.getLastUserHintAt()).toBeNull();
|
|
32
|
+
service.addUserHint('hint');
|
|
33
|
+
const timestamp = service.getLastUserHintAt();
|
|
34
|
+
expect(timestamp).not.toBeNull();
|
|
35
|
+
expect(typeof timestamp).toBe('number');
|
|
36
|
+
});
|
|
37
|
+
it('notifies listeners when a hint is added', () => {
|
|
38
|
+
const service = new UserHintService(() => true);
|
|
39
|
+
const listener = vi.fn();
|
|
40
|
+
service.onUserHint(listener);
|
|
41
|
+
service.addUserHint('new hint');
|
|
42
|
+
expect(listener).toHaveBeenCalledWith('new hint');
|
|
43
|
+
});
|
|
44
|
+
it('does NOT notify listeners after they are unregistered', () => {
|
|
45
|
+
const service = new UserHintService(() => true);
|
|
46
|
+
const listener = vi.fn();
|
|
47
|
+
service.onUserHint(listener);
|
|
48
|
+
service.offUserHint(listener);
|
|
49
|
+
service.addUserHint('ignored hint');
|
|
50
|
+
expect(listener).not.toHaveBeenCalled();
|
|
51
|
+
});
|
|
52
|
+
it('should clear all hints', () => {
|
|
53
|
+
const service = new UserHintService(() => true);
|
|
54
|
+
service.addUserHint('hint 1');
|
|
55
|
+
service.addUserHint('hint 2');
|
|
56
|
+
expect(service.getUserHints()).toHaveLength(2);
|
|
57
|
+
service.clear();
|
|
58
|
+
expect(service.getUserHints()).toHaveLength(0);
|
|
59
|
+
expect(service.getLatestHintIndex()).toBe(-1);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//# sourceMappingURL=userHintService.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"userHintService.test.js","sourceRoot":"","sources":["../../../src/config/userHintService.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { type Content } from '@google/genai';
|
|
7
|
+
import type { Config } from '../config/config.js';
|
|
8
|
+
/**
|
|
9
|
+
* A client for making single, non-streaming calls to a local Gemini-compatible API
|
|
10
|
+
* and expecting a JSON response.
|
|
11
|
+
*/
|
|
12
|
+
export declare class LocalLiteRtLmClient {
|
|
13
|
+
private readonly host;
|
|
14
|
+
private readonly model;
|
|
15
|
+
private readonly client;
|
|
16
|
+
constructor(config: Config);
|
|
17
|
+
/**
|
|
18
|
+
* Sends a prompt to the local Gemini model and expects a JSON object in response.
|
|
19
|
+
* @param contents The history and current prompt.
|
|
20
|
+
* @param systemInstruction The system prompt.
|
|
21
|
+
* @returns A promise that resolves to the parsed JSON object.
|
|
22
|
+
*/
|
|
23
|
+
generateJson(contents: Content[], systemInstruction: string, reminder?: string, abortSignal?: AbortSignal): Promise<object>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { GoogleGenAI } from '@google/genai';
|
|
7
|
+
import { debugLogger } from '../utils/debugLogger.js';
|
|
8
|
+
/**
|
|
9
|
+
* A client for making single, non-streaming calls to a local Gemini-compatible API
|
|
10
|
+
* and expecting a JSON response.
|
|
11
|
+
*/
|
|
12
|
+
export class LocalLiteRtLmClient {
|
|
13
|
+
host;
|
|
14
|
+
model;
|
|
15
|
+
client;
|
|
16
|
+
constructor(config) {
|
|
17
|
+
const gemmaModelRouterSettings = config.getGemmaModelRouterSettings();
|
|
18
|
+
this.host = gemmaModelRouterSettings.classifier.host;
|
|
19
|
+
this.model = gemmaModelRouterSettings.classifier.model;
|
|
20
|
+
this.client = new GoogleGenAI({
|
|
21
|
+
// The LiteRT-LM server does not require an API key, but the SDK requires one to be set even for local endpoints. This is a dummy value and is not used for authentication.
|
|
22
|
+
apiKey: 'no-api-key-needed',
|
|
23
|
+
httpOptions: {
|
|
24
|
+
baseUrl: this.host,
|
|
25
|
+
// If the LiteRT-LM server is started but the wrong port is set, there will be a lengthy TCP timeout (here fixed to be 10 seconds).
|
|
26
|
+
// If the LiteRT-LM server is not started, there will be an immediate connection refusal.
|
|
27
|
+
// If the LiteRT-LM server is started and the model is unsupported or not downloaded, the server will return an error immediately.
|
|
28
|
+
// If the model's context window is exceeded, the server will return an error immediately.
|
|
29
|
+
timeout: 10000,
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Sends a prompt to the local Gemini model and expects a JSON object in response.
|
|
35
|
+
* @param contents The history and current prompt.
|
|
36
|
+
* @param systemInstruction The system prompt.
|
|
37
|
+
* @returns A promise that resolves to the parsed JSON object.
|
|
38
|
+
*/
|
|
39
|
+
async generateJson(contents, systemInstruction, reminder, abortSignal) {
|
|
40
|
+
const geminiContents = contents.map((c) => ({
|
|
41
|
+
role: c.role,
|
|
42
|
+
parts: c.parts ? c.parts.map((p) => ({ text: p.text })) : [],
|
|
43
|
+
}));
|
|
44
|
+
if (reminder) {
|
|
45
|
+
const lastContent = geminiContents.at(-1);
|
|
46
|
+
if (lastContent?.role === 'user' && lastContent.parts?.[0]?.text) {
|
|
47
|
+
lastContent.parts[0].text += `\n\n${reminder}`;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
try {
|
|
51
|
+
const result = await this.client.models.generateContent({
|
|
52
|
+
model: this.model,
|
|
53
|
+
contents: geminiContents,
|
|
54
|
+
config: {
|
|
55
|
+
responseMimeType: 'application/json',
|
|
56
|
+
systemInstruction: systemInstruction
|
|
57
|
+
? { parts: [{ text: systemInstruction }] }
|
|
58
|
+
: undefined,
|
|
59
|
+
temperature: 0,
|
|
60
|
+
maxOutputTokens: 256,
|
|
61
|
+
abortSignal,
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
const text = result.text;
|
|
65
|
+
if (!text) {
|
|
66
|
+
throw new Error('Invalid response from Local Gemini API: No text found');
|
|
67
|
+
}
|
|
68
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
69
|
+
return JSON.parse(result.text);
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
debugLogger.error(`[LocalLiteRtLmClient] Failed to generate content:`, error);
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=localLiteRtLmClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localLiteRtLmClient.js","sourceRoot":"","sources":["../../../src/core/localLiteRtLmClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,WAAW,EAAgB,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IACb,IAAI,CAAS;IACb,KAAK,CAAS;IACd,MAAM,CAAc;IAErC,YAAY,MAAc;QACxB,MAAM,wBAAwB,GAAG,MAAM,CAAC,2BAA2B,EAAE,CAAC;QACtE,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC,UAAW,CAAC,IAAK,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,wBAAwB,CAAC,UAAW,CAAC,KAAM,CAAC;QAEzD,IAAI,CAAC,MAAM,GAAG,IAAI,WAAW,CAAC;YAC5B,2KAA2K;YAC3K,MAAM,EAAE,mBAAmB;YAC3B,WAAW,EAAE;gBACX,OAAO,EAAE,IAAI,CAAC,IAAI;gBAClB,mIAAmI;gBACnI,yFAAyF;gBACzF,kIAAkI;gBAClI,0FAA0F;gBAC1F,OAAO,EAAE,KAAK;aACf;SACF,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,YAAY,CAChB,QAAmB,EACnB,iBAAyB,EACzB,QAAiB,EACjB,WAAyB;QAEzB,MAAM,cAAc,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;SAC7D,CAAC,CAAC,CAAC;QAEJ,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,WAAW,GAAG,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,WAAW,EAAE,IAAI,KAAK,MAAM,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;gBACjE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,OAAO,QAAQ,EAAE,CAAC;YACjD,CAAC;QACH,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC;gBACtD,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,cAAc;gBACxB,MAAM,EAAE;oBACN,gBAAgB,EAAE,kBAAkB;oBACpC,iBAAiB,EAAE,iBAAiB;wBAClC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,EAAE;wBAC1C,CAAC,CAAC,SAAS;oBACb,WAAW,EAAE,CAAC;oBACd,eAAe,EAAE,GAAG;oBACpB,WAAW;iBACZ;aACF,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACzB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,KAAK,CACb,uDAAuD,CACxD,CAAC;YACJ,CAAC;YAED,+DAA+D;YAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,KAAK,CACf,mDAAmD,EACnD,KAAK,CACN,CAAC;YACF,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
7
|
+
import { LocalLiteRtLmClient } from './localLiteRtLmClient.js';
|
|
8
|
+
const mockGenerateContent = vi.fn();
|
|
9
|
+
vi.mock('@google/genai', () => {
|
|
10
|
+
const GoogleGenAI = vi.fn().mockImplementation(() => ({
|
|
11
|
+
models: {
|
|
12
|
+
generateContent: mockGenerateContent,
|
|
13
|
+
},
|
|
14
|
+
}));
|
|
15
|
+
return { GoogleGenAI };
|
|
16
|
+
});
|
|
17
|
+
describe('LocalLiteRtLmClient', () => {
|
|
18
|
+
let mockConfig;
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
vi.clearAllMocks();
|
|
21
|
+
mockGenerateContent.mockClear();
|
|
22
|
+
mockConfig = {
|
|
23
|
+
getGemmaModelRouterSettings: vi.fn().mockReturnValue({
|
|
24
|
+
classifier: {
|
|
25
|
+
host: 'http://test-host:1234',
|
|
26
|
+
model: 'gemma:latest',
|
|
27
|
+
},
|
|
28
|
+
}),
|
|
29
|
+
};
|
|
30
|
+
});
|
|
31
|
+
it('should successfully call generateJson and return parsed JSON', async () => {
|
|
32
|
+
mockGenerateContent.mockResolvedValue({
|
|
33
|
+
text: '{"key": "value"}',
|
|
34
|
+
});
|
|
35
|
+
const client = new LocalLiteRtLmClient(mockConfig);
|
|
36
|
+
const result = await client.generateJson([], 'test-instruction');
|
|
37
|
+
expect(result).toEqual({ key: 'value' });
|
|
38
|
+
expect(mockGenerateContent).toHaveBeenCalledWith(expect.objectContaining({
|
|
39
|
+
model: 'gemma:latest',
|
|
40
|
+
config: expect.objectContaining({
|
|
41
|
+
responseMimeType: 'application/json',
|
|
42
|
+
temperature: 0,
|
|
43
|
+
}),
|
|
44
|
+
}));
|
|
45
|
+
});
|
|
46
|
+
it('should throw an error if the API response has no text', async () => {
|
|
47
|
+
mockGenerateContent.mockResolvedValue({
|
|
48
|
+
text: null,
|
|
49
|
+
});
|
|
50
|
+
const client = new LocalLiteRtLmClient(mockConfig);
|
|
51
|
+
await expect(client.generateJson([], 'test-instruction')).rejects.toThrow('Invalid response from Local Gemini API: No text found');
|
|
52
|
+
});
|
|
53
|
+
it('should throw if the JSON is malformed', async () => {
|
|
54
|
+
mockGenerateContent.mockResolvedValue({
|
|
55
|
+
text: `{
|
|
56
|
+
“key”: ‘value’,
|
|
57
|
+
}`, // Smart quotes, trailing comma
|
|
58
|
+
});
|
|
59
|
+
const client = new LocalLiteRtLmClient(mockConfig);
|
|
60
|
+
await expect(client.generateJson([], 'test-instruction')).rejects.toThrow(SyntaxError);
|
|
61
|
+
});
|
|
62
|
+
it('should add reminder to the last user message', async () => {
|
|
63
|
+
mockGenerateContent.mockResolvedValue({
|
|
64
|
+
text: '{"key": "value"}',
|
|
65
|
+
});
|
|
66
|
+
const client = new LocalLiteRtLmClient(mockConfig);
|
|
67
|
+
await client.generateJson([{ role: 'user', parts: [{ text: 'initial prompt' }] }], 'test-instruction', 'test-reminder');
|
|
68
|
+
const calledContents = vi.mocked(mockGenerateContent).mock.calls[0][0].contents;
|
|
69
|
+
expect(calledContents.at(-1)?.parts[0].text).toBe(`initial prompt
|
|
70
|
+
|
|
71
|
+
test-reminder`);
|
|
72
|
+
});
|
|
73
|
+
it('should pass abortSignal to generateContent', async () => {
|
|
74
|
+
mockGenerateContent.mockResolvedValue({
|
|
75
|
+
text: '{"key": "value"}',
|
|
76
|
+
});
|
|
77
|
+
const client = new LocalLiteRtLmClient(mockConfig);
|
|
78
|
+
const controller = new AbortController();
|
|
79
|
+
await client.generateJson([], 'test-instruction', undefined, controller.signal);
|
|
80
|
+
expect(mockGenerateContent).toHaveBeenCalledWith(expect.objectContaining({
|
|
81
|
+
config: expect.objectContaining({
|
|
82
|
+
abortSignal: controller.signal,
|
|
83
|
+
}),
|
|
84
|
+
}));
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=localLiteRtLmClient.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"localLiteRtLmClient.test.js","sourceRoot":"","sources":["../../../src/core/localLiteRtLmClient.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ export declare class OpenAIContentGenerator implements ContentGenerator {
|
|
|
13
13
|
protected client: OpenAI;
|
|
14
14
|
private model;
|
|
15
15
|
private config;
|
|
16
|
+
protected readonly isOpenRouter: boolean;
|
|
16
17
|
private streamingToolCalls;
|
|
17
18
|
private streamingReasoningDetails;
|
|
18
19
|
constructor(apiKey: string, model: string, config: Config);
|
|
@@ -15,6 +15,7 @@ export class OpenAIContentGenerator {
|
|
|
15
15
|
client;
|
|
16
16
|
model;
|
|
17
17
|
config;
|
|
18
|
+
isOpenRouter;
|
|
18
19
|
streamingToolCalls = new Map();
|
|
19
20
|
// Store reasoning_details for OpenRouter reasoning models (Gemini 3 Pro, etc.)
|
|
20
21
|
streamingReasoningDetails = null;
|
|
@@ -22,6 +23,7 @@ export class OpenAIContentGenerator {
|
|
|
22
23
|
this.model = model;
|
|
23
24
|
this.config = config;
|
|
24
25
|
const baseURL = process.env['OPENAI_BASE_URL'] || '';
|
|
26
|
+
this.isOpenRouter = baseURL.includes('openrouter.ai');
|
|
25
27
|
// Configure timeout settings - using progressive timeouts
|
|
26
28
|
const timeoutConfig = {
|
|
27
29
|
// Base timeout for most requests (2 minutes)
|
|
@@ -42,11 +44,9 @@ export class OpenAIContentGenerator {
|
|
|
42
44
|
// Set up User-Agent header (same format as contentGenerator.ts)
|
|
43
45
|
const version = process.env['CLI_VERSION'] || process.version;
|
|
44
46
|
const userAgent = `QwenCode/${version} (${process.platform}; ${process.arch})`;
|
|
45
|
-
// Check if using OpenRouter and add required headers
|
|
46
|
-
const isOpenRouter = baseURL.includes('openrouter.ai');
|
|
47
47
|
const defaultHeaders = {
|
|
48
48
|
'User-Agent': userAgent,
|
|
49
|
-
...(isOpenRouter
|
|
49
|
+
...(this.isOpenRouter
|
|
50
50
|
? {
|
|
51
51
|
'HTTP-Referer': 'https://aionui.com',
|
|
52
52
|
'X-Title': 'AionUi',
|
|
@@ -169,9 +169,7 @@ export class OpenAIContentGenerator {
|
|
|
169
169
|
}
|
|
170
170
|
// Enable reasoning for Gemini 3 models on OpenRouter
|
|
171
171
|
// This ensures reasoning_details are returned and can be preserved
|
|
172
|
-
|
|
173
|
-
const isOpenRouter = baseURL.includes('openrouter.ai');
|
|
174
|
-
if (isOpenRouter && this.isGeminiReasoningModel()) {
|
|
172
|
+
if (this.isOpenRouter && this.isGeminiReasoningModel()) {
|
|
175
173
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
176
174
|
createParams.reasoning = {
|
|
177
175
|
// Use 'high' effort for reliable reasoning token generation
|
|
@@ -292,9 +290,7 @@ export class OpenAIContentGenerator {
|
|
|
292
290
|
}
|
|
293
291
|
// Enable reasoning for Gemini 3 models on OpenRouter
|
|
294
292
|
// This ensures reasoning_details are returned and can be preserved
|
|
295
|
-
|
|
296
|
-
const isOpenRouter = baseURL.includes('openrouter.ai');
|
|
297
|
-
if (isOpenRouter && this.isGeminiReasoningModel()) {
|
|
293
|
+
if (this.isOpenRouter && this.isGeminiReasoningModel()) {
|
|
298
294
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
299
295
|
createParams.reasoning = {
|
|
300
296
|
// Use 'high' effort for reliable reasoning token generation
|
|
@@ -829,8 +825,9 @@ export class OpenAIContentGenerator {
|
|
|
829
825
|
content: textParts.join('\n') || null,
|
|
830
826
|
tool_calls: toolCalls,
|
|
831
827
|
};
|
|
832
|
-
// Add reasoning_details
|
|
833
|
-
|
|
828
|
+
// Add reasoning_details only for OpenRouter reasoning models (Gemini 3 Pro, etc.)
|
|
829
|
+
// Other providers (MiniMax, DeepSeek, etc.) don't accept this field and return 400
|
|
830
|
+
if (reasoningDetails && this.isOpenRouter) {
|
|
834
831
|
assistantMessage.reasoning_details = reasoningDetails;
|
|
835
832
|
}
|
|
836
833
|
messages.push(assistantMessage);
|
|
@@ -843,8 +840,11 @@ export class OpenAIContentGenerator {
|
|
|
843
840
|
const text = textParts.join('\n');
|
|
844
841
|
if (text) {
|
|
845
842
|
const message = { role, content: text };
|
|
846
|
-
// Add reasoning_details
|
|
847
|
-
|
|
843
|
+
// Add reasoning_details only for OpenRouter reasoning models
|
|
844
|
+
// Other providers (MiniMax, DeepSeek, etc.) don't accept this field and return 400
|
|
845
|
+
if (role === 'assistant' &&
|
|
846
|
+
reasoningDetails &&
|
|
847
|
+
this.isOpenRouter) {
|
|
848
848
|
message.reasoning_details = reasoningDetails;
|
|
849
849
|
}
|
|
850
850
|
messages.push(message);
|