@wingman-ai/gateway 0.5.3 → 0.5.4
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/agent/config/agentConfig.cjs +4 -0
- package/dist/agent/config/agentConfig.d.ts +12 -0
- package/dist/agent/config/agentConfig.js +4 -0
- package/dist/agent/config/toolRegistry.cjs +75 -1
- package/dist/agent/config/toolRegistry.d.ts +3 -0
- package/dist/agent/config/toolRegistry.js +75 -1
- package/dist/agent/middleware/large-tool-results.cjs +207 -0
- package/dist/agent/middleware/large-tool-results.d.ts +16 -0
- package/dist/agent/middleware/large-tool-results.js +173 -0
- package/dist/agent/tools/browser_control.cjs +9 -1231
- package/dist/agent/tools/browser_control.d.ts +126 -234
- package/dist/agent/tools/browser_control.js +7 -1226
- package/dist/agent/tools/browser_runtime.cjs +1189 -0
- package/dist/agent/tools/browser_runtime.d.ts +560 -0
- package/dist/agent/tools/browser_runtime.js +1122 -0
- package/dist/agent/tools/browser_session.cjs +153 -0
- package/dist/agent/tools/browser_session.d.ts +741 -0
- package/dist/agent/tools/browser_session.js +110 -0
- package/dist/agent/tools/browser_session_manager.cjs +202 -0
- package/dist/agent/tools/browser_session_manager.d.ts +64 -0
- package/dist/agent/tools/browser_session_manager.js +165 -0
- package/dist/cli/commands/init.cjs +5 -1
- package/dist/cli/commands/init.js +5 -1
- package/dist/cli/config/loader.cjs +0 -5
- package/dist/cli/config/loader.js +0 -5
- package/dist/cli/config/schema.cjs +3 -7
- package/dist/cli/config/schema.d.ts +6 -6
- package/dist/cli/config/schema.js +3 -7
- package/dist/cli/core/agentInvoker.cjs +86 -22
- package/dist/cli/core/agentInvoker.d.ts +10 -3
- package/dist/cli/core/agentInvoker.js +86 -25
- package/dist/cli/core/outputManager.cjs +7 -2
- package/dist/cli/core/outputManager.d.ts +2 -2
- package/dist/cli/core/outputManager.js +7 -2
- package/dist/cli/types.d.ts +2 -1
- package/dist/webui/assets/index-XrEnkZiq.css +11 -0
- package/dist/webui/assets/index-mDs6HbKM.js +215 -0
- package/dist/webui/index.html +2 -2
- package/package.json +10 -10
- package/templates/agents/README.md +2 -1
- package/templates/agents/coding/agent.md +6 -13
- package/templates/agents/coding-v2/agent.md +6 -1
- package/templates/agents/game-dev/agent.md +8 -2
- package/templates/agents/game-dev/game-designer.md +4 -0
- package/templates/agents/game-dev/scene-engineer.md +4 -0
- package/templates/agents/main/agent.md +5 -0
- package/templates/agents/researcher/agent.md +11 -0
- package/templates/agents/stock-trader/agent.md +4 -0
- package/dist/agent/tests/agentConfig.test.cjs +0 -224
- package/dist/agent/tests/agentConfig.test.d.ts +0 -1
- package/dist/agent/tests/agentConfig.test.js +0 -218
- package/dist/agent/tests/agentLoader.test.cjs +0 -335
- package/dist/agent/tests/agentLoader.test.d.ts +0 -1
- package/dist/agent/tests/agentLoader.test.js +0 -329
- package/dist/agent/tests/backgroundTerminal.test.cjs +0 -70
- package/dist/agent/tests/backgroundTerminal.test.d.ts +0 -1
- package/dist/agent/tests/backgroundTerminal.test.js +0 -64
- package/dist/agent/tests/browserControlHelpers.test.cjs +0 -35
- package/dist/agent/tests/browserControlHelpers.test.d.ts +0 -1
- package/dist/agent/tests/browserControlHelpers.test.js +0 -29
- package/dist/agent/tests/browserControlTool.test.cjs +0 -2117
- package/dist/agent/tests/browserControlTool.test.d.ts +0 -1
- package/dist/agent/tests/browserControlTool.test.js +0 -2111
- package/dist/agent/tests/commandExecuteTool.test.cjs +0 -29
- package/dist/agent/tests/commandExecuteTool.test.d.ts +0 -1
- package/dist/agent/tests/commandExecuteTool.test.js +0 -23
- package/dist/agent/tests/internet_search.test.cjs +0 -107
- package/dist/agent/tests/internet_search.test.d.ts +0 -1
- package/dist/agent/tests/internet_search.test.js +0 -101
- package/dist/agent/tests/mcpClientManager.test.cjs +0 -290
- package/dist/agent/tests/mcpClientManager.test.d.ts +0 -1
- package/dist/agent/tests/mcpClientManager.test.js +0 -284
- package/dist/agent/tests/mcpResourceTools.test.cjs +0 -101
- package/dist/agent/tests/mcpResourceTools.test.d.ts +0 -1
- package/dist/agent/tests/mcpResourceTools.test.js +0 -95
- package/dist/agent/tests/modelFactory.test.cjs +0 -190
- package/dist/agent/tests/modelFactory.test.d.ts +0 -1
- package/dist/agent/tests/modelFactory.test.js +0 -184
- package/dist/agent/tests/terminalSessionManager.test.cjs +0 -121
- package/dist/agent/tests/terminalSessionManager.test.d.ts +0 -1
- package/dist/agent/tests/terminalSessionManager.test.js +0 -115
- package/dist/agent/tests/test-agent-loader.cjs +0 -33
- package/dist/agent/tests/test-agent-loader.d.ts +0 -1
- package/dist/agent/tests/test-agent-loader.js +0 -27
- package/dist/agent/tests/test-subagent-loading.cjs +0 -99
- package/dist/agent/tests/test-subagent-loading.d.ts +0 -1
- package/dist/agent/tests/test-subagent-loading.js +0 -93
- package/dist/agent/tests/toolRegistry.test.cjs +0 -147
- package/dist/agent/tests/toolRegistry.test.d.ts +0 -1
- package/dist/agent/tests/toolRegistry.test.js +0 -141
- package/dist/agent/tests/uiRegistryTools.test.cjs +0 -114
- package/dist/agent/tests/uiRegistryTools.test.d.ts +0 -1
- package/dist/agent/tests/uiRegistryTools.test.js +0 -105
- package/dist/agent/tests/xaiImageModel.test.cjs +0 -194
- package/dist/agent/tests/xaiImageModel.test.d.ts +0 -1
- package/dist/agent/tests/xaiImageModel.test.js +0 -188
- package/dist/tests/additionalMessageMiddleware.test.cjs +0 -216
- package/dist/tests/additionalMessageMiddleware.test.d.ts +0 -1
- package/dist/tests/additionalMessageMiddleware.test.js +0 -188
- package/dist/tests/agent-config-voice.test.cjs +0 -25
- package/dist/tests/agent-config-voice.test.d.ts +0 -1
- package/dist/tests/agent-config-voice.test.js +0 -19
- package/dist/tests/agentInvokerAttachments.test.cjs +0 -190
- package/dist/tests/agentInvokerAttachments.test.d.ts +0 -1
- package/dist/tests/agentInvokerAttachments.test.js +0 -184
- package/dist/tests/agentInvokerSummarization.test.cjs +0 -613
- package/dist/tests/agentInvokerSummarization.test.d.ts +0 -1
- package/dist/tests/agentInvokerSummarization.test.js +0 -607
- package/dist/tests/agentInvokerTokenUsage.test.cjs +0 -124
- package/dist/tests/agentInvokerTokenUsage.test.d.ts +0 -1
- package/dist/tests/agentInvokerTokenUsage.test.js +0 -118
- package/dist/tests/agentInvokerWorkdir.test.cjs +0 -150
- package/dist/tests/agentInvokerWorkdir.test.d.ts +0 -1
- package/dist/tests/agentInvokerWorkdir.test.js +0 -122
- package/dist/tests/agents-api.test.cjs +0 -324
- package/dist/tests/agents-api.test.d.ts +0 -1
- package/dist/tests/agents-api.test.js +0 -318
- package/dist/tests/attachments-utils.test.cjs +0 -46
- package/dist/tests/attachments-utils.test.d.ts +0 -1
- package/dist/tests/attachments-utils.test.js +0 -40
- package/dist/tests/browser-command.test.cjs +0 -264
- package/dist/tests/browser-command.test.d.ts +0 -1
- package/dist/tests/browser-command.test.js +0 -258
- package/dist/tests/browser-relay-server.test.cjs +0 -20
- package/dist/tests/browser-relay-server.test.d.ts +0 -1
- package/dist/tests/browser-relay-server.test.js +0 -14
- package/dist/tests/bunSqliteAdapter.test.cjs +0 -265
- package/dist/tests/bunSqliteAdapter.test.d.ts +0 -1
- package/dist/tests/bunSqliteAdapter.test.js +0 -259
- package/dist/tests/candleRange.test.cjs +0 -48
- package/dist/tests/candleRange.test.d.ts +0 -1
- package/dist/tests/candleRange.test.js +0 -42
- package/dist/tests/cli-config-loader.test.cjs +0 -532
- package/dist/tests/cli-config-loader.test.d.ts +0 -1
- package/dist/tests/cli-config-loader.test.js +0 -526
- package/dist/tests/cli-config-warnings.test.cjs +0 -94
- package/dist/tests/cli-config-warnings.test.d.ts +0 -1
- package/dist/tests/cli-config-warnings.test.js +0 -88
- package/dist/tests/cli-init.test.cjs +0 -225
- package/dist/tests/cli-init.test.d.ts +0 -1
- package/dist/tests/cli-init.test.js +0 -219
- package/dist/tests/cli-workspace-root.test.cjs +0 -114
- package/dist/tests/cli-workspace-root.test.d.ts +0 -1
- package/dist/tests/cli-workspace-root.test.js +0 -108
- package/dist/tests/codex-credentials-precedence.test.cjs +0 -94
- package/dist/tests/codex-credentials-precedence.test.d.ts +0 -1
- package/dist/tests/codex-credentials-precedence.test.js +0 -88
- package/dist/tests/codex-provider.test.cjs +0 -383
- package/dist/tests/codex-provider.test.d.ts +0 -1
- package/dist/tests/codex-provider.test.js +0 -377
- package/dist/tests/config-json-schema.test.cjs +0 -37
- package/dist/tests/config-json-schema.test.d.ts +0 -1
- package/dist/tests/config-json-schema.test.js +0 -31
- package/dist/tests/discord-adapter.test.cjs +0 -89
- package/dist/tests/discord-adapter.test.d.ts +0 -1
- package/dist/tests/discord-adapter.test.js +0 -83
- package/dist/tests/falRuntime.test.cjs +0 -78
- package/dist/tests/falRuntime.test.d.ts +0 -1
- package/dist/tests/falRuntime.test.js +0 -72
- package/dist/tests/falSummary.test.cjs +0 -51
- package/dist/tests/falSummary.test.d.ts +0 -1
- package/dist/tests/falSummary.test.js +0 -45
- package/dist/tests/fs-api.test.cjs +0 -138
- package/dist/tests/fs-api.test.d.ts +0 -1
- package/dist/tests/fs-api.test.js +0 -132
- package/dist/tests/gateway-command-workspace.test.cjs +0 -150
- package/dist/tests/gateway-command-workspace.test.d.ts +0 -1
- package/dist/tests/gateway-command-workspace.test.js +0 -144
- package/dist/tests/gateway-http-security.test.cjs +0 -318
- package/dist/tests/gateway-http-security.test.d.ts +0 -1
- package/dist/tests/gateway-http-security.test.js +0 -312
- package/dist/tests/gateway-node-mode.test.cjs +0 -174
- package/dist/tests/gateway-node-mode.test.d.ts +0 -1
- package/dist/tests/gateway-node-mode.test.js +0 -168
- package/dist/tests/gateway-origin-policy.test.cjs +0 -82
- package/dist/tests/gateway-origin-policy.test.d.ts +0 -1
- package/dist/tests/gateway-origin-policy.test.js +0 -76
- package/dist/tests/gateway-request-execution-overrides.test.cjs +0 -42
- package/dist/tests/gateway-request-execution-overrides.test.d.ts +0 -1
- package/dist/tests/gateway-request-execution-overrides.test.js +0 -36
- package/dist/tests/gateway.test.cjs +0 -700
- package/dist/tests/gateway.test.d.ts +0 -1
- package/dist/tests/gateway.test.js +0 -694
- package/dist/tests/hooks-matcher.test.cjs +0 -309
- package/dist/tests/hooks-matcher.test.d.ts +0 -1
- package/dist/tests/hooks-matcher.test.js +0 -303
- package/dist/tests/hooks-merger.test.cjs +0 -528
- package/dist/tests/hooks-merger.test.d.ts +0 -1
- package/dist/tests/hooks-merger.test.js +0 -522
- package/dist/tests/imagePersistence.test.cjs +0 -169
- package/dist/tests/imagePersistence.test.d.ts +0 -1
- package/dist/tests/imagePersistence.test.js +0 -163
- package/dist/tests/integration/agent-invocation.integration.test.cjs +0 -264
- package/dist/tests/integration/agent-invocation.integration.test.d.ts +0 -1
- package/dist/tests/integration/agent-invocation.integration.test.js +0 -258
- package/dist/tests/integration/finnhub-candles.integration.test.cjs +0 -98
- package/dist/tests/integration/finnhub-candles.integration.test.d.ts +0 -1
- package/dist/tests/integration/finnhub-candles.integration.test.js +0 -92
- package/dist/tests/integration/summarization-e2e.integration.test.cjs +0 -127
- package/dist/tests/integration/summarization-e2e.integration.test.d.ts +0 -1
- package/dist/tests/integration/summarization-e2e.integration.test.js +0 -121
- package/dist/tests/logger.test.cjs +0 -353
- package/dist/tests/logger.test.d.ts +0 -1
- package/dist/tests/logger.test.js +0 -347
- package/dist/tests/mediaCompatibilityMiddleware.test.cjs +0 -106
- package/dist/tests/mediaCompatibilityMiddleware.test.d.ts +0 -1
- package/dist/tests/mediaCompatibilityMiddleware.test.js +0 -100
- package/dist/tests/node-tools.test.cjs +0 -77
- package/dist/tests/node-tools.test.d.ts +0 -1
- package/dist/tests/node-tools.test.js +0 -71
- package/dist/tests/nodes-api.test.cjs +0 -86
- package/dist/tests/nodes-api.test.d.ts +0 -1
- package/dist/tests/nodes-api.test.js +0 -80
- package/dist/tests/outputManagerContextSummarized.test.cjs +0 -43
- package/dist/tests/outputManagerContextSummarized.test.d.ts +0 -1
- package/dist/tests/outputManagerContextSummarized.test.js +0 -37
- package/dist/tests/provider-command-codex.test.cjs +0 -57
- package/dist/tests/provider-command-codex.test.d.ts +0 -1
- package/dist/tests/provider-command-codex.test.js +0 -51
- package/dist/tests/routines-api.test.cjs +0 -107
- package/dist/tests/routines-api.test.d.ts +0 -1
- package/dist/tests/routines-api.test.js +0 -101
- package/dist/tests/run-terminal-bench-official-script.test.cjs +0 -61
- package/dist/tests/run-terminal-bench-official-script.test.d.ts +0 -1
- package/dist/tests/run-terminal-bench-official-script.test.js +0 -55
- package/dist/tests/sessionManager-uionly.test.cjs +0 -50
- package/dist/tests/sessionManager-uionly.test.d.ts +0 -1
- package/dist/tests/sessionManager-uionly.test.js +0 -44
- package/dist/tests/sessionMessageAttachments.test.cjs +0 -197
- package/dist/tests/sessionMessageAttachments.test.d.ts +0 -1
- package/dist/tests/sessionMessageAttachments.test.js +0 -191
- package/dist/tests/sessionMessageRole.test.cjs +0 -44
- package/dist/tests/sessionMessageRole.test.d.ts +0 -1
- package/dist/tests/sessionMessageRole.test.js +0 -38
- package/dist/tests/sessionStateMessages.test.cjs +0 -236
- package/dist/tests/sessionStateMessages.test.d.ts +0 -1
- package/dist/tests/sessionStateMessages.test.js +0 -230
- package/dist/tests/sessions-api.test.cjs +0 -250
- package/dist/tests/sessions-api.test.d.ts +0 -1
- package/dist/tests/sessions-api.test.js +0 -244
- package/dist/tests/skill-activation.test.cjs +0 -86
- package/dist/tests/skill-activation.test.d.ts +0 -1
- package/dist/tests/skill-activation.test.js +0 -80
- package/dist/tests/skill-metadata.test.cjs +0 -119
- package/dist/tests/skill-metadata.test.d.ts +0 -1
- package/dist/tests/skill-metadata.test.js +0 -113
- package/dist/tests/skill-repository.test.cjs +0 -469
- package/dist/tests/skill-repository.test.d.ts +0 -1
- package/dist/tests/skill-repository.test.js +0 -463
- package/dist/tests/skill-security-scanner.test.cjs +0 -126
- package/dist/tests/skill-security-scanner.test.d.ts +0 -1
- package/dist/tests/skill-security-scanner.test.js +0 -120
- package/dist/tests/sms-api.test.cjs +0 -183
- package/dist/tests/sms-api.test.d.ts +0 -1
- package/dist/tests/sms-api.test.js +0 -177
- package/dist/tests/sms-commands.test.cjs +0 -90
- package/dist/tests/sms-commands.test.d.ts +0 -1
- package/dist/tests/sms-commands.test.js +0 -84
- package/dist/tests/sms-policy-store.test.cjs +0 -69
- package/dist/tests/sms-policy-store.test.d.ts +0 -1
- package/dist/tests/sms-policy-store.test.js +0 -63
- package/dist/tests/teams-adapter.test.cjs +0 -58
- package/dist/tests/teams-adapter.test.d.ts +0 -1
- package/dist/tests/teams-adapter.test.js +0 -52
- package/dist/tests/technicalIndicators.test.cjs +0 -82
- package/dist/tests/technicalIndicators.test.d.ts +0 -1
- package/dist/tests/technicalIndicators.test.js +0 -76
- package/dist/tests/terminal-bench-adapters-helpers.test.cjs +0 -64
- package/dist/tests/terminal-bench-adapters-helpers.test.d.ts +0 -1
- package/dist/tests/terminal-bench-adapters-helpers.test.js +0 -58
- package/dist/tests/terminal-bench-cleanup.test.cjs +0 -93
- package/dist/tests/terminal-bench-cleanup.test.d.ts +0 -1
- package/dist/tests/terminal-bench-cleanup.test.js +0 -87
- package/dist/tests/terminal-bench-config.test.cjs +0 -62
- package/dist/tests/terminal-bench-config.test.d.ts +0 -1
- package/dist/tests/terminal-bench-config.test.js +0 -56
- package/dist/tests/terminal-bench-official.test.cjs +0 -194
- package/dist/tests/terminal-bench-official.test.d.ts +0 -1
- package/dist/tests/terminal-bench-official.test.js +0 -188
- package/dist/tests/terminal-bench-runner.test.cjs +0 -82
- package/dist/tests/terminal-bench-runner.test.d.ts +0 -1
- package/dist/tests/terminal-bench-runner.test.js +0 -76
- package/dist/tests/terminal-bench-scoring.test.cjs +0 -128
- package/dist/tests/terminal-bench-scoring.test.d.ts +0 -1
- package/dist/tests/terminal-bench-scoring.test.js +0 -122
- package/dist/tests/terminalProbe.test.cjs +0 -45
- package/dist/tests/terminalProbe.test.d.ts +0 -1
- package/dist/tests/terminalProbe.test.js +0 -39
- package/dist/tests/terminalProbeAuth.test.cjs +0 -85
- package/dist/tests/terminalProbeAuth.test.d.ts +0 -1
- package/dist/tests/terminalProbeAuth.test.js +0 -79
- package/dist/tests/toolDisplayHelpers.test.cjs +0 -46
- package/dist/tests/toolDisplayHelpers.test.d.ts +0 -1
- package/dist/tests/toolDisplayHelpers.test.js +0 -40
- package/dist/tests/uv.test.cjs +0 -47
- package/dist/tests/uv.test.d.ts +0 -1
- package/dist/tests/uv.test.js +0 -41
- package/dist/tests/voice-config.test.cjs +0 -35
- package/dist/tests/voice-config.test.d.ts +0 -1
- package/dist/tests/voice-config.test.js +0 -29
- package/dist/tests/websocket-transport.test.cjs +0 -31
- package/dist/tests/websocket-transport.test.d.ts +0 -1
- package/dist/tests/websocket-transport.test.js +0 -25
- package/dist/tests/yahooCandles.test.cjs +0 -111
- package/dist/tests/yahooCandles.test.d.ts +0 -1
- package/dist/tests/yahooCandles.test.js +0 -105
- package/dist/tools/finance/optionsAnalytics.test.cjs +0 -128
- package/dist/tools/finance/optionsAnalytics.test.d.ts +0 -1
- package/dist/tools/finance/optionsAnalytics.test.js +0 -122
- package/dist/webui/assets/index-BMf95nv5.js +0 -215
- package/dist/webui/assets/index-DhJQ8Mbn.css +0 -11
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import node_path from "node:path";
|
|
2
|
-
import { describe, expect, it } from "vitest";
|
|
3
|
-
import { HumanMessage } from "langchain";
|
|
4
|
-
import { additionalMessageMiddleware } from "../agent/middleware/additional-messages.js";
|
|
5
|
-
describe("additionalMessageMiddleware", ()=>{
|
|
6
|
-
it("injects the additional message when missing", async ()=>{
|
|
7
|
-
const middleware = additionalMessageMiddleware();
|
|
8
|
-
const input = {
|
|
9
|
-
messages: [
|
|
10
|
-
new HumanMessage("Hello")
|
|
11
|
-
]
|
|
12
|
-
};
|
|
13
|
-
const beforeAgent = "function" == typeof middleware.beforeAgent ? middleware.beforeAgent : middleware.beforeAgent?.hook;
|
|
14
|
-
if (!beforeAgent) throw new Error("beforeAgent hook not configured");
|
|
15
|
-
const result = await beforeAgent(input, {});
|
|
16
|
-
expect(result.messages).toHaveLength(2);
|
|
17
|
-
const injected = result.messages[0];
|
|
18
|
-
expect(injected.additional_kwargs?.source).toBe("additional-message-middleware");
|
|
19
|
-
expect(injected).toBeInstanceOf(HumanMessage);
|
|
20
|
-
});
|
|
21
|
-
it("adds confidentiality guidance without exposing machine details", async ()=>{
|
|
22
|
-
const workspaceRoot = node_path.resolve("repo");
|
|
23
|
-
const workdir = node_path.join(workspaceRoot, "output");
|
|
24
|
-
const middleware = additionalMessageMiddleware({
|
|
25
|
-
workspaceRoot,
|
|
26
|
-
workdir
|
|
27
|
-
});
|
|
28
|
-
const input = {
|
|
29
|
-
messages: [
|
|
30
|
-
new HumanMessage("Hello")
|
|
31
|
-
]
|
|
32
|
-
};
|
|
33
|
-
const beforeAgent = "function" == typeof middleware.beforeAgent ? middleware.beforeAgent : middleware.beforeAgent?.hook;
|
|
34
|
-
if (!beforeAgent) throw new Error("beforeAgent hook not configured");
|
|
35
|
-
const result = await beforeAgent(input, {});
|
|
36
|
-
const injected = result.messages[0];
|
|
37
|
-
const content = injected.content ?? "";
|
|
38
|
-
expect(content).toContain("Confidentiality");
|
|
39
|
-
expect(content).toContain("inspect system/tool output internally");
|
|
40
|
-
expect(content).toContain("Do not disclose");
|
|
41
|
-
expect(content).toContain("Do not quote internal tool call IDs");
|
|
42
|
-
expect(content).toContain("Working Directory");
|
|
43
|
-
expect(content).toContain("current working directory");
|
|
44
|
-
expect(content).toContain("Use relative paths");
|
|
45
|
-
expect(content).not.toContain("Operating System:");
|
|
46
|
-
expect(content).not.toContain("Architecture:");
|
|
47
|
-
expect(content).not.toContain("Default Shell:");
|
|
48
|
-
expect(content).toContain("session output directory");
|
|
49
|
-
expect(content).toContain("output");
|
|
50
|
-
expect(content).not.toContain(workdir);
|
|
51
|
-
expect(content).not.toContain(workspaceRoot);
|
|
52
|
-
});
|
|
53
|
-
it("uses virtual output path when workdir is outside the workspace root", async ()=>{
|
|
54
|
-
const workspaceRoot = node_path.resolve("repo");
|
|
55
|
-
const workdir = node_path.resolve("external-output");
|
|
56
|
-
const middleware = additionalMessageMiddleware({
|
|
57
|
-
workspaceRoot,
|
|
58
|
-
workdir,
|
|
59
|
-
outputVirtualPath: "/workdir/"
|
|
60
|
-
});
|
|
61
|
-
const input = {
|
|
62
|
-
messages: [
|
|
63
|
-
new HumanMessage("Hello")
|
|
64
|
-
]
|
|
65
|
-
};
|
|
66
|
-
const beforeAgent = "function" == typeof middleware.beforeAgent ? middleware.beforeAgent : middleware.beforeAgent?.hook;
|
|
67
|
-
if (!beforeAgent) throw new Error("beforeAgent hook not configured");
|
|
68
|
-
const result = await beforeAgent(input, {});
|
|
69
|
-
const injected = result.messages[0];
|
|
70
|
-
const content = injected.content ?? "";
|
|
71
|
-
expect(content).toContain("session output directory");
|
|
72
|
-
expect(content).toContain("/workdir/");
|
|
73
|
-
expect(content).not.toContain("(path hidden)");
|
|
74
|
-
expect(content).not.toContain(workdir);
|
|
75
|
-
});
|
|
76
|
-
it("does not inject the additional message twice", async ()=>{
|
|
77
|
-
const middleware = additionalMessageMiddleware();
|
|
78
|
-
const input = {
|
|
79
|
-
messages: [
|
|
80
|
-
new HumanMessage("Hello")
|
|
81
|
-
]
|
|
82
|
-
};
|
|
83
|
-
const beforeAgent = "function" == typeof middleware.beforeAgent ? middleware.beforeAgent : middleware.beforeAgent?.hook;
|
|
84
|
-
if (!beforeAgent) throw new Error("beforeAgent hook not configured");
|
|
85
|
-
const first = await beforeAgent(input, {});
|
|
86
|
-
const second = await beforeAgent({
|
|
87
|
-
messages: first.messages
|
|
88
|
-
}, {});
|
|
89
|
-
const messages = second.messages;
|
|
90
|
-
const injectedCount = messages.filter((message)=>{
|
|
91
|
-
const source = message.additional_kwargs?.source;
|
|
92
|
-
return "additional-message-middleware" === source;
|
|
93
|
-
}).length;
|
|
94
|
-
expect(injectedCount).toBe(1);
|
|
95
|
-
});
|
|
96
|
-
it("refreshes injected node context on each invocation", async ()=>{
|
|
97
|
-
let connectedIds = [
|
|
98
|
-
"node-a"
|
|
99
|
-
];
|
|
100
|
-
const middleware = additionalMessageMiddleware({
|
|
101
|
-
nodeConnectedIdsProvider: ()=>connectedIds
|
|
102
|
-
});
|
|
103
|
-
const beforeAgent = "function" == typeof middleware.beforeAgent ? middleware.beforeAgent : middleware.beforeAgent?.hook;
|
|
104
|
-
if (!beforeAgent) throw new Error("beforeAgent hook not configured");
|
|
105
|
-
const first = await beforeAgent({
|
|
106
|
-
messages: [
|
|
107
|
-
new HumanMessage("Hello")
|
|
108
|
-
]
|
|
109
|
-
}, {});
|
|
110
|
-
const firstContent = first.messages[0]?.content ?? "";
|
|
111
|
-
expect(firstContent).toContain("Connected node IDs: node-a");
|
|
112
|
-
connectedIds = [
|
|
113
|
-
"node-b"
|
|
114
|
-
];
|
|
115
|
-
const second = await beforeAgent({
|
|
116
|
-
messages: first.messages
|
|
117
|
-
}, {});
|
|
118
|
-
const secondContent = second.messages[0]?.content ?? "";
|
|
119
|
-
expect(secondContent).toContain("Connected node IDs: node-b");
|
|
120
|
-
expect(secondContent).not.toContain("Connected node IDs: node-a");
|
|
121
|
-
});
|
|
122
|
-
it("injects connected node IDs for node tool targeting when provided", async ()=>{
|
|
123
|
-
const middleware = additionalMessageMiddleware({
|
|
124
|
-
nodeConnectedIdsProvider: ()=>[
|
|
125
|
-
"node-b",
|
|
126
|
-
"node-a",
|
|
127
|
-
"",
|
|
128
|
-
"node-b"
|
|
129
|
-
]
|
|
130
|
-
});
|
|
131
|
-
const input = {
|
|
132
|
-
messages: [
|
|
133
|
-
new HumanMessage("Hello")
|
|
134
|
-
]
|
|
135
|
-
};
|
|
136
|
-
const beforeAgent = "function" == typeof middleware.beforeAgent ? middleware.beforeAgent : middleware.beforeAgent?.hook;
|
|
137
|
-
if (!beforeAgent) throw new Error("beforeAgent hook not configured");
|
|
138
|
-
const result = await beforeAgent(input, {});
|
|
139
|
-
const content = result.messages[0]?.content ?? "";
|
|
140
|
-
expect(content).toContain("Connected Node Targets");
|
|
141
|
-
expect(content).toContain("Connected node IDs: node-b, node-a");
|
|
142
|
-
expect(content).toContain("target.nodeId or target.clientId");
|
|
143
|
-
});
|
|
144
|
-
it("injects default node target clientId when present", async ()=>{
|
|
145
|
-
const middleware = additionalMessageMiddleware({
|
|
146
|
-
nodeConnectedIdsProvider: ()=>[],
|
|
147
|
-
defaultNodeTargetClientId: "desktop-abc123"
|
|
148
|
-
});
|
|
149
|
-
const input = {
|
|
150
|
-
messages: [
|
|
151
|
-
new HumanMessage("Hello")
|
|
152
|
-
]
|
|
153
|
-
};
|
|
154
|
-
const beforeAgent = "function" == typeof middleware.beforeAgent ? middleware.beforeAgent : middleware.beforeAgent?.hook;
|
|
155
|
-
if (!beforeAgent) throw new Error("beforeAgent hook not configured");
|
|
156
|
-
const result = await beforeAgent(input, {});
|
|
157
|
-
const content = result.messages[0]?.content ?? "";
|
|
158
|
-
expect(content).toContain("Connected node IDs: (none currently connected)");
|
|
159
|
-
expect(content).toContain("Default node target clientId for this request: desktop-abc123");
|
|
160
|
-
});
|
|
161
|
-
it("injects connected node metadata when provided", async ()=>{
|
|
162
|
-
const middleware = additionalMessageMiddleware({
|
|
163
|
-
nodeConnectedTargetsProvider: ()=>[
|
|
164
|
-
{
|
|
165
|
-
nodeId: "node-a",
|
|
166
|
-
clientId: "desktop-a",
|
|
167
|
-
name: "Russell MacBook",
|
|
168
|
-
capabilities: [
|
|
169
|
-
"system.notify",
|
|
170
|
-
"system.run"
|
|
171
|
-
]
|
|
172
|
-
}
|
|
173
|
-
]
|
|
174
|
-
});
|
|
175
|
-
const input = {
|
|
176
|
-
messages: [
|
|
177
|
-
new HumanMessage("Hello")
|
|
178
|
-
]
|
|
179
|
-
};
|
|
180
|
-
const beforeAgent = "function" == typeof middleware.beforeAgent ? middleware.beforeAgent : middleware.beforeAgent?.hook;
|
|
181
|
-
if (!beforeAgent) throw new Error("beforeAgent hook not configured");
|
|
182
|
-
const result = await beforeAgent(input, {});
|
|
183
|
-
const content = result.messages[0]?.content ?? "";
|
|
184
|
-
expect(content).toContain("Connected node metadata:");
|
|
185
|
-
expect(content).toContain("node-a (clientId: desktop-a; name: Russell MacBook;");
|
|
186
|
-
expect(content).toContain("capabilities: system.notify, system.run");
|
|
187
|
-
});
|
|
188
|
-
});
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __webpack_exports__ = {};
|
|
3
|
-
const external_vitest_namespaceObject = require("vitest");
|
|
4
|
-
const agentConfig_cjs_namespaceObject = require("../agent/config/agentConfig.cjs");
|
|
5
|
-
(0, external_vitest_namespaceObject.describe)("Agent config voice settings", ()=>{
|
|
6
|
-
(0, external_vitest_namespaceObject.it)("accepts voice configuration in agent config", ()=>{
|
|
7
|
-
const result = (0, agentConfig_cjs_namespaceObject.validateAgentConfig)({
|
|
8
|
-
name: "voice-agent",
|
|
9
|
-
description: "Tests voice settings.",
|
|
10
|
-
systemPrompt: "Respond clearly.",
|
|
11
|
-
voice: {
|
|
12
|
-
provider: "elevenlabs",
|
|
13
|
-
elevenlabs: {
|
|
14
|
-
voiceId: "voice-123",
|
|
15
|
-
stability: 0.4
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
(0, external_vitest_namespaceObject.expect)(result.success).toBe(true);
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
23
|
-
Object.defineProperty(exports, '__esModule', {
|
|
24
|
-
value: true
|
|
25
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { validateAgentConfig } from "../agent/config/agentConfig.js";
|
|
3
|
-
describe("Agent config voice settings", ()=>{
|
|
4
|
-
it("accepts voice configuration in agent config", ()=>{
|
|
5
|
-
const result = validateAgentConfig({
|
|
6
|
-
name: "voice-agent",
|
|
7
|
-
description: "Tests voice settings.",
|
|
8
|
-
systemPrompt: "Respond clearly.",
|
|
9
|
-
voice: {
|
|
10
|
-
provider: "elevenlabs",
|
|
11
|
-
elevenlabs: {
|
|
12
|
-
voiceId: "voice-123",
|
|
13
|
-
stability: 0.4
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
});
|
|
17
|
-
expect(result.success).toBe(true);
|
|
18
|
-
});
|
|
19
|
-
});
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __webpack_exports__ = {};
|
|
3
|
-
const external_vitest_namespaceObject = require("vitest");
|
|
4
|
-
const agentInvoker_cjs_namespaceObject = require("../cli/core/agentInvoker.cjs");
|
|
5
|
-
(0, external_vitest_namespaceObject.describe)("buildUserContent", ()=>{
|
|
6
|
-
(0, external_vitest_namespaceObject.it)("returns text when no attachments are provided", ()=>{
|
|
7
|
-
(0, external_vitest_namespaceObject.expect)((0, agentInvoker_cjs_namespaceObject.buildUserContent)("Hello", void 0)).toBe("Hello");
|
|
8
|
-
});
|
|
9
|
-
(0, external_vitest_namespaceObject.it)("builds mixed text and image parts", ()=>{
|
|
10
|
-
const result = (0, agentInvoker_cjs_namespaceObject.buildUserContent)("Chart please", [
|
|
11
|
-
{
|
|
12
|
-
dataUrl: "data:image/png;base64,abc"
|
|
13
|
-
}
|
|
14
|
-
]);
|
|
15
|
-
(0, external_vitest_namespaceObject.expect)(Array.isArray(result)).toBe(true);
|
|
16
|
-
(0, external_vitest_namespaceObject.expect)(result).toEqual([
|
|
17
|
-
{
|
|
18
|
-
type: "text",
|
|
19
|
-
text: "Chart please"
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
type: "image_url",
|
|
23
|
-
image_url: {
|
|
24
|
-
url: "data:image/png;base64,abc"
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
]);
|
|
28
|
-
});
|
|
29
|
-
(0, external_vitest_namespaceObject.it)("builds image-only parts when text is empty", ()=>{
|
|
30
|
-
const result = (0, agentInvoker_cjs_namespaceObject.buildUserContent)("", [
|
|
31
|
-
{
|
|
32
|
-
dataUrl: "data:image/png;base64,xyz"
|
|
33
|
-
}
|
|
34
|
-
]);
|
|
35
|
-
(0, external_vitest_namespaceObject.expect)(Array.isArray(result)).toBe(true);
|
|
36
|
-
(0, external_vitest_namespaceObject.expect)(result).toEqual([
|
|
37
|
-
{
|
|
38
|
-
type: "image_url",
|
|
39
|
-
image_url: {
|
|
40
|
-
url: "data:image/png;base64,xyz"
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
]);
|
|
44
|
-
});
|
|
45
|
-
(0, external_vitest_namespaceObject.it)("builds audio parts when audio attachments are provided", ()=>{
|
|
46
|
-
const result = (0, agentInvoker_cjs_namespaceObject.buildUserContent)("", [
|
|
47
|
-
{
|
|
48
|
-
kind: "audio",
|
|
49
|
-
dataUrl: "data:audio/wav;base64,abc",
|
|
50
|
-
mimeType: "audio/wav"
|
|
51
|
-
}
|
|
52
|
-
]);
|
|
53
|
-
(0, external_vitest_namespaceObject.expect)(Array.isArray(result)).toBe(true);
|
|
54
|
-
(0, external_vitest_namespaceObject.expect)(result).toEqual([
|
|
55
|
-
{
|
|
56
|
-
type: "audio",
|
|
57
|
-
source_type: "base64",
|
|
58
|
-
data: "abc",
|
|
59
|
-
mime_type: "audio/wav"
|
|
60
|
-
}
|
|
61
|
-
]);
|
|
62
|
-
});
|
|
63
|
-
(0, external_vitest_namespaceObject.it)("builds text parts for extracted file attachments", ()=>{
|
|
64
|
-
const result = (0, agentInvoker_cjs_namespaceObject.buildUserContent)("Review this", [
|
|
65
|
-
{
|
|
66
|
-
kind: "file",
|
|
67
|
-
dataUrl: "",
|
|
68
|
-
name: "notes.md",
|
|
69
|
-
mimeType: "text/markdown",
|
|
70
|
-
textContent: "# Notes\n- keep media uploads working"
|
|
71
|
-
}
|
|
72
|
-
]);
|
|
73
|
-
(0, external_vitest_namespaceObject.expect)(Array.isArray(result)).toBe(true);
|
|
74
|
-
(0, external_vitest_namespaceObject.expect)(result).toEqual([
|
|
75
|
-
{
|
|
76
|
-
type: "text",
|
|
77
|
-
text: "Review this"
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
type: "text",
|
|
81
|
-
text: "[Attached file: notes.md (text/markdown)]\n# Notes\n- keep media uploads working"
|
|
82
|
-
}
|
|
83
|
-
]);
|
|
84
|
-
});
|
|
85
|
-
(0, external_vitest_namespaceObject.it)("falls back when file attachment has no extracted text", ()=>{
|
|
86
|
-
const result = (0, agentInvoker_cjs_namespaceObject.buildUserContent)("", [
|
|
87
|
-
{
|
|
88
|
-
kind: "file",
|
|
89
|
-
dataUrl: "",
|
|
90
|
-
name: "scan.pdf",
|
|
91
|
-
mimeType: "application/pdf",
|
|
92
|
-
textContent: " "
|
|
93
|
-
}
|
|
94
|
-
]);
|
|
95
|
-
(0, external_vitest_namespaceObject.expect)(Array.isArray(result)).toBe(true);
|
|
96
|
-
(0, external_vitest_namespaceObject.expect)(result).toEqual([
|
|
97
|
-
{
|
|
98
|
-
type: "text",
|
|
99
|
-
text: "[Attached file: scan.pdf (application/pdf)]\n[No extractable text content provided.]"
|
|
100
|
-
}
|
|
101
|
-
]);
|
|
102
|
-
});
|
|
103
|
-
(0, external_vitest_namespaceObject.it)("uses responses input_file blocks for pdfs when responses api is enabled", ()=>{
|
|
104
|
-
const result = (0, agentInvoker_cjs_namespaceObject.buildUserContent)("Summarize this", [
|
|
105
|
-
{
|
|
106
|
-
kind: "file",
|
|
107
|
-
dataUrl: "data:application/pdf;base64,JVBERi0xLjQK",
|
|
108
|
-
name: "report.pdf",
|
|
109
|
-
mimeType: "application/pdf",
|
|
110
|
-
textContent: "fallback text"
|
|
111
|
-
}
|
|
112
|
-
], {
|
|
113
|
-
profile: {
|
|
114
|
-
pdfInputs: true
|
|
115
|
-
},
|
|
116
|
-
useResponsesApi: true
|
|
117
|
-
});
|
|
118
|
-
(0, external_vitest_namespaceObject.expect)(Array.isArray(result)).toBe(true);
|
|
119
|
-
(0, external_vitest_namespaceObject.expect)(result).toEqual([
|
|
120
|
-
{
|
|
121
|
-
type: "text",
|
|
122
|
-
text: "Summarize this"
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
type: "input_file",
|
|
126
|
-
file_data: "data:application/pdf;base64,JVBERi0xLjQK",
|
|
127
|
-
filename: "report.pdf"
|
|
128
|
-
}
|
|
129
|
-
]);
|
|
130
|
-
});
|
|
131
|
-
(0, external_vitest_namespaceObject.it)("uses legacy file blocks for pdfs when responses api is not enabled", ()=>{
|
|
132
|
-
const result = (0, agentInvoker_cjs_namespaceObject.buildUserContent)("Summarize this", [
|
|
133
|
-
{
|
|
134
|
-
kind: "file",
|
|
135
|
-
dataUrl: "data:application/pdf;base64,JVBERi0xLjQK",
|
|
136
|
-
name: "report.pdf",
|
|
137
|
-
mimeType: "application/pdf",
|
|
138
|
-
textContent: "fallback text"
|
|
139
|
-
}
|
|
140
|
-
], {
|
|
141
|
-
profile: {
|
|
142
|
-
pdfInputs: true
|
|
143
|
-
}
|
|
144
|
-
});
|
|
145
|
-
(0, external_vitest_namespaceObject.expect)(Array.isArray(result)).toBe(true);
|
|
146
|
-
(0, external_vitest_namespaceObject.expect)(result).toEqual([
|
|
147
|
-
{
|
|
148
|
-
type: "text",
|
|
149
|
-
text: "Summarize this"
|
|
150
|
-
},
|
|
151
|
-
{
|
|
152
|
-
type: "file",
|
|
153
|
-
source_type: "base64",
|
|
154
|
-
mime_type: "application/pdf",
|
|
155
|
-
data: "JVBERi0xLjQK",
|
|
156
|
-
metadata: {
|
|
157
|
-
filename: "report.pdf",
|
|
158
|
-
name: "report.pdf",
|
|
159
|
-
title: "report.pdf"
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
]);
|
|
163
|
-
});
|
|
164
|
-
(0, external_vitest_namespaceObject.it)("falls back to extracted text when native pdf data is missing", ()=>{
|
|
165
|
-
const result = (0, agentInvoker_cjs_namespaceObject.buildUserContent)("", [
|
|
166
|
-
{
|
|
167
|
-
kind: "file",
|
|
168
|
-
dataUrl: "",
|
|
169
|
-
name: "report.pdf",
|
|
170
|
-
mimeType: "application/pdf",
|
|
171
|
-
textContent: "Parsed fallback content."
|
|
172
|
-
}
|
|
173
|
-
], {
|
|
174
|
-
profile: {
|
|
175
|
-
pdfInputs: true
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
(0, external_vitest_namespaceObject.expect)(Array.isArray(result)).toBe(true);
|
|
179
|
-
(0, external_vitest_namespaceObject.expect)(result).toEqual([
|
|
180
|
-
{
|
|
181
|
-
type: "text",
|
|
182
|
-
text: "[Attached file: report.pdf (application/pdf)]\nParsed fallback content."
|
|
183
|
-
}
|
|
184
|
-
]);
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
|
|
188
|
-
Object.defineProperty(exports, '__esModule', {
|
|
189
|
-
value: true
|
|
190
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { buildUserContent } from "../cli/core/agentInvoker.js";
|
|
3
|
-
describe("buildUserContent", ()=>{
|
|
4
|
-
it("returns text when no attachments are provided", ()=>{
|
|
5
|
-
expect(buildUserContent("Hello", void 0)).toBe("Hello");
|
|
6
|
-
});
|
|
7
|
-
it("builds mixed text and image parts", ()=>{
|
|
8
|
-
const result = buildUserContent("Chart please", [
|
|
9
|
-
{
|
|
10
|
-
dataUrl: "data:image/png;base64,abc"
|
|
11
|
-
}
|
|
12
|
-
]);
|
|
13
|
-
expect(Array.isArray(result)).toBe(true);
|
|
14
|
-
expect(result).toEqual([
|
|
15
|
-
{
|
|
16
|
-
type: "text",
|
|
17
|
-
text: "Chart please"
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
type: "image_url",
|
|
21
|
-
image_url: {
|
|
22
|
-
url: "data:image/png;base64,abc"
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
]);
|
|
26
|
-
});
|
|
27
|
-
it("builds image-only parts when text is empty", ()=>{
|
|
28
|
-
const result = buildUserContent("", [
|
|
29
|
-
{
|
|
30
|
-
dataUrl: "data:image/png;base64,xyz"
|
|
31
|
-
}
|
|
32
|
-
]);
|
|
33
|
-
expect(Array.isArray(result)).toBe(true);
|
|
34
|
-
expect(result).toEqual([
|
|
35
|
-
{
|
|
36
|
-
type: "image_url",
|
|
37
|
-
image_url: {
|
|
38
|
-
url: "data:image/png;base64,xyz"
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
]);
|
|
42
|
-
});
|
|
43
|
-
it("builds audio parts when audio attachments are provided", ()=>{
|
|
44
|
-
const result = buildUserContent("", [
|
|
45
|
-
{
|
|
46
|
-
kind: "audio",
|
|
47
|
-
dataUrl: "data:audio/wav;base64,abc",
|
|
48
|
-
mimeType: "audio/wav"
|
|
49
|
-
}
|
|
50
|
-
]);
|
|
51
|
-
expect(Array.isArray(result)).toBe(true);
|
|
52
|
-
expect(result).toEqual([
|
|
53
|
-
{
|
|
54
|
-
type: "audio",
|
|
55
|
-
source_type: "base64",
|
|
56
|
-
data: "abc",
|
|
57
|
-
mime_type: "audio/wav"
|
|
58
|
-
}
|
|
59
|
-
]);
|
|
60
|
-
});
|
|
61
|
-
it("builds text parts for extracted file attachments", ()=>{
|
|
62
|
-
const result = buildUserContent("Review this", [
|
|
63
|
-
{
|
|
64
|
-
kind: "file",
|
|
65
|
-
dataUrl: "",
|
|
66
|
-
name: "notes.md",
|
|
67
|
-
mimeType: "text/markdown",
|
|
68
|
-
textContent: "# Notes\n- keep media uploads working"
|
|
69
|
-
}
|
|
70
|
-
]);
|
|
71
|
-
expect(Array.isArray(result)).toBe(true);
|
|
72
|
-
expect(result).toEqual([
|
|
73
|
-
{
|
|
74
|
-
type: "text",
|
|
75
|
-
text: "Review this"
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
type: "text",
|
|
79
|
-
text: "[Attached file: notes.md (text/markdown)]\n# Notes\n- keep media uploads working"
|
|
80
|
-
}
|
|
81
|
-
]);
|
|
82
|
-
});
|
|
83
|
-
it("falls back when file attachment has no extracted text", ()=>{
|
|
84
|
-
const result = buildUserContent("", [
|
|
85
|
-
{
|
|
86
|
-
kind: "file",
|
|
87
|
-
dataUrl: "",
|
|
88
|
-
name: "scan.pdf",
|
|
89
|
-
mimeType: "application/pdf",
|
|
90
|
-
textContent: " "
|
|
91
|
-
}
|
|
92
|
-
]);
|
|
93
|
-
expect(Array.isArray(result)).toBe(true);
|
|
94
|
-
expect(result).toEqual([
|
|
95
|
-
{
|
|
96
|
-
type: "text",
|
|
97
|
-
text: "[Attached file: scan.pdf (application/pdf)]\n[No extractable text content provided.]"
|
|
98
|
-
}
|
|
99
|
-
]);
|
|
100
|
-
});
|
|
101
|
-
it("uses responses input_file blocks for pdfs when responses api is enabled", ()=>{
|
|
102
|
-
const result = buildUserContent("Summarize this", [
|
|
103
|
-
{
|
|
104
|
-
kind: "file",
|
|
105
|
-
dataUrl: "data:application/pdf;base64,JVBERi0xLjQK",
|
|
106
|
-
name: "report.pdf",
|
|
107
|
-
mimeType: "application/pdf",
|
|
108
|
-
textContent: "fallback text"
|
|
109
|
-
}
|
|
110
|
-
], {
|
|
111
|
-
profile: {
|
|
112
|
-
pdfInputs: true
|
|
113
|
-
},
|
|
114
|
-
useResponsesApi: true
|
|
115
|
-
});
|
|
116
|
-
expect(Array.isArray(result)).toBe(true);
|
|
117
|
-
expect(result).toEqual([
|
|
118
|
-
{
|
|
119
|
-
type: "text",
|
|
120
|
-
text: "Summarize this"
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
type: "input_file",
|
|
124
|
-
file_data: "data:application/pdf;base64,JVBERi0xLjQK",
|
|
125
|
-
filename: "report.pdf"
|
|
126
|
-
}
|
|
127
|
-
]);
|
|
128
|
-
});
|
|
129
|
-
it("uses legacy file blocks for pdfs when responses api is not enabled", ()=>{
|
|
130
|
-
const result = buildUserContent("Summarize this", [
|
|
131
|
-
{
|
|
132
|
-
kind: "file",
|
|
133
|
-
dataUrl: "data:application/pdf;base64,JVBERi0xLjQK",
|
|
134
|
-
name: "report.pdf",
|
|
135
|
-
mimeType: "application/pdf",
|
|
136
|
-
textContent: "fallback text"
|
|
137
|
-
}
|
|
138
|
-
], {
|
|
139
|
-
profile: {
|
|
140
|
-
pdfInputs: true
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
expect(Array.isArray(result)).toBe(true);
|
|
144
|
-
expect(result).toEqual([
|
|
145
|
-
{
|
|
146
|
-
type: "text",
|
|
147
|
-
text: "Summarize this"
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
type: "file",
|
|
151
|
-
source_type: "base64",
|
|
152
|
-
mime_type: "application/pdf",
|
|
153
|
-
data: "JVBERi0xLjQK",
|
|
154
|
-
metadata: {
|
|
155
|
-
filename: "report.pdf",
|
|
156
|
-
name: "report.pdf",
|
|
157
|
-
title: "report.pdf"
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
]);
|
|
161
|
-
});
|
|
162
|
-
it("falls back to extracted text when native pdf data is missing", ()=>{
|
|
163
|
-
const result = buildUserContent("", [
|
|
164
|
-
{
|
|
165
|
-
kind: "file",
|
|
166
|
-
dataUrl: "",
|
|
167
|
-
name: "report.pdf",
|
|
168
|
-
mimeType: "application/pdf",
|
|
169
|
-
textContent: "Parsed fallback content."
|
|
170
|
-
}
|
|
171
|
-
], {
|
|
172
|
-
profile: {
|
|
173
|
-
pdfInputs: true
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
expect(Array.isArray(result)).toBe(true);
|
|
177
|
-
expect(result).toEqual([
|
|
178
|
-
{
|
|
179
|
-
type: "text",
|
|
180
|
-
text: "[Attached file: report.pdf (application/pdf)]\nParsed fallback content."
|
|
181
|
-
}
|
|
182
|
-
]);
|
|
183
|
-
});
|
|
184
|
-
});
|