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.
- package/dist/bridge/bridge.d.ts +34 -0
- package/dist/bridge/bridge.d.ts.map +1 -0
- package/dist/bridge/bridge.js +365 -0
- package/dist/bridge/bridge.js.map +1 -0
- package/dist/bridge/index.d.ts +3 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +6 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/runtimes/copilot/copilot-adapter.d.ts +28 -0
- package/dist/runtimes/copilot/copilot-adapter.d.ts.map +1 -0
- package/dist/runtimes/copilot/copilot-adapter.js +50 -0
- package/dist/runtimes/copilot/copilot-adapter.js.map +1 -0
- package/dist/runtimes/copilot/copilot-backend.d.ts +49 -0
- package/dist/runtimes/copilot/copilot-backend.d.ts.map +1 -0
- package/dist/runtimes/copilot/copilot-backend.js +13 -0
- package/dist/runtimes/copilot/copilot-backend.js.map +1 -0
- package/dist/runtimes/copilot/index.d.ts +5 -0
- package/dist/runtimes/copilot/index.d.ts.map +1 -0
- package/dist/runtimes/copilot/index.js +11 -0
- package/dist/runtimes/copilot/index.js.map +1 -0
- package/dist/runtimes/copilot/process-killer.d.ts +13 -0
- package/dist/runtimes/copilot/process-killer.d.ts.map +1 -0
- package/dist/runtimes/copilot/process-killer.js +77 -0
- package/dist/runtimes/copilot/process-killer.js.map +1 -0
- package/dist/runtimes/copilot/subprocess-backend.d.ts +26 -0
- package/dist/runtimes/copilot/subprocess-backend.d.ts.map +1 -0
- package/dist/runtimes/copilot/subprocess-backend.js +308 -0
- package/dist/runtimes/copilot/subprocess-backend.js.map +1 -0
- package/dist/runtimes/mock/index.d.ts +3 -0
- package/dist/runtimes/mock/index.d.ts.map +1 -0
- package/dist/runtimes/mock/index.js +6 -0
- package/dist/runtimes/mock/index.js.map +1 -0
- package/dist/runtimes/mock/mock-runtime.d.ts +43 -0
- package/dist/runtimes/mock/mock-runtime.d.ts.map +1 -0
- package/dist/runtimes/mock/mock-runtime.js +153 -0
- package/dist/runtimes/mock/mock-runtime.js.map +1 -0
- package/dist/src/agent.d.ts +35 -0
- package/dist/src/agent.d.ts.map +1 -0
- package/dist/src/agent.js +257 -0
- package/dist/src/agent.js.map +1 -0
- package/dist/src/events.d.ts +153 -0
- package/dist/src/events.d.ts.map +1 -0
- package/dist/src/events.js +11 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +24 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/nodes.d.ts +63 -0
- package/dist/src/nodes.d.ts.map +1 -0
- package/dist/src/nodes.js +120 -0
- package/dist/src/nodes.js.map +1 -0
- package/dist/src/scheduler.d.ts +11 -0
- package/dist/src/scheduler.d.ts.map +1 -0
- package/dist/src/scheduler.js +478 -0
- package/dist/src/scheduler.js.map +1 -0
- package/dist/src/types.d.ts +201 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +38 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/verify.d.ts +51 -0
- package/dist/src/verify.d.ts.map +1 -0
- package/dist/src/verify.js +126 -0
- package/dist/src/verify.js.map +1 -0
- package/dist/state/index.d.ts +5 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +14 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/reducer.d.ts +11 -0
- package/dist/state/reducer.d.ts.map +1 -0
- package/dist/state/reducer.js +223 -0
- package/dist/state/reducer.js.map +1 -0
- package/dist/state/state-runtime.d.ts +30 -0
- package/dist/state/state-runtime.d.ts.map +1 -0
- package/dist/state/state-runtime.js +131 -0
- package/dist/state/state-runtime.js.map +1 -0
- package/dist/state/storage-memory.d.ts +24 -0
- package/dist/state/storage-memory.d.ts.map +1 -0
- package/dist/state/storage-memory.js +91 -0
- package/dist/state/storage-memory.js.map +1 -0
- package/dist/state/storage.d.ts +29 -0
- package/dist/state/storage.d.ts.map +1 -0
- package/dist/state/storage.js +175 -0
- package/dist/state/storage.js.map +1 -0
- package/dist/theme/index.d.ts +128 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +59 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/ui/ansi.d.ts +9 -0
- package/dist/ui/ansi.d.ts.map +1 -0
- package/dist/ui/ansi.js +78 -0
- package/dist/ui/ansi.js.map +1 -0
- package/dist/ui/components/FlowEdge.d.ts +5 -0
- package/dist/ui/components/FlowEdge.d.ts.map +1 -0
- package/dist/ui/components/FlowEdge.js +33 -0
- package/dist/ui/components/FlowEdge.js.map +1 -0
- package/dist/ui/components/FlowGraph.d.ts +10 -0
- package/dist/ui/components/FlowGraph.d.ts.map +1 -0
- package/dist/ui/components/FlowGraph.js +124 -0
- package/dist/ui/components/FlowGraph.js.map +1 -0
- package/dist/ui/components/FlowStatusBar.d.ts +7 -0
- package/dist/ui/components/FlowStatusBar.d.ts.map +1 -0
- package/dist/ui/components/FlowStatusBar.js +27 -0
- package/dist/ui/components/FlowStatusBar.js.map +1 -0
- package/dist/ui/components/MiniPipeline.d.ts +10 -0
- package/dist/ui/components/MiniPipeline.d.ts.map +1 -0
- package/dist/ui/components/MiniPipeline.js +155 -0
- package/dist/ui/components/MiniPipeline.js.map +1 -0
- package/dist/ui/components/NodeCard.d.ts +5 -0
- package/dist/ui/components/NodeCard.d.ts.map +1 -0
- package/dist/ui/components/NodeCard.js +39 -0
- package/dist/ui/components/NodeCard.js.map +1 -0
- package/dist/ui/components/NodeDetailPanel.d.ts +10 -0
- package/dist/ui/components/NodeDetailPanel.d.ts.map +1 -0
- package/dist/ui/components/NodeDetailPanel.js +38 -0
- package/dist/ui/components/NodeDetailPanel.js.map +1 -0
- package/dist/ui/components/node-panel/Controls.d.ts +16 -0
- package/dist/ui/components/node-panel/Controls.d.ts.map +1 -0
- package/dist/ui/components/node-panel/Controls.js +28 -0
- package/dist/ui/components/node-panel/Controls.js.map +1 -0
- package/dist/ui/components/node-panel/ErrorBar.d.ts +6 -0
- package/dist/ui/components/node-panel/ErrorBar.d.ts.map +1 -0
- package/dist/ui/components/node-panel/ErrorBar.js +14 -0
- package/dist/ui/components/node-panel/ErrorBar.js.map +1 -0
- package/dist/ui/components/node-panel/Gate.d.ts +13 -0
- package/dist/ui/components/node-panel/Gate.d.ts.map +1 -0
- package/dist/ui/components/node-panel/Gate.js +40 -0
- package/dist/ui/components/node-panel/Gate.js.map +1 -0
- package/dist/ui/components/node-panel/Header.d.ts +10 -0
- package/dist/ui/components/node-panel/Header.d.ts.map +1 -0
- package/dist/ui/components/node-panel/Header.js +19 -0
- package/dist/ui/components/node-panel/Header.js.map +1 -0
- package/dist/ui/components/node-panel/Info.d.ts +7 -0
- package/dist/ui/components/node-panel/Info.d.ts.map +1 -0
- package/dist/ui/components/node-panel/Info.js +23 -0
- package/dist/ui/components/node-panel/Info.js.map +1 -0
- package/dist/ui/components/node-panel/Output.d.ts +27 -0
- package/dist/ui/components/node-panel/Output.d.ts.map +1 -0
- package/dist/ui/components/node-panel/Output.js +66 -0
- package/dist/ui/components/node-panel/Output.js.map +1 -0
- package/dist/ui/components/node-panel/index.d.ts +47 -0
- package/dist/ui/components/node-panel/index.d.ts.map +1 -0
- package/dist/ui/components/node-panel/index.js +54 -0
- package/dist/ui/components/node-panel/index.js.map +1 -0
- package/dist/ui/components/node-panel/types.d.ts +23 -0
- package/dist/ui/components/node-panel/types.d.ts.map +1 -0
- package/dist/ui/components/node-panel/types.js +24 -0
- package/dist/ui/components/node-panel/types.js.map +1 -0
- package/dist/ui/core/components/Badge.d.ts +6 -0
- package/dist/ui/core/components/Badge.d.ts.map +1 -0
- package/dist/ui/core/components/Badge.js +11 -0
- package/dist/ui/core/components/Badge.js.map +1 -0
- package/dist/ui/core/components/Button.d.ts +9 -0
- package/dist/ui/core/components/Button.d.ts.map +1 -0
- package/dist/ui/core/components/Button.js +18 -0
- package/dist/ui/core/components/Button.js.map +1 -0
- package/dist/ui/core/components/ConfirmDialog.d.ts +11 -0
- package/dist/ui/core/components/ConfirmDialog.d.ts.map +1 -0
- package/dist/ui/core/components/ConfirmDialog.js +23 -0
- package/dist/ui/core/components/ConfirmDialog.js.map +1 -0
- package/dist/ui/core/components/ExecutionCard.d.ts +12 -0
- package/dist/ui/core/components/ExecutionCard.d.ts.map +1 -0
- package/dist/ui/core/components/ExecutionCard.js +15 -0
- package/dist/ui/core/components/ExecutionCard.js.map +1 -0
- package/dist/ui/core/components/NodeListItem.d.ts +10 -0
- package/dist/ui/core/components/NodeListItem.d.ts.map +1 -0
- package/dist/ui/core/components/NodeListItem.js +27 -0
- package/dist/ui/core/components/NodeListItem.js.map +1 -0
- package/dist/ui/core/components/PageHeader.d.ts +10 -0
- package/dist/ui/core/components/PageHeader.d.ts.map +1 -0
- package/dist/ui/core/components/PageHeader.js +9 -0
- package/dist/ui/core/components/PageHeader.js.map +1 -0
- package/dist/ui/core/components/SectionLabel.d.ts +6 -0
- package/dist/ui/core/components/SectionLabel.d.ts.map +1 -0
- package/dist/ui/core/components/SectionLabel.js +9 -0
- package/dist/ui/core/components/SectionLabel.js.map +1 -0
- package/dist/ui/core/components/Skeleton.d.ts +7 -0
- package/dist/ui/core/components/Skeleton.d.ts.map +1 -0
- package/dist/ui/core/components/Skeleton.js +26 -0
- package/dist/ui/core/components/Skeleton.js.map +1 -0
- package/dist/ui/core/components/Stat.d.ts +8 -0
- package/dist/ui/core/components/Stat.d.ts.map +1 -0
- package/dist/ui/core/components/Stat.js +9 -0
- package/dist/ui/core/components/Stat.js.map +1 -0
- package/dist/ui/core/components/Toast.d.ts +7 -0
- package/dist/ui/core/components/Toast.d.ts.map +1 -0
- package/dist/ui/core/components/Toast.js +28 -0
- package/dist/ui/core/components/Toast.js.map +1 -0
- package/dist/ui/core/components/__tests__/primitives.test.d.ts +2 -0
- package/dist/ui/core/components/__tests__/primitives.test.d.ts.map +1 -0
- package/dist/ui/core/components/__tests__/primitives.test.js +3 -0
- package/dist/ui/core/components/__tests__/primitives.test.js.map +1 -0
- package/dist/ui/core/components/index.d.ts +21 -0
- package/dist/ui/core/components/index.d.ts.map +1 -0
- package/dist/ui/core/components/index.js +24 -0
- package/dist/ui/core/components/index.js.map +1 -0
- package/dist/ui/core/index.d.ts +17 -0
- package/dist/ui/core/index.d.ts.map +1 -0
- package/dist/ui/core/index.js +56 -0
- package/dist/ui/core/index.js.map +1 -0
- package/dist/ui/core/utils.d.ts +6 -0
- package/dist/ui/core/utils.d.ts.map +1 -0
- package/dist/ui/core/utils.js +32 -0
- package/dist/ui/core/utils.js.map +1 -0
- package/dist/ui/graph/index.d.ts +4 -0
- package/dist/ui/graph/index.d.ts.map +1 -0
- package/dist/ui/graph/index.js +11 -0
- package/dist/ui/graph/index.js.map +1 -0
- package/dist/ui/hooks/useAutoSelectNode.d.ts +3 -0
- package/dist/ui/hooks/useAutoSelectNode.d.ts.map +1 -0
- package/dist/ui/hooks/useAutoSelectNode.js +36 -0
- package/dist/ui/hooks/useAutoSelectNode.js.map +1 -0
- package/dist/ui/hooks/useFlowExecution.d.ts +32 -0
- package/dist/ui/hooks/useFlowExecution.d.ts.map +1 -0
- package/dist/ui/hooks/useFlowExecution.js +113 -0
- package/dist/ui/hooks/useFlowExecution.js.map +1 -0
- package/dist/ui/hooks/useNodeNavigation.d.ts +3 -0
- package/dist/ui/hooks/useNodeNavigation.d.ts.map +1 -0
- package/dist/ui/hooks/useNodeNavigation.js +38 -0
- package/dist/ui/hooks/useNodeNavigation.js.map +1 -0
- package/dist/ui/hooks/useNodeOutput.d.ts +21 -0
- package/dist/ui/hooks/useNodeOutput.d.ts.map +1 -0
- package/dist/ui/hooks/useNodeOutput.js +75 -0
- package/dist/ui/hooks/useNodeOutput.js.map +1 -0
- package/dist/ui/index.d.ts +16 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +37 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/utils.d.ts +3 -0
- package/dist/ui/utils.d.ts.map +1 -0
- package/dist/ui/utils.js +9 -0
- package/dist/ui/utils.js.map +1 -0
- 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 @@
|
|
|
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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"}
|