@openrig/cli 0.3.4-rc.0 → 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.
Files changed (250) hide show
  1. package/daemon/assets/plugins/openrig-core/hooks/scripts/activity-relay.cjs +34 -0
  2. package/daemon/dist/adapters/codex-resume.d.ts +2 -1
  3. package/daemon/dist/adapters/codex-resume.d.ts.map +1 -1
  4. package/daemon/dist/adapters/codex-resume.js +18 -6
  5. package/daemon/dist/adapters/codex-resume.js.map +1 -1
  6. package/daemon/dist/adapters/codex-runtime-adapter.d.ts +5 -1
  7. package/daemon/dist/adapters/codex-runtime-adapter.d.ts.map +1 -1
  8. package/daemon/dist/adapters/codex-runtime-adapter.js +58 -5
  9. package/daemon/dist/adapters/codex-runtime-adapter.js.map +1 -1
  10. package/daemon/dist/adapters/tmux.d.ts +28 -14
  11. package/daemon/dist/adapters/tmux.d.ts.map +1 -1
  12. package/daemon/dist/adapters/tmux.js +65 -30
  13. package/daemon/dist/adapters/tmux.js.map +1 -1
  14. package/daemon/dist/db/migrations/043_resume_provenance.d.ts +3 -0
  15. package/daemon/dist/db/migrations/043_resume_provenance.d.ts.map +1 -0
  16. package/daemon/dist/db/migrations/043_resume_provenance.js +5 -0
  17. package/daemon/dist/db/migrations/043_resume_provenance.js.map +1 -0
  18. package/daemon/dist/domain/agent-activity-store.d.ts +11 -1
  19. package/daemon/dist/domain/agent-activity-store.d.ts.map +1 -1
  20. package/daemon/dist/domain/agent-activity-store.js +11 -2
  21. package/daemon/dist/domain/agent-activity-store.js.map +1 -1
  22. package/daemon/dist/domain/native-resume-probe.d.ts +2 -1
  23. package/daemon/dist/domain/native-resume-probe.d.ts.map +1 -1
  24. package/daemon/dist/domain/native-resume-probe.js +21 -2
  25. package/daemon/dist/domain/native-resume-probe.js.map +1 -1
  26. package/daemon/dist/domain/node-inventory.d.ts.map +1 -1
  27. package/daemon/dist/domain/node-inventory.js +70 -46
  28. package/daemon/dist/domain/node-inventory.js.map +1 -1
  29. package/daemon/dist/domain/node-launcher.d.ts +7 -7
  30. package/daemon/dist/domain/node-launcher.d.ts.map +1 -1
  31. package/daemon/dist/domain/node-launcher.js +0 -22
  32. package/daemon/dist/domain/node-launcher.js.map +1 -1
  33. package/daemon/dist/domain/profile-resolver.d.ts +4 -5
  34. package/daemon/dist/domain/profile-resolver.d.ts.map +1 -1
  35. package/daemon/dist/domain/profile-resolver.js.map +1 -1
  36. package/daemon/dist/domain/queue-repository.d.ts +4 -0
  37. package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
  38. package/daemon/dist/domain/queue-repository.js +21 -2
  39. package/daemon/dist/domain/queue-repository.js.map +1 -1
  40. package/daemon/dist/domain/restore-check-service.d.ts +14 -0
  41. package/daemon/dist/domain/restore-check-service.d.ts.map +1 -1
  42. package/daemon/dist/domain/restore-check-service.js +78 -8
  43. package/daemon/dist/domain/restore-check-service.js.map +1 -1
  44. package/daemon/dist/domain/restore-orchestrator.d.ts.map +1 -1
  45. package/daemon/dist/domain/restore-orchestrator.js +3 -3
  46. package/daemon/dist/domain/restore-orchestrator.js.map +1 -1
  47. package/daemon/dist/domain/resume-metadata-refresher.js +1 -1
  48. package/daemon/dist/domain/resume-metadata-refresher.js.map +1 -1
  49. package/daemon/dist/domain/resume-token-validation.d.ts +17 -0
  50. package/daemon/dist/domain/resume-token-validation.d.ts.map +1 -0
  51. package/daemon/dist/domain/resume-token-validation.js +46 -0
  52. package/daemon/dist/domain/resume-token-validation.js.map +1 -0
  53. package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
  54. package/daemon/dist/domain/rigspec-instantiator.js +3 -6
  55. package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
  56. package/daemon/dist/domain/runtime-adapter.d.ts.map +1 -1
  57. package/daemon/dist/domain/runtime-adapter.js +1 -0
  58. package/daemon/dist/domain/runtime-adapter.js.map +1 -1
  59. package/daemon/dist/domain/scope/dot-id.d.ts +43 -0
  60. package/daemon/dist/domain/scope/dot-id.d.ts.map +1 -0
  61. package/daemon/dist/domain/scope/dot-id.js +165 -0
  62. package/daemon/dist/domain/scope/dot-id.js.map +1 -0
  63. package/daemon/dist/domain/scope/scope-audit.d.ts +26 -0
  64. package/daemon/dist/domain/scope/scope-audit.d.ts.map +1 -0
  65. package/daemon/dist/domain/scope/scope-audit.js +96 -0
  66. package/daemon/dist/domain/scope/scope-audit.js.map +1 -0
  67. package/daemon/dist/domain/scope/types.d.ts +61 -0
  68. package/daemon/dist/domain/scope/types.d.ts.map +1 -0
  69. package/daemon/dist/domain/scope/types.js +38 -0
  70. package/daemon/dist/domain/scope/types.js.map +1 -0
  71. package/daemon/dist/domain/seat-attention-reconciler.d.ts +12 -0
  72. package/daemon/dist/domain/seat-attention-reconciler.d.ts.map +1 -1
  73. package/daemon/dist/domain/seat-attention-reconciler.js +116 -88
  74. package/daemon/dist/domain/seat-attention-reconciler.js.map +1 -1
  75. package/daemon/dist/domain/session-registry.d.ts +15 -1
  76. package/daemon/dist/domain/session-registry.d.ts.map +1 -1
  77. package/daemon/dist/domain/session-registry.js +46 -4
  78. package/daemon/dist/domain/session-registry.js.map +1 -1
  79. package/daemon/dist/domain/skill-audit.d.ts +47 -0
  80. package/daemon/dist/domain/skill-audit.d.ts.map +1 -0
  81. package/daemon/dist/domain/skill-audit.js +218 -0
  82. package/daemon/dist/domain/skill-audit.js.map +1 -0
  83. package/daemon/dist/domain/skill-discovery.d.ts +15 -0
  84. package/daemon/dist/domain/skill-discovery.d.ts.map +1 -1
  85. package/daemon/dist/domain/skill-discovery.js +70 -0
  86. package/daemon/dist/domain/skill-discovery.js.map +1 -1
  87. package/daemon/dist/domain/skill-mirror-drift.d.ts +10 -0
  88. package/daemon/dist/domain/skill-mirror-drift.d.ts.map +1 -0
  89. package/daemon/dist/domain/skill-mirror-drift.js +24 -0
  90. package/daemon/dist/domain/skill-mirror-drift.js.map +1 -0
  91. package/daemon/dist/domain/startup-orchestrator.js +1 -1
  92. package/daemon/dist/domain/startup-orchestrator.js.map +1 -1
  93. package/daemon/dist/domain/types.d.ts +38 -14
  94. package/daemon/dist/domain/types.d.ts.map +1 -1
  95. package/daemon/dist/domain/types.js.map +1 -1
  96. package/daemon/dist/domain/user-settings/settings-store.d.ts +1 -1
  97. package/daemon/dist/domain/user-settings/settings-store.d.ts.map +1 -1
  98. package/daemon/dist/domain/user-settings/settings-store.js +4 -0
  99. package/daemon/dist/domain/user-settings/settings-store.js.map +1 -1
  100. package/daemon/dist/domain/whoami-service.d.ts +1 -0
  101. package/daemon/dist/domain/whoami-service.d.ts.map +1 -1
  102. package/daemon/dist/domain/whoami-service.js +8 -4
  103. package/daemon/dist/domain/whoami-service.js.map +1 -1
  104. package/daemon/dist/index.d.ts.map +1 -1
  105. package/daemon/dist/index.js +25 -3
  106. package/daemon/dist/index.js.map +1 -1
  107. package/daemon/dist/routes/activity.d.ts.map +1 -1
  108. package/daemon/dist/routes/activity.js +29 -0
  109. package/daemon/dist/routes/activity.js.map +1 -1
  110. package/daemon/dist/routes/queue.d.ts.map +1 -1
  111. package/daemon/dist/routes/queue.js +8 -0
  112. package/daemon/dist/routes/queue.js.map +1 -1
  113. package/daemon/dist/routes/restore-check.js +33 -2
  114. package/daemon/dist/routes/restore-check.js.map +1 -1
  115. package/daemon/dist/routes/scope-audit.d.ts +3 -0
  116. package/daemon/dist/routes/scope-audit.d.ts.map +1 -0
  117. package/daemon/dist/routes/scope-audit.js +148 -0
  118. package/daemon/dist/routes/scope-audit.js.map +1 -0
  119. package/daemon/dist/routes/sessions.d.ts.map +1 -1
  120. package/daemon/dist/routes/sessions.js +67 -3
  121. package/daemon/dist/routes/sessions.js.map +1 -1
  122. package/daemon/dist/routes/skills.d.ts.map +1 -1
  123. package/daemon/dist/routes/skills.js +43 -0
  124. package/daemon/dist/routes/skills.js.map +1 -1
  125. package/daemon/dist/routes/terminal-ws.d.ts +7 -0
  126. package/daemon/dist/routes/terminal-ws.d.ts.map +1 -0
  127. package/daemon/dist/routes/terminal-ws.js +132 -0
  128. package/daemon/dist/routes/terminal-ws.js.map +1 -0
  129. package/daemon/dist/routes/transport.d.ts +3 -1
  130. package/daemon/dist/routes/transport.d.ts.map +1 -1
  131. package/daemon/dist/routes/transport.js +4 -1
  132. package/daemon/dist/routes/transport.js.map +1 -1
  133. package/daemon/dist/routes/whoami.d.ts.map +1 -1
  134. package/daemon/dist/routes/whoami.js +5 -0
  135. package/daemon/dist/routes/whoami.js.map +1 -1
  136. package/daemon/dist/server.d.ts +6 -0
  137. package/daemon/dist/server.d.ts.map +1 -1
  138. package/daemon/dist/server.js +29 -2
  139. package/daemon/dist/server.js.map +1 -1
  140. package/daemon/dist/startup.d.ts +8 -0
  141. package/daemon/dist/startup.d.ts.map +1 -1
  142. package/daemon/dist/startup.js +27 -8
  143. package/daemon/dist/startup.js.map +1 -1
  144. package/daemon/dist/terminal/TerminalSessionBroker.d.ts +173 -0
  145. package/daemon/dist/terminal/TerminalSessionBroker.d.ts.map +1 -0
  146. package/daemon/dist/terminal/TerminalSessionBroker.js +570 -0
  147. package/daemon/dist/terminal/TerminalSessionBroker.js.map +1 -0
  148. package/daemon/specs/agents/shared/skills/core/openrig-user/SKILL.md +131 -2
  149. package/daemon/specs/agents/shared/skills/pods/orchestration-team/SKILL.md +29 -0
  150. package/dist/client.d.ts +1 -0
  151. package/dist/client.d.ts.map +1 -1
  152. package/dist/client.js +23 -0
  153. package/dist/client.js.map +1 -1
  154. package/dist/commands/capture.d.ts.map +1 -1
  155. package/dist/commands/capture.js +6 -6
  156. package/dist/commands/capture.js.map +1 -1
  157. package/dist/commands/context.d.ts.map +1 -1
  158. package/dist/commands/context.js +41 -5
  159. package/dist/commands/context.js.map +1 -1
  160. package/dist/commands/down.d.ts.map +1 -1
  161. package/dist/commands/down.js +27 -0
  162. package/dist/commands/down.js.map +1 -1
  163. package/dist/commands/launch.d.ts.map +1 -1
  164. package/dist/commands/launch.js +34 -0
  165. package/dist/commands/launch.js.map +1 -1
  166. package/dist/commands/ps.d.ts.map +1 -1
  167. package/dist/commands/ps.js +361 -53
  168. package/dist/commands/ps.js.map +1 -1
  169. package/dist/commands/queue.d.ts.map +1 -1
  170. package/dist/commands/queue.js +60 -3
  171. package/dist/commands/queue.js.map +1 -1
  172. package/dist/commands/restore-check.d.ts.map +1 -1
  173. package/dist/commands/restore-check.js +80 -2
  174. package/dist/commands/restore-check.js.map +1 -1
  175. package/dist/commands/scope.d.ts.map +1 -1
  176. package/dist/commands/scope.js +688 -4
  177. package/dist/commands/scope.js.map +1 -1
  178. package/dist/commands/seat.d.ts +3 -1
  179. package/dist/commands/seat.d.ts.map +1 -1
  180. package/dist/commands/seat.js +61 -1
  181. package/dist/commands/seat.js.map +1 -1
  182. package/dist/commands/send.d.ts.map +1 -1
  183. package/dist/commands/send.js +6 -6
  184. package/dist/commands/send.js.map +1 -1
  185. package/dist/commands/skill.d.ts +4 -0
  186. package/dist/commands/skill.d.ts.map +1 -0
  187. package/dist/commands/skill.js +77 -0
  188. package/dist/commands/skill.js.map +1 -0
  189. package/dist/commands/up.d.ts.map +1 -1
  190. package/dist/commands/up.js +27 -0
  191. package/dist/commands/up.js.map +1 -1
  192. package/dist/commands/whoami.d.ts.map +1 -1
  193. package/dist/commands/whoami.js +208 -20
  194. package/dist/commands/whoami.js.map +1 -1
  195. package/dist/cross-host-executor.d.ts +1 -1
  196. package/dist/cross-host-executor.d.ts.map +1 -1
  197. package/dist/cross-host-executor.js +3 -2
  198. package/dist/cross-host-executor.js.map +1 -1
  199. package/dist/cross-host-types.d.ts +2 -0
  200. package/dist/cross-host-types.d.ts.map +1 -0
  201. package/dist/cross-host-types.js +2 -0
  202. package/dist/cross-host-types.js.map +1 -0
  203. package/dist/host-registry.d.ts +27 -5
  204. package/dist/host-registry.d.ts.map +1 -1
  205. package/dist/host-registry.js +86 -19
  206. package/dist/host-registry.js.map +1 -1
  207. package/dist/index.d.ts +1 -0
  208. package/dist/index.d.ts.map +1 -1
  209. package/dist/index.js +2 -0
  210. package/dist/index.js.map +1 -1
  211. package/dist/lib/scope/progress-edit.d.ts +42 -0
  212. package/dist/lib/scope/progress-edit.d.ts.map +1 -0
  213. package/dist/lib/scope/progress-edit.js +171 -0
  214. package/dist/lib/scope/progress-edit.js.map +1 -0
  215. package/dist/lib/scope/scope-audit.d.ts +26 -0
  216. package/dist/lib/scope/scope-audit.d.ts.map +1 -0
  217. package/dist/lib/scope/scope-audit.js +96 -0
  218. package/dist/lib/scope/scope-audit.js.map +1 -0
  219. package/dist/lib/scope/templates.d.ts +2 -0
  220. package/dist/lib/scope/templates.d.ts.map +1 -1
  221. package/dist/lib/scope/templates.js +8 -0
  222. package/dist/lib/scope/templates.js.map +1 -1
  223. package/dist/lib/scope/trust.d.ts +30 -0
  224. package/dist/lib/scope/trust.d.ts.map +1 -0
  225. package/dist/lib/scope/trust.js +80 -0
  226. package/dist/lib/scope/trust.js.map +1 -0
  227. package/dist/lib/scope/types.d.ts +6 -0
  228. package/dist/lib/scope/types.d.ts.map +1 -1
  229. package/dist/lib/scope/types.js +8 -0
  230. package/dist/lib/scope/types.js.map +1 -1
  231. package/dist/lib/scope-templates/backlog-deprecation.md +1 -0
  232. package/dist/lib/scope-templates/backlog-tech-debt.md +1 -0
  233. package/dist/lib/scope-templates/bug-fix.md +1 -0
  234. package/dist/lib/scope-templates/mission-placeholder.md +1 -0
  235. package/dist/lib/scope-templates/mission-progress.md +12 -0
  236. package/dist/lib/scope-templates/mission-release.md +1 -0
  237. package/dist/lib/scope-templates/placeholder.md +1 -0
  238. package/dist/lib/scope-templates/release-feature.md +1 -0
  239. package/dist/lib/scope-templates/research.md +1 -0
  240. package/dist/lib/scope-templates/slice-progress.md +11 -0
  241. package/dist/remote-host-ops.d.ts +24 -0
  242. package/dist/remote-host-ops.d.ts.map +1 -0
  243. package/dist/remote-host-ops.js +53 -0
  244. package/dist/remote-host-ops.js.map +1 -0
  245. package/package.json +1 -1
  246. package/ui/dist/assets/index-DMI6jeAX.css +32 -0
  247. package/ui/dist/assets/index-FQgCB6mC.js +580 -0
  248. package/ui/dist/index.html +2 -2
  249. package/ui/dist/assets/index-C_Q5FczU.css +0 -1
  250. 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":"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"}
@@ -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;CAC/B;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;CACrB;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;IAmJhC,OAAO,CAAC,uBAAuB;CA0ChC"}
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
- if (session.startupStatus !== "attention_required" && session.startupStatus !== "failed") {
17
- return { ok: false, code: "not_in_attention", detail: `Session startup_status is '${session.startupStatus}', not attention_required/failed` };
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
- sessionRegistry.updateStartupStatus(session.id, "ready", new Date().toISOString());
23
- eventBus.emit({
24
- type: "seat.attention_cleared",
25
- rigId: session.rigId,
26
- nodeId: session.nodeId,
27
- sessionName,
28
- from: session.startupStatus,
29
- to: "ready",
30
- clearedBy: "operator_attestation",
31
- reason: opts.reason,
32
- previousError,
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
- sessionRegistry.updateStartupStatus(session.id, "ready", new Date().toISOString());
51
- eventBus.emit({
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
- sessionRegistry.updateStartupStatus(session.id, "ready", new Date().toISOString());
79
- eventBus.emit({
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
- sessionRegistry.updateStartupStatus(session.id, "ready", new Date().toISOString());
107
- eventBus.emit({
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":"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"}
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;IAYjI,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAMvE,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"}
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"}