@bastani/atomic 0.9.25-alpha.2 → 0.9.25-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/builtin/intercom/package.json +2 -2
  3. package/dist/builtin/mcp/CHANGELOG.md +43 -0
  4. package/dist/builtin/mcp/OAUTH.md +59 -269
  5. package/dist/builtin/mcp/README.md +58 -345
  6. package/dist/builtin/mcp/index.bundle.mjs +4 -27792
  7. package/dist/builtin/mcp/native-client-licenses/LICENSES/modelcontextprotocol-typescript-sdk.txt +21 -0
  8. package/dist/builtin/mcp/native-client-licenses/NOTICE +30 -0
  9. package/dist/builtin/mcp/package.json +4 -25
  10. package/dist/builtin/subagents/package.json +3 -3
  11. package/dist/builtin/web-access/package.json +2 -2
  12. package/dist/builtin/workflows/CHANGELOG.md +12 -0
  13. package/dist/builtin/workflows/builtin/{chunk-e1254zvd.js → chunk-kfsnh3w7.js} +40 -12
  14. package/dist/builtin/workflows/builtin/{chunk-cpw5gtzg.js → chunk-rqmasd3d.js} +1 -1
  15. package/dist/builtin/workflows/builtin/{chunk-qy6g0baf.js → chunk-wz783pvd.js} +1 -1
  16. package/dist/builtin/workflows/builtin/goal.js +2 -2
  17. package/dist/builtin/workflows/builtin/index.js +3 -3
  18. package/dist/builtin/workflows/builtin/ralph.js +2 -2
  19. package/dist/builtin/workflows/package.json +2 -2
  20. package/dist/builtin/workflows/src/extension/index.bundle.mjs +472 -88
  21. package/dist/builtin/workflows/src/index.js +65 -28
  22. package/dist/cli/args.d.ts.map +1 -1
  23. package/dist/cli/args.js +2 -1
  24. package/dist/cli/args.js.map +1 -1
  25. package/dist/core/agent-session-accessors.d.ts.map +1 -1
  26. package/dist/core/agent-session-accessors.js +7 -0
  27. package/dist/core/agent-session-accessors.js.map +1 -1
  28. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  29. package/dist/core/agent-session-extension-bindings.js +103 -7
  30. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  31. package/dist/core/agent-session-methods.d.ts +7 -1
  32. package/dist/core/agent-session-methods.d.ts.map +1 -1
  33. package/dist/core/agent-session-methods.js.map +1 -1
  34. package/dist/core/agent-session-state.d.ts.map +1 -1
  35. package/dist/core/agent-session-state.js +3 -2
  36. package/dist/core/agent-session-state.js.map +1 -1
  37. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  38. package/dist/core/agent-session-tool-registry.js +6 -3
  39. package/dist/core/agent-session-tool-registry.js.map +1 -1
  40. package/dist/core/agent-session-types.d.ts +1 -0
  41. package/dist/core/agent-session-types.d.ts.map +1 -1
  42. package/dist/core/agent-session-types.js.map +1 -1
  43. package/dist/core/agent-session.d.ts +3 -0
  44. package/dist/core/agent-session.d.ts.map +1 -1
  45. package/dist/core/agent-session.js +6 -0
  46. package/dist/core/agent-session.js.map +1 -1
  47. package/dist/core/extensions/api-types.d.ts +3 -0
  48. package/dist/core/extensions/api-types.d.ts.map +1 -1
  49. package/dist/core/extensions/api-types.js.map +1 -1
  50. package/dist/core/extensions/context-types.d.ts +3 -1
  51. package/dist/core/extensions/context-types.d.ts.map +1 -1
  52. package/dist/core/extensions/context-types.js.map +1 -1
  53. package/dist/core/extensions/index.d.ts +2 -0
  54. package/dist/core/extensions/index.d.ts.map +1 -1
  55. package/dist/core/extensions/index.js +1 -0
  56. package/dist/core/extensions/index.js.map +1 -1
  57. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  58. package/dist/core/extensions/loader-api.js +15 -0
  59. package/dist/core/extensions/loader-api.js.map +1 -1
  60. package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
  61. package/dist/core/extensions/loader-runtime.js +3 -0
  62. package/dist/core/extensions/loader-runtime.js.map +1 -1
  63. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  64. package/dist/core/extensions/loader-virtual-modules.js +3 -0
  65. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  66. package/dist/core/extensions/mcp-server-registry.d.ts.map +1 -1
  67. package/dist/core/extensions/mcp-server-registry.js +4 -0
  68. package/dist/core/extensions/mcp-server-registry.js.map +1 -1
  69. package/dist/core/extensions/runner.d.ts +3 -0
  70. package/dist/core/extensions/runner.d.ts.map +1 -1
  71. package/dist/core/extensions/runner.js +4 -0
  72. package/dist/core/extensions/runner.js.map +1 -1
  73. package/dist/core/extensions/runtime-types.d.ts +3 -0
  74. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  75. package/dist/core/extensions/runtime-types.js.map +1 -1
  76. package/dist/core/extensions/tool-types.d.ts +1 -0
  77. package/dist/core/extensions/tool-types.d.ts.map +1 -1
  78. package/dist/core/extensions/tool-types.js.map +1 -1
  79. package/dist/core/extensions/workflow-run-control-hub.d.ts +23 -0
  80. package/dist/core/extensions/workflow-run-control-hub.d.ts.map +1 -0
  81. package/dist/core/extensions/workflow-run-control-hub.js +57 -0
  82. package/dist/core/extensions/workflow-run-control-hub.js.map +1 -0
  83. package/dist/core/extensions/workflow-run-control.d.ts +163 -0
  84. package/dist/core/extensions/workflow-run-control.d.ts.map +1 -0
  85. package/dist/core/extensions/workflow-run-control.js +73 -0
  86. package/dist/core/extensions/workflow-run-control.js.map +1 -0
  87. package/dist/core/mcp-child-policy.d.ts +11 -0
  88. package/dist/core/mcp-child-policy.d.ts.map +1 -0
  89. package/dist/core/mcp-child-policy.js +31 -0
  90. package/dist/core/mcp-child-policy.js.map +1 -0
  91. package/dist/core/mcp-servers.d.ts +34 -25
  92. package/dist/core/mcp-servers.d.ts.map +1 -1
  93. package/dist/core/mcp-servers.js +148 -1
  94. package/dist/core/mcp-servers.js.map +1 -1
  95. package/dist/core/package-manager-manifest.js.map +1 -1
  96. package/dist/core/package-manager-mcp-servers.js +1 -1
  97. package/dist/core/package-manager-mcp-servers.js.map +1 -1
  98. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  99. package/dist/core/remote-catalog-provider.js +4 -9
  100. package/dist/core/remote-catalog-provider.js.map +1 -1
  101. package/dist/core/sdk.js +11 -1
  102. package/dist/core/sdk.js.map +1 -1
  103. package/dist/core/tool-loadout.d.ts +1 -0
  104. package/dist/core/tool-loadout.d.ts.map +1 -1
  105. package/dist/core/tool-loadout.js +3 -0
  106. package/dist/core/tool-loadout.js.map +1 -1
  107. package/dist/core/tools/bash.d.ts.map +1 -1
  108. package/dist/core/tools/bash.js +11 -30
  109. package/dist/core/tools/bash.js.map +1 -1
  110. package/dist/core/tools/truncate.d.ts +8 -0
  111. package/dist/core/tools/truncate.d.ts.map +1 -1
  112. package/dist/core/tools/truncate.js +24 -0
  113. package/dist/core/tools/truncate.js.map +1 -1
  114. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  115. package/dist/extensions/codemode/execute.js +26 -0
  116. package/dist/extensions/codemode/execute.js.map +1 -1
  117. package/dist/extensions/codemode/renderer.d.ts.map +1 -1
  118. package/dist/extensions/codemode/renderer.js +38 -23
  119. package/dist/extensions/codemode/renderer.js.map +1 -1
  120. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  121. package/dist/extensions/codemode/tool.js +22 -10
  122. package/dist/extensions/codemode/tool.js.map +1 -1
  123. package/dist/extensions/mcp/cli.d.ts +21 -0
  124. package/dist/extensions/mcp/cli.d.ts.map +1 -0
  125. package/dist/extensions/mcp/cli.js +500 -0
  126. package/dist/extensions/mcp/cli.js.map +1 -0
  127. package/dist/extensions/mcp/cli.lazy.d.ts +3 -0
  128. package/dist/extensions/mcp/cli.lazy.d.ts.map +1 -0
  129. package/dist/extensions/mcp/cli.lazy.js +3 -0
  130. package/dist/extensions/mcp/cli.lazy.js.map +1 -0
  131. package/dist/extensions/mcp/client/auth-provider.d.ts +15 -0
  132. package/dist/extensions/mcp/client/auth-provider.d.ts.map +1 -0
  133. package/dist/extensions/mcp/client/auth-provider.js +2 -0
  134. package/dist/extensions/mcp/client/auth-provider.js.map +1 -0
  135. package/dist/extensions/mcp/client/client.d.ts +89 -0
  136. package/dist/extensions/mcp/client/client.d.ts.map +1 -0
  137. package/dist/extensions/mcp/client/client.js +457 -0
  138. package/dist/extensions/mcp/client/client.js.map +1 -0
  139. package/dist/extensions/mcp/client/index.d.ts +9 -0
  140. package/dist/extensions/mcp/client/index.d.ts.map +1 -0
  141. package/dist/extensions/mcp/client/index.js +7 -0
  142. package/dist/extensions/mcp/client/index.js.map +1 -0
  143. package/dist/extensions/mcp/client/oauth/callback.d.ts +42 -0
  144. package/dist/extensions/mcp/client/oauth/callback.d.ts.map +1 -0
  145. package/dist/extensions/mcp/client/oauth/callback.js +106 -0
  146. package/dist/extensions/mcp/client/oauth/callback.js.map +1 -0
  147. package/dist/extensions/mcp/client/oauth/discovery.d.ts +27 -0
  148. package/dist/extensions/mcp/client/oauth/discovery.d.ts.map +1 -0
  149. package/dist/extensions/mcp/client/oauth/discovery.js +153 -0
  150. package/dist/extensions/mcp/client/oauth/discovery.js.map +1 -0
  151. package/dist/extensions/mcp/client/oauth/errors.d.ts +24 -0
  152. package/dist/extensions/mcp/client/oauth/errors.d.ts.map +1 -0
  153. package/dist/extensions/mcp/client/oauth/errors.js +46 -0
  154. package/dist/extensions/mcp/client/oauth/errors.js.map +1 -0
  155. package/dist/extensions/mcp/client/oauth/flow.d.ts +82 -0
  156. package/dist/extensions/mcp/client/oauth/flow.d.ts.map +1 -0
  157. package/dist/extensions/mcp/client/oauth/flow.js +292 -0
  158. package/dist/extensions/mcp/client/oauth/flow.js.map +1 -0
  159. package/dist/extensions/mcp/client/oauth/index.d.ts +7 -0
  160. package/dist/extensions/mcp/client/oauth/index.d.ts.map +1 -0
  161. package/dist/extensions/mcp/client/oauth/index.js +6 -0
  162. package/dist/extensions/mcp/client/oauth/index.js.map +1 -0
  163. package/dist/extensions/mcp/client/oauth/provider.d.ts +59 -0
  164. package/dist/extensions/mcp/client/oauth/provider.d.ts.map +1 -0
  165. package/dist/extensions/mcp/client/oauth/provider.js +116 -0
  166. package/dist/extensions/mcp/client/oauth/provider.js.map +1 -0
  167. package/dist/extensions/mcp/client/oauth/types.d.ts +77 -0
  168. package/dist/extensions/mcp/client/oauth/types.d.ts.map +1 -0
  169. package/dist/extensions/mcp/client/oauth/types.js +109 -0
  170. package/dist/extensions/mcp/client/oauth/types.js.map +1 -0
  171. package/dist/extensions/mcp/client/protocol/content.d.ts +82 -0
  172. package/dist/extensions/mcp/client/protocol/content.d.ts.map +1 -0
  173. package/dist/extensions/mcp/client/protocol/content.js +41 -0
  174. package/dist/extensions/mcp/client/protocol/content.js.map +1 -0
  175. package/dist/extensions/mcp/client/protocol/jsonrpc.d.ts +59 -0
  176. package/dist/extensions/mcp/client/protocol/jsonrpc.d.ts.map +1 -0
  177. package/dist/extensions/mcp/client/protocol/jsonrpc.js +67 -0
  178. package/dist/extensions/mcp/client/protocol/jsonrpc.js.map +1 -0
  179. package/dist/extensions/mcp/client/protocol/types.d.ts +123 -0
  180. package/dist/extensions/mcp/client/protocol/types.d.ts.map +1 -0
  181. package/dist/extensions/mcp/client/protocol/types.js +7 -0
  182. package/dist/extensions/mcp/client/protocol/types.js.map +1 -0
  183. package/dist/extensions/mcp/client/testing/index.d.ts +2 -0
  184. package/dist/extensions/mcp/client/testing/index.d.ts.map +1 -0
  185. package/dist/extensions/mcp/client/testing/index.js +2 -0
  186. package/dist/extensions/mcp/client/testing/index.js.map +1 -0
  187. package/dist/extensions/mcp/client/transports/in-memory.d.ts +19 -0
  188. package/dist/extensions/mcp/client/transports/in-memory.d.ts.map +1 -0
  189. package/dist/extensions/mcp/client/transports/in-memory.js +50 -0
  190. package/dist/extensions/mcp/client/transports/in-memory.js.map +1 -0
  191. package/dist/extensions/mcp/client/transports/stdio.d.ts +32 -0
  192. package/dist/extensions/mcp/client/transports/stdio.d.ts.map +1 -0
  193. package/dist/extensions/mcp/client/transports/stdio.js +201 -0
  194. package/dist/extensions/mcp/client/transports/stdio.js.map +1 -0
  195. package/dist/extensions/mcp/client/transports/streamable-http.d.ts +96 -0
  196. package/dist/extensions/mcp/client/transports/streamable-http.d.ts.map +1 -0
  197. package/dist/extensions/mcp/client/transports/streamable-http.js +456 -0
  198. package/dist/extensions/mcp/client/transports/streamable-http.js.map +1 -0
  199. package/dist/extensions/mcp/client/transports/transport.d.ts +28 -0
  200. package/dist/extensions/mcp/client/transports/transport.d.ts.map +1 -0
  201. package/dist/extensions/mcp/client/transports/transport.js +38 -0
  202. package/dist/extensions/mcp/client/transports/transport.js.map +1 -0
  203. package/dist/extensions/mcp/config.d.ts +72 -0
  204. package/dist/extensions/mcp/config.d.ts.map +1 -0
  205. package/dist/extensions/mcp/config.js +158 -0
  206. package/dist/extensions/mcp/config.js.map +1 -0
  207. package/dist/extensions/mcp/index.d.ts +76 -0
  208. package/dist/extensions/mcp/index.d.ts.map +1 -0
  209. package/dist/extensions/mcp/index.js +1119 -0
  210. package/dist/extensions/mcp/index.js.map +1 -0
  211. package/dist/extensions/mcp/log.d.ts +16 -0
  212. package/dist/extensions/mcp/log.d.ts.map +1 -0
  213. package/dist/extensions/mcp/log.js +66 -0
  214. package/dist/extensions/mcp/log.js.map +1 -0
  215. package/dist/extensions/mcp/oauth.d.ts +103 -0
  216. package/dist/extensions/mcp/oauth.d.ts.map +1 -0
  217. package/dist/extensions/mcp/oauth.js +382 -0
  218. package/dist/extensions/mcp/oauth.js.map +1 -0
  219. package/dist/extensions/mcp/resources.d.ts +43 -0
  220. package/dist/extensions/mcp/resources.d.ts.map +1 -0
  221. package/dist/extensions/mcp/resources.js +262 -0
  222. package/dist/extensions/mcp/resources.js.map +1 -0
  223. package/dist/extensions/mcp/runtime.d.ts +104 -0
  224. package/dist/extensions/mcp/runtime.d.ts.map +1 -0
  225. package/dist/extensions/mcp/runtime.js +546 -0
  226. package/dist/extensions/mcp/runtime.js.map +1 -0
  227. package/dist/extensions/mcp/runtime.lazy.d.ts +3 -0
  228. package/dist/extensions/mcp/runtime.lazy.d.ts.map +1 -0
  229. package/dist/extensions/mcp/runtime.lazy.js +3 -0
  230. package/dist/extensions/mcp/runtime.lazy.js.map +1 -0
  231. package/dist/extensions/mcp/tools.d.ts +84 -0
  232. package/dist/extensions/mcp/tools.d.ts.map +1 -0
  233. package/dist/extensions/mcp/tools.js +251 -0
  234. package/dist/extensions/mcp/tools.js.map +1 -0
  235. package/dist/extensions/mcp/ui.d.ts +60 -0
  236. package/dist/extensions/mcp/ui.d.ts.map +1 -0
  237. package/dist/extensions/mcp/ui.js +175 -0
  238. package/dist/extensions/mcp/ui.js.map +1 -0
  239. package/dist/extensions/tool-search/tool.d.ts +1 -1
  240. package/dist/extensions/tool-search/tool.d.ts.map +1 -1
  241. package/dist/extensions/tool-search/tool.js +3 -13
  242. package/dist/extensions/tool-search/tool.js.map +1 -1
  243. package/dist/index-extensions.d.ts +2 -1
  244. package/dist/index-extensions.d.ts.map +1 -1
  245. package/dist/index-extensions.js +1 -1
  246. package/dist/index-extensions.js.map +1 -1
  247. package/dist/index.d.ts +5 -1
  248. package/dist/index.d.ts.map +1 -1
  249. package/dist/index.js +5 -0
  250. package/dist/index.js.map +1 -1
  251. package/dist/main.d.ts.map +1 -1
  252. package/dist/main.js +7 -0
  253. package/dist/main.js.map +1 -1
  254. package/dist/modes/interactive/components/visual-truncate.d.ts +27 -3
  255. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  256. package/dist/modes/interactive/components/visual-truncate.js +39 -6
  257. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  258. package/docs/extensions/api-reference.md +3 -3
  259. package/docs/extensions/events.md +2 -0
  260. package/docs/extensions.md +8 -8
  261. package/docs/mcp-servers.md +171 -50
  262. package/docs/packages/authoring.md +2 -2
  263. package/docs/providers.md +8 -0
  264. package/docs/sdk/reference.md +16 -0
  265. package/docs/sdk.md +67 -1
  266. package/docs/settings.md +2 -0
  267. package/docs/tools.md +6 -0
  268. package/docs/workflows/operations.md +3 -1
  269. package/examples/extensions/built-in-tool-renderer.ts +16 -40
  270. package/examples/extensions/minimal-mode.ts +28 -108
  271. package/npm-shrinkwrap.json +69 -69
  272. package/package.json +8 -8
  273. package/dist/builtin/mcp/app-bridge.bundle.js +0 -67
  274. package/dist/builtin/mcp/xdg-open +0 -1267
