@codetreker/daynight 0.29.0 → 0.32.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 (175) hide show
  1. package/README.md +173 -44
  2. package/config.example.yml +10 -3
  3. package/dist/api/index.d.ts +1 -1
  4. package/dist/api/index.js +1 -1
  5. package/dist/api/index.js.map +1 -1
  6. package/dist/api/task-properties.d.ts +1 -0
  7. package/dist/api/task-properties.js +5 -0
  8. package/dist/api/task-properties.js.map +1 -1
  9. package/dist/cli/agent-cli-aliases.d.ts +21 -0
  10. package/dist/cli/agent-cli-aliases.js +57 -0
  11. package/dist/cli/agent-cli-aliases.js.map +1 -0
  12. package/dist/cli/application.js +5 -0
  13. package/dist/cli/application.js.map +1 -1
  14. package/dist/cli/cancellation.d.ts +1 -1
  15. package/dist/cli/cancellation.js.map +1 -1
  16. package/dist/cli/codex-agent-environment.d.ts +5 -0
  17. package/dist/cli/codex-agent-environment.js +28 -0
  18. package/dist/cli/codex-agent-environment.js.map +1 -0
  19. package/dist/cli/commands.js +1 -0
  20. package/dist/cli/commands.js.map +1 -1
  21. package/dist/cli/schema.d.ts +5 -1
  22. package/dist/cli/schema.js.map +1 -1
  23. package/dist/commands/controller/archive-upload.d.ts +9 -0
  24. package/dist/commands/controller/archive-upload.js +137 -0
  25. package/dist/commands/controller/archive-upload.js.map +1 -0
  26. package/dist/commands/controller/definition.d.ts +1 -0
  27. package/dist/commands/controller/definition.js +9 -1
  28. package/dist/commands/controller/definition.js.map +1 -1
  29. package/dist/commands/controller/independent-archive.d.ts +7 -0
  30. package/dist/commands/controller/independent-archive.js +71 -0
  31. package/dist/commands/controller/independent-archive.js.map +1 -0
  32. package/dist/commands/controller/independent.js +51 -25
  33. package/dist/commands/controller/independent.js.map +1 -1
  34. package/dist/commands/controller/index.js +14 -1
  35. package/dist/commands/controller/index.js.map +1 -1
  36. package/dist/commands/controller/journal-format.d.ts +4 -0
  37. package/dist/commands/controller/journal-format.js +66 -0
  38. package/dist/commands/controller/journal-format.js.map +1 -0
  39. package/dist/commands/controller/launch-ticket.js +3 -2
  40. package/dist/commands/controller/launch-ticket.js.map +1 -1
  41. package/dist/commands/controller/lifecycle-store.d.ts +7 -5
  42. package/dist/commands/controller/lifecycle-store.js +132 -91
  43. package/dist/commands/controller/lifecycle-store.js.map +1 -1
  44. package/dist/commands/controller/local-content.d.ts +11 -6
  45. package/dist/commands/controller/local-content.js +29 -21
  46. package/dist/commands/controller/local-content.js.map +1 -1
  47. package/dist/commands/controller/paths.d.ts +2 -0
  48. package/dist/commands/controller/paths.js +34 -0
  49. package/dist/commands/controller/paths.js.map +1 -0
  50. package/dist/commands/controller/pending-content.d.ts +20 -0
  51. package/dist/commands/controller/pending-content.js +159 -0
  52. package/dist/commands/controller/pending-content.js.map +1 -0
  53. package/dist/commands/controller/providers/codex.js +5 -1
  54. package/dist/commands/controller/providers/codex.js.map +1 -1
  55. package/dist/commands/controller/providers/types.d.ts +4 -0
  56. package/dist/commands/controller/resume-lease-format.d.ts +4 -0
  57. package/dist/commands/controller/resume-lease-format.js +35 -0
  58. package/dist/commands/controller/resume-lease-format.js.map +1 -0
  59. package/dist/commands/controller/resume.js +88 -23
  60. package/dist/commands/controller/resume.js.map +1 -1
  61. package/dist/commands/controller/runtime.js +11 -1
  62. package/dist/commands/controller/runtime.js.map +1 -1
  63. package/dist/commands/controller/sqlite/journal/001-baseline.sql +17 -0
  64. package/dist/commands/controller/sqlite/journal/002-projection.sql +8 -0
  65. package/dist/commands/controller/sqlite/journal/003-operation-acknowledgements.sql +1 -0
  66. package/dist/commands/controller/sqlite/journal/004-projection-gap.sql +1 -0
  67. package/dist/commands/controller/sqlite/journal/005-resources.sql +7 -0
  68. package/dist/commands/controller/sqlite/journal/006-pending-content.sql +12 -0
  69. package/dist/commands/controller/sqlite/resume-lease/001-baseline.sql +7 -0
  70. package/dist/commands/project/definition.js +1 -1
  71. package/dist/commands/project/definition.js.map +1 -1
  72. package/dist/commands/review/definition.js +3 -3
  73. package/dist/commands/review/definition.js.map +1 -1
  74. package/dist/commands/review/listing.js +1 -1
  75. package/dist/commands/review/listing.js.map +1 -1
  76. package/dist/commands/review/runtime.js +3 -1
  77. package/dist/commands/review/runtime.js.map +1 -1
  78. package/dist/commands/review/sqlite/001-baseline.sql +65 -0
  79. package/dist/commands/review/sqlite/002-publications.sql +15 -0
  80. package/dist/commands/review/store-format.d.ts +2 -0
  81. package/dist/commands/review/store-format.js +35 -0
  82. package/dist/commands/review/store-format.js.map +1 -0
  83. package/dist/commands/review/store.d.ts +8 -1
  84. package/dist/commands/review/store.js +46 -176
  85. package/dist/commands/review/store.js.map +1 -1
  86. package/dist/commands/skill/read.d.ts +2 -0
  87. package/dist/commands/skill/read.js +36 -0
  88. package/dist/commands/skill/read.js.map +1 -0
  89. package/dist/commands/skill/skills/using-daynight/references/authorization.md +1 -0
  90. package/dist/commands/skill/skills/using-daynight/references/autopilot-managed-task.md +19 -7
  91. package/dist/commands/skill/skills/using-daynight/references/goal.md +33 -8
  92. package/dist/commands/skill/skills/using-daynight/references/run-task.md +1 -1
  93. package/dist/commands/skill/skills/using-daynight/references/task-content.md +1 -0
  94. package/dist/commands/skill/usage.md +162 -0
  95. package/dist/commands/task/definition.js +1 -1
  96. package/dist/commands/task/definition.js.map +1 -1
  97. package/dist/commands/worker/backends/sqlite/001-baseline.sql +4 -0
  98. package/dist/commands/worker/backends/web-process.js +11 -11
  99. package/dist/commands/worker/backends/web-process.js.map +1 -1
  100. package/dist/commands/worker/backends/web-record.d.ts +11 -0
  101. package/dist/commands/worker/backends/web-record.js +151 -0
  102. package/dist/commands/worker/backends/web-record.js.map +1 -0
  103. package/dist/commands/worker/backends/web-store-format.d.ts +2 -0
  104. package/dist/commands/worker/backends/web-store-format.js +33 -0
  105. package/dist/commands/worker/backends/web-store-format.js.map +1 -0
  106. package/dist/commands/worker/backends/web-store.d.ts +5 -1
  107. package/dist/commands/worker/backends/web-store.js +44 -170
  108. package/dist/commands/worker/backends/web-store.js.map +1 -1
  109. package/dist/commands/worker/backends/web.d.ts +1 -0
  110. package/dist/commands/worker/backends/web.js +13 -4
  111. package/dist/commands/worker/backends/web.js.map +1 -1
  112. package/dist/commands/worker/cleanup.d.ts +1 -1
  113. package/dist/commands/worker/cleanup.js.map +1 -1
  114. package/dist/commands/worker/coordinator.js +1 -1
  115. package/dist/commands/worker/coordinator.js.map +1 -1
  116. package/dist/commands/worker/definition.js +2 -2
  117. package/dist/commands/worker/definition.js.map +1 -1
  118. package/dist/commands/worker/diagnostics.d.ts +3 -0
  119. package/dist/commands/worker/diagnostics.js +15 -0
  120. package/dist/commands/worker/diagnostics.js.map +1 -1
  121. package/dist/commands/worker/execution.d.ts +2 -0
  122. package/dist/commands/worker/execution.js +17 -4
  123. package/dist/commands/worker/execution.js.map +1 -1
  124. package/dist/commands/worker/herdr/agents.d.ts +9 -1
  125. package/dist/commands/worker/herdr/agents.js +22 -6
  126. package/dist/commands/worker/herdr/agents.js.map +1 -1
  127. package/dist/commands/worker/herdr/arguments.d.ts +4 -0
  128. package/dist/commands/worker/herdr/arguments.js +17 -0
  129. package/dist/commands/worker/herdr/arguments.js.map +1 -1
  130. package/dist/commands/worker/herdr/codex-config.d.ts +8 -0
  131. package/dist/commands/worker/herdr/codex-config.js +75 -0
  132. package/dist/commands/worker/herdr/codex-config.js.map +1 -0
  133. package/dist/commands/worker/herdr/preflight.js +1 -18
  134. package/dist/commands/worker/herdr/preflight.js.map +1 -1
  135. package/dist/commands/worker/herdr.d.ts +6 -2
  136. package/dist/commands/worker/herdr.js +3 -2
  137. package/dist/commands/worker/herdr.js.map +1 -1
  138. package/dist/commands/worker/prompts.js +7 -2
  139. package/dist/commands/worker/prompts.js.map +1 -1
  140. package/dist/commands/worker/runtime.js +68 -7
  141. package/dist/commands/worker/runtime.js.map +1 -1
  142. package/dist/commands/worker/sqlite/005-baseline.sql +18 -0
  143. package/dist/commands/worker/store-format.d.ts +2 -0
  144. package/dist/commands/worker/store-format.js +35 -0
  145. package/dist/commands/worker/store-format.js.map +1 -0
  146. package/dist/commands/worker/store.d.ts +2 -0
  147. package/dist/commands/worker/store.js +36 -69
  148. package/dist/commands/worker/store.js.map +1 -1
  149. package/dist/config/agent-cli-aliases.d.ts +5 -0
  150. package/dist/config/agent-cli-aliases.js +37 -0
  151. package/dist/config/agent-cli-aliases.js.map +1 -0
  152. package/dist/config/paths.d.ts +1 -1
  153. package/dist/config/paths.js +6 -2
  154. package/dist/config/paths.js.map +1 -1
  155. package/dist/platform/diagnostics.js +3 -0
  156. package/dist/platform/diagnostics.js.map +1 -1
  157. package/dist/platform/instance-lock.d.ts +15 -0
  158. package/dist/platform/instance-lock.js +45 -3
  159. package/dist/platform/instance-lock.js.map +1 -1
  160. package/dist/platform/sqlite-access.d.ts +40 -0
  161. package/dist/platform/sqlite-access.js +333 -0
  162. package/dist/platform/sqlite-access.js.map +1 -0
  163. package/dist/platform/sqlite-error.d.ts +39 -0
  164. package/dist/platform/sqlite-error.js +36 -0
  165. package/dist/platform/sqlite-error.js.map +1 -0
  166. package/dist/platform/sqlite-format.d.ts +31 -0
  167. package/dist/platform/sqlite-format.js +98 -0
  168. package/dist/platform/sqlite-format.js.map +1 -0
  169. package/dist/platform/sqlite-sql.d.ts +12 -0
  170. package/dist/platform/sqlite-sql.js +61 -0
  171. package/dist/platform/sqlite-sql.js.map +1 -0
  172. package/dist/session/archive.d.ts +25 -0
  173. package/dist/session/archive.js +100 -0
  174. package/dist/session/archive.js.map +1 -0
  175. package/package.json +3 -3
