harnery 0.40.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/README.md +1 -1
- package/dist/commander.js +4 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +34 -20
- package/dist/commands/artifacts.d.ts.map +1 -1
- package/dist/commands/artifacts.js +113 -12
- package/dist/commands/browse-ai.d.ts.map +1 -1
- package/dist/commands/browse-ai.js +4 -0
- package/dist/commands/browse.d.ts +164 -0
- package/dist/commands/browse.d.ts.map +1 -1
- package/dist/commands/browse.js +388 -45
- package/dist/commands/checkpoint.js +8 -12
- package/dist/commands/claude-desktop.d.ts.map +1 -1
- package/dist/commands/claude-desktop.js +52 -0
- package/dist/commands/deinit.d.ts +1 -1
- package/dist/commands/deinit.d.ts.map +1 -1
- package/dist/commands/deinit.js +8 -4
- 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/docs.d.ts.map +1 -1
- package/dist/commands/docs.js +2 -0
- package/dist/commands/doctor.d.ts +8 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +58 -3
- package/dist/commands/fetch.d.ts.map +1 -1
- package/dist/commands/fetch.js +10 -0
- 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 +21 -5
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +271 -109
- package/dist/commands/instructions.js +5 -4
- package/dist/commands/ledger-v3.d.ts.map +1 -1
- package/dist/commands/ledger-v3.js +2 -1
- 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/commands/webview.d.ts +4 -0
- package/dist/commands/webview.d.ts.map +1 -0
- package/dist/commands/webview.js +94 -0
- package/dist/core/adapter.d.ts +50 -1
- package/dist/core/adapter.d.ts.map +1 -1
- package/dist/core/adapter.js +59 -1
- package/dist/core/adapters/attestation.d.ts.map +1 -1
- package/dist/core/adapters/attestation.js +3 -2
- package/dist/core/adapters/profiles.d.ts +29 -3
- package/dist/core/adapters/profiles.d.ts.map +1 -1
- package/dist/core/adapters/profiles.js +53 -1
- package/dist/core/adapters/registry.d.ts.map +1 -1
- package/dist/core/adapters/registry.js +33 -0
- package/dist/core/adapters/types.d.ts +9 -0
- package/dist/core/adapters/types.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.d.ts +1 -1
- package/dist/core/agents/canonical-emit.d.ts.map +1 -1
- package/dist/core/agents/canonical-emit.js +2 -7
- package/dist/core/agents/cli.js +25 -16
- package/dist/core/agents/coord-client.d.ts.map +1 -1
- package/dist/core/agents/coord-client.js +7 -2
- 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/rules/claim-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/claim-conflict.js +3 -9
- package/dist/core/agents/rules/commit-conflict.d.ts.map +1 -1
- package/dist/core/agents/rules/commit-conflict.js +2 -8
- package/dist/core/agents/rules/stop-hook.d.ts +2 -0
- package/dist/core/agents/rules/stop-hook.d.ts.map +1 -1
- package/dist/core/agents/rules/stop-hook.js +1 -1
- package/dist/core/agents/session-events.d.ts +6 -2
- package/dist/core/agents/session-events.d.ts.map +1 -1
- package/dist/core/agents/session-events.js +105 -26
- package/dist/core/agents/session-finalization-state-v3.d.ts.map +1 -1
- package/dist/core/agents/session-finalization-state-v3.js +2 -1
- package/dist/core/agents/session-finalizer-v3.d.ts.map +1 -1
- package/dist/core/agents/session-finalizer-v3.js +5 -4
- package/dist/core/agents/session-name-display.d.ts +28 -0
- package/dist/core/agents/session-name-display.d.ts.map +1 -1
- package/dist/core/agents/session-name-display.js +43 -0
- package/dist/core/agents/state/heartbeat-reader.d.ts +7 -0
- package/dist/core/agents/state/heartbeat-reader.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.d.ts +10 -0
- package/dist/core/agents/state/heartbeat-writer.d.ts.map +1 -1
- package/dist/core/agents/state/heartbeat-writer.js +21 -2
- 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 +61 -0
- package/dist/core/agents/state/live-coordination-writer.js +3 -0
- package/dist/core/agents/state/stale-sweep.d.ts.map +1 -1
- package/dist/core/agents/state/stale-sweep.js +2 -10
- package/dist/core/agents/turn-changes.d.ts +17 -0
- package/dist/core/agents/turn-changes.d.ts.map +1 -0
- package/dist/core/agents/turn-changes.js +76 -0
- package/dist/core/artifacts/delivery-card.d.ts.map +1 -1
- package/dist/core/artifacts/delivery-card.js +11 -3
- 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 +526 -52
- package/dist/core/config.d.ts +73 -11
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +142 -3
- package/dist/core/context/index.d.ts.map +1 -1
- package/dist/core/context/index.js +2 -1
- package/dist/core/conversations/archive.d.ts.map +1 -1
- package/dist/core/conversations/archive.js +4 -3
- package/dist/core/diagnostics/bundle.d.ts.map +1 -1
- package/dist/core/diagnostics/bundle.js +5 -4
- package/dist/core/events/legacy-storage/canary.d.ts.map +1 -1
- package/dist/core/events/legacy-storage/canary.js +5 -4
- package/dist/core/events/legacy-storage/compression.d.ts.map +1 -1
- package/dist/core/events/legacy-storage/compression.js +2 -1
- package/dist/core/events/v3/adapter-id.d.ts +10 -2
- package/dist/core/events/v3/adapter-id.d.ts.map +1 -1
- package/dist/core/events/v3/adapter-id.js +16 -0
- package/dist/core/events/v3/authority-outbox.d.ts.map +1 -1
- package/dist/core/events/v3/authority-outbox.js +2 -1
- package/dist/core/events/v3/bootstrap.d.ts.map +1 -1
- package/dist/core/events/v3/bootstrap.js +5 -4
- package/dist/core/events/v3/capabilities.d.ts.map +1 -1
- package/dist/core/events/v3/capabilities.js +17 -0
- package/dist/core/events/v3/contract.d.ts +5 -0
- package/dist/core/events/v3/contract.d.ts.map +1 -1
- package/dist/core/events/v3/contract.js +7 -1
- package/dist/core/events/v3/control-witness.d.ts.map +1 -1
- package/dist/core/events/v3/control-witness.js +3 -2
- package/dist/core/events/v3/coordination-transaction-recovery.d.ts.map +1 -1
- package/dist/core/events/v3/coordination-transaction-recovery.js +4 -3
- package/dist/core/events/v3/fingerprint-keys.d.ts.map +1 -1
- package/dist/core/events/v3/fingerprint-keys.js +7 -6
- package/dist/core/events/v3/generated.d.ts +1 -1
- package/dist/core/events/v3/generated.js +1 -1
- package/dist/core/events/v3/live-feed.d.ts.map +1 -1
- package/dist/core/events/v3/live-feed.js +5 -4
- package/dist/core/events/v3/producers/command-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/command-recorder.js +8 -7
- package/dist/core/events/v3/producers/coordination-recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/coordination-recorder.js +8 -7
- package/dist/core/events/v3/producers/diagnostic-summaries.d.ts.map +1 -1
- package/dist/core/events/v3/producers/diagnostic-summaries.js +5 -4
- package/dist/core/events/v3/producers/hook-base.d.ts +1 -0
- package/dist/core/events/v3/producers/hook-base.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook-base.js +10 -4
- package/dist/core/events/v3/producers/hook.d.ts +2 -0
- package/dist/core/events/v3/producers/hook.d.ts.map +1 -1
- package/dist/core/events/v3/producers/hook.js +16 -1
- package/dist/core/events/v3/producers/intake.d.ts.map +1 -1
- package/dist/core/events/v3/producers/intake.js +16 -6
- package/dist/core/events/v3/producers/recorder.d.ts +2 -4
- package/dist/core/events/v3/producers/recorder.d.ts.map +1 -1
- package/dist/core/events/v3/producers/recorder.js +125 -101
- package/dist/core/events/v3/projection.js +9 -1
- package/dist/core/events/v3/recovery.d.ts.map +1 -1
- package/dist/core/events/v3/recovery.js +4 -3
- package/dist/core/events/v3/support-storage/inventory.d.ts.map +1 -1
- package/dist/core/events/v3/support-storage/inventory.js +2 -1
- package/dist/core/events/v3/support-storage/maintenance.d.ts.map +1 -1
- package/dist/core/events/v3/support-storage/maintenance.js +4 -3
- package/dist/core/events/v3/support-storage/pack-reader.d.ts.map +1 -1
- package/dist/core/events/v3/support-storage/pack-reader.js +4 -3
- package/dist/core/events/v3/support-storage/pack-writer.d.ts.map +1 -1
- package/dist/core/events/v3/support-storage/pack-writer.js +6 -5
- package/dist/core/events/v3/tool-line-changes.d.ts +8 -0
- package/dist/core/events/v3/tool-line-changes.d.ts.map +1 -0
- package/dist/core/events/v3/tool-line-changes.js +135 -0
- package/dist/core/events/v3/writer.d.ts.map +1 -1
- package/dist/core/events/v3/writer.js +8 -7
- package/dist/core/governor/planning.d.ts.map +1 -1
- package/dist/core/governor/planning.js +6 -5
- package/dist/core/governor/service.d.ts.map +1 -1
- package/dist/core/governor/service.js +12 -11
- package/dist/core/governor/state.d.ts.map +1 -1
- package/dist/core/governor/state.js +7 -6
- package/dist/core/guard/evaluator.js +1 -0
- package/dist/core/guard/storage.d.ts.map +1 -1
- package/dist/core/guard/storage.js +3 -2
- package/dist/core/hooks/adapter/behaviors/claude-code.d.ts +4 -0
- package/dist/core/hooks/adapter/behaviors/claude-code.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/claude-code.js +31 -0
- package/dist/core/hooks/adapter/behaviors/codex.d.ts +15 -0
- package/dist/core/hooks/adapter/behaviors/codex.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/codex.js +82 -0
- package/dist/core/hooks/adapter/behaviors/cursor.d.ts +7 -0
- package/dist/core/hooks/adapter/behaviors/cursor.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/cursor.js +35 -0
- package/dist/core/hooks/adapter/behaviors/index.d.ts +11 -0
- package/dist/core/hooks/adapter/behaviors/index.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/index.js +20 -0
- package/dist/core/hooks/adapter/behaviors/openclaw.d.ts +7 -0
- package/dist/core/hooks/adapter/behaviors/openclaw.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/openclaw.js +34 -0
- package/dist/core/hooks/adapter/behaviors/opencode.d.ts +7 -0
- package/dist/core/hooks/adapter/behaviors/opencode.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/opencode.js +34 -0
- package/dist/core/hooks/adapter/behaviors/types.d.ts +89 -0
- package/dist/core/hooks/adapter/behaviors/types.d.ts.map +1 -0
- package/dist/core/hooks/adapter/behaviors/types.js +1 -0
- package/dist/core/hooks/adapter/detect.d.ts +1 -1
- package/dist/core/hooks/adapter/detect.d.ts.map +1 -1
- package/dist/core/hooks/adapter/detect.js +2 -3
- package/dist/core/hooks/adapter/events.d.ts +46 -1
- package/dist/core/hooks/adapter/events.d.ts.map +1 -1
- package/dist/core/hooks/adapter/events.js +36 -0
- package/dist/core/hooks/adapter/opencode-plugin.d.ts +60 -0
- package/dist/core/hooks/adapter/opencode-plugin.d.ts.map +1 -0
- package/dist/core/hooks/adapter/opencode-plugin.js +129 -0
- package/dist/core/hooks/adapter/output.d.ts +7 -0
- package/dist/core/hooks/adapter/output.d.ts.map +1 -1
- package/dist/core/hooks/adapter/output.js +8 -1
- package/dist/core/hooks/adapter/runtime-telemetry.js +3 -1
- package/dist/core/hooks/adapter/wiring.d.ts +52 -8
- package/dist/core/hooks/adapter/wiring.d.ts.map +1 -1
- package/dist/core/hooks/adapter/wiring.js +133 -12
- package/dist/core/hooks/cli.js +676 -531
- package/dist/core/hooks/effects/image-capture.d.ts.map +1 -1
- package/dist/core/hooks/effects/image-capture.js +2 -1
- package/dist/core/hooks/prompt-context/contract.d.ts.map +1 -1
- package/dist/core/hooks/prompt-context/contract.js +1 -0
- package/dist/core/hooks/resolve/transcript.d.ts +1 -1
- package/dist/core/hooks/resolve/transcript.d.ts.map +1 -1
- package/dist/core/hooks/resolve/transcript.js +35 -4
- 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/hooks/session-name-presence.d.ts +3 -1
- package/dist/core/hooks/session-name-presence.d.ts.map +1 -1
- package/dist/core/hooks/session-name-presence.js +7 -2
- package/dist/core/hooks/shell-waiter.d.ts +2 -0
- package/dist/core/hooks/shell-waiter.d.ts.map +1 -0
- package/dist/core/hooks/shell-waiter.js +173 -0
- package/dist/core/resources/service.d.ts.map +1 -1
- package/dist/core/resources/service.js +5 -4
- package/dist/core/semantic/review.d.ts.map +1 -1
- package/dist/core/semantic/review.js +5 -4
- package/dist/core/semantic/service.d.ts.map +1 -1
- package/dist/core/semantic/service.js +15 -14
- package/dist/core/semantic/storage.d.ts.map +1 -1
- package/dist/core/semantic/storage.js +5 -4
- 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/atomic-json.d.ts.map +1 -1
- package/dist/core/storage/atomic-json.js +7 -3
- package/dist/core/storage/builtins.js +1 -0
- package/dist/core/storage/durable-history.d.ts.map +1 -1
- package/dist/core/storage/durable-history.js +6 -5
- package/dist/core/storage/maintenance-providers.d.ts.map +1 -1
- package/dist/core/storage/maintenance-providers.js +2 -1
- package/dist/core/storage/maintenance.d.ts.map +1 -1
- package/dist/core/storage/maintenance.js +7 -6
- package/dist/core/storage/metrics.d.ts.map +1 -1
- package/dist/core/storage/metrics.js +5 -1
- package/dist/core/storage/modes.d.ts +17 -0
- package/dist/core/storage/modes.d.ts.map +1 -0
- package/dist/core/storage/modes.js +47 -0
- package/dist/core/storage/process-log.d.ts.map +1 -1
- package/dist/core/storage/process-log.js +3 -2
- package/dist/core/storage/receipts.d.ts.map +1 -1
- package/dist/core/storage/receipts.js +4 -3
- package/dist/core/storage/segments.d.ts.map +1 -1
- package/dist/core/storage/segments.js +7 -6
- package/dist/core/supervisor/hook-health.d.ts +2 -1
- package/dist/core/supervisor/hook-health.d.ts.map +1 -1
- package/dist/core/supervisor/hook-health.js +4 -3
- package/dist/core/supervisor/service.d.ts.map +1 -1
- package/dist/core/supervisor/service.js +7 -6
- package/dist/core/work/state.d.ts.map +1 -1
- package/dist/core/work/state.js +8 -7
- package/dist/core/workflow/adapters.d.ts +7 -0
- package/dist/core/workflow/adapters.d.ts.map +1 -1
- package/dist/core/workflow/adapters.js +9 -0
- package/dist/core/workflow/approvals.d.ts.map +1 -1
- package/dist/core/workflow/approvals.js +6 -5
- package/dist/core/workflow/billing.d.ts.map +1 -1
- package/dist/core/workflow/billing.js +33 -4
- package/dist/core/workflow/durable-record.d.ts.map +1 -1
- package/dist/core/workflow/durable-record.js +4 -3
- package/dist/core/workflow/engine.d.ts.map +1 -1
- package/dist/core/workflow/engine.js +30 -1
- package/dist/core/workflow/live-session-v3.d.ts.map +1 -1
- package/dist/core/workflow/live-session-v3.js +2 -3
- package/dist/core/workflow/run-state.d.ts.map +1 -1
- package/dist/core/workflow/run-state.js +3 -2
- 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 +36 -0
- package/dist/core/workflow/spawn-opencode.d.ts.map +1 -0
- package/dist/core/workflow/spawn-opencode.js +135 -0
- package/dist/core/workflow/transcript.d.ts.map +1 -1
- package/dist/core/workflow/transcript.js +3 -2
- 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/core/workflow/workspaces/leases.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/leases.js +5 -4
- package/dist/core/workflow/workspaces/local-git.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/local-git.js +3 -2
- package/dist/core/workflow/workspaces/paths.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/paths.js +2 -1
- package/dist/core/workflow/workspaces/state.d.ts.map +1 -1
- package/dist/core/workflow/workspaces/state.js +10 -9
- package/dist/lazy-commands.js +8 -1
- package/dist/lib/agent-browser/client.d.ts +9 -0
- package/dist/lib/agent-browser/client.d.ts.map +1 -1
- package/dist/lib/agent-browser/client.js +13 -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/client.d.ts +35 -1
- package/dist/lib/browser/client.d.ts.map +1 -1
- package/dist/lib/browser/client.js +117 -8
- 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/identity.d.ts +25 -0
- package/dist/lib/browser/identity.d.ts.map +1 -0
- package/dist/lib/browser/identity.js +66 -0
- package/dist/lib/browser/index.d.ts +3 -2
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +2 -1
- package/dist/lib/browser/launch-args.d.ts +26 -0
- package/dist/lib/browser/launch-args.d.ts.map +1 -1
- package/dist/lib/browser/launch-args.js +41 -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/user-agent.d.ts +53 -0
- package/dist/lib/browser/user-agent.d.ts.map +1 -0
- package/dist/lib/browser/user-agent.js +79 -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/docs-metadata-managed.d.ts +1 -0
- package/dist/lib/docs-metadata-managed.d.ts.map +1 -1
- package/dist/lib/docs-metadata-managed.js +17 -1
- 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/identities/assume.d.ts.map +1 -1
- package/dist/lib/identities/assume.js +4 -9
- package/dist/lib/instructions/apply.d.ts.map +1 -1
- package/dist/lib/instructions/apply.js +2 -0
- package/dist/lib/instructions/templates.js +8 -8
- package/dist/lib/pace/index.d.ts +2 -0
- package/dist/lib/pace/index.d.ts.map +1 -0
- package/dist/lib/pace/index.js +1 -0
- package/dist/lib/pace/pace.d.ts +95 -0
- package/dist/lib/pace/pace.d.ts.map +1 -0
- package/dist/lib/pace/pace.js +313 -0
- 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/forward-headers.d.ts +11 -0
- package/dist/lib/tunnel/forward-headers.d.ts.map +1 -0
- package/dist/lib/tunnel/forward-headers.js +17 -0
- package/dist/lib/tunnel/gate.js +34 -10
- 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/dist/lib/webview/index.d.ts +2 -0
- package/dist/lib/webview/index.d.ts.map +1 -0
- package/dist/lib/webview/index.js +1 -0
- package/dist/lib/webview/webview.d.ts +116 -0
- package/dist/lib/webview/webview.d.ts.map +1 -0
- package/dist/lib/webview/webview.js +289 -0
- package/opencode-plugin/package.json +19 -0
- package/opencode-plugin/src/index.ts +791 -0
- package/package.json +16 -4
- package/schemas/config.schema.json +104 -0
- package/schemas/event-v3.schema.json +164 -0
- package/src/commander.ts +26 -0
- package/src/commands/agents.ts +47 -18
- package/src/commands/artifacts.ts +171 -19
- package/src/commands/browse-ai.ts +8 -0
- package/src/commands/browse.ts +570 -48
- package/src/commands/checkpoint.ts +7 -9
- package/src/commands/claude-desktop.ts +61 -0
- package/src/commands/deinit.ts +9 -4
- package/src/commands/disk.ts +114 -0
- package/src/commands/docs.ts +2 -0
- package/src/commands/doctor.ts +63 -3
- package/src/commands/fetch.ts +14 -0
- package/src/commands/files.ts +93 -2
- package/src/commands/init.ts +334 -122
- package/src/commands/instructions.ts +8 -4
- package/src/commands/ledger-v3.ts +2 -1
- package/src/commands/rm.ts +115 -0
- package/src/commands/servers.ts +506 -0
- package/src/commands/tunnel.ts +102 -2
- package/src/commands/webview.ts +159 -0
- package/src/core/adapter.ts +102 -1
- package/src/core/adapters/attestation.ts +3 -2
- package/src/core/adapters/profiles.ts +63 -1
- package/src/core/adapters/registry.ts +37 -0
- package/src/core/adapters/types.ts +10 -0
- package/src/core/agents/canonical-emit.ts +2 -5
- package/src/core/agents/cli.ts +26 -17
- package/src/core/agents/coord-client.ts +9 -3
- package/src/core/agents/render/session-context.ts +1 -0
- package/src/core/agents/rules/claim-conflict.ts +3 -8
- package/src/core/agents/rules/commit-conflict.ts +2 -7
- package/src/core/agents/rules/stop-hook.ts +3 -1
- package/src/core/agents/session-events.ts +120 -26
- package/src/core/agents/session-finalization-state-v3.ts +2 -1
- package/src/core/agents/session-finalizer-v3.ts +5 -4
- package/src/core/agents/session-name-display.ts +48 -0
- package/src/core/agents/state/heartbeat-reader.ts +7 -0
- package/src/core/agents/state/heartbeat-writer.ts +24 -2
- package/src/core/agents/state/live-coordination-view.ts +74 -0
- package/src/core/agents/state/live-coordination-writer.ts +3 -0
- package/src/core/agents/state/stale-sweep.ts +2 -9
- package/src/core/agents/turn-changes.ts +97 -0
- package/src/core/artifacts/delivery-card.ts +12 -3
- package/src/core/artifacts/index.ts +701 -47
- package/src/core/config.ts +206 -4
- package/src/core/context/index.ts +2 -1
- package/src/core/conversations/archive.ts +4 -3
- package/src/core/diagnostics/bundle.ts +5 -3
- package/src/core/events/legacy-storage/canary.ts +5 -4
- package/src/core/events/legacy-storage/compression.ts +2 -1
- package/src/core/events/v3/adapter-id.ts +29 -1
- package/src/core/events/v3/authority-outbox.ts +2 -1
- package/src/core/events/v3/bootstrap.ts +5 -4
- package/src/core/events/v3/capabilities.ts +17 -0
- package/src/core/events/v3/contract.ts +9 -1
- package/src/core/events/v3/control-witness.ts +3 -2
- package/src/core/events/v3/coordination-transaction-recovery.ts +4 -3
- package/src/core/events/v3/fingerprint-keys.ts +7 -6
- package/src/core/events/v3/generated.ts +1 -1
- package/src/core/events/v3/live-feed.ts +5 -4
- package/src/core/events/v3/producers/command-recorder.ts +8 -6
- package/src/core/events/v3/producers/coordination-recorder.ts +8 -7
- package/src/core/events/v3/producers/diagnostic-summaries.ts +5 -4
- package/src/core/events/v3/producers/hook-base.ts +11 -4
- package/src/core/events/v3/producers/hook.ts +19 -1
- package/src/core/events/v3/producers/intake.ts +18 -6
- package/src/core/events/v3/producers/recorder.ts +139 -114
- package/src/core/events/v3/projection.ts +11 -1
- package/src/core/events/v3/recovery.ts +4 -3
- package/src/core/events/v3/support-storage/inventory.ts +2 -1
- package/src/core/events/v3/support-storage/maintenance.ts +8 -3
- package/src/core/events/v3/support-storage/pack-reader.ts +4 -3
- package/src/core/events/v3/support-storage/pack-writer.ts +6 -5
- package/src/core/events/v3/tool-line-changes.ts +139 -0
- package/src/core/events/v3/writer.ts +8 -7
- package/src/core/governor/planning.ts +6 -5
- package/src/core/governor/service.ts +12 -11
- package/src/core/governor/state.ts +7 -6
- package/src/core/guard/evaluator.ts +1 -0
- package/src/core/guard/storage.ts +3 -2
- package/src/core/hooks/adapter/behaviors/claude-code.ts +33 -0
- package/src/core/hooks/adapter/behaviors/codex.ts +96 -0
- package/src/core/hooks/adapter/behaviors/cursor.ts +37 -0
- package/src/core/hooks/adapter/behaviors/index.ts +31 -0
- package/src/core/hooks/adapter/behaviors/openclaw.ts +36 -0
- package/src/core/hooks/adapter/behaviors/opencode.ts +36 -0
- package/src/core/hooks/adapter/behaviors/types.ts +110 -0
- package/src/core/hooks/adapter/detect.ts +2 -3
- package/src/core/hooks/adapter/events.ts +72 -1
- package/src/core/hooks/adapter/opencode-plugin.ts +177 -0
- package/src/core/hooks/adapter/output.ts +8 -1
- package/src/core/hooks/adapter/runtime-telemetry.ts +3 -1
- package/src/core/hooks/adapter/wiring.ts +198 -16
- package/src/core/hooks/cli.ts +776 -539
- package/src/core/hooks/effects/image-capture.ts +2 -1
- package/src/core/hooks/prompt-context/contract.ts +1 -0
- package/src/core/hooks/resolve/transcript.ts +42 -5
- package/src/core/hooks/run-markers.ts +132 -0
- package/src/core/hooks/session-name-presence.ts +10 -3
- package/src/core/hooks/shell-waiter.ts +166 -0
- package/src/core/resources/service.ts +5 -4
- package/src/core/semantic/review.ts +5 -4
- package/src/core/semantic/service.ts +15 -14
- package/src/core/semantic/storage.ts +5 -4
- 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/atomic-json.ts +7 -3
- package/src/core/storage/builtins.ts +1 -0
- package/src/core/storage/durable-history.ts +6 -5
- package/src/core/storage/maintenance-providers.ts +2 -1
- package/src/core/storage/maintenance.ts +7 -6
- package/src/core/storage/metrics.ts +5 -1
- package/src/core/storage/modes.ts +53 -0
- package/src/core/storage/process-log.ts +3 -2
- package/src/core/storage/receipts.ts +4 -3
- package/src/core/storage/segments.ts +7 -6
- package/src/core/supervisor/hook-health.ts +4 -4
- package/src/core/supervisor/service.ts +7 -6
- package/src/core/work/state.ts +8 -7
- package/src/core/workflow/adapters.ts +15 -0
- package/src/core/workflow/approvals.ts +6 -5
- package/src/core/workflow/billing.ts +34 -4
- package/src/core/workflow/durable-record.ts +4 -3
- package/src/core/workflow/engine.ts +38 -1
- package/src/core/workflow/live-session-v3.ts +2 -3
- package/src/core/workflow/run-state.ts +3 -2
- 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 +153 -0
- package/src/core/workflow/transcript.ts +3 -2
- package/src/core/workflow/types.ts +62 -2
- package/src/core/workflow/worker-access.ts +525 -0
- package/src/core/workflow/workspaces/leases.ts +5 -4
- package/src/core/workflow/workspaces/local-git.ts +3 -2
- package/src/core/workflow/workspaces/paths.ts +2 -1
- package/src/core/workflow/workspaces/state.ts +10 -9
- package/src/lazy-commands.ts +11 -1
- package/src/lib/agent-browser/client.ts +18 -0
- package/src/lib/browser/batch-steps.ts +79 -0
- package/src/lib/browser/client.ts +147 -9
- 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/identity.ts +64 -0
- package/src/lib/browser/index.ts +16 -1
- package/src/lib/browser/launch-args.ts +53 -1
- 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/user-agent.ts +130 -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/docs-metadata-managed.ts +21 -0
- package/src/lib/guarded-remove.ts +376 -0
- package/src/lib/identities/assume.ts +7 -7
- package/src/lib/instructions/apply.ts +2 -0
- package/src/lib/instructions/templates.ts +8 -8
- package/src/lib/pace/index.ts +14 -0
- package/src/lib/pace/pace.ts +370 -0
- package/src/lib/tunnel/error-page.ts +25 -9
- package/src/lib/tunnel/forward-headers.ts +16 -0
- package/src/lib/tunnel/gate.ts +39 -10
- package/src/lib/tunnel/path-scope.ts +73 -0
- package/src/lib/tunnel/state.ts +20 -3
- package/src/lib/webview/index.ts +13 -0
- package/src/lib/webview/webview.ts +457 -0
package/README.md
CHANGED
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
- **Standalone web UI.** `harn web up` boots a local Next.js dashboard for the coord layer, councils, per-project state, and a local coding-agent status view (Claude Code / Codex / Cursor usage, backed by `harn devtools`). Ships with the git clone, not the npm package (see [Install](#install)).
|
|
29
29
|
- **Backup + sync.** `harn backup` snapshots `.harnery/` via [restic](https://restic.net/); `harn sync` keeps a curated subset live across machines via [rclone](https://rclone.org/) (Google Drive or any rclone remote).
|
|
30
30
|
|
|
31
|
-
The CLI also ships batteries: portable utility commands (`tokens`, `eml`, `env`, `grep` for parallel, ripgrep-accelerated monorepo search, plus `docs`, `browse`, `fetch`, `read`, `devtools`, and more) and the library toolkit they're built from. Useful, cross-platform, and dependency-light, but deliberately not the headline. Coordination is why harnery exists; the toolkit exists because the CLI needed it (see [Public surface tiers](#public-surface-tiers)).
|
|
31
|
+
The CLI also ships batteries: portable utility commands (`tokens`, `eml`, `env`, `grep` for parallel, ripgrep-accelerated monorepo search, plus `docs`, `browse`, `fetch`, `read`, `webview`, `devtools`, and more) and the library toolkit they're built from. Every page loader reads at human pace by default, waiting 3 to 9 seconds between loads of one site through a machine-wide ledger, with `--no-pace` and `HARNERY_PACE=off` to opt out. Useful, cross-platform, and dependency-light, but deliberately not the headline. Coordination is why harnery exists; the toolkit exists because the CLI needed it (see [Public surface tiers](#public-surface-tiers)).
|
|
32
32
|
|
|
33
33
|
## Install
|
|
34
34
|
|
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)),
|
|
@@ -113,6 +114,7 @@ function harneryCommandBundles({ emit, context, binName, }) {
|
|
|
113
114
|
lazy("admission", "Machine-wide admission control for heavy jobs: `admission run --resource <name> -- <command…>` waits for a FIFO slot then runs the command; `admission status` lists holders and waiters per resource.", async (program) => (await import("./commands/admission.js")).registerAdmissionCommand(program, emit)),
|
|
114
115
|
lazy("browse-session", "Control an opted-in headed browse session through an owner-only descriptor", async (program) => (await import("./commands/browse-session.js")).registerBrowseSessionCommand(program, emit)),
|
|
115
116
|
lazy("browse-ai <url>", `agent-browser (Vercel Labs) wrapper: accessibility-tree snapshots with element refs (@e1, @e2) for LLM consumption. Daemon-mode: successive calls reuse the same browser instance. Sister to ${binName} browse (Playwright).`, async (program) => (await import("./commands/browse-ai.js")).registerBrowseAiCommand(program, emit, context), { hasOptions: true }),
|
|
117
|
+
lazy("webview <url>", `Lightweight headless page probe through Bun.WebView (experimental, Bun 1.4+). Fresh ephemeral browser per call; use ${binName} browse for login, cookies, HAR, and QA.`, async (program) => (await import("./commands/webview.js")).registerWebviewCommand(program, emit, binName), { hasOptions: true }),
|
|
116
118
|
{
|
|
117
119
|
commands: [
|
|
118
120
|
{
|
|
@@ -143,6 +145,7 @@ function harneryCommandBundles({ emit, context, binName, }) {
|
|
|
143
145
|
lazy("supervisor", "Run Harnery's optional local diagnostic supervisor", async (program) => (await import("./commands/supervisor.js")).registerSupervisorCommand(program, emit, context)),
|
|
144
146
|
lazy("diagnostics", "Inspect, capture, and replay bounded local diagnostic findings", async (program) => (await import("./commands/diagnostics.js")).registerDiagnosticsCommand(program, emit, context), { hasOptions: true }),
|
|
145
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 }),
|
|
146
149
|
lazy("logs", "List and query bounded Harnery log families", async (program) => (await import("./commands/logs.js")).registerLogsCommand(program, emit, context)),
|
|
147
150
|
lazy("inbox", "Inspect private coordination inbox state", async (program) => (await import("./commands/inbox.js")).registerInboxCommand(program, emit, context?.coordinationInbox)),
|
|
148
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 }),
|
|
@@ -160,6 +163,7 @@ function harneryCommandBundles({ emit, context, binName, }) {
|
|
|
160
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"] }),
|
|
161
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 }),
|
|
162
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)),
|
|
163
167
|
lazy("docs", "Documentation tooling: freshness report, metadata, lint, sweep, index", async (program) => (await import("./commands/docs.js")).registerDocsCommand(program, emit, context), { hasOptions: true }),
|
|
164
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)),
|
|
165
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":"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"}
|
package/dist/commands/agents.js
CHANGED
|
@@ -27,11 +27,12 @@ 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
|
+
import { turnChangesStatusRow } from "../core/agents/turn-changes.js";
|
|
32
33
|
import { turnElapsedStatusRow } from "../core/agents/turn-elapsed.js";
|
|
33
34
|
import { coordFreshnessSeconds, resolveBinName, sessionFinalizationConfig, } from "../core/config.js";
|
|
34
|
-
import { EVENT_ADAPTER_IDS_V3 } from "../core/events/v3/adapter-id.js";
|
|
35
|
+
import { EVENT_ADAPTER_IDS_V3, normalizeEventAdapterIdV3, } from "../core/events/v3/adapter-id.js";
|
|
35
36
|
import { readEventV3ControlState } from "../core/events/v3/control.js";
|
|
36
37
|
import { projectCoordinationViewV3, readCoordinationViewV3, } from "../core/events/v3/coordination-view.js";
|
|
37
38
|
import { liveInstanceIdV3 } from "../core/events/v3/live-routing.js";
|
|
@@ -337,7 +338,7 @@ export function registerAgentsCommand(program, emitParam, programContext, binNam
|
|
|
337
338
|
.option("--kind <kind>", "pidmap | cache. Defaults to cache.")
|
|
338
339
|
.option("--session-id <id>", "(--kind cache) native session id used to join the authoritative V3 generation.")
|
|
339
340
|
.option("--adapter <id>", "(--kind cache) adapter used to validate the authoritative V3 generation: " +
|
|
340
|
-
"claude-code | cursor | codex.")
|
|
341
|
+
"claude-code | cursor | codex | opencode.")
|
|
341
342
|
.option("--pid <pid>", "(--kind pidmap) PID to register in pid-map. Default: walk " +
|
|
342
343
|
"this shell's ppid chain for a claude process. Pass explicitly " +
|
|
343
344
|
"when calling from outside Claude Code's Bash tool tree (e.g. " +
|
|
@@ -813,7 +814,7 @@ function runWhoami(opts) {
|
|
|
813
814
|
if (!hb) {
|
|
814
815
|
emit.error({
|
|
815
816
|
code: "no_live_generation",
|
|
816
|
-
message: noLiveGenerationMessage(myOwner),
|
|
817
|
+
message: noLiveGenerationMessage(root, myOwner),
|
|
817
818
|
});
|
|
818
819
|
process.exit(1);
|
|
819
820
|
}
|
|
@@ -994,9 +995,22 @@ function normalizeKind(kind) {
|
|
|
994
995
|
* This id is actionable: the reader may pass it to cache repair or explicit
|
|
995
996
|
* finalization. Abbreviate ids for display elsewhere, never in a diagnostic
|
|
996
997
|
* whose purpose is to hand the caller a canonical identity.
|
|
998
|
+
*
|
|
999
|
+
* The message also names the recovery. A session whose generation ended while
|
|
1000
|
+
* it sat idle (a stale sweep, or a `done` it has since outlived) still has a
|
|
1001
|
+
* live process, and `agents lifecycle active` is the one command that opens a
|
|
1002
|
+
* fresh generation for it (ADR 0088). Without the pointer every coordination
|
|
1003
|
+
* command refuses in turn and the caller has no way to guess the path back.
|
|
997
1004
|
*/
|
|
998
|
-
function noLiveGenerationMessage(owner) {
|
|
999
|
-
|
|
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
|
+
}
|
|
1010
|
+
return `resolved owner=${owner} but no authority-safe live V3 generation exists for it; ${lifecycleReopenHint(root)}`;
|
|
1011
|
+
}
|
|
1012
|
+
function lifecycleReopenHint(root) {
|
|
1013
|
+
return `run \`${resolveBinName(root)} agents lifecycle active\` to open a fresh generation for this continuing session`;
|
|
1000
1014
|
}
|
|
1001
1015
|
/**
|
|
1002
1016
|
* The instance_id of a live V3 generation that `prefix` strictly prefixes, or null.
|
|
@@ -1470,7 +1484,7 @@ function runLifecycle(rawState, opts) {
|
|
|
1470
1484
|
if (state !== "active") {
|
|
1471
1485
|
emit.error({
|
|
1472
1486
|
code: "no_live_generation",
|
|
1473
|
-
message:
|
|
1487
|
+
message: noLiveGenerationMessage(root, myOwner),
|
|
1474
1488
|
});
|
|
1475
1489
|
process.exitCode = 1;
|
|
1476
1490
|
return;
|
|
@@ -1693,7 +1707,7 @@ function runStatus(opts) {
|
|
|
1693
1707
|
if (!hb) {
|
|
1694
1708
|
emit.error({
|
|
1695
1709
|
code: "no_live_generation",
|
|
1696
|
-
message: noLiveGenerationMessage(myOwner),
|
|
1710
|
+
message: noLiveGenerationMessage(root, myOwner),
|
|
1697
1711
|
});
|
|
1698
1712
|
process.exit(1);
|
|
1699
1713
|
}
|
|
@@ -1822,6 +1836,7 @@ function runStatus(opts) {
|
|
|
1822
1836
|
// one inside the same session. Best-effort by contract — no turn evidence,
|
|
1823
1837
|
// no row.
|
|
1824
1838
|
const turnElapsed = turnElapsedStatusRow({ coordRoot: root, instanceId: hb.instance_id });
|
|
1839
|
+
const turnChanges = turnChangesStatusRow({ coordRoot: root, instanceId: hb.instance_id });
|
|
1825
1840
|
const resources = readResourceStatus(root);
|
|
1826
1841
|
const data = {
|
|
1827
1842
|
name: displayName,
|
|
@@ -1830,6 +1845,7 @@ function runStatus(opts) {
|
|
|
1830
1845
|
session_age_secs: ageSecs,
|
|
1831
1846
|
turn_elapsed_secs: turnElapsed ? turnElapsed.elapsed.secs : null,
|
|
1832
1847
|
turn_complete: turnElapsed ? turnElapsed.elapsed.complete : null,
|
|
1848
|
+
turn_changes: turnChanges.changes,
|
|
1833
1849
|
activity: activityOf(hb),
|
|
1834
1850
|
activity_updated_at: hb.activity_updated_at ?? null,
|
|
1835
1851
|
activity_source: hb.activity_source ?? null,
|
|
@@ -1875,6 +1891,7 @@ function runStatus(opts) {
|
|
|
1875
1891
|
const rows = [
|
|
1876
1892
|
["session", formatAge(ageSecs)],
|
|
1877
1893
|
...(turnElapsed ? [["turn", turnElapsed.value]] : []),
|
|
1894
|
+
["changes", turnChanges.value],
|
|
1878
1895
|
["activity", activityOf(hb)],
|
|
1879
1896
|
["lifecycle", lifecycleLabel(hb)],
|
|
1880
1897
|
["context", ctxStr],
|
|
@@ -2112,15 +2129,7 @@ export function readAgentDiagnosticEventsInWindow(root, cutoffMs) {
|
|
|
2112
2129
|
}
|
|
2113
2130
|
/** Normalize adapter event data into the heartbeat platform value. */
|
|
2114
2131
|
function adapterToPlatform(adapter) {
|
|
2115
|
-
|
|
2116
|
-
return "claude-code";
|
|
2117
|
-
if (adapter === "cursor")
|
|
2118
|
-
return "cursor";
|
|
2119
|
-
if (adapter === "codex")
|
|
2120
|
-
return "codex";
|
|
2121
|
-
if (adapter === "openclaw")
|
|
2122
|
-
return "openclaw";
|
|
2123
|
-
return "unknown";
|
|
2132
|
+
return normalizeEventAdapterIdV3(adapter) ?? "unknown";
|
|
2124
2133
|
}
|
|
2125
2134
|
/** Project a canonical health.* event into the HealEvent shape the aggregators
|
|
2126
2135
|
* already consume. Returns null for non-heal events. instance_id → display name
|
|
@@ -4006,10 +4015,11 @@ function runHeal(opts) {
|
|
|
4006
4015
|
if (opts.adapter &&
|
|
4007
4016
|
opts.adapter !== "claude-code" &&
|
|
4008
4017
|
opts.adapter !== "cursor" &&
|
|
4009
|
-
opts.adapter !== "codex"
|
|
4018
|
+
opts.adapter !== "codex" &&
|
|
4019
|
+
opts.adapter !== "opencode") {
|
|
4010
4020
|
emit.error({
|
|
4011
4021
|
code: "bad_adapter",
|
|
4012
|
-
message: "--adapter must be one of: claude-code, cursor, codex",
|
|
4022
|
+
message: "--adapter must be one of: claude-code, cursor, codex, opencode",
|
|
4013
4023
|
});
|
|
4014
4024
|
process.exit(1);
|
|
4015
4025
|
}
|
|
@@ -4146,6 +4156,10 @@ function runHeal(opts) {
|
|
|
4146
4156
|
});
|
|
4147
4157
|
}
|
|
4148
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
|
+
}
|
|
4149
4163
|
emitHealFailure(healFailureReason(root, owner, sessionId, healAdapter), spawnFailureMessage(proc, `agent-coord ${action}`));
|
|
4150
4164
|
}
|
|
4151
4165
|
// Read the derived cache to surface post-action state.
|
|
@@ -4226,7 +4240,7 @@ function cacheHealAuthorityRefusal(root, owner, sessionId, adapter, currentRow)
|
|
|
4226
4240
|
if (producer?.terminal) {
|
|
4227
4241
|
return {
|
|
4228
4242
|
reason: "terminal_generation",
|
|
4229
|
-
message:
|
|
4243
|
+
message: `the matching generation is terminal and cannot be repaired or reopened by heal; ${lifecycleReopenHint(root)}`,
|
|
4230
4244
|
};
|
|
4231
4245
|
}
|
|
4232
4246
|
if (producer && producer.instance_id !== liveInstanceIdV3(owner)) {
|
|
@@ -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browse-ai.d.ts","sourceRoot":"","sources":["../../src/commands/browse-ai.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"browse-ai.d.ts","sourceRoot":"","sources":["../../src/commands/browse-ai.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAmD1E,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,WAAW,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAgDN"}
|
|
@@ -2,6 +2,7 @@ import { homedir } from "node:os";
|
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { AgentBrowser } from "../lib/agent-browser/index.js";
|
|
4
4
|
import { applyExtraCookies, CookieJar } from "../lib/cookies/index.js";
|
|
5
|
+
import { commandPaceGate } from "../lib/pace/index.js";
|
|
5
6
|
// Module-scoped emit assigned by registerBrowseAiCommand. Same pattern as
|
|
6
7
|
// cookies/read/browse: helper functions close over `emit` so action
|
|
7
8
|
// callbacks stay concise.
|
|
@@ -45,6 +46,8 @@ export function registerBrowseAiCommand(program, emitParam, context) {
|
|
|
45
46
|
'E.g., --batch "click @e5; wait 1000; snapshot"')
|
|
46
47
|
.option("--network-har <path>", "Record a HAR file from open() through end of run")
|
|
47
48
|
.option("--no-cookies", "Skip cookie-jar attach and persist")
|
|
49
|
+
.option("--no-pace", "Skip the human-pace gap (3 to 9 s) between page loads of the same site for this run. " +
|
|
50
|
+
"HARNERY_PACE=off disables it machine-wide; local and private hosts never wait.")
|
|
48
51
|
.option("--store <path>", `Cookie store path (default ${DEFAULT_STORE})`)
|
|
49
52
|
.option("--json", "Emit a JSON envelope (snapshot, screenshot path, step results)")
|
|
50
53
|
.option("--timeout <ms>", "Per-step timeout in ms", "60000")
|
|
@@ -68,6 +71,7 @@ function runBrowseAi(url, opts, context) {
|
|
|
68
71
|
const ab = new AgentBrowser({
|
|
69
72
|
jar,
|
|
70
73
|
timeoutMs: Number.parseInt(opts.timeout, 10),
|
|
74
|
+
pace: commandPaceGate(opts.pace !== false, (message) => emit.log(message, "info")),
|
|
71
75
|
});
|
|
72
76
|
const stepLog = [];
|
|
73
77
|
// 1. Open + optional HAR start.
|