@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.
Files changed (162) hide show
  1. package/README.md +135 -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 +17 -0
  85. package/dist/cli.js +216 -0
  86. package/dist/cli.js.map +1 -0
  87. package/dist/conductorClient.d.ts +252 -0
  88. package/dist/conductorClient.js +223 -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 +48 -0
  94. package/dist/daemon.js +284 -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/manifest.d.ts +17 -0
  100. package/dist/desktop/manifest.js +24 -0
  101. package/dist/desktop/manifest.js.map +1 -0
  102. package/dist/desktop/pairing.d.ts +13 -0
  103. package/dist/desktop/pairing.js +20 -0
  104. package/dist/desktop/pairing.js.map +1 -0
  105. package/dist/desktop/recovery.d.ts +33 -0
  106. package/dist/desktop/recovery.js +71 -0
  107. package/dist/desktop/recovery.js.map +1 -0
  108. package/dist/desktop/workBoardView.d.ts +41 -0
  109. package/dist/desktop/workBoardView.js +133 -0
  110. package/dist/desktop/workBoardView.js.map +1 -0
  111. package/dist/desktop/workGovernanceView.d.ts +70 -0
  112. package/dist/desktop/workGovernanceView.js +159 -0
  113. package/dist/desktop/workGovernanceView.js.map +1 -0
  114. package/dist/pairing.d.ts +27 -0
  115. package/dist/pairing.js +45 -0
  116. package/dist/pairing.js.map +1 -0
  117. package/dist/redaction.d.ts +2 -0
  118. package/dist/redaction.js +34 -0
  119. package/dist/redaction.js.map +1 -0
  120. package/dist/release/validateDistribution.d.ts +51 -0
  121. package/dist/release/validateDistribution.js +54 -0
  122. package/dist/release/validateDistribution.js.map +1 -0
  123. package/dist/runtime/localLogSpool.d.ts +46 -0
  124. package/dist/runtime/localLogSpool.js +101 -0
  125. package/dist/runtime/localLogSpool.js.map +1 -0
  126. package/dist/runtime/localRunQueue.d.ts +31 -0
  127. package/dist/runtime/localRunQueue.js +76 -0
  128. package/dist/runtime/localRunQueue.js.map +1 -0
  129. package/dist/runtime/localSessionCache.d.ts +26 -0
  130. package/dist/runtime/localSessionCache.js +35 -0
  131. package/dist/runtime/localSessionCache.js.map +1 -0
  132. package/dist/runtime/process.d.ts +27 -0
  133. package/dist/runtime/process.js +128 -0
  134. package/dist/runtime/process.js.map +1 -0
  135. package/dist/runtime/runEnvironment.d.ts +12 -0
  136. package/dist/runtime/runEnvironment.js +59 -0
  137. package/dist/runtime/runEnvironment.js.map +1 -0
  138. package/dist/runtime/runEventRetryBuffer.d.ts +42 -0
  139. package/dist/runtime/runEventRetryBuffer.js +118 -0
  140. package/dist/runtime/runEventRetryBuffer.js.map +1 -0
  141. package/dist/runtime/runtimeService.d.ts +27 -0
  142. package/dist/runtime/runtimeService.js +112 -0
  143. package/dist/runtime/runtimeService.js.map +1 -0
  144. package/dist/runtime/sleep.d.ts +2 -0
  145. package/dist/runtime/sleep.js +21 -0
  146. package/dist/runtime/sleep.js.map +1 -0
  147. package/dist/runtime/taskExecution.d.ts +16 -0
  148. package/dist/runtime/taskExecution.js +74 -0
  149. package/dist/runtime/taskExecution.js.map +1 -0
  150. package/dist/runtime/wakeEnvelope.d.ts +76 -0
  151. package/dist/runtime/wakeEnvelope.js +60 -0
  152. package/dist/runtime/wakeEnvelope.js.map +1 -0
  153. package/dist/types.d.ts +121 -0
  154. package/dist/types.js +2 -0
  155. package/dist/types.js.map +1 -0
  156. package/dist/version.d.ts +2 -0
  157. package/dist/version.js +3 -0
  158. package/dist/version.js.map +1 -0
  159. package/dist/workTypes.d.ts +182 -0
  160. package/dist/workTypes.js +75 -0
  161. package/dist/workTypes.js.map +1 -0
  162. package/package.json +65 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/bridge/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { JsonObject } from "../types.js";
