condukt 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/dist/bridge/bridge.d.ts +34 -0
  2. package/dist/bridge/bridge.d.ts.map +1 -0
  3. package/dist/bridge/bridge.js +365 -0
  4. package/dist/bridge/bridge.js.map +1 -0
  5. package/dist/bridge/index.d.ts +3 -0
  6. package/dist/bridge/index.d.ts.map +1 -0
  7. package/dist/bridge/index.js +6 -0
  8. package/dist/bridge/index.js.map +1 -0
  9. package/dist/runtimes/copilot/copilot-adapter.d.ts +28 -0
  10. package/dist/runtimes/copilot/copilot-adapter.d.ts.map +1 -0
  11. package/dist/runtimes/copilot/copilot-adapter.js +50 -0
  12. package/dist/runtimes/copilot/copilot-adapter.js.map +1 -0
  13. package/dist/runtimes/copilot/copilot-backend.d.ts +49 -0
  14. package/dist/runtimes/copilot/copilot-backend.d.ts.map +1 -0
  15. package/dist/runtimes/copilot/copilot-backend.js +13 -0
  16. package/dist/runtimes/copilot/copilot-backend.js.map +1 -0
  17. package/dist/runtimes/copilot/index.d.ts +5 -0
  18. package/dist/runtimes/copilot/index.d.ts.map +1 -0
  19. package/dist/runtimes/copilot/index.js +11 -0
  20. package/dist/runtimes/copilot/index.js.map +1 -0
  21. package/dist/runtimes/copilot/process-killer.d.ts +13 -0
  22. package/dist/runtimes/copilot/process-killer.d.ts.map +1 -0
  23. package/dist/runtimes/copilot/process-killer.js +77 -0
  24. package/dist/runtimes/copilot/process-killer.js.map +1 -0
  25. package/dist/runtimes/copilot/subprocess-backend.d.ts +26 -0
  26. package/dist/runtimes/copilot/subprocess-backend.d.ts.map +1 -0
  27. package/dist/runtimes/copilot/subprocess-backend.js +308 -0
  28. package/dist/runtimes/copilot/subprocess-backend.js.map +1 -0
  29. package/dist/runtimes/mock/index.d.ts +3 -0
  30. package/dist/runtimes/mock/index.d.ts.map +1 -0
  31. package/dist/runtimes/mock/index.js +6 -0
  32. package/dist/runtimes/mock/index.js.map +1 -0
  33. package/dist/runtimes/mock/mock-runtime.d.ts +43 -0
  34. package/dist/runtimes/mock/mock-runtime.d.ts.map +1 -0
  35. package/dist/runtimes/mock/mock-runtime.js +153 -0
  36. package/dist/runtimes/mock/mock-runtime.js.map +1 -0
  37. package/dist/src/agent.d.ts +35 -0
  38. package/dist/src/agent.d.ts.map +1 -0
  39. package/dist/src/agent.js +257 -0
  40. package/dist/src/agent.js.map +1 -0
  41. package/dist/src/events.d.ts +153 -0
  42. package/dist/src/events.d.ts.map +1 -0
  43. package/dist/src/events.js +11 -0
  44. package/dist/src/events.js.map +1 -0
  45. package/dist/src/index.d.ts +8 -0
  46. package/dist/src/index.d.ts.map +1 -0
  47. package/dist/src/index.js +24 -0
  48. package/dist/src/index.js.map +1 -0
  49. package/dist/src/nodes.d.ts +63 -0
  50. package/dist/src/nodes.d.ts.map +1 -0
  51. package/dist/src/nodes.js +120 -0
  52. package/dist/src/nodes.js.map +1 -0
  53. package/dist/src/scheduler.d.ts +11 -0
  54. package/dist/src/scheduler.d.ts.map +1 -0
  55. package/dist/src/scheduler.js +478 -0
  56. package/dist/src/scheduler.js.map +1 -0
  57. package/dist/src/types.d.ts +201 -0
  58. package/dist/src/types.d.ts.map +1 -0
  59. package/dist/src/types.js +38 -0
  60. package/dist/src/types.js.map +1 -0
  61. package/dist/src/verify.d.ts +51 -0
  62. package/dist/src/verify.d.ts.map +1 -0
  63. package/dist/src/verify.js +126 -0
  64. package/dist/src/verify.js.map +1 -0
  65. package/dist/state/index.d.ts +5 -0
  66. package/dist/state/index.d.ts.map +1 -0
  67. package/dist/state/index.js +14 -0
  68. package/dist/state/index.js.map +1 -0
  69. package/dist/state/reducer.d.ts +11 -0
  70. package/dist/state/reducer.d.ts.map +1 -0
  71. package/dist/state/reducer.js +223 -0
  72. package/dist/state/reducer.js.map +1 -0
  73. package/dist/state/state-runtime.d.ts +30 -0
  74. package/dist/state/state-runtime.d.ts.map +1 -0
  75. package/dist/state/state-runtime.js +131 -0
  76. package/dist/state/state-runtime.js.map +1 -0
  77. package/dist/state/storage-memory.d.ts +24 -0
  78. package/dist/state/storage-memory.d.ts.map +1 -0
  79. package/dist/state/storage-memory.js +91 -0
  80. package/dist/state/storage-memory.js.map +1 -0
  81. package/dist/state/storage.d.ts +29 -0
  82. package/dist/state/storage.d.ts.map +1 -0
  83. package/dist/state/storage.js +175 -0
  84. package/dist/state/storage.js.map +1 -0
  85. package/dist/theme/index.d.ts +128 -0
  86. package/dist/theme/index.d.ts.map +1 -0
  87. package/dist/theme/index.js +59 -0
  88. package/dist/theme/index.js.map +1 -0
  89. package/dist/ui/ansi.d.ts +9 -0
  90. package/dist/ui/ansi.d.ts.map +1 -0
  91. package/dist/ui/ansi.js +78 -0
  92. package/dist/ui/ansi.js.map +1 -0
  93. package/dist/ui/components/FlowEdge.d.ts +5 -0
  94. package/dist/ui/components/FlowEdge.d.ts.map +1 -0
  95. package/dist/ui/components/FlowEdge.js +33 -0
  96. package/dist/ui/components/FlowEdge.js.map +1 -0
  97. package/dist/ui/components/FlowGraph.d.ts +10 -0
  98. package/dist/ui/components/FlowGraph.d.ts.map +1 -0
  99. package/dist/ui/components/FlowGraph.js +124 -0
  100. package/dist/ui/components/FlowGraph.js.map +1 -0
  101. package/dist/ui/components/FlowStatusBar.d.ts +7 -0
  102. package/dist/ui/components/FlowStatusBar.d.ts.map +1 -0
  103. package/dist/ui/components/FlowStatusBar.js +27 -0
  104. package/dist/ui/components/FlowStatusBar.js.map +1 -0
  105. package/dist/ui/components/MiniPipeline.d.ts +10 -0
  106. package/dist/ui/components/MiniPipeline.d.ts.map +1 -0
  107. package/dist/ui/components/MiniPipeline.js +155 -0
  108. package/dist/ui/components/MiniPipeline.js.map +1 -0
  109. package/dist/ui/components/NodeCard.d.ts +5 -0
  110. package/dist/ui/components/NodeCard.d.ts.map +1 -0
  111. package/dist/ui/components/NodeCard.js +39 -0
  112. package/dist/ui/components/NodeCard.js.map +1 -0
  113. package/dist/ui/components/NodeDetailPanel.d.ts +10 -0
  114. package/dist/ui/components/NodeDetailPanel.d.ts.map +1 -0
  115. package/dist/ui/components/NodeDetailPanel.js +38 -0
  116. package/dist/ui/components/NodeDetailPanel.js.map +1 -0
  117. package/dist/ui/components/node-panel/Controls.d.ts +16 -0
  118. package/dist/ui/components/node-panel/Controls.d.ts.map +1 -0
  119. package/dist/ui/components/node-panel/Controls.js +28 -0
  120. package/dist/ui/components/node-panel/Controls.js.map +1 -0
  121. package/dist/ui/components/node-panel/ErrorBar.d.ts +6 -0
  122. package/dist/ui/components/node-panel/ErrorBar.d.ts.map +1 -0
  123. package/dist/ui/components/node-panel/ErrorBar.js +14 -0
  124. package/dist/ui/components/node-panel/ErrorBar.js.map +1 -0
  125. package/dist/ui/components/node-panel/Gate.d.ts +13 -0
  126. package/dist/ui/components/node-panel/Gate.d.ts.map +1 -0
  127. package/dist/ui/components/node-panel/Gate.js +40 -0
  128. package/dist/ui/components/node-panel/Gate.js.map +1 -0
  129. package/dist/ui/components/node-panel/Header.d.ts +10 -0
  130. package/dist/ui/components/node-panel/Header.d.ts.map +1 -0
  131. package/dist/ui/components/node-panel/Header.js +19 -0
  132. package/dist/ui/components/node-panel/Header.js.map +1 -0
  133. package/dist/ui/components/node-panel/Info.d.ts +7 -0
  134. package/dist/ui/components/node-panel/Info.d.ts.map +1 -0
  135. package/dist/ui/components/node-panel/Info.js +23 -0
  136. package/dist/ui/components/node-panel/Info.js.map +1 -0
  137. package/dist/ui/components/node-panel/Output.d.ts +27 -0
  138. package/dist/ui/components/node-panel/Output.d.ts.map +1 -0
  139. package/dist/ui/components/node-panel/Output.js +66 -0
  140. package/dist/ui/components/node-panel/Output.js.map +1 -0
  141. package/dist/ui/components/node-panel/index.d.ts +47 -0
  142. package/dist/ui/components/node-panel/index.d.ts.map +1 -0
  143. package/dist/ui/components/node-panel/index.js +54 -0
  144. package/dist/ui/components/node-panel/index.js.map +1 -0
  145. package/dist/ui/components/node-panel/types.d.ts +23 -0
  146. package/dist/ui/components/node-panel/types.d.ts.map +1 -0
  147. package/dist/ui/components/node-panel/types.js +24 -0
  148. package/dist/ui/components/node-panel/types.js.map +1 -0
  149. package/dist/ui/core/components/Badge.d.ts +6 -0
  150. package/dist/ui/core/components/Badge.d.ts.map +1 -0
  151. package/dist/ui/core/components/Badge.js +11 -0
  152. package/dist/ui/core/components/Badge.js.map +1 -0
  153. package/dist/ui/core/components/Button.d.ts +9 -0
  154. package/dist/ui/core/components/Button.d.ts.map +1 -0
  155. package/dist/ui/core/components/Button.js +18 -0
  156. package/dist/ui/core/components/Button.js.map +1 -0
  157. package/dist/ui/core/components/ConfirmDialog.d.ts +11 -0
  158. package/dist/ui/core/components/ConfirmDialog.d.ts.map +1 -0
  159. package/dist/ui/core/components/ConfirmDialog.js +23 -0
  160. package/dist/ui/core/components/ConfirmDialog.js.map +1 -0
  161. package/dist/ui/core/components/ExecutionCard.d.ts +12 -0
  162. package/dist/ui/core/components/ExecutionCard.d.ts.map +1 -0
  163. package/dist/ui/core/components/ExecutionCard.js +15 -0
  164. package/dist/ui/core/components/ExecutionCard.js.map +1 -0
  165. package/dist/ui/core/components/NodeListItem.d.ts +10 -0
  166. package/dist/ui/core/components/NodeListItem.d.ts.map +1 -0
  167. package/dist/ui/core/components/NodeListItem.js +27 -0
  168. package/dist/ui/core/components/NodeListItem.js.map +1 -0
  169. package/dist/ui/core/components/PageHeader.d.ts +10 -0
  170. package/dist/ui/core/components/PageHeader.d.ts.map +1 -0
  171. package/dist/ui/core/components/PageHeader.js +9 -0
  172. package/dist/ui/core/components/PageHeader.js.map +1 -0
  173. package/dist/ui/core/components/SectionLabel.d.ts +6 -0
  174. package/dist/ui/core/components/SectionLabel.d.ts.map +1 -0
  175. package/dist/ui/core/components/SectionLabel.js +9 -0
  176. package/dist/ui/core/components/SectionLabel.js.map +1 -0
  177. package/dist/ui/core/components/Skeleton.d.ts +7 -0
  178. package/dist/ui/core/components/Skeleton.d.ts.map +1 -0
  179. package/dist/ui/core/components/Skeleton.js +26 -0
  180. package/dist/ui/core/components/Skeleton.js.map +1 -0
  181. package/dist/ui/core/components/Stat.d.ts +8 -0
  182. package/dist/ui/core/components/Stat.d.ts.map +1 -0
  183. package/dist/ui/core/components/Stat.js +9 -0
  184. package/dist/ui/core/components/Stat.js.map +1 -0
  185. package/dist/ui/core/components/Toast.d.ts +7 -0
  186. package/dist/ui/core/components/Toast.d.ts.map +1 -0
  187. package/dist/ui/core/components/Toast.js +28 -0
  188. package/dist/ui/core/components/Toast.js.map +1 -0
  189. package/dist/ui/core/components/__tests__/primitives.test.d.ts +2 -0
  190. package/dist/ui/core/components/__tests__/primitives.test.d.ts.map +1 -0
  191. package/dist/ui/core/components/__tests__/primitives.test.js +3 -0
  192. package/dist/ui/core/components/__tests__/primitives.test.js.map +1 -0
  193. package/dist/ui/core/components/index.d.ts +21 -0
  194. package/dist/ui/core/components/index.d.ts.map +1 -0
  195. package/dist/ui/core/components/index.js +24 -0
  196. package/dist/ui/core/components/index.js.map +1 -0
  197. package/dist/ui/core/index.d.ts +17 -0
  198. package/dist/ui/core/index.d.ts.map +1 -0
  199. package/dist/ui/core/index.js +56 -0
  200. package/dist/ui/core/index.js.map +1 -0
  201. package/dist/ui/core/utils.d.ts +6 -0
  202. package/dist/ui/core/utils.d.ts.map +1 -0
  203. package/dist/ui/core/utils.js +32 -0
  204. package/dist/ui/core/utils.js.map +1 -0
  205. package/dist/ui/graph/index.d.ts +4 -0
  206. package/dist/ui/graph/index.d.ts.map +1 -0
  207. package/dist/ui/graph/index.js +11 -0
  208. package/dist/ui/graph/index.js.map +1 -0
  209. package/dist/ui/hooks/useAutoSelectNode.d.ts +3 -0
  210. package/dist/ui/hooks/useAutoSelectNode.d.ts.map +1 -0
  211. package/dist/ui/hooks/useAutoSelectNode.js +36 -0
  212. package/dist/ui/hooks/useAutoSelectNode.js.map +1 -0
  213. package/dist/ui/hooks/useFlowExecution.d.ts +32 -0
  214. package/dist/ui/hooks/useFlowExecution.d.ts.map +1 -0
  215. package/dist/ui/hooks/useFlowExecution.js +113 -0
  216. package/dist/ui/hooks/useFlowExecution.js.map +1 -0
  217. package/dist/ui/hooks/useNodeNavigation.d.ts +3 -0
  218. package/dist/ui/hooks/useNodeNavigation.d.ts.map +1 -0
  219. package/dist/ui/hooks/useNodeNavigation.js +38 -0
  220. package/dist/ui/hooks/useNodeNavigation.js.map +1 -0
  221. package/dist/ui/hooks/useNodeOutput.d.ts +21 -0
  222. package/dist/ui/hooks/useNodeOutput.d.ts.map +1 -0
  223. package/dist/ui/hooks/useNodeOutput.js +75 -0
  224. package/dist/ui/hooks/useNodeOutput.js.map +1 -0
  225. package/dist/ui/index.d.ts +16 -0
  226. package/dist/ui/index.d.ts.map +1 -0
  227. package/dist/ui/index.js +37 -0
  228. package/dist/ui/index.js.map +1 -0
  229. package/dist/ui/utils.d.ts +3 -0
  230. package/dist/ui/utils.d.ts.map +1 -0
  231. package/dist/ui/utils.js +9 -0
  232. package/dist/ui/utils.js.map +1 -0
  233. package/package.json +87 -0
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.isProcessAlive = isProcessAlive;
37
+ exports.killProcessTree = killProcessTree;
38
+ const cp = __importStar(require("child_process"));
39
+ /**
40
+ * Check if a process with the given PID is alive.
41
+ * Uses `process.kill(pid, 0)` which sends signal 0 (no-op) to probe existence.
42
+ */
43
+ function isProcessAlive(pid) {
44
+ try {
45
+ process.kill(pid, 0);
46
+ return true;
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ }
52
+ /**
53
+ * Kill a process and its entire tree.
54
+ * On Windows, uses `taskkill /T /F /PID <pid>`.
55
+ * On other platforms, uses `kill -9 <pid>`.
56
+ * Does not throw if the process does not exist.
57
+ */
58
+ async function killProcessTree(pid) {
59
+ try {
60
+ if (process.platform === 'win32') {
61
+ cp.spawnSync('taskkill', ['/T', '/F', '/PID', String(pid)], {
62
+ stdio: 'ignore',
63
+ timeout: 10_000,
64
+ });
65
+ }
66
+ else {
67
+ cp.spawnSync('kill', ['-9', String(pid)], {
68
+ stdio: 'ignore',
69
+ timeout: 10_000,
70
+ });
71
+ }
72
+ }
73
+ catch {
74
+ // Process may already be dead -- silently ignore
75
+ }
76
+ }
77
+ //# sourceMappingURL=process-killer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-killer.js","sourceRoot":"","sources":["../../../runtimes/copilot/process-killer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,wCAOC;AAQD,0CAgBC;AArCD,kDAAoC;AAEpC;;;GAGG;AACH,SAAgB,cAAc,CAAC,GAAW;IACxC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,IAAI,CAAC;QACH,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACjC,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBAC1D,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;gBACxC,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { CopilotBackend, CopilotSession, SessionConfig } from './copilot-backend';
2
+ type CommandFactory = (config: SessionConfig) => readonly [string, readonly string[]];
3
+ export interface SubprocessBackendOptions {
4
+ commandFactory?: CommandFactory;
5
+ /** Extra directories to add to PATH (e.g. .tools/bin, Kusto CLI). */
6
+ extraPathDirs?: readonly string[];
7
+ /** Additional tool names to resolve and add to PATH (e.g. ['az', 'dotnet']). */
8
+ pathTools?: readonly string[];
9
+ /** Path to MCP config file. If provided and exists, passed via --additional-mcp-config. */
10
+ mcpConfigPath?: string;
11
+ }
12
+ /**
13
+ * CopilotBackend implementation using child_process.spawn.
14
+ * Spawns the copilot CLI as a subprocess and communicates via stdin/stdout.
15
+ */
16
+ export declare class SubprocessBackend implements CopilotBackend {
17
+ readonly name = "subprocess";
18
+ private readonly commandFactory;
19
+ private readonly extraPathDirs;
20
+ private readonly pathTools;
21
+ constructor(options?: SubprocessBackendOptions);
22
+ isAvailable(): Promise<boolean>;
23
+ createSession(config: SessionConfig): Promise<CopilotSession>;
24
+ }
25
+ export {};
26
+ //# sourceMappingURL=subprocess-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subprocess-backend.d.ts","sourceRoot":"","sources":["../../../runtimes/copilot/subprocess-backend.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGvF,KAAK,cAAc,GAAG,CAAC,MAAM,EAAE,aAAa,KAAK,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;AAqCtF,MAAM,WAAW,wBAAwB;IACvC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,qEAAqE;IACrE,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,gFAAgF;IAChF,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,2FAA2F;IAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAkED;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,cAAc;IACtD,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;gBAElC,OAAO,GAAE,wBAA6B;IAM5C,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAM/B,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;CAGpE"}
@@ -0,0 +1,308 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SubprocessBackend = void 0;
37
+ const cp = __importStar(require("child_process"));
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const child_process_1 = require("child_process");
41
+ const readline_1 = require("readline");
42
+ const process_killer_1 = require("./process-killer");
43
+ /**
44
+ * Dynamically resolve directories for tools that agents need on PATH.
45
+ * Uses `where` (Windows) or `which` to find each tool, then extracts
46
+ * the directory. Cached after first call — tool locations don't change
47
+ * within a server session.
48
+ */
49
+ // Generic tools every agent subprocess needs for basic operation.
50
+ // Domain-specific tools (az, dotnet, etc.) are passed via pathTools option.
51
+ const GENERIC_PATH_TOOLS = ['cmd', 'pwsh', 'powershell', 'git', 'node', 'npm'];
52
+ let _cachedToolDirs = new Map();
53
+ function resolveToolDirs(tools) {
54
+ const key = tools.join(',');
55
+ if (_cachedToolDirs.has(key))
56
+ return _cachedToolDirs.get(key);
57
+ const locate = process.platform === 'win32' ? 'where' : 'which';
58
+ const dirs = new Set();
59
+ for (const tool of tools) {
60
+ try {
61
+ const result = cp.spawnSync(locate, [tool], { stdio: 'pipe', encoding: 'utf-8', timeout: 3000 });
62
+ if (result.status === 0 && result.stdout) {
63
+ const toolPath = result.stdout.trim().split(/\r?\n/)[0];
64
+ if (toolPath)
65
+ dirs.add(path.dirname(toolPath));
66
+ }
67
+ }
68
+ catch {
69
+ // Tool not installed — skip
70
+ }
71
+ }
72
+ const resolved = [...dirs];
73
+ _cachedToolDirs.set(key, resolved);
74
+ return resolved;
75
+ }
76
+ /**
77
+ * Resolve the absolute path to the copilot CLI binary.
78
+ * Priority: COPILOT_PATH env var > WinGet Links > PATH resolution.
79
+ * Cached after first call.
80
+ */
81
+ let _cachedCopilotPath = null;
82
+ function resolveCopilotPath() {
83
+ if (_cachedCopilotPath)
84
+ return _cachedCopilotPath;
85
+ // 1. Explicit env var override
86
+ if (process.env.COPILOT_PATH) {
87
+ _cachedCopilotPath = process.env.COPILOT_PATH;
88
+ return _cachedCopilotPath;
89
+ }
90
+ // 2. Check the WinGet links directory (where winget installs copilot on Windows)
91
+ if (process.platform === 'win32') {
92
+ const wingetPath = path.join(process.env.LOCALAPPDATA ?? '', 'Microsoft', 'WinGet', 'Links', 'copilot.exe');
93
+ if (fs.existsSync(wingetPath)) {
94
+ _cachedCopilotPath = wingetPath;
95
+ return _cachedCopilotPath;
96
+ }
97
+ }
98
+ // 3. Fall back to bare 'copilot' (PATH resolution by the OS)
99
+ _cachedCopilotPath = 'copilot';
100
+ return _cachedCopilotPath;
101
+ }
102
+ /**
103
+ * Default command factory: spawns `copilot` CLI with the configured model.
104
+ */
105
+ function createDefaultCommandFactory(options) {
106
+ return (config) => {
107
+ const args = [
108
+ '--model', config.model,
109
+ '--allow-all', // Auto-approve all tool permissions (file, bash, URLs)
110
+ '--no-ask-user', // Agent works autonomously, never asks the user questions
111
+ '--autopilot', // Multi-turn: agent keeps working until task is complete
112
+ '--experimental', // Enable experimental features (extended thinking, etc.)
113
+ '--no-alt-screen', // Don't use alternate screen buffer (we capture stdout)
114
+ ];
115
+ if (config.addDirs.length === 0) {
116
+ // Isolation mode: no extra directories
117
+ }
118
+ else {
119
+ for (const dir of config.addDirs) {
120
+ args.push('--add-dir', dir);
121
+ }
122
+ }
123
+ // Load MCP config if provided and exists
124
+ if (options.mcpConfigPath && fs.existsSync(options.mcpConfigPath)) {
125
+ args.push('--additional-mcp-config', `@${options.mcpConfigPath}`);
126
+ }
127
+ const copilotPath = resolveCopilotPath();
128
+ return [copilotPath, args];
129
+ };
130
+ }
131
+ /**
132
+ * CopilotBackend implementation using child_process.spawn.
133
+ * Spawns the copilot CLI as a subprocess and communicates via stdin/stdout.
134
+ */
135
+ class SubprocessBackend {
136
+ name = 'subprocess';
137
+ commandFactory;
138
+ extraPathDirs;
139
+ pathTools;
140
+ constructor(options = {}) {
141
+ this.commandFactory = options.commandFactory ?? createDefaultCommandFactory(options);
142
+ this.extraPathDirs = options.extraPathDirs ?? [];
143
+ this.pathTools = options.pathTools ?? [];
144
+ }
145
+ async isAvailable() {
146
+ const cmd = process.platform === 'win32' ? 'where' : 'which';
147
+ const result = cp.spawnSync(cmd, ['copilot'], { stdio: 'pipe' });
148
+ return result.status === 0;
149
+ }
150
+ async createSession(config) {
151
+ return new SubprocessSession(config, this.commandFactory, this.extraPathDirs, this.pathTools);
152
+ }
153
+ }
154
+ exports.SubprocessBackend = SubprocessBackend;
155
+ class SubprocessSession {
156
+ child = null;
157
+ handlers = [];
158
+ config;
159
+ commandFactory;
160
+ extraPathDirs;
161
+ pathTools;
162
+ timeoutTimer = null;
163
+ heartbeatTimer = null;
164
+ aborted = false;
165
+ get pid() {
166
+ return this.child?.pid ?? null;
167
+ }
168
+ constructor(config, commandFactory, extraPathDirs, pathTools) {
169
+ this.config = config;
170
+ this.commandFactory = commandFactory;
171
+ this.extraPathDirs = extraPathDirs;
172
+ this.pathTools = pathTools;
173
+ }
174
+ send(prompt) {
175
+ const [cmd, args] = this.commandFactory(this.config);
176
+ // Strip NODE_OPTIONS from environment to prevent --no-warnings
177
+ // (and other Node flags) from leaking into the copilot CLI subprocess
178
+ const env = { ...process.env };
179
+ delete env.NODE_OPTIONS;
180
+ // Build PATH with extra directories
181
+ const pathSep = process.platform === 'win32' ? ';' : ':';
182
+ const extraPaths = [...this.extraPathDirs];
183
+ // Ensure all required executables are on PATH.
184
+ // PATH can get lost or rewritten in deep subprocess chains
185
+ // (Node.js → copilot CLI → agent → bash → tool).
186
+ // Detect each tool's directory dynamically via the OS locate command.
187
+ // Resolve generic tools + composition-specific tools
188
+ for (const dir of resolveToolDirs([...GENERIC_PATH_TOOLS, ...this.pathTools])) {
189
+ if (!env.PATH?.includes(dir))
190
+ extraPaths.push(dir);
191
+ }
192
+ env.PATH = `${env.PATH ?? ''}${pathSep}${extraPaths.join(pathSep)}`;
193
+ this.child = (0, child_process_1.spawn)(cmd, [...args], {
194
+ cwd: this.config.cwd,
195
+ stdio: ['pipe', 'pipe', 'pipe'],
196
+ env,
197
+ });
198
+ // Write prompt to stdin and close it
199
+ if (this.child.stdin) {
200
+ this.child.stdin.write(prompt);
201
+ this.child.stdin.end();
202
+ }
203
+ // Set up hard timeout
204
+ this.timeoutTimer = setTimeout(() => {
205
+ this.emitError(new Error(`Session timed out after ${this.config.timeout}s`));
206
+ this.abort();
207
+ }, this.config.timeout * 1000);
208
+ // Set up heartbeat timeout
209
+ this.resetHeartbeat();
210
+ // Stream stdout LINE BY LINE using readline
211
+ // (raw 'data' events split at arbitrary byte boundaries, breaking words mid-line)
212
+ if (this.child.stdout) {
213
+ const rl = (0, readline_1.createInterface)({ input: this.child.stdout });
214
+ rl.on('line', (line) => {
215
+ this.resetHeartbeat();
216
+ this.emit('text', line);
217
+ });
218
+ }
219
+ // Stream stderr line by line, filtering known noise
220
+ if (this.child.stderr) {
221
+ const rlErr = (0, readline_1.createInterface)({ input: this.child.stderr });
222
+ rlErr.on('line', (line) => {
223
+ this.resetHeartbeat();
224
+ // Filter out Node.js --no-warnings noise that leaks from the parent
225
+ // environment. These are not real errors from copilot.
226
+ if (line.includes("unknown option '--no-warnings'") ||
227
+ line.includes("Try 'copilot --help' for more information")) {
228
+ return; // Swallow silently -- not actionable, not from copilot
229
+ }
230
+ // Skip empty stderr lines (copilot emits blank lines on stderr between warnings)
231
+ if (line.trim() === '')
232
+ return;
233
+ this.emit('text', `[stderr] ${line}`);
234
+ });
235
+ }
236
+ // Process exit
237
+ this.child.on('close', (code) => {
238
+ this.clearTimers();
239
+ if (this.aborted)
240
+ return;
241
+ if (code === 0 || code === null) {
242
+ this.emit('idle');
243
+ }
244
+ else {
245
+ this.emitError(new Error(`Process exited with code ${code}`));
246
+ }
247
+ });
248
+ this.child.on('error', (err) => {
249
+ this.clearTimers();
250
+ if (!this.aborted) {
251
+ this.emitError(err);
252
+ }
253
+ });
254
+ }
255
+ on(event, handler) {
256
+ this.handlers.push({ event, handler });
257
+ }
258
+ async abort() {
259
+ if (this.aborted)
260
+ return; // Prevent double-abort
261
+ this.clearTimers();
262
+ this.emitError(new Error('Session aborted')); // Resolve step-executor Promise FIRST
263
+ this.aborted = true; // THEN mark as aborted so close handler skips
264
+ if (this.child) {
265
+ // Try to kill via Node first
266
+ try {
267
+ this.child.kill('SIGKILL');
268
+ }
269
+ catch {
270
+ // May fail if already dead
271
+ }
272
+ // Then use platform-specific tree kill for any child processes
273
+ if (this.child.pid) {
274
+ await (0, process_killer_1.killProcessTree)(this.child.pid);
275
+ }
276
+ }
277
+ }
278
+ emit(event, ...args) {
279
+ for (const h of this.handlers) {
280
+ if (h.event === event) {
281
+ h.handler(...args);
282
+ }
283
+ }
284
+ }
285
+ emitError(err) {
286
+ this.emit('error', err);
287
+ }
288
+ resetHeartbeat() {
289
+ if (this.heartbeatTimer) {
290
+ clearTimeout(this.heartbeatTimer);
291
+ }
292
+ this.heartbeatTimer = setTimeout(() => {
293
+ this.emitError(new Error(`No output for ${this.config.heartbeatTimeout}s (heartbeat timeout)`));
294
+ this.abort();
295
+ }, this.config.heartbeatTimeout * 1000);
296
+ }
297
+ clearTimers() {
298
+ if (this.timeoutTimer) {
299
+ clearTimeout(this.timeoutTimer);
300
+ this.timeoutTimer = null;
301
+ }
302
+ if (this.heartbeatTimer) {
303
+ clearTimeout(this.heartbeatTimer);
304
+ this.heartbeatTimer = null;
305
+ }
306
+ }
307
+ }
308
+ //# sourceMappingURL=subprocess-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subprocess-backend.js","sourceRoot":"","sources":["../../../runtimes/copilot/subprocess-backend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { MockRuntime } from './mock-runtime';
2
+ export type { MockNodeConfig } from './mock-runtime';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../runtimes/mock/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MockRuntime = void 0;
4
+ var mock_runtime_1 = require("./mock-runtime");
5
+ Object.defineProperty(exports, "MockRuntime", { enumerable: true, get: function () { return mock_runtime_1.MockRuntime; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../runtimes/mock/index.ts"],"names":[],"mappings":";;;AAAA,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Deterministic mock AgentRuntime for testing.
3
+ *
4
+ * Accepts per-node configuration to produce predictable text, tool,
5
+ * artifact, and error events. Useful for unit and integration tests
6
+ * that need a controllable runtime without real subprocesses.
7
+ */
8
+ import type { AgentRuntime, AgentSession, SessionConfig } from '../../src/types';
9
+ export interface MockNodeConfig {
10
+ /** Text lines to emit (each becomes a 'text' event). */
11
+ text?: string[];
12
+ /** Tool call sequence to emit as tool_start / tool_complete pairs. */
13
+ tools?: Array<{
14
+ name: string;
15
+ input: string;
16
+ output: string;
17
+ }>;
18
+ /** Artifact content to write to `<cwd>/<artifactFilename>` (if provided). */
19
+ artifact?: string;
20
+ /** If provided, emit this error instead of idle. */
21
+ error?: Error;
22
+ /** Delay in milliseconds before emitting events (simulates work). */
23
+ delay?: number;
24
+ }
25
+ /**
26
+ * A deterministic mock runtime that replays configured events per node.
27
+ *
28
+ * The node is identified by the `cwd` basename of the SessionConfig —
29
+ * this maps to how the scheduler sets `cwd` to include the node directory.
30
+ * Alternatively, callers can provide a `nodeResolver` function to map
31
+ * SessionConfig to a config key.
32
+ */
33
+ export declare class MockRuntime implements AgentRuntime {
34
+ readonly name = "mock";
35
+ private readonly configs;
36
+ private readonly nodeResolver;
37
+ constructor(configs: Record<string, MockNodeConfig>, options?: {
38
+ nodeResolver?: (config: SessionConfig) => string;
39
+ });
40
+ isAvailable(): Promise<boolean>;
41
+ createSession(config: SessionConfig): Promise<AgentSession>;
42
+ }
43
+ //# sourceMappingURL=mock-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-runtime.d.ts","sourceRoot":"","sources":["../../../runtimes/mock/mock-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIjF,MAAM,WAAW,cAAc;IAC7B,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,sEAAsE;IACtE,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AASD;;;;;;;GAOG;AACH,qBAAa,WAAY,YAAW,YAAY;IAC9C,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoC;gBAG/D,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,EACvC,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,MAAM,CAAA;KAAE;IAM1D,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;CAKlE"}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ /**
3
+ * Deterministic mock AgentRuntime for testing.
4
+ *
5
+ * Accepts per-node configuration to produce predictable text, tool,
6
+ * artifact, and error events. Useful for unit and integration tests
7
+ * that need a controllable runtime without real subprocesses.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.MockRuntime = void 0;
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ /**
47
+ * A deterministic mock runtime that replays configured events per node.
48
+ *
49
+ * The node is identified by the `cwd` basename of the SessionConfig —
50
+ * this maps to how the scheduler sets `cwd` to include the node directory.
51
+ * Alternatively, callers can provide a `nodeResolver` function to map
52
+ * SessionConfig to a config key.
53
+ */
54
+ class MockRuntime {
55
+ name = 'mock';
56
+ configs;
57
+ nodeResolver;
58
+ constructor(configs, options) {
59
+ this.configs = configs;
60
+ this.nodeResolver = options?.nodeResolver ?? ((config) => path.basename(config.cwd));
61
+ }
62
+ async isAvailable() {
63
+ return true;
64
+ }
65
+ async createSession(config) {
66
+ const nodeKey = this.nodeResolver(config);
67
+ const nodeConfig = this.configs[nodeKey] ?? {};
68
+ return new MockAgentSession(nodeConfig, config.cwd);
69
+ }
70
+ }
71
+ exports.MockRuntime = MockRuntime;
72
+ class MockAgentSession {
73
+ pid = null;
74
+ handlers = [];
75
+ nodeConfig;
76
+ cwd;
77
+ aborted = false;
78
+ timer = null;
79
+ constructor(nodeConfig, cwd) {
80
+ this.nodeConfig = nodeConfig;
81
+ this.cwd = cwd;
82
+ }
83
+ send(_prompt) {
84
+ const delay = this.nodeConfig.delay ?? 0;
85
+ const execute = () => {
86
+ if (this.aborted)
87
+ return;
88
+ // Emit text events
89
+ if (this.nodeConfig.text) {
90
+ for (const line of this.nodeConfig.text) {
91
+ if (this.aborted)
92
+ return;
93
+ this.emit('text', line);
94
+ }
95
+ }
96
+ // Emit tool events
97
+ if (this.nodeConfig.tools) {
98
+ for (const tool of this.nodeConfig.tools) {
99
+ if (this.aborted)
100
+ return;
101
+ this.emit('tool_start', tool.name, tool.input);
102
+ this.emit('tool_complete', tool.name, tool.output);
103
+ }
104
+ }
105
+ // Write artifact if configured
106
+ if (this.nodeConfig.artifact !== undefined) {
107
+ try {
108
+ // Write the artifact content to a file named 'output.md' in cwd
109
+ const artifactPath = path.join(this.cwd, 'output.md');
110
+ fs.mkdirSync(this.cwd, { recursive: true });
111
+ fs.writeFileSync(artifactPath, this.nodeConfig.artifact, 'utf-8');
112
+ }
113
+ catch {
114
+ // Best effort — test may not have a writable cwd
115
+ }
116
+ }
117
+ if (this.aborted)
118
+ return;
119
+ // Emit error or idle
120
+ if (this.nodeConfig.error) {
121
+ this.emit('error', this.nodeConfig.error);
122
+ }
123
+ else {
124
+ this.emit('idle');
125
+ }
126
+ };
127
+ if (delay > 0) {
128
+ this.timer = setTimeout(execute, delay);
129
+ }
130
+ else {
131
+ // Use microtask to keep async behavior consistent
132
+ queueMicrotask(execute);
133
+ }
134
+ }
135
+ on(event, handler) {
136
+ this.handlers.push({ event, handler });
137
+ }
138
+ async abort() {
139
+ this.aborted = true;
140
+ if (this.timer) {
141
+ clearTimeout(this.timer);
142
+ this.timer = null;
143
+ }
144
+ }
145
+ emit(event, ...args) {
146
+ for (const h of this.handlers) {
147
+ if (h.event === event) {
148
+ h.handler(...args);
149
+ }
150
+ }
151
+ }
152
+ }
153
+ //# sourceMappingURL=mock-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-runtime.js","sourceRoot":"","sources":["../../../runtimes/mock/mock-runtime.ts"],"names":[],"mappings":"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"}