@codetreker/daynight 0.25.2 → 0.26.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 (181) hide show
  1. package/README.md +116 -8
  2. package/config.example.yml +3 -0
  3. package/dist/api/client.js +2 -2
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/api/parse.js +14 -2
  6. package/dist/api/parse.js.map +1 -1
  7. package/dist/api/types.d.ts +4 -1
  8. package/dist/api/worker-mode.d.ts +6 -0
  9. package/dist/api/worker-mode.js +14 -0
  10. package/dist/api/worker-mode.js.map +1 -0
  11. package/dist/cli/commands.js +2 -0
  12. package/dist/cli/commands.js.map +1 -1
  13. package/dist/commands/controller/command-controls.d.ts +4 -0
  14. package/dist/commands/controller/command-controls.js +33 -0
  15. package/dist/commands/controller/command-controls.js.map +1 -0
  16. package/dist/commands/controller/definition.d.ts +3 -0
  17. package/dist/commands/controller/definition.js +22 -0
  18. package/dist/commands/controller/definition.js.map +1 -0
  19. package/dist/commands/controller/independent.d.ts +3 -0
  20. package/dist/commands/controller/independent.js +344 -0
  21. package/dist/commands/controller/independent.js.map +1 -0
  22. package/dist/commands/controller/index.d.ts +12 -0
  23. package/dist/commands/controller/index.js +73 -0
  24. package/dist/commands/controller/index.js.map +1 -0
  25. package/dist/commands/controller/launch-ticket.d.ts +49 -0
  26. package/dist/commands/controller/launch-ticket.js +99 -0
  27. package/dist/commands/controller/launch-ticket.js.map +1 -0
  28. package/dist/commands/controller/lifecycle-store.d.ts +84 -0
  29. package/dist/commands/controller/lifecycle-store.js +278 -0
  30. package/dist/commands/controller/lifecycle-store.js.map +1 -0
  31. package/dist/commands/controller/local-client.d.ts +44 -0
  32. package/dist/commands/controller/local-client.js +75 -0
  33. package/dist/commands/controller/local-client.js.map +1 -0
  34. package/dist/commands/controller/local-content.d.ts +23 -0
  35. package/dist/commands/controller/local-content.js +103 -0
  36. package/dist/commands/controller/local-content.js.map +1 -0
  37. package/dist/commands/controller/process-proof.d.ts +13 -0
  38. package/dist/commands/controller/process-proof.js +121 -0
  39. package/dist/commands/controller/process-proof.js.map +1 -0
  40. package/dist/commands/controller/providers/claude.d.ts +2 -0
  41. package/dist/commands/controller/providers/claude.js +470 -0
  42. package/dist/commands/controller/providers/claude.js.map +1 -0
  43. package/dist/commands/controller/providers/codex.d.ts +2 -0
  44. package/dist/commands/controller/providers/codex.js +254 -0
  45. package/dist/commands/controller/providers/codex.js.map +1 -0
  46. package/dist/commands/controller/providers/controls-claude.d.ts +26 -0
  47. package/dist/commands/controller/providers/controls-claude.js +138 -0
  48. package/dist/commands/controller/providers/controls-claude.js.map +1 -0
  49. package/dist/commands/controller/providers/controls-codex.d.ts +38 -0
  50. package/dist/commands/controller/providers/controls-codex.js +199 -0
  51. package/dist/commands/controller/providers/controls-codex.js.map +1 -0
  52. package/dist/commands/controller/providers/controls-copilot.d.ts +20 -0
  53. package/dist/commands/controller/providers/controls-copilot.js +143 -0
  54. package/dist/commands/controller/providers/controls-copilot.js.map +1 -0
  55. package/dist/commands/controller/providers/controls.d.ts +21 -0
  56. package/dist/commands/controller/providers/controls.js +53 -0
  57. package/dist/commands/controller/providers/controls.js.map +1 -0
  58. package/dist/commands/controller/providers/copilot-interactions.d.ts +47 -0
  59. package/dist/commands/controller/providers/copilot-interactions.js +295 -0
  60. package/dist/commands/controller/providers/copilot-interactions.js.map +1 -0
  61. package/dist/commands/controller/providers/copilot-projection.d.ts +11 -0
  62. package/dist/commands/controller/providers/copilot-projection.js +93 -0
  63. package/dist/commands/controller/providers/copilot-projection.js.map +1 -0
  64. package/dist/commands/controller/providers/copilot-runtime.d.ts +9 -0
  65. package/dist/commands/controller/providers/copilot-runtime.js +127 -0
  66. package/dist/commands/controller/providers/copilot-runtime.js.map +1 -0
  67. package/dist/commands/controller/providers/copilot.d.ts +2 -0
  68. package/dist/commands/controller/providers/copilot.js +309 -0
  69. package/dist/commands/controller/providers/copilot.js.map +1 -0
  70. package/dist/commands/controller/providers/interactions.d.ts +3 -0
  71. package/dist/commands/controller/providers/interactions.js +79 -0
  72. package/dist/commands/controller/providers/interactions.js.map +1 -0
  73. package/dist/commands/controller/providers/native-rpc.d.ts +28 -0
  74. package/dist/commands/controller/providers/native-rpc.js +85 -0
  75. package/dist/commands/controller/providers/native-rpc.js.map +1 -0
  76. package/dist/commands/controller/providers/projection.d.ts +23 -0
  77. package/dist/commands/controller/providers/projection.js +99 -0
  78. package/dist/commands/controller/providers/projection.js.map +1 -0
  79. package/dist/commands/controller/providers/turns.d.ts +7 -0
  80. package/dist/commands/controller/providers/turns.js +21 -0
  81. package/dist/commands/controller/providers/turns.js.map +1 -0
  82. package/dist/commands/controller/providers/types.d.ts +44 -0
  83. package/dist/commands/controller/providers/types.js +2 -0
  84. package/dist/commands/controller/providers/types.js.map +1 -0
  85. package/dist/commands/controller/recovery.d.ts +6 -0
  86. package/dist/commands/controller/recovery.js +22 -0
  87. package/dist/commands/controller/recovery.js.map +1 -0
  88. package/dist/commands/controller/relay.d.ts +18 -0
  89. package/dist/commands/controller/relay.js +299 -0
  90. package/dist/commands/controller/relay.js.map +1 -0
  91. package/dist/commands/controller/resume.d.ts +18 -0
  92. package/dist/commands/controller/resume.js +193 -0
  93. package/dist/commands/controller/resume.js.map +1 -0
  94. package/dist/commands/controller/runtime.d.ts +5 -0
  95. package/dist/commands/controller/runtime.js +455 -0
  96. package/dist/commands/controller/runtime.js.map +1 -0
  97. package/dist/commands/controller/windows-job.d.ts +3 -0
  98. package/dist/commands/controller/windows-job.js +59 -0
  99. package/dist/commands/controller/windows-job.js.map +1 -0
  100. package/dist/commands/controller/wire-display.d.ts +5 -0
  101. package/dist/commands/controller/wire-display.js +11 -0
  102. package/dist/commands/controller/wire-display.js.map +1 -0
  103. package/dist/commands/skill/skills/using-daynight/SKILL.md +24 -20
  104. package/dist/commands/skill/skills/using-daynight/references/autopilot-managed-task.md +16 -10
  105. package/dist/commands/skill/skills/using-daynight/references/create-task.md +40 -39
  106. package/dist/commands/skill/skills/using-daynight/references/goal.md +40 -29
  107. package/dist/commands/skill/skills/using-daynight/references/handbook.md +4 -3
  108. package/dist/commands/skill/skills/using-daynight/references/handoff.md +3 -0
  109. package/dist/commands/skill/skills/using-daynight/references/run-task.md +3 -3
  110. package/dist/commands/skill/skills/using-daynight/references/task-content.md +96 -51
  111. package/dist/commands/skill/skills/using-daynight/references/task-execution.md +28 -22
  112. package/dist/commands/worker/backend.d.ts +7 -0
  113. package/dist/commands/worker/backend.js +7 -0
  114. package/dist/commands/worker/backend.js.map +1 -0
  115. package/dist/commands/worker/backends/grant-renewal.d.ts +13 -0
  116. package/dist/commands/worker/backends/grant-renewal.js +42 -0
  117. package/dist/commands/worker/backends/grant-renewal.js.map +1 -0
  118. package/dist/commands/worker/backends/session-api.d.ts +66 -0
  119. package/dist/commands/worker/backends/session-api.js +84 -0
  120. package/dist/commands/worker/backends/session-api.js.map +1 -0
  121. package/dist/commands/worker/backends/web-process.d.ts +79 -0
  122. package/dist/commands/worker/backends/web-process.js +156 -0
  123. package/dist/commands/worker/backends/web-process.js.map +1 -0
  124. package/dist/commands/worker/backends/web-store.d.ts +49 -0
  125. package/dist/commands/worker/backends/web-store.js +323 -0
  126. package/dist/commands/worker/backends/web-store.js.map +1 -0
  127. package/dist/commands/worker/backends/web-types.d.ts +83 -0
  128. package/dist/commands/worker/backends/web-types.js +3 -0
  129. package/dist/commands/worker/backends/web-types.js.map +1 -0
  130. package/dist/commands/worker/backends/web.d.ts +26 -0
  131. package/dist/commands/worker/backends/web.js +178 -0
  132. package/dist/commands/worker/backends/web.js.map +1 -0
  133. package/dist/commands/worker/config.js +12 -5
  134. package/dist/commands/worker/config.js.map +1 -1
  135. package/dist/commands/worker/control.d.ts +2 -0
  136. package/dist/commands/worker/control.js +11 -4
  137. package/dist/commands/worker/control.js.map +1 -1
  138. package/dist/commands/worker/coordinator.d.ts +7 -0
  139. package/dist/commands/worker/coordinator.js +138 -19
  140. package/dist/commands/worker/coordinator.js.map +1 -1
  141. package/dist/commands/worker/herdr/agents.js +11 -8
  142. package/dist/commands/worker/herdr/agents.js.map +1 -1
  143. package/dist/commands/worker/herdr/arguments.js +10 -5
  144. package/dist/commands/worker/herdr/arguments.js.map +1 -1
  145. package/dist/commands/worker/herdr/claude-input.d.ts +2 -0
  146. package/dist/commands/worker/herdr/claude-input.js +20 -0
  147. package/dist/commands/worker/herdr/claude-input.js.map +1 -0
  148. package/dist/commands/worker/herdr/instance.js +1 -1
  149. package/dist/commands/worker/herdr/instance.js.map +1 -1
  150. package/dist/commands/worker/herdr/preflight.d.ts +1 -1
  151. package/dist/commands/worker/herdr/preflight.js +31 -10
  152. package/dist/commands/worker/herdr/preflight.js.map +1 -1
  153. package/dist/commands/worker/herdr.js +5 -1
  154. package/dist/commands/worker/herdr.js.map +1 -1
  155. package/dist/commands/worker/prompts.js +5 -1
  156. package/dist/commands/worker/prompts.js.map +1 -1
  157. package/dist/commands/worker/repositories.js +2 -2
  158. package/dist/commands/worker/repositories.js.map +1 -1
  159. package/dist/commands/worker/runtime.js +62 -10
  160. package/dist/commands/worker/runtime.js.map +1 -1
  161. package/dist/commands/worker/setup-environment.d.ts +2 -1
  162. package/dist/commands/worker/setup-environment.js +10 -4
  163. package/dist/commands/worker/setup-environment.js.map +1 -1
  164. package/dist/commands/worker/setup.js +5 -5
  165. package/dist/commands/worker/setup.js.map +1 -1
  166. package/dist/commands/worker/store.d.ts +2 -1
  167. package/dist/commands/worker/store.js +19 -9
  168. package/dist/commands/worker/store.js.map +1 -1
  169. package/dist/commands/worker/types.d.ts +4 -1
  170. package/dist/commands/worker/worktrees.js +9 -6
  171. package/dist/commands/worker/worktrees.js.map +1 -1
  172. package/dist/session/controller-protocol.d.ts +245 -0
  173. package/dist/session/controller-protocol.js +218 -0
  174. package/dist/session/controller-protocol.js.map +1 -0
  175. package/dist/session/controls.d.ts +28 -0
  176. package/dist/session/controls.js +37 -0
  177. package/dist/session/controls.js.map +1 -0
  178. package/dist/session/protocol.d.ts +290 -0
  179. package/dist/session/protocol.js +307 -0
  180. package/dist/session/protocol.js.map +1 -0
  181. package/package.json +7 -2
