@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,149 @@
1
+ import { z } from "zod";
2
+ import { isAbortError } from "../runtime/sleep.js";
3
+ const DEFAULT_DELAY_MS = 50;
4
+ const QA_SCENARIOS = ["complete", "review", "blocked", "hard_stop", "slow"];
5
+ const QA_ARTIFACT_REFERENCE_URL = "https://github.com/Sift-wiki/conductor-v1/blob/main/qa/work-orchestration/README.md";
6
+ const qaScenarioSchema = z.object({
7
+ qaScenario: z.enum(QA_SCENARIOS),
8
+ qa: z
9
+ .object({
10
+ delayMs: z.number().int().min(0).max(10 * 60 * 1000).optional(),
11
+ costMicros: z.number().int().nonnegative().optional(),
12
+ durationMs: z.number().int().nonnegative().optional(),
13
+ comment: z.string().min(1).max(4000).optional(),
14
+ })
15
+ .optional(),
16
+ });
17
+ const artifactResponseSchema = z.object({ id: z.string().min(1) });
18
+ const usageResponseSchema = z.object({ hardStop: z.boolean() });
19
+ export function createFakeAgentAdapter(input = {}) {
20
+ const delayMs = input.delayMs ?? DEFAULT_DELAY_MS;
21
+ const fetch = input.fetch ?? globalThis.fetch.bind(globalThis);
22
+ return {
23
+ localKey: input.localKey ?? "fake-agent",
24
+ displayName: input.displayName ?? "Fake Agent",
25
+ adapterType: "fake",
26
+ capabilities: { streaming: false, qaScenarios: [...QA_SCENARIOS], ...input.capabilities },
27
+ check: () => Promise.resolve({ status: "ready", message: "Fake adapter is always ready." }),
28
+ async run(runInput) {
29
+ await runInput.emit({
30
+ eventType: "health",
31
+ payload: {
32
+ phase: "starting",
33
+ adapterType: "fake",
34
+ },
35
+ });
36
+ await runInput.emit({
37
+ eventType: "progress",
38
+ payload: {
39
+ summary: "Fake agent accepted local Conductor job.",
40
+ },
41
+ });
42
+ const scenario = readQaScenario(runInput.wakeEnvelope?.wake.payload);
43
+ if (scenario?.qaScenario === "review") {
44
+ return runReviewScenario(runInput, scenario.qa, fetch);
45
+ }
46
+ if (scenario?.qaScenario === "blocked") {
47
+ return runBlockedScenario(runInput, scenario.qa, fetch);
48
+ }
49
+ if (scenario?.qaScenario === "hard_stop") {
50
+ return runHardStopScenario(runInput, scenario.qa, fetch);
51
+ }
52
+ try {
53
+ await runInput.sleep(scenario?.qa?.delayMs ?? delayMs, runInput.signal);
54
+ }
55
+ catch (error) {
56
+ if (!isAbortError(error)) {
57
+ throw error;
58
+ }
59
+ }
60
+ if (runInput.signal.aborted) {
61
+ return {
62
+ status: "cancelled",
63
+ resultSummary: { summary: "Stopped fake agent after cancellation." },
64
+ };
65
+ }
66
+ await runInput.emit({
67
+ eventType: "progress",
68
+ payload: {
69
+ summary: "Fake agent completed tracer-bullet work.",
70
+ },
71
+ });
72
+ return {
73
+ status: "completed",
74
+ resultSummary: {
75
+ summary: `Fake agent completed tracer-bullet work for: ${runInput.objective}`,
76
+ },
77
+ };
78
+ },
79
+ };
80
+ }
81
+ function readQaScenario(payload) {
82
+ if (payload?.["qaScenario"] === undefined)
83
+ return undefined;
84
+ return qaScenarioSchema.parse(payload);
85
+ }
86
+ async function runReviewScenario(input, qa, fetch) {
87
+ await bridgePost(input, fetch, "/v1/task/comments", {
88
+ bodyMarkdown: qa?.comment ?? "QA agent prepared an artifact for human review.",
89
+ });
90
+ const artifact = artifactResponseSchema.parse(await bridgePost(input, fetch, "/v1/artifacts", {
91
+ type: "report",
92
+ provider: "sift-conductor-qa",
93
+ title: `QA review artifact for ${input.wakeEnvelope?.task.title ?? "task"}`,
94
+ url: QA_ARTIFACT_REFERENCE_URL,
95
+ summary: "Deterministic artifact generated by the Sift Conductor live QA adapter.",
96
+ idempotencyKey: `qa-artifact:${input.wakeEnvelope?.runId ?? "unknown"}`,
97
+ }));
98
+ await bridgePost(input, fetch, "/v1/approvals", {
99
+ type: "human_review",
100
+ payload: { artifactId: artifact.id },
101
+ idempotencyKey: `qa-approval:${input.wakeEnvelope?.runId ?? "unknown"}`,
102
+ });
103
+ return {
104
+ status: "completed",
105
+ disposition: "in_review",
106
+ resultSummary: { summary: "QA artifact is ready for human review.", artifactId: artifact.id },
107
+ };
108
+ }
109
+ async function runBlockedScenario(input, qa, fetch) {
110
+ await bridgePost(input, fetch, "/v1/task/comments", {
111
+ bodyMarkdown: qa?.comment ?? "QA agent is blocked pending a human-provided decision.",
112
+ });
113
+ return {
114
+ status: "completed",
115
+ disposition: "blocked",
116
+ resultSummary: { summary: "QA agent stopped with an actionable blocker." },
117
+ };
118
+ }
119
+ async function runHardStopScenario(input, qa, fetch) {
120
+ const decision = usageResponseSchema.parse(await bridgePost(input, fetch, "/v1/usage", {
121
+ eventKey: `qa-usage:${input.wakeEnvelope?.runId ?? "unknown"}`,
122
+ costMicros: qa?.costMicros ?? 2_000_000,
123
+ durationMs: qa?.durationMs ?? 1_000,
124
+ }));
125
+ if (!decision.hardStop) {
126
+ throw new Error("QA hard-stop scenario did not reach a configured hard limit.");
127
+ }
128
+ return {
129
+ status: "cancelled",
130
+ resultSummary: { summary: "QA run stopped after reaching its Sift usage policy." },
131
+ };
132
+ }
133
+ async function bridgePost(input, fetch, path, body) {
134
+ const apiUrl = input.env?.["SIFT_API_URL"];
135
+ const token = input.env?.["SIFT_RUN_TOKEN"];
136
+ if (apiUrl === undefined || token === undefined) {
137
+ throw new Error("QA scenario requires a task-linked local bridge session.");
138
+ }
139
+ const response = await fetch(`${apiUrl.replace(/\/$/u, "")}${path}`, {
140
+ method: "POST",
141
+ headers: { authorization: `Bearer ${token}`, "content-type": "application/json" },
142
+ body: JSON.stringify(body),
143
+ });
144
+ const value = await response.json();
145
+ if (!response.ok)
146
+ throw new Error(`QA bridge request failed with HTTP ${String(response.status)}.`);
147
+ return value;
148
+ }
149
+ //# sourceMappingURL=fakeAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fakeAgent.js","sourceRoot":"","sources":["../../src/adapters/fakeAgent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { LocalAgentAdapter } from "./types.js";
2
+ import type { JsonObject } from "../types.js";
3
+ export type FetchLike = (url: string, init: RequestInit) => Promise<Response>;
4
+ export type HttpAgentConfig = {
5
+ localKey: string;
6
+ displayName: string;
7
+ url: string;
8
+ method: string;
9
+ headers: Record<string, string>;
10
+ payloadTemplate: JsonObject;
11
+ timeoutMs: number;
12
+ outputLimitBytes: number;
13
+ capabilities: JsonObject;
14
+ };
15
+ export type HttpAgentDeps = {
16
+ fetch?: FetchLike;
17
+ };
18
+ export declare function createHttpAgentAdapter(config: HttpAgentConfig, deps?: HttpAgentDeps): LocalAgentAdapter;
19
+ export declare function isJsonObject(value: unknown): value is JsonObject;
@@ -0,0 +1,164 @@
1
+ import { LocalAgentExecutionError } from "./errors.js";
2
+ import { boundedOutputSummary, boundAndRedactText } from "./output.js";
3
+ export function createHttpAgentAdapter(config, deps = {}) {
4
+ const fetch = deps.fetch ?? globalThis.fetch.bind(globalThis);
5
+ return {
6
+ localKey: config.localKey,
7
+ displayName: config.displayName,
8
+ adapterType: "http",
9
+ capabilities: {
10
+ streaming: false,
11
+ cancellation: "abort",
12
+ ...config.capabilities,
13
+ },
14
+ check: () => checkHttpAdapter(config),
15
+ run: (input) => runHttpAdapter(input, config, fetch),
16
+ };
17
+ }
18
+ async function runHttpAdapter(input, config, fetch) {
19
+ const cancellationState = cancellationStateFor(input.signal);
20
+ if (isCancellationRequested(cancellationState)) {
21
+ return {
22
+ status: "cancelled",
23
+ resultSummary: { summary: "HTTP adapter was cancelled before start." },
24
+ };
25
+ }
26
+ await input.emit({
27
+ eventType: "health",
28
+ payload: {
29
+ summary: "Starting HTTP adapter.",
30
+ adapterType: "http",
31
+ localKey: config.localKey,
32
+ },
33
+ });
34
+ const controller = new AbortController();
35
+ const timeoutState = { timedOut: false };
36
+ const timeout = config.timeoutMs > 0
37
+ ? setTimeout(() => {
38
+ timeoutState.timedOut = true;
39
+ controller.abort();
40
+ }, config.timeoutMs)
41
+ : undefined;
42
+ const abort = () => {
43
+ cancellationState.requested = true;
44
+ controller.abort();
45
+ };
46
+ input.signal.addEventListener("abort", abort, { once: true });
47
+ try {
48
+ await input.emit({
49
+ eventType: "progress",
50
+ payload: {
51
+ summary: "Invoking HTTP adapter endpoint.",
52
+ method: config.method,
53
+ url: boundAndRedactText(config.url).text,
54
+ },
55
+ });
56
+ const response = await fetch(config.url, requestInit(config, input, controller.signal));
57
+ const responseText = await response.text();
58
+ const summary = {
59
+ summary: `HTTP ${config.method} returned ${String(response.status)}.`,
60
+ status: response.status,
61
+ ok: response.ok,
62
+ method: config.method,
63
+ url: boundAndRedactText(config.url).text,
64
+ ...boundedOutputSummary({
65
+ output: responseText,
66
+ limitBytes: config.outputLimitBytes,
67
+ }),
68
+ };
69
+ if (isCancellationRequested(cancellationState)) {
70
+ return {
71
+ status: "cancelled",
72
+ resultSummary: { summary: "Stopped HTTP adapter after cancellation." },
73
+ };
74
+ }
75
+ if (!response.ok) {
76
+ throw new LocalAgentExecutionError(`HTTP adapter returned status ${String(response.status)}.`, {
77
+ ...summary,
78
+ message: `HTTP adapter returned status ${String(response.status)}.`,
79
+ });
80
+ }
81
+ return {
82
+ status: "completed",
83
+ resultSummary: summary,
84
+ };
85
+ }
86
+ catch (error) {
87
+ if (isCancellationRequested(cancellationState)) {
88
+ return {
89
+ status: "cancelled",
90
+ resultSummary: { summary: "Stopped HTTP adapter after cancellation." },
91
+ };
92
+ }
93
+ if (timeoutState.timedOut) {
94
+ throw new LocalAgentExecutionError(`HTTP adapter timed out after ${String(config.timeoutMs)}ms.`, {
95
+ message: `HTTP adapter timed out after ${String(config.timeoutMs)}ms.`,
96
+ timedOut: true,
97
+ method: config.method,
98
+ url: boundAndRedactText(config.url).text,
99
+ });
100
+ }
101
+ if (error instanceof LocalAgentExecutionError) {
102
+ throw error;
103
+ }
104
+ throw new LocalAgentExecutionError(error instanceof Error ? error.message : "HTTP adapter failed.", {
105
+ message: error instanceof Error ? boundAndRedactText(error.message).text : "HTTP adapter failed.",
106
+ method: config.method,
107
+ url: boundAndRedactText(config.url).text,
108
+ });
109
+ }
110
+ finally {
111
+ input.signal.removeEventListener("abort", abort);
112
+ if (timeout !== undefined) {
113
+ clearTimeout(timeout);
114
+ }
115
+ }
116
+ }
117
+ function requestInit(config, input, signal) {
118
+ const method = config.method.toUpperCase();
119
+ const init = {
120
+ method,
121
+ headers: {
122
+ "content-type": "application/json",
123
+ ...config.headers,
124
+ },
125
+ signal,
126
+ };
127
+ if (method !== "GET" && method !== "HEAD") {
128
+ init.body = JSON.stringify({
129
+ ...config.payloadTemplate,
130
+ objective: input.objective,
131
+ contextRefs: input.contextRefs,
132
+ limits: input.limits,
133
+ job: input.job ?? null,
134
+ wakeEnvelope: input.wakeEnvelope ?? null,
135
+ });
136
+ }
137
+ return init;
138
+ }
139
+ function checkHttpAdapter(config) {
140
+ try {
141
+ const url = new URL(config.url);
142
+ return Promise.resolve({
143
+ status: "ready",
144
+ message: `Endpoint configured: ${boundAndRedactText(url.toString()).text}`,
145
+ });
146
+ }
147
+ catch {
148
+ return Promise.resolve({
149
+ status: "error",
150
+ message: `Invalid URL: ${boundAndRedactText(config.url).text}`,
151
+ hint: "Configure a valid HTTP or HTTPS adapter URL.",
152
+ });
153
+ }
154
+ }
155
+ export function isJsonObject(value) {
156
+ return typeof value === "object" && value !== null && !Array.isArray(value);
157
+ }
158
+ function cancellationStateFor(signal) {
159
+ return { requested: signal.aborted };
160
+ }
161
+ function isCancellationRequested(state) {
162
+ return state.requested;
163
+ }
164
+ //# sourceMappingURL=httpAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpAgent.js","sourceRoot":"","sources":["../../src/adapters/httpAgent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { JsonObject } from "../types.js";
2
+ export declare const DEFAULT_OUTPUT_LIMIT_BYTES: number;
3
+ export type BoundedText = {
4
+ text: string;
5
+ bytes: number;
6
+ truncated: boolean;
7
+ limitBytes: number;
8
+ };
9
+ export declare function boundAndRedactText(input: string, limitBytes?: number): BoundedText;
10
+ export declare function boundedOutputSummary(input: {
11
+ stdout?: string;
12
+ stderr?: string;
13
+ output?: string;
14
+ limitBytes?: number;
15
+ }): JsonObject;
16
+ export declare function safeMessage(message: string, limitBytes?: number): string;
@@ -0,0 +1,48 @@
1
+ import { Buffer } from "node:buffer";
2
+ import { redactSecrets } from "../redaction.js";
3
+ export const DEFAULT_OUTPUT_LIMIT_BYTES = 32 * 1024;
4
+ export function boundAndRedactText(input, limitBytes = DEFAULT_OUTPUT_LIMIT_BYTES) {
5
+ const redacted = redactSecrets(input);
6
+ const bytes = Buffer.byteLength(redacted, "utf8");
7
+ if (bytes <= limitBytes) {
8
+ return {
9
+ text: redacted,
10
+ bytes,
11
+ truncated: false,
12
+ limitBytes,
13
+ };
14
+ }
15
+ return {
16
+ text: Buffer.from(redacted, "utf8").subarray(0, limitBytes).toString("utf8"),
17
+ bytes,
18
+ truncated: true,
19
+ limitBytes,
20
+ };
21
+ }
22
+ export function boundedOutputSummary(input) {
23
+ const limitBytes = input.limitBytes ?? DEFAULT_OUTPUT_LIMIT_BYTES;
24
+ const summary = {};
25
+ if (input.stdout !== undefined) {
26
+ const stdout = boundAndRedactText(input.stdout, limitBytes);
27
+ summary.stdout = stdout.text;
28
+ summary.stdoutTruncated = stdout.truncated;
29
+ summary.stdoutBytes = stdout.bytes;
30
+ }
31
+ if (input.stderr !== undefined) {
32
+ const stderr = boundAndRedactText(input.stderr, limitBytes);
33
+ summary.stderr = stderr.text;
34
+ summary.stderrTruncated = stderr.truncated;
35
+ summary.stderrBytes = stderr.bytes;
36
+ }
37
+ if (input.output !== undefined) {
38
+ const output = boundAndRedactText(input.output, limitBytes);
39
+ summary.output = output.text;
40
+ summary.outputTruncated = output.truncated;
41
+ summary.outputBytes = output.bytes;
42
+ }
43
+ return summary;
44
+ }
45
+ export function safeMessage(message, limitBytes = DEFAULT_OUTPUT_LIMIT_BYTES) {
46
+ return boundAndRedactText(message, limitBytes).text;
47
+ }
48
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/adapters/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,IAAI,CAAC;AASpD,MAAM,UAAU,kBAAkB,CAChC,KAAa,EACb,UAAU,GAAG,0BAA0B;IAEvC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClD,IAAI,KAAK,IAAI,UAAU,EAAE,CAAC;QACxB,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,KAAK;YACL,SAAS,EAAE,KAAK;YAChB,UAAU;SACX,CAAC;IACJ,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5E,KAAK;QACL,SAAS,EAAE,IAAI;QACf,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAKpC;IACC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,0BAA0B,CAAC;IAClE,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC5D,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;QAC7B,OAAO,CAAC,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC;QAC3C,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;IACrC,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC5D,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;QAC7B,OAAO,CAAC,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC;QAC3C,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;IACrC,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC5D,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC;QAC7B,OAAO,CAAC,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC;QAC3C,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;IACrC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,UAAU,GAAG,0BAA0B;IAClF,OAAO,kBAAkB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { LocalAgentAdapter } from "./types.js";
2
+ import { type RunProcess } from "../runtime/process.js";
3
+ import type { JsonObject } from "../types.js";
4
+ export type ProcessAgentConfig = {
5
+ localKey: string;
6
+ displayName: string;
7
+ command: string;
8
+ args: string[];
9
+ cwd: string;
10
+ env: Record<string, string>;
11
+ timeoutMs: number;
12
+ graceMs: number;
13
+ outputLimitBytes: number;
14
+ capabilities: JsonObject;
15
+ paperclipEnvAliases: boolean;
16
+ };
17
+ export type ProcessAgentDeps = {
18
+ runProcess?: RunProcess;
19
+ env?: NodeJS.ProcessEnv;
20
+ };
21
+ export declare function createProcessAgentAdapter(config: ProcessAgentConfig, deps?: ProcessAgentDeps): LocalAgentAdapter;
@@ -0,0 +1,166 @@
1
+ import { access } from "node:fs/promises";
2
+ import { constants as fsConstants } from "node:fs";
3
+ import path from "node:path";
4
+ import { LocalAgentExecutionError } from "./errors.js";
5
+ import { boundedOutputSummary, boundAndRedactText } from "./output.js";
6
+ import { buildPaperclipAliasEnvironment } from "../runtime/runEnvironment.js";
7
+ import { runChildProcess } from "../runtime/process.js";
8
+ export function createProcessAgentAdapter(config, deps = {}) {
9
+ const runProcess = deps.runProcess ?? runChildProcess;
10
+ return {
11
+ localKey: config.localKey,
12
+ displayName: config.displayName,
13
+ adapterType: "process",
14
+ capabilities: {
15
+ streaming: false,
16
+ cancellation: "cooperative",
17
+ ...config.capabilities,
18
+ },
19
+ check: () => checkProcessAdapter(config, deps.env ?? process.env),
20
+ run: (input) => runProcessAdapter(input, config, runProcess),
21
+ };
22
+ }
23
+ async function runProcessAdapter(input, config, runProcess) {
24
+ const cancellationState = cancellationStateFor(input.signal);
25
+ if (isCancellationRequested(cancellationState)) {
26
+ return {
27
+ status: "cancelled",
28
+ resultSummary: { summary: "Process adapter was cancelled before start." },
29
+ };
30
+ }
31
+ const onAbort = () => {
32
+ cancellationState.requested = true;
33
+ };
34
+ input.signal.addEventListener("abort", onAbort, { once: true });
35
+ try {
36
+ await input.emit({
37
+ eventType: "health",
38
+ payload: {
39
+ summary: "Starting process adapter.",
40
+ adapterType: "process",
41
+ localKey: config.localKey,
42
+ },
43
+ });
44
+ await input.emit({
45
+ eventType: "progress",
46
+ payload: {
47
+ summary: "Launching local command.",
48
+ command: boundAndRedactText(config.command).text,
49
+ cwd: boundAndRedactText(config.cwd).text,
50
+ },
51
+ });
52
+ const runEnv = input.env ?? {};
53
+ const result = await runProcess({
54
+ command: config.command,
55
+ args: config.args,
56
+ cwd: config.cwd,
57
+ env: {
58
+ ...config.env,
59
+ ...runEnv,
60
+ ...(config.paperclipEnvAliases ? buildPaperclipAliasEnvironment(runEnv) : {}),
61
+ },
62
+ timeoutMs: config.timeoutMs,
63
+ graceMs: config.graceMs,
64
+ outputLimitBytes: config.outputLimitBytes,
65
+ signal: input.signal,
66
+ onLog: async (stream, chunk) => {
67
+ const safeChunk = boundAndRedactText(chunk, config.outputLimitBytes);
68
+ await input.emit({
69
+ eventType: "log",
70
+ payload: {
71
+ stream,
72
+ text: safeChunk.text,
73
+ truncated: safeChunk.truncated,
74
+ },
75
+ });
76
+ },
77
+ });
78
+ if (isCancellationRequested(cancellationState)) {
79
+ return {
80
+ status: "cancelled",
81
+ resultSummary: {
82
+ summary: "Stopped process adapter after cancellation.",
83
+ exitCode: result.exitCode,
84
+ signal: result.signal,
85
+ },
86
+ };
87
+ }
88
+ const summary = {
89
+ summary: `Process exited with code ${String(result.exitCode ?? -1)}.`,
90
+ exitCode: result.exitCode,
91
+ signal: result.signal,
92
+ timedOut: result.timedOut,
93
+ ...boundedOutputSummary({
94
+ stdout: result.stdout,
95
+ stderr: result.stderr,
96
+ limitBytes: config.outputLimitBytes,
97
+ }),
98
+ };
99
+ if (result.timedOut) {
100
+ throw new LocalAgentExecutionError(`Process timed out after ${String(config.timeoutMs)}ms.`, {
101
+ ...summary,
102
+ message: `Process timed out after ${String(config.timeoutMs)}ms.`,
103
+ });
104
+ }
105
+ if ((result.exitCode ?? 0) !== 0) {
106
+ throw new LocalAgentExecutionError(`Process exited with code ${String(result.exitCode ?? -1)}.`, {
107
+ ...summary,
108
+ message: `Process exited with code ${String(result.exitCode ?? -1)}.`,
109
+ });
110
+ }
111
+ return {
112
+ status: "completed",
113
+ resultSummary: summary,
114
+ };
115
+ }
116
+ finally {
117
+ input.signal.removeEventListener("abort", onAbort);
118
+ }
119
+ }
120
+ async function checkProcessAdapter(config, env) {
121
+ const resolved = await resolveCommand(config.command, config.cwd, env);
122
+ if (resolved === undefined) {
123
+ return {
124
+ status: "error",
125
+ message: `Command not found: ${boundAndRedactText(config.command).text}`,
126
+ hint: "Verify the adapter command, working directory, and PATH.",
127
+ };
128
+ }
129
+ return {
130
+ status: "ready",
131
+ message: `Command resolved: ${boundAndRedactText(resolved).text}`,
132
+ };
133
+ }
134
+ function cancellationStateFor(signal) {
135
+ return { requested: signal.aborted };
136
+ }
137
+ function isCancellationRequested(state) {
138
+ return state.requested;
139
+ }
140
+ async function resolveCommand(command, cwd, env) {
141
+ if (command.includes("/") || command.includes("\\")) {
142
+ const candidate = path.isAbsolute(command) ? command : path.resolve(cwd, command);
143
+ return canExecute(candidate).then((ok) => ok ? candidate : undefined);
144
+ }
145
+ const pathValue = env.PATH ?? env.Path ?? "";
146
+ const candidates = pathValue
147
+ .split(path.delimiter)
148
+ .filter((entry) => entry.length > 0)
149
+ .map((entry) => path.join(entry, command));
150
+ for (const candidate of candidates) {
151
+ if (await canExecute(candidate)) {
152
+ return candidate;
153
+ }
154
+ }
155
+ return undefined;
156
+ }
157
+ async function canExecute(candidate) {
158
+ try {
159
+ await access(candidate, fsConstants.X_OK);
160
+ return true;
161
+ }
162
+ catch {
163
+ return false;
164
+ }
165
+ }
166
+ //# sourceMappingURL=processAgent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processAgent.js","sourceRoot":"","sources":["../../src/adapters/processAgent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { RunProcess } from "../../runtime/process.js";
2
+ import type { ProviderAccessProfile, ProviderType } from "./types.js";
3
+ export type ProviderProbeDeps = {
4
+ runProcess?: RunProcess | undefined;
5
+ env?: NodeJS.ProcessEnv | undefined;
6
+ };
7
+ export declare function resolveProviderExecutable(input: {
8
+ provider: ProviderType;
9
+ executablePath?: string | undefined;
10
+ cwd: string;
11
+ env?: NodeJS.ProcessEnv | undefined;
12
+ }): Promise<string | undefined>;
13
+ export declare function probeCommand(input: {
14
+ command: string;
15
+ args: string[];
16
+ cwd: string;
17
+ env?: Record<string, string> | undefined;
18
+ timeoutMs?: number | undefined;
19
+ deps?: ProviderProbeDeps | undefined;
20
+ }): Promise<import("../../runtime/process.js").RunProcessResult>;
21
+ export declare function validateWorkspace(input: {
22
+ workspacePath: string;
23
+ accessProfile: ProviderAccessProfile;
24
+ }): Promise<{
25
+ ok: true;
26
+ } | {
27
+ ok: false;
28
+ message: string;
29
+ }>;
30
+ export declare function safeExecutableLabel(executablePath: string): string;
31
+ export declare function defaultProviderCommand(provider: ProviderType): string;