@sift-wiki/conductor 0.1.0 → 0.2.0-beta.2
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 +28 -58
- package/dist/adapters/claudeAgent.js +1 -0
- package/dist/adapters/claudeAgent.js.map +1 -1
- package/dist/adapters/codexAgent.js +1 -0
- package/dist/adapters/codexAgent.js.map +1 -1
- package/dist/adapters/fakeAgent.js +1 -0
- package/dist/adapters/fakeAgent.js.map +1 -1
- package/dist/adapters/httpAgent.js +1 -0
- package/dist/adapters/httpAgent.js.map +1 -1
- package/dist/adapters/processAgent.js +4 -0
- package/dist/adapters/processAgent.js.map +1 -1
- package/dist/adapters/provider/runProvider.js +4 -0
- package/dist/adapters/provider/runProvider.js.map +1 -1
- package/dist/adapters/provider/store.js +3 -4
- package/dist/adapters/provider/store.js.map +1 -1
- package/dist/adapters/types.d.ts +9 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.js +44 -3
- package/dist/cli.js.map +1 -1
- package/dist/conductorClient.d.ts +245 -17
- package/dist/conductorClient.js +147 -38
- package/dist/conductorClient.js.map +1 -1
- package/dist/config.js +4 -5
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +23 -6
- package/dist/daemon.js +173 -95
- package/dist/daemon.js.map +1 -1
- package/dist/desktop/app/contracts.d.ts +71 -0
- package/dist/desktop/app/contracts.js +19 -0
- package/dist/desktop/app/contracts.js.map +1 -0
- package/dist/desktop/app/controller.d.ts +58 -0
- package/dist/desktop/app/controller.js +161 -0
- package/dist/desktop/app/controller.js.map +1 -0
- package/dist/desktop/app/runtimeController.d.ts +29 -0
- package/dist/desktop/app/runtimeController.js +55 -0
- package/dist/desktop/app/runtimeController.js.map +1 -0
- package/dist/localApi/authorizedPairing.d.ts +12 -0
- package/dist/localApi/authorizedPairing.js +18 -0
- package/dist/localApi/authorizedPairing.js.map +1 -0
- package/dist/localApi/contracts.d.ts +264 -0
- package/dist/localApi/contracts.js +191 -0
- package/dist/localApi/contracts.js.map +1 -0
- package/dist/localApi/recovery.d.ts +66 -0
- package/dist/localApi/recovery.js +115 -0
- package/dist/localApi/recovery.js.map +1 -0
- package/dist/localApi/server.d.ts +20 -0
- package/dist/localApi/server.js +414 -0
- package/dist/localApi/server.js.map +1 -0
- package/dist/localApi/workConsole.d.ts +74 -0
- package/dist/localApi/workConsole.js +342 -0
- package/dist/localApi/workConsole.js.map +1 -0
- package/dist/localApi/workContracts.d.ts +213 -0
- package/dist/localApi/workContracts.js +130 -0
- package/dist/localApi/workContracts.js.map +1 -0
- package/dist/localApp/platform.d.ts +2 -0
- package/dist/localApp/platform.js +57 -0
- package/dist/localApp/platform.js.map +1 -0
- package/dist/localApp/service.d.ts +25 -0
- package/dist/localApp/service.js +126 -0
- package/dist/localApp/service.js.map +1 -0
- package/dist/protocol/fenced.d.ts +135 -0
- package/dist/protocol/fenced.js +142 -0
- package/dist/protocol/fenced.js.map +1 -0
- package/dist/redaction.js +2 -0
- package/dist/redaction.js.map +1 -1
- package/dist/runtime/atomicFile.d.ts +6 -0
- package/dist/runtime/atomicFile.js +78 -0
- package/dist/runtime/atomicFile.js.map +1 -0
- package/dist/runtime/daemonCapabilities.d.ts +7 -0
- package/dist/runtime/daemonCapabilities.js +24 -0
- package/dist/runtime/daemonCapabilities.js.map +1 -0
- package/dist/runtime/eventOutbox.d.ts +100 -0
- package/dist/runtime/eventOutbox.js +206 -0
- package/dist/runtime/eventOutbox.js.map +1 -0
- package/dist/runtime/executionJournal.d.ts +102 -0
- package/dist/runtime/executionJournal.js +209 -0
- package/dist/runtime/executionJournal.js.map +1 -0
- package/dist/runtime/executionSafety.d.ts +76 -0
- package/dist/runtime/executionSafety.js +207 -0
- package/dist/runtime/executionSafety.js.map +1 -0
- package/dist/runtime/fencedExecutionState.d.ts +43 -0
- package/dist/runtime/fencedExecutionState.js +158 -0
- package/dist/runtime/fencedExecutionState.js.map +1 -0
- package/dist/runtime/leaseManager.d.ts +38 -0
- package/dist/runtime/leaseManager.js +102 -0
- package/dist/runtime/leaseManager.js.map +1 -0
- package/dist/runtime/localLogSpool.d.ts +1 -0
- package/dist/runtime/localLogSpool.js +4 -0
- package/dist/runtime/localLogSpool.js.map +1 -1
- package/dist/runtime/localRunQueue.d.ts +1 -1
- package/dist/runtime/localRunQueue.js +8 -0
- package/dist/runtime/localRunQueue.js.map +1 -1
- package/dist/runtime/localSessionCache.d.ts +1 -1
- package/dist/runtime/localSessionCache.js.map +1 -1
- package/dist/runtime/process.d.ts +13 -1
- package/dist/runtime/process.js +39 -9
- package/dist/runtime/process.js.map +1 -1
- package/dist/runtime/recoveryCoordinator.d.ts +19 -0
- package/dist/runtime/recoveryCoordinator.js +183 -0
- package/dist/runtime/recoveryCoordinator.js.map +1 -0
- package/dist/runtime/runtimeLock.d.ts +33 -0
- package/dist/runtime/runtimeLock.js +140 -0
- package/dist/runtime/runtimeLock.js.map +1 -0
- package/dist/runtime/runtimeService.d.ts +6 -1
- package/dist/runtime/runtimeService.js +54 -20
- package/dist/runtime/runtimeService.js.map +1 -1
- package/dist/runtime/taskExecution.d.ts +2 -0
- package/dist/runtime/taskExecution.js +18 -12
- package/dist/runtime/taskExecution.js.map +1 -1
- package/dist/types.d.ts +28 -13
- package/dist/userAuth/service.d.ts +26 -0
- package/dist/userAuth/service.js +170 -0
- package/dist/userAuth/service.js.map +1 -0
- package/dist/userAuth/store.d.ts +42 -0
- package/dist/userAuth/store.js +160 -0
- package/dist/userAuth/store.js.map +1 -0
- package/dist/userAuth/types.d.ts +63 -0
- package/dist/userAuth/types.js +29 -0
- package/dist/userAuth/types.js.map +1 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/dist/workTypes.d.ts +162 -31
- package/dist/workTypes.js +31 -0
- package/dist/workTypes.js.map +1 -1
- package/dist-web/assets/index-CWAdDb9V.js +72 -0
- package/dist-web/assets/index-CWfnzdLn.css +1 -0
- package/dist-web/index.html +15 -0
- package/docs/provider-setup.md +81 -0
- package/docs/quickstart.md +62 -0
- package/docs/troubleshooting.md +63 -0
- package/package.json +13 -3
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { workTaskStatusSchema } from "../workTypes.js";
|
|
3
|
+
export const workQueueStateSchema = z.enum([
|
|
4
|
+
"needs_review",
|
|
5
|
+
"blocked",
|
|
6
|
+
"running",
|
|
7
|
+
"ready",
|
|
8
|
+
"finished",
|
|
9
|
+
"needs_attention",
|
|
10
|
+
]);
|
|
11
|
+
export const workConsoleSnapshotSchema = z.object({
|
|
12
|
+
state: z.enum(["unauthorized", "ready", "offline"]),
|
|
13
|
+
message: z.string().optional(),
|
|
14
|
+
refreshedAt: z.string(),
|
|
15
|
+
selectedProjectId: z.string().optional(),
|
|
16
|
+
selectedTaskId: z.string().optional(),
|
|
17
|
+
projects: z.array(z.object({
|
|
18
|
+
id: z.string(),
|
|
19
|
+
name: z.string(),
|
|
20
|
+
description: z.string().optional(),
|
|
21
|
+
stateLabel: z.string(),
|
|
22
|
+
}).strict()),
|
|
23
|
+
agents: z.array(z.object({
|
|
24
|
+
conductorAgentId: z.string(),
|
|
25
|
+
agentPrincipalId: z.string(),
|
|
26
|
+
localKey: z.string(),
|
|
27
|
+
displayName: z.string(),
|
|
28
|
+
adapterType: z.string(),
|
|
29
|
+
stateLabel: z.string(),
|
|
30
|
+
available: z.boolean(),
|
|
31
|
+
}).strict()),
|
|
32
|
+
queue: z.array(z.object({
|
|
33
|
+
id: z.string(),
|
|
34
|
+
projectId: z.string().optional(),
|
|
35
|
+
title: z.string(),
|
|
36
|
+
state: workQueueStateSchema,
|
|
37
|
+
stateLabel: z.string(),
|
|
38
|
+
priority: z.enum(["critical", "high", "medium", "low"]),
|
|
39
|
+
assigneePrincipalId: z.string().optional(),
|
|
40
|
+
runId: z.string().optional(),
|
|
41
|
+
progressSummary: z.string().optional(),
|
|
42
|
+
updatedAt: z.string(),
|
|
43
|
+
}).strict()),
|
|
44
|
+
detail: z.object({
|
|
45
|
+
id: z.string(),
|
|
46
|
+
title: z.string(),
|
|
47
|
+
bodyMarkdown: z.string(),
|
|
48
|
+
status: workTaskStatusSchema,
|
|
49
|
+
stateLabel: z.string(),
|
|
50
|
+
priority: z.enum(["critical", "high", "medium", "low"]),
|
|
51
|
+
assigneePrincipalId: z.string().optional(),
|
|
52
|
+
updatedAt: z.string(),
|
|
53
|
+
run: z.object({
|
|
54
|
+
id: z.string(),
|
|
55
|
+
stateLabel: z.string(),
|
|
56
|
+
progressSummary: z.string(),
|
|
57
|
+
updatedAt: z.string(),
|
|
58
|
+
localStateLabel: z.string().optional(),
|
|
59
|
+
events: z.array(z.object({
|
|
60
|
+
id: z.string(),
|
|
61
|
+
type: z.string(),
|
|
62
|
+
summary: z.string(),
|
|
63
|
+
occurredAt: z.string(),
|
|
64
|
+
}).strict()),
|
|
65
|
+
trace: z.array(z.object({
|
|
66
|
+
id: z.string(),
|
|
67
|
+
stream: z.enum(["stdout", "stderr", "system"]),
|
|
68
|
+
message: z.string(),
|
|
69
|
+
occurredAt: z.string(),
|
|
70
|
+
truncated: z.boolean(),
|
|
71
|
+
}).strict()),
|
|
72
|
+
}).strict().optional(),
|
|
73
|
+
comments: z.array(z.object({ id: z.string(), bodyMarkdown: z.string(), authorPrincipalId: z.string(), createdAt: z.string() }).strict()),
|
|
74
|
+
artifacts: z.array(z.object({ id: z.string(), title: z.string(), summary: z.string().optional(), stateLabel: z.string(), openTarget: z.string().optional(), intermediate: z.boolean() }).strict()),
|
|
75
|
+
approvals: z.array(z.object({ id: z.string(), typeLabel: z.string(), state: z.enum(["pending", "approved", "rejected", "revision_requested"]), stateLabel: z.string(), decisionNote: z.string().optional() }).strict()),
|
|
76
|
+
blockers: z.array(z.object({ id: z.string(), title: z.string(), stateLabel: z.string() }).strict()),
|
|
77
|
+
actions: z.object({
|
|
78
|
+
canEdit: z.boolean(),
|
|
79
|
+
canDispatch: z.boolean(),
|
|
80
|
+
canComment: z.boolean(),
|
|
81
|
+
canCancel: z.boolean(),
|
|
82
|
+
canReview: z.boolean(),
|
|
83
|
+
canRetry: z.boolean(),
|
|
84
|
+
}).strict(),
|
|
85
|
+
}).strict().optional(),
|
|
86
|
+
activity: z.array(z.object({
|
|
87
|
+
id: z.string(),
|
|
88
|
+
summary: z.string(),
|
|
89
|
+
occurredAt: z.string(),
|
|
90
|
+
taskId: z.string().optional(),
|
|
91
|
+
runId: z.string().optional(),
|
|
92
|
+
correlationId: z.string().optional(),
|
|
93
|
+
}).strict()),
|
|
94
|
+
}).strict();
|
|
95
|
+
export const workSnapshotRequestSchema = z.object({
|
|
96
|
+
projectId: z.string().min(1).optional(),
|
|
97
|
+
taskId: z.string().min(1).optional(),
|
|
98
|
+
}).strict();
|
|
99
|
+
export const createTaskRequestSchema = z.object({
|
|
100
|
+
projectId: z.string().min(1).optional(),
|
|
101
|
+
title: z.string().trim().min(1).max(300),
|
|
102
|
+
bodyMarkdown: z.string().max(100_000).optional(),
|
|
103
|
+
priority: z.enum(["critical", "high", "medium", "low"]).optional(),
|
|
104
|
+
assigneePrincipalId: z.string().min(1).optional(),
|
|
105
|
+
}).strict();
|
|
106
|
+
export const updateTaskRequestSchema = z.object({
|
|
107
|
+
taskId: z.string().min(1),
|
|
108
|
+
title: z.string().trim().min(1).max(300).optional(),
|
|
109
|
+
bodyMarkdown: z.string().max(100_000).optional(),
|
|
110
|
+
status: workTaskStatusSchema.optional(),
|
|
111
|
+
priority: z.enum(["critical", "high", "medium", "low"]).optional(),
|
|
112
|
+
assigneePrincipalId: z.string().min(1).optional(),
|
|
113
|
+
}).strict();
|
|
114
|
+
export const commentTaskRequestSchema = z.object({
|
|
115
|
+
taskId: z.string().min(1),
|
|
116
|
+
bodyMarkdown: z.string().trim().min(1).max(20_000),
|
|
117
|
+
}).strict();
|
|
118
|
+
export const dispatchTaskRequestSchema = z.object({
|
|
119
|
+
taskId: z.string().min(1),
|
|
120
|
+
conductorAgentId: z.string().min(1),
|
|
121
|
+
reason: z.string().trim().min(1).max(500).optional(),
|
|
122
|
+
idempotencyKey: z.string().min(1).max(200).optional(),
|
|
123
|
+
}).strict();
|
|
124
|
+
export const approvalDecisionRequestSchema = z.object({
|
|
125
|
+
approvalId: z.string().min(1),
|
|
126
|
+
decision: z.enum(["approved", "rejected", "revision_requested"]),
|
|
127
|
+
decisionNote: z.string().trim().min(1).max(20_000).optional(),
|
|
128
|
+
}).strict();
|
|
129
|
+
export const cancelRunRequestSchema = z.object({ runId: z.string().min(1) }).strict();
|
|
130
|
+
//# sourceMappingURL=workContracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workContracts.js","sourceRoot":"","sources":["../../src/localApi/workContracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
export async function openExternalUrl(url) {
|
|
5
|
+
const parsed = new URL(url);
|
|
6
|
+
if (parsed.protocol !== "https:" && !isLoopbackHttp(parsed)) {
|
|
7
|
+
throw new Error("Conductor can open only HTTPS or loopback HTTP destinations.");
|
|
8
|
+
}
|
|
9
|
+
if (process.platform === "darwin") {
|
|
10
|
+
await execFileAsync("open", [parsed.toString()]);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (process.platform === "win32") {
|
|
14
|
+
await execFileAsync("cmd", ["/c", "start", "", parsed.toString()], { windowsHide: true });
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
await execFileAsync("xdg-open", [parsed.toString()]);
|
|
18
|
+
}
|
|
19
|
+
export async function selectLocalFolder() {
|
|
20
|
+
try {
|
|
21
|
+
if (process.platform === "darwin") {
|
|
22
|
+
const result = await execFileAsync("osascript", [
|
|
23
|
+
"-e",
|
|
24
|
+
"POSIX path of (choose folder with prompt \"Choose an agent workspace\")",
|
|
25
|
+
]);
|
|
26
|
+
return normalizedSelection(result.stdout);
|
|
27
|
+
}
|
|
28
|
+
if (process.platform === "win32") {
|
|
29
|
+
const script = [
|
|
30
|
+
"Add-Type -AssemblyName System.Windows.Forms;",
|
|
31
|
+
"$dialog = New-Object System.Windows.Forms.FolderBrowserDialog;",
|
|
32
|
+
"$dialog.Description = 'Choose an agent workspace';",
|
|
33
|
+
"if ($dialog.ShowDialog() -eq 'OK') { Write-Output $dialog.SelectedPath }",
|
|
34
|
+
].join(" ");
|
|
35
|
+
const result = await execFileAsync("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", script], { windowsHide: true });
|
|
36
|
+
return normalizedSelection(result.stdout);
|
|
37
|
+
}
|
|
38
|
+
const result = await execFileAsync("zenity", ["--file-selection", "--directory", "--title=Choose an agent workspace"]);
|
|
39
|
+
return normalizedSelection(result.stdout);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (isCancellation(error))
|
|
43
|
+
return undefined;
|
|
44
|
+
throw new Error("Folder selection is unavailable on this computer. Configure the agent through the CLI instead.");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function isLoopbackHttp(url) {
|
|
48
|
+
return url.protocol === "http:" && (url.hostname === "127.0.0.1" || url.hostname === "::1" || url.hostname === "localhost");
|
|
49
|
+
}
|
|
50
|
+
function normalizedSelection(value) {
|
|
51
|
+
const selected = value.trim();
|
|
52
|
+
return selected.length === 0 ? undefined : selected.replace(/[\\/]$/u, "");
|
|
53
|
+
}
|
|
54
|
+
function isCancellation(error) {
|
|
55
|
+
return error instanceof Error && "code" in error && [1, 130].includes(Number(error.code));
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/localApp/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type ConductorLocalApi } from "../localApi/contracts.js";
|
|
2
|
+
export type LocalAppHandle = {
|
|
3
|
+
origin: string;
|
|
4
|
+
browserUrl: string;
|
|
5
|
+
close(): Promise<void>;
|
|
6
|
+
waitUntilStopped(): Promise<void>;
|
|
7
|
+
};
|
|
8
|
+
export type StartLocalAppOptions = {
|
|
9
|
+
api: ConductorLocalApi;
|
|
10
|
+
staticDirectory: string;
|
|
11
|
+
preferredPort?: number | undefined;
|
|
12
|
+
openBrowser?: boolean | undefined;
|
|
13
|
+
browserOpener?: ((url: string) => Promise<void>) | undefined;
|
|
14
|
+
startRuntime?: boolean | undefined;
|
|
15
|
+
installSignalHandlers?: boolean | undefined;
|
|
16
|
+
};
|
|
17
|
+
export declare function startLocalApp(options: StartLocalAppOptions): Promise<LocalAppHandle>;
|
|
18
|
+
export declare function startConductorLocalApp(input?: {
|
|
19
|
+
configPath?: string | undefined;
|
|
20
|
+
preferredPort?: number | undefined;
|
|
21
|
+
openBrowser?: boolean | undefined;
|
|
22
|
+
staticDirectory?: string | undefined;
|
|
23
|
+
browserOpener?: ((url: string) => Promise<void>) | undefined;
|
|
24
|
+
}): Promise<LocalAppHandle>;
|
|
25
|
+
export declare function defaultStaticDirectory(): string;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { ProviderAgentStore } from "../adapters/provider/store.js";
|
|
4
|
+
import { FileConfigStore } from "../config.js";
|
|
5
|
+
import { DesktopController } from "../desktop/app/controller.js";
|
|
6
|
+
import { createLocalControllerApi } from "../localApi/contracts.js";
|
|
7
|
+
import { assertStaticAssets, startLocalWebServer } from "../localApi/server.js";
|
|
8
|
+
import { openExternalUrl, selectLocalFolder } from "./platform.js";
|
|
9
|
+
import { ConductorUserAuthorizationService } from "../userAuth/service.js";
|
|
10
|
+
import { createUserCredentialStore } from "../userAuth/store.js";
|
|
11
|
+
import { WorkConsoleService } from "../localApi/workConsole.js";
|
|
12
|
+
import { LocalRuntimeSessionCache } from "../runtime/localSessionCache.js";
|
|
13
|
+
import { LocalLogSpool } from "../runtime/localLogSpool.js";
|
|
14
|
+
import { DesktopRuntimeController } from "../desktop/app/runtimeController.js";
|
|
15
|
+
import { AuthorizedPairingService } from "../localApi/authorizedPairing.js";
|
|
16
|
+
import { ExecutionJournalStore } from "../runtime/executionJournal.js";
|
|
17
|
+
import { DurableEventOutbox } from "../runtime/eventOutbox.js";
|
|
18
|
+
import { LocalRecoveryService } from "../localApi/recovery.js";
|
|
19
|
+
export async function startLocalApp(options) {
|
|
20
|
+
await assertStaticAssets(options.staticDirectory);
|
|
21
|
+
const server = await startLocalWebServer({
|
|
22
|
+
api: options.api,
|
|
23
|
+
staticDirectory: options.staticDirectory,
|
|
24
|
+
preferredPort: options.preferredPort,
|
|
25
|
+
});
|
|
26
|
+
let closed = false;
|
|
27
|
+
let resolveStopped;
|
|
28
|
+
const stopped = new Promise((resolve) => { resolveStopped = resolve; });
|
|
29
|
+
const close = async () => {
|
|
30
|
+
if (closed)
|
|
31
|
+
return;
|
|
32
|
+
closed = true;
|
|
33
|
+
removeSignals();
|
|
34
|
+
await stopRuntimeSafely(options.api);
|
|
35
|
+
await server.close();
|
|
36
|
+
resolveStopped?.();
|
|
37
|
+
};
|
|
38
|
+
const onSignal = () => { void close(); };
|
|
39
|
+
const removeSignals = installSignals(options.installSignalHandlers !== false, onSignal);
|
|
40
|
+
try {
|
|
41
|
+
if (options.startRuntime !== false && (await options.api.pairedStatus()).paired) {
|
|
42
|
+
await options.api.startRuntime();
|
|
43
|
+
}
|
|
44
|
+
if (options.openBrowser !== false) {
|
|
45
|
+
await (options.browserOpener ?? openExternalUrl)(server.browserUrl);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
await close();
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
origin: server.origin,
|
|
54
|
+
browserUrl: server.browserUrl,
|
|
55
|
+
close,
|
|
56
|
+
waitUntilStopped: () => stopped,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export async function startConductorLocalApp(input = {}) {
|
|
60
|
+
const configStore = new FileConfigStore(input.configPath);
|
|
61
|
+
const agentStore = new ProviderAgentStore(input.configPath === undefined
|
|
62
|
+
? undefined
|
|
63
|
+
: path.join(path.dirname(input.configPath), "agents.json"));
|
|
64
|
+
const sessionCache = new LocalRuntimeSessionCache();
|
|
65
|
+
const logSpool = new LocalLogSpool();
|
|
66
|
+
const runtimeDirectory = path.join(path.dirname(configStore.path), "runtime");
|
|
67
|
+
const journalStore = new ExecutionJournalStore(path.join(runtimeDirectory, "executions"));
|
|
68
|
+
const eventOutbox = new DurableEventOutbox(path.join(runtimeDirectory, "event-outbox.json"));
|
|
69
|
+
const runtime = new DesktopRuntimeController({
|
|
70
|
+
configStore,
|
|
71
|
+
agentStore,
|
|
72
|
+
sessionCache,
|
|
73
|
+
logSpool,
|
|
74
|
+
journalStore,
|
|
75
|
+
eventOutbox,
|
|
76
|
+
});
|
|
77
|
+
const controller = new DesktopController({
|
|
78
|
+
configStore,
|
|
79
|
+
agentStore,
|
|
80
|
+
runtime,
|
|
81
|
+
selectFolder: selectLocalFolder,
|
|
82
|
+
openExternal: openExternalUrl,
|
|
83
|
+
});
|
|
84
|
+
const userAuthorization = new ConductorUserAuthorizationService({
|
|
85
|
+
configStore,
|
|
86
|
+
credentialStore: createUserCredentialStore(),
|
|
87
|
+
openBrowser: openExternalUrl,
|
|
88
|
+
});
|
|
89
|
+
const work = new WorkConsoleService({ configStore, authorization: userAuthorization, sessionCache, logSpool });
|
|
90
|
+
const authorizedPairing = new AuthorizedPairingService({ authorization: userAuthorization, controller });
|
|
91
|
+
const recovery = new LocalRecoveryService({ journals: journalStore, outbox: eventOutbox, runtime });
|
|
92
|
+
return startLocalApp({
|
|
93
|
+
api: createLocalControllerApi(controller, userAuthorization, work, authorizedPairing, {
|
|
94
|
+
clear: () => {
|
|
95
|
+
sessionCache.clear();
|
|
96
|
+
logSpool.clearAll();
|
|
97
|
+
},
|
|
98
|
+
}, recovery),
|
|
99
|
+
staticDirectory: input.staticDirectory ?? defaultStaticDirectory(),
|
|
100
|
+
preferredPort: input.preferredPort,
|
|
101
|
+
openBrowser: input.openBrowser,
|
|
102
|
+
browserOpener: input.browserOpener,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
export function defaultStaticDirectory() {
|
|
106
|
+
return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../dist-web");
|
|
107
|
+
}
|
|
108
|
+
async function stopRuntimeSafely(api) {
|
|
109
|
+
try {
|
|
110
|
+
await api.stopRuntime();
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// The HTTP listener must still close if runtime shutdown reports a failure.
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function installSignals(enabled, onSignal) {
|
|
117
|
+
if (!enabled)
|
|
118
|
+
return () => undefined;
|
|
119
|
+
process.once("SIGINT", onSignal);
|
|
120
|
+
process.once("SIGTERM", onSignal);
|
|
121
|
+
return () => {
|
|
122
|
+
process.off("SIGINT", onSignal);
|
|
123
|
+
process.off("SIGTERM", onSignal);
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/localApp/service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { JsonObject } from "../types.js";
|
|
3
|
+
export declare const FENCED_ATTEMPTS_CAPABILITY = "fenced-attempts-v1";
|
|
4
|
+
export declare const attemptAuthoritySchema: z.ZodObject<{
|
|
5
|
+
attemptId: z.ZodString;
|
|
6
|
+
leaseGeneration: z.ZodNumber;
|
|
7
|
+
leaseExpiresAt: z.ZodISODateTime;
|
|
8
|
+
mustStopAt: z.ZodISODateTime;
|
|
9
|
+
}, z.core.$strict>;
|
|
10
|
+
export declare const attemptAuthorityFenceSchema: z.ZodObject<{
|
|
11
|
+
attemptId: z.ZodString;
|
|
12
|
+
leaseGeneration: z.ZodNumber;
|
|
13
|
+
}, z.core.$strict>;
|
|
14
|
+
export declare const clientEventIdentitySchema: z.ZodObject<{
|
|
15
|
+
clientEventId: z.ZodString;
|
|
16
|
+
clientSequence: z.ZodNumber;
|
|
17
|
+
}, z.core.$strict>;
|
|
18
|
+
export declare const reconciliationDecisionSchema: z.ZodEnum<{
|
|
19
|
+
resume: "resume";
|
|
20
|
+
stop: "stop";
|
|
21
|
+
superseded: "superseded";
|
|
22
|
+
already_terminal: "already_terminal";
|
|
23
|
+
retry_as_new_attempt: "retry_as_new_attempt";
|
|
24
|
+
}>;
|
|
25
|
+
export declare const reconcileAttemptRequestSchema: z.ZodObject<{
|
|
26
|
+
attemptId: z.ZodString;
|
|
27
|
+
leaseGeneration: z.ZodNumber;
|
|
28
|
+
lastAcknowledgedClientSequence: z.ZodNumber;
|
|
29
|
+
providerResumeSupported: z.ZodBoolean;
|
|
30
|
+
supervisedProcessRunning: z.ZodBoolean;
|
|
31
|
+
terminalResult: z.ZodOptional<z.ZodObject<{
|
|
32
|
+
disposition: z.ZodEnum<{
|
|
33
|
+
cancelled: "cancelled";
|
|
34
|
+
completed: "completed";
|
|
35
|
+
failed: "failed";
|
|
36
|
+
}>;
|
|
37
|
+
summary: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
38
|
+
}, z.core.$strict>>;
|
|
39
|
+
}, z.core.$strict>;
|
|
40
|
+
export declare const reconcileAttemptResponseSchema: z.ZodObject<{
|
|
41
|
+
decision: z.ZodEnum<{
|
|
42
|
+
resume: "resume";
|
|
43
|
+
stop: "stop";
|
|
44
|
+
superseded: "superseded";
|
|
45
|
+
already_terminal: "already_terminal";
|
|
46
|
+
retry_as_new_attempt: "retry_as_new_attempt";
|
|
47
|
+
}>;
|
|
48
|
+
authority: z.ZodOptional<z.ZodObject<{
|
|
49
|
+
attemptId: z.ZodString;
|
|
50
|
+
leaseGeneration: z.ZodNumber;
|
|
51
|
+
leaseExpiresAt: z.ZodISODateTime;
|
|
52
|
+
mustStopAt: z.ZodISODateTime;
|
|
53
|
+
}, z.core.$strict>>;
|
|
54
|
+
lastAcknowledgedClientSequence: z.ZodNumber;
|
|
55
|
+
canonicalStatus: z.ZodString;
|
|
56
|
+
cancellationRequested: z.ZodBoolean;
|
|
57
|
+
reason: z.ZodOptional<z.ZodString>;
|
|
58
|
+
}, z.core.$strip>;
|
|
59
|
+
export declare const settlementResultSchema: z.ZodObject<{
|
|
60
|
+
attemptId: z.ZodString;
|
|
61
|
+
idempotencyKey: z.ZodString;
|
|
62
|
+
disposition: z.ZodEnum<{
|
|
63
|
+
cancelled: "cancelled";
|
|
64
|
+
completed: "completed";
|
|
65
|
+
failed: "failed";
|
|
66
|
+
}>;
|
|
67
|
+
payloadDigest: z.ZodString;
|
|
68
|
+
terminalAt: z.ZodISODateTime;
|
|
69
|
+
repeated: z.ZodBoolean;
|
|
70
|
+
}, z.core.$strict>;
|
|
71
|
+
export declare const fencedSettlementResponseSchema: z.ZodObject<{
|
|
72
|
+
job: z.ZodObject<{
|
|
73
|
+
id: z.ZodString;
|
|
74
|
+
status: z.ZodEnum<{
|
|
75
|
+
cancelled: "cancelled";
|
|
76
|
+
completed: "completed";
|
|
77
|
+
failed: "failed";
|
|
78
|
+
}>;
|
|
79
|
+
}, z.core.$loose>;
|
|
80
|
+
settlement: z.ZodObject<{
|
|
81
|
+
attemptId: z.ZodString;
|
|
82
|
+
idempotencyKey: z.ZodString;
|
|
83
|
+
disposition: z.ZodEnum<{
|
|
84
|
+
cancelled: "cancelled";
|
|
85
|
+
completed: "completed";
|
|
86
|
+
failed: "failed";
|
|
87
|
+
}>;
|
|
88
|
+
payloadDigest: z.ZodString;
|
|
89
|
+
terminalAt: z.ZodISODateTime;
|
|
90
|
+
repeated: z.ZodBoolean;
|
|
91
|
+
}, z.core.$strict>;
|
|
92
|
+
}, z.core.$strict>;
|
|
93
|
+
export declare const eventAcknowledgementSchema: z.ZodObject<{
|
|
94
|
+
eventId: z.ZodString;
|
|
95
|
+
attemptId: z.ZodString;
|
|
96
|
+
clientEventId: z.ZodString;
|
|
97
|
+
clientSequence: z.ZodNumber;
|
|
98
|
+
acknowledgedClientSequence: z.ZodNumber;
|
|
99
|
+
serverSequence: z.ZodNumber;
|
|
100
|
+
repeated: z.ZodBoolean;
|
|
101
|
+
}, z.core.$strict>;
|
|
102
|
+
export declare const lateResultRequestSchema: z.ZodObject<{
|
|
103
|
+
idempotencyKey: z.ZodString;
|
|
104
|
+
summary: z.ZodRecord<z.ZodString, z.ZodUnknown>;
|
|
105
|
+
artifactId: z.ZodOptional<z.ZodString>;
|
|
106
|
+
brainRecordId: z.ZodOptional<z.ZodString>;
|
|
107
|
+
}, z.core.$strict>;
|
|
108
|
+
export declare const lateResultResponseSchema: z.ZodObject<{
|
|
109
|
+
lateResult: z.ZodObject<{
|
|
110
|
+
id: z.ZodString;
|
|
111
|
+
attemptId: z.ZodString;
|
|
112
|
+
reviewStatus: z.ZodLiteral<"pending">;
|
|
113
|
+
}, z.core.$loose>;
|
|
114
|
+
repeated: z.ZodBoolean;
|
|
115
|
+
}, z.core.$strict>;
|
|
116
|
+
export type AttemptAuthority = z.infer<typeof attemptAuthoritySchema>;
|
|
117
|
+
export type AttemptAuthorityFence = z.infer<typeof attemptAuthorityFenceSchema>;
|
|
118
|
+
export type ClientEventIdentity = z.infer<typeof clientEventIdentitySchema>;
|
|
119
|
+
export type ReconciliationDecision = z.infer<typeof reconciliationDecisionSchema>;
|
|
120
|
+
export type ReconcileAttemptRequest = z.infer<typeof reconcileAttemptRequestSchema>;
|
|
121
|
+
export type ReconcileAttemptResponse = z.infer<typeof reconcileAttemptResponseSchema>;
|
|
122
|
+
export type EventAcknowledgement = z.infer<typeof eventAcknowledgementSchema>;
|
|
123
|
+
export type FencedSettlementResponse = z.infer<typeof fencedSettlementResponseSchema>;
|
|
124
|
+
export type LateResultRequest = z.input<typeof lateResultRequestSchema>;
|
|
125
|
+
export type LateResultResponse = z.infer<typeof lateResultResponseSchema>;
|
|
126
|
+
export type AttemptMutationOptions = {
|
|
127
|
+
authority?: AttemptAuthorityFence | undefined;
|
|
128
|
+
idempotencyKey?: string | undefined;
|
|
129
|
+
};
|
|
130
|
+
export type ApiFailureDisposition = "retryable" | "authentication" | "authority_lost" | "conflict" | "invalid_request";
|
|
131
|
+
export declare function classifyApiFailure(status: number, code: string): ApiFailureDisposition;
|
|
132
|
+
export declare function fencedMutationBody<T extends JsonObject>(body: T, options?: AttemptMutationOptions): T & Partial<AttemptAuthorityFence & {
|
|
133
|
+
idempotencyKey: string;
|
|
134
|
+
}>;
|
|
135
|
+
export declare function authorityFence(authority: AttemptAuthorityFence): AttemptAuthorityFence;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const FENCED_ATTEMPTS_CAPABILITY = "fenced-attempts-v1";
|
|
3
|
+
export const attemptAuthoritySchema = z.object({
|
|
4
|
+
attemptId: z.string().min(1),
|
|
5
|
+
leaseGeneration: z.number().int().positive(),
|
|
6
|
+
leaseExpiresAt: z.iso.datetime(),
|
|
7
|
+
mustStopAt: z.iso.datetime(),
|
|
8
|
+
}).strict();
|
|
9
|
+
export const attemptAuthorityFenceSchema = attemptAuthoritySchema.pick({
|
|
10
|
+
attemptId: true,
|
|
11
|
+
leaseGeneration: true,
|
|
12
|
+
}).strict();
|
|
13
|
+
export const clientEventIdentitySchema = z.object({
|
|
14
|
+
clientEventId: z.string().min(1).max(200),
|
|
15
|
+
clientSequence: z.number().int().positive(),
|
|
16
|
+
}).strict();
|
|
17
|
+
export const reconciliationDecisionSchema = z.enum([
|
|
18
|
+
"resume",
|
|
19
|
+
"stop",
|
|
20
|
+
"superseded",
|
|
21
|
+
"already_terminal",
|
|
22
|
+
"retry_as_new_attempt",
|
|
23
|
+
]);
|
|
24
|
+
export const reconcileAttemptRequestSchema = z.object({
|
|
25
|
+
attemptId: z.string().min(1),
|
|
26
|
+
leaseGeneration: z.number().int().positive(),
|
|
27
|
+
lastAcknowledgedClientSequence: z.number().int().nonnegative(),
|
|
28
|
+
providerResumeSupported: z.boolean(),
|
|
29
|
+
supervisedProcessRunning: z.boolean(),
|
|
30
|
+
terminalResult: z.object({
|
|
31
|
+
disposition: z.enum(["completed", "failed", "cancelled"]),
|
|
32
|
+
summary: z.record(z.string(), z.unknown()).optional(),
|
|
33
|
+
}).strict().optional(),
|
|
34
|
+
}).strict();
|
|
35
|
+
export const reconcileAttemptResponseSchema = z.object({
|
|
36
|
+
decision: reconciliationDecisionSchema,
|
|
37
|
+
authority: attemptAuthoritySchema.optional(),
|
|
38
|
+
lastAcknowledgedClientSequence: z.number().int().nonnegative(),
|
|
39
|
+
canonicalStatus: z.string().min(1),
|
|
40
|
+
cancellationRequested: z.boolean(),
|
|
41
|
+
reason: z.string().min(1).max(1_000).optional(),
|
|
42
|
+
}).superRefine((value, context) => {
|
|
43
|
+
if ((value.decision === "resume" || value.decision === "retry_as_new_attempt") &&
|
|
44
|
+
value.authority === undefined) {
|
|
45
|
+
context.addIssue({
|
|
46
|
+
code: "custom",
|
|
47
|
+
message: value.decision === "resume"
|
|
48
|
+
? "A resume reconciliation decision requires refreshed authority."
|
|
49
|
+
: "A retry-as-new-attempt decision requires replacement authority.",
|
|
50
|
+
path: ["authority"],
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
if (value.decision !== "resume" &&
|
|
54
|
+
value.decision !== "retry_as_new_attempt" &&
|
|
55
|
+
value.authority !== undefined) {
|
|
56
|
+
context.addIssue({
|
|
57
|
+
code: "custom",
|
|
58
|
+
message: "Only a resume or retry-as-new-attempt decision may grant authority.",
|
|
59
|
+
path: ["authority"],
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
export const settlementResultSchema = z.object({
|
|
64
|
+
attemptId: z.string().min(1),
|
|
65
|
+
idempotencyKey: z.string().min(1).max(200),
|
|
66
|
+
disposition: z.enum(["completed", "failed", "cancelled"]),
|
|
67
|
+
payloadDigest: z.string().min(1),
|
|
68
|
+
terminalAt: z.iso.datetime(),
|
|
69
|
+
repeated: z.boolean(),
|
|
70
|
+
}).strict();
|
|
71
|
+
export const fencedSettlementResponseSchema = z.object({
|
|
72
|
+
job: z.looseObject({
|
|
73
|
+
id: z.string().min(1),
|
|
74
|
+
status: z.enum(["completed", "failed", "cancelled"]),
|
|
75
|
+
}),
|
|
76
|
+
settlement: settlementResultSchema,
|
|
77
|
+
}).strict();
|
|
78
|
+
export const eventAcknowledgementSchema = z.object({
|
|
79
|
+
eventId: z.string().min(1),
|
|
80
|
+
attemptId: z.string().min(1),
|
|
81
|
+
clientEventId: z.string().min(1).max(200),
|
|
82
|
+
clientSequence: z.number().int().positive(),
|
|
83
|
+
acknowledgedClientSequence: z.number().int().nonnegative(),
|
|
84
|
+
serverSequence: z.number().int().positive(),
|
|
85
|
+
repeated: z.boolean(),
|
|
86
|
+
}).strict();
|
|
87
|
+
export const lateResultRequestSchema = z.object({
|
|
88
|
+
idempotencyKey: z.string().min(1).max(200),
|
|
89
|
+
summary: z.record(z.string(), z.unknown()),
|
|
90
|
+
artifactId: z.string().min(1).optional(),
|
|
91
|
+
brainRecordId: z.string().min(1).optional(),
|
|
92
|
+
}).strict();
|
|
93
|
+
export const lateResultResponseSchema = z.object({
|
|
94
|
+
lateResult: z.object({
|
|
95
|
+
id: z.string().min(1),
|
|
96
|
+
attemptId: z.string().min(1),
|
|
97
|
+
reviewStatus: z.literal("pending"),
|
|
98
|
+
}).loose(),
|
|
99
|
+
repeated: z.boolean(),
|
|
100
|
+
}).strict();
|
|
101
|
+
const AUTHORITY_ERROR_CODES = new Set([
|
|
102
|
+
"stale_attempt",
|
|
103
|
+
"stale_generation",
|
|
104
|
+
"authority_expired",
|
|
105
|
+
"deadline_exceeded",
|
|
106
|
+
"run_cancelled",
|
|
107
|
+
"attempt_superseded",
|
|
108
|
+
"already_terminal",
|
|
109
|
+
]);
|
|
110
|
+
export function classifyApiFailure(status, code) {
|
|
111
|
+
if (status === 0 || status === 408 || status === 425 || status === 429 || status >= 500) {
|
|
112
|
+
return "retryable";
|
|
113
|
+
}
|
|
114
|
+
if (status === 401 || status === 403) {
|
|
115
|
+
return "authentication";
|
|
116
|
+
}
|
|
117
|
+
if (AUTHORITY_ERROR_CODES.has(code)) {
|
|
118
|
+
return "authority_lost";
|
|
119
|
+
}
|
|
120
|
+
if (status === 409) {
|
|
121
|
+
return "conflict";
|
|
122
|
+
}
|
|
123
|
+
return "invalid_request";
|
|
124
|
+
}
|
|
125
|
+
export function fencedMutationBody(body, options) {
|
|
126
|
+
return {
|
|
127
|
+
...body,
|
|
128
|
+
...(options?.authority === undefined
|
|
129
|
+
? {}
|
|
130
|
+
: authorityFence(options.authority)),
|
|
131
|
+
...(options?.idempotencyKey === undefined
|
|
132
|
+
? {}
|
|
133
|
+
: { idempotencyKey: z.string().min(1).max(200).parse(options.idempotencyKey) }),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
export function authorityFence(authority) {
|
|
137
|
+
return attemptAuthorityFenceSchema.parse({
|
|
138
|
+
attemptId: authority.attemptId,
|
|
139
|
+
leaseGeneration: authority.leaseGeneration,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=fenced.js.map
|