@openrig/cli 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/daemon/assets/plugins/openrig-core/.claude-plugin/plugin.json +15 -0
- package/daemon/assets/plugins/openrig-core/.codex-plugin/plugin.json +24 -0
- package/daemon/assets/plugins/openrig-core/LICENSE +200 -0
- package/daemon/assets/plugins/openrig-core/README.md +42 -0
- package/daemon/assets/plugins/openrig-core/hooks/claude.json +78 -0
- package/daemon/assets/plugins/openrig-core/hooks/codex.json +37 -0
- package/daemon/assets/{openrig-activity-hook-relay.cjs → plugins/openrig-core/hooks/scripts/activity-relay.cjs} +12 -0
- package/daemon/assets/plugins/openrig-core/hooks/scripts/compaction-restore-bridge.cjs +172 -0
- package/daemon/assets/plugins/openrig-core/skills/agent-startup-and-context-ingestion/SKILL.md +104 -0
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/SKILL.md +131 -0
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/precompact-hook.mjs +174 -0
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/restore-from-jsonl.mjs +433 -0
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/templates/compact-instruction.md +1 -0
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/templates/post-compact-restore-instruction.md +1 -0
- package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +305 -0
- package/daemon/{specs/agents/shared/skills/rig-architect → assets/plugins/openrig-core/skills/openrig-architect}/SKILL.md +38 -19
- package/daemon/assets/plugins/openrig-core/skills/openrig-operator/SKILL.md +222 -0
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +597 -0
- package/daemon/assets/plugins/openrig-core/skills/queue-handoff/SKILL.md +122 -0
- package/daemon/assets/plugins/openrig-core/skills/seat-continuity-and-handover/SKILL.md +137 -0
- package/daemon/assets/vm-preview-fixtures/README.md +48 -0
- package/daemon/assets/vm-preview-fixtures/workflows/sample-basic-loop.yaml +79 -0
- package/daemon/dist/adapters/claude-code-adapter.d.ts +11 -3
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +58 -60
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/adapters/cmux-transport.d.ts.map +1 -1
- package/daemon/dist/adapters/cmux-transport.js +81 -2
- package/daemon/dist/adapters/cmux-transport.js.map +1 -1
- package/daemon/dist/adapters/cmux.d.ts +4 -0
- package/daemon/dist/adapters/cmux.d.ts.map +1 -1
- package/daemon/dist/adapters/cmux.js +87 -0
- package/daemon/dist/adapters/cmux.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +14 -3
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +43 -57
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/builtins/workflow-specs/basic-loop.yaml +76 -0
- package/daemon/dist/builtins/workflow-specs/conveyor.yaml +80 -0
- package/daemon/dist/db/migrations/026_inbox_entries.d.ts +1 -1
- package/daemon/dist/db/migrations/026_inbox_entries.js +1 -1
- package/daemon/dist/db/migrations/029_classifier_leases.d.ts +1 -1
- package/daemon/dist/db/migrations/029_classifier_leases.js +1 -1
- package/daemon/dist/db/migrations/037_mission_control_actions.d.ts +51 -0
- package/daemon/dist/db/migrations/037_mission_control_actions.d.ts.map +1 -0
- package/daemon/dist/db/migrations/037_mission_control_actions.js +74 -0
- package/daemon/dist/db/migrations/037_mission_control_actions.js.map +1 -0
- package/daemon/dist/db/migrations/038_workspace_primitive.d.ts +16 -0
- package/daemon/dist/db/migrations/038_workspace_primitive.d.ts.map +1 -0
- package/daemon/dist/db/migrations/038_workspace_primitive.js +20 -0
- package/daemon/dist/db/migrations/038_workspace_primitive.js.map +1 -0
- package/daemon/dist/db/migrations/039_queue_target_repo.d.ts +16 -0
- package/daemon/dist/db/migrations/039_queue_target_repo.d.ts.map +1 -0
- package/daemon/dist/db/migrations/039_queue_target_repo.js +21 -0
- package/daemon/dist/db/migrations/039_queue_target_repo.js.map +1 -0
- package/daemon/dist/db/migrations/040_workflow_specs_diagnostic.d.ts +32 -0
- package/daemon/dist/db/migrations/040_workflow_specs_diagnostic.d.ts.map +1 -0
- package/daemon/dist/db/migrations/040_workflow_specs_diagnostic.js +37 -0
- package/daemon/dist/db/migrations/040_workflow_specs_diagnostic.js.map +1 -0
- package/daemon/dist/domain/active-lens-store.d.ts +23 -0
- package/daemon/dist/domain/active-lens-store.d.ts.map +1 -0
- package/daemon/dist/domain/active-lens-store.js +87 -0
- package/daemon/dist/domain/active-lens-store.js.map +1 -0
- package/daemon/dist/domain/agent-images/agent-image-library-service.d.ts +68 -0
- package/daemon/dist/domain/agent-images/agent-image-library-service.d.ts.map +1 -0
- package/daemon/dist/domain/agent-images/agent-image-library-service.js +339 -0
- package/daemon/dist/domain/agent-images/agent-image-library-service.js.map +1 -0
- package/daemon/dist/domain/agent-images/agent-image-types.d.ts +113 -0
- package/daemon/dist/domain/agent-images/agent-image-types.d.ts.map +1 -0
- package/daemon/dist/domain/agent-images/agent-image-types.js +24 -0
- package/daemon/dist/domain/agent-images/agent-image-types.js.map +1 -0
- package/daemon/dist/domain/agent-images/evidence-guard.d.ts +26 -0
- package/daemon/dist/domain/agent-images/evidence-guard.d.ts.map +1 -0
- package/daemon/dist/domain/agent-images/evidence-guard.js +185 -0
- package/daemon/dist/domain/agent-images/evidence-guard.js.map +1 -0
- package/daemon/dist/domain/agent-images/manifest-parser.d.ts +3 -0
- package/daemon/dist/domain/agent-images/manifest-parser.d.ts.map +1 -0
- package/daemon/dist/domain/agent-images/manifest-parser.js +114 -0
- package/daemon/dist/domain/agent-images/manifest-parser.js.map +1 -0
- package/daemon/dist/domain/agent-images/resume-token-discovery.d.ts +28 -0
- package/daemon/dist/domain/agent-images/resume-token-discovery.d.ts.map +1 -0
- package/daemon/dist/domain/agent-images/resume-token-discovery.js +83 -0
- package/daemon/dist/domain/agent-images/resume-token-discovery.js.map +1 -0
- package/daemon/dist/domain/agent-images/snapshot-capturer.d.ts +36 -0
- package/daemon/dist/domain/agent-images/snapshot-capturer.d.ts.map +1 -0
- package/daemon/dist/domain/agent-images/snapshot-capturer.js +58 -0
- package/daemon/dist/domain/agent-images/snapshot-capturer.js.map +1 -0
- package/daemon/dist/domain/agent-manifest.d.ts.map +1 -1
- package/daemon/dist/domain/agent-manifest.js +116 -37
- package/daemon/dist/domain/agent-manifest.js.map +1 -1
- package/daemon/dist/domain/agent-resolver.js +1 -1
- package/daemon/dist/domain/agent-resolver.js.map +1 -1
- package/daemon/dist/domain/agent-starter-resolver.d.ts +10 -16
- package/daemon/dist/domain/agent-starter-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/agent-starter-resolver.js +11 -13
- package/daemon/dist/domain/agent-starter-resolver.js.map +1 -1
- package/daemon/dist/domain/classifier-lease-manager.d.ts +1 -1
- package/daemon/dist/domain/classifier-lease-manager.js +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts +81 -0
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -0
- package/daemon/dist/domain/claude-compaction-enforcer.js +242 -0
- package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -0
- package/daemon/dist/domain/cmux-layout-service.d.ts +41 -0
- package/daemon/dist/domain/cmux-layout-service.d.ts.map +1 -0
- package/daemon/dist/domain/cmux-layout-service.js +184 -0
- package/daemon/dist/domain/cmux-layout-service.js.map +1 -0
- package/daemon/dist/domain/conflict-detector.d.ts.map +1 -1
- package/daemon/dist/domain/conflict-detector.js +6 -3
- package/daemon/dist/domain/conflict-detector.js.map +1 -1
- package/daemon/dist/domain/context-monitor.d.ts +20 -5
- package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/context-monitor.js +63 -13
- package/daemon/dist/domain/context-monitor.js.map +1 -1
- package/daemon/dist/domain/context-packs/bundle-assembler.d.ts +49 -0
- package/daemon/dist/domain/context-packs/bundle-assembler.d.ts.map +1 -0
- package/daemon/dist/domain/context-packs/bundle-assembler.js +81 -0
- package/daemon/dist/domain/context-packs/bundle-assembler.js.map +1 -0
- package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts +41 -0
- package/daemon/dist/domain/context-packs/context-pack-library-service.d.ts.map +1 -0
- package/daemon/dist/domain/context-packs/context-pack-library-service.js +148 -0
- package/daemon/dist/domain/context-packs/context-pack-library-service.js.map +1 -0
- package/daemon/dist/domain/context-packs/context-pack-types.d.ts +64 -0
- package/daemon/dist/domain/context-packs/context-pack-types.d.ts.map +1 -0
- package/daemon/dist/domain/context-packs/context-pack-types.js +22 -0
- package/daemon/dist/domain/context-packs/context-pack-types.js.map +1 -0
- package/daemon/dist/domain/context-packs/manifest-parser.d.ts +3 -0
- package/daemon/dist/domain/context-packs/manifest-parser.d.ts.map +1 -0
- package/daemon/dist/domain/context-packs/manifest-parser.js +74 -0
- package/daemon/dist/domain/context-packs/manifest-parser.js.map +1 -0
- package/daemon/dist/domain/context-usage-store.d.ts +14 -1
- package/daemon/dist/domain/context-usage-store.d.ts.map +1 -1
- package/daemon/dist/domain/context-usage-store.js +156 -1
- package/daemon/dist/domain/context-usage-store.js.map +1 -1
- package/daemon/dist/domain/files/file-write-service.d.ts +61 -0
- package/daemon/dist/domain/files/file-write-service.d.ts.map +1 -0
- package/daemon/dist/domain/files/file-write-service.js +180 -0
- package/daemon/dist/domain/files/file-write-service.js.map +1 -0
- package/daemon/dist/domain/files/path-safety.d.ts +47 -0
- package/daemon/dist/domain/files/path-safety.d.ts.map +1 -0
- package/daemon/dist/domain/files/path-safety.js +176 -0
- package/daemon/dist/domain/files/path-safety.js.map +1 -0
- package/daemon/dist/domain/graph-projection.d.ts +14 -1
- package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
- package/daemon/dist/domain/graph-projection.js +8 -0
- package/daemon/dist/domain/graph-projection.js.map +1 -1
- package/daemon/dist/domain/install-engine.d.ts.map +1 -1
- package/daemon/dist/domain/install-engine.js +22 -6
- package/daemon/dist/domain/install-engine.js.map +1 -1
- package/daemon/dist/domain/install-verifier.d.ts.map +1 -1
- package/daemon/dist/domain/install-verifier.js +10 -5
- package/daemon/dist/domain/install-verifier.js.map +1 -1
- package/daemon/dist/domain/kernel-boot-tracker.d.ts +74 -0
- package/daemon/dist/domain/kernel-boot-tracker.d.ts.map +1 -0
- package/daemon/dist/domain/kernel-boot-tracker.js +213 -0
- package/daemon/dist/domain/kernel-boot-tracker.js.map +1 -0
- package/daemon/dist/domain/kernel-boot.d.ts +50 -0
- package/daemon/dist/domain/kernel-boot.d.ts.map +1 -0
- package/daemon/dist/domain/kernel-boot.js +147 -0
- package/daemon/dist/domain/kernel-boot.js.map +1 -0
- package/daemon/dist/domain/managed-blocks.d.ts.map +1 -1
- package/daemon/dist/domain/managed-blocks.js +22 -3
- package/daemon/dist/domain/managed-blocks.js.map +1 -1
- package/daemon/dist/domain/mission-control/audit-browse.d.ts +26 -0
- package/daemon/dist/domain/mission-control/audit-browse.d.ts.map +1 -0
- package/daemon/dist/domain/mission-control/audit-browse.js +101 -0
- package/daemon/dist/domain/mission-control/audit-browse.js.map +1 -0
- package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts +51 -0
- package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts.map +1 -0
- package/daemon/dist/domain/mission-control/mission-control-action-log.js +124 -0
- package/daemon/dist/domain/mission-control/mission-control-action-log.js.map +1 -0
- package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.d.ts +131 -0
- package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.d.ts.map +1 -0
- package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js +232 -0
- package/daemon/dist/domain/mission-control/mission-control-fleet-cli-capability.js.map +1 -0
- package/daemon/dist/domain/mission-control/mission-control-read-layer.d.ts +90 -0
- package/daemon/dist/domain/mission-control/mission-control-read-layer.d.ts.map +1 -0
- package/daemon/dist/domain/mission-control/mission-control-read-layer.js +279 -0
- package/daemon/dist/domain/mission-control/mission-control-read-layer.js.map +1 -0
- package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts +69 -0
- package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -0
- package/daemon/dist/domain/mission-control/mission-control-write-contract.js +302 -0
- package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -0
- package/daemon/dist/domain/mission-control/notification-adapter-ntfy.d.ts +18 -0
- package/daemon/dist/domain/mission-control/notification-adapter-ntfy.d.ts.map +1 -0
- package/daemon/dist/domain/mission-control/notification-adapter-ntfy.js +48 -0
- package/daemon/dist/domain/mission-control/notification-adapter-ntfy.js.map +1 -0
- package/daemon/dist/domain/mission-control/notification-adapter-types.d.ts +25 -0
- package/daemon/dist/domain/mission-control/notification-adapter-types.d.ts.map +1 -0
- package/daemon/dist/domain/mission-control/notification-adapter-types.js +7 -0
- package/daemon/dist/domain/mission-control/notification-adapter-types.js.map +1 -0
- package/daemon/dist/domain/mission-control/notification-adapter-webhook.d.ts +27 -0
- package/daemon/dist/domain/mission-control/notification-adapter-webhook.d.ts.map +1 -0
- package/daemon/dist/domain/mission-control/notification-adapter-webhook.js +47 -0
- package/daemon/dist/domain/mission-control/notification-adapter-webhook.js.map +1 -0
- package/daemon/dist/domain/mission-control/notification-dispatcher.d.ts +53 -0
- package/daemon/dist/domain/mission-control/notification-dispatcher.d.ts.map +1 -0
- package/daemon/dist/domain/mission-control/notification-dispatcher.js +181 -0
- package/daemon/dist/domain/mission-control/notification-dispatcher.js.map +1 -0
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +24 -0
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/node-launcher.js +7 -5
- package/daemon/dist/domain/node-launcher.js.map +1 -1
- package/daemon/dist/domain/plugin-discovery-service.d.ts +150 -0
- package/daemon/dist/domain/plugin-discovery-service.d.ts.map +1 -0
- package/daemon/dist/domain/plugin-discovery-service.js +468 -0
- package/daemon/dist/domain/plugin-discovery-service.js.map +1 -0
- package/daemon/dist/domain/plugin-vendor-service.d.ts +54 -0
- package/daemon/dist/domain/plugin-vendor-service.d.ts.map +1 -0
- package/daemon/dist/domain/plugin-vendor-service.js +111 -0
- package/daemon/dist/domain/plugin-vendor-service.js.map +1 -0
- package/daemon/dist/domain/preview/preview-rate-limiter.d.ts +20 -0
- package/daemon/dist/domain/preview/preview-rate-limiter.d.ts.map +1 -0
- package/daemon/dist/domain/preview/preview-rate-limiter.js +46 -0
- package/daemon/dist/domain/preview/preview-rate-limiter.js.map +1 -0
- package/daemon/dist/domain/profile-resolver.d.ts +8 -3
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +69 -15
- package/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/daemon/dist/domain/progress/progress-indexer.d.ts +73 -0
- package/daemon/dist/domain/progress/progress-indexer.d.ts.map +1 -0
- package/daemon/dist/domain/progress/progress-indexer.js +210 -0
- package/daemon/dist/domain/progress/progress-indexer.js.map +1 -0
- package/daemon/dist/domain/project-classifier.d.ts +1 -1
- package/daemon/dist/domain/projection-planner.d.ts +7 -1
- package/daemon/dist/domain/projection-planner.d.ts.map +1 -1
- package/daemon/dist/domain/projection-planner.js +44 -4
- package/daemon/dist/domain/projection-planner.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +30 -5
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +94 -27
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/rehydrate-eligibility.d.ts +16 -0
- package/daemon/dist/domain/rehydrate-eligibility.d.ts.map +1 -0
- package/daemon/dist/domain/rehydrate-eligibility.js +43 -0
- package/daemon/dist/domain/rehydrate-eligibility.js.map +1 -0
- package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
- package/daemon/dist/domain/restore-check-service.js +19 -6
- package/daemon/dist/domain/restore-check-service.js.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +4 -2
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/rig-repository.d.ts +14 -0
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +41 -0
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
- package/daemon/dist/domain/rig-teardown.js +5 -0
- package/daemon/dist/domain/rig-teardown.js.map +1 -1
- package/daemon/dist/domain/rigspec-codec.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-codec.js +15 -0
- package/daemon/dist/domain/rigspec-codec.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts +29 -0
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +136 -4
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +157 -4
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/runtime-adapter.d.ts +11 -0
- package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/runtime-adapter.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +33 -0
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/skill-discovery.d.ts +51 -0
- package/daemon/dist/domain/skill-discovery.d.ts.map +1 -0
- package/daemon/dist/domain/skill-discovery.js +144 -0
- package/daemon/dist/domain/skill-discovery.js.map +1 -0
- package/daemon/dist/domain/skill-library-discovery.d.ts +68 -0
- package/daemon/dist/domain/skill-library-discovery.d.ts.map +1 -0
- package/daemon/dist/domain/skill-library-discovery.js +144 -0
- package/daemon/dist/domain/skill-library-discovery.js.map +1 -0
- package/daemon/dist/domain/slices/slice-detail-projector.d.ts +182 -0
- package/daemon/dist/domain/slices/slice-detail-projector.d.ts.map +1 -0
- package/daemon/dist/domain/slices/slice-detail-projector.js +508 -0
- package/daemon/dist/domain/slices/slice-detail-projector.js.map +1 -0
- package/daemon/dist/domain/slices/slice-indexer.d.ts +137 -0
- package/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -0
- package/daemon/dist/domain/slices/slice-indexer.js +585 -0
- package/daemon/dist/domain/slices/slice-indexer.js.map +1 -0
- package/daemon/dist/domain/spec-library-service.d.ts +23 -2
- package/daemon/dist/domain/spec-library-service.d.ts.map +1 -1
- package/daemon/dist/domain/spec-library-service.js +31 -1
- package/daemon/dist/domain/spec-library-service.js.map +1 -1
- package/daemon/dist/domain/spec-library-workflow-scanner.d.ts +124 -0
- package/daemon/dist/domain/spec-library-workflow-scanner.d.ts.map +1 -0
- package/daemon/dist/domain/spec-library-workflow-scanner.js +325 -0
- package/daemon/dist/domain/spec-library-workflow-scanner.js.map +1 -0
- package/daemon/dist/domain/spec-review-service.d.ts +1 -1
- package/daemon/dist/domain/spec-review-service.d.ts.map +1 -1
- package/daemon/dist/domain/spec-review-service.js +14 -1
- package/daemon/dist/domain/spec-review-service.js.map +1 -1
- package/daemon/dist/domain/startup-validation.d.ts.map +1 -1
- package/daemon/dist/domain/startup-validation.js +57 -11
- package/daemon/dist/domain/startup-validation.js.map +1 -1
- package/daemon/dist/domain/steering/health-summary.d.ts +39 -0
- package/daemon/dist/domain/steering/health-summary.d.ts.map +1 -0
- package/daemon/dist/domain/steering/health-summary.js +100 -0
- package/daemon/dist/domain/steering/health-summary.js.map +1 -0
- package/daemon/dist/domain/steering/steering-composer.d.ts +102 -0
- package/daemon/dist/domain/steering/steering-composer.d.ts.map +1 -0
- package/daemon/dist/domain/steering/steering-composer.js +263 -0
- package/daemon/dist/domain/steering/steering-composer.js.map +1 -0
- package/daemon/dist/domain/transcript-capture.d.ts.map +1 -1
- package/daemon/dist/domain/transcript-capture.js +7 -4
- package/daemon/dist/domain/transcript-capture.js.map +1 -1
- package/daemon/dist/domain/transcript-rotation.d.ts +29 -0
- package/daemon/dist/domain/transcript-rotation.d.ts.map +1 -0
- package/daemon/dist/domain/transcript-rotation.js +109 -0
- package/daemon/dist/domain/transcript-rotation.js.map +1 -0
- package/daemon/dist/domain/transcript-store.d.ts.map +1 -1
- package/daemon/dist/domain/transcript-store.js +7 -1
- package/daemon/dist/domain/transcript-store.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +128 -9
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js +8 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +66 -0
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -0
- package/daemon/dist/domain/user-settings/settings-store.js +546 -0
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -0
- package/daemon/dist/domain/view-event-bridge.d.ts.map +1 -1
- package/daemon/dist/domain/view-event-bridge.js +2 -3
- package/daemon/dist/domain/view-event-bridge.js.map +1 -1
- package/daemon/dist/domain/whoami-service.d.ts +29 -0
- package/daemon/dist/domain/whoami-service.d.ts.map +1 -1
- package/daemon/dist/domain/whoami-service.js +68 -0
- package/daemon/dist/domain/whoami-service.js.map +1 -1
- package/daemon/dist/domain/workflow/slice-workflow-binding.d.ts +21 -0
- package/daemon/dist/domain/workflow/slice-workflow-binding.d.ts.map +1 -0
- package/daemon/dist/domain/workflow/slice-workflow-binding.js +103 -0
- package/daemon/dist/domain/workflow/slice-workflow-binding.js.map +1 -0
- package/daemon/dist/domain/workflow/slice-workflow-projection.d.ts +81 -0
- package/daemon/dist/domain/workflow/slice-workflow-projection.d.ts.map +1 -0
- package/daemon/dist/domain/workflow/slice-workflow-projection.js +127 -0
- package/daemon/dist/domain/workflow/slice-workflow-projection.js.map +1 -0
- package/daemon/dist/domain/workflow/starter-spec-loader.d.ts +51 -0
- package/daemon/dist/domain/workflow/starter-spec-loader.d.ts.map +1 -0
- package/daemon/dist/domain/workflow/starter-spec-loader.js +140 -0
- package/daemon/dist/domain/workflow/starter-spec-loader.js.map +1 -0
- package/daemon/dist/domain/workflow-projector.js +11 -3
- package/daemon/dist/domain/workflow-projector.js.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.d.ts +34 -0
- package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.js +121 -15
- package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +6 -0
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -0
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js +252 -0
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -0
- package/daemon/dist/domain/workspace/frontmatter-validator.d.ts +40 -0
- package/daemon/dist/domain/workspace/frontmatter-validator.d.ts.map +1 -0
- package/daemon/dist/domain/workspace/frontmatter-validator.js +185 -0
- package/daemon/dist/domain/workspace/frontmatter-validator.js.map +1 -0
- package/daemon/dist/domain/workspace/getting-started-narrative.d.ts +15 -0
- package/daemon/dist/domain/workspace/getting-started-narrative.d.ts.map +1 -0
- package/daemon/dist/domain/workspace/getting-started-narrative.js +237 -0
- package/daemon/dist/domain/workspace/getting-started-narrative.js.map +1 -0
- package/daemon/dist/domain/workspace/workspace-resolver.d.ts +25 -0
- package/daemon/dist/domain/workspace/workspace-resolver.d.ts.map +1 -0
- package/daemon/dist/domain/workspace/workspace-resolver.js +86 -0
- package/daemon/dist/domain/workspace/workspace-resolver.js.map +1 -0
- package/daemon/dist/index.d.ts +2 -1
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +56 -12
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/lib/pane-envelope.d.ts +7 -0
- package/daemon/dist/lib/pane-envelope.d.ts.map +1 -0
- package/daemon/dist/lib/pane-envelope.js +38 -0
- package/daemon/dist/lib/pane-envelope.js.map +1 -0
- package/daemon/dist/middleware/auth-bearer-token.d.ts +91 -0
- package/daemon/dist/middleware/auth-bearer-token.d.ts.map +1 -0
- package/daemon/dist/middleware/auth-bearer-token.js +236 -0
- package/daemon/dist/middleware/auth-bearer-token.js.map +1 -0
- package/daemon/dist/openrig-compat.d.ts +1 -1
- package/daemon/dist/openrig-compat.d.ts.map +1 -1
- package/daemon/dist/openrig-compat.js +6 -4
- package/daemon/dist/openrig-compat.js.map +1 -1
- package/daemon/dist/routes/agent-images.d.ts +8 -0
- package/daemon/dist/routes/agent-images.d.ts.map +1 -0
- package/daemon/dist/routes/agent-images.js +253 -0
- package/daemon/dist/routes/agent-images.js.map +1 -0
- package/daemon/dist/routes/config.d.ts +3 -0
- package/daemon/dist/routes/config.d.ts.map +1 -0
- package/daemon/dist/routes/config.js +109 -0
- package/daemon/dist/routes/config.js.map +1 -0
- package/daemon/dist/routes/context-packs.d.ts +3 -0
- package/daemon/dist/routes/context-packs.d.ts.map +1 -0
- package/daemon/dist/routes/context-packs.js +129 -0
- package/daemon/dist/routes/context-packs.js.map +1 -0
- package/daemon/dist/routes/files.d.ts +17 -0
- package/daemon/dist/routes/files.d.ts.map +1 -0
- package/daemon/dist/routes/files.js +262 -0
- package/daemon/dist/routes/files.js.map +1 -0
- package/daemon/dist/routes/health-summary.d.ts +9 -0
- package/daemon/dist/routes/health-summary.d.ts.map +1 -0
- package/daemon/dist/routes/health-summary.js +33 -0
- package/daemon/dist/routes/health-summary.js.map +1 -0
- package/daemon/dist/routes/kernel-status.d.ts +3 -0
- package/daemon/dist/routes/kernel-status.d.ts.map +1 -0
- package/daemon/dist/routes/kernel-status.js +40 -0
- package/daemon/dist/routes/kernel-status.js.map +1 -0
- package/daemon/dist/routes/mission-control.d.ts +37 -0
- package/daemon/dist/routes/mission-control.d.ts.map +1 -0
- package/daemon/dist/routes/mission-control.js +306 -0
- package/daemon/dist/routes/mission-control.js.map +1 -0
- package/daemon/dist/routes/missions.d.ts +3 -0
- package/daemon/dist/routes/missions.d.ts.map +1 -0
- package/daemon/dist/routes/missions.js +195 -0
- package/daemon/dist/routes/missions.js.map +1 -0
- package/daemon/dist/routes/plugins.d.ts +3 -0
- package/daemon/dist/routes/plugins.d.ts.map +1 -0
- package/daemon/dist/routes/plugins.js +223 -0
- package/daemon/dist/routes/plugins.js.map +1 -0
- package/daemon/dist/routes/progress.d.ts +7 -0
- package/daemon/dist/routes/progress.d.ts.map +1 -0
- package/daemon/dist/routes/progress.js +33 -0
- package/daemon/dist/routes/progress.js.map +1 -0
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +52 -1
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/rig-cmux.d.ts +3 -0
- package/daemon/dist/routes/rig-cmux.d.ts.map +1 -0
- package/daemon/dist/routes/rig-cmux.js +121 -0
- package/daemon/dist/routes/rig-cmux.js.map +1 -0
- package/daemon/dist/routes/rigs.d.ts +3 -0
- package/daemon/dist/routes/rigs.d.ts.map +1 -1
- package/daemon/dist/routes/rigs.js +73 -7
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/rigspec.js +6 -3
- package/daemon/dist/routes/rigspec.js.map +1 -1
- package/daemon/dist/routes/sessions.d.ts.map +1 -1
- package/daemon/dist/routes/sessions.js +119 -0
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/routes/skills.d.ts +3 -0
- package/daemon/dist/routes/skills.d.ts.map +1 -0
- package/daemon/dist/routes/skills.js +147 -0
- package/daemon/dist/routes/skills.js.map +1 -0
- package/daemon/dist/routes/slices.d.ts +9 -0
- package/daemon/dist/routes/slices.d.ts.map +1 -0
- package/daemon/dist/routes/slices.js +207 -0
- package/daemon/dist/routes/slices.js.map +1 -0
- package/daemon/dist/routes/spec-library.d.ts.map +1 -1
- package/daemon/dist/routes/spec-library.js +87 -5
- package/daemon/dist/routes/spec-library.js.map +1 -1
- package/daemon/dist/routes/steering.d.ts +7 -0
- package/daemon/dist/routes/steering.d.ts.map +1 -0
- package/daemon/dist/routes/steering.js +27 -0
- package/daemon/dist/routes/steering.js.map +1 -0
- package/daemon/dist/routes/up.d.ts.map +1 -1
- package/daemon/dist/routes/up.js +21 -3
- package/daemon/dist/routes/up.js.map +1 -1
- package/daemon/dist/routes/whoami.d.ts.map +1 -1
- package/daemon/dist/routes/whoami.js +6 -1
- package/daemon/dist/routes/whoami.js.map +1 -1
- package/daemon/dist/routes/workflow.d.ts.map +1 -1
- package/daemon/dist/routes/workflow.js +43 -0
- package/daemon/dist/routes/workflow.js.map +1 -1
- package/daemon/dist/routes/workspace.d.ts +3 -0
- package/daemon/dist/routes/workspace.d.ts.map +1 -0
- package/daemon/dist/routes/workspace.js +53 -0
- package/daemon/dist/routes/workspace.js.map +1 -0
- package/daemon/dist/server.d.ts +82 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +82 -1
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts +9 -0
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +577 -5
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/docs/reference/agent-spec.md +7 -7
- package/daemon/docs/reference/agent-startup-guide.md +2 -2
- package/daemon/docs/reference/project-workspace.md +102 -0
- package/daemon/specs/agents/apps/vault-specialist/agent.yaml +1 -2
- package/daemon/specs/agents/apps/vault-specialist/guidance/role.md +0 -1
- package/daemon/specs/agents/conveyor/builder/agent.yaml +34 -0
- package/daemon/specs/agents/conveyor/builder/guidance/role.md +31 -0
- package/daemon/specs/agents/conveyor/builder/startup/context.md +9 -0
- package/daemon/specs/agents/conveyor/lead/agent.yaml +34 -0
- package/daemon/specs/agents/conveyor/lead/guidance/role.md +34 -0
- package/daemon/specs/agents/conveyor/lead/startup/context.md +15 -0
- package/daemon/specs/agents/conveyor/planner/agent.yaml +34 -0
- package/daemon/specs/agents/conveyor/planner/guidance/role.md +29 -0
- package/daemon/specs/agents/conveyor/planner/startup/context.md +12 -0
- package/daemon/specs/agents/conveyor/reviewer/agent.yaml +34 -0
- package/daemon/specs/agents/conveyor/reviewer/guidance/role.md +29 -0
- package/daemon/specs/agents/conveyor/reviewer/startup/context.md +10 -0
- package/daemon/specs/agents/design/product-designer/agent.yaml +0 -1
- package/daemon/specs/agents/development/implementer/agent.yaml +1 -2
- package/daemon/specs/agents/development/implementer/guidance/role.md +0 -1
- package/daemon/specs/agents/development/qa/agent.yaml +0 -1
- package/daemon/specs/agents/development/qa/guidance/role.md +0 -2
- package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -2
- package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +2 -3
- package/daemon/specs/agents/research/analyst/agent.yaml +0 -1
- package/daemon/specs/agents/research/synthesizer/agent.yaml +0 -1
- package/daemon/specs/agents/review/independent-reviewer/agent.yaml +0 -1
- package/daemon/specs/agents/shared/agent.yaml +6 -8
- package/daemon/specs/agents/shared/skills/core/openrig-architect/SKILL.md +361 -0
- package/daemon/specs/agents/shared/skills/core/openrig-installer/SKILL.md +142 -0
- package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +30 -0
- package/daemon/specs/agents/shared/skills/core/openrig-user-settings/SKILL.md +153 -0
- package/daemon/specs/agents/shared/skills/core/rig-lifecycle/SKILL.md +116 -0
- package/daemon/specs/agents/shared/skills/pods/development-team/SKILL.md +0 -1
- package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +2 -2
- package/daemon/specs/agents/shared/skills/process/agent-browser/LOCAL-INSIGHTS.md +6 -6
- package/daemon/specs/agents/shared/skills/process/agent-browser/OPENRIG.md +40 -0
- package/daemon/specs/agents/shared/skills/process/agent-browser/SKILL.md +10 -0
- package/daemon/specs/agents/shared/skills/process/brainstorming/OPENRIG.md +48 -0
- package/daemon/specs/agents/shared/skills/process/brainstorming/SKILL.md +11 -0
- package/daemon/specs/agents/shared/skills/process/dogfood/SKILL.md +5 -0
- package/daemon/specs/agents/shared/skills/process/executing-plans/OPENRIG.md +56 -0
- package/daemon/specs/agents/shared/skills/process/executing-plans/SKILL.md +10 -0
- package/daemon/specs/agents/shared/skills/process/frontend-design/SKILL.md +5 -0
- package/daemon/specs/agents/shared/skills/process/systematic-debugging/SKILL.md +5 -0
- package/daemon/specs/agents/shared/skills/process/test-driven-development/SKILL.md +5 -0
- package/daemon/specs/agents/shared/skills/process/using-superpowers/OPENRIG.md +48 -0
- package/daemon/specs/agents/shared/skills/process/using-superpowers/SKILL.md +11 -0
- package/daemon/specs/agents/shared/skills/process/verification-before-completion/SKILL.md +5 -0
- package/daemon/specs/agents/shared/skills/process/writing-plans/OPENRIG.md +52 -0
- package/daemon/specs/agents/shared/skills/process/writing-plans/SKILL.md +12 -2
- package/daemon/specs/rigs/launch/conveyor/CULTURE.md +34 -0
- package/daemon/specs/rigs/launch/conveyor/README.md +33 -0
- package/daemon/specs/rigs/launch/conveyor/rig.yaml +72 -0
- package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/agent.yaml +35 -0
- package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/guidance/role.md +50 -0
- package/daemon/specs/rigs/launch/kernel/agents/advisor/lead/startup/context.md +37 -0
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/agent.yaml +35 -0
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +49 -0
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/startup/context.md +63 -0
- package/daemon/specs/rigs/launch/kernel/agents/queue/worker/agent.yaml +35 -0
- package/daemon/specs/rigs/launch/kernel/agents/queue/worker/guidance/role.md +33 -0
- package/daemon/specs/rigs/launch/kernel/agents/queue/worker/startup/context.md +30 -0
- package/daemon/specs/rigs/launch/kernel/culture/CULTURE.md +69 -0
- package/daemon/specs/rigs/launch/kernel/rig-claude-only.yaml +59 -0
- package/daemon/specs/rigs/launch/kernel/rig-codex-only.yaml +59 -0
- package/daemon/specs/rigs/launch/kernel/rig.yaml +69 -0
- package/daemon/specs/rigs/preview/product-team/CULTURE.md +2 -2
- package/daemon/specs/rigs/preview/product-team/rig.yaml +3 -4
- package/dist/commands/agent-image.d.ts +4 -0
- package/dist/commands/agent-image.d.ts.map +1 -0
- package/dist/commands/agent-image.js +352 -0
- package/dist/commands/agent-image.js.map +1 -0
- package/dist/commands/config-init-workspace.d.ts +35 -0
- package/dist/commands/config-init-workspace.d.ts.map +1 -0
- package/dist/commands/config-init-workspace.js +553 -0
- package/dist/commands/config-init-workspace.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +86 -18
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/context-pack.d.ts +4 -0
- package/dist/commands/context-pack.d.ts.map +1 -0
- package/dist/commands/context-pack.js +357 -0
- package/dist/commands/context-pack.js.map +1 -0
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +61 -1
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/heartbeat.d.ts.map +1 -1
- package/dist/commands/heartbeat.js +0 -5
- package/dist/commands/heartbeat.js.map +1 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +7 -2
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/plugin.d.ts +4 -0
- package/dist/commands/plugin.d.ts.map +1 -0
- package/dist/commands/plugin.js +395 -0
- package/dist/commands/plugin.js.map +1 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +173 -14
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +9 -0
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/send.d.ts +15 -0
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +32 -1
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/specs.d.ts +4 -2
- package/dist/commands/specs.d.ts.map +1 -1
- package/dist/commands/specs.js +12 -8
- package/dist/commands/specs.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +30 -4
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +9 -4
- package/dist/commands/whoami.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +37 -0
- package/dist/commands/workflow.js.map +1 -1
- package/dist/commands/workspace.d.ts +6 -0
- package/dist/commands/workspace.d.ts.map +1 -0
- package/dist/commands/workspace.js +83 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/config-store.d.ts +90 -1
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +477 -42
- package/dist/config-store.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +42 -1
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +98 -7
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/host-registry.d.ts +1 -1
- package/dist/host-registry.js +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/openrig-compat.d.ts +1 -1
- package/dist/openrig-compat.d.ts.map +1 -1
- package/dist/openrig-compat.js +6 -4
- package/dist/openrig-compat.js.map +1 -1
- package/dist/restore-packet/claude-transcript-parser.js +1 -1
- package/dist/restore-packet/claude-transcript-parser.js.map +1 -1
- package/dist/restore-packet/codex-jsonl-parser.js +1 -1
- package/dist/restore-packet/codex-jsonl-parser.js.map +1 -1
- package/package.json +2 -2
- package/ui/dist/assets/index-C_Q5FczU.css +1 -0
- package/ui/dist/assets/index-Rl3ZBrUg.js +547 -0
- package/ui/dist/graphics/operator-climber-monochrome.png +0 -0
- package/ui/dist/index.html +3 -2
- package/daemon/specs/agents/shared/skills/claude-compact-in-place/SKILL.md +0 -100
- package/daemon/specs/agents/shared/skills/mental-model-ha/SKILL.md +0 -956
- package/daemon/specs/agents/shared/skills/process/containerized-e2e/SKILL.md +0 -256
- package/daemon/specs/agents/shared/skills/process/containerized-e2e/scripts/Dockerfile +0 -39
- package/daemon/specs/agents/shared/skills/process/containerized-e2e/scripts/build-e2e-image.sh +0 -37
- package/daemon/specs/agents/shared/skills/process/containerized-e2e/templates/control-plane-test.yaml +0 -40
- package/daemon/specs/agents/shared/skills/process/containerized-e2e/templates/e2e-report-template.md +0 -94
- package/daemon/specs/agents/shared/skills/process/containerized-e2e/templates/expansion-collision-fragment.yaml +0 -13
- package/daemon/specs/agents/shared/skills/process/containerized-e2e/templates/expansion-pod-fragment.yaml +0 -14
- package/ui/dist/assets/index-B09doO8H.js +0 -139
- package/ui/dist/assets/index-Dec25siz.css +0 -1
- package/ui/dist/assets/index-GNYaWmBj.js +0 -225
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type AllowlistRoot } from "./path-safety.js";
|
|
2
|
+
export interface FileWriteRequest {
|
|
3
|
+
rootName: string;
|
|
4
|
+
/** Relative path under the allowlist root; same shape as item 3 routes. */
|
|
5
|
+
path: string;
|
|
6
|
+
content: string;
|
|
7
|
+
/** Caller-known mtime (ISO string) at the time of last read. */
|
|
8
|
+
expectedMtime: string;
|
|
9
|
+
/** Caller-known SHA-256 content hash (hex) at the time of last read. */
|
|
10
|
+
expectedContentHash: string;
|
|
11
|
+
/** Operator session that initiated the write (for the audit row). */
|
|
12
|
+
actor: string;
|
|
13
|
+
}
|
|
14
|
+
export interface FileWriteResult {
|
|
15
|
+
/** Resolved canonical absolute path that was written. */
|
|
16
|
+
absolutePath: string;
|
|
17
|
+
/** New mtime after the write (ISO string). */
|
|
18
|
+
newMtime: string;
|
|
19
|
+
/** New SHA-256 content hash (hex) after the write. */
|
|
20
|
+
newContentHash: string;
|
|
21
|
+
/** Byte-count delta (new - prev). */
|
|
22
|
+
byteCountDelta: number;
|
|
23
|
+
}
|
|
24
|
+
export declare class WriteConflictError extends Error {
|
|
25
|
+
readonly currentMtime: string;
|
|
26
|
+
readonly currentContentHash: string;
|
|
27
|
+
readonly details: Record<string, unknown>;
|
|
28
|
+
constructor(currentMtime: string, currentContentHash: string, details: Record<string, unknown>);
|
|
29
|
+
}
|
|
30
|
+
export declare class FileWriteError extends Error {
|
|
31
|
+
readonly code: "stat_failed" | "tmp_write_failed" | "rename_failed" | "audit_write_failed";
|
|
32
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
33
|
+
constructor(code: "stat_failed" | "tmp_write_failed" | "rename_failed" | "audit_write_failed", message: string, details?: Record<string, unknown> | undefined);
|
|
34
|
+
}
|
|
35
|
+
export interface FileWriteServiceOpts {
|
|
36
|
+
/** Allowlist roots resolved from env at startup (re-resolved per request is fine; cheap). */
|
|
37
|
+
allowlist: AllowlistRoot[];
|
|
38
|
+
/** Override default audit file location for tests. */
|
|
39
|
+
auditFilePath?: string;
|
|
40
|
+
/** Override Date.now() for tests (returns ISO timestamp). */
|
|
41
|
+
now?: () => Date;
|
|
42
|
+
}
|
|
43
|
+
export declare class FileWriteService {
|
|
44
|
+
private readonly allowlist;
|
|
45
|
+
private readonly auditFilePath;
|
|
46
|
+
private readonly now;
|
|
47
|
+
constructor(opts: FileWriteServiceOpts);
|
|
48
|
+
/**
|
|
49
|
+
* Atomically write content to an allowlisted file. Throws
|
|
50
|
+
* WriteConflictError on mtime/contentHash mismatch; throws
|
|
51
|
+
* FileWriteError on stat / temp-write / rename / audit failures.
|
|
52
|
+
* Returns FileWriteResult with the new mtime + contentHash on
|
|
53
|
+
* success.
|
|
54
|
+
*/
|
|
55
|
+
writeAtomic(req: FileWriteRequest): FileWriteResult;
|
|
56
|
+
private appendAuditRow;
|
|
57
|
+
/** Test/debug helper: returns the configured audit file path. */
|
|
58
|
+
getAuditFilePath(): string;
|
|
59
|
+
}
|
|
60
|
+
export declare function sha256Hex(content: Buffer | string): string;
|
|
61
|
+
//# sourceMappingURL=file-write-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-write-service.d.ts","sourceRoot":"","sources":["../../../src/domain/files/file-write-service.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE1E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,aAAa,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;aAEzB,YAAY,EAAE,MAAM;aACpB,kBAAkB,EAAE,MAAM;aAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFhC,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,MAAM,EAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAKnD;AAED,qBAAa,cAAe,SAAQ,KAAK;aAErB,IAAI,EAAE,aAAa,GAAG,kBAAkB,GAAG,eAAe,GAAG,oBAAoB;aAEjF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjC,IAAI,EAAE,aAAa,GAAG,kBAAkB,GAAG,eAAe,GAAG,oBAAoB,EACjG,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAKpD;AAED,MAAM,WAAW,oBAAoB;IACnC,6FAA6F;IAC7F,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAQD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;gBAErB,IAAI,EAAE,oBAAoB;IAMtC;;;;;;OAMG;IACH,WAAW,CAAC,GAAG,EAAE,gBAAgB,GAAG,eAAe;IAuGnD,OAAO,CAAC,cAAc;IAKtB,iEAAiE;IACjE,gBAAgB,IAAI,MAAM;CAG3B;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE1D"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
// UI Enhancement Pack v0 — atomic file write + JSONL audit.
|
|
2
|
+
//
|
|
3
|
+
// Item 4: operator-actionable write surface for STEERING.md /
|
|
4
|
+
// PROGRESS.md / spec YAML / any allowlisted file. Honors the dashboard
|
|
5
|
+
// precedent's mtime + content-hash invariants (cited as retired-but-
|
|
6
|
+
// instructive from `services/dashboard/bin/server.py:1269-1289`;
|
|
7
|
+
// reimplemented fresh in TypeScript per current OpenRig conventions).
|
|
8
|
+
//
|
|
9
|
+
// Atomic-write semantics:
|
|
10
|
+
// 1. Resolve target path under allowlist root (path-safety from
|
|
11
|
+
// file-allowlist.ts).
|
|
12
|
+
// 2. Re-stat file: if mtime != expectedMtime OR contentHash !=
|
|
13
|
+
// expectedContentHash, reject with WriteConflictError carrying
|
|
14
|
+
// the current mtime + contentHash for the UI to surface.
|
|
15
|
+
// 3. Write content to a temp file in the same directory.
|
|
16
|
+
// 4. fsync the temp file so the write is durable before the rename.
|
|
17
|
+
// 5. Atomic rename over the target path. On POSIX this is a single
|
|
18
|
+
// inode swap, so other readers either see the old file or the
|
|
19
|
+
// new file — never a partial write.
|
|
20
|
+
// 6. Compute new mtime + contentHash from the rename'd target.
|
|
21
|
+
// 7. Append one JSONL row to the audit file.
|
|
22
|
+
//
|
|
23
|
+
// The audit file is `~/.openrig/file-edit-audit.jsonl` by default
|
|
24
|
+
// (operator-overridable via env). Append-only; never rotates at v0
|
|
25
|
+
// per PRD § Item 4 (rotation is a future concern).
|
|
26
|
+
import { createHash } from "node:crypto";
|
|
27
|
+
import * as fs from "node:fs";
|
|
28
|
+
import * as path from "node:path";
|
|
29
|
+
import { resolveAllowedPath } from "./path-safety.js";
|
|
30
|
+
export class WriteConflictError extends Error {
|
|
31
|
+
currentMtime;
|
|
32
|
+
currentContentHash;
|
|
33
|
+
details;
|
|
34
|
+
constructor(currentMtime, currentContentHash, details) {
|
|
35
|
+
super("file changed externally; refresh required before writing");
|
|
36
|
+
this.currentMtime = currentMtime;
|
|
37
|
+
this.currentContentHash = currentContentHash;
|
|
38
|
+
this.details = details;
|
|
39
|
+
this.name = "WriteConflictError";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export class FileWriteError extends Error {
|
|
43
|
+
code;
|
|
44
|
+
details;
|
|
45
|
+
constructor(code, message, details) {
|
|
46
|
+
super(message);
|
|
47
|
+
this.code = code;
|
|
48
|
+
this.details = details;
|
|
49
|
+
this.name = "FileWriteError";
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
const DEFAULT_AUDIT_FILE = path.join(process.env.HOME ?? process.env.USERPROFILE ?? "/tmp", ".openrig", "file-edit-audit.jsonl");
|
|
53
|
+
export class FileWriteService {
|
|
54
|
+
allowlist;
|
|
55
|
+
auditFilePath;
|
|
56
|
+
now;
|
|
57
|
+
constructor(opts) {
|
|
58
|
+
this.allowlist = opts.allowlist;
|
|
59
|
+
this.auditFilePath = opts.auditFilePath ?? DEFAULT_AUDIT_FILE;
|
|
60
|
+
this.now = opts.now ?? (() => new Date());
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Atomically write content to an allowlisted file. Throws
|
|
64
|
+
* WriteConflictError on mtime/contentHash mismatch; throws
|
|
65
|
+
* FileWriteError on stat / temp-write / rename / audit failures.
|
|
66
|
+
* Returns FileWriteResult with the new mtime + contentHash on
|
|
67
|
+
* success.
|
|
68
|
+
*/
|
|
69
|
+
writeAtomic(req) {
|
|
70
|
+
const target = resolveAllowedPath(this.allowlist, req.rootName, req.path);
|
|
71
|
+
// Pre-write checks: re-stat + re-hash for conflict detection.
|
|
72
|
+
let prevStat;
|
|
73
|
+
let prevContent;
|
|
74
|
+
try {
|
|
75
|
+
prevStat = fs.statSync(target);
|
|
76
|
+
prevContent = fs.readFileSync(target);
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
throw new FileWriteError("stat_failed", `failed to read '${target}' for conflict detection: ${err instanceof Error ? err.message : String(err)}`, { target });
|
|
80
|
+
}
|
|
81
|
+
const prevMtime = prevStat.mtime.toISOString();
|
|
82
|
+
const prevContentHash = sha256Hex(prevContent);
|
|
83
|
+
if (prevMtime !== req.expectedMtime || prevContentHash !== req.expectedContentHash) {
|
|
84
|
+
throw new WriteConflictError(prevMtime, prevContentHash, {
|
|
85
|
+
target,
|
|
86
|
+
expectedMtime: req.expectedMtime,
|
|
87
|
+
expectedContentHash: req.expectedContentHash,
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// Write to temp file in the SAME directory (so atomic rename
|
|
91
|
+
// works across the same filesystem). Suffix with PID + random
|
|
92
|
+
// so concurrent writes don't collide.
|
|
93
|
+
const tmpName = `.openrig-write-${process.pid}-${Math.random().toString(36).slice(2, 10)}-${path.basename(target)}`;
|
|
94
|
+
const tmpPath = path.join(path.dirname(target), tmpName);
|
|
95
|
+
let tmpFd = null;
|
|
96
|
+
try {
|
|
97
|
+
tmpFd = fs.openSync(tmpPath, "w");
|
|
98
|
+
fs.writeFileSync(tmpFd, req.content);
|
|
99
|
+
fs.fsyncSync(tmpFd);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
// Clean up temp file if it was partially created.
|
|
103
|
+
try {
|
|
104
|
+
if (tmpFd !== null)
|
|
105
|
+
fs.closeSync(tmpFd);
|
|
106
|
+
}
|
|
107
|
+
catch { /* ignore */ }
|
|
108
|
+
try {
|
|
109
|
+
fs.unlinkSync(tmpPath);
|
|
110
|
+
}
|
|
111
|
+
catch { /* ignore */ }
|
|
112
|
+
throw new FileWriteError("tmp_write_failed", `failed to write+fsync temp file at '${tmpPath}': ${err instanceof Error ? err.message : String(err)}`, { target, tmpPath });
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
try {
|
|
116
|
+
if (tmpFd !== null)
|
|
117
|
+
fs.closeSync(tmpFd);
|
|
118
|
+
}
|
|
119
|
+
catch { /* ignore */ }
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
fs.renameSync(tmpPath, target);
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
// Best-effort cleanup of the orphan temp file. We don't try to
|
|
126
|
+
// restore the previous content because we never touched the
|
|
127
|
+
// target (rename failed atomically).
|
|
128
|
+
try {
|
|
129
|
+
fs.unlinkSync(tmpPath);
|
|
130
|
+
}
|
|
131
|
+
catch { /* ignore */ }
|
|
132
|
+
throw new FileWriteError("rename_failed", `failed to atomically rename '${tmpPath}' over '${target}': ${err instanceof Error ? err.message : String(err)}`, { target, tmpPath });
|
|
133
|
+
}
|
|
134
|
+
// Re-stat to get the new mtime + content hash.
|
|
135
|
+
const newStat = fs.statSync(target);
|
|
136
|
+
const newContent = fs.readFileSync(target);
|
|
137
|
+
const newMtime = newStat.mtime.toISOString();
|
|
138
|
+
const newContentHash = sha256Hex(newContent);
|
|
139
|
+
const byteCountDelta = newContent.byteLength - prevContent.byteLength;
|
|
140
|
+
// Append the audit JSONL row. Failure here is logged but does
|
|
141
|
+
// NOT undo the write — the user's edit landed; we don't want
|
|
142
|
+
// audit-system flakes to revert canon edits.
|
|
143
|
+
const auditRow = {
|
|
144
|
+
ts: this.now().toISOString(),
|
|
145
|
+
actor: req.actor,
|
|
146
|
+
root: req.rootName,
|
|
147
|
+
path: req.path,
|
|
148
|
+
absolutePath: target,
|
|
149
|
+
prevMtime,
|
|
150
|
+
newMtime,
|
|
151
|
+
prevContentHash,
|
|
152
|
+
newContentHash,
|
|
153
|
+
byteCountDelta,
|
|
154
|
+
};
|
|
155
|
+
try {
|
|
156
|
+
this.appendAuditRow(auditRow);
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
throw new FileWriteError("audit_write_failed", `write succeeded but audit append failed: ${err instanceof Error ? err.message : String(err)}`, { target, auditFilePath: this.auditFilePath, ...auditRow });
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
absolutePath: target,
|
|
163
|
+
newMtime,
|
|
164
|
+
newContentHash,
|
|
165
|
+
byteCountDelta,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
appendAuditRow(row) {
|
|
169
|
+
fs.mkdirSync(path.dirname(this.auditFilePath), { recursive: true });
|
|
170
|
+
fs.appendFileSync(this.auditFilePath, `${JSON.stringify(row)}\n`);
|
|
171
|
+
}
|
|
172
|
+
/** Test/debug helper: returns the configured audit file path. */
|
|
173
|
+
getAuditFilePath() {
|
|
174
|
+
return this.auditFilePath;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
export function sha256Hex(content) {
|
|
178
|
+
return createHash("sha256").update(content).digest("hex");
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=file-write-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-write-service.js","sourceRoot":"","sources":["../../../src/domain/files/file-write-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export interface AllowlistRoot {
|
|
2
|
+
/** Operator-supplied display name (e.g., "workspace"). */
|
|
3
|
+
name: string;
|
|
4
|
+
/** Canonical absolute path on disk. */
|
|
5
|
+
canonicalPath: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class FilePathSafetyError extends Error {
|
|
8
|
+
readonly code: "root_unknown" | "path_escape" | "path_invalid" | "stat_failed" | "not_a_file" | "not_a_directory";
|
|
9
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
10
|
+
constructor(code: "root_unknown" | "path_escape" | "path_invalid" | "stat_failed" | "not_a_file" | "not_a_directory", message: string, details?: Record<string, unknown> | undefined);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Decodes a raw `name:/abs/path,name:/abs/path` allowlist string into
|
|
14
|
+
* canonical AllowlistRoot[]. Whitespace around delimiters trimmed.
|
|
15
|
+
* Invalid pairs (no colon, empty name, non-absolute path) silently
|
|
16
|
+
* skipped. Duplicate names: last wins. Same shape both env-var and
|
|
17
|
+
* settings-file-resolved values produce.
|
|
18
|
+
*/
|
|
19
|
+
export declare function decodeAllowlist(raw: string): AllowlistRoot[];
|
|
20
|
+
/**
|
|
21
|
+
* Reads the allowlist env var directly and returns the parsed root list.
|
|
22
|
+
* Preserved for backward-compat callers; v0 callers prefer the resolved
|
|
23
|
+
* settings-store path which honors env > settings-file > empty.
|
|
24
|
+
*/
|
|
25
|
+
export declare function readAllowlistFromEnv(env?: NodeJS.ProcessEnv): AllowlistRoot[];
|
|
26
|
+
/**
|
|
27
|
+
* Resolves a relative path against an allowlist root. Throws
|
|
28
|
+
* FilePathSafetyError on any unsafe condition. Returns the
|
|
29
|
+
* canonical absolute path on success. Caller is expected to stat
|
|
30
|
+
* the result to distinguish file/directory.
|
|
31
|
+
*
|
|
32
|
+
* Path-safety algorithm:
|
|
33
|
+
* 1. Validate the root exists in the allowlist (reject "root_unknown").
|
|
34
|
+
* 2. Reject relative paths that look absolute or contain `..`
|
|
35
|
+
* segments (reject "path_invalid" / "path_escape").
|
|
36
|
+
* 3. Resolve the relative path against the canonical root.
|
|
37
|
+
* 4. Resolve symlinks: if the realpath does not start with the
|
|
38
|
+
* canonical root + path separator, reject "path_escape".
|
|
39
|
+
* 5. The base case `path = ""` resolves to the root itself (allowed
|
|
40
|
+
* so callers can list the root directory).
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveAllowedPath(allowlist: AllowlistRoot[], rootName: string, relativePath: string): string;
|
|
43
|
+
/** Convenience: resolve + assert the result is an existing regular file. */
|
|
44
|
+
export declare function resolveAllowedFile(allowlist: AllowlistRoot[], rootName: string, relativePath: string): string;
|
|
45
|
+
/** Convenience: resolve + assert the result is an existing directory. */
|
|
46
|
+
export declare function resolveAllowedDirectory(allowlist: AllowlistRoot[], rootName: string, relativePath: string): string;
|
|
47
|
+
//# sourceMappingURL=path-safety.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-safety.d.ts","sourceRoot":"","sources":["../../../src/domain/files/path-safety.ts"],"names":[],"mappings":"AA+BA,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,mBAAoB,SAAQ,KAAK;aAE1B,IAAI,EAAE,cAAc,GAAG,aAAa,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,iBAAiB;aAExG,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;gBAFjC,IAAI,EAAE,cAAc,GAAG,aAAa,GAAG,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,iBAAiB,EACxH,OAAO,EAAE,MAAM,EACC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,YAAA;CAKpD;AAKD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,EAAE,CAqB5D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,aAAa,EAAE,CAK1F;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,aAAa,EAAE,EAC1B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,MAAM,CAwDR;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,aAAa,EAAE,EAC1B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,MAAM,CAoBR;AAED,yEAAyE;AACzE,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,aAAa,EAAE,EAC1B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,GACnB,MAAM,CAoBR"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// UI Enhancement Pack v0 — file allowlist + path-safety helpers.
|
|
2
|
+
//
|
|
3
|
+
// Daemon-enforced fail-closed path-safety for the operator-allowlisted
|
|
4
|
+
// file browser surface (item 3 + item 4). Reused by all four
|
|
5
|
+
// /api/files/* routes.
|
|
6
|
+
//
|
|
7
|
+
// Allowlist source (driver pivot from PRD's suggested ConfigStore key
|
|
8
|
+
// family — see handoff): OPENRIG_FILES_ALLOWLIST env var, comma-
|
|
9
|
+
// separated `<name>:<absolute-path>` pairs. Operator sets via shell
|
|
10
|
+
// (or via `~/.openrig` env file). Empty / unset → no allowlist roots
|
|
11
|
+
// → routes return empty roots list with a structured "configure
|
|
12
|
+
// OPENRIG_FILES_ALLOWLIST" hint. Default after fresh install: nothing
|
|
13
|
+
// (the safe default per PRD § Item 3).
|
|
14
|
+
//
|
|
15
|
+
// Path-safety contract:
|
|
16
|
+
// - Each request resolves <relativePath> against <rootName>'s
|
|
17
|
+
// canonical absolute path.
|
|
18
|
+
// - Any escape attempt (.., absolute-path passed as relativePath,
|
|
19
|
+
// symlink whose realpath escapes the root) is rejected with a
|
|
20
|
+
// structured error.
|
|
21
|
+
// - Symlinks INSIDE the allowlisted tree resolve normally; symlinks
|
|
22
|
+
// pointing OUTSIDE the tree are treated as escape attempts.
|
|
23
|
+
// - Reads/lists never return content from outside the resolved root.
|
|
24
|
+
//
|
|
25
|
+
// MVP single-host context: no per-rig overrides, no remote allowlist
|
|
26
|
+
// management, no audit at allowlist-resolution time (allowlist
|
|
27
|
+
// resolution is read-only). Audit applies to writes only (item 4).
|
|
28
|
+
import * as fs from "node:fs";
|
|
29
|
+
import * as path from "node:path";
|
|
30
|
+
export class FilePathSafetyError extends Error {
|
|
31
|
+
code;
|
|
32
|
+
details;
|
|
33
|
+
constructor(code, message, details) {
|
|
34
|
+
super(message);
|
|
35
|
+
this.code = code;
|
|
36
|
+
this.details = details;
|
|
37
|
+
this.name = "FilePathSafetyError";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const ENV_VAR = "OPENRIG_FILES_ALLOWLIST";
|
|
41
|
+
const LEGACY_ENV_VAR = "RIGGED_FILES_ALLOWLIST";
|
|
42
|
+
/**
|
|
43
|
+
* Decodes a raw `name:/abs/path,name:/abs/path` allowlist string into
|
|
44
|
+
* canonical AllowlistRoot[]. Whitespace around delimiters trimmed.
|
|
45
|
+
* Invalid pairs (no colon, empty name, non-absolute path) silently
|
|
46
|
+
* skipped. Duplicate names: last wins. Same shape both env-var and
|
|
47
|
+
* settings-file-resolved values produce.
|
|
48
|
+
*/
|
|
49
|
+
export function decodeAllowlist(raw) {
|
|
50
|
+
if (!raw.trim())
|
|
51
|
+
return [];
|
|
52
|
+
const out = new Map();
|
|
53
|
+
for (const pair of raw.split(",")) {
|
|
54
|
+
const trimmed = pair.trim();
|
|
55
|
+
if (!trimmed)
|
|
56
|
+
continue;
|
|
57
|
+
const colon = trimmed.indexOf(":");
|
|
58
|
+
if (colon === -1)
|
|
59
|
+
continue;
|
|
60
|
+
const name = trimmed.slice(0, colon).trim();
|
|
61
|
+
const rawPath = trimmed.slice(colon + 1).trim();
|
|
62
|
+
if (!name || !rawPath)
|
|
63
|
+
continue;
|
|
64
|
+
if (!path.isAbsolute(rawPath))
|
|
65
|
+
continue;
|
|
66
|
+
let canonical;
|
|
67
|
+
try {
|
|
68
|
+
canonical = fs.realpathSync(rawPath);
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
canonical = path.resolve(rawPath);
|
|
72
|
+
}
|
|
73
|
+
out.set(name, canonical);
|
|
74
|
+
}
|
|
75
|
+
return Array.from(out.entries()).map(([name, canonicalPath]) => ({ name, canonicalPath }));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Reads the allowlist env var directly and returns the parsed root list.
|
|
79
|
+
* Preserved for backward-compat callers; v0 callers prefer the resolved
|
|
80
|
+
* settings-store path which honors env > settings-file > empty.
|
|
81
|
+
*/
|
|
82
|
+
export function readAllowlistFromEnv(env = process.env) {
|
|
83
|
+
// Use || (not ??) so an empty-string OPENRIG_FILES_ALLOWLIST falls
|
|
84
|
+
// back to the legacy var. ?? only handles null/undefined.
|
|
85
|
+
const raw = (env[ENV_VAR] || env[LEGACY_ENV_VAR] || "").toString();
|
|
86
|
+
return decodeAllowlist(raw);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Resolves a relative path against an allowlist root. Throws
|
|
90
|
+
* FilePathSafetyError on any unsafe condition. Returns the
|
|
91
|
+
* canonical absolute path on success. Caller is expected to stat
|
|
92
|
+
* the result to distinguish file/directory.
|
|
93
|
+
*
|
|
94
|
+
* Path-safety algorithm:
|
|
95
|
+
* 1. Validate the root exists in the allowlist (reject "root_unknown").
|
|
96
|
+
* 2. Reject relative paths that look absolute or contain `..`
|
|
97
|
+
* segments (reject "path_invalid" / "path_escape").
|
|
98
|
+
* 3. Resolve the relative path against the canonical root.
|
|
99
|
+
* 4. Resolve symlinks: if the realpath does not start with the
|
|
100
|
+
* canonical root + path separator, reject "path_escape".
|
|
101
|
+
* 5. The base case `path = ""` resolves to the root itself (allowed
|
|
102
|
+
* so callers can list the root directory).
|
|
103
|
+
*/
|
|
104
|
+
export function resolveAllowedPath(allowlist, rootName, relativePath) {
|
|
105
|
+
const root = allowlist.find((r) => r.name === rootName);
|
|
106
|
+
if (!root) {
|
|
107
|
+
throw new FilePathSafetyError("root_unknown", `allowlist root '${rootName}' is not configured. Allowlist configured roots: ${allowlist.map((r) => r.name).join(", ") || "(none)"}.`, { rootName, configuredRoots: allowlist.map((r) => r.name) });
|
|
108
|
+
}
|
|
109
|
+
// Reject ../ escape attempts BEFORE filesystem resolution. Even
|
|
110
|
+
// though step 4 catches realpath escapes, this rejects the
|
|
111
|
+
// expressed-intent-to-escape with a clearer error code.
|
|
112
|
+
if (relativePath.includes("..")) {
|
|
113
|
+
// Distinguish a literal ".." segment from a filename like "foo..bar"
|
|
114
|
+
// — split on path.sep and `/` and inspect each segment.
|
|
115
|
+
const segments = relativePath.split(/[\\/]/).filter((s) => s.length > 0);
|
|
116
|
+
for (const seg of segments) {
|
|
117
|
+
if (seg === "..") {
|
|
118
|
+
throw new FilePathSafetyError("path_escape", `relative path '${relativePath}' contains a '..' segment; reject.`, { rootName, relativePath });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (path.isAbsolute(relativePath)) {
|
|
123
|
+
throw new FilePathSafetyError("path_invalid", `relative path '${relativePath}' must not be absolute (reject).`, { rootName, relativePath });
|
|
124
|
+
}
|
|
125
|
+
const candidate = path.resolve(root.canonicalPath, relativePath);
|
|
126
|
+
let realpath;
|
|
127
|
+
try {
|
|
128
|
+
realpath = fs.realpathSync(candidate);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// If the candidate doesn't exist on disk yet, fall back to the
|
|
132
|
+
// unresolved candidate. Subsequent stat will surface the absence
|
|
133
|
+
// with a more specific error code.
|
|
134
|
+
realpath = candidate;
|
|
135
|
+
}
|
|
136
|
+
// Containment check with path.sep boundary to avoid the
|
|
137
|
+
// /foo/bar matching /foo/bar-other false-positive.
|
|
138
|
+
const rootWithSep = root.canonicalPath.endsWith(path.sep)
|
|
139
|
+
? root.canonicalPath
|
|
140
|
+
: `${root.canonicalPath}${path.sep}`;
|
|
141
|
+
if (realpath !== root.canonicalPath && !realpath.startsWith(rootWithSep)) {
|
|
142
|
+
throw new FilePathSafetyError("path_escape", `resolved path '${realpath}' falls outside allowlist root '${rootName}' (${root.canonicalPath}).`, { rootName, relativePath, resolved: realpath, rootCanonical: root.canonicalPath });
|
|
143
|
+
}
|
|
144
|
+
return realpath;
|
|
145
|
+
}
|
|
146
|
+
/** Convenience: resolve + assert the result is an existing regular file. */
|
|
147
|
+
export function resolveAllowedFile(allowlist, rootName, relativePath) {
|
|
148
|
+
const resolved = resolveAllowedPath(allowlist, rootName, relativePath);
|
|
149
|
+
let stat;
|
|
150
|
+
try {
|
|
151
|
+
stat = fs.statSync(resolved);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
throw new FilePathSafetyError("stat_failed", `failed to stat '${resolved}': ${err instanceof Error ? err.message : String(err)}`, { rootName, relativePath, resolved });
|
|
155
|
+
}
|
|
156
|
+
if (!stat.isFile()) {
|
|
157
|
+
throw new FilePathSafetyError("not_a_file", `resolved path '${resolved}' is not a regular file.`, { rootName, relativePath, resolved });
|
|
158
|
+
}
|
|
159
|
+
return resolved;
|
|
160
|
+
}
|
|
161
|
+
/** Convenience: resolve + assert the result is an existing directory. */
|
|
162
|
+
export function resolveAllowedDirectory(allowlist, rootName, relativePath) {
|
|
163
|
+
const resolved = resolveAllowedPath(allowlist, rootName, relativePath);
|
|
164
|
+
let stat;
|
|
165
|
+
try {
|
|
166
|
+
stat = fs.statSync(resolved);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
throw new FilePathSafetyError("stat_failed", `failed to stat '${resolved}': ${err instanceof Error ? err.message : String(err)}`, { rootName, relativePath, resolved });
|
|
170
|
+
}
|
|
171
|
+
if (!stat.isDirectory()) {
|
|
172
|
+
throw new FilePathSafetyError("not_a_directory", `resolved path '${resolved}' is not a directory.`, { rootName, relativePath, resolved });
|
|
173
|
+
}
|
|
174
|
+
return resolved;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=path-safety.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-safety.js","sourceRoot":"","sources":["../../../src/domain/files/path-safety.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,13 @@
|
|
|
1
|
-
import type { RigWithRelations, Session, Binding, Pod } from "./types.js";
|
|
1
|
+
import type { RigWithRelations, Session, Binding, Pod, AgentActivity } from "./types.js";
|
|
2
2
|
export interface RigGraphInput extends RigWithRelations {
|
|
3
3
|
sessions: Session[];
|
|
4
4
|
pods?: Pod[];
|
|
5
5
|
}
|
|
6
|
+
export interface CurrentQitemSummary {
|
|
7
|
+
qitemId: string;
|
|
8
|
+
bodyExcerpt: string;
|
|
9
|
+
tier: string | null;
|
|
10
|
+
}
|
|
6
11
|
interface RFNodeData {
|
|
7
12
|
logicalId: string;
|
|
8
13
|
podLabel?: string | null;
|
|
@@ -25,6 +30,10 @@ interface RFNodeData {
|
|
|
25
30
|
contextUsedPercentage: number | null;
|
|
26
31
|
contextFresh: boolean;
|
|
27
32
|
contextAvailability: string;
|
|
33
|
+
contextTotalInputTokens: number | null;
|
|
34
|
+
contextTotalOutputTokens: number | null;
|
|
35
|
+
agentActivity?: AgentActivity | null;
|
|
36
|
+
currentQitems?: CurrentQitemSummary[];
|
|
28
37
|
}
|
|
29
38
|
interface RFNode {
|
|
30
39
|
id: string;
|
|
@@ -54,6 +63,10 @@ export interface InventoryOverlay {
|
|
|
54
63
|
contextUsedPercentage?: number | null;
|
|
55
64
|
contextFresh?: boolean;
|
|
56
65
|
contextAvailability?: string;
|
|
66
|
+
contextTotalInputTokens?: number | null;
|
|
67
|
+
contextTotalOutputTokens?: number | null;
|
|
68
|
+
agentActivity?: AgentActivity | null;
|
|
69
|
+
currentQitems?: CurrentQitemSummary[];
|
|
57
70
|
}
|
|
58
71
|
export declare function projectRigToGraph(input: RigGraphInput, inventoryOverlay?: InventoryOverlay[]): ReactFlowGraph;
|
|
59
72
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-projection.d.ts","sourceRoot":"","sources":["../../src/domain/graph-projection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"graph-projection.d.ts","sourceRoot":"","sources":["../../src/domain/graph-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,10 @@ export function projectRigToGraph(input, inventoryOverlay) {
|
|
|
49
49
|
contextUsedPercentage: overlay?.contextUsedPercentage ?? null,
|
|
50
50
|
contextFresh: overlay?.contextFresh ?? false,
|
|
51
51
|
contextAvailability: overlay?.contextAvailability ?? "unknown",
|
|
52
|
+
contextTotalInputTokens: overlay?.contextTotalInputTokens ?? null,
|
|
53
|
+
contextTotalOutputTokens: overlay?.contextTotalOutputTokens ?? null,
|
|
54
|
+
agentActivity: overlay?.agentActivity ?? null,
|
|
55
|
+
currentQitems: overlay?.currentQitems ?? [],
|
|
52
56
|
},
|
|
53
57
|
};
|
|
54
58
|
});
|
|
@@ -81,6 +85,10 @@ export function projectRigToGraph(input, inventoryOverlay) {
|
|
|
81
85
|
contextUsedPercentage: null,
|
|
82
86
|
contextFresh: false,
|
|
83
87
|
contextAvailability: "unknown",
|
|
88
|
+
contextTotalInputTokens: null,
|
|
89
|
+
contextTotalOutputTokens: null,
|
|
90
|
+
agentActivity: null,
|
|
91
|
+
currentQitems: [],
|
|
84
92
|
},
|
|
85
93
|
});
|
|
86
94
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-projection.js","sourceRoot":"","sources":["../../src/domain/graph-projection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"graph-projection.js","sourceRoot":"","sources":["../../src/domain/graph-projection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-engine.d.ts","sourceRoot":"","sources":["../../src/domain/install-engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE/E,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AASD,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,EAAE,CAAc;gBAEZ,WAAW,EAAE,iBAAiB,EAAE,EAAE,EAAE,WAAW;IAK3D,KAAK,CACH,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,kBAAkB,EACxB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,aAAa;IA2EhB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc;IAQ3C,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,kBAAkB;
|
|
1
|
+
{"version":3,"file":"install-engine.d.ts","sourceRoot":"","sources":["../../src/domain/install-engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE/E,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AASD,qBAAa,aAAa;IACxB,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,EAAE,CAAc;gBAEZ,WAAW,EAAE,iBAAiB,EAAE,EAAE,EAAE,WAAW;IAK3D,KAAK,CACH,YAAY,EAAE,YAAY,EAC1B,IAAI,EAAE,kBAAkB,EACxB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,aAAa;IA2EhB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc;IAQ3C,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,kBAAkB;CA0C3B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
import { createHash } from "node:crypto";
|
|
3
|
-
const BLOCK_START = (name) => `<!-- BEGIN
|
|
4
|
-
const BLOCK_END = (name) => `<!-- END
|
|
3
|
+
const BLOCK_START = (name) => `<!-- BEGIN OpenRig MANAGED BLOCK: ${name} -->`;
|
|
4
|
+
const BLOCK_END = (name) => `<!-- END OpenRig MANAGED BLOCK: ${name} -->`;
|
|
5
5
|
function hashContent(content) {
|
|
6
6
|
return createHash("sha256").update(content).digest("hex");
|
|
7
7
|
}
|
|
@@ -133,11 +133,27 @@ export class InstallEngine {
|
|
|
133
133
|
const existing = this.fs.readFile(entry.targetPath);
|
|
134
134
|
const startMarker = BLOCK_START(packageName);
|
|
135
135
|
const endMarker = BLOCK_END(packageName);
|
|
136
|
-
const
|
|
137
|
-
const
|
|
136
|
+
const legacyStart = `<!-- BEGIN RIGGED MANAGED BLOCK: ${packageName} -->`;
|
|
137
|
+
const legacyEnd = `<!-- END RIGGED MANAGED BLOCK: ${packageName} -->`;
|
|
138
|
+
// Prefer the OpenRig form; fall back to legacy markers from
|
|
139
|
+
// prior installs so re-applying a guidance package over a
|
|
140
|
+
// pre-rename file replaces the old block instead of appending a
|
|
141
|
+
// duplicate.
|
|
142
|
+
let startIdx = existing.indexOf(startMarker);
|
|
143
|
+
let endIdx = existing.indexOf(endMarker);
|
|
144
|
+
let matchedEndLength = endMarker.length;
|
|
145
|
+
if (startIdx === -1 || endIdx === -1) {
|
|
146
|
+
const legacyStartIdx = existing.indexOf(legacyStart);
|
|
147
|
+
const legacyEndIdx = existing.indexOf(legacyEnd);
|
|
148
|
+
if (legacyStartIdx !== -1 && legacyEndIdx !== -1) {
|
|
149
|
+
startIdx = legacyStartIdx;
|
|
150
|
+
endIdx = legacyEndIdx;
|
|
151
|
+
matchedEndLength = legacyEnd.length;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
138
154
|
if (startIdx !== -1 && endIdx !== -1) {
|
|
139
|
-
// Update existing block
|
|
140
|
-
const updated = existing.slice(0, startIdx) + block + existing.slice(endIdx +
|
|
155
|
+
// Update existing block (rewrites legacy markers to OpenRig form).
|
|
156
|
+
const updated = existing.slice(0, startIdx) + block + existing.slice(endIdx + matchedEndLength);
|
|
141
157
|
this.fs.writeFile(entry.targetPath, updated);
|
|
142
158
|
}
|
|
143
159
|
else {
|