@sift-wiki/conductor 0.0.0 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +135 -1
- package/THIRD_PARTY_NOTICES.md +38 -0
- package/dist/adapters/claudeAgent.d.ts +23 -0
- package/dist/adapters/claudeAgent.js +164 -0
- package/dist/adapters/claudeAgent.js.map +1 -0
- package/dist/adapters/claudeParser.d.ts +5 -0
- package/dist/adapters/claudeParser.js +120 -0
- package/dist/adapters/claudeParser.js.map +1 -0
- package/dist/adapters/codexAgent.d.ts +28 -0
- package/dist/adapters/codexAgent.js +152 -0
- package/dist/adapters/codexAgent.js.map +1 -0
- package/dist/adapters/codexParser.d.ts +5 -0
- package/dist/adapters/codexParser.js +106 -0
- package/dist/adapters/codexParser.js.map +1 -0
- package/dist/adapters/config.d.ts +29 -0
- package/dist/adapters/config.js +286 -0
- package/dist/adapters/config.js.map +1 -0
- package/dist/adapters/doctor.d.ts +12 -0
- package/dist/adapters/doctor.js +20 -0
- package/dist/adapters/doctor.js.map +1 -0
- package/dist/adapters/errors.d.ts +7 -0
- package/dist/adapters/errors.js +19 -0
- package/dist/adapters/errors.js.map +1 -0
- package/dist/adapters/fakeAgent.d.ts +11 -0
- package/dist/adapters/fakeAgent.js +149 -0
- package/dist/adapters/fakeAgent.js.map +1 -0
- package/dist/adapters/httpAgent.d.ts +19 -0
- package/dist/adapters/httpAgent.js +164 -0
- package/dist/adapters/httpAgent.js.map +1 -0
- package/dist/adapters/output.d.ts +16 -0
- package/dist/adapters/output.js +48 -0
- package/dist/adapters/output.js.map +1 -0
- package/dist/adapters/processAgent.d.ts +21 -0
- package/dist/adapters/processAgent.js +166 -0
- package/dist/adapters/processAgent.js.map +1 -0
- package/dist/adapters/provider/discovery.d.ts +31 -0
- package/dist/adapters/provider/discovery.js +102 -0
- package/dist/adapters/provider/discovery.js.map +1 -0
- package/dist/adapters/provider/json.d.ts +4 -0
- package/dist/adapters/provider/json.js +21 -0
- package/dist/adapters/provider/json.js.map +1 -0
- package/dist/adapters/provider/lineStream.d.ts +8 -0
- package/dist/adapters/provider/lineStream.js +28 -0
- package/dist/adapters/provider/lineStream.js.map +1 -0
- package/dist/adapters/provider/outputSchemaFile.d.ts +5 -0
- package/dist/adapters/provider/outputSchemaFile.js +16 -0
- package/dist/adapters/provider/outputSchemaFile.js.map +1 -0
- package/dist/adapters/provider/prompt.d.ts +2 -0
- package/dist/adapters/provider/prompt.js +52 -0
- package/dist/adapters/provider/prompt.js.map +1 -0
- package/dist/adapters/provider/result.d.ts +23 -0
- package/dist/adapters/provider/result.js +116 -0
- package/dist/adapters/provider/result.js.map +1 -0
- package/dist/adapters/provider/runProvider.d.ts +16 -0
- package/dist/adapters/provider/runProvider.js +110 -0
- package/dist/adapters/provider/runProvider.js.map +1 -0
- package/dist/adapters/provider/setup.d.ts +50 -0
- package/dist/adapters/provider/setup.js +180 -0
- package/dist/adapters/provider/setup.js.map +1 -0
- package/dist/adapters/provider/store.d.ts +19 -0
- package/dist/adapters/provider/store.js +92 -0
- package/dist/adapters/provider/store.js.map +1 -0
- package/dist/adapters/provider/types.d.ts +58 -0
- package/dist/adapters/provider/types.js +2 -0
- package/dist/adapters/provider/types.js.map +1 -0
- package/dist/adapters/provider/version.d.ts +2 -0
- package/dist/adapters/provider/version.js +25 -0
- package/dist/adapters/provider/version.js.map +1 -0
- package/dist/adapters/types.d.ts +40 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/bridge/handler.d.ts +15 -0
- package/dist/bridge/handler.js +125 -0
- package/dist/bridge/handler.js.map +1 -0
- package/dist/bridge/localBridge.d.ts +49 -0
- package/dist/bridge/localBridge.js +157 -0
- package/dist/bridge/localBridge.js.map +1 -0
- package/dist/bridge/server.d.ts +11 -0
- package/dist/bridge/server.js +86 -0
- package/dist/bridge/server.js.map +1 -0
- package/dist/bridge/sessionRegistry.d.ts +23 -0
- package/dist/bridge/sessionRegistry.js +65 -0
- package/dist/bridge/sessionRegistry.js.map +1 -0
- package/dist/cli.d.ts +17 -0
- package/dist/cli.js +216 -0
- package/dist/cli.js.map +1 -0
- package/dist/conductorClient.d.ts +252 -0
- package/dist/conductorClient.js +223 -0
- package/dist/conductorClient.js.map +1 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.js +54 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon.d.ts +48 -0
- package/dist/daemon.js +284 -0
- package/dist/daemon.js.map +1 -0
- package/dist/desktop/adapterSetupView.d.ts +16 -0
- package/dist/desktop/adapterSetupView.js +13 -0
- package/dist/desktop/adapterSetupView.js.map +1 -0
- package/dist/desktop/manifest.d.ts +17 -0
- package/dist/desktop/manifest.js +24 -0
- package/dist/desktop/manifest.js.map +1 -0
- package/dist/desktop/pairing.d.ts +13 -0
- package/dist/desktop/pairing.js +20 -0
- package/dist/desktop/pairing.js.map +1 -0
- package/dist/desktop/recovery.d.ts +33 -0
- package/dist/desktop/recovery.js +71 -0
- package/dist/desktop/recovery.js.map +1 -0
- package/dist/desktop/workBoardView.d.ts +41 -0
- package/dist/desktop/workBoardView.js +133 -0
- package/dist/desktop/workBoardView.js.map +1 -0
- package/dist/desktop/workGovernanceView.d.ts +70 -0
- package/dist/desktop/workGovernanceView.js +159 -0
- package/dist/desktop/workGovernanceView.js.map +1 -0
- package/dist/pairing.d.ts +27 -0
- package/dist/pairing.js +45 -0
- package/dist/pairing.js.map +1 -0
- package/dist/redaction.d.ts +2 -0
- package/dist/redaction.js +34 -0
- package/dist/redaction.js.map +1 -0
- package/dist/release/validateDistribution.d.ts +51 -0
- package/dist/release/validateDistribution.js +54 -0
- package/dist/release/validateDistribution.js.map +1 -0
- package/dist/runtime/localLogSpool.d.ts +46 -0
- package/dist/runtime/localLogSpool.js +101 -0
- package/dist/runtime/localLogSpool.js.map +1 -0
- package/dist/runtime/localRunQueue.d.ts +31 -0
- package/dist/runtime/localRunQueue.js +76 -0
- package/dist/runtime/localRunQueue.js.map +1 -0
- package/dist/runtime/localSessionCache.d.ts +26 -0
- package/dist/runtime/localSessionCache.js +35 -0
- package/dist/runtime/localSessionCache.js.map +1 -0
- package/dist/runtime/process.d.ts +27 -0
- package/dist/runtime/process.js +128 -0
- package/dist/runtime/process.js.map +1 -0
- package/dist/runtime/runEnvironment.d.ts +12 -0
- package/dist/runtime/runEnvironment.js +59 -0
- package/dist/runtime/runEnvironment.js.map +1 -0
- package/dist/runtime/runEventRetryBuffer.d.ts +42 -0
- package/dist/runtime/runEventRetryBuffer.js +118 -0
- package/dist/runtime/runEventRetryBuffer.js.map +1 -0
- package/dist/runtime/runtimeService.d.ts +27 -0
- package/dist/runtime/runtimeService.js +112 -0
- package/dist/runtime/runtimeService.js.map +1 -0
- package/dist/runtime/sleep.d.ts +2 -0
- package/dist/runtime/sleep.js +21 -0
- package/dist/runtime/sleep.js.map +1 -0
- package/dist/runtime/taskExecution.d.ts +16 -0
- package/dist/runtime/taskExecution.js +74 -0
- package/dist/runtime/taskExecution.js.map +1 -0
- package/dist/runtime/wakeEnvelope.d.ts +76 -0
- package/dist/runtime/wakeEnvelope.js +60 -0
- package/dist/runtime/wakeEnvelope.js.map +1 -0
- package/dist/types.d.ts +121 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/workTypes.d.ts +182 -0
- package/dist/workTypes.js +75 -0
- package/dist/workTypes.js.map +1 -0
- package/package.json +65 -6
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { AdapterReadiness, LocalAgentAdapter } from "../types.js";
|
|
2
|
+
import type { RunProcess } from "../../runtime/process.js";
|
|
3
|
+
import type { ConductorAgentAdvertisement } from "../../types.js";
|
|
4
|
+
import { ProviderAgentStore } from "./store.js";
|
|
5
|
+
import type { ProviderAgentConfig, ProviderType } from "./types.js";
|
|
6
|
+
export type ProviderAgentView = {
|
|
7
|
+
localKey: string;
|
|
8
|
+
displayName: string;
|
|
9
|
+
provider: ProviderType;
|
|
10
|
+
workspaceName: string;
|
|
11
|
+
accessProfile: ProviderAgentConfig["accessProfile"];
|
|
12
|
+
enabled: boolean;
|
|
13
|
+
status: AdapterReadiness["status"];
|
|
14
|
+
message: string;
|
|
15
|
+
hint?: string | undefined;
|
|
16
|
+
remediation?: AdapterReadiness["remediation"];
|
|
17
|
+
providerVersion?: string | undefined;
|
|
18
|
+
};
|
|
19
|
+
export type ProviderInstallPlan = {
|
|
20
|
+
provider: ProviderType;
|
|
21
|
+
title: string;
|
|
22
|
+
source: string;
|
|
23
|
+
command?: string | undefined;
|
|
24
|
+
officialUrl: string;
|
|
25
|
+
};
|
|
26
|
+
export type ProviderSetupDeps = {
|
|
27
|
+
store?: ProviderAgentStore | undefined;
|
|
28
|
+
runProcess?: RunProcess | undefined;
|
|
29
|
+
env?: NodeJS.ProcessEnv | undefined;
|
|
30
|
+
createAdapter?: ((config: ProviderAgentConfig) => LocalAgentAdapter) | undefined;
|
|
31
|
+
advertise?: ((agent: ConductorAgentAdvertisement) => Promise<void>) | undefined;
|
|
32
|
+
};
|
|
33
|
+
export declare class ProviderSetupService {
|
|
34
|
+
private readonly deps;
|
|
35
|
+
private readonly store;
|
|
36
|
+
private readonly createAdapter;
|
|
37
|
+
constructor(deps?: ProviderSetupDeps);
|
|
38
|
+
list(): Promise<ProviderAgentView[]>;
|
|
39
|
+
inspect(config: ProviderAgentConfig): Promise<ProviderAgentView>;
|
|
40
|
+
verifyAndSave(config: ProviderAgentConfig): Promise<ProviderAgentView>;
|
|
41
|
+
pause(localKey: string, paused: boolean): Promise<ProviderAgentView>;
|
|
42
|
+
remove(localKey: string): Promise<void>;
|
|
43
|
+
login(config: ProviderAgentConfig): Promise<{
|
|
44
|
+
ok: boolean;
|
|
45
|
+
message: string;
|
|
46
|
+
}>;
|
|
47
|
+
installPlan(provider: ProviderType): ProviderInstallPlan;
|
|
48
|
+
private requiredConfig;
|
|
49
|
+
private view;
|
|
50
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { createClaudeAgentAdapter } from "../claudeAgent.js";
|
|
3
|
+
import { createCodexAgentAdapter } from "../codexAgent.js";
|
|
4
|
+
import { safeMessage } from "../output.js";
|
|
5
|
+
import { probeCommand, resolveProviderExecutable } from "./discovery.js";
|
|
6
|
+
import { ProviderAgentStore } from "./store.js";
|
|
7
|
+
export class ProviderSetupService {
|
|
8
|
+
deps;
|
|
9
|
+
store;
|
|
10
|
+
createAdapter;
|
|
11
|
+
constructor(deps = {}) {
|
|
12
|
+
this.deps = deps;
|
|
13
|
+
this.store = deps.store ?? new ProviderAgentStore();
|
|
14
|
+
this.createAdapter = deps.createAdapter ?? ((config) => createProviderAdapter(config, deps));
|
|
15
|
+
}
|
|
16
|
+
async list() {
|
|
17
|
+
const configs = await this.store.read();
|
|
18
|
+
return Promise.all(configs.map((config) => this.view(config)));
|
|
19
|
+
}
|
|
20
|
+
async inspect(config) {
|
|
21
|
+
return this.view(config);
|
|
22
|
+
}
|
|
23
|
+
async verifyAndSave(config) {
|
|
24
|
+
const adapter = this.createAdapter(config);
|
|
25
|
+
const readiness = await adapterReadiness(adapter);
|
|
26
|
+
if (readiness.status !== "ready") {
|
|
27
|
+
throw new Error(readiness.message);
|
|
28
|
+
}
|
|
29
|
+
const events = [];
|
|
30
|
+
const result = await adapter.run({
|
|
31
|
+
objective: "Sift Conductor setup test. Do not modify files. Return a done result confirming readiness.",
|
|
32
|
+
contextRefs: [],
|
|
33
|
+
limits: {},
|
|
34
|
+
signal: new AbortController().signal,
|
|
35
|
+
emit: (event) => {
|
|
36
|
+
events.push(event);
|
|
37
|
+
return Promise.resolve();
|
|
38
|
+
},
|
|
39
|
+
sleep: () => Promise.resolve(),
|
|
40
|
+
});
|
|
41
|
+
if (result.status !== "completed" || result.disposition !== "done") {
|
|
42
|
+
throw new Error("Provider smoke test did not return a successful structured result.");
|
|
43
|
+
}
|
|
44
|
+
await this.store.upsert(config);
|
|
45
|
+
await this.deps.advertise?.(advertisement(config, readiness, "active"));
|
|
46
|
+
return viewFrom(config, readiness);
|
|
47
|
+
}
|
|
48
|
+
async pause(localKey, paused) {
|
|
49
|
+
const config = await this.requiredConfig(localKey);
|
|
50
|
+
const updated = { ...config, enabled: !paused };
|
|
51
|
+
if (!paused) {
|
|
52
|
+
const readiness = await adapterReadiness(this.createAdapter(updated));
|
|
53
|
+
if (readiness.status !== "ready")
|
|
54
|
+
throw new Error(readiness.message);
|
|
55
|
+
}
|
|
56
|
+
await this.store.upsert(updated);
|
|
57
|
+
const readiness = paused
|
|
58
|
+
? { status: "error", message: "Agent is paused." }
|
|
59
|
+
: await adapterReadiness(this.createAdapter(updated));
|
|
60
|
+
await this.deps.advertise?.(advertisement(updated, readiness, paused ? "inactive" : "active"));
|
|
61
|
+
return viewFrom(updated, readiness);
|
|
62
|
+
}
|
|
63
|
+
async remove(localKey) {
|
|
64
|
+
const removed = await this.store.remove(localKey);
|
|
65
|
+
if (removed === undefined)
|
|
66
|
+
return;
|
|
67
|
+
await this.deps.advertise?.({
|
|
68
|
+
...advertisement(removed, { status: "error", message: "Agent removed." }, "inactive"),
|
|
69
|
+
status: "inactive",
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
async login(config) {
|
|
73
|
+
const executable = await resolveProviderExecutable({
|
|
74
|
+
provider: config.type,
|
|
75
|
+
executablePath: config.executablePath,
|
|
76
|
+
cwd: config.workspacePath,
|
|
77
|
+
env: this.deps.env,
|
|
78
|
+
});
|
|
79
|
+
if (executable === undefined)
|
|
80
|
+
return { ok: false, message: "Provider CLI was not found." };
|
|
81
|
+
const result = await probeCommand({
|
|
82
|
+
command: executable,
|
|
83
|
+
args: config.type === "codex" ? ["login"] : ["auth", "login"],
|
|
84
|
+
cwd: config.workspacePath,
|
|
85
|
+
timeoutMs: 10 * 60_000,
|
|
86
|
+
deps: this.deps,
|
|
87
|
+
});
|
|
88
|
+
return {
|
|
89
|
+
ok: (result.exitCode ?? 1) === 0,
|
|
90
|
+
message: (result.exitCode ?? 1) === 0
|
|
91
|
+
? "Provider login completed."
|
|
92
|
+
: safeMessage(firstLine(result.stderr) ?? firstLine(result.stdout) ?? "Provider login failed."),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
installPlan(provider) {
|
|
96
|
+
return provider === "codex"
|
|
97
|
+
? {
|
|
98
|
+
provider,
|
|
99
|
+
title: "Install Codex CLI",
|
|
100
|
+
source: "OpenAI npm package",
|
|
101
|
+
command: "npm install --global @openai/codex",
|
|
102
|
+
officialUrl: "https://developers.openai.com/codex/cli",
|
|
103
|
+
}
|
|
104
|
+
: {
|
|
105
|
+
provider,
|
|
106
|
+
title: "Install Claude Code",
|
|
107
|
+
source: "Anthropic installer",
|
|
108
|
+
officialUrl: "https://docs.anthropic.com/en/docs/claude-code/getting-started",
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async requiredConfig(localKey) {
|
|
112
|
+
const config = (await this.store.read()).find((candidate) => candidate.localKey === localKey);
|
|
113
|
+
if (config === undefined)
|
|
114
|
+
throw new Error("Local agent was not found.");
|
|
115
|
+
return config;
|
|
116
|
+
}
|
|
117
|
+
async view(config) {
|
|
118
|
+
return viewFrom(config, await adapterReadiness(this.createAdapter(config)));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function createProviderAdapter(config, deps) {
|
|
122
|
+
const providerDeps = {
|
|
123
|
+
...(deps.runProcess === undefined ? {} : { runProcess: deps.runProcess }),
|
|
124
|
+
...(deps.env === undefined ? {} : { env: deps.env }),
|
|
125
|
+
};
|
|
126
|
+
return config.type === "codex"
|
|
127
|
+
? createCodexAgentAdapter({ ...config, type: "codex" }, providerDeps)
|
|
128
|
+
: createClaudeAgentAdapter({ ...config, type: "claude-code" }, providerDeps);
|
|
129
|
+
}
|
|
130
|
+
async function adapterReadiness(adapter) {
|
|
131
|
+
try {
|
|
132
|
+
return adapter.check === undefined
|
|
133
|
+
? { status: "ready", message: "Provider is ready." }
|
|
134
|
+
: await adapter.check();
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
return {
|
|
138
|
+
status: "error",
|
|
139
|
+
message: safeMessage(error instanceof Error ? error.message : "Provider check failed."),
|
|
140
|
+
remediation: "retry",
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function viewFrom(config, readiness) {
|
|
145
|
+
const providerVersion = typeof readiness.metadata?.providerVersion === "string"
|
|
146
|
+
? readiness.metadata.providerVersion
|
|
147
|
+
: undefined;
|
|
148
|
+
return {
|
|
149
|
+
localKey: config.localKey,
|
|
150
|
+
displayName: config.displayName,
|
|
151
|
+
provider: config.type,
|
|
152
|
+
workspaceName: path.basename(config.workspacePath),
|
|
153
|
+
accessProfile: config.accessProfile,
|
|
154
|
+
enabled: config.enabled,
|
|
155
|
+
status: readiness.status,
|
|
156
|
+
message: safeMessage(readiness.message),
|
|
157
|
+
...(readiness.hint === undefined ? {} : { hint: safeMessage(readiness.hint) }),
|
|
158
|
+
...(readiness.remediation === undefined ? {} : { remediation: readiness.remediation }),
|
|
159
|
+
...(providerVersion === undefined ? {} : { providerVersion }),
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function advertisement(config, readiness, status) {
|
|
163
|
+
return {
|
|
164
|
+
localKey: config.localKey,
|
|
165
|
+
displayName: config.displayName,
|
|
166
|
+
adapterType: config.type,
|
|
167
|
+
status,
|
|
168
|
+
capabilities: {
|
|
169
|
+
provider: config.type === "codex" ? "openai" : "anthropic",
|
|
170
|
+
structuredOutput: true,
|
|
171
|
+
streaming: true,
|
|
172
|
+
accessProfile: config.accessProfile,
|
|
173
|
+
...(readiness.metadata ?? {}),
|
|
174
|
+
},
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
function firstLine(value) {
|
|
178
|
+
return value.split(/\r?\n/u).map((line) => line.trim()).find(Boolean);
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/adapters/provider/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ProviderAccessProfile, ProviderAgentConfig, ProviderType } from "./types.js";
|
|
2
|
+
export declare class ProviderAgentStore {
|
|
3
|
+
readonly path: string;
|
|
4
|
+
constructor(path?: string);
|
|
5
|
+
read(): Promise<ProviderAgentConfig[]>;
|
|
6
|
+
write(configs: ProviderAgentConfig[]): Promise<void>;
|
|
7
|
+
upsert(config: ProviderAgentConfig): Promise<void>;
|
|
8
|
+
remove(localKey: string): Promise<ProviderAgentConfig | undefined>;
|
|
9
|
+
delete(): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare function createProviderAgentConfig(input: {
|
|
12
|
+
provider: ProviderType;
|
|
13
|
+
displayName: string;
|
|
14
|
+
workspacePath: string;
|
|
15
|
+
accessProfile: ProviderAccessProfile;
|
|
16
|
+
executablePath?: string | undefined;
|
|
17
|
+
model?: string | undefined;
|
|
18
|
+
}): ProviderAgentConfig;
|
|
19
|
+
export declare function defaultProviderAgentsPath(env?: NodeJS.ProcessEnv): string;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { chmod, mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import { parseAdapterConfigs } from "../config.js";
|
|
5
|
+
import { defaultConfigPath } from "../../config.js";
|
|
6
|
+
export class ProviderAgentStore {
|
|
7
|
+
path;
|
|
8
|
+
constructor(path = defaultProviderAgentsPath()) {
|
|
9
|
+
this.path = path;
|
|
10
|
+
}
|
|
11
|
+
async read() {
|
|
12
|
+
let contents;
|
|
13
|
+
try {
|
|
14
|
+
contents = await readFile(this.path, "utf8");
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
if (isNodeError(error) && error.code === "ENOENT")
|
|
18
|
+
return [];
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
return parseProviderConfigs(JSON.parse(contents));
|
|
22
|
+
}
|
|
23
|
+
async write(configs) {
|
|
24
|
+
const parsed = parseProviderConfigs({ adapters: configs });
|
|
25
|
+
await mkdir(path.dirname(this.path), { recursive: true });
|
|
26
|
+
await writeFile(this.path, `${JSON.stringify({ adapters: parsed }, null, 2)}\n`, { mode: 0o600 });
|
|
27
|
+
await chmod(this.path, 0o600);
|
|
28
|
+
}
|
|
29
|
+
async upsert(config) {
|
|
30
|
+
const configs = await this.read();
|
|
31
|
+
const index = configs.findIndex((candidate) => candidate.localKey === config.localKey);
|
|
32
|
+
if (index === -1)
|
|
33
|
+
configs.push(config);
|
|
34
|
+
else
|
|
35
|
+
configs[index] = config;
|
|
36
|
+
await this.write(configs);
|
|
37
|
+
}
|
|
38
|
+
async remove(localKey) {
|
|
39
|
+
const configs = await this.read();
|
|
40
|
+
const removed = configs.find((config) => config.localKey === localKey);
|
|
41
|
+
if (removed === undefined)
|
|
42
|
+
return undefined;
|
|
43
|
+
await this.write(configs.filter((config) => config.localKey !== localKey));
|
|
44
|
+
return removed;
|
|
45
|
+
}
|
|
46
|
+
async delete() {
|
|
47
|
+
await rm(this.path, { force: true });
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export function createProviderAgentConfig(input) {
|
|
51
|
+
return {
|
|
52
|
+
type: input.provider,
|
|
53
|
+
localKey: `${input.provider}-${randomUUID()}`,
|
|
54
|
+
displayName: input.displayName.trim(),
|
|
55
|
+
workspacePath: input.workspacePath,
|
|
56
|
+
accessProfile: input.accessProfile,
|
|
57
|
+
enabled: true,
|
|
58
|
+
timeoutMs: 0,
|
|
59
|
+
graceMs: 15_000,
|
|
60
|
+
outputLimitBytes: 64 * 1024,
|
|
61
|
+
...(input.executablePath === undefined ? {} : { executablePath: input.executablePath }),
|
|
62
|
+
...(input.model === undefined ? {} : { model: input.model }),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function defaultProviderAgentsPath(env = process.env) {
|
|
66
|
+
if (env.SIFT_CONDUCTOR_AGENTS !== undefined && env.SIFT_CONDUCTOR_AGENTS.trim().length > 0) {
|
|
67
|
+
return env.SIFT_CONDUCTOR_AGENTS;
|
|
68
|
+
}
|
|
69
|
+
return path.join(path.dirname(defaultConfigPath(env)), "agents.json");
|
|
70
|
+
}
|
|
71
|
+
function parseProviderConfigs(raw) {
|
|
72
|
+
if (isEmptyAdapterList(raw))
|
|
73
|
+
return [];
|
|
74
|
+
const configs = parseAdapterConfigs(raw);
|
|
75
|
+
const providers = configs.filter((config) => config.type === "codex" || config.type === "claude-code");
|
|
76
|
+
if (providers.length !== configs.length) {
|
|
77
|
+
throw new Error("Desktop provider store accepts only Codex and Claude Code agents.");
|
|
78
|
+
}
|
|
79
|
+
return providers;
|
|
80
|
+
}
|
|
81
|
+
function isEmptyAdapterList(raw) {
|
|
82
|
+
if (Array.isArray(raw))
|
|
83
|
+
return raw.length === 0;
|
|
84
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw))
|
|
85
|
+
return false;
|
|
86
|
+
const adapters = raw.adapters;
|
|
87
|
+
return Array.isArray(adapters) && adapters.length === 0;
|
|
88
|
+
}
|
|
89
|
+
function isNodeError(error) {
|
|
90
|
+
return error instanceof Error && "code" in error;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/adapters/provider/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { JsonObject, RunEventInput } from "../../types.js";
|
|
2
|
+
export type ProviderType = "codex" | "claude-code";
|
|
3
|
+
export type ProviderAccessProfile = "inspect" | "workspace";
|
|
4
|
+
export type ProviderAgentConfig = {
|
|
5
|
+
type: ProviderType;
|
|
6
|
+
localKey: string;
|
|
7
|
+
displayName: string;
|
|
8
|
+
workspacePath: string;
|
|
9
|
+
executablePath?: string | undefined;
|
|
10
|
+
accessProfile: ProviderAccessProfile;
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
model?: string | undefined;
|
|
13
|
+
timeoutMs: number;
|
|
14
|
+
graceMs: number;
|
|
15
|
+
outputLimitBytes: number;
|
|
16
|
+
};
|
|
17
|
+
export type ProviderUsage = {
|
|
18
|
+
inputTokens?: number | undefined;
|
|
19
|
+
cachedInputTokens?: number | undefined;
|
|
20
|
+
outputTokens?: number | undefined;
|
|
21
|
+
costMicros?: number | undefined;
|
|
22
|
+
};
|
|
23
|
+
export type ProviderTerminalResult = {
|
|
24
|
+
summary: string;
|
|
25
|
+
disposition: "done" | "in_review" | "blocked";
|
|
26
|
+
blockerReason?: string | undefined;
|
|
27
|
+
reviewSummary?: string | undefined;
|
|
28
|
+
artifactRefs?: string[] | undefined;
|
|
29
|
+
usage?: ProviderUsage | undefined;
|
|
30
|
+
};
|
|
31
|
+
export type ProviderInvocation = {
|
|
32
|
+
command: string;
|
|
33
|
+
args: string[];
|
|
34
|
+
cwd: string;
|
|
35
|
+
env: Record<string, string>;
|
|
36
|
+
stdin: string;
|
|
37
|
+
};
|
|
38
|
+
export type ParsedProviderOutput = {
|
|
39
|
+
terminalResult?: ProviderTerminalResult | undefined;
|
|
40
|
+
usage?: ProviderUsage | undefined;
|
|
41
|
+
sessionId?: string | undefined;
|
|
42
|
+
model?: string | undefined;
|
|
43
|
+
errorMessage?: string | undefined;
|
|
44
|
+
};
|
|
45
|
+
export type ProviderStreamParser = {
|
|
46
|
+
push(stream: "stdout" | "stderr", chunk: string): Promise<void>;
|
|
47
|
+
finish(): Promise<ParsedProviderOutput>;
|
|
48
|
+
};
|
|
49
|
+
export type ProviderParserInput = {
|
|
50
|
+
emit(event: RunEventInput): Promise<void>;
|
|
51
|
+
outputLimitBytes: number;
|
|
52
|
+
};
|
|
53
|
+
export type ProviderReadinessDetails = {
|
|
54
|
+
executablePath: string;
|
|
55
|
+
version: string;
|
|
56
|
+
authenticated: boolean;
|
|
57
|
+
metadata: JsonObject;
|
|
58
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/provider/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function versionAtLeast(actual, minimum) {
|
|
2
|
+
const actualParts = numericVersion(actual);
|
|
3
|
+
const minimumParts = numericVersion(minimum);
|
|
4
|
+
if (actualParts === undefined || minimumParts === undefined)
|
|
5
|
+
return false;
|
|
6
|
+
for (let index = 0; index < Math.max(actualParts.length, minimumParts.length); index += 1) {
|
|
7
|
+
const actualPart = actualParts[index] ?? 0;
|
|
8
|
+
const minimumPart = minimumParts[index] ?? 0;
|
|
9
|
+
if (actualPart > minimumPart)
|
|
10
|
+
return true;
|
|
11
|
+
if (actualPart < minimumPart)
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
export function extractVersion(output) {
|
|
17
|
+
return output.match(/\b(\d+\.\d+(?:\.\d+)?)\b/u)?.[1];
|
|
18
|
+
}
|
|
19
|
+
function numericVersion(value) {
|
|
20
|
+
const match = value.match(/^(\d+)\.(\d+)(?:\.(\d+))?$/u);
|
|
21
|
+
if (match === null)
|
|
22
|
+
return undefined;
|
|
23
|
+
return [Number(match[1]), Number(match[2]), Number(match[3] ?? 0)];
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../src/adapters/provider/version.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAe;IAC5D,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,WAAW,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC1E,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1F,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,UAAU,GAAG,WAAW;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,UAAU,GAAG,WAAW;YAAE,OAAO,KAAK,CAAC;IAC7C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,OAAO,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACzD,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ClaimedJob, JsonObject, RunEventInput } from "../types.js";
|
|
2
|
+
import type { SiftWakeEnvelope } from "../runtime/wakeEnvelope.js";
|
|
3
|
+
import type { WorkDisposition } from "../workTypes.js";
|
|
4
|
+
export type Sleep = (ms: number, signal?: AbortSignal) => Promise<void>;
|
|
5
|
+
export type LocalAgentRunJob = Pick<ClaimedJob, "id" | "runId" | "conductorAgentId" | "localKey" | "adapterType" | "objective" | "taskRecordId" | "contextRefs" | "limits" | "wakeEnvelope">;
|
|
6
|
+
export type LocalAgentRunInput = {
|
|
7
|
+
objective: string;
|
|
8
|
+
contextRefs: string[];
|
|
9
|
+
limits: JsonObject;
|
|
10
|
+
job?: LocalAgentRunJob;
|
|
11
|
+
wakeEnvelope?: SiftWakeEnvelope | undefined;
|
|
12
|
+
env?: Record<string, string> | undefined;
|
|
13
|
+
signal: AbortSignal;
|
|
14
|
+
emit(event: RunEventInput): Promise<void>;
|
|
15
|
+
sleep: Sleep;
|
|
16
|
+
};
|
|
17
|
+
export type LocalAgentRunResult = {
|
|
18
|
+
status: "completed";
|
|
19
|
+
disposition?: Exclude<WorkDisposition, "cancelled"> | undefined;
|
|
20
|
+
resultSummary: JsonObject;
|
|
21
|
+
} | {
|
|
22
|
+
status: "cancelled";
|
|
23
|
+
resultSummary: JsonObject;
|
|
24
|
+
};
|
|
25
|
+
export type AdapterReadiness = {
|
|
26
|
+
status: "ready" | "error";
|
|
27
|
+
message: string;
|
|
28
|
+
hint?: string | undefined;
|
|
29
|
+
remediation?: "install" | "login" | "upgrade" | "select-folder" | "resume" | "retry" | undefined;
|
|
30
|
+
metadata?: JsonObject | undefined;
|
|
31
|
+
};
|
|
32
|
+
export type LocalAgentAdapter = {
|
|
33
|
+
localKey: string;
|
|
34
|
+
displayName: string;
|
|
35
|
+
adapterType: string;
|
|
36
|
+
enabled?: boolean | undefined;
|
|
37
|
+
capabilities: JsonObject;
|
|
38
|
+
check?(): Promise<AdapterReadiness>;
|
|
39
|
+
run(input: LocalAgentRunInput): Promise<LocalAgentRunResult>;
|
|
40
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/adapters/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ConductorClient, ConductorWorkClient } from "../types.js";
|
|
2
|
+
import { type LocalBridgeRequest } from "./localBridge.js";
|
|
3
|
+
import { LocalBridgeSessionRegistry } from "./sessionRegistry.js";
|
|
4
|
+
type BridgeForwardClient = Pick<ConductorWorkClient, "readWorkContext" | "checkoutTask" | "createChildTasks" | "addTaskComment" | "registerArtifact" | "requestApproval" | "reportUsage" | "setTaskDisposition"> & Pick<ConductorClient, "appendRunEvent">;
|
|
5
|
+
export type LocalBridgeResponse = {
|
|
6
|
+
status: number;
|
|
7
|
+
body: unknown;
|
|
8
|
+
};
|
|
9
|
+
export declare function createLocalBridgeHandler(input: {
|
|
10
|
+
sessions: LocalBridgeSessionRegistry;
|
|
11
|
+
client: BridgeForwardClient;
|
|
12
|
+
machineCredential: string;
|
|
13
|
+
onHardStop?: (() => void) | undefined;
|
|
14
|
+
}): (request: LocalBridgeRequest) => Promise<LocalBridgeResponse>;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { redactSecrets } from "../redaction.js";
|
|
3
|
+
import { authorizeLocalBridgeRequest, } from "./localBridge.js";
|
|
4
|
+
import { bearerToken } from "./sessionRegistry.js";
|
|
5
|
+
const jsonObjectSchema = z.record(z.string(), z.unknown());
|
|
6
|
+
const childTaskSchema = z.object({
|
|
7
|
+
title: z.string().min(1),
|
|
8
|
+
bodyMarkdown: z.string().optional(),
|
|
9
|
+
priority: z.enum(["critical", "high", "medium", "low"]).optional(),
|
|
10
|
+
assigneePrincipalId: z.string().min(1),
|
|
11
|
+
contextRefs: z.array(z.string()).optional(),
|
|
12
|
+
});
|
|
13
|
+
const eventSchema = z.object({
|
|
14
|
+
eventType: z.enum([
|
|
15
|
+
"health",
|
|
16
|
+
"progress",
|
|
17
|
+
"log",
|
|
18
|
+
"artifact",
|
|
19
|
+
"approval_requested",
|
|
20
|
+
"completed",
|
|
21
|
+
"failed",
|
|
22
|
+
"cancelled",
|
|
23
|
+
]),
|
|
24
|
+
payload: jsonObjectSchema.optional(),
|
|
25
|
+
occurredAt: z.string().optional(),
|
|
26
|
+
});
|
|
27
|
+
const artifactSchema = z.object({
|
|
28
|
+
type: z.string().min(1),
|
|
29
|
+
provider: z.string().min(1),
|
|
30
|
+
title: z.string().min(1),
|
|
31
|
+
url: z.string().optional(),
|
|
32
|
+
brainRecordId: z.string().optional(),
|
|
33
|
+
summary: z.string().optional(),
|
|
34
|
+
metadata: jsonObjectSchema.optional(),
|
|
35
|
+
idempotencyKey: z.string().optional(),
|
|
36
|
+
});
|
|
37
|
+
export function createLocalBridgeHandler(input) {
|
|
38
|
+
return async function handleLocalBridge(request) {
|
|
39
|
+
const token = bearerToken(request.authorization);
|
|
40
|
+
const session = token === undefined ? undefined : input.sessions.readByToken(token);
|
|
41
|
+
if (session === undefined)
|
|
42
|
+
return diagnostic(401, "unauthorized", "Run token is invalid or expired.");
|
|
43
|
+
const authorization = authorizeLocalBridgeRequest({ session, request });
|
|
44
|
+
if (!authorization.ok) {
|
|
45
|
+
return diagnostic(authorization.diagnostic.code === "route_not_found" ? 404 : 403, authorization.diagnostic.code, authorization.diagnostic.message);
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const body = await forwardRequest(input, session, request);
|
|
49
|
+
return { status: request.method === "POST" ? 201 : 200, body };
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
if (error instanceof z.ZodError) {
|
|
53
|
+
return diagnostic(400, "invalid_request", "Bridge request payload is invalid.");
|
|
54
|
+
}
|
|
55
|
+
const message = error instanceof Error ? redactSecrets(error.message) : "Bridge forwarding failed.";
|
|
56
|
+
return diagnostic(502, "upstream_error", message);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
async function forwardRequest(input, session, request) {
|
|
61
|
+
const taskId = requiredTaskId(session);
|
|
62
|
+
const credential = input.machineCredential;
|
|
63
|
+
if (request.path === "/v1/run/context") {
|
|
64
|
+
return input.client.readWorkContext(credential, session.runId, taskId);
|
|
65
|
+
}
|
|
66
|
+
if (request.path === "/v1/task/checkout") {
|
|
67
|
+
return input.client.checkoutTask(credential, session.runId, taskId);
|
|
68
|
+
}
|
|
69
|
+
if (request.path === "/v1/run/events") {
|
|
70
|
+
const parsed = eventSchema.parse(request.payload);
|
|
71
|
+
return input.client.appendRunEvent(credential, session.runId, {
|
|
72
|
+
eventType: parsed.eventType,
|
|
73
|
+
...(parsed.payload === undefined ? {} : { payload: parsed.payload }),
|
|
74
|
+
...(parsed.occurredAt === undefined ? {} : { occurredAt: parsed.occurredAt }),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
if (request.path === "/v1/task/children") {
|
|
78
|
+
const parsed = z.object({ children: z.array(childTaskSchema).min(1).max(20) }).parse(request.payload);
|
|
79
|
+
return input.client.createChildTasks(credential, session.runId, taskId, parsed.children);
|
|
80
|
+
}
|
|
81
|
+
if (request.path === "/v1/task/comments") {
|
|
82
|
+
const parsed = z.object({ bodyMarkdown: z.string().min(1) }).parse(request.payload);
|
|
83
|
+
return input.client.addTaskComment(credential, session.runId, taskId, parsed.bodyMarkdown);
|
|
84
|
+
}
|
|
85
|
+
if (request.path === "/v1/artifacts") {
|
|
86
|
+
return input.client.registerArtifact(credential, session.runId, taskId, artifactSchema.parse(request.payload));
|
|
87
|
+
}
|
|
88
|
+
if (request.path === "/v1/approvals") {
|
|
89
|
+
const parsed = z.object({
|
|
90
|
+
type: z.string().min(1),
|
|
91
|
+
payload: jsonObjectSchema.optional(),
|
|
92
|
+
idempotencyKey: z.string().optional(),
|
|
93
|
+
}).parse(request.payload);
|
|
94
|
+
return input.client.requestApproval(credential, session.runId, taskId, {
|
|
95
|
+
type: parsed.type,
|
|
96
|
+
...(parsed.payload === undefined ? {} : { payload: parsed.payload }),
|
|
97
|
+
...(parsed.idempotencyKey === undefined ? {} : { idempotencyKey: parsed.idempotencyKey }),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (request.path === "/v1/usage") {
|
|
101
|
+
const parsed = z.object({
|
|
102
|
+
eventKey: z.string().min(1),
|
|
103
|
+
costMicros: z.number().int().nonnegative(),
|
|
104
|
+
durationMs: z.number().int().nonnegative(),
|
|
105
|
+
}).parse(request.payload);
|
|
106
|
+
const decision = await input.client.reportUsage(credential, session.runId, taskId, parsed);
|
|
107
|
+
if (decision.hardStop)
|
|
108
|
+
input.onHardStop?.();
|
|
109
|
+
return decision;
|
|
110
|
+
}
|
|
111
|
+
const parsed = z.object({
|
|
112
|
+
disposition: z.enum(["done", "in_review", "blocked", "cancelled"]),
|
|
113
|
+
resultSummary: jsonObjectSchema.optional(),
|
|
114
|
+
}).parse(request.payload);
|
|
115
|
+
return input.client.setTaskDisposition(credential, session.runId, taskId, parsed.disposition, parsed.resultSummary);
|
|
116
|
+
}
|
|
117
|
+
function requiredTaskId(session) {
|
|
118
|
+
if (session.taskId === undefined)
|
|
119
|
+
throw new Error("Run session has no task scope.");
|
|
120
|
+
return session.taskId;
|
|
121
|
+
}
|
|
122
|
+
function diagnostic(status, code, message) {
|
|
123
|
+
return { status, body: { error: { code, message: redactSecrets(message) } } };
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=handler.js.map
|