@codetreker/daynight 0.31.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 +81 -15
- package/config.example.yml +10 -3
- 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 +20 -10
- 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.js +25 -1
- package/dist/commands/controller/journal-format.js.map +1 -1
- 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.js +19 -7
- package/dist/commands/controller/lifecycle-store.js.map +1 -1
- package/dist/commands/controller/local-content.d.ts +2 -2
- package/dist/commands/controller/local-content.js +22 -20
- 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.js +3 -2
- 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/006-pending-content.sql +12 -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/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/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/web-process.js +5 -8
- package/dist/commands/worker/backends/web-process.js.map +1 -1
- package/dist/commands/worker/backends/web-store.d.ts +1 -0
- package/dist/commands/worker/backends/web-store.js +1 -0
- 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 +8 -0
- package/dist/commands/worker/backends/web.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/herdr/agents.d.ts +3 -0
- package/dist/commands/worker/herdr/agents.js +14 -3
- 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 +4 -0
- package/dist/commands/worker/herdr.js +3 -2
- package/dist/commands/worker/herdr.js.map +1 -1
- package/dist/commands/worker/runtime.js +60 -4
- package/dist/commands/worker/runtime.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/sqlite-format.d.ts +1 -1
- package/dist/platform/sqlite-format.js +1 -1
- package/dist/platform/sqlite-format.js.map +1 -1
- 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 +2 -2
package/README.md
CHANGED
|
@@ -13,7 +13,9 @@ its exact usage. Review execution additionally requires Git, an authenticated
|
|
|
13
13
|
GitHub CLI and Copilot CLI on `PATH`.
|
|
14
14
|
|
|
15
15
|
- [Install and update](#install-and-update)
|
|
16
|
+
- [Configuration root](#configuration-root)
|
|
16
17
|
- [Client commands](#client-commands)
|
|
18
|
+
- [CLI usage manual](#cli-usage-manual)
|
|
17
19
|
- [Agent skill installation](#agent-skill-installation)
|
|
18
20
|
- [Shell completion](#shell-completion)
|
|
19
21
|
- [Configuration setup](#configuration-setup)
|
|
@@ -88,12 +90,35 @@ that file and cause the update to fail. The
|
|
|
88
90
|
[self-update decision](../../.agents/notes/archived/feature/2026-10-20-cli-self-update.md)
|
|
89
91
|
records installation ownership and verification requirements.
|
|
90
92
|
|
|
93
|
+
## Configuration root
|
|
94
|
+
|
|
95
|
+
`DN_CONFIG_DIR` selects the absolute directory containing `config.yml` and all
|
|
96
|
+
Daynight user-local state. When unset, it remains `~/.daynight`. Empty or relative
|
|
97
|
+
values and paths containing control characters are rejected; use an expanded
|
|
98
|
+
absolute path such as `DN_CONFIG_DIR="$HOME/.daynight-test"`. Paths shown under
|
|
99
|
+
`~/.daynight` in this manual describe that default and follow the selected root.
|
|
100
|
+
|
|
101
|
+
The root includes credentials, worker identity, Worker/Review SQLite databases,
|
|
102
|
+
locks, logs, caches, Controller launch tickets, journals, content and resume leases.
|
|
103
|
+
Controller IPC identities are scoped to this root; long Unix socket paths use a
|
|
104
|
+
private owner-checked temporary directory. Herdr retains its native socket length
|
|
105
|
+
limit and reports an error for overly long roots; select a shorter root for
|
|
106
|
+
Herdr mode. Native home and Provider session directories remain unchanged.
|
|
107
|
+
Project `.daynight` bindings, Git worktrees, installed skills, npm installations
|
|
108
|
+
and remote service data are not isolated by this setting.
|
|
109
|
+
|
|
110
|
+
Top-level `agentCliAliases` optionally maps `daynight` and/or `dn` to another
|
|
111
|
+
executable for newly launched Worker/Controller Agents. It defaults to disabled.
|
|
112
|
+
The [development channel guide](../../docs/development.md#keep-the-skills-command-spelling)
|
|
113
|
+
explains the mapping, platform limits, fixed build lifetime and shell verification.
|
|
114
|
+
|
|
91
115
|
## Client commands
|
|
92
116
|
|
|
93
117
|
```text
|
|
94
118
|
daynight # Show root help
|
|
95
119
|
daynight --help # Also -h
|
|
96
120
|
daynight --version # Also -v
|
|
121
|
+
daynight --skill # Print the project/task usage manual
|
|
97
122
|
daynight update
|
|
98
123
|
daynight login [--no-browser] # Authorize CLI access through the browser
|
|
99
124
|
daynight logout # Revoke and remove the current CLI credential
|
|
@@ -138,8 +163,8 @@ daynight task attachment remove <task-id> <relative-path> [--project <project-id
|
|
|
138
163
|
```
|
|
139
164
|
|
|
140
165
|
Groups and operations show help when `--help` or `-h` is their sole argument.
|
|
141
|
-
Help, version and completion generation do not resolve the
|
|
142
|
-
configuration, open SQLite or require review tools. `review add-repo` accepts one
|
|
166
|
+
Help, version, usage-manual output and completion generation do not resolve the
|
|
167
|
+
user home, load review configuration, open SQLite or require review tools. `review add-repo` accepts one
|
|
143
168
|
`--path <path>` before or after its remote; `--path=value` and `--` are invalid.
|
|
144
169
|
Unknown commands and invalid arguments exit with status 2; operation failures
|
|
145
170
|
exit with status 1 and retain their cause. The old `--daemon-review` and root
|
|
@@ -148,6 +173,31 @@ exit with status 1 and retain their cause. The old `--daemon-review` and root
|
|
|
148
173
|
the [composition decision](../../.agents/notes/archived/architecture/2026-10-20-client-command-composition.md)
|
|
149
174
|
records module ownership and the preserved data layout.
|
|
150
175
|
|
|
176
|
+
## CLI usage manual
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
daynight --skill
|
|
180
|
+
dn --skill
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
`--skill` prints one standalone English project/task usage manual from the
|
|
184
|
+
current package. It covers project selection, task queries and writes,
|
|
185
|
+
dependencies, properties and attachments. Other capabilities are discovered
|
|
186
|
+
through `daynight --help`, with exact options in each subcommand's help. The
|
|
187
|
+
output preserves the manual's original bytes, including YAML
|
|
188
|
+
frontmatter and the final newline. The document has no package-relative
|
|
189
|
+
references to read separately.
|
|
190
|
+
|
|
191
|
+
The option must be the sole argument. Extra arguments or another option exit
|
|
192
|
+
with status 2 and empty stdout before the manual is read. A missing file, read
|
|
193
|
+
failure or invalid UTF-8 exits with status 1 and retains its cause. Reading and
|
|
194
|
+
validation complete before output; an output failure can leave partial stdout.
|
|
195
|
+
The command requires no login, Git repository, configuration, launcher or
|
|
196
|
+
interactive terminal, and creates no files.
|
|
197
|
+
|
|
198
|
+
The `using-daynight` skill owns task orchestration workflows and is installed
|
|
199
|
+
through the separate command below. The CLI manual explains command use.
|
|
200
|
+
|
|
151
201
|
## Agent skill installation
|
|
152
202
|
|
|
153
203
|
The public `using-daynight` skill provides task creation, handoff review and
|
|
@@ -396,8 +446,8 @@ messages use stderr so stdout retains its normal text or JSON format.
|
|
|
396
446
|
Noninteractive missing review configuration fails with a `review add-repo`
|
|
397
447
|
command. Shared YAML/schema errors, invalid selected values, explicit empty
|
|
398
448
|
review lists and read failures retain their errors. Unrelated capability values
|
|
399
|
-
remain outside the current command's validation. Help, version,
|
|
400
|
-
update and invalid arguments do not prompt.
|
|
449
|
+
remain outside the current command's validation. Help, version, usage-manual
|
|
450
|
+
output, completion, update and invalid arguments do not prompt.
|
|
401
451
|
|
|
402
452
|
Test services and noninteractive automation use the existing
|
|
403
453
|
`~/.daynight/config.yml` fields. For a test service, provision its origin before
|
|
@@ -1120,7 +1170,7 @@ daynight worker run
|
|
|
1120
1170
|
```
|
|
1121
1171
|
|
|
1122
1172
|
First use generates and atomically saves stable root workerId. One instance owns
|
|
1123
|
-
|
|
1173
|
+
`worker/` state under the selected configuration root (default `~/.daynight/worker/`), its SQLite, lock, logs, temporary resources and
|
|
1124
1174
|
private Herdr. Each task uses branch `daynight/<task-id>` and directory
|
|
1125
1175
|
`<repository>/.worktrees/daynight/<task-id>`. Valid claims retain their dirty
|
|
1126
1176
|
worktree; task branches and commits remain after terminal cleanup.
|
|
@@ -1446,18 +1496,35 @@ for its supported options. These commands do not implement a native TUI or chang
|
|
|
1446
1496
|
The command prints the Test Session URL and remains in the foreground. Sign in
|
|
1447
1497
|
to Daynight as the account that started it; the URL itself grants no access.
|
|
1448
1498
|
The service's `/test-sessions` page lists that account's online Test Sessions.
|
|
1449
|
-
|
|
1450
|
-
|
|
1499
|
+
Completed history is available through the original URL after its file archive
|
|
1500
|
+
is ready. Native resume creates a separate execution. Use the sidebar or the
|
|
1501
|
+
Session page's back link to return to the list; session IDs do not need to be
|
|
1502
|
+
copied manually.
|
|
1451
1503
|
The page, history, resources, WebSocket and commands all enforce that ownership.
|
|
1452
1504
|
An expired or revoked credential cannot continue authorizing access. Tokens stay
|
|
1453
1505
|
in private local files and never appear in the URL.
|
|
1454
1506
|
|
|
1455
1507
|
Task and Test pages share the same timeline, composer and interaction handling.
|
|
1456
1508
|
Refreshing or closing a browser does not create or stop an Agent. Ctrl+C stops
|
|
1457
|
-
the owned execution
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1509
|
+
the owned execution. Once the service confirms shutdown, the launcher uploads
|
|
1510
|
+
its recorded timeline and resources to file storage for read-only access. The
|
|
1511
|
+
service database stores archive metadata, not conversation payloads. Service
|
|
1512
|
+
unavailability does not prevent local process cleanup; failed uploads retain
|
|
1513
|
+
their private local source. The current directory and user files are never
|
|
1514
|
+
removed by the launcher.
|
|
1515
|
+
|
|
1516
|
+
Retry a failed upload without starting or resuming the Agent:
|
|
1517
|
+
|
|
1518
|
+
```sh
|
|
1519
|
+
daynight controller codex archive <test-session-id>
|
|
1520
|
+
```
|
|
1521
|
+
|
|
1522
|
+
The same command supports `claude` and `copilot`. It verifies the original local
|
|
1523
|
+
execution and stop evidence, and does not require the old working directory to
|
|
1524
|
+
still exist. Use `-- archive` to send the literal word as an initial prompt.
|
|
1525
|
+
Archives are limited to 64 MiB including resource encoding, with at most 8 MiB
|
|
1526
|
+
per resource; incomplete or oversized archives fail explicitly and retain their
|
|
1527
|
+
source. Completed pages disable all Agent controls.
|
|
1461
1528
|
|
|
1462
1529
|
Resume a stopped Test Session with its native context:
|
|
1463
1530
|
|
|
@@ -1559,8 +1626,7 @@ daynight review run
|
|
|
1559
1626
|
```
|
|
1560
1627
|
|
|
1561
1628
|
For a local build, run `pnpm daynight review run` from the repository root.
|
|
1562
|
-
These commands select
|
|
1563
|
-
directory. `review add-repo`
|
|
1629
|
+
These commands select `config.yml` under the [configuration root](#configuration-root). `review add-repo`
|
|
1564
1630
|
creates the configuration when absent. It reads, validates and saves configuration;
|
|
1565
1631
|
cloning, authentication checks, GitHub calls, SQLite initialization and PR boundary
|
|
1566
1632
|
selection belong to review startup. An already running reviewer keeps its loaded
|
|
@@ -1643,7 +1709,7 @@ This observes actual case and Unicode rules. Validation removes only the
|
|
|
1643
1709
|
directories it created, using nonrecursive removal. Probe permission, inspection,
|
|
1644
1710
|
or cleanup failures stop validation with an error.
|
|
1645
1711
|
|
|
1646
|
-
The selected retained-state location is `~/.daynight/` for SQLite, sessions,
|
|
1712
|
+
The selected retained-state location is `DN_CONFIG_DIR` (default `~/.daynight/`) for SQLite, sessions,
|
|
1647
1713
|
locks, logs, cache, and temporary files. PR worktrees belong to each monitored
|
|
1648
1714
|
repository root's `.worktrees/` directory. `maxConcurrentWorker` limits concurrent
|
|
1649
1715
|
review preparation and execution. Startup acquires an exclusive instance lock,
|
|
@@ -1744,7 +1810,7 @@ verification.
|
|
|
1744
1810
|
Each store's baseline and SQL conversions ship as `.sql` resources with the
|
|
1745
1811
|
installed dist tree. Top-level SQL files in that store's directory run in lexical
|
|
1746
1812
|
filename order: the first is its baseline, and consecutive numeric prefixes set
|
|
1747
|
-
later versions. Five baselines and
|
|
1813
|
+
later versions. Five baselines and six upgrades form the current SQL inventory.
|
|
1748
1814
|
TypeScript keeps JSON conversion, ownership checks and the atomic version-0 reset;
|
|
1749
1815
|
ordinary non-SQL subdirectories do not enter the normal chain. Resource loading and
|
|
1750
1816
|
sequence validation finish before user-database access; package checks compare
|
package/config.example.yml
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Shared CLI configuration: ~/.daynight/config.yml.
|
|
1
|
+
# Shared CLI configuration: $DN_CONFIG_DIR/config.yml (default ~/.daynight/config.yml).
|
|
2
2
|
# Select the sections needed for your commands and replace the example repositories
|
|
3
3
|
# and local paths. Merge settings into an existing file to retain credentials and
|
|
4
4
|
# other configuration; this file is a reference, not an automatically loaded config.
|
|
@@ -11,6 +11,13 @@ serverUrl: https://daynight.cc
|
|
|
11
11
|
# Remove or replace an old token before changing serverUrl manually. Keep secrets
|
|
12
12
|
# out of repositories and logs; files containing a token need POSIX mode 0600.
|
|
13
13
|
|
|
14
|
+
# Optional Agent-only CLI mappings (macOS/Linux), disabled when omitted or {}.
|
|
15
|
+
# Keys are commands the Agent uses; values are executable names or absolute paths.
|
|
16
|
+
# Only new Worker/Controller Agent environments receive these aliases.
|
|
17
|
+
# agentCliAliases:
|
|
18
|
+
# daynight: daynight-dev
|
|
19
|
+
# dn: daynight-dev
|
|
20
|
+
|
|
14
21
|
# Review configuration. The numeric values below are the defaults; all are positive
|
|
15
22
|
# integers, and fields ending in Ms use milliseconds.
|
|
16
23
|
# Only repositoryRoot expands ~. It selects paths for future review add-repo calls
|
|
@@ -28,8 +35,8 @@ review:
|
|
|
28
35
|
# copilotReasoningEffort: high
|
|
29
36
|
repositories:
|
|
30
37
|
- remote: https://github.com/OWNER/REPO.git
|
|
31
|
-
# Repository paths are absolute or relative to
|
|
32
|
-
# directory, and do not expand ~. Keep review clones outside
|
|
38
|
+
# Repository paths are absolute or relative to the selected config directory, never the launch
|
|
39
|
+
# directory, and do not expand ~. Keep review clones outside that directory.
|
|
33
40
|
path: ../daynights/github.com/owner/repo
|
|
34
41
|
|
|
35
42
|
# Worker configuration. Run daynight worker setup to inspect prerequisites,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AgentCliAliases, AgentCliAliasName } from "../config/agent-cli-aliases.js";
|
|
2
|
+
export type AgentCliAliasBinding = {
|
|
3
|
+
name: AgentCliAliasName;
|
|
4
|
+
target: string;
|
|
5
|
+
executable: string;
|
|
6
|
+
};
|
|
7
|
+
export type PreparedAgentCliAliases = {
|
|
8
|
+
environment: NodeJS.ProcessEnv;
|
|
9
|
+
bindings: readonly AgentCliAliasBinding[];
|
|
10
|
+
directory: string | null;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Prepare private command shims for a newly launched Agent. The caller retains
|
|
14
|
+
* the directory while any descendant can use it; successful preparation does
|
|
15
|
+
* not change process.env or remove another execution's shims.
|
|
16
|
+
*/
|
|
17
|
+
export declare const prepareAgentCliAliases: (options: {
|
|
18
|
+
aliases: AgentCliAliases;
|
|
19
|
+
environment: NodeJS.ProcessEnv;
|
|
20
|
+
stateDirectory: string;
|
|
21
|
+
}) => Promise<PreparedAgentCliAliases>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { constants } from "node:fs";
|
|
2
|
+
import { access, chmod, mkdir, mkdtemp, realpath, rm, stat, writeFile } from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import which from "which";
|
|
5
|
+
const shellQuote = (value) => `'${value.replaceAll("'", "'\\''")}'`;
|
|
6
|
+
/**
|
|
7
|
+
* Prepare private command shims for a newly launched Agent. The caller retains
|
|
8
|
+
* the directory while any descendant can use it; successful preparation does
|
|
9
|
+
* not change process.env or remove another execution's shims.
|
|
10
|
+
*/
|
|
11
|
+
export const prepareAgentCliAliases = async (options) => {
|
|
12
|
+
const entries = Object.entries(options.aliases);
|
|
13
|
+
if (entries.length === 0)
|
|
14
|
+
return { environment: options.environment, bindings: [], directory: null };
|
|
15
|
+
if (process.platform === "win32")
|
|
16
|
+
throw new Error("agentCliAliases is supported only on macOS and Linux; remove the setting to use the unchanged Agent environment on Windows.");
|
|
17
|
+
if (!path.isAbsolute(options.stateDirectory))
|
|
18
|
+
throw new TypeError("Agent CLI alias state directory must be absolute.");
|
|
19
|
+
if (options.stateDirectory.includes(path.delimiter))
|
|
20
|
+
throw new TypeError("agentCliAliases requires DN_CONFIG_DIR without the PATH delimiter; choose a state directory without colons.");
|
|
21
|
+
const bindings = [];
|
|
22
|
+
// Resolve every target against the original PATH before creating any alias.
|
|
23
|
+
// realpath pins a development entry's symlink to its immutable build snapshot.
|
|
24
|
+
for (const [name, target] of entries) {
|
|
25
|
+
let executable;
|
|
26
|
+
try {
|
|
27
|
+
const candidate = path.isAbsolute(target) ? target : await which(target, { path: options.environment.PATH ?? "", nothrow: false });
|
|
28
|
+
executable = await realpath(candidate);
|
|
29
|
+
if (!(await stat(executable)).isFile())
|
|
30
|
+
throw new Error("Target is not a regular file.");
|
|
31
|
+
await access(executable, constants.X_OK);
|
|
32
|
+
}
|
|
33
|
+
catch (cause) {
|
|
34
|
+
throw new Error(`Cannot resolve agentCliAliases.${name} to an executable; install its target or configure an absolute executable path.`, { cause });
|
|
35
|
+
}
|
|
36
|
+
bindings.push({ name, target, executable });
|
|
37
|
+
}
|
|
38
|
+
const parent = path.join(options.stateDirectory, "agent-cli-aliases");
|
|
39
|
+
await mkdir(parent, { recursive: true, mode: 0o700 });
|
|
40
|
+
const directory = await mkdtemp(path.join(parent, "execution-"));
|
|
41
|
+
try {
|
|
42
|
+
await chmod(directory, 0o700);
|
|
43
|
+
for (const binding of bindings) {
|
|
44
|
+
await writeFile(path.join(directory, binding.name), `#!/bin/sh\nexec ${shellQuote(binding.executable)} "$@"\n`, { flag: "wx", mode: 0o700 });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (cause) {
|
|
48
|
+
await rm(directory, { recursive: true, force: true });
|
|
49
|
+
throw cause;
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
environment: { ...options.environment, DN_CONFIG_DIR: options.stateDirectory, PATH: [directory, options.environment.PATH].filter(value => value !== undefined).join(path.delimiter) },
|
|
53
|
+
bindings,
|
|
54
|
+
directory,
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=agent-cli-aliases.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-cli-aliases.js","sourceRoot":"","sources":["../../src/cli/agent-cli-aliases.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/application.js
CHANGED
|
@@ -14,6 +14,11 @@ export const runCli = async (args, context, registry = commands) => {
|
|
|
14
14
|
context.stdout(`${context.version}\n`);
|
|
15
15
|
return 0;
|
|
16
16
|
}
|
|
17
|
+
if (selection.kind === "skill") {
|
|
18
|
+
const { runSkillRead } = await import("../commands/skill/read.js");
|
|
19
|
+
await runSkillRead(context);
|
|
20
|
+
return 0;
|
|
21
|
+
}
|
|
17
22
|
const registration = registry.find(({ name }) => name === selection.command.name);
|
|
18
23
|
const command = await registration.load();
|
|
19
24
|
await command.run(selection.remaining, context);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application.js","sourceRoot":"","sources":["../../src/cli/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EACzB,IAAuB,EACvB,OAAmB,EACnB,QAAQ,GAAmC,QAAQ,EAClC,EAAE;IACnB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAChG,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;YACvC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC;QACnF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,WAAW,eAAe,CAAC,CAAC;YAC9E,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"application.js","sourceRoot":"","sources":["../../src/cli/application.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EACzB,IAAuB,EACvB,OAAmB,EACnB,QAAQ,GAAmC,QAAQ,EAClC,EAAE;IACnB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAChG,MAAM,SAAS,GAAG,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,SAAS,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;YACvC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;YACnE,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,CAAC,IAAI,CAAE,CAAC;QACnF,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,OAAO,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,KAAK,CAAC,WAAW,eAAe,CAAC,CAAC;YAC9E,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -2,4 +2,4 @@ import type { CliContext } from "./context.js";
|
|
|
2
2
|
export declare class CliCancelledError extends Error {
|
|
3
3
|
constructor(message?: string, options?: ErrorOptions);
|
|
4
4
|
}
|
|
5
|
-
export declare const withCliCancellation: <Result>(context: CliContext, action: (signal: AbortSignal) => Promise<Result>, supplied?: AbortSignal, cancellation?: () => Error) => Promise<Result>;
|
|
5
|
+
export declare const withCliCancellation: <Result>(context: Pick<CliContext, "prompt">, action: (signal: AbortSignal) => Promise<Result>, supplied?: AbortSignal, cancellation?: () => Error) => Promise<Result>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cancellation.js","sourceRoot":"","sources":["../../src/cli/cancellation.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAO,GAAG,sBAAsB,EAAE,OAAsB;QAClE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,
|
|
1
|
+
{"version":3,"file":"cancellation.js","sourceRoot":"","sources":["../../src/cli/cancellation.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAO,GAAG,sBAAsB,EAAE,OAAsB;QAClE,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EACtC,OAAmC,EACnC,MAAgD,EAChD,QAAsB,EACtB,YAAY,GAAgB,GAAG,EAAE,CAAC,IAAI,iBAAiB,EAAE,EACxC,EAAE;IACnB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAqB,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC3H,MAAM,MAAM,GAAG,GAAS,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;IAC5D,IAAI,QAAQ,KAAK,SAAS;QAAE,KAAK,MAAM,MAAM,IAAI,OAAO;YAAE,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrF,IAAI,CAAC;QAAC,OAAO,MAAM,MAAM,CAAC,QAAQ,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IAAC,CAAC;YACnD,CAAC;QACP,IAAI,QAAQ,KAAK,SAAS;YAAE,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtF,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -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":"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"}
|
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
|