@@ -0,0 +1,57 @@
1
+ import { WorkflowRunControlUnavailableError, } from "./workflow-run-control.js";
2
+ /** Holds the run-control implementation that the workflows extension registers for one extension generation. */
3
+ export class WorkflowRunControlHub {
4
+ control;
5
+ disposed = false;
6
+ register(control) {
7
+ if (this.disposed)
8
+ return { dispose: () => { } };
9
+ this.control = control;
10
+ return {
11
+ dispose: () => {
12
+ if (this.control === control)
13
+ this.control = undefined;
14
+ },
15
+ };
16
+ }
17
+ current() {
18
+ return this.control;
19
+ }
20
+ dispose() {
21
+ this.disposed = true;
22
+ this.control = undefined;
23
+ }
24
+ }
25
+ /** Stable per-session handle that follows the current extension generation across reloads. */
26
+ export class SessionWorkflowsHandle {
27
+ resolve;
28
+ constructor(resolve) {
29
+ this.resolve = resolve;
30
+ }
31
+ control() {
32
+ const control = this.resolve();
33
+ if (control === undefined)
34
+ throw new WorkflowRunControlUnavailableError();
35
+ return control;
36
+ }
37
+ async listRuns(filter) {
38
+ return this.control().listRuns(filter);
39
+ }
40
+ async getRun(runId) {
41
+ return this.control().getRun(runId);
42
+ }
43
+ async getStages(runId, filter) {
44
+ return this.control().getStages(runId, filter);
45
+ }
46
+ async pause(target, options) {
47
+ const control = this.control();
48
+ return typeof target === "string" ? control.pause(target, options) : control.pause(target);
49
+ }
50
+ async quit(target) {
51
+ return this.control().quit(target);
52
+ }
53
+ async resume(runId, options) {
54
+ return this.control().resume(runId, options);
55
+ }
56
+ }
57
+ //# sourceMappingURL=workflow-run-control-hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-run-control-hub.js","sourceRoot":"","sources":["../../../src/core/extensions/workflow-run-control-hub.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,kCAAkC,GAQlC,MAAM,2BAA2B,CAAC;AAEnC,gHAAgH;AAChH,MAAM,OAAO,qBAAqB;IACzB,OAAO,CAA+B;IACtC,QAAQ,GAAG,KAAK,CAAC;IAEzB,QAAQ,CAAC,OAAyB;QACjC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,OAAO;YACN,OAAO,EAAE,GAAG,EAAE;gBACb,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO;oBAAE,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;YACxD,CAAC;SACD,CAAC;IACH,CAAC;IAED,OAAO;QACN,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;IAED,OAAO;QACN,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;IAC1B,CAAC;CACD;AAED,8FAA8F;AAC9F,MAAM,OAAO,sBAAsB;IACjB,OAAO,CAAqC;IAE7D,YAAY,OAA2C;QACtD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAEO,OAAO;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,kCAAkC,EAAE,CAAC;QAC1E,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAA8B;QAC5C,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa;QACzB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,MAAgC;QAC9D,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAID,KAAK,CAAC,KAAK,CACV,MAAqC,EACrC,OAAiC;QAEjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC/B,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5F,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAqC;QAC/C,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAa,EAAE,OAAkC;QAC7D,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,CAAC;CACD","sourcesContent":["import {\n\ttype SessionWorkflows,\n\ttype WorkflowRunAllTarget,\n\ttype WorkflowRunControlOutcome,\n\ttype WorkflowRunControlRegistration,\n\tWorkflowRunControlUnavailableError,\n\ttype WorkflowRunDetail,\n\ttype WorkflowRunListFilter,\n\ttype WorkflowRunPauseOptions,\n\ttype WorkflowRunResumeOptions,\n\ttype WorkflowRunStageSummary,\n\ttype WorkflowRunSummary,\n\ttype WorkflowStageListFilter,\n} from \"./workflow-run-control.js\";\n\n/** Holds the run-control implementation that the workflows extension registers for one extension generation. */\nexport class WorkflowRunControlHub {\n\tprivate control: SessionWorkflows | undefined;\n\tprivate disposed = false;\n\n\tregister(control: SessionWorkflows): WorkflowRunControlRegistration {\n\t\tif (this.disposed) return { dispose: () => {} };\n\t\tthis.control = control;\n\t\treturn {\n\t\t\tdispose: () => {\n\t\t\t\tif (this.control === control) this.control = undefined;\n\t\t\t},\n\t\t};\n\t}\n\n\tcurrent(): SessionWorkflows | undefined {\n\t\treturn this.control;\n\t}\n\n\tdispose(): void {\n\t\tthis.disposed = true;\n\t\tthis.control = undefined;\n\t}\n}\n\n/** Stable per-session handle that follows the current extension generation across reloads. */\nexport class SessionWorkflowsHandle implements SessionWorkflows {\n\tprivate readonly resolve: () => SessionWorkflows | undefined;\n\n\tconstructor(resolve: () => SessionWorkflows | undefined) {\n\t\tthis.resolve = resolve;\n\t}\n\n\tprivate control(): SessionWorkflows {\n\t\tconst control = this.resolve();\n\t\tif (control === undefined) throw new WorkflowRunControlUnavailableError();\n\t\treturn control;\n\t}\n\n\tasync listRuns(filter?: WorkflowRunListFilter): Promise<readonly WorkflowRunSummary[]> {\n\t\treturn this.control().listRuns(filter);\n\t}\n\n\tasync getRun(runId: string): Promise<WorkflowRunDetail> {\n\t\treturn this.control().getRun(runId);\n\t}\n\n\tasync getStages(runId: string, filter?: WorkflowStageListFilter): Promise<readonly WorkflowRunStageSummary[]> {\n\t\treturn this.control().getStages(runId, filter);\n\t}\n\n\tpause(runId: string, options?: WorkflowRunPauseOptions): Promise<WorkflowRunControlOutcome>;\n\tpause(target: WorkflowRunAllTarget): Promise<WorkflowRunControlOutcome>;\n\tasync pause(\n\t\ttarget: string | WorkflowRunAllTarget,\n\t\toptions?: WorkflowRunPauseOptions,\n\t): Promise<WorkflowRunControlOutcome> {\n\t\tconst control = this.control();\n\t\treturn typeof target === \"string\" ? control.pause(target, options) : control.pause(target);\n\t}\n\n\tasync quit(target: string | WorkflowRunAllTarget): Promise<WorkflowRunControlOutcome> {\n\t\treturn this.control().quit(target);\n\t}\n\n\tasync resume(runId: string, options?: WorkflowRunResumeOptions): Promise<WorkflowRunControlOutcome> {\n\t\treturn this.control().resume(runId, options);\n\t}\n}\n"]}
@@ -0,0 +1,163 @@
1
+ import type { WorkflowRunStatus, WorkflowStageStatus } from "./workflow-events.js";
2
+ export type WorkflowRunJsonValue = string | number | boolean | null | readonly WorkflowRunJsonValue[] | WorkflowRunJsonObject;
3
+ export interface WorkflowRunJsonObject {
4
+ readonly [key: string]: WorkflowRunJsonValue | undefined;
5
+ }
6
+ export type WorkflowRunFilterStatus = WorkflowRunStatus | WorkflowStageStatus | "awaiting_input";
7
+ export interface WorkflowRunListFilter {
8
+ /** Run statuses match directly; `awaiting_input` selects runs with an unanswered prompt. */
9
+ readonly status?: WorkflowRunFilterStatus;
10
+ }
11
+ export interface WorkflowStageListFilter {
12
+ readonly status?: WorkflowStageStatus;
13
+ }
14
+ export interface WorkflowRunActiveStage {
15
+ readonly stageId: string;
16
+ readonly name: string;
17
+ readonly status: WorkflowStageStatus;
18
+ }
19
+ export interface WorkflowRunAwaitingInput {
20
+ readonly stageId?: string;
21
+ readonly stageName?: string;
22
+ readonly promptId?: string;
23
+ readonly promptKind?: string;
24
+ readonly message?: string;
25
+ }
26
+ /** The concise per-run data that the `workflow` tool's `status` action lists. */
27
+ export interface WorkflowRunSummary {
28
+ readonly runId: string;
29
+ readonly name: string;
30
+ readonly status: WorkflowRunStatus;
31
+ readonly startedAt: number;
32
+ readonly endedAt?: number;
33
+ readonly elapsedMs: number;
34
+ readonly activeStages: readonly WorkflowRunActiveStage[];
35
+ readonly awaitingInputCount: number;
36
+ readonly awaitingInput: readonly WorkflowRunAwaitingInput[];
37
+ readonly exitReason?: string;
38
+ readonly error?: string;
39
+ }
40
+ export interface WorkflowRunStageSummary {
41
+ readonly id: string;
42
+ readonly name: string;
43
+ readonly status: WorkflowStageStatus;
44
+ readonly sessionId?: string;
45
+ readonly error?: string;
46
+ readonly skippedReason?: string;
47
+ readonly awaitingInputSince?: number;
48
+ }
49
+ /** The per-run detail that the `workflow` tool's `status` action returns for one run id. */
50
+ export interface WorkflowRunDetail {
51
+ readonly runId: string;
52
+ readonly rootRunId?: string;
53
+ readonly name: string;
54
+ readonly status: WorkflowRunStatus | "crashed";
55
+ readonly startedAt: number;
56
+ readonly endedAt?: number;
57
+ readonly durationMs?: number;
58
+ readonly inputs: WorkflowRunJsonObject;
59
+ readonly stages: readonly WorkflowRunStageSummary[];
60
+ readonly result?: WorkflowRunJsonObject;
61
+ readonly error?: string;
62
+ readonly exitReason?: string;
63
+ readonly resumable?: boolean;
64
+ readonly resumeGuidance?: string;
65
+ readonly ownerActiveElsewhere?: boolean;
66
+ }
67
+ export interface WorkflowRunAllTarget {
68
+ readonly all: true;
69
+ }
70
+ export interface WorkflowRunPauseOptions {
71
+ /** Pause one stage instead of the whole run. */
72
+ readonly stageId?: string;
73
+ }
74
+ export interface WorkflowRunResumeOptions {
75
+ /** Resume one paused stage instead of the whole run. */
76
+ readonly stageId?: string;
77
+ /** Message delivered to each resumed stage. */
78
+ readonly message?: string;
79
+ }
80
+ export type WorkflowRunControlStatus = "ok" | "running" | "paused" | "partial" | "noop" | "cancelled";
81
+ /** A run that a batch pause or quit could not stop; it may still be active. */
82
+ export interface WorkflowRunControlFailedRun {
83
+ readonly runId: string;
84
+ /** Machine-readable refusal, such as `not_found`, `no_active_stages` or `pause_failed`. */
85
+ readonly reason: string;
86
+ readonly message?: string;
87
+ }
88
+ /**
89
+ * The acknowledged result of a pause, quit or resume request, as the `workflow`
90
+ * tool reports it. `runId` is `--all` for a batch request. `noop` means the request was
91
+ * understood and found nothing to change; `partial` means only part of the
92
+ * request took effect. For a batch pause or quit, `failedRuns` names every run that
93
+ * could not be stopped, so a `partial` outcome is never a complete stop.
94
+ */
95
+ export interface WorkflowRunControlOutcome {
96
+ readonly action: "pause" | "quit" | "resume";
97
+ readonly runId: string;
98
+ readonly status: WorkflowRunControlStatus;
99
+ readonly message: string;
100
+ readonly stageId?: string;
101
+ readonly workflowStatus?: WorkflowRunStatus;
102
+ readonly abandoned?: boolean;
103
+ readonly failedRuns?: readonly WorkflowRunControlFailedRun[];
104
+ }
105
+ /** Typed run management for the workflow runs owned by one session. */
106
+ export interface SessionWorkflows {
107
+ listRuns(filter?: WorkflowRunListFilter): Promise<readonly WorkflowRunSummary[]>;
108
+ getRun(runId: string): Promise<WorkflowRunDetail>;
109
+ getStages(runId: string, filter?: WorkflowStageListFilter): Promise<readonly WorkflowRunStageSummary[]>;
110
+ pause(runId: string, options?: WorkflowRunPauseOptions): Promise<WorkflowRunControlOutcome>;
111
+ pause(target: WorkflowRunAllTarget): Promise<WorkflowRunControlOutcome>;
112
+ quit(target: string | WorkflowRunAllTarget): Promise<WorkflowRunControlOutcome>;
113
+ resume(runId: string, options?: WorkflowRunResumeOptions): Promise<WorkflowRunControlOutcome>;
114
+ }
115
+ export interface WorkflowRunControlRegistration {
116
+ dispose(): void;
117
+ }
118
+ export type WorkflowRunControlErrorCode = "WORKFLOW_RUN_NOT_FOUND" | "WORKFLOW_RUN_OWNED_ELSEWHERE" | "WORKFLOW_RUN_NOT_RESUMABLE" | "WORKFLOW_STAGE_NOT_FOUND" | "WORKFLOW_STAGE_AMBIGUOUS" | "WORKFLOW_STAGE_RESUME_UNSUPPORTED" | "WORKFLOW_RUN_DATABASE" | "WORKFLOW_RUN_CONTROL_FAILED" | "WORKFLOW_RUN_CONTROL_UNAVAILABLE";
119
+ export interface WorkflowRunControlErrorOptions extends ErrorOptions {
120
+ readonly runId?: string;
121
+ readonly failedRuns?: readonly WorkflowRunControlFailedRun[];
122
+ }
123
+ /** Base class for every failure reported by {@link SessionWorkflows}; branch on `code`. */
124
+ export declare class WorkflowRunControlError extends Error {
125
+ readonly code: WorkflowRunControlErrorCode;
126
+ readonly runId?: string;
127
+ /** Runs a batch pause or quit could not stop, when the whole batch was refused. */
128
+ readonly failedRuns?: readonly WorkflowRunControlFailedRun[];
129
+ constructor(code: WorkflowRunControlErrorCode, message: string, options?: WorkflowRunControlErrorOptions);
130
+ }
131
+ /** The run id is unknown, malformed, or an ambiguous prefix. */
132
+ export declare class WorkflowRunNotFoundError extends WorkflowRunControlError {
133
+ constructor(message: string, options?: WorkflowRunControlErrorOptions);
134
+ }
135
+ /** The run belongs to another session or is executing in another live Atomic process. */
136
+ export declare class WorkflowRunOwnershipError extends WorkflowRunControlError {
137
+ constructor(message: string, options?: WorkflowRunControlErrorOptions);
138
+ }
139
+ /** The run has no continuation to resume: it completed, was killed, or has no durable progress. */
140
+ export declare class WorkflowRunNotResumableError extends WorkflowRunControlError {
141
+ constructor(message: string, options?: WorkflowRunControlErrorOptions);
142
+ }
143
+ /** The stage identifier matches no stage or tool node of the run. */
144
+ export declare class WorkflowStageNotFoundError extends WorkflowRunControlError {
145
+ constructor(message: string, options?: WorkflowRunControlErrorOptions);
146
+ }
147
+ /** The stage identifier matches more than one stage or tool node; pass a more specific identifier. */
148
+ export declare class WorkflowStageAmbiguousError extends WorkflowRunControlError {
149
+ constructor(message: string, options?: WorkflowRunControlErrorOptions);
150
+ }
151
+ /** A durable run can only be resumed whole; resume it without a stage identifier. */
152
+ export declare class WorkflowStageResumeUnsupportedError extends WorkflowRunControlError {
153
+ constructor(message: string, options?: WorkflowRunControlErrorOptions);
154
+ }
155
+ /** Workflow durability (the run database) is unavailable, shut down, or failed. */
156
+ export declare class WorkflowRunDatabaseError extends WorkflowRunControlError {
157
+ constructor(message: string, options?: WorkflowRunControlErrorOptions);
158
+ }
159
+ /** The workflows extension is not loaded for this session, or the session was disposed. */
160
+ export declare class WorkflowRunControlUnavailableError extends WorkflowRunControlError {
161
+ constructor(message?: string, options?: WorkflowRunControlErrorOptions);
162
+ }
163
+ //# sourceMappingURL=workflow-run-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-run-control.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/workflow-run-control.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /** Base class for every failure reported by {@link SessionWorkflows}; branch on `code`. */
2
+ export class WorkflowRunControlError extends Error {
3
+ code;
4
+ runId;
5
+ /** Runs a batch pause or quit could not stop, when the whole batch was refused. */
6
+ failedRuns;
7
+ constructor(code, message, options = {}) {
8
+ super(message, options);
9
+ this.name = "WorkflowRunControlError";
10
+ this.code = code;
11
+ if (options.runId !== undefined)
12
+ this.runId = options.runId;
13
+ if (options.failedRuns !== undefined)
14
+ this.failedRuns = options.failedRuns;
15
+ }
16
+ }
17
+ /** The run id is unknown, malformed, or an ambiguous prefix. */
18
+ export class WorkflowRunNotFoundError extends WorkflowRunControlError {
19
+ constructor(message, options) {
20
+ super("WORKFLOW_RUN_NOT_FOUND", message, options);
21
+ this.name = "WorkflowRunNotFoundError";
22
+ }
23
+ }
24
+ /** The run belongs to another session or is executing in another live Atomic process. */
25
+ export class WorkflowRunOwnershipError extends WorkflowRunControlError {
26
+ constructor(message, options) {
27
+ super("WORKFLOW_RUN_OWNED_ELSEWHERE", message, options);
28
+ this.name = "WorkflowRunOwnershipError";
29
+ }
30
+ }
31
+ /** The run has no continuation to resume: it completed, was killed, or has no durable progress. */
32
+ export class WorkflowRunNotResumableError extends WorkflowRunControlError {
33
+ constructor(message, options) {
34
+ super("WORKFLOW_RUN_NOT_RESUMABLE", message, options);
35
+ this.name = "WorkflowRunNotResumableError";
36
+ }
37
+ }
38
+ /** The stage identifier matches no stage or tool node of the run. */
39
+ export class WorkflowStageNotFoundError extends WorkflowRunControlError {
40
+ constructor(message, options) {
41
+ super("WORKFLOW_STAGE_NOT_FOUND", message, options);
42
+ this.name = "WorkflowStageNotFoundError";
43
+ }
44
+ }
45
+ /** The stage identifier matches more than one stage or tool node; pass a more specific identifier. */
46
+ export class WorkflowStageAmbiguousError extends WorkflowRunControlError {
47
+ constructor(message, options) {
48
+ super("WORKFLOW_STAGE_AMBIGUOUS", message, options);
49
+ this.name = "WorkflowStageAmbiguousError";
50
+ }
51
+ }
52
+ /** A durable run can only be resumed whole; resume it without a stage identifier. */
53
+ export class WorkflowStageResumeUnsupportedError extends WorkflowRunControlError {
54
+ constructor(message, options) {
55
+ super("WORKFLOW_STAGE_RESUME_UNSUPPORTED", message, options);
56
+ this.name = "WorkflowStageResumeUnsupportedError";
57
+ }
58
+ }
59
+ /** Workflow durability (the run database) is unavailable, shut down, or failed. */
60
+ export class WorkflowRunDatabaseError extends WorkflowRunControlError {
61
+ constructor(message, options) {
62
+ super("WORKFLOW_RUN_DATABASE", message, options);
63
+ this.name = "WorkflowRunDatabaseError";
64
+ }
65
+ }
66
+ /** The workflows extension is not loaded for this session, or the session was disposed. */
67
+ export class WorkflowRunControlUnavailableError extends WorkflowRunControlError {
68
+ constructor(message = "Workflow run control is unavailable for this session.", options) {
69
+ super("WORKFLOW_RUN_CONTROL_UNAVAILABLE", message, options);
70
+ this.name = "WorkflowRunControlUnavailableError";
71
+ }
72
+ }
73
+ //# sourceMappingURL=workflow-run-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-run-control.js","sourceRoot":"","sources":["../../../src/core/extensions/workflow-run-control.ts"],"names":[],"mappings":"AA8JA,2FAA2F;AAC3F,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACxC,IAAI,CAA8B;IAClC,KAAK,CAAU;IACxB,mFAAmF;IAC1E,UAAU,CAA0C;IAE7D,YAAY,IAAiC,EAAE,OAAe,EAAE,OAAO,GAAmC,EAAE;QAC3G,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC5D,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS;YAAE,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAC5E,CAAC;CACD;AAED,gEAAgE;AAChE,MAAM,OAAO,wBAAyB,SAAQ,uBAAuB;IACpE,YAAY,OAAe,EAAE,OAAwC;QACpE,KAAK,CAAC,wBAAwB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACxC,CAAC;CACD;AAED,yFAAyF;AACzF,MAAM,OAAO,yBAA0B,SAAQ,uBAAuB;IACrE,YAAY,OAAe,EAAE,OAAwC;QACpE,KAAK,CAAC,8BAA8B,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IACzC,CAAC;CACD;AAED,mGAAmG;AACnG,MAAM,OAAO,4BAA6B,SAAQ,uBAAuB;IACxE,YAAY,OAAe,EAAE,OAAwC;QACpE,KAAK,CAAC,4BAA4B,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC5C,CAAC;CACD;AAED,qEAAqE;AACrE,MAAM,OAAO,0BAA2B,SAAQ,uBAAuB;IACtE,YAAY,OAAe,EAAE,OAAwC;QACpE,KAAK,CAAC,0BAA0B,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC1C,CAAC;CACD;AAED,sGAAsG;AACtG,MAAM,OAAO,2BAA4B,SAAQ,uBAAuB;IACvE,YAAY,OAAe,EAAE,OAAwC;QACpE,KAAK,CAAC,0BAA0B,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC3C,CAAC;CACD;AAED,qFAAqF;AACrF,MAAM,OAAO,mCAAoC,SAAQ,uBAAuB;IAC/E,YAAY,OAAe,EAAE,OAAwC;QACpE,KAAK,CAAC,mCAAmC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,GAAG,qCAAqC,CAAC;IACnD,CAAC;CACD;AAED,mFAAmF;AACnF,MAAM,OAAO,wBAAyB,SAAQ,uBAAuB;IACpE,YAAY,OAAe,EAAE,OAAwC;QACpE,KAAK,CAAC,uBAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACxC,CAAC;CACD;AAED,2FAA2F;AAC3F,MAAM,OAAO,kCAAmC,SAAQ,uBAAuB;IAC9E,YACC,OAAO,GAAG,uDAAuD,EACjE,OAAwC;QAExC,KAAK,CAAC,kCAAkC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,oCAAoC,CAAC;IAClD,CAAC;CACD","sourcesContent":["import type { WorkflowRunStatus, WorkflowStageStatus } from \"./workflow-events.js\";\n\nexport type WorkflowRunJsonValue =\n\t| string\n\t| number\n\t| boolean\n\t| null\n\t| readonly WorkflowRunJsonValue[]\n\t| WorkflowRunJsonObject;\n\nexport interface WorkflowRunJsonObject {\n\treadonly [key: string]: WorkflowRunJsonValue | undefined;\n}\n\nexport type WorkflowRunFilterStatus = WorkflowRunStatus | WorkflowStageStatus | \"awaiting_input\";\n\nexport interface WorkflowRunListFilter {\n\t/** Run statuses match directly; `awaiting_input` selects runs with an unanswered prompt. */\n\treadonly status?: WorkflowRunFilterStatus;\n}\n\nexport interface WorkflowStageListFilter {\n\treadonly status?: WorkflowStageStatus;\n}\n\nexport interface WorkflowRunActiveStage {\n\treadonly stageId: string;\n\treadonly name: string;\n\treadonly status: WorkflowStageStatus;\n}\n\nexport interface WorkflowRunAwaitingInput {\n\treadonly stageId?: string;\n\treadonly stageName?: string;\n\treadonly promptId?: string;\n\treadonly promptKind?: string;\n\treadonly message?: string;\n}\n\n/** The concise per-run data that the `workflow` tool's `status` action lists. */\nexport interface WorkflowRunSummary {\n\treadonly runId: string;\n\treadonly name: string;\n\treadonly status: WorkflowRunStatus;\n\treadonly startedAt: number;\n\treadonly endedAt?: number;\n\treadonly elapsedMs: number;\n\treadonly activeStages: readonly WorkflowRunActiveStage[];\n\treadonly awaitingInputCount: number;\n\treadonly awaitingInput: readonly WorkflowRunAwaitingInput[];\n\treadonly exitReason?: string;\n\treadonly error?: string;\n}\n\nexport interface WorkflowRunStageSummary {\n\treadonly id: string;\n\treadonly name: string;\n\treadonly status: WorkflowStageStatus;\n\treadonly sessionId?: string;\n\treadonly error?: string;\n\treadonly skippedReason?: string;\n\treadonly awaitingInputSince?: number;\n}\n\n/** The per-run detail that the `workflow` tool's `status` action returns for one run id. */\nexport interface WorkflowRunDetail {\n\treadonly runId: string;\n\treadonly rootRunId?: string;\n\treadonly name: string;\n\treadonly status: WorkflowRunStatus | \"crashed\";\n\treadonly startedAt: number;\n\treadonly endedAt?: number;\n\treadonly durationMs?: number;\n\treadonly inputs: WorkflowRunJsonObject;\n\treadonly stages: readonly WorkflowRunStageSummary[];\n\treadonly result?: WorkflowRunJsonObject;\n\treadonly error?: string;\n\treadonly exitReason?: string;\n\treadonly resumable?: boolean;\n\treadonly resumeGuidance?: string;\n\treadonly ownerActiveElsewhere?: boolean;\n}\n\nexport interface WorkflowRunAllTarget {\n\treadonly all: true;\n}\n\nexport interface WorkflowRunPauseOptions {\n\t/** Pause one stage instead of the whole run. */\n\treadonly stageId?: string;\n}\n\nexport interface WorkflowRunResumeOptions {\n\t/** Resume one paused stage instead of the whole run. */\n\treadonly stageId?: string;\n\t/** Message delivered to each resumed stage. */\n\treadonly message?: string;\n}\n\nexport type WorkflowRunControlStatus = \"ok\" | \"running\" | \"paused\" | \"partial\" | \"noop\" | \"cancelled\";\n\n/** A run that a batch pause or quit could not stop; it may still be active. */\nexport interface WorkflowRunControlFailedRun {\n\treadonly runId: string;\n\t/** Machine-readable refusal, such as `not_found`, `no_active_stages` or `pause_failed`. */\n\treadonly reason: string;\n\treadonly message?: string;\n}\n\n/**\n * The acknowledged result of a pause, quit or resume request, as the `workflow`\n * tool reports it. `runId` is `--all` for a batch request. `noop` means the request was\n * understood and found nothing to change; `partial` means only part of the\n * request took effect. For a batch pause or quit, `failedRuns` names every run that\n * could not be stopped, so a `partial` outcome is never a complete stop.\n */\nexport interface WorkflowRunControlOutcome {\n\treadonly action: \"pause\" | \"quit\" | \"resume\";\n\treadonly runId: string;\n\treadonly status: WorkflowRunControlStatus;\n\treadonly message: string;\n\treadonly stageId?: string;\n\treadonly workflowStatus?: WorkflowRunStatus;\n\treadonly abandoned?: boolean;\n\treadonly failedRuns?: readonly WorkflowRunControlFailedRun[];\n}\n\n/** Typed run management for the workflow runs owned by one session. */\nexport interface SessionWorkflows {\n\tlistRuns(filter?: WorkflowRunListFilter): Promise<readonly WorkflowRunSummary[]>;\n\tgetRun(runId: string): Promise<WorkflowRunDetail>;\n\tgetStages(runId: string, filter?: WorkflowStageListFilter): Promise<readonly WorkflowRunStageSummary[]>;\n\tpause(runId: string, options?: WorkflowRunPauseOptions): Promise<WorkflowRunControlOutcome>;\n\tpause(target: WorkflowRunAllTarget): Promise<WorkflowRunControlOutcome>;\n\tquit(target: string | WorkflowRunAllTarget): Promise<WorkflowRunControlOutcome>;\n\tresume(runId: string, options?: WorkflowRunResumeOptions): Promise<WorkflowRunControlOutcome>;\n}\n\nexport interface WorkflowRunControlRegistration {\n\tdispose(): void;\n}\n\nexport type WorkflowRunControlErrorCode =\n\t| \"WORKFLOW_RUN_NOT_FOUND\"\n\t| \"WORKFLOW_RUN_OWNED_ELSEWHERE\"\n\t| \"WORKFLOW_RUN_NOT_RESUMABLE\"\n\t| \"WORKFLOW_STAGE_NOT_FOUND\"\n\t| \"WORKFLOW_STAGE_AMBIGUOUS\"\n\t| \"WORKFLOW_STAGE_RESUME_UNSUPPORTED\"\n\t| \"WORKFLOW_RUN_DATABASE\"\n\t| \"WORKFLOW_RUN_CONTROL_FAILED\"\n\t| \"WORKFLOW_RUN_CONTROL_UNAVAILABLE\";\n\nexport interface WorkflowRunControlErrorOptions extends ErrorOptions {\n\treadonly runId?: string;\n\treadonly failedRuns?: readonly WorkflowRunControlFailedRun[];\n}\n\n/** Base class for every failure reported by {@link SessionWorkflows}; branch on `code`. */\nexport class WorkflowRunControlError extends Error {\n\treadonly code: WorkflowRunControlErrorCode;\n\treadonly runId?: string;\n\t/** Runs a batch pause or quit could not stop, when the whole batch was refused. */\n\treadonly failedRuns?: readonly WorkflowRunControlFailedRun[];\n\n\tconstructor(code: WorkflowRunControlErrorCode, message: string, options: WorkflowRunControlErrorOptions = {}) {\n\t\tsuper(message, options);\n\t\tthis.name = \"WorkflowRunControlError\";\n\t\tthis.code = code;\n\t\tif (options.runId !== undefined) this.runId = options.runId;\n\t\tif (options.failedRuns !== undefined) this.failedRuns = options.failedRuns;\n\t}\n}\n\n/** The run id is unknown, malformed, or an ambiguous prefix. */\nexport class WorkflowRunNotFoundError extends WorkflowRunControlError {\n\tconstructor(message: string, options?: WorkflowRunControlErrorOptions) {\n\t\tsuper(\"WORKFLOW_RUN_NOT_FOUND\", message, options);\n\t\tthis.name = \"WorkflowRunNotFoundError\";\n\t}\n}\n\n/** The run belongs to another session or is executing in another live Atomic process. */\nexport class WorkflowRunOwnershipError extends WorkflowRunControlError {\n\tconstructor(message: string, options?: WorkflowRunControlErrorOptions) {\n\t\tsuper(\"WORKFLOW_RUN_OWNED_ELSEWHERE\", message, options);\n\t\tthis.name = \"WorkflowRunOwnershipError\";\n\t}\n}\n\n/** The run has no continuation to resume: it completed, was killed, or has no durable progress. */\nexport class WorkflowRunNotResumableError extends WorkflowRunControlError {\n\tconstructor(message: string, options?: WorkflowRunControlErrorOptions) {\n\t\tsuper(\"WORKFLOW_RUN_NOT_RESUMABLE\", message, options);\n\t\tthis.name = \"WorkflowRunNotResumableError\";\n\t}\n}\n\n/** The stage identifier matches no stage or tool node of the run. */\nexport class WorkflowStageNotFoundError extends WorkflowRunControlError {\n\tconstructor(message: string, options?: WorkflowRunControlErrorOptions) {\n\t\tsuper(\"WORKFLOW_STAGE_NOT_FOUND\", message, options);\n\t\tthis.name = \"WorkflowStageNotFoundError\";\n\t}\n}\n\n/** The stage identifier matches more than one stage or tool node; pass a more specific identifier. */\nexport class WorkflowStageAmbiguousError extends WorkflowRunControlError {\n\tconstructor(message: string, options?: WorkflowRunControlErrorOptions) {\n\t\tsuper(\"WORKFLOW_STAGE_AMBIGUOUS\", message, options);\n\t\tthis.name = \"WorkflowStageAmbiguousError\";\n\t}\n}\n\n/** A durable run can only be resumed whole; resume it without a stage identifier. */\nexport class WorkflowStageResumeUnsupportedError extends WorkflowRunControlError {\n\tconstructor(message: string, options?: WorkflowRunControlErrorOptions) {\n\t\tsuper(\"WORKFLOW_STAGE_RESUME_UNSUPPORTED\", message, options);\n\t\tthis.name = \"WorkflowStageResumeUnsupportedError\";\n\t}\n}\n\n/** Workflow durability (the run database) is unavailable, shut down, or failed. */\nexport class WorkflowRunDatabaseError extends WorkflowRunControlError {\n\tconstructor(message: string, options?: WorkflowRunControlErrorOptions) {\n\t\tsuper(\"WORKFLOW_RUN_DATABASE\", message, options);\n\t\tthis.name = \"WorkflowRunDatabaseError\";\n\t}\n}\n\n/** The workflows extension is not loaded for this session, or the session was disposed. */\nexport class WorkflowRunControlUnavailableError extends WorkflowRunControlError {\n\tconstructor(\n\t\tmessage = \"Workflow run control is unavailable for this session.\",\n\t\toptions?: WorkflowRunControlErrorOptions,\n\t) {\n\t\tsuper(\"WORKFLOW_RUN_CONTROL_UNAVAILABLE\", message, options);\n\t\tthis.name = \"WorkflowRunControlUnavailableError\";\n\t}\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { ToolDefinition } from "./extensions/tool-types.ts";
2
+ import type { RegisteredTool, SubagentChildPolicy } from "./extensions/types.ts";
3
+ export interface NativeMcpToolIdentity {
4
+ readonly server: string;
5
+ readonly tool: string;
6
+ }
7
+ export declare function markNativeMcpToolDefinition(definition: ToolDefinition, identity: NativeMcpToolIdentity): void;
8
+ export declare function getNativeMcpToolIdentity(definition: ToolDefinition): NativeMcpToolIdentity | undefined;
9
+ export declare function matchesMcpDirectToolSelection(selections: readonly string[], server: string, tool: string): boolean;
10
+ export declare function isSelectedNativeMcpTool(registration: RegisteredTool, policy: SubagentChildPolicy | undefined): boolean;
11
+ //# sourceMappingURL=mcp-child-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-child-policy.d.ts","sourceRoot":"","sources":["../../src/core/mcp-child-policy.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,MAAM,WAAW,qBAAqB;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAID,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,qBAAqB,GAAG,IAAI,CAE7G;AAED,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,cAAc,GAAG,qBAAqB,GAAG,SAAS,CAEtG;AAED,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAOlH;AAED,wBAAgB,uBAAuB,CACtC,YAAY,EAAE,cAAc,EAC5B,MAAM,EAAE,mBAAmB,GAAG,SAAS,GACrC,OAAO,CAUT"}
@@ -0,0 +1,31 @@
1
+ import { getBuiltinExtensionEntryLabel } from "./extensions/builtin-extension-entry-labels.js";
2
+ const nativeToolIdentities = new WeakMap();
3
+ export function markNativeMcpToolDefinition(definition, identity) {
4
+ nativeToolIdentities.set(definition, identity);
5
+ }
6
+ export function getNativeMcpToolIdentity(definition) {
7
+ return nativeToolIdentities.get(definition);
8
+ }
9
+ export function matchesMcpDirectToolSelection(selections, server, tool) {
10
+ return selections.some((selection) => {
11
+ let end = selection.length;
12
+ while (end > 0 && selection[end - 1] === "/")
13
+ end--;
14
+ const value = selection.slice(0, end);
15
+ return value === server || value === `${server}/${tool}`;
16
+ });
17
+ }
18
+ export function isSelectedNativeMcpTool(registration, policy) {
19
+ if ((policy?.depth ?? 0) < 1 || !policy?.mcpDirectTools?.length)
20
+ return false;
21
+ if (registration.definition.exposure === "hidden")
22
+ return false;
23
+ const { sourceInfo } = registration;
24
+ if (sourceInfo.configurationOrigin !== "bundled")
25
+ return false;
26
+ if (sourceInfo.path !== "builtin:mcp" && getBuiltinExtensionEntryLabel(sourceInfo.path) !== "mcp")
27
+ return false;
28
+ const identity = getNativeMcpToolIdentity(registration.definition);
29
+ return (identity !== undefined && matchesMcpDirectToolSelection(policy.mcpDirectTools, identity.server, identity.tool));
30
+ }
31
+ //# sourceMappingURL=mcp-child-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-child-policy.js","sourceRoot":"","sources":["../../src/core/mcp-child-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,gDAAgD,CAAC;AAS/F,MAAM,oBAAoB,GAAG,IAAI,OAAO,EAAyC,CAAC;AAElF,MAAM,UAAU,2BAA2B,CAAC,UAA0B,EAAE,QAA+B;IACtG,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,UAA0B;IAClE,OAAO,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,UAA6B,EAAE,MAAc,EAAE,IAAY;IACxG,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;QACpC,IAAI,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC;QAC3B,OAAO,GAAG,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG;YAAE,GAAG,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtC,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC;IAC1D,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACtC,YAA4B,EAC5B,MAAuC;IAEvC,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,MAAM;QAAE,OAAO,KAAK,CAAC;IAC9E,IAAI,YAAY,CAAC,UAAU,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAChE,MAAM,EAAE,UAAU,EAAE,GAAG,YAAY,CAAC;IACpC,IAAI,UAAU,CAAC,mBAAmB,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,UAAU,CAAC,IAAI,KAAK,aAAa,IAAI,6BAA6B,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAChH,MAAM,QAAQ,GAAG,wBAAwB,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACnE,OAAO,CACN,QAAQ,KAAK,SAAS,IAAI,6BAA6B,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAC9G,CAAC;AACH,CAAC","sourcesContent":["import { getBuiltinExtensionEntryLabel } from \"./extensions/builtin-extension-entry-labels.ts\";\nimport type { ToolDefinition } from \"./extensions/tool-types.ts\";\nimport type { RegisteredTool, SubagentChildPolicy } from \"./extensions/types.ts\";\n\nexport interface NativeMcpToolIdentity {\n\treadonly server: string;\n\treadonly tool: string;\n}\n\nconst nativeToolIdentities = new WeakMap<ToolDefinition, NativeMcpToolIdentity>();\n\nexport function markNativeMcpToolDefinition(definition: ToolDefinition, identity: NativeMcpToolIdentity): void {\n\tnativeToolIdentities.set(definition, identity);\n}\n\nexport function getNativeMcpToolIdentity(definition: ToolDefinition): NativeMcpToolIdentity | undefined {\n\treturn nativeToolIdentities.get(definition);\n}\n\nexport function matchesMcpDirectToolSelection(selections: readonly string[], server: string, tool: string): boolean {\n\treturn selections.some((selection) => {\n\t\tlet end = selection.length;\n\t\twhile (end > 0 && selection[end - 1] === \"/\") end--;\n\t\tconst value = selection.slice(0, end);\n\t\treturn value === server || value === `${server}/${tool}`;\n\t});\n}\n\nexport function isSelectedNativeMcpTool(\n\tregistration: RegisteredTool,\n\tpolicy: SubagentChildPolicy | undefined,\n): boolean {\n\tif ((policy?.depth ?? 0) < 1 || !policy?.mcpDirectTools?.length) return false;\n\tif (registration.definition.exposure === \"hidden\") return false;\n\tconst { sourceInfo } = registration;\n\tif (sourceInfo.configurationOrigin !== \"bundled\") return false;\n\tif (sourceInfo.path !== \"builtin:mcp\" && getBuiltinExtensionEntryLabel(sourceInfo.path) !== \"mcp\") return false;\n\tconst identity = getNativeMcpToolIdentity(registration.definition);\n\treturn (\n\t\tidentity !== undefined && matchesMcpDirectToolSelection(policy.mcpDirectTools, identity.server, identity.tool)\n\t);\n}\n"]}
@@ -1,39 +1,48 @@
1
1
  import type { SourceInfo } from "./source-info.ts";
