@openrig/cli 0.2.0 → 0.3.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/daemon/dist/adapters/claude-code-adapter.d.ts +10 -0
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +41 -3
- package/daemon/dist/adapters/claude-code-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/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-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/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 +5 -4
- package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/context-monitor.js +26 -11
- 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/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 +85 -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 +265 -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 +300 -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/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 +5 -0
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +62 -8
- 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/queue-repository.d.ts +22 -4
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +80 -22
- 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/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/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 +118 -0
- package/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -0
- package/daemon/dist/domain/slices/slice-indexer.js +503 -0
- package/daemon/dist/domain/slices/slice-indexer.js.map +1 -0
- package/daemon/dist/domain/spec-library-service.d.ts +17 -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 +81 -0
- package/daemon/dist/domain/spec-library-workflow-scanner.d.ts.map +1 -0
- package/daemon/dist/domain/spec-library-workflow-scanner.js +171 -0
- package/daemon/dist/domain/spec-library-workflow-scanner.js.map +1 -0
- 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 +101 -2
- 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 +42 -0
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -0
- package/daemon/dist/domain/user-settings/settings-store.js +364 -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 +7 -0
- package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.js +62 -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 +207 -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/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.map +1 -1
- package/daemon/dist/index.js +10 -1
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/middleware/auth-bearer-token.d.ts +49 -0
- package/daemon/dist/middleware/auth-bearer-token.d.ts.map +1 -0
- package/daemon/dist/middleware/auth-bearer-token.js +135 -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/mission-control.d.ts +37 -0
- package/daemon/dist/routes/mission-control.d.ts.map +1 -0
- package/daemon/dist/routes/mission-control.js +283 -0
- package/daemon/dist/routes/mission-control.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/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/slices.d.ts +9 -0
- package/daemon/dist/routes/slices.d.ts.map +1 -0
- package/daemon/dist/routes/slices.js +192 -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 +72 -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 +51 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +52 -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 +385 -2
- 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 -1
- package/daemon/specs/agents/apps/vault-specialist/guidance/role.md +0 -1
- package/daemon/specs/agents/conveyor/builder/agent.yaml +35 -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 +35 -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 +35 -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 +35 -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/development/implementer/agent.yaml +1 -1
- package/daemon/specs/agents/development/implementer/guidance/role.md +0 -1
- package/daemon/specs/agents/orchestration/orchestrator/agent.yaml +1 -1
- package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +2 -3
- package/daemon/specs/agents/shared/agent.yaml +0 -2
- package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +25 -0
- package/daemon/specs/agents/shared/skills/core/openrig-user-settings/SKILL.md +153 -0
- package/daemon/specs/agents/shared/skills/rig-architect/SKILL.md +1 -1
- 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/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 +300 -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 +78 -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 +8 -0
- package/dist/commands/daemon.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/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 +7 -0
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +24 -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 +17 -3
- 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 +73 -1
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +314 -42
- package/dist/config-store.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +22 -0
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +41 -0
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -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-BDHU1JUK.js +412 -0
- package/ui/dist/assets/index-DXTyJSqu.css +1 -0
- package/ui/dist/graphics/operator-climber-monochrome.png +0 -0
- package/ui/dist/index.html +3 -2
- package/daemon/specs/agents/shared/skills/mental-model-ha/SKILL.md +0 -956
- 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,113 @@
|
|
|
1
|
+
export type AgentImageRuntime = "claude-code" | "codex";
|
|
2
|
+
export interface AgentImageManifest {
|
|
3
|
+
name: string;
|
|
4
|
+
version: string;
|
|
5
|
+
runtime: AgentImageRuntime;
|
|
6
|
+
/** Source seat's canonical session name, e.g. "velocity-driver@openrig-velocity". */
|
|
7
|
+
sourceSeat: string;
|
|
8
|
+
/** Native conversation id captured at snapshot time. Claude: the
|
|
9
|
+
* resume_token from the sessions table. Codex: the thread_id from
|
|
10
|
+
* codex-thread-id.ts. */
|
|
11
|
+
sourceSessionId: string;
|
|
12
|
+
/** Same value as sourceSessionId for v0 — kept as a separate field
|
|
13
|
+
* in the manifest so future versions can split runtime conversation
|
|
14
|
+
* identity from a runtime-resume token without breaking older
|
|
15
|
+
* manifests. */
|
|
16
|
+
sourceResumeToken: string;
|
|
17
|
+
/** PL-016 source-cwd behavior: the
|
|
18
|
+
* source seat's resolved cwd at snapshot time. Captured so the
|
|
19
|
+
* Use-as-starter snippet can emit `cwd: <source_cwd>` and the fork
|
|
20
|
+
* starts in the SAME directory the parent session was created in
|
|
21
|
+
* — Claude's project-dir-scoped session storage works because the
|
|
22
|
+
* jsonl file lives there. The daemon does NOT override cwd at fork
|
|
23
|
+
* dispatch — if operator manually changes the rig.yaml cwd, fork
|
|
24
|
+
* fails honestly with "no conversation found". Optional: manifests
|
|
25
|
+
* authored before source_cwd support omit this field; snippet renders
|
|
26
|
+
* without cwd line for back-compat. */
|
|
27
|
+
sourceCwd?: string;
|
|
28
|
+
createdAt: string;
|
|
29
|
+
notes?: string;
|
|
30
|
+
/** Optional supplementary files (analogous to context_pack files).
|
|
31
|
+
* v0 ships no consumers for this surface beyond passthrough; the
|
|
32
|
+
* startup orchestrator will compose them into the seat's cwd at
|
|
33
|
+
* launch time when the v0+1 trigger names them. */
|
|
34
|
+
files: AgentImageManifestFile[];
|
|
35
|
+
/** Operator-supplied or capturer-derived estimate. Used for at-a-
|
|
36
|
+
* glance display in the library; the library service ALSO computes
|
|
37
|
+
* a derivedEstimatedTokens from the actual on-disk content size. */
|
|
38
|
+
estimatedTokens?: number;
|
|
39
|
+
/** Lineage chain populated when the image is forked from another
|
|
40
|
+
* image (image creation can record `lineage: [<parent>, ...]`). */
|
|
41
|
+
lineage?: string[];
|
|
42
|
+
}
|
|
43
|
+
export interface AgentImageManifestFile {
|
|
44
|
+
path: string;
|
|
45
|
+
role: string;
|
|
46
|
+
summary?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface AgentImageStats {
|
|
49
|
+
/** Incremented atomically when the image is consumed (either by
|
|
50
|
+
* rig fork / agent-image fork or by a session_source: mode:
|
|
51
|
+
* agent_image consumer at instantiation time). */
|
|
52
|
+
forkCount: number;
|
|
53
|
+
/** ISO timestamp of the most-recent consumption. */
|
|
54
|
+
lastUsedAt: string | null;
|
|
55
|
+
/** Daemon-derived estimate of total bytes under the image dir
|
|
56
|
+
* (manifest + supplementary files). */
|
|
57
|
+
estimatedSizeBytes: number;
|
|
58
|
+
/** Fully-resolved lineage chain (mirrors manifest.lineage; kept on
|
|
59
|
+
* stats so it's mutable independently when a parent image is
|
|
60
|
+
* renamed). */
|
|
61
|
+
lineage: string[];
|
|
62
|
+
}
|
|
63
|
+
export type AgentImageSourceType = "user_file" | "workspace" | "builtin";
|
|
64
|
+
export interface AgentImageEntry {
|
|
65
|
+
/** Stable id `agent-image:<name>:<version>` parallel to context-pack:. */
|
|
66
|
+
id: string;
|
|
67
|
+
kind: "agent-image";
|
|
68
|
+
name: string;
|
|
69
|
+
version: string;
|
|
70
|
+
runtime: AgentImageRuntime;
|
|
71
|
+
sourceSeat: string;
|
|
72
|
+
sourceSessionId: string;
|
|
73
|
+
/** Source seat's cwd at snapshot time. null when the manifest predates
|
|
74
|
+
* source_cwd support (back-compat surface). Consumed
|
|
75
|
+
* by the Use-as-starter snippet generator. */
|
|
76
|
+
sourceCwd: string | null;
|
|
77
|
+
notes: string | null;
|
|
78
|
+
createdAt: string;
|
|
79
|
+
sourceType: AgentImageSourceType;
|
|
80
|
+
/** Absolute path to the image directory. */
|
|
81
|
+
sourcePath: string;
|
|
82
|
+
/** Path relative to the discovery root that found this image. */
|
|
83
|
+
relativePath: string;
|
|
84
|
+
/** Most-recent mtime under the image dir. */
|
|
85
|
+
updatedAt: string;
|
|
86
|
+
manifestEstimatedTokens: number | null;
|
|
87
|
+
derivedEstimatedTokens: number;
|
|
88
|
+
files: AgentImageEntryFile[];
|
|
89
|
+
/** Resume-token surface kept separate from manifest data so the
|
|
90
|
+
* library/list/get routes can omit it when the operator is browsing
|
|
91
|
+
* but include it when the consumer is the instantiator. */
|
|
92
|
+
sourceResumeToken: string;
|
|
93
|
+
stats: AgentImageStats;
|
|
94
|
+
lineage: string[];
|
|
95
|
+
/** True when an explicit `pin` file exists at <sourcePath>/.pinned.
|
|
96
|
+
* Pinned images are protected from `prune` regardless of active-
|
|
97
|
+
* reference scan results. */
|
|
98
|
+
pinned: boolean;
|
|
99
|
+
}
|
|
100
|
+
export interface AgentImageEntryFile {
|
|
101
|
+
path: string;
|
|
102
|
+
role: string;
|
|
103
|
+
summary: string | null;
|
|
104
|
+
absolutePath: string | null;
|
|
105
|
+
bytes: number | null;
|
|
106
|
+
estimatedTokens: number | null;
|
|
107
|
+
}
|
|
108
|
+
export declare class AgentImageError extends Error {
|
|
109
|
+
readonly code: "manifest_missing" | "manifest_parse_error" | "manifest_invalid" | "image_not_found" | "image_referenced" | "image_pinned" | "runtime_mismatch" | "stats_write_failed";
|
|
110
|
+
readonly details?: Record<string, unknown> | undefined;
|
|
111
|
+
constructor(code: "manifest_missing" | "manifest_parse_error" | "manifest_invalid" | "image_not_found" | "image_referenced" | "image_pinned" | "runtime_mismatch" | "stats_write_failed", message: string, details?: Record<string, unknown> | undefined);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=agent-image-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-image-types.d.ts","sourceRoot":"","sources":["../../../src/domain/agent-images/agent-image-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Fork Primitive + Starter Agent Images v0 (PL-016) — typed primitive
|
|
2
|
+
// parallel to skills + workflow_specs + context_packs (PL-014).
|
|
3
|
+
//
|
|
4
|
+
// An agent_image is a snapshot bundle of a productive seat's
|
|
5
|
+
// resumable state — runtime-specific resume token (Claude resume_token
|
|
6
|
+
// / Codex thread_id), source-seat lineage, optional cwd-deltas + notes
|
|
7
|
+
// — surfaced in the Specs library and consumable by AgentSpec
|
|
8
|
+
// `session_source: mode: agent_image, ref: { kind: image_name, ... }`.
|
|
9
|
+
// Storage at ~/.openrig/agent-images/<name>/ + workspace-local
|
|
10
|
+
// .openrig/agent-images/<name>/.
|
|
11
|
+
//
|
|
12
|
+
// MVP single-host context: filesystem-canonical; NO new SQLite tables;
|
|
13
|
+
// library cache is in-memory at the daemon scope.
|
|
14
|
+
export class AgentImageError extends Error {
|
|
15
|
+
code;
|
|
16
|
+
details;
|
|
17
|
+
constructor(code, message, details) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.code = code;
|
|
20
|
+
this.details = details;
|
|
21
|
+
this.name = "AgentImageError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=agent-image-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-image-types.js","sourceRoot":"","sources":["../../../src/domain/agent-images/agent-image-types.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,gEAAgE;AAChE,EAAE;AACF,6DAA6D;AAC7D,uEAAuE;AACvE,uEAAuE;AACvE,8DAA8D;AAC9D,uEAAuE;AACvE,+DAA+D;AAC/D,iCAAiC;AACjC,EAAE;AACF,uEAAuE;AACvE,kDAAkD;AAoHlD,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAEtB;IAUA;IAXlB,YACkB,IAQQ,EACxB,OAAe,EACC,OAAiC;QAEjD,KAAK,CAAC,OAAO,CAAC,CAAC;QAZC,SAAI,GAAJ,IAAI,CAQI;QAER,YAAO,GAAP,OAAO,CAA0B;QAGjD,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { AgentImageEntry } from "./agent-image-types.js";
|
|
2
|
+
export type ProtectionReason = "pinned" | "referenced_by_agent_spec" | "referenced_by_rig_spec" | "lineage_descendant_of_protected";
|
|
3
|
+
export interface ImageProtectionStatus {
|
|
4
|
+
imageId: string;
|
|
5
|
+
imageName: string;
|
|
6
|
+
imageVersion: string;
|
|
7
|
+
protected: boolean;
|
|
8
|
+
reasons: ProtectionReason[];
|
|
9
|
+
/** Specific filesystem paths that hold the protective references. */
|
|
10
|
+
references: string[];
|
|
11
|
+
}
|
|
12
|
+
export interface EvidenceGuardOpts {
|
|
13
|
+
/** All images in the library (so lineage-based protection can
|
|
14
|
+
* traverse the chain without re-walking discovery roots). */
|
|
15
|
+
images: readonly AgentImageEntry[];
|
|
16
|
+
/** Spec-library directories to walk for active references. Each is
|
|
17
|
+
* walked recursively for `*.yaml` / `*.yml` files. */
|
|
18
|
+
specRoots: readonly string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Compute protection status for every image. The result is parallel to
|
|
22
|
+
* the input array order; the protected image set is what `prune` MUST
|
|
23
|
+
* skip unless --force is supplied.
|
|
24
|
+
*/
|
|
25
|
+
export declare function evaluateProtection(opts: EvidenceGuardOpts): ImageProtectionStatus[];
|
|
26
|
+
//# sourceMappingURL=evidence-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-guard.d.ts","sourceRoot":"","sources":["../../../src/domain/agent-images/evidence-guard.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,MAAM,gBAAgB,GACxB,QAAQ,GACR,0BAA0B,GAC1B,wBAAwB,GACxB,iCAAiC,CAAC;AAEtC,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,qEAAqE;IACrE,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC;kEAC8D;IAC9D,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IACnC;2DACuD;IACvD,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,iBAAiB,GAAG,qBAAqB,EAAE,CA8DnF"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
// Fork Primitive + Starter Agent Images v0 (PL-016) — evidence-
|
|
2
|
+
// preservation guard for `rig agent-image prune` / DELETE
|
|
3
|
+
// /api/agent-images/library/:id.
|
|
4
|
+
//
|
|
5
|
+
// PRD § Item 6 — CATASTROPHIC BOUNCE if dropped. An image is protected
|
|
6
|
+
// from deletion if ANY:
|
|
7
|
+
//
|
|
8
|
+
// - Pinned (operator placed `.pinned` sentinel via `rig agent-image pin`)
|
|
9
|
+
// - Referenced by an active agent.yaml (session_source: mode:
|
|
10
|
+
// agent_image, ref.value: <name>) — scanned across discovery roots
|
|
11
|
+
// for spec library files
|
|
12
|
+
// - Referenced by a rig spec in the spec library (members[].session_source)
|
|
13
|
+
// - Lineage descendant of another protected image (transitive
|
|
14
|
+
// protection up the chain)
|
|
15
|
+
//
|
|
16
|
+
// The guard fails CLOSED. Operator may pass --force to override.
|
|
17
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
18
|
+
import { join } from "node:path";
|
|
19
|
+
import { parse as parseYaml } from "yaml";
|
|
20
|
+
/**
|
|
21
|
+
* Compute protection status for every image. The result is parallel to
|
|
22
|
+
* the input array order; the protected image set is what `prune` MUST
|
|
23
|
+
* skip unless --force is supplied.
|
|
24
|
+
*/
|
|
25
|
+
export function evaluateProtection(opts) {
|
|
26
|
+
const referencedNames = scanSpecRootsForReferences(opts.specRoots);
|
|
27
|
+
// Pass 1: compute direct protection (pinned + referenced).
|
|
28
|
+
const statuses = new Map();
|
|
29
|
+
const protectedNameSet = new Set();
|
|
30
|
+
for (const img of opts.images) {
|
|
31
|
+
const refs = referencedNames.get(img.name) ?? [];
|
|
32
|
+
const reasons = [];
|
|
33
|
+
if (img.pinned)
|
|
34
|
+
reasons.push("pinned");
|
|
35
|
+
// Distinguish agent.yaml-shaped vs rig.yaml-shaped references when
|
|
36
|
+
// both surface; but the scanner returns paths, and the path-based
|
|
37
|
+
// tag is stored alongside. Simplification at v0: any file whose
|
|
38
|
+
// basename is `agent.yaml` is agent-spec; otherwise rig-spec.
|
|
39
|
+
const seenReason = new Set();
|
|
40
|
+
for (const ref of refs) {
|
|
41
|
+
const reason = ref.endsWith("/agent.yaml")
|
|
42
|
+
? "referenced_by_agent_spec"
|
|
43
|
+
: "referenced_by_rig_spec";
|
|
44
|
+
if (!seenReason.has(reason)) {
|
|
45
|
+
reasons.push(reason);
|
|
46
|
+
seenReason.add(reason);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const status = {
|
|
50
|
+
imageId: img.id,
|
|
51
|
+
imageName: img.name,
|
|
52
|
+
imageVersion: img.version,
|
|
53
|
+
protected: reasons.length > 0,
|
|
54
|
+
reasons,
|
|
55
|
+
references: refs,
|
|
56
|
+
};
|
|
57
|
+
statuses.set(img.name, status);
|
|
58
|
+
if (status.protected)
|
|
59
|
+
protectedNameSet.add(img.name);
|
|
60
|
+
}
|
|
61
|
+
// Pass 2: transitive lineage protection. An image whose lineage
|
|
62
|
+
// includes a protected image becomes protected too. Iterate to a
|
|
63
|
+
// fixed point so multi-hop chains converge.
|
|
64
|
+
let changed = true;
|
|
65
|
+
while (changed) {
|
|
66
|
+
changed = false;
|
|
67
|
+
for (const img of opts.images) {
|
|
68
|
+
const status = statuses.get(img.name);
|
|
69
|
+
if (status.protected)
|
|
70
|
+
continue;
|
|
71
|
+
// img's lineage lists ANCESTORS. We protect a DESCENDANT of a
|
|
72
|
+
// protected image — meaning if any ancestor of `img` is
|
|
73
|
+
// protected, `img` itself becomes protected by transit.
|
|
74
|
+
for (const ancestor of img.lineage) {
|
|
75
|
+
if (protectedNameSet.has(ancestor)) {
|
|
76
|
+
status.protected = true;
|
|
77
|
+
status.reasons.push("lineage_descendant_of_protected");
|
|
78
|
+
status.references.push(`lineage-of:${ancestor}`);
|
|
79
|
+
protectedNameSet.add(img.name);
|
|
80
|
+
changed = true;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return opts.images.map((img) => statuses.get(img.name));
|
|
87
|
+
}
|
|
88
|
+
/** Walk spec-library roots for YAML files and collect file paths that
|
|
89
|
+
* reference any agent_image by name. The match is conservative: any
|
|
90
|
+
* YAML that contains a `mode: agent_image` directive WITH a
|
|
91
|
+
* `value: <name>` field is treated as a reference. False positives are
|
|
92
|
+
* acceptable (over-protection); false negatives would cause
|
|
93
|
+
* catastrophic data loss. */
|
|
94
|
+
function scanSpecRootsForReferences(roots) {
|
|
95
|
+
const out = new Map();
|
|
96
|
+
for (const root of roots) {
|
|
97
|
+
if (!existsSync(root))
|
|
98
|
+
continue;
|
|
99
|
+
walkYaml(root, (absPath) => {
|
|
100
|
+
let raw;
|
|
101
|
+
try {
|
|
102
|
+
raw = readFileSync(absPath, "utf-8");
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (!raw.includes("agent_image"))
|
|
108
|
+
return;
|
|
109
|
+
let parsed;
|
|
110
|
+
try {
|
|
111
|
+
parsed = parseYaml(raw);
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const refs = collectImageRefs(parsed);
|
|
117
|
+
for (const name of refs) {
|
|
118
|
+
const existing = out.get(name) ?? [];
|
|
119
|
+
existing.push(absPath);
|
|
120
|
+
out.set(name, existing);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return out;
|
|
125
|
+
}
|
|
126
|
+
function walkYaml(root, visit) {
|
|
127
|
+
const stack = [root];
|
|
128
|
+
while (stack.length > 0) {
|
|
129
|
+
const current = stack.pop();
|
|
130
|
+
let entries;
|
|
131
|
+
try {
|
|
132
|
+
entries = readdirSync(current, { withFileTypes: true });
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
for (const entry of entries) {
|
|
138
|
+
const abs = join(current, entry.name);
|
|
139
|
+
if (entry.isDirectory()) {
|
|
140
|
+
stack.push(abs);
|
|
141
|
+
}
|
|
142
|
+
else if (entry.isFile() && (entry.name.endsWith(".yaml") || entry.name.endsWith(".yml"))) {
|
|
143
|
+
try {
|
|
144
|
+
if (statSync(abs).size > 5_000_000)
|
|
145
|
+
continue; // skip suspiciously large YAML files
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
visit(abs);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/** Recursively walk a parsed YAML tree and collect the `value` of any
|
|
156
|
+
* `session_source: { mode: agent_image, ref: { kind: image_name, value: <name> } }`. */
|
|
157
|
+
function collectImageRefs(node, acc = new Set()) {
|
|
158
|
+
if (!node || typeof node !== "object")
|
|
159
|
+
return acc;
|
|
160
|
+
if (Array.isArray(node)) {
|
|
161
|
+
for (const item of node)
|
|
162
|
+
collectImageRefs(item, acc);
|
|
163
|
+
return acc;
|
|
164
|
+
}
|
|
165
|
+
const obj = node;
|
|
166
|
+
// Match shape: session_source: { mode: agent_image, ref: { value: <name> } }
|
|
167
|
+
const ss = obj["session_source"] ?? obj["sessionSource"];
|
|
168
|
+
if (ss && typeof ss === "object" && !Array.isArray(ss)) {
|
|
169
|
+
const ssObj = ss;
|
|
170
|
+
if (ssObj["mode"] === "agent_image") {
|
|
171
|
+
const ref = ssObj["ref"];
|
|
172
|
+
if (ref && typeof ref === "object" && !Array.isArray(ref)) {
|
|
173
|
+
const value = ref["value"];
|
|
174
|
+
if (typeof value === "string" && value.length > 0)
|
|
175
|
+
acc.add(value);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Recurse into all values regardless — a rig.yaml has session_source
|
|
180
|
+
// nested inside members[].
|
|
181
|
+
for (const v of Object.values(obj))
|
|
182
|
+
collectImageRefs(v, acc);
|
|
183
|
+
return acc;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=evidence-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evidence-guard.js","sourceRoot":"","sources":["../../../src/domain/agent-images/evidence-guard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-parser.d.ts","sourceRoot":"","sources":["../../../src/domain/agent-images/manifest-parser.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,KAAK,kBAAkB,EAGxB,MAAM,wBAAwB,CAAC;AAKhC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,kBAAkB,CAoK/F"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// Fork Primitive + Starter Agent Images v0 (PL-016) — manifest parser.
|
|
2
|
+
//
|
|
3
|
+
// Parses ~/.openrig/agent-images/<name>/manifest.yaml into a typed
|
|
4
|
+
// AgentImageManifest. Pure (no fs touches in the parser; caller hands
|
|
5
|
+
// in raw YAML). Validation guards: required field checks, runtime
|
|
6
|
+
// allow-list, path-traversal rejection on supplementary files.
|
|
7
|
+
import { parse as parseYaml } from "yaml";
|
|
8
|
+
import { AgentImageError, } from "./agent-image-types.js";
|
|
9
|
+
const ALLOWED_RUNTIMES = new Set(["claude-code", "codex"]);
|
|
10
|
+
const ALLOWED_FILE_SUFFIXES = [".md", ".markdown", ".yaml", ".yml", ".txt", ".json"];
|
|
11
|
+
export function parseAgentImageManifest(rawYaml, sourcePath) {
|
|
12
|
+
let parsed;
|
|
13
|
+
try {
|
|
14
|
+
parsed = parseYaml(rawYaml);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
throw new AgentImageError("manifest_parse_error", `manifest at ${sourcePath} is not valid YAML: ${err.message}`, { sourcePath });
|
|
18
|
+
}
|
|
19
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
20
|
+
throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} must be a YAML object at the root`, { sourcePath });
|
|
21
|
+
}
|
|
22
|
+
const obj = parsed;
|
|
23
|
+
const name = obj["name"];
|
|
24
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
25
|
+
throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} is missing required field 'name'`, { sourcePath });
|
|
26
|
+
}
|
|
27
|
+
const versionRaw = obj["version"];
|
|
28
|
+
if (versionRaw === undefined || versionRaw === null) {
|
|
29
|
+
throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} is missing required field 'version'`, { sourcePath });
|
|
30
|
+
}
|
|
31
|
+
const version = String(versionRaw);
|
|
32
|
+
const runtime = obj["runtime"];
|
|
33
|
+
if (typeof runtime !== "string" || !ALLOWED_RUNTIMES.has(runtime)) {
|
|
34
|
+
throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} has invalid runtime '${runtime}'; allowed: ${[...ALLOWED_RUNTIMES].join(", ")}`, { sourcePath, runtime });
|
|
35
|
+
}
|
|
36
|
+
// Source seat / session id / resume token are required on a real
|
|
37
|
+
// image. The PRD's v0 manifest schema reads these as load-bearing —
|
|
38
|
+
// an image without a resume token can't be consumed.
|
|
39
|
+
const sourceSeatRaw = obj["source_seat"] ?? obj["sourceSeat"];
|
|
40
|
+
if (typeof sourceSeatRaw !== "string" || sourceSeatRaw.length === 0) {
|
|
41
|
+
throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} is missing required field 'source_seat'`, { sourcePath });
|
|
42
|
+
}
|
|
43
|
+
const sourceSessionIdRaw = obj["source_session_id"] ?? obj["sourceSessionId"];
|
|
44
|
+
if (typeof sourceSessionIdRaw !== "string" || sourceSessionIdRaw.length === 0) {
|
|
45
|
+
throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} is missing required field 'source_session_id'`, { sourcePath });
|
|
46
|
+
}
|
|
47
|
+
const sourceResumeTokenRaw = obj["source_resume_token"] ?? obj["sourceResumeToken"];
|
|
48
|
+
if (typeof sourceResumeTokenRaw !== "string" || sourceResumeTokenRaw.length === 0) {
|
|
49
|
+
throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} is missing required field 'source_resume_token'`, { sourcePath });
|
|
50
|
+
}
|
|
51
|
+
const createdAtRaw = obj["created_at"] ?? obj["createdAt"];
|
|
52
|
+
const createdAt = typeof createdAtRaw === "string" && createdAtRaw.length > 0
|
|
53
|
+
? createdAtRaw
|
|
54
|
+
: new Date(0).toISOString();
|
|
55
|
+
const notes = typeof obj["notes"] === "string" ? obj["notes"] : undefined;
|
|
56
|
+
// PL-016 source-cwd behavior: optional
|
|
57
|
+
// source_cwd captured at snapshot time. Manifests authored before this
|
|
58
|
+
// fix omit the field; consumers fall back to "no cwd line" rendering
|
|
59
|
+
// (back-compat).
|
|
60
|
+
const sourceCwdRaw = obj["source_cwd"] ?? obj["sourceCwd"];
|
|
61
|
+
const sourceCwd = typeof sourceCwdRaw === "string" && sourceCwdRaw.length > 0
|
|
62
|
+
? sourceCwdRaw
|
|
63
|
+
: undefined;
|
|
64
|
+
const filesRaw = obj["files"];
|
|
65
|
+
const files = [];
|
|
66
|
+
if (Array.isArray(filesRaw)) {
|
|
67
|
+
for (let i = 0; i < filesRaw.length; i++) {
|
|
68
|
+
const f = filesRaw[i];
|
|
69
|
+
if (!f || typeof f !== "object" || Array.isArray(f)) {
|
|
70
|
+
throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} has malformed entry at files[${i}] (must be object with path + role)`, { sourcePath, index: i });
|
|
71
|
+
}
|
|
72
|
+
const fr = f;
|
|
73
|
+
const path = fr["path"];
|
|
74
|
+
if (typeof path !== "string" || path.length === 0) {
|
|
75
|
+
throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} files[${i}] missing 'path'`, { sourcePath, index: i });
|
|
76
|
+
}
|
|
77
|
+
if (path.includes("..") || path.startsWith("/")) {
|
|
78
|
+
throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} files[${i}].path '${path}' must be a relative path inside the image (no '..', no leading '/')`, { sourcePath, index: i, path });
|
|
79
|
+
}
|
|
80
|
+
if (!ALLOWED_FILE_SUFFIXES.some((s) => path.endsWith(s))) {
|
|
81
|
+
throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} files[${i}].path '${path}' has unsupported suffix; allowed: ${ALLOWED_FILE_SUFFIXES.join(", ")}`, { sourcePath, index: i, path });
|
|
82
|
+
}
|
|
83
|
+
const role = fr["role"];
|
|
84
|
+
if (typeof role !== "string" || role.length === 0) {
|
|
85
|
+
throw new AgentImageError("manifest_invalid", `manifest at ${sourcePath} files[${i}] missing 'role'`, { sourcePath, index: i, path });
|
|
86
|
+
}
|
|
87
|
+
const summary = typeof fr["summary"] === "string" ? fr["summary"] : undefined;
|
|
88
|
+
files.push(summary === undefined ? { path, role } : { path, role, summary });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const estimatedTokensRaw = obj["estimated_tokens"] ?? obj["estimatedTokens"];
|
|
92
|
+
const estimatedTokens = typeof estimatedTokensRaw === "number" && Number.isFinite(estimatedTokensRaw)
|
|
93
|
+
? Math.max(0, Math.floor(estimatedTokensRaw))
|
|
94
|
+
: undefined;
|
|
95
|
+
const lineageRaw = obj["lineage"];
|
|
96
|
+
const lineage = Array.isArray(lineageRaw)
|
|
97
|
+
? lineageRaw.filter((l) => typeof l === "string" && l.length > 0)
|
|
98
|
+
: undefined;
|
|
99
|
+
return {
|
|
100
|
+
name,
|
|
101
|
+
version,
|
|
102
|
+
runtime: runtime,
|
|
103
|
+
sourceSeat: sourceSeatRaw,
|
|
104
|
+
sourceSessionId: sourceSessionIdRaw,
|
|
105
|
+
sourceResumeToken: sourceResumeTokenRaw,
|
|
106
|
+
...(sourceCwd !== undefined ? { sourceCwd } : {}),
|
|
107
|
+
createdAt,
|
|
108
|
+
...(notes !== undefined ? { notes } : {}),
|
|
109
|
+
files,
|
|
110
|
+
...(estimatedTokens !== undefined ? { estimatedTokens } : {}),
|
|
111
|
+
...(lineage !== undefined ? { lineage } : {}),
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=manifest-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest-parser.js","sourceRoot":"","sources":["../../../src/domain/agent-images/manifest-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
export type DiscoveryRuntime = "claude-code" | "codex";
|
|
3
|
+
export interface DiscoveryResult {
|
|
4
|
+
runtime: DiscoveryRuntime;
|
|
5
|
+
/** Native conversation id (Claude resume_token / Codex thread_id /
|
|
6
|
+
* external_session_name for external-CLI Codex seats). null when
|
|
7
|
+
* the daemon can't surface one yet. */
|
|
8
|
+
nativeId: string | null;
|
|
9
|
+
/** PL-016 source-cwd behavior: source
|
|
10
|
+
* seat's resolved cwd from the nodes table. Captured here so
|
|
11
|
+
* SnapshotCapturer (and any future fork route) can persist it on
|
|
12
|
+
* the manifest without an additional query. null when the source
|
|
13
|
+
* node has no recorded cwd. */
|
|
14
|
+
nodeCwd: string | null;
|
|
15
|
+
}
|
|
16
|
+
export interface DiscoveryFailure {
|
|
17
|
+
code: "session_not_found" | "runtime_unsupported";
|
|
18
|
+
message: string;
|
|
19
|
+
}
|
|
20
|
+
export type DiscoveryOutcome = {
|
|
21
|
+
ok: true;
|
|
22
|
+
result: DiscoveryResult;
|
|
23
|
+
} | {
|
|
24
|
+
ok: false;
|
|
25
|
+
failure: DiscoveryFailure;
|
|
26
|
+
};
|
|
27
|
+
export declare function discoverResumeToken(db: Database.Database, sourceSession: string): DiscoveryOutcome;
|
|
28
|
+
//# sourceMappingURL=resume-token-discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume-token-discovery.d.ts","sourceRoot":"","sources":["../../../src/domain/agent-images/resume-token-discovery.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,gBAAgB,GAAG,aAAa,GAAG,OAAO,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,gBAAgB,CAAC;IAC1B;;4CAEwC;IACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;oCAIgC;IAChC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,mBAAmB,GAAG,qBAAqB,CAAC;IAClD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,CAAC;AAEhH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,gBAAgB,CAgDlG"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Fork Primitive + Starter Agent Images v0 (PL-016) — runtime-specific
|
|
2
|
+
// resume-token discovery.
|
|
3
|
+
//
|
|
4
|
+
// Given a canonical session name, returns the native conversation id
|
|
5
|
+
// the runtime uses for fork/resume. Shared between SnapshotCapturer
|
|
6
|
+
// (capture into image) and the /api/agent-images/fork route (one-shot
|
|
7
|
+
// fork without snapshot side effect).
|
|
8
|
+
//
|
|
9
|
+
// Honest failure mode: returns null when no token is available rather
|
|
10
|
+
// than fabricating one (architecture.md § Resume honesty).
|
|
11
|
+
export function discoverResumeToken(db, sourceSession) {
|
|
12
|
+
const sessionRow = db
|
|
13
|
+
.prepare("SELECT id, node_id, resume_token FROM sessions WHERE session_name = ? ORDER BY id DESC LIMIT 1")
|
|
14
|
+
.get(sourceSession);
|
|
15
|
+
if (!sessionRow) {
|
|
16
|
+
return {
|
|
17
|
+
ok: false,
|
|
18
|
+
failure: {
|
|
19
|
+
code: "session_not_found",
|
|
20
|
+
message: `Source session '${sourceSession}' not found. Run 'rig ps --nodes' to see what's running.`,
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
const nodeRow = db
|
|
25
|
+
.prepare("SELECT runtime, cwd FROM nodes WHERE id = ?")
|
|
26
|
+
.get(sessionRow.node_id);
|
|
27
|
+
const runtime = nodeRow?.runtime ?? null;
|
|
28
|
+
const nodeCwd = nodeRow?.cwd ?? null;
|
|
29
|
+
if (runtime !== "claude-code" && runtime !== "codex") {
|
|
30
|
+
return {
|
|
31
|
+
ok: false,
|
|
32
|
+
failure: {
|
|
33
|
+
code: "runtime_unsupported",
|
|
34
|
+
message: `Source session '${sourceSession}' has runtime '${runtime ?? "(unknown)"}' which has no native fork primitive. Only claude-code and codex sessions can be forked.`,
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (runtime === "claude-code") {
|
|
39
|
+
const contextSessionId = discoverClaudeContextSessionId(db, sessionRow.node_id, sourceSession);
|
|
40
|
+
return {
|
|
41
|
+
ok: true,
|
|
42
|
+
result: { runtime, nativeId: contextSessionId ?? sessionRow.resume_token ?? null, nodeCwd },
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
// Codex managed tmux seats persist the captured native thread id on the
|
|
46
|
+
// sessions row after launch. Use it directly for image capture/fork.
|
|
47
|
+
if (sessionRow.resume_token) {
|
|
48
|
+
return { ok: true, result: { runtime, nativeId: sessionRow.resume_token, nodeCwd } };
|
|
49
|
+
}
|
|
50
|
+
// Codex external_cli seats may not have a sessions.resume_token; the
|
|
51
|
+
// external_session_name on the binding row holds the native conversation id.
|
|
52
|
+
const bindingRow = db
|
|
53
|
+
.prepare("SELECT external_session_name, attachment_type FROM bindings WHERE node_id = ?")
|
|
54
|
+
.get(sessionRow.node_id);
|
|
55
|
+
if (bindingRow?.attachment_type === "external_cli" && bindingRow.external_session_name) {
|
|
56
|
+
return { ok: true, result: { runtime, nativeId: bindingRow.external_session_name, nodeCwd } };
|
|
57
|
+
}
|
|
58
|
+
return { ok: true, result: { runtime, nativeId: null, nodeCwd } };
|
|
59
|
+
}
|
|
60
|
+
function discoverClaudeContextSessionId(db, nodeId, sourceSession) {
|
|
61
|
+
try {
|
|
62
|
+
const row = db
|
|
63
|
+
.prepare(`
|
|
64
|
+
SELECT session_id, session_name
|
|
65
|
+
FROM context_usage
|
|
66
|
+
WHERE node_id = ?
|
|
67
|
+
LIMIT 1
|
|
68
|
+
`)
|
|
69
|
+
.get(nodeId);
|
|
70
|
+
if (!row)
|
|
71
|
+
return null;
|
|
72
|
+
if (row.session_name && row.session_name !== sourceSession)
|
|
73
|
+
return null;
|
|
74
|
+
const nativeId = row.session_id?.trim();
|
|
75
|
+
return nativeId ? nativeId : null;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Back-compat for minimal test DBs or older stores: fall back to the
|
|
79
|
+
// persisted sessions.resume_token rather than making discovery fail.
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=resume-token-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume-token-discovery.js","sourceRoot":"","sources":["../../../src/domain/agent-images/resume-token-discovery.ts"],"names":[],"mappings":"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"}
|