@amodalai/runtime 0.1.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.
Files changed (277) hide show
  1. package/LICENSE +21 -0
  2. package/dist/.last_build +0 -0
  3. package/dist/src/agent/agent-runner.d.ts +13 -0
  4. package/dist/src/agent/agent-runner.js +827 -0
  5. package/dist/src/agent/agent-runner.js.map +1 -0
  6. package/dist/src/agent/agent-runner.test.d.ts +6 -0
  7. package/dist/src/agent/agent-runner.test.js +552 -0
  8. package/dist/src/agent/agent-runner.test.js.map +1 -0
  9. package/dist/src/agent/agent-types.d.ts +57 -0
  10. package/dist/src/agent/agent-types.js +17 -0
  11. package/dist/src/agent/agent-types.js.map +1 -0
  12. package/dist/src/agent/agent-types.test.d.ts +6 -0
  13. package/dist/src/agent/agent-types.test.js +44 -0
  14. package/dist/src/agent/agent-types.test.js.map +1 -0
  15. package/dist/src/agent/automation-bridge.d.ts +24 -0
  16. package/dist/src/agent/automation-bridge.js +24 -0
  17. package/dist/src/agent/automation-bridge.js.map +1 -0
  18. package/dist/src/agent/automation-bridge.test.d.ts +6 -0
  19. package/dist/src/agent/automation-bridge.test.js +67 -0
  20. package/dist/src/agent/automation-bridge.test.js.map +1 -0
  21. package/dist/src/agent/config-watcher.d.ts +20 -0
  22. package/dist/src/agent/config-watcher.js +68 -0
  23. package/dist/src/agent/config-watcher.js.map +1 -0
  24. package/dist/src/agent/config-watcher.test.d.ts +6 -0
  25. package/dist/src/agent/config-watcher.test.js +83 -0
  26. package/dist/src/agent/config-watcher.test.js.map +1 -0
  27. package/dist/src/agent/custom-tools-e2e.test.d.ts +6 -0
  28. package/dist/src/agent/custom-tools-e2e.test.js +566 -0
  29. package/dist/src/agent/custom-tools-e2e.test.js.map +1 -0
  30. package/dist/src/agent/local-server.d.ts +15 -0
  31. package/dist/src/agent/local-server.js +158 -0
  32. package/dist/src/agent/local-server.js.map +1 -0
  33. package/dist/src/agent/local-server.test.d.ts +6 -0
  34. package/dist/src/agent/local-server.test.js +126 -0
  35. package/dist/src/agent/local-server.test.js.map +1 -0
  36. package/dist/src/agent/proactive/delivery.d.ts +21 -0
  37. package/dist/src/agent/proactive/delivery.js +68 -0
  38. package/dist/src/agent/proactive/delivery.js.map +1 -0
  39. package/dist/src/agent/proactive/delivery.test.d.ts +6 -0
  40. package/dist/src/agent/proactive/delivery.test.js +65 -0
  41. package/dist/src/agent/proactive/delivery.test.js.map +1 -0
  42. package/dist/src/agent/proactive/proactive-runner.d.ts +76 -0
  43. package/dist/src/agent/proactive/proactive-runner.js +201 -0
  44. package/dist/src/agent/proactive/proactive-runner.js.map +1 -0
  45. package/dist/src/agent/proactive/proactive-runner.test.d.ts +6 -0
  46. package/dist/src/agent/proactive/proactive-runner.test.js +265 -0
  47. package/dist/src/agent/proactive/proactive-runner.test.js.map +1 -0
  48. package/dist/src/agent/request-helper.d.ts +16 -0
  49. package/dist/src/agent/request-helper.js +87 -0
  50. package/dist/src/agent/request-helper.js.map +1 -0
  51. package/dist/src/agent/routes/automations.d.ts +19 -0
  52. package/dist/src/agent/routes/automations.js +58 -0
  53. package/dist/src/agent/routes/automations.js.map +1 -0
  54. package/dist/src/agent/routes/automations.test.d.ts +6 -0
  55. package/dist/src/agent/routes/automations.test.js +117 -0
  56. package/dist/src/agent/routes/automations.test.js.map +1 -0
  57. package/dist/src/agent/routes/chat.d.ts +35 -0
  58. package/dist/src/agent/routes/chat.js +88 -0
  59. package/dist/src/agent/routes/chat.js.map +1 -0
  60. package/dist/src/agent/routes/chat.test.d.ts +6 -0
  61. package/dist/src/agent/routes/chat.test.js +115 -0
  62. package/dist/src/agent/routes/chat.test.js.map +1 -0
  63. package/dist/src/agent/routes/inspect.d.ts +12 -0
  64. package/dist/src/agent/routes/inspect.js +40 -0
  65. package/dist/src/agent/routes/inspect.js.map +1 -0
  66. package/dist/src/agent/routes/inspect.test.d.ts +6 -0
  67. package/dist/src/agent/routes/inspect.test.js +80 -0
  68. package/dist/src/agent/routes/inspect.test.js.map +1 -0
  69. package/dist/src/agent/routes/stores.d.ts +20 -0
  70. package/dist/src/agent/routes/stores.js +137 -0
  71. package/dist/src/agent/routes/stores.js.map +1 -0
  72. package/dist/src/agent/routes/stores.test.d.ts +6 -0
  73. package/dist/src/agent/routes/stores.test.js +191 -0
  74. package/dist/src/agent/routes/stores.test.js.map +1 -0
  75. package/dist/src/agent/routes/task.d.ts +11 -0
  76. package/dist/src/agent/routes/task.js +116 -0
  77. package/dist/src/agent/routes/task.js.map +1 -0
  78. package/dist/src/agent/routes/task.test.d.ts +6 -0
  79. package/dist/src/agent/routes/task.test.js +91 -0
  80. package/dist/src/agent/routes/task.test.js.map +1 -0
  81. package/dist/src/agent/routes/webhooks.d.ts +17 -0
  82. package/dist/src/agent/routes/webhooks.js +53 -0
  83. package/dist/src/agent/routes/webhooks.js.map +1 -0
  84. package/dist/src/agent/routes/webhooks.test.d.ts +6 -0
  85. package/dist/src/agent/routes/webhooks.test.js +100 -0
  86. package/dist/src/agent/routes/webhooks.test.js.map +1 -0
  87. package/dist/src/agent/session-manager.d.ts +72 -0
  88. package/dist/src/agent/session-manager.js +214 -0
  89. package/dist/src/agent/session-manager.js.map +1 -0
  90. package/dist/src/agent/session-manager.test.d.ts +6 -0
  91. package/dist/src/agent/session-manager.test.js +145 -0
  92. package/dist/src/agent/session-manager.test.js.map +1 -0
  93. package/dist/src/agent/shell-executor-local.d.ts +16 -0
  94. package/dist/src/agent/shell-executor-local.js +51 -0
  95. package/dist/src/agent/shell-executor-local.js.map +1 -0
  96. package/dist/src/agent/shell-executor-local.test.d.ts +6 -0
  97. package/dist/src/agent/shell-executor-local.test.js +46 -0
  98. package/dist/src/agent/shell-executor-local.test.js.map +1 -0
  99. package/dist/src/agent/snapshot-server.d.ts +38 -0
  100. package/dist/src/agent/snapshot-server.js +114 -0
  101. package/dist/src/agent/snapshot-server.js.map +1 -0
  102. package/dist/src/agent/stores-e2e.test.d.ts +6 -0
  103. package/dist/src/agent/stores-e2e.test.js +433 -0
  104. package/dist/src/agent/stores-e2e.test.js.map +1 -0
  105. package/dist/src/agent/tool-context-builder.d.ts +11 -0
  106. package/dist/src/agent/tool-context-builder.js +84 -0
  107. package/dist/src/agent/tool-context-builder.js.map +1 -0
  108. package/dist/src/agent/tool-context-builder.test.d.ts +6 -0
  109. package/dist/src/agent/tool-context-builder.test.js +152 -0
  110. package/dist/src/agent/tool-context-builder.test.js.map +1 -0
  111. package/dist/src/agent/tool-executor-local.d.ts +15 -0
  112. package/dist/src/agent/tool-executor-local.js +74 -0
  113. package/dist/src/agent/tool-executor-local.js.map +1 -0
  114. package/dist/src/agent/tool-executor-local.test.d.ts +6 -0
  115. package/dist/src/agent/tool-executor-local.test.js +116 -0
  116. package/dist/src/agent/tool-executor-local.test.js.map +1 -0
  117. package/dist/src/agent/tool-harness-template.d.ts +23 -0
  118. package/dist/src/agent/tool-harness-template.js +94 -0
  119. package/dist/src/agent/tool-harness-template.js.map +1 -0
  120. package/dist/src/agent/user-context-fetcher.d.ts +25 -0
  121. package/dist/src/agent/user-context-fetcher.js +79 -0
  122. package/dist/src/agent/user-context-fetcher.js.map +1 -0
  123. package/dist/src/agent/user-context-fetcher.test.d.ts +6 -0
  124. package/dist/src/agent/user-context-fetcher.test.js +121 -0
  125. package/dist/src/agent/user-context-fetcher.test.js.map +1 -0
  126. package/dist/src/audit/audit-client.d.ts +46 -0
  127. package/dist/src/audit/audit-client.js +83 -0
  128. package/dist/src/audit/audit-client.js.map +1 -0
  129. package/dist/src/cron/heartbeat-runner.d.ts +24 -0
  130. package/dist/src/cron/heartbeat-runner.js +87 -0
  131. package/dist/src/cron/heartbeat-runner.js.map +1 -0
  132. package/dist/src/cron/heartbeat-runner.test.d.ts +6 -0
  133. package/dist/src/cron/heartbeat-runner.test.js +120 -0
  134. package/dist/src/cron/heartbeat-runner.test.js.map +1 -0
  135. package/dist/src/cron/heartbeat-scheduler.d.ts +26 -0
  136. package/dist/src/cron/heartbeat-scheduler.js +54 -0
  137. package/dist/src/cron/heartbeat-scheduler.js.map +1 -0
  138. package/dist/src/cron/heartbeat-scheduler.test.d.ts +6 -0
  139. package/dist/src/cron/heartbeat-scheduler.test.js +61 -0
  140. package/dist/src/cron/heartbeat-scheduler.test.js.map +1 -0
  141. package/dist/src/index.d.ts +24 -0
  142. package/dist/src/index.js +118 -0
  143. package/dist/src/index.js.map +1 -0
  144. package/dist/src/middleware/auth.d.ts +40 -0
  145. package/dist/src/middleware/auth.js +135 -0
  146. package/dist/src/middleware/auth.js.map +1 -0
  147. package/dist/src/middleware/auth.test.d.ts +6 -0
  148. package/dist/src/middleware/auth.test.js +268 -0
  149. package/dist/src/middleware/auth.test.js.map +1 -0
  150. package/dist/src/middleware/error-handler.d.ts +20 -0
  151. package/dist/src/middleware/error-handler.js +48 -0
  152. package/dist/src/middleware/error-handler.js.map +1 -0
  153. package/dist/src/middleware/error-handler.test.d.ts +6 -0
  154. package/dist/src/middleware/error-handler.test.js +68 -0
  155. package/dist/src/middleware/error-handler.test.js.map +1 -0
  156. package/dist/src/middleware/request-validation.d.ts +13 -0
  157. package/dist/src/middleware/request-validation.js +26 -0
  158. package/dist/src/middleware/request-validation.js.map +1 -0
  159. package/dist/src/middleware/request-validation.test.d.ts +6 -0
  160. package/dist/src/middleware/request-validation.test.js +57 -0
  161. package/dist/src/middleware/request-validation.test.js.map +1 -0
  162. package/dist/src/output/email-output.d.ts +10 -0
  163. package/dist/src/output/email-output.js +12 -0
  164. package/dist/src/output/email-output.js.map +1 -0
  165. package/dist/src/output/output-router.d.ts +12 -0
  166. package/dist/src/output/output-router.js +36 -0
  167. package/dist/src/output/output-router.js.map +1 -0
  168. package/dist/src/output/output-router.test.d.ts +6 -0
  169. package/dist/src/output/output-router.test.js +132 -0
  170. package/dist/src/output/output-router.test.js.map +1 -0
  171. package/dist/src/output/slack-output.d.ts +10 -0
  172. package/dist/src/output/slack-output.js +54 -0
  173. package/dist/src/output/slack-output.js.map +1 -0
  174. package/dist/src/output/webhook-output.d.ts +10 -0
  175. package/dist/src/output/webhook-output.js +25 -0
  176. package/dist/src/output/webhook-output.js.map +1 -0
  177. package/dist/src/routes/ai-stream.d.ts +159 -0
  178. package/dist/src/routes/ai-stream.js +309 -0
  179. package/dist/src/routes/ai-stream.js.map +1 -0
  180. package/dist/src/routes/ai-stream.test.d.ts +6 -0
  181. package/dist/src/routes/ai-stream.test.js +586 -0
  182. package/dist/src/routes/ai-stream.test.js.map +1 -0
  183. package/dist/src/routes/ask-user-response.d.ts +30 -0
  184. package/dist/src/routes/ask-user-response.js +61 -0
  185. package/dist/src/routes/ask-user-response.js.map +1 -0
  186. package/dist/src/routes/ask-user-response.test.d.ts +6 -0
  187. package/dist/src/routes/ask-user-response.test.js +88 -0
  188. package/dist/src/routes/ask-user-response.test.js.map +1 -0
  189. package/dist/src/routes/chat-stream.d.ts +14 -0
  190. package/dist/src/routes/chat-stream.js +84 -0
  191. package/dist/src/routes/chat-stream.js.map +1 -0
  192. package/dist/src/routes/chat-stream.test.d.ts +6 -0
  193. package/dist/src/routes/chat-stream.test.js +155 -0
  194. package/dist/src/routes/chat-stream.test.js.map +1 -0
  195. package/dist/src/routes/chat.d.ts +13 -0
  196. package/dist/src/routes/chat.js +55 -0
  197. package/dist/src/routes/chat.js.map +1 -0
  198. package/dist/src/routes/chat.test.d.ts +6 -0
  199. package/dist/src/routes/chat.test.js +99 -0
  200. package/dist/src/routes/chat.test.js.map +1 -0
  201. package/dist/src/routes/health.d.ts +13 -0
  202. package/dist/src/routes/health.js +23 -0
  203. package/dist/src/routes/health.js.map +1 -0
  204. package/dist/src/routes/health.test.d.ts +6 -0
  205. package/dist/src/routes/health.test.js +45 -0
  206. package/dist/src/routes/health.test.js.map +1 -0
  207. package/dist/src/routes/sessions.d.ts +14 -0
  208. package/dist/src/routes/sessions.js +82 -0
  209. package/dist/src/routes/sessions.js.map +1 -0
  210. package/dist/src/routes/webhooks.d.ts +13 -0
  211. package/dist/src/routes/webhooks.js +43 -0
  212. package/dist/src/routes/webhooks.js.map +1 -0
  213. package/dist/src/routes/webhooks.test.d.ts +6 -0
  214. package/dist/src/routes/webhooks.test.js +80 -0
  215. package/dist/src/routes/webhooks.test.js.map +1 -0
  216. package/dist/src/routes/widget-actions.d.ts +49 -0
  217. package/dist/src/routes/widget-actions.js +78 -0
  218. package/dist/src/routes/widget-actions.js.map +1 -0
  219. package/dist/src/server.d.ts +31 -0
  220. package/dist/src/server.js +129 -0
  221. package/dist/src/server.js.map +1 -0
  222. package/dist/src/server.test.d.ts +6 -0
  223. package/dist/src/server.test.js +153 -0
  224. package/dist/src/server.test.js.map +1 -0
  225. package/dist/src/session/history-converter.d.ts +21 -0
  226. package/dist/src/session/history-converter.js +59 -0
  227. package/dist/src/session/history-converter.js.map +1 -0
  228. package/dist/src/session/history-converter.test.d.ts +6 -0
  229. package/dist/src/session/history-converter.test.js +130 -0
  230. package/dist/src/session/history-converter.test.js.map +1 -0
  231. package/dist/src/session/session-manager.d.ts +117 -0
  232. package/dist/src/session/session-manager.js +480 -0
  233. package/dist/src/session/session-manager.js.map +1 -0
  234. package/dist/src/session/session-manager.test.d.ts +6 -0
  235. package/dist/src/session/session-manager.test.js +586 -0
  236. package/dist/src/session/session-manager.test.js.map +1 -0
  237. package/dist/src/session/session-runner.d.ts +30 -0
  238. package/dist/src/session/session-runner.js +771 -0
  239. package/dist/src/session/session-runner.js.map +1 -0
  240. package/dist/src/session/session-runner.test.d.ts +6 -0
  241. package/dist/src/session/session-runner.test.js +842 -0
  242. package/dist/src/session/session-runner.test.js.map +1 -0
  243. package/dist/src/stores/index.d.ts +8 -0
  244. package/dist/src/stores/index.js +9 -0
  245. package/dist/src/stores/index.js.map +1 -0
  246. package/dist/src/stores/key-resolver.d.ts +21 -0
  247. package/dist/src/stores/key-resolver.js +30 -0
  248. package/dist/src/stores/key-resolver.js.map +1 -0
  249. package/dist/src/stores/key-resolver.test.d.ts +6 -0
  250. package/dist/src/stores/key-resolver.test.js +31 -0
  251. package/dist/src/stores/key-resolver.test.js.map +1 -0
  252. package/dist/src/stores/pglite-store-backend.d.ts +36 -0
  253. package/dist/src/stores/pglite-store-backend.js +227 -0
  254. package/dist/src/stores/pglite-store-backend.js.map +1 -0
  255. package/dist/src/stores/pglite-store-backend.test.d.ts +6 -0
  256. package/dist/src/stores/pglite-store-backend.test.js +150 -0
  257. package/dist/src/stores/pglite-store-backend.test.js.map +1 -0
  258. package/dist/src/stores/ttl-resolver.d.ts +24 -0
  259. package/dist/src/stores/ttl-resolver.js +64 -0
  260. package/dist/src/stores/ttl-resolver.js.map +1 -0
  261. package/dist/src/stores/ttl-resolver.test.d.ts +6 -0
  262. package/dist/src/stores/ttl-resolver.test.js +68 -0
  263. package/dist/src/stores/ttl-resolver.test.js.map +1 -0
  264. package/dist/src/types.d.ts +227 -0
  265. package/dist/src/types.js +50 -0
  266. package/dist/src/types.js.map +1 -0
  267. package/dist/src/types.test.d.ts +6 -0
  268. package/dist/src/types.test.js +68 -0
  269. package/dist/src/types.test.js.map +1 -0
  270. package/dist/src/utils/jwt-verify.d.ts +20 -0
  271. package/dist/src/utils/jwt-verify.js +34 -0
  272. package/dist/src/utils/jwt-verify.js.map +1 -0
  273. package/dist/src/utils/jwt-verify.test.d.ts +6 -0
  274. package/dist/src/utils/jwt-verify.test.js +156 -0
  275. package/dist/src/utils/jwt-verify.test.js.map +1 -0
  276. package/dist/tsconfig.tsbuildinfo +1 -0
  277. package/package.json +51 -0