2
+ export type LocalBridgeMethod = "GET" | "POST";
3
+ export type LocalBridgeScope = "run:read" | "run:event:write" | "task:checkout" | "task:child:write" | "task:comment:write" | "artifact:write" | "approval:write" | "usage:write" | "task:disposition:write";
4
+ export type LocalBridgeRouteContract = {
5
+ method: LocalBridgeMethod;
6
+ path: string;
7
+ scope: LocalBridgeScope;
8
+ durableMutation: boolean;
9
+ siftApiDependency: string;
10
+ description: string;
11
+ };
12
+ export type RunScopedBridgeSession = {
13
+ runId: string;
14
+ runToken: string;
15
+ scopes: LocalBridgeScope[];
16
+ taskId?: string | undefined;
17
+ expiresAt: string;
18
+ };
19
+ export type LocalBridgeRequest = {
20
+ method: LocalBridgeMethod;
21
+ path: string;
22
+ authorization?: string | undefined;
23
+ runId?: string | undefined;
24
+ taskId?: string | undefined;
25
+ payload?: JsonObject | undefined;
26
+ };
27
+ export type LocalBridgeDiagnostic = {
28
+ code: "unauthorized" | "expired" | "route_not_found" | "out_of_scope";
29
+ message: string;
30
+ route?: string | undefined;
31
+ requiredScope?: LocalBridgeScope | undefined;
32
+ };
33
+ export type LocalBridgeAuthorizationResult = {
34
+ ok: true;
35
+ route: LocalBridgeRouteContract;
36
+ context: {
37
+ runId: string;
38
+ taskId?: string | undefined;
39
+ };
40
+ } | {
41
+ ok: false;
42
+ diagnostic: LocalBridgeDiagnostic;
43
+ };
44
+ export declare const LOCAL_BRIDGE_ROUTE_CONTRACTS: LocalBridgeRouteContract[];
45
+ export declare function authorizeLocalBridgeRequest(input: {
46
+ session: RunScopedBridgeSession;
47
+ request: LocalBridgeRequest;
48
+ nowMs?: number | undefined;
49
+ }): LocalBridgeAuthorizationResult;
@@ -0,0 +1,157 @@
1
+ import { redactLocalLogMessage } from "../runtime/localLogSpool.js";
2
+ export const LOCAL_BRIDGE_ROUTE_CONTRACTS = [
3
+ {
4
+ method: "GET",
5
+ path: "/v1/run/context",
6
+ scope: "run:read",
7
+ durableMutation: false,
8
+ siftApiDependency: "Sift wake envelope or run-detail read endpoint",
9
+ description: "Read the current run context assembled by Sift.",
10
+ },
11
+ {
12
+ method: "POST",
13
+ path: "/v1/task/checkout",
14
+ scope: "task:checkout",
15
+ durableMutation: true,
16
+ siftApiDependency: "POST /conductor/work/runs/:runId/tasks/:taskId/checkout",
17
+ description: "Atomically check out the current assigned task.",
18
+ },
19
+ {
20
+ method: "POST",
21
+ path: "/v1/task/children",
22
+ scope: "task:child:write",
23
+ durableMutation: true,
24
+ siftApiDependency: "POST /conductor/work/runs/:runId/tasks/:taskId/children",
25
+ description: "Create bounded child tasks under the current manager task.",
26
+ },
27
+ {
28
+ method: "POST",
29
+ path: "/v1/run/events",
30
+ scope: "run:event:write",
31
+ durableMutation: true,
32
+ siftApiDependency: "POST /conductor/runs/:runId/events",
33
+ description: "Append a bounded health, progress, log, artifact, or approval event.",
34
+ },
35
+ {
36
+ method: "POST",
37
+ path: "/v1/task/comments",
38
+ scope: "task:comment:write",
39
+ durableMutation: true,
40
+ siftApiDependency: "POST /conductor/work/runs/:runId/tasks/:taskId/comments",
41
+ description: "Append a task comment through Sift, scoped to the current task.",
42
+ },
43
+ {
44
+ method: "POST",
45
+ path: "/v1/artifacts",
46
+ scope: "artifact:write",
47
+ durableMutation: true,
48
+ siftApiDependency: "POST /conductor/work/runs/:runId/tasks/:taskId/artifacts",
49
+ description: "Register or upload a user-inspectable work product through Sift.",
50
+ },
51
+ {
52
+ method: "POST",
53
+ path: "/v1/approvals",
54
+ scope: "approval:write",
55
+ durableMutation: true,
56
+ siftApiDependency: "POST /conductor/work/runs/:runId/tasks/:taskId/approvals",
57
+ description: "Request a Sift review or approval for the current task.",
58
+ },
59
+ {
60
+ method: "POST",
61
+ path: "/v1/usage",
62
+ scope: "usage:write",
63
+ durableMutation: true,
64
+ siftApiDependency: "POST /conductor/work/runs/:runId/tasks/:taskId/usage",
65
+ description: "Report idempotent time and cost usage and receive policy state.",
66
+ },
67
+ {
68
+ method: "POST",
69
+ path: "/v1/task/disposition",
70
+ scope: "task:disposition:write",
71
+ durableMutation: true,
72
+ siftApiDependency: "POST /conductor/work/runs/:runId/tasks/:taskId/disposition",
73
+ description: "Set the explicit terminal disposition for the current task and run.",
74
+ },
75
+ ];
76
+ export function authorizeLocalBridgeRequest(input) {
77
+ const route = findBridgeRoute(input.request);
78
+ if (route === undefined) {
79
+ return reject({
80
+ code: "route_not_found",
81
+ message: "Local bridge route is not enabled.",
82
+ route: `${input.request.method} ${input.request.path}`,
83
+ });
84
+ }
85
+ if (bearerToken(input.request.authorization) !== input.session.runToken) {
86
+ return reject({
87
+ code: "unauthorized",
88
+ message: "Local bridge request is missing a valid run-scoped token.",
89
+ route: routeLabel(route),
90
+ });
91
+ }
92
+ if (input.nowMs !== undefined && Date.parse(input.session.expiresAt) <= input.nowMs) {
93
+ return reject({
94
+ code: "expired",
95
+ message: "Local bridge run token has expired.",
96
+ route: routeLabel(route),
97
+ });
98
+ }
99
+ if (!input.session.scopes.includes(route.scope)) {
100
+ return reject({
101
+ code: "out_of_scope",
102
+ message: "Local bridge request is outside the run token scope.",
103
+ route: routeLabel(route),
104
+ requiredScope: route.scope,
105
+ });
106
+ }
107
+ if (input.request.runId !== undefined && input.request.runId !== input.session.runId) {
108
+ return reject({
109
+ code: "out_of_scope",
110
+ message: "Local bridge request targets a different run.",
111
+ route: routeLabel(route),
112
+ requiredScope: route.scope,
113
+ });
114
+ }
115
+ if (input.request.taskId !== undefined && input.request.taskId !== input.session.taskId) {
116
+ return reject({
117
+ code: "out_of_scope",
118
+ message: "Local bridge request targets a different task.",
119
+ route: routeLabel(route),
120
+ requiredScope: route.scope,
121
+ });
122
+ }
123
+ return {
124
+ ok: true,
125
+ route,
126
+ context: {
127
+ runId: input.session.runId,
128
+ taskId: input.session.taskId,
129
+ },
130
+ };
131
+ }
132
+ function findBridgeRoute(request) {
133
+ return LOCAL_BRIDGE_ROUTE_CONTRACTS.find((route) => route.method === request.method && route.path === request.path);
134
+ }
135
+ function bearerToken(authorization) {
136
+ if (authorization === undefined) {
137
+ return undefined;
138
+ }
139
+ const trimmed = authorization.trim();
140
+ if (!trimmed.startsWith("Bearer ")) {
141
+ return undefined;
142
+ }
143
+ return trimmed.slice("Bearer ".length);
144
+ }
145
+ function reject(diagnostic) {
146
+ return {
147
+ ok: false,
148
+ diagnostic: {
149
+ ...diagnostic,
150
+ message: redactLocalLogMessage(diagnostic.message).message,
151
+ },
152
+ };
153
+ }
154
+ function routeLabel(route) {
155
+ return `${route.method} ${route.path}`;
156
+ }
157
+ //# sourceMappingURL=localBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"localBridge.js","sourceRoot":"","sources":["../../src/bridge/localBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { LocalBridgeRequest } from "./localBridge.js";
2
+ import type { LocalBridgeResponse } from "./handler.js";
3
+ export type LocalBridgeServer = {
4
+ baseUrl: string;
5
+ close(): Promise<void>;
6
+ };
7
+ export declare function startLocalBridgeServer(input: {
8
+ handle(request: LocalBridgeRequest): Promise<LocalBridgeResponse>;
9
+ host?: string | undefined;
10
+ port?: number | undefined;
11
+ }): Promise<LocalBridgeServer>;
@@ -0,0 +1,86 @@
1
+ import { createServer } from "node:http";
2
+ const MAX_REQUEST_BYTES = 64 * 1024;
3
+ export async function startLocalBridgeServer(input) {
4
+ const host = input.host ?? "127.0.0.1";
5
+ const server = createServer((request, response) => {
6
+ void handleHttpRequest((bridgeRequest) => input.handle(bridgeRequest), request, response);
7
+ });
8
+ await new Promise((resolve, reject) => {
9
+ server.once("error", reject);
10
+ server.listen(input.port ?? 0, host, () => {
11
+ server.off("error", reject);
12
+ resolve();
13
+ });
14
+ });
15
+ const address = server.address();
16
+ if (address === null || typeof address === "string") {
17
+ server.close();
18
+ throw new Error("Local bridge did not bind a TCP address.");
19
+ }
20
+ return {
21
+ baseUrl: `http://${host}:${String(address.port)}`,
22
+ close: () => new Promise((resolve, reject) => {
23
+ server.close((error) => error === undefined ? resolve() : reject(error));
24
+ }),
25
+ };
26
+ }
27
+ async function handleHttpRequest(handler, request, response) {
28
+ try {
29
+ const method = request.method;
30
+ if (method !== "GET" && method !== "POST") {
31
+ send(response, 405, { error: { code: "method_not_allowed", message: "Method not allowed." } });
32
+ return;
33
+ }
34
+ const body = method === "POST" ? await readJsonBody(request) : undefined;
35
+ const result = await handler({
36
+ method,
37
+ path: new URL(request.url ?? "/", "http://127.0.0.1").pathname,
38
+ authorization: request.headers.authorization,
39
+ runId: headerValue(request, "x-sift-run-id"),
40
+ taskId: headerValue(request, "x-sift-task-id"),
41
+ payload: body,
42
+ });
43
+ send(response, result.status, result.body);
44
+ }
45
+ catch {
46
+ send(response, 400, { error: { code: "invalid_request", message: "Invalid bridge request." } });
47
+ }
48
+ }
49
+ function readJsonBody(request) {
50
+ return new Promise((resolve, reject) => {
51
+ const chunks = [];
52
+ let size = 0;
53
+ request.on("data", (chunk) => {
54
+ size += chunk.length;
55
+ if (size > MAX_REQUEST_BYTES) {
56
+ reject(new Error("Bridge request is too large."));
57
+ request.destroy();
58
+ return;
59
+ }
60
+ chunks.push(chunk);
61
+ });
62
+ request.on("end", () => {
63
+ try {
64
+ const parsed = JSON.parse(Buffer.concat(chunks).toString("utf8"));
65
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
66
+ reject(new Error("Expected JSON object."));
67
+ return;
68
+ }
69
+ resolve(parsed);
70
+ }
71
+ catch (error) {
72
+ reject(error instanceof Error ? error : new Error("Invalid JSON."));
73
+ }
74
+ });
75
+ request.on("error", reject);
76
+ });
77
+ }
78
+ function headerValue(request, name) {
79
+ const value = request.headers[name];
80
+ return typeof value === "string" ? value : value?.[0];
81
+ }
82
+ function send(response, status, body) {
83
+ response.writeHead(status, { "content-type": "application/json" });
84
+ response.end(JSON.stringify(body));
85
+ }
86
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/bridge/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { LocalBridgeScope, RunScopedBridgeSession } from "./localBridge.js";
2
+ export declare class LocalBridgeSessionRegistry {
3
+ private readonly input;
4
+ private readonly sessions;
5
+ constructor(input?: {
6
+ now?: () => Date;
7
+ nextToken?: () => string;
8
+ defaultTtlMs?: number;
9
+ });
10
+ create(request: {
11
+ runId: string;
12
+ taskId: string;
13
+ scopes: LocalBridgeScope[];
14
+ ttlMs?: number | undefined;
15
+ }): RunScopedBridgeSession;
16
+ readByToken(token: string): RunScopedBridgeSession | undefined;
17
+ readRun(runId: string): RunScopedBridgeSession | undefined;
18
+ revoke(runId: string): boolean;
19
+ clear(): void;
20
+ private pruneExpired;
21
+ private now;
22
+ }
23
+ export declare function bearerToken(authorization: string | undefined): string | undefined;
@@ -0,0 +1,65 @@
1
+ import { randomBytes, timingSafeEqual } from "node:crypto";
2
+ const DEFAULT_SESSION_TTL_MS = 60 * 60 * 1000;
3
+ export class LocalBridgeSessionRegistry {
4
+ input;
5
+ sessions = new Map();
6
+ constructor(input = {}) {
7
+ this.input = input;
8
+ }
9
+ create(request) {
10
+ this.pruneExpired();
11
+ const now = this.now();
12
+ const token = this.input.nextToken?.() ?? randomBytes(32).toString("base64url");
13
+ const session = {
14
+ runId: request.runId,
15
+ taskId: request.taskId,
16
+ runToken: token,
17
+ scopes: [...new Set(request.scopes)],
18
+ expiresAt: new Date(now.getTime() + (request.ttlMs ?? this.input.defaultTtlMs ?? DEFAULT_SESSION_TTL_MS)).toISOString(),
19
+ };
20
+ this.sessions.set(request.runId, session);
21
+ return cloneSession(session);
22
+ }
23
+ readByToken(token) {
24
+ this.pruneExpired();
25
+ for (const session of this.sessions.values()) {
26
+ if (tokensEqual(session.runToken, token))
27
+ return cloneSession(session);
28
+ }
29
+ return undefined;
30
+ }
31
+ readRun(runId) {
32
+ this.pruneExpired();
33
+ const session = this.sessions.get(runId);
34
+ return session === undefined ? undefined : cloneSession(session);
35
+ }
36
+ revoke(runId) {
37
+ return this.sessions.delete(runId);
38
+ }
39
+ clear() {
40
+ this.sessions.clear();
41
+ }
42
+ pruneExpired() {
43
+ const nowMs = this.now().getTime();
44
+ for (const [runId, session] of this.sessions) {
45
+ if (Date.parse(session.expiresAt) <= nowMs)
46
+ this.sessions.delete(runId);
47
+ }
48
+ }
49
+ now() {
50
+ return this.input.now?.() ?? new Date();
51
+ }
52
+ }
53
+ export function bearerToken(authorization) {
54
+ const value = authorization?.trim();
55
+ return value?.startsWith("Bearer ") === true ? value.slice("Bearer ".length) : undefined;
56
+ }
57
+ function tokensEqual(left, right) {
58
+ const leftBytes = Buffer.from(left);
59
+ const rightBytes = Buffer.from(right);
60
+ return leftBytes.length === rightBytes.length && timingSafeEqual(leftBytes, rightBytes);
61
+ }
62
+ function cloneSession(session) {
63
+ return { ...session, scopes: [...session.scopes] };
64
+ }
65
+ //# sourceMappingURL=sessionRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionRegistry.js","sourceRoot":"","sources":["../../src/bridge/sessionRegistry.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import { type AdapterFactoryDeps } from "./adapters/config.js";
3
+ import type { Sleep } from "./adapters/types.js";
4
+ import type { TaskExecutionClient } from "./runtime/taskExecution.js";
5
+ import type { ConfigStore, ConductorClient } from "./types.js";
6
+ export type CliDeps = {
7
+ stdout(line: string): void;
8
+ stderr(line: string): void;
9
+ createStore(configPath?: string): ConfigStore;
10
+ createClient(apiBaseUrl: string): ConductorClient;
11
+ createWorkClient?(apiBaseUrl: string): TaskExecutionClient;
12
+ defaultDisplayName(): string;
13
+ sleep?: Sleep;
14
+ adapterFactoryDeps?: AdapterFactoryDeps;
15
+ };
16
+ export declare function runCli(args?: string[], deps?: CliDeps): Promise<number>;
17
+ export declare function isMainModule(moduleUrl: string, entryPath: string | undefined): boolean;
package/dist/cli.js ADDED
@@ -0,0 +1,216 @@
1
+ #!/usr/bin/env node
2
+ import { realpathSync } from "node:fs";
3
+ import { hostname } from "node:os";
4
+ import { fileURLToPath } from "node:url";
5
+ import { parseArgs } from "node:util";
6
+ import { capabilitiesForAdapters, createConfiguredAdapters, loadAdapterConfigsFromFile, } from "./adapters/config.js";
7
+ import { checkAdapters } from "./adapters/doctor.js";
8
+ import { ConductorHttpClient } from "./conductorClient.js";
9
+ import { FileConfigStore } from "./config.js";
10
+ import { pairConductor, readSafeStatus } from "./pairing.js";
11
+ import { redactSecrets } from "./redaction.js";
12
+ import { HeadlessRuntimeService } from "./runtime/runtimeService.js";
13
+ import { CONDUCTOR_VERSION, PROTOCOL_VERSION } from "./version.js";
14
+ export async function runCli(args = process.argv.slice(2), deps = defaultCliDeps()) {
15
+ const [command, ...commandArgs] = args;
16
+ try {
17
+ switch (command) {
18
+ case "pair":
19
+ return await runPair(commandArgs, deps);
20
+ case "status":
21
+ return await runStatus(commandArgs, deps);
22
+ case "logout":
23
+ return await runLogout(commandArgs, deps);
24
+ case "run":
25
+ return await run(commandArgs, deps);
26
+ case "doctor":
27
+ return await runDoctor(commandArgs, deps);
28
+ case "version":
29
+ case "--version":
30
+ case "-V":
31
+ deps.stdout(`sift-conductor ${CONDUCTOR_VERSION} (protocol ${PROTOCOL_VERSION})`);
32
+ return 0;
33
+ case undefined:
34
+ case "help":
35
+ case "--help":
36
+ case "-h":
37
+ deps.stdout(usage());
38
+ return 0;
39
+ default:
40
+ deps.stderr(`Unknown command: ${command}`);
41
+ deps.stderr(usage());
42
+ return 1;
43
+ }
44
+ }
45
+ catch (error) {
46
+ deps.stderr(safeErrorMessage(error));
47
+ return 1;
48
+ }
49
+ }
50
+ function defaultCliDeps() {
51
+ return {
52
+ stdout: (line) => console.log(line),
53
+ stderr: (line) => console.error(line),
54
+ createStore: (configPath) => new FileConfigStore(configPath),
55
+ createClient: (apiBaseUrl) => new ConductorHttpClient({ apiBaseUrl }),
56
+ createWorkClient: (apiBaseUrl) => new ConductorHttpClient({ apiBaseUrl }),
57
+ defaultDisplayName: () => hostname(),
58
+ };
59
+ }
60
+ async function runPair(args, deps) {
61
+ const values = parseValues(args, {
62
+ api: { type: "string" },
63
+ code: { type: "string" },
64
+ "display-name": { type: "string" },
65
+ config: { type: "string" },
66
+ adapters: { type: "string" },
67
+ });
68
+ const apiBaseUrl = requiredString(values.api, "--api");
69
+ const code = requiredString(values.code, "--code");
70
+ const displayName = optionalString(values["display-name"]) ?? deps.defaultDisplayName();
71
+ const adapters = await configuredAdapters(values, deps);
72
+ const result = await pairConductor({
73
+ apiBaseUrl,
74
+ code,
75
+ displayName,
76
+ client: deps.createClient(apiBaseUrl),
77
+ store: deps.createStore(optionalString(values.config)),
78
+ capabilities: capabilitiesForAdapters(adapters),
79
+ });
80
+ deps.stdout(`Paired Conductor ${result.conductorId} (${result.displayName}) with ${result.apiBaseUrl}.`);
81
+ return 0;
82
+ }
83
+ async function runStatus(args, deps) {
84
+ const values = parseValues(args, {
85
+ config: { type: "string" },
86
+ });
87
+ const status = await readSafeStatus(deps.createStore(optionalString(values.config)));
88
+ deps.stdout(JSON.stringify(status, null, 2));
89
+ return 0;
90
+ }
91
+ async function runLogout(args, deps) {
92
+ const values = parseValues(args, {
93
+ config: { type: "string" },
94
+ });
95
+ await deps.createStore(optionalString(values.config)).delete();
96
+ deps.stdout("Logged out.");
97
+ return 0;
98
+ }
99
+ async function run(args, deps) {
100
+ const values = parseValues(args, {
101
+ api: { type: "string" },
102
+ config: { type: "string" },
103
+ once: { type: "boolean" },
104
+ "poll-ms": { type: "string" },
105
+ "lease-refresh-ms": { type: "string" },
106
+ adapters: { type: "string" },
107
+ });
108
+ const store = deps.createStore(optionalString(values.config));
109
+ const config = await store.read();
110
+ if (config === undefined) {
111
+ throw new Error("No paired Conductor config found. Run pair first.");
112
+ }
113
+ const apiBaseUrl = optionalString(values.api) ?? config.apiBaseUrl;
114
+ const input = {
115
+ store,
116
+ client: deps.createClient(apiBaseUrl),
117
+ adapters: await configuredAdapters(values, deps),
118
+ };
119
+ if (deps.createWorkClient !== undefined)
120
+ input.workClient = deps.createWorkClient(apiBaseUrl);
121
+ if (deps.sleep !== undefined) {
122
+ input.sleep = deps.sleep;
123
+ }
124
+ const pollIntervalMs = optionalNumber(values["poll-ms"]);
125
+ if (pollIntervalMs !== undefined) {
126
+ input.pollIntervalMs = pollIntervalMs;
127
+ }
128
+ const leaseRefreshMs = optionalNumber(values["lease-refresh-ms"]);
129
+ if (leaseRefreshMs !== undefined) {
130
+ input.leaseRefreshMs = leaseRefreshMs;
131
+ }
132
+ if (values.once === true) {
133
+ deps.stdout(JSON.stringify(await new HeadlessRuntimeService(input).runOnce(), null, 2));
134
+ return 0;
135
+ }
136
+ const service = new HeadlessRuntimeService(input);
137
+ await service.start();
138
+ const status = await service.waitUntilStopped();
139
+ if (status.state === "failed") {
140
+ throw new Error(status.lastErrorMessage ?? "Conductor runtime failed.");
141
+ }
142
+ return 0;
143
+ }
144
+ async function runDoctor(args, deps) {
145
+ const values = parseValues(args, {
146
+ adapters: { type: "string" },
147
+ });
148
+ const adapters = await configuredAdapters(values, deps);
149
+ deps.stdout(JSON.stringify({ adapters: await checkAdapters(adapters) }, null, 2));
150
+ return 0;
151
+ }
152
+ function parseValues(args, options) {
153
+ return parseArgs({
154
+ args,
155
+ options,
156
+ strict: true,
157
+ allowPositionals: false,
158
+ }).values;
159
+ }
160
+ function requiredString(value, name) {
161
+ const parsed = optionalString(value);
162
+ if (parsed === undefined) {
163
+ throw new Error(`${name} is required.`);
164
+ }
165
+ return parsed;
166
+ }
167
+ function optionalString(value) {
168
+ return typeof value === "string" && value.trim().length > 0 ? value : undefined;
169
+ }
170
+ function optionalNumber(value) {
171
+ const parsed = optionalString(value);
172
+ if (parsed === undefined) {
173
+ return undefined;
174
+ }
175
+ const number = Number.parseInt(parsed, 10);
176
+ if (!Number.isFinite(number) || number < 0) {
177
+ throw new Error(`${parsed} is not a non-negative integer.`);
178
+ }
179
+ return number;
180
+ }
181
+ async function configuredAdapters(values, deps) {
182
+ const configs = await loadAdapterConfigsFromFile(optionalString(values.adapters));
183
+ return createConfiguredAdapters(configs, deps.adapterFactoryDeps ?? {});
184
+ }
185
+ function safeErrorMessage(error) {
186
+ if (error instanceof Error) {
187
+ return redactSecrets(error.message);
188
+ }
189
+ return "Unexpected Conductor CLI error.";
190
+ }
191
+ function usage() {
192
+ return [
193
+ "Usage:",
194
+ " pnpm dev pair --api <url> --code <SC-code> [--display-name <name>] [--config <path>] [--adapters <path>]",
195
+ " pnpm dev run [--api <url>] [--once] [--config <path>] [--adapters <path>]",
196
+ " pnpm dev doctor [--adapters <path>]",
197
+ " pnpm dev status [--config <path>]",
198
+ " pnpm dev logout [--config <path>]",
199
+ " pnpm dev --version",
200
+ ].join("\n");
201
+ }
202
+ if (isMainModule(import.meta.url, process.argv[1])) {
203
+ const exitCode = await runCli();
204
+ process.exitCode = exitCode;
205
+ }
206
+ export function isMainModule(moduleUrl, entryPath) {
207
+ if (entryPath === undefined || entryPath.length === 0)
208
+ return false;
209
+ try {
210
+ return realpathSync(fileURLToPath(moduleUrl)) === realpathSync(entryPath);
211
+ }
212
+ catch {
213
+ return false;
214
+ }
215
+ }
216
+ //# sourceMappingURL=cli.js.map