@amodalai/runtime 0.1.26 → 0.2.0
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/src/__fixtures__/README.md +84 -0
- package/dist/src/__fixtures__/smoke-agent/amodal.json +11 -0
- package/dist/src/__fixtures__/smoke-agent/automations/test-auto.md +5 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-api/access.json +11 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-api/spec.json +4 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-api/surface.md +9 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/access.json +3 -0
- package/dist/src/__fixtures__/smoke-agent/connections/mock-mcp/spec.json +8 -0
- package/dist/src/__fixtures__/smoke-agent/evals/basic-eval.md +12 -0
- package/dist/src/__fixtures__/smoke-agent/knowledge/test-knowledge.md +3 -0
- package/dist/src/__fixtures__/smoke-agent/skills/test-skill/SKILL.md +11 -0
- package/dist/src/__fixtures__/smoke-agent/stores/test-items.json +11 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.d.ts +18 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js +22 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/handler.js.map +1 -0
- package/dist/src/__fixtures__/smoke-agent/tools/echo_tool/tool.json +17 -0
- package/dist/src/__fixtures__/smoke.test.js +718 -0
- package/dist/src/__fixtures__/smoke.test.js.map +1 -0
- package/dist/src/__tests__/test-providers.d.ts +40 -0
- package/dist/src/__tests__/test-providers.js +61 -0
- package/dist/src/__tests__/test-providers.js.map +1 -0
- package/dist/src/agent/local-server.d.ts +3 -3
- package/dist/src/agent/local-server.js +213 -122
- package/dist/src/agent/local-server.js.map +1 -1
- package/dist/src/agent/loop-types.d.ts +175 -0
- package/dist/src/agent/loop-types.js +20 -0
- package/dist/src/agent/loop-types.js.map +1 -0
- package/dist/src/agent/loop.d.ts +31 -0
- package/dist/src/agent/loop.js +139 -0
- package/dist/src/agent/loop.js.map +1 -0
- package/dist/src/agent/loop.test.js +1030 -0
- package/dist/src/agent/loop.test.js.map +1 -0
- package/dist/src/agent/mcp-config.d.ts +28 -0
- package/dist/src/agent/mcp-config.js +57 -0
- package/dist/src/agent/mcp-config.js.map +1 -0
- package/dist/src/agent/page-builder.js +6 -1
- package/dist/src/agent/page-builder.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.d.ts +24 -8
- package/dist/src/agent/proactive/proactive-runner.js +30 -32
- package/dist/src/agent/proactive/proactive-runner.js.map +1 -1
- package/dist/src/agent/proactive/proactive-runner.test.d.ts +1 -1
- package/dist/src/agent/proactive/proactive-runner.test.js +75 -87
- package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -1
- package/dist/src/agent/routes/admin-chat.d.ts +15 -3
- package/dist/src/agent/routes/admin-chat.js +63 -18
- package/dist/src/agent/routes/admin-chat.js.map +1 -1
- package/dist/src/agent/routes/automations.js +5 -6
- package/dist/src/agent/routes/automations.js.map +1 -1
- package/dist/src/agent/routes/evals.d.ts +3 -2
- package/dist/src/agent/routes/evals.js +25 -12
- package/dist/src/agent/routes/evals.js.map +1 -1
- package/dist/src/agent/routes/files.js +7 -9
- package/dist/src/agent/routes/files.js.map +1 -1
- package/dist/src/agent/routes/inspect.d.ts +6 -2
- package/dist/src/agent/routes/inspect.js +31 -17
- package/dist/src/agent/routes/inspect.js.map +1 -1
- package/dist/src/agent/routes/inspect.test.js +18 -42
- package/dist/src/agent/routes/inspect.test.js.map +1 -1
- package/dist/src/agent/routes/stores.js +9 -12
- package/dist/src/agent/routes/stores.js.map +1 -1
- package/dist/src/agent/routes/task.d.ts +15 -3
- package/dist/src/agent/routes/task.js +16 -7
- package/dist/src/agent/routes/task.js.map +1 -1
- package/dist/src/agent/routes/task.test.d.ts +1 -1
- package/dist/src/agent/routes/task.test.js +70 -53
- package/dist/src/agent/routes/task.test.js.map +1 -1
- package/dist/src/agent/routes/webhooks.js +12 -3
- package/dist/src/agent/routes/webhooks.js.map +1 -1
- package/dist/src/agent/session-store.d.ts +11 -2
- package/dist/src/agent/session-store.js +1 -1
- package/dist/src/agent/session-store.js.map +1 -1
- package/dist/src/agent/snapshot-server.d.ts +2 -22
- package/dist/src/agent/snapshot-server.js +50 -27
- package/dist/src/agent/snapshot-server.js.map +1 -1
- package/dist/src/agent/states/compacting.d.ts +14 -0
- package/dist/src/agent/states/compacting.js +258 -0
- package/dist/src/agent/states/compacting.js.map +1 -0
- package/dist/src/agent/states/confirming.d.ts +10 -0
- package/dist/src/agent/states/confirming.js +76 -0
- package/dist/src/agent/states/confirming.js.map +1 -0
- package/dist/src/agent/states/dispatching.d.ts +18 -0
- package/dist/src/agent/states/dispatching.js +241 -0
- package/dist/src/agent/states/dispatching.js.map +1 -0
- package/dist/src/agent/states/executing.d.ts +21 -0
- package/dist/src/agent/states/executing.js +308 -0
- package/dist/src/agent/states/executing.js.map +1 -0
- package/dist/src/agent/states/streaming.d.ts +10 -0
- package/dist/src/agent/states/streaming.js +155 -0
- package/dist/src/agent/states/streaming.js.map +1 -0
- package/dist/src/agent/states/thinking.d.ts +13 -0
- package/dist/src/agent/states/thinking.js +233 -0
- package/dist/src/agent/states/thinking.js.map +1 -0
- package/dist/src/agent/token-estimate.d.ts +17 -0
- package/dist/src/agent/token-estimate.js +13 -0
- package/dist/src/agent/token-estimate.js.map +1 -0
- package/dist/src/agent/tool-executor-local.js +9 -18
- package/dist/src/agent/tool-executor-local.js.map +1 -1
- package/dist/src/agent/tool-executor-local.test.js +3 -5
- package/dist/src/agent/tool-executor-local.test.js.map +1 -1
- package/dist/src/api/create-agent.d.ts +15 -0
- package/dist/src/api/create-agent.js +137 -0
- package/dist/src/api/create-agent.js.map +1 -0
- package/dist/src/api/types.d.ts +68 -0
- package/dist/src/api/types.js +7 -0
- package/dist/src/api/types.js.map +1 -0
- package/dist/src/context/compiler.d.ts +13 -0
- package/dist/src/context/compiler.js +358 -0
- package/dist/src/context/compiler.js.map +1 -0
- package/dist/src/context/compiler.test.js +532 -0
- package/dist/src/context/compiler.test.js.map +1 -0
- package/dist/src/context/types.d.ts +110 -0
- package/dist/src/context/types.js +7 -0
- package/dist/src/context/types.js.map +1 -0
- package/dist/src/index.d.ts +33 -6
- package/dist/src/index.js +35 -21
- package/dist/src/index.js.map +1 -1
- package/dist/src/providers/create-provider.d.ts +23 -0
- package/dist/src/providers/create-provider.js +185 -0
- package/dist/src/providers/create-provider.js.map +1 -0
- package/dist/src/{agent/stores-e2e.test.d.ts → providers/create-provider.test.d.ts} +1 -1
- package/dist/src/providers/create-provider.test.js +95 -0
- package/dist/src/providers/create-provider.test.js.map +1 -0
- package/dist/src/providers/failover.d.ts +38 -0
- package/dist/src/providers/failover.js +147 -0
- package/dist/src/providers/failover.js.map +1 -0
- package/dist/src/providers/failover.test.d.ts +6 -0
- package/dist/src/providers/failover.test.js +169 -0
- package/dist/src/providers/failover.test.js.map +1 -0
- package/dist/src/providers/types.d.ts +110 -0
- package/dist/src/providers/types.js +7 -0
- package/dist/src/providers/types.js.map +1 -0
- package/dist/src/routes/ai-stream.d.ts +13 -10
- package/dist/src/routes/ai-stream.js +76 -41
- package/dist/src/routes/ai-stream.js.map +1 -1
- package/dist/src/routes/chat-new.test.d.ts +6 -0
- package/dist/src/routes/chat-new.test.js +107 -0
- package/dist/src/routes/chat-new.test.js.map +1 -0
- package/dist/src/routes/chat-stream-new.test.d.ts +6 -0
- package/dist/src/routes/chat-stream-new.test.js +135 -0
- package/dist/src/routes/chat-stream-new.test.js.map +1 -0
- package/dist/src/routes/chat-stream.d.ts +14 -4
- package/dist/src/routes/chat-stream.js +47 -29
- package/dist/src/routes/chat-stream.js.map +1 -1
- package/dist/src/routes/chat.d.ts +13 -4
- package/dist/src/routes/chat.js +60 -23
- package/dist/src/routes/chat.js.map +1 -1
- package/dist/src/routes/health.d.ts +3 -2
- package/dist/src/routes/health.js.map +1 -1
- package/dist/src/routes/route-helpers.d.ts +50 -0
- package/dist/src/routes/route-helpers.js +80 -0
- package/dist/src/routes/route-helpers.js.map +1 -0
- package/dist/src/routes/session-resolver.d.ts +72 -0
- package/dist/src/routes/session-resolver.js +123 -0
- package/dist/src/routes/session-resolver.js.map +1 -0
- package/dist/src/routes/session-resolver.test.d.ts +6 -0
- package/dist/src/routes/session-resolver.test.js +206 -0
- package/dist/src/routes/session-resolver.test.js.map +1 -0
- package/dist/src/routes/webhooks.d.ts +3 -1
- package/dist/src/routes/webhooks.js +12 -4
- package/dist/src/routes/webhooks.js.map +1 -1
- package/dist/src/security/permission-checker.d.ts +80 -0
- package/dist/src/security/permission-checker.js +75 -0
- package/dist/src/security/permission-checker.js.map +1 -0
- package/dist/src/security/permission-checker.test.d.ts +6 -0
- package/dist/src/security/permission-checker.test.js +208 -0
- package/dist/src/security/permission-checker.test.js.map +1 -0
- package/dist/src/server.d.ts +12 -11
- package/dist/src/server.js +44 -46
- package/dist/src/server.js.map +1 -1
- package/dist/src/server.test.d.ts +1 -1
- package/dist/src/server.test.js +6 -144
- package/dist/src/server.test.js.map +1 -1
- package/dist/src/session/manager.d.ts +98 -0
- package/dist/src/session/manager.js +364 -0
- package/dist/src/session/manager.js.map +1 -0
- package/dist/src/session/manager.test.d.ts +6 -0
- package/dist/src/session/manager.test.js +315 -0
- package/dist/src/session/manager.test.js.map +1 -0
- package/dist/src/session/session-builder.d.ts +71 -0
- package/dist/src/session/session-builder.js +364 -0
- package/dist/src/session/session-builder.js.map +1 -0
- package/dist/src/session/session-builder.test.d.ts +6 -0
- package/dist/src/session/session-builder.test.js +352 -0
- package/dist/src/session/session-builder.test.js.map +1 -0
- package/dist/src/session/store.d.ts +57 -0
- package/dist/src/session/store.js +167 -0
- package/dist/src/session/store.js.map +1 -0
- package/dist/src/session/store.test.d.ts +6 -0
- package/dist/src/session/store.test.js +145 -0
- package/dist/src/session/store.test.js.map +1 -0
- package/dist/src/session/stream-hooks.d.ts +39 -0
- package/dist/src/session/stream-hooks.js +7 -0
- package/dist/src/session/stream-hooks.js.map +1 -0
- package/dist/src/session/tool-context-factory.d.ts +60 -0
- package/dist/src/session/tool-context-factory.js +190 -0
- package/dist/src/session/tool-context-factory.js.map +1 -0
- package/dist/src/session/tool-context-factory.test.d.ts +6 -0
- package/dist/src/session/tool-context-factory.test.js +287 -0
- package/dist/src/session/tool-context-factory.test.js.map +1 -0
- package/dist/src/session/types.d.ts +188 -0
- package/dist/src/session/types.js +7 -0
- package/dist/src/session/types.js.map +1 -0
- package/dist/src/stores/drizzle-store-backend.d.ts +49 -0
- package/dist/src/stores/drizzle-store-backend.js +306 -0
- package/dist/src/stores/drizzle-store-backend.js.map +1 -0
- package/dist/src/stores/drizzle-store-backend.test.d.ts +6 -0
- package/dist/src/stores/drizzle-store-backend.test.js +215 -0
- package/dist/src/stores/drizzle-store-backend.test.js.map +1 -0
- package/dist/src/stores/index.d.ts +4 -0
- package/dist/src/stores/index.js +2 -0
- package/dist/src/stores/index.js.map +1 -1
- package/dist/src/stores/pglite-store-backend.d.ts +16 -19
- package/dist/src/stores/pglite-store-backend.js +85 -239
- package/dist/src/stores/pglite-store-backend.js.map +1 -1
- package/dist/src/stores/postgres-store-backend.d.ts +30 -0
- package/dist/src/stores/postgres-store-backend.js +100 -0
- package/dist/src/stores/postgres-store-backend.js.map +1 -0
- package/dist/src/stores/schema.d.ts +491 -0
- package/dist/src/stores/schema.js +57 -0
- package/dist/src/stores/schema.js.map +1 -0
- package/dist/src/tools/admin-file-tools.d.ts +13 -0
- package/dist/src/tools/admin-file-tools.js +200 -0
- package/dist/src/tools/admin-file-tools.js.map +1 -0
- package/dist/src/tools/admin-file-tools.test.d.ts +6 -0
- package/dist/src/tools/admin-file-tools.test.js +152 -0
- package/dist/src/tools/admin-file-tools.test.js.map +1 -0
- package/dist/src/tools/custom-tool-adapter.d.ts +41 -0
- package/dist/src/tools/custom-tool-adapter.js +190 -0
- package/dist/src/tools/custom-tool-adapter.js.map +1 -0
- package/dist/src/tools/custom-tool-adapter.test.d.ts +6 -0
- package/dist/src/tools/custom-tool-adapter.test.js +244 -0
- package/dist/src/tools/custom-tool-adapter.test.js.map +1 -0
- package/dist/src/tools/dispatch-tool.d.ts +52 -0
- package/dist/src/tools/dispatch-tool.js +71 -0
- package/dist/src/tools/dispatch-tool.js.map +1 -0
- package/dist/src/tools/dispatch-tool.test.d.ts +6 -0
- package/dist/src/tools/dispatch-tool.test.js +75 -0
- package/dist/src/tools/dispatch-tool.test.js.map +1 -0
- package/dist/src/tools/mcp-tool-adapter.d.ts +18 -0
- package/dist/src/tools/mcp-tool-adapter.js +135 -0
- package/dist/src/tools/mcp-tool-adapter.js.map +1 -0
- package/dist/src/tools/mcp-tool-adapter.test.d.ts +6 -0
- package/dist/src/tools/mcp-tool-adapter.test.js +227 -0
- package/dist/src/tools/mcp-tool-adapter.test.js.map +1 -0
- package/dist/src/tools/registry.d.ts +25 -0
- package/dist/src/tools/registry.js +72 -0
- package/dist/src/tools/registry.js.map +1 -0
- package/dist/src/tools/registry.test.d.ts +6 -0
- package/dist/src/tools/registry.test.js +121 -0
- package/dist/src/tools/registry.test.js.map +1 -0
- package/dist/src/tools/request-tool.d.ts +42 -0
- package/dist/src/tools/request-tool.js +190 -0
- package/dist/src/tools/request-tool.js.map +1 -0
- package/dist/src/tools/request-tool.test.d.ts +6 -0
- package/dist/src/tools/request-tool.test.js +254 -0
- package/dist/src/tools/request-tool.test.js.map +1 -0
- package/dist/src/tools/store-tools.d.ts +29 -0
- package/dist/src/tools/store-tools.js +224 -0
- package/dist/src/tools/store-tools.js.map +1 -0
- package/dist/src/tools/store-tools.test.d.ts +6 -0
- package/dist/src/tools/store-tools.test.js +216 -0
- package/dist/src/tools/store-tools.test.js.map +1 -0
- package/dist/src/tools/types.d.ts +111 -0
- package/dist/src/tools/types.js +7 -0
- package/dist/src/tools/types.js.map +1 -0
- package/dist/src/types.d.ts +20 -12
- package/dist/src/types.js +3 -2
- package/dist/src/types.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -4
- package/dist/src/__tests__/sse-contract.test.js +0 -464
- package/dist/src/__tests__/sse-contract.test.js.map +0 -1
- package/dist/src/__tests__/tools.test.js +0 -583
- package/dist/src/__tests__/tools.test.js.map +0 -1
- package/dist/src/agent/agent-runner.d.ts +0 -33
- package/dist/src/agent/agent-runner.js +0 -1040
- package/dist/src/agent/agent-runner.js.map +0 -1
- package/dist/src/agent/custom-tools-e2e.test.d.ts +0 -6
- package/dist/src/agent/custom-tools-e2e.test.js +0 -566
- package/dist/src/agent/custom-tools-e2e.test.js.map +0 -1
- package/dist/src/agent/request-helper.d.ts +0 -16
- package/dist/src/agent/request-helper.js +0 -96
- package/dist/src/agent/request-helper.js.map +0 -1
- package/dist/src/agent/stores-e2e.test.js +0 -433
- package/dist/src/agent/stores-e2e.test.js.map +0 -1
- package/dist/src/agent/tool-context-builder.d.ts +0 -11
- package/dist/src/agent/tool-context-builder.js +0 -102
- package/dist/src/agent/tool-context-builder.js.map +0 -1
- package/dist/src/agent/tool-context-builder.test.d.ts +0 -6
- package/dist/src/agent/tool-context-builder.test.js +0 -152
- package/dist/src/agent/tool-context-builder.test.js.map +0 -1
- package/dist/src/agent/write-repo-file.test.js +0 -270
- package/dist/src/agent/write-repo-file.test.js.map +0 -1
- package/dist/src/cron/heartbeat-runner.d.ts +0 -21
- package/dist/src/cron/heartbeat-runner.js +0 -79
- package/dist/src/cron/heartbeat-runner.js.map +0 -1
- package/dist/src/cron/heartbeat-runner.test.d.ts +0 -6
- package/dist/src/cron/heartbeat-runner.test.js +0 -120
- package/dist/src/cron/heartbeat-runner.test.js.map +0 -1
- package/dist/src/cron/heartbeat-scheduler.d.ts +0 -26
- package/dist/src/cron/heartbeat-scheduler.js +0 -55
- package/dist/src/cron/heartbeat-scheduler.js.map +0 -1
- package/dist/src/cron/heartbeat-scheduler.test.d.ts +0 -6
- package/dist/src/cron/heartbeat-scheduler.test.js +0 -61
- package/dist/src/cron/heartbeat-scheduler.test.js.map +0 -1
- package/dist/src/routes/ai-stream.test.d.ts +0 -6
- package/dist/src/routes/ai-stream.test.js +0 -586
- package/dist/src/routes/ai-stream.test.js.map +0 -1
- package/dist/src/routes/ask-user-response.d.ts +0 -30
- package/dist/src/routes/ask-user-response.js +0 -61
- package/dist/src/routes/ask-user-response.js.map +0 -1
- package/dist/src/routes/ask-user-response.test.d.ts +0 -6
- package/dist/src/routes/ask-user-response.test.js +0 -88
- package/dist/src/routes/ask-user-response.test.js.map +0 -1
- package/dist/src/routes/chat-stream.test.d.ts +0 -6
- package/dist/src/routes/chat-stream.test.js +0 -155
- package/dist/src/routes/chat-stream.test.js.map +0 -1
- package/dist/src/routes/chat.test.d.ts +0 -6
- package/dist/src/routes/chat.test.js +0 -99
- package/dist/src/routes/chat.test.js.map +0 -1
- package/dist/src/routes/widget-actions.d.ts +0 -49
- package/dist/src/routes/widget-actions.js +0 -78
- package/dist/src/routes/widget-actions.js.map +0 -1
- package/dist/src/session/custom-tool-adapter.d.ts +0 -74
- package/dist/src/session/custom-tool-adapter.js +0 -180
- package/dist/src/session/custom-tool-adapter.js.map +0 -1
- package/dist/src/session/history-converter.d.ts +0 -21
- package/dist/src/session/history-converter.js +0 -59
- package/dist/src/session/history-converter.js.map +0 -1
- package/dist/src/session/history-converter.test.d.ts +0 -6
- package/dist/src/session/history-converter.test.js +0 -130
- package/dist/src/session/history-converter.test.js.map +0 -1
- package/dist/src/session/session-manager.d.ts +0 -219
- package/dist/src/session/session-manager.js +0 -915
- package/dist/src/session/session-manager.js.map +0 -1
- package/dist/src/session/session-manager.test.d.ts +0 -6
- package/dist/src/session/session-manager.test.js +0 -455
- package/dist/src/session/session-manager.test.js.map +0 -1
- package/dist/src/session/session-runner.d.ts +0 -45
- package/dist/src/session/session-runner.js +0 -719
- package/dist/src/session/session-runner.js.map +0 -1
- package/dist/src/session/session-runner.test.d.ts +0 -6
- package/dist/src/session/session-runner.test.js +0 -834
- package/dist/src/session/session-runner.test.js.map +0 -1
- /package/dist/src/{__tests__/sse-contract.test.d.ts → __fixtures__/smoke.test.d.ts} +0 -0
- /package/dist/src/{__tests__/tools.test.d.ts → agent/loop.test.d.ts} +0 -0
- /package/dist/src/{agent/write-repo-file.test.d.ts → context/compiler.test.d.ts} +0 -0
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Amodal Labs, Inc.
|
|
4
|
+
* SPDX-License-Identifier: MIT
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Context Compiler Tests.
|
|
8
|
+
*
|
|
9
|
+
* Covers:
|
|
10
|
+
* 1. Basic compilation — identity, core behavior, error handling
|
|
11
|
+
* 2. Gotcha G9 — system prompt includes ALL context (skills, knowledge, connections)
|
|
12
|
+
* 3. Gotcha G10 — userContext and description both appear in correct places
|
|
13
|
+
* 4. Store schemas — rendered as tables in the prompt
|
|
14
|
+
* 5. Field guidance — generated from connection access configs
|
|
15
|
+
* 6. Scope labels — resolved from row scoping rules
|
|
16
|
+
* 7. Alternative lookups — generated from connection configs
|
|
17
|
+
* 8. basePrompt override — short-circuits compilation
|
|
18
|
+
* 9. Contributions — per-section token estimates
|
|
19
|
+
* 10. Plan mode
|
|
20
|
+
*/
|
|
21
|
+
import { describe, it, expect } from 'vitest';
|
|
22
|
+
import { compileContext } from './compiler.js';
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Fixtures
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
function makeConnection(overrides) {
|
|
27
|
+
return {
|
|
28
|
+
name: 'stripe',
|
|
29
|
+
description: 'Payment processing',
|
|
30
|
+
endpoints: [
|
|
31
|
+
{ method: 'GET', path: '/v1/customers', description: 'List customers' },
|
|
32
|
+
{ method: 'POST', path: '/v1/charges', description: 'Create a charge' },
|
|
33
|
+
],
|
|
34
|
+
entities: '**Customer** — represents a paying customer',
|
|
35
|
+
rules: 'Always scope queries to the current tenant.',
|
|
36
|
+
...overrides,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function makeSkill(overrides) {
|
|
40
|
+
return {
|
|
41
|
+
name: 'revenue-report',
|
|
42
|
+
description: 'Generate a monthly revenue report from Stripe data.',
|
|
43
|
+
trigger: 'When the user asks about revenue or monthly reports',
|
|
44
|
+
body: 'Step 1: Query /v1/charges with date filter.\nStep 2: Aggregate by status.\nStep 3: Present as a table.',
|
|
45
|
+
...overrides,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function makeKnowledge(overrides) {
|
|
49
|
+
return {
|
|
50
|
+
name: 'formatting-rules',
|
|
51
|
+
title: 'Formatting Rules',
|
|
52
|
+
body: 'Always use markdown tables for tabular data. Currency values use USD with 2 decimal places.',
|
|
53
|
+
...overrides,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function makeStore(overrides) {
|
|
57
|
+
return {
|
|
58
|
+
name: 'deals',
|
|
59
|
+
entity: {
|
|
60
|
+
name: 'Deal',
|
|
61
|
+
key: '{company}_{quarter}',
|
|
62
|
+
schema: {
|
|
63
|
+
company: { type: 'string' },
|
|
64
|
+
amount: { type: 'number', min: 0 },
|
|
65
|
+
stage: { type: 'enum', values: ['lead', 'qualified', 'closed'] },
|
|
66
|
+
contacts: { type: 'array', item: { type: 'string' } },
|
|
67
|
+
closedAt: { type: 'datetime', nullable: true },
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
...overrides,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function makeFullInput() {
|
|
74
|
+
return {
|
|
75
|
+
name: 'Sales Agent',
|
|
76
|
+
description: 'A B2B sales intelligence agent for Acme Corp',
|
|
77
|
+
userContext: 'Always use a professional tone. Never share competitor pricing.',
|
|
78
|
+
agentOverride: 'You specialize in enterprise sales pipeline analysis.',
|
|
79
|
+
connections: [makeConnection()],
|
|
80
|
+
skills: [makeSkill()],
|
|
81
|
+
knowledge: [makeKnowledge()],
|
|
82
|
+
stores: [makeStore()],
|
|
83
|
+
userRoles: ['sales_rep'],
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// ---------------------------------------------------------------------------
|
|
87
|
+
// 1. Basic compilation
|
|
88
|
+
// ---------------------------------------------------------------------------
|
|
89
|
+
describe('compileContext', () => {
|
|
90
|
+
it('produces a prompt with identity, core behavior, and error handling', () => {
|
|
91
|
+
const result = compileContext({ name: 'Test Agent' });
|
|
92
|
+
expect(result.source).toBe('compiled');
|
|
93
|
+
expect(result.systemPrompt).toContain('You are Test Agent.');
|
|
94
|
+
expect(result.systemPrompt).toContain('## How you work');
|
|
95
|
+
expect(result.systemPrompt).toContain('## Error handling');
|
|
96
|
+
});
|
|
97
|
+
it('includes description in identity line', () => {
|
|
98
|
+
const result = compileContext({ name: 'Bot', description: 'A helpful assistant' });
|
|
99
|
+
expect(result.systemPrompt).toContain('You are Bot — A helpful assistant.');
|
|
100
|
+
});
|
|
101
|
+
// -------------------------------------------------------------------------
|
|
102
|
+
// 2. Gotcha G9 — ALL context included
|
|
103
|
+
// -------------------------------------------------------------------------
|
|
104
|
+
it('G9: includes connection endpoints, skill bodies, and knowledge bodies', () => {
|
|
105
|
+
const input = makeFullInput();
|
|
106
|
+
const result = compileContext(input);
|
|
107
|
+
const prompt = result.systemPrompt;
|
|
108
|
+
// Connection endpoints
|
|
109
|
+
expect(prompt).toContain('GET /v1/customers');
|
|
110
|
+
expect(prompt).toContain('POST /v1/charges');
|
|
111
|
+
expect(prompt).toContain('Connection: stripe');
|
|
112
|
+
// Skill body (not just description)
|
|
113
|
+
expect(prompt).toContain('Step 1: Query /v1/charges');
|
|
114
|
+
expect(prompt).toContain('revenue-report');
|
|
115
|
+
// Knowledge body (not just title)
|
|
116
|
+
expect(prompt).toContain('Always use markdown tables for tabular data');
|
|
117
|
+
expect(prompt).toContain('Formatting Rules');
|
|
118
|
+
// Store schema
|
|
119
|
+
expect(prompt).toContain('deals');
|
|
120
|
+
expect(prompt).toContain('Deal');
|
|
121
|
+
});
|
|
122
|
+
it('G9: compiled prompt length is substantial with full config', () => {
|
|
123
|
+
const input = makeFullInput();
|
|
124
|
+
const result = compileContext(input);
|
|
125
|
+
// A full config should produce a prompt well over 1K chars
|
|
126
|
+
// (the bug from G9 dropped from 30K to 1.3K)
|
|
127
|
+
expect(result.systemPrompt.length).toBeGreaterThan(2000);
|
|
128
|
+
});
|
|
129
|
+
it('G9: section order matches design doc priority (skills before connections)', () => {
|
|
130
|
+
const input = makeFullInput();
|
|
131
|
+
const result = compileContext(input);
|
|
132
|
+
const prompt = result.systemPrompt;
|
|
133
|
+
const skillsIndex = prompt.indexOf('## Skills');
|
|
134
|
+
const connectionsIndex = prompt.indexOf('## Connected systems');
|
|
135
|
+
const knowledgeIndex = prompt.indexOf('## Knowledge Base');
|
|
136
|
+
const storesIndex = prompt.indexOf('## Data Stores');
|
|
137
|
+
// Skills before connections (skills trimmed first when budget is added)
|
|
138
|
+
expect(skillsIndex).toBeLessThan(connectionsIndex);
|
|
139
|
+
// Knowledge before connections
|
|
140
|
+
expect(knowledgeIndex).toBeLessThan(connectionsIndex);
|
|
141
|
+
// Stores after connections
|
|
142
|
+
expect(storesIndex).toBeGreaterThan(connectionsIndex);
|
|
143
|
+
});
|
|
144
|
+
// -------------------------------------------------------------------------
|
|
145
|
+
// 3. Gotcha G10 — userContext vs description
|
|
146
|
+
// -------------------------------------------------------------------------
|
|
147
|
+
it('G10: userContext and description both appear and are distinct', () => {
|
|
148
|
+
const result = compileContext({
|
|
149
|
+
name: 'Agent',
|
|
150
|
+
description: 'A content marketing agent for Amodal',
|
|
151
|
+
userContext: 'Always use casual tone. Never post without scheduling.',
|
|
152
|
+
});
|
|
153
|
+
const prompt = result.systemPrompt;
|
|
154
|
+
// Description is in the identity line
|
|
155
|
+
expect(prompt).toContain('A content marketing agent for Amodal');
|
|
156
|
+
// userContext is a separate section, not in the identity line
|
|
157
|
+
expect(prompt).toContain('Always use casual tone');
|
|
158
|
+
expect(prompt).toContain('Never post without scheduling');
|
|
159
|
+
// They appear in different locations
|
|
160
|
+
const descriptionIndex = prompt.indexOf('A content marketing agent for Amodal');
|
|
161
|
+
const contextIndex = prompt.indexOf('Always use casual tone');
|
|
162
|
+
expect(descriptionIndex).toBeLessThan(contextIndex);
|
|
163
|
+
});
|
|
164
|
+
it('G10: userContext without description works', () => {
|
|
165
|
+
const result = compileContext({
|
|
166
|
+
name: 'Agent',
|
|
167
|
+
userContext: 'Be concise.',
|
|
168
|
+
});
|
|
169
|
+
expect(result.systemPrompt).toContain('You are Agent.');
|
|
170
|
+
expect(result.systemPrompt).toContain('Be concise.');
|
|
171
|
+
});
|
|
172
|
+
it('G10: description without userContext works', () => {
|
|
173
|
+
const result = compileContext({
|
|
174
|
+
name: 'Agent',
|
|
175
|
+
description: 'A sales agent',
|
|
176
|
+
});
|
|
177
|
+
expect(result.systemPrompt).toContain('You are Agent — A sales agent.');
|
|
178
|
+
expect(result.systemPrompt).not.toContain('undefined');
|
|
179
|
+
});
|
|
180
|
+
// -------------------------------------------------------------------------
|
|
181
|
+
// 4. Connections
|
|
182
|
+
// -------------------------------------------------------------------------
|
|
183
|
+
it('renders connection endpoints, entities, and rules', () => {
|
|
184
|
+
const result = compileContext({
|
|
185
|
+
name: 'Agent',
|
|
186
|
+
connections: [makeConnection()],
|
|
187
|
+
});
|
|
188
|
+
const prompt = result.systemPrompt;
|
|
189
|
+
expect(prompt).toContain('## Connected systems');
|
|
190
|
+
expect(prompt).toContain('### Connection: stripe');
|
|
191
|
+
expect(prompt).toContain('Payment processing');
|
|
192
|
+
expect(prompt).toContain('**Available Endpoints:**');
|
|
193
|
+
expect(prompt).toContain('- GET /v1/customers — List customers');
|
|
194
|
+
expect(prompt).toContain('**Customer** — represents a paying customer');
|
|
195
|
+
expect(prompt).toContain('Always scope queries to the current tenant.');
|
|
196
|
+
expect(prompt).toContain('Use `request` with the connection name');
|
|
197
|
+
});
|
|
198
|
+
it('renders multiple connections', () => {
|
|
199
|
+
const result = compileContext({
|
|
200
|
+
name: 'Agent',
|
|
201
|
+
connections: [
|
|
202
|
+
makeConnection({ name: 'stripe' }),
|
|
203
|
+
makeConnection({ name: 'slack', description: 'Team messaging', endpoints: [{ method: 'POST', path: '/chat.postMessage', description: 'Send message' }] }),
|
|
204
|
+
],
|
|
205
|
+
});
|
|
206
|
+
expect(result.systemPrompt).toContain('Connection: stripe');
|
|
207
|
+
expect(result.systemPrompt).toContain('Connection: slack');
|
|
208
|
+
expect(result.systemPrompt).toContain('POST /chat.postMessage');
|
|
209
|
+
});
|
|
210
|
+
// -------------------------------------------------------------------------
|
|
211
|
+
// 5. Skills
|
|
212
|
+
// -------------------------------------------------------------------------
|
|
213
|
+
it('renders skills with trigger and body', () => {
|
|
214
|
+
const result = compileContext({
|
|
215
|
+
name: 'Agent',
|
|
216
|
+
skills: [makeSkill()],
|
|
217
|
+
});
|
|
218
|
+
const prompt = result.systemPrompt;
|
|
219
|
+
expect(prompt).toContain('## Skills');
|
|
220
|
+
expect(prompt).toContain('### revenue-report');
|
|
221
|
+
expect(prompt).toContain('**When to activate:** When the user asks about revenue');
|
|
222
|
+
expect(prompt).toContain('Generate a monthly revenue report');
|
|
223
|
+
expect(prompt).toContain('Step 1: Query /v1/charges');
|
|
224
|
+
});
|
|
225
|
+
it('renders skill without trigger or body', () => {
|
|
226
|
+
const result = compileContext({
|
|
227
|
+
name: 'Agent',
|
|
228
|
+
skills: [{ name: 'simple', description: 'A simple skill' }],
|
|
229
|
+
});
|
|
230
|
+
expect(result.systemPrompt).toContain('### simple');
|
|
231
|
+
expect(result.systemPrompt).toContain('A simple skill');
|
|
232
|
+
expect(result.systemPrompt).not.toContain('When to activate');
|
|
233
|
+
});
|
|
234
|
+
// -------------------------------------------------------------------------
|
|
235
|
+
// 6. Knowledge
|
|
236
|
+
// -------------------------------------------------------------------------
|
|
237
|
+
it('renders knowledge docs with title and body', () => {
|
|
238
|
+
const result = compileContext({
|
|
239
|
+
name: 'Agent',
|
|
240
|
+
knowledge: [makeKnowledge()],
|
|
241
|
+
});
|
|
242
|
+
expect(result.systemPrompt).toContain('## Knowledge Base');
|
|
243
|
+
expect(result.systemPrompt).toContain('### Formatting Rules');
|
|
244
|
+
expect(result.systemPrompt).toContain('Always use markdown tables');
|
|
245
|
+
});
|
|
246
|
+
it('falls back to name when title is missing', () => {
|
|
247
|
+
const result = compileContext({
|
|
248
|
+
name: 'Agent',
|
|
249
|
+
knowledge: [{ name: 'rules', body: 'Some rules here.' }],
|
|
250
|
+
});
|
|
251
|
+
expect(result.systemPrompt).toContain('### rules');
|
|
252
|
+
expect(result.systemPrompt).toContain('Some rules here.');
|
|
253
|
+
});
|
|
254
|
+
// -------------------------------------------------------------------------
|
|
255
|
+
// 7. Store schemas
|
|
256
|
+
// -------------------------------------------------------------------------
|
|
257
|
+
it('renders store schemas as tables', () => {
|
|
258
|
+
const result = compileContext({
|
|
259
|
+
name: 'Agent',
|
|
260
|
+
stores: [makeStore()],
|
|
261
|
+
});
|
|
262
|
+
const prompt = result.systemPrompt;
|
|
263
|
+
expect(prompt).toContain('## Data Stores');
|
|
264
|
+
expect(prompt).toContain('### deals');
|
|
265
|
+
expect(prompt).toContain('Entity: Deal (key: `{company}_{quarter}`)');
|
|
266
|
+
expect(prompt).toContain('| Field | Type |');
|
|
267
|
+
expect(prompt).toContain('| company | string |');
|
|
268
|
+
expect(prompt).toContain('| amount | number |');
|
|
269
|
+
expect(prompt).toContain('| stage | lead | qualified | closed |');
|
|
270
|
+
expect(prompt).toContain('| contacts | string[] |');
|
|
271
|
+
expect(prompt).toContain('| closedAt | datetime | null |');
|
|
272
|
+
expect(prompt).toContain('query_store');
|
|
273
|
+
});
|
|
274
|
+
it('renders multiple stores', () => {
|
|
275
|
+
const result = compileContext({
|
|
276
|
+
name: 'Agent',
|
|
277
|
+
stores: [
|
|
278
|
+
makeStore(),
|
|
279
|
+
makeStore({
|
|
280
|
+
name: 'contacts',
|
|
281
|
+
entity: { name: 'Contact', key: '{email}', schema: { email: { type: 'string' }, active: { type: 'boolean' } } },
|
|
282
|
+
}),
|
|
283
|
+
],
|
|
284
|
+
});
|
|
285
|
+
expect(result.systemPrompt).toContain('### deals');
|
|
286
|
+
expect(result.systemPrompt).toContain('### contacts');
|
|
287
|
+
expect(result.systemPrompt).toContain('| email | string |');
|
|
288
|
+
});
|
|
289
|
+
it('renders ref fields with store name', () => {
|
|
290
|
+
const result = compileContext({
|
|
291
|
+
name: 'Agent',
|
|
292
|
+
stores: [makeStore({
|
|
293
|
+
name: 'activities',
|
|
294
|
+
entity: {
|
|
295
|
+
name: 'Activity',
|
|
296
|
+
key: '{id}',
|
|
297
|
+
schema: { dealRef: { type: 'ref', store: 'deals' } },
|
|
298
|
+
},
|
|
299
|
+
})],
|
|
300
|
+
});
|
|
301
|
+
expect(result.systemPrompt).toContain('| dealRef | ref → deals |');
|
|
302
|
+
});
|
|
303
|
+
// -------------------------------------------------------------------------
|
|
304
|
+
// 8. Field guidance
|
|
305
|
+
// -------------------------------------------------------------------------
|
|
306
|
+
it('generates field guidance from connection access configs', () => {
|
|
307
|
+
const result = compileContext({
|
|
308
|
+
name: 'Agent',
|
|
309
|
+
connections: [makeConnection({
|
|
310
|
+
fieldRestrictions: [
|
|
311
|
+
{ entity: 'Customer', field: 'tax_id', policy: 'never_retrieve', reason: 'PII' },
|
|
312
|
+
{ entity: 'Customer', field: 'email', policy: 'retrieve_but_redact' },
|
|
313
|
+
{ entity: 'Invoice', field: 'internal_notes', policy: 'role_gated', allowedRoles: ['admin'] },
|
|
314
|
+
],
|
|
315
|
+
})],
|
|
316
|
+
userRoles: ['sales_rep'],
|
|
317
|
+
});
|
|
318
|
+
const prompt = result.systemPrompt;
|
|
319
|
+
expect(prompt).toContain('## Field Access Restrictions');
|
|
320
|
+
expect(prompt).toContain('Do not request: Customer.tax_id (PII)');
|
|
321
|
+
expect(prompt).toContain('Will be redacted: Customer.email');
|
|
322
|
+
expect(prompt).toContain('Do not request: Invoice.internal_notes (requires role: admin)');
|
|
323
|
+
});
|
|
324
|
+
it('allows role-gated fields when user has the role', () => {
|
|
325
|
+
const result = compileContext({
|
|
326
|
+
name: 'Agent',
|
|
327
|
+
connections: [makeConnection({
|
|
328
|
+
fieldRestrictions: [
|
|
329
|
+
{ entity: 'Invoice', field: 'internal_notes', policy: 'role_gated', allowedRoles: ['admin'] },
|
|
330
|
+
],
|
|
331
|
+
})],
|
|
332
|
+
userRoles: ['admin'],
|
|
333
|
+
});
|
|
334
|
+
// Should NOT include "Do not request" for a field the user has access to
|
|
335
|
+
expect(result.systemPrompt).not.toContain('Do not request: Invoice.internal_notes');
|
|
336
|
+
});
|
|
337
|
+
it('omits field guidance section when no restrictions', () => {
|
|
338
|
+
const result = compileContext({
|
|
339
|
+
name: 'Agent',
|
|
340
|
+
connections: [makeConnection({ fieldRestrictions: undefined })],
|
|
341
|
+
});
|
|
342
|
+
expect(result.systemPrompt).not.toContain('Field Access Restrictions');
|
|
343
|
+
});
|
|
344
|
+
// -------------------------------------------------------------------------
|
|
345
|
+
// 9. Scope labels
|
|
346
|
+
// -------------------------------------------------------------------------
|
|
347
|
+
it('resolves scope labels from row scoping rules', () => {
|
|
348
|
+
const result = compileContext({
|
|
349
|
+
name: 'Agent',
|
|
350
|
+
connections: [makeConnection({
|
|
351
|
+
rowScoping: {
|
|
352
|
+
Customer: {
|
|
353
|
+
admin: { type: 'all', label: 'all customers' },
|
|
354
|
+
sales_rep: { type: 'team', label: 'your team\'s customers' },
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
})],
|
|
358
|
+
userRoles: ['sales_rep'],
|
|
359
|
+
});
|
|
360
|
+
expect(result.systemPrompt).toContain('## Data Scope');
|
|
361
|
+
expect(result.systemPrompt).toContain("Customer: your team's customers");
|
|
362
|
+
});
|
|
363
|
+
it('omits scope section when no roles match', () => {
|
|
364
|
+
const result = compileContext({
|
|
365
|
+
name: 'Agent',
|
|
366
|
+
connections: [makeConnection({
|
|
367
|
+
rowScoping: {
|
|
368
|
+
Customer: { admin: { type: 'all', label: 'all customers' } },
|
|
369
|
+
},
|
|
370
|
+
})],
|
|
371
|
+
userRoles: ['viewer'],
|
|
372
|
+
});
|
|
373
|
+
expect(result.systemPrompt).not.toContain('## Data Scope');
|
|
374
|
+
});
|
|
375
|
+
// -------------------------------------------------------------------------
|
|
376
|
+
// 10. Alternative lookups
|
|
377
|
+
// -------------------------------------------------------------------------
|
|
378
|
+
it('generates alternative lookup guidance', () => {
|
|
379
|
+
const result = compileContext({
|
|
380
|
+
name: 'Agent',
|
|
381
|
+
connections: [makeConnection({
|
|
382
|
+
alternativeLookups: [
|
|
383
|
+
{ restrictedField: 'Customer.tax_id', alternativeEndpoint: 'GET /v1/tax/ids', description: 'Tax ID lookup endpoint' },
|
|
384
|
+
],
|
|
385
|
+
})],
|
|
386
|
+
});
|
|
387
|
+
expect(result.systemPrompt).toContain('Instead of Customer.tax_id, use GET /v1/tax/ids — Tax ID lookup endpoint');
|
|
388
|
+
});
|
|
389
|
+
// -------------------------------------------------------------------------
|
|
390
|
+
// 11. basePrompt override
|
|
391
|
+
// -------------------------------------------------------------------------
|
|
392
|
+
it('returns basePrompt directly without compiling', () => {
|
|
393
|
+
const result = compileContext({
|
|
394
|
+
name: 'Agent',
|
|
395
|
+
description: 'Should not appear',
|
|
396
|
+
basePrompt: 'You are a custom agent. Follow these rules.',
|
|
397
|
+
connections: [makeConnection()],
|
|
398
|
+
skills: [makeSkill()],
|
|
399
|
+
});
|
|
400
|
+
expect(result.source).toBe('base_prompt_override');
|
|
401
|
+
expect(result.systemPrompt).toBe('You are a custom agent. Follow these rules.');
|
|
402
|
+
expect(result.systemPrompt).not.toContain('Should not appear');
|
|
403
|
+
expect(result.systemPrompt).not.toContain('stripe');
|
|
404
|
+
});
|
|
405
|
+
// -------------------------------------------------------------------------
|
|
406
|
+
// 12. Contributions
|
|
407
|
+
// -------------------------------------------------------------------------
|
|
408
|
+
it('returns per-section token contributions', () => {
|
|
409
|
+
const input = makeFullInput();
|
|
410
|
+
const result = compileContext(input);
|
|
411
|
+
expect(result.contributions.length).toBeGreaterThan(0);
|
|
412
|
+
const categories = result.contributions.map((c) => c.category);
|
|
413
|
+
expect(categories).toContain('system');
|
|
414
|
+
expect(categories).toContain('connection');
|
|
415
|
+
expect(categories).toContain('skill');
|
|
416
|
+
expect(categories).toContain('knowledge');
|
|
417
|
+
expect(categories).toContain('store');
|
|
418
|
+
// Every contribution has a positive token count
|
|
419
|
+
for (const c of result.contributions) {
|
|
420
|
+
expect(c.tokens).toBeGreaterThan(0);
|
|
421
|
+
expect(c.name).toBeTruthy();
|
|
422
|
+
}
|
|
423
|
+
});
|
|
424
|
+
it('basePrompt override has single contribution', () => {
|
|
425
|
+
const result = compileContext({ name: 'Agent', basePrompt: 'Custom prompt.' });
|
|
426
|
+
expect(result.contributions).toHaveLength(1);
|
|
427
|
+
expect(result.contributions[0].name).toBe('Base prompt override');
|
|
428
|
+
});
|
|
429
|
+
// -------------------------------------------------------------------------
|
|
430
|
+
// 13. Plan mode
|
|
431
|
+
// -------------------------------------------------------------------------
|
|
432
|
+
it('includes plan mode section when active', () => {
|
|
433
|
+
const result = compileContext({ name: 'Agent', planMode: true });
|
|
434
|
+
expect(result.systemPrompt).toContain('## Planning Mode Active');
|
|
435
|
+
expect(result.systemPrompt).toContain('Present your plan to the user');
|
|
436
|
+
});
|
|
437
|
+
it('includes approved plan when provided', () => {
|
|
438
|
+
const result = compileContext({
|
|
439
|
+
name: 'Agent',
|
|
440
|
+
planMode: true,
|
|
441
|
+
approvedPlan: '1. Query Stripe\n2. Update store',
|
|
442
|
+
});
|
|
443
|
+
expect(result.systemPrompt).toContain('## Approved Plan');
|
|
444
|
+
expect(result.systemPrompt).toContain('1. Query Stripe');
|
|
445
|
+
});
|
|
446
|
+
// -------------------------------------------------------------------------
|
|
447
|
+
// 14. Agent override
|
|
448
|
+
// -------------------------------------------------------------------------
|
|
449
|
+
it('includes agentOverride in prompt', () => {
|
|
450
|
+
const result = compileContext({
|
|
451
|
+
name: 'Agent',
|
|
452
|
+
agentOverride: 'You specialize in data analysis.',
|
|
453
|
+
});
|
|
454
|
+
expect(result.systemPrompt).toContain('You specialize in data analysis.');
|
|
455
|
+
});
|
|
456
|
+
// -------------------------------------------------------------------------
|
|
457
|
+
// 15. Empty inputs
|
|
458
|
+
// -------------------------------------------------------------------------
|
|
459
|
+
it('handles empty connections, skills, knowledge, stores gracefully', () => {
|
|
460
|
+
const result = compileContext({
|
|
461
|
+
name: 'Agent',
|
|
462
|
+
connections: [],
|
|
463
|
+
skills: [],
|
|
464
|
+
knowledge: [],
|
|
465
|
+
stores: [],
|
|
466
|
+
});
|
|
467
|
+
expect(result.systemPrompt).not.toContain('## Connected systems');
|
|
468
|
+
expect(result.systemPrompt).not.toContain('## Skills');
|
|
469
|
+
expect(result.systemPrompt).not.toContain('## Knowledge Base');
|
|
470
|
+
expect(result.systemPrompt).not.toContain('## Data Stores');
|
|
471
|
+
});
|
|
472
|
+
it('handles undefined optional fields', () => {
|
|
473
|
+
const result = compileContext({ name: 'Minimal Agent' });
|
|
474
|
+
expect(result.source).toBe('compiled');
|
|
475
|
+
expect(result.systemPrompt).toContain('You are Minimal Agent.');
|
|
476
|
+
expect(result.systemPrompt).not.toContain('undefined');
|
|
477
|
+
expect(result.systemPrompt).not.toContain('null');
|
|
478
|
+
});
|
|
479
|
+
// -------------------------------------------------------------------------
|
|
480
|
+
// 16. Automation context
|
|
481
|
+
// -------------------------------------------------------------------------
|
|
482
|
+
it('includes automation context when provided', () => {
|
|
483
|
+
const result = compileContext({
|
|
484
|
+
name: 'Agent',
|
|
485
|
+
automationContext: 'This is a scheduled daily sync. Write results to the deals store.',
|
|
486
|
+
});
|
|
487
|
+
expect(result.systemPrompt).toContain('## Automation Context');
|
|
488
|
+
expect(result.systemPrompt).toContain('scheduled daily sync');
|
|
489
|
+
});
|
|
490
|
+
it('omits automation context section when not provided', () => {
|
|
491
|
+
const result = compileContext({ name: 'Agent' });
|
|
492
|
+
expect(result.systemPrompt).not.toContain('## Automation Context');
|
|
493
|
+
});
|
|
494
|
+
// -------------------------------------------------------------------------
|
|
495
|
+
// 17. Token budget warning
|
|
496
|
+
// -------------------------------------------------------------------------
|
|
497
|
+
it('emits warning when prompt exceeds maxSystemTokens', () => {
|
|
498
|
+
const result = compileContext({
|
|
499
|
+
name: 'Agent',
|
|
500
|
+
maxSystemTokens: 10, // absurdly low
|
|
501
|
+
});
|
|
502
|
+
expect(result.warnings).toHaveLength(1);
|
|
503
|
+
expect(result.warnings[0]).toContain('exceeds token budget');
|
|
504
|
+
});
|
|
505
|
+
it('no warning when prompt fits within maxSystemTokens', () => {
|
|
506
|
+
const result = compileContext({
|
|
507
|
+
name: 'Agent',
|
|
508
|
+
maxSystemTokens: 100_000,
|
|
509
|
+
});
|
|
510
|
+
expect(result.warnings).toHaveLength(0);
|
|
511
|
+
});
|
|
512
|
+
it('no warnings when maxSystemTokens is not set', () => {
|
|
513
|
+
const result = compileContext(makeFullInput());
|
|
514
|
+
expect(result.warnings).toHaveLength(0);
|
|
515
|
+
});
|
|
516
|
+
// -------------------------------------------------------------------------
|
|
517
|
+
// 18. Store contributions use accurate per-store estimates
|
|
518
|
+
// -------------------------------------------------------------------------
|
|
519
|
+
it('store contributions do not include section header overhead', () => {
|
|
520
|
+
const result = compileContext({
|
|
521
|
+
name: 'Agent',
|
|
522
|
+
stores: [makeStore()],
|
|
523
|
+
});
|
|
524
|
+
const storeContribution = result.contributions.find((c) => c.name === 'deals');
|
|
525
|
+
expect(storeContribution).toBeDefined();
|
|
526
|
+
// The contribution should not include "## Data Stores" header
|
|
527
|
+
// A single store with 5 fields should be ~200-400 chars (~50-100 tokens)
|
|
528
|
+
expect(storeContribution.tokens).toBeLessThan(150);
|
|
529
|
+
expect(storeContribution.tokens).toBeGreaterThan(20);
|
|
530
|
+
});
|
|
531
|
+
});
|
|
532
|
+
//# sourceMappingURL=compiler.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.test.js","sourceRoot":"","sources":["../../../src/context/compiler.test.ts"],"names":[],"mappings":"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"}
|