subharness 0.0.4 → 0.0.7
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/README.md +95 -9
- package/dist/adapters/claude-process.d.ts +3 -0
- package/dist/adapters/claude-process.js +19 -2
- package/dist/adapters/claude-process.js.map +1 -1
- package/dist/adapters/claude-result.d.ts +2 -0
- package/dist/adapters/claude-result.js +22 -0
- package/dist/adapters/claude-result.js.map +1 -0
- package/dist/adapters/claude-tools.d.ts +6 -2
- package/dist/adapters/claude-tools.js +14 -12
- package/dist/adapters/claude-tools.js.map +1 -1
- package/dist/adapters/claude-worker-client.d.ts +49 -0
- package/dist/adapters/claude-worker-client.js +359 -0
- package/dist/adapters/claude-worker-client.js.map +1 -0
- package/dist/adapters/claude-worker-process.d.ts +20 -0
- package/dist/adapters/claude-worker-process.js +76 -0
- package/dist/adapters/claude-worker-process.js.map +1 -0
- package/dist/adapters/claude-worker-protocol.d.ts +38 -0
- package/dist/adapters/claude-worker-protocol.js +2 -0
- package/dist/adapters/claude-worker-protocol.js.map +1 -0
- package/dist/adapters/claude-worker.d.ts +1 -0
- package/dist/adapters/claude-worker.js +126 -0
- package/dist/adapters/claude-worker.js.map +1 -0
- package/dist/adapters/claude.d.ts +16 -6
- package/dist/adapters/claude.js +164 -75
- package/dist/adapters/claude.js.map +1 -1
- package/dist/adapters/codex.js +4 -1
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/copilot-permissions.d.ts +26 -0
- package/dist/adapters/copilot-permissions.js +121 -0
- package/dist/adapters/copilot-permissions.js.map +1 -0
- package/dist/adapters/copilot-tools.d.ts +12 -0
- package/dist/adapters/copilot-tools.js +61 -0
- package/dist/adapters/copilot-tools.js.map +1 -0
- package/dist/adapters/copilot.d.ts +108 -0
- package/dist/adapters/copilot.js +819 -0
- package/dist/adapters/copilot.js.map +1 -0
- package/dist/adapters/cursor-cli-approvals.d.ts +2 -0
- package/dist/adapters/cursor-cli-approvals.js +83 -0
- package/dist/adapters/cursor-cli-approvals.js.map +1 -0
- package/dist/adapters/cursor-cli-model.d.ts +4 -0
- package/dist/adapters/cursor-cli-model.js +64 -0
- package/dist/adapters/cursor-cli-model.js.map +1 -0
- package/dist/adapters/cursor-cli-session.d.ts +32 -0
- package/dist/adapters/cursor-cli-session.js +316 -0
- package/dist/adapters/cursor-cli-session.js.map +1 -0
- package/dist/adapters/cursor-cli-tools.d.ts +20 -0
- package/dist/adapters/cursor-cli-tools.js +181 -0
- package/dist/adapters/cursor-cli-tools.js.map +1 -0
- package/dist/adapters/cursor-cli.d.ts +2 -0
- package/dist/adapters/cursor-cli.js +306 -0
- package/dist/adapters/cursor-cli.js.map +1 -0
- package/dist/adapters/cursor-model.d.ts +7 -0
- package/dist/adapters/cursor-model.js +67 -0
- package/dist/adapters/cursor-model.js.map +1 -0
- package/dist/adapters/cursor-rpc.d.ts +42 -0
- package/dist/adapters/cursor-rpc.js +271 -0
- package/dist/adapters/cursor-rpc.js.map +1 -0
- package/dist/adapters/cursor-session.d.ts +4 -0
- package/dist/adapters/cursor-session.js +327 -0
- package/dist/adapters/cursor-session.js.map +1 -0
- package/dist/adapters/cursor-startup.d.ts +16 -0
- package/dist/adapters/cursor-startup.js +74 -0
- package/dist/adapters/cursor-startup.js.map +1 -0
- package/dist/adapters/cursor-tools.d.ts +11 -0
- package/dist/adapters/cursor-tools.js +49 -0
- package/dist/adapters/cursor-tools.js.map +1 -0
- package/dist/adapters/cursor.d.ts +6 -0
- package/dist/adapters/cursor.js +17 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/fx-auth.d.ts +12 -2
- package/dist/adapters/fx-auth.js +51 -61
- package/dist/adapters/fx-auth.js.map +1 -1
- package/dist/adapters/fx-profile.d.ts +8 -0
- package/dist/adapters/fx-profile.js +101 -0
- package/dist/adapters/fx-profile.js.map +1 -0
- package/dist/adapters/fx-rpc.d.ts +2 -0
- package/dist/adapters/fx-rpc.js +30 -4
- package/dist/adapters/fx-rpc.js.map +1 -1
- package/dist/adapters/fx-status.d.ts +2 -0
- package/dist/adapters/fx-status.js +96 -0
- package/dist/adapters/fx-status.js.map +1 -0
- package/dist/adapters/fx.js +28 -12
- package/dist/adapters/fx.js.map +1 -1
- package/dist/adapters/opencode-access.d.ts +13 -0
- package/dist/adapters/opencode-access.js +76 -0
- package/dist/adapters/opencode-access.js.map +1 -0
- package/dist/adapters/opencode-config.d.ts +11 -0
- package/dist/adapters/opencode-config.js +238 -0
- package/dist/adapters/opencode-config.js.map +1 -0
- package/dist/adapters/opencode-http.d.ts +28 -0
- package/dist/adapters/opencode-http.js +297 -0
- package/dist/adapters/opencode-http.js.map +1 -0
- package/dist/adapters/opencode-tools.d.ts +19 -0
- package/dist/adapters/opencode-tools.js +127 -0
- package/dist/adapters/opencode-tools.js.map +1 -0
- package/dist/adapters/opencode.d.ts +2 -0
- package/dist/adapters/opencode.js +569 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/adapters/rpc.d.ts +3 -0
- package/dist/adapters/rpc.js +45 -4
- package/dist/adapters/rpc.js.map +1 -1
- package/dist/adapters/types.d.ts +5 -0
- package/dist/adapters/types.js.map +1 -1
- package/dist/approvals/types.d.ts +1 -1
- package/dist/approvals/types.js.map +1 -1
- package/dist/cli/args.d.ts +1 -1
- package/dist/cli/args.js +4 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/catalog-worker.js.map +1 -1
- package/dist/cli/dashboard-client.js +20 -31
- package/dist/cli/dashboard-client.js.map +1 -1
- package/dist/cli/dashboard-controller.d.ts +7 -0
- package/dist/cli/dashboard-controller.js +27 -0
- package/dist/cli/dashboard-controller.js.map +1 -0
- package/dist/cli/dashboard-detail-view.d.ts +1 -1
- package/dist/cli/dashboard-detail-view.js +3 -4
- package/dist/cli/dashboard-detail-view.js.map +1 -1
- package/dist/cli/dashboard-history-view.js.map +1 -1
- package/dist/cli/dashboard-input.d.ts +1 -1
- package/dist/cli/dashboard-input.js +11 -1
- package/dist/cli/dashboard-input.js.map +1 -1
- package/dist/cli/dashboard-layout.js +3 -3
- package/dist/cli/dashboard-layout.js.map +1 -1
- package/dist/cli/dashboard-renderer.js.map +1 -1
- package/dist/cli/dashboard-style.js +2 -2
- package/dist/cli/dashboard-style.js.map +1 -1
- package/dist/cli/dashboard.d.ts +2 -2
- package/dist/cli/dashboard.js +7 -32
- package/dist/cli/dashboard.js.map +1 -1
- package/dist/cli/help.d.ts +1 -1
- package/dist/cli/help.js +30 -12
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/main.js +55 -43
- package/dist/cli/main.js.map +1 -1
- package/dist/config/access-provenance.d.ts +10 -0
- package/dist/config/access-provenance.js +31 -0
- package/dist/config/access-provenance.js.map +1 -0
- package/dist/config/access.d.ts +12 -2
- package/dist/config/access.js +125 -27
- package/dist/config/access.js.map +1 -1
- package/dist/config/loader.js +1 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/oidc.js +4 -2
- package/dist/config/oidc.js.map +1 -1
- package/dist/config/project.js +2 -1
- package/dist/config/project.js.map +1 -1
- package/dist/config/resolve-access.js +24 -10
- package/dist/config/resolve-access.js.map +1 -1
- package/dist/errors.d.ts +2 -2
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/process-diagnostics.d.ts +2 -0
- package/dist/process-diagnostics.js +11 -0
- package/dist/process-diagnostics.js.map +1 -0
- package/dist/runtime/access-errors.d.ts +4 -0
- package/dist/runtime/access-errors.js +25 -0
- package/dist/runtime/access-errors.js.map +1 -0
- package/dist/runtime/approval-registry.d.ts +9 -0
- package/dist/runtime/approval-registry.js +144 -5
- package/dist/runtime/approval-registry.js.map +1 -1
- package/dist/runtime/capture.d.ts +22 -0
- package/dist/runtime/capture.js +320 -0
- package/dist/runtime/capture.js.map +1 -0
- package/dist/runtime/catalog.d.ts +39 -0
- package/dist/runtime/catalog.js +84 -0
- package/dist/runtime/catalog.js.map +1 -0
- package/dist/runtime/client.d.ts +2 -1
- package/dist/runtime/client.js +74 -47
- package/dist/runtime/client.js.map +1 -1
- package/dist/runtime/coordinator.d.ts +44 -7
- package/dist/runtime/coordinator.js +265 -31
- package/dist/runtime/coordinator.js.map +1 -1
- package/dist/runtime/daemon.js +12 -6
- package/dist/runtime/daemon.js.map +1 -1
- package/dist/runtime/dashboard-sanitize.d.ts +2 -0
- package/dist/runtime/dashboard-sanitize.js +7 -0
- package/dist/runtime/dashboard-sanitize.js.map +1 -0
- package/dist/runtime/dashboard-workspace.js +5 -1
- package/dist/runtime/dashboard-workspace.js.map +1 -1
- package/dist/runtime/dashboard.d.ts +1 -1
- package/dist/runtime/dashboard.js +2 -3
- package/dist/runtime/dashboard.js.map +1 -1
- package/dist/runtime/definition.d.ts +6 -1
- package/dist/runtime/definition.js +42 -2
- package/dist/runtime/definition.js.map +1 -1
- package/dist/runtime/native-owner.js +7 -1
- package/dist/runtime/native-owner.js.map +1 -1
- package/dist/runtime/pagination.d.ts +9 -0
- package/dist/runtime/pagination.js +36 -0
- package/dist/runtime/pagination.js.map +1 -0
- package/dist/runtime/sdk-observation.d.ts +8 -0
- package/dist/runtime/sdk-observation.js +75 -0
- package/dist/runtime/sdk-observation.js.map +1 -0
- package/dist/runtime/sdk-projection.d.ts +8 -0
- package/dist/runtime/sdk-projection.js +19 -0
- package/dist/runtime/sdk-projection.js.map +1 -0
- package/dist/runtime/sdk-service.d.ts +11 -0
- package/dist/runtime/sdk-service.js +109 -0
- package/dist/runtime/sdk-service.js.map +1 -0
- package/dist/runtime/select-native.d.ts +4 -1
- package/dist/runtime/select-native.js +28 -13
- package/dist/runtime/select-native.js.map +1 -1
- package/dist/runtime/service.d.ts +11 -1
- package/dist/runtime/service.js +178 -3
- package/dist/runtime/service.js.map +1 -1
- package/dist/runtime/session-launcher.js +1 -1
- package/dist/runtime/session-launcher.js.map +1 -1
- package/dist/runtime/snapshots.d.ts +103 -0
- package/dist/runtime/snapshots.js +124 -0
- package/dist/runtime/snapshots.js.map +1 -0
- package/dist/runtime/state.d.ts +26 -0
- package/dist/runtime/state.js +86 -17
- package/dist/runtime/state.js.map +1 -1
- package/dist/runtime/task-data.d.ts +38 -0
- package/dist/runtime/task-data.js +2 -0
- package/dist/runtime/task-data.js.map +1 -0
- package/dist/runtime/transport.d.ts +13 -0
- package/dist/runtime/transport.js +166 -0
- package/dist/runtime/transport.js.map +1 -0
- package/dist/runtime/types.d.ts +28 -9
- package/dist/runtime/types.js.map +1 -1
- package/dist/runtime/worker-client.js +40 -13
- package/dist/runtime/worker-client.js.map +1 -1
- package/dist/runtime/worker-server.js +105 -24
- package/dist/runtime/worker-server.js.map +1 -1
- package/dist/sdk/connected-types.d.ts +42 -0
- package/dist/sdk/connected-types.js +2 -0
- package/dist/sdk/connected-types.js.map +1 -0
- package/dist/sdk/connected.d.ts +3 -0
- package/dist/sdk/connected.js +232 -0
- package/dist/sdk/connected.js.map +1 -0
- package/dist/sdk/definitions.d.ts +4 -1
- package/dist/sdk/definitions.js +16 -2
- package/dist/sdk/definitions.js.map +1 -1
- package/dist/sdk/execution-definition.d.ts +3 -0
- package/dist/sdk/execution-definition.js +59 -0
- package/dist/sdk/execution-definition.js.map +1 -0
- package/dist/sdk/execution-driver.d.ts +6 -0
- package/dist/sdk/execution-driver.js +86 -0
- package/dist/sdk/execution-driver.js.map +1 -0
- package/dist/sdk/execution-observation.d.ts +3 -0
- package/dist/sdk/execution-observation.js +35 -0
- package/dist/sdk/execution-observation.js.map +1 -0
- package/dist/sdk/execution-options.d.ts +17 -0
- package/dist/sdk/execution-options.js +115 -0
- package/dist/sdk/execution-options.js.map +1 -0
- package/dist/sdk/execution-types.d.ts +72 -0
- package/dist/sdk/execution-types.js +2 -0
- package/dist/sdk/execution-types.js.map +1 -0
- package/dist/sdk/execution.d.ts +3 -0
- package/dist/sdk/execution.js +3 -0
- package/dist/sdk/execution.js.map +1 -0
- package/dist/sdk/hosted-error.d.ts +3 -0
- package/dist/sdk/hosted-error.js +14 -0
- package/dist/sdk/hosted-error.js.map +1 -0
- package/dist/sdk/hosted.d.ts +23 -0
- package/dist/sdk/hosted.js +204 -0
- package/dist/sdk/hosted.js.map +1 -0
- package/dist/sdk/permission-validation.js +10 -1
- package/dist/sdk/permission-validation.js.map +1 -1
- package/dist/sdk/runner.d.ts +5 -0
- package/dist/sdk/runner.js +107 -0
- package/dist/sdk/runner.js.map +1 -0
- package/dist/sdk/tools.js +4 -1
- package/dist/sdk/tools.js.map +1 -1
- package/dist/sdk/types.d.ts +29 -1
- package/dist/sdk/types.js.map +1 -1
- package/package.json +6 -3
- package/sdk/access-config.md +60 -4
- package/sdk/adapter-contract.md +13 -3
- package/sdk/additional-harnesses.md +43 -0
- package/sdk/agent-skill.md +2 -2
- package/sdk/agent.md +6 -4
- package/sdk/approvals.md +5 -1
- package/sdk/authentication.md +1 -1
- package/sdk/cli/dashboard-design.md +6 -0
- package/sdk/cli/index.md +9 -6
- package/sdk/cli/output.md +3 -1
- package/sdk/completion-notifications.md +2 -0
- package/sdk/config.md +1 -1
- package/sdk/copilot.md +53 -0
- package/sdk/cursor.md +68 -0
- package/sdk/diagnostics.md +29 -0
- package/sdk/distribution.md +5 -3
- package/sdk/evals.md +1 -1
- package/sdk/examples/chat-tool.ts +126 -0
- package/sdk/execution.md +743 -0
- package/sdk/fx.md +50 -5
- package/sdk/harnesses.md +13 -13
- package/sdk/index.md +45 -20
- package/sdk/message-delivery.md +2 -0
- package/sdk/opencode.md +57 -0
- package/sdk/permissions.md +6 -2
- package/sdk/plugins/sub-agents.md +4 -2
- package/sdk/project-team.md +25 -1
- package/sdk/sessions.md +2 -0
- package/sdk/tools.md +4 -2
- package/sdk/v1-runtime.md +8 -6
- package/dist/cli/catalog.d.ts +0 -26
- package/dist/cli/catalog.js +0 -41
- package/dist/cli/catalog.js.map +0 -1
package/dist/runtime/service.js
CHANGED
|
@@ -1,6 +1,35 @@
|
|
|
1
1
|
import { createServer } from 'node:http';
|
|
2
|
+
import { stat } from 'node:fs/promises';
|
|
3
|
+
import { isAbsolute } from 'node:path';
|
|
2
4
|
import { AgentError, errorInfo } from '../errors.js';
|
|
3
|
-
|
|
5
|
+
import { dispatchSdkRequest, isSdkCommand } from './sdk-service.js';
|
|
6
|
+
import { captureExecution, captureReference, checkCapturedExecution } from './capture.js';
|
|
7
|
+
import { checkAgent, listAgents } from './catalog.js';
|
|
8
|
+
import { resolveStateDirectory } from './state.js';
|
|
9
|
+
export async function startService(engine, token, instanceId, state, options = {}) {
|
|
10
|
+
const directory = resolveStateDirectory(state);
|
|
11
|
+
const captures = new Map(options.initialCaptures);
|
|
12
|
+
const captureOperations = { captureExecution, captureReference, checkCapturedExecution, ...options.capture };
|
|
13
|
+
const sdkOperations = {
|
|
14
|
+
listAgents: async (data) => listAgents(await catalogInput(data, directory)),
|
|
15
|
+
checkAgent: async (data) => {
|
|
16
|
+
const input = await catalogInput(data, directory);
|
|
17
|
+
await checkAgent(connectedAgent(data.agent), input);
|
|
18
|
+
},
|
|
19
|
+
createSession: async (data) => {
|
|
20
|
+
const input = await catalogInput(data, directory);
|
|
21
|
+
const captured = await captureOperations.captureExecution(connectedAgent(data.agent), input);
|
|
22
|
+
try {
|
|
23
|
+
const id = engine.createSession({ reference: captured.reference, cwd: input.cwd, env: input.env }, captured.prepared);
|
|
24
|
+
captures.set(id, captured);
|
|
25
|
+
return id;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
return releaseRejected(captured, error);
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
closeSession: async (id) => { await engine.closeSession(id); captures.delete(id); },
|
|
32
|
+
};
|
|
4
33
|
const server = createServer(async (request, response) => {
|
|
5
34
|
if (request.headers.authorization !== `Bearer ${token}`) {
|
|
6
35
|
response.writeHead(401).end();
|
|
@@ -8,13 +37,23 @@ export async function startService(engine, token, instanceId) {
|
|
|
8
37
|
}
|
|
9
38
|
if (request.method === 'GET' && request.url === '/health') {
|
|
10
39
|
response.setHeader('content-type', 'application/json');
|
|
11
|
-
response.end(JSON.stringify({
|
|
40
|
+
response.end(JSON.stringify({
|
|
41
|
+
version: 1,
|
|
42
|
+
type: 'coordinator-health',
|
|
43
|
+
instanceId,
|
|
44
|
+
protocolVersion: 1,
|
|
45
|
+
capabilities: ['sdk-v1', 'cli-v1'],
|
|
46
|
+
}));
|
|
12
47
|
return;
|
|
13
48
|
}
|
|
14
49
|
if (request.method !== 'POST' || request.url !== '/') {
|
|
15
50
|
response.writeHead(404).end();
|
|
16
51
|
return;
|
|
17
52
|
}
|
|
53
|
+
if (request.headers['x-subharness-instance'] !== instanceId) {
|
|
54
|
+
response.writeHead(409).end();
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
18
57
|
response.setHeader('content-type', 'application/x-ndjson');
|
|
19
58
|
const observer = new AbortController();
|
|
20
59
|
// Keep long, quiet observations alive without exposing progress records to callers.
|
|
@@ -39,6 +78,13 @@ export async function startService(engine, token, instanceId) {
|
|
|
39
78
|
}
|
|
40
79
|
if (!data || typeof data !== 'object' || Array.isArray(data))
|
|
41
80
|
throw new AgentError('INVALID_ARGUMENT', 'Coordinator input must be a JSON object.');
|
|
81
|
+
if (isSdkCommand(data.command)) {
|
|
82
|
+
for await (const record of dispatchSdkRequest(engine, data, observer.signal, sdkOperations))
|
|
83
|
+
write(record);
|
|
84
|
+
clearInterval(heartbeat);
|
|
85
|
+
response.end();
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
42
88
|
let receipt;
|
|
43
89
|
switch (data.command) {
|
|
44
90
|
case 'dashboard':
|
|
@@ -59,6 +105,59 @@ export async function startService(engine, token, instanceId) {
|
|
|
59
105
|
case 'parent':
|
|
60
106
|
write(engine.parentContext(data.parentToken));
|
|
61
107
|
break;
|
|
108
|
+
case 'parent-catalog': {
|
|
109
|
+
const { captured } = bindParent(engine, captures, data.parentToken);
|
|
110
|
+
write({ version: 1, type: 'agents', agents: captured.children.map(child => ({
|
|
111
|
+
id: `subagent:${child.name}`, name: child.name, description: child.description, scope: 'subagent',
|
|
112
|
+
})) });
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
case 'parent-check': {
|
|
116
|
+
const binding = bindParent(engine, captures, data.parentToken);
|
|
117
|
+
const input = await catalogInput(data, directory);
|
|
118
|
+
const captured = binding.captured;
|
|
119
|
+
const child = await captured.child(childName(data.agent));
|
|
120
|
+
try {
|
|
121
|
+
validateParentBinding(engine, binding);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
await releaseRejected(child, error);
|
|
125
|
+
}
|
|
126
|
+
await captureOperations.checkCapturedExecution(child, input);
|
|
127
|
+
write({ version: 1, type: 'ack' });
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
case 'parent-run': {
|
|
131
|
+
const binding = bindParent(engine, captures, data.parentToken);
|
|
132
|
+
const input = await catalogInput(data, directory);
|
|
133
|
+
const captured = binding.captured;
|
|
134
|
+
const child = await captured.child(childName(data.agent));
|
|
135
|
+
try {
|
|
136
|
+
validateParentBinding(engine, binding);
|
|
137
|
+
receipt = engine.run({ reference: child.reference, cwd: input.cwd, env: input.env,
|
|
138
|
+
prompt: data.prompt, parentToken: binding.token }, child.prepared);
|
|
139
|
+
captures.set(receipt.sessionId, child);
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
await releaseRejected(child, error);
|
|
143
|
+
}
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
case 'cli-run': {
|
|
147
|
+
const input = await catalogInput(data, directory);
|
|
148
|
+
const captured = data.reference
|
|
149
|
+
? await captureOperations.captureReference(data.reference, input)
|
|
150
|
+
: await captureOperations.captureExecution(connectedAgent(data.agent), input);
|
|
151
|
+
try {
|
|
152
|
+
receipt = engine.run({ reference: captured.reference, cwd: input.cwd, env: input.env,
|
|
153
|
+
prompt: data.prompt, parentToken: data.parentToken }, captured.prepared);
|
|
154
|
+
captures.set(receipt.sessionId, captured);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
await releaseRejected(captured, error);
|
|
158
|
+
}
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
62
161
|
case 'run':
|
|
63
162
|
receipt = engine.run(data.input);
|
|
64
163
|
break;
|
|
@@ -114,7 +213,83 @@ export async function startService(engine, token, instanceId) {
|
|
|
114
213
|
});
|
|
115
214
|
return {
|
|
116
215
|
url: `http://127.0.0.1:${server.address().port}/`,
|
|
117
|
-
async close() {
|
|
216
|
+
async close() {
|
|
217
|
+
let failure;
|
|
218
|
+
try {
|
|
219
|
+
await engine.close();
|
|
220
|
+
}
|
|
221
|
+
catch (error) {
|
|
222
|
+
failure = error;
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
server.closeAllConnections();
|
|
226
|
+
await new Promise(resolve => server.close(() => resolve()));
|
|
227
|
+
}
|
|
228
|
+
if (failure)
|
|
229
|
+
throw failure;
|
|
230
|
+
},
|
|
118
231
|
};
|
|
119
232
|
}
|
|
233
|
+
async function catalogInput(data, directory) {
|
|
234
|
+
const cwd = data.cwd;
|
|
235
|
+
if (typeof cwd !== 'string' || !isAbsolute(cwd))
|
|
236
|
+
throw new AgentError('INVALID_ARGUMENT', 'Execution cwd must be an existing absolute directory.');
|
|
237
|
+
try {
|
|
238
|
+
if (!(await stat(cwd)).isDirectory())
|
|
239
|
+
throw new Error();
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
throw new AgentError('INVALID_ARGUMENT', 'Execution cwd must be an existing absolute directory.');
|
|
243
|
+
}
|
|
244
|
+
const source = data.env;
|
|
245
|
+
if (!source || typeof source !== 'object' || Array.isArray(source))
|
|
246
|
+
throw new AgentError('INVALID_ARGUMENT', 'Connected environment must be an object.');
|
|
247
|
+
const env = {};
|
|
248
|
+
for (const key of Reflect.ownKeys(source)) {
|
|
249
|
+
if (typeof key !== 'string')
|
|
250
|
+
throw new AgentError('INVALID_ARGUMENT', 'Connected environment keys must be strings.');
|
|
251
|
+
const value = source[key];
|
|
252
|
+
if (value !== undefined && typeof value !== 'string')
|
|
253
|
+
throw new AgentError('INVALID_ARGUMENT', 'Connected environment values must be strings or undefined.');
|
|
254
|
+
if (typeof value === 'string')
|
|
255
|
+
env[key] = value;
|
|
256
|
+
}
|
|
257
|
+
delete env.AGENT_PARENT_TOKEN;
|
|
258
|
+
delete env.AGENT_CLI_PATH;
|
|
259
|
+
env.AGENT_STATE_DIR = directory;
|
|
260
|
+
return { cwd, env };
|
|
261
|
+
}
|
|
262
|
+
function connectedAgent(value) {
|
|
263
|
+
if (typeof value === 'string' || (value !== null && typeof value === 'object' && !Array.isArray(value)))
|
|
264
|
+
return value;
|
|
265
|
+
throw new AgentError('INVALID_ARGUMENT', 'Connected agent must be an ID or harness configuration.');
|
|
266
|
+
}
|
|
267
|
+
function bindParent(engine, captures, token) {
|
|
268
|
+
if (typeof token !== 'string' || !token)
|
|
269
|
+
throw new AgentError('INVALID_PARENT', 'The parent context is no longer active.');
|
|
270
|
+
const context = engine.parentContext(token);
|
|
271
|
+
const captured = captures.get(context.sessionId);
|
|
272
|
+
if (!captured)
|
|
273
|
+
throw new AgentError('INVALID_PARENT', 'The active parent does not own a captured definition graph.');
|
|
274
|
+
return { token, taskId: context.taskId, sessionId: context.sessionId, captured };
|
|
275
|
+
}
|
|
276
|
+
function validateParentBinding(engine, binding) {
|
|
277
|
+
const current = engine.parentContext(binding.token);
|
|
278
|
+
if (current.taskId !== binding.taskId || current.sessionId !== binding.sessionId)
|
|
279
|
+
throw new AgentError('INVALID_PARENT', 'The parent context is no longer active.');
|
|
280
|
+
}
|
|
281
|
+
function childName(value) {
|
|
282
|
+
if (typeof value !== 'string' || !value.startsWith('subagent:') || !value.slice(9))
|
|
283
|
+
throw new AgentError('INVALID_PARENT', 'This subagent is not available in the active parent context.');
|
|
284
|
+
return value.slice(9);
|
|
285
|
+
}
|
|
286
|
+
async function releaseRejected(captured, admissionError) {
|
|
287
|
+
try {
|
|
288
|
+
await captured.prepared.close();
|
|
289
|
+
}
|
|
290
|
+
catch {
|
|
291
|
+
throw new AgentError('HARNESS_FAILED', 'Captured execution cleanup failed after admission was rejected.');
|
|
292
|
+
}
|
|
293
|
+
throw admissionError;
|
|
294
|
+
}
|
|
120
295
|
//# sourceMappingURL=service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/runtime/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { createServer } from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport { AgentError, errorInfo } from '../errors.js';\nimport { Coordinator } from './coordinator.js';\nimport type { Delivery, Receipt, SessionInput } from './types.js';\n\ninterface Request {\n command: string; input?: SessionInput; id?: string; after?: string;\n prompt?: string; delivery?: Delivery; full?: boolean; detach?: boolean; parentToken?: string;\n content?: unknown;\n includePrompt?: boolean; knownResponseId?: string;\n}\n\nexport async function startService(engine: Coordinator, token: string, instanceId: string) {\n const server = createServer(async (request, response) => {\n if (request.headers.authorization !== `Bearer ${token}`) { response.writeHead(401).end(); return; }\n if (request.method === 'GET' && request.url === '/health') {\n response.setHeader('content-type','application/json');\n response.end(JSON.stringify({version:1,type:'coordinator-health',instanceId}));\n return;\n }\n if (request.method !== 'POST' || request.url !== '/') { response.writeHead(404).end(); return; }\n response.setHeader('content-type', 'application/x-ndjson');\n const observer = new AbortController();\n // Keep long, quiet observations alive without exposing progress records to callers.\n const heartbeat = setInterval(() => { if (!response.destroyed) response.write('\\n'); }, 15_000);\n response.once('close', () => { clearInterval(heartbeat); observer.abort(); });\n const write = (record: unknown) => { if (!response.destroyed) response.write(JSON.stringify(record) + '\\n'); };\n try {\n let body = '';\n for await (const chunk of request) {\n body += chunk;\n if (Buffer.byteLength(body) > 4 * 1024 * 1024) throw new AgentError('INVALID_ARGUMENT','Request exceeds 4 MiB.');\n }\n let data: Request;\n try { data = JSON.parse(body) as Request; }\n catch { throw new AgentError('INVALID_ARGUMENT','Coordinator input must be valid JSON.'); }\n if (!data || typeof data !== 'object' || Array.isArray(data))\n throw new AgentError('INVALID_ARGUMENT','Coordinator input must be a JSON object.');\n let receipt: Receipt | undefined;\n switch (data.command) {\n case 'dashboard': write(await engine.dashboard()); break;\n case 'dashboard-session':\n if (typeof data.id !== 'string')\n throw new AgentError('INVALID_ARGUMENT', 'Invalid dashboard session request fields.');\n write(await engine.dashboardSession(data.id)); break;\n case 'dashboard-detail':\n if (typeof data.id !== 'string' ||\n (data.includePrompt !== undefined && typeof data.includePrompt !== 'boolean') ||\n (data.knownResponseId !== undefined && typeof data.knownResponseId !== 'string'))\n throw new AgentError('INVALID_ARGUMENT', 'Invalid dashboard detail request fields.');\n write(await engine.dashboardDetail(data.id, data.includePrompt ?? true, data.knownResponseId)); break;\n case 'parent': write(engine.parentContext(data.parentToken!)); break;\n case 'run': receipt = engine.run(data.input!); break;\n case 'send':\n if (data.detach && data.delivery === 'steer') throw new AgentError('INVALID_ARGUMENT','--detach cannot be combined with --delivery steer.');\n receipt = await engine.send(data.id!, data.prompt!, data.delivery ?? 'queue', data.parentToken); break;\n case 'resume': {\n const active = engine.queue(data.id!).active;\n if (!active || active.state !== 'failed') throw new AgentError('NOT_FAILED','This session has no failed task to resume.');\n const after = engine.status(active.taskId).response?.responseId;\n receipt = await engine.resume(data.id!);\n write(receipt); write(await engine.observe(receipt.taskId, after, data.parentToken, observer.signal));\n receipt = undefined; break;\n }\n case 'wait': write(await engine.observe(data.id!, data.after, data.parentToken, observer.signal)); break;\n case 'status': write(engine.status(data.id!, data.full)); break;\n case 'queue': write(engine.queue(data.id!)); break;\n case 'cancel': write(await engine.cancel(data.id!)); break;\n case 'respond': write(engine.respond(data.id!,data.content,data.parentToken)); break;\n default: throw new AgentError('INVALID_ARGUMENT','Unknown coordinator operation.');\n }\n if (receipt) {\n write(receipt);\n if (receipt.type === 'started' && !data.detach) {\n write(await engine.observe(receipt.taskId, undefined, data.parentToken ?? data.input?.parentToken, observer.signal));\n }\n }\n } catch (error) { write({version:1,type:'error',error:errorInfo(error)}); }\n clearInterval(heartbeat);\n response.end();\n });\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', resolve);\n });\n return {\n url: `http://127.0.0.1:${(server.address() as AddressInfo).port}/`,\n async close() { await engine.close(); server.closeAllConnections(); await new Promise<void>(resolve => server.close(() => resolve())); },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/runtime/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { createServer } from 'node:http';\nimport type { AddressInfo } from 'node:net';\nimport { stat } from 'node:fs/promises';\nimport { isAbsolute } from 'node:path';\nimport { AgentError, errorInfo } from '../errors.js';\nimport { Coordinator } from './coordinator.js';\nimport type { Delivery, ExecutionReference, Receipt, SessionInput } from './types.js';\nimport { dispatchSdkRequest, isSdkCommand } from './sdk-service.js';\nimport { captureExecution, captureReference, checkCapturedExecution, type CapturedExecution } from './capture.js';\nimport { checkAgent, listAgents, type CatalogEnvironment } from './catalog.js';\nimport { resolveStateDirectory } from './state.js';\nimport type { HarnessConfig } from '../sdk/types.js';\n\ninterface Request {\n command: string; input?: SessionInput; id?: string; after?: string;\n prompt?: string; delivery?: Delivery; full?: boolean; detach?: boolean; parentToken?: string;\n content?: unknown;\n includePrompt?: boolean; knownResponseId?: string;\n agent?: unknown; cwd?: string; env?: NodeJS.ProcessEnv;\n reference?: ExecutionReference;\n}\n\nexport interface ServiceCaptureOperations {\n captureExecution:typeof captureExecution;\n captureReference:typeof captureReference;\n checkCapturedExecution:typeof checkCapturedExecution;\n}\nexport interface ServiceOptions {\n readonly initialCaptures?:ReadonlyMap<string,CapturedExecution>;\n readonly capture?:Partial<ServiceCaptureOperations>;\n}\n\nexport async function startService(engine: Coordinator, token: string, instanceId: string, state?:string,\n options:ServiceOptions={}) {\n const directory=resolveStateDirectory(state);\n const captures=new Map<string,CapturedExecution>(options.initialCaptures);\n const captureOperations:ServiceCaptureOperations={captureExecution,captureReference,checkCapturedExecution,...options.capture};\n const sdkOperations={\n listAgents:async(data:Record<string,unknown>)=>listAgents(await catalogInput(data,directory)),\n checkAgent:async(data:Record<string,unknown>)=>{\n const input=await catalogInput(data,directory); await checkAgent(connectedAgent(data.agent),input);\n },\n createSession:async(data:Record<string,unknown>):Promise<string>=>{\n const input=await catalogInput(data,directory);\n const captured=await captureOperations.captureExecution(connectedAgent(data.agent),input);\n try {\n const id=engine.createSession({reference:captured.reference,cwd:input.cwd,env:input.env},captured.prepared);\n captures.set(id,captured); return id;\n } catch(error) { return releaseRejected(captured,error); }\n },\n closeSession:async(id:string)=>{ await engine.closeSession(id); captures.delete(id); },\n };\n const server = createServer(async (request, response) => {\n if (request.headers.authorization !== `Bearer ${token}`) { response.writeHead(401).end(); return; }\n if (request.method === 'GET' && request.url === '/health') {\n response.setHeader('content-type','application/json');\n response.end(JSON.stringify({\n version:1,\n type:'coordinator-health',\n instanceId,\n protocolVersion:1,\n capabilities:['sdk-v1','cli-v1'],\n }));\n return;\n }\n if (request.method !== 'POST' || request.url !== '/') { response.writeHead(404).end(); return; }\n if (request.headers['x-subharness-instance'] !== instanceId) { response.writeHead(409).end(); return; }\n response.setHeader('content-type', 'application/x-ndjson');\n const observer = new AbortController();\n // Keep long, quiet observations alive without exposing progress records to callers.\n const heartbeat = setInterval(() => { if (!response.destroyed) response.write('\\n'); }, 15_000);\n response.once('close', () => { clearInterval(heartbeat); observer.abort(); });\n const write = (record: unknown) => { if (!response.destroyed) response.write(JSON.stringify(record) + '\\n'); };\n try {\n let body = '';\n for await (const chunk of request) {\n body += chunk;\n if (Buffer.byteLength(body) > 4 * 1024 * 1024) throw new AgentError('INVALID_ARGUMENT','Request exceeds 4 MiB.');\n }\n let data: Request;\n try { data = JSON.parse(body) as Request; }\n catch { throw new AgentError('INVALID_ARGUMENT','Coordinator input must be valid JSON.'); }\n if (!data || typeof data !== 'object' || Array.isArray(data))\n throw new AgentError('INVALID_ARGUMENT','Coordinator input must be a JSON object.');\n if (isSdkCommand(data.command)) {\n for await (const record of dispatchSdkRequest(engine,data as unknown as Record<string,unknown>,observer.signal,sdkOperations)) write(record);\n clearInterval(heartbeat);\n response.end();\n return;\n }\n let receipt: Receipt | undefined;\n switch (data.command) {\n case 'dashboard': write(await engine.dashboard()); break;\n case 'dashboard-session':\n if (typeof data.id !== 'string')\n throw new AgentError('INVALID_ARGUMENT', 'Invalid dashboard session request fields.');\n write(await engine.dashboardSession(data.id)); break;\n case 'dashboard-detail':\n if (typeof data.id !== 'string' ||\n (data.includePrompt !== undefined && typeof data.includePrompt !== 'boolean') ||\n (data.knownResponseId !== undefined && typeof data.knownResponseId !== 'string'))\n throw new AgentError('INVALID_ARGUMENT', 'Invalid dashboard detail request fields.');\n write(await engine.dashboardDetail(data.id, data.includePrompt ?? true, data.knownResponseId)); break;\n case 'parent': write(engine.parentContext(data.parentToken!)); break;\n case 'parent-catalog': {\n const {captured}=bindParent(engine,captures,data.parentToken);\n write({version:1,type:'agents',agents:captured.children.map(child=>({\n id:`subagent:${child.name}`,name:child.name,description:child.description,scope:'subagent',\n }))});\n break;\n }\n case 'parent-check': {\n const binding=bindParent(engine,captures,data.parentToken);\n const input=await catalogInput(data as unknown as Record<string,unknown>,directory);\n const captured=binding.captured;\n const child=await captured.child(childName(data.agent));\n try { validateParentBinding(engine,binding); }\n catch(error) { await releaseRejected(child,error); }\n await captureOperations.checkCapturedExecution(child,input);\n write({version:1,type:'ack'}); break;\n }\n case 'parent-run': {\n const binding=bindParent(engine,captures,data.parentToken);\n const input=await catalogInput(data as unknown as Record<string,unknown>,directory);\n const captured=binding.captured;\n const child=await captured.child(childName(data.agent));\n try {\n validateParentBinding(engine,binding);\n receipt=engine.run({reference:child.reference,cwd:input.cwd,env:input.env,\n prompt:data.prompt!,parentToken:binding.token},child.prepared);\n captures.set(receipt.sessionId,child);\n } catch(error) { await releaseRejected(child,error); }\n break;\n }\n case 'cli-run': {\n const input=await catalogInput(data as unknown as Record<string,unknown>,directory);\n const captured=data.reference\n ? await captureOperations.captureReference(data.reference,input)\n : await captureOperations.captureExecution(connectedAgent(data.agent),input);\n try {\n receipt=engine.run({reference:captured.reference,cwd:input.cwd,env:input.env,\n prompt:data.prompt!,parentToken:data.parentToken},captured.prepared);\n captures.set(receipt.sessionId,captured);\n } catch(error) { await releaseRejected(captured,error); }\n break;\n }\n case 'run': receipt = engine.run(data.input!); break;\n case 'send':\n if (data.detach && data.delivery === 'steer') throw new AgentError('INVALID_ARGUMENT','--detach cannot be combined with --delivery steer.');\n receipt = await engine.send(data.id!, data.prompt!, data.delivery ?? 'queue', data.parentToken); break;\n case 'resume': {\n const active = engine.queue(data.id!).active;\n if (!active || active.state !== 'failed') throw new AgentError('NOT_FAILED','This session has no failed task to resume.');\n const after = engine.status(active.taskId).response?.responseId;\n receipt = await engine.resume(data.id!);\n write(receipt); write(await engine.observe(receipt.taskId, after, data.parentToken, observer.signal));\n receipt = undefined; break;\n }\n case 'wait': write(await engine.observe(data.id!, data.after, data.parentToken, observer.signal)); break;\n case 'status': write(engine.status(data.id!, data.full)); break;\n case 'queue': write(engine.queue(data.id!)); break;\n case 'cancel': write(await engine.cancel(data.id!)); break;\n case 'respond': write(engine.respond(data.id!,data.content,data.parentToken)); break;\n default: throw new AgentError('INVALID_ARGUMENT','Unknown coordinator operation.');\n }\n if (receipt) {\n write(receipt);\n if (receipt.type === 'started' && !data.detach) {\n write(await engine.observe(receipt.taskId, undefined, data.parentToken ?? data.input?.parentToken, observer.signal));\n }\n }\n } catch (error) { write({version:1,type:'error',error:errorInfo(error)}); }\n clearInterval(heartbeat);\n response.end();\n });\n await new Promise<void>((resolve, reject) => {\n server.once('error', reject);\n server.listen(0, '127.0.0.1', resolve);\n });\n return {\n url: `http://127.0.0.1:${(server.address() as AddressInfo).port}/`,\n async close() {\n let failure: unknown;\n try { await engine.close(); }\n catch (error) { failure = error; }\n finally {\n server.closeAllConnections();\n await new Promise<void>(resolve => server.close(() => resolve()));\n }\n if (failure) throw failure;\n },\n };\n}\n\nasync function catalogInput(data:Record<string,unknown>,directory:string):Promise<CatalogEnvironment> {\n const cwd=data.cwd;\n if(typeof cwd!=='string'||!isAbsolute(cwd))throw new AgentError('INVALID_ARGUMENT','Execution cwd must be an existing absolute directory.');\n try{if(!(await stat(cwd)).isDirectory())throw new Error();}\n catch{throw new AgentError('INVALID_ARGUMENT','Execution cwd must be an existing absolute directory.');}\n const source=data.env;\n if(!source||typeof source!=='object'||Array.isArray(source))throw new AgentError('INVALID_ARGUMENT','Connected environment must be an object.');\n const env:NodeJS.ProcessEnv={};\n for(const key of Reflect.ownKeys(source)){\n if(typeof key!=='string')throw new AgentError('INVALID_ARGUMENT','Connected environment keys must be strings.');\n const value=(source as Record<string,unknown>)[key];\n if(value!==undefined&&typeof value!=='string')throw new AgentError('INVALID_ARGUMENT','Connected environment values must be strings or undefined.');\n if(typeof value==='string')env[key]=value;\n }\n delete env.AGENT_PARENT_TOKEN;delete env.AGENT_CLI_PATH;env.AGENT_STATE_DIR=directory;\n return {cwd,env};\n}\n\nfunction connectedAgent(value:unknown):string|HarnessConfig {\n if(typeof value==='string'||(value!==null&&typeof value==='object'&&!Array.isArray(value)))return value as string|HarnessConfig;\n throw new AgentError('INVALID_ARGUMENT','Connected agent must be an ID or harness configuration.');\n}\n\ninterface ParentBinding {readonly token:string;readonly taskId:string;readonly sessionId:string;readonly captured:CapturedExecution}\n\nfunction bindParent(engine:Coordinator,captures:Map<string,CapturedExecution>,token:unknown):ParentBinding {\n if(typeof token!=='string'||!token)throw new AgentError('INVALID_PARENT','The parent context is no longer active.');\n const context=engine.parentContext(token);\n const captured=captures.get(context.sessionId);\n if(!captured)throw new AgentError('INVALID_PARENT','The active parent does not own a captured definition graph.');\n return {token,taskId:context.taskId,sessionId:context.sessionId,captured};\n}\n\nfunction validateParentBinding(engine:Coordinator,binding:ParentBinding):void {\n const current=engine.parentContext(binding.token);\n if(current.taskId!==binding.taskId||current.sessionId!==binding.sessionId)\n throw new AgentError('INVALID_PARENT','The parent context is no longer active.');\n}\n\nfunction childName(value:unknown):string {\n if(typeof value!=='string'||!value.startsWith('subagent:')||!value.slice(9))\n throw new AgentError('INVALID_PARENT','This subagent is not available in the active parent context.');\n return value.slice(9);\n}\n\nasync function releaseRejected(captured:CapturedExecution,admissionError:unknown):Promise<never> {\n try { await captured.prepared.close(); }\n catch { throw new AgentError('HARNESS_FAILED','Captured execution cleanup failed after admission was rejected.'); }\n throw admissionError;\n}\n"]}
|
|
@@ -8,7 +8,7 @@ export async function createSessionLauncher(state, parentToken) {
|
|
|
8
8
|
const directory = await mkdtemp(join(root, 'session-'));
|
|
9
9
|
const path = join(directory, 'agent');
|
|
10
10
|
let closing;
|
|
11
|
-
const close = () => closing ??= rm(directory, { recursive: true, force: true });
|
|
11
|
+
const close = () => closing ??= rm(directory, { recursive: true, force: true }).catch(error => { closing = undefined; throw error; });
|
|
12
12
|
try {
|
|
13
13
|
const extension = import.meta.url.endsWith('.ts') ? 'ts' : 'js';
|
|
14
14
|
const registration = extension === 'ts'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-launcher.js","sourceRoot":"","sources":["../../src/runtime/session-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAa,EAAE,WAAmB;IAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAC,UAAU,CAAC,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAC,OAAO,CAAC,CAAC;IACrC,IAAI,OAAkC,CAAC;IACvC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,SAAS,EAAC,EAAC,SAAS,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"session-launcher.js","sourceRoot":"","sources":["../../src/runtime/session-launcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,qFAAqF;AACrF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAa,EAAE,WAAmB;IAC5E,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAC,WAAW,CAAC,CAAC;IAC9C,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,EAAC,UAAU,CAAC,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAC,OAAO,CAAC,CAAC;IACrC,IAAI,OAAkC,CAAC;IACvC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,OAAO,KAAK,EAAE,CAAC,SAAS,EAAC,EAAC,SAAS,EAAC,IAAI,EAAC,KAAK,EAAC,IAAI,EAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAA,EAAE,GAAC,OAAO,GAAC,SAAS,CAAC,CAAA,MAAM,KAAK,CAAC,CAAA,CAAC,CAAC,CAAC;IACzH,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,MAAM,YAAY,GAAG,SAAS,KAAK,IAAI;YACrC,CAAC,CAAC,4BAA4B,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;QACzG,MAAM,OAAO,GAAG,EAAC,eAAe,EAAC,OAAO,CAAC,KAAK,CAAC,EAAC,kBAAkB,EAAC,WAAW,EAAC,cAAc,EAAC,IAAI,EAAC,CAAC;QACpG,MAAM,OAAO,GAAG,KAAK,OAAO,CAAC,QAAQ,KAAK,YAAY,EAAE;YACtD,6BAA6B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM;YAC1D,gBAAgB,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,eAAe,SAAS,EAAE,EAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACjG,MAAM,SAAS,CAAC,IAAI,CAAC,SAAS,EAAC,cAAc,CAAC,EAAC,mBAAmB,EAAC,EAAC,IAAI,EAAC,KAAK,EAAC,CAAC,CAAC;QACjF,MAAM,SAAS,CAAC,IAAI,EAAC,OAAO,EAAC,EAAC,IAAI,EAAC,KAAK,EAAC,CAAC,CAAC;QAC3C,OAAO,EAAC,IAAI,EAAC,SAAS,EAAC,KAAK,EAAC,CAAC;IAChC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,MAAM,KAAK,EAAE,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;AACjD,CAAC","sourcesContent":["import { mkdtemp, rm, writeFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { privateDirectory } from './state.js';\n\n/** Keeps local delegation context outside model instructions and shell arguments. */\nexport async function createSessionLauncher(state: string, parentToken: string) {\n const root = join(resolve(state),'launchers');\n await privateDirectory(root);\n const directory = await mkdtemp(join(root,'session-'));\n const path = join(directory,'agent');\n let closing: Promise<void> | undefined;\n const close = () => closing ??= rm(directory,{recursive:true,force:true}).catch(error=>{closing=undefined;throw error;});\n try {\n const extension = import.meta.url.endsWith('.ts') ? 'ts' : 'js';\n const registration = extension === 'ts'\n ? `import { register } from ${JSON.stringify(import.meta.resolve('tsx/esm/api'))}; register();\\n` : '';\n const context = {AGENT_STATE_DIR:resolve(state),AGENT_PARENT_TOKEN:parentToken,AGENT_CLI_PATH:path};\n const wrapper = `#!${process.execPath}\\n${registration}` +\n `Object.assign(process.env,${JSON.stringify(context)});\\n` +\n `await import(${JSON.stringify(new URL(`../cli/main.${extension}`,import.meta.url).href)});\\n`;\n await writeFile(join(directory,'package.json'),'{\"type\":\"module\"}',{mode:0o600});\n await writeFile(path,wrapper,{mode:0o700});\n return {path,directory,close};\n } catch (error) { await close(); throw error; }\n}\n"]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import type { ErrorInfo } from '../errors.js';
|
|
2
|
+
import type { HarnessKind } from '../sdk/types.js';
|
|
3
|
+
import type { ApprovalRequest, TaskState } from './task-data.js';
|
|
4
|
+
export type TerminalState = 'completed' | 'failed' | 'cancelled' | 'interrupted';
|
|
5
|
+
export interface TaskSummary {
|
|
6
|
+
readonly taskId: string;
|
|
7
|
+
readonly sessionId: string;
|
|
8
|
+
readonly state: TaskState;
|
|
9
|
+
readonly selectedHarness?: HarnessKind;
|
|
10
|
+
}
|
|
11
|
+
export interface SdkTaskSummary extends TaskSummary {
|
|
12
|
+
readonly title: string;
|
|
13
|
+
readonly ordinal: number;
|
|
14
|
+
readonly updatedAt: number;
|
|
15
|
+
readonly dispatchedAt?: number;
|
|
16
|
+
readonly failedAt?: number;
|
|
17
|
+
readonly finishedAt?: number;
|
|
18
|
+
}
|
|
19
|
+
export interface CompleteResponse {
|
|
20
|
+
readonly responseId: string;
|
|
21
|
+
readonly text: string;
|
|
22
|
+
readonly state: TaskState;
|
|
23
|
+
}
|
|
24
|
+
export interface TaskSnapshot extends TaskSummary {
|
|
25
|
+
readonly revision: number;
|
|
26
|
+
readonly parentTaskId?: string;
|
|
27
|
+
readonly children: readonly TaskSummary[];
|
|
28
|
+
readonly requests: readonly ApprovalRequest[];
|
|
29
|
+
readonly latestResponse?: CompleteResponse;
|
|
30
|
+
readonly error?: ErrorInfo;
|
|
31
|
+
readonly stopUnconfirmed: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface SessionSnapshot {
|
|
34
|
+
readonly sessionId: string;
|
|
35
|
+
readonly state: 'open' | 'closing' | 'closed';
|
|
36
|
+
readonly paused: boolean;
|
|
37
|
+
readonly active?: TaskSummary;
|
|
38
|
+
readonly queued: readonly TaskSummary[];
|
|
39
|
+
}
|
|
40
|
+
export interface WorkspaceInfo {
|
|
41
|
+
readonly directory: string;
|
|
42
|
+
readonly repository?: string;
|
|
43
|
+
}
|
|
44
|
+
export interface SdkSessionSummary {
|
|
45
|
+
readonly sessionId: string;
|
|
46
|
+
readonly state: 'open' | 'closing' | 'closed';
|
|
47
|
+
readonly paused: boolean;
|
|
48
|
+
readonly cwd: string;
|
|
49
|
+
readonly workspace: WorkspaceInfo;
|
|
50
|
+
readonly active?: SdkTaskSummary;
|
|
51
|
+
}
|
|
52
|
+
export interface SdkSessionSnapshot extends SdkSessionSummary {
|
|
53
|
+
readonly queued: readonly SdkTaskSummary[];
|
|
54
|
+
}
|
|
55
|
+
export interface SdkTaskSnapshot extends SdkTaskSummary {
|
|
56
|
+
readonly revision: number;
|
|
57
|
+
readonly parentTaskId?: string;
|
|
58
|
+
readonly children: readonly SdkTaskSummary[];
|
|
59
|
+
readonly requests: readonly import('./task-data.js').SdkApprovalRequest[];
|
|
60
|
+
readonly latestResponse?: CompleteResponse;
|
|
61
|
+
readonly error?: ErrorInfo;
|
|
62
|
+
readonly stopUnconfirmed: boolean;
|
|
63
|
+
}
|
|
64
|
+
export interface SdkTaskDetails extends SdkTaskSnapshot {
|
|
65
|
+
readonly prompt: string;
|
|
66
|
+
}
|
|
67
|
+
export interface TaskResult {
|
|
68
|
+
readonly taskId: string;
|
|
69
|
+
readonly sessionId: string;
|
|
70
|
+
readonly responseId: string;
|
|
71
|
+
readonly text: string;
|
|
72
|
+
}
|
|
73
|
+
export interface PageOptions {
|
|
74
|
+
readonly limit?: number;
|
|
75
|
+
readonly cursor?: string;
|
|
76
|
+
}
|
|
77
|
+
export interface Page<T> {
|
|
78
|
+
readonly items: readonly T[];
|
|
79
|
+
readonly nextCursor?: string;
|
|
80
|
+
}
|
|
81
|
+
export type TaskObservation = {
|
|
82
|
+
readonly type: 'response';
|
|
83
|
+
readonly taskId: string;
|
|
84
|
+
readonly sessionId: string;
|
|
85
|
+
readonly response: CompleteResponse;
|
|
86
|
+
} | {
|
|
87
|
+
readonly type: 'approval_required';
|
|
88
|
+
readonly taskId: string;
|
|
89
|
+
readonly sessionId: string;
|
|
90
|
+
readonly state: TaskState;
|
|
91
|
+
readonly requests: readonly ApprovalRequest[];
|
|
92
|
+
} | {
|
|
93
|
+
readonly type: 'terminal';
|
|
94
|
+
readonly taskId: string;
|
|
95
|
+
readonly sessionId: string;
|
|
96
|
+
readonly state: TerminalState;
|
|
97
|
+
readonly error?: ErrorInfo;
|
|
98
|
+
readonly stopUnconfirmed: boolean;
|
|
99
|
+
};
|
|
100
|
+
export declare function detached<T>(value: T): T;
|
|
101
|
+
export declare function createSnapshotWatch<T extends {
|
|
102
|
+
readonly state: TaskState;
|
|
103
|
+
} = TaskSnapshot>(read: () => T, subscribe: (changed: () => void) => () => void, signal?: AbortSignal): AsyncIterable<T>;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { AgentError } from '../errors.js';
|
|
2
|
+
export function detached(value) {
|
|
3
|
+
return structuredClone(value);
|
|
4
|
+
}
|
|
5
|
+
export function createSnapshotWatch(read, subscribe, signal) {
|
|
6
|
+
return {
|
|
7
|
+
[Symbol.asyncIterator]() {
|
|
8
|
+
let started = false;
|
|
9
|
+
let ended = false;
|
|
10
|
+
let buffered;
|
|
11
|
+
let unsubscribe;
|
|
12
|
+
const pending = [];
|
|
13
|
+
let failure;
|
|
14
|
+
let failed = false;
|
|
15
|
+
const done = () => ({ done: true, value: undefined });
|
|
16
|
+
const cleanup = () => {
|
|
17
|
+
unsubscribe?.();
|
|
18
|
+
unsubscribe = undefined;
|
|
19
|
+
signal?.removeEventListener('abort', abort);
|
|
20
|
+
};
|
|
21
|
+
const resolvePendingDone = () => {
|
|
22
|
+
for (const waiter of pending.splice(0))
|
|
23
|
+
waiter.resolve(done());
|
|
24
|
+
};
|
|
25
|
+
const rejectPending = (error) => {
|
|
26
|
+
for (const waiter of pending.splice(0))
|
|
27
|
+
waiter.reject(error);
|
|
28
|
+
};
|
|
29
|
+
const result = (value) => {
|
|
30
|
+
if (value.state === 'completed' || value.state === 'failed' ||
|
|
31
|
+
value.state === 'cancelled' || value.state === 'interrupted') {
|
|
32
|
+
ended = true;
|
|
33
|
+
cleanup();
|
|
34
|
+
resolvePendingDone();
|
|
35
|
+
}
|
|
36
|
+
return { done: false, value };
|
|
37
|
+
};
|
|
38
|
+
const changed = () => {
|
|
39
|
+
if (ended || failed)
|
|
40
|
+
return;
|
|
41
|
+
let value;
|
|
42
|
+
try {
|
|
43
|
+
value = read();
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
fail(error);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const waiter = pending.shift();
|
|
50
|
+
if (waiter)
|
|
51
|
+
waiter.resolve(result(value));
|
|
52
|
+
else {
|
|
53
|
+
buffered = value;
|
|
54
|
+
if (value.state === 'completed' || value.state === 'failed' ||
|
|
55
|
+
value.state === 'cancelled' || value.state === 'interrupted') {
|
|
56
|
+
unsubscribe?.();
|
|
57
|
+
unsubscribe = undefined;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
const fail = (error) => {
|
|
62
|
+
if (ended || failed)
|
|
63
|
+
return;
|
|
64
|
+
failed = true;
|
|
65
|
+
failure = error;
|
|
66
|
+
buffered = undefined;
|
|
67
|
+
cleanup();
|
|
68
|
+
rejectPending(error);
|
|
69
|
+
};
|
|
70
|
+
const abort = () => {
|
|
71
|
+
fail(new AgentError('OBSERVATION_CLOSED', 'The observer disconnected.'));
|
|
72
|
+
};
|
|
73
|
+
return {
|
|
74
|
+
next() {
|
|
75
|
+
if (ended)
|
|
76
|
+
return Promise.resolve(done());
|
|
77
|
+
if (failed)
|
|
78
|
+
return Promise.reject(failure);
|
|
79
|
+
if (signal?.aborted) {
|
|
80
|
+
abort();
|
|
81
|
+
return Promise.reject(failure);
|
|
82
|
+
}
|
|
83
|
+
if (buffered) {
|
|
84
|
+
const value = buffered;
|
|
85
|
+
buffered = undefined;
|
|
86
|
+
return Promise.resolve(result(value));
|
|
87
|
+
}
|
|
88
|
+
if (!started) {
|
|
89
|
+
started = true;
|
|
90
|
+
try {
|
|
91
|
+
unsubscribe = subscribe(changed);
|
|
92
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
93
|
+
return Promise.resolve(result(read()));
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
fail(error);
|
|
97
|
+
return Promise.reject(error);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return new Promise((resolve, reject) => {
|
|
101
|
+
pending.push({ resolve, reject });
|
|
102
|
+
});
|
|
103
|
+
},
|
|
104
|
+
return() {
|
|
105
|
+
buffered = undefined;
|
|
106
|
+
if (!ended) {
|
|
107
|
+
ended = true;
|
|
108
|
+
cleanup();
|
|
109
|
+
resolvePendingDone();
|
|
110
|
+
}
|
|
111
|
+
return Promise.resolve(done());
|
|
112
|
+
},
|
|
113
|
+
throw(error) {
|
|
114
|
+
ended = true;
|
|
115
|
+
buffered = undefined;
|
|
116
|
+
cleanup();
|
|
117
|
+
rejectPending(error);
|
|
118
|
+
return Promise.reject(error);
|
|
119
|
+
},
|
|
120
|
+
};
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=snapshots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"snapshots.js","sourceRoot":"","sources":["../../src/runtime/snapshots.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ErrorInfo } from '../errors.js';\nimport type { HarnessKind } from '../sdk/types.js';\nimport type { ApprovalRequest, TaskState } from './task-data.js';\nimport { AgentError } from '../errors.js';\n\nexport type TerminalState = 'completed' | 'failed' | 'cancelled' | 'interrupted';\n\nexport interface TaskSummary {\n readonly taskId: string;\n readonly sessionId: string;\n readonly state: TaskState;\n readonly selectedHarness?: HarnessKind;\n}\n\nexport interface SdkTaskSummary extends TaskSummary {\n readonly title: string;\n readonly ordinal: number;\n readonly updatedAt: number;\n readonly dispatchedAt?: number;\n readonly failedAt?: number;\n readonly finishedAt?: number;\n}\n\nexport interface CompleteResponse {\n readonly responseId: string;\n readonly text: string;\n readonly state: TaskState;\n}\n\nexport interface TaskSnapshot extends TaskSummary {\n readonly revision: number;\n readonly parentTaskId?: string;\n readonly children: readonly TaskSummary[];\n readonly requests: readonly ApprovalRequest[];\n readonly latestResponse?: CompleteResponse;\n readonly error?: ErrorInfo;\n readonly stopUnconfirmed: boolean;\n}\n\nexport interface SessionSnapshot {\n readonly sessionId: string;\n readonly state: 'open' | 'closing' | 'closed';\n readonly paused: boolean;\n readonly active?: TaskSummary;\n readonly queued: readonly TaskSummary[];\n}\n\nexport interface WorkspaceInfo { readonly directory: string; readonly repository?: string }\nexport interface SdkSessionSummary {\n readonly sessionId: string;\n readonly state: 'open' | 'closing' | 'closed';\n readonly paused: boolean;\n readonly cwd: string;\n readonly workspace: WorkspaceInfo;\n readonly active?: SdkTaskSummary;\n}\nexport interface SdkSessionSnapshot extends SdkSessionSummary { readonly queued: readonly SdkTaskSummary[] }\nexport interface SdkTaskSnapshot extends SdkTaskSummary {\n readonly revision: number;\n readonly parentTaskId?: string;\n readonly children: readonly SdkTaskSummary[];\n readonly requests: readonly import('./task-data.js').SdkApprovalRequest[];\n readonly latestResponse?: CompleteResponse;\n readonly error?: ErrorInfo;\n readonly stopUnconfirmed: boolean;\n}\nexport interface SdkTaskDetails extends SdkTaskSnapshot { readonly prompt: string }\nexport interface TaskResult {\n readonly taskId: string;\n readonly sessionId: string;\n readonly responseId: string;\n readonly text: string;\n}\nexport interface PageOptions { readonly limit?: number; readonly cursor?: string }\nexport interface Page<T> { readonly items: readonly T[]; readonly nextCursor?: string }\n\nexport type TaskObservation =\n | { readonly type: 'response'; readonly taskId: string; readonly sessionId: string;\n readonly response: CompleteResponse }\n | { readonly type: 'approval_required'; readonly taskId: string; readonly sessionId: string;\n readonly state: TaskState; readonly requests: readonly ApprovalRequest[] }\n | { readonly type: 'terminal'; readonly taskId: string; readonly sessionId: string;\n readonly state: TerminalState; readonly error?: ErrorInfo; readonly stopUnconfirmed: boolean };\n\nexport function detached<T>(value: T): T {\n return structuredClone(value);\n}\n\nexport function createSnapshotWatch<T extends {readonly state:TaskState} = TaskSnapshot>(\n read: () => T,\n subscribe: (changed: () => void) => () => void,\n signal?: AbortSignal,\n): AsyncIterable<T> {\n return {\n [Symbol.asyncIterator](): AsyncIterator<T> {\n let started = false;\n let ended = false;\n let buffered: T | undefined;\n let unsubscribe: (() => void) | undefined;\n const pending: {\n resolve(result: IteratorResult<T>): void;\n reject(error: unknown): void;\n }[] = [];\n let failure: unknown;\n let failed = false;\n\n const done = (): IteratorResult<T> => ({done: true, value: undefined});\n const cleanup = () => {\n unsubscribe?.();\n unsubscribe = undefined;\n signal?.removeEventListener('abort', abort);\n };\n const resolvePendingDone = () => {\n for (const waiter of pending.splice(0)) waiter.resolve(done());\n };\n const rejectPending = (error: unknown) => {\n for (const waiter of pending.splice(0)) waiter.reject(error);\n };\n const result = (value: T): IteratorResult<T> => {\n if (value.state === 'completed' || value.state === 'failed' ||\n value.state === 'cancelled' || value.state === 'interrupted') {\n ended = true;\n cleanup();\n resolvePendingDone();\n }\n return {done: false, value};\n };\n const changed = () => {\n if (ended || failed) return;\n let value: T;\n try { value = read(); }\n catch (error) { fail(error); return; }\n const waiter = pending.shift();\n if (waiter) waiter.resolve(result(value));\n else {\n buffered = value;\n if (value.state === 'completed' || value.state === 'failed' ||\n value.state === 'cancelled' || value.state === 'interrupted') {\n unsubscribe?.();\n unsubscribe = undefined;\n }\n }\n };\n const fail = (error: unknown) => {\n if (ended || failed) return;\n failed = true;\n failure = error;\n buffered = undefined;\n cleanup();\n rejectPending(error);\n };\n const abort = () => {\n fail(new AgentError('OBSERVATION_CLOSED', 'The observer disconnected.'));\n };\n\n return {\n next(): Promise<IteratorResult<T>> {\n if (ended) return Promise.resolve(done());\n if (failed) return Promise.reject(failure);\n if (signal?.aborted) { abort(); return Promise.reject(failure); }\n if (buffered) {\n const value = buffered;\n buffered = undefined;\n return Promise.resolve(result(value));\n }\n if (!started) {\n started = true;\n try {\n unsubscribe = subscribe(changed);\n signal?.addEventListener('abort', abort, {once: true});\n return Promise.resolve(result(read()));\n } catch (error) {\n fail(error);\n return Promise.reject(error);\n }\n }\n return new Promise<IteratorResult<T>>((resolve, reject) => {\n pending.push({resolve, reject});\n });\n },\n return(): Promise<IteratorResult<T>> {\n buffered = undefined;\n if (!ended) {\n ended = true;\n cleanup();\n resolvePendingDone();\n }\n return Promise.resolve(done());\n },\n throw(error?: unknown): Promise<IteratorResult<T>> {\n ended = true;\n buffered = undefined;\n cleanup();\n rejectPending(error);\n return Promise.reject(error);\n },\n };\n },\n };\n}\n"]}
|
package/dist/runtime/state.d.ts
CHANGED
|
@@ -4,8 +4,34 @@ export interface Endpoint {
|
|
|
4
4
|
pid: number;
|
|
5
5
|
instanceId: string;
|
|
6
6
|
}
|
|
7
|
+
export type EndpointCapability = 'sdk-v1' | 'cli-v1';
|
|
8
|
+
export type OwnerState = 'alive' | 'dead' | 'unknown';
|
|
9
|
+
export type EndpointProbe = {
|
|
10
|
+
readonly kind: 'absent';
|
|
11
|
+
} | {
|
|
12
|
+
readonly kind: 'malformed';
|
|
13
|
+
} | {
|
|
14
|
+
readonly kind: 'reachable';
|
|
15
|
+
readonly endpoint: Endpoint;
|
|
16
|
+
} | {
|
|
17
|
+
readonly kind: 'authentication-failed' | 'incompatible' | 'instance-mismatch';
|
|
18
|
+
readonly endpoint: Endpoint;
|
|
19
|
+
} | {
|
|
20
|
+
readonly kind: 'unresponsive';
|
|
21
|
+
readonly endpoint: Endpoint;
|
|
22
|
+
readonly owner: OwnerState;
|
|
23
|
+
};
|
|
24
|
+
export interface EndpointProbeOptions {
|
|
25
|
+
readonly capability?: EndpointCapability;
|
|
26
|
+
readonly timeoutMs?: number;
|
|
27
|
+
readonly signal?: AbortSignal;
|
|
28
|
+
readonly checkPid?: (pid: number) => OwnerState;
|
|
29
|
+
}
|
|
30
|
+
export declare function resolveStateDirectory(explicit?: string, env?: Readonly<Record<string, string | undefined>>): string;
|
|
7
31
|
export declare function stateDirectory(): string;
|
|
8
32
|
export declare function privateDirectory(directory: string): Promise<void>;
|
|
33
|
+
export declare function probeEndpoint(directory: string, options?: EndpointProbeOptions): Promise<EndpointProbe>;
|
|
34
|
+
export declare function processOwnerState(pid: number): OwnerState;
|
|
9
35
|
export declare function readEndpoint(directory: string): Promise<Endpoint | undefined>;
|
|
10
36
|
export declare function localProgram(name: string): {
|
|
11
37
|
file: string;
|