@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.
- package/README.md +173 -44
- package/config.example.yml +10 -3
- package/dist/api/index.d.ts +1 -1
- package/dist/api/index.js +1 -1
- package/dist/api/index.js.map +1 -1
- package/dist/api/task-properties.d.ts +1 -0
- package/dist/api/task-properties.js +5 -0
- package/dist/api/task-properties.js.map +1 -1
- package/dist/cli/agent-cli-aliases.d.ts +21 -0
- package/dist/cli/agent-cli-aliases.js +57 -0
- package/dist/cli/agent-cli-aliases.js.map +1 -0
- package/dist/cli/application.js +5 -0
- package/dist/cli/application.js.map +1 -1
- package/dist/cli/cancellation.d.ts +1 -1
- package/dist/cli/cancellation.js.map +1 -1
- package/dist/cli/codex-agent-environment.d.ts +5 -0
- package/dist/cli/codex-agent-environment.js +28 -0
- package/dist/cli/codex-agent-environment.js.map +1 -0
- package/dist/cli/commands.js +1 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/schema.d.ts +5 -1
- package/dist/cli/schema.js.map +1 -1
- package/dist/commands/controller/archive-upload.d.ts +9 -0
- package/dist/commands/controller/archive-upload.js +137 -0
- package/dist/commands/controller/archive-upload.js.map +1 -0
- package/dist/commands/controller/definition.d.ts +1 -0
- package/dist/commands/controller/definition.js +9 -1
- package/dist/commands/controller/definition.js.map +1 -1
- package/dist/commands/controller/independent-archive.d.ts +7 -0
- package/dist/commands/controller/independent-archive.js +71 -0
- package/dist/commands/controller/independent-archive.js.map +1 -0
- package/dist/commands/controller/independent.js +51 -25
- package/dist/commands/controller/independent.js.map +1 -1
- package/dist/commands/controller/index.js +14 -1
- package/dist/commands/controller/index.js.map +1 -1
- package/dist/commands/controller/journal-format.d.ts +4 -0
- package/dist/commands/controller/journal-format.js +66 -0
- package/dist/commands/controller/journal-format.js.map +1 -0
- package/dist/commands/controller/launch-ticket.js +3 -2
- package/dist/commands/controller/launch-ticket.js.map +1 -1
- package/dist/commands/controller/lifecycle-store.d.ts +7 -5
- package/dist/commands/controller/lifecycle-store.js +132 -91
- package/dist/commands/controller/lifecycle-store.js.map +1 -1
- package/dist/commands/controller/local-content.d.ts +11 -6
- package/dist/commands/controller/local-content.js +29 -21
- package/dist/commands/controller/local-content.js.map +1 -1
- package/dist/commands/controller/paths.d.ts +2 -0
- package/dist/commands/controller/paths.js +34 -0
- package/dist/commands/controller/paths.js.map +1 -0
- package/dist/commands/controller/pending-content.d.ts +20 -0
- package/dist/commands/controller/pending-content.js +159 -0
- package/dist/commands/controller/pending-content.js.map +1 -0
- package/dist/commands/controller/providers/codex.js +5 -1
- package/dist/commands/controller/providers/codex.js.map +1 -1
- package/dist/commands/controller/providers/types.d.ts +4 -0
- package/dist/commands/controller/resume-lease-format.d.ts +4 -0
- package/dist/commands/controller/resume-lease-format.js +35 -0
- package/dist/commands/controller/resume-lease-format.js.map +1 -0
- package/dist/commands/controller/resume.js +88 -23
- package/dist/commands/controller/resume.js.map +1 -1
- package/dist/commands/controller/runtime.js +11 -1
- package/dist/commands/controller/runtime.js.map +1 -1
- package/dist/commands/controller/sqlite/journal/001-baseline.sql +17 -0
- package/dist/commands/controller/sqlite/journal/002-projection.sql +8 -0
- package/dist/commands/controller/sqlite/journal/003-operation-acknowledgements.sql +1 -0
- package/dist/commands/controller/sqlite/journal/004-projection-gap.sql +1 -0
- package/dist/commands/controller/sqlite/journal/005-resources.sql +7 -0
- package/dist/commands/controller/sqlite/journal/006-pending-content.sql +12 -0
- package/dist/commands/controller/sqlite/resume-lease/001-baseline.sql +7 -0
- package/dist/commands/project/definition.js +1 -1
- package/dist/commands/project/definition.js.map +1 -1
- package/dist/commands/review/definition.js +3 -3
- package/dist/commands/review/definition.js.map +1 -1
- package/dist/commands/review/listing.js +1 -1
- package/dist/commands/review/listing.js.map +1 -1
- package/dist/commands/review/runtime.js +3 -1
- package/dist/commands/review/runtime.js.map +1 -1
- package/dist/commands/review/sqlite/001-baseline.sql +65 -0
- package/dist/commands/review/sqlite/002-publications.sql +15 -0
- package/dist/commands/review/store-format.d.ts +2 -0
- package/dist/commands/review/store-format.js +35 -0
- package/dist/commands/review/store-format.js.map +1 -0
- package/dist/commands/review/store.d.ts +8 -1
- package/dist/commands/review/store.js +46 -176
- package/dist/commands/review/store.js.map +1 -1
- package/dist/commands/skill/read.d.ts +2 -0
- package/dist/commands/skill/read.js +36 -0
- package/dist/commands/skill/read.js.map +1 -0
- package/dist/commands/skill/skills/using-daynight/references/authorization.md +1 -0
- package/dist/commands/skill/skills/using-daynight/references/autopilot-managed-task.md +19 -7
- package/dist/commands/skill/skills/using-daynight/references/goal.md +33 -8
- package/dist/commands/skill/skills/using-daynight/references/run-task.md +1 -1
- package/dist/commands/skill/skills/using-daynight/references/task-content.md +1 -0
- package/dist/commands/skill/usage.md +162 -0
- package/dist/commands/task/definition.js +1 -1
- package/dist/commands/task/definition.js.map +1 -1
- package/dist/commands/worker/backends/sqlite/001-baseline.sql +4 -0
- package/dist/commands/worker/backends/web-process.js +11 -11
- package/dist/commands/worker/backends/web-process.js.map +1 -1
- package/dist/commands/worker/backends/web-record.d.ts +11 -0
- package/dist/commands/worker/backends/web-record.js +151 -0
- package/dist/commands/worker/backends/web-record.js.map +1 -0
- package/dist/commands/worker/backends/web-store-format.d.ts +2 -0
- package/dist/commands/worker/backends/web-store-format.js +33 -0
- package/dist/commands/worker/backends/web-store-format.js.map +1 -0
- package/dist/commands/worker/backends/web-store.d.ts +5 -1
- package/dist/commands/worker/backends/web-store.js +44 -170
- package/dist/commands/worker/backends/web-store.js.map +1 -1
- package/dist/commands/worker/backends/web.d.ts +1 -0
- package/dist/commands/worker/backends/web.js +13 -4
- package/dist/commands/worker/backends/web.js.map +1 -1
- package/dist/commands/worker/cleanup.d.ts +1 -1
- package/dist/commands/worker/cleanup.js.map +1 -1
- package/dist/commands/worker/coordinator.js +1 -1
- package/dist/commands/worker/coordinator.js.map +1 -1
- package/dist/commands/worker/definition.js +2 -2
- package/dist/commands/worker/definition.js.map +1 -1
- package/dist/commands/worker/diagnostics.d.ts +3 -0
- package/dist/commands/worker/diagnostics.js +15 -0
- package/dist/commands/worker/diagnostics.js.map +1 -1
- package/dist/commands/worker/execution.d.ts +2 -0
- package/dist/commands/worker/execution.js +17 -4
- package/dist/commands/worker/execution.js.map +1 -1
- package/dist/commands/worker/herdr/agents.d.ts +9 -1
- package/dist/commands/worker/herdr/agents.js +22 -6
- package/dist/commands/worker/herdr/agents.js.map +1 -1
- package/dist/commands/worker/herdr/arguments.d.ts +4 -0
- package/dist/commands/worker/herdr/arguments.js +17 -0
- package/dist/commands/worker/herdr/arguments.js.map +1 -1
- package/dist/commands/worker/herdr/codex-config.d.ts +8 -0
- package/dist/commands/worker/herdr/codex-config.js +75 -0
- package/dist/commands/worker/herdr/codex-config.js.map +1 -0
- package/dist/commands/worker/herdr/preflight.js +1 -18
- package/dist/commands/worker/herdr/preflight.js.map +1 -1
- package/dist/commands/worker/herdr.d.ts +6 -2
- package/dist/commands/worker/herdr.js +3 -2
- package/dist/commands/worker/herdr.js.map +1 -1
- package/dist/commands/worker/prompts.js +7 -2
- package/dist/commands/worker/prompts.js.map +1 -1
- package/dist/commands/worker/runtime.js +68 -7
- package/dist/commands/worker/runtime.js.map +1 -1
- package/dist/commands/worker/sqlite/005-baseline.sql +18 -0
- package/dist/commands/worker/store-format.d.ts +2 -0
- package/dist/commands/worker/store-format.js +35 -0
- package/dist/commands/worker/store-format.js.map +1 -0
- package/dist/commands/worker/store.d.ts +2 -0
- package/dist/commands/worker/store.js +36 -69
- package/dist/commands/worker/store.js.map +1 -1
- package/dist/config/agent-cli-aliases.d.ts +5 -0
- package/dist/config/agent-cli-aliases.js +37 -0
- package/dist/config/agent-cli-aliases.js.map +1 -0
- package/dist/config/paths.d.ts +1 -1
- package/dist/config/paths.js +6 -2
- package/dist/config/paths.js.map +1 -1
- package/dist/platform/diagnostics.js +3 -0
- package/dist/platform/diagnostics.js.map +1 -1
- package/dist/platform/instance-lock.d.ts +15 -0
- package/dist/platform/instance-lock.js +45 -3
- package/dist/platform/instance-lock.js.map +1 -1
- package/dist/platform/sqlite-access.d.ts +40 -0
- package/dist/platform/sqlite-access.js +333 -0
- package/dist/platform/sqlite-access.js.map +1 -0
- package/dist/platform/sqlite-error.d.ts +39 -0
- package/dist/platform/sqlite-error.js +36 -0
- package/dist/platform/sqlite-error.js.map +1 -0
- package/dist/platform/sqlite-format.d.ts +31 -0
- package/dist/platform/sqlite-format.js +98 -0
- package/dist/platform/sqlite-format.js.map +1 -0
- package/dist/platform/sqlite-sql.d.ts +12 -0
- package/dist/platform/sqlite-sql.js +61 -0
- package/dist/platform/sqlite-sql.js.map +1 -0
- package/dist/session/archive.d.ts +25 -0
- package/dist/session/archive.js +100 -0
- package/dist/session/archive.js.map +1 -0
- 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"}
|
package/dist/cli/commands.js
CHANGED
|
@@ -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
|
],
|
package/dist/cli/commands.js.map
CHANGED
|
@@ -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":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAG5E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAMnF,MAAM,CAAC,MAAM,QAAQ,GAAmC;IACtD,EAAE,GAAG,oBAAoB,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,iCAAiC,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC,EAAE;IAChI,EAAE,GAAG,gBAAgB,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,EAAE;IACpH,EAAE,GAAG,eAAe,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,EAAE;IAClH,EAAE,GAAG,gBAAgB,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,EAAE;IACpH,EAAE,GAAG,eAAe,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,EAAE;IACnH;QACE,GAAG,gBAAgB;QACnB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;KAC9F;IACD;QACE,GAAG,gBAAgB;QACnB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,+BAA+B,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;KAC9F;IACD;QACE,GAAG,oBAAoB;QACvB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,mCAAmC,CAAC,CAAC,CAAC,oBAAoB,EAAE,CAAC;KACtG;IACD;QACE,GAAG,iBAAiB;QACpB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;KAChG;IACD;QACE,GAAG,cAAc;QACjB,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;KAC1F;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAsB;IAC5C,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,WAAW,EAAE,oDAAoD;IACjE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC;IAC/D,OAAO,EAAE;QACP,EAAE,KAAK,EAAE,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,sDAAsD,EAAE,MAAM,EAAE,OAAO,EAAE;QAC5G,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE;QAC1E,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,4BAA4B,EAAE,MAAM,EAAE,SAAS,EAAE;KAC7F;IACD,OAAO,EAAE,kDAAkD;CAC5D,CAAC"}
|
package/dist/cli/schema.d.ts
CHANGED
|
@@ -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[];
|
package/dist/cli/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/cli/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AA8B1C,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,UAA6B,EAAQ,EAAE;IAC9E,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,MAAM,QAAQ,IAAI,UAAU,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QAClD,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,WAAW,UAAU,CAAC,IAAI,sDAAsD,CAAC,CAAC;QAC9I,QAAQ,GAAG,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC;IACxC,CAAC;AACH,CAAC,CAAC;
|
|
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;
|
|
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 {
|
|
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
|
|
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,
|
|
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 {
|
|
263
|
+
catch (error) {
|
|
264
|
+
stopFailures.push(error);
|
|
265
|
+
}
|
|
263
266
|
const proof = snapshot?.controllerProcess ?? processProof;
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
child.
|
|
273
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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);
|