@openrig/cli 0.3.0 → 0.3.2
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 +1 -3
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +17 -57
- 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 +45 -58
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts +36 -0
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +66 -0
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/db/migrations/037_mission_control_actions.d.ts +5 -1
- package/daemon/dist/db/migrations/037_mission_control_actions.d.ts.map +1 -1
- package/daemon/dist/db/migrations/037_mission_control_actions.js +5 -1
- package/daemon/dist/db/migrations/037_mission_control_actions.js.map +1 -1
- 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/db/migrations/041_rig_policy.d.ts +32 -0
- package/daemon/dist/db/migrations/041_rig_policy.d.ts.map +1 -0
- package/daemon/dist/db/migrations/041_rig_policy.js +47 -0
- package/daemon/dist/db/migrations/041_rig_policy.js.map +1 -0
- package/daemon/dist/domain/agent-images/resume-token-discovery.js +1 -1
- package/daemon/dist/domain/agent-images/resume-token-discovery.js.map +1 -1
- package/daemon/dist/domain/agent-images/snapshot-capturer.d.ts.map +1 -1
- package/daemon/dist/domain/agent-images/snapshot-capturer.js +2 -1
- package/daemon/dist/domain/agent-images/snapshot-capturer.js.map +1 -1
- package/daemon/dist/domain/agent-manifest.d.ts.map +1 -1
- package/daemon/dist/domain/agent-manifest.js +143 -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/bootstrap-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.js +86 -6
- package/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
- package/daemon/dist/domain/bundle-agent-images-router.d.ts +95 -0
- package/daemon/dist/domain/bundle-agent-images-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-agent-images-router.js +140 -0
- package/daemon/dist/domain/bundle-agent-images-router.js.map +1 -0
- package/daemon/dist/domain/bundle-assembler.d.ts +18 -1
- package/daemon/dist/domain/bundle-assembler.d.ts.map +1 -1
- package/daemon/dist/domain/bundle-assembler.js +11 -1
- package/daemon/dist/domain/bundle-assembler.js.map +1 -1
- package/daemon/dist/domain/bundle-audit.d.ts +89 -0
- package/daemon/dist/domain/bundle-audit.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-audit.js +87 -0
- package/daemon/dist/domain/bundle-audit.js.map +1 -0
- package/daemon/dist/domain/bundle-conflict-detector.d.ts +57 -0
- package/daemon/dist/domain/bundle-conflict-detector.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-conflict-detector.js +49 -0
- package/daemon/dist/domain/bundle-conflict-detector.js.map +1 -0
- package/daemon/dist/domain/bundle-context-packs-router.d.ts +100 -0
- package/daemon/dist/domain/bundle-context-packs-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-context-packs-router.js +158 -0
- package/daemon/dist/domain/bundle-context-packs-router.js.map +1 -0
- package/daemon/dist/domain/bundle-plugins-router.d.ts +69 -0
- package/daemon/dist/domain/bundle-plugins-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-plugins-router.js +87 -0
- package/daemon/dist/domain/bundle-plugins-router.js.map +1 -0
- package/daemon/dist/domain/bundle-skills-router.d.ts +62 -0
- package/daemon/dist/domain/bundle-skills-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-skills-router.js +90 -0
- package/daemon/dist/domain/bundle-skills-router.js.map +1 -0
- package/daemon/dist/domain/bundle-types.d.ts +106 -0
- package/daemon/dist/domain/bundle-types.d.ts.map +1 -1
- package/daemon/dist/domain/bundle-types.js +375 -0
- package/daemon/dist/domain/bundle-types.js.map +1 -1
- package/daemon/dist/domain/bundle-workflow-specs-router.d.ts +94 -0
- package/daemon/dist/domain/bundle-workflow-specs-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-workflow-specs-router.js +144 -0
- package/daemon/dist/domain/bundle-workflow-specs-router.js.map +1 -0
- 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/context-monitor.d.ts +19 -1
- package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/context-monitor.js +62 -14
- package/daemon/dist/domain/context-monitor.js.map +1 -1
- package/daemon/dist/domain/graph-projection.d.ts +6 -0
- package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
- package/daemon/dist/domain/graph-projection.js +6 -0
- package/daemon/dist/domain/graph-projection.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/mission-control/mission-control-read-layer.d.ts +5 -0
- package/daemon/dist/domain/mission-control/mission-control-read-layer.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-read-layer.js +16 -2
- package/daemon/dist/domain/mission-control/mission-control-read-layer.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-write-contract.js +3 -1
- package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
- package/daemon/dist/domain/native-resume-probe.js +7 -7
- package/daemon/dist/domain/native-resume-probe.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts +18 -0
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +98 -0
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/node-launcher.d.ts +12 -0
- package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/node-launcher.js +25 -1
- 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/pod-bundle-assembler.d.ts +16 -1
- package/daemon/dist/domain/pod-bundle-assembler.d.ts.map +1 -1
- package/daemon/dist/domain/pod-bundle-assembler.js +11 -1
- package/daemon/dist/domain/pod-bundle-assembler.js.map +1 -1
- package/daemon/dist/domain/profile-resolver.d.ts +13 -3
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +11 -7
- package/daemon/dist/domain/profile-resolver.js.map +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/ps-projection.d.ts +22 -0
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +57 -0
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +44 -1
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +112 -6
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/restore-check-service.d.ts +4 -0
- package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
- package/daemon/dist/domain/restore-check-service.js +16 -7
- package/daemon/dist/domain/restore-check-service.js.map +1 -1
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.d.ts +48 -0
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.d.ts.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.js +96 -0
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.js.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-store.d.ts +46 -0
- package/daemon/dist/domain/rig-policy/rig-policy-store.d.ts.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-store.js +171 -0
- package/daemon/dist/domain/rig-policy/rig-policy-store.js.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-types.d.ts +145 -0
- package/daemon/dist/domain/rig-policy/rig-policy-types.d.ts.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-types.js +52 -0
- package/daemon/dist/domain/rig-policy/rig-policy-types.js.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-validator.d.ts +58 -0
- package/daemon/dist/domain/rig-policy/rig-policy-validator.d.ts.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-validator.js +211 -0
- package/daemon/dist/domain/rig-policy/rig-policy-validator.js.map +1 -0
- package/daemon/dist/domain/rigspec-instantiator.d.ts +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +109 -18
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/seat-activity-service.d.ts +79 -0
- package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -0
- package/daemon/dist/domain/seat-activity-service.js +123 -0
- package/daemon/dist/domain/seat-activity-service.js.map +1 -0
- 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-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-indexer.d.ts +31 -0
- package/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -1
- package/daemon/dist/domain/slices/slice-indexer.js +111 -6
- package/daemon/dist/domain/slices/slice-indexer.js.map +1 -1
- package/daemon/dist/domain/spec-library-service.d.ts +6 -0
- package/daemon/dist/domain/spec-library-service.d.ts.map +1 -1
- package/daemon/dist/domain/spec-library-service.js +19 -0
- package/daemon/dist/domain/spec-library-service.js.map +1 -1
- package/daemon/dist/domain/spec-library-workflow-scanner.d.ts +43 -0
- package/daemon/dist/domain/spec-library-workflow-scanner.d.ts.map +1 -1
- package/daemon/dist/domain/spec-library-workflow-scanner.js +157 -3
- package/daemon/dist/domain/spec-library-workflow-scanner.js.map +1 -1
- 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/types.d.ts +106 -10
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +25 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +186 -4
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.d.ts +49 -0
- package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.js +96 -0
- package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +7 -0
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js +201 -3
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
- 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-doctor.d.ts +197 -0
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -0
- package/daemon/dist/domain/workspace/workspace-doctor.js +448 -0
- package/daemon/dist/domain/workspace/workspace-doctor.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 +63 -17
- 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 +47 -5
- package/daemon/dist/middleware/auth-bearer-token.d.ts.map +1 -1
- package/daemon/dist/middleware/auth-bearer-token.js +109 -8
- package/daemon/dist/middleware/auth-bearer-token.js.map +1 -1
- package/daemon/dist/routes/bundles.d.ts.map +1 -1
- package/daemon/dist/routes/bundles.js +966 -7
- package/daemon/dist/routes/bundles.js.map +1 -1
- package/daemon/dist/routes/config.d.ts.map +1 -1
- package/daemon/dist/routes/config.js +19 -2
- package/daemon/dist/routes/config.js.map +1 -1
- package/daemon/dist/routes/info.d.ts +3 -0
- package/daemon/dist/routes/info.d.ts.map +1 -0
- package/daemon/dist/routes/info.js +20 -0
- package/daemon/dist/routes/info.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.map +1 -1
- package/daemon/dist/routes/mission-control.js +25 -2
- package/daemon/dist/routes/mission-control.js.map +1 -1
- 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/queue.d.ts +18 -0
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +97 -5
- 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/rig-policy.d.ts +9 -0
- package/daemon/dist/routes/rig-policy.d.ts.map +1 -0
- package/daemon/dist/routes/rig-policy.js +174 -0
- package/daemon/dist/routes/rig-policy.js.map +1 -0
- package/daemon/dist/routes/rigs.d.ts.map +1 -1
- package/daemon/dist/routes/rigs.js +10 -2
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/sessions.d.ts.map +1 -1
- package/daemon/dist/routes/sessions.js +26 -3
- 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.map +1 -1
- package/daemon/dist/routes/slices.js +15 -0
- package/daemon/dist/routes/slices.js.map +1 -1
- package/daemon/dist/routes/spec-library.d.ts.map +1 -1
- package/daemon/dist/routes/spec-library.js +16 -1
- package/daemon/dist/routes/spec-library.js.map +1 -1
- package/daemon/dist/routes/up.d.ts +25 -0
- package/daemon/dist/routes/up.d.ts.map +1 -1
- package/daemon/dist/routes/up.js +70 -3
- package/daemon/dist/routes/up.js.map +1 -1
- package/daemon/dist/routes/workspace.d.ts.map +1 -1
- package/daemon/dist/routes/workspace.js +80 -1
- package/daemon/dist/routes/workspace.js.map +1 -1
- package/daemon/dist/server.d.ts +41 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +41 -0
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +236 -6
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/specs/agents/apps/vault-specialist/agent.yaml +0 -1
- package/daemon/specs/agents/conveyor/builder/agent.yaml +0 -1
- package/daemon/specs/agents/conveyor/lead/agent.yaml +0 -1
- package/daemon/specs/agents/conveyor/planner/agent.yaml +0 -1
- package/daemon/specs/agents/conveyor/reviewer/agent.yaml +0 -1
- package/daemon/specs/agents/design/product-designer/agent.yaml +0 -1
- package/daemon/specs/agents/development/implementer/agent.yaml +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 +0 -1
- package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +28 -4
- 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 -6
- 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 +288 -6
- package/daemon/specs/agents/shared/skills/core/openrig-user-settings/SKILL.md +4 -4
- 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/rig.yaml +1 -1
- 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/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +13 -1
- package/dist/client.js.map +1 -1
- package/dist/commands/bundle.d.ts.map +1 -1
- package/dist/commands/bundle.js +123 -2
- package/dist/commands/bundle.js.map +1 -1
- package/dist/commands/config-init-workspace.d.ts.map +1 -1
- package/dist/commands/config-init-workspace.js +293 -5
- package/dist/commands/config-init-workspace.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +11 -3
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +53 -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/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 +51 -8
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts +6 -0
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +103 -5
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/rig-policy.d.ts +48 -0
- package/dist/commands/rig-policy.d.ts.map +1 -0
- package/dist/commands/rig-policy.js +429 -0
- package/dist/commands/rig-policy.js.map +1 -0
- package/dist/commands/scope.d.ts +6 -0
- package/dist/commands/scope.d.ts.map +1 -0
- package/dist/commands/scope.js +659 -0
- package/dist/commands/scope.js.map +1 -0
- package/dist/commands/send.d.ts +8 -0
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +8 -0
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +60 -1
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/workflow.d.ts +9 -0
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +139 -1
- package/dist/commands/workflow.js.map +1 -1
- package/dist/commands/workspace.d.ts +20 -0
- package/dist/commands/workspace.d.ts.map +1 -1
- package/dist/commands/workspace.js +138 -7
- package/dist/commands/workspace.js.map +1 -1
- package/dist/config-store.d.ts +18 -1
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +167 -4
- package/dist/config-store.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +45 -2
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +90 -9
- 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 +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/scope/dot-id.d.ts +43 -0
- package/dist/lib/scope/dot-id.d.ts.map +1 -0
- package/dist/lib/scope/dot-id.js +165 -0
- package/dist/lib/scope/dot-id.js.map +1 -0
- package/dist/lib/scope/scope-fs.d.ts +79 -0
- package/dist/lib/scope/scope-fs.d.ts.map +1 -0
- package/dist/lib/scope/scope-fs.js +468 -0
- package/dist/lib/scope/scope-fs.js.map +1 -0
- package/dist/lib/scope/templates.d.ts +38 -0
- package/dist/lib/scope/templates.d.ts.map +1 -0
- package/dist/lib/scope/templates.js +109 -0
- package/dist/lib/scope/templates.js.map +1 -0
- package/dist/lib/scope/types.d.ts +61 -0
- package/dist/lib/scope/types.d.ts.map +1 -0
- package/dist/lib/scope/types.js +38 -0
- package/dist/lib/scope/types.js.map +1 -0
- package/dist/lib/scope-templates/backlog-deprecation.md +26 -0
- package/dist/lib/scope-templates/backlog-tech-debt.md +22 -0
- package/dist/lib/scope-templates/bug-fix.md +30 -0
- package/dist/lib/scope-templates/mission-notes.md +97 -0
- package/dist/lib/scope-templates/mission-placeholder.md +20 -0
- package/dist/lib/scope-templates/mission-release.md +25 -0
- package/dist/lib/scope-templates/placeholder.md +30 -0
- package/dist/lib/scope-templates/release-feature.md +26 -0
- package/dist/lib/scope-templates/research.md +22 -0
- package/package.json +2 -2
- package/ui/dist/assets/index-C_Q5FczU.css +1 -0
- package/ui/dist/assets/index-GjTxfi9S.js +547 -0
- package/ui/dist/index.html +2 -2
- package/daemon/specs/agents/shared/skills/claude-compact-in-place/SKILL.md +0 -100
- 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-BDHU1JUK.js +0 -412
- package/ui/dist/assets/index-DXTyJSqu.css +0 -1
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
// V0.3.1 slice 12 walk-item 1 — mission scope data layer.
|
|
2
|
+
// V0.3.1 slice 13 walk-item 7 — extended with workflow_spec frontmatter
|
|
3
|
+
// + projected topology spec graph.
|
|
4
|
+
//
|
|
5
|
+
// GET /api/missions/:missionId — returns aggregated mission metadata
|
|
6
|
+
// (missionPath + slices + optional workflow_spec declaration + optional
|
|
7
|
+
// projected topology). Powers the Mission Overview / Progress / Topology
|
|
8
|
+
// tabs in the Project surface; pairs with useScopeMarkdown for README /
|
|
9
|
+
// PROGRESS content via the existing /api/files/read route.
|
|
10
|
+
//
|
|
11
|
+
// Returns:
|
|
12
|
+
// 200 {
|
|
13
|
+
// missionId, missionPath, slices,
|
|
14
|
+
// workflow_spec: { name, version } | null,
|
|
15
|
+
// topology: { specGraph: SpecGraphPayload | null } | null
|
|
16
|
+
// }
|
|
17
|
+
// 404 { error: "mission_not_found" } when no slices match
|
|
18
|
+
// 503 { error: "slices_indexer_unavailable" } when indexer not wired
|
|
19
|
+
// 503 { error: "slices_root_not_configured" } when indexer not ready
|
|
20
|
+
//
|
|
21
|
+
// workflow_spec is parsed lazily from <missionPath>/README.md frontmatter
|
|
22
|
+
// using the same parser the slice-indexer uses. topology.specGraph is
|
|
23
|
+
// projected via projectSpecGraph(spec, null) when the spec is in the
|
|
24
|
+
// WorkflowSpecCache; { specGraph: null } when declared but not cached;
|
|
25
|
+
// null when nothing is declared.
|
|
26
|
+
import { Hono } from "hono";
|
|
27
|
+
import * as fs from "node:fs";
|
|
28
|
+
import * as path from "node:path";
|
|
29
|
+
import { parseWorkflowSpecRef } from "../domain/slices/slice-indexer.js";
|
|
30
|
+
import { projectSpecGraph } from "../domain/workflow/slice-workflow-projection.js";
|
|
31
|
+
export function missionsRoutes() {
|
|
32
|
+
const app = new Hono();
|
|
33
|
+
app.get("/:missionId", (c) => {
|
|
34
|
+
const indexer = c.get("sliceIndexer");
|
|
35
|
+
if (!indexer) {
|
|
36
|
+
return c.json({
|
|
37
|
+
error: "slices_indexer_unavailable",
|
|
38
|
+
hint: "Mission data layer requires the SliceIndexer to be wired into AppDeps.",
|
|
39
|
+
}, 503);
|
|
40
|
+
}
|
|
41
|
+
if (!indexer.isReady()) {
|
|
42
|
+
return c.json({
|
|
43
|
+
error: "slices_root_not_configured",
|
|
44
|
+
hint: "Run rig config init-workspace, or set workspace.slices_root to workspace/missions. Supported shape: missions/<mission>/slices/<slice>.",
|
|
45
|
+
}, 503);
|
|
46
|
+
}
|
|
47
|
+
const missionId = c.req.param("missionId");
|
|
48
|
+
const allSlices = indexer.list();
|
|
49
|
+
const slices = allSlices.filter((s) => s.missionId === missionId);
|
|
50
|
+
if (slices.length === 0) {
|
|
51
|
+
return c.json({ error: "mission_not_found", missionId }, 404);
|
|
52
|
+
}
|
|
53
|
+
const missionPath = computeMissionPath(slices[0]);
|
|
54
|
+
const workflowSpec = readMissionWorkflowSpec(missionPath);
|
|
55
|
+
const topology = computeMissionTopology(workflowSpec, c.get("workflowSpecCache"));
|
|
56
|
+
const status = readMissionStatus(missionPath);
|
|
57
|
+
return c.json({
|
|
58
|
+
missionId,
|
|
59
|
+
missionPath,
|
|
60
|
+
slices,
|
|
61
|
+
workflow_spec: workflowSpec,
|
|
62
|
+
topology,
|
|
63
|
+
status,
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
// Slice 18 §3.5 — Mark mission complete (Getting Started complete-and-hide).
|
|
67
|
+
// Writes `status: complete` to the mission README.md frontmatter; the UI
|
|
68
|
+
// storytelling preview gates on this so completed missions disappear from
|
|
69
|
+
// the band. The daemon is the audit-trail surface; the UI maintains
|
|
70
|
+
// an optimistic local mirror via localStorage so the hide is instant.
|
|
71
|
+
app.post("/:missionId/complete", (c) => {
|
|
72
|
+
const indexer = c.get("sliceIndexer");
|
|
73
|
+
if (!indexer) {
|
|
74
|
+
return c.json({ error: "slices_indexer_unavailable" }, 503);
|
|
75
|
+
}
|
|
76
|
+
const missionId = c.req.param("missionId");
|
|
77
|
+
const allSlices = indexer.list();
|
|
78
|
+
const slices = allSlices.filter((s) => s.missionId === missionId);
|
|
79
|
+
if (slices.length === 0) {
|
|
80
|
+
return c.json({ error: "mission_not_found", missionId }, 404);
|
|
81
|
+
}
|
|
82
|
+
const missionPath = computeMissionPath(slices[0]);
|
|
83
|
+
try {
|
|
84
|
+
writeMissionStatusComplete(missionPath);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
return c.json({
|
|
88
|
+
error: "mission_complete_write_failed",
|
|
89
|
+
missionId,
|
|
90
|
+
message: err.message,
|
|
91
|
+
}, 500);
|
|
92
|
+
}
|
|
93
|
+
return c.json({ missionId, status: "complete" });
|
|
94
|
+
});
|
|
95
|
+
return app;
|
|
96
|
+
}
|
|
97
|
+
/** Slice 18 §3.5 — write `status: complete` to a mission README's
|
|
98
|
+
* frontmatter, creating the frontmatter block when absent and
|
|
99
|
+
* replacing an existing status field when present. Idempotent.
|
|
100
|
+
* Preserves unrelated frontmatter fields. */
|
|
101
|
+
function writeMissionStatusComplete(missionPath) {
|
|
102
|
+
const readmePath = path.join(missionPath, "README.md");
|
|
103
|
+
let body = fs.existsSync(readmePath) ? fs.readFileSync(readmePath, "utf-8") : "";
|
|
104
|
+
const fmMatch = body.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
105
|
+
if (fmMatch) {
|
|
106
|
+
const fmInner = fmMatch[1] ?? "";
|
|
107
|
+
const statusLineRegex = /^\s*status\s*:\s*[^\r\n]*$/m;
|
|
108
|
+
let newFm;
|
|
109
|
+
if (statusLineRegex.test(fmInner)) {
|
|
110
|
+
newFm = fmInner.replace(statusLineRegex, "status: complete");
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
newFm = fmInner.trimEnd() + "\nstatus: complete";
|
|
114
|
+
}
|
|
115
|
+
body = body.replace(fmMatch[0], `---\n${newFm}\n---`);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
body = `---\nstatus: complete\n---\n${body}`;
|
|
119
|
+
}
|
|
120
|
+
fs.writeFileSync(readmePath, body);
|
|
121
|
+
}
|
|
122
|
+
/** Derive the mission folder's absolute path from any slice's
|
|
123
|
+
* `slicePath`. Slices live at
|
|
124
|
+
* `<missionsRoot>/<missionId>/slices/<sliceName>` per the workspace
|
|
125
|
+
* contract, so going up two levels yields the mission folder. */
|
|
126
|
+
function computeMissionPath(slice) {
|
|
127
|
+
return path.resolve(slice.slicePath, "..", "..");
|
|
128
|
+
}
|
|
129
|
+
/** Slice 18 §3.5 — parse the `status` field from the mission README's
|
|
130
|
+
* frontmatter. Returns the string when present (no enum validation —
|
|
131
|
+
* v0 callers care primarily about the "complete" value but other
|
|
132
|
+
* workflow states may appear), or null when the README is missing /
|
|
133
|
+
* the field is absent. Powers the durable storytelling-filter for
|
|
134
|
+
* Getting Started complete-and-hide. */
|
|
135
|
+
function readMissionStatus(missionPath) {
|
|
136
|
+
const readmePath = path.join(missionPath, "README.md");
|
|
137
|
+
if (!fs.existsSync(readmePath))
|
|
138
|
+
return null;
|
|
139
|
+
const raw = fs.readFileSync(readmePath, "utf-8");
|
|
140
|
+
const fm = parseSimpleFrontmatter(raw);
|
|
141
|
+
const value = fm["status"];
|
|
142
|
+
return typeof value === "string" && value.length > 0 ? value : null;
|
|
143
|
+
}
|
|
144
|
+
/** V0.3.1 slice 13 walk-item 7 — parse `workflow_spec` from the mission
|
|
145
|
+
* README's frontmatter. Returns null when the README is missing or the
|
|
146
|
+
* field is absent / malformed. Uses the same parseWorkflowSpecRef
|
|
147
|
+
* helper the slice-indexer uses so both surfaces stay in lockstep. */
|
|
148
|
+
function readMissionWorkflowSpec(missionPath) {
|
|
149
|
+
const readmePath = path.join(missionPath, "README.md");
|
|
150
|
+
if (!fs.existsSync(readmePath))
|
|
151
|
+
return null;
|
|
152
|
+
const raw = fs.readFileSync(readmePath, "utf-8");
|
|
153
|
+
const fm = parseSimpleFrontmatter(raw);
|
|
154
|
+
return parseWorkflowSpecRef(fm["workflow_spec"]);
|
|
155
|
+
}
|
|
156
|
+
/** Minimal frontmatter parser. The slice-indexer's parseFrontmatter is
|
|
157
|
+
* private; duplicating the v0 shape here is cheaper than exposing
|
|
158
|
+
* internal API and keeps the missions route's surface minimal. */
|
|
159
|
+
function parseSimpleFrontmatter(text) {
|
|
160
|
+
const m = text.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
161
|
+
if (!m)
|
|
162
|
+
return {};
|
|
163
|
+
const out = {};
|
|
164
|
+
for (const line of m[1].split(/\r?\n/)) {
|
|
165
|
+
const trimmed = line.trim();
|
|
166
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
167
|
+
continue;
|
|
168
|
+
const colonIdx = trimmed.indexOf(":");
|
|
169
|
+
if (colonIdx === -1)
|
|
170
|
+
continue;
|
|
171
|
+
const key = trimmed.slice(0, colonIdx).trim();
|
|
172
|
+
let value = trimmed.slice(colonIdx + 1).trim();
|
|
173
|
+
if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) {
|
|
174
|
+
value = value.slice(1, -1);
|
|
175
|
+
}
|
|
176
|
+
out[key] = value;
|
|
177
|
+
}
|
|
178
|
+
return out;
|
|
179
|
+
}
|
|
180
|
+
/** V0.3.1 slice 13 walk-item 7 — project the spec graph when both the
|
|
181
|
+
* declaration AND the cached spec are present. Returns the topology
|
|
182
|
+
* envelope with `specGraph: null` when declared but not yet cached;
|
|
183
|
+
* returns `null` for the whole envelope when nothing is declared. */
|
|
184
|
+
function computeMissionTopology(workflowSpec, specCache) {
|
|
185
|
+
if (!workflowSpec)
|
|
186
|
+
return null;
|
|
187
|
+
if (!specCache)
|
|
188
|
+
return { specGraph: null };
|
|
189
|
+
const row = specCache.getByNameVersion(workflowSpec.name, workflowSpec.version);
|
|
190
|
+
if (!row)
|
|
191
|
+
return { specGraph: null };
|
|
192
|
+
// WorkflowSpecRow.spec is the WorkflowSpec object the projector expects.
|
|
193
|
+
return { specGraph: projectSpecGraph(row.spec, null) };
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=missions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"missions.js","sourceRoot":"","sources":["../../src/routes/missions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/routes/plugins.ts"],"names":[],"mappings":"AAwCA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAkE5B,wBAAgB,aAAa,IAAI,IAAI,CA4HpC"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
// Phase 3a slice 3.3 — Plugins HTTP routes (read-only).
|
|
2
|
+
//
|
|
3
|
+
// SC-29 EXCEPTION #8 declared verbatim:
|
|
4
|
+
// "Slice 3.3 (UI plugin surface) requires daemon-side plugin-discovery-service
|
|
5
|
+
// + 3 HTTP routes (GET /api/plugins, GET /api/plugins/:id, GET /api/plugins/:id/used-by)
|
|
6
|
+
// as backing API. No additional state, no SQL migration, no mutation routes.
|
|
7
|
+
// Read-only discovery surface aggregating filesystem-scan unions per
|
|
8
|
+
// DESIGN.md §5.4. Per IMPL-PRD §3.3 'Code touches' this allocation is explicit;
|
|
9
|
+
// documenting in compliance with banked SC-29 verbatim-declaration rule."
|
|
10
|
+
//
|
|
11
|
+
// SC-29 EXCEPTION #11 (slice 28 library-explorer-finishing) declared verbatim:
|
|
12
|
+
// "Slice 28 (Library Explorer finishing — founder-walk follow-up) requires:
|
|
13
|
+
// (a) two additive read-only HTTP routes — GET /api/plugins/:id/files/list
|
|
14
|
+
// and GET /api/plugins/:id/files/read — that wrap the existing path-safety
|
|
15
|
+
// machinery (resolveAllowedDirectory/File) with the discovered plugin's
|
|
16
|
+
// absolute path acting as a synthetic single-root allowlist. Enables
|
|
17
|
+
// docs-browser file navigation of a plugin's on-disk folder without
|
|
18
|
+
// requiring the operator to allowlist ~/.openrig/plugins/ in
|
|
19
|
+
// OPENRIG_FILES_ALLOWLIST.
|
|
20
|
+
// (b) one PluginEntry shape extension — skillCount: number — populated in
|
|
21
|
+
// detectPlugin() by readdir of <plugin>/skills/. Surfaces skill-count in
|
|
22
|
+
// the plugin list response so PluginsIndexPage can render the column
|
|
23
|
+
// without an N+1 detail fetch per row.
|
|
24
|
+
// No additional state, no SQL migration, no write mutations on plugin
|
|
25
|
+
// folders. Read-only docs-browser surface per slice 28 founder direction
|
|
26
|
+
// 'finishing it is 0.3.1 work, not 0.3.2'. Routing decision
|
|
27
|
+
// qitem-20260513042155-f31c11c3 (orch OPT-A authorization)."
|
|
28
|
+
//
|
|
29
|
+
// Endpoint shape:
|
|
30
|
+
// GET /api/plugins → PluginEntry[] (?runtime=, ?source= filters)
|
|
31
|
+
// GET /api/plugins/:id → PluginDetail (404 when unknown)
|
|
32
|
+
// GET /api/plugins/:id/used-by → AgentReference[]
|
|
33
|
+
// GET /api/plugins/:id/files/list?path=<rel> → FilesListResponse (slice 28)
|
|
34
|
+
// GET /api/plugins/:id/files/read?path=<rel> → FilesReadResponse (slice 28)
|
|
35
|
+
//
|
|
36
|
+
// All endpoints return 503 when the service is not provisioned in context
|
|
37
|
+
// (consistent with the existing daemon route pattern for optional services).
|
|
38
|
+
// /files/list + /files/read use the discovered plugin path as a synthetic
|
|
39
|
+
// AllowlistRoot + reuse resolveAllowedDirectory/File for path-safety.
|
|
40
|
+
import { Hono } from "hono";
|
|
41
|
+
import * as fs from "node:fs";
|
|
42
|
+
import * as path from "node:path";
|
|
43
|
+
import { resolveAllowedDirectory, resolveAllowedFile, FilePathSafetyError, } from "../domain/files/path-safety.js";
|
|
44
|
+
import { sha256Hex } from "../domain/files/file-write-service.js";
|
|
45
|
+
import { FILE_READ_TRUNCATION_BYTES } from "./files.js";
|
|
46
|
+
function getService(c) {
|
|
47
|
+
return c.get("pluginDiscoveryService");
|
|
48
|
+
}
|
|
49
|
+
function parseRuntimeFilter(value) {
|
|
50
|
+
if (value === "claude" || value === "codex")
|
|
51
|
+
return value;
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
function parseSourceFilter(value) {
|
|
55
|
+
if (value === "vendored" || value === "claude-cache" || value === "codex-cache")
|
|
56
|
+
return value;
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
function pluginRootAllowlist(absolutePath) {
|
|
60
|
+
// Synthetic single-root allowlist scoped to the plugin's folder.
|
|
61
|
+
// Reuses the existing path-safety helpers for ../ escape / symlink
|
|
62
|
+
// realpath containment checks without any allowlist env-var coupling
|
|
63
|
+
// (operator does not need to declare plugin paths in OPENRIG_FILES_ALLOWLIST).
|
|
64
|
+
//
|
|
65
|
+
// Normalize via fs.realpathSync so the containment check (realpath vs
|
|
66
|
+
// canonicalPath) holds on platforms where the input path is itself
|
|
67
|
+
// a symlink chain (e.g. macOS /tmp → /private/tmp, /var/folders →
|
|
68
|
+
// /private/var/folders). Matches decodeAllowlist's normalization in
|
|
69
|
+
// path-safety.ts.
|
|
70
|
+
let canonical;
|
|
71
|
+
try {
|
|
72
|
+
canonical = fs.realpathSync(absolutePath);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
canonical = path.resolve(absolutePath);
|
|
76
|
+
}
|
|
77
|
+
return [{ name: "plugin", canonicalPath: canonical }];
|
|
78
|
+
}
|
|
79
|
+
function pathSafetyErrorResponse(c, err) {
|
|
80
|
+
const status = err.code === "root_unknown" ? 400
|
|
81
|
+
: err.code === "path_invalid" || err.code === "path_escape" ? 400
|
|
82
|
+
: err.code === "stat_failed" ? 404
|
|
83
|
+
: err.code === "not_a_file" || err.code === "not_a_directory" ? 400
|
|
84
|
+
: 500;
|
|
85
|
+
return c.json({ error: err.code, message: err.message, ...(err.details ?? {}) }, status);
|
|
86
|
+
}
|
|
87
|
+
export function pluginsRoutes() {
|
|
88
|
+
const router = new Hono();
|
|
89
|
+
// GET / — list discoverable plugins
|
|
90
|
+
router.get("/", (c) => {
|
|
91
|
+
const service = getService(c);
|
|
92
|
+
if (!service)
|
|
93
|
+
return c.json({ error: "plugin_discovery_unavailable" }, 503);
|
|
94
|
+
const runtimeFilter = parseRuntimeFilter(c.req.query("runtime"));
|
|
95
|
+
const sourceFilter = parseSourceFilter(c.req.query("source"));
|
|
96
|
+
// Slice 3.3 fix-C — DESIGN §5.4 union 4th category: rig-bundled
|
|
97
|
+
// <cwd>/.claude/plugins/* + <cwd>/.codex/plugins/*. The API caller
|
|
98
|
+
// (UI in rig context, CLI in slice 3.4) passes ?cwd=<path> when
|
|
99
|
+
// they want the rig-cwd discoveries included; the Library page
|
|
100
|
+
// omits it (cross-cutting view).
|
|
101
|
+
const cwd = c.req.query("cwd");
|
|
102
|
+
const cwdScanRoots = cwd ? [cwd] : undefined;
|
|
103
|
+
const plugins = service.listPlugins({ runtimeFilter, sourceFilter, cwdScanRoots });
|
|
104
|
+
return c.json(plugins);
|
|
105
|
+
});
|
|
106
|
+
// GET /:id/used-by — reverse query for agents referencing this plugin.
|
|
107
|
+
// Mounted BEFORE /:id so the literal sub-path doesn't get eaten by the
|
|
108
|
+
// bare-param catchall (per spec-library-routes Phase A R1 SSE route-order
|
|
109
|
+
// lesson banked in that file).
|
|
110
|
+
router.get("/:id/used-by", (c) => {
|
|
111
|
+
const service = getService(c);
|
|
112
|
+
if (!service)
|
|
113
|
+
return c.json({ error: "plugin_discovery_unavailable" }, 503);
|
|
114
|
+
const id = c.req.param("id");
|
|
115
|
+
return c.json(service.findUsedBy(id));
|
|
116
|
+
});
|
|
117
|
+
// Slice 28 — GET /:id/files/list?path=<rel>
|
|
118
|
+
// Lists directory entries inside the plugin's source folder. Uses the
|
|
119
|
+
// existing path-safety helpers with a synthetic single-root allowlist
|
|
120
|
+
// built from the discovered plugin's absolute path. Mounted BEFORE the
|
|
121
|
+
// bare /:id route (same route-order discipline as /:id/used-by).
|
|
122
|
+
router.get("/:id/files/list", (c) => {
|
|
123
|
+
const service = getService(c);
|
|
124
|
+
if (!service)
|
|
125
|
+
return c.json({ error: "plugin_discovery_unavailable" }, 503);
|
|
126
|
+
const id = c.req.param("id");
|
|
127
|
+
const detail = service.getPlugin(id);
|
|
128
|
+
if (!detail)
|
|
129
|
+
return c.notFound();
|
|
130
|
+
const relativePath = c.req.query("path") ?? "";
|
|
131
|
+
try {
|
|
132
|
+
const allowlist = pluginRootAllowlist(detail.entry.path);
|
|
133
|
+
const resolved = resolveAllowedDirectory(allowlist, "plugin", relativePath);
|
|
134
|
+
const entries = fs.readdirSync(resolved, { withFileTypes: true });
|
|
135
|
+
return c.json({
|
|
136
|
+
pluginId: id,
|
|
137
|
+
path: relativePath,
|
|
138
|
+
entries: entries
|
|
139
|
+
.map((entry) => {
|
|
140
|
+
const fullPath = path.join(resolved, entry.name);
|
|
141
|
+
let stat = null;
|
|
142
|
+
try {
|
|
143
|
+
stat = fs.statSync(fullPath);
|
|
144
|
+
}
|
|
145
|
+
catch { /* skip stat-failed */ }
|
|
146
|
+
return {
|
|
147
|
+
name: entry.name,
|
|
148
|
+
type: entry.isDirectory() ? "dir" : entry.isFile() ? "file" : "other",
|
|
149
|
+
size: stat?.isFile() ? stat.size : null,
|
|
150
|
+
mtime: stat ? stat.mtime.toISOString() : null,
|
|
151
|
+
};
|
|
152
|
+
})
|
|
153
|
+
.sort((a, b) => {
|
|
154
|
+
if (a.type !== b.type)
|
|
155
|
+
return a.type === "dir" ? -1 : 1;
|
|
156
|
+
return a.name.localeCompare(b.name);
|
|
157
|
+
}),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
if (err instanceof FilePathSafetyError)
|
|
162
|
+
return pathSafetyErrorResponse(c, err);
|
|
163
|
+
return c.json({ error: "list_failed", message: err instanceof Error ? err.message : String(err) }, 500);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
// Slice 28 — GET /:id/files/read?path=<rel>
|
|
167
|
+
// Reads a file inside the plugin's source folder. Same truncation cap
|
|
168
|
+
// semantics as /api/files/read (FILE_READ_TRUNCATION_BYTES; hash over
|
|
169
|
+
// full content for honest edit-conflict semantics — but plugin folders
|
|
170
|
+
// are read-only at v0 so the hash is informational only).
|
|
171
|
+
router.get("/:id/files/read", (c) => {
|
|
172
|
+
const service = getService(c);
|
|
173
|
+
if (!service)
|
|
174
|
+
return c.json({ error: "plugin_discovery_unavailable" }, 503);
|
|
175
|
+
const id = c.req.param("id");
|
|
176
|
+
const detail = service.getPlugin(id);
|
|
177
|
+
if (!detail)
|
|
178
|
+
return c.notFound();
|
|
179
|
+
const relativePath = c.req.query("path") ?? "";
|
|
180
|
+
if (!relativePath)
|
|
181
|
+
return c.json({ error: "path_required" }, 400);
|
|
182
|
+
try {
|
|
183
|
+
const allowlist = pluginRootAllowlist(detail.entry.path);
|
|
184
|
+
const resolved = resolveAllowedFile(allowlist, "plugin", relativePath);
|
|
185
|
+
const stat = fs.statSync(resolved);
|
|
186
|
+
const fullContent = fs.readFileSync(resolved);
|
|
187
|
+
const truncated = stat.size > FILE_READ_TRUNCATION_BYTES;
|
|
188
|
+
const returnedContent = truncated
|
|
189
|
+
? fullContent.subarray(0, FILE_READ_TRUNCATION_BYTES)
|
|
190
|
+
: fullContent;
|
|
191
|
+
return c.json({
|
|
192
|
+
pluginId: id,
|
|
193
|
+
path: relativePath,
|
|
194
|
+
absolutePath: resolved,
|
|
195
|
+
content: returnedContent.toString("utf-8"),
|
|
196
|
+
mtime: stat.mtime.toISOString(),
|
|
197
|
+
contentHash: sha256Hex(fullContent),
|
|
198
|
+
size: stat.size,
|
|
199
|
+
truncated,
|
|
200
|
+
truncatedAtBytes: truncated ? FILE_READ_TRUNCATION_BYTES : null,
|
|
201
|
+
totalBytes: stat.size,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
if (err instanceof FilePathSafetyError)
|
|
206
|
+
return pathSafetyErrorResponse(c, err);
|
|
207
|
+
return c.json({ error: "read_failed", message: err instanceof Error ? err.message : String(err) }, 500);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
// GET /:id — plugin detail
|
|
211
|
+
router.get("/:id", (c) => {
|
|
212
|
+
const service = getService(c);
|
|
213
|
+
if (!service)
|
|
214
|
+
return c.json({ error: "plugin_discovery_unavailable" }, 503);
|
|
215
|
+
const id = c.req.param("id");
|
|
216
|
+
const detail = service.getPlugin(id);
|
|
217
|
+
if (!detail)
|
|
218
|
+
return c.notFound();
|
|
219
|
+
return c.json(detail);
|
|
220
|
+
});
|
|
221
|
+
return router;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=plugins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins.js","sourceRoot":"","sources":["../../src/routes/plugins.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,5 +6,23 @@ import { Hono } from "hono";
|
|
|
6
6
|
* Hot-potato strict-rejection happens in the domain layer; routes surface
|
|
7
7
|
* structured errors with the validReasons enum so CLIs can render help.
|
|
8
8
|
*/
|
|
9
|
+
/**
|
|
10
|
+
* OPR.0.3.2.20 — attention-class predicate for the `/list?attention=1`
|
|
11
|
+
* filter. Mirrors the mission-control read layer's semantics so the
|
|
12
|
+
* For You Action-required + Approval lenses agree with the
|
|
13
|
+
* single-pane view:
|
|
14
|
+
*
|
|
15
|
+
* - approval class → tier === "human-gate"
|
|
16
|
+
* - action-required → destinationSession matches
|
|
17
|
+
* /^human(?:-[A-Za-z0-9._-]+)?@(kernel|host)$/
|
|
18
|
+
*
|
|
19
|
+
* Exported so the predicate is a discrete, testable surface. The route
|
|
20
|
+
* layer composes this with the open-state default so only unresolved
|
|
21
|
+
* items appear — closed/done attention items are not surfaced.
|
|
22
|
+
*/
|
|
23
|
+
export declare function isAttentionItem(q: {
|
|
24
|
+
tier: string | null;
|
|
25
|
+
destinationSession: string;
|
|
26
|
+
}): boolean;
|
|
9
27
|
export declare function queueRoutes(): Hono;
|
|
10
28
|
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/routes/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAa5B;;;;;;GAMG;AACH,wBAAgB,WAAW,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/routes/queue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAa5B;;;;;;GAMG;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,kBAAkB,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAG/F;AAGD,wBAAgB,WAAW,IAAI,IAAI,CA8hBlC"}
|
|
@@ -9,6 +9,25 @@ import { InboxHandlerError } from "../domain/inbox-handler.js";
|
|
|
9
9
|
* Hot-potato strict-rejection happens in the domain layer; routes surface
|
|
10
10
|
* structured errors with the validReasons enum so CLIs can render help.
|
|
11
11
|
*/
|
|
12
|
+
/**
|
|
13
|
+
* OPR.0.3.2.20 — attention-class predicate for the `/list?attention=1`
|
|
14
|
+
* filter. Mirrors the mission-control read layer's semantics so the
|
|
15
|
+
* For You Action-required + Approval lenses agree with the
|
|
16
|
+
* single-pane view:
|
|
17
|
+
*
|
|
18
|
+
* - approval class → tier === "human-gate"
|
|
19
|
+
* - action-required → destinationSession matches
|
|
20
|
+
* /^human(?:-[A-Za-z0-9._-]+)?@(kernel|host)$/
|
|
21
|
+
*
|
|
22
|
+
* Exported so the predicate is a discrete, testable surface. The route
|
|
23
|
+
* layer composes this with the open-state default so only unresolved
|
|
24
|
+
* items appear — closed/done attention items are not surfaced.
|
|
25
|
+
*/
|
|
26
|
+
export function isAttentionItem(q) {
|
|
27
|
+
if (q.tier === "human-gate")
|
|
28
|
+
return true;
|
|
29
|
+
return /^human(?:-[A-Za-z0-9._-]+)?@(kernel|host)$/.test(q.destinationSession ?? "");
|
|
30
|
+
}
|
|
12
31
|
export function queueRoutes() {
|
|
13
32
|
const app = new Hono();
|
|
14
33
|
function getRepo(c) {
|
|
@@ -145,7 +164,29 @@ export function queueRoutes() {
|
|
|
145
164
|
return errorResponse(c, err);
|
|
146
165
|
}
|
|
147
166
|
});
|
|
148
|
-
// POST /:qitemId/update — general state mutator (incl. done)
|
|
167
|
+
// POST /:qitemId/update — general state mutator (incl. done).
|
|
168
|
+
//
|
|
169
|
+
// OPR.0.3.2.21.FR-4(d-docs) — closure ≠ acceptance.
|
|
170
|
+
//
|
|
171
|
+
// `state=done` with `closure_reason=handed_off_to` records that the
|
|
172
|
+
// source seat has DELIVERED the work to the next stage. It does NOT
|
|
173
|
+
// record that the next stage has ACCEPTED the work — that's the next
|
|
174
|
+
// stage's verdict on its own qitem (typically a separate close with
|
|
175
|
+
// its own closure_reason).
|
|
176
|
+
//
|
|
177
|
+
// Closure vocabulary:
|
|
178
|
+
// - handed_off_to delivered to next stage; acceptance pending
|
|
179
|
+
// that stage's verdict on its own qitem
|
|
180
|
+
// - blocked_on waiting on a named blocker (closureTarget)
|
|
181
|
+
// - denied the source seat refuses the work
|
|
182
|
+
// - canceled work no longer needed (no follow-on)
|
|
183
|
+
// - no-follow-on completed in place; no further routing
|
|
184
|
+
// - escalation routed to a higher-authority seat
|
|
185
|
+
//
|
|
186
|
+
// The "accepted" state IS NOT a queue state in v0.3.x — the qitem
|
|
187
|
+
// model captures delivery + the receiving stage owns acceptance as
|
|
188
|
+
// a separate transaction. (FR-4d-state schema change adding a
|
|
189
|
+
// distinct "accepted" state is deferred to release-0.3.3.)
|
|
149
190
|
app.post("/:qitemId/update", async (c) => {
|
|
150
191
|
const qitemId = c.req.param("qitemId");
|
|
151
192
|
const body = await c.req.json().catch(() => ({}));
|
|
@@ -260,15 +301,66 @@ export function queueRoutes() {
|
|
|
260
301
|
return c.json(getRepo(c).whoami(session, { recentLimit }));
|
|
261
302
|
});
|
|
262
303
|
// GET /list — list with filters. MUST precede /:qitemId so the literal path wins.
|
|
304
|
+
//
|
|
305
|
+
// OPR.0.3.2.20 — `?attention=1` filter for the For You priority
|
|
306
|
+
// windowing slice. Returns OPEN attention-class qitems (the durable
|
|
307
|
+
// source of truth for the UI Action-required + Approval lenses) so
|
|
308
|
+
// those surfaces don't depend on the lossy ephemeral client event
|
|
309
|
+
// FIFO. Class membership matches the mission-control read layer
|
|
310
|
+
// semantics: tier='human-gate' OR destination matches
|
|
311
|
+
// /^human(?:-[A-Za-z0-9._-]+)?@(kernel|host)$/. Open state defaults
|
|
312
|
+
// to pending|in-progress|blocked (callers can still override via
|
|
313
|
+
// `state=...`). Composable with destinationSession/sourceSession/
|
|
314
|
+
// targetRepo/limit.
|
|
263
315
|
app.get("/list", (c) => {
|
|
264
316
|
const destinationSession = c.req.query("destinationSession") || undefined;
|
|
265
317
|
const sourceSession = c.req.query("sourceSession") || undefined;
|
|
266
318
|
const stateRaw = c.req.query("state") || undefined;
|
|
267
319
|
const targetRepo = c.req.query("targetRepo") || undefined;
|
|
268
|
-
const
|
|
269
|
-
const
|
|
270
|
-
const
|
|
271
|
-
|
|
320
|
+
const userLimit = c.req.query("limit") ? Number.parseInt(c.req.query("limit"), 10) : undefined;
|
|
321
|
+
const attention = c.req.query("attention") === "1";
|
|
322
|
+
const state = stateRaw
|
|
323
|
+
? stateRaw.split(",")
|
|
324
|
+
: attention
|
|
325
|
+
? ["pending", "in-progress", "blocked"]
|
|
326
|
+
: undefined;
|
|
327
|
+
if (!attention) {
|
|
328
|
+
const items = getRepo(c).list({
|
|
329
|
+
destinationSession,
|
|
330
|
+
sourceSession,
|
|
331
|
+
state,
|
|
332
|
+
targetRepo,
|
|
333
|
+
limit: userLimit,
|
|
334
|
+
});
|
|
335
|
+
return c.json(items);
|
|
336
|
+
}
|
|
337
|
+
// OPR.0.3.2.20 — attention path goes through
|
|
338
|
+
// QueueRepository.listAttention, which pushes the attention
|
|
339
|
+
// predicate INTO the SQL WHERE clause so the LIMIT applies AFTER
|
|
340
|
+
// attention filtering. Window-independent by construction: an
|
|
341
|
+
// old human-gate item is never evicted by routine open qitems,
|
|
342
|
+
// however many of them land after it (guard re-verify
|
|
343
|
+
// qitem-20260518190827 BLOCKER 1). The earlier fetch-then-filter
|
|
344
|
+
// shape (ATTENTION_FETCH_BOUND) is gone — the LIMIT bound is the
|
|
345
|
+
// user-facing one only, applied at the SQL layer post-predicate.
|
|
346
|
+
//
|
|
347
|
+
// destinationSession/sourceSession/targetRepo are composable with
|
|
348
|
+
// the attention predicate at the SQL layer (guard re-verify
|
|
349
|
+
// qitem-20260518192210 BLOCKER 1 — the previous forward-fix
|
|
350
|
+
// dropped composition). Scoped attention queries (e.g.,
|
|
351
|
+
// attention=1&destinationSession=...) return ONLY the matching
|
|
352
|
+
// attention items.
|
|
353
|
+
const items = getRepo(c).listAttention({
|
|
354
|
+
limit: userLimit,
|
|
355
|
+
state,
|
|
356
|
+
destinationSession,
|
|
357
|
+
sourceSession,
|
|
358
|
+
targetRepo,
|
|
359
|
+
});
|
|
360
|
+
// Defense-in-depth: refine with the JS predicate so the SQL
|
|
361
|
+
// LIKE superset cannot leak a malformed destination through.
|
|
362
|
+
const filtered = items.filter(isAttentionItem);
|
|
363
|
+
return c.json(filtered);
|
|
272
364
|
});
|
|
273
365
|
// GET /overdue — surfaces in-progress qitems past closure_required_at.
|
|
274
366
|
// MUST precede /:qitemId.
|