@dobbyai/mcp-external 1.0.4 → 1.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.
Files changed (315) hide show
  1. package/README.md +44 -14
  2. package/dist/__tests__/agent-mail-tools.test.d.ts +8 -0
  3. package/dist/__tests__/agent-mail-tools.test.d.ts.map +1 -0
  4. package/dist/__tests__/agent-mail-tools.test.js +255 -0
  5. package/dist/__tests__/agent-mail-tools.test.js.map +1 -0
  6. package/dist/__tests__/annotations.test.d.ts +8 -0
  7. package/dist/__tests__/annotations.test.d.ts.map +1 -0
  8. package/dist/__tests__/annotations.test.js +108 -0
  9. package/dist/__tests__/annotations.test.js.map +1 -0
  10. package/dist/__tests__/auth.test.d.ts +7 -0
  11. package/dist/__tests__/auth.test.d.ts.map +1 -0
  12. package/dist/__tests__/auth.test.js +161 -0
  13. package/dist/__tests__/auth.test.js.map +1 -0
  14. package/dist/__tests__/doctor.test.d.ts +16 -0
  15. package/dist/__tests__/doctor.test.d.ts.map +1 -0
  16. package/dist/__tests__/doctor.test.js +258 -0
  17. package/dist/__tests__/doctor.test.js.map +1 -0
  18. package/dist/__tests__/external-agents-tools.test.d.ts +11 -0
  19. package/dist/__tests__/external-agents-tools.test.d.ts.map +1 -0
  20. package/dist/__tests__/external-agents-tools.test.js +619 -0
  21. package/dist/__tests__/external-agents-tools.test.js.map +1 -0
  22. package/dist/__tests__/gateway-bearer.test.d.ts +12 -0
  23. package/dist/__tests__/gateway-bearer.test.d.ts.map +1 -0
  24. package/dist/__tests__/gateway-bearer.test.js +112 -0
  25. package/dist/__tests__/gateway-bearer.test.js.map +1 -0
  26. package/dist/__tests__/gateway-key-resolver.test.d.ts +10 -0
  27. package/dist/__tests__/gateway-key-resolver.test.d.ts.map +1 -0
  28. package/dist/__tests__/gateway-key-resolver.test.js +125 -0
  29. package/dist/__tests__/gateway-key-resolver.test.js.map +1 -0
  30. package/dist/__tests__/http-concurrency.test.d.ts +20 -0
  31. package/dist/__tests__/http-concurrency.test.d.ts.map +1 -0
  32. package/dist/__tests__/http-concurrency.test.js +254 -0
  33. package/dist/__tests__/http-concurrency.test.js.map +1 -0
  34. package/dist/__tests__/integration/protocol.test.d.ts +8 -0
  35. package/dist/__tests__/integration/protocol.test.d.ts.map +1 -0
  36. package/dist/__tests__/integration/protocol.test.js +110 -0
  37. package/dist/__tests__/integration/protocol.test.js.map +1 -0
  38. package/dist/__tests__/mcp-integrations.test.d.ts +8 -0
  39. package/dist/__tests__/mcp-integrations.test.d.ts.map +1 -0
  40. package/dist/__tests__/mcp-integrations.test.js +365 -0
  41. package/dist/__tests__/mcp-integrations.test.js.map +1 -0
  42. package/dist/__tests__/memory-graph-tools.test.d.ts +8 -0
  43. package/dist/__tests__/memory-graph-tools.test.d.ts.map +1 -0
  44. package/dist/__tests__/memory-graph-tools.test.js +254 -0
  45. package/dist/__tests__/memory-graph-tools.test.js.map +1 -0
  46. package/dist/__tests__/registry-dispatch.test.d.ts +11 -0
  47. package/dist/__tests__/registry-dispatch.test.d.ts.map +1 -0
  48. package/dist/__tests__/registry-dispatch.test.js +30 -0
  49. package/dist/__tests__/registry-dispatch.test.js.map +1 -0
  50. package/dist/__tests__/registry-listing-parity.test.d.ts +2 -0
  51. package/dist/__tests__/registry-listing-parity.test.d.ts.map +1 -0
  52. package/dist/__tests__/registry-listing-parity.test.js +89 -0
  53. package/dist/__tests__/registry-listing-parity.test.js.map +1 -0
  54. package/dist/__tests__/role-cap.test.d.ts +2 -0
  55. package/dist/__tests__/role-cap.test.d.ts.map +1 -0
  56. package/dist/__tests__/role-cap.test.js +113 -0
  57. package/dist/__tests__/role-cap.test.js.map +1 -0
  58. package/dist/__tests__/schedule-tools.test.d.ts +8 -0
  59. package/dist/__tests__/schedule-tools.test.d.ts.map +1 -0
  60. package/dist/__tests__/schedule-tools.test.js +285 -0
  61. package/dist/__tests__/schedule-tools.test.js.map +1 -0
  62. package/dist/__tests__/server-gateway-key.test.d.ts +18 -0
  63. package/dist/__tests__/server-gateway-key.test.d.ts.map +1 -0
  64. package/dist/__tests__/server-gateway-key.test.js +148 -0
  65. package/dist/__tests__/server-gateway-key.test.js.map +1 -0
  66. package/dist/__tests__/server-user-scoped.test.d.ts +34 -0
  67. package/dist/__tests__/server-user-scoped.test.d.ts.map +1 -0
  68. package/dist/__tests__/server-user-scoped.test.js +577 -0
  69. package/dist/__tests__/server-user-scoped.test.js.map +1 -0
  70. package/dist/__tests__/task-id-pattern.test.d.ts +12 -0
  71. package/dist/__tests__/task-id-pattern.test.d.ts.map +1 -0
  72. package/dist/__tests__/task-id-pattern.test.js +43 -0
  73. package/dist/__tests__/task-id-pattern.test.js.map +1 -0
  74. package/dist/__tests__/tiers.test.d.ts +7 -0
  75. package/dist/__tests__/tiers.test.d.ts.map +1 -0
  76. package/dist/__tests__/tiers.test.js +199 -0
  77. package/dist/__tests__/tiers.test.js.map +1 -0
  78. package/dist/__tests__/tools/hosted-agents.test.d.ts +9 -0
  79. package/dist/__tests__/tools/hosted-agents.test.d.ts.map +1 -0
  80. package/dist/__tests__/tools/hosted-agents.test.js +301 -0
  81. package/dist/__tests__/tools/hosted-agents.test.js.map +1 -0
  82. package/dist/__tests__/tools/llm-providers.test.d.ts +10 -0
  83. package/dist/__tests__/tools/llm-providers.test.d.ts.map +1 -0
  84. package/dist/__tests__/tools/llm-providers.test.js +105 -0
  85. package/dist/__tests__/tools/llm-providers.test.js.map +1 -0
  86. package/dist/__tests__/tools/services.test.js +139 -98
  87. package/dist/__tests__/tools/services.test.js.map +1 -1
  88. package/dist/__tests__/tools.test.d.ts +7 -0
  89. package/dist/__tests__/tools.test.d.ts.map +1 -0
  90. package/dist/__tests__/tools.test.js +152 -0
  91. package/dist/__tests__/tools.test.js.map +1 -0
  92. package/dist/__tests__/transport.test.d.ts +7 -0
  93. package/dist/__tests__/transport.test.d.ts.map +1 -0
  94. package/dist/__tests__/transport.test.js +397 -0
  95. package/dist/__tests__/transport.test.js.map +1 -0
  96. package/dist/__tests__/validate-credentials.test.d.ts +9 -0
  97. package/dist/__tests__/validate-credentials.test.d.ts.map +1 -0
  98. package/dist/__tests__/validate-credentials.test.js +172 -0
  99. package/dist/__tests__/validate-credentials.test.js.map +1 -0
  100. package/dist/__tests__/web-eval-tools.test.d.ts +8 -0
  101. package/dist/__tests__/web-eval-tools.test.d.ts.map +1 -0
  102. package/dist/__tests__/web-eval-tools.test.js +241 -0
  103. package/dist/__tests__/web-eval-tools.test.js.map +1 -0
  104. package/dist/__tests__/whoami.test.d.ts +11 -0
  105. package/dist/__tests__/whoami.test.d.ts.map +1 -0
  106. package/dist/__tests__/whoami.test.js +194 -0
  107. package/dist/__tests__/whoami.test.js.map +1 -0
  108. package/dist/__tests__/workflow-tools.test.d.ts +8 -0
  109. package/dist/__tests__/workflow-tools.test.d.ts.map +1 -0
  110. package/dist/__tests__/workflow-tools.test.js +261 -0
  111. package/dist/__tests__/workflow-tools.test.js.map +1 -0
  112. package/dist/__tests__/workloads.test.d.ts +9 -0
  113. package/dist/__tests__/workloads.test.d.ts.map +1 -0
  114. package/dist/__tests__/workloads.test.js +169 -0
  115. package/dist/__tests__/workloads.test.js.map +1 -0
  116. package/dist/auth/oauth-provider.d.ts +34 -0
  117. package/dist/auth/oauth-provider.d.ts.map +1 -0
  118. package/dist/auth/oauth-provider.js +75 -0
  119. package/dist/auth/oauth-provider.js.map +1 -0
  120. package/dist/auth/token-verifier.d.ts +45 -0
  121. package/dist/auth/token-verifier.d.ts.map +1 -0
  122. package/dist/auth/token-verifier.js +160 -0
  123. package/dist/auth/token-verifier.js.map +1 -0
  124. package/dist/connectors/claude-desktop.d.ts.map +1 -1
  125. package/dist/connectors/claude-desktop.js +3 -2
  126. package/dist/connectors/claude-desktop.js.map +1 -1
  127. package/dist/connectors/cursor.d.ts.map +1 -1
  128. package/dist/connectors/cursor.js +3 -2
  129. package/dist/connectors/cursor.js.map +1 -1
  130. package/dist/connectors/setup.d.ts.map +1 -1
  131. package/dist/connectors/setup.js +2 -1
  132. package/dist/connectors/setup.js.map +1 -1
  133. package/dist/connectors/vscode.d.ts.map +1 -1
  134. package/dist/connectors/vscode.js +3 -2
  135. package/dist/connectors/vscode.js.map +1 -1
  136. package/dist/connectors/windsurf.d.ts.map +1 -1
  137. package/dist/connectors/windsurf.js +3 -2
  138. package/dist/connectors/windsurf.js.map +1 -1
  139. package/dist/doctor.d.ts +34 -0
  140. package/dist/doctor.d.ts.map +1 -0
  141. package/dist/doctor.js +134 -0
  142. package/dist/doctor.js.map +1 -0
  143. package/dist/http-server.d.ts +56 -0
  144. package/dist/http-server.d.ts.map +1 -0
  145. package/dist/http-server.js +455 -0
  146. package/dist/http-server.js.map +1 -0
  147. package/dist/index.d.ts +5 -1
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +96 -171
  150. package/dist/index.js.map +1 -1
  151. package/dist/lib/consts.d.ts +21 -0
  152. package/dist/lib/consts.d.ts.map +1 -0
  153. package/dist/lib/consts.js +30 -0
  154. package/dist/lib/consts.js.map +1 -0
  155. package/dist/lib/dobby-client.d.ts +60 -3
  156. package/dist/lib/dobby-client.d.ts.map +1 -1
  157. package/dist/lib/dobby-client.js +145 -44
  158. package/dist/lib/dobby-client.js.map +1 -1
  159. package/dist/lib/gateway-key-resolver.d.ts +38 -0
  160. package/dist/lib/gateway-key-resolver.d.ts.map +1 -0
  161. package/dist/lib/gateway-key-resolver.js +59 -0
  162. package/dist/lib/gateway-key-resolver.js.map +1 -0
  163. package/dist/lib/log.d.ts +25 -0
  164. package/dist/lib/log.d.ts.map +1 -0
  165. package/dist/lib/log.js +36 -0
  166. package/dist/lib/log.js.map +1 -0
  167. package/dist/server.d.ts +175 -0
  168. package/dist/server.d.ts.map +1 -0
  169. package/dist/server.js +1017 -0
  170. package/dist/server.js.map +1 -0
  171. package/dist/tools/agent-mail.d.ts +112 -0
  172. package/dist/tools/agent-mail.d.ts.map +1 -0
  173. package/dist/tools/agent-mail.js +118 -0
  174. package/dist/tools/agent-mail.js.map +1 -0
  175. package/dist/tools/agent-versions.d.ts +93 -0
  176. package/dist/tools/agent-versions.d.ts.map +1 -0
  177. package/dist/tools/agent-versions.js +99 -0
  178. package/dist/tools/agent-versions.js.map +1 -0
  179. package/dist/tools/approvals.d.ts +24 -34
  180. package/dist/tools/approvals.d.ts.map +1 -1
  181. package/dist/tools/approvals.js +24 -81
  182. package/dist/tools/approvals.js.map +1 -1
  183. package/dist/tools/claude-code-sync.d.ts +40 -0
  184. package/dist/tools/claude-code-sync.d.ts.map +1 -0
  185. package/dist/tools/claude-code-sync.js +52 -0
  186. package/dist/tools/claude-code-sync.js.map +1 -0
  187. package/dist/tools/control-plane.d.ts +118 -0
  188. package/dist/tools/control-plane.d.ts.map +1 -0
  189. package/dist/tools/control-plane.js +135 -0
  190. package/dist/tools/control-plane.js.map +1 -0
  191. package/dist/tools/crew-builder.d.ts +24 -66
  192. package/dist/tools/crew-builder.d.ts.map +1 -1
  193. package/dist/tools/crew-builder.js +24 -185
  194. package/dist/tools/crew-builder.js.map +1 -1
  195. package/dist/tools/crewai.d.ts +24 -63
  196. package/dist/tools/crewai.d.ts.map +1 -1
  197. package/dist/tools/crewai.js +24 -145
  198. package/dist/tools/crewai.js.map +1 -1
  199. package/dist/tools/exa.d.ts +126 -0
  200. package/dist/tools/exa.d.ts.map +1 -0
  201. package/dist/tools/exa.js +125 -0
  202. package/dist/tools/exa.js.map +1 -0
  203. package/dist/tools/external-agents.d.ts +440 -0
  204. package/dist/tools/external-agents.d.ts.map +1 -0
  205. package/dist/tools/external-agents.js +386 -0
  206. package/dist/tools/external-agents.js.map +1 -0
  207. package/dist/tools/github-mcp.d.ts +228 -0
  208. package/dist/tools/github-mcp.d.ts.map +1 -0
  209. package/dist/tools/github-mcp.js +235 -0
  210. package/dist/tools/github-mcp.js.map +1 -0
  211. package/dist/tools/governance.d.ts +273 -0
  212. package/dist/tools/governance.d.ts.map +1 -0
  213. package/dist/tools/governance.js +286 -0
  214. package/dist/tools/governance.js.map +1 -0
  215. package/dist/tools/hosted-agents.d.ts +216 -0
  216. package/dist/tools/hosted-agents.d.ts.map +1 -0
  217. package/dist/tools/hosted-agents.js +214 -0
  218. package/dist/tools/hosted-agents.js.map +1 -0
  219. package/dist/tools/index.d.ts +6335 -191
  220. package/dist/tools/index.d.ts.map +1 -1
  221. package/dist/tools/index.js +441 -172
  222. package/dist/tools/index.js.map +1 -1
  223. package/dist/tools/jira.d.ts +60 -176
  224. package/dist/tools/jira.d.ts.map +1 -1
  225. package/dist/tools/jira.js +60 -365
  226. package/dist/tools/jira.js.map +1 -1
  227. package/dist/tools/llm-providers.d.ts +50 -0
  228. package/dist/tools/llm-providers.d.ts.map +1 -0
  229. package/dist/tools/llm-providers.js +41 -0
  230. package/dist/tools/llm-providers.js.map +1 -0
  231. package/dist/tools/mcp-metrics.d.ts +47 -0
  232. package/dist/tools/mcp-metrics.d.ts.map +1 -0
  233. package/dist/tools/mcp-metrics.js +53 -0
  234. package/dist/tools/mcp-metrics.js.map +1 -0
  235. package/dist/tools/mcp-tools.d.ts +12 -29
  236. package/dist/tools/mcp-tools.d.ts.map +1 -1
  237. package/dist/tools/mcp-tools.js +12 -131
  238. package/dist/tools/mcp-tools.js.map +1 -1
  239. package/dist/tools/mem0.d.ts +127 -0
  240. package/dist/tools/mem0.d.ts.map +1 -0
  241. package/dist/tools/mem0.js +155 -0
  242. package/dist/tools/mem0.js.map +1 -0
  243. package/dist/tools/memory-graph.d.ts +151 -0
  244. package/dist/tools/memory-graph.d.ts.map +1 -0
  245. package/dist/tools/memory-graph.js +159 -0
  246. package/dist/tools/memory-graph.js.map +1 -0
  247. package/dist/tools/memory-stores.d.ts +141 -0
  248. package/dist/tools/memory-stores.d.ts.map +1 -0
  249. package/dist/tools/memory-stores.js +147 -0
  250. package/dist/tools/memory-stores.js.map +1 -0
  251. package/dist/tools/messages.d.ts +12 -20
  252. package/dist/tools/messages.d.ts.map +1 -1
  253. package/dist/tools/messages.js +12 -49
  254. package/dist/tools/messages.js.map +1 -1
  255. package/dist/tools/moltbook.d.ts +328 -0
  256. package/dist/tools/moltbook.d.ts.map +1 -0
  257. package/dist/tools/moltbook.js +334 -0
  258. package/dist/tools/moltbook.js.map +1 -0
  259. package/dist/tools/monitoring-attribution.d.ts +71 -0
  260. package/dist/tools/monitoring-attribution.d.ts.map +1 -0
  261. package/dist/tools/monitoring-attribution.js +74 -0
  262. package/dist/tools/monitoring-attribution.js.map +1 -0
  263. package/dist/tools/ops.d.ts +139 -0
  264. package/dist/tools/ops.d.ts.map +1 -0
  265. package/dist/tools/ops.js +151 -0
  266. package/dist/tools/ops.js.map +1 -0
  267. package/dist/tools/orchestrations.d.ts +109 -0
  268. package/dist/tools/orchestrations.d.ts.map +1 -0
  269. package/dist/tools/orchestrations.js +115 -0
  270. package/dist/tools/orchestrations.js.map +1 -0
  271. package/dist/tools/outcomes.d.ts +138 -0
  272. package/dist/tools/outcomes.d.ts.map +1 -0
  273. package/dist/tools/outcomes.js +136 -0
  274. package/dist/tools/outcomes.js.map +1 -0
  275. package/dist/tools/schedules.d.ts +149 -0
  276. package/dist/tools/schedules.d.ts.map +1 -0
  277. package/dist/tools/schedules.js +155 -0
  278. package/dist/tools/schedules.js.map +1 -0
  279. package/dist/tools/services.d.ts +6 -16
  280. package/dist/tools/services.d.ts.map +1 -1
  281. package/dist/tools/services.js +6 -135
  282. package/dist/tools/services.js.map +1 -1
  283. package/dist/tools/sessions.d.ts +124 -0
  284. package/dist/tools/sessions.d.ts.map +1 -0
  285. package/dist/tools/sessions.js +130 -0
  286. package/dist/tools/sessions.js.map +1 -0
  287. package/dist/tools/setup-status.d.ts +29 -0
  288. package/dist/tools/setup-status.d.ts.map +1 -0
  289. package/dist/tools/setup-status.js +35 -0
  290. package/dist/tools/setup-status.js.map +1 -0
  291. package/dist/tools/tasks.d.ts +44 -56
  292. package/dist/tools/tasks.d.ts.map +1 -1
  293. package/dist/tools/tasks.js +48 -212
  294. package/dist/tools/tasks.js.map +1 -1
  295. package/dist/tools/tiers.d.ts +55 -0
  296. package/dist/tools/tiers.d.ts.map +1 -0
  297. package/dist/tools/tiers.js +239 -0
  298. package/dist/tools/tiers.js.map +1 -0
  299. package/dist/tools/unified-agents.d.ts +43 -0
  300. package/dist/tools/unified-agents.d.ts.map +1 -0
  301. package/dist/tools/unified-agents.js +46 -0
  302. package/dist/tools/unified-agents.js.map +1 -0
  303. package/dist/tools/web-eval.d.ts +129 -0
  304. package/dist/tools/web-eval.d.ts.map +1 -0
  305. package/dist/tools/web-eval.js +136 -0
  306. package/dist/tools/web-eval.js.map +1 -0
  307. package/dist/tools/workflow.d.ts +105 -0
  308. package/dist/tools/workflow.d.ts.map +1 -0
  309. package/dist/tools/workflow.js +111 -0
  310. package/dist/tools/workflow.js.map +1 -0
  311. package/dist/tools/workloads.d.ts +81 -0
  312. package/dist/tools/workloads.d.ts.map +1 -0
  313. package/dist/tools/workloads.js +81 -0
  314. package/dist/tools/workloads.js.map +1 -0
  315. package/package.json +13 -7
