harnery 0.41.0 → 0.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commander.js +3 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +9 -1
- package/dist/commands/artifacts.d.ts.map +1 -1
- package/dist/commands/artifacts.js +113 -12
- package/dist/commands/browse.d.ts +164 -0
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +263 -51
- package/dist/commands/claude-desktop.d.ts.map +1 -1
- package/dist/commands/claude-desktop.js +52 -0
- package/dist/commands/disk.d.ts +6 -0
- package/dist/commands/disk.d.ts.map +1 -0
- package/dist/commands/disk.js +80 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +48 -1
- package/dist/commands/files.d.ts +16 -0
- package/dist/commands/files.d.ts.map +1 -1
- package/dist/commands/files.js +54 -2
- package/dist/commands/init.d.ts +2 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +43 -9
- package/dist/commands/rm.d.ts +4 -0
- package/dist/commands/rm.d.ts.map +1 -0
- package/dist/commands/rm.js +87 -0
- package/dist/commands/servers.d.ts +7 -0
- package/dist/commands/servers.d.ts.map +1 -0
- package/dist/commands/servers.js +394 -0
- package/dist/commands/tunnel.d.ts.map +1 -1
- package/dist/commands/tunnel.js +82 -2
- package/dist/core/adapters/profiles.d.ts +9 -0
- package/dist/core/adapters/profiles.d.ts.map +1 -1
- package/dist/core/adapters/profiles.js +22 -1
- package/dist/core/adapters/types.d.ts +9 -0
- package/dist/core/adapters/types.d.ts.map +1 -1
- package/dist/core/agents/cli.js +13 -6
- package/dist/core/agents/render/session-context.d.ts.map +1 -1
- package/dist/core/agents/render/session-context.js +2 -0
- package/dist/core/agents/state/live-coordination-view.d.ts +20 -0
- package/dist/core/agents/state/live-coordination-view.d.ts.map +1 -1
- package/dist/core/agents/state/live-coordination-view.js +60 -0
- package/dist/core/artifacts/delivery-card.js +9 -2
- package/dist/core/artifacts/index.d.ts +140 -4
- package/dist/core/artifacts/index.d.ts.map +1 -1
- package/dist/core/artifacts/index.js +522 -49
- package/dist/core/config.d.ts +68 -11
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +128 -3
- package/dist/core/diagnostics/bundle.d.ts.map +1 -1
- package/dist/core/diagnostics/bundle.js +2 -2
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +16 -0
- package/dist/core/events/v3/projection.js +9 -1
- package/dist/core/hooks/adapter/events.d.ts +17 -0
- package/dist/core/hooks/adapter/events.d.ts.map +1 -1
- package/dist/core/hooks/adapter/events.js +5 -0
- package/dist/core/hooks/adapter/runtime-telemetry.js +3 -1
- package/dist/core/hooks/adapter/wiring.d.ts +37 -7
- package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
- package/dist/core/hooks/adapter/wiring.js +62 -4
- package/dist/core/hooks/cli.js +45 -6
- package/dist/core/hooks/run-markers.d.ts +37 -0
- package/dist/core/hooks/run-markers.d.ts.map +1 -0
- package/dist/core/hooks/run-markers.js +109 -0
- package/dist/core/servers/index.d.ts +211 -0
- package/dist/core/servers/index.d.ts.map +1 -0
- package/dist/core/servers/index.js +560 -0
- package/dist/core/servers/net.d.ts +58 -0
- package/dist/core/servers/net.d.ts.map +1 -0
- package/dist/core/servers/net.js +270 -0
- package/dist/core/servers/tunnels.d.ts +14 -0
- package/dist/core/servers/tunnels.d.ts.map +1 -0
- package/dist/core/servers/tunnels.js +33 -0
- package/dist/core/storage/builtins.js +1 -0
- package/dist/core/workflow/engine.d.ts.map +1 -1
- package/dist/core/workflow/engine.js +30 -1
- package/dist/core/workflow/sandbox-projection.d.ts +13 -2
- package/dist/core/workflow/sandbox-projection.d.ts.map +1 -1
- package/dist/core/workflow/sandbox-projection.js +23 -0
- package/dist/core/workflow/spawn-claude.d.ts.map +1 -1
- package/dist/core/workflow/spawn-claude.js +6 -1
- package/dist/core/workflow/spawn-codex.d.ts +2 -0
- package/dist/core/workflow/spawn-codex.d.ts.map +1 -1
- package/dist/core/workflow/spawn-codex.js +20 -1
- package/dist/core/workflow/spawn-cursor.d.ts.map +1 -1
- package/dist/core/workflow/spawn-cursor.js +6 -1
- package/dist/core/workflow/spawn-opencode.d.ts.map +1 -1
- package/dist/core/workflow/spawn-opencode.js +4 -1
- package/dist/core/workflow/types.d.ts +47 -2
- package/dist/core/workflow/types.d.ts.map +1 -1
- package/dist/core/workflow/worker-access.d.ts +92 -0
- package/dist/core/workflow/worker-access.d.ts.map +1 -0
- package/dist/core/workflow/worker-access.js +450 -0
- package/dist/lib/browser/batch-steps.d.ts +18 -0
- package/dist/lib/browser/batch-steps.d.ts.map +1 -0
- package/dist/lib/browser/batch-steps.js +82 -0
- package/dist/lib/browser/collect/collector.d.ts +99 -0
- package/dist/lib/browser/collect/collector.d.ts.map +1 -0
- package/dist/lib/browser/collect/collector.js +202 -0
- package/dist/lib/browser/collect/fields.d.ts +31 -0
- package/dist/lib/browser/collect/fields.d.ts.map +1 -0
- package/dist/lib/browser/collect/fields.js +75 -0
- package/dist/lib/browser/collect/index.d.ts +6 -0
- package/dist/lib/browser/collect/index.d.ts.map +1 -0
- package/dist/lib/browser/collect/index.js +5 -0
- package/dist/lib/browser/collect/page-driver.d.ts +14 -0
- package/dist/lib/browser/collect/page-driver.d.ts.map +1 -0
- package/dist/lib/browser/collect/page-driver.js +306 -0
- package/dist/lib/browser/collect/presets.d.ts +52 -0
- package/dist/lib/browser/collect/presets.d.ts.map +1 -0
- package/dist/lib/browser/collect/presets.js +176 -0
- package/dist/lib/browser/collect/scroll-plan.d.ts +85 -0
- package/dist/lib/browser/collect/scroll-plan.d.ts.map +1 -0
- package/dist/lib/browser/collect/scroll-plan.js +118 -0
- package/dist/lib/browser/index.d.ts +1 -1
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/page-review-judge.d.ts +2 -0
- package/dist/lib/browser/page-review-judge.d.ts.map +1 -1
- package/dist/lib/browser/page-review-judge.js +13 -0
- package/dist/lib/browser/qa-run-contracts.d.ts +10 -0
- package/dist/lib/browser/qa-run-contracts.d.ts.map +1 -1
- package/dist/lib/browser/qa-run.d.ts.map +1 -1
- package/dist/lib/browser/qa-run.js +1 -0
- package/dist/lib/browser/windows-chrome.d.ts +59 -0
- package/dist/lib/browser/windows-chrome.d.ts.map +1 -0
- package/dist/lib/browser/windows-chrome.js +179 -0
- package/dist/lib/claude-desktop-share.d.ts +136 -0
- package/dist/lib/claude-desktop-share.d.ts.map +1 -0
- package/dist/lib/claude-desktop-share.js +394 -0
- package/dist/lib/disk-usage.d.ts +50 -0
- package/dist/lib/disk-usage.d.ts.map +1 -0
- package/dist/lib/disk-usage.js +303 -0
- package/dist/lib/docs-lint.d.ts +6 -0
- package/dist/lib/docs-lint.d.ts.map +1 -1
- package/dist/lib/docs-lint.js +8 -3
- package/dist/lib/guarded-remove.d.ts +34 -0
- package/dist/lib/guarded-remove.d.ts.map +1 -0
- package/dist/lib/guarded-remove.js +310 -0
- package/dist/lib/instructions/templates.js +8 -8
- package/dist/lib/tunnel/error-page.d.ts +1 -1
- package/dist/lib/tunnel/error-page.d.ts.map +1 -1
- package/dist/lib/tunnel/error-page.js +19 -8
- package/dist/lib/tunnel/gate.js +20 -1
- package/dist/lib/tunnel/path-scope.d.ts +22 -0
- package/dist/lib/tunnel/path-scope.d.ts.map +1 -0
- package/dist/lib/tunnel/path-scope.js +62 -0
- package/dist/lib/tunnel/state.d.ts +5 -0
- package/dist/lib/tunnel/state.d.ts.map +1 -1
- package/dist/lib/tunnel/state.js +17 -3
- package/package.json +6 -1
- package/schemas/config.schema.json +91 -0
- package/src/commander.ts +19 -0
- package/src/commands/agents.ts +14 -0
- package/src/commands/artifacts.ts +171 -19
- package/src/commands/browse.ts +400 -57
- package/src/commands/claude-desktop.ts +61 -0
- package/src/commands/disk.ts +114 -0
- package/src/commands/doctor.ts +52 -1
- package/src/commands/files.ts +93 -2
- package/src/commands/init.ts +55 -5
- package/src/commands/rm.ts +115 -0
- package/src/commands/servers.ts +506 -0
- package/src/commands/tunnel.ts +102 -2
- package/src/core/adapters/profiles.ts +22 -1
- package/src/core/adapters/types.ts +10 -0
- package/src/core/agents/cli.ts +14 -6
- package/src/core/agents/render/session-context.ts +1 -0
- package/src/core/agents/state/live-coordination-view.ts +73 -0
- package/src/core/artifacts/delivery-card.ts +10 -2
- package/src/core/artifacts/index.ts +697 -44
- package/src/core/config.ts +183 -4
- package/src/core/diagnostics/bundle.ts +2 -1
- package/src/core/events/v3/producers/recorder.ts +16 -0
- package/src/core/events/v3/projection.ts +11 -1
- package/src/core/hooks/adapter/events.ts +19 -0
- package/src/core/hooks/adapter/runtime-telemetry.ts +3 -1
- package/src/core/hooks/adapter/wiring.ts +116 -8
- package/src/core/hooks/cli.ts +47 -6
- package/src/core/hooks/run-markers.ts +132 -0
- package/src/core/servers/index.ts +712 -0
- package/src/core/servers/net.ts +283 -0
- package/src/core/servers/tunnels.ts +39 -0
- package/src/core/storage/builtins.ts +1 -0
- package/src/core/workflow/engine.ts +38 -1
- package/src/core/workflow/sandbox-projection.ts +38 -2
- package/src/core/workflow/spawn-claude.ts +5 -1
- package/src/core/workflow/spawn-codex.ts +18 -1
- package/src/core/workflow/spawn-cursor.ts +5 -1
- package/src/core/workflow/spawn-opencode.ts +4 -1
- package/src/core/workflow/types.ts +62 -2
- package/src/core/workflow/worker-access.ts +525 -0
- package/src/lib/browser/batch-steps.ts +79 -0
- package/src/lib/browser/collect/collector.ts +306 -0
- package/src/lib/browser/collect/fields.ts +87 -0
- package/src/lib/browser/collect/index.ts +47 -0
- package/src/lib/browser/collect/page-driver.ts +327 -0
- package/src/lib/browser/collect/presets.ts +237 -0
- package/src/lib/browser/collect/scroll-plan.ts +179 -0
- package/src/lib/browser/index.ts +1 -0
- package/src/lib/browser/page-review-judge.ts +16 -0
- package/src/lib/browser/qa-run-contracts.ts +11 -0
- package/src/lib/browser/qa-run.ts +1 -0
- package/src/lib/browser/windows-chrome.ts +227 -0
- package/src/lib/claude-desktop-share.ts +511 -0
- package/src/lib/disk-usage.ts +347 -0
- package/src/lib/docs-lint.ts +8 -3
- package/src/lib/guarded-remove.ts +376 -0
- package/src/lib/instructions/templates.ts +8 -8
- package/src/lib/tunnel/error-page.ts +25 -9
- package/src/lib/tunnel/gate.ts +22 -1
- package/src/lib/tunnel/path-scope.ts +73 -0
- package/src/lib/tunnel/state.ts +20 -3
package/dist/commander.js
CHANGED
|
@@ -85,6 +85,7 @@ function lazy(command, description, load, options = {}) {
|
|
|
85
85
|
}
|
|
86
86
|
function harneryCommandBundles({ emit, context, binName, }) {
|
|
87
87
|
return [
|
|
88
|
+
lazy("disk [path]", "Measure checkout disk usage, including nested repositories and ignored files", async (program) => (await import("./commands/disk.js")).registerDiskCommand(program, emit), { hasOptions: true }),
|
|
88
89
|
lazy("tokens <files...>", "Count tokens in text/markdown files (offline, uses o200k_base as Claude proxy)", async (program) => (await import("./commands/tokens.js")).registerTokensCommand(program, emit), { hasOptions: true }),
|
|
89
90
|
lazy("eml <file>", "Parse a Gmail .eml file into a clean chronological markdown thread", async (program) => (await import("./commands/eml.js")).registerEmlCommand(program, emit), { hasOptions: true }),
|
|
90
91
|
lazy("env [section]", "Show environment status (runtimes, docker, git; hosts can add sections)", async (program) => (await import("./commands/env.js")).registerEnvCommand(program, emit, context)),
|
|
@@ -144,6 +145,7 @@ function harneryCommandBundles({ emit, context, binName, }) {
|
|
|
144
145
|
lazy("supervisor", "Run Harnery's optional local diagnostic supervisor", async (program) => (await import("./commands/supervisor.js")).registerSupervisorCommand(program, emit, context)),
|
|
145
146
|
lazy("diagnostics", "Inspect, capture, and replay bounded local diagnostic findings", async (program) => (await import("./commands/diagnostics.js")).registerDiagnosticsCommand(program, emit, context), { hasOptions: true }),
|
|
146
147
|
lazy("storage", "Inspect registered Harnery storage without reading file bodies", async (program) => (await import("./commands/storage.js")).registerStorageCommand(program, emit, context)),
|
|
148
|
+
lazy("rm <paths...>", "Preview guarded removal of untracked files; --yes applies permanent deletion", async (program) => (await import("./commands/rm.js")).registerRmCommand(program, emit, context), { hasOptions: true }),
|
|
147
149
|
lazy("logs", "List and query bounded Harnery log families", async (program) => (await import("./commands/logs.js")).registerLogsCommand(program, emit, context)),
|
|
148
150
|
lazy("inbox", "Inspect private coordination inbox state", async (program) => (await import("./commands/inbox.js")).registerInboxCommand(program, emit, context?.coordinationInbox)),
|
|
149
151
|
lazy("messages", "Queue a durable coordination message; dry-run unless --yes", async (program) => (await import("./commands/messages.js")).registerMessagesCommand(program, emit, context?.coordinationInbox), { hasOptions: true }),
|
|
@@ -161,6 +163,7 @@ function harneryCommandBundles({ emit, context, binName, }) {
|
|
|
161
163
|
lazy("decision", "Decision docket: file a decision an agent would otherwise escalate, deliberate it, resolve with cited evidence, review async.", async (program) => (await import("./commands/decision.js")).registerDecisionCommand(program, emit), { aliases: ["decisions"] }),
|
|
162
164
|
lazy("devtools", "Local status of the AI coding agents (Claude Code, Codex, Cursor)", async (program) => (await import("./commands/devtools.js")).registerDevtoolsCommand(program, emit), { hasOptions: true }),
|
|
163
165
|
lazy("tunnel", "Provider-backed tunnel(s) in front of a local upstream (default upstream: 127.0.0.1:8001). Run several at once with --name <instance>.", async (program) => (await import("./commands/tunnel.js")).registerTunnelCommand(program, emit, context)),
|
|
166
|
+
lazy("servers", "Every local server started in this project: list, stop, clean up idle session servers, read logs", async (program) => (await import("./commands/servers.js")).registerServersCommand(program, emit, context)),
|
|
164
167
|
lazy("docs", "Documentation tooling: freshness report, metadata, lint, sweep, index", async (program) => (await import("./commands/docs.js")).registerDocsCommand(program, emit, context), { hasOptions: true }),
|
|
165
168
|
lazy("agents", "The live agent sessions in this project: who is running now, what they hold, and their coordination state (whoami / list / status / health).", async (program) => (await import("./commands/agents.js")).registerAgentsCommand(program, emit, context, binName)),
|
|
166
169
|
lazy("council", "Multi-agent deliberation: convene a temporary group around an objective, run N rounds of contribution, emit a transcript.", async (program) => (await import("./commands/agents.js")).registerCouncilCommands(program)),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAcH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAS1E,OAAO,EAGL,qBAAqB,EAMtB,MAAM,yBAAyB,CAAC;AAejC,OAAO,EAKL,KAAK,4BAA4B,EAClC,MAAM,wCAAwC,CAAC;AAMhD,OAAO,EAGL,KAAK,SAAS,EAEf,MAAM,0CAA0C,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAcH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAS1E,OAAO,EAGL,qBAAqB,EAMtB,MAAM,yBAAyB,CAAC;AAejC,OAAO,EAKL,KAAK,4BAA4B,EAClC,MAAM,wCAAwC,CAAC;AAMhD,OAAO,EAGL,KAAK,SAAS,EAEf,MAAM,0CAA0C,CAAC;AAyBlD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AA8FjE;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;CAAE,CAErF;AAgFD,OAAO,EAAE,qBAAqB,EAAE,CAAC;AASjC,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,WAAW,EACtB,cAAc,CAAC,EAAE,qBAAqB,EACtC,OAAO,SAAmB,GACzB,IAAI,CAgWN;AAgXD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAyO7D;AA81CD,KAAK,mBAAmB,GAAG;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,KAAK,SAAa,EAClB,QAAQ,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,mBAAmB,EAA6B,EAC5E,gBAAgB,SAAwB,GACvC;IAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAkBrD;AA0ED,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,WAAW,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,IAAI,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B;AAED,0CAA0C;AAC1C,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,wBAAwB,CAyC1B;AAgUD,MAAM,MAAM,mBAAmB,GAC3B;IAAE,KAAK,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACxC;IACE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC7B,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,KAAK,CAAC;YACjB,WAAW,EAAE,MAAM,CAAC;YACpB,aAAa,EAAE,MAAM,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC;YAChB,UAAU,EAAE,MAAM,CAAC;YACnB;qEACyD;YACzD,SAAS,EAAE,OAAO,CAAC;SACpB,CAAC,CAAC;KACJ,CAAC;IACF,qBAAqB,EAAE,KAAK,CAAC;QAC3B,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,aAAa,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,uBAAuB,EAAE,MAAM,CAAC;KACjC,CAAC,CAAC;IACH,YAAY,EAAE;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACzE,CAAC;IACF,iBAAiB,EAAE;QACjB,sEAAsE;QACtE,KAAK,EAAE,MAAM,CAAC;QACd,uCAAuC;QACvC,WAAW,EAAE,MAAM,CAAC;QACpB,mEAAmE;QACnE,gBAAgB,EAAE,MAAM,CAAC;QACzB,yDAAyD;QACzD,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACjE,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;SAAE,CAAC,CAAC;QAClF,kEAAkE;QAClE,oBAAoB,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,sBAAsB,EAAE;QACtB,IAAI,EAAE,OAAO,CAAC;QACd,kBAAkB,EAAE,MAAM,CAAC;QAC3B,oBAAoB,EAAE,MAAM,CAAC;QAC7B,oBAAoB,EAAE,MAAM,EAAE,CAAC;QAC/B,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,aAAa,EAAE,KAAK,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzF,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B,CAAC;AAMN;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAa,GAAG,mBAAmB,CAmPhG;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CA+BhE;AAED;;4DAE4D;AAC5D,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,KAAK,SAAa,GACjB;IACD,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,GAAG,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,SAAS,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClE,eAAe,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE,CAqFA;AAeD,oCAAoC;AACpC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,8BAA8B,CAC5C,iBAAiB,EAAE,SAAS,MAAM,EAAE,EACpC,MAAM,EAAE,IAAI,GACX,MAAM,EAAE,CAGV;AAED,yEAAyE;AACzE,wBAAgB,SAAS,CAAC,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAiHlF;AAED,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,SAAS,4BAA4B,EAAE,EACjD,UAAU,EAAE,MAAM,GACjB,UAAU,EAAE,CAQd;AA8KD,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,KAAK,qBAAqB,GAAG;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,EACZ,KAAK,SAAa,EAClB,QAAQ,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,qBAAqB,EAA6B,EAC9E,gBAAgB,SAAwB,GACvC,wBAAwB,CA0C1B;AAED,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,mBAAmB,GAAG,WAAW,CAAC;AAEhF,wFAAwF;AACxF,wBAAgB,2BAA2B,CACzC,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAAC,EACrD,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,mBAAmB,GAAG,IAAI,CAO5B"}
|
package/dist/commands/agents.js
CHANGED
|
@@ -27,7 +27,7 @@ import { listSessionFinalizationRequestsV3, observeHostDisappearedV3, reconcileS
|
|
|
27
27
|
import { SESSION_NAME_DISPLAY_NOTE, sessionNameDisplayPending, } from "../core/agents/session-name-display.js";
|
|
28
28
|
import { agentDisplayName } from "../core/agents/state/activity-log.js";
|
|
29
29
|
import { buildLifecycleSuggestedName, buildSuggestedName, readHeartbeat as readHeartbeatCache, } from "../core/agents/state/heartbeat-writer.js";
|
|
30
|
-
import { readLiveCoordinationRow, readLiveCoordinationRows, } from "../core/agents/state/live-coordination-view.js";
|
|
30
|
+
import { describeLiveAuthorityBlockV3, liveAuthorityBlockHintV3, liveAuthorityBlockV3, readLiveCoordinationRow, readLiveCoordinationRows, } from "../core/agents/state/live-coordination-view.js";
|
|
31
31
|
import { foldSessionState, } from "../core/agents/state/session-state.js";
|
|
32
32
|
import { turnChangesStatusRow } from "../core/agents/turn-changes.js";
|
|
33
33
|
import { turnElapsedStatusRow } from "../core/agents/turn-elapsed.js";
|
|
@@ -1003,6 +1003,10 @@ function normalizeKind(kind) {
|
|
|
1003
1003
|
* command refuses in turn and the caller has no way to guess the path back.
|
|
1004
1004
|
*/
|
|
1005
1005
|
function noLiveGenerationMessage(root, owner) {
|
|
1006
|
+
const block = liveAuthorityBlockV3(root, owner);
|
|
1007
|
+
if (block) {
|
|
1008
|
+
return `resolved owner=${owner}; ${describeLiveAuthorityBlockV3(block)}; ${liveAuthorityBlockHintV3(resolveBinName(root))}`;
|
|
1009
|
+
}
|
|
1006
1010
|
return `resolved owner=${owner} but no authority-safe live V3 generation exists for it; ${lifecycleReopenHint(root)}`;
|
|
1007
1011
|
}
|
|
1008
1012
|
function lifecycleReopenHint(root) {
|
|
@@ -4152,6 +4156,10 @@ function runHeal(opts) {
|
|
|
4152
4156
|
});
|
|
4153
4157
|
}
|
|
4154
4158
|
if (proc.status !== 0) {
|
|
4159
|
+
const block = liveAuthorityBlockV3(root, owner);
|
|
4160
|
+
if (block) {
|
|
4161
|
+
emitHealFailure("authority_blocked", `${describeLiveAuthorityBlockV3(block)}; a cache rebuild cannot restore authority the ledger withholds; ${liveAuthorityBlockHintV3(resolveBinName(root))}`);
|
|
4162
|
+
}
|
|
4155
4163
|
emitHealFailure(healFailureReason(root, owner, sessionId, healAdapter), spawnFailureMessage(proc, `agent-coord ${action}`));
|
|
4156
4164
|
}
|
|
4157
4165
|
// Read the derived cache to surface post-action state.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/commands/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"artifacts.d.ts","sourceRoot":"","sources":["../../src/commands/artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AA2C1E,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAqYN"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { monorepoRoot, resolveOwner } from "../core/agents/index.js";
|
|
2
2
|
import { readLiveCoordinationRow } from "../core/agents/state/live-coordination-view.js";
|
|
3
|
-
import { adoptUnmanagedArtifactFiles, artifactCapabilities, artifactReviewGuidance, artifactsRoot, autoCleanArtifacts, cleanArtifacts, createArtifact, discardArtifact, holdArtifact, inventoryArtifacts, migrateArtifacts, parseArtifactDeliverySpec, releaseArtifact, renderArtifactDeliveryCard, renewArtifact, repairArtifactActivity, resolveArtifactDeliveryManifest, showArtifact, unholdArtifact, writeArtifactDeliveryManifest, } from "../core/artifacts/index.js";
|
|
4
|
-
import { artifactDefaultRetentionDays, coordFreshnessSeconds, reviewPackAutoCleanEnabled, } from "../core/config.js";
|
|
3
|
+
import { adoptUnmanagedArtifactFiles, allowBigArtifact, artifactCapabilities, artifactQuickUsage, artifactReviewGuidance, artifactsRoot, artifactUsageReport, assertArtifactDiskFloor, autoCleanArtifacts, cleanArtifacts, createArtifact, discardArtifact, holdArtifact, inventoryArtifacts, migrateArtifacts, parseArtifactDeliverySpec, readArtifactDeletions, releaseArtifact, removeArtifact, renderArtifactDeliveryCard, renewArtifact, repairArtifactActivity, resolveArtifactDeliveryManifest, showArtifact, unholdArtifact, writeArtifactDeliveryManifest, } from "../core/artifacts/index.js";
|
|
4
|
+
import { artifactDefaultRetentionDays, artifactIdleGraceHours, artifactMaxUnitBytes, coordFreshnessSeconds, resolveBinName, reviewPackAutoCleanEnabled, } from "../core/config.js";
|
|
5
5
|
import { deleteExpiredPacks } from "../lib/browser/page-review-pack.js";
|
|
6
6
|
export function registerArtifactsCommand(program, emit, context) {
|
|
7
7
|
const root = program
|
|
@@ -15,8 +15,10 @@ export function registerArtifactsCommand(program, emit, context) {
|
|
|
15
15
|
.option("--days <n>", "Retention in days (default from artifacts.default_retention_days)")
|
|
16
16
|
.option("--minutes <n>", "Retention in minutes; cannot be combined with --days")
|
|
17
17
|
.option("--big", "Acknowledge that this workspace may exceed the per-bundle size ceiling")
|
|
18
|
+
.option("--allow-low-disk", "Create a --big workspace even though free disk is below artifacts.min_free_bytes")
|
|
18
19
|
.option("--hold <id>", "Create the workspace with this hold already present")
|
|
19
20
|
.option("--hold-reason <text>", "Why the initial hold is required")
|
|
21
|
+
.option("--hold-persistent", "Make the initial hold persistent: it never lapses and counts toward the held budget. Only for a hold that mirrors an external lease, such as an open checkout with unsynchronized work")
|
|
20
22
|
.option("--actor <instance-id>", "Stable owner identity for the initial hold")
|
|
21
23
|
.action((slug, opts) => {
|
|
22
24
|
run(emit, () => {
|
|
@@ -26,6 +28,8 @@ export function registerArtifactsCommand(program, emit, context) {
|
|
|
26
28
|
const actor = opts.actor ? { instance_id: opts.actor } : currentActor(repoRoot);
|
|
27
29
|
if (!!opts.hold !== !!opts.holdReason)
|
|
28
30
|
throw new Error("--hold and --hold-reason must be used together");
|
|
31
|
+
if (opts.holdPersistent && !opts.hold)
|
|
32
|
+
throw new Error("--hold-persistent requires --hold");
|
|
29
33
|
const retentionDays = opts.days
|
|
30
34
|
? parseDays(opts.days)
|
|
31
35
|
: artifactDefaultRetentionDays(repoRoot);
|
|
@@ -36,6 +40,8 @@ export function registerArtifactsCommand(program, emit, context) {
|
|
|
36
40
|
catch (error) {
|
|
37
41
|
emit.log(`artifact cleanup skipped: ${error instanceof Error ? error.message : String(error)}`, "warn");
|
|
38
42
|
}
|
|
43
|
+
if (opts.big && !opts.allowLowDisk)
|
|
44
|
+
assertArtifactDiskFloor(repoRoot);
|
|
39
45
|
const created = createArtifact(repoRoot, {
|
|
40
46
|
slug,
|
|
41
47
|
purpose: opts.purpose,
|
|
@@ -43,7 +49,15 @@ export function registerArtifactsCommand(program, emit, context) {
|
|
|
43
49
|
retentionMinutes,
|
|
44
50
|
actor,
|
|
45
51
|
big: opts.big,
|
|
46
|
-
holds: opts.hold
|
|
52
|
+
holds: opts.hold
|
|
53
|
+
? [
|
|
54
|
+
{
|
|
55
|
+
id: opts.hold,
|
|
56
|
+
reason: opts.holdReason,
|
|
57
|
+
...(opts.holdPersistent ? { persistent: true } : {}),
|
|
58
|
+
},
|
|
59
|
+
]
|
|
60
|
+
: [],
|
|
47
61
|
});
|
|
48
62
|
emit.data({
|
|
49
63
|
path: created.path,
|
|
@@ -51,6 +65,13 @@ export function registerArtifactsCommand(program, emit, context) {
|
|
|
51
65
|
expires_at: created.manifest.retention.expires_at,
|
|
52
66
|
owner_instance_id: actor?.instance_id ?? null,
|
|
53
67
|
holds: created.manifest.holds,
|
|
68
|
+
...usageFields(emit, repoRoot),
|
|
69
|
+
...(opts.big
|
|
70
|
+
? {}
|
|
71
|
+
: {
|
|
72
|
+
size_ceiling_bytes: artifactMaxUnitBytes(repoRoot),
|
|
73
|
+
size_note: `Cleanup deletes this workspace before it expires if it grows past ${artifactMaxUnitBytes(repoRoot)} bytes on disk and then sits idle for ${artifactIdleGraceHours(repoRoot)}h. Create it with --big, or run ${resolveBinName(repoRoot)} artifacts allow-big later, if it will grow that large.`,
|
|
74
|
+
}),
|
|
54
75
|
after_review: artifactReviewGuidance(repoRoot, created.manifest.artifact_id),
|
|
55
76
|
});
|
|
56
77
|
});
|
|
@@ -85,7 +106,14 @@ export function registerArtifactsCommand(program, emit, context) {
|
|
|
85
106
|
const rows = inventoryArtifacts(repoRoot, {
|
|
86
107
|
freshnessSeconds: coordFreshnessSeconds(repoRoot),
|
|
87
108
|
});
|
|
88
|
-
|
|
109
|
+
const recentDeletions = readArtifactDeletions(repoRoot, {
|
|
110
|
+
since: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
|
|
111
|
+
});
|
|
112
|
+
emit.data({
|
|
113
|
+
rows,
|
|
114
|
+
meta: inventoryMeta(emit, repoRoot, rows),
|
|
115
|
+
recent_deletions: recentDeletions,
|
|
116
|
+
});
|
|
89
117
|
});
|
|
90
118
|
});
|
|
91
119
|
root
|
|
@@ -94,9 +122,19 @@ export function registerArtifactsCommand(program, emit, context) {
|
|
|
94
122
|
.action((ref) => {
|
|
95
123
|
run(emit, () => {
|
|
96
124
|
const repoRoot = requireRepoRoot(context);
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
125
|
+
try {
|
|
126
|
+
emit.data(showArtifact(repoRoot, ref, {
|
|
127
|
+
freshnessSeconds: coordFreshnessSeconds(repoRoot),
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
const deleted = readArtifactDeletions(repoRoot)
|
|
132
|
+
.reverse()
|
|
133
|
+
.find((record) => [record.artifact_id, record.name].includes(ref));
|
|
134
|
+
if (!deleted)
|
|
135
|
+
throw error;
|
|
136
|
+
throw new Error(`artifact "${ref}" was deleted by cleanup at ${deleted.deleted_at} as ${deleted.classification}: ${deleted.reason}`);
|
|
137
|
+
}
|
|
100
138
|
});
|
|
101
139
|
});
|
|
102
140
|
root
|
|
@@ -151,6 +189,15 @@ export function registerArtifactsCommand(program, emit, context) {
|
|
|
151
189
|
emit.data(manifest);
|
|
152
190
|
});
|
|
153
191
|
});
|
|
192
|
+
root
|
|
193
|
+
.command("allow-big <ref>")
|
|
194
|
+
.description("Exempt an existing workspace from the per-bundle size ceiling, as create --big would; expiry still applies.")
|
|
195
|
+
.action((ref) => {
|
|
196
|
+
run(emit, () => {
|
|
197
|
+
const repoRoot = requireRepoRoot(context);
|
|
198
|
+
emit.data(allowBigArtifact(repoRoot, ref, { actor: currentActor(repoRoot) }));
|
|
199
|
+
});
|
|
200
|
+
});
|
|
154
201
|
root
|
|
155
202
|
.command("release <ref>")
|
|
156
203
|
.description("Release active-owner protection without shortening retention.")
|
|
@@ -179,6 +226,17 @@ export function registerArtifactsCommand(program, emit, context) {
|
|
|
179
226
|
emit.data({ manifest, entry: showArtifact(repoRoot, ref).entry, deleted: false });
|
|
180
227
|
});
|
|
181
228
|
});
|
|
229
|
+
root
|
|
230
|
+
.command("remove <ref>")
|
|
231
|
+
.description("Preview immediate removal of one owned artifact; --yes permanently deletes it.")
|
|
232
|
+
.requiredOption("--reason <text>", "Why these reviewed files are no longer needed")
|
|
233
|
+
.option("--yes", "Permanently delete this one workspace after safety checks")
|
|
234
|
+
.action((ref, opts) => {
|
|
235
|
+
run(emit, () => {
|
|
236
|
+
const repoRoot = requireRepoRoot(context);
|
|
237
|
+
emit.data(removeArtifact(repoRoot, ref, opts.reason, { ...opts, actor: currentActor(repoRoot) }));
|
|
238
|
+
});
|
|
239
|
+
});
|
|
182
240
|
root
|
|
183
241
|
.command("capabilities")
|
|
184
242
|
.description("Report artifact schema and hold capabilities for embedding clients.")
|
|
@@ -196,17 +254,28 @@ export function registerArtifactsCommand(program, emit, context) {
|
|
|
196
254
|
.action((opts) => run(emit, () => emit.data({ rows: repairArtifactActivity(requireRepoRoot(context), opts) })));
|
|
197
255
|
root
|
|
198
256
|
.command("hold <ref>")
|
|
199
|
-
.description("Protect an artifact from cleanup until its owner removes
|
|
257
|
+
.description("Protect an artifact from cleanup until the hold lapses or its owner removes it; repeating the same id and reason renews it.")
|
|
200
258
|
.requiredOption("--id <id>", "Unique hold id within this artifact")
|
|
201
259
|
.requiredOption("--reason <text>", "Why cleanup must retain these files")
|
|
202
260
|
.option("--actor <instance-id>", "Stable hold owner; defaults to the current agent")
|
|
261
|
+
.option("--days <n>", "Hold lifetime in days, 1 to 365 (default from artifacts.hold_days)")
|
|
262
|
+
.option("--minutes <n>", "Hold lifetime in minutes; cannot be combined with --days")
|
|
263
|
+
.option("--persistent", "Never lapse; counts toward the held budget. Only for a hold that mirrors an external lease, such as an open checkout with unsynchronized work")
|
|
203
264
|
.action((ref, opts) => run(emit, () => {
|
|
204
265
|
const repoRoot = requireRepoRoot(context);
|
|
205
|
-
|
|
266
|
+
if (opts.days !== undefined && opts.minutes !== undefined)
|
|
267
|
+
throw new Error("choose either --days or --minutes");
|
|
268
|
+
if (opts.persistent && (opts.days !== undefined || opts.minutes !== undefined))
|
|
269
|
+
throw new Error("--persistent cannot be combined with --days or --minutes");
|
|
270
|
+
const manifest = holdArtifact(repoRoot, ref, {
|
|
206
271
|
id: opts.id,
|
|
207
272
|
reason: opts.reason,
|
|
208
273
|
actor: requireHoldActor(repoRoot, opts.actor),
|
|
209
|
-
|
|
274
|
+
...(opts.days !== undefined ? { days: parseHoldDays(opts.days) } : {}),
|
|
275
|
+
...(opts.minutes !== undefined ? { minutes: parseHoldMinutes(opts.minutes) } : {}),
|
|
276
|
+
...(opts.persistent ? { persistent: true } : {}),
|
|
277
|
+
});
|
|
278
|
+
emit.data({ ...manifest, ...usageFields(emit, repoRoot) });
|
|
210
279
|
}));
|
|
211
280
|
root
|
|
212
281
|
.command("unhold <ref>")
|
|
@@ -233,7 +302,7 @@ export function registerArtifactsCommand(program, emit, context) {
|
|
|
233
302
|
: undefined;
|
|
234
303
|
emit.data({
|
|
235
304
|
rows,
|
|
236
|
-
meta:
|
|
305
|
+
meta: inventoryMeta(emit, repoRoot, rows),
|
|
237
306
|
...(reviewPacks ? { review_packs: reviewPacks } : {}),
|
|
238
307
|
});
|
|
239
308
|
});
|
|
@@ -275,6 +344,32 @@ function parseMinutes(value) {
|
|
|
275
344
|
throw new Error("--minutes must be between 1 and 5256000");
|
|
276
345
|
return parsed;
|
|
277
346
|
}
|
|
347
|
+
function parseHoldDays(value) {
|
|
348
|
+
const parsed = Number(value);
|
|
349
|
+
if (!Number.isInteger(parsed) || parsed <= 0 || parsed > 365)
|
|
350
|
+
throw new Error("--days must be between 1 and 365 for a hold");
|
|
351
|
+
return parsed;
|
|
352
|
+
}
|
|
353
|
+
function parseHoldMinutes(value) {
|
|
354
|
+
const parsed = Number(value);
|
|
355
|
+
if (!Number.isInteger(parsed) || parsed < 1 || parsed > 525600)
|
|
356
|
+
throw new Error("--minutes must be between 1 and 525600 for a hold");
|
|
357
|
+
return parsed;
|
|
358
|
+
}
|
|
359
|
+
/** Cheap usage for create and hold: cached held bytes plus live free disk. */
|
|
360
|
+
function usageFields(emit, repoRoot) {
|
|
361
|
+
const quick = artifactQuickUsage(repoRoot);
|
|
362
|
+
for (const warning of quick.warnings)
|
|
363
|
+
emit.log(warning, "warn");
|
|
364
|
+
return { usage: quick.usage, warnings: quick.warnings };
|
|
365
|
+
}
|
|
366
|
+
/** Summary plus held budget and free disk for a full inventory; warnings also go to stderr. */
|
|
367
|
+
function inventoryMeta(emit, repoRoot, rows) {
|
|
368
|
+
const report = artifactUsageReport(repoRoot, rows);
|
|
369
|
+
for (const warning of report.warnings)
|
|
370
|
+
emit.log(warning, "warn");
|
|
371
|
+
return { ...summarize(rows), ...report };
|
|
372
|
+
}
|
|
278
373
|
function collect(value, previous) {
|
|
279
374
|
return [...previous, value];
|
|
280
375
|
}
|
|
@@ -283,9 +378,15 @@ function summarize(rows) {
|
|
|
283
378
|
for (const row of rows) {
|
|
284
379
|
classifications[row.classification] = (classifications[row.classification] ?? 0) + 1;
|
|
285
380
|
}
|
|
381
|
+
const bytes = rows.reduce((sum, row) => sum + (row.bytes ?? 0), 0);
|
|
286
382
|
return {
|
|
287
383
|
total: rows.length,
|
|
288
|
-
|
|
384
|
+
// Disk use. `apparent_bytes` is the sum of file lengths; a large gap
|
|
385
|
+
// between the two means sparse or hard-linked files.
|
|
386
|
+
bytes,
|
|
387
|
+
apparent_bytes: rows.reduce((sum, row) => sum + (row.apparent_bytes ?? 0), 0),
|
|
388
|
+
// Rows carrying a per-row `warning`; `warnings` holds store-level sentences.
|
|
389
|
+
row_warnings: rows.filter((row) => row.warning).length,
|
|
289
390
|
classifications,
|
|
290
391
|
would_delete: rows.filter((row) => row.action === "would-delete").length,
|
|
291
392
|
deleted: rows.filter((row) => row.action === "deleted").length,
|
|
@@ -1,5 +1,161 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
2
|
import type { EmitContext, HarneryProgramContext } from "../commander.js";
|
|
3
|
+
import { type PageReviewCapturePlan, type PageReviewContextAllocation, type PageReviewSourceEvidence } from "../lib/browser/page-review-contracts.js";
|
|
4
|
+
interface BrowseOpts {
|
|
5
|
+
reviewPackPlan?: boolean;
|
|
6
|
+
reviewPackAllocation?: string;
|
|
7
|
+
reviewPackReservation?: string;
|
|
8
|
+
captureTransactionAllocation?: PageReviewContextAllocation;
|
|
9
|
+
captureTransaction?: {
|
|
10
|
+
attempts: Array<{
|
|
11
|
+
attempt: number;
|
|
12
|
+
status: string;
|
|
13
|
+
source_digest?: string;
|
|
14
|
+
error?: string;
|
|
15
|
+
}>;
|
|
16
|
+
source_digest?: string;
|
|
17
|
+
};
|
|
18
|
+
capturePlanResult?: PageReviewCapturePlan;
|
|
19
|
+
captureSourceEvidence?: PageReviewSourceEvidence;
|
|
20
|
+
out?: string;
|
|
21
|
+
screenshot?: boolean;
|
|
22
|
+
fullPage?: boolean;
|
|
23
|
+
snapshot?: boolean;
|
|
24
|
+
html?: boolean;
|
|
25
|
+
selector?: string;
|
|
26
|
+
click?: string;
|
|
27
|
+
fill?: string;
|
|
28
|
+
press?: string;
|
|
29
|
+
waitFor?: string;
|
|
30
|
+
evaluate?: string;
|
|
31
|
+
captureEvaluate?: string;
|
|
32
|
+
batch?: string;
|
|
33
|
+
collect?: string | boolean;
|
|
34
|
+
collectItem?: string;
|
|
35
|
+
collectKey?: string;
|
|
36
|
+
collectKeyPattern?: string;
|
|
37
|
+
collectField?: string[];
|
|
38
|
+
collectExpand?: string | boolean;
|
|
39
|
+
collectMaxItems?: string;
|
|
40
|
+
collectMaxScrolls?: string;
|
|
41
|
+
collectMaxSeconds?: string;
|
|
42
|
+
collectIdle?: string;
|
|
43
|
+
collectStep?: string;
|
|
44
|
+
collectPause?: string;
|
|
45
|
+
collectReadChance?: string;
|
|
46
|
+
collectReadPause?: string;
|
|
47
|
+
collectBackChance?: string;
|
|
48
|
+
collectSeed?: string;
|
|
49
|
+
collectFormat?: string;
|
|
50
|
+
collectOut?: string;
|
|
51
|
+
networkHar?: string;
|
|
52
|
+
login?: boolean;
|
|
53
|
+
attached?: boolean;
|
|
54
|
+
loginCloseFile?: string;
|
|
55
|
+
controlFile?: string;
|
|
56
|
+
headed?: boolean;
|
|
57
|
+
browserArg?: string[];
|
|
58
|
+
browserChannel?: string;
|
|
59
|
+
userAgent?: string;
|
|
60
|
+
proxyFromEnv?: boolean;
|
|
61
|
+
exportCookies?: string;
|
|
62
|
+
cookies?: boolean;
|
|
63
|
+
pace?: boolean;
|
|
64
|
+
store?: string;
|
|
65
|
+
profile?: string;
|
|
66
|
+
viewport?: string;
|
|
67
|
+
deviceScaleFactor?: string;
|
|
68
|
+
colorScheme?: string;
|
|
69
|
+
waitUntil: string;
|
|
70
|
+
timeout: string;
|
|
71
|
+
json?: boolean;
|
|
72
|
+
checkVisible?: string[];
|
|
73
|
+
checkVisibleThreshold?: string;
|
|
74
|
+
checkVisibleFail?: boolean;
|
|
75
|
+
checkVisibleSampleGrid?: string;
|
|
76
|
+
checkVisibleAnnotate?: boolean;
|
|
77
|
+
checkWidth?: string[];
|
|
78
|
+
checkWidthThreshold?: string;
|
|
79
|
+
checkWidthFail?: boolean;
|
|
80
|
+
checkWidthAnnotate?: boolean;
|
|
81
|
+
checkRunts?: boolean | string;
|
|
82
|
+
checkRuntsMinChars?: string;
|
|
83
|
+
checkRuntsFail?: boolean;
|
|
84
|
+
checkRuntsAnnotate?: boolean;
|
|
85
|
+
checkOverflow?: boolean;
|
|
86
|
+
checkOverflowFail?: boolean;
|
|
87
|
+
checkOverflowAnnotate?: boolean;
|
|
88
|
+
checkAlign?: string[];
|
|
89
|
+
checkAlignAxis?: string;
|
|
90
|
+
checkAlignThreshold?: string;
|
|
91
|
+
checkAlignFail?: boolean;
|
|
92
|
+
checkAlignAnnotate?: boolean;
|
|
93
|
+
checkGap?: string[];
|
|
94
|
+
checkGapAxis?: string;
|
|
95
|
+
checkGapExpected?: string;
|
|
96
|
+
checkGapThreshold?: string;
|
|
97
|
+
checkGapFail?: boolean;
|
|
98
|
+
checkGapAnnotate?: boolean;
|
|
99
|
+
checkClip?: string[];
|
|
100
|
+
checkClipThreshold?: string;
|
|
101
|
+
checkClipFail?: boolean;
|
|
102
|
+
checkClipAnnotate?: boolean;
|
|
103
|
+
checkOverlap?: string[];
|
|
104
|
+
checkOverlapThreshold?: string;
|
|
105
|
+
checkOverlapFail?: boolean;
|
|
106
|
+
checkOverlapAnnotate?: boolean;
|
|
107
|
+
checkCrowd?: string[];
|
|
108
|
+
checkCrowdMin?: string;
|
|
109
|
+
checkCrowdFail?: boolean;
|
|
110
|
+
checkCrowdAnnotate?: boolean;
|
|
111
|
+
checkPlaceholder?: boolean | string;
|
|
112
|
+
checkPlaceholderFail?: boolean;
|
|
113
|
+
checkPlaceholderAnnotate?: boolean;
|
|
114
|
+
checkImages?: boolean | string;
|
|
115
|
+
checkImagesTolerance?: string;
|
|
116
|
+
checkImagesFail?: boolean;
|
|
117
|
+
checkImagesAnnotate?: boolean;
|
|
118
|
+
checkTruncation?: boolean | string;
|
|
119
|
+
checkTruncationTolerance?: string;
|
|
120
|
+
checkTruncationFail?: boolean;
|
|
121
|
+
checkTruncationAnnotate?: boolean;
|
|
122
|
+
checkContrast?: boolean | string;
|
|
123
|
+
checkContrastFail?: boolean;
|
|
124
|
+
checkContrastAnnotate?: boolean;
|
|
125
|
+
checkCritique?: boolean | string;
|
|
126
|
+
checkCritiqueBand?: string;
|
|
127
|
+
checkCritiqueOverlap?: string;
|
|
128
|
+
checkCritiqueMaxTiles?: string;
|
|
129
|
+
checkCritiqueRubric?: string;
|
|
130
|
+
checkCritiqueFail?: boolean;
|
|
131
|
+
assert?: string[];
|
|
132
|
+
assertFail?: boolean;
|
|
133
|
+
checkHit?: Array<string | null>;
|
|
134
|
+
checkHitProfile?: string;
|
|
135
|
+
checkHitFail?: boolean;
|
|
136
|
+
checkHitAnnotate?: boolean;
|
|
137
|
+
baseline?: string;
|
|
138
|
+
diff?: string;
|
|
139
|
+
diffThreshold?: string;
|
|
140
|
+
diffFail?: boolean;
|
|
141
|
+
qaPlan?: boolean;
|
|
142
|
+
qaSnapshot?: boolean;
|
|
143
|
+
qaTarget?: string;
|
|
144
|
+
qaTheme?: string;
|
|
145
|
+
qaState?: string;
|
|
146
|
+
qaScope?: string[];
|
|
147
|
+
qaStates?: string[];
|
|
148
|
+
qaReuse?: boolean;
|
|
149
|
+
qaReuseThreshold?: string;
|
|
150
|
+
reviewPack?: string;
|
|
151
|
+
reviewPackContext?: string;
|
|
152
|
+
reviewPackScope?: string[];
|
|
153
|
+
/** Re-capture ONE existing tile of --review-pack-context at --device-scale-factor. */
|
|
154
|
+
reviewPackExpand?: string;
|
|
155
|
+
/** Gate-hit rectangles (`x,y,w,h` strings) whose bands are captured past the tile cap. */
|
|
156
|
+
reviewPackHitRect?: string[];
|
|
157
|
+
devOverlay?: boolean;
|
|
158
|
+
}
|
|
3
159
|
export declare function registerBrowseCommand(program: Command, emitParam: EmitContext, context?: HarneryProgramContext, binName?: string): void;
|
|
4
160
|
/**
|
|
5
161
|
* Capture this render into a page review pack: one full-page screenshot,
|
|
@@ -9,4 +165,12 @@ export declare function registerBrowseCommand(program: Command, emitParam: EmitC
|
|
|
9
165
|
* once the browser is gone.
|
|
10
166
|
*/
|
|
11
167
|
export declare const REVIEW_CAPTURE_RECIPE = "native-full-page-scroll-probe/v2";
|
|
168
|
+
/**
|
|
169
|
+
* How a `browse` run handles sign-in. `--login` opens the installed Google
|
|
170
|
+
* Chrome with nothing attached, because sites can detect an
|
|
171
|
+
* automation-controlled browser and disable the account that signed in with
|
|
172
|
+
* it. The attached window is reachable only through an explicit `--attached`.
|
|
173
|
+
*/
|
|
174
|
+
export declare function resolveLoginMode(opts: Pick<BrowseOpts, "login" | "attached" | "controlFile" | "loginCloseFile">): "none" | "plain" | "attached";
|
|
175
|
+
export {};
|
|
12
176
|
//# sourceMappingURL=browse.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browse.d.ts","sourceRoot":"","sources":["../../src/commands/browse.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"browse.d.ts","sourceRoot":"","sources":["../../src/commands/browse.ts"],"names":[],"mappings":"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"}
|