@sift-wiki/conductor 0.0.0 → 0.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (207) hide show
  1. package/README.md +105 -1
  2. package/THIRD_PARTY_NOTICES.md +38 -0
  3. package/dist/adapters/claudeAgent.d.ts +23 -0
  4. package/dist/adapters/claudeAgent.js +164 -0
  5. package/dist/adapters/claudeAgent.js.map +1 -0
  6. package/dist/adapters/claudeParser.d.ts +5 -0
  7. package/dist/adapters/claudeParser.js +120 -0
  8. package/dist/adapters/claudeParser.js.map +1 -0
  9. package/dist/adapters/codexAgent.d.ts +28 -0
  10. package/dist/adapters/codexAgent.js +152 -0
  11. package/dist/adapters/codexAgent.js.map +1 -0
  12. package/dist/adapters/codexParser.d.ts +5 -0
  13. package/dist/adapters/codexParser.js +106 -0
  14. package/dist/adapters/codexParser.js.map +1 -0
  15. package/dist/adapters/config.d.ts +29 -0
  16. package/dist/adapters/config.js +286 -0
  17. package/dist/adapters/config.js.map +1 -0
  18. package/dist/adapters/doctor.d.ts +12 -0
  19. package/dist/adapters/doctor.js +20 -0
  20. package/dist/adapters/doctor.js.map +1 -0
  21. package/dist/adapters/errors.d.ts +7 -0
  22. package/dist/adapters/errors.js +19 -0
  23. package/dist/adapters/errors.js.map +1 -0
  24. package/dist/adapters/fakeAgent.d.ts +11 -0
  25. package/dist/adapters/fakeAgent.js +149 -0
  26. package/dist/adapters/fakeAgent.js.map +1 -0
  27. package/dist/adapters/httpAgent.d.ts +19 -0
  28. package/dist/adapters/httpAgent.js +164 -0
  29. package/dist/adapters/httpAgent.js.map +1 -0
  30. package/dist/adapters/output.d.ts +16 -0
  31. package/dist/adapters/output.js +48 -0
  32. package/dist/adapters/output.js.map +1 -0
  33. package/dist/adapters/processAgent.d.ts +21 -0
  34. package/dist/adapters/processAgent.js +166 -0
  35. package/dist/adapters/processAgent.js.map +1 -0
  36. package/dist/adapters/provider/discovery.d.ts +31 -0
  37. package/dist/adapters/provider/discovery.js +102 -0
  38. package/dist/adapters/provider/discovery.js.map +1 -0
  39. package/dist/adapters/provider/json.d.ts +4 -0
  40. package/dist/adapters/provider/json.js +21 -0
  41. package/dist/adapters/provider/json.js.map +1 -0
  42. package/dist/adapters/provider/lineStream.d.ts +8 -0
  43. package/dist/adapters/provider/lineStream.js +28 -0
  44. package/dist/adapters/provider/lineStream.js.map +1 -0
  45. package/dist/adapters/provider/outputSchemaFile.d.ts +5 -0
  46. package/dist/adapters/provider/outputSchemaFile.js +16 -0
  47. package/dist/adapters/provider/outputSchemaFile.js.map +1 -0
  48. package/dist/adapters/provider/prompt.d.ts +2 -0
  49. package/dist/adapters/provider/prompt.js +52 -0
  50. package/dist/adapters/provider/prompt.js.map +1 -0
  51. package/dist/adapters/provider/result.d.ts +23 -0
  52. package/dist/adapters/provider/result.js +116 -0
  53. package/dist/adapters/provider/result.js.map +1 -0
  54. package/dist/adapters/provider/runProvider.d.ts +16 -0
  55. package/dist/adapters/provider/runProvider.js +110 -0
  56. package/dist/adapters/provider/runProvider.js.map +1 -0
  57. package/dist/adapters/provider/setup.d.ts +50 -0
  58. package/dist/adapters/provider/setup.js +180 -0
  59. package/dist/adapters/provider/setup.js.map +1 -0
  60. package/dist/adapters/provider/store.d.ts +19 -0
  61. package/dist/adapters/provider/store.js +92 -0
  62. package/dist/adapters/provider/store.js.map +1 -0
  63. package/dist/adapters/provider/types.d.ts +58 -0
  64. package/dist/adapters/provider/types.js +2 -0
  65. package/dist/adapters/provider/types.js.map +1 -0
  66. package/dist/adapters/provider/version.d.ts +2 -0
  67. package/dist/adapters/provider/version.js +25 -0
  68. package/dist/adapters/provider/version.js.map +1 -0
  69. package/dist/adapters/types.d.ts +40 -0
  70. package/dist/adapters/types.js +2 -0
  71. package/dist/adapters/types.js.map +1 -0
  72. package/dist/bridge/handler.d.ts +15 -0
  73. package/dist/bridge/handler.js +125 -0
  74. package/dist/bridge/handler.js.map +1 -0
  75. package/dist/bridge/localBridge.d.ts +49 -0
  76. package/dist/bridge/localBridge.js +157 -0
  77. package/dist/bridge/localBridge.js.map +1 -0
  78. package/dist/bridge/server.d.ts +11 -0
  79. package/dist/bridge/server.js +86 -0
  80. package/dist/bridge/server.js.map +1 -0
  81. package/dist/bridge/sessionRegistry.d.ts +23 -0
  82. package/dist/bridge/sessionRegistry.js +65 -0
  83. package/dist/bridge/sessionRegistry.js.map +1 -0
  84. package/dist/cli.d.ts +23 -0
  85. package/dist/cli.js +245 -0
  86. package/dist/cli.js.map +1 -0
  87. package/dist/conductorClient.d.ts +443 -0
  88. package/dist/conductorClient.js +281 -0
  89. package/dist/conductorClient.js.map +1 -0
  90. package/dist/config.d.ts +9 -0
  91. package/dist/config.js +54 -0
  92. package/dist/config.js.map +1 -0
  93. package/dist/daemon.d.ts +52 -0
  94. package/dist/daemon.js +324 -0
  95. package/dist/daemon.js.map +1 -0
  96. package/dist/desktop/adapterSetupView.d.ts +16 -0
  97. package/dist/desktop/adapterSetupView.js +13 -0
  98. package/dist/desktop/adapterSetupView.js.map +1 -0
  99. package/dist/desktop/app/contracts.d.ts +71 -0
  100. package/dist/desktop/app/contracts.js +19 -0
  101. package/dist/desktop/app/contracts.js.map +1 -0
  102. package/dist/desktop/app/controller.d.ts +58 -0
  103. package/dist/desktop/app/controller.js +161 -0
  104. package/dist/desktop/app/controller.js.map +1 -0
  105. package/dist/desktop/app/runtimeController.d.ts +22 -0
  106. package/dist/desktop/app/runtimeController.js +44 -0
  107. package/dist/desktop/app/runtimeController.js.map +1 -0
  108. package/dist/desktop/manifest.d.ts +17 -0
  109. package/dist/desktop/manifest.js +24 -0
  110. package/dist/desktop/manifest.js.map +1 -0
  111. package/dist/desktop/pairing.d.ts +13 -0
  112. package/dist/desktop/pairing.js +20 -0
  113. package/dist/desktop/pairing.js.map +1 -0
  114. package/dist/desktop/recovery.d.ts +33 -0
  115. package/dist/desktop/recovery.js +71 -0
  116. package/dist/desktop/recovery.js.map +1 -0
  117. package/dist/desktop/workBoardView.d.ts +41 -0
  118. package/dist/desktop/workBoardView.js +133 -0
  119. package/dist/desktop/workBoardView.js.map +1 -0
  120. package/dist/desktop/workGovernanceView.d.ts +70 -0
  121. package/dist/desktop/workGovernanceView.js +159 -0
  122. package/dist/desktop/workGovernanceView.js.map +1 -0
  123. package/dist/localApi/authorizedPairing.d.ts +12 -0
  124. package/dist/localApi/authorizedPairing.js +18 -0
  125. package/dist/localApi/authorizedPairing.js.map +1 -0
  126. package/dist/localApi/contracts.d.ts +253 -0
  127. package/dist/localApi/contracts.js +173 -0
  128. package/dist/localApi/contracts.js.map +1 -0
  129. package/dist/localApi/server.d.ts +20 -0
  130. package/dist/localApi/server.js +412 -0
  131. package/dist/localApi/server.js.map +1 -0
  132. package/dist/localApi/workConsole.d.ts +74 -0
  133. package/dist/localApi/workConsole.js +342 -0
  134. package/dist/localApi/workConsole.js.map +1 -0
  135. package/dist/localApi/workContracts.d.ts +213 -0
  136. package/dist/localApi/workContracts.js +130 -0
  137. package/dist/localApi/workContracts.js.map +1 -0
  138. package/dist/localApp/platform.d.ts +2 -0
  139. package/dist/localApp/platform.js +57 -0
  140. package/dist/localApp/platform.js.map +1 -0
  141. package/dist/localApp/service.d.ts +25 -0
  142. package/dist/localApp/service.js +114 -0
  143. package/dist/localApp/service.js.map +1 -0
  144. package/dist/pairing.d.ts +27 -0
  145. package/dist/pairing.js +45 -0
  146. package/dist/pairing.js.map +1 -0
  147. package/dist/redaction.d.ts +2 -0
  148. package/dist/redaction.js +34 -0
  149. package/dist/redaction.js.map +1 -0
  150. package/dist/release/validateDistribution.d.ts +51 -0
  151. package/dist/release/validateDistribution.js +54 -0
  152. package/dist/release/validateDistribution.js.map +1 -0
  153. package/dist/runtime/localLogSpool.d.ts +47 -0
  154. package/dist/runtime/localLogSpool.js +105 -0
  155. package/dist/runtime/localLogSpool.js.map +1 -0
  156. package/dist/runtime/localRunQueue.d.ts +31 -0
  157. package/dist/runtime/localRunQueue.js +76 -0
  158. package/dist/runtime/localRunQueue.js.map +1 -0
  159. package/dist/runtime/localSessionCache.d.ts +26 -0
  160. package/dist/runtime/localSessionCache.js +35 -0
  161. package/dist/runtime/localSessionCache.js.map +1 -0
  162. package/dist/runtime/process.d.ts +27 -0
  163. package/dist/runtime/process.js +128 -0
  164. package/dist/runtime/process.js.map +1 -0
  165. package/dist/runtime/runEnvironment.d.ts +12 -0
  166. package/dist/runtime/runEnvironment.js +59 -0
  167. package/dist/runtime/runEnvironment.js.map +1 -0
  168. package/dist/runtime/runEventRetryBuffer.d.ts +42 -0
  169. package/dist/runtime/runEventRetryBuffer.js +118 -0
  170. package/dist/runtime/runEventRetryBuffer.js.map +1 -0
  171. package/dist/runtime/runtimeService.d.ts +27 -0
  172. package/dist/runtime/runtimeService.js +112 -0
  173. package/dist/runtime/runtimeService.js.map +1 -0
  174. package/dist/runtime/sleep.d.ts +2 -0
  175. package/dist/runtime/sleep.js +21 -0
  176. package/dist/runtime/sleep.js.map +1 -0
  177. package/dist/runtime/taskExecution.d.ts +16 -0
  178. package/dist/runtime/taskExecution.js +74 -0
  179. package/dist/runtime/taskExecution.js.map +1 -0
  180. package/dist/runtime/wakeEnvelope.d.ts +76 -0
  181. package/dist/runtime/wakeEnvelope.js +60 -0
  182. package/dist/runtime/wakeEnvelope.js.map +1 -0
  183. package/dist/types.d.ts +121 -0
  184. package/dist/types.js +2 -0
  185. package/dist/types.js.map +1 -0
  186. package/dist/userAuth/service.d.ts +26 -0
  187. package/dist/userAuth/service.js +170 -0
  188. package/dist/userAuth/service.js.map +1 -0
  189. package/dist/userAuth/store.d.ts +42 -0
  190. package/dist/userAuth/store.js +160 -0
  191. package/dist/userAuth/store.js.map +1 -0
  192. package/dist/userAuth/types.d.ts +63 -0
  193. package/dist/userAuth/types.js +29 -0
  194. package/dist/userAuth/types.js.map +1 -0
  195. package/dist/version.d.ts +2 -0
  196. package/dist/version.js +3 -0
  197. package/dist/version.js.map +1 -0
  198. package/dist/workTypes.d.ts +313 -0
  199. package/dist/workTypes.js +106 -0
  200. package/dist/workTypes.js.map +1 -0
  201. package/dist-web/assets/index-CWfnzdLn.css +1 -0
  202. package/dist-web/assets/index-D5X9InfE.js +72 -0
  203. package/dist-web/index.html +15 -0
  204. package/docs/provider-setup.md +81 -0
  205. package/docs/quickstart.md +62 -0
  206. package/docs/troubleshooting.md +63 -0
  207. package/package.json +75 -6
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/provider/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function versionAtLeast(actual: string, minimum: string): boolean;
2
+ export declare function extractVersion(output: string): string | undefined;
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/bridge/handler.ts"],"names":[],"mappings":"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"}