2
- export interface McpServerOAuthConfig {
3
- grantType?: "authorization_code" | "client_credentials";
4
- clientId?: string;
5
- clientSecret?: string;
6
- scope?: string;
2
+ export type McpExposure = "codemode" | "deferred" | "direct" | "hidden";
3
+ interface McpServerConfigBase {
4
+ exposure?: McpExposure;
5
+ description?: string;
6
+ toolExposure?: Record<string, McpExposure>;
7
+ enabled?: boolean;
8
+ timeout?: number;
7
9
  }
8
- /** One MCP server definition; the same schema as an `mcpServers` entry in `mcp.json`. */
9
- export interface McpServerConfig {
10
- command?: string;
10
+ export interface McpStdioServerConfig extends McpServerConfigBase {
11
+ type?: "stdio";
12
+ command: string;
11
13
  args?: string[];
12
14
  env?: Record<string, string>;
13
15
  cwd?: string;
14
- url?: string;
16
+ }
17
+ export interface McpHttpServerConfig extends McpServerConfigBase {
18
+ type?: "http";
19
+ url: string;
15
20
  headers?: Record<string, string>;
16
- auth?: "oauth" | "bearer" | false;
17
- bearerToken?: string;
18
- bearerTokenEnv?: string;
19
- oauth?: McpServerOAuthConfig | false;
20
- lifecycle?: "keep-alive" | "lazy" | "eager";
21
- idleTimeout?: number;
22
- exposeResources?: boolean;
23
- directTools?: boolean | string[];
24
- excludeTools?: string[];
25
- debug?: boolean;
26
- timeoutMs?: number;
27
- /** Drop the server from the effective MCP configuration. */
28
- disabled?: boolean;
21
+ oauth?: McpOAuthConfig;
22
+ auth?: {
23
+ provider: string;
24
+ };
29
25
  }
30
- /** An MCP server contributed by a package manifest or an extension's `pi.registerMcpServer()` call. */
26
+ export type McpServerConfig = McpStdioServerConfig | McpHttpServerConfig;
31
27
  export interface McpServerContribution {
32
28
  name: string;
33
29
  config: McpServerConfig;
34
- /** `package` for manifest `mcpServers`; `extension` for runtime registrations. */
35
30
  origin: "package" | "extension";
36
- /** Declaring manifest file for packages; registering extension path and its package source for extensions. */
37
31
  sourceInfo: SourceInfo;
38
32
  }
33
+ export interface McpOAuthConfig {
34
+ clientId?: string;
35
+ clientSecret?: string;
36
+ callbackPort?: number;
37
+ callbackUrl?: string;
38
+ scope?: string;
39
+ clientName?: string;
40
+ authServerMetadataUrl?: string;
41
+ }
42
+ export declare function mcpNamespace(server: string): string;
43
+ export declare function resolveMcpServerUrl(value: string): string;
44
+ export declare function isLoopbackRedirectUri(value: string): boolean;
45
+ export declare function getMcpToolExposure(config: McpServerConfig, toolName: string): McpExposure;
46
+ export declare function validateMcpServerConfig(name: string, raw: unknown): McpServerConfig | string;
47
+ export {};
39
48
  //# sourceMappingURL=mcp-servers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-servers.d.ts","sourceRoot":"","sources":["../../src/core/mcp-servers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,oBAAoB;IACpC,SAAS,CAAC,EAAE,oBAAoB,GAAG,oBAAoB,CAAC;IACxD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,yFAAyF;AACzF,MAAM,WAAW,eAAe;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,oBAAoB,GAAG,KAAK,CAAC;IACrC,SAAS,CAAC,EAAE,YAAY,GAAG,MAAM,GAAG,OAAO,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,GAAG,MAAM,EAAE,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,uGAAuG;AACvG,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,kFAAkF;IAClF,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,8GAA8G;IAC9G,UAAU,EAAE,UAAU,CAAC;CACvB"}
1
+ {"version":3,"file":"mcp-servers.d.ts","sourceRoot":"","sources":["../../src/core/mcp-servers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAMxE,UAAU,mBAAmB;IAC5B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAChE,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AACD,MAAM,WAAW,mBAAoB,SAAQ,mBAAmB;IAC/D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,IAAI,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5B;AACD,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG,mBAAmB,CAAC;AACzE,MAAM,WAAW,qBAAqB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,UAAU,EAAE,UAAU,CAAC;CACvB;AACD,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnD;AAOD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAazD;AACD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAI5D;AAiDD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,CAOzF;AACD,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,GAAG,eAAe,GAAG,MAAM,CAkD5F"}
@@ -1,2 +1,149 @@
1
- export {};
1
+ const MCP_EXPOSURES = ["codemode", "deferred", "direct", "hidden"];
2
+ const EXPOSURE_ALIASES = { "codemode-deferred": "codemode" };
3
+ const LOOPBACK_HOSTS = ["localhost", "127.0.0.1", "[::1]"];
4
+ const SERVER_NAME = /^[A-Za-z0-9_-]+$/;
5
+ export function mcpNamespace(server) {
6
+ return `mcp__${server.replace(/-/g, "_")}`;
7
+ }
8
+ function isRecord(value) {
9
+ return typeof value === "object" && value !== null && !Array.isArray(value);
10
+ }
11
+ function isStringRecord(value) {
12
+ return isRecord(value) && Object.values(value).every((entry) => typeof entry === "string");
13
+ }
14
+ export function resolveMcpServerUrl(value) {
15
+ const resolved = value.replace(/\$\{([A-Za-z_][A-Za-z0-9_]*)\}|\$env:([A-Za-z_][A-Za-z0-9_]*)/g, (_match, brace, powershell) => {
16
+ const name = brace ?? powershell;
17
+ const replacement = process.env[name];
18
+ if (replacement === undefined)
19
+ throw new Error(`MCP server URL environment variable "${name}" is not set`);
20
+ return replacement;
21
+ });
22
+ if (!URL.canParse(resolved) || !/^https?:$/.test(new URL(resolved).protocol))
23
+ throw new Error("Invalid MCP server URL after environment variable interpolation: expected HTTP(S)");
24
+ return resolved;
25
+ }
26
+ export function isLoopbackRedirectUri(value) {
27
+ if (!URL.canParse(value))
28
+ return false;
29
+ const url = new URL(value);
30
+ return url.protocol === "http:" && LOOPBACK_HOSTS.includes(url.hostname) && !url.search && !url.hash;
31
+ }
32
+ function validateOAuth(value) {
33
+ if (value === undefined)
34
+ return undefined;
35
+ if (!isRecord(value))
36
+ return "oauth must be an object";
37
+ for (const key of ["clientId", "clientSecret", "scope"])
38
+ if (value[key] !== undefined && typeof value[key] !== "string")
39
+ return `oauth.${key} must be a string`;
40
+ const port = value.callbackPort;
41
+ if (port !== undefined && (typeof port !== "number" || !Number.isInteger(port) || port < 1 || port > 65535))
42
+ return "oauth.callbackPort must be a port number";
43
+ if (value.callbackUrl !== undefined) {
44
+ if (typeof value.callbackUrl !== "string" || !isLoopbackRedirectUri(value.callbackUrl))
45
+ return "oauth.callbackUrl must be an http URI on localhost, 127.0.0.1, or [::1] without query or fragment";
46
+ const urlPort = new URL(value.callbackUrl).port;
47
+ if (urlPort && port !== undefined && Number(urlPort) !== port)
48
+ return "oauth.callbackUrl and oauth.callbackPort name different ports";
49
+ }
50
+ if (value.clientName !== undefined && (typeof value.clientName !== "string" || !value.clientName.trim()))
51
+ return "oauth.clientName must be a non-empty string";
52
+ const metadataUrl = value.authServerMetadataUrl;
53
+ if (metadataUrl !== undefined) {
54
+ const url = typeof metadataUrl === "string" && URL.canParse(metadataUrl) ? new URL(metadataUrl) : undefined;
55
+ if (!url || !(url.protocol === "https:" || (url.protocol === "http:" && LOOPBACK_HOSTS.includes(url.hostname))))
56
+ return "oauth.authServerMetadataUrl must be an https URL, or http on localhost, 127.0.0.1, or [::1]";
57
+ }
58
+ return undefined;
59
+ }
60
+ function isExposure(value) {
61
+ return typeof value === "string" && MCP_EXPOSURES.includes(value);
62
+ }
63
+ function resolveExposureAlias(value) {
64
+ return typeof value === "string" ? (EXPOSURE_ALIASES[value] ?? value) : value;
65
+ }
66
+ function resolveExposureAliases(raw) {
67
+ const value = { ...raw };
68
+ if (raw.exposure !== undefined)
69
+ value.exposure = resolveExposureAlias(raw.exposure);
70
+ if (isRecord(raw.toolExposure))
71
+ value.toolExposure = Object.fromEntries(Object.entries(raw.toolExposure).map(([tool, exposure]) => [tool, resolveExposureAlias(exposure)]));
72
+ return value;
73
+ }
74
+ function toolPatternRegExp(pattern) {
75
+ return new RegExp(`^${pattern
76
+ .split("*")
77
+ .map((part) => part.replace(/[.+?^${}()|[\]\\]/g, "\\$&"))
78
+ .join(".*")}$`);
79
+ }
80
+ export function getMcpToolExposure(config, toolName) {
81
+ const overrides = config.toolExposure ?? {};
82
+ const exact = overrides[toolName];
83
+ if (exact !== undefined)
84
+ return exact;
85
+ for (const [pattern, exposure] of Object.entries(overrides))
86
+ if (pattern.includes("*") && toolPatternRegExp(pattern).test(toolName))
87
+ return exposure;
88
+ return config.exposure ?? "codemode";
89
+ }
90
+ export function validateMcpServerConfig(name, raw) {
91
+ if (!SERVER_NAME.test(name))
92
+ return `invalid server name "${name}" (use letters, digits, "_" and "-")`;
93
+ if (!isRecord(raw))
94
+ return `server "${name}" must be an object`;
95
+ const value = resolveExposureAliases(raw);
96
+ const { type, exposure, enabled, timeout, toolExposure, description } = value;
97
+ const exposures = MCP_EXPOSURES.map((entry) => `"${entry}"`).join(", ");
98
+ if (exposure !== undefined && !isExposure(exposure))
99
+ return `server "${name}": exposure must be one of ${exposures}`;
100
+ if (toolExposure !== undefined) {
101
+ if (!isRecord(toolExposure))
102
+ return `server "${name}": toolExposure must map tool names to exposures`;
103
+ for (const [tool, entry] of Object.entries(toolExposure))
104
+ if (!isExposure(entry))
105
+ return `server "${name}": toolExposure "${tool}" must be one of ${exposures}`;
106
+ }
107
+ if (enabled !== undefined && typeof enabled !== "boolean")
108
+ return `server "${name}": enabled must be a boolean`;
109
+ if (description !== undefined && typeof description !== "string")
110
+ return `server "${name}": description must be a string`;
111
+ if (timeout !== undefined && (typeof timeout !== "number" || !(timeout > 0)))
112
+ return `server "${name}": timeout must be a positive number of seconds`;
113
+ if (type === "sse")
114
+ return `server "${name}": legacy SSE transport is not supported; use the streamable HTTP URL`;
115
+ if (typeof value.url === "string" && (type === undefined || type === "http" || type === "streamable-http")) {
116
+ let resolvedUrl;
117
+ try {
118
+ resolvedUrl = resolveMcpServerUrl(value.url);
119
+ }
120
+ catch {
121
+ return `server "${name}": url must be an http or https URL after environment variable interpolation`;
122
+ }
123
+ if (value.headers !== undefined && !isStringRecord(value.headers))
124
+ return `server "${name}": headers must map names to strings`;
125
+ const oauthError = validateOAuth(value.oauth);
126
+ if (oauthError)
127
+ return `server "${name}": ${oauthError}`;
128
+ if (value.auth !== undefined) {
129
+ if (!isRecord(value.auth) || typeof value.auth.provider !== "string" || !value.auth.provider)
130
+ return `server "${name}": auth.provider must be a provider name`;
131
+ const url = new URL(resolvedUrl);
132
+ if (url.protocol !== "https:" && !(url.protocol === "http:" && LOOPBACK_HOSTS.includes(url.hostname)))
133
+ return `server "${name}": auth requires an https URL, or http on localhost, 127.0.0.1, or [::1]`;
134
+ }
135
+ return value;
136
+ }
137
+ if (typeof value.command === "string" && (type === undefined || type === "stdio")) {
138
+ if (value.args !== undefined &&
139
+ !(Array.isArray(value.args) && value.args.every((arg) => typeof arg === "string")))
140
+ return `server "${name}": args must be an array of strings`;
141
+ if (value.env !== undefined && !isStringRecord(value.env))
142
+ return `server "${name}": env must map names to strings`;
143
+ if (value.cwd !== undefined && typeof value.cwd !== "string")
144
+ return `server "${name}": cwd must be a string`;
145
+ return value;
146
+ }
147
+ return `server "${name}" needs either "command" (stdio) or "url" (streamable HTTP)`;
148
+ }
2
149
  //# sourceMappingURL=mcp-servers.js.map