@openrig/cli 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -8
- package/daemon/assets/claude-statusline-context.cjs +13 -3
- package/daemon/assets/guidance/openrig-seat-skills.md +1 -0
- package/daemon/assets/plugins/openrig-core/.claude-plugin/plugin.json +1 -1
- package/daemon/assets/plugins/openrig-core/.codex-plugin/plugin.json +1 -1
- package/daemon/assets/plugins/openrig-core/hooks/claude.json +11 -11
- package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +9 -8
- package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus-health.cjs +2 -2
- package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +9 -6
- package/daemon/assets/plugins/openrig-core/skills/claude-compaction-restore/scripts/precompact-hook.mjs +1 -1
- package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +13 -8
- package/daemon/assets/plugins/openrig-core/skills/messaging-the-human/SKILL.md +19 -4
- package/daemon/assets/plugins/openrig-core/skills/openrig-user/SKILL.md +167 -46
- package/daemon/assets/skills/rigs/SKILL.md +2 -1
- package/daemon/context-packs/help/manifest.yaml +1 -1
- package/daemon/context-packs/onboarding-width/manifest.yaml +1 -1
- package/daemon/context-packs/onboarding-width/public-what-you-can-do.md +206 -28
- package/daemon/context-packs/reference/getting-started.md +65 -6
- package/daemon/context-packs/reference/manifest.yaml +1 -1
- package/daemon/context-packs/reference/rig-spec.md +82 -2
- package/daemon/context-packs/reference/whats-new.md +162 -113
- package/daemon/context-packs/skills/agent-operated-software/manifest.yaml +1 -1
- package/daemon/context-packs/skills/agent-operated-workflows/manifest.yaml +1 -1
- package/daemon/context-packs/skills/applying-a-permission-policy/manifest.yaml +1 -1
- package/daemon/context-packs/skills/claude-compaction-restore/manifest.yaml +1 -1
- package/daemon/context-packs/skills/claude-compaction-restore/scripts/precompact-hook.mjs +1 -1
- package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/messaging-the-human/SKILL.md +19 -4
- package/daemon/context-packs/skills/core/messaging-the-human/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-herdr/SKILL.md +3 -0
- package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-skills/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-software-factory/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-software-factory/references/worked-example.md +2 -2
- package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
- package/daemon/context-packs/skills/delegating-work/manifest.yaml +1 -1
- package/daemon/context-packs/skills/forming-an-openrig-mental-model/SKILL.md +13 -8
- package/daemon/context-packs/skills/forming-an-openrig-mental-model/manifest.yaml +1 -1
- package/daemon/context-packs/skills/loading-addressable-markdown/manifest.yaml +1 -1
- package/daemon/context-packs/skills/mission-slice-sop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-operating-model/manifest.yaml +1 -1
- package/daemon/context-packs/skills/openrig-user/SKILL.md +167 -46
- package/daemon/context-packs/skills/openrig-user/manifest.yaml +1 -1
- package/daemon/context-packs/skills/orienting-to-an-inherited-seat/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/queue-handoff/manifest.yaml +1 -1
- package/daemon/context-packs/skills/refocusing/manifest.yaml +1 -1
- package/daemon/context-packs/skills/retiring-and-inheriting-a-seat/manifest.yaml +1 -1
- package/daemon/context-packs/skills/seat-continuity-and-handover/manifest.yaml +1 -1
- package/daemon/context-packs/skills/session-compaction-and-restore/manifest.yaml +1 -1
- package/daemon/context-packs/skills/software-for-agents/manifest.yaml +1 -1
- package/daemon/context-packs/world-example/manifest.yaml +1 -1
- package/daemon/context-packs/world-public/manifest.yaml +1 -1
- package/daemon/dist/adapters/claude-code-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-code-adapter.js +94 -26
- package/daemon/dist/adapters/claude-code-adapter.js.map +1 -1
- package/daemon/dist/adapters/claude-resume.d.ts +2 -1
- package/daemon/dist/adapters/claude-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/claude-resume.js +10 -3
- package/daemon/dist/adapters/claude-resume.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +10 -4
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +231 -41
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/community-harness-runtime-adapter.d.ts +21 -2
- package/daemon/dist/adapters/community-harness-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/community-harness-runtime-adapter.js +90 -8
- package/daemon/dist/adapters/community-harness-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/pi-runner.d.ts +11 -0
- package/daemon/dist/adapters/pi-runner.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runner.js +59 -16
- package/daemon/dist/adapters/pi-runner.js.map +1 -1
- package/daemon/dist/adapters/pi-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/pi-runtime-adapter.js +9 -6
- package/daemon/dist/adapters/pi-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/stub-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/stub-runtime-adapter.js +9 -5
- package/daemon/dist/adapters/stub-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts +15 -4
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +68 -26
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/attention-surface.d.ts +14 -0
- package/daemon/dist/attention-surface.d.ts.map +1 -1
- package/daemon/dist/attention-surface.js.map +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/daemon-db-path.d.ts +6 -0
- package/daemon/dist/daemon-db-path.d.ts.map +1 -1
- package/daemon/dist/daemon-db-path.js +65 -1
- package/daemon/dist/daemon-db-path.js.map +1 -1
- package/daemon/dist/daemon-shutdown.d.ts.map +1 -1
- package/daemon/dist/daemon-shutdown.js +4 -2
- package/daemon/dist/daemon-shutdown.js.map +1 -1
- package/daemon/dist/db/all-migrations.d.ts.map +1 -1
- package/daemon/dist/db/all-migrations.js +16 -0
- package/daemon/dist/db/all-migrations.js.map +1 -1
- package/daemon/dist/db/migrations/124_context_usage_watchdog_units.d.ts +4 -0
- package/daemon/dist/db/migrations/124_context_usage_watchdog_units.d.ts.map +1 -0
- package/daemon/dist/db/migrations/124_context_usage_watchdog_units.js +9 -0
- package/daemon/dist/db/migrations/124_context_usage_watchdog_units.js.map +1 -0
- package/daemon/dist/db/migrations/125_node_advisor.d.ts +3 -0
- package/daemon/dist/db/migrations/125_node_advisor.d.ts.map +1 -0
- package/daemon/dist/db/migrations/125_node_advisor.js +8 -0
- package/daemon/dist/db/migrations/125_node_advisor.js.map +1 -0
- package/daemon/dist/db/migrations/127_operation_correlation.d.ts +3 -0
- package/daemon/dist/db/migrations/127_operation_correlation.d.ts.map +1 -0
- package/daemon/dist/db/migrations/127_operation_correlation.js +10 -0
- package/daemon/dist/db/migrations/127_operation_correlation.js.map +1 -0
- package/daemon/dist/db/migrations/128_terminal_policy.d.ts +3 -0
- package/daemon/dist/db/migrations/128_terminal_policy.d.ts.map +1 -0
- package/daemon/dist/db/migrations/128_terminal_policy.js +37 -0
- package/daemon/dist/db/migrations/128_terminal_policy.js.map +1 -0
- package/daemon/dist/db/migrations/129_stream_dispositions.d.ts +10 -0
- package/daemon/dist/db/migrations/129_stream_dispositions.d.ts.map +1 -0
- package/daemon/dist/db/migrations/129_stream_dispositions.js +35 -0
- package/daemon/dist/db/migrations/129_stream_dispositions.js.map +1 -0
- package/daemon/dist/db/migrations/130_stream_subscriptions.d.ts +11 -0
- package/daemon/dist/db/migrations/130_stream_subscriptions.d.ts.map +1 -0
- package/daemon/dist/db/migrations/130_stream_subscriptions.js +33 -0
- package/daemon/dist/db/migrations/130_stream_subscriptions.js.map +1 -0
- package/daemon/dist/db/migrations/131_stream_retention_floor.d.ts +8 -0
- package/daemon/dist/db/migrations/131_stream_retention_floor.d.ts.map +1 -0
- package/daemon/dist/db/migrations/131_stream_retention_floor.js +20 -0
- package/daemon/dist/db/migrations/131_stream_retention_floor.js.map +1 -0
- package/daemon/dist/db/migrations/135_seat_identity_process_evidence.d.ts +3 -0
- package/daemon/dist/db/migrations/135_seat_identity_process_evidence.d.ts.map +1 -0
- package/daemon/dist/db/migrations/135_seat_identity_process_evidence.js +16 -0
- package/daemon/dist/db/migrations/135_seat_identity_process_evidence.js.map +1 -0
- package/daemon/dist/domain/active-occupant.d.ts +3 -0
- package/daemon/dist/domain/active-occupant.d.ts.map +1 -1
- package/daemon/dist/domain/active-occupant.js +6 -2
- package/daemon/dist/domain/active-occupant.js.map +1 -1
- package/daemon/dist/domain/activity-taxonomy.d.ts +3 -0
- package/daemon/dist/domain/activity-taxonomy.d.ts.map +1 -1
- package/daemon/dist/domain/activity-taxonomy.js.map +1 -1
- package/daemon/dist/domain/agent-activity-store.d.ts +6 -2
- package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -1
- package/daemon/dist/domain/agent-activity-store.js +13 -4
- package/daemon/dist/domain/agent-activity-store.js.map +1 -1
- package/daemon/dist/domain/agent-manifest.d.ts.map +1 -1
- package/daemon/dist/domain/agent-manifest.js +14 -2
- package/daemon/dist/domain/agent-manifest.js.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.d.ts +3 -0
- package/daemon/dist/domain/bootstrap-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.js +20 -6
- package/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
- package/daemon/dist/domain/builtin-startup-files.d.ts.map +1 -1
- package/daemon/dist/domain/builtin-startup-files.js +2 -0
- package/daemon/dist/domain/builtin-startup-files.js.map +1 -1
- package/daemon/dist/domain/bundle-behaviour.d.ts.map +1 -1
- package/daemon/dist/domain/bundle-behaviour.js +28 -1
- package/daemon/dist/domain/bundle-behaviour.js.map +1 -1
- package/daemon/dist/domain/claim-service.d.ts +19 -1
- package/daemon/dist/domain/claim-service.d.ts.map +1 -1
- package/daemon/dist/domain/claim-service.js +67 -19
- package/daemon/dist/domain/claim-service.js.map +1 -1
- package/daemon/dist/domain/classification-attempts.d.ts +4 -1
- package/daemon/dist/domain/classification-attempts.d.ts.map +1 -1
- package/daemon/dist/domain/classification-attempts.js +10 -1
- package/daemon/dist/domain/classification-attempts.js.map +1 -1
- package/daemon/dist/domain/classification-sources.d.ts +38 -0
- package/daemon/dist/domain/classification-sources.d.ts.map +1 -1
- package/daemon/dist/domain/classification-sources.js +24 -1
- package/daemon/dist/domain/classification-sources.js.map +1 -1
- package/daemon/dist/domain/claude-activity-hooks.d.ts +2 -2
- package/daemon/dist/domain/claude-activity-hooks.d.ts.map +1 -1
- package/daemon/dist/domain/claude-activity-hooks.js +8 -7
- package/daemon/dist/domain/claude-activity-hooks.js.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts +109 -7
- package/daemon/dist/domain/claude-compaction-enforcer.d.ts.map +1 -1
- package/daemon/dist/domain/claude-compaction-enforcer.js +447 -52
- package/daemon/dist/domain/claude-compaction-enforcer.js.map +1 -1
- package/daemon/dist/domain/claude-core-plugin-env.d.ts +4 -1
- package/daemon/dist/domain/claude-core-plugin-env.d.ts.map +1 -1
- package/daemon/dist/domain/claude-core-plugin-env.js +23 -12
- package/daemon/dist/domain/claude-core-plugin-env.js.map +1 -1
- package/daemon/dist/domain/claude-managed-launch.d.ts +1 -1
- package/daemon/dist/domain/claude-managed-launch.d.ts.map +1 -1
- package/daemon/dist/domain/claude-managed-launch.js +33 -15
- package/daemon/dist/domain/claude-managed-launch.js.map +1 -1
- package/daemon/dist/domain/codex-owned-plugin-trust.d.ts +26 -0
- package/daemon/dist/domain/codex-owned-plugin-trust.d.ts.map +1 -0
- package/daemon/dist/domain/codex-owned-plugin-trust.js +187 -0
- package/daemon/dist/domain/codex-owned-plugin-trust.js.map +1 -0
- package/daemon/dist/domain/codex-rebuild-permissions.d.ts +54 -0
- package/daemon/dist/domain/codex-rebuild-permissions.d.ts.map +1 -0
- package/daemon/dist/domain/codex-rebuild-permissions.js +134 -0
- package/daemon/dist/domain/codex-rebuild-permissions.js.map +1 -0
- package/daemon/dist/domain/community-harness-launch-result.d.ts +33 -0
- package/daemon/dist/domain/community-harness-launch-result.d.ts.map +1 -0
- package/daemon/dist/domain/community-harness-launch-result.js +93 -0
- package/daemon/dist/domain/community-harness-launch-result.js.map +1 -0
- package/daemon/dist/domain/community-harness-presets.d.ts +27 -2
- package/daemon/dist/domain/community-harness-presets.d.ts.map +1 -1
- package/daemon/dist/domain/community-harness-presets.js +49 -5
- package/daemon/dist/domain/community-harness-presets.js.map +1 -1
- package/daemon/dist/domain/composer-prompts.d.ts +5 -2
- package/daemon/dist/domain/composer-prompts.d.ts.map +1 -1
- package/daemon/dist/domain/composer-prompts.js +2 -2
- package/daemon/dist/domain/composer-prompts.js.map +1 -1
- package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/context-monitor.js +2 -1
- package/daemon/dist/domain/context-monitor.js.map +1 -1
- package/daemon/dist/domain/continuity-policy-materializer.d.ts +1 -0
- package/daemon/dist/domain/continuity-policy-materializer.d.ts.map +1 -1
- package/daemon/dist/domain/continuity-policy-materializer.js +2 -0
- package/daemon/dist/domain/continuity-policy-materializer.js.map +1 -1
- package/daemon/dist/domain/draft-aware-delivery.d.ts.map +1 -1
- package/daemon/dist/domain/draft-aware-delivery.js +1 -1
- package/daemon/dist/domain/draft-aware-delivery.js.map +1 -1
- package/daemon/dist/domain/execution-view.d.ts.map +1 -1
- package/daemon/dist/domain/execution-view.js +7 -6
- package/daemon/dist/domain/execution-view.js.map +1 -1
- package/daemon/dist/domain/footprint-choice.d.ts +41 -0
- package/daemon/dist/domain/footprint-choice.d.ts.map +1 -0
- package/daemon/dist/domain/footprint-choice.js +42 -0
- package/daemon/dist/domain/footprint-choice.js.map +1 -0
- package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts +3 -0
- package/daemon/dist/domain/gateway/delivery-rules-engine.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/delivery-rules-engine.js +1 -1
- package/daemon/dist/domain/gateway/delivery-rules-engine.js.map +1 -1
- package/daemon/dist/domain/gateway/human-registry.d.ts +32 -0
- package/daemon/dist/domain/gateway/human-registry.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/human-registry.js +71 -4
- package/daemon/dist/domain/gateway/human-registry.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/inbound.js +52 -4
- package/daemon/dist/domain/gateway/slack/inbound.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/message.d.ts +3 -0
- package/daemon/dist/domain/gateway/slack/message.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/message.js +9 -2
- package/daemon/dist/domain/gateway/slack/message.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts +7 -0
- package/daemon/dist/domain/gateway/slack/queue-access.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/queue-access.js +14 -2
- package/daemon/dist/domain/gateway/slack/queue-access.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts +1 -3
- package/daemon/dist/domain/gateway/slack/slack-delivery.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-delivery.js +22 -22
- package/daemon/dist/domain/gateway/slack/slack-delivery.js.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.d.ts.map +1 -1
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js +4 -7
- package/daemon/dist/domain/gateway/slack/slack-subsystem.js.map +1 -1
- package/daemon/dist/domain/generated-file-hygiene.js +1 -1
- package/daemon/dist/domain/generated-file-hygiene.js.map +1 -1
- package/daemon/dist/domain/graph-projection.d.ts +3 -0
- package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
- package/daemon/dist/domain/graph-projection.js +2 -0
- package/daemon/dist/domain/graph-projection.js.map +1 -1
- package/daemon/dist/domain/health-diagnosis.d.ts.map +1 -1
- package/daemon/dist/domain/health-diagnosis.js +14 -6
- package/daemon/dist/domain/health-diagnosis.js.map +1 -1
- package/daemon/dist/domain/hot-potato-enforcer.d.ts +1 -1
- package/daemon/dist/domain/human-questions.d.ts +2 -0
- package/daemon/dist/domain/human-questions.d.ts.map +1 -1
- package/daemon/dist/domain/human-questions.js +5 -0
- package/daemon/dist/domain/human-questions.js.map +1 -1
- package/daemon/dist/domain/kernel-boot.d.ts +5 -1
- package/daemon/dist/domain/kernel-boot.d.ts.map +1 -1
- package/daemon/dist/domain/kernel-boot.js +34 -4
- package/daemon/dist/domain/kernel-boot.js.map +1 -1
- package/daemon/dist/domain/managed-blocks.d.ts +32 -1
- package/daemon/dist/domain/managed-blocks.d.ts.map +1 -1
- package/daemon/dist/domain/managed-blocks.js +109 -11
- package/daemon/dist/domain/managed-blocks.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts +1 -1
- package/daemon/dist/domain/mission-control/mission-control-action-log.d.ts.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-action-log.js +3 -0
- package/daemon/dist/domain/mission-control/mission-control-action-log.js.map +1 -1
- package/daemon/dist/domain/mission-control/mission-control-write-contract.d.ts +21 -0
- 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 +110 -0
- package/daemon/dist/domain/mission-control/mission-control-write-contract.js.map +1 -1
- package/daemon/dist/domain/model-divergence/current-model-reader.d.ts +2 -0
- package/daemon/dist/domain/model-divergence/current-model-reader.d.ts.map +1 -1
- package/daemon/dist/domain/model-divergence/current-model-reader.js +7 -0
- package/daemon/dist/domain/model-divergence/current-model-reader.js.map +1 -1
- package/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts +10 -1
- package/daemon/dist/domain/model-divergence/model-divergence-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/model-divergence/model-divergence-monitor.js +24 -5
- package/daemon/dist/domain/model-divergence/model-divergence-monitor.js.map +1 -1
- package/daemon/dist/domain/native-process-lineage.d.ts +3 -0
- package/daemon/dist/domain/native-process-lineage.d.ts.map +1 -1
- package/daemon/dist/domain/native-process-lineage.js +60 -2
- package/daemon/dist/domain/native-process-lineage.js.map +1 -1
- package/daemon/dist/domain/native-resume-probe-evidence.d.ts +19 -0
- package/daemon/dist/domain/native-resume-probe-evidence.d.ts.map +1 -0
- package/daemon/dist/domain/native-resume-probe-evidence.js +37 -0
- package/daemon/dist/domain/native-resume-probe-evidence.js.map +1 -0
- package/daemon/dist/domain/native-resume-probe.d.ts +7 -0
- package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
- package/daemon/dist/domain/native-resume-probe.js +12 -9
- package/daemon/dist/domain/native-resume-probe.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts +49 -1
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +119 -45
- 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 +9 -3
- package/daemon/dist/domain/node-launcher.js.map +1 -1
- package/daemon/dist/domain/occupant-invalidator.d.ts +16 -4
- package/daemon/dist/domain/occupant-invalidator.d.ts.map +1 -1
- package/daemon/dist/domain/occupant-invalidator.js +25 -5
- package/daemon/dist/domain/occupant-invalidator.js.map +1 -1
- package/daemon/dist/domain/operation-correlation.d.ts +78 -0
- package/daemon/dist/domain/operation-correlation.d.ts.map +1 -0
- package/daemon/dist/domain/operation-correlation.js +54 -0
- package/daemon/dist/domain/operation-correlation.js.map +1 -0
- package/daemon/dist/domain/permission-account.d.ts +28 -0
- package/daemon/dist/domain/permission-account.d.ts.map +1 -0
- package/daemon/dist/domain/permission-account.js +102 -0
- package/daemon/dist/domain/permission-account.js.map +1 -0
- package/daemon/dist/domain/permission-drift.d.ts.map +1 -1
- package/daemon/dist/domain/permission-drift.js +11 -7
- package/daemon/dist/domain/permission-drift.js.map +1 -1
- package/daemon/dist/domain/pod-bundle-assembler.d.ts +1 -0
- package/daemon/dist/domain/pod-bundle-assembler.d.ts.map +1 -1
- package/daemon/dist/domain/pod-bundle-assembler.js +25 -0
- package/daemon/dist/domain/pod-bundle-assembler.js.map +1 -1
- package/daemon/dist/domain/policies/artifact-pool-helpers.d.ts +7 -0
- package/daemon/dist/domain/policies/artifact-pool-helpers.d.ts.map +1 -1
- package/daemon/dist/domain/policies/artifact-pool-helpers.js +8 -4
- package/daemon/dist/domain/policies/artifact-pool-helpers.js.map +1 -1
- package/daemon/dist/domain/policies/context-usage-threshold.d.ts.map +1 -1
- package/daemon/dist/domain/policies/context-usage-threshold.js +109 -21
- package/daemon/dist/domain/policies/context-usage-threshold.js.map +1 -1
- package/daemon/dist/domain/policies/edge-artifact-required.d.ts +6 -1
- package/daemon/dist/domain/policies/edge-artifact-required.d.ts.map +1 -1
- package/daemon/dist/domain/policies/edge-artifact-required.js +18 -13
- package/daemon/dist/domain/policies/edge-artifact-required.js.map +1 -1
- package/daemon/dist/domain/policies/mode-scheduled-end.d.ts +2 -0
- package/daemon/dist/domain/policies/mode-scheduled-end.d.ts.map +1 -1
- package/daemon/dist/domain/policies/mode-scheduled-end.js +5 -1
- package/daemon/dist/domain/policies/mode-scheduled-end.js.map +1 -1
- package/daemon/dist/domain/policies/periodic-reminder.d.ts +10 -0
- package/daemon/dist/domain/policies/periodic-reminder.d.ts.map +1 -1
- package/daemon/dist/domain/policies/periodic-reminder.js +11 -6
- package/daemon/dist/domain/policies/periodic-reminder.js.map +1 -1
- package/daemon/dist/domain/policies/types.d.ts +25 -0
- package/daemon/dist/domain/policies/types.d.ts.map +1 -1
- package/daemon/dist/domain/policies/workflow-keepalive.d.ts +6 -1
- package/daemon/dist/domain/policies/workflow-keepalive.d.ts.map +1 -1
- package/daemon/dist/domain/policies/workflow-keepalive.js +11 -5
- package/daemon/dist/domain/policies/workflow-keepalive.js.map +1 -1
- package/daemon/dist/domain/profile-resolution-worker.d.ts +7 -0
- package/daemon/dist/domain/profile-resolution-worker.d.ts.map +1 -0
- package/daemon/dist/domain/profile-resolution-worker.js +83 -0
- package/daemon/dist/domain/profile-resolution-worker.js.map +1 -0
- package/daemon/dist/domain/profile-resolver.d.ts +6 -0
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +14 -2
- package/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/daemon/dist/domain/project-classifier.d.ts +7 -0
- package/daemon/dist/domain/project-classifier.d.ts.map +1 -1
- package/daemon/dist/domain/project-classifier.js +26 -0
- package/daemon/dist/domain/project-classifier.js.map +1 -1
- package/daemon/dist/domain/provider/subscription-move-report.d.ts +86 -0
- package/daemon/dist/domain/provider/subscription-move-report.d.ts.map +1 -0
- package/daemon/dist/domain/provider/subscription-move-report.js +227 -0
- package/daemon/dist/domain/provider/subscription-move-report.js.map +1 -0
- package/daemon/dist/domain/ps-projection.d.ts +6 -35
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +14 -55
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/queue-owner.d.ts +6 -3
- package/daemon/dist/domain/queue-owner.d.ts.map +1 -1
- package/daemon/dist/domain/queue-owner.js +10 -5
- package/daemon/dist/domain/queue-owner.js.map +1 -1
- package/daemon/dist/domain/queue-pickup.d.ts +5 -2
- package/daemon/dist/domain/queue-pickup.d.ts.map +1 -1
- package/daemon/dist/domain/queue-pickup.js +19 -2
- package/daemon/dist/domain/queue-pickup.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +54 -21
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +257 -97
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/queue-retention.d.ts +18 -0
- package/daemon/dist/domain/queue-retention.d.ts.map +1 -1
- package/daemon/dist/domain/queue-retention.js +74 -0
- package/daemon/dist/domain/queue-retention.js.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.d.ts +2 -0
- package/daemon/dist/domain/queue-stuck-sweep.d.ts.map +1 -1
- package/daemon/dist/domain/queue-stuck-sweep.js +37 -3
- package/daemon/dist/domain/queue-stuck-sweep.js.map +1 -1
- package/daemon/dist/domain/queue-wait-backoff.d.ts +3 -0
- package/daemon/dist/domain/queue-wait-backoff.d.ts.map +1 -1
- package/daemon/dist/domain/queue-wait-backoff.js +9 -0
- package/daemon/dist/domain/queue-wait-backoff.js.map +1 -1
- package/daemon/dist/domain/queue-waiting.d.ts +2 -0
- package/daemon/dist/domain/queue-waiting.d.ts.map +1 -1
- package/daemon/dist/domain/queue-waiting.js.map +1 -1
- package/daemon/dist/domain/queue-wake-ladder.d.ts.map +1 -1
- package/daemon/dist/domain/queue-wake-ladder.js +18 -6
- package/daemon/dist/domain/queue-wake-ladder.js.map +1 -1
- package/daemon/dist/domain/reconciler.d.ts +23 -0
- package/daemon/dist/domain/reconciler.d.ts.map +1 -1
- package/daemon/dist/domain/reconciler.js +44 -1
- package/daemon/dist/domain/reconciler.js.map +1 -1
- package/daemon/dist/domain/rehydrate-eligibility.d.ts.map +1 -1
- package/daemon/dist/domain/rehydrate-eligibility.js +2 -3
- package/daemon/dist/domain/rehydrate-eligibility.js.map +1 -1
- package/daemon/dist/domain/restore-guidance.d.ts +7 -0
- package/daemon/dist/domain/restore-guidance.d.ts.map +1 -1
- package/daemon/dist/domain/restore-guidance.js +20 -8
- package/daemon/dist/domain/restore-guidance.js.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.d.ts +13 -1
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +151 -26
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.d.ts +7 -2
- package/daemon/dist/domain/restore-plan-preview.d.ts.map +1 -1
- package/daemon/dist/domain/restore-plan-preview.js +28 -7
- package/daemon/dist/domain/restore-plan-preview.js.map +1 -1
- package/daemon/dist/domain/restore-policy.d.ts +4 -0
- package/daemon/dist/domain/restore-policy.d.ts.map +1 -1
- package/daemon/dist/domain/restore-policy.js +11 -0
- package/daemon/dist/domain/restore-policy.js.map +1 -1
- package/daemon/dist/domain/rig-edge-ops.d.ts +58 -0
- package/daemon/dist/domain/rig-edge-ops.d.ts.map +1 -0
- package/daemon/dist/domain/rig-edge-ops.js +113 -0
- package/daemon/dist/domain/rig-edge-ops.js.map +1 -0
- package/daemon/dist/domain/rig-name-override.d.ts +14 -0
- package/daemon/dist/domain/rig-name-override.d.ts.map +1 -0
- package/daemon/dist/domain/rig-name-override.js +38 -0
- package/daemon/dist/domain/rig-name-override.js.map +1 -0
- package/daemon/dist/domain/rig-repository.d.ts +10 -2
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +14 -0
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rig-status-compose.d.ts +1 -1
- package/daemon/dist/domain/rig-status-compose.d.ts.map +1 -1
- package/daemon/dist/domain/rig-status-compose.js +3 -1
- package/daemon/dist/domain/rig-status-compose.js.map +1 -1
- package/daemon/dist/domain/rig-teardown.d.ts +19 -0
- package/daemon/dist/domain/rig-teardown.d.ts.map +1 -1
- package/daemon/dist/domain/rig-teardown.js +78 -8
- 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 +10 -0
- package/daemon/dist/domain/rigspec-codec.js.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.d.ts +3 -0
- package/daemon/dist/domain/rigspec-exporter.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-exporter.js +22 -0
- package/daemon/dist/domain/rigspec-exporter.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts +30 -2
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +262 -47
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-preflight.js +15 -2
- package/daemon/dist/domain/rigspec-preflight.js.map +1 -1
- package/daemon/dist/domain/rigspec-schema.d.ts +3 -0
- package/daemon/dist/domain/rigspec-schema.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-schema.js +67 -3
- package/daemon/dist/domain/rigspec-schema.js.map +1 -1
- package/daemon/dist/domain/runtime-adapter.d.ts +20 -1
- package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/runtime-adapter.js +5 -1
- package/daemon/dist/domain/runtime-adapter.js.map +1 -1
- package/daemon/dist/domain/scope/scope-view-projection.d.ts +6 -0
- package/daemon/dist/domain/scope/scope-view-projection.d.ts.map +1 -1
- package/daemon/dist/domain/scope/scope-view-projection.js +26 -10
- package/daemon/dist/domain/scope/scope-view-projection.js.map +1 -1
- package/daemon/dist/domain/seat-activity-service.d.ts +4 -2
- package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-activity-service.js +13 -5
- package/daemon/dist/domain/seat-activity-service.js.map +1 -1
- package/daemon/dist/domain/seat-attention-reconciler.d.ts +19 -0
- package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
- package/daemon/dist/domain/seat-attention-reconciler.js +60 -6
- package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
- package/daemon/dist/domain/seat-delivery-guard.d.ts +20 -1
- package/daemon/dist/domain/seat-delivery-guard.d.ts.map +1 -1
- package/daemon/dist/domain/seat-delivery-guard.js +66 -11
- package/daemon/dist/domain/seat-delivery-guard.js.map +1 -1
- package/daemon/dist/domain/seat-handover-service.d.ts +8 -0
- package/daemon/dist/domain/seat-handover-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-handover-service.js +74 -4
- package/daemon/dist/domain/seat-handover-service.js.map +1 -1
- package/daemon/dist/domain/seat-identity-store.d.ts +11 -1
- package/daemon/dist/domain/seat-identity-store.d.ts.map +1 -1
- package/daemon/dist/domain/seat-identity-store.js +29 -4
- package/daemon/dist/domain/seat-identity-store.js.map +1 -1
- package/daemon/dist/domain/seat-launch-additions.d.ts +115 -0
- package/daemon/dist/domain/seat-launch-additions.d.ts.map +1 -0
- package/daemon/dist/domain/seat-launch-additions.js +439 -0
- package/daemon/dist/domain/seat-launch-additions.js.map +1 -0
- package/daemon/dist/domain/seat-launch-environment.d.ts +1 -1
- package/daemon/dist/domain/seat-launch-environment.d.ts.map +1 -1
- package/daemon/dist/domain/seat-launch-environment.js +1 -1
- package/daemon/dist/domain/seat-launch-environment.js.map +1 -1
- package/daemon/dist/domain/seat-lifecycle-service.d.ts +79 -4
- package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-lifecycle-service.js +202 -12
- package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -1
- package/daemon/dist/domain/seat-skill-apply.d.ts +139 -0
- package/daemon/dist/domain/seat-skill-apply.d.ts.map +1 -0
- package/daemon/dist/domain/seat-skill-apply.js +221 -0
- package/daemon/dist/domain/seat-skill-apply.js.map +1 -0
- package/daemon/dist/domain/seat-skill-storage.d.ts +295 -0
- package/daemon/dist/domain/seat-skill-storage.d.ts.map +1 -0
- package/daemon/dist/domain/seat-skill-storage.js +850 -0
- package/daemon/dist/domain/seat-skill-storage.js.map +1 -0
- package/daemon/dist/domain/seat-status-service.d.ts +9 -0
- package/daemon/dist/domain/seat-status-service.d.ts.map +1 -1
- package/daemon/dist/domain/seat-status-service.js +15 -3
- package/daemon/dist/domain/seat-status-service.js.map +1 -1
- package/daemon/dist/domain/session-registry.d.ts +4 -0
- package/daemon/dist/domain/session-registry.d.ts.map +1 -1
- package/daemon/dist/domain/session-registry.js +13 -0
- package/daemon/dist/domain/session-registry.js.map +1 -1
- package/daemon/dist/domain/session-transport.d.ts +52 -21
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +150 -47
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/skill-catalog.d.ts +16 -0
- package/daemon/dist/domain/skill-catalog.d.ts.map +1 -1
- package/daemon/dist/domain/skill-catalog.js +15 -6
- package/daemon/dist/domain/skill-catalog.js.map +1 -1
- package/daemon/dist/domain/skill-discovery.d.ts +17 -2
- package/daemon/dist/domain/skill-discovery.d.ts.map +1 -1
- package/daemon/dist/domain/skill-discovery.js +44 -5
- package/daemon/dist/domain/skill-discovery.js.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.d.ts +26 -2
- package/daemon/dist/domain/startup-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/startup-orchestrator.js +226 -14
- package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
- package/daemon/dist/domain/stream-dispositions.d.ts +51 -0
- package/daemon/dist/domain/stream-dispositions.d.ts.map +1 -0
- package/daemon/dist/domain/stream-dispositions.js +112 -0
- package/daemon/dist/domain/stream-dispositions.js.map +1 -0
- package/daemon/dist/domain/stream-store.d.ts +22 -0
- package/daemon/dist/domain/stream-store.d.ts.map +1 -1
- package/daemon/dist/domain/stream-store.js +49 -6
- package/daemon/dist/domain/stream-store.js.map +1 -1
- package/daemon/dist/domain/stream-subscriptions.d.ts +94 -0
- package/daemon/dist/domain/stream-subscriptions.d.ts.map +1 -0
- package/daemon/dist/domain/stream-subscriptions.js +160 -0
- package/daemon/dist/domain/stream-subscriptions.js.map +1 -0
- package/daemon/dist/domain/successor-session-launcher.d.ts +6 -0
- package/daemon/dist/domain/successor-session-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/successor-session-launcher.js +5 -2
- package/daemon/dist/domain/successor-session-launcher.js.map +1 -1
- package/daemon/dist/domain/terminal/herdr-adapter.d.ts +2 -0
- package/daemon/dist/domain/terminal/herdr-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/terminal/herdr-adapter.js +104 -1
- package/daemon/dist/domain/terminal/herdr-adapter.js.map +1 -1
- package/daemon/dist/domain/terminal/herdr-sessions.d.ts +9 -0
- package/daemon/dist/domain/terminal/herdr-sessions.d.ts.map +1 -0
- package/daemon/dist/domain/terminal/herdr-sessions.js +23 -0
- package/daemon/dist/domain/terminal/herdr-sessions.js.map +1 -0
- package/daemon/dist/domain/terminal/terminal-provider.d.ts +4 -0
- package/daemon/dist/domain/terminal/terminal-provider.d.ts.map +1 -1
- package/daemon/dist/domain/terminal/terminal-service.d.ts +12 -3
- package/daemon/dist/domain/terminal/terminal-service.d.ts.map +1 -1
- package/daemon/dist/domain/terminal/terminal-service.js +42 -17
- package/daemon/dist/domain/terminal/terminal-service.js.map +1 -1
- package/daemon/dist/domain/terminal/view-composer.d.ts.map +1 -1
- package/daemon/dist/domain/terminal/view-composer.js +1 -0
- package/daemon/dist/domain/terminal/view-composer.js.map +1 -1
- package/daemon/dist/domain/terminal-policy.d.ts +80 -0
- package/daemon/dist/domain/terminal-policy.d.ts.map +1 -0
- package/daemon/dist/domain/terminal-policy.js +117 -0
- package/daemon/dist/domain/terminal-policy.js.map +1 -0
- package/daemon/dist/domain/terminal-seat.d.ts +9 -0
- package/daemon/dist/domain/terminal-seat.d.ts.map +1 -0
- package/daemon/dist/domain/terminal-seat.js +37 -0
- package/daemon/dist/domain/terminal-seat.js.map +1 -0
- package/daemon/dist/domain/topology-converge.d.ts +25 -2
- package/daemon/dist/domain/topology-converge.d.ts.map +1 -1
- package/daemon/dist/domain/topology-converge.js +14 -1
- package/daemon/dist/domain/topology-converge.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +58 -2
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/urgent-line.d.ts +4 -0
- package/daemon/dist/domain/urgent-line.d.ts.map +1 -0
- package/daemon/dist/domain/urgent-line.js +7 -0
- package/daemon/dist/domain/urgent-line.js.map +1 -0
- package/daemon/dist/domain/usage-series.d.ts.map +1 -1
- package/daemon/dist/domain/usage-series.js +6 -2
- package/daemon/dist/domain/usage-series.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-browser.js +2 -2
- package/daemon/dist/domain/user-settings/settings-browser.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +3 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +73 -1
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/view-projector.d.ts.map +1 -1
- package/daemon/dist/domain/view-projector.js +2 -1
- package/daemon/dist/domain/view-projector.js.map +1 -1
- package/daemon/dist/domain/watchdog-delivery.js +1 -1
- package/daemon/dist/domain/watchdog-delivery.js.map +1 -1
- package/daemon/dist/domain/watchdog-job-update.d.ts +21 -0
- package/daemon/dist/domain/watchdog-job-update.d.ts.map +1 -0
- package/daemon/dist/domain/watchdog-job-update.js +143 -0
- package/daemon/dist/domain/watchdog-job-update.js.map +1 -0
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts +63 -7
- package/daemon/dist/domain/watchdog-jobs-repository.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-jobs-repository.js +190 -21
- package/daemon/dist/domain/watchdog-jobs-repository.js.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.d.ts +23 -0
- package/daemon/dist/domain/watchdog-policy-engine.d.ts.map +1 -1
- package/daemon/dist/domain/watchdog-policy-engine.js +46 -13
- package/daemon/dist/domain/watchdog-policy-engine.js.map +1 -1
- package/daemon/dist/domain/workflow-exception-escalation.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-exception-escalation.js +7 -3
- package/daemon/dist/domain/workflow-exception-escalation.js.map +1 -1
- package/daemon/dist/domain/workflow-projector.d.ts +5 -2
- package/daemon/dist/domain/workflow-projector.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-projector.js +16 -7
- package/daemon/dist/domain/workflow-projector.js.map +1 -1
- package/daemon/dist/domain/workflow-runtime.d.ts +8 -2
- package/daemon/dist/domain/workflow-runtime.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-runtime.js +30 -7
- package/daemon/dist/domain/workflow-runtime.js.map +1 -1
- package/daemon/dist/domain/workspace/project-read.d.ts +2 -0
- package/daemon/dist/domain/workspace/project-read.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/project-read.js +10 -1
- package/daemon/dist/domain/workspace/project-read.js.map +1 -1
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +2 -0
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/router-line-surface.d.ts +2 -0
- package/daemon/dist/router-line-surface.d.ts.map +1 -0
- package/daemon/dist/router-line-surface.js +3 -0
- package/daemon/dist/router-line-surface.js.map +1 -0
- package/daemon/dist/routes/activity.d.ts.map +1 -1
- package/daemon/dist/routes/activity.js +3 -0
- package/daemon/dist/routes/activity.js.map +1 -1
- package/daemon/dist/routes/agent-images.d.ts.map +1 -1
- package/daemon/dist/routes/agent-images.js +10 -2
- package/daemon/dist/routes/agent-images.js.map +1 -1
- package/daemon/dist/routes/attention.d.ts.map +1 -1
- package/daemon/dist/routes/attention.js +30 -3
- package/daemon/dist/routes/attention.js.map +1 -1
- package/daemon/dist/routes/bootstrap-failure-response.js +2 -2
- package/daemon/dist/routes/bootstrap-failure-response.js.map +1 -1
- package/daemon/dist/routes/bundles.js +1 -1
- package/daemon/dist/routes/bundles.js.map +1 -1
- package/daemon/dist/routes/compaction.d.ts.map +1 -1
- package/daemon/dist/routes/compaction.js +31 -10
- package/daemon/dist/routes/compaction.js.map +1 -1
- package/daemon/dist/routes/hosts.d.ts.map +1 -1
- package/daemon/dist/routes/hosts.js +2 -0
- package/daemon/dist/routes/hosts.js.map +1 -1
- package/daemon/dist/routes/mission-control.d.ts.map +1 -1
- package/daemon/dist/routes/mission-control.js +5 -1
- package/daemon/dist/routes/mission-control.js.map +1 -1
- package/daemon/dist/routes/projects.d.ts.map +1 -1
- package/daemon/dist/routes/projects.js +59 -12
- package/daemon/dist/routes/projects.js.map +1 -1
- package/daemon/dist/routes/proof.js +2 -2
- package/daemon/dist/routes/proof.js.map +1 -1
- package/daemon/dist/routes/provider.d.ts.map +1 -1
- package/daemon/dist/routes/provider.js +87 -0
- package/daemon/dist/routes/provider.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +52 -3
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/rigs.d.ts.map +1 -1
- package/daemon/dist/routes/rigs.js +75 -10
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/rigspec.d.ts.map +1 -1
- package/daemon/dist/routes/rigspec.js +38 -12
- package/daemon/dist/routes/rigspec.js.map +1 -1
- package/daemon/dist/routes/scopes.d.ts.map +1 -1
- package/daemon/dist/routes/scopes.js +30 -7
- package/daemon/dist/routes/scopes.js.map +1 -1
- package/daemon/dist/routes/seat.d.ts.map +1 -1
- package/daemon/dist/routes/seat.js +19 -3
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/routes/sessions.js +5 -0
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/routes/skills.d.ts.map +1 -1
- package/daemon/dist/routes/skills.js +54 -1
- package/daemon/dist/routes/skills.js.map +1 -1
- package/daemon/dist/routes/stream.d.ts.map +1 -1
- package/daemon/dist/routes/stream.js +62 -13
- package/daemon/dist/routes/stream.js.map +1 -1
- package/daemon/dist/routes/terminal.d.ts.map +1 -1
- package/daemon/dist/routes/terminal.js +20 -11
- package/daemon/dist/routes/terminal.js.map +1 -1
- package/daemon/dist/routes/transport.d.ts.map +1 -1
- package/daemon/dist/routes/transport.js +24 -2
- package/daemon/dist/routes/transport.js.map +1 -1
- package/daemon/dist/routes/up.js +5 -0
- package/daemon/dist/routes/up.js.map +1 -1
- package/daemon/dist/routes/watchdog.d.ts +1 -0
- package/daemon/dist/routes/watchdog.d.ts.map +1 -1
- package/daemon/dist/routes/watchdog.js +52 -3
- package/daemon/dist/routes/watchdog.js.map +1 -1
- package/daemon/dist/routes/workflow.d.ts.map +1 -1
- package/daemon/dist/routes/workflow.js +24 -13
- package/daemon/dist/routes/workflow.js.map +1 -1
- package/daemon/dist/server.d.ts +2 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +4 -1
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/skill-loadout-surface.d.ts +2 -0
- package/daemon/dist/skill-loadout-surface.d.ts.map +1 -1
- package/daemon/dist/skill-loadout-surface.js +2 -0
- package/daemon/dist/skill-loadout-surface.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +54 -21
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/dist/terminal/TerminalSessionBroker.d.ts.map +1 -1
- package/daemon/dist/terminal/TerminalSessionBroker.js +9 -2
- package/daemon/dist/terminal/TerminalSessionBroker.js.map +1 -1
- package/daemon/docs/reference/a2a-agents.md +343 -0
- package/daemon/docs/reference/acp-agents.md +77 -0
- package/daemon/docs/reference/agent-spec.md +7 -5
- package/daemon/docs/reference/agent-startup-guide.md +46 -0
- package/daemon/docs/reference/agent-state-taxonomy.md +27 -2
- package/daemon/docs/reference/checked-seat-stop.md +11 -0
- package/daemon/docs/reference/community-harness-examples/cursor/cursor.yaml +13 -0
- package/daemon/docs/reference/community-harness-examples/cursor/openrig-cursor-launch +61 -0
- package/daemon/docs/reference/community-harness-examples/hermes/config.yaml.example +18 -0
- package/daemon/docs/reference/community-harness-examples/hermes/hermes.yaml +12 -0
- package/daemon/docs/reference/community-harness-examples/hermes/openrig-hermes-launch +34 -0
- package/daemon/docs/reference/community-harness-examples/openclaw/openclaw.yaml +13 -0
- package/daemon/docs/reference/community-harness-examples/openclaw/openrig-openclaw-launch +38 -0
- package/daemon/docs/reference/community-harness-presets.md +179 -0
- package/daemon/docs/reference/getting-started.md +65 -6
- package/daemon/docs/reference/operation-correlation.md +9 -0
- package/daemon/docs/reference/project-workspace.md +6 -0
- package/daemon/docs/reference/quickstart.md +1 -1
- package/daemon/docs/reference/refocus-channel.md +6 -4
- package/daemon/docs/reference/rig-spec.md +82 -2
- package/daemon/docs/reference/seat-delivery.md +73 -2
- package/daemon/docs/reference/slack-app-setup.md +3 -1
- package/daemon/docs/reference/stream-classifier-worker.md +28 -0
- package/daemon/docs/reference/telemetry.md +3 -0
- package/daemon/docs/reference/terminal-sessions.md +90 -0
- package/daemon/docs/reference/topology-naming.md +1 -1
- package/daemon/docs/reference/whats-new.md +162 -113
- package/daemon/specs/agents/shared/runtime/claude-settings.fragment.json +0 -3
- package/daemon/specs/agents/shared/skills/core/messaging-the-human/SKILL.md +19 -4
- package/daemon/specs/agents/shared/skills/core/openrig-herdr/SKILL.md +3 -0
- package/daemon/specs/agents/shared/skills/core/openrig-software-factory/references/worked-example.md +2 -2
- package/daemon/specs/rigs/launch/kernel/agents/operator/agent/guidance/role.md +36 -10
- package/daemon/specs/rigs/launch/kernel/agents/queue/worker/guidance/role.md +11 -0
- package/daemon/specs/rigs/launch/kernel/agents/queue/worker/startup/context.md +3 -1
- package/daemon/specs/rigs/launch/secrets-manager/secrets-manager.compose.yaml +1 -1
- package/dist/acp/connector.d.ts +72 -0
- package/dist/acp/connector.d.ts.map +1 -0
- package/dist/acp/connector.js +218 -0
- package/dist/acp/connector.js.map +1 -0
- package/dist/acp/json-rpc-stdio.d.ts +53 -0
- package/dist/acp/json-rpc-stdio.d.ts.map +1 -0
- package/dist/acp/json-rpc-stdio.js +141 -0
- package/dist/acp/json-rpc-stdio.js.map +1 -0
- package/dist/acp/run-processes.d.ts +10 -0
- package/dist/acp/run-processes.d.ts.map +1 -0
- package/dist/acp/run-processes.js +33 -0
- package/dist/acp/run-processes.js.map +1 -0
- package/dist/build-info.js +3 -3
- package/dist/client.d.ts +7 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +14 -7
- package/dist/client.js.map +1 -1
- package/dist/commands/acp.d.ts +11 -0
- package/dist/commands/acp.d.ts.map +1 -0
- package/dist/commands/acp.js +198 -0
- package/dist/commands/acp.js.map +1 -0
- package/dist/commands/attach.js +1 -1
- package/dist/commands/attach.js.map +1 -1
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -1
- package/dist/commands/auth.js +39 -10
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/compact-plan.d.ts +2 -0
- package/dist/commands/compact-plan.d.ts.map +1 -1
- package/dist/commands/compact-plan.js +38 -3
- package/dist/commands/compact-plan.js.map +1 -1
- package/dist/commands/compact.js +1 -1
- package/dist/commands/compact.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +7 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/create.js +2 -2
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +2 -0
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/down.d.ts +5 -1
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +87 -3
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/edge.d.ts +4 -0
- package/dist/commands/edge.d.ts.map +1 -0
- package/dist/commands/edge.js +135 -0
- package/dist/commands/edge.js.map +1 -0
- package/dist/commands/export.d.ts +1 -0
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +51 -0
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/fork.d.ts.map +1 -1
- package/dist/commands/fork.js +19 -2
- package/dist/commands/fork.js.map +1 -1
- package/dist/commands/gateway.d.ts.map +1 -1
- package/dist/commands/gateway.js +2 -1
- package/dist/commands/gateway.js.map +1 -1
- package/dist/commands/grow.js +2 -2
- package/dist/commands/grow.js.map +1 -1
- package/dist/commands/launch.js +1 -1
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +113 -1
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/project-worker.d.ts +25 -1
- package/dist/commands/project-worker.d.ts.map +1 -1
- package/dist/commands/project-worker.js +9 -7
- package/dist/commands/project-worker.js.map +1 -1
- package/dist/commands/project.d.ts +2 -0
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +64 -1
- package/dist/commands/project.js.map +1 -1
- package/dist/commands/provider.d.ts.map +1 -1
- package/dist/commands/provider.js +101 -0
- package/dist/commands/provider.js.map +1 -1
- package/dist/commands/ps.d.ts +12 -1
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +50 -47
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts +4 -2
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +24 -15
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/reconcile-session.d.ts.map +1 -1
- package/dist/commands/reconcile-session.js +6 -0
- package/dist/commands/reconcile-session.js.map +1 -1
- package/dist/commands/seat.d.ts +2 -0
- package/dist/commands/seat.d.ts.map +1 -1
- package/dist/commands/seat.js +124 -6
- package/dist/commands/seat.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +62 -55
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/setup.d.ts +24 -0
- package/dist/commands/setup.d.ts.map +1 -1
- package/dist/commands/setup.js +160 -7
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/skill.d.ts.map +1 -1
- package/dist/commands/skill.js +116 -3
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +18 -25
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +4 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/stream-outcome.d.ts +157 -0
- package/dist/commands/stream-outcome.d.ts.map +1 -0
- package/dist/commands/stream-outcome.js +81 -0
- package/dist/commands/stream-outcome.js.map +1 -0
- package/dist/commands/stream.d.ts.map +1 -1
- package/dist/commands/stream.js +64 -2
- package/dist/commands/stream.js.map +1 -1
- package/dist/commands/terminal.d.ts +1 -0
- package/dist/commands/terminal.d.ts.map +1 -1
- package/dist/commands/terminal.js +35 -6
- package/dist/commands/terminal.js.map +1 -1
- package/dist/commands/topology-default-agent.d.ts +2 -2
- package/dist/commands/topology-default-agent.d.ts.map +1 -1
- package/dist/commands/topology-default-agent.js +5 -3
- package/dist/commands/topology-default-agent.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +75 -30
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/watchdog.d.ts.map +1 -1
- package/dist/commands/watchdog.js +80 -5
- package/dist/commands/watchdog.js.map +1 -1
- package/dist/commands/workflow-errors.js +1 -1
- package/dist/commands/workflow-errors.js.map +1 -1
- package/dist/commands/workflow-render.js +4 -4
- package/dist/commands/workflow-render.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +34 -15
- package/dist/commands/workflow.js.map +1 -1
- package/dist/config-store.d.ts +15 -1
- package/dist/config-store.d.ts.map +1 -1
- package/dist/config-store.js +86 -4
- package/dist/config-store.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +4 -0
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +73 -21
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/decisions/decisions.d.ts +203 -0
- package/dist/decisions/decisions.d.ts.map +1 -0
- package/dist/decisions/decisions.js +374 -0
- package/dist/decisions/decisions.js.map +1 -0
- package/dist/decisions/stream-consumer.d.ts +255 -0
- package/dist/decisions/stream-consumer.d.ts.map +1 -0
- package/dist/decisions/stream-consumer.js +282 -0
- package/dist/decisions/stream-consumer.js.map +1 -0
- package/dist/decisions/templates.d.ts +8 -0
- package/dist/decisions/templates.d.ts.map +1 -0
- package/dist/decisions/templates.js +34 -0
- package/dist/decisions/templates.js.map +1 -0
- package/dist/fresh-seat-command.d.ts +18 -0
- package/dist/fresh-seat-command.d.ts.map +1 -0
- package/dist/fresh-seat-command.js +36 -0
- package/dist/fresh-seat-command.js.map +1 -0
- package/dist/front-door.d.ts +4 -0
- package/dist/front-door.d.ts.map +1 -1
- package/dist/front-door.js +8 -4
- package/dist/front-door.js.map +1 -1
- package/dist/host-bindings.d.ts.map +1 -1
- package/dist/host-bindings.js +16 -9
- package/dist/host-bindings.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/lazy-program.d.ts.map +1 -1
- package/dist/lazy-program.js +2 -0
- package/dist/lazy-program.js.map +1 -1
- package/dist/lib/run-on-host.d.ts +29 -0
- package/dist/lib/run-on-host.d.ts.map +1 -0
- package/dist/lib/run-on-host.js +69 -0
- package/dist/lib/run-on-host.js.map +1 -0
- package/dist/lib/seat-activity.d.ts +17 -0
- package/dist/lib/seat-activity.d.ts.map +1 -0
- package/dist/lib/seat-activity.js +29 -0
- package/dist/lib/seat-activity.js.map +1 -0
- package/dist/local-daemon-owner.d.ts +4 -0
- package/dist/local-daemon-owner.d.ts.map +1 -1
- package/dist/local-daemon-owner.js +1 -1
- package/dist/local-daemon-owner.js.map +1 -1
- package/dist/mcp-http.d.ts +42 -0
- package/dist/mcp-http.d.ts.map +1 -0
- package/dist/mcp-http.js +232 -0
- package/dist/mcp-http.js.map +1 -0
- package/dist/mcp-server.d.ts +30 -2
- package/dist/mcp-server.d.ts.map +1 -1
- package/dist/mcp-server.js +1112 -436
- package/dist/mcp-server.js.map +1 -1
- package/dist/seat-launch-additions-lines.d.ts +11 -0
- package/dist/seat-launch-additions-lines.d.ts.map +1 -0
- package/dist/seat-launch-additions-lines.js +14 -0
- package/dist/seat-launch-additions-lines.js.map +1 -0
- package/dist/terminal-window.d.ts +1 -1
- package/dist/terminal-window.d.ts.map +1 -1
- package/dist/terminal-window.js +50 -22
- package/dist/terminal-window.js.map +1 -1
- package/package.json +1 -1
- package/tui/dist/attention/attention-model.d.ts +3 -1
- package/tui/dist/attention/attention-model.d.ts.map +1 -1
- package/tui/dist/attention/attention-model.js +68 -1
- package/tui/dist/attention/attention-model.js.map +1 -1
- package/tui/dist/commands/registry.d.ts.map +1 -1
- package/tui/dist/commands/registry.js +2 -0
- package/tui/dist/commands/registry.js.map +1 -1
- package/tui/dist/config/config-model.d.ts.map +1 -1
- package/tui/dist/config/config-model.js +2 -0
- package/tui/dist/config/config-model.js.map +1 -1
- package/tui/dist/daemon-client.d.ts +18 -0
- package/tui/dist/daemon-client.d.ts.map +1 -1
- package/tui/dist/daemon-client.js +4 -0
- package/tui/dist/daemon-client.js.map +1 -1
- package/tui/dist/hydrate.d.ts.map +1 -1
- package/tui/dist/hydrate.js +9 -6
- package/tui/dist/hydrate.js.map +1 -1
- package/tui/dist/main.js +15 -1
- package/tui/dist/main.js.map +1 -1
- package/tui/dist/render.d.ts.map +1 -1
- package/tui/dist/render.js +10 -3
- package/tui/dist/render.js.map +1 -1
- package/tui/dist/topology/fixture.js +1 -1
- package/tui/dist/topology/fixture.js.map +1 -1
- package/tui/dist/topology/glyphs.js +1 -1
- package/tui/dist/topology/glyphs.js.map +1 -1
- package/tui/dist/topology/graph-types.d.ts +1 -0
- package/tui/dist/topology/graph-types.d.ts.map +1 -1
- package/tui/dist/types.d.ts +25 -0
- package/tui/dist/types.d.ts.map +1 -1
- package/ui/dist/assets/{index-CVgod3Pm.js → index-Blg-p32B.js} +92 -92
- package/ui/dist/index.html +1 -1
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import { PROMPT_ALERT_TAG, readWakeLadderBackstop } from "./queue-wake-ladder.js";
|
|
2
|
+
import { withUrgentLine } from "./urgent-line.js";
|
|
2
3
|
import { quietCustodyBackstop, quietHoldCustody } from "./quiet-hold-custody.js";
|
|
3
4
|
import { createHash } from "node:crypto";
|
|
4
|
-
import { loadHumanRegistry, resolveRegisteredHumanAddress } from "./gateway/human-registry.js";
|
|
5
|
+
import { loadHumanRegistry, resolveRegisteredHumanAddress, slackSubscriptionFor, withHumanAlertTag } from "./gateway/human-registry.js";
|
|
5
6
|
import { resolveExternal } from "./gateway/external-admission.js";
|
|
6
7
|
import { QueueTransitionLog } from "./queue-transition-log.js";
|
|
7
8
|
import { WAKE_INTENT_PREFIX } from "./outbox-handler.js";
|
|
8
9
|
import { derivePickup } from "./queue-pickup.js";
|
|
9
10
|
import { lastMeaningfulTransition, readWaitingView } from "./queue-waiting.js";
|
|
10
11
|
import { wrapPaneEnvelope } from "../lib/pane-envelope.js";
|
|
12
|
+
import { isBoundTerminalSeat } from "./terminal-seat.js";
|
|
11
13
|
import { renderQueueHandoffNudge } from "./queue-nudge-text.js";
|
|
12
14
|
import { getSelfHostId } from "./hosts/fanout-contract.js";
|
|
13
15
|
import { parseSessionName, isHumanSeatSessionRef } from "./session-name.js";
|
|
@@ -63,6 +65,10 @@ export function hasLiveHumanGate(item) {
|
|
|
63
65
|
return isBlockerLive(item.state) && isHumanSeatSessionRef(item.destinationSession);
|
|
64
66
|
}
|
|
65
67
|
const AUTO_UNPARK_WAKE_TAG = "queue:auto-unpark:blocker";
|
|
68
|
+
/** A durable wake OpenRig's own scheduling triggered (an auto-unpark, a row OpenRig creates), not an agent's create or
|
|
69
|
+
* handoff: it keeps that source when it's replayed later. Send, broadcast, queue create and the cross-host forward never
|
|
70
|
+
* set it from a request; the trusted local outbox recorder (/api/queue/outbox/record) accepts caller tags by design. */
|
|
71
|
+
const WAKE_TRIGGER_OPENRIG_TAG = "queue:wake-trigger:openrig";
|
|
66
72
|
const AUTO_UNPARK_BLOCKER_TAG_PREFIX = "queue:auto-unpark:blocker-ref:";
|
|
67
73
|
/** The actor on the transition routeToFallback writes; the row's own history is how a later reroute finds the line it wrote. */
|
|
68
74
|
const FALLBACK_ACTOR = "system:queue-fallback";
|
|
@@ -125,33 +131,15 @@ export function classifyNudgeFailure(lastNudgeResult) {
|
|
|
125
131
|
return "unknown";
|
|
126
132
|
}
|
|
127
133
|
export const QUEUE_PRIORITIES = ["routine", "urgent", "critical"];
|
|
128
|
-
/**
|
|
129
|
-
function
|
|
130
|
-
if (
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if (!["idle", "not-idle", "unknown", "unchecked"].includes(seat) || typeof sameProcess !== "boolean")
|
|
134
|
-
return undefined;
|
|
135
|
-
const readings = ["exact", "ambiguous", "empty", "queued", "hidden", "other", "unrecognized", "unavailable", "unchecked"];
|
|
136
|
-
if (!readings.includes(before) || !readings.includes(after))
|
|
137
|
-
return undefined;
|
|
138
|
-
return { seat, before, after, sameProcess };
|
|
139
|
-
}
|
|
140
|
-
/** #1278: read a stored reading back; an absent or unreadable value reads unknown (null). The
|
|
141
|
-
* reading carries its attempt's timestamp (`at`), and reads unknown unless that is still the row's
|
|
142
|
-
* latest attempt: an older daemon records an attempt without touching this column, so a reading
|
|
143
|
-
* left behind by an earlier attempt must not read as the latest one's. */
|
|
144
|
-
function parseNudgeInputBox(stored, lastAttempt) {
|
|
145
|
-
if (!stored || !lastAttempt)
|
|
146
|
-
return null;
|
|
147
|
-
try {
|
|
148
|
-
const parsed = JSON.parse(stored);
|
|
149
|
-
if (parsed?.at !== lastAttempt)
|
|
150
|
-
return null;
|
|
151
|
-
return inputBoxReading(parsed) ?? null;
|
|
134
|
+
/** Adds the handoff-successor and updated-since filters both list paths share. */
|
|
135
|
+
function pushFollowThroughFilters(opts, conditions, params) {
|
|
136
|
+
if (opts?.handedOffFrom) {
|
|
137
|
+
conditions.push("handed_off_from = ?");
|
|
138
|
+
params.push(opts.handedOffFrom);
|
|
152
139
|
}
|
|
153
|
-
|
|
154
|
-
|
|
140
|
+
if (opts?.updatedSince) {
|
|
141
|
+
conditions.push("ts_updated >= ?");
|
|
142
|
+
params.push(opts.updatedSince);
|
|
155
143
|
}
|
|
156
144
|
}
|
|
157
145
|
/** The message a `--wake-after` park timer carries when its owner gives none. */
|
|
@@ -292,7 +280,6 @@ function detectTable(db, tableName) {
|
|
|
292
280
|
// and named in fieldsElided, never backfilled as empty.
|
|
293
281
|
const COMPACT_ELIDED_FIELDS = [
|
|
294
282
|
"body", "evidenceRef", "humanDetail", "waiting", "chainOfRecord", "replyTo", "humanQuestions", "humanAnswers", "delegatedDecision",
|
|
295
|
-
"lastNudgeInputBox",
|
|
296
283
|
];
|
|
297
284
|
function compactRow(item) {
|
|
298
285
|
const row = { ...item, fieldsElided: [...COMPACT_ELIDED_FIELDS] };
|
|
@@ -453,8 +440,6 @@ export class QueueRepository {
|
|
|
453
440
|
hasHumanQuestionsColumn;
|
|
454
441
|
hasDelegatedDecisionColumn;
|
|
455
442
|
hasEvidenceRefColumn;
|
|
456
|
-
/** #1278 — migration 116; older fixtures without it record no reading. */
|
|
457
|
-
hasNudgeInputBoxColumn;
|
|
458
443
|
hasMintingGenColumn;
|
|
459
444
|
hasClaimedGenColumn;
|
|
460
445
|
hasQueueTransitionsTable;
|
|
@@ -484,7 +469,6 @@ export class QueueRepository {
|
|
|
484
469
|
this.hasHumanQuestionsColumn = detectQueueColumn(db, "human_questions");
|
|
485
470
|
this.hasDelegatedDecisionColumn = detectQueueColumn(db, "delegated_decision");
|
|
486
471
|
this.hasEvidenceRefColumn = detectQueueColumn(db, "evidence_ref");
|
|
487
|
-
this.hasNudgeInputBoxColumn = detectQueueColumn(db, "last_nudge_input_box");
|
|
488
472
|
this.hasQueueTransitionsTable = detectTable(db, "queue_transitions");
|
|
489
473
|
const transitionColumns = this.hasQueueTransitionsTable
|
|
490
474
|
? new Set(db.prepare("PRAGMA table_info(queue_transitions)").all().map((column) => column.name))
|
|
@@ -561,23 +545,30 @@ export class QueueRepository {
|
|
|
561
545
|
.get(entry.auditPointer);
|
|
562
546
|
return expected === latest?.transition_id;
|
|
563
547
|
}
|
|
548
|
+
/** A wake's source and urgency at the seat's level: the trigger decides the source; the row's priority (urgent or
|
|
549
|
+
* critical) makes it urgent, marked by whoever created the row. */
|
|
550
|
+
wakeAdmission(qitemId, trigger) {
|
|
551
|
+
const row = this.getById(qitemId);
|
|
552
|
+
const urgent = row?.priority === "urgent" || row?.priority === "critical";
|
|
553
|
+
// OpenRig's own row is marked urgent by OpenRig, not by the person whose obligation it's about.
|
|
554
|
+
return { source: trigger, urgent, ...(urgent && row ? { urgentBy: trigger === "openrig" ? "OpenRig" : row.sourceSession } : {}) };
|
|
555
|
+
}
|
|
564
556
|
classifyWakeResult(res) {
|
|
565
|
-
//
|
|
566
|
-
|
|
567
|
-
const reading = inputBox ? { inputBox } : {};
|
|
557
|
+
// Held by the seat's hold or interruption level (on purpose; a retry is held again) is the typing guard's; any other
|
|
558
|
+
// retention is the draft-aware delivery's (a draft, an unreadable input, a native prompt), which can clear.
|
|
568
559
|
if (res.outcome === "retained")
|
|
569
|
-
return { classified: "retained", nudgeResult: res.reason
|
|
570
|
-
? "retained:
|
|
560
|
+
return { classified: "retained", nudgeResult: res.reason === "typing_guard_enabled"
|
|
561
|
+
? "retained:typing_guard" : "retained:draft_aware" };
|
|
571
562
|
if (res.ok)
|
|
572
|
-
return res.verified ? { classified: "verified", nudgeResult: "verified"
|
|
563
|
+
return res.verified ? { classified: "verified", nudgeResult: "verified" } : { classified: "indeterminate", nudgeResult: "delivered-ack-pending" };
|
|
573
564
|
const detail = res.error ?? res.reason ?? "unknown";
|
|
574
565
|
// Input evidence survives receipt removal: an issued paste or uncertain Enter is never an unsent failure.
|
|
575
566
|
const inputUncertain = res.sent === true || res.inputPhase === "attempted" || res.inputPhase === "written"
|
|
576
567
|
|| (res.sent !== false && res.inputPhase !== "not_reached" && (res.reason === "delivery_indeterminate" || res.reason === "submit_failed"));
|
|
577
568
|
if (inputUncertain || isWakeTimeoutSignal(res.reason) || isWakeTimeoutSignal(res.error)) {
|
|
578
|
-
return { classified: "indeterminate", nudgeResult: `indeterminate:${detail}
|
|
569
|
+
return { classified: "indeterminate", nudgeResult: `indeterminate:${detail}` };
|
|
579
570
|
}
|
|
580
|
-
return { classified: "failed", nudgeResult: `failed:${detail}
|
|
571
|
+
return { classified: "failed", nudgeResult: `failed:${detail}` };
|
|
581
572
|
}
|
|
582
573
|
/**
|
|
583
574
|
* W1 (transactional closure): attach the durable wake-intent store AFTER
|
|
@@ -611,9 +602,13 @@ export class QueueRepository {
|
|
|
611
602
|
return { kind: "human-required", level: "ALERT" };
|
|
612
603
|
const destinationHuman = resolveRegisteredHumanAddress(input.destinationSession, registry.entities);
|
|
613
604
|
if (input.action === "create" && destinationHuman !== null) {
|
|
605
|
+
// The person's Slack subscription decides: `every-ask` (the default) posts every ask (ALERT); `urgent-only` posts only
|
|
606
|
+
// one marked --alert, and a plain ask lands on Steering and the TUI (RECORD: below the posting dial, so no post is owed).
|
|
607
|
+
const person = registry.entities.find((entity) => entity.address === destinationHuman);
|
|
608
|
+
const posts = input.humanAlert === true || slackSubscriptionFor(person).preset === "every-ask";
|
|
614
609
|
return input.humanIntent === "update"
|
|
615
610
|
? { kind: "human-update", level: "NOTICE" }
|
|
616
|
-
: { kind: "human-required", level: "ALERT" };
|
|
611
|
+
: { kind: "human-required", level: posts ? "ALERT" : "RECORD" };
|
|
617
612
|
}
|
|
618
613
|
return null;
|
|
619
614
|
}
|
|
@@ -635,7 +630,7 @@ export class QueueRepository {
|
|
|
635
630
|
* `nudge:false` intends no wake ⇒ no intent. A missing outbox is enforced by the
|
|
636
631
|
* guard (fail-closed, MF2), not silently skipped here.
|
|
637
632
|
*/
|
|
638
|
-
stageWakeIntent(successorQitemId, fromSession, toSession, identityProvenance, nudge) {
|
|
633
|
+
stageWakeIntent(successorQitemId, fromSession, toSession, identityProvenance, nudge, trigger = "agent") {
|
|
639
634
|
// No wake intended (nudge:false) ⇒ no durable intent to make durable. The
|
|
640
635
|
// W1-c guard is nudge-aware for the same reason: absence of an intent is a
|
|
641
636
|
// defect only when a wake WAS intended.
|
|
@@ -651,7 +646,9 @@ export class QueueRepository {
|
|
|
651
646
|
toSession,
|
|
652
647
|
identityProvenance,
|
|
653
648
|
bareBody: renderQueueHandoffNudge(successorQitemId, successor?.summary),
|
|
654
|
-
tags: successor?.handedOffFrom
|
|
649
|
+
tags: successor?.handedOffFrom || trigger === "openrig"
|
|
650
|
+
? [...(successor?.handedOffFrom ? [`queue:return:${successor.handedOffFrom}`] : []), ...(trigger === "openrig" ? [WAKE_TRIGGER_OPENRIG_TAG] : [])]
|
|
651
|
+
: undefined,
|
|
655
652
|
});
|
|
656
653
|
}
|
|
657
654
|
recordWakeIntent(input) {
|
|
@@ -662,11 +659,15 @@ export class QueueRepository {
|
|
|
662
659
|
const stampISO = new Date().toISOString();
|
|
663
660
|
const genUuid = this.resolveOccupantGeneration?.(input.fromSession) ?? undefined;
|
|
664
661
|
const frozenEnvelope = wrapPaneEnvelope(input.fromSession, input.toSession, input.bareBody, { stampISO, genUuid });
|
|
662
|
+
const admission = this.wakeAdmission(input.auditPointer, input.tags?.includes(WAKE_TRIGGER_OPENRIG_TAG) ? "openrig" : "agent");
|
|
663
|
+
// An urgent wake's frozen body carries the line naming who marked it, so a person reading it held sees it too; the
|
|
664
|
+
// transport won't add it a second time when it's delivered.
|
|
665
665
|
const record = {
|
|
666
666
|
outboxId: input.outboxId, senderSession: input.fromSession, destinationSession: input.toSession,
|
|
667
|
-
body: frozenEnvelope, tags: input.tags, auditPointer: input.auditPointer, identityProvenance: input.identityProvenance,
|
|
667
|
+
body: admission.urgentBy ? withUrgentLine(frozenEnvelope, admission.urgentBy) : frozenEnvelope, tags: input.tags, auditPointer: input.auditPointer, identityProvenance: input.identityProvenance,
|
|
668
|
+
...(admission.urgent ? { urgency: "urgent" } : {}),
|
|
668
669
|
};
|
|
669
|
-
const target = this.transport?.retentionTarget?.(input.toSession);
|
|
670
|
+
const target = this.transport?.retentionTarget?.(input.toSession, admission);
|
|
670
671
|
if (target)
|
|
671
672
|
this.outbox.retain(record, target);
|
|
672
673
|
else {
|
|
@@ -691,7 +692,7 @@ export class QueueRepository {
|
|
|
691
692
|
toSession: input.destinationSession,
|
|
692
693
|
identityProvenance: input.identityProvenance,
|
|
693
694
|
bareBody: `Blocker ${input.blockerQitemId} resolved; parked qitem ${input.qitemId} is pending. Resume the recorded continuation and update the row.`,
|
|
694
|
-
tags: [AUTO_UNPARK_WAKE_TAG, `${AUTO_UNPARK_BLOCKER_TAG_PREFIX}${input.blockerQitemId}`, `queue:return:${input.blockerQitemId}`],
|
|
695
|
+
tags: [AUTO_UNPARK_WAKE_TAG, WAKE_TRIGGER_OPENRIG_TAG, `${AUTO_UNPARK_BLOCKER_TAG_PREFIX}${input.blockerQitemId}`, `queue:return:${input.blockerQitemId}`],
|
|
695
696
|
});
|
|
696
697
|
}
|
|
697
698
|
deliverWakeIntentAfterCommit(outboxId) {
|
|
@@ -739,12 +740,12 @@ export class QueueRepository {
|
|
|
739
740
|
* hold is left alone; failed/uncertain history permits another attempt. A recovery
|
|
740
741
|
* pass tracks its coalesced members only in memory so each is attempted once per pass.
|
|
741
742
|
*/
|
|
742
|
-
async deliverWakeIntent(outboxId, attempted) {
|
|
743
|
+
async deliverWakeIntent(outboxId, attempted = new Set()) {
|
|
743
744
|
if (!this.outbox)
|
|
744
745
|
return "skipped";
|
|
745
746
|
if (!this.transport)
|
|
746
747
|
return "skipped"; // no transport → stays pending for a later drain
|
|
747
|
-
if (attempted
|
|
748
|
+
if (attempted.has(outboxId))
|
|
748
749
|
return "skipped";
|
|
749
750
|
const alreadyHeld = this.outbox.getById(outboxId);
|
|
750
751
|
if (alreadyHeld?.deliveryState === "retained" || alreadyHeld?.deliveryState === "retired") {
|
|
@@ -754,9 +755,9 @@ export class QueueRepository {
|
|
|
754
755
|
}
|
|
755
756
|
let recovering = false;
|
|
756
757
|
const claim = (entry) => {
|
|
757
|
-
if (attempted
|
|
758
|
+
if (attempted.has(entry.outboxId) || !this.outbox.claimForDelivery(entry.outboxId))
|
|
758
759
|
return false;
|
|
759
|
-
attempted
|
|
760
|
+
attempted.add(entry.outboxId);
|
|
760
761
|
recovering ||= entry.deliveryState !== "pending";
|
|
761
762
|
return true;
|
|
762
763
|
};
|
|
@@ -782,6 +783,16 @@ export class QueueRepository {
|
|
|
782
783
|
const first = candidate; // Keep each member's pre-claim uncertainty.
|
|
783
784
|
const intents = [first];
|
|
784
785
|
const correlation = first.tags?.find(tag => tag.startsWith("queue:return:"));
|
|
786
|
+
// Group by outcome at the seat's current level: each member is admitted with its own source and urgency, and only
|
|
787
|
+
// members with the first one's outcome (typed or held) go together. With no level (off, draft-aware), everything is
|
|
788
|
+
// admitted, so a returned result and its resume still go as one send. At a level, a routine wake never rides in on
|
|
789
|
+
// an urgent one, nor an urgent one under a routine one's hold; any other member waits for its own delivery.
|
|
790
|
+
const outcome = (entry) => {
|
|
791
|
+
const trigger = entry.tags?.includes(WAKE_TRIGGER_OPENRIG_TAG) ? "openrig" : "agent";
|
|
792
|
+
const admission = entry.auditPointer ? this.wakeAdmission(entry.auditPointer, trigger) : { source: trigger, urgent: false };
|
|
793
|
+
return this.transport?.retentionTarget?.(entry.destinationSession, { source: admission.source, urgent: admission.urgent }) ? "held" : "typed";
|
|
794
|
+
};
|
|
795
|
+
const firstOutcome = outcome(first);
|
|
785
796
|
if (correlation) {
|
|
786
797
|
const peers = this.db.prepare(`SELECT outbox_id FROM outbox_entries
|
|
787
798
|
WHERE delivery_state IN ('pending','failed','indeterminate') AND destination_session = ? AND substr(outbox_id, 1, ?) = ?
|
|
@@ -789,6 +800,8 @@ export class QueueRepository {
|
|
|
789
800
|
ORDER BY outbox_id`).all(first.destinationSession, WAKE_INTENT_PREFIX.length, WAKE_INTENT_PREFIX, correlation);
|
|
790
801
|
for (const peer of peers) {
|
|
791
802
|
const entry = this.outbox.getById(peer.outbox_id);
|
|
803
|
+
if (outcome(entry) !== firstOutcome)
|
|
804
|
+
continue;
|
|
792
805
|
if (actionable(entry) && claim(entry))
|
|
793
806
|
intents.push(entry);
|
|
794
807
|
}
|
|
@@ -809,9 +822,34 @@ export class QueueRepository {
|
|
|
809
822
|
const qitemId = intent.auditPointer ?? outboxId;
|
|
810
823
|
// Preserve the original envelope/source generation; add context without rewriting its stored bytes.
|
|
811
824
|
const recoveryNotice = recovering ? "Recovered queue notification: delivery may repeat after an earlier unconfirmed attempt.\n" : "";
|
|
812
|
-
|
|
825
|
+
// The group was formed on the first member's outcome, so its own source and urgency reach that same outcome at the
|
|
826
|
+
// send; the other members' bodies keep their own frozen urgent lines.
|
|
827
|
+
const trigger = group[0].tags?.includes(WAKE_TRIGGER_OPENRIG_TAG) ? "openrig" : "agent";
|
|
828
|
+
// The level can change while this send waits for the seat's lease. Under the lease, each member is admitted again with
|
|
829
|
+
// its own source and urgency; only those with the first member's outcome go with this send, and the others go back
|
|
830
|
+
// to their state before this claim (never marked delivered, held or failed) for their own delivery.
|
|
831
|
+
const released = [];
|
|
832
|
+
const recheckMembers = group.length < 2 ? undefined : (holds, held) => {
|
|
833
|
+
const keep = group.filter((entry, i) => {
|
|
834
|
+
if (i === 0)
|
|
835
|
+
return true;
|
|
836
|
+
const memberTrigger = entry.tags?.includes(WAKE_TRIGGER_OPENRIG_TAG) ? "openrig" : "agent";
|
|
837
|
+
const admission = this.wakeAdmission(entry.auditPointer, memberTrigger);
|
|
838
|
+
return holds({ source: admission.source, urgent: admission.urgent }) === held;
|
|
839
|
+
});
|
|
840
|
+
for (const entry of group) {
|
|
841
|
+
if (keep.includes(entry))
|
|
842
|
+
continue;
|
|
843
|
+
this.db.prepare("UPDATE outbox_entries SET delivery_state = ? WHERE outbox_id = ? AND delivery_state = 'sending'").run(entry.deliveryState, entry.outboxId);
|
|
844
|
+
released.push(entry);
|
|
845
|
+
}
|
|
846
|
+
return { text: recoveryNotice + keep.map(entry => entry.body).join("\n"), outboxIds: keep.map(entry => entry.outboxId) };
|
|
847
|
+
};
|
|
848
|
+
const outcome = await this.performWakeSend(qitemId, intent.destinationSession, intent.senderSession, undefined, recoveryNotice + group.map(entry => entry.body).join("\n"), group.map(entry => entry.outboxId), trigger, recheckMembers);
|
|
813
849
|
let reportedState = outcome.classified === "verified" ? "delivered" : outcome.classified;
|
|
814
850
|
for (const intent of group) {
|
|
851
|
+
if (released.includes(intent))
|
|
852
|
+
continue;
|
|
815
853
|
// A no-write retry cannot settle whether an earlier attempt landed.
|
|
816
854
|
const earlierUnknown = intent.deliveryState === "indeterminate" && outcome.classified === "failed";
|
|
817
855
|
const finalState = earlierUnknown ? "indeterminate" : outcome.classified === "verified" ? "delivered" : outcome.classified;
|
|
@@ -825,8 +863,7 @@ export class QueueRepository {
|
|
|
825
863
|
?.slice(AUTO_UNPARK_BLOCKER_TAG_PREFIX.length)
|
|
826
864
|
: undefined;
|
|
827
865
|
const wakeEvent = this.db.transaction(() => {
|
|
828
|
-
|
|
829
|
-
this.recordNudgeAttempt(qitemId, nudgeResult, outcome.inputBox);
|
|
866
|
+
this.recordNudgeAttempt(qitemId, nudgeResult);
|
|
830
867
|
this.outbox.finalizeDelivery(intent.outboxId, finalState);
|
|
831
868
|
if (!blockerRef)
|
|
832
869
|
return null;
|
|
@@ -859,6 +896,14 @@ export class QueueRepository {
|
|
|
859
896
|
if (wakeEvent)
|
|
860
897
|
this.eventBus.notifySubscribers(wakeEvent);
|
|
861
898
|
}
|
|
899
|
+
// Each released member is delivered on its own now, so this drain finishes only once every member has its outcome.
|
|
900
|
+
// One attempt per member for the whole pass: they inherit this pass's history, less themselves (released before any
|
|
901
|
+
// send, so never attempted), so nothing already sent here is regrouped, and each released member gets one attempt.
|
|
902
|
+
for (const entry of released)
|
|
903
|
+
attempted.delete(entry.outboxId);
|
|
904
|
+
for (const entry of released) {
|
|
905
|
+
await this.deliverWakeIntent(entry.outboxId, attempted).catch((err) => console.error(`Queue wake delivery failed for ${entry.outboxId}:`, err));
|
|
906
|
+
}
|
|
862
907
|
return reportedState;
|
|
863
908
|
}
|
|
864
909
|
/** Deliver after the queue transaction commits, never from inside it. The shared
|
|
@@ -941,13 +986,13 @@ export class QueueRepository {
|
|
|
941
986
|
* copies were deleted, refused at the seat boundary instead); this
|
|
942
987
|
* site holds no copy of its own.
|
|
943
988
|
*/
|
|
944
|
-
async maybeNudge(qitemId, destinationSession, nudgeOpt, sourceSession, bodyOverride) {
|
|
989
|
+
async maybeNudge(qitemId, destinationSession, nudgeOpt, sourceSession, bodyOverride, trigger = "agent") {
|
|
945
990
|
if (nudgeOpt === false)
|
|
946
991
|
return;
|
|
947
992
|
if (!this.transport)
|
|
948
993
|
return;
|
|
949
|
-
const outcome = await this.performWakeSend(qitemId, destinationSession, sourceSession, bodyOverride);
|
|
950
|
-
this.recordNudgeAttempt(qitemId, outcome.nudgeResult
|
|
994
|
+
const outcome = await this.performWakeSend(qitemId, destinationSession, sourceSession, bodyOverride, undefined, undefined, trigger);
|
|
995
|
+
this.recordNudgeAttempt(qitemId, outcome.nudgeResult);
|
|
951
996
|
}
|
|
952
997
|
/** The following startup intent drain owns durable pending wakes. Legacy packets
|
|
953
998
|
* and overdue claimed work (not eligible for that drain) still use the nudge path. */
|
|
@@ -955,7 +1000,8 @@ export class QueueRepository {
|
|
|
955
1000
|
const outboxId = `${WAKE_INTENT_PREFIX}${qitemId}`;
|
|
956
1001
|
if (this.outbox?.getById(outboxId) && this.getById(qitemId)?.state === "pending")
|
|
957
1002
|
return;
|
|
958
|
-
|
|
1003
|
+
// Boot recovery is OpenRig's own scheduling, whoever created the row.
|
|
1004
|
+
await this.maybeNudge(qitemId, destinationSession, undefined, sourceSession, undefined, "openrig");
|
|
959
1005
|
}
|
|
960
1006
|
/**
|
|
961
1007
|
* W1 (transactional closure): the shared wake-send CORE. Builds the pane
|
|
@@ -970,7 +1016,7 @@ export class QueueRepository {
|
|
|
970
1016
|
* (the "delivered-ack-pending" nudge literal). It is never promoted to
|
|
971
1017
|
* delivered nor demoted to failed.
|
|
972
1018
|
*/
|
|
973
|
-
async performWakeSend(qitemId, destinationSession, sourceSession, bodyOverride, prebuiltText, committedOutboxIds) {
|
|
1019
|
+
async performWakeSend(qitemId, destinationSession, sourceSession, bodyOverride, prebuiltText, committedOutboxIds, trigger = "agent", recheckMembers) {
|
|
974
1020
|
// DEFECT FIX qitem-20260827065907-b9ae334c (S1-class, 3 live specimens): a virtual
|
|
975
1021
|
// @external destination has NO pane — the queue row ITSELF is the gateway
|
|
976
1022
|
// subsystem's input (the Slack connector polls human-destined rows and its own
|
|
@@ -1000,6 +1046,16 @@ export class QueueRepository {
|
|
|
1000
1046
|
if (destClass.class === "unroutable") {
|
|
1001
1047
|
return { classified: "failed", nudgeResult: destClass.teaching };
|
|
1002
1048
|
}
|
|
1049
|
+
// A terminal seat runs a shell or a TUI, not an agent. Typed wake text would run there as a
|
|
1050
|
+
// command line (it carries the row's summary), and nothing there can claim the row. So nothing
|
|
1051
|
+
// is typed; the row stays queued and visible. `failed:` keeps it on the wake ladder, whose
|
|
1052
|
+
// retries come back here and type nothing before it escalates.
|
|
1053
|
+
if (isBoundTerminalSeat(this.db, destinationSession)) {
|
|
1054
|
+
return {
|
|
1055
|
+
classified: "failed",
|
|
1056
|
+
nudgeResult: `failed:terminal-seat: '${destinationSession}' is a terminal seat (runtime: terminal), not an agent, so no wake was typed into it and nothing there can claim this row. The row stays queued; route it to an agent seat.`,
|
|
1057
|
+
};
|
|
1058
|
+
}
|
|
1003
1059
|
const stampISO = new Date().toISOString();
|
|
1004
1060
|
let text;
|
|
1005
1061
|
if (prebuiltText !== undefined) {
|
|
@@ -1029,7 +1085,11 @@ export class QueueRepository {
|
|
|
1029
1085
|
text = held.body;
|
|
1030
1086
|
}
|
|
1031
1087
|
try {
|
|
1032
|
-
const
|
|
1088
|
+
const admission = this.wakeAdmission(qitemId, trigger);
|
|
1089
|
+
const res = await this.transport.send(destinationSession, text, { verify: true, stampISO, actorSession: sourceSession, committedOutboxIds,
|
|
1090
|
+
deliveryId: committedOutboxIds ? undefined : deliveryId, auditPointer: qitemId, queueWake: true,
|
|
1091
|
+
...(trigger === "openrig" ? { openrigNotice: true } : {}), ...(admission.urgentBy ? { urgent: { by: admission.urgentBy } } : {}),
|
|
1092
|
+
...(recheckMembers ? { recheckMembers } : {}) });
|
|
1033
1093
|
// OPR.0.3.2.21.FR-4(c) — wording rename: the prior literal
|
|
1034
1094
|
// "sent-unverified" read as a failure even in the common case
|
|
1035
1095
|
// (delivery confirmed but the synchronous ack window expired,
|
|
@@ -1052,6 +1112,30 @@ export class QueueRepository {
|
|
|
1052
1112
|
return { classified: "failed", nudgeResult: `failed:${msg}` };
|
|
1053
1113
|
}
|
|
1054
1114
|
}
|
|
1115
|
+
/** First committed return of a direct ask, including pre-shared-ID Slack replies. */
|
|
1116
|
+
getHumanAnswer(qitemId, actorSession) {
|
|
1117
|
+
const ask = this.getById(qitemId);
|
|
1118
|
+
if (!this.hasReplyToColumn || !ask || ask.destinationSession !== actorSession
|
|
1119
|
+
|| ask.humanIntent === "update" || !this.isPersonAddress(actorSession))
|
|
1120
|
+
return null;
|
|
1121
|
+
const row = this.db.prepare(`SELECT qitem_id FROM queue_items
|
|
1122
|
+
WHERE reply_to = ? AND source_session = ? AND destination_session = ?
|
|
1123
|
+
AND (EXISTS (SELECT 1 FROM json_each(queue_items.tags) WHERE value = 'human-answer')
|
|
1124
|
+
OR (qitem_id LIKE 'qitem-slack-inbound-%' AND COALESCE(summary, '') NOT LIKE '[Recovered after gap] %'))
|
|
1125
|
+
ORDER BY ts_created, rowid LIMIT 1`).get(qitemId, actorSession, ask.sourceSession);
|
|
1126
|
+
return row ? this.getById(row.qitem_id) : null;
|
|
1127
|
+
}
|
|
1128
|
+
/** The lookup and create's insert run synchronously before its first delivery await.
|
|
1129
|
+
* Every new surface uses the same ID; old IDs and their original bodies remain intact. */
|
|
1130
|
+
async createHumanAnswer(input) {
|
|
1131
|
+
const existing = this.getHumanAnswer(input.inboundReplyTo, input.sourceSession);
|
|
1132
|
+
if (existing)
|
|
1133
|
+
return existing;
|
|
1134
|
+
return this.create({ ...input,
|
|
1135
|
+
qitemId: `qitem-human-answer-${createHash("sha256").update(input.inboundReplyTo).digest("hex").slice(0, 20)}`,
|
|
1136
|
+
tags: [...new Set([...(input.tags ?? []), "human-answer"])],
|
|
1137
|
+
});
|
|
1138
|
+
}
|
|
1055
1139
|
async create(input) {
|
|
1056
1140
|
// FOUNDER ROOT INVARIANT (2026-08-27, supersedes 51-09 incr 4 / ruling cb19867f Q2):
|
|
1057
1141
|
// a LOCAL write stores the bare transport identity — no self-host suffix inside one
|
|
@@ -1068,7 +1152,7 @@ export class QueueRepository {
|
|
|
1068
1152
|
try {
|
|
1069
1153
|
// A savepoint removes any partial intent when staging fails, while
|
|
1070
1154
|
// preserving ordinary create's existing acceptance of the task.
|
|
1071
|
-
this.db.transaction(() => this.stageWakeIntent(created.qitemId, input.sourceSession, input.destinationSession, input.identityProvenance ?? null, input.nudge))();
|
|
1155
|
+
this.db.transaction(() => this.stageWakeIntent(created.qitemId, input.sourceSession, input.destinationSession, input.identityProvenance ?? null, input.nudge, input.wakeTrigger))();
|
|
1072
1156
|
wakeStaged = true;
|
|
1073
1157
|
}
|
|
1074
1158
|
catch (err) {
|
|
@@ -1129,7 +1213,7 @@ export class QueueRepository {
|
|
|
1129
1213
|
this.deliverWakeIntentAfterCommit(`${WAKE_INTENT_PREFIX}${id}`);
|
|
1130
1214
|
}
|
|
1131
1215
|
else {
|
|
1132
|
-
await this.maybeNudge(id, input.destinationSession, input.nudge, input.sourceSession);
|
|
1216
|
+
await this.maybeNudge(id, input.destinationSession, input.nudge, input.sourceSession, undefined, input.wakeTrigger);
|
|
1133
1217
|
}
|
|
1134
1218
|
return this.getByIdOrThrow(id);
|
|
1135
1219
|
}
|
|
@@ -1220,11 +1304,13 @@ export class QueueRepository {
|
|
|
1220
1304
|
throw new QueueRepositoryError("invalid_human_questions", "humanQuestions require the current queue schema; they were not saved.");
|
|
1221
1305
|
humanQuestions = parsed.questions;
|
|
1222
1306
|
}
|
|
1307
|
+
this.assertHumanAlert(input.humanAlert, input.destinationSession, input.humanIntent);
|
|
1223
1308
|
const id = input.qitemId ?? newQitemId();
|
|
1224
1309
|
const ts = new Date().toISOString();
|
|
1225
1310
|
const priority = input.priority ?? "routine";
|
|
1226
1311
|
const tier = input.tier ?? null;
|
|
1227
|
-
const
|
|
1312
|
+
const taggedAsk = withHumanAlertTag(input.tags, input.humanAlert);
|
|
1313
|
+
const tags = taggedAsk ? JSON.stringify(taggedAsk) : null;
|
|
1228
1314
|
const chain = input.chainOfRecord ? JSON.stringify(input.chainOfRecord) : null;
|
|
1229
1315
|
const expiresAt = input.expiresAt ?? null;
|
|
1230
1316
|
const targetRepo = input.targetRepo ?? null;
|
|
@@ -1264,6 +1350,7 @@ export class QueueRepository {
|
|
|
1264
1350
|
const notification = this.classifyOwnerNotification({
|
|
1265
1351
|
action: "create",
|
|
1266
1352
|
humanIntent: input.humanIntent,
|
|
1353
|
+
humanAlert: input.humanAlert,
|
|
1267
1354
|
destinationSession: input.destinationSession,
|
|
1268
1355
|
nextState: "pending",
|
|
1269
1356
|
});
|
|
@@ -1287,6 +1374,25 @@ export class QueueRepository {
|
|
|
1287
1374
|
});
|
|
1288
1375
|
return { qitemId: id, persistedEvent };
|
|
1289
1376
|
}
|
|
1377
|
+
/** humanAlert marks an ask to a person: a person by address or by the registry (a registered person may be addressed as
|
|
1378
|
+
* their seat), as the classifier reads it, and never an update. */
|
|
1379
|
+
assertHumanAlert(humanAlert, destination, humanIntent) {
|
|
1380
|
+
if (humanAlert != null && typeof humanAlert !== "boolean") {
|
|
1381
|
+
throw new QueueRepositoryError("invalid_human_notification", "humanAlert is true or false.");
|
|
1382
|
+
}
|
|
1383
|
+
if (humanAlert !== true)
|
|
1384
|
+
return;
|
|
1385
|
+
if (!this.isPersonAddress(destination) || humanIntent === "update") {
|
|
1386
|
+
throw new QueueRepositoryError("invalid_human_notification", "humanAlert marks an ask to a person as alert-worthy: it needs a human destination, and an update isn't an ask.");
|
|
1387
|
+
}
|
|
1388
|
+
}
|
|
1389
|
+
/** A person by address or by the registry: a registered person may be addressed as their seat or an alias. */
|
|
1390
|
+
isPersonAddress(destination) {
|
|
1391
|
+
if (isHumanSeatSessionRef(destination))
|
|
1392
|
+
return true;
|
|
1393
|
+
const registry = this.loadHumanRegistryFn();
|
|
1394
|
+
return registry.ok && resolveRegisteredHumanAddress(destination, registry.entities) !== null;
|
|
1395
|
+
}
|
|
1290
1396
|
validateReplyTo(replyTo, humanIntent) {
|
|
1291
1397
|
if (humanIntent !== "update") {
|
|
1292
1398
|
throw new QueueRepositoryError("reply_to_requires_update", "replyTo is accepted only with humanIntent update; a decision keeps its own thread so its reply stays unambiguous.");
|
|
@@ -1314,12 +1420,14 @@ export class QueueRepository {
|
|
|
1314
1420
|
if (!this.validateRig(input.toSession)) {
|
|
1315
1421
|
throw destinationValidationError("to_session", input.toSession, this.loadHumanRegistryFn);
|
|
1316
1422
|
}
|
|
1423
|
+
this.assertHumanAlert(input.humanAlert, input.toSession);
|
|
1317
1424
|
const newId = newQitemId();
|
|
1318
1425
|
const ts = new Date().toISOString();
|
|
1319
1426
|
const body = input.body ?? source.body;
|
|
1320
1427
|
const priority = input.priority ?? source.priority;
|
|
1321
1428
|
const tier = input.tier ?? source.tier;
|
|
1322
|
-
const
|
|
1429
|
+
const handedTags = withHumanAlertTag(input.tags ?? source.tags, input.humanAlert);
|
|
1430
|
+
const tags = handedTags ? JSON.stringify(handedTags) : null;
|
|
1323
1431
|
const chain = JSON.stringify([...(source.chainOfRecord ?? []), source.qitemId]);
|
|
1324
1432
|
const targetRepo = input.targetRepo === undefined ? source.targetRepo : input.targetRepo;
|
|
1325
1433
|
// OPR.0.4.4.19 FR-4/FR-5 — the handoff authors a NEW qitem; when that
|
|
@@ -1382,6 +1490,7 @@ export class QueueRepository {
|
|
|
1382
1490
|
const successorNotification = this.classifyOwnerNotification({
|
|
1383
1491
|
action: "create",
|
|
1384
1492
|
destinationSession: input.toSession,
|
|
1493
|
+
humanAlert: input.humanAlert,
|
|
1385
1494
|
nextState: "pending",
|
|
1386
1495
|
});
|
|
1387
1496
|
this.transitionLog.append({
|
|
@@ -1463,12 +1572,14 @@ export class QueueRepository {
|
|
|
1463
1572
|
if (!this.validateRig(input.toSession)) {
|
|
1464
1573
|
throw destinationValidationError("to_session", input.toSession, this.loadHumanRegistryFn);
|
|
1465
1574
|
}
|
|
1575
|
+
this.assertHumanAlert(input.humanAlert, input.toSession);
|
|
1466
1576
|
const newId = newQitemId();
|
|
1467
1577
|
const ts = new Date().toISOString();
|
|
1468
1578
|
const body = input.body ?? source.body;
|
|
1469
1579
|
const priority = input.priority ?? source.priority;
|
|
1470
1580
|
const tier = input.tier ?? source.tier;
|
|
1471
|
-
const
|
|
1581
|
+
const handedTags = withHumanAlertTag(input.tags ?? source.tags, input.humanAlert);
|
|
1582
|
+
const tags = handedTags ? JSON.stringify(handedTags) : null;
|
|
1472
1583
|
const chain = JSON.stringify([...(source.chainOfRecord ?? []), source.qitemId]);
|
|
1473
1584
|
const targetRepo = input.targetRepo === undefined ? source.targetRepo : input.targetRepo;
|
|
1474
1585
|
// OPR.0.4.4.19 FR-4/FR-5 — same new-item enforcement as handoff().
|
|
@@ -1528,6 +1639,7 @@ export class QueueRepository {
|
|
|
1528
1639
|
const successorNotification = this.classifyOwnerNotification({
|
|
1529
1640
|
action: "create",
|
|
1530
1641
|
destinationSession: input.toSession,
|
|
1642
|
+
humanAlert: input.humanAlert,
|
|
1531
1643
|
nextState: "pending",
|
|
1532
1644
|
});
|
|
1533
1645
|
this.transitionLog.append({
|
|
@@ -2065,6 +2177,8 @@ export class QueueRepository {
|
|
|
2065
2177
|
throw new QueueRepositoryError("invalid_human_notification", "An informational delivery cannot become a human approval park; author a separate decision request.");
|
|
2066
2178
|
}
|
|
2067
2179
|
const isHumanPark = input.state === "blocked" && isHumanSeatSession(effectiveBlockedOn);
|
|
2180
|
+
// A done close can also store the artifact the work produced, so the finished row carries its link.
|
|
2181
|
+
const isDoneClose = input.state === "done";
|
|
2068
2182
|
// OPR.0.5.1 slice-51-06 D2 — summary/evidence_ref are persist-able ONLY at a human-seat park
|
|
2069
2183
|
// (see the FR-6 note below). Silently ignoring them on any other transition is a data-loss trap
|
|
2070
2184
|
// (the operator believes the metadata was saved). HARD-REJECT before ANY UPDATE/log/event so the
|
|
@@ -2074,11 +2188,14 @@ export class QueueRepository {
|
|
|
2074
2188
|
const invalidFields = [];
|
|
2075
2189
|
if (input.summary != null)
|
|
2076
2190
|
invalidFields.push("summary");
|
|
2077
|
-
if (input.evidenceRef != null)
|
|
2191
|
+
if (input.evidenceRef != null && !isDoneClose)
|
|
2078
2192
|
invalidFields.push("evidenceRef");
|
|
2079
2193
|
if (invalidFields.length > 0) {
|
|
2080
2194
|
const flags = invalidFields.map((f) => (f === "summary" ? "--summary" : "--evidence-ref")).join(" / ");
|
|
2081
|
-
|
|
2195
|
+
const where = invalidFields.map((f) => f === "summary"
|
|
2196
|
+
? "summary persists on a human-seat park, or on its own (rig queue update <id> --summary … with no --state)"
|
|
2197
|
+
: "evidenceRef persists on a human-seat park or a done close").join("; ");
|
|
2198
|
+
throw new QueueRepositoryError("summary_evidence_not_persistable", `${where}; the '${input.state}' transition cannot store ${invalidFields.length > 1 ? "them" : "it"}. Remove ${flags}, or use one of those.`, { invalidFields });
|
|
2082
2199
|
}
|
|
2083
2200
|
}
|
|
2084
2201
|
// SWEEP-a (shape f2576102) — closure/blocked-field COHERENCE, beside the reference
|
|
@@ -2246,11 +2363,14 @@ export class QueueRepository {
|
|
|
2246
2363
|
.run(input.state, ts, validation.closureReason, validation.closureTarget, input.handedOffTo ?? null, nextBlockedOn, nextResolution, input.qitemId);
|
|
2247
2364
|
// FR-6: park-time summary/evidence_ref are PERSISTED onto the existing
|
|
2248
2365
|
// item (not merely validated-then-dropped) — visible to the attention
|
|
2249
|
-
// query and to Packet 2.
|
|
2366
|
+
// query and to Packet 2. A done close writes evidence_ref the same way.
|
|
2250
2367
|
if (isHumanPark) {
|
|
2251
2368
|
this.persistSummary(input.qitemId, input.summary ?? null);
|
|
2252
2369
|
this.persistEvidenceRef(input.qitemId, input.evidenceRef ?? null);
|
|
2253
2370
|
}
|
|
2371
|
+
else if (isDoneClose) {
|
|
2372
|
+
this.persistEvidenceRef(input.qitemId, input.evidenceRef ?? null);
|
|
2373
|
+
}
|
|
2254
2374
|
const transition = this.transitionLog.append({
|
|
2255
2375
|
qitemId: input.qitemId,
|
|
2256
2376
|
state: input.state,
|
|
@@ -2603,7 +2723,7 @@ export class QueueRepository {
|
|
|
2603
2723
|
const item = this.getById(input.qitemId);
|
|
2604
2724
|
if (item?.state !== "pending" || item.humanIntent === "update"
|
|
2605
2725
|
|| item.destinationSession !== input.actorSession
|
|
2606
|
-
||
|
|
2726
|
+
|| !this.isPersonAddress(item.destinationSession))
|
|
2607
2727
|
return null;
|
|
2608
2728
|
const text = input.decision.trim();
|
|
2609
2729
|
const unanswered = this.hasHumanQuestionsColumn && text && text !== "[file reply]"
|
|
@@ -2886,6 +3006,7 @@ export class QueueRepository {
|
|
|
2886
3006
|
conditions.push("target_repo = ?");
|
|
2887
3007
|
params.push(opts.targetRepo);
|
|
2888
3008
|
}
|
|
3009
|
+
pushFollowThroughFilters(opts, conditions, params);
|
|
2889
3010
|
const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
|
|
2890
3011
|
const columns = opts?.compact ? this.compactColumns() : "*";
|
|
2891
3012
|
const useActiveFirst = !!(opts?.rig || opts?.asSession || opts?.activeOnly);
|
|
@@ -2992,11 +3113,22 @@ export class QueueRepository {
|
|
|
2992
3113
|
// clause: a qitem parked as state=blocked on a HUMAN-seat blocker is a
|
|
2993
3114
|
// decision the human owes. Blocking on another qitem (today's shipped
|
|
2994
3115
|
// usage) does NOT match — is_human_seat_session rejects qitem ids.
|
|
3116
|
+
// An ask to a person lands here by its classification (isCurrentHumanAsk), alerted or not, so one to a registered
|
|
3117
|
+
// person addressed as a seat or an alias is on Steering too; a reroute ends that.
|
|
3118
|
+
const quietAsk = this.hasOwnerNotificationColumns ? `
|
|
3119
|
+
OR EXISTS (SELECT 1 FROM queue_transitions ask
|
|
3120
|
+
WHERE ask.qitem_id = queue_items.qitem_id AND ask.state = 'pending'
|
|
3121
|
+
AND ask.owner_notification_kind = 'human-required'
|
|
3122
|
+
AND ask.transition_id = (SELECT MAX(latest.transition_id) FROM queue_transitions latest
|
|
3123
|
+
WHERE latest.qitem_id = queue_items.qitem_id AND latest.owner_notification_level IS NOT NULL
|
|
3124
|
+
AND latest.owner_notification_kind <> 'human-decision-resolved')
|
|
3125
|
+
AND NOT EXISTS (SELECT 1 FROM queue_transitions moved WHERE moved.qitem_id = ask.qitem_id
|
|
3126
|
+
AND moved.transition_id > ask.transition_id AND moved.transition_note LIKE 'fallback-routed:%'))` : "";
|
|
2995
3127
|
const conditions = [
|
|
2996
3128
|
`state IN (${statePlaceholders})`,
|
|
2997
3129
|
`(
|
|
2998
3130
|
is_human_seat_session(destination_session) = 1
|
|
2999
|
-
OR (state = 'blocked' AND is_human_seat_session(blocked_on) = 1)
|
|
3131
|
+
OR (state = 'blocked' AND is_human_seat_session(blocked_on) = 1)${quietAsk}
|
|
3000
3132
|
)`,
|
|
3001
3133
|
];
|
|
3002
3134
|
if (this.hasHumanIntentColumn)
|
|
@@ -3016,6 +3148,7 @@ export class QueueRepository {
|
|
|
3016
3148
|
conditions.push("target_repo = ?");
|
|
3017
3149
|
params.push(opts.targetRepo);
|
|
3018
3150
|
}
|
|
3151
|
+
pushFollowThroughFilters(opts, conditions, params);
|
|
3019
3152
|
params.push(limit);
|
|
3020
3153
|
const sql = `
|
|
3021
3154
|
SELECT * FROM queue_items
|
|
@@ -3264,8 +3397,11 @@ export class QueueRepository {
|
|
|
3264
3397
|
: item.state === "blocked"
|
|
3265
3398
|
? resolveRegisteredHumanAddress(item.blockedOn, registry.entities)
|
|
3266
3399
|
: resolveRegisteredHumanAddress(item.destinationSession, registry.entities);
|
|
3400
|
+
// An ask placed on Steering without an alert (RECORD) owes no post: its ledger reports a real receipt (a posting
|
|
3401
|
+
// dial set to RECORD posts it) and never a missing one.
|
|
3267
3402
|
return humanAddress
|
|
3268
|
-
? { notificationKey: `${item.qitemId}:${transition.transitionId}`, startedAt: transition.ts
|
|
3403
|
+
? { notificationKey: `${item.qitemId}:${transition.transitionId}`, startedAt: transition.ts,
|
|
3404
|
+
...(transition.ownerNotificationLevel === "RECORD" ? { quiet: true } : {}) }
|
|
3269
3405
|
: "inactive";
|
|
3270
3406
|
}
|
|
3271
3407
|
/** OPR.0.5.6.14 — derive the current episode's delivery ledger. Receipt
|
|
@@ -3283,21 +3419,46 @@ export class QueueRepository {
|
|
|
3283
3419
|
humanNotificationPostedThisEpisode(qitemId, listed) {
|
|
3284
3420
|
if (!this.hasQueueTransitionsTable)
|
|
3285
3421
|
return false;
|
|
3286
|
-
// Only the ask's own notification binds a recipient: create writes it in state pending, to the destination of
|
|
3287
|
-
// that moment. A park notice (its recipient is not retained), a resolution notice, or a later destination change
|
|
3288
|
-
// (routeToFallback opens no new episode) cannot establish that the current destination received this ask.
|
|
3289
3422
|
const owners = listed?.owners ?? this.transitionLog.ownerNotificationsForQitems([qitemId]).get(qitemId) ?? [];
|
|
3423
|
+
const owner = this.currentAskNotification(qitemId, owners);
|
|
3424
|
+
if (!owner)
|
|
3425
|
+
return false;
|
|
3426
|
+
// The ledger's episode exists only when the destination resolves to a registered human (aliases included).
|
|
3427
|
+
const ledger = listed ? listed.ledger : this.deliveryLedger(qitemId, owners);
|
|
3428
|
+
return ledger !== null && ledger.outcome === "posted" && ledger.episode?.notificationKey === `${qitemId}:${owner.transitionId}`;
|
|
3429
|
+
}
|
|
3430
|
+
/** The ask's own notification while it still binds its recipient. Only that notification does: create writes it in
|
|
3431
|
+
* state pending, to the destination of that moment. A park notice (its recipient is not retained), a resolution notice,
|
|
3432
|
+
* or a later destination change (routeToFallback opens no new episode) can't establish who has the ask now. */
|
|
3433
|
+
currentAskNotification(qitemId, owners) {
|
|
3290
3434
|
const owner = owners[0];
|
|
3291
3435
|
if (!owner || owner.state !== "pending")
|
|
3292
|
-
return
|
|
3436
|
+
return null;
|
|
3293
3437
|
if (owner.ownerNotificationKind !== "human-required" && owner.ownerNotificationKind !== "human-update")
|
|
3294
|
-
return
|
|
3438
|
+
return null;
|
|
3295
3439
|
const rerouted = this.db.prepare("SELECT 1 FROM queue_transitions WHERE qitem_id = ? AND transition_id > ? AND transition_note LIKE 'fallback-routed:%' LIMIT 1").get(qitemId, owner.transitionId);
|
|
3296
|
-
|
|
3440
|
+
return rerouted ? null : owner;
|
|
3441
|
+
}
|
|
3442
|
+
/** True when this row is an ask to a person that's still theirs: its own create-time human-required notification, at
|
|
3443
|
+
* any level, not rerouted since. Every attention reader (listAttention, the list route, the Feed) uses this one
|
|
3444
|
+
* membership, whatever happened to its Slack post. */
|
|
3445
|
+
isCurrentHumanAsk(qitemId, listed) {
|
|
3446
|
+
if (!this.hasQueueTransitionsTable)
|
|
3297
3447
|
return false;
|
|
3298
|
-
|
|
3299
|
-
|
|
3300
|
-
|
|
3448
|
+
const owners = listed?.owners ?? this.transitionLog.ownerNotificationsForQitems([qitemId]).get(qitemId) ?? [];
|
|
3449
|
+
return this.currentAskNotification(qitemId, owners)?.ownerNotificationKind === "human-required";
|
|
3450
|
+
}
|
|
3451
|
+
/** True when this row's current ask was placed on Steering without a Slack alert (human-required at RECORD) and is still
|
|
3452
|
+
* with that person (not rerouted): it waits on them there by design, like a posted ask, so it isn't stuck and nothing
|
|
3453
|
+
* re-offers it. */
|
|
3454
|
+
humanAskWithoutAlert(qitemId, listed) {
|
|
3455
|
+
if (!this.hasQueueTransitionsTable)
|
|
3456
|
+
return false;
|
|
3457
|
+
const owners = listed?.owners ?? this.transitionLog.ownerNotificationsForQitems([qitemId]).get(qitemId) ?? [];
|
|
3458
|
+
const owner = this.currentAskNotification(qitemId, owners);
|
|
3459
|
+
// Slack never posts a quiet ask; one that was posted anyway is a posted ask, reported by its receipt.
|
|
3460
|
+
return owner?.ownerNotificationKind === "human-required" && owner.ownerNotificationLevel === "RECORD"
|
|
3461
|
+
&& !this.humanNotificationPostedThisEpisode(qitemId, listed);
|
|
3301
3462
|
}
|
|
3302
3463
|
/** owners: the row's owner notifications as ownerNotificationsForQitems gives them, when the caller read them. */
|
|
3303
3464
|
deliveryLedger(qitemId, owners) {
|
|
@@ -3369,6 +3530,8 @@ export class QueueRepository {
|
|
|
3369
3530
|
const failed = currentNotes.find((note) => note.startsWith("slack-owner-notification-transport-failed "));
|
|
3370
3531
|
if (failed)
|
|
3371
3532
|
return { outcome: "transport-failed", detail: failed, episode };
|
|
3533
|
+
if (episode?.quiet)
|
|
3534
|
+
return null;
|
|
3372
3535
|
const startedAt = episode?.startedAt ?? item.tsCreated;
|
|
3373
3536
|
const gatewayRouted = episode !== null || item.lastNudgeResult?.startsWith("gateway-owned") === true;
|
|
3374
3537
|
if (gatewayRouted) {
|
|
@@ -3383,22 +3546,9 @@ export class QueueRepository {
|
|
|
3383
3546
|
/** The grace window before a receiptless gateway-routed row honestly reads
|
|
3384
3547
|
* never-posted (the connector sweep cadence bounds normal posting latency). */
|
|
3385
3548
|
static NEVER_POSTED_WINDOW_MS = 120_000;
|
|
3386
|
-
/**
|
|
3387
|
-
|
|
3388
|
-
* transport returned one. It is written with the attempt every time, so an attempt without a
|
|
3389
|
-
* reading clears an earlier attempt's reading rather than leaving it to read as current.
|
|
3390
|
-
*/
|
|
3391
|
-
recordNudgeAttempt(qitemId, result, inputBox) {
|
|
3549
|
+
/** Record one wake attempt. */
|
|
3550
|
+
recordNudgeAttempt(qitemId, result) {
|
|
3392
3551
|
const ts = new Date().toISOString();
|
|
3393
|
-
if (this.hasNudgeInputBoxColumn) {
|
|
3394
|
-
const reading = inputBoxReading(inputBox);
|
|
3395
|
-
this.db
|
|
3396
|
-
.prepare(`UPDATE queue_items
|
|
3397
|
-
SET last_nudge_attempt = ?, last_nudge_result = ?, last_nudge_input_box = ?
|
|
3398
|
-
WHERE qitem_id = ?`)
|
|
3399
|
-
.run(ts, result, reading ? JSON.stringify({ ...reading, at: ts }) : null, qitemId);
|
|
3400
|
-
return;
|
|
3401
|
-
}
|
|
3402
3552
|
this.db
|
|
3403
3553
|
.prepare(`UPDATE queue_items
|
|
3404
3554
|
SET last_nudge_attempt = ?, last_nudge_result = ?
|
|
@@ -3618,9 +3768,13 @@ export class QueueRepository {
|
|
|
3618
3768
|
if (view && ["pending", "in-progress"].includes(view.state)) {
|
|
3619
3769
|
// #514 — the unclaimed sweep skips a pending ask already posted to its human in the current
|
|
3620
3770
|
// episode (same predicate as runStuckSweep), so the view must not promise that sweep.
|
|
3621
|
-
const
|
|
3771
|
+
const posted = view.state === "pending" && this.humanNotificationPostedThisEpisode(qitemId, listed);
|
|
3772
|
+
const onSteering = !posted && view.state === "pending" && this.humanAskWithoutAlert(qitemId, listed);
|
|
3773
|
+
const awaitingHuman = posted || onSteering;
|
|
3622
3774
|
if (awaitingHuman) {
|
|
3623
|
-
view.nextBackstop = { owner: view.owner, mechanism:
|
|
3775
|
+
view.nextBackstop = { owner: view.owner, mechanism: onSteering
|
|
3776
|
+
? "none (on Steering for the human, with no Slack alert; awaiting their decision)"
|
|
3777
|
+
: "none (posted to the human; awaiting their decision)", dueAt: null, intervalSeconds: null };
|
|
3624
3778
|
}
|
|
3625
3779
|
// Quiet hours: a held ask is owned by its window's release job until it posts.
|
|
3626
3780
|
const quiet = awaitingHuman ? null : quietCustodyBackstop(view.owner, quietHoldCustody(this.db, qitemId));
|
|
@@ -3634,6 +3788,13 @@ export class QueueRepository {
|
|
|
3634
3788
|
view.laterBackstop = { ...view.nextBackstop, note: "Conditional safety net; current delivery/recovery ownership is evaluated first." };
|
|
3635
3789
|
view.nextBackstop = recovery;
|
|
3636
3790
|
}
|
|
3791
|
+
else if (!awaitingHuman && view.state === "pending" && this.db.prepare("SELECT last_nudge_result FROM queue_items WHERE qitem_id = ?")
|
|
3792
|
+
.get(qitemId)?.last_nudge_result === "retained:typing_guard") {
|
|
3793
|
+
// Held at the seat on purpose: not stuck, and not picked up. Nothing replays it; reading or delivering it is a
|
|
3794
|
+
// deliberate step.
|
|
3795
|
+
view.nextBackstop = { owner: view.owner, mechanism: "held by the seat's typing guard", dueAt: null, intervalSeconds: null, held: true,
|
|
3796
|
+
note: `Nothing was typed into ${view.owner}. Read it with rig seat held-messages ${view.owner}; changing the seat's level doesn't replay it.` };
|
|
3797
|
+
}
|
|
3637
3798
|
}
|
|
3638
3799
|
if (view?.state === "blocked") {
|
|
3639
3800
|
// A row parked on a person carries that person's notification, which quiet hours can hold. Its quiet custody is the
|
|
@@ -3684,6 +3845,7 @@ export class QueueRepository {
|
|
|
3684
3845
|
lastMeaningfulAt: meaningful?.at,
|
|
3685
3846
|
activity: activity?.activity,
|
|
3686
3847
|
needsInput: activity?.needsInput.count,
|
|
3848
|
+
needsInputReason: activity?.needsInput.reason,
|
|
3687
3849
|
claimedAt: row.claimed_at,
|
|
3688
3850
|
lastHeartbeat: row.last_heartbeat,
|
|
3689
3851
|
postClaimMotionCount: 0, // this reader supplies the current meaningful timestamp
|
|
@@ -3727,8 +3889,6 @@ export class QueueRepository {
|
|
|
3727
3889
|
lastNudgeAttempt: row.last_nudge_attempt,
|
|
3728
3890
|
lastNudgeResult: presentedNudgeResult(row.last_nudge_result, row.claimed_at),
|
|
3729
3891
|
lastNudgeWireResult: row.last_nudge_result,
|
|
3730
|
-
// #1278: absent before migration 116 and on compact rows (elided there), so null.
|
|
3731
|
-
lastNudgeInputBox: parseNudgeInputBox(row.last_nudge_input_box, row.last_nudge_attempt),
|
|
3732
3892
|
lastHeartbeat: row.last_heartbeat,
|
|
3733
3893
|
resolution: row.resolution,
|
|
3734
3894
|
// PL-007: target_repo present only when migration 038 has applied;
|