@openrig/cli 0.5.3 → 0.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/daemon/assets/plugins/openrig-core/.claude-plugin/plugin.json +1 -1
- package/daemon/assets/plugins/openrig-core/.codex-plugin/plugin.json +1 -1
- package/daemon/assets/plugins/openrig-core/README.md +1 -1
- package/daemon/assets/plugins/openrig-core/hooks/scripts/refocus.cjs +32 -12
- package/daemon/assets/plugins/openrig-core/skills/openrig-skills/SKILL.md +3 -0
- package/daemon/assets/plugins/openrig-core/skills/software-for-agents/SKILL.md +4 -9
- package/daemon/context-packs/skills/core/agent-starters/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/agent-startup-and-context-ingestion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/attention-queue/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/cross-host-rig-commands/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/human-in-the-loop/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-architect/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-cmux/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-herdr/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/openrig-upgrade/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-bundles-and-shareable-artifacts/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/rig-lifecycle/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/session-source-fork/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/specification-system/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/topology-mutation-and-seat-management/manifest.yaml +1 -1
- package/daemon/context-packs/skills/core/watchdog/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/backlog-capture/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/context-builder/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/exec-summary/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/office-hours/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/plan-review/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/requirements-writer/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pm/ui-mockup/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/development-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/orchestration-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/oversight-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/pods/review-team/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/agent-browser/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/brainstorming/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/context-engineering/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/dogfood/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/executing-plans/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/frontend-design/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/systematic-debugging/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/test-driven-development/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/using-superpowers/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/verification-before-completion/manifest.yaml +1 -1
- package/daemon/context-packs/skills/process/writing-plans/manifest.yaml +1 -1
- package/daemon/context-packs/world/install/manifest.yaml +1 -1
- package/daemon/dist/adapters/tmux.d.ts +31 -0
- package/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/daemon/dist/adapters/tmux.js +31 -11
- package/daemon/dist/adapters/tmux.js.map +1 -1
- package/daemon/dist/build-info.js +3 -3
- package/daemon/dist/daemon-db-path.d.ts.map +1 -1
- package/daemon/dist/daemon-db-path.js +50 -2
- package/daemon/dist/daemon-db-path.js.map +1 -1
- package/daemon/dist/domain/plugin-discovery-service.d.ts +16 -0
- package/daemon/dist/domain/plugin-discovery-service.d.ts.map +1 -1
- package/daemon/dist/domain/plugin-discovery-service.js +175 -1
- package/daemon/dist/domain/plugin-discovery-service.js.map +1 -1
- package/daemon/dist/domain/plugin-vendor-service.d.ts +9 -5
- package/daemon/dist/domain/plugin-vendor-service.d.ts.map +1 -1
- package/daemon/dist/domain/plugin-vendor-service.js +101 -12
- package/daemon/dist/domain/plugin-vendor-service.js.map +1 -1
- package/daemon/dist/domain/queue-repository.d.ts +3 -1
- package/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/daemon/dist/domain/queue-repository.js +50 -2
- package/daemon/dist/domain/queue-repository.js.map +1 -1
- package/daemon/dist/domain/reconciler.d.ts.map +1 -1
- package/daemon/dist/domain/reconciler.js +6 -1
- package/daemon/dist/domain/reconciler.js.map +1 -1
- package/daemon/dist/domain/rig-repository.d.ts +4 -0
- package/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/daemon/dist/domain/rig-repository.js +9 -0
- package/daemon/dist/domain/rig-repository.js.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.d.ts +9 -0
- package/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/daemon/dist/domain/rigspec-instantiator.js +32 -0
- package/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/daemon/dist/domain/running-name-guard.d.ts +52 -0
- package/daemon/dist/domain/running-name-guard.d.ts.map +1 -0
- package/daemon/dist/domain/running-name-guard.js +34 -0
- package/daemon/dist/domain/running-name-guard.js.map +1 -0
- package/daemon/dist/domain/seat-lifecycle-service.d.ts +97 -0
- package/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -0
- package/daemon/dist/domain/seat-lifecycle-service.js +312 -0
- package/daemon/dist/domain/seat-lifecycle-service.js.map +1 -0
- package/daemon/dist/domain/session-transport.d.ts +8 -5
- package/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/daemon/dist/domain/session-transport.js +39 -16
- package/daemon/dist/domain/session-transport.js.map +1 -1
- package/daemon/dist/domain/types.d.ts +36 -0
- package/daemon/dist/domain/types.d.ts.map +1 -1
- package/daemon/dist/domain/types.js.map +1 -1
- package/daemon/dist/routes/queue.d.ts.map +1 -1
- package/daemon/dist/routes/queue.js +29 -24
- package/daemon/dist/routes/queue.js.map +1 -1
- package/daemon/dist/routes/rigspec.js +20 -6
- package/daemon/dist/routes/rigspec.js.map +1 -1
- package/daemon/dist/routes/seat.d.ts.map +1 -1
- package/daemon/dist/routes/seat.js +58 -0
- package/daemon/dist/routes/seat.js.map +1 -1
- package/daemon/dist/routes/transport.d.ts.map +1 -1
- package/daemon/dist/routes/transport.js +40 -36
- package/daemon/dist/routes/transport.js.map +1 -1
- package/daemon/dist/routes/up.js +21 -2
- package/daemon/dist/routes/up.js.map +1 -1
- package/dist/build-info.js +3 -3
- package/dist/cli-error.js +1 -1
- package/dist/cli-error.js.map +1 -1
- package/dist/commands/broadcast.js +6 -0
- package/dist/commands/broadcast.js.map +1 -1
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +13 -3
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/daemon.d.ts.map +1 -1
- package/dist/commands/daemon.js +23 -2
- package/dist/commands/daemon.js.map +1 -1
- package/dist/commands/import.d.ts.map +1 -1
- package/dist/commands/import.js +10 -0
- package/dist/commands/import.js.map +1 -1
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +36 -13
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/seat.d.ts.map +1 -1
- package/dist/commands/seat.js +88 -0
- package/dist/commands/seat.js.map +1 -1
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +224 -20
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/up.d.ts.map +1 -1
- package/dist/commands/up.js +8 -0
- package/dist/commands/up.js.map +1 -1
- package/dist/commands/walk.d.ts +1 -1
- package/dist/commands/walk.d.ts.map +1 -1
- package/dist/commands/walk.js +20 -10
- package/dist/commands/walk.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/adapters/tmux.d.ts +31 -0
- package/node_modules/@openrig/daemon/dist/adapters/tmux.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/adapters/tmux.js +31 -11
- package/node_modules/@openrig/daemon/dist/adapters/tmux.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/build-info.js +3 -3
- package/node_modules/@openrig/daemon/dist/daemon-db-path.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/daemon-db-path.js +50 -2
- package/node_modules/@openrig/daemon/dist/daemon-db-path.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/plugin-discovery-service.d.ts +16 -0
- package/node_modules/@openrig/daemon/dist/domain/plugin-discovery-service.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/plugin-discovery-service.js +175 -1
- package/node_modules/@openrig/daemon/dist/domain/plugin-discovery-service.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/plugin-vendor-service.d.ts +9 -5
- package/node_modules/@openrig/daemon/dist/domain/plugin-vendor-service.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/plugin-vendor-service.js +101 -12
- package/node_modules/@openrig/daemon/dist/domain/plugin-vendor-service.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts +3 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.js +50 -2
- package/node_modules/@openrig/daemon/dist/domain/queue-repository.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/reconciler.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/reconciler.js +6 -1
- package/node_modules/@openrig/daemon/dist/domain/reconciler.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-repository.d.ts +4 -0
- package/node_modules/@openrig/daemon/dist/domain/rig-repository.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rig-repository.js +9 -0
- package/node_modules/@openrig/daemon/dist/domain/rig-repository.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts +9 -0
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js +32 -0
- package/node_modules/@openrig/daemon/dist/domain/rigspec-instantiator.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/running-name-guard.d.ts +52 -0
- package/node_modules/@openrig/daemon/dist/domain/running-name-guard.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/running-name-guard.js +34 -0
- package/node_modules/@openrig/daemon/dist/domain/running-name-guard.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/seat-lifecycle-service.d.ts +97 -0
- package/node_modules/@openrig/daemon/dist/domain/seat-lifecycle-service.d.ts.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/seat-lifecycle-service.js +312 -0
- package/node_modules/@openrig/daemon/dist/domain/seat-lifecycle-service.js.map +1 -0
- package/node_modules/@openrig/daemon/dist/domain/session-transport.d.ts +8 -5
- package/node_modules/@openrig/daemon/dist/domain/session-transport.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/session-transport.js +39 -16
- package/node_modules/@openrig/daemon/dist/domain/session-transport.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/types.d.ts +36 -0
- package/node_modules/@openrig/daemon/dist/domain/types.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/domain/types.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/queue.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/queue.js +29 -24
- package/node_modules/@openrig/daemon/dist/routes/queue.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/rigspec.js +20 -6
- package/node_modules/@openrig/daemon/dist/routes/rigspec.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/seat.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/seat.js +58 -0
- package/node_modules/@openrig/daemon/dist/routes/seat.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/transport.d.ts.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/transport.js +40 -36
- package/node_modules/@openrig/daemon/dist/routes/transport.js.map +1 -1
- package/node_modules/@openrig/daemon/dist/routes/up.js +21 -2
- package/node_modules/@openrig/daemon/dist/routes/up.js.map +1 -1
- package/node_modules/@openrig/daemon/package.json +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
/**
|
|
3
|
+
* S5b (OPR.0.5.4.11) — the running-name guard, the FLOOR against duplicate rig
|
|
4
|
+
* identity: `rig up` on a name whose rig is RUNNING must refuse before any
|
|
5
|
+
* create/launch, because session addresses are name-keyed
|
|
6
|
+
* (`{pod}-{member}@{rig}`) and a second running rig collides tmux names, queue
|
|
7
|
+
* destinations, and transcripts while doubling seat launches on one namespace.
|
|
8
|
+
*
|
|
9
|
+
* RUNNING is derived exactly as the daemon already derives it — the rigs table
|
|
10
|
+
* has no status column; a rig is running iff it has at least one sessions row
|
|
11
|
+
* with status='running' (the classifier-lease liveness derivation,
|
|
12
|
+
* startup.ts; the ps summary running-count uses the same predicate).
|
|
13
|
+
*
|
|
14
|
+
* Deliberately NOT here: global name uniqueness, stopped-generation reuse
|
|
15
|
+
* semantics (plural-aware findRigsByName is load-bearing — a same-name rig
|
|
16
|
+
* whose sessions are all non-running never trips this guard), any schema
|
|
17
|
+
* change. The restore-vs-up name-reuse design is a 0.5.5 intake.
|
|
18
|
+
*/
|
|
19
|
+
export interface RunningRigIdentity {
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
runningSessionCount: number;
|
|
23
|
+
}
|
|
24
|
+
export type RunningNameGuardVerdict = {
|
|
25
|
+
ok: true;
|
|
26
|
+
} | {
|
|
27
|
+
ok: false;
|
|
28
|
+
code: "rig_name_running";
|
|
29
|
+
message: string;
|
|
30
|
+
runningRig: RunningRigIdentity;
|
|
31
|
+
};
|
|
32
|
+
export interface RunningNameGuardDeps {
|
|
33
|
+
/** The repo's existing plural-aware name lookup (ORDER BY created_at). */
|
|
34
|
+
findRigsByName(name: string): Array<{
|
|
35
|
+
id: string;
|
|
36
|
+
name: string;
|
|
37
|
+
}>;
|
|
38
|
+
/** Count of sessions rows with status='running' belonging to the rig's nodes. */
|
|
39
|
+
countRunningSessions(rigId: string): number;
|
|
40
|
+
}
|
|
41
|
+
/** The one liveness read, shared by every caller: sessions joined through the
|
|
42
|
+
* rig's nodes, status='running' — the daemon's existing running-derivation. */
|
|
43
|
+
export declare function makeRunningSessionCounter(db: Database.Database): (rigId: string) => number;
|
|
44
|
+
/**
|
|
45
|
+
* The ONE guard every instantiator create path calls before `createRig()`.
|
|
46
|
+
* Returns ok when no same-name rig is running (including the all-stopped
|
|
47
|
+
* generations case — reuse proceeds unchanged); otherwise a teaching refusal
|
|
48
|
+
* naming the running rig, what was checked, that nothing was created or
|
|
49
|
+
* launched, and the supported alternatives.
|
|
50
|
+
*/
|
|
51
|
+
export declare function checkRunningNameGuard(deps: RunningNameGuardDeps, name: string): RunningNameGuardVerdict;
|
|
52
|
+
//# sourceMappingURL=running-name-guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"running-name-guard.d.ts","sourceRoot":"","sources":["../../src/domain/running-name-guard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,MAAM,uBAAuB,GAC/B;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GACZ;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,0EAA0E;IAC1E,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClE,iFAAiF;IACjF,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7C;AAED;gFACgF;AAChF,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAO1F;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,MAAM,GAAG,uBAAuB,CAkBvG"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** The one liveness read, shared by every caller: sessions joined through the
|
|
2
|
+
* rig's nodes, status='running' — the daemon's existing running-derivation. */
|
|
3
|
+
export function makeRunningSessionCounter(db) {
|
|
4
|
+
return (rigId) => {
|
|
5
|
+
const row = db.prepare("SELECT COUNT(*) AS c FROM sessions s JOIN nodes n ON n.id = s.node_id WHERE n.rig_id = ? AND s.status = 'running'").get(rigId);
|
|
6
|
+
return row.c;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The ONE guard every instantiator create path calls before `createRig()`.
|
|
11
|
+
* Returns ok when no same-name rig is running (including the all-stopped
|
|
12
|
+
* generations case — reuse proceeds unchanged); otherwise a teaching refusal
|
|
13
|
+
* naming the running rig, what was checked, that nothing was created or
|
|
14
|
+
* launched, and the supported alternatives.
|
|
15
|
+
*/
|
|
16
|
+
export function checkRunningNameGuard(deps, name) {
|
|
17
|
+
for (const rig of deps.findRigsByName(name)) {
|
|
18
|
+
const runningSessionCount = deps.countRunningSessions(rig.id);
|
|
19
|
+
if (runningSessionCount > 0) {
|
|
20
|
+
return {
|
|
21
|
+
ok: false,
|
|
22
|
+
code: "rig_name_running",
|
|
23
|
+
message: `A rig named "${name}" is already RUNNING: ${rig.id} with ${runningSessionCount} running session(s) ` +
|
|
24
|
+
`(checked: existing rigs with this name for sessions in status 'running'). ` +
|
|
25
|
+
`Nothing was created or launched. Alternatives: work with the running rig ` +
|
|
26
|
+
`(rig ps --nodes / rig send), stop it first with 'rig down ${name}', ` +
|
|
27
|
+
`or launch this spec under a different name.`,
|
|
28
|
+
runningRig: { id: rig.id, name, runningSessionCount },
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return { ok: true };
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=running-name-guard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"running-name-guard.js","sourceRoot":"","sources":["../../src/domain/running-name-guard.ts"],"names":[],"mappings":"AAqCA;gFACgF;AAChF,MAAM,UAAU,yBAAyB,CAAC,EAAqB;IAC7D,OAAO,CAAC,KAAa,EAAU,EAAE;QAC/B,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,mHAAmH,CACpH,CAAC,GAAG,CAAC,KAAK,CAAkB,CAAC;QAC9B,OAAO,GAAG,CAAC,CAAC,CAAC;IACf,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAA0B,EAAE,IAAY;IAC5E,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5C,MAAM,mBAAmB,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9D,IAAI,mBAAmB,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EACL,gBAAgB,IAAI,yBAAyB,GAAG,CAAC,EAAE,SAAS,mBAAmB,sBAAsB;oBACrG,4EAA4E;oBAC5E,2EAA2E;oBAC3E,6DAA6D,IAAI,KAAK;oBACtE,6CAA6C;gBAC/C,UAAU,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;aACtD,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
import type { RigRepository } from "./rig-repository.js";
|
|
3
|
+
import type { SessionRegistry } from "./session-registry.js";
|
|
4
|
+
import type { EventBus } from "./event-bus.js";
|
|
5
|
+
import type { TmuxAdapter } from "../adapters/tmux.js";
|
|
6
|
+
export interface SeatLifecycleDeps {
|
|
7
|
+
db: Database.Database;
|
|
8
|
+
rigRepo: RigRepository;
|
|
9
|
+
sessionRegistry: SessionRegistry;
|
|
10
|
+
eventBus: EventBus;
|
|
11
|
+
tmuxAdapter: TmuxAdapter;
|
|
12
|
+
}
|
|
13
|
+
export interface SeatRefusal {
|
|
14
|
+
ok: false;
|
|
15
|
+
code: "seat_ref_required" | "seat_not_found" | "seat_ambiguous" | "missing_model" | "missing_reason" | "no_session" | "claimed_session" | "session_not_live" | "session_live" | "tmux_probe_failed" | "nothing_to_clean";
|
|
16
|
+
message: string;
|
|
17
|
+
guidance?: string;
|
|
18
|
+
matches?: Array<{
|
|
19
|
+
rig_name: string;
|
|
20
|
+
logical_id: string;
|
|
21
|
+
current_occupant: string | null;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export interface SeatDescriptor {
|
|
25
|
+
rigId: string;
|
|
26
|
+
rigName: string;
|
|
27
|
+
logicalId: string;
|
|
28
|
+
nodeId: string;
|
|
29
|
+
}
|
|
30
|
+
export type SetModelResult = {
|
|
31
|
+
ok: true;
|
|
32
|
+
seat: SeatDescriptor;
|
|
33
|
+
from: string | null;
|
|
34
|
+
to: string;
|
|
35
|
+
changed: boolean;
|
|
36
|
+
} | SeatRefusal;
|
|
37
|
+
export type StopSeatResult = {
|
|
38
|
+
ok: true;
|
|
39
|
+
seat: SeatDescriptor;
|
|
40
|
+
sessionName: string;
|
|
41
|
+
sessionId: string;
|
|
42
|
+
} | SeatRefusal;
|
|
43
|
+
export type CleanSeatResult = {
|
|
44
|
+
ok: true;
|
|
45
|
+
seat: SeatDescriptor;
|
|
46
|
+
actions: {
|
|
47
|
+
sessionsExited: string[];
|
|
48
|
+
bindingCleared: boolean;
|
|
49
|
+
};
|
|
50
|
+
} | SeatRefusal;
|
|
51
|
+
export declare class SeatLifecycleService {
|
|
52
|
+
private readonly db;
|
|
53
|
+
private readonly rigRepo;
|
|
54
|
+
private readonly sessionRegistry;
|
|
55
|
+
private readonly eventBus;
|
|
56
|
+
private readonly tmuxAdapter;
|
|
57
|
+
constructor(deps: SeatLifecycleDeps);
|
|
58
|
+
setModel(input: {
|
|
59
|
+
seatRef: string;
|
|
60
|
+
model: string;
|
|
61
|
+
reason: string;
|
|
62
|
+
operator?: string | null;
|
|
63
|
+
}): Promise<SetModelResult>;
|
|
64
|
+
stopSeat(input: {
|
|
65
|
+
seatRef: string;
|
|
66
|
+
reason: string;
|
|
67
|
+
operator?: string | null;
|
|
68
|
+
}): Promise<StopSeatResult>;
|
|
69
|
+
cleanSeat(input: {
|
|
70
|
+
seatRef: string;
|
|
71
|
+
reason: string;
|
|
72
|
+
operator?: string | null;
|
|
73
|
+
}): Promise<CleanSeatResult>;
|
|
74
|
+
/**
|
|
75
|
+
* The ONE liveness read both mutating verbs share (fix r1, row 9baac99f):
|
|
76
|
+
* the CLASSIFIED probeSession, never the collapsed hasSession view.
|
|
77
|
+
* present / absent → returned for the verb to act on (absent is
|
|
78
|
+
* POSITIVE tmux evidence, per OPR.0.5.4.2).
|
|
79
|
+
* transport_unavailable → an INDETERMINATE refusal: session existence was
|
|
80
|
+
* NOT determined, so neither verb may act — and the
|
|
81
|
+
* refusal never routes the operator to a
|
|
82
|
+
* destructive verb.
|
|
83
|
+
* unexpected probe throw → the same indeterminate refusal (fail closed).
|
|
84
|
+
*/
|
|
85
|
+
private probeLiveness;
|
|
86
|
+
private requireReason;
|
|
87
|
+
private describe;
|
|
88
|
+
private latestSession;
|
|
89
|
+
/** The ONE resolution path, mirroring SeatStatusService.findMatches semantics
|
|
90
|
+
* (seat-status-service.ts) so every seat verb resolves identically: a canonical
|
|
91
|
+
* `name@rig` ref scopes to that rig's inventory; a bare ref scans all rigs;
|
|
92
|
+
* matches are by canonicalSessionName or logicalId; >1 match is a listed
|
|
93
|
+
* ambiguity, never a pick. */
|
|
94
|
+
private resolveSeat;
|
|
95
|
+
private findMatches;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=seat-lifecycle-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-lifecycle-service.d.ts","sourceRoot":"","sources":["../../src/domain/seat-lifecycle-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { getNodeInventory } from "./node-inventory.js";
|
|
2
|
+
import { parseSessionName } from "./session-name.js";
|
|
3
|
+
/**
|
|
4
|
+
* S5 (OPR.0.5.4.7) — the seat-lifecycle verb surface: set-model, single-seat stop,
|
|
5
|
+
* dead-session clean. One coherent design (KI-5.3-9):
|
|
6
|
+
*
|
|
7
|
+
* - ONE seat-resolution path shared by all three verbs (the SeatStatusService
|
|
8
|
+
* findMatches semantics: parseSessionName greedy first-@ rig; canonical-name or
|
|
9
|
+
* logical-id match; ambiguity returns the match list) — never a per-verb resolver.
|
|
10
|
+
* - Every mutation is transactional and persists its audit event in the SAME
|
|
11
|
+
* transaction (node.model_changed / session.stopped / session.cleaned).
|
|
12
|
+
* - Every refusal names what was actually checked; an indeterminate tmux probe is
|
|
13
|
+
* a refusal, never a guess (the S1 error bar applied at birth).
|
|
14
|
+
*/
|
|
15
|
+
const SEAT_LOOKUP_GUIDANCE = "List seats with: rig ps --nodes";
|
|
16
|
+
/** Terminal session statuses — rows the clean verb must NOT touch (they already
|
|
17
|
+
* record an ended tenancy; the vocabulary is shared with seat-handover-service
|
|
18
|
+
* and the watchdog's TERMINAL_SESSION_STATUSES). */
|
|
19
|
+
const TERMINAL_SESSION_STATUSES = new Set(["superseded", "detached", "exited"]);
|
|
20
|
+
export class SeatLifecycleService {
|
|
21
|
+
db;
|
|
22
|
+
rigRepo;
|
|
23
|
+
sessionRegistry;
|
|
24
|
+
eventBus;
|
|
25
|
+
tmuxAdapter;
|
|
26
|
+
constructor(deps) {
|
|
27
|
+
if (deps.db !== deps.rigRepo.db)
|
|
28
|
+
throw new Error("SeatLifecycleService: rigRepo must share the same db handle");
|
|
29
|
+
if (deps.db !== deps.sessionRegistry.db)
|
|
30
|
+
throw new Error("SeatLifecycleService: sessionRegistry must share the same db handle");
|
|
31
|
+
if (deps.db !== deps.eventBus.db)
|
|
32
|
+
throw new Error("SeatLifecycleService: eventBus must share the same db handle");
|
|
33
|
+
this.db = deps.db;
|
|
34
|
+
this.rigRepo = deps.rigRepo;
|
|
35
|
+
this.sessionRegistry = deps.sessionRegistry;
|
|
36
|
+
this.eventBus = deps.eventBus;
|
|
37
|
+
this.tmuxAdapter = deps.tmuxAdapter;
|
|
38
|
+
}
|
|
39
|
+
async setModel(input) {
|
|
40
|
+
const required = this.requireReason(input.reason);
|
|
41
|
+
if (required)
|
|
42
|
+
return required;
|
|
43
|
+
if (!input.model?.trim()) {
|
|
44
|
+
return { ok: false, code: "missing_model", message: "A target model id is required (--model)." };
|
|
45
|
+
}
|
|
46
|
+
const resolved = this.resolveSeat(input.seatRef);
|
|
47
|
+
if ("code" in resolved)
|
|
48
|
+
return resolved;
|
|
49
|
+
const model = input.model.trim();
|
|
50
|
+
const seat = this.describe(resolved);
|
|
51
|
+
const from = resolved.entry.model ?? null;
|
|
52
|
+
if (from === model) {
|
|
53
|
+
// Honest no-op: the persisted value already IS the target; no event is minted.
|
|
54
|
+
return { ok: true, seat, from, to: model, changed: false };
|
|
55
|
+
}
|
|
56
|
+
let persisted = null;
|
|
57
|
+
const tx = this.db.transaction(() => {
|
|
58
|
+
this.rigRepo.setNodeModel(resolved.nodeId, model);
|
|
59
|
+
persisted = this.eventBus.persistWithinTransaction({
|
|
60
|
+
type: "node.model_changed",
|
|
61
|
+
rigId: seat.rigId,
|
|
62
|
+
nodeId: seat.nodeId,
|
|
63
|
+
logicalId: seat.logicalId,
|
|
64
|
+
from,
|
|
65
|
+
to: model,
|
|
66
|
+
reason: input.reason.trim(),
|
|
67
|
+
operator: input.operator ?? null,
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
tx();
|
|
71
|
+
if (persisted)
|
|
72
|
+
this.eventBus.notifySubscribers(persisted);
|
|
73
|
+
return { ok: true, seat, from, to: model, changed: true };
|
|
74
|
+
}
|
|
75
|
+
async stopSeat(input) {
|
|
76
|
+
const required = this.requireReason(input.reason);
|
|
77
|
+
if (required)
|
|
78
|
+
return required;
|
|
79
|
+
const resolved = this.resolveSeat(input.seatRef);
|
|
80
|
+
if ("code" in resolved)
|
|
81
|
+
return resolved;
|
|
82
|
+
const seat = this.describe(resolved);
|
|
83
|
+
const session = this.latestSession(resolved.nodeId);
|
|
84
|
+
if (!session) {
|
|
85
|
+
return { ok: false, code: "no_session", message: `Seat "${input.seatRef}" has no session to stop (checked: latest sessions row for node ${seat.logicalId}).` };
|
|
86
|
+
}
|
|
87
|
+
if (session.origin === "claimed") {
|
|
88
|
+
return {
|
|
89
|
+
ok: false,
|
|
90
|
+
code: "claimed_session",
|
|
91
|
+
message: `Session "${session.session_name}" was adopted (origin=claimed), not launched by OpenRig — stop refuses to kill it.`,
|
|
92
|
+
guidance: "Release an adopted session with: rig unclaim",
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// Wave-2 fix round 1 (r1 row 9baac99f): consume the CLASSIFIED probe, never the
|
|
96
|
+
// collapsed hasSession view — a transport blip is INDETERMINATE, not absence
|
|
97
|
+
// (KI-5.3-8 fabricated-absence class, destructive direction).
|
|
98
|
+
const probed = await this.probeLiveness(session.session_name, "stop refuses rather than kill blind");
|
|
99
|
+
if ("code" in probed)
|
|
100
|
+
return probed;
|
|
101
|
+
if (probed.state === "absent") {
|
|
102
|
+
return {
|
|
103
|
+
ok: false,
|
|
104
|
+
code: "session_not_live",
|
|
105
|
+
message: `Session "${session.session_name}" is absent in tmux (checked: tmux has-session, POSITIVE absence evidence) — there is nothing to stop.`,
|
|
106
|
+
guidance: "A dead seat with stale records is returned to launchable with: rig seat clean",
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
// Kill exactly this seat's own tmux session — structurally single-seat.
|
|
110
|
+
const kill = await this.tmuxAdapter.killSession(session.session_name);
|
|
111
|
+
if (kill && !kill.ok && kill.code !== "session_not_found") {
|
|
112
|
+
return {
|
|
113
|
+
ok: false,
|
|
114
|
+
code: "tmux_probe_failed",
|
|
115
|
+
message: `tmux kill-session for "${session.session_name}" failed: ${kill.message ?? kill.code}`,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
let persisted = null;
|
|
119
|
+
const tx = this.db.transaction(() => {
|
|
120
|
+
this.sessionRegistry.updateStatus(session.id, "exited");
|
|
121
|
+
this.sessionRegistry.clearBinding(resolved.nodeId);
|
|
122
|
+
persisted = this.eventBus.persistWithinTransaction({
|
|
123
|
+
type: "session.stopped",
|
|
124
|
+
rigId: seat.rigId,
|
|
125
|
+
nodeId: seat.nodeId,
|
|
126
|
+
sessionName: session.session_name,
|
|
127
|
+
reason: input.reason.trim(),
|
|
128
|
+
operator: input.operator ?? null,
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
tx();
|
|
132
|
+
if (persisted)
|
|
133
|
+
this.eventBus.notifySubscribers(persisted);
|
|
134
|
+
return { ok: true, seat, sessionName: session.session_name, sessionId: session.id };
|
|
135
|
+
}
|
|
136
|
+
async cleanSeat(input) {
|
|
137
|
+
const required = this.requireReason(input.reason);
|
|
138
|
+
if (required)
|
|
139
|
+
return required;
|
|
140
|
+
const resolved = this.resolveSeat(input.seatRef);
|
|
141
|
+
if ("code" in resolved)
|
|
142
|
+
return resolved;
|
|
143
|
+
const seat = this.describe(resolved);
|
|
144
|
+
const binding = this.sessionRegistry.getBindingForNode(resolved.nodeId);
|
|
145
|
+
const nonTerminal = this.db.prepare("SELECT id, session_name, status, origin FROM sessions WHERE node_id = ? ORDER BY id").all(resolved.nodeId)
|
|
146
|
+
.filter((s) => !TERMINAL_SESSION_STATUSES.has(s.status));
|
|
147
|
+
// Fix r2-F3 (row 30045f39): clean MUTATES every non-terminal session row, so
|
|
148
|
+
// its safety checks must cover exactly that set — probing only the newest row
|
|
149
|
+
// fabricates safety for the others (older-live/newer-dead under canonical-name
|
|
150
|
+
// churn). Every row that would be touched is checked for adopted origin and
|
|
151
|
+
// probed for POSITIVE absence (r1 discipline); the binding's own tmux session
|
|
152
|
+
// is probed too when it names a session no row carries.
|
|
153
|
+
const mutationTargets = nonTerminal;
|
|
154
|
+
for (const row of mutationTargets) {
|
|
155
|
+
if (row.origin === "claimed") {
|
|
156
|
+
return {
|
|
157
|
+
ok: false,
|
|
158
|
+
code: "claimed_session",
|
|
159
|
+
message: `Session "${row.session_name}" was adopted (origin=claimed) — clean refuses to touch adopted state.`,
|
|
160
|
+
guidance: "Release an adopted session with: rig unclaim",
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const probeNames = [...new Set([
|
|
165
|
+
...mutationTargets.map((s) => s.session_name),
|
|
166
|
+
...(binding?.tmuxSession ? [binding.tmuxSession] : []),
|
|
167
|
+
])];
|
|
168
|
+
for (const name of probeNames) {
|
|
169
|
+
const probed = await this.probeLiveness(name, "clean refuses rather than clear state under a possibly-live seat");
|
|
170
|
+
if ("code" in probed)
|
|
171
|
+
return probed;
|
|
172
|
+
if (probed.state === "present") {
|
|
173
|
+
return {
|
|
174
|
+
ok: false,
|
|
175
|
+
code: "session_live",
|
|
176
|
+
message: `Session "${name}" is alive in tmux (checked: tmux has-session, against EVERY session row clean would mutate) — clean only operates on dead seats.`,
|
|
177
|
+
guidance: "Stop a live seat first with: rig seat stop",
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const session = this.latestSession(resolved.nodeId);
|
|
182
|
+
if (!binding && nonTerminal.length === 0) {
|
|
183
|
+
return {
|
|
184
|
+
ok: false,
|
|
185
|
+
code: "nothing_to_clean",
|
|
186
|
+
message: `Seat "${input.seatRef}" is already clean (checked: no binding row for the node, and no session rows outside terminal statuses ${[...TERMINAL_SESSION_STATUSES].join("/")}).`,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
const sessionsExited = [];
|
|
190
|
+
let persisted = null;
|
|
191
|
+
const tx = this.db.transaction(() => {
|
|
192
|
+
for (const row of nonTerminal) {
|
|
193
|
+
this.sessionRegistry.updateStatus(row.id, "exited");
|
|
194
|
+
sessionsExited.push(row.session_name);
|
|
195
|
+
}
|
|
196
|
+
this.sessionRegistry.clearBinding(resolved.nodeId);
|
|
197
|
+
persisted = this.eventBus.persistWithinTransaction({
|
|
198
|
+
type: "session.cleaned",
|
|
199
|
+
rigId: seat.rigId,
|
|
200
|
+
nodeId: seat.nodeId,
|
|
201
|
+
sessionName: session?.session_name ?? null,
|
|
202
|
+
reason: input.reason.trim(),
|
|
203
|
+
operator: input.operator ?? null,
|
|
204
|
+
actions: { sessionsExited, bindingCleared: binding !== null },
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
tx();
|
|
208
|
+
if (persisted)
|
|
209
|
+
this.eventBus.notifySubscribers(persisted);
|
|
210
|
+
return { ok: true, seat, actions: { sessionsExited, bindingCleared: binding !== null } };
|
|
211
|
+
}
|
|
212
|
+
// -- shared internals --
|
|
213
|
+
/**
|
|
214
|
+
* The ONE liveness read both mutating verbs share (fix r1, row 9baac99f):
|
|
215
|
+
* the CLASSIFIED probeSession, never the collapsed hasSession view.
|
|
216
|
+
* present / absent → returned for the verb to act on (absent is
|
|
217
|
+
* POSITIVE tmux evidence, per OPR.0.5.4.2).
|
|
218
|
+
* transport_unavailable → an INDETERMINATE refusal: session existence was
|
|
219
|
+
* NOT determined, so neither verb may act — and the
|
|
220
|
+
* refusal never routes the operator to a
|
|
221
|
+
* destructive verb.
|
|
222
|
+
* unexpected probe throw → the same indeterminate refusal (fail closed).
|
|
223
|
+
*/
|
|
224
|
+
async probeLiveness(sessionName, refusalConsequence) {
|
|
225
|
+
let probe;
|
|
226
|
+
try {
|
|
227
|
+
probe = await this.tmuxAdapter.probeSession(sessionName);
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
return {
|
|
231
|
+
ok: false,
|
|
232
|
+
code: "tmux_probe_failed",
|
|
233
|
+
message: `tmux liveness probe for "${sessionName}" failed (${err instanceof Error ? err.message : String(err)}) — liveness is INDETERMINATE, so ${refusalConsequence}.`,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
if (probe.state === "transport_unavailable") {
|
|
237
|
+
return {
|
|
238
|
+
ok: false,
|
|
239
|
+
code: "tmux_probe_failed",
|
|
240
|
+
message: `tmux transport unavailable probing "${sessionName}" (${probe.cause}) — session existence was NOT determined (checked: classified tmux probe), so ${refusalConsequence}. Retry when the tmux transport is back.`,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
return { state: probe.state };
|
|
244
|
+
}
|
|
245
|
+
requireReason(reason) {
|
|
246
|
+
if (!reason?.trim()) {
|
|
247
|
+
return { ok: false, code: "missing_reason", message: "An audit reason is required (--reason)." };
|
|
248
|
+
}
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
describe(resolved) {
|
|
252
|
+
return {
|
|
253
|
+
rigId: resolved.entry.rigId,
|
|
254
|
+
rigName: resolved.entry.rigName,
|
|
255
|
+
logicalId: resolved.entry.logicalId,
|
|
256
|
+
nodeId: resolved.nodeId,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
latestSession(nodeId) {
|
|
260
|
+
const row = this.db.prepare("SELECT id, session_name, status, origin FROM sessions WHERE node_id = ? ORDER BY id DESC LIMIT 1").get(nodeId);
|
|
261
|
+
return row ?? null;
|
|
262
|
+
}
|
|
263
|
+
/** The ONE resolution path, mirroring SeatStatusService.findMatches semantics
|
|
264
|
+
* (seat-status-service.ts) so every seat verb resolves identically: a canonical
|
|
265
|
+
* `name@rig` ref scopes to that rig's inventory; a bare ref scans all rigs;
|
|
266
|
+
* matches are by canonicalSessionName or logicalId; >1 match is a listed
|
|
267
|
+
* ambiguity, never a pick. */
|
|
268
|
+
resolveSeat(seatRef) {
|
|
269
|
+
const ref = seatRef?.trim() ?? "";
|
|
270
|
+
if (!ref) {
|
|
271
|
+
return { ok: false, code: "seat_ref_required", message: "seat reference is required", guidance: SEAT_LOOKUP_GUIDANCE };
|
|
272
|
+
}
|
|
273
|
+
const matches = this.findMatches(ref);
|
|
274
|
+
if (matches.length === 0) {
|
|
275
|
+
return {
|
|
276
|
+
ok: false,
|
|
277
|
+
code: "seat_not_found",
|
|
278
|
+
message: `Seat "${ref}" not found (checked: canonical session names and logical ids across ${parseSessionName(ref).kind === "canonical" ? "the named rig" : "all rigs"}).`,
|
|
279
|
+
guidance: SEAT_LOOKUP_GUIDANCE,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
if (matches.length > 1) {
|
|
283
|
+
return {
|
|
284
|
+
ok: false,
|
|
285
|
+
code: "seat_ambiguous",
|
|
286
|
+
message: `Seat "${ref}" matched multiple nodes`,
|
|
287
|
+
guidance: SEAT_LOOKUP_GUIDANCE,
|
|
288
|
+
matches: matches.map((entry) => ({
|
|
289
|
+
rig_name: entry.rigName,
|
|
290
|
+
logical_id: entry.logicalId,
|
|
291
|
+
current_occupant: entry.canonicalSessionName,
|
|
292
|
+
})),
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
const entry = matches[0];
|
|
296
|
+
const nodeRow = this.db.prepare("SELECT id FROM nodes WHERE rig_id = ? AND logical_id = ?").get(entry.rigId, entry.logicalId);
|
|
297
|
+
if (!nodeRow) {
|
|
298
|
+
return { ok: false, code: "seat_not_found", message: `Seat "${ref}" resolved to a node that no longer exists.`, guidance: SEAT_LOOKUP_GUIDANCE };
|
|
299
|
+
}
|
|
300
|
+
return { entry, nodeId: nodeRow.id };
|
|
301
|
+
}
|
|
302
|
+
findMatches(ref) {
|
|
303
|
+
const parsed = parseSessionName(ref);
|
|
304
|
+
if (parsed.kind === "canonical") {
|
|
305
|
+
const localRef = parsed.member;
|
|
306
|
+
const rigs = this.rigRepo.findRigsByName(parsed.rig);
|
|
307
|
+
return rigs.flatMap((rig) => getNodeInventory(this.db, rig.id).filter((entry) => entry.canonicalSessionName === ref || entry.logicalId === localRef));
|
|
308
|
+
}
|
|
309
|
+
return this.rigRepo.listRigs().flatMap((rig) => getNodeInventory(this.db, rig.id).filter((entry) => entry.canonicalSessionName === ref || entry.logicalId === ref));
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
//# sourceMappingURL=seat-lifecycle-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seat-lifecycle-service.js","sourceRoot":"","sources":["../../src/domain/seat-lifecycle-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -138,11 +138,14 @@ export declare class SessionTransport {
|
|
|
138
138
|
constructor(deps: SessionTransportDeps);
|
|
139
139
|
/**
|
|
140
140
|
* Slice-05 D5/D6 — when a live transport op (send/capture) observes that the
|
|
141
|
-
* seat's tmux session is genuinely gone (`
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
141
|
+
* seat's tmux session is genuinely gone (a `probeSession` result of `absent`
|
|
142
|
+
* — POSITIVE tmux evidence, never a transport failure; OPR.0.5.4.2 mini-req
|
|
143
|
+
* 5), durably record the SAME `session_missing` identity verdict the
|
|
144
|
+
* reconciler would write, so `rig ps` stops reporting the dead seat as
|
|
145
|
+
* running WITHOUT waiting for the next reconciler poll. This is the
|
|
146
|
+
* transport-side writer of the shared verdict bridge; the reconciler is the
|
|
147
|
+
* poll-side writer. Transport-absence must never reach this method: a blip
|
|
148
|
+
* against a live seat would otherwise fabricate a durable absence verdict.
|
|
146
149
|
*
|
|
147
150
|
* Only writes an APPLICABLE verdict: the join is narrowed to the node whose
|
|
148
151
|
* LATEST running session_name equals the probed session (so
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-transport.d.ts","sourceRoot":"","sources":["../../src/domain/session-transport.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"session-transport.d.ts","sourceRoot":"","sources":["../../src/domain/session-transport.ts"],"names":[],"mappings":"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"}
|