@@ -0,0 +1,566 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ /**
7
+ * End-to-end tests for the custom tools pipeline.
8
+ *
9
+ * Tests the full lifecycle:
10
+ * repo on disk → loadTools → buildTools (LLM tool list) → executeTool → result
11
+ *
12
+ * Uses real filesystem fixtures (temp dirs) and real handler execution
13
+ * via dynamic import. The LLM provider is mocked so we can control
14
+ * which tools get called and verify the results.
15
+ */
16
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
17
+ import { mkdtempSync, mkdirSync, writeFileSync, rmSync } from 'node:fs';
18
+ import { join } from 'node:path';
19
+ import { tmpdir } from 'node:os';
20
+ import { loadTools } from '@amodalai/core';
21
+ import { LocalToolExecutor } from './tool-executor-local.js';
22
+ import { buildToolContext } from './tool-context-builder.js';
23
+ // ---------------------------------------------------------------------------
24
+ // Helpers
25
+ // ---------------------------------------------------------------------------
26
+ function makeTempRepo() {
27
+ return mkdtempSync(join(tmpdir(), 'tools-e2e-'));
28
+ }
29
+ /**
30
+ * Write a .mjs handler file into a tool directory.
31
+ * We use .mjs so dynamic import works without a TypeScript compile step.
32
+ */
33
+ function writeTool(repoDir, name, files) {
34
+ const toolDir = join(repoDir, 'tools', name);
35
+ mkdirSync(toolDir, { recursive: true });
36
+ for (const [filename, content] of Object.entries(files)) {
37
+ writeFileSync(join(toolDir, filename), content);
38
+ }
39
+ return toolDir;
40
+ }
41
+ function makeSession(tools, overrides) {
42
+ return {
43
+ id: 'e2e-session',
44
+ tenantId: 'e2e-tenant',
45
+ conversationHistory: [],
46
+ createdAt: Date.now(),
47
+ lastAccessedAt: Date.now(),
48
+ runtime: {
49
+ repo: {
50
+ source: 'local',
51
+ origin: '/test',
52
+ config: {
53
+ name: 'e2e-test',
54
+ version: '1.0.0',
55
+ models: { main: { provider: 'anthropic', model: 'test' } },
56
+ },
57
+ connections: new Map(),
58
+ skills: [],
59
+ agents: {},
60
+ automations: [],
61
+ knowledge: [],
62
+ evals: [],
63
+ tools,
64
+ },
65
+ compiledContext: {
66
+ systemPrompt: 'test',
67
+ tokenUsage: { total: 100000, used: 0, remaining: 100000, sectionBreakdown: {} },
68
+ sections: [],
69
+ },
70
+ outputPipeline: {
71
+ process: vi.fn((text) => ({ output: text, modified: false, blocked: false, findings: [] })),
72
+ },
73
+ connectionsMap: overrides?.['connectionsMap'] ?? {},
74
+ fieldScrubber: null,
75
+ actionGate: { evaluate: vi.fn(() => ({ decision: 'allow' })) },
76
+ telemetry: { logScrub: vi.fn(), logGuard: vi.fn(), logGate: vi.fn() },
77
+ userRoles: ['analyst'],
78
+ sessionId: 'e2e-session',
79
+ isDelegated: false,
80
+ },
81
+ planModeManager: {
82
+ isActive: vi.fn(() => false),
83
+ enter: vi.fn(),
84
+ exit: vi.fn(),
85
+ getPlanningReminder: vi.fn(() => null),
86
+ getApprovedPlanContext: vi.fn(() => null),
87
+ },
88
+ exploreConfig: {
89
+ systemPrompt: '',
90
+ model: { provider: 'anthropic', model: 'test' },
91
+ maxTurns: 5,
92
+ maxDepth: 2,
93
+ },
94
+ };
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Tests
98
+ // ---------------------------------------------------------------------------
99
+ describe('Custom Tools E2E', () => {
100
+ let repoDir;
101
+ let executor;
102
+ beforeEach(() => {
103
+ repoDir = makeTempRepo();
104
+ executor = new LocalToolExecutor();
105
+ });
106
+ afterEach(() => {
107
+ executor.dispose();
108
+ rmSync(repoDir, { recursive: true, force: true });
109
+ });
110
+ // ── Loading ──
111
+ describe('tool loading from disk', () => {
112
+ it('loads a tool.json + handler.ts tool', async () => {
113
+ writeTool(repoDir, 'multiply', {
114
+ 'tool.json': JSON.stringify({
115
+ description: 'Multiply two numbers',
116
+ parameters: {
117
+ type: 'object',
118
+ properties: {
119
+ a: { type: 'number' },
120
+ b: { type: 'number' },
121
+ },
122
+ required: ['a', 'b'],
123
+ },
124
+ }),
125
+ 'handler.ts': 'export default async (p: any) => ({});',
126
+ });
127
+ const tools = await loadTools(repoDir);
128
+ expect(tools).toHaveLength(1);
129
+ expect(tools[0].name).toBe('multiply');
130
+ expect(tools[0].description).toBe('Multiply two numbers');
131
+ expect(tools[0].parameters['properties']).toBeDefined();
132
+ });
133
+ it('loads a single-file tool with export const description', async () => {
134
+ writeTool(repoDir, 'greet', {
135
+ 'handler.ts': `
136
+ export const description = 'Greet a user by name';
137
+ export default async (params: any) => ({ message: 'hello ' + params.name });
138
+ `,
139
+ });
140
+ const tools = await loadTools(repoDir);
141
+ expect(tools).toHaveLength(1);
142
+ expect(tools[0].name).toBe('greet');
143
+ expect(tools[0].description).toBe('Greet a user by name');
144
+ });
145
+ it('loads a single-file tool with defineToolHandler', async () => {
146
+ writeTool(repoDir, 'add_numbers', {
147
+ 'handler.ts': `
148
+ import { defineToolHandler } from '@amodalai/core';
149
+ export default defineToolHandler({
150
+ description: 'Add two numbers together',
151
+ parameters: { type: 'object', properties: { a: { type: 'number' }, b: { type: 'number' } } },
152
+ handler: async (params) => ({ sum: (params.a as number) + (params.b as number) }),
153
+ });
154
+ `,
155
+ });
156
+ const tools = await loadTools(repoDir);
157
+ expect(tools).toHaveLength(1);
158
+ expect(tools[0].name).toBe('add_numbers');
159
+ expect(tools[0].description).toBe('Add two numbers together');
160
+ });
161
+ it('loads multiple tools from the same repo', async () => {
162
+ writeTool(repoDir, 'tool_a', {
163
+ 'tool.json': JSON.stringify({ description: 'Tool Alpha' }),
164
+ 'handler.ts': 'export default async () => ({});',
165
+ });
166
+ writeTool(repoDir, 'tool_b', {
167
+ 'tool.json': JSON.stringify({ description: 'Tool Beta' }),
168
+ 'handler.ts': 'export default async () => ({});',
169
+ });
170
+ writeTool(repoDir, 'tool_c', {
171
+ 'handler.ts': 'export const description = "Tool Charlie";\nexport default async () => ({});',
172
+ });
173
+ const tools = await loadTools(repoDir);
174
+ expect(tools).toHaveLength(3);
175
+ const names = tools.map((t) => t.name).sort();
176
+ expect(names).toEqual(['tool_a', 'tool_b', 'tool_c']);
177
+ });
178
+ it('detects Dockerfile, package.json, and confirm settings', async () => {
179
+ writeTool(repoDir, 'ml_scorer', {
180
+ 'tool.json': JSON.stringify({
181
+ description: 'Score risk using ML',
182
+ confirm: 'review',
183
+ timeout: 60000,
184
+ env: ['MODEL_KEY'],
185
+ }),
186
+ 'handler.ts': 'export default async () => ({});',
187
+ 'Dockerfile': 'FROM python:3.12-slim\nRUN pip install pandas',
188
+ 'package.json': JSON.stringify({ dependencies: {} }),
189
+ });
190
+ const tools = await loadTools(repoDir);
191
+ expect(tools[0].hasDockerfile).toBe(true);
192
+ expect(tools[0].hasPackageJson).toBe(true);
193
+ expect(tools[0].hasSetupScript).toBe(false);
194
+ expect(tools[0].confirm).toBe('review');
195
+ expect(tools[0].timeout).toBe(60000);
196
+ expect(tools[0].env).toEqual(['MODEL_KEY']);
197
+ });
198
+ it('detects setup.sh and requirements.txt', async () => {
199
+ writeTool(repoDir, 'py_tool', {
200
+ 'tool.json': JSON.stringify({
201
+ description: 'Python tool',
202
+ sandbox: { language: 'python' },
203
+ }),
204
+ 'handler.ts': 'export default async () => ({});',
205
+ 'setup.sh': '#!/bin/bash\npip install -r requirements.txt\ngo build -o scorer scorer.go',
206
+ 'requirements.txt': 'pandas\nnumpy',
207
+ });
208
+ const tools = await loadTools(repoDir);
209
+ expect(tools[0].hasSetupScript).toBe(true);
210
+ expect(tools[0].hasRequirementsTxt).toBe(true);
211
+ expect(tools[0].hasDockerfile).toBe(false);
212
+ expect(tools[0].sandboxLanguage).toBe('python');
213
+ });
214
+ it('rejects mismatched name in tool.json', async () => {
215
+ writeTool(repoDir, 'my_tool', {
216
+ 'tool.json': JSON.stringify({ name: 'other_name', description: 'Mismatch' }),
217
+ 'handler.ts': 'export default async () => ({});',
218
+ });
219
+ await expect(loadTools(repoDir)).rejects.toThrow(/does not match directory name/);
220
+ });
221
+ it('rejects invalid directory names', async () => {
222
+ writeTool(repoDir, 'Bad-Name', {
223
+ 'tool.json': JSON.stringify({ description: 'Bad' }),
224
+ 'handler.ts': 'export default async () => ({});',
225
+ });
226
+ await expect(loadTools(repoDir)).rejects.toThrow(/not a valid tool name/);
227
+ });
228
+ it('returns empty array when no tools/ directory exists', async () => {
229
+ const tools = await loadTools(repoDir);
230
+ expect(tools).toEqual([]);
231
+ });
232
+ });
233
+ // ── Execution ──
234
+ describe('tool execution', () => {
235
+ it('executes a handler that returns an object', async () => {
236
+ const toolDir = writeTool(repoDir, 'compute', {
237
+ 'handler.mjs': `
238
+ export default async (params) => ({
239
+ result: params.x * params.y,
240
+ label: 'product',
241
+ });
242
+ `,
243
+ 'tool.json': JSON.stringify({ description: 'Compute product' }),
244
+ 'handler.ts': 'placeholder', // loader needs this
245
+ });
246
+ // Load, then swap handlerPath to .mjs for dynamic import
247
+ const tools = await loadTools(repoDir);
248
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
249
+ const session = makeSession(tools);
250
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
251
+ const result = await executor.execute(tools[0], { x: 6, y: 7 }, ctx);
252
+ expect(result).toEqual({ result: 42, label: 'product' });
253
+ });
254
+ it('wraps primitive return values', async () => {
255
+ const toolDir = writeTool(repoDir, 'stringify', {
256
+ 'handler.mjs': 'export default async (params) => "hello " + params.name;',
257
+ 'tool.json': JSON.stringify({ description: 'Stringify' }),
258
+ 'handler.ts': 'placeholder',
259
+ });
260
+ const tools = await loadTools(repoDir);
261
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
262
+ const session = makeSession(tools);
263
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
264
+ const result = await executor.execute(tools[0], { name: 'world' }, ctx);
265
+ expect(result).toEqual({ result: 'hello world' });
266
+ });
267
+ it('catches handler errors gracefully', async () => {
268
+ const toolDir = writeTool(repoDir, 'fail_tool', {
269
+ 'handler.mjs': 'export default async () => { throw new Error("intentional failure"); };',
270
+ 'tool.json': JSON.stringify({ description: 'Fails intentionally' }),
271
+ 'handler.ts': 'placeholder',
272
+ });
273
+ const tools = await loadTools(repoDir);
274
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
275
+ const session = makeSession(tools);
276
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
277
+ const result = await executor.execute(tools[0], {}, ctx);
278
+ expect(result).toEqual({ error: 'intentional failure' });
279
+ });
280
+ it('handler can use ctx.exec() to run shell commands', async () => {
281
+ const toolDir = writeTool(repoDir, 'shell_tool', {
282
+ 'handler.mjs': `
283
+ export default async (params, ctx) => {
284
+ const result = await ctx.exec('echo ' + JSON.stringify(params.message));
285
+ return { output: result.stdout.trim(), exitCode: result.exitCode };
286
+ };
287
+ `,
288
+ 'tool.json': JSON.stringify({ description: 'Shell tool' }),
289
+ 'handler.ts': 'placeholder',
290
+ });
291
+ const tools = await loadTools(repoDir);
292
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
293
+ const session = makeSession(tools);
294
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
295
+ const result = await executor.execute(tools[0], { message: 'hello from shell' }, ctx);
296
+ expect(result).toEqual({ output: 'hello from shell', exitCode: 0 });
297
+ });
298
+ it('handler can use ctx.exec() to run Python', async () => {
299
+ // Skip if python3 is not available
300
+ const { execSync } = await import('node:child_process');
301
+ let hasPython = false;
302
+ try {
303
+ execSync('python3 --version', { stdio: 'pipe' });
304
+ hasPython = true;
305
+ }
306
+ catch {
307
+ // python3 not installed
308
+ }
309
+ if (!hasPython) {
310
+ return; // Skip test
311
+ }
312
+ const toolDir = writeTool(repoDir, 'python_tool', {
313
+ 'handler.mjs': `
314
+ export default async (params, ctx) => {
315
+ const result = await ctx.exec('python3 compute.py ' + params.a + ' ' + params.b);
316
+ if (result.exitCode !== 0) return { error: result.stderr };
317
+ return JSON.parse(result.stdout);
318
+ };
319
+ `,
320
+ 'compute.py': 'import sys, json\na, b = int(sys.argv[1]), int(sys.argv[2])\nprint(json.dumps({"sum": a + b}))',
321
+ 'tool.json': JSON.stringify({ description: 'Python math' }),
322
+ 'handler.ts': 'placeholder',
323
+ });
324
+ const tools = await loadTools(repoDir);
325
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
326
+ const session = makeSession(tools);
327
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
328
+ const result = await executor.execute(tools[0], { a: 10, b: 32 }, ctx);
329
+ expect(result).toEqual({ sum: 42 });
330
+ });
331
+ it('handler can use ctx.env() with allowlisted vars', async () => {
332
+ process.env['E2E_TEST_KEY'] = 'secret-value';
333
+ const toolDir = writeTool(repoDir, 'env_tool', {
334
+ 'handler.mjs': `
335
+ export default async (params, ctx) => ({
336
+ allowed: ctx.env('E2E_TEST_KEY'),
337
+ blocked: ctx.env('HOME'),
338
+ });
339
+ `,
340
+ 'tool.json': JSON.stringify({
341
+ description: 'Env tool',
342
+ env: ['E2E_TEST_KEY'],
343
+ }),
344
+ 'handler.ts': 'placeholder',
345
+ });
346
+ const tools = await loadTools(repoDir);
347
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
348
+ const session = makeSession(tools);
349
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
350
+ const result = await executor.execute(tools[0], {}, ctx);
351
+ expect(result).toEqual({ allowed: 'secret-value', blocked: undefined });
352
+ delete process.env['E2E_TEST_KEY'];
353
+ });
354
+ it('handler can use ctx.log()', async () => {
355
+ const stderrSpy = vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
356
+ const toolDir = writeTool(repoDir, 'log_tool', {
357
+ 'handler.mjs': `
358
+ export default async (params, ctx) => {
359
+ ctx.log('processing ' + params.item);
360
+ return { ok: true };
361
+ };
362
+ `,
363
+ 'tool.json': JSON.stringify({ description: 'Log tool' }),
364
+ 'handler.ts': 'placeholder',
365
+ });
366
+ const tools = await loadTools(repoDir);
367
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
368
+ const session = makeSession(tools);
369
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
370
+ await executor.execute(tools[0], { item: 'order-123' }, ctx);
371
+ expect(stderrSpy).toHaveBeenCalledWith(expect.stringContaining('processing order-123'));
372
+ stderrSpy.mockRestore();
373
+ });
374
+ it('ctx.user contains session roles', async () => {
375
+ const toolDir = writeTool(repoDir, 'role_tool', {
376
+ 'handler.mjs': `
377
+ export default async (params, ctx) => ({
378
+ roles: ctx.user.roles,
379
+ });
380
+ `,
381
+ 'tool.json': JSON.stringify({ description: 'Role tool' }),
382
+ 'handler.ts': 'placeholder',
383
+ });
384
+ const tools = await loadTools(repoDir);
385
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
386
+ const session = makeSession(tools);
387
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
388
+ const result = await executor.execute(tools[0], {}, ctx);
389
+ expect(result).toEqual({ roles: ['analyst'] });
390
+ });
391
+ });
392
+ // ── Confirmation gating ──
393
+ describe('confirmation gating', () => {
394
+ it('confirm: false tools reject non-GET requests via ctx.request()', async () => {
395
+ const toolDir = writeTool(repoDir, 'readonly_tool', {
396
+ 'handler.mjs': `
397
+ export default async (params, ctx) => {
398
+ try {
399
+ await ctx.request('crm', '/deals', { method: 'POST', data: { name: 'test' } });
400
+ return { error: 'should have thrown' };
401
+ } catch (err) {
402
+ return { blocked: true, message: err.message };
403
+ }
404
+ };
405
+ `,
406
+ 'tool.json': JSON.stringify({ description: 'Read-only tool', confirm: false }),
407
+ 'handler.ts': 'placeholder',
408
+ });
409
+ const tools = await loadTools(repoDir);
410
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
411
+ const session = makeSession(tools);
412
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
413
+ const result = await executor.execute(tools[0], {}, ctx);
414
+ const resultObj = result;
415
+ expect(resultObj['blocked']).toBe(true);
416
+ expect(resultObj['message']).toMatch(/only GET requests are allowed/);
417
+ });
418
+ it('confirm: "never" tools are excluded from buildTools output', async () => {
419
+ writeTool(repoDir, 'visible_tool', {
420
+ 'tool.json': JSON.stringify({ description: 'Visible' }),
421
+ 'handler.ts': 'export default async () => ({});',
422
+ });
423
+ writeTool(repoDir, 'hidden_tool', {
424
+ 'tool.json': JSON.stringify({ description: 'Hidden', confirm: 'never' }),
425
+ 'handler.ts': 'export default async () => ({});',
426
+ });
427
+ const tools = await loadTools(repoDir);
428
+ expect(tools).toHaveLength(2);
429
+ // Simulate what buildTools does — filter out confirm: 'never'
430
+ const visibleTools = tools.filter((t) => t.confirm !== 'never');
431
+ expect(visibleTools).toHaveLength(1);
432
+ expect(visibleTools[0].name).toBe('visible_tool');
433
+ });
434
+ });
435
+ // ── Handler caching ──
436
+ describe('handler caching', () => {
437
+ it('caches handler modules across invocations', async () => {
438
+ const toolDir = writeTool(repoDir, 'cached_tool', {
439
+ 'handler.mjs': `
440
+ let callCount = 0;
441
+ export default async () => ({ call: ++callCount });
442
+ `,
443
+ 'tool.json': JSON.stringify({ description: 'Cached tool' }),
444
+ 'handler.ts': 'placeholder',
445
+ });
446
+ const tools = await loadTools(repoDir);
447
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
448
+ const session = makeSession(tools);
449
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
450
+ const r1 = await executor.execute(tools[0], {}, ctx);
451
+ const r2 = await executor.execute(tools[0], {}, ctx);
452
+ // Same module instance → counter increments
453
+ expect(r1).toEqual({ call: 1 });
454
+ expect(r2).toEqual({ call: 2 });
455
+ });
456
+ });
457
+ // ── exec() integration ──
458
+ describe('ctx.exec() integration', () => {
459
+ it('exec() captures stdout, stderr, and exit code', async () => {
460
+ const toolDir = writeTool(repoDir, 'exec_detail', {
461
+ 'handler.mjs': `
462
+ export default async (params, ctx) => {
463
+ const result = await ctx.exec('echo out && echo err >&2');
464
+ return result;
465
+ };
466
+ `,
467
+ 'tool.json': JSON.stringify({ description: 'Exec detail' }),
468
+ 'handler.ts': 'placeholder',
469
+ });
470
+ const tools = await loadTools(repoDir);
471
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
472
+ const session = makeSession(tools);
473
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
474
+ const result = await executor.execute(tools[0], {}, ctx);
475
+ const r = result;
476
+ expect(r.stdout.trim()).toBe('out');
477
+ expect(r.stderr.trim()).toBe('err');
478
+ expect(r.exitCode).toBe(0);
479
+ });
480
+ it('exec() returns non-zero exit code for failing commands', async () => {
481
+ const toolDir = writeTool(repoDir, 'exec_fail', {
482
+ 'handler.mjs': `
483
+ export default async (params, ctx) => {
484
+ const result = await ctx.exec('exit 42');
485
+ return { exitCode: result.exitCode };
486
+ };
487
+ `,
488
+ 'tool.json': JSON.stringify({ description: 'Exec fail' }),
489
+ 'handler.ts': 'placeholder',
490
+ });
491
+ const tools = await loadTools(repoDir);
492
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
493
+ const session = makeSession(tools);
494
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
495
+ const result = await executor.execute(tools[0], {}, ctx);
496
+ expect(result).toEqual({ exitCode: 42 });
497
+ });
498
+ it('exec() runs with tool directory as default cwd', async () => {
499
+ const toolDir = writeTool(repoDir, 'exec_cwd', {
500
+ 'handler.mjs': `
501
+ export default async (params, ctx) => {
502
+ const result = await ctx.exec('ls handler.mjs');
503
+ return { found: result.exitCode === 0 };
504
+ };
505
+ `,
506
+ 'tool.json': JSON.stringify({ description: 'Exec cwd' }),
507
+ 'handler.ts': 'placeholder',
508
+ });
509
+ const tools = await loadTools(repoDir);
510
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
511
+ const session = makeSession(tools);
512
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
513
+ const result = await executor.execute(tools[0], {}, ctx);
514
+ expect(result).toEqual({ found: true });
515
+ });
516
+ it('exec() can delegate to a script file in the tool directory', async () => {
517
+ const toolDir = writeTool(repoDir, 'script_tool', {
518
+ 'handler.mjs': `
519
+ export default async (params, ctx) => {
520
+ const result = await ctx.exec('bash compute.sh ' + params.input);
521
+ return { output: result.stdout.trim() };
522
+ };
523
+ `,
524
+ 'compute.sh': '#!/bin/bash\necho "processed: $1"',
525
+ 'tool.json': JSON.stringify({ description: 'Script tool' }),
526
+ 'handler.ts': 'placeholder',
527
+ });
528
+ const tools = await loadTools(repoDir);
529
+ tools[0].handlerPath = join(toolDir, 'handler.mjs');
530
+ const session = makeSession(tools);
531
+ const ctx = buildToolContext(session, tools[0], AbortSignal.timeout(10000));
532
+ const result = await executor.execute(tools[0], { input: 'order-99' }, ctx);
533
+ expect(result).toEqual({ output: 'processed: order-99' });
534
+ });
535
+ });
536
+ // ── Multi-tool pipeline ──
537
+ describe('multi-tool workflows', () => {
538
+ it('loads and executes multiple tools from the same repo', async () => {
539
+ const doubleDir = writeTool(repoDir, 'double', {
540
+ 'handler.mjs': 'export default async (p) => ({ value: p.n * 2 });',
541
+ 'tool.json': JSON.stringify({ description: 'Double a number' }),
542
+ 'handler.ts': 'placeholder',
543
+ });
544
+ const negateDir = writeTool(repoDir, 'negate', {
545
+ 'handler.mjs': 'export default async (p) => ({ value: -p.n });',
546
+ 'tool.json': JSON.stringify({ description: 'Negate a number' }),
547
+ 'handler.ts': 'placeholder',
548
+ });
549
+ const tools = await loadTools(repoDir);
550
+ tools.find((t) => t.name === 'double').handlerPath = join(doubleDir, 'handler.mjs');
551
+ tools.find((t) => t.name === 'negate').handlerPath = join(negateDir, 'handler.mjs');
552
+ const session = makeSession(tools);
553
+ // Execute double
554
+ const doubleTool = tools.find((t) => t.name === 'double');
555
+ const doubleCtx = buildToolContext(session, doubleTool, AbortSignal.timeout(10000));
556
+ const r1 = await executor.execute(doubleTool, { n: 21 }, doubleCtx);
557
+ expect(r1).toEqual({ value: 42 });
558
+ // Execute negate with the result
559
+ const negateTool = tools.find((t) => t.name === 'negate');
560
+ const negateCtx = buildToolContext(session, negateTool, AbortSignal.timeout(10000));
561
+ const r2 = await executor.execute(negateTool, { n: r1.value }, negateCtx);
562
+ expect(r2).toEqual({ value: -42 });
563
+ });
564
+ });
565
+ });
566
+ //# sourceMappingURL=custom-tools-e2e.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-tools-e2e.test.js","sourceRoot":"","sources":["../../../src/agent/custom-tools-e2e.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025 Amodal Labs, Inc.
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import type { LocalServerConfig } from './agent-types.js';
7
+ import type { ServerInstance } from '../server.js';
8
+ /**
9
+ * Creates an Express server for repo-based agent mode.
10
+ *
11
+ * Loads the `.amodal/` config from `config.repoPath`, creates a
12
+ * `AgentSessionManager`, mounts chat/task/inspect/automation/webhook routes,
13
+ * and optionally watches for config changes (hot reload).
14
+ */
15
+ export declare function createLocalServer(config: LocalServerConfig): Promise<ServerInstance>;