@openrig/cli 0.3.1 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/daemon/assets/plugins/openrig-core/skills/forming-an-openrig-mental-model/SKILL.md +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +2 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts +36 -0
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +66 -0
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/db/migrations/037_mission_control_actions.d.ts +5 -1
- package/daemon/dist/db/migrations/037_mission_control_actions.d.ts.map +1 -1
- package/daemon/dist/db/migrations/037_mission_control_actions.js +5 -1
- package/daemon/dist/db/migrations/037_mission_control_actions.js.map +1 -1
- package/daemon/dist/db/migrations/041_rig_policy.d.ts +32 -0
- package/daemon/dist/db/migrations/041_rig_policy.d.ts.map +1 -0
- package/daemon/dist/db/migrations/041_rig_policy.js +47 -0
- package/daemon/dist/db/migrations/041_rig_policy.js.map +1 -0
- package/daemon/dist/domain/agent-images/resume-token-discovery.js +1 -1
- package/daemon/dist/domain/agent-images/resume-token-discovery.js.map +1 -1
- package/daemon/dist/domain/agent-images/snapshot-capturer.d.ts.map +1 -1
- package/daemon/dist/domain/agent-images/snapshot-capturer.js +2 -1
- package/daemon/dist/domain/agent-images/snapshot-capturer.js.map +1 -1
- package/daemon/dist/domain/agent-manifest.js +27 -0
- package/daemon/dist/domain/agent-manifest.js.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/bootstrap-orchestrator.js +86 -6
- package/daemon/dist/domain/bootstrap-orchestrator.js.map +1 -1
- package/daemon/dist/domain/bundle-agent-images-router.d.ts +95 -0
- package/daemon/dist/domain/bundle-agent-images-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-agent-images-router.js +140 -0
- package/daemon/dist/domain/bundle-agent-images-router.js.map +1 -0
- package/daemon/dist/domain/bundle-assembler.d.ts +18 -1
- package/daemon/dist/domain/bundle-assembler.d.ts.map +1 -1
- package/daemon/dist/domain/bundle-assembler.js +11 -1
- package/daemon/dist/domain/bundle-assembler.js.map +1 -1
- package/daemon/dist/domain/bundle-audit.d.ts +89 -0
- package/daemon/dist/domain/bundle-audit.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-audit.js +87 -0
- package/daemon/dist/domain/bundle-audit.js.map +1 -0
- package/daemon/dist/domain/bundle-conflict-detector.d.ts +57 -0
- package/daemon/dist/domain/bundle-conflict-detector.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-conflict-detector.js +49 -0
- package/daemon/dist/domain/bundle-conflict-detector.js.map +1 -0
- package/daemon/dist/domain/bundle-context-packs-router.d.ts +100 -0
- package/daemon/dist/domain/bundle-context-packs-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-context-packs-router.js +158 -0
- package/daemon/dist/domain/bundle-context-packs-router.js.map +1 -0
- package/daemon/dist/domain/bundle-plugins-router.d.ts +69 -0
- package/daemon/dist/domain/bundle-plugins-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-plugins-router.js +87 -0
- package/daemon/dist/domain/bundle-plugins-router.js.map +1 -0
- package/daemon/dist/domain/bundle-skills-router.d.ts +62 -0
- package/daemon/dist/domain/bundle-skills-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-skills-router.js +90 -0
- package/daemon/dist/domain/bundle-skills-router.js.map +1 -0
- package/daemon/dist/domain/bundle-types.d.ts +106 -0
- package/daemon/dist/domain/bundle-types.d.ts.map +1 -1
- package/daemon/dist/domain/bundle-types.js +375 -0
- package/daemon/dist/domain/bundle-types.js.map +1 -1
- package/daemon/dist/domain/bundle-workflow-specs-router.d.ts +94 -0
- package/daemon/dist/domain/bundle-workflow-specs-router.d.ts.map +1 -0
- package/daemon/dist/domain/bundle-workflow-specs-router.js +144 -0
- package/daemon/dist/domain/bundle-workflow-specs-router.js.map +1 -0
- package/daemon/dist/domain/context-monitor.d.ts +5 -1
- package/daemon/dist/domain/context-monitor.d.ts.map +1 -1
- package/daemon/dist/domain/context-monitor.js +28 -15
- package/daemon/dist/domain/context-monitor.js.map +1 -1
- package/daemon/dist/domain/graph-projection.d.ts +6 -0
- package/daemon/dist/domain/graph-projection.d.ts.map +1 -1
- package/daemon/dist/domain/graph-projection.js +6 -0
- package/daemon/dist/domain/graph-projection.js.map +1 -1
- package/daemon/dist/domain/native-resume-probe.js +7 -7
- package/daemon/dist/domain/native-resume-probe.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts +18 -0
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +98 -0
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/node-launcher.d.ts +12 -0
- package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/node-launcher.js +25 -1
- package/daemon/dist/domain/node-launcher.js.map +1 -1
- package/daemon/dist/domain/pod-bundle-assembler.d.ts +16 -1
- package/daemon/dist/domain/pod-bundle-assembler.d.ts.map +1 -1
- package/daemon/dist/domain/pod-bundle-assembler.js +11 -1
- package/daemon/dist/domain/pod-bundle-assembler.js.map +1 -1
- package/daemon/dist/domain/profile-resolver.d.ts +10 -0
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js +4 -0
- package/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/daemon/dist/domain/ps-projection.d.ts +22 -0
- package/daemon/dist/domain/ps-projection.d.ts.map +1 -1
- package/daemon/dist/domain/ps-projection.js +57 -0
- package/daemon/dist/domain/ps-projection.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +37 -1
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +99 -2
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/restore-check-service.d.ts +4 -0
- package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
- package/daemon/dist/domain/restore-check-service.js +16 -7
- package/daemon/dist/domain/restore-check-service.js.map +1 -1
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.d.ts +48 -0
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.d.ts.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.js +96 -0
- package/daemon/dist/domain/rig-policy/rig-policy-defaults.js.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-store.d.ts +46 -0
- package/daemon/dist/domain/rig-policy/rig-policy-store.d.ts.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-store.js +171 -0
- package/daemon/dist/domain/rig-policy/rig-policy-store.js.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-types.d.ts +145 -0
- package/daemon/dist/domain/rig-policy/rig-policy-types.d.ts.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-types.js +52 -0
- package/daemon/dist/domain/rig-policy/rig-policy-types.js.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-validator.d.ts +58 -0
- package/daemon/dist/domain/rig-policy/rig-policy-validator.d.ts.map +1 -0
- package/daemon/dist/domain/rig-policy/rig-policy-validator.js +211 -0
- package/daemon/dist/domain/rig-policy/rig-policy-validator.js.map +1 -0
- package/daemon/dist/domain/rigspec-instantiator.d.ts +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +109 -18
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/seat-activity-service.d.ts +79 -0
- package/daemon/dist/domain/seat-activity-service.d.ts.map +1 -0
- package/daemon/dist/domain/seat-activity-service.js +123 -0
- package/daemon/dist/domain/seat-activity-service.js.map +1 -0
- package/daemon/dist/domain/slices/slice-indexer.d.ts +12 -0
- package/daemon/dist/domain/slices/slice-indexer.d.ts.map +1 -1
- package/daemon/dist/domain/slices/slice-indexer.js +23 -0
- package/daemon/dist/domain/slices/slice-indexer.js.map +1 -1
- package/daemon/dist/domain/spec-library-service.d.ts.map +1 -1
- package/daemon/dist/domain/spec-library-service.js +19 -0
- package/daemon/dist/domain/spec-library-service.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +79 -3
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.d.ts +22 -0
- package/daemon/dist/domain/workflow-spec-cache.d.ts.map +1 -1
- package/daemon/dist/domain/workflow-spec-cache.js +37 -0
- package/daemon/dist/domain/workflow-spec-cache.js.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts +7 -0
- package/daemon/dist/domain/workspace/default-workspace-scaffold.d.ts.map +1 -1
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js +156 -3
- package/daemon/dist/domain/workspace/default-workspace-scaffold.js.map +1 -1
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts +197 -0
- package/daemon/dist/domain/workspace/workspace-doctor.d.ts.map +1 -0
- package/daemon/dist/domain/workspace/workspace-doctor.js +448 -0
- package/daemon/dist/domain/workspace/workspace-doctor.js.map +1 -0
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +11 -0
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/routes/bundles.d.ts.map +1 -1
- package/daemon/dist/routes/bundles.js +966 -7
- package/daemon/dist/routes/bundles.js.map +1 -1
- package/daemon/dist/routes/config.d.ts.map +1 -1
- package/daemon/dist/routes/config.js +19 -2
- package/daemon/dist/routes/config.js.map +1 -1
- package/daemon/dist/routes/info.d.ts +3 -0
- package/daemon/dist/routes/info.d.ts.map +1 -0
- package/daemon/dist/routes/info.js +20 -0
- package/daemon/dist/routes/info.js.map +1 -0
- package/daemon/dist/routes/queue.d.ts +18 -0
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +97 -5
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/rig-policy.d.ts +9 -0
- package/daemon/dist/routes/rig-policy.d.ts.map +1 -0
- package/daemon/dist/routes/rig-policy.js +174 -0
- package/daemon/dist/routes/rig-policy.js.map +1 -0
- package/daemon/dist/routes/rigs.d.ts.map +1 -1
- package/daemon/dist/routes/rigs.js +10 -2
- package/daemon/dist/routes/rigs.js.map +1 -1
- package/daemon/dist/routes/sessions.d.ts.map +1 -1
- package/daemon/dist/routes/sessions.js +26 -3
- package/daemon/dist/routes/sessions.js.map +1 -1
- package/daemon/dist/routes/up.d.ts +25 -0
- package/daemon/dist/routes/up.d.ts.map +1 -1
- package/daemon/dist/routes/up.js +70 -3
- package/daemon/dist/routes/up.js.map +1 -1
- package/daemon/dist/routes/workspace.d.ts.map +1 -1
- package/daemon/dist/routes/workspace.js +80 -1
- package/daemon/dist/routes/workspace.js.map +1 -1
- package/daemon/dist/server.d.ts +10 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +11 -0
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +45 -4
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/specs/agents/orchestration/orchestrator/guidance/role.md +28 -4
- package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +285 -8
- package/daemon/specs/agents/shared/skills/core/rig-lifecycle/SKILL.md +2 -2
- package/daemon/specs/rigs/launch/conveyor/rig.yaml +1 -1
- package/dist/client.d.ts +3 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +13 -1
- package/dist/client.js.map +1 -1
- package/dist/commands/bundle.d.ts.map +1 -1
- package/dist/commands/bundle.js +123 -2
- package/dist/commands/bundle.js.map +1 -1
- package/dist/commands/config-init-workspace.d.ts.map +1 -1
- package/dist/commands/config-init-workspace.js +40 -5
- package/dist/commands/config-init-workspace.js.map +1 -1
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +51 -8
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts +6 -0
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +103 -5
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/rig-policy.d.ts +48 -0
- package/dist/commands/rig-policy.d.ts.map +1 -0
- package/dist/commands/rig-policy.js +429 -0
- package/dist/commands/rig-policy.js.map +1 -0
- package/dist/commands/scope.d.ts +6 -0
- package/dist/commands/scope.d.ts.map +1 -0
- package/dist/commands/scope.js +659 -0
- package/dist/commands/scope.js.map +1 -0
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +47 -0
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/workflow.d.ts +9 -0
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +139 -1
- package/dist/commands/workflow.js.map +1 -1
- package/dist/commands/workspace.d.ts +20 -0
- package/dist/commands/workspace.d.ts.map +1 -1
- package/dist/commands/workspace.js +138 -7
- package/dist/commands/workspace.js.map +1 -1
- package/dist/daemon-lifecycle.d.ts +25 -1
- package/dist/daemon-lifecycle.d.ts.map +1 -1
- package/dist/daemon-lifecycle.js +33 -2
- package/dist/daemon-lifecycle.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/scope/dot-id.d.ts +43 -0
- package/dist/lib/scope/dot-id.d.ts.map +1 -0
- package/dist/lib/scope/dot-id.js +165 -0
- package/dist/lib/scope/dot-id.js.map +1 -0
- package/dist/lib/scope/scope-fs.d.ts +79 -0
- package/dist/lib/scope/scope-fs.d.ts.map +1 -0
- package/dist/lib/scope/scope-fs.js +468 -0
- package/dist/lib/scope/scope-fs.js.map +1 -0
- package/dist/lib/scope/templates.d.ts +38 -0
- package/dist/lib/scope/templates.d.ts.map +1 -0
- package/dist/lib/scope/templates.js +109 -0
- package/dist/lib/scope/templates.js.map +1 -0
- package/dist/lib/scope/types.d.ts +61 -0
- package/dist/lib/scope/types.d.ts.map +1 -0
- package/dist/lib/scope/types.js +38 -0
- package/dist/lib/scope/types.js.map +1 -0
- package/dist/lib/scope-templates/backlog-deprecation.md +26 -0
- package/dist/lib/scope-templates/backlog-tech-debt.md +22 -0
- package/dist/lib/scope-templates/bug-fix.md +30 -0
- package/dist/lib/scope-templates/mission-notes.md +97 -0
- package/dist/lib/scope-templates/mission-placeholder.md +20 -0
- package/dist/lib/scope-templates/mission-release.md +25 -0
- package/dist/lib/scope-templates/placeholder.md +30 -0
- package/dist/lib/scope-templates/release-feature.md +26 -0
- package/dist/lib/scope-templates/research.md +22 -0
- package/package.json +2 -2
- package/ui/dist/assets/index-GjTxfi9S.js +547 -0
- package/ui/dist/index.html +1 -1
- package/ui/dist/assets/index-Rl3ZBrUg.js +0 -547
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// Slice 09 — runtime validator for OperatorContextModeRecord input.
|
|
2
|
+
//
|
|
3
|
+
// The type system (rig-policy-types.ts) blocks invalid values at
|
|
4
|
+
// compile time when callers go through the typed surface. This
|
|
5
|
+
// validator is the defense for inputs that bypass types: JSON file
|
|
6
|
+
// reads, HTTP request bodies, env-var-derived configuration, CLI
|
|
7
|
+
// argument parsing, and migrations from older record shapes.
|
|
8
|
+
//
|
|
9
|
+
// HG-2: every record must carry all 10 fields. Reject missing/extra.
|
|
10
|
+
// HG-1 / HG-SAFE / HG-8: closed enums; auto-accept rejected; no
|
|
11
|
+
// silent-switch value.
|
|
12
|
+
//
|
|
13
|
+
// Error format follows the 3-part convention from the velocity team:
|
|
14
|
+
// what failed / what's allowed / what to do
|
|
15
|
+
// so an operator gets a useful CLI message.
|
|
16
|
+
import { OPERATOR_CONTEXT_MODES, OPERATOR_CONTEXT_SCOPES, SAFE_PERMISSION_PROMPT_POSTURES, STALE_RULES, } from "./rig-policy-types.js";
|
|
17
|
+
const ALLOWED_AUTONOMY_SCOPES = [
|
|
18
|
+
"pre_approved_only",
|
|
19
|
+
"bounded_continuation",
|
|
20
|
+
"full_autonomy_within_workstream",
|
|
21
|
+
"full_autonomy",
|
|
22
|
+
];
|
|
23
|
+
const ALLOWED_HEARTBEAT_CADENCES = ["sparse", "normal", "fast"];
|
|
24
|
+
const ALLOWED_INSPECTION_DEPTHS = ["surface", "normal", "forensic"];
|
|
25
|
+
const ALLOWED_UPDATE_DETAILS = ["compact", "normal", "verbose"];
|
|
26
|
+
const ALLOWED_ESCALATION_THRESHOLDS = [
|
|
27
|
+
"low",
|
|
28
|
+
"normal",
|
|
29
|
+
"high",
|
|
30
|
+
"blocker_only",
|
|
31
|
+
];
|
|
32
|
+
const ALLOWED_CONCURRENCY_LIMITS = ["serial", "2", "4", "unlimited"];
|
|
33
|
+
/**
|
|
34
|
+
* The 10 required fields of an OperatorContextModeRecord. Used by
|
|
35
|
+
* validateRecord to enumerate field-set integrity (HG-2) — both
|
|
36
|
+
* presence and exhaustiveness.
|
|
37
|
+
*
|
|
38
|
+
* NOTE: `mode` is NOT in this list. Mode is the binding selector
|
|
39
|
+
* (Component 2 vocabulary), not part of the Component-3 settings
|
|
40
|
+
* record. The store/route validate mode separately at the binding
|
|
41
|
+
* boundary; this validator enforces only the 10 Component-3 fields.
|
|
42
|
+
*/
|
|
43
|
+
export const REQUIRED_RECORD_FIELDS = [
|
|
44
|
+
"autonomy_scope",
|
|
45
|
+
"heartbeat_cadence",
|
|
46
|
+
"inspection_depth",
|
|
47
|
+
"update_detail",
|
|
48
|
+
"escalation_threshold",
|
|
49
|
+
"concurrency_limit",
|
|
50
|
+
"permission_prompt_posture",
|
|
51
|
+
"scope",
|
|
52
|
+
"expiry_or_stale_rule",
|
|
53
|
+
"evidence_citation",
|
|
54
|
+
];
|
|
55
|
+
function threePart(failed, allowed, recovery) {
|
|
56
|
+
return `${failed}. Allowed: ${allowed}. ${recovery}`;
|
|
57
|
+
}
|
|
58
|
+
function isPlainObject(v) {
|
|
59
|
+
return typeof v === "object" && v !== null && !Array.isArray(v);
|
|
60
|
+
}
|
|
61
|
+
function checkEnum(fieldName, value, allowed, errors) {
|
|
62
|
+
if (typeof value !== "string") {
|
|
63
|
+
errors.push(threePart(`${fieldName} is not a string (got ${typeof value})`, allowed.join(", "), `Set ${fieldName} to one of the allowed values.`));
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
if (!allowed.includes(value)) {
|
|
67
|
+
errors.push(threePart(`${fieldName}="${value}" is not a recognized value`, allowed.join(", "), `Set ${fieldName} to one of the allowed values.`));
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
return value;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Validate a candidate record against the FROZEN contract. Returns
|
|
74
|
+
* the typed record on success OR a list of 3-part error messages on
|
|
75
|
+
* failure (one per offending field; report all at once so an
|
|
76
|
+
* operator doesn't have to retry per error).
|
|
77
|
+
*
|
|
78
|
+
* Strict: any field outside REQUIRED_RECORD_FIELDS is rejected
|
|
79
|
+
* (HG-2 — field-set integrity; "no merged/dropped fields").
|
|
80
|
+
*/
|
|
81
|
+
export function validateRecord(raw) {
|
|
82
|
+
const errors = [];
|
|
83
|
+
if (!isPlainObject(raw)) {
|
|
84
|
+
return {
|
|
85
|
+
ok: false,
|
|
86
|
+
errors: [
|
|
87
|
+
threePart("Record is not an object", "an object with the 10 required fields", "See conventions/operator-context-mode-system/README.md §Component 3 for the schema."),
|
|
88
|
+
],
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// HG-2 — field-set integrity. Reject missing AND extra fields. The
|
|
92
|
+
// convention says "All ten fields MUST be present in any descendant
|
|
93
|
+
// that publishes a current-mode artifact. None may be silently
|
|
94
|
+
// merged or dropped."
|
|
95
|
+
for (const field of REQUIRED_RECORD_FIELDS) {
|
|
96
|
+
if (!(field in raw)) {
|
|
97
|
+
errors.push(threePart(`Missing required field "${field}"`, REQUIRED_RECORD_FIELDS.join(", "), `Add the field to the record. See convention §Component 3.`));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const requiredSet = new Set(REQUIRED_RECORD_FIELDS);
|
|
101
|
+
for (const key of Object.keys(raw)) {
|
|
102
|
+
if (!requiredSet.has(key)) {
|
|
103
|
+
errors.push(threePart(`Unknown field "${key}"`, REQUIRED_RECORD_FIELDS.join(", "), `Drop the unknown field. The schema is closed at v0; an extension requires a Mode 1.5 amendment.`));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// If we already failed field-set integrity, return early so the
|
|
107
|
+
// operator sees only the structural error and not cascade per-field
|
|
108
|
+
// noise.
|
|
109
|
+
if (errors.length > 0)
|
|
110
|
+
return { ok: false, errors };
|
|
111
|
+
const autonomy_scope = checkEnum("autonomy_scope", raw["autonomy_scope"], ALLOWED_AUTONOMY_SCOPES, errors);
|
|
112
|
+
const heartbeat_cadence = checkEnum("heartbeat_cadence", raw["heartbeat_cadence"], ALLOWED_HEARTBEAT_CADENCES, errors);
|
|
113
|
+
const inspection_depth = checkEnum("inspection_depth", raw["inspection_depth"], ALLOWED_INSPECTION_DEPTHS, errors);
|
|
114
|
+
const update_detail = checkEnum("update_detail", raw["update_detail"], ALLOWED_UPDATE_DETAILS, errors);
|
|
115
|
+
const escalation_threshold = checkEnum("escalation_threshold", raw["escalation_threshold"], ALLOWED_ESCALATION_THRESHOLDS, errors);
|
|
116
|
+
const concurrency_limit = checkEnum("concurrency_limit", raw["concurrency_limit"], ALLOWED_CONCURRENCY_LIMITS, errors);
|
|
117
|
+
// HG-SAFE (runtime) — the type system blocks auto-accept at
|
|
118
|
+
// compile time; this branch rejects it at runtime for inputs that
|
|
119
|
+
// bypass typing (JSON / env / HTTP body). The validator does NOT
|
|
120
|
+
// tolerate any "auto*" / "yes_to_all" / etc. value; it accepts
|
|
121
|
+
// EXACTLY the three SAFE values.
|
|
122
|
+
const permission_prompt_posture = checkEnum("permission_prompt_posture", raw["permission_prompt_posture"], SAFE_PERMISSION_PROMPT_POSTURES, errors);
|
|
123
|
+
const scope = checkEnum("scope", raw["scope"], OPERATOR_CONTEXT_SCOPES, errors);
|
|
124
|
+
const expiry_or_stale_rule = checkEnum("expiry_or_stale_rule", raw["expiry_or_stale_rule"], STALE_RULES, errors);
|
|
125
|
+
const evidence_citation_raw = raw["evidence_citation"];
|
|
126
|
+
if (typeof evidence_citation_raw !== "string") {
|
|
127
|
+
errors.push(threePart(`evidence_citation is not a string (got ${typeof evidence_citation_raw})`, "a non-empty source-citation string (e.g., qitem id, file path, chatroom topic)", "Provide a brief citation per convention §Citation Rules."));
|
|
128
|
+
}
|
|
129
|
+
else if (evidence_citation_raw.trim().length === 0) {
|
|
130
|
+
errors.push(threePart("evidence_citation is empty", "a non-empty source-citation string", "Provide a brief citation per convention §Citation Rules."));
|
|
131
|
+
}
|
|
132
|
+
if (errors.length > 0
|
|
133
|
+
|| autonomy_scope === null
|
|
134
|
+
|| heartbeat_cadence === null
|
|
135
|
+
|| inspection_depth === null
|
|
136
|
+
|| update_detail === null
|
|
137
|
+
|| escalation_threshold === null
|
|
138
|
+
|| concurrency_limit === null
|
|
139
|
+
|| permission_prompt_posture === null
|
|
140
|
+
|| scope === null
|
|
141
|
+
|| expiry_or_stale_rule === null) {
|
|
142
|
+
return { ok: false, errors };
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
ok: true,
|
|
146
|
+
record: {
|
|
147
|
+
autonomy_scope,
|
|
148
|
+
heartbeat_cadence,
|
|
149
|
+
inspection_depth,
|
|
150
|
+
update_detail,
|
|
151
|
+
escalation_threshold,
|
|
152
|
+
concurrency_limit,
|
|
153
|
+
permission_prompt_posture,
|
|
154
|
+
scope,
|
|
155
|
+
expiry_or_stale_rule,
|
|
156
|
+
evidence_citation: evidence_citation_raw.trim(),
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Validate an operator-supplied mode name. Mode lives outside the
|
|
162
|
+
* 10-field record (Component 2 vocabulary, not Component 3 settings).
|
|
163
|
+
* The route + store call this at the binding boundary; the
|
|
164
|
+
* disambiguator below (for invocation parsing) is separate.
|
|
165
|
+
*/
|
|
166
|
+
export function validateModeName(raw) {
|
|
167
|
+
if (typeof raw !== "string") {
|
|
168
|
+
return { ok: false, error: threePart(`mode is not a string (got ${typeof raw})`, OPERATOR_CONTEXT_MODES.join(", "), "Provide one of the six reserved mode names.") };
|
|
169
|
+
}
|
|
170
|
+
if (!OPERATOR_CONTEXT_MODES.includes(raw)) {
|
|
171
|
+
return { ok: false, error: threePart(`mode="${raw}" is not a recognized mode name`, OPERATOR_CONTEXT_MODES.join(", "), "Provide one of the six reserved mode names. See convention §Component 2.") };
|
|
172
|
+
}
|
|
173
|
+
return { ok: true, mode: raw };
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Disambiguate operator-supplied mode input. Per convention §Component 4
|
|
177
|
+
* "Bare-Word Disambiguation":
|
|
178
|
+
*
|
|
179
|
+
* - A bare word that is one of the six reserved modes → invocation
|
|
180
|
+
* - An explicit `mode:` prefix → invocation
|
|
181
|
+
* - A word embedded in a sentence → NOT invocation (caller treats as topic)
|
|
182
|
+
*
|
|
183
|
+
* Returns the canonical mode name when the input is unambiguously an
|
|
184
|
+
* invocation; null otherwise. Caller emits a clarification question
|
|
185
|
+
* for null+bare-multi-word inputs (per convention "ask once").
|
|
186
|
+
*/
|
|
187
|
+
export function disambiguateModeInvocation(rawInput) {
|
|
188
|
+
const trimmed = rawInput.trim();
|
|
189
|
+
if (trimmed.length === 0)
|
|
190
|
+
return null;
|
|
191
|
+
// Explicit prefix wins.
|
|
192
|
+
const prefixMatch = trimmed.match(/^mode\s*:\s*(\S+)/i);
|
|
193
|
+
if (prefixMatch) {
|
|
194
|
+
const candidate = prefixMatch[1].toLowerCase();
|
|
195
|
+
if (OPERATOR_CONTEXT_MODES.includes(candidate)) {
|
|
196
|
+
return candidate;
|
|
197
|
+
}
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
// Bare-word: exactly one word AND it's a reserved mode.
|
|
201
|
+
if (/^\S+$/.test(trimmed)) {
|
|
202
|
+
const lower = trimmed.toLowerCase();
|
|
203
|
+
if (OPERATOR_CONTEXT_MODES.includes(lower)) {
|
|
204
|
+
return lower;
|
|
205
|
+
}
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
// Embedded — let the caller ask.
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=rig-policy-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rig-policy-validator.js","sourceRoot":"","sources":["../../../src/domain/rig-policy/rig-policy-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -90,7 +90,7 @@ export type MaterializeOutcome = {
|
|
|
90
90
|
export interface LaunchMaterializedNodeResult {
|
|
91
91
|
logicalId: string;
|
|
92
92
|
nodeId: string;
|
|
93
|
-
status: "launched" | "failed";
|
|
93
|
+
status: "launched" | "failed" | "attention_required";
|
|
94
94
|
error?: string;
|
|
95
95
|
sessionName?: string;
|
|
96
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rigspec-instantiator.d.ts","sourceRoot":"","sources":["../../src/domain/rigspec-instantiator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAG3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAI/D,OAAO,KAAK,EAAE,aAAa,IAAI,OAAO,EAAoC,kBAAkB,EAAqB,MAAM,YAAY,CAAC;AAMpI,UAAU,mBAAmB;IAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,qBAAqB,EAAE,WAAW,CAAC;CACzD;AAED,qBAAa,eAAe;IAC1B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAC/B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,WAAW,CAAC,CAA4C;gBAEpD,IAAI,EAAE,mBAAmB;IA0B/B,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiJ7D,OAAO,CAAC,kBAAkB;CAqE3B;AAOD,OAAO,EAAmB,KAAK,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAI/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAoC,MAAM,sBAAsB,CAAC;AAE7F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,UAAU,mBAAmB;IAC3B,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE,aAAa,CAAC;IACvB,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;0EAGsE;IACtE,kBAAkB,CAAC,EAAE,OAAO,iDAAiD,EAAE,yBAAyB,CAAC;IACzG;;;oEAGgE;IAChE,iBAAiB,CAAC,EAAE,OAAO,+CAA+C,EAAE,wBAAwB,CAAC;CACtG;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,CAAA;KAAE,CAAC,CAAC;CAC7D;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,iBAAiB,CAAA;CAAE,GACvC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAC7E;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,sBAAsB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,mBAAmB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9D,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"rigspec-instantiator.d.ts","sourceRoot":"","sources":["../../src/domain/rigspec-instantiator.ts"],"names":[],"mappings":"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"}
|
|
@@ -515,7 +515,21 @@ export class PodRigInstantiator {
|
|
|
515
515
|
if (!preflight.ready) {
|
|
516
516
|
return { ok: false, code: "preflight_failed", errors: preflight.errors, warnings: preflight.warnings };
|
|
517
517
|
}
|
|
518
|
-
// 3.
|
|
518
|
+
// 3. Compute launch order from edges (rejects cycles)
|
|
519
|
+
//
|
|
520
|
+
// OPR.0.3.2.22 Bug 2: this MUST run BEFORE createRig. Pre-fix, a
|
|
521
|
+
// cycle in the spec left an orphan stopped-state rig record because
|
|
522
|
+
// createRig had already committed before the cycle check ran. The
|
|
523
|
+
// operator-facing consequence was the "ambiguous library-spec vs
|
|
524
|
+
// restore-target" UX trap on the very next `rig up <builtin>` retry.
|
|
525
|
+
let launchOrder;
|
|
526
|
+
try {
|
|
527
|
+
launchOrder = this.computePodLaunchOrder(rigSpec);
|
|
528
|
+
}
|
|
529
|
+
catch (err) {
|
|
530
|
+
return { ok: false, code: "cycle_error", message: err.message };
|
|
531
|
+
}
|
|
532
|
+
// 4. Create rig (after cycle check passes)
|
|
519
533
|
let rigId;
|
|
520
534
|
try {
|
|
521
535
|
const rig = this.deps.rigRepo.createRig(rigSpec.name);
|
|
@@ -529,14 +543,6 @@ export class PodRigInstantiator {
|
|
|
529
543
|
catch (err) {
|
|
530
544
|
return { ok: false, code: "instantiate_error", message: err.message };
|
|
531
545
|
}
|
|
532
|
-
// 4. Compute launch order from edges (rejects cycles)
|
|
533
|
-
let launchOrder;
|
|
534
|
-
try {
|
|
535
|
-
launchOrder = this.computePodLaunchOrder(rigSpec);
|
|
536
|
-
}
|
|
537
|
-
catch (err) {
|
|
538
|
-
return { ok: false, code: "cycle_error", message: err.message };
|
|
539
|
-
}
|
|
540
546
|
// 5. Create pods + nodes + edges, then launch in topological order
|
|
541
547
|
const nodeResults = [];
|
|
542
548
|
const nodeIdMap = {}; // "pod.member" -> node DB id
|
|
@@ -568,10 +574,15 @@ export class PodRigInstantiator {
|
|
|
568
574
|
// Sort members by topological launch order
|
|
569
575
|
const orderMap = new Map(launchOrder.map((id, i) => [id, i]));
|
|
570
576
|
memberEntries.sort((a, b) => (orderMap.get(a.qualifiedId) ?? 999) - (orderMap.get(b.qualifiedId) ?? 999));
|
|
571
|
-
// Prelaunch hook: service gate runs after topology setup, before any node launch
|
|
577
|
+
// Prelaunch hook: service gate runs after topology setup, before any node launch.
|
|
578
|
+
//
|
|
579
|
+
// OPR.0.3.2.22 Bug 2: if the hook fails, roll back the rig record so
|
|
580
|
+
// the spec name is left free for a clean retry. Pods rely on rigs
|
|
581
|
+
// via ON DELETE CASCADE so deleting the rig is sufficient.
|
|
572
582
|
if (opts?.prelaunchHook) {
|
|
573
583
|
const hookResult = await opts.prelaunchHook(rigId);
|
|
574
584
|
if (!hookResult.ok) {
|
|
585
|
+
this.deps.rigRepo.deleteRig(rigId);
|
|
575
586
|
return { ok: false, code: "service_boot_failed", message: hookResult.message };
|
|
576
587
|
}
|
|
577
588
|
}
|
|
@@ -654,6 +665,8 @@ export class PodRigInstantiator {
|
|
|
654
665
|
logicalId: qualifiedId,
|
|
655
666
|
status: launched.status,
|
|
656
667
|
error: launched.error,
|
|
668
|
+
evidence: launched.evidence,
|
|
669
|
+
sessionName: launched.sessionName,
|
|
657
670
|
});
|
|
658
671
|
}
|
|
659
672
|
// Create pod-local edges (after all members created)
|
|
@@ -680,9 +693,23 @@ export class PodRigInstantiator {
|
|
|
680
693
|
catch { /* best-effort */ }
|
|
681
694
|
}
|
|
682
695
|
}
|
|
683
|
-
//
|
|
684
|
-
|
|
685
|
-
|
|
696
|
+
// OPR.0.3.2.CT (conveyor-trust-minimal-fix):
|
|
697
|
+
// Distinguish recoverable attention_required (e.g., workspace trust
|
|
698
|
+
// gate) from terminal failure. ANY attention_required node means
|
|
699
|
+
// the rig is operator-recoverable — do NOT tear down. Only when
|
|
700
|
+
// every node is TERMINALLY failed (status === "failed") does the
|
|
701
|
+
// tear-down run, preserving the existing failure-cleanup behavior.
|
|
702
|
+
//
|
|
703
|
+
// For all-attention_required (no successful launch, no terminal
|
|
704
|
+
// failure), surface an attention_required outcome that carries
|
|
705
|
+
// the actionable per-node detail. The route returns a 3-part
|
|
706
|
+
// error pointing the operator at the approve→resume path. Sessions
|
|
707
|
+
// remain in startup_status='attention_required' so `rig ps` lists
|
|
708
|
+
// them and tmux panes are NOT killed.
|
|
709
|
+
const hasAttention = nodeResults.some((n) => n.status === "attention_required");
|
|
710
|
+
const hasLaunched = nodeResults.some((n) => n.status === "launched");
|
|
711
|
+
const allTerminal = nodeResults.length > 0 && nodeResults.every((n) => n.status === "failed");
|
|
712
|
+
if (allTerminal) {
|
|
686
713
|
// Kill orphan tmux sessions
|
|
687
714
|
if (this.deps.tmuxAdapter) {
|
|
688
715
|
for (const sessionName of launchedSessionNames) {
|
|
@@ -699,14 +726,55 @@ export class PodRigInstantiator {
|
|
|
699
726
|
const details = nodeResults.map((n) => `${n.logicalId}: ${n.error ?? "unknown"}`).join("; ");
|
|
700
727
|
return { ok: false, code: "instantiate_error", message: `all node launches/startups failed — ${details}` };
|
|
701
728
|
}
|
|
729
|
+
if (hasAttention && !hasLaunched) {
|
|
730
|
+
// All-attention_required path — rig + sessions PRESERVED; no
|
|
731
|
+
// tear-down. The operator's path: attach to a session via
|
|
732
|
+
// `tmux attach -t <session>` and answer the runtime prompt. NO
|
|
733
|
+
// new trust primitive
|
|
734
|
+
// introduced (HG-5); reuses the runtime's shipped in-pane
|
|
735
|
+
// trust-grant prompt.
|
|
736
|
+
const attentionNodes = nodeResults
|
|
737
|
+
.filter((n) => n.status === "attention_required")
|
|
738
|
+
.map((n) => ({
|
|
739
|
+
logicalId: n.logicalId,
|
|
740
|
+
sessionName: n.sessionName ?? "",
|
|
741
|
+
evidence: n.evidence,
|
|
742
|
+
reason: n.error ?? "node awaiting attention",
|
|
743
|
+
}));
|
|
744
|
+
// Emit rig.imported so callers see the rig exists; nodes are
|
|
745
|
+
// attention_required, not "launched", so `rig ps` shows the
|
|
746
|
+
// correct lifecycle state.
|
|
747
|
+
try {
|
|
748
|
+
this.deps.eventBus.emit({ type: "rig.imported", rigId, specName: rigSpec.name, specVersion: rigSpec.version });
|
|
749
|
+
}
|
|
750
|
+
catch { /* best-effort */ }
|
|
751
|
+
return {
|
|
752
|
+
ok: false,
|
|
753
|
+
code: "attention_required",
|
|
754
|
+
message: `${attentionNodes.length} node${attentionNodes.length === 1 ? "" : "s"} require attention before becoming interactive (rig parked, NOT failed; approve and resume to proceed).`,
|
|
755
|
+
rigId,
|
|
756
|
+
attentionNodes,
|
|
757
|
+
};
|
|
758
|
+
}
|
|
702
759
|
// Emit rig.imported
|
|
703
760
|
try {
|
|
704
761
|
this.deps.eventBus.emit({ type: "rig.imported", rigId, specName: rigSpec.name, specVersion: rigSpec.version });
|
|
705
762
|
}
|
|
706
763
|
catch { /* best-effort */ }
|
|
764
|
+
// Carry sessionName + evidence through to InstantiateResult.nodes
|
|
765
|
+
// so BootstrapOrchestrator can build AttentionNode[] in the mixed
|
|
766
|
+
// launched+attention_required path (guard verdict
|
|
767
|
+
// qitem-20260518082933 BLOCKER 1).
|
|
768
|
+
const resultNodes = nodeResults.map((n) => ({
|
|
769
|
+
logicalId: n.logicalId,
|
|
770
|
+
status: n.status,
|
|
771
|
+
error: n.error,
|
|
772
|
+
sessionName: n.sessionName,
|
|
773
|
+
evidence: n.evidence,
|
|
774
|
+
}));
|
|
707
775
|
return {
|
|
708
776
|
ok: true,
|
|
709
|
-
result: { rigId, specName: rigSpec.name, specVersion: rigSpec.version, nodes:
|
|
777
|
+
result: { rigId, specName: rigSpec.name, specVersion: rigSpec.version, nodes: resultNodes, warnings: podInstantiateWarnings.length > 0 ? podInstantiateWarnings : undefined },
|
|
710
778
|
};
|
|
711
779
|
}
|
|
712
780
|
computePodLaunchOrder(rigSpec) {
|
|
@@ -854,7 +922,16 @@ export class PodRigInstantiator {
|
|
|
854
922
|
return { status: "failed", error: sessionNameErrors.join("; ") };
|
|
855
923
|
}
|
|
856
924
|
const canonicalSessionName = deriveCanonicalSessionName(input.pod.id, input.member.id, input.rigSpec.name);
|
|
857
|
-
|
|
925
|
+
// Slice 15 — forward per-seat silenceWindowSeconds from the resolved
|
|
926
|
+
// profile.activity block. NodeLauncher applies the launcher default
|
|
927
|
+
// (3s) when this is undefined. The seat's tmux monitor-silence is
|
|
928
|
+
// configured immediately after createSession; SeatActivityService
|
|
929
|
+
// then reads window_activity to compute terminalActive against this
|
|
930
|
+
// threshold per poll.
|
|
931
|
+
const launchResult = await this.deps.nodeLauncher.launchNode(input.rigId, input.qualifiedId, {
|
|
932
|
+
sessionName: canonicalSessionName,
|
|
933
|
+
silenceWindowSeconds: configResult.config.activity?.silenceWindowSeconds,
|
|
934
|
+
});
|
|
858
935
|
if (!launchResult.ok) {
|
|
859
936
|
return { status: "failed", error: launchResult.message };
|
|
860
937
|
}
|
|
@@ -920,7 +997,8 @@ export class PodRigInstantiator {
|
|
|
920
997
|
else if (input.member.sessionSource?.mode === "agent_image") {
|
|
921
998
|
// PL-016 Item 4: agent_image → resolve via library + dispatch
|
|
922
999
|
// through the native-fork code path so nativeResumeProbe
|
|
923
|
-
// semantics are preserved
|
|
1000
|
+
// semantics are preserved
|
|
1001
|
+
// (docs/as-built/architecture/adapters-and-runtimes.md § Resume honesty).
|
|
924
1002
|
const library = this.deps.agentImageLibrary;
|
|
925
1003
|
if (!library) {
|
|
926
1004
|
return {
|
|
@@ -1028,9 +1106,22 @@ export class PodRigInstantiator {
|
|
|
1028
1106
|
console.warn(`[openrig] agent-image fork_count bump failed for ${consumedAgentImageId}: ${err.message}`);
|
|
1029
1107
|
}
|
|
1030
1108
|
}
|
|
1109
|
+
// OPR.0.3.2.CT — preserve the attention_required distinction so
|
|
1110
|
+
// the instantiator can leave a recoverable rig + sessions instead
|
|
1111
|
+
// of zero-collapsing. The session row's startup_status was already
|
|
1112
|
+
// persisted by startupOrchestrator.fail() (see startup-orchestrator.ts
|
|
1113
|
+
// lines 223-225, 241-243).
|
|
1114
|
+
if (startupResult.ok) {
|
|
1115
|
+
return {
|
|
1116
|
+
status: "launched",
|
|
1117
|
+
sessionName: canonicalSessionName,
|
|
1118
|
+
warnings: launchResult.warnings,
|
|
1119
|
+
};
|
|
1120
|
+
}
|
|
1031
1121
|
return {
|
|
1032
|
-
status: startupResult.
|
|
1033
|
-
error: startupResult.
|
|
1122
|
+
status: startupResult.startupStatus === "attention_required" ? "attention_required" : "failed",
|
|
1123
|
+
error: startupResult.errors.join("; "),
|
|
1124
|
+
evidence: startupResult.evidence,
|
|
1034
1125
|
sessionName: canonicalSessionName,
|
|
1035
1126
|
warnings: launchResult.warnings,
|
|
1036
1127
|
};
|