@@ -0,0 +1,577 @@
1
+ /**
2
+ * Server HTTP-mode User-Scoped PAT Routing Tests (ADR-020 W1b/W1c/W2)
3
+ *
4
+ * A user-scoped PAT (`dobby_pat_*`) carries NO tenant/org pin — the introspect
5
+ * endpoint returns `user_scoped: true` with `tenant_id: null` / `org_id: null`
6
+ * and the AGGREGATE (max) role. The CallTool handler must therefore resolve the
7
+ * per-call target from the tool ARGUMENTS, not from the token:
8
+ *
9
+ * - ORG_CLIENT_TOOLS (memory_store_*, rubric_*, orchestration_config_list) →
10
+ * require an `org_id` arg, which becomes client.organizationId + ctx.orgId;
11
+ * tenantId stays undefined. Missing → helpful error, handleToolCall NOT run.
12
+ * - ORG_ARG_TOOLS (export_policies, validate_policies, apply_guardrail,
13
+ * import_policies) → carry their own `organization_id`; the branch must NOT
14
+ * demand a tenant_id.
15
+ * - everything else is tenant-scoped → require a `tenant_id` arg → ctx.tenantId,
16
+ * plus a per-TENANT-memoized gk_tmp_ provider on the client. Missing → error.
17
+ * - ListTools for a user-scoped session appends the two synthetic discovery
18
+ * tools (list_my_tenants + list_my_orgs); a tenant-pinned session gets neither.
19
+ *
20
+ * Drives the REAL server factory (server.ts) over real Streamable HTTP with a
21
+ * stub introspection issuer — only tools/index.handleToolCall is spied, so we
22
+ * inspect the exact ToolContext the handler built, and we also return the parsed
23
+ * tools/call JSON-RPC result so the "missing arg" branches can assert isError.
24
+ *
25
+ * Fixture note — `tenant_role: 'tenant_owner'` (NOT the plain `'owner'` shown in
26
+ * the ADR-020 ticket example): introspection emits roles in the capability-core
27
+ * vocabulary (web `aggregate-roles.ts` maps DB `owner` → `tenant_owner`), and the
28
+ * MCP role-cap (capability-core `roleCapAllows`) only recognizes `tenant_owner`
29
+ * — `'owner'` is an unknown role and fails the cap (verified), which would make
30
+ * every call hit a role denial before handleToolCall. `tenant_owner` is the real
31
+ * in-band value and satisfies the spec's intent (calls reach handleToolCall).
32
+ */
33
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
34
+ const { handleToolCallSpy } = vi.hoisted(() => ({
35
+ handleToolCallSpy: vi.fn(),
36
+ }));
37
+ vi.mock('../tools/index.js', async (importOriginal) => {
38
+ const actual = await importOriginal();
39
+ return {
40
+ ...actual,
41
+ handleToolCall: handleToolCallSpy,
42
+ };
43
+ });
44
+ /** Streamable HTTP responses may arrive as SSE — take the last data line. */
45
+ function parseRpc(text) {
46
+ const dataLines = text
47
+ .split('\n')
48
+ .filter((line) => line.startsWith('data: '));
49
+ if (dataLines.length > 0) {
50
+ return JSON.parse(dataLines[dataLines.length - 1].slice(6));
51
+ }
52
+ return JSON.parse(text);
53
+ }
54
+ /** The user-scoped introspection payload (ADR-020): no tenant/org pin, aggregate role. */
55
+ function userScopedIntrospect() {
56
+ return {
57
+ active: true,
58
+ user_id: 'pu_x',
59
+ user_scoped: true,
60
+ tenant_id: null,
61
+ org_id: null,
62
+ tenant_role: 'tenant_owner',
63
+ org_role: 'org_owner',
64
+ scope: 'mcp:*',
65
+ client_id: 'key_x',
66
+ exp: Math.floor(Date.now() / 1000) + 3600,
67
+ };
68
+ }
69
+ /**
70
+ * Spin up a stub issuer + the real HTTP server, run initialize → tools/call with
71
+ * the given bearer + tool + args, and return BOTH the captured ToolContext (or
72
+ * null) and the parsed JSON-RPC result.
73
+ */
74
+ async function callToolOverHttp(opts) {
75
+ const express = (await import('express')).default;
76
+ const { startHttpServer } = await import('../http-server.js');
77
+ const { createServer } = await import('../server.js');
78
+ const introspectBody = opts.introspect ?? userScopedIntrospect();
79
+ const issuer = express();
80
+ issuer.use(express.json());
81
+ issuer.post('/oauth/token/introspect', (_req, res) => {
82
+ res.json(introspectBody);
83
+ });
84
+ const issuerServer = issuer.listen(0);
85
+ const issuerPort = issuerServer.address().port;
86
+ const { server, tokenVerifier } = await startHttpServer({
87
+ port: 0,
88
+ issuerUrl: `http://127.0.0.1:${issuerPort}`,
89
+ mcpPublicUrl: 'http://127.0.0.1:0',
90
+ createMcpServer: () => createServer({ mode: 'http' }),
91
+ });
92
+ const mcpPort = server.address().port;
93
+ const mcpUrl = `http://127.0.0.1:${mcpPort}/mcp`;
94
+ const headers = {
95
+ Authorization: `Bearer ${opts.bearer}`,
96
+ 'Content-Type': 'application/json',
97
+ Accept: 'application/json, text/event-stream',
98
+ };
99
+ let result;
100
+ try {
101
+ const initRes = await fetch(mcpUrl, {
102
+ method: 'POST',
103
+ headers,
104
+ body: JSON.stringify({
105
+ jsonrpc: '2.0',
106
+ id: 1,
107
+ method: 'initialize',
108
+ params: {
109
+ protocolVersion: '2025-03-26',
110
+ capabilities: {},
111
+ clientInfo: { name: 'user-scoped-probe', version: '0' },
112
+ },
113
+ }),
114
+ });
115
+ expect(initRes.status).toBe(200);
116
+ const sessionId = initRes.headers.get('mcp-session-id');
117
+ const callRes = await fetch(mcpUrl, {
118
+ method: 'POST',
119
+ headers: { ...headers, 'Mcp-Session-Id': sessionId },
120
+ body: JSON.stringify({
121
+ jsonrpc: '2.0',
122
+ id: 2,
123
+ method: 'tools/call',
124
+ params: { name: opts.toolName, arguments: opts.args },
125
+ }),
126
+ });
127
+ expect(callRes.status).toBe(200);
128
+ result = parseRpc(await callRes.text());
129
+ }
130
+ finally {
131
+ tokenVerifier.clearCache();
132
+ server.close();
133
+ issuerServer.close();
134
+ }
135
+ const context = handleToolCallSpy.mock.calls.length > 0
136
+ ? handleToolCallSpy.mock.calls[0][2]
137
+ : null;
138
+ return { context, result };
139
+ }
140
+ /**
141
+ * Spin up a stub issuer + the real HTTP server, run initialize → tools/list with
142
+ * the given bearer, and return the list of tool names the server served.
143
+ */
144
+ async function listToolsOverHttp(opts) {
145
+ const express = (await import('express')).default;
146
+ const { startHttpServer } = await import('../http-server.js');
147
+ const { createServer } = await import('../server.js');
148
+ const issuer = express();
149
+ issuer.use(express.json());
150
+ issuer.post('/oauth/token/introspect', (_req, res) => {
151
+ res.json(opts.introspect);
152
+ });
153
+ const issuerServer = issuer.listen(0);
154
+ const issuerPort = issuerServer.address().port;
155
+ const { server, tokenVerifier } = await startHttpServer({
156
+ port: 0,
157
+ issuerUrl: `http://127.0.0.1:${issuerPort}`,
158
+ mcpPublicUrl: 'http://127.0.0.1:0',
159
+ createMcpServer: () => createServer({ mode: 'http' }),
160
+ });
161
+ const mcpPort = server.address().port;
162
+ const mcpUrl = `http://127.0.0.1:${mcpPort}/mcp`;
163
+ const headers = {
164
+ Authorization: `Bearer ${opts.bearer}`,
165
+ 'Content-Type': 'application/json',
166
+ Accept: 'application/json, text/event-stream',
167
+ };
168
+ try {
169
+ const initRes = await fetch(mcpUrl, {
170
+ method: 'POST',
171
+ headers,
172
+ body: JSON.stringify({
173
+ jsonrpc: '2.0',
174
+ id: 1,
175
+ method: 'initialize',
176
+ params: {
177
+ protocolVersion: '2025-03-26',
178
+ capabilities: {},
179
+ clientInfo: { name: 'user-scoped-list-probe', version: '0' },
180
+ },
181
+ }),
182
+ });
183
+ expect(initRes.status).toBe(200);
184
+ const sessionId = initRes.headers.get('mcp-session-id');
185
+ const listRes = await fetch(mcpUrl, {
186
+ method: 'POST',
187
+ headers: { ...headers, 'Mcp-Session-Id': sessionId },
188
+ body: JSON.stringify({
189
+ jsonrpc: '2.0',
190
+ id: 2,
191
+ method: 'tools/list',
192
+ params: {},
193
+ }),
194
+ });
195
+ expect(listRes.status).toBe(200);
196
+ const data = parseRpc(await listRes.text());
197
+ return data.result.tools.map((t) => t.name);
198
+ }
199
+ finally {
200
+ tokenVerifier.clearCache();
201
+ server.close();
202
+ issuerServer.close();
203
+ }
204
+ }
205
+ // The tenant set the stubbed /api/v1/me/tenants returns. Default is TWO tenants
206
+ // so the single-tenant auto-select (resolveSoleTenant) declines (ambiguous) and
207
+ // the existing missing-tenant_id tests still get needs_selection —
208
+ // deterministically, with no real network call. Tests override it per-case.
209
+ let stubTenants = [
210
+ { tenant_id: 'tenant_a' },
211
+ { tenant_id: 'tenant_b' },
212
+ ];
213
+ const realFetch = globalThis.fetch.bind(globalThis);
214
+ describe('CallTool handler — user-scoped PAT routing (ADR-020, HTTP mode)', () => {
215
+ beforeEach(() => {
216
+ handleToolCallSpy.mockReset().mockResolvedValue({
217
+ content: [{ type: 'text', text: 'ok' }],
218
+ });
219
+ stubTenants = [{ tenant_id: 'tenant_a' }, { tenant_id: 'tenant_b' }];
220
+ // Intercept ONLY the user-scoped tenant lookup; pass the in-process MCP
221
+ // round-trip (127.0.0.1/mcp) through to the real fetch.
222
+ vi.stubGlobal('fetch', (url, init) => {
223
+ if (String(url).includes('/api/v1/me/tenants')) {
224
+ return Promise.resolve({
225
+ ok: true,
226
+ json: () => Promise.resolve({ tenants: stubTenants }),
227
+ });
228
+ }
229
+ return realFetch(url, init);
230
+ });
231
+ });
232
+ afterEach(() => {
233
+ vi.unstubAllGlobals();
234
+ vi.unstubAllEnvs();
235
+ });
236
+ it('org-scoped tool sets client.organizationId from the org_id arg (tenantId undefined)', async () => {
237
+ const { context } = await callToolOverHttp({
238
+ bearer: 'dobby_pat_test',
239
+ toolName: 'memory_store_list',
240
+ args: { org_id: 'org_abc' },
241
+ });
242
+ expect(handleToolCallSpy).toHaveBeenCalledTimes(1);
243
+ expect(context).not.toBeNull();
244
+ expect(context.client.organizationId).toBe('org_abc');
245
+ expect(context.tenantId).toBeUndefined();
246
+ expect(context.orgId).toBe('org_abc');
247
+ });
248
+ it('org-scoped tool missing org_id → helpful error naming org_id + list_my_orgs, handler NOT called', async () => {
249
+ const { context, result } = await callToolOverHttp({
250
+ bearer: 'dobby_pat_test',
251
+ toolName: 'memory_store_list',
252
+ args: {},
253
+ });
254
+ expect(handleToolCallSpy).not.toHaveBeenCalled();
255
+ expect(context).toBeNull();
256
+ expect(result.result.isError).toBe(true);
257
+ const text = result.result.content[0].text;
258
+ expect(text).toContain('org_id');
259
+ expect(text).toContain('list_my_orgs');
260
+ });
261
+ it('governance tool with its own organization_id does NOT require a tenant_id', async () => {
262
+ const { context } = await callToolOverHttp({
263
+ bearer: 'dobby_pat_test',
264
+ toolName: 'export_policies',
265
+ args: { organization_id: 'org_abc' },
266
+ });
267
+ // The ORG_ARG_TOOLS branch must not reject for a missing tenant_id.
268
+ expect(handleToolCallSpy).toHaveBeenCalledTimes(1);
269
+ expect(context).not.toBeNull();
270
+ });
271
+ // ADR-020 / ops-tools-parity: platform-scoped superadmin ops tools carry no
272
+ // tenant_id/org_id (they hit /api/v1/internal/ops/* server-to-server). A
273
+ // user-scoped connection must NOT be asked for a tenant_id for them — they are
274
+ // in PLATFORM_TOOLS. The RBAC gate runs first, so the introspect must carry
275
+ // is_super_admin:true (else the superAdminOnly gate rejects before resolution).
276
+ it('platform ops tool (superadmin) does NOT require a tenant_id', async () => {
277
+ const { context, result } = await callToolOverHttp({
278
+ bearer: 'dobby_pat_test',
279
+ toolName: 'get_ops_health_summary',
280
+ args: {},
281
+ introspect: { ...userScopedIntrospect(), is_super_admin: true },
282
+ });
283
+ // PLATFORM_TOOLS branch: reaches the handler, no "no fixed tenant" rejection.
284
+ expect(handleToolCallSpy).toHaveBeenCalledTimes(1);
285
+ expect(context).not.toBeNull();
286
+ expect(context.tenantId).toBeUndefined();
287
+ // Mock handler result carries no isError (success shape) → not an error.
288
+ expect(result.result.isError).toBeFalsy();
289
+ });
290
+ // Security regression guard: superAdminOnly is enforced at CALL time (not just
291
+ // hidden from ListTools, which is cosmetic). WITHOUT super-admin the ops tool
292
+ // is denied by getToolAccessDenial BEFORE the handler — a non-superadmin can
293
+ // never invoke it by name, even with an enterprise-tier token.
294
+ it('platform ops tool without super-admin is denied at call time, handler NOT called', async () => {
295
+ const { context, result } = await callToolOverHttp({
296
+ bearer: 'dobby_pat_test',
297
+ toolName: 'get_ops_health_summary',
298
+ args: {},
299
+ introspect: userScopedIntrospect(), // is_super_admin unset → false
300
+ });
301
+ expect(handleToolCallSpy).not.toHaveBeenCalled();
302
+ expect(context).toBeNull();
303
+ expect(result.result.isError).toBe(true);
304
+ const text = result.result.content[0].text;
305
+ // A superadmin denial, NOT the "no fixed tenant" tenant-demand message.
306
+ expect(text).toContain('super-admin');
307
+ expect(text).not.toContain('no fixed tenant');
308
+ });
309
+ it('gateway-scoped tool: tenantId from the arg, gatewayKey unset, provider resolves a per-tenant gk_tmp_ via the internal endpoint', async () => {
310
+ const { context } = await callToolOverHttp({
311
+ bearer: 'dobby_pat_test',
312
+ toolName: 'crew_list',
313
+ args: { tenant_id: 'tenant_a' },
314
+ });
315
+ expect(handleToolCallSpy).toHaveBeenCalledTimes(1);
316
+ expect(context).not.toBeNull();
317
+ expect(context.tenantId).toBe('tenant_a');
318
+ // gk_ pre-check key stays unset for a PAT session (the token is not a gk_).
319
+ expect(context.gatewayKey).toBeUndefined();
320
+ // The gateway key is resolved LAZILY — stub the exchange AFTER the HTTP tool
321
+ // call (the harness itself uses fetch for the MCP round-trip), exactly like
322
+ // the dobby_at_ memoized test does.
323
+ vi.stubEnv('INTERNAL_SERVICE_SECRET', 'it-secret');
324
+ const fetchMock = vi.fn().mockResolvedValue({
325
+ ok: true,
326
+ json: () => Promise.resolve({
327
+ success: true,
328
+ data: { gateway_key: 'gk_tmp_a' },
329
+ }),
330
+ });
331
+ vi.stubGlobal('fetch', fetchMock);
332
+ expect(await context.client.gatewayBearer()).toBe('gk_tmp_a');
333
+ expect(fetchMock).toHaveBeenCalledTimes(1);
334
+ const [url] = fetchMock.mock.calls[0];
335
+ expect(String(url)).toContain('/api/v1/internal/mcp/gateway-key');
336
+ });
337
+ // ADR-020 W2: the per-call tenant_id MUST reach the internal minting endpoint
338
+ // in the request body so a PAT (which carries no tenant pin) mints + authorizes
339
+ // for the right tenant. server.ts passes `resolveSessionGatewayKey({ apiUrl,
340
+ // token, tenantId: t })` and the resolver serializes `{ tenant_id }` into the
341
+ // body (gateway-key-resolver.ts) — regression guard for the dropped-tenant bug.
342
+ it('gateway-scoped tool sends the per-call tenant_id in the internal-endpoint body', async () => {
343
+ const { context } = await callToolOverHttp({
344
+ bearer: 'dobby_pat_test',
345
+ toolName: 'crew_list',
346
+ args: { tenant_id: 'tenant_a' },
347
+ });
348
+ expect(context).not.toBeNull();
349
+ vi.stubEnv('INTERNAL_SERVICE_SECRET', 'it-secret');
350
+ const fetchMock = vi.fn().mockResolvedValue({
351
+ ok: true,
352
+ json: () => Promise.resolve({
353
+ success: true,
354
+ data: { gateway_key: 'gk_tmp_a' },
355
+ }),
356
+ });
357
+ vi.stubGlobal('fetch', fetchMock);
358
+ await context.client.gatewayBearer();
359
+ const [, init] = fetchMock.mock.calls[0];
360
+ // The per-call target tenant MUST reach the internal minting endpoint in
361
+ // the request body — this is what currently fails ('{}' has no tenant).
362
+ expect(String(init.body)).toContain('tenant_a');
363
+ });
364
+ it('tenant-scoped tool missing tenant_id → helpful error naming tenant_id + list_my_tenants', async () => {
365
+ const { context, result } = await callToolOverHttp({
366
+ bearer: 'dobby_pat_test',
367
+ toolName: 'create_task',
368
+ args: {},
369
+ });
370
+ expect(handleToolCallSpy).not.toHaveBeenCalled();
371
+ expect(context).toBeNull();
372
+ expect(result.result.isError).toBe(true);
373
+ const text = result.result.content[0].text;
374
+ expect(text).toContain('tenant_id');
375
+ expect(text).toContain('list_my_tenants');
376
+ });
377
+ it('needs_selection is machine-readable JSON — org guard', async () => {
378
+ const { result } = await callToolOverHttp({
379
+ bearer: 'dobby_pat_test',
380
+ toolName: 'memory_store_list',
381
+ args: {},
382
+ });
383
+ expect(result.result.isError).toBe(true);
384
+ const env = JSON.parse(result.result.content[0].text);
385
+ expect(env.status).toBe('needs_selection');
386
+ expect(env.select).toBe('organization');
387
+ expect(env.argument).toBe('org_id');
388
+ expect(env.list_tool).toBe('list_my_orgs');
389
+ expect(typeof env.message).toBe('string');
390
+ });
391
+ it('needs_selection is machine-readable JSON — tenant guard', async () => {
392
+ const { result } = await callToolOverHttp({
393
+ bearer: 'dobby_pat_test',
394
+ toolName: 'create_task',
395
+ args: {},
396
+ });
397
+ expect(result.result.isError).toBe(true);
398
+ const env = JSON.parse(result.result.content[0].text);
399
+ expect(env.status).toBe('needs_selection');
400
+ expect(env.select).toBe('tenant');
401
+ expect(env.argument).toBe('tenant_id');
402
+ expect(env.list_tool).toBe('list_my_tenants');
403
+ });
404
+ // Short-prompt UX: a user with exactly ONE tenant should never be asked which
405
+ // one — the tenant branch auto-selects it via resolveSoleTenant, so a missing
406
+ // tenant_id proceeds to the handler with that tenant instead of needs_selection.
407
+ it('tenant-scoped tool with no tenant_id auto-selects the SOLE tenant', async () => {
408
+ stubTenants = [{ tenant_id: 'tenant_solo' }];
409
+ const { context, result } = await callToolOverHttp({
410
+ bearer: 'dobby_pat_test',
411
+ toolName: 'create_task',
412
+ args: {},
413
+ });
414
+ expect(result.result.isError).toBeFalsy();
415
+ expect(handleToolCallSpy).toHaveBeenCalledTimes(1);
416
+ expect(context).not.toBeNull();
417
+ expect(context.tenantId).toBe('tenant_solo');
418
+ });
419
+ it('resolveSoleTenant: exactly one → id; zero or many → null', async () => {
420
+ const { resolveSoleTenant } = await import('../server.js');
421
+ stubTenants = [{ tenant_id: 'tenant_only' }];
422
+ expect(await resolveSoleTenant('http://api', 'dobby_pat_test')).toBe('tenant_only');
423
+ stubTenants = [];
424
+ expect(await resolveSoleTenant('http://api', 'dobby_pat_test')).toBeNull();
425
+ stubTenants = [{ tenant_id: 'a' }, { tenant_id: 'b' }];
426
+ expect(await resolveSoleTenant('http://api', 'dobby_pat_test')).toBeNull();
427
+ });
428
+ it('needs_pat is a machine-readable JSON envelope naming the env var + prefix', async () => {
429
+ const { needsPatResult } = await import('../server.js');
430
+ const res = needsPatResult('list the tenants you can act in', '401 body');
431
+ expect(res.isError).toBe(true);
432
+ const env = JSON.parse(res.content[0].text);
433
+ expect(env.status).toBe('needs_pat');
434
+ expect(env.token_prefix).toBe('dobby_pat_');
435
+ expect(env.env_var).toBe('DOBBY_API_KEY');
436
+ expect(env.unlocks).toContain('tenants');
437
+ expect(env.message).toContain('dobby_pat_');
438
+ });
439
+ });
440
+ describe('ListTools — synthetic discovery tools by session shape (HTTP mode)', () => {
441
+ it('a user-scoped session gets both list_my_tenants AND list_my_orgs', async () => {
442
+ const names = await listToolsOverHttp({
443
+ bearer: 'dobby_pat_test',
444
+ introspect: userScopedIntrospect(),
445
+ });
446
+ expect(names).toContain('list_my_tenants');
447
+ expect(names).toContain('list_my_orgs');
448
+ });
449
+ it('a tenant-pinned (non-user-scoped) session gets NEITHER discovery tool', async () => {
450
+ const names = await listToolsOverHttp({
451
+ bearer: 'dobby_at_test',
452
+ introspect: {
453
+ active: true,
454
+ user_id: 'pu_pinned',
455
+ // no user_scoped flag — a normal tenant-pinned OAuth session
456
+ tenant_id: 'tenant_pinned',
457
+ org_id: 'org_pinned',
458
+ tenant_role: 'tenant_owner',
459
+ org_role: 'org_owner',
460
+ scope: 'mcp:*',
461
+ client_id: 'key_pinned',
462
+ exp: Math.floor(Date.now() / 1000) + 3600,
463
+ },
464
+ });
465
+ expect(names).not.toContain('list_my_tenants');
466
+ expect(names).not.toContain('list_my_orgs');
467
+ });
468
+ });
469
+ describe('whoami — identity echo over HTTP (both session shapes)', () => {
470
+ it('a user-scoped session lists whoami AND it returns the http/user-scoped identity', async () => {
471
+ const names = await listToolsOverHttp({
472
+ bearer: 'dobby_pat_test',
473
+ introspect: userScopedIntrospect(),
474
+ });
475
+ expect(names).toContain('whoami');
476
+ const { result } = await callToolOverHttp({
477
+ bearer: 'dobby_pat_test',
478
+ toolName: 'whoami',
479
+ args: {},
480
+ introspect: userScopedIntrospect(),
481
+ });
482
+ expect(result.result.isError).toBe(false);
483
+ const text = result.result.content[0].text;
484
+ expect(text).toContain('transport: http');
485
+ expect(text).toContain('user_scoped: true');
486
+ // no tenant pin → whoami should prompt for a per-call tenant_id
487
+ expect(text).toContain('tenant_id');
488
+ expect(text).toContain('list_my_tenants');
489
+ });
490
+ it('a tenant-pinned session lists whoami AND it resolves the pinned tenant/org', async () => {
491
+ const pinned = {
492
+ active: true,
493
+ user_id: 'pu_pinned',
494
+ tenant_id: 'tenant_pinned',
495
+ org_id: 'org_pinned',
496
+ tenant_role: 'tenant_owner',
497
+ org_role: 'org_owner',
498
+ scope: 'mcp:*',
499
+ client_id: 'key_pinned',
500
+ exp: Math.floor(Date.now() / 1000) + 3600,
501
+ };
502
+ const names = await listToolsOverHttp({ bearer: 'dobby_at_test', introspect: pinned });
503
+ expect(names).toContain('whoami');
504
+ const { result } = await callToolOverHttp({
505
+ bearer: 'dobby_at_test',
506
+ toolName: 'whoami',
507
+ args: {},
508
+ introspect: pinned,
509
+ });
510
+ expect(result.result.isError).toBe(false);
511
+ const text = result.result.content[0].text;
512
+ expect(text).toContain('tenant_id: tenant_pinned');
513
+ expect(text).toContain('organization_id: org_pinned');
514
+ expect(text).toContain('user_scoped: false');
515
+ });
516
+ });
517
+ describe('validate_credentials — over HTTP', () => {
518
+ it('a user-scoped session lists it AND it reports authorized (introspection passed)', async () => {
519
+ const names = await listToolsOverHttp({
520
+ bearer: 'dobby_pat_test',
521
+ introspect: userScopedIntrospect(),
522
+ });
523
+ expect(names).toContain('validate_credentials');
524
+ const { result } = await callToolOverHttp({
525
+ bearer: 'dobby_pat_test',
526
+ toolName: 'validate_credentials',
527
+ args: {},
528
+ introspect: userScopedIntrospect(),
529
+ });
530
+ expect(result.result.isError).toBe(false);
531
+ const text = result.result.content[0].text;
532
+ expect(text).toContain('credential validation');
533
+ expect(text).toContain('"authorized": true');
534
+ // user-scoped without a tenant pin → prompts for tenant_id
535
+ expect(text).toContain('tenant_id');
536
+ });
537
+ });
538
+ describe('CallTool handler — tenant-pinned org context (regression, 2026-07-20)', () => {
539
+ const pinnedIntrospect = {
540
+ active: true,
541
+ user_id: 'pu_pinned',
542
+ tenant_id: 'tenant_pinned',
543
+ org_id: 'org_pinned',
544
+ tenant_role: 'tenant_owner',
545
+ org_role: 'org_owner',
546
+ scope: 'mcp:*',
547
+ client_id: 'key_pinned',
548
+ exp: Math.floor(Date.now() / 1000) + 3600,
549
+ };
550
+ beforeEach(() => {
551
+ handleToolCallSpy.mockReset().mockResolvedValue({
552
+ content: [{ type: 'text', text: 'ok' }],
553
+ });
554
+ });
555
+ // Regression: a tenant-pinned OAuth (dobby_at_) / sk_live_ session carries
556
+ // org_id in the token, but the per-request client used to be built WITHOUT
557
+ // organizationId (only the user-scoped PAT branch set it from an arg). So
558
+ // ORG-scoped tools (memory_store_*, rubric_*, orchestration_config_list) —
559
+ // which read client.organizationId — returned "No organization context" for
560
+ // every OAuth/sk_live_ session even though whoami showed the org (customer
561
+ // hit 2026-07-20). The pinned branch must copy tokenExtra.org_id onto the
562
+ // client. handleToolCall is spied, so we assert on the ToolContext it built.
563
+ it('org-scoped tool gets client.organizationId from the pinned token org_id', async () => {
564
+ const { context } = await callToolOverHttp({
565
+ bearer: 'dobby_at_test',
566
+ toolName: 'memory_store_list',
567
+ args: {},
568
+ introspect: pinnedIntrospect,
569
+ });
570
+ expect(handleToolCallSpy).toHaveBeenCalledTimes(1);
571
+ expect(context).not.toBeNull();
572
+ expect(context.client.organizationId).toBe('org_pinned');
573
+ expect(context.tenantId).toBe('tenant_pinned');
574
+ expect(context.orgId).toBe('org_pinned');
575
+ });
576
+ });
577
+ //# sourceMappingURL=server-user-scoped.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-user-scoped.test.js","sourceRoot":"","sources":["../../src/__tests__/server-user-scoped.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Regression: the task-id input pattern must accept every id the platform
3
+ * actually issues, not just the `task_` shape.
4
+ *
5
+ * The MCP create_task tool posts to /api/dobby/tasks, which generates ids like
6
+ * `task-1784122598603-vjtbfh` (a HYPHEN after "task"). The old input pattern
7
+ * `^task_[a-zA-Z0-9_-]+$` required an UNDERSCORE, so an id returned by
8
+ * create_task failed schema validation on cancel_task / get_task / update_task /
9
+ * get_task_timeline — a task created via MCP could not be acted on via MCP.
10
+ */
11
+ export {};
12
+ //# sourceMappingURL=task-id-pattern.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-id-pattern.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/task-id-pattern.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}