@@ -0,0 +1,75 @@
1
+ import { sessionBinding, sessionBindingKeys } from "../../session/protocol.js";
2
+ import { randomUUID, timingSafeEqual } from "node:crypto";
3
+ import { createConnection } from "node:net";
4
+ export const validateControllerLocalRequest = (value, ticket) => {
5
+ if (typeof value !== "object" || value === null)
6
+ throw new Error("Invalid controller IPC request.");
7
+ const data = value;
8
+ if (Object.keys(data).sort().join() !== ["requestId", "executionId", ...sessionBindingKeys(ticket), "executionGeneration", "controllerInstanceId", "secret", "action"].sort().join() || typeof data.secret !== "string" || data.secret.length !== ticket.ipcSecret.length || !timingSafeEqual(Buffer.from(data.secret), Buffer.from(ticket.ipcSecret)) || data.executionId !== ticket.executionId || data.claimId !== ticket.claimId || data.testExecutionId !== ticket.testExecutionId || data.executionGeneration !== ticket.executionGeneration || data.controllerInstanceId !== ticket.controllerInstanceId || typeof data.requestId !== "string" || !/^[a-f0-9-]{36}$/.test(data.requestId))
9
+ throw new Error("Controller IPC authentication or identity mismatch.");
10
+ const action = data.action;
11
+ if (typeof action !== "object" || action === null || !["observe", "submit_initial", "cleanup", "stop"].includes(String(action.kind)))
12
+ throw new Error("Unsupported controller IPC action.");
13
+ const keys = action.kind === "observe" ? ["kind"] : action.kind === "submit_initial" ? ["kind", "operationId"] : action.kind === "stop" ? ["kind", "deadline"] : ["kind", "operationId", "prompt", "deadline"];
14
+ if (Object.keys(action).sort().join() !== keys.sort().join())
15
+ throw new Error("Controller IPC action has invalid fields.");
16
+ if (action.kind === "submit_initial" && (ticket.initialInput === "none" || action.operationId !== ticket.initialOperationId))
17
+ throw new Error("Controller initial operation identity mismatch.");
18
+ if ((action.kind === "cleanup" || action.kind === "submit_initial") && (typeof action.operationId !== "string" || !/^[a-f0-9-]{36}$/.test(action.operationId)))
19
+ throw new Error("Controller operation identity is invalid.");
20
+ if (action.kind === "cleanup" && (typeof action.prompt !== "string" || action.prompt.trim() === "" || Buffer.byteLength(action.prompt) > 4 * 1024 * 1024))
21
+ throw new Error("Controller cleanup prompt is invalid.");
22
+ if ((action.kind === "stop" || action.kind === "cleanup") && (typeof action.deadline !== "number" || !Number.isSafeInteger(action.deadline) || action.deadline < 0))
23
+ throw new Error("Controller deadline is invalid.");
24
+ return value;
25
+ };
26
+ // A missing transport response cannot establish whether an authenticated action
27
+ // reached the controller. Callers may observe its journal, but must not replay it.
28
+ export class ControllerIpcOutcomeUnknownError extends Error {
29
+ }
30
+ export const requestController = (ticket, action, options = {}) => new Promise((resolve, reject) => {
31
+ const request = { requestId: randomUUID(), executionId: ticket.executionId, ...sessionBinding(ticket), executionGeneration: ticket.executionGeneration, controllerInstanceId: ticket.controllerInstanceId, secret: ticket.ipcSecret, action };
32
+ validateControllerLocalRequest(request, ticket);
33
+ const socket = createConnection(ticket.ipcEndpoint);
34
+ let text = "";
35
+ let settled = false;
36
+ const finish = (error, result) => { if (settled)
37
+ return; settled = true; clearTimeout(timer); options.signal?.removeEventListener("abort", cancel); socket.destroy(); if (error !== undefined)
38
+ reject(error);
39
+ else
40
+ resolve(result); };
41
+ const cancel = () => finish(options.signal?.reason ?? new Error("Controller IPC cancelled."));
42
+ const timer = setTimeout(() => finish(new ControllerIpcOutcomeUnknownError("Controller IPC outcome is unknown after its deadline.")), options.timeoutMs ?? 10000);
43
+ socket.setEncoding("utf8");
44
+ socket.once("error", cause => finish(new ControllerIpcOutcomeUnknownError("Controller IPC transport failed; outcome is unknown.", { cause })));
45
+ socket.once("end", () => { if (!settled)
46
+ finish(new ControllerIpcOutcomeUnknownError("Controller IPC closed before its response; outcome is unknown.")); });
47
+ socket.once("connect", () => socket.write(`${JSON.stringify(request)}\n`));
48
+ socket.on("data", (chunk) => {
49
+ text += chunk;
50
+ if (Buffer.byteLength(text) > 8 * 1024 * 1024) {
51
+ finish(new Error("Controller IPC response exceeds its limit."));
52
+ return;
53
+ }
54
+ const newline = text.indexOf("\n");
55
+ if (newline < 0)
56
+ return;
57
+ try {
58
+ const response = JSON.parse(text.slice(0, newline));
59
+ if (response.requestId !== request.requestId || (response.ok !== true && response.ok !== false))
60
+ throw new Error("Controller IPC response identity mismatch.");
61
+ if (!response.ok)
62
+ throw new Error(response.error);
63
+ if (response.snapshot.executionId !== ticket.executionId || response.snapshot.claimId !== ticket.claimId || response.snapshot.testExecutionId !== ticket.testExecutionId || response.snapshot.executionGeneration !== ticket.executionGeneration || response.snapshot.controllerInstanceId !== ticket.controllerInstanceId)
64
+ throw new Error("Controller IPC snapshot fence mismatch.");
65
+ finish(undefined, response);
66
+ }
67
+ catch (error) {
68
+ finish(error);
69
+ }
70
+ });
71
+ options.signal?.addEventListener("abort", cancel, { once: true });
72
+ if (options.signal?.aborted)
73
+ cancel();
74
+ });
75
+ //# sourceMappingURL=local-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-client.js","sourceRoot":"","sources":["../../../src/commands/controller/local-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type Database from "better-sqlite3";
2
+ import { type TimelineEntry, type SessionResource } from "../../session/protocol.js";
3
+ import type { TimelinePage } from "../../session/controller-protocol.js";
4
+ export type LocalTimelineQuery = {
5
+ historyEpoch: string;
6
+ direction: "tail" | "before" | "after";
7
+ cursor: string | null;
8
+ limit: number;
9
+ };
10
+ export declare const createLocalSessionContent: (db: Database.Database, sessionId: string) => {
11
+ readTimeline(query: LocalTimelineQuery): Omit<TimelinePage, "sessionId" | "lastEventSeq"> & {
12
+ kind: "timeline";
13
+ };
14
+ pendingInteractions(): TimelineEntry[];
15
+ saveResource(resource: SessionResource, content?: Uint8Array): void;
16
+ readResource(resourceId: string, offset: string, limit: number): {
17
+ kind: "resource";
18
+ resource: SessionResource;
19
+ offset: string;
20
+ data: string;
21
+ eof: boolean;
22
+ };
23
+ };
@@ -0,0 +1,103 @@
1
+ import { sessionDisplayEntry, sessionWireBytes } from "./wire-display.js";
2
+ import { createHash } from "node:crypto";
3
+ import { parseTimelineEntry, parseSessionResource } from "../../session/protocol.js";
4
+ const sequence = (value) => {
5
+ if (!/^(0|[1-9][0-9]{0,18})$/.test(value) || BigInt(value) > 9223372036854775807n)
6
+ throw new Error("Invalid local content sequence.");
7
+ return BigInt(value);
8
+ };
9
+ export const createLocalSessionContent = (db, sessionId) => {
10
+ const resourcesFor = (items) => {
11
+ const ids = new Set();
12
+ for (const item of items) {
13
+ const parts = item.kind === "tool_call" ? item.output : item.kind === "user_message" || item.kind === "assistant_message" ? item.content : [];
14
+ for (const part of parts)
15
+ if (part.type === "resource")
16
+ ids.add(part.resourceId);
17
+ }
18
+ return [...ids].flatMap(id => {
19
+ const row = db.prepare("SELECT descriptor FROM resources WHERE id=?").get(id);
20
+ return row ? [parseSessionResource(JSON.parse(row.descriptor))] : [];
21
+ });
22
+ };
23
+ return {
24
+ readTimeline(query) {
25
+ if (!Number.isSafeInteger(query.limit) || query.limit < 1 || query.limit > 200 || !["tail", "before", "after"].includes(query.direction))
26
+ throw new Error("Invalid local timeline page.");
27
+ let pivot = 0n;
28
+ if (query.direction === "tail") {
29
+ if (query.cursor !== null)
30
+ throw new Error("Tail must not contain a cursor.");
31
+ }
32
+ else {
33
+ if (!query.cursor || query.cursor.length > 256 || !/^[A-Za-z0-9_-]+$/.test(query.cursor))
34
+ throw new Error("Invalid local timeline cursor.");
35
+ try {
36
+ const values = JSON.parse(Buffer.from(query.cursor, "base64url").toString("utf8"));
37
+ if (!Array.isArray(values) || values.length !== 3 || values[0] !== sessionId || values[1] !== query.historyEpoch || typeof values[2] !== "string")
38
+ throw new Error();
39
+ pivot = sequence(values[2]);
40
+ }
41
+ catch {
42
+ throw new Error("Invalid local timeline cursor.");
43
+ }
44
+ }
45
+ const where = query.direction === "tail" ? "" : query.direction === "before" ? "WHERE rowid < ?" : "WHERE rowid > ?";
46
+ const ascending = query.direction === "after";
47
+ const rows = db.prepare(`SELECT CAST(rowid AS TEXT) AS seq, value FROM projection ${where} ORDER BY rowid ${ascending ? "ASC" : "DESC"} LIMIT ?`).all(...(query.direction === "tail" ? [query.limit] : [pivot, query.limit]));
48
+ const items = [];
49
+ // Leave room for the envelope and resource descriptors in the WS frame.
50
+ let bytes = 1024;
51
+ for (const row of rows) {
52
+ const entry = sessionDisplayEntry(parseTimelineEntry({ ...JSON.parse(row.value), entrySeq: row.seq }));
53
+ const size = sessionWireBytes(entry) + sessionWireBytes(resourcesFor([entry]));
54
+ if (bytes + size > 1_500_000) {
55
+ if (!items.length)
56
+ throw new Error("Local timeline entry exceeds the relay frame limit.");
57
+ break;
58
+ }
59
+ items.push(entry);
60
+ bytes += size;
61
+ }
62
+ if (!ascending)
63
+ items.reverse();
64
+ const first = items[0]?.entrySeq, last = items.at(-1)?.entrySeq;
65
+ const cursor = (seq) => seq === undefined ? null : Buffer.from(JSON.stringify([sessionId, query.historyEpoch, seq])).toString("base64url");
66
+ const hasBefore = first !== undefined && db.prepare("SELECT 1 FROM projection WHERE rowid < ? LIMIT 1").get(sequence(first)) !== undefined;
67
+ const hasAfter = last !== undefined && db.prepare("SELECT 1 FROM projection WHERE rowid > ? LIMIT 1").get(sequence(last)) !== undefined;
68
+ return { kind: "timeline", historyEpoch: query.historyEpoch, items, resources: resourcesFor(items), beforeCursor: cursor(first), afterCursor: cursor(last), hasMoreBefore: hasBefore, hasMoreAfter: hasAfter };
69
+ },
70
+ pendingInteractions() {
71
+ const rows = db.prepare("SELECT CAST(rowid AS TEXT) AS seq,value FROM projection WHERE json_extract(value,'$.kind')='interaction' AND json_extract(value,'$.interaction.state')='pending' ORDER BY rowid LIMIT 101").all();
72
+ if (rows.length > 100)
73
+ throw new Error("Too many pending native interactions to synchronize safely.");
74
+ return rows.map(row => parseTimelineEntry({ ...JSON.parse(row.value), entrySeq: row.seq }));
75
+ },
76
+ saveResource(resource, content) {
77
+ parseSessionResource(resource);
78
+ if (content && (content.byteLength > 8_388_608 || String(content.byteLength) !== resource.byteLength || createHash("sha256").update(content).digest("hex") !== resource.sha256))
79
+ throw new Error("Local session resource content does not match its descriptor.");
80
+ const previous = db.prepare("SELECT descriptor FROM resources WHERE id=?").get(resource.resourceId);
81
+ if (previous) {
82
+ const old = parseSessionResource(JSON.parse(previous.descriptor));
83
+ if (old.status === "available" && JSON.stringify(old) !== JSON.stringify(resource))
84
+ throw new Error("An available local resource cannot change identity.");
85
+ }
86
+ db.prepare("INSERT INTO resources(id,descriptor,content) VALUES(?,?,?) ON CONFLICT(id) DO UPDATE SET descriptor=excluded.descriptor,content=COALESCE(excluded.content,resources.content)").run(resource.resourceId, JSON.stringify(resource), content ? Buffer.from(content) : null);
87
+ },
88
+ readResource(resourceId, offset, limit) {
89
+ const position = sequence(offset);
90
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > 524288)
91
+ throw new Error("Invalid local resource chunk limit.");
92
+ const row = db.prepare("SELECT descriptor,content FROM resources WHERE id=?").get(resourceId);
93
+ if (!row?.content)
94
+ throw new Error("Local session resource is unavailable.");
95
+ const resource = parseSessionResource(JSON.parse(row.descriptor));
96
+ if (resource.status !== "available" || position > BigInt(row.content.length))
97
+ throw new Error("Local session resource is unavailable.");
98
+ const end = Math.min(Number(position) + limit, row.content.length);
99
+ return { kind: "resource", resource, offset, data: row.content.subarray(Number(position), end).toString("base64"), eof: end === row.content.length };
100
+ },
101
+ };
102
+ };
103
+ //# sourceMappingURL=local-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-content.js","sourceRoot":"","sources":["../../../src/commands/controller/local-content.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export type ProcessProof = {
2
+ readonly pid: number;
3
+ readonly parentPid: number;
4
+ readonly processGroupId: number | null;
5
+ readonly startedAt: string;
6
+ readonly commandHash: string;
7
+ readonly jobObjectName?: string;
8
+ };
9
+ export declare const captureProcessProof: (pid: number) => Promise<ProcessProof>;
10
+ export declare const captureControllerProcessProof: (launchId: string) => Promise<ProcessProof>;
11
+ export declare const inspectProcessProof: (proof: ProcessProof) => Promise<"running" | "stopped" | "replaced">;
12
+ export declare const confirmControllerProcessesStopped: (controller: ProcessProof, native: readonly ProcessProof[]) => Promise<boolean>;
13
+ export declare const stopControllerProcesses: (controller: ProcessProof, native: readonly ProcessProof[], deadline: number) => Promise<void>;
@@ -0,0 +1,121 @@
1
+ import { createControllerJob, inspectControllerJob } from "./windows-job.js";
2
+ import { execFile } from "node:child_process";
3
+ import { createHash } from "node:crypto";
4
+ // ps localizes lstart, so identity probes need a stable locale. Keep the
5
+ // Controller and native provider environments unchanged.
6
+ const run = (file, args) => new Promise((resolve, reject) => execFile(file, args, { encoding: "utf8", timeout: 5000, maxBuffer: 8 * 1024 * 1024, windowsHide: true, ...(file === "ps" ? { env: { ...process.env, LC_ALL: "C" } } : {}) }, (error, stdout) => error === null ? resolve(stdout) : reject(error)));
7
+ const hash = (value) => createHash("sha256").update(value).digest("hex");
8
+ const validPid = (pid) => { if (!Number.isSafeInteger(pid) || pid <= 0 || pid > 2_147_483_647)
9
+ throw new Error("Invalid process identity."); };
10
+ export const captureProcessProof = async (pid) => {
11
+ validPid(pid);
12
+ if (process.platform === "win32") {
13
+ const output = await run("powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", `Get-CimInstance Win32_Process -Filter 'ProcessId = ${pid}' | Select-Object ProcessId,ParentProcessId,@{Name='Birth';Expression={$_.CreationDate.ToUniversalTime().ToString('o')}},CommandLine | ConvertTo-Json -Compress`]);
14
+ const value = JSON.parse(output);
15
+ if (value.ProcessId !== pid || typeof value.Birth !== "string" || typeof value.CommandLine !== "string")
16
+ throw new Error("Process identity cannot be established.");
17
+ return { pid, parentPid: value.ParentProcessId, processGroupId: null, startedAt: value.Birth, commandHash: hash(value.CommandLine) };
18
+ }
19
+ const output = await run("ps", ["-p", String(pid), "-o", "pid=", "-o", "ppid=", "-o", "pgid=", "-o", "lstart=", "-o", "command="]);
20
+ const match = /^\s*(\d+)\s+(\d+)\s+(\d+)\s+(\S+\s+\S+\s+\d+\s+\d+:\d+:\d+\s+\d+)\s+([^\n]+)\s*$/u.exec(output);
21
+ if (match === null || Number(match[1]) !== pid)
22
+ throw new Error("Process identity cannot be established.");
23
+ return { pid, parentPid: Number(match[2]), processGroupId: Number(match[3]), startedAt: match[4].replace(/\s+/g, " "), commandHash: hash(match[5].trim()) };
24
+ };
25
+ export const captureControllerProcessProof = async (launchId) => {
26
+ const proof = await captureProcessProof(process.pid);
27
+ return process.platform === "win32" ? { ...proof, jobObjectName: await createControllerJob(launchId, process.pid) } : proof;
28
+ };
29
+ export const inspectProcessProof = async (proof) => {
30
+ validPid(proof.pid);
31
+ try {
32
+ process.kill(proof.pid, 0);
33
+ }
34
+ catch (error) {
35
+ if (error instanceof Error && "code" in error && error.code === "ESRCH")
36
+ return "stopped";
37
+ throw new Error("Process liveness could not be established.", { cause: error });
38
+ }
39
+ let current;
40
+ try {
41
+ current = await captureProcessProof(proof.pid);
42
+ }
43
+ catch (error) {
44
+ try {
45
+ process.kill(proof.pid, 0);
46
+ }
47
+ catch (missing) {
48
+ if (missing instanceof Error && "code" in missing && missing.code === "ESRCH")
49
+ return "stopped";
50
+ }
51
+ throw error;
52
+ }
53
+ return current.startedAt === proof.startedAt && current.commandHash === proof.commandHash && current.processGroupId === proof.processGroupId ? "running" : "replaced";
54
+ };
55
+ const groupMembers = async (group) => {
56
+ const rows = await run("ps", ["-A", "-o", "pid=", "-o", "pgid=", "-o", "stat="]);
57
+ const result = [];
58
+ for (const row of rows.split("\n")) {
59
+ if (row.trim() === "")
60
+ continue;
61
+ const match = /^\s*(\d+)\s+(\d+)\s+(\S+)\s*$/.exec(row);
62
+ if (match === null)
63
+ throw new Error("Cannot interpret process group inventory.");
64
+ if (Number(match[2]) === group && !match[3].startsWith("Z"))
65
+ result.push(Number(match[1]));
66
+ }
67
+ return result;
68
+ };
69
+ export const confirmControllerProcessesStopped = async (controller, native) => {
70
+ for (const proof of [controller, ...native])
71
+ if (await inspectProcessProof(proof) === "running")
72
+ return false;
73
+ if (process.platform === "win32") {
74
+ if (controller.jobObjectName === undefined)
75
+ throw new Error("The original Windows controller has no Job Object boundary; its descendants cannot be inferred stopped.");
76
+ return (await inspectControllerJob(controller.jobObjectName)).length === 0;
77
+ }
78
+ if (controller.processGroupId !== controller.pid)
79
+ throw new Error("Controller was not launched in its own process group.");
80
+ return (await groupMembers(controller.pid)).length === 0;
81
+ };
82
+ export const stopControllerProcesses = async (controller, native, deadline) => {
83
+ if (process.platform === "win32") {
84
+ if (controller.jobObjectName === undefined)
85
+ throw new Error("The original Windows controller has no Job Object boundary; cleanup retains its unknown descendants.");
86
+ await inspectControllerJob(controller.jobObjectName, true);
87
+ while (Date.now() < deadline && (await inspectControllerJob(controller.jobObjectName)).length > 0)
88
+ await new Promise(resolve => setTimeout(resolve, 25));
89
+ if (!await confirmControllerProcessesStopped(controller, native))
90
+ throw new Error("The original Windows Job Object did not stop completely.");
91
+ return;
92
+ }
93
+ if (controller.processGroupId !== controller.pid)
94
+ throw new Error("Refusing a process group not owned by the original controller.");
95
+ if ((await groupMembers(controller.pid)).length === 0)
96
+ return;
97
+ let attributable = false;
98
+ for (const proof of [controller, ...native])
99
+ if (proof.processGroupId === controller.pid && await inspectProcessProof(proof) === "running")
100
+ attributable = true;
101
+ if (!attributable)
102
+ throw new Error("The remaining process group has no original process-instance proof; resources are retained.");
103
+ const signal = (value) => { try {
104
+ process.kill(-controller.pid, value);
105
+ }
106
+ catch (error) {
107
+ if (!(error instanceof Error && "code" in error && error.code === "ESRCH"))
108
+ throw error;
109
+ } };
110
+ signal("SIGTERM");
111
+ const graceful = Math.min(deadline, Date.now() + 2000);
112
+ while (Date.now() < graceful && (await groupMembers(controller.pid)).length > 0)
113
+ await new Promise((resolve) => setTimeout(resolve, 25));
114
+ if ((await groupMembers(controller.pid)).length > 0)
115
+ signal("SIGKILL");
116
+ while (Date.now() < deadline && (await groupMembers(controller.pid)).length > 0)
117
+ await new Promise((resolve) => setTimeout(resolve, 25));
118
+ if ((await groupMembers(controller.pid)).length > 0)
119
+ throw new Error("Original controller process group did not stop by its deadline.");
120
+ };
121
+ //# sourceMappingURL=process-proof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-proof.js","sourceRoot":"","sources":["../../../src/commands/controller/process-proof.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { NativeProvider, ProviderOptions } from "./types.js";
2
+ export declare const openClaudeProvider: (options: ProviderOptions) => Promise<NativeProvider>;