@@ -0,0 +1,28 @@
1
+ import path from "node:path";
2
+ const object = (value) => typeof value === "object" && value !== null && !Array.isArray(value) ? value : undefined;
3
+ /** Preserve the native configuration's PATH while keeping opted-in aliases first. */
4
+ export const codexAgentCliOverrides = (environment, response) => {
5
+ const config = object(object(response)?.config);
6
+ if (!config)
7
+ throw new Error("Codex did not return its effective configuration; Agent CLI aliases cannot be applied safely.");
8
+ const rawPolicy = config.shell_environment_policy;
9
+ const policy = object(rawPolicy);
10
+ if (rawPolicy != null && !policy)
11
+ throw new Error("Codex returned an invalid shell environment policy.");
12
+ const set = object(policy?.set);
13
+ if (policy?.set != null && !set)
14
+ throw new Error("Codex returned invalid shell environment overrides.");
15
+ const configuredPath = set?.PATH;
16
+ if (configuredPath !== undefined && typeof configuredPath !== "string")
17
+ throw new Error("Codex returned a non-string shell PATH override.");
18
+ // Prepared aliases always put their private directory first. Preserve the
19
+ // configured tail verbatim, including an empty PATH and empty path entries.
20
+ const directory = environment.PATH.split(path.delimiter)[0];
21
+ if (!path.isAbsolute(directory))
22
+ throw new Error("Agent CLI aliases require an absolute private PATH directory.");
23
+ return {
24
+ "shell_environment_policy.set.PATH": configuredPath === undefined ? environment.PATH : `${directory}${path.delimiter}${configuredPath}`,
25
+ ...(environment.DN_CONFIG_DIR === undefined ? {} : { "shell_environment_policy.set.DN_CONFIG_DIR": environment.DN_CONFIG_DIR }),
26
+ };
27
+ };
28
+ //# sourceMappingURL=codex-agent-environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-agent-environment.js","sourceRoot":"","sources":["../../src/cli/codex-agent-environment.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,MAAM,GAAG,CAAC,KAAc,EAAuC,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,SAAS,CAAC;AAE5L,qFAAqF;AACrF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,WAA+D,EAAE,QAAiB,EAA0B,EAAE;IACnJ,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;IAC9H,MAAM,SAAS,GAAG,MAAM,CAAC,wBAAwB,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,SAAS,IAAI,IAAI,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzG,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,IAAI,MAAM,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACxG,MAAM,cAAc,GAAG,GAAG,EAAE,IAAI,CAAC;IACjC,IAAI,cAAc,KAAK,SAAS,IAAI,OAAO,cAAc,KAAK,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IAC5I,0EAA0E;IAC1E,4EAA4E;IAC5E,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,CAAC;IAC7D,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IAClH,OAAO;QACL,mCAAmC,EAAE,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,GAAG,cAAc,EAAE;QACvI,GAAG,CAAC,WAAW,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,4CAA4C,EAAE,WAAW,CAAC,aAAa,EAAE,CAAC;KAChI,CAAC;AACJ,CAAC,CAAC"}
@@ -40,6 +40,7 @@ export const commandTree = {
40
40
  description: "A client command toolkit for development workflows",
41
41
  commands: commands.map(({ load, ...definition }) => definition),
42
42
  options: [
43
+ { names: ["--skill"], description: "Print the bundled CLI usage manual for coding agents", action: "skill" },
43
44
  { names: ["-h", "--help"], description: "Show this help", action: "help" },
44
45
  { names: ["-v", "--version"], description: "Show the installed version", action: "version" },
45
46
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/cli/commands.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ export type CommandOption = {
9
9
  };
10
10
  required?: boolean;
11
11
  repeatable?: boolean;
12
- action?: "help" | "version";
12
+ action?: "help" | "version" | "skill";
13
13
  };
14
14
  export type CommandArgument = {
15
15
  name: string;
@@ -37,6 +37,8 @@ export type CommandSelection = CommandLocation & ({
37
37
  kind: "help";
38
38
  } | {
39
39
  kind: "version";
40
+ } | {
41
+ kind: "skill";
40
42
  } | {
41
43
  kind: "selected";
42
44
  remaining: readonly string[];
@@ -45,6 +47,8 @@ export type ParsedCommand = CommandLocation & ({
45
47
  kind: "help";
46
48
  } | {
47
49
  kind: "version";
50
+ } | {
51
+ kind: "skill";
48
52
  } | {
49
53
  kind: "run";
50
54
  values: readonly string[];
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/cli/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/cli/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type SessionArchiveStatus } from "../../session/archive.js";
2
+ import type { ControllerLaunchTicket } from "./launch-ticket.js";
3
+ export declare const uploadStoppedControllerArchive: (options: {
4
+ journalPath: string;
5
+ ticket: ControllerLaunchTicket;
6
+ serverToken: string;
7
+ request?: typeof fetch;
8
+ signal?: AbortSignal;
9
+ }) => Promise<SessionArchiveStatus>;
@@ -0,0 +1,137 @@
1
+ import Database from "better-sqlite3";
2
+ import { createHash } from "node:crypto";
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ import { sessionBinding } from "../../session/protocol.js";
5
+ import { parseSessionArchive, parseSessionArchiveStatus, verifySessionArchiveResources } from "../../session/archive.js";
6
+ import { assertJournalMigrationAllowed, controllerJournalFormat } from "./journal-format.js";
7
+ import { assertCurrentSqlite, inspectSqlite } from "../../platform/sqlite-format.js";
8
+ import { closeSqliteDatabase, openSqliteDatabase, runSqliteImmediate, sqliteTransactionOutcome } from "../../platform/sqlite-access.js";
9
+ import { SqliteAccessError } from "../../platform/sqlite-error.js";
10
+ import { reconcilePendingContent, openPendingContent, writeDurableJson } from "./pending-content.js";
11
+ const stoppedSnapshot = (db, ticket) => {
12
+ const version = Number(db.pragma("user_version", { simple: true }));
13
+ if (version < 2 || version > 6)
14
+ throw new SqliteAccessError("unsupported-version", { database: controllerJournalFormat.name, file: db.name, phase: "archive-admission", fromVersion: version, toVersion: 6 });
15
+ inspectSqlite(db, controllerJournalFormat);
16
+ const row = db.prepare("SELECT snapshot FROM execution WHERE id=1").get();
17
+ let observed;
18
+ try {
19
+ observed = row === undefined ? null : JSON.parse(row.snapshot);
20
+ }
21
+ catch (cause) {
22
+ throw new SqliteAccessError("invalid-format", { database: controllerJournalFormat.name, file: db.name, phase: "archive-decode" }, { cause });
23
+ }
24
+ if (!observed || !observed.nativeStopped || observed.lifecycle !== "stopped" || observed.sessionId !== ticket.sessionId || observed.executionGeneration !== ticket.executionGeneration || observed.controllerInstanceId !== ticket.controllerInstanceId || observed.executionId !== ticket.executionId || observed.claimId !== ticket.claimId || observed.testExecutionId !== ticket.testExecutionId)
25
+ throw new Error("Session archive requires the original stopped controller generation.");
26
+ return observed;
27
+ };
28
+ const withClosedJournal = (db, action) => {
29
+ let result, failed = false, failure;
30
+ try {
31
+ result = action();
32
+ }
33
+ catch (cause) {
34
+ failed = true;
35
+ failure = cause;
36
+ }
37
+ try {
38
+ closeSqliteDatabase(db, { file: db.name, format: controllerJournalFormat }, failed ? sqliteTransactionOutcome(failure) : "committed");
39
+ }
40
+ catch (close) {
41
+ if (failed)
42
+ throw new AggregateError([failure, close], "Archive journal operation and shutdown failed.");
43
+ throw close;
44
+ }
45
+ if (failed)
46
+ throw failure;
47
+ return result;
48
+ };
49
+ export const uploadStoppedControllerArchive = async (options) => {
50
+ const { ticket, journalPath } = options;
51
+ const fence = { sessionId: ticket.sessionId, ...sessionBinding(ticket), executionGeneration: ticket.executionGeneration, controllerId: ticket.controllerId, controllerInstanceId: ticket.controllerInstanceId };
52
+ const root = ticket.testExecutionId !== undefined ? `/api/v1/test-sessions/${ticket.sessionId}` : `/api/v1/projects/${ticket.projectId}/tasks/${ticket.taskId}/sessions/${ticket.sessionId}`;
53
+ const request = options.request ?? fetch;
54
+ const signal = options.signal ? AbortSignal.any([options.signal, AbortSignal.timeout(30_000)]) : AbortSignal.timeout(30_000);
55
+ const call = async (method, body) => {
56
+ const response = await request(`${ticket.serverOrigin}${root}/archive`, { method, redirect: "error", headers: { Authorization: `Bearer ${options.serverToken}`, ...(body === undefined ? {} : { "Content-Type": "application/json" }) }, ...(body === undefined ? {} : { body }), signal });
57
+ if (!response.ok)
58
+ throw new Error(`Session archive request failed (${response.status}).`);
59
+ return parseSessionArchiveStatus((await response.json()).archive);
60
+ };
61
+ // Inspect the original schema and stop evidence without auto-upgrading first:
62
+ // archive admission deliberately excludes v1 and unproven native generations.
63
+ let original;
64
+ try {
65
+ original = new Database(journalPath, { readonly: true, fileMustExist: true });
66
+ }
67
+ catch (cause) {
68
+ throw new SqliteAccessError("invalid-format", { database: controllerJournalFormat.name, file: journalPath, phase: "archive-open" }, { cause, connectionClosed: true });
69
+ }
70
+ const observed = withClosedJournal(original, () => original.transaction(() => stoppedSnapshot(original, ticket)).deferred());
71
+ const receiptPath = `${journalPath}.archive-receipt-${ticket.executionGeneration}.json`;
72
+ let receipt = null;
73
+ if (existsSync(receiptPath)) {
74
+ receipt = parseSessionArchiveStatus(JSON.parse(readFileSync(receiptPath, "utf8")));
75
+ if (receipt.state !== "ready")
76
+ throw new Error("Invalid local archive receipt.");
77
+ const current = await call("GET");
78
+ if (current.state === "ready") {
79
+ if (current.sha256 !== receipt.sha256 || current.byteLength !== receipt.byteLength)
80
+ throw new Error("Server archive differs from the confirmed receipt.");
81
+ return current;
82
+ }
83
+ }
84
+ let body;
85
+ try {
86
+ const assertOriginal = (db) => {
87
+ if (JSON.stringify(stoppedSnapshot(db, ticket)) !== JSON.stringify(observed))
88
+ throw new Error("The stopped controller evidence changed before archival.");
89
+ };
90
+ const db = openSqliteDatabase({ file: journalPath, format: controllerJournalFormat, allowCreate: false,
91
+ assertMigrationAllowed: (db, source) => { assertOriginal(db); assertJournalMigrationAllowed(db, source); },
92
+ onReady: assertOriginal,
93
+ });
94
+ const archive = withClosedJournal(db, () => runSqliteImmediate(db, () => {
95
+ assertCurrentSqlite(db, controllerJournalFormat);
96
+ assertOriginal(db);
97
+ if (!existsSync(`${journalPath}.pending-content/manifest.json`))
98
+ throw new Error("Pending archive source is missing.");
99
+ const content = openPendingContent(journalPath, ticket.sessionId);
100
+ reconcilePendingContent(db, content);
101
+ const gap = db.prepare("SELECT projection_gap,archive_incomplete FROM execution WHERE id=1").get();
102
+ if (gap.archive_incomplete !== 0 || gap.projection_gap !== null && gap.projection_gap !== "Recovered pending timeline requires full relay resynchronization.")
103
+ throw new Error("Pending archive has an unresolved projection gap.");
104
+ return parseSessionArchive({ schemaVersion: 1, ...fence, provider: ticket.provider, nativeSessionId: observed.nativeSessionId, entries: [...content.entries.values()].sort((a, b) => BigInt(a.entrySeq) < BigInt(b.entrySeq) ? -1 : 1), resources: [...content.resources.values()].sort((a, b) => a.resource.resourceId.localeCompare(b.resource.resourceId)) });
105
+ }));
106
+ await verifySessionArchiveResources(archive);
107
+ body = JSON.stringify(archive);
108
+ }
109
+ catch (error) {
110
+ await call("POST", JSON.stringify({ ...fence, state: "failed", errorCode: "archive_incomplete" })).catch(() => { });
111
+ throw error;
112
+ }
113
+ const sha256 = createHash("sha256").update(body).digest("hex"), byteLength = String(Buffer.byteLength(body));
114
+ const matches = (status) => status.state === "ready" && status.sha256 === sha256 && status.byteLength === byteLength;
115
+ if (receipt && !matches(receipt))
116
+ throw new Error("Archive receipt does not match the original content.");
117
+ try {
118
+ const current = await call("GET");
119
+ if (current.state === "ready") {
120
+ if (!matches(current))
121
+ throw new Error("Server archive differs from the stopped execution.");
122
+ writeDurableJson(receiptPath, current);
123
+ return current;
124
+ }
125
+ await call("POST", JSON.stringify({ ...fence, state: "pending", errorCode: null }));
126
+ const uploaded = await call("PUT", body);
127
+ if (!matches(uploaded))
128
+ throw new Error("Session archive upload was not confirmed with matching integrity.");
129
+ writeDurableJson(receiptPath, uploaded);
130
+ return uploaded;
131
+ }
132
+ catch (error) {
133
+ await call("POST", JSON.stringify({ ...fence, state: "failed", errorCode: "upload_failed" })).catch(() => { });
134
+ throw error;
135
+ }
136
+ };
137
+ //# sourceMappingURL=archive-upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-upload.js","sourceRoot":"","sources":["../../../src/commands/controller/archive-upload.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
1
  import type { CommandDefinition } from "../../cli/schema.js";
2
2
  export declare const controllerDefinition: CommandDefinition;
3
3
  export declare function controllerResumeDefinition(provider: string): CommandDefinition;
4
+ export declare function controllerArchiveDefinition(provider: string): CommandDefinition;
@@ -1,7 +1,7 @@
1
1
  const value = (names, description, repeatable = false) => ({ names, description, value: { name: "value", kind: "text" }, ...(repeatable ? { repeatable: true } : {}) });
2
2
  export const controllerDefinition = {
3
3
  name: "controller", description: "Run a foreground Test Session in the current directory",
4
- commands: ["codex", "claude", "copilot"].map(name => ({ name, description: `Run a ${name} Test Session`, commands: [controllerResumeDefinition(name)], options: [
4
+ commands: ["codex", "claude", "copilot"].map(name => ({ name, description: `Run a ${name} Test Session`, commands: [controllerResumeDefinition(name), controllerArchiveDefinition(name)], options: [
5
5
  value(["--model", "-m"], "Select the native model"),
6
6
  ...(name === "codex" ? [value(["--sandbox", "-s"], "Native sandbox mode"), value(["--ask-for-approval", "-a"], "Native approval policy")] : []),
7
7
  ...(name === "claude" ? [value(["--permission-mode"], "Native permission mode"), value(["--add-dir"], "Additional native working directory", true)] : []),
@@ -19,4 +19,12 @@ export function controllerResumeDefinition(provider) {
19
19
  details: `Usage: daynight controller ${provider} resume [test-session-id]\n\nWithout an ID, choose a saved Test Session in the current directory. Noninteractive use requires an ID. The original native context is continued in a new protected Daynight page; the old page stays archived. Active or unconfirmed executions cannot be resumed. No initial prompt is replayed. To start with the literal prompt resume, use: daynight controller ${provider} -- resume.`,
20
20
  };
21
21
  }
22
+ export function controllerArchiveDefinition(provider) {
23
+ return {
24
+ name: "archive", description: "Retry uploading stopped Test Session history without starting an agent",
25
+ arguments: [{ name: "test-session-id", description: "Saved Daynight Test Session UUID" }],
26
+ options: [{ names: ["-h", "--help"], description: "Show this help", action: "help" }],
27
+ details: `Usage: daynight controller ${provider} archive <test-session-id>\n\nReconcile the original stopped execution and upload its read-only history. Uses the configured server and private launch evidence; never starts or resumes an agent. The original working directory need not exist.`,
28
+ };
29
+ }
22
30
  //# sourceMappingURL=definition.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../../src/commands/controller/definition.ts"],"names":[],"mappings":"AACA,MAAM,KAAK,GAAG,CAAC,KAAe,EAAE,WAAmB,EAAE,UAAU,GAAG,KAAK,EAAiB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;AACzM,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,wDAAwD;IACzF,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,IAAI,eAAe,EAAE,QAAQ,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,EAAE;YAC9J,KAAK,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,yBAAyB,CAAC;YACnD,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,qBAAqB,CAAC,EAAE,KAAK,CAAC,CAAC,oBAAoB,EAAE,IAAI,CAAC,EAAE,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/I,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,EAAE,wBAAwB,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,qCAAqC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzJ,KAAK,CAAC,CAAC,UAAU,CAAC,EAAE,mDAAmD,CAAC;YACxE,KAAK,CAAC,CAAC,aAAa,CAAC,EAAE,kEAAkE,CAAC;YAC1F,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAe,EAAE;SACpF,EAAE,sBAAsB,EAAE,IAAI;QAC/B,OAAO,EAAE,8BAA8B,IAAI,kDAAkD,IAAI,udAAud,EAAE,CAAC,CAAC;IAC5jB,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;CACtF,CAAC;AAEF,MAAM,UAAU,0BAA0B,CAAC,QAAgB;IAAuB,OAAO;QACvF,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,QAAQ,eAAe;QAChF,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACrF,OAAO,EAAE,8BAA8B,QAAQ,qYAAqY,QAAQ,aAAa;KAC1c,CAAC;AAAC,CAAC"}
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../../src/commands/controller/definition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { CliContext } from "../../cli/context.js";
2
+ import { type SessionProvider } from "../../session/protocol.js";
3
+ /** Archive retry has no process launch, native resume, or business-input path. */
4
+ export declare const retryIndependentArchive: (input: {
5
+ provider: SessionProvider;
6
+ sessionId: string;
7
+ }, context: CliContext) => Promise<void>;
@@ -0,0 +1,71 @@
1
+ import { readdir, readFile, lstat } from "node:fs/promises";
2
+ import { existsSync } from "node:fs";
3
+ import { randomUUID } from "node:crypto";
4
+ import path from "node:path";
5
+ import { resolveConfigurationPaths } from "../../config/paths.js";
6
+ import { loadServerConfiguration } from "../../config/server.js";
7
+ import { SESSION_PROTOCOL, assertSessionFence, sessionFence } from "../../session/protocol.js";
8
+ import { parseRegistrationResponse } from "../../session/controller-protocol.js";
9
+ import { controllerExecutionDirectory, readLaunchTicket } from "./launch-ticket.js";
10
+ import { recordStoppedControllerGeneration } from "./lifecycle-store.js";
11
+ import { uploadStoppedControllerArchive } from "./archive-upload.js";
12
+ import { writeDurableJson } from "./pending-content.js";
13
+ /** Archive retry has no process launch, native resume, or business-input path. */
14
+ export const retryIndependentArchive = async (input, context) => {
15
+ const home = context.homeDirectory(), paths = resolveConfigurationPaths(home);
16
+ const config = await loadServerConfiguration(paths);
17
+ if (!config.serverToken)
18
+ throw new Error("Log in before retrying Test Session history upload.");
19
+ const directory = path.join(paths.stateDirectory, "controller", "launches");
20
+ const files = await readdir(directory);
21
+ if (files.length > 20_000)
22
+ throw new Error("Controller launch inventory exceeds its safe bound.");
23
+ let ticket;
24
+ for (const file of files) {
25
+ if (!/^[a-f0-9-]{36}\.json$/.test(file))
26
+ continue;
27
+ const candidate = await readLaunchTicket(home, file.slice(0, -5));
28
+ if (candidate.testExecutionId === undefined || candidate.sessionId !== input.sessionId || candidate.provider !== input.provider || candidate.serverOrigin !== config.serverUrl)
29
+ continue;
30
+ if (ticket)
31
+ throw new Error("Conflicting local Test Session launch records require reconciliation.");
32
+ ticket = candidate;
33
+ }
34
+ if (!ticket)
35
+ throw new Error("No local Test Session matches this provider, session ID and configured server.");
36
+ const execution = controllerExecutionDirectory(home, ticket.executionId), journalPath = path.join(execution, "journal.sqlite");
37
+ const stopped = await recordStoppedControllerGeneration(journalPath, ticket);
38
+ const proofPath = path.join(execution, "stop-proof.json");
39
+ let body;
40
+ if (existsSync(proofPath)) {
41
+ const stat = await lstat(proofPath);
42
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.size > 32_768 || process.platform !== "win32" && (stat.mode & 0o077) !== 0)
43
+ throw new Error("Test Session stop proof must be a private regular file.");
44
+ body = JSON.parse(await readFile(proofPath, "utf8"));
45
+ assertSessionFence(body, ticket);
46
+ const identity = body;
47
+ if (identity.controllerId !== ticket.controllerId || identity.controllerInstanceId !== ticket.controllerInstanceId || identity.protocol !== SESSION_PROTOCOL)
48
+ throw new Error("Stop proof does not match the original controller.");
49
+ }
50
+ else {
51
+ body = { protocol: SESSION_PROTOCOL, ...sessionFence(ticket), controllerId: ticket.controllerId, controllerInstanceId: ticket.controllerInstanceId, stopProof: { recordId: randomUUID(), previousControllerInstanceId: ticket.controllerInstanceId, stoppedAt: stopped.stoppedAt } };
52
+ writeDurableJson(proofPath, body);
53
+ }
54
+ // A retry may close a still-active server record after local stop was already proven.
55
+ try {
56
+ const pending = await fetch(`${config.serverUrl}/api/v1/test-sessions/${ticket.sessionId}/archive`, { method: "POST", redirect: "error", headers: { authorization: `Bearer ${config.serverToken}`, "content-type": "application/json" }, body: JSON.stringify({ ...sessionFence(ticket), controllerId: ticket.controllerId, controllerInstanceId: ticket.controllerInstanceId, state: "pending", errorCode: null }), signal: AbortSignal.timeout(10_000) });
57
+ await pending.body?.cancel();
58
+ }
59
+ catch { /* Metadata publication must not prevent stop reconciliation. */ }
60
+ const response = await fetch(`${config.serverUrl}/api/v1/test-sessions/${ticket.sessionId}/stop`, { method: "POST", redirect: "error", headers: { authorization: `Bearer ${config.serverToken}`, "content-type": "application/json" }, body: JSON.stringify(body), signal: AbortSignal.timeout(15_000) });
61
+ if (!response.ok)
62
+ throw new Error(`Native execution is stopped; server stop reconciliation failed (${response.status}).`);
63
+ const result = parseRegistrationResponse(await response.json()).session;
64
+ assertSessionFence(result, ticket);
65
+ if (result.lifecycle !== "archived")
66
+ throw new Error("Native execution is stopped; server session closure is unconfirmed.");
67
+ writeDurableJson(path.join(execution, "stop-result.json"), { session: result });
68
+ await uploadStoppedControllerArchive({ journalPath, ticket, serverToken: config.serverToken });
69
+ context.stdout(`Test Session history archived: ${new URL(`/test-sessions/${ticket.sessionId}`, config.serverUrl).href}\n`);
70
+ };
71
+ //# sourceMappingURL=independent-archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"independent-archive.js","sourceRoot":"","sources":["../../../src/commands/controller/independent-archive.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
+ import { uploadStoppedControllerArchive } from "./archive-upload.js";
2
+ import { SqliteAccessError } from "../../platform/sqlite-error.js";
1
3
  import { spawn } from "node:child_process";
2
- import { createHash, randomBytes, randomUUID } from "node:crypto";
4
+ import { randomBytes, randomUUID } from "node:crypto";
3
5
  import { chmod, mkdir, open, realpath, writeFile, rename } from "node:fs/promises";
4
6
  import path from "node:path";
5
7
  import { setTimeout as delay } from "node:timers/promises";
@@ -12,6 +14,7 @@ import { controllerExecutionDirectory, controllerTicketPath, writeLaunchTicket }
12
14
  import { readControllerSnapshot, recordStoppedControllerGeneration } from "./lifecycle-store.js";
13
15
  import { captureProcessProof, stopControllerProcesses } from "./process-proof.js";
14
16
  import { ControllerIpcOutcomeUnknownError, requestController } from "./local-client.js";
17
+ import { prepareControllerIpcEndpoint } from "./paths.js";
15
18
  class TestSessionRequestError extends Error {
16
19
  retryable;
17
20
  constructor(message, retryable, options) {
@@ -31,6 +34,9 @@ const waitForExit = async (exited, milliseconds) => {
31
34
  clearTimeout(timer);
32
35
  }
33
36
  };
37
+ const sqliteFailure = (error) => error instanceof SqliteAccessError
38
+ || error instanceof AggregateError && error.errors.some(sqliteFailure)
39
+ || error instanceof Error && error.cause !== undefined && sqliteFailure(error.cause);
34
40
  // Keep the registration identity before the first network write. A timeout does
35
41
  // not authorize replacing it with another execution or replaying initial input.
36
42
  export const runIndependentController = async (input, context) => {
@@ -139,13 +145,7 @@ export const runIndependentController = async (input, context) => {
139
145
  let credential = await grant("bootstrap");
140
146
  const credentialFile = path.join(directory, "credential.json");
141
147
  await writeControllerCredential(credentialFile, credential);
142
- const endpointKey = createHash("sha256").update(`${home}:${launchId}`).digest("hex").slice(0, 20);
143
- const ipcEndpoint = process.platform === "win32" ? `\\\\.\\pipe\\daynight-${endpointKey}` : path.join(home, ".daynight", "c", `${endpointKey}.sock`);
144
- if (process.platform !== "win32") {
145
- if (Buffer.byteLength(ipcEndpoint) > (process.platform === "darwin" ? 103 : 107))
146
- throw new Error("The controller IPC endpoint exceeds this platform's socket path limit.");
147
- await mkdir(path.dirname(ipcEndpoint), { recursive: true, mode: 0o700 });
148
- }
148
+ const ipcEndpoint = await prepareControllerIpcEndpoint(home, launchId);
149
149
  const nativeHome = resume?.ticket.nativeHome ?? (input.provider === "codex" ? process.env.CODEX_HOME ?? path.join(home, ".codex") : input.provider === "claude" ? process.env.CLAUDE_CONFIG_DIR ?? path.join(home, ".claude") : process.env.COPILOT_HOME ?? path.join(home, ".copilot"));
150
150
  ticket = { schemaVersion: 1, launchId, executionId, controllerId, controllerInstanceId, sessionId: session.sessionId, executionGeneration: session.executionGeneration, testExecutionId: executionId, ownerUserId: session.identity.ownerUserId, initialInput: registration.initialInput, serverOrigin: config.serverUrl, provider: input.provider, cwd, nativeHome, configuration: { agent: input.provider, agentControlMode: "web", model: resume ? null : input.model, args: resume?.ticket.configuration.args ?? input.args, recoveryLimit: 0 }, initialOperationId: randomUUID(), initialPrompt: input.prompt ?? "", resumeNativeSessionId: resume?.nativeSessionId ?? null, credentialFile, ipcEndpoint, ipcSecret: randomBytes(32).toString("hex"), createdAt: new Date().toISOString() };
151
151
  await writeLaunchTicket(home, ticket);
@@ -157,7 +157,7 @@ export const runIndependentController = async (input, context) => {
157
157
  const log = await open(path.join(directory, "controller.log"), "a", 0o600);
158
158
  try {
159
159
  spawnAttempted = true;
160
- child = spawn(process.execPath, [path.join(context.packageDirectory, "dist", "main.js"), "controller", input.provider, "--launch-id", launchId], { cwd, env: { ...process.env, HOME: home, USERPROFILE: home }, detached: process.platform !== "win32", stdio: ["ignore", log.fd, log.fd], windowsHide: true });
160
+ child = spawn(process.execPath, [path.join(context.packageDirectory, "dist", "main.js"), "controller", input.provider, "--launch-id", launchId], { cwd, env: { ...process.env, DN_CONFIG_DIR: resolveConfigurationPaths(home).stateDirectory }, detached: process.platform !== "win32", stdio: ["ignore", log.fd, log.fd], windowsHide: true });
161
161
  childExit = new Promise(resolve => { child.once("exit", () => resolve()); child.once("error", () => resolve()); });
162
162
  await new Promise((resolve, reject) => { child.once("spawn", resolve); child.once("error", reject); });
163
163
  }
@@ -245,7 +245,7 @@ export const runIndependentController = async (input, context) => {
245
245
  }
246
246
  }
247
247
  catch (error) {
248
- if (!requestedStop)
248
+ if (!requestedStop || sqliteFailure(error))
249
249
  failed = error;
250
250
  }
251
251
  finally {
@@ -256,28 +256,42 @@ export const runIndependentController = async (input, context) => {
256
256
  await waitForExit(childExit, 2500);
257
257
  const journal = path.join(directory, "journal.sqlite");
258
258
  let snapshot = null;
259
+ const stopFailures = [];
259
260
  try {
260
261
  snapshot = readControllerSnapshot(journal);
261
262
  }
262
- catch { /* Startup may fail before journal creation. */ }
263
+ catch (error) {
264
+ stopFailures.push(error);
265
+ }
263
266
  const proof = snapshot?.controllerProcess ?? processProof;
264
- if (proof)
265
- await stopControllerProcesses(proof, snapshot?.nativeProcesses ?? [], Date.now() + 10_000);
266
- else if (child.pid && child.exitCode === null && child.signalCode === null) {
267
- // This ChildProcess handle belongs to the spawn above, even if proof
268
- // capture failed. Terminate it; do not infer descendants are stopped.
269
- child.kill("SIGTERM");
270
- await waitForExit(childExit, 2000);
271
- if (child.exitCode === null && child.signalCode === null)
272
- child.kill("SIGKILL");
273
- throw new Error("Original controller process proof is unavailable; complete stopping remains unconfirmed.");
267
+ try {
268
+ if (proof)
269
+ await stopControllerProcesses(proof, snapshot?.nativeProcesses ?? [], Date.now() + 10_000);
270
+ else if (child.pid && child.exitCode === null && child.signalCode === null) {
271
+ // This ChildProcess handle belongs to the spawn above, even if proof
272
+ // capture failed. Terminate it; do not infer descendants are stopped.
273
+ child.kill("SIGTERM");
274
+ await waitForExit(childExit, 2000);
275
+ if (child.exitCode === null && child.signalCode === null)
276
+ child.kill("SIGKILL");
277
+ throw new Error("Original controller process proof is unavailable; complete stopping remains unconfirmed.");
278
+ }
279
+ await childExit;
280
+ }
281
+ catch (error) {
282
+ stopFailures.push(error);
274
283
  }
275
- await childExit;
284
+ if (stopFailures.length === 1)
285
+ throw stopFailures[0];
286
+ if (stopFailures.length > 1)
287
+ throw new AggregateError(stopFailures, "Controller journal observation and local stopping failed.");
276
288
  const stopped = await recordStoppedControllerGeneration(journal, ticket);
277
289
  nativeStopped = true;
278
290
  const stopProof = { recordId: randomUUID(), previousControllerInstanceId: ticket.controllerInstanceId, stoppedAt: stopped.stoppedAt };
279
291
  const body = { protocol: SESSION_PROTOCOL, ...sessionFence(ticket), controllerId: ticket.controllerId, controllerInstanceId: ticket.controllerInstanceId, stopProof };
280
292
  await persist("stop-proof.json", body);
293
+ // Publish the upload intent before closing the live page so observers keep polling.
294
+ await request(`/api/v1/test-sessions/${ticket.sessionId}/archive`, { ...sessionFence(ticket), controllerId: ticket.controllerId, controllerInstanceId: ticket.controllerInstanceId, state: "pending", errorCode: null }, true).catch(() => { });
281
295
  try {
282
296
  const result = parseRegistrationResponse(await request(`/api/v1/test-sessions/${ticket.sessionId}/stop`, body, true)).session;
283
297
  assertSessionFence(result, ticket);
@@ -285,14 +299,26 @@ export const runIndependentController = async (input, context) => {
285
299
  throw new Error("Test Session archival was not confirmed.");
286
300
  await persist("stop-result.json", { session: result });
287
301
  archived = true;
288
- context.stdout("Test Session stopped and archived.\n");
289
302
  }
290
303
  catch {
291
304
  context.stderr("Native execution stopped. Server archival is unconfirmed; the original stop proof is retained privately.\n");
292
305
  }
306
+ if (archived) {
307
+ try {
308
+ await uploadStoppedControllerArchive({ journalPath: journal, ticket, serverToken: config.serverToken });
309
+ context.stdout("Test Session stopped and archived. Read-only history is available on its page.\n");
310
+ }
311
+ catch (error) {
312
+ if (sqliteFailure(error))
313
+ failed = failed === undefined ? error : new AggregateError([failed, error], "Test Session execution and history archival failed.");
314
+ context.stderr(`Native execution stopped; session history upload is pending. Source retained in ${directory}.\nRetry without starting an agent: daynight controller ${ticket.provider} archive ${ticket.sessionId}\n`);
315
+ }
316
+ }
317
+ else
318
+ context.stderr(`Retry without starting an agent: daynight controller ${ticket.provider} archive ${ticket.sessionId}\n`);
293
319
  }
294
320
  catch (error) {
295
- failed ??= error;
321
+ failed = failed === undefined ? error : new AggregateError([failed, error], "Test Session execution and stopping failed.");
296
322
  context.stderr(`Test Session stop could not be fully confirmed; execution evidence: ${directory}. Inspect controller.log and the original journal.\n`);
297
323
  }
298
324
  }
@@ -332,7 +358,7 @@ export const runIndependentController = async (input, context) => {
332
358
  await resume.release();
333
359
  }
334
360
  catch (error) {
335
- failed ??= error;
361
+ failed = failed === undefined ? error : new AggregateError([failed, error], "Test Session execution and lease release failed.");
336
362
  }
337
363
  }
338
364
  process.off("SIGINT", signal);