@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,171 @@
|
|
|
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 { convertSessionToClientHistory } from './sessionUtils.js';
|
|
8
|
+
import {} from '../services/chatRecordingService.js';
|
|
9
|
+
import { CoreToolCallStatus } from '../scheduler/types.js';
|
|
10
|
+
describe('convertSessionToClientHistory', () => {
|
|
11
|
+
it('should convert a simple conversation without tool calls', () => {
|
|
12
|
+
const messages = [
|
|
13
|
+
{
|
|
14
|
+
id: '1',
|
|
15
|
+
type: 'user',
|
|
16
|
+
timestamp: '2024-01-01T10:00:00Z',
|
|
17
|
+
content: 'Hello',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: '2',
|
|
21
|
+
type: 'gemini',
|
|
22
|
+
timestamp: '2024-01-01T10:01:00Z',
|
|
23
|
+
content: 'Hi there',
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
const history = convertSessionToClientHistory(messages);
|
|
27
|
+
expect(history).toEqual([
|
|
28
|
+
{ role: 'user', parts: [{ text: 'Hello' }] },
|
|
29
|
+
{ role: 'model', parts: [{ text: 'Hi there' }] },
|
|
30
|
+
]);
|
|
31
|
+
});
|
|
32
|
+
it('should convert thinking tokens (thoughts) to model parts', () => {
|
|
33
|
+
const messages = [
|
|
34
|
+
{
|
|
35
|
+
id: '1',
|
|
36
|
+
type: 'user',
|
|
37
|
+
timestamp: '2024-01-01T10:00:00Z',
|
|
38
|
+
content: 'Hello',
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
id: '2',
|
|
42
|
+
type: 'gemini',
|
|
43
|
+
timestamp: '2024-01-01T10:01:00Z',
|
|
44
|
+
content: 'Hi there',
|
|
45
|
+
thoughts: [
|
|
46
|
+
{
|
|
47
|
+
subject: 'Thinking',
|
|
48
|
+
description: 'I should be polite.',
|
|
49
|
+
timestamp: '2024-01-01T10:00:50Z',
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
const history = convertSessionToClientHistory(messages);
|
|
55
|
+
expect(history).toEqual([
|
|
56
|
+
{ role: 'user', parts: [{ text: 'Hello' }] },
|
|
57
|
+
{
|
|
58
|
+
role: 'model',
|
|
59
|
+
parts: [
|
|
60
|
+
{ text: '**Thinking** I should be polite.', thought: true },
|
|
61
|
+
{ text: 'Hi there' },
|
|
62
|
+
],
|
|
63
|
+
},
|
|
64
|
+
]);
|
|
65
|
+
});
|
|
66
|
+
it('should ignore info, error, and slash commands', () => {
|
|
67
|
+
const messages = [
|
|
68
|
+
{
|
|
69
|
+
id: '1',
|
|
70
|
+
type: 'info',
|
|
71
|
+
timestamp: '2024-01-01T10:00:00Z',
|
|
72
|
+
content: 'System info',
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: '2',
|
|
76
|
+
type: 'user',
|
|
77
|
+
timestamp: '2024-01-01T10:01:00Z',
|
|
78
|
+
content: '/clear',
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
id: '3',
|
|
82
|
+
type: 'user',
|
|
83
|
+
timestamp: '2024-01-01T10:02:00Z',
|
|
84
|
+
content: '?help',
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: '4',
|
|
88
|
+
type: 'user',
|
|
89
|
+
timestamp: '2024-01-01T10:03:00Z',
|
|
90
|
+
content: 'Actual query',
|
|
91
|
+
},
|
|
92
|
+
];
|
|
93
|
+
const history = convertSessionToClientHistory(messages);
|
|
94
|
+
expect(history).toEqual([
|
|
95
|
+
{ role: 'user', parts: [{ text: 'Actual query' }] },
|
|
96
|
+
]);
|
|
97
|
+
});
|
|
98
|
+
it('should correctly map tool calls and their responses', () => {
|
|
99
|
+
const messages = [
|
|
100
|
+
{
|
|
101
|
+
id: 'msg1',
|
|
102
|
+
type: 'user',
|
|
103
|
+
timestamp: '2024-01-01T10:00:00Z',
|
|
104
|
+
content: 'List files',
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
id: 'msg2',
|
|
108
|
+
type: 'gemini',
|
|
109
|
+
timestamp: '2024-01-01T10:01:00Z',
|
|
110
|
+
content: 'Let me check.',
|
|
111
|
+
toolCalls: [
|
|
112
|
+
{
|
|
113
|
+
id: 'call123',
|
|
114
|
+
name: 'ls',
|
|
115
|
+
args: { dir: '.' },
|
|
116
|
+
status: CoreToolCallStatus.Success,
|
|
117
|
+
timestamp: '2024-01-01T10:01:05Z',
|
|
118
|
+
result: 'file.txt',
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
},
|
|
122
|
+
];
|
|
123
|
+
const history = convertSessionToClientHistory(messages);
|
|
124
|
+
expect(history).toEqual([
|
|
125
|
+
{ role: 'user', parts: [{ text: 'List files' }] },
|
|
126
|
+
{
|
|
127
|
+
role: 'model',
|
|
128
|
+
parts: [
|
|
129
|
+
{ text: 'Let me check.' },
|
|
130
|
+
{ functionCall: { name: 'ls', args: { dir: '.' }, id: 'call123' } },
|
|
131
|
+
],
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
role: 'user',
|
|
135
|
+
parts: [
|
|
136
|
+
{
|
|
137
|
+
functionResponse: {
|
|
138
|
+
id: 'call123',
|
|
139
|
+
name: 'ls',
|
|
140
|
+
response: { output: 'file.txt' },
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
],
|
|
144
|
+
},
|
|
145
|
+
]);
|
|
146
|
+
});
|
|
147
|
+
it('should preserve multi-modal parts (inlineData)', () => {
|
|
148
|
+
const messages = [
|
|
149
|
+
{
|
|
150
|
+
id: 'msg1',
|
|
151
|
+
type: 'user',
|
|
152
|
+
timestamp: '2024-01-01T10:00:00Z',
|
|
153
|
+
content: [
|
|
154
|
+
{ text: 'Look at this image' },
|
|
155
|
+
{ inlineData: { mimeType: 'image/png', data: 'base64data' } },
|
|
156
|
+
],
|
|
157
|
+
},
|
|
158
|
+
];
|
|
159
|
+
const history = convertSessionToClientHistory(messages);
|
|
160
|
+
expect(history).toEqual([
|
|
161
|
+
{
|
|
162
|
+
role: 'user',
|
|
163
|
+
parts: [
|
|
164
|
+
{ text: 'Look at this image' },
|
|
165
|
+
{ inlineData: { mimeType: 'image/png', data: 'base64data' } },
|
|
166
|
+
],
|
|
167
|
+
},
|
|
168
|
+
]);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=sessionUtils.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessionUtils.test.js","sourceRoot":"","sources":["../../../src/utils/sessionUtils.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAA2B,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,QAAQ,GAAmC;YAC/C;gBACE,EAAE,EAAE,GAAG;gBACP,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,sBAAsB;gBACjC,OAAO,EAAE,OAAO;aACjB;YACD;gBACE,EAAE,EAAE,GAAG;gBACP,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,sBAAsB;gBACjC,OAAO,EAAE,UAAU;aACpB;SACF,CAAC;QAEF,MAAM,OAAO,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QAExD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;YAC5C,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE;SACjD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,QAAQ,GAAmC;YAC/C;gBACE,EAAE,EAAE,GAAG;gBACP,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,sBAAsB;gBACjC,OAAO,EAAE,OAAO;aACjB;YACD;gBACE,EAAE,EAAE,GAAG;gBACP,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,sBAAsB;gBACjC,OAAO,EAAE,UAAU;gBACnB,QAAQ,EAAE;oBACR;wBACE,OAAO,EAAE,UAAU;wBACnB,WAAW,EAAE,qBAAqB;wBAClC,SAAS,EAAE,sBAAsB;qBAClC;iBACF;aACF;SACF,CAAC;QAEF,MAAM,OAAO,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QAExD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE;YAC5C;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACL,EAAE,IAAI,EAAE,kCAAkC,EAAE,OAAO,EAAE,IAAI,EAAE;oBAC3D,EAAE,IAAI,EAAE,UAAU,EAAE;iBACrB;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,QAAQ,GAAmC;YAC/C;gBACE,EAAE,EAAE,GAAG;gBACP,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,sBAAsB;gBACjC,OAAO,EAAE,aAAa;aACvB;YACD;gBACE,EAAE,EAAE,GAAG;gBACP,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,sBAAsB;gBACjC,OAAO,EAAE,QAAQ;aAClB;YACD;gBACE,EAAE,EAAE,GAAG;gBACP,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,sBAAsB;gBACjC,OAAO,EAAE,OAAO;aACjB;YACD;gBACE,EAAE,EAAE,GAAG;gBACP,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,sBAAsB;gBACjC,OAAO,EAAE,cAAc;aACxB;SACF,CAAC;QAEF,MAAM,OAAO,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QAExD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;SACpD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,QAAQ,GAAmC;YAC/C;gBACE,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,sBAAsB;gBACjC,OAAO,EAAE,YAAY;aACtB;YACD;gBACE,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,sBAAsB;gBACjC,OAAO,EAAE,eAAe;gBACxB,SAAS,EAAE;oBACT;wBACE,EAAE,EAAE,SAAS;wBACb,IAAI,EAAE,IAAI;wBACV,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE;wBAClB,MAAM,EAAE,kBAAkB,CAAC,OAAO;wBAClC,SAAS,EAAE,sBAAsB;wBACjC,MAAM,EAAE,UAAU;qBACnB;iBACF;aACF;SACF,CAAC;QAEF,MAAM,OAAO,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QAExD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE;YACjD;gBACE,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE;oBACL,EAAE,IAAI,EAAE,eAAe,EAAE;oBACzB,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE;iBACpE;aACF;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL;wBACE,gBAAgB,EAAE;4BAChB,EAAE,EAAE,SAAS;4BACb,IAAI,EAAE,IAAI;4BACV,QAAQ,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE;yBACjC;qBACF;iBACF;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,QAAQ,GAAmC;YAC/C;gBACE,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,sBAAsB;gBACjC,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,oBAAoB,EAAE;oBAC9B,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE;iBAC9D;aACF;SACF,CAAC;QAEF,MAAM,OAAO,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;QAExD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB;gBACE,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE;oBACL,EAAE,IAAI,EAAE,oBAAoB,EAAE;oBAC9B,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE;iBAC9D;aACF;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Options for formatForSpeech().
|
|
8
|
+
*/
|
|
9
|
+
export interface FormatForSpeechOptions {
|
|
10
|
+
/**
|
|
11
|
+
* Maximum output length in characters before truncating.
|
|
12
|
+
* @default 500
|
|
13
|
+
*/
|
|
14
|
+
maxLength?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Number of trailing path segments to keep when abbreviating absolute paths.
|
|
17
|
+
* @default 3
|
|
18
|
+
*/
|
|
19
|
+
pathDepth?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Maximum number of characters in a JSON value before summarising it.
|
|
22
|
+
* @default 80
|
|
23
|
+
*/
|
|
24
|
+
jsonThreshold?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Transforms a markdown/ANSI-formatted string into speech-ready plain text.
|
|
28
|
+
*
|
|
29
|
+
* Transformations applied (in order):
|
|
30
|
+
* 1. Strip ANSI escape codes
|
|
31
|
+
* 2. Collapse fenced code blocks to their content (or a JSON summary)
|
|
32
|
+
* 3. Collapse stack traces to first frame + count
|
|
33
|
+
* 4. Strip markdown syntax (bold, italic, blockquotes, headings, links, lists, inline code)
|
|
34
|
+
* 5. Abbreviate deep absolute paths
|
|
35
|
+
* 6. Normalise whitespace
|
|
36
|
+
* 7. Truncate to maxLength
|
|
37
|
+
*/
|
|
38
|
+
export declare function formatForSpeech(text: string, options?: FormatForSpeechOptions): string;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Google LLC
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
// ANSI escape sequences (CSI, OSC, etc.)
|
|
7
|
+
// eslint-disable-next-line no-control-regex
|
|
8
|
+
const ANSI_RE = /\x1b(?:\[[0-9;]*[mGKHF]|\][^\x07\x1b]*\x07|[()][AB012])/g;
|
|
9
|
+
// Fenced code blocks ```lang\n...\n```
|
|
10
|
+
const CODE_FENCE_RE = /```[^\n]*\n([\s\S]*?)```/g;
|
|
11
|
+
// Inline code `...`
|
|
12
|
+
const INLINE_CODE_RE = /`([^`]+)`/g;
|
|
13
|
+
// Bold/italic markers **text**, *text*, __text__, _text_
|
|
14
|
+
// Exclude newlines so the pattern cannot span multiple lines and accidentally
|
|
15
|
+
// consume list markers that haven't been stripped yet.
|
|
16
|
+
const BOLD_ITALIC_RE = /\*{1,2}([^*\n]+)\*{1,2}|_{1,2}([^_\n]+)_{1,2}/g;
|
|
17
|
+
// Blockquote prefix "> "
|
|
18
|
+
const BLOCKQUOTE_RE = /^>\s?/gm;
|
|
19
|
+
// ATX headings # heading
|
|
20
|
+
const HEADING_RE = /^#{1,6}\s+/gm;
|
|
21
|
+
// Markdown links [text](url)
|
|
22
|
+
const LINK_RE = /\[([^\]]+)\]\([^)]+\)/g;
|
|
23
|
+
// Markdown list markers "- " or "* " or "N. " at line start
|
|
24
|
+
const LIST_MARKER_RE = /^[ \t]*(?:[-*]|\d+\.)\s+/gm;
|
|
25
|
+
// Two or more consecutive stack-trace frames (Node.js style " at …" lines).
|
|
26
|
+
// Matching blocks of ≥2 lets us replace each group in-place, preserving any
|
|
27
|
+
// text that follows the trace rather than appending it to the end.
|
|
28
|
+
const STACK_BLOCK_RE = /(?:^[ \t]+at [^\n]+(?:\n|$)){2,}/gm;
|
|
29
|
+
// Absolute Unix paths optionally ending with :line or :line:col
|
|
30
|
+
// Hyphen placed at start of char class to avoid useless-escape lint error
|
|
31
|
+
const UNIX_PATH_RE = /(?:^|(?<=\s|[(`"']))(\/[-\w.@]+(?:\/[-\w.@]+)*)(:\d+(?::\d+)?)?/g;
|
|
32
|
+
// Absolute Windows paths C:\... or C:/... (any drive letter)
|
|
33
|
+
const WIN_PATH_RE = /(?:^|(?<=\s|[(`"']))([A-Za-z]:[/\\][-\w. ]+(?:[/\\][-\w. ]+)*)(:\d+(?::\d+)?)?/g;
|
|
34
|
+
/**
|
|
35
|
+
* Abbreviates an absolute path to at most `depth` trailing segments,
|
|
36
|
+
* prefixed with "…". Optionally converts `:line` suffix to `line N`.
|
|
37
|
+
*/
|
|
38
|
+
function abbreviatePath(full, suffix, depth) {
|
|
39
|
+
const segments = full.split(/[/\\]/).filter(Boolean);
|
|
40
|
+
const kept = segments.length > depth ? segments.slice(-depth) : segments;
|
|
41
|
+
const abbreviated = segments.length > depth ? `\u2026/${kept.join('/')}` : full;
|
|
42
|
+
if (!suffix)
|
|
43
|
+
return abbreviated;
|
|
44
|
+
// Convert ":142" → " line 142", ":142:7" → " line 142"
|
|
45
|
+
const lineNum = suffix.split(':').filter(Boolean)[0];
|
|
46
|
+
return `${abbreviated} line ${lineNum}`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Summarises a JSON string as "(JSON object with N keys)" or
|
|
50
|
+
* "(JSON array with N items)", falling back to the original if parsing fails.
|
|
51
|
+
*/
|
|
52
|
+
function summariseJson(jsonStr) {
|
|
53
|
+
try {
|
|
54
|
+
const parsed = JSON.parse(jsonStr);
|
|
55
|
+
if (Array.isArray(parsed)) {
|
|
56
|
+
return `(JSON array with ${parsed.length} item${parsed.length === 1 ? '' : 's'})`;
|
|
57
|
+
}
|
|
58
|
+
if (parsed !== null && typeof parsed === 'object') {
|
|
59
|
+
const keys = Object.keys(parsed).length;
|
|
60
|
+
return `(JSON object with ${keys} key${keys === 1 ? '' : 's'})`;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// not valid JSON — leave as-is
|
|
65
|
+
}
|
|
66
|
+
return jsonStr;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Transforms a markdown/ANSI-formatted string into speech-ready plain text.
|
|
70
|
+
*
|
|
71
|
+
* Transformations applied (in order):
|
|
72
|
+
* 1. Strip ANSI escape codes
|
|
73
|
+
* 2. Collapse fenced code blocks to their content (or a JSON summary)
|
|
74
|
+
* 3. Collapse stack traces to first frame + count
|
|
75
|
+
* 4. Strip markdown syntax (bold, italic, blockquotes, headings, links, lists, inline code)
|
|
76
|
+
* 5. Abbreviate deep absolute paths
|
|
77
|
+
* 6. Normalise whitespace
|
|
78
|
+
* 7. Truncate to maxLength
|
|
79
|
+
*/
|
|
80
|
+
export function formatForSpeech(text, options) {
|
|
81
|
+
const maxLength = options?.maxLength ?? 500;
|
|
82
|
+
const pathDepth = options?.pathDepth ?? 3;
|
|
83
|
+
const jsonThreshold = options?.jsonThreshold ?? 80;
|
|
84
|
+
if (!text)
|
|
85
|
+
return '';
|
|
86
|
+
let out = text;
|
|
87
|
+
// 1. Strip ANSI escape codes
|
|
88
|
+
out = out.replace(ANSI_RE, '');
|
|
89
|
+
// 2. Fenced code blocks — try to summarise JSON content, else keep text
|
|
90
|
+
out = out.replace(CODE_FENCE_RE, (_match, body) => {
|
|
91
|
+
const trimmed = body.trim();
|
|
92
|
+
if (trimmed.length > jsonThreshold) {
|
|
93
|
+
const summary = summariseJson(trimmed);
|
|
94
|
+
if (summary !== trimmed)
|
|
95
|
+
return summary;
|
|
96
|
+
}
|
|
97
|
+
return trimmed;
|
|
98
|
+
});
|
|
99
|
+
// 3. Collapse stack traces: replace each contiguous block of ≥2 frames
|
|
100
|
+
// in-place so that any text after the trace is preserved in order.
|
|
101
|
+
out = out.replace(STACK_BLOCK_RE, (block) => {
|
|
102
|
+
const lines = block
|
|
103
|
+
.trim()
|
|
104
|
+
.split('\n')
|
|
105
|
+
.map((l) => l.trim());
|
|
106
|
+
const rest = lines.length - 1;
|
|
107
|
+
return `${lines[0]} (and ${rest} more frame${rest === 1 ? '' : 's'})\n`;
|
|
108
|
+
});
|
|
109
|
+
// 4. Strip markdown syntax
|
|
110
|
+
out = out
|
|
111
|
+
.replace(INLINE_CODE_RE, '$1')
|
|
112
|
+
.replace(BOLD_ITALIC_RE, (_m, g1, g2) => g1 ?? g2 ?? '')
|
|
113
|
+
.replace(BLOCKQUOTE_RE, '')
|
|
114
|
+
.replace(HEADING_RE, '')
|
|
115
|
+
.replace(LINK_RE, '$1')
|
|
116
|
+
.replace(LIST_MARKER_RE, '');
|
|
117
|
+
// 5. Abbreviate absolute paths
|
|
118
|
+
// Windows paths first to avoid the leading letter being caught by Unix RE
|
|
119
|
+
out = out.replace(WIN_PATH_RE, (_m, full, suffix) => abbreviatePath(full, suffix, pathDepth));
|
|
120
|
+
out = out.replace(UNIX_PATH_RE, (_m, full, suffix) => abbreviatePath(full, suffix, pathDepth));
|
|
121
|
+
// 6. Normalise whitespace: collapse multiple blank lines, trim
|
|
122
|
+
out = out.replace(/\n{3,}/g, '\n\n').trim();
|
|
123
|
+
// 7. Truncate
|
|
124
|
+
if (out.length > maxLength) {
|
|
125
|
+
const total = out.length;
|
|
126
|
+
out = out.slice(0, maxLength).trimEnd() + `\u2026 (${total} chars total)`;
|
|
127
|
+
}
|
|
128
|
+
return out;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=responseFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responseFormatter.js","sourceRoot":"","sources":["../../../src/voice/responseFormatter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuBH,yCAAyC;AACzC,4CAA4C;AAC5C,MAAM,OAAO,GAAG,0DAA0D,CAAC;AAE3E,wCAAwC;AACxC,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAElD,qBAAqB;AACrB,MAAM,cAAc,GAAG,YAAY,CAAC;AAEpC,0DAA0D;AAC1D,8EAA8E;AAC9E,uDAAuD;AACvD,MAAM,cAAc,GAAG,gDAAgD,CAAC;AAExE,0BAA0B;AAC1B,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,0BAA0B;AAC1B,MAAM,UAAU,GAAG,cAAc,CAAC;AAElC,8BAA8B;AAC9B,MAAM,OAAO,GAAG,wBAAwB,CAAC;AAEzC,6DAA6D;AAC7D,MAAM,cAAc,GAAG,4BAA4B,CAAC;AAEpD,+EAA+E;AAC/E,4EAA4E;AAC5E,mEAAmE;AACnE,MAAM,cAAc,GAAG,oCAAoC,CAAC;AAE5D,gEAAgE;AAChE,0EAA0E;AAC1E,MAAM,YAAY,GAChB,kEAAkE,CAAC;AAErE,iEAAiE;AACjE,MAAM,WAAW,GACf,iFAAiF,CAAC;AAEpF;;;GAGG;AACH,SAAS,cAAc,CACrB,IAAY,EACZ,MAA0B,EAC1B,KAAa;IAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IACzE,MAAM,WAAW,GACf,QAAQ,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAE9D,IAAI,CAAC,MAAM;QAAE,OAAO,WAAW,CAAC;IAChC,uDAAuD;IACvD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,GAAG,WAAW,SAAS,OAAO,EAAE,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAAC,OAAe;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,oBAAoB,MAAM,CAAC,MAAM,QAAQ,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QACpF,CAAC;QACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAClD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;YACxC,OAAO,qBAAqB,IAAI,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAClE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;IACjC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,OAAgC;IAEhC,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,GAAG,CAAC;IAC5C,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,OAAO,EAAE,aAAa,IAAI,EAAE,CAAC;IAEnD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAErB,IAAI,GAAG,GAAG,IAAI,CAAC;IAEf,6BAA6B;IAC7B,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAE/B,wEAAwE;IACxE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,EAAE,IAAY,EAAE,EAAE;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;YACnC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,OAAO,KAAK,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC1C,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,uEAAuE;IACvE,sEAAsE;IACtE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,EAAE;QAC1C,MAAM,KAAK,GAAG,KAAK;aAChB,IAAI,EAAE;aACN,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9B,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,IAAI,cAAc,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,GAAG,GAAG,GAAG;SACN,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;SAC7B,OAAO,CAAC,cAAc,EAAE,CAAC,EAAE,EAAE,EAAW,EAAE,EAAW,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;SACzE,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;SAC1B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IAE/B,+BAA+B;IAC/B,6EAA6E;IAC7E,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,IAAY,EAAE,MAAe,EAAE,EAAE,CACnE,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CACxC,CAAC;IACF,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,IAAY,EAAE,MAAe,EAAE,EAAE,CACpE,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,CACxC,CAAC;IAEF,+DAA+D;IAC/D,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5C,cAAc;IACd,IAAI,GAAG,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC;QACzB,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,WAAW,KAAK,eAAe,CAAC;IAC5E,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,214 @@
|
|
|
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 { formatForSpeech } from './responseFormatter.js';
|
|
8
|
+
describe('formatForSpeech', () => {
|
|
9
|
+
describe('edge cases', () => {
|
|
10
|
+
it('should return empty string for empty input', () => {
|
|
11
|
+
expect(formatForSpeech('')).toBe('');
|
|
12
|
+
});
|
|
13
|
+
it('should return plain text unchanged', () => {
|
|
14
|
+
expect(formatForSpeech('Hello world')).toBe('Hello world');
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
describe('ANSI escape codes', () => {
|
|
18
|
+
it('should strip color codes', () => {
|
|
19
|
+
expect(formatForSpeech('\x1b[31mError\x1b[0m')).toBe('Error');
|
|
20
|
+
});
|
|
21
|
+
it('should strip bold/dim codes', () => {
|
|
22
|
+
expect(formatForSpeech('\x1b[1mBold\x1b[22m text')).toBe('Bold text');
|
|
23
|
+
});
|
|
24
|
+
it('should strip cursor movement codes', () => {
|
|
25
|
+
expect(formatForSpeech('line1\x1b[2Kline2')).toBe('line1line2');
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
describe('markdown stripping', () => {
|
|
29
|
+
it('should strip bold markers **text**', () => {
|
|
30
|
+
expect(formatForSpeech('**Error**: something went wrong')).toBe('Error: something went wrong');
|
|
31
|
+
});
|
|
32
|
+
it('should strip bold markers __text__', () => {
|
|
33
|
+
expect(formatForSpeech('__Error__: something')).toBe('Error: something');
|
|
34
|
+
});
|
|
35
|
+
it('should strip italic markers *text*', () => {
|
|
36
|
+
expect(formatForSpeech('*note*: pay attention')).toBe('note: pay attention');
|
|
37
|
+
});
|
|
38
|
+
it('should strip inline code backticks', () => {
|
|
39
|
+
expect(formatForSpeech('Run `npm install` first')).toBe('Run npm install first');
|
|
40
|
+
});
|
|
41
|
+
it('should strip blockquote prefix', () => {
|
|
42
|
+
expect(formatForSpeech('> This is a quote')).toBe('This is a quote');
|
|
43
|
+
});
|
|
44
|
+
it('should strip heading markers', () => {
|
|
45
|
+
expect(formatForSpeech('# Results\n## Details')).toBe('Results\nDetails');
|
|
46
|
+
});
|
|
47
|
+
it('should replace markdown links with link text', () => {
|
|
48
|
+
expect(formatForSpeech('[Gemini API](https://ai.google.dev)')).toBe('Gemini API');
|
|
49
|
+
});
|
|
50
|
+
it('should strip unordered list markers', () => {
|
|
51
|
+
expect(formatForSpeech('- item one\n- item two')).toBe('item one\nitem two');
|
|
52
|
+
});
|
|
53
|
+
it('should strip ordered list markers', () => {
|
|
54
|
+
expect(formatForSpeech('1. first\n2. second')).toBe('first\nsecond');
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe('fenced code blocks', () => {
|
|
58
|
+
it('should unwrap a plain code block', () => {
|
|
59
|
+
expect(formatForSpeech('```\nconsole.log("hi")\n```')).toBe('console.log("hi")');
|
|
60
|
+
});
|
|
61
|
+
it('should unwrap a language-tagged code block', () => {
|
|
62
|
+
expect(formatForSpeech('```typescript\nconst x = 1;\n```')).toBe('const x = 1;');
|
|
63
|
+
});
|
|
64
|
+
it('should summarise a JSON object code block above threshold', () => {
|
|
65
|
+
const json = JSON.stringify({ status: 'ok', count: 42, items: [] });
|
|
66
|
+
// Pass jsonThreshold lower than the json string length (38 chars)
|
|
67
|
+
const result = formatForSpeech(`\`\`\`json\n${json}\n\`\`\``, {
|
|
68
|
+
jsonThreshold: 10,
|
|
69
|
+
});
|
|
70
|
+
expect(result).toBe('(JSON object with 3 keys)');
|
|
71
|
+
});
|
|
72
|
+
it('should summarise a JSON array code block above threshold', () => {
|
|
73
|
+
const json = JSON.stringify([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
74
|
+
// Pass jsonThreshold lower than the json string length (23 chars)
|
|
75
|
+
const result = formatForSpeech(`\`\`\`\n${json}\n\`\`\``, {
|
|
76
|
+
jsonThreshold: 10,
|
|
77
|
+
});
|
|
78
|
+
expect(result).toBe('(JSON array with 10 items)');
|
|
79
|
+
});
|
|
80
|
+
it('should summarise a large JSON object using default threshold', () => {
|
|
81
|
+
// Build a JSON object whose stringified form exceeds the default 80-char threshold
|
|
82
|
+
const big = {
|
|
83
|
+
status: 'success',
|
|
84
|
+
count: 42,
|
|
85
|
+
items: ['alpha', 'beta', 'gamma'],
|
|
86
|
+
meta: { page: 1, totalPages: 10 },
|
|
87
|
+
timestamp: '2026-03-03T00:00:00Z',
|
|
88
|
+
};
|
|
89
|
+
const json = JSON.stringify(big);
|
|
90
|
+
expect(json.length).toBeGreaterThan(80);
|
|
91
|
+
const result = formatForSpeech(`\`\`\`json\n${json}\n\`\`\``);
|
|
92
|
+
expect(result).toBe('(JSON object with 5 keys)');
|
|
93
|
+
});
|
|
94
|
+
it('should not summarise a tiny JSON value', () => {
|
|
95
|
+
// Below the default 80-char threshold → keep as-is
|
|
96
|
+
const result = formatForSpeech('```json\n{"a":1}\n```', {
|
|
97
|
+
jsonThreshold: 80,
|
|
98
|
+
});
|
|
99
|
+
expect(result).toBe('{"a":1}');
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe('path abbreviation', () => {
|
|
103
|
+
it('should abbreviate a deep Unix path (default depth 3)', () => {
|
|
104
|
+
const result = formatForSpeech('at /home/user/project/packages/core/src/tools/file.ts');
|
|
105
|
+
expect(result).toContain('\u2026/src/tools/file.ts');
|
|
106
|
+
expect(result).not.toContain('/home/user/project');
|
|
107
|
+
});
|
|
108
|
+
it('should convert :line suffix to "line N"', () => {
|
|
109
|
+
const result = formatForSpeech('Error at /home/user/project/src/tools/file.ts:142');
|
|
110
|
+
expect(result).toContain('line 142');
|
|
111
|
+
});
|
|
112
|
+
it('should drop column from :line:col suffix', () => {
|
|
113
|
+
const result = formatForSpeech('Error at /home/user/project/src/tools/file.ts:142:7');
|
|
114
|
+
expect(result).toContain('line 142');
|
|
115
|
+
expect(result).not.toContain(':7');
|
|
116
|
+
});
|
|
117
|
+
it('should respect custom pathDepth option', () => {
|
|
118
|
+
const result = formatForSpeech('/home/user/project/packages/core/src/file.ts', { pathDepth: 2 });
|
|
119
|
+
expect(result).toContain('\u2026/src/file.ts');
|
|
120
|
+
});
|
|
121
|
+
it('should not abbreviate a short path within depth', () => {
|
|
122
|
+
const result = formatForSpeech('/src/file.ts', { pathDepth: 3 });
|
|
123
|
+
// Only 2 segments — no abbreviation needed
|
|
124
|
+
expect(result).toBe('/src/file.ts');
|
|
125
|
+
});
|
|
126
|
+
it('should abbreviate a Windows path on a non-C drive', () => {
|
|
127
|
+
const result = formatForSpeech('D:\\Users\\project\\packages\\core\\src\\file.ts', { pathDepth: 3 });
|
|
128
|
+
expect(result).toContain('\u2026/core/src/file.ts');
|
|
129
|
+
expect(result).not.toContain('D:\\Users\\project');
|
|
130
|
+
});
|
|
131
|
+
it('should convert :line on a Windows path on a non-C drive', () => {
|
|
132
|
+
const result = formatForSpeech('Error at D:\\Users\\project\\src\\tools\\file.ts:55');
|
|
133
|
+
expect(result).toContain('line 55');
|
|
134
|
+
expect(result).not.toContain('D:\\Users\\project');
|
|
135
|
+
});
|
|
136
|
+
it('should abbreviate a Unix path containing a scoped npm package segment', () => {
|
|
137
|
+
const result = formatForSpeech('at /home/user/project/node_modules/@google/gemini-cli-core/src/index.ts:12:3', { pathDepth: 5 });
|
|
138
|
+
expect(result).toContain('line 12');
|
|
139
|
+
expect(result).not.toContain(':3');
|
|
140
|
+
expect(result).toContain('@google');
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
describe('stack trace collapsing', () => {
|
|
144
|
+
it('should collapse a multi-frame stack trace', () => {
|
|
145
|
+
const trace = [
|
|
146
|
+
'Error: ENOENT',
|
|
147
|
+
' at Object.open (/project/src/file.ts:10:5)',
|
|
148
|
+
' at Module._load (/project/node_modules/loader.js:20:3)',
|
|
149
|
+
' at Function.Module._load (/project/node_modules/loader.js:30:3)',
|
|
150
|
+
].join('\n');
|
|
151
|
+
const result = formatForSpeech(trace);
|
|
152
|
+
expect(result).toContain('and 2 more frames');
|
|
153
|
+
expect(result).not.toContain('Module._load');
|
|
154
|
+
});
|
|
155
|
+
it('should not collapse a single stack frame', () => {
|
|
156
|
+
const trace = 'Error: ENOENT\n at Object.open (/project/src/file.ts:10:5)';
|
|
157
|
+
const result = formatForSpeech(trace);
|
|
158
|
+
expect(result).not.toContain('more frames');
|
|
159
|
+
});
|
|
160
|
+
it('should preserve surrounding text when collapsing a stack trace', () => {
|
|
161
|
+
const input = [
|
|
162
|
+
'Operation failed.',
|
|
163
|
+
' at Object.open (/project/src/file.ts:10:5)',
|
|
164
|
+
' at Module._load (/project/node_modules/loader.js:20:3)',
|
|
165
|
+
' at Function.load (/project/node_modules/loader.js:30:3)',
|
|
166
|
+
'Please try again.',
|
|
167
|
+
].join('\n');
|
|
168
|
+
const result = formatForSpeech(input);
|
|
169
|
+
expect(result).toContain('Operation failed.');
|
|
170
|
+
expect(result).toContain('Please try again.');
|
|
171
|
+
expect(result).toContain('and 2 more frames');
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
describe('truncation', () => {
|
|
175
|
+
it('should truncate output longer than maxLength', () => {
|
|
176
|
+
const long = 'word '.repeat(200);
|
|
177
|
+
const result = formatForSpeech(long, { maxLength: 50 });
|
|
178
|
+
expect(result.length).toBeLessThanOrEqual(50 + '\u2026 (1000 chars total)'.length);
|
|
179
|
+
expect(result).toContain('\u2026');
|
|
180
|
+
expect(result).toContain('chars total');
|
|
181
|
+
});
|
|
182
|
+
it('should not truncate output within maxLength', () => {
|
|
183
|
+
const short = 'Hello world';
|
|
184
|
+
expect(formatForSpeech(short, { maxLength: 500 })).toBe('Hello world');
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
describe('whitespace normalisation', () => {
|
|
188
|
+
it('should collapse more than two consecutive blank lines', () => {
|
|
189
|
+
const result = formatForSpeech('para1\n\n\n\n\npara2');
|
|
190
|
+
expect(result).toBe('para1\n\npara2');
|
|
191
|
+
});
|
|
192
|
+
it('should trim leading and trailing whitespace', () => {
|
|
193
|
+
expect(formatForSpeech(' hello ')).toBe('hello');
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
describe('real-world examples', () => {
|
|
197
|
+
it('should clean an ENOENT error with markdown and path', () => {
|
|
198
|
+
const input = '**Error**: `ENOENT: no such file or directory`\n> at /home/user/project/packages/core/src/tools/file-utils.ts:142:7';
|
|
199
|
+
const result = formatForSpeech(input);
|
|
200
|
+
expect(result).not.toContain('**');
|
|
201
|
+
expect(result).not.toContain('`');
|
|
202
|
+
expect(result).not.toContain('>');
|
|
203
|
+
expect(result).toContain('Error');
|
|
204
|
+
expect(result).toContain('ENOENT');
|
|
205
|
+
expect(result).toContain('line 142');
|
|
206
|
+
});
|
|
207
|
+
it('should clean a heading + list response', () => {
|
|
208
|
+
const input = '# Results\n- item one\n- item two\n- item three';
|
|
209
|
+
const result = formatForSpeech(input);
|
|
210
|
+
expect(result).toBe('Results\nitem one\nitem two\nitem three');
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
//# sourceMappingURL=responseFormatter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responseFormatter.test.js","sourceRoot":"","sources":["../../../src/voice/responseFormatter.test.ts"],"names":[],"mappings":"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"}
|