@openrig/cli 0.3.4 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +34 -0
- package/daemon/dist/adapters/codex-resume.d.ts +2 -1
- package/daemon/dist/adapters/codex-resume.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-resume.js +18 -6
- package/daemon/dist/adapters/codex-resume.js.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts +5 -1
- package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/adapters/codex-runtime-adapter.js +58 -5
- package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
- package/daemon/dist/adapters/tmux.d.ts +28 -14
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +65 -30
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/db/migrations/043_resume_provenance.d.ts +3 -0
- package/daemon/dist/db/migrations/043_resume_provenance.d.ts.map +1 -0
- package/daemon/dist/db/migrations/043_resume_provenance.js +5 -0
- package/daemon/dist/db/migrations/043_resume_provenance.js.map +1 -0
- package/daemon/dist/domain/agent-activity-store.d.ts +11 -1
- package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -1
- package/daemon/dist/domain/agent-activity-store.js +11 -2
- package/daemon/dist/domain/agent-activity-store.js.map +1 -1
- package/daemon/dist/domain/native-resume-probe.d.ts +2 -1
- package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
- package/daemon/dist/domain/native-resume-probe.js +21 -2
- package/daemon/dist/domain/native-resume-probe.js.map +1 -1
- package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
- package/daemon/dist/domain/node-inventory.js +70 -46
- package/daemon/dist/domain/node-inventory.js.map +1 -1
- package/daemon/dist/domain/node-launcher.d.ts +7 -7
- package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
- package/daemon/dist/domain/node-launcher.js +0 -22
- package/daemon/dist/domain/node-launcher.js.map +1 -1
- package/daemon/dist/domain/profile-resolver.d.ts +4 -5
- package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
- package/daemon/dist/domain/profile-resolver.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +4 -0
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +21 -2
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/restore-check-service.d.ts +14 -0
- package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
- package/daemon/dist/domain/restore-check-service.js +78 -8
- package/daemon/dist/domain/restore-check-service.js.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
- package/daemon/dist/domain/restore-orchestrator.js +3 -3
- package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.js +1 -1
- package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
- package/daemon/dist/domain/resume-token-validation.d.ts +17 -0
- package/daemon/dist/domain/resume-token-validation.d.ts.map +1 -0
- package/daemon/dist/domain/resume-token-validation.js +46 -0
- package/daemon/dist/domain/resume-token-validation.js.map +1 -0
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +3 -6
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
- package/daemon/dist/domain/runtime-adapter.js +1 -0
- package/daemon/dist/domain/runtime-adapter.js.map +1 -1
- package/daemon/dist/domain/scope/dot-id.d.ts +43 -0
- package/daemon/dist/domain/scope/dot-id.d.ts.map +1 -0
- package/daemon/dist/domain/scope/dot-id.js +165 -0
- package/daemon/dist/domain/scope/dot-id.js.map +1 -0
- package/daemon/dist/domain/scope/scope-audit.d.ts +26 -0
- package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -0
- package/daemon/dist/domain/scope/scope-audit.js +96 -0
- package/daemon/dist/domain/scope/scope-audit.js.map +1 -0
- package/daemon/dist/domain/scope/types.d.ts +61 -0
- package/daemon/dist/domain/scope/types.d.ts.map +1 -0
- package/daemon/dist/domain/scope/types.js +38 -0
- package/daemon/dist/domain/scope/types.js.map +1 -0
- package/daemon/dist/domain/seat-attention-reconciler.d.ts +12 -0
- package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
- package/daemon/dist/domain/seat-attention-reconciler.js +116 -88
- package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
- package/daemon/dist/domain/session-registry.d.ts +15 -1
- package/daemon/dist/domain/session-registry.d.ts.map +1 -1
- package/daemon/dist/domain/session-registry.js +46 -4
- package/daemon/dist/domain/session-registry.js.map +1 -1
- package/daemon/dist/domain/skill-audit.d.ts +47 -0
- package/daemon/dist/domain/skill-audit.d.ts.map +1 -0
- package/daemon/dist/domain/skill-audit.js +218 -0
- package/daemon/dist/domain/skill-audit.js.map +1 -0
- package/daemon/dist/domain/skill-discovery.d.ts +15 -0
- package/daemon/dist/domain/skill-discovery.d.ts.map +1 -1
- package/daemon/dist/domain/skill-discovery.js +70 -0
- package/daemon/dist/domain/skill-discovery.js.map +1 -1
- package/daemon/dist/domain/skill-mirror-drift.d.ts +10 -0
- package/daemon/dist/domain/skill-mirror-drift.d.ts.map +1 -0
- package/daemon/dist/domain/skill-mirror-drift.js +24 -0
- package/daemon/dist/domain/skill-mirror-drift.js.map +1 -0
- package/daemon/dist/domain/startup-orchestrator.js +1 -1
- package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +38 -14
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
- package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
- package/daemon/dist/domain/user-settings/settings-store.js +4 -0
- package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
- package/daemon/dist/domain/whoami-service.d.ts +1 -0
- package/daemon/dist/domain/whoami-service.d.ts.map +1 -1
- package/daemon/dist/domain/whoami-service.js +8 -4
- package/daemon/dist/domain/whoami-service.js.map +1 -1
- package/daemon/dist/index.d.ts.map +1 -1
- package/daemon/dist/index.js +25 -3
- package/daemon/dist/index.js.map +1 -1
- package/daemon/dist/routes/activity.d.ts.map +1 -1
- package/daemon/dist/routes/activity.js +29 -0
- package/daemon/dist/routes/activity.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +8 -0
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/restore-check.js +33 -2
- package/daemon/dist/routes/restore-check.js.map +1 -1
- package/daemon/dist/routes/scope-audit.d.ts +3 -0
- package/daemon/dist/routes/scope-audit.d.ts.map +1 -0
- package/daemon/dist/routes/scope-audit.js +148 -0
- package/daemon/dist/routes/scope-audit.js.map +1 -0
- package/daemon/dist/routes/sessions.d.ts.map +1 -1
- package/daemon/dist/routes/sessions.js +67 -3
- 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 +43 -0
- package/daemon/dist/routes/skills.js.map +1 -1
- package/daemon/dist/routes/terminal-ws.d.ts +7 -0
- package/daemon/dist/routes/terminal-ws.d.ts.map +1 -0
- package/daemon/dist/routes/terminal-ws.js +132 -0
- package/daemon/dist/routes/terminal-ws.js.map +1 -0
- package/daemon/dist/routes/transport.d.ts +3 -1
- package/daemon/dist/routes/transport.d.ts.map +1 -1
- package/daemon/dist/routes/transport.js +4 -1
- package/daemon/dist/routes/transport.js.map +1 -1
- package/daemon/dist/routes/whoami.d.ts.map +1 -1
- package/daemon/dist/routes/whoami.js +5 -0
- package/daemon/dist/routes/whoami.js.map +1 -1
- package/daemon/dist/server.d.ts +6 -0
- package/daemon/dist/server.d.ts.map +1 -1
- package/daemon/dist/server.js +29 -2
- package/daemon/dist/server.js.map +1 -1
- package/daemon/dist/startup.d.ts +8 -0
- package/daemon/dist/startup.d.ts.map +1 -1
- package/daemon/dist/startup.js +27 -8
- package/daemon/dist/startup.js.map +1 -1
- package/daemon/dist/terminal/TerminalSessionBroker.d.ts +173 -0
- package/daemon/dist/terminal/TerminalSessionBroker.d.ts.map +1 -0
- package/daemon/dist/terminal/TerminalSessionBroker.js +570 -0
- package/daemon/dist/terminal/TerminalSessionBroker.js.map +1 -0
- package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +131 -2
- package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +29 -0
- package/dist/client.d.ts +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +23 -0
- package/dist/client.js.map +1 -1
- package/dist/commands/capture.d.ts.map +1 -1
- package/dist/commands/capture.js +6 -6
- package/dist/commands/capture.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +41 -5
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/down.d.ts.map +1 -1
- package/dist/commands/down.js +27 -0
- package/dist/commands/down.js.map +1 -1
- package/dist/commands/launch.d.ts.map +1 -1
- package/dist/commands/launch.js +34 -0
- package/dist/commands/launch.js.map +1 -1
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +361 -53
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +60 -3
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/restore-check.d.ts.map +1 -1
- package/dist/commands/restore-check.js +80 -2
- package/dist/commands/restore-check.js.map +1 -1
- package/dist/commands/scope.d.ts.map +1 -1
- package/dist/commands/scope.js +688 -4
- package/dist/commands/scope.js.map +1 -1
- package/dist/commands/seat.d.ts +3 -1
- package/dist/commands/seat.d.ts.map +1 -1
- package/dist/commands/seat.js +61 -1
- package/dist/commands/seat.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +6 -6
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/skill.d.ts +4 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +77 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +27 -0
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/whoami.d.ts.map +1 -1
- package/dist/commands/whoami.js +208 -20
- package/dist/commands/whoami.js.map +1 -1
- package/dist/cross-host-executor.d.ts +1 -1
- package/dist/cross-host-executor.d.ts.map +1 -1
- package/dist/cross-host-executor.js +3 -2
- package/dist/cross-host-executor.js.map +1 -1
- package/dist/cross-host-types.d.ts +2 -0
- package/dist/cross-host-types.d.ts.map +1 -0
- package/dist/cross-host-types.js +2 -0
- package/dist/cross-host-types.js.map +1 -0
- package/dist/host-registry.d.ts +27 -5
- package/dist/host-registry.d.ts.map +1 -1
- package/dist/host-registry.js +86 -19
- package/dist/host-registry.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/scope/progress-edit.d.ts +42 -0
- package/dist/lib/scope/progress-edit.d.ts.map +1 -0
- package/dist/lib/scope/progress-edit.js +171 -0
- package/dist/lib/scope/progress-edit.js.map +1 -0
- package/dist/lib/scope/scope-audit.d.ts +26 -0
- package/dist/lib/scope/scope-audit.d.ts.map +1 -0
- package/dist/lib/scope/scope-audit.js +96 -0
- package/dist/lib/scope/scope-audit.js.map +1 -0
- package/dist/lib/scope/templates.d.ts +2 -0
- package/dist/lib/scope/templates.d.ts.map +1 -1
- package/dist/lib/scope/templates.js +8 -0
- package/dist/lib/scope/templates.js.map +1 -1
- package/dist/lib/scope/trust.d.ts +30 -0
- package/dist/lib/scope/trust.d.ts.map +1 -0
- package/dist/lib/scope/trust.js +80 -0
- package/dist/lib/scope/trust.js.map +1 -0
- package/dist/lib/scope/types.d.ts +6 -0
- package/dist/lib/scope/types.d.ts.map +1 -1
- package/dist/lib/scope/types.js +8 -0
- package/dist/lib/scope/types.js.map +1 -1
- package/dist/lib/scope-templates/backlog-deprecation.md +1 -0
- package/dist/lib/scope-templates/backlog-tech-debt.md +1 -0
- package/dist/lib/scope-templates/bug-fix.md +1 -0
- package/dist/lib/scope-templates/mission-placeholder.md +1 -0
- package/dist/lib/scope-templates/mission-progress.md +12 -0
- package/dist/lib/scope-templates/mission-release.md +1 -0
- package/dist/lib/scope-templates/placeholder.md +1 -0
- package/dist/lib/scope-templates/release-feature.md +1 -0
- package/dist/lib/scope-templates/research.md +1 -0
- package/dist/lib/scope-templates/slice-progress.md +11 -0
- package/dist/remote-host-ops.d.ts +24 -0
- package/dist/remote-host-ops.d.ts.map +1 -0
- package/dist/remote-host-ops.js +53 -0
- package/dist/remote-host-ops.js.map +1 -0
- package/package.json +1 -1
- package/ui/dist/assets/index-DMI6jeAX.css +32 -0
- package/ui/dist/assets/index-FQgCB6mC.js +580 -0
- package/ui/dist/index.html +2 -2
- package/ui/dist/assets/index-C_Q5FczU.css +0 -1
- package/ui/dist/assets/index-De6vv0yO.js +0 -552
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import * as YAML from "yaml";
|
|
2
|
+
import { isMissionDotId, isSliceDotId } from "./dot-id.js";
|
|
3
|
+
export function classifyScopeItem(input) {
|
|
4
|
+
const findings = [];
|
|
5
|
+
let frontmatterError = null;
|
|
6
|
+
let railStatus;
|
|
7
|
+
// Rail status
|
|
8
|
+
if (input.readmeOnlyMarker) {
|
|
9
|
+
railStatus = "readme-only";
|
|
10
|
+
}
|
|
11
|
+
else if (input.progressFileExists) {
|
|
12
|
+
railStatus = "present";
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
railStatus = "missing";
|
|
16
|
+
findings.push({
|
|
17
|
+
kind: "missing_progress",
|
|
18
|
+
severity: input.isActiveRelease ? "high" : "low",
|
|
19
|
+
path: input.path,
|
|
20
|
+
message: `${input.level} has no PROGRESS.md and no readme-only marker`,
|
|
21
|
+
remediation: `Run: rig scope ${input.level} create (scaffolds PROGRESS.md) or add progress_rail: readme-only to README frontmatter`,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
// Frontmatter classification (strict parse, NOT parseYamlSafely)
|
|
25
|
+
if (input.readmeFrontmatterRaw === null) {
|
|
26
|
+
findings.push({
|
|
27
|
+
kind: "missing_id",
|
|
28
|
+
severity: input.isActiveRelease ? "high" : "low",
|
|
29
|
+
path: input.path,
|
|
30
|
+
message: `README has no frontmatter (no id can be extracted)`,
|
|
31
|
+
remediation: "Add YAML frontmatter with an id: field to the README",
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
let parsed = null;
|
|
36
|
+
let parseError = null;
|
|
37
|
+
try {
|
|
38
|
+
parsed = YAML.parse(input.readmeFrontmatterRaw);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
parseError = err instanceof Error ? err.message : String(err);
|
|
42
|
+
}
|
|
43
|
+
const hasIdLine = /^id\s*:/m.test(input.readmeFrontmatterRaw);
|
|
44
|
+
if (parseError) {
|
|
45
|
+
frontmatterError = parseError;
|
|
46
|
+
railStatus = "malformed";
|
|
47
|
+
if (hasIdLine) {
|
|
48
|
+
findings.push({
|
|
49
|
+
kind: "registration_ghost",
|
|
50
|
+
severity: input.isActiveRelease ? "high" : "low",
|
|
51
|
+
path: input.path,
|
|
52
|
+
message: `README has an id: line but frontmatter fails to parse (registration ghost): ${parseError}`,
|
|
53
|
+
remediation: "Fix the YAML frontmatter syntax error so the id can be read",
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
findings.push({
|
|
58
|
+
kind: "registration_ghost",
|
|
59
|
+
severity: input.isActiveRelease ? "high" : "low",
|
|
60
|
+
path: input.path,
|
|
61
|
+
message: `README frontmatter fails to parse: ${parseError}`,
|
|
62
|
+
remediation: "Fix the YAML frontmatter syntax error",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
const fm = parsed && typeof parsed === "object" && !Array.isArray(parsed)
|
|
68
|
+
? parsed
|
|
69
|
+
: {};
|
|
70
|
+
const id = typeof fm.id === "string" ? fm.id : null;
|
|
71
|
+
if (!id) {
|
|
72
|
+
findings.push({
|
|
73
|
+
kind: "missing_id",
|
|
74
|
+
severity: input.isActiveRelease ? "high" : "low",
|
|
75
|
+
path: input.path,
|
|
76
|
+
message: `README frontmatter has no id field`,
|
|
77
|
+
remediation: "Add an id: field to the README frontmatter matching the scope dot-ID convention",
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
const validator = input.level === "mission" ? isMissionDotId : isSliceDotId;
|
|
82
|
+
if (!validator(id)) {
|
|
83
|
+
findings.push({
|
|
84
|
+
kind: "id_convention_violation",
|
|
85
|
+
severity: input.isActiveRelease ? "high" : "info",
|
|
86
|
+
path: input.path,
|
|
87
|
+
message: `id "${id}" does not match the ${input.level} dot-ID convention`,
|
|
88
|
+
remediation: `Use a valid ${input.level} dot-ID format`,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return { railStatus, findings, frontmatterError };
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=scope-audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope-audit.js","sourceRoot":"","sources":["../../../src/domain/scope/scope-audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmC3D,MAAM,UAAU,iBAAiB,CAAC,KAAsB;IACtD,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAC3C,IAAI,UAAsB,CAAC;IAE3B,cAAc;IACd,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC3B,UAAU,GAAG,aAAa,CAAC;IAC7B,CAAC;SAAM,IAAI,KAAK,CAAC,kBAAkB,EAAE,CAAC;QACpC,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,UAAU,GAAG,SAAS,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;YAChD,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,GAAG,KAAK,CAAC,KAAK,+CAA+C;YACtE,WAAW,EAAE,kBAAkB,KAAK,CAAC,KAAK,yFAAyF;SACpI,CAAC,CAAC;IACL,CAAC;IAED,iEAAiE;IACjE,IAAI,KAAK,CAAC,oBAAoB,KAAK,IAAI,EAAE,CAAC;QACxC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;YAChD,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,oDAAoD;YAC7D,WAAW,EAAE,sDAAsD;SACpE,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,IAAI,MAAM,GAAY,IAAI,CAAC;QAC3B,IAAI,UAAU,GAAkB,IAAI,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAE9D,IAAI,UAAU,EAAE,CAAC;YACf,gBAAgB,GAAG,UAAU,CAAC;YAC9B,UAAU,GAAG,WAAW,CAAC;YACzB,IAAI,SAAS,EAAE,CAAC;gBACd,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,oBAAoB;oBAC1B,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;oBAChD,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,+EAA+E,UAAU,EAAE;oBACpG,WAAW,EAAE,6DAA6D;iBAC3E,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,oBAAoB;oBAC1B,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;oBAChD,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,sCAAsC,UAAU,EAAE;oBAC3D,WAAW,EAAE,uCAAuC;iBACrD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,GAAG,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBACvE,CAAC,CAAC,MAAiC;gBACnC,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,EAAE,GAAG,OAAO,EAAE,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAEpD,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;oBAChD,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,oCAAoC;oBAC7C,WAAW,EAAE,iFAAiF;iBAC/F,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,YAAY,CAAC;gBAC5E,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;oBACnB,QAAQ,CAAC,IAAI,CAAC;wBACZ,IAAI,EAAE,yBAAyB;wBAC/B,QAAQ,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;wBACjD,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,OAAO,EAAE,OAAO,EAAE,wBAAwB,KAAK,CAAC,KAAK,oBAAoB;wBACzE,WAAW,EAAE,eAAe,KAAK,CAAC,KAAK,gBAAgB;qBACxD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/** Scope tiers. v0 ships `mission` + `slice`; `project` and `sub-slice`
|
|
2
|
+
* exist in the grammar but have no CLI verbs yet. */
|
|
3
|
+
export type ScopeTier = "project" | "mission" | "slice" | "sub-slice";
|
|
4
|
+
/** Stable reference ID parts. `OPR.0.3.2.12` → project="OPR",
|
|
5
|
+
* version="0.3.2", n=12. Escape-band non-release missions look like
|
|
6
|
+
* `OPR.99.0.1` → version="99.0.1", n=undefined. */
|
|
7
|
+
export interface DotId {
|
|
8
|
+
project: string;
|
|
9
|
+
version: string;
|
|
10
|
+
n?: number;
|
|
11
|
+
m?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface MissionInfo {
|
|
14
|
+
/** Mission folder name (e.g., "release-0.3.2", "backlog"). */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Absolute path to the mission folder. */
|
|
17
|
+
absPath: string;
|
|
18
|
+
/** Path to the mission's README.md, if present. */
|
|
19
|
+
readmePath: string | null;
|
|
20
|
+
/** Parsed frontmatter from the README. */
|
|
21
|
+
frontmatter: Record<string, unknown>;
|
|
22
|
+
/** Minted dot-ID for this mission (read from frontmatter if present,
|
|
23
|
+
* otherwise inferred from the folder name pattern). */
|
|
24
|
+
id: string | null;
|
|
25
|
+
activeSliceCount: number;
|
|
26
|
+
closedSliceCount: number;
|
|
27
|
+
}
|
|
28
|
+
export interface SliceInfo {
|
|
29
|
+
name: string;
|
|
30
|
+
absPath: string;
|
|
31
|
+
readmePath: string | null;
|
|
32
|
+
frontmatter: Record<string, unknown>;
|
|
33
|
+
/** "NN-slug" → NN. */
|
|
34
|
+
nn: number | null;
|
|
35
|
+
/** "NN-slug" → slug. */
|
|
36
|
+
slug: string | null;
|
|
37
|
+
missionName: string;
|
|
38
|
+
/** Minted dot-ID, parent.NN form. */
|
|
39
|
+
id: string | null;
|
|
40
|
+
/** Frontmatter `status` field, lowercased. */
|
|
41
|
+
status: string | null;
|
|
42
|
+
}
|
|
43
|
+
/** 3-part error shape per `building-agent-software` skill §3.6. */
|
|
44
|
+
export declare class ScopeCliError extends Error {
|
|
45
|
+
readonly fact: string;
|
|
46
|
+
readonly consequence: string;
|
|
47
|
+
readonly action: string;
|
|
48
|
+
constructor(opts: {
|
|
49
|
+
fact: string;
|
|
50
|
+
consequence: string;
|
|
51
|
+
action: string;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export type SliceState = "active" | "closed" | "shipped" | "all";
|
|
55
|
+
export type SliceTemplateKind = "placeholder" | "bug-fix" | "backlog-deprecation" | "backlog-tech-debt" | "release-feature" | "research";
|
|
56
|
+
export declare const SLICE_TEMPLATE_KINDS: ReadonlyArray<SliceTemplateKind>;
|
|
57
|
+
export type MissionTemplateKind = "placeholder" | "release";
|
|
58
|
+
export declare const MISSION_TEMPLATE_KINDS: ReadonlyArray<MissionTemplateKind>;
|
|
59
|
+
export type CloseReason = "wontfix" | "deferred" | "superseded" | "stale";
|
|
60
|
+
export declare const CLOSE_REASONS: ReadonlyArray<CloseReason>;
|
|
61
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/domain/scope/types.ts"],"names":[],"mappings":"AAOA;sDACsD;AACtD,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC;AAEtE;;oDAEoD;AACpD,MAAM,WAAW,KAAK;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,WAAW;IAC1B,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,2CAA2C;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC;4DACwD;IACxD,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,sBAAsB;IACtB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,wBAAwB;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,qCAAqC;IACrC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,mEAAmE;AACnE,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACZ,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;CAOxE;AAED,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAC;AACjE,MAAM,MAAM,iBAAiB,GACzB,aAAa,GACb,SAAS,GACT,qBAAqB,GACrB,mBAAmB,GACnB,iBAAiB,GACjB,UAAU,CAAC;AACf,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,iBAAiB,CAOjE,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG,SAAS,CAAC;AAC5D,eAAO,MAAM,sBAAsB,EAAE,aAAa,CAAC,mBAAmB,CAGrE,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;AAC1E,eAAO,MAAM,aAAa,EAAE,aAAa,CAAC,WAAW,CAKpD,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// release-0.3.2 slice 12 — scope CLI primitive types.
|
|
2
|
+
//
|
|
3
|
+
// Aligned with the substrate convention at
|
|
4
|
+
// `openrig-work/conventions/scope-and-versioning/README.md` (stage:
|
|
5
|
+
// provisional, authored 2026-05-15). The CLI mints stable dot-IDs
|
|
6
|
+
// into created mission/slice frontmatter per §1 of that convention.
|
|
7
|
+
/** 3-part error shape per `building-agent-software` skill §3.6. */
|
|
8
|
+
export class ScopeCliError extends Error {
|
|
9
|
+
fact;
|
|
10
|
+
consequence;
|
|
11
|
+
action;
|
|
12
|
+
constructor(opts) {
|
|
13
|
+
super(`${opts.fact}\n${opts.consequence}\n${opts.action}`);
|
|
14
|
+
this.name = "ScopeCliError";
|
|
15
|
+
this.fact = opts.fact;
|
|
16
|
+
this.consequence = opts.consequence;
|
|
17
|
+
this.action = opts.action;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export const SLICE_TEMPLATE_KINDS = [
|
|
21
|
+
"placeholder",
|
|
22
|
+
"bug-fix",
|
|
23
|
+
"backlog-deprecation",
|
|
24
|
+
"backlog-tech-debt",
|
|
25
|
+
"release-feature",
|
|
26
|
+
"research",
|
|
27
|
+
];
|
|
28
|
+
export const MISSION_TEMPLATE_KINDS = [
|
|
29
|
+
"placeholder",
|
|
30
|
+
"release",
|
|
31
|
+
];
|
|
32
|
+
export const CLOSE_REASONS = [
|
|
33
|
+
"wontfix",
|
|
34
|
+
"deferred",
|
|
35
|
+
"superseded",
|
|
36
|
+
"stale",
|
|
37
|
+
];
|
|
38
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/domain/scope/types.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,2CAA2C;AAC3C,oEAAoE;AACpE,kEAAkE;AAClE,oEAAoE;AAgDpE,mEAAmE;AACnE,MAAM,OAAO,aAAc,SAAQ,KAAK;IAC7B,IAAI,CAAS;IACb,WAAW,CAAS;IACpB,MAAM,CAAS;IACxB,YAAY,IAA2D;QACrE,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF;AAUD,MAAM,CAAC,MAAM,oBAAoB,GAAqC;IACpE,aAAa;IACb,SAAS;IACT,qBAAqB;IACrB,mBAAmB;IACnB,iBAAiB;IACjB,UAAU;CACX,CAAC;AAGF,MAAM,CAAC,MAAM,sBAAsB,GAAuC;IACxE,aAAa;IACb,SAAS;CACV,CAAC;AAGF,MAAM,CAAC,MAAM,aAAa,GAA+B;IACvD,SAAS;IACT,UAAU;IACV,YAAY;IACZ,OAAO;CACR,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
1
2
|
import type { SessionRegistry } from "./session-registry.js";
|
|
2
3
|
import type { EventBus } from "./event-bus.js";
|
|
3
4
|
import type { AgentActivityStore } from "./agent-activity-store.js";
|
|
@@ -15,6 +16,14 @@ export interface ClearAttentionResult {
|
|
|
15
16
|
reason?: string;
|
|
16
17
|
detail?: string;
|
|
17
18
|
previousError?: string | null;
|
|
19
|
+
clearedClasses?: ("startup_status" | "restore_outcome")[];
|
|
20
|
+
derivedEvidence?: {
|
|
21
|
+
source: string;
|
|
22
|
+
kind?: string;
|
|
23
|
+
state?: string;
|
|
24
|
+
reason?: string;
|
|
25
|
+
runtimeCwdVerified: boolean;
|
|
26
|
+
};
|
|
18
27
|
}
|
|
19
28
|
export interface SendVerifyFn {
|
|
20
29
|
(sessionName: string, text: string, opts?: {
|
|
@@ -41,6 +50,7 @@ interface ClearAttentionDeps {
|
|
|
41
50
|
agentActivityStore: AgentActivityStore;
|
|
42
51
|
sendVerify?: SendVerifyFn;
|
|
43
52
|
capture?: CaptureFn;
|
|
53
|
+
db?: Database.Database;
|
|
44
54
|
}
|
|
45
55
|
export declare class SeatAttentionReconciler {
|
|
46
56
|
private deps;
|
|
@@ -48,7 +58,9 @@ export declare class SeatAttentionReconciler {
|
|
|
48
58
|
clearAttention(sessionName: string, opts?: {
|
|
49
59
|
reason?: string;
|
|
50
60
|
}): Promise<ClearAttentionResult>;
|
|
61
|
+
private performEvidenceClear;
|
|
51
62
|
private findLatestSessionByName;
|
|
63
|
+
private getDerivedAttentionOutcome;
|
|
52
64
|
}
|
|
53
65
|
export {};
|
|
54
66
|
//# sourceMappingURL=seat-attention-reconciler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seat-attention-reconciler.d.ts","sourceRoot":"","sources":["../../src/domain/seat-attention-reconciler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,kBAAkB,GAAG,6BAA6B,GAAG,SAAS,CAAC;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,UAAU,GAAG,sBAAsB,CAAC;IAChD,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"seat-attention-reconciler.d.ts","sourceRoot":"","sources":["../../src/domain/seat-attention-reconciler.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,kBAAkB,GAAG,6BAA6B,GAAG,SAAS,CAAC;IACtE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,UAAU,GAAG,sBAAsB,CAAC;IAChD,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,CAAC,EAAE,CAAC,gBAAgB,GAAG,iBAAiB,CAAC,EAAE,CAAC;IAC1D,eAAe,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,kBAAkB,EAAE,OAAO,CAAA;KAAE,CAAC;CACnH;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAClI;AAED,MAAM,WAAW,SAAS;IACxB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACnI;AAED,UAAU,kBAAkB;IAC1B,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC;CACxB;AAID,qBAAa,uBAAuB;IAClC,OAAO,CAAC,IAAI,CAAqB;gBAErB,IAAI,EAAE,kBAAkB;IAI9B,cAAc,CAClB,WAAW,EAAE,MAAM,EACnB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACzB,OAAO,CAAC,oBAAoB,CAAC;IAuGhC,OAAO,CAAC,oBAAoB;IAqD5B,OAAO,CAAC,uBAAuB;IA8C/B,OAAO,CAAC,0BAA0B;CA0BnC"}
|
|
@@ -13,24 +13,42 @@ export class SeatAttentionReconciler {
|
|
|
13
13
|
if (!session) {
|
|
14
14
|
return { ok: false, code: "not_in_attention", detail: `Session '${sessionName}' not found` };
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
const startupClassActive = session.startupStatus === "attention_required" || session.startupStatus === "failed";
|
|
17
|
+
const derivedOutcome = this.getDerivedAttentionOutcome(session);
|
|
18
|
+
if (!startupClassActive && !!!derivedOutcome) {
|
|
19
|
+
return { ok: false, code: "not_in_attention", detail: `Session startup_status is '${session.startupStatus}' and restoreOutcome is not attention/failed — not in attention` };
|
|
18
20
|
}
|
|
19
21
|
const previousError = session.latestError ?? null;
|
|
20
22
|
// Operator attestation override (--reason).
|
|
21
23
|
if (opts?.reason) {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
const clearedClasses = [];
|
|
25
|
+
if (startupClassActive) {
|
|
26
|
+
sessionRegistry.updateStartupStatus(session.id, "ready", new Date().toISOString());
|
|
27
|
+
eventBus.emit({
|
|
28
|
+
type: "seat.attention_cleared",
|
|
29
|
+
rigId: session.rigId,
|
|
30
|
+
nodeId: session.nodeId,
|
|
31
|
+
sessionName,
|
|
32
|
+
from: session.startupStatus,
|
|
33
|
+
to: "ready",
|
|
34
|
+
clearedBy: "operator_attestation",
|
|
35
|
+
reason: opts.reason,
|
|
36
|
+
previousError,
|
|
37
|
+
});
|
|
38
|
+
clearedClasses.push("startup_status");
|
|
39
|
+
}
|
|
40
|
+
if (derivedOutcome) {
|
|
41
|
+
eventBus.emit({
|
|
42
|
+
type: "restore.outcome_reconciled",
|
|
43
|
+
rigId: session.rigId,
|
|
44
|
+
nodeId: session.nodeId,
|
|
45
|
+
attemptId: 0,
|
|
46
|
+
from: derivedOutcome,
|
|
47
|
+
to: "operator_recovered",
|
|
48
|
+
evidence: { source: "operator_attestation", reason: opts.reason, runtimeCwdVerified: false },
|
|
49
|
+
});
|
|
50
|
+
clearedClasses.push("restore_outcome");
|
|
51
|
+
}
|
|
34
52
|
return {
|
|
35
53
|
ok: true,
|
|
36
54
|
code: "cleared",
|
|
@@ -39,6 +57,8 @@ export class SeatAttentionReconciler {
|
|
|
39
57
|
clearedBy: "operator_attestation",
|
|
40
58
|
reason: opts.reason,
|
|
41
59
|
previousError,
|
|
60
|
+
clearedClasses,
|
|
61
|
+
derivedEvidence: derivedOutcome ? { source: "operator_attestation", reason: opts.reason, runtimeCwdVerified: false } : undefined,
|
|
42
62
|
};
|
|
43
63
|
}
|
|
44
64
|
// Evidence-gated clear.
|
|
@@ -47,27 +67,8 @@ export class SeatAttentionReconciler {
|
|
|
47
67
|
sessionName,
|
|
48
68
|
});
|
|
49
69
|
if (activity && activity.stale !== true && POSITIVE_STATES.has(activity.state)) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
type: "seat.attention_cleared",
|
|
53
|
-
rigId: session.rigId,
|
|
54
|
-
nodeId: session.nodeId,
|
|
55
|
-
sessionName,
|
|
56
|
-
from: session.startupStatus,
|
|
57
|
-
to: "ready",
|
|
58
|
-
clearedBy: "evidence",
|
|
59
|
-
evidence: { kind: "fresh_activity", state: activity.state, reason: activity.reason },
|
|
60
|
-
previousError,
|
|
61
|
-
});
|
|
62
|
-
return {
|
|
63
|
-
ok: true,
|
|
64
|
-
code: "cleared",
|
|
65
|
-
from: session.startupStatus,
|
|
66
|
-
to: "ready",
|
|
67
|
-
clearedBy: "evidence",
|
|
68
|
-
evidence: { kind: "fresh_activity", state: activity.state, reason: activity.reason },
|
|
69
|
-
previousError,
|
|
70
|
-
};
|
|
70
|
+
const evidence = { kind: "fresh_activity", state: activity.state, reason: activity.reason };
|
|
71
|
+
return this.performEvidenceClear(session, sessionName, startupClassActive, derivedOutcome, evidence, previousError);
|
|
71
72
|
}
|
|
72
73
|
// Second evidence path: active send-verify round-trip.
|
|
73
74
|
if (this.deps.sendVerify) {
|
|
@@ -75,67 +76,21 @@ export class SeatAttentionReconciler {
|
|
|
75
76
|
const probeText = `# OpenRig attention-clear liveness probe ${Date.now()}`;
|
|
76
77
|
const sendResult = await this.deps.sendVerify(sessionName, probeText, { verify: true });
|
|
77
78
|
if (sendResult.ok && (sendResult.outcome === "delivered" || sendResult.verified === true)) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
type: "seat.attention_cleared",
|
|
81
|
-
rigId: session.rigId,
|
|
82
|
-
nodeId: session.nodeId,
|
|
83
|
-
sessionName,
|
|
84
|
-
from: session.startupStatus,
|
|
85
|
-
to: "ready",
|
|
86
|
-
clearedBy: "evidence",
|
|
87
|
-
evidence: { kind: "send_verify_roundtrip", state: sendResult.outcome ?? "delivered" },
|
|
88
|
-
previousError,
|
|
89
|
-
});
|
|
90
|
-
return {
|
|
91
|
-
ok: true,
|
|
92
|
-
code: "cleared",
|
|
93
|
-
from: session.startupStatus,
|
|
94
|
-
to: "ready",
|
|
95
|
-
clearedBy: "evidence",
|
|
96
|
-
evidence: { kind: "send_verify_roundtrip", state: sendResult.outcome ?? "delivered" },
|
|
97
|
-
previousError,
|
|
98
|
-
};
|
|
79
|
+
const evidence = { kind: "send_verify_roundtrip", state: sendResult.outcome ?? "delivered" };
|
|
80
|
+
return this.performEvidenceClear(session, sessionName, startupClassActive, derivedOutcome, evidence, previousError);
|
|
99
81
|
}
|
|
100
|
-
// rendered-unconfirmed: text landed but verify raced a TUI redraw.
|
|
101
|
-
// Attempt capture-confirmation if capture dep is available.
|
|
102
82
|
if (sendResult.ok && sendResult.outcome === "rendered-unconfirmed" && this.deps.capture) {
|
|
103
83
|
try {
|
|
104
84
|
const captureResult = await this.deps.capture(sessionName, { lines: 50 });
|
|
105
85
|
if (captureResult.ok && captureResult.content && captureResult.content.includes(probeText)) {
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
type: "seat.attention_cleared",
|
|
109
|
-
rigId: session.rigId,
|
|
110
|
-
nodeId: session.nodeId,
|
|
111
|
-
sessionName,
|
|
112
|
-
from: session.startupStatus,
|
|
113
|
-
to: "ready",
|
|
114
|
-
clearedBy: "evidence",
|
|
115
|
-
evidence: { kind: "send_verify_capture_confirmed", state: "rendered-unconfirmed" },
|
|
116
|
-
previousError,
|
|
117
|
-
});
|
|
118
|
-
return {
|
|
119
|
-
ok: true,
|
|
120
|
-
code: "cleared",
|
|
121
|
-
from: session.startupStatus,
|
|
122
|
-
to: "ready",
|
|
123
|
-
clearedBy: "evidence",
|
|
124
|
-
evidence: { kind: "send_verify_capture_confirmed", state: "rendered-unconfirmed" },
|
|
125
|
-
previousError,
|
|
126
|
-
};
|
|
86
|
+
const evidence = { kind: "send_verify_capture_confirmed", state: "rendered-unconfirmed" };
|
|
87
|
+
return this.performEvidenceClear(session, sessionName, startupClassActive, derivedOutcome, evidence, previousError);
|
|
127
88
|
}
|
|
128
89
|
}
|
|
129
|
-
catch {
|
|
130
|
-
// Capture failed — transport error. Do not clear on capture failure.
|
|
131
|
-
}
|
|
90
|
+
catch { /* Capture failed */ }
|
|
132
91
|
}
|
|
133
|
-
// No capture dep, or capture didn't confirm: could-not-confirm, NOT dead.
|
|
134
|
-
// failed: transport did not land. Neither clears.
|
|
135
|
-
}
|
|
136
|
-
catch {
|
|
137
|
-
// Send failed — transport error. Do not clear.
|
|
138
92
|
}
|
|
93
|
+
catch { /* Send failed */ }
|
|
139
94
|
}
|
|
140
95
|
return {
|
|
141
96
|
ok: false,
|
|
@@ -145,8 +100,50 @@ export class SeatAttentionReconciler {
|
|
|
145
100
|
: "No recent agent activity found; send-verify also not confirmed",
|
|
146
101
|
};
|
|
147
102
|
}
|
|
103
|
+
performEvidenceClear(session, sessionName, startupClassActive, derivedOutcome, evidence, previousError) {
|
|
104
|
+
const { sessionRegistry, eventBus } = this.deps;
|
|
105
|
+
const clearedClasses = [];
|
|
106
|
+
if (startupClassActive) {
|
|
107
|
+
sessionRegistry.updateStartupStatus(session.id, "ready", new Date().toISOString());
|
|
108
|
+
eventBus.emit({
|
|
109
|
+
type: "seat.attention_cleared",
|
|
110
|
+
rigId: session.rigId,
|
|
111
|
+
nodeId: session.nodeId,
|
|
112
|
+
sessionName,
|
|
113
|
+
from: session.startupStatus,
|
|
114
|
+
to: "ready",
|
|
115
|
+
clearedBy: "evidence",
|
|
116
|
+
evidence,
|
|
117
|
+
previousError,
|
|
118
|
+
});
|
|
119
|
+
clearedClasses.push("startup_status");
|
|
120
|
+
}
|
|
121
|
+
if (derivedOutcome) {
|
|
122
|
+
eventBus.emit({
|
|
123
|
+
type: "restore.outcome_reconciled",
|
|
124
|
+
rigId: session.rigId,
|
|
125
|
+
nodeId: session.nodeId,
|
|
126
|
+
attemptId: 0,
|
|
127
|
+
from: derivedOutcome,
|
|
128
|
+
to: "operator_recovered",
|
|
129
|
+
evidence: { source: "clear_attention_evidence", kind: evidence.kind, state: evidence.state, runtimeCwdVerified: false },
|
|
130
|
+
});
|
|
131
|
+
clearedClasses.push("restore_outcome");
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
ok: true,
|
|
135
|
+
code: "cleared",
|
|
136
|
+
from: session.startupStatus,
|
|
137
|
+
to: "ready",
|
|
138
|
+
clearedBy: "evidence",
|
|
139
|
+
evidence,
|
|
140
|
+
previousError,
|
|
141
|
+
clearedClasses,
|
|
142
|
+
derivedEvidence: derivedOutcome ? { source: "clear_attention_evidence", kind: evidence.kind, state: evidence.state, runtimeCwdVerified: false } : undefined,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
148
145
|
findLatestSessionByName(sessionName) {
|
|
149
|
-
const row = this.deps.sessionRegistry.db.prepare(`SELECT s.id, s.node_id, n.rig_id, s.startup_status,
|
|
146
|
+
const row = this.deps.sessionRegistry.db.prepare(`SELECT s.id, s.node_id, n.rig_id, s.startup_status, s.status,
|
|
150
147
|
(SELECT e.payload FROM events e WHERE e.node_id = s.node_id AND e.type IN ('node.startup_attention_required','node.startup_failed') ORDER BY e.seq DESC LIMIT 1) as latest_error_payload
|
|
151
148
|
FROM sessions s
|
|
152
149
|
JOIN nodes n ON n.id = s.node_id
|
|
@@ -169,8 +166,39 @@ export class SeatAttentionReconciler {
|
|
|
169
166
|
nodeId: row.node_id,
|
|
170
167
|
rigId: row.rig_id,
|
|
171
168
|
startupStatus: row.startup_status ?? "pending",
|
|
169
|
+
sessionStatus: row.status ?? "unknown",
|
|
172
170
|
latestError,
|
|
173
171
|
};
|
|
174
172
|
}
|
|
173
|
+
getDerivedAttentionOutcome(session) {
|
|
174
|
+
if (!this.deps.db)
|
|
175
|
+
return null;
|
|
176
|
+
const rows = this.deps.db.prepare("SELECT type, payload FROM events WHERE rig_id = ? AND type IN ('restore.completed', 'restore.subset_completed', 'restore.outcome_reconciled') ORDER BY seq DESC").all(session.rigId);
|
|
177
|
+
for (const row of rows) {
|
|
178
|
+
try {
|
|
179
|
+
if (row.type === "restore.outcome_reconciled") {
|
|
180
|
+
const ev = JSON.parse(row.payload);
|
|
181
|
+
if (ev.nodeId !== session.nodeId)
|
|
182
|
+
continue;
|
|
183
|
+
return ev.to === "operator_recovered" ? null : "attention_required";
|
|
184
|
+
}
|
|
185
|
+
const ev = JSON.parse(row.payload);
|
|
186
|
+
const n = ev.result.nodes.find((nd) => nd.nodeId === session.nodeId);
|
|
187
|
+
if (!n)
|
|
188
|
+
continue;
|
|
189
|
+
// Mirror deriveNodeLifecycleState: attention_required regardless of
|
|
190
|
+
// sessionStatus; failed only when sessionStatus=running.
|
|
191
|
+
if (n.status === "attention_required")
|
|
192
|
+
return "attention_required";
|
|
193
|
+
if (n.status === "failed" && session.sessionStatus === "running")
|
|
194
|
+
return "failed";
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
175
203
|
}
|
|
176
204
|
//# sourceMappingURL=seat-attention-reconciler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seat-attention-reconciler.js","sourceRoot":"","sources":["../../src/domain/seat-attention-reconciler.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,yEAAyE;
|
|
1
|
+
{"version":3,"file":"seat-attention-reconciler.js","sourceRoot":"","sources":["../../src/domain/seat-attention-reconciler.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,10 @@ interface BindingFields {
|
|
|
9
9
|
cmuxWorkspace?: string;
|
|
10
10
|
cmuxSurface?: string;
|
|
11
11
|
}
|
|
12
|
+
/** Resume-token provenance precedence (OPR.0.4.0.22). Higher rank wins;
|
|
13
|
+
* a lower-rank write never overwrites a higher-rank persisted token.
|
|
14
|
+
* operator/attested (deliberate set) > hook (runtime) > scrape (pane). */
|
|
15
|
+
export declare const RESUME_PROVENANCE_RANK: Record<string, number>;
|
|
12
16
|
export declare class SessionRegistry {
|
|
13
17
|
readonly db: Database.Database;
|
|
14
18
|
constructor(db: Database.Database);
|
|
@@ -17,7 +21,17 @@ export declare class SessionRegistry {
|
|
|
17
21
|
registerClaimedSession(nodeId: string, sessionName: string): Session;
|
|
18
22
|
updateStatus(sessionId: string, status: string): void;
|
|
19
23
|
updateStartupStatus(sessionId: string, status: "pending" | "ready" | "attention_required" | "failed", completedAt?: string): void;
|
|
20
|
-
updateResumeToken(sessionId: string, type: string, token: string): void;
|
|
24
|
+
updateResumeToken(sessionId: string, type: string, token: string, provenance?: "hook" | "scrape" | "operator"): void;
|
|
25
|
+
/** OPR.0.4.0.22 — resolve a canonical session name to the context needed to
|
|
26
|
+
* set its resume token: the latest session row + its node's runtime + the
|
|
27
|
+
* current resume provenance. Returns null when no session matches. */
|
|
28
|
+
findResumeContextByName(sessionName: string): {
|
|
29
|
+
sessionId: string;
|
|
30
|
+
nodeId: string;
|
|
31
|
+
rigId: string;
|
|
32
|
+
runtime: string | null;
|
|
33
|
+
currentProvenance: string | null;
|
|
34
|
+
} | null;
|
|
21
35
|
clearResumeToken(sessionId: string): void;
|
|
22
36
|
markDetached(sessionId: string): void;
|
|
23
37
|
markSuperseded(sessionId: string): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../../src/domain/session-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGnD,UAAU,aAAa;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,eAAe;IAC1B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;gBACnB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAkB7D,2GAA2G;IAC3G,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAapE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAMrD,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,oBAAoB,GAAG,QAAQ,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../../src/domain/session-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAI3C,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGnD,UAAU,aAAa;IACrB,cAAc,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;2EAE2E;AAC3E,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIzD,CAAC;AAEF,qBAAa,eAAe;IAC1B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,CAAC;gBACnB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAkB7D,2GAA2G;IAC3G,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAapE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAMrD,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,oBAAoB,GAAG,QAAQ,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI;IAgBjI,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI;IAkBpH;;2EAEuE;IACvE,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG;QAC5C,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;KAClC,GAAG,IAAI;IAwBR,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAMzC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIrC,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIvC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIlC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE;IAa3C,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI;IAQjD,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO;IA8D7D,OAAO,CAAC,YAAY;IAiBpB,OAAO,CAAC,YAAY;CAcrB"}
|