@polderlabs/bizar-omp 0.8.0 → 0.9.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 (205) hide show
  1. package/README.md +287 -305
  2. package/agents/bizar-architect.md +1 -1
  3. package/agents/bizar-implementer.md +12 -2
  4. package/agents/bizar-planner.md +1 -1
  5. package/agents/bizar-researcher.md +1 -1
  6. package/agents/bizar-reviewer.md +7 -1
  7. package/agents/bizar-security-reviewer.md +1 -1
  8. package/agents/bizar-verifier.md +4 -0
  9. package/dist/cli/agents-ink.d.ts +12 -0
  10. package/dist/cli/agents-ink.d.ts.map +1 -1
  11. package/dist/cli/agents-ink.js +22 -7
  12. package/dist/cli/agents-ink.js.map +1 -1
  13. package/dist/cli/agents.d.ts.map +1 -1
  14. package/dist/cli/agents.js +6 -2
  15. package/dist/cli/agents.js.map +1 -1
  16. package/dist/cli/doctor.d.ts +4 -4
  17. package/dist/cli/install.d.ts +1 -7
  18. package/dist/cli/install.d.ts.map +1 -1
  19. package/dist/cli/install.js +75 -81
  20. package/dist/cli/install.js.map +1 -1
  21. package/dist/cli/main.js +5 -1
  22. package/dist/cli/main.js.map +1 -1
  23. package/dist/cli/mobile-claim.d.ts.map +1 -1
  24. package/dist/cli/mobile-claim.js +26 -18
  25. package/dist/cli/mobile-claim.js.map +1 -1
  26. package/dist/cli/omb-daemon.d.ts.map +1 -1
  27. package/dist/cli/omb-daemon.js +43 -11
  28. package/dist/cli/omb-daemon.js.map +1 -1
  29. package/dist/cli/omb-mobile.d.ts.map +1 -1
  30. package/dist/cli/omb-mobile.js +9 -3
  31. package/dist/cli/omb-mobile.js.map +1 -1
  32. package/dist/cli/omb-runtime.d.ts.map +1 -1
  33. package/dist/cli/omb-runtime.js +2 -0
  34. package/dist/cli/omb-runtime.js.map +1 -1
  35. package/dist/cli/omb-sessions.js +18 -7
  36. package/dist/cli/omb-sessions.js.map +1 -1
  37. package/dist/cli/omb-update.d.ts +1 -1
  38. package/dist/cli/omb-update.d.ts.map +1 -1
  39. package/dist/cli/omb-update.js +7 -36
  40. package/dist/cli/omb-update.js.map +1 -1
  41. package/dist/cli/run.d.ts.map +1 -1
  42. package/dist/cli/run.js +2 -1
  43. package/dist/cli/run.js.map +1 -1
  44. package/dist/cli/update-ink.d.ts.map +1 -1
  45. package/dist/cli/update-ink.js +8 -23
  46. package/dist/cli/update-ink.js.map +1 -1
  47. package/dist/core/acceptance.d.ts +20 -1
  48. package/dist/core/acceptance.d.ts.map +1 -1
  49. package/dist/core/acceptance.js +50 -2
  50. package/dist/core/acceptance.js.map +1 -1
  51. package/dist/core/policies.d.ts +11 -0
  52. package/dist/core/policies.d.ts.map +1 -1
  53. package/dist/core/policies.js +41 -10
  54. package/dist/core/policies.js.map +1 -1
  55. package/dist/core/transitions.d.ts.map +1 -1
  56. package/dist/core/transitions.js +4 -3
  57. package/dist/core/transitions.js.map +1 -1
  58. package/dist/core/types.d.ts +64 -0
  59. package/dist/core/types.d.ts.map +1 -1
  60. package/dist/extension.d.ts +4 -0
  61. package/dist/extension.d.ts.map +1 -1
  62. package/dist/extension.js +420 -78
  63. package/dist/extension.js.map +1 -1
  64. package/dist/omp/compatibility.d.ts +15 -5
  65. package/dist/omp/compatibility.d.ts.map +1 -1
  66. package/dist/omp/compatibility.js +12 -2
  67. package/dist/omp/compatibility.js.map +1 -1
  68. package/dist/omp/daemon-service.d.ts.map +1 -1
  69. package/dist/omp/daemon-service.js +151 -21
  70. package/dist/omp/daemon-service.js.map +1 -1
  71. package/dist/omp/daemon.d.ts +18 -4
  72. package/dist/omp/daemon.d.ts.map +1 -1
  73. package/dist/omp/daemon.js +209 -76
  74. package/dist/omp/daemon.js.map +1 -1
  75. package/dist/omp/dispatch-lifecycle.d.ts +61 -0
  76. package/dist/omp/dispatch-lifecycle.d.ts.map +1 -0
  77. package/dist/omp/dispatch-lifecycle.js +101 -0
  78. package/dist/omp/dispatch-lifecycle.js.map +1 -0
  79. package/dist/omp/model-role-assignment.d.ts +5 -0
  80. package/dist/omp/model-role-assignment.d.ts.map +1 -1
  81. package/dist/omp/model-role-assignment.js +5 -0
  82. package/dist/omp/model-role-assignment.js.map +1 -1
  83. package/dist/omp/model-roles.d.ts +8 -0
  84. package/dist/omp/model-roles.d.ts.map +1 -1
  85. package/dist/omp/model-roles.js +10 -0
  86. package/dist/omp/model-roles.js.map +1 -1
  87. package/dist/omp/omb-sessions.d.ts +8 -1
  88. package/dist/omp/omb-sessions.d.ts.map +1 -1
  89. package/dist/omp/omb-sessions.js +40 -23
  90. package/dist/omp/omb-sessions.js.map +1 -1
  91. package/dist/omp/omb-settings.d.ts +5 -1
  92. package/dist/omp/omb-settings.d.ts.map +1 -1
  93. package/dist/omp/omb-settings.js +75 -26
  94. package/dist/omp/omb-settings.js.map +1 -1
  95. package/dist/omp/omp-provider-config.d.ts +3 -0
  96. package/dist/omp/omp-provider-config.d.ts.map +1 -1
  97. package/dist/omp/omp-provider-config.js +80 -30
  98. package/dist/omp/omp-provider-config.js.map +1 -1
  99. package/dist/omp/rpc.d.ts +3 -0
  100. package/dist/omp/rpc.d.ts.map +1 -1
  101. package/dist/omp/session-ownership.d.ts +64 -0
  102. package/dist/omp/session-ownership.d.ts.map +1 -0
  103. package/dist/omp/session-ownership.js +269 -0
  104. package/dist/omp/session-ownership.js.map +1 -0
  105. package/dist/omp/task-model-selector.d.ts +58 -0
  106. package/dist/omp/task-model-selector.d.ts.map +1 -0
  107. package/dist/omp/task-model-selector.js +144 -0
  108. package/dist/omp/task-model-selector.js.map +1 -0
  109. package/dist/omp/tmux.d.ts.map +1 -1
  110. package/dist/omp/tmux.js +10 -5
  111. package/dist/omp/tmux.js.map +1 -1
  112. package/dist/omp/tray.d.ts +9 -1
  113. package/dist/omp/tray.d.ts.map +1 -1
  114. package/dist/omp/tray.js +210 -56
  115. package/dist/omp/tray.js.map +1 -1
  116. package/dist/scripts/emit-compatibility-receipt.js +13 -3
  117. package/dist/scripts/emit-compatibility-receipt.js.map +1 -1
  118. package/dist/services/benchmarks.d.ts +68 -0
  119. package/dist/services/benchmarks.d.ts.map +1 -0
  120. package/dist/services/benchmarks.js +105 -0
  121. package/dist/services/benchmarks.js.map +1 -0
  122. package/dist/services/budget.d.ts +40 -1
  123. package/dist/services/budget.d.ts.map +1 -1
  124. package/dist/services/budget.js +74 -3
  125. package/dist/services/budget.js.map +1 -1
  126. package/dist/services/change-impact.d.ts +33 -0
  127. package/dist/services/change-impact.d.ts.map +1 -0
  128. package/dist/services/change-impact.js +103 -0
  129. package/dist/services/change-impact.js.map +1 -0
  130. package/dist/services/efficiency.d.ts +101 -0
  131. package/dist/services/efficiency.d.ts.map +1 -0
  132. package/dist/services/efficiency.js +170 -0
  133. package/dist/services/efficiency.js.map +1 -0
  134. package/dist/services/hypothesis-ledger.d.ts +66 -0
  135. package/dist/services/hypothesis-ledger.d.ts.map +1 -0
  136. package/dist/services/hypothesis-ledger.js +92 -0
  137. package/dist/services/hypothesis-ledger.js.map +1 -0
  138. package/dist/services/lesson-extraction.d.ts +27 -0
  139. package/dist/services/lesson-extraction.d.ts.map +1 -0
  140. package/dist/services/lesson-extraction.js +49 -0
  141. package/dist/services/lesson-extraction.js.map +1 -0
  142. package/dist/services/parallel-work.d.ts +44 -0
  143. package/dist/services/parallel-work.d.ts.map +1 -0
  144. package/dist/services/parallel-work.js +68 -0
  145. package/dist/services/parallel-work.js.map +1 -0
  146. package/dist/services/pr-shepherd.d.ts +83 -0
  147. package/dist/services/pr-shepherd.d.ts.map +1 -0
  148. package/dist/services/pr-shepherd.js +129 -0
  149. package/dist/services/pr-shepherd.js.map +1 -0
  150. package/dist/services/recipes.d.ts +12 -2
  151. package/dist/services/recipes.d.ts.map +1 -1
  152. package/dist/services/recipes.js +100 -8
  153. package/dist/services/recipes.js.map +1 -1
  154. package/dist/services/run-contract.d.ts +18 -0
  155. package/dist/services/run-contract.d.ts.map +1 -0
  156. package/dist/services/run-contract.js +32 -0
  157. package/dist/services/run-contract.js.map +1 -0
  158. package/dist/services/snapshots.d.ts +78 -0
  159. package/dist/services/snapshots.d.ts.map +1 -0
  160. package/dist/services/snapshots.js +194 -0
  161. package/dist/services/snapshots.js.map +1 -0
  162. package/dist/services/specialist-contracts.d.ts +58 -0
  163. package/dist/services/specialist-contracts.d.ts.map +1 -0
  164. package/dist/services/specialist-contracts.js +109 -0
  165. package/dist/services/specialist-contracts.js.map +1 -0
  166. package/dist/services/stall-detector.d.ts +27 -0
  167. package/dist/services/stall-detector.d.ts.map +1 -0
  168. package/dist/services/stall-detector.js +53 -0
  169. package/dist/services/stall-detector.js.map +1 -0
  170. package/dist/storage/resources.d.ts +1 -0
  171. package/dist/storage/resources.d.ts.map +1 -1
  172. package/dist/storage/resources.js +13 -11
  173. package/dist/storage/resources.js.map +1 -1
  174. package/dist/tools/integrate.d.ts.map +1 -1
  175. package/dist/tools/integrate.js +8 -7
  176. package/dist/tools/integrate.js.map +1 -1
  177. package/dist/tools/verify.d.ts +5 -2
  178. package/dist/tools/verify.d.ts.map +1 -1
  179. package/dist/tools/verify.js +84 -14
  180. package/dist/tools/verify.js.map +1 -1
  181. package/dist/tools/workflow.d.ts +2 -2
  182. package/dist/tools/workflow.d.ts.map +1 -1
  183. package/dist/tools/workflow.js +7 -0
  184. package/dist/tools/workflow.js.map +1 -1
  185. package/docs/07-bizarharness-integration.md +12 -0
  186. package/docs/assets/bizar-omp-banner.svg +51 -18
  187. package/docs/compatibility/baseline.json +9 -8
  188. package/docs/compatibility/lifecycle-observation.md +15 -1
  189. package/docs/compatibility/supported-surfaces.json +11 -3
  190. package/docs/releases/0.8.1.md +53 -0
  191. package/docs/releases/0.9.0.md +35 -0
  192. package/docs/releases/support-matrix.md +1 -1
  193. package/docs/security/project-audit-2026-10-01.md +145 -0
  194. package/package.json +9 -5
  195. package/skills/bizar-omp/SKILL.md +54 -0
  196. package/skills/omp-native-development/SKILL.md +5 -3
  197. package/skills/omp-native-development/assets/tests/acceptance-matrix.json +417 -0
  198. package/skills/omp-native-development/references/accuracy-and-versioning.md +1 -1
  199. package/skills/omp-native-development/references/bizar-integration-contract.md +1 -1
  200. package/skills/omp-native-development/references/developer-handoff.md +3 -1
  201. package/skills/omp-native-development/references/execution-and-lifecycle.md +4 -0
  202. package/skills/omp-native-development/references/native-validation-matrix.md +25 -0
  203. package/skills/omp-native-development/references/sessions-sdk-rpc.md +17 -0
  204. package/skills/omp-native-development/references/settings-providers-security.md +11 -0
  205. package/skills/omp-native-development/references/source-manifest.json +20 -4
@@ -1,7 +1,11 @@
1
1
  import { execFileSync, spawn } from "node:child_process";
2
- import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync, openSync, closeSync } from "node:fs";
2
+ import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync, openSync, closeSync, renameSync } from "node:fs";
3
+ import { randomUUID } from "node:crypto";
3
4
  import { homedir } from "node:os";
4
5
  import { join } from "node:path";
6
+ import { acquireLease } from "../storage/lease.js";
7
+ import { processStarttimeFromStat } from "../storage/lease.js";
8
+ import { OwnershipError } from "../core/errors.js";
5
9
  export const DEFAULT_DAEMON_PORT = 46740;
6
10
  export const DAEMON_PROTOCOL_VERSION = 3;
7
11
  export function daemonStateDir(env = process.env) {
@@ -11,16 +15,21 @@ export function daemonStateDir(env = process.env) {
11
15
  export function daemonLockPath(env = process.env) {
12
16
  return join(daemonStateDir(env), "daemon.json");
13
17
  }
18
+ function daemonLaunchLeasePath(env) {
19
+ return `${daemonLockPath(env)}.launchlease`;
20
+ }
14
21
  export function daemonLogPath(env = process.env) {
15
22
  return join(daemonStateDir(env), "daemon.log");
16
23
  }
17
24
  export function daemonSnapshotPath(env = process.env) {
18
25
  return join(daemonStateDir(env), "snapshot.json");
19
26
  }
20
- /** Validate a lock payload; anything malformed reads as no daemon. */
27
+ /** Validate the identity used for daemon ownership checks. */
21
28
  function parseLock(raw) {
22
29
  try {
23
30
  const value = JSON.parse(raw);
31
+ const generation = typeof value.generation === "string" ? value.generation : undefined;
32
+ const starttime = typeof value.processStarttime === "string" ? value.processStarttime : undefined;
24
33
  const pid = Number(value.pid);
25
34
  const port = Number(value.port);
26
35
  const token = typeof value.token === "string" ? value.token : "";
@@ -28,6 +37,8 @@ function parseLock(raw) {
28
37
  const exe = typeof value.exe === "string" ? value.exe : "";
29
38
  if (!Number.isInteger(pid) || pid <= 0)
30
39
  return undefined;
40
+ if (starttime !== undefined && !/^\d+$/.test(starttime))
41
+ return undefined;
31
42
  if (!Number.isInteger(port) || port <= 0 || port > 65535)
32
43
  return undefined;
33
44
  if (!token)
@@ -36,7 +47,7 @@ function parseLock(raw) {
36
47
  return undefined;
37
48
  if (!exe)
38
49
  return undefined;
39
- return { pid, port, token, startedAt, exe };
50
+ return { generation, processStarttime: starttime, pid, port, token, startedAt, exe };
40
51
  }
41
52
  catch {
42
53
  return undefined;
@@ -73,9 +84,6 @@ function processState(pid) {
73
84
  return "unknown";
74
85
  }
75
86
  }
76
- function processAlive(pid) {
77
- return processState(pid) === "alive";
78
- }
79
87
  function windowsProcessCommand(pid) {
80
88
  const queries = [
81
89
  ["powershell.exe", ["-NoProfile", "-NonInteractive", "-Command", `$p = Get-CimInstance -ClassName Win32_Process -Filter 'ProcessId = ${pid}'; if ($null -ne $p) { $p.CommandLine }`]],
@@ -94,9 +102,24 @@ function windowsProcessCommand(pid) {
94
102
  }
95
103
  return undefined;
96
104
  }
105
+ function macosProcessCommand(pid) {
106
+ try {
107
+ const output = execFileSync("ps", ["-p", String(pid), "-o", "command="], {
108
+ encoding: "utf8",
109
+ stdio: ["ignore", "pipe", "ignore"],
110
+ timeout: 2_000,
111
+ }).trim();
112
+ return output || undefined;
113
+ }
114
+ catch {
115
+ return undefined;
116
+ }
117
+ }
97
118
  export function processCommand(pid) {
98
119
  if (process.platform === "win32")
99
120
  return windowsProcessCommand(pid);
121
+ if (process.platform === "darwin")
122
+ return macosProcessCommand(pid);
100
123
  try {
101
124
  return readFileSync(join("/proc", String(pid), "cmdline"), "utf8").replace(/\0/g, " ").trim();
102
125
  }
@@ -104,47 +127,96 @@ export function processCommand(pid) {
104
127
  return undefined;
105
128
  }
106
129
  }
130
+ /** Linux PID start time distinguishes a recycled PID running the same command. */
131
+ export function processStarttime(pid) {
132
+ if (process.platform !== "linux")
133
+ return undefined;
134
+ try {
135
+ return processStarttimeFromStat(readFileSync(join("/proc", String(pid), "stat"), "utf8"));
136
+ }
137
+ catch {
138
+ return undefined;
139
+ }
140
+ }
107
141
  function quotedPathPattern(path) {
108
142
  const escaped = path.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
109
143
  return new RegExp(`(?:^|[\\s"])${escaped}(?=$|[\\s"])`, "i");
110
144
  }
111
- function processMatchesDaemon(info) {
112
- if (!processAlive(info.pid))
113
- return false;
114
- // S012: portable ownership proof. On Linux `/proc/<pid>/cmdline` is the
115
- // strongest identity signal. macOS and Windows have no `/proc`; we trust
116
- // liveness plus the daemon-held token (callers authenticate commands
117
- // separately via `/ping` and bearer-token requests).
118
- if (process.platform !== "linux")
119
- return Boolean(info.token) && info.port > 0 && info.port <= 65535;
145
+ function daemonOwnership(info) {
146
+ // Command ownership is required on every platform. The token only proves a
147
+ // caller can speak to the loopback listener; it does not prove that a PID
148
+ // from a stale lock still belongs to this daemon.
120
149
  const cmdline = processCommand(info.pid);
121
150
  if (cmdline === undefined)
122
- return false;
151
+ return "unknown";
152
+ if (info.processStarttime) {
153
+ const observedStarttime = processStarttime(info.pid);
154
+ if (observedStarttime === undefined)
155
+ return "unknown";
156
+ if (observedStarttime !== info.processStarttime)
157
+ return "mismatch";
158
+ }
123
159
  const normalized = cmdline.replace(/\s+/g, " ").trim();
124
- return quotedPathPattern(info.exe).test(normalized) && /(?:^|\s)daemon\s+run(?:\s|$)/i.test(normalized);
160
+ return quotedPathPattern(info.exe).test(normalized) && /(?:^|\s)daemon\s+run(?:\s|$)/i.test(normalized) ? "match" : "mismatch";
125
161
  }
126
- /** Read the daemon lock and classify it as running or stale. */
162
+ /** Preserve the lock whenever process ownership cannot be established. */
127
163
  export function readDaemonStatus(env = process.env) {
128
164
  const path = daemonLockPath(env);
129
165
  if (!existsSync(path))
130
166
  return { state: "stopped" };
131
- const info = parseLock(readFileSync(path, "utf8"));
132
- // An unreadable lock reads as stopped; the file stays so a concurrent
133
- // writer is not clobbered mid-start.
167
+ let raw;
168
+ try {
169
+ raw = readFileSync(path, "utf8");
170
+ }
171
+ catch {
172
+ // A lock we cannot inspect is an ownership boundary, not permission to
173
+ // delete it or start another daemon beside a possible live owner.
174
+ return { state: "unknown", unknownReason: "lock-unreadable" };
175
+ }
176
+ const info = parseLock(raw);
134
177
  if (!info)
135
- return { state: "stopped" };
136
- if (!processAlive(info.pid)) {
137
- rmSync(path, { force: true });
178
+ return { state: "unknown", unknownReason: "lock-invalid" };
179
+ const liveness = processState(info.pid);
180
+ if (liveness === "dead") {
138
181
  return { state: "stale", daemon: info, staleReason: "process-exited" };
139
182
  }
140
- if (!processMatchesDaemon(info)) {
183
+ if (liveness === "unknown") {
184
+ return { state: "unknown", daemon: info, unknownReason: "process-unknown" };
185
+ }
186
+ const ownership = daemonOwnership(info);
187
+ if (ownership === "unknown") {
188
+ return { state: "unknown", daemon: info, unknownReason: "ownership-unknown" };
189
+ }
190
+ if (ownership === "mismatch") {
141
191
  // The recorded daemon is gone and the PID was reused by a foreign
142
- // process. Drop our lock; never signal a process we do not own.
143
- rmSync(path, { force: true });
192
+ // process. Reporting is deliberately read-only: an intervening daemon
193
+ // could otherwise have replaced this path before an unconditional unlink.
144
194
  return { state: "stale", daemon: info, staleReason: "process-mismatch" };
145
195
  }
146
196
  return { state: "running", daemon: info };
147
197
  }
198
+ function sameDaemon(left, right) {
199
+ return left.generation === right.generation && left.processStarttime === right.processStarttime && left.pid === right.pid && left.port === right.port && left.token === right.token && left.startedAt === right.startedAt && left.exe === right.exe;
200
+ }
201
+ function daemonOwnershipLeasePath(env) {
202
+ return `${daemonLockPath(env)}.ownership`;
203
+ }
204
+ function writeOwnerRecord(path, value) {
205
+ const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`;
206
+ const descriptor = openSync(temporary, "wx", 0o600);
207
+ try {
208
+ writeFileSync(descriptor, `${JSON.stringify(value, null, 2)}\n`, "utf8");
209
+ }
210
+ finally {
211
+ closeSync(descriptor);
212
+ }
213
+ try {
214
+ renameSync(temporary, path);
215
+ }
216
+ finally {
217
+ rmSync(temporary, { force: true });
218
+ }
219
+ }
148
220
  /** Write the daemon cache snapshot; kept small because it is a cache only. */
149
221
  export function writeSnapshot(env, snapshot) {
150
222
  mkdirSync(daemonStateDir(env), { recursive: true, mode: 0o700 });
@@ -153,10 +225,44 @@ export function writeSnapshot(env, snapshot) {
153
225
  /** Record a running daemon so other processes can discover and verify it. */
154
226
  export function writeDaemonLock(env, info) {
155
227
  mkdirSync(daemonStateDir(env), { recursive: true, mode: 0o700 });
156
- writeFileSync(daemonLockPath(env), `${JSON.stringify(info, null, 2)}\n`, { mode: 0o600 });
228
+ const lease = acquireLease(daemonOwnershipLeasePath(env), "daemon ownership is being updated by another process");
229
+ try {
230
+ writeOwnerRecord(daemonLockPath(env), { ...info, generation: info.generation ?? randomUUID() });
231
+ }
232
+ finally {
233
+ lease.release();
234
+ }
157
235
  }
158
- export function clearDaemonLock(env = process.env) {
159
- rmSync(daemonLockPath(env), { force: true });
236
+ /** Remove a lock only when it still records the owner that is shutting down. */
237
+ export function clearDaemonLock(env = process.env, expected) {
238
+ if (!expected)
239
+ return false;
240
+ const path = daemonLockPath(env);
241
+ let lease;
242
+ try {
243
+ lease = acquireLease(daemonOwnershipLeasePath(env), "daemon ownership is being updated by another process");
244
+ }
245
+ catch (error) {
246
+ if (error instanceof OwnershipError)
247
+ return false;
248
+ throw error;
249
+ }
250
+ try {
251
+ let current;
252
+ try {
253
+ current = parseLock(readFileSync(path, "utf8"));
254
+ }
255
+ catch {
256
+ return false;
257
+ }
258
+ if (!current || !sameDaemon(current, expected))
259
+ return false;
260
+ rmSync(path, { force: true });
261
+ return true;
262
+ }
263
+ finally {
264
+ lease.release();
265
+ }
160
266
  }
161
267
  export function readSnapshot(env = process.env) {
162
268
  try {
@@ -186,60 +292,84 @@ function delay(ms) {
186
292
  * reports a live lock. Returns the recorded daemon info.
187
293
  */
188
294
  export async function startDaemon(env = process.env) {
189
- const existing = readDaemonStatus(env);
190
- if (existing.state === "running" && existing.daemon) {
191
- throw new DaemonError(`daemon already running (pid ${existing.daemon.pid}, port ${existing.daemon.port})`);
192
- }
193
295
  mkdirSync(daemonStateDir(env), { recursive: true, mode: 0o700 });
194
- const entry = process.argv[1];
195
- if (!entry)
196
- throw new DaemonError("cannot determine omb entry script for daemon launch");
197
296
  // S013: take an exclusive launch lease (NX create) before spawning so two
198
- // concurrent callers cannot both observe "not running" and both spawn. The
199
- // lease is cleared as soon as the daemon publishes the real lock or startup fails.
200
- const leasePath = `${daemonLockPath(env)}.launchlease`;
201
- let leaseFd;
297
+ // concurrent callers cannot both classify a stale lock and launch a child.
298
+ // The child atomically replaces a stale lock when it publishes its identity.
299
+ const leasePath = daemonLaunchLeasePath(env);
300
+ let launchLease;
202
301
  try {
203
- leaseFd = openSync(leasePath, "wx");
204
- writeFileSync(leaseFd, `${process.pid}\n${Date.now()}\n`, { mode: 0o600 });
302
+ launchLease = acquireLease(leasePath, `another startDaemon is already in progress (lease ${leasePath})`);
205
303
  }
206
304
  catch (error) {
207
- if (error.code === "EEXIST")
208
- throw new DaemonError(`another startDaemon is already in progress (lease ${leasePath})`);
305
+ if (error instanceof OwnershipError)
306
+ throw new DaemonError(error.message);
209
307
  throw error;
210
308
  }
211
- const releaseLease = () => { try {
212
- closeSync(leaseFd);
213
- rmSync(leasePath, { force: true });
214
- }
215
- catch { /* best-effort */ } };
216
- const log = openSync(daemonLogPath(env), "a");
217
- const child = spawn(process.execPath, [entry, "daemon", "run"], {
218
- cwd: env.HOME || homedir(), env, detached: true, stdio: ["ignore", log, log],
219
- });
220
- closeSync(log);
221
- child.unref();
222
- const deadline = Date.now() + 10_000;
223
- let result;
224
- while (Date.now() < deadline) {
225
- const status = readDaemonStatus(env);
226
- if (status.state === "running" && status.daemon) {
227
- result = status.daemon;
228
- break;
309
+ try {
310
+ const existing = readDaemonStatus(env);
311
+ if (existing.state === "running" && existing.daemon) {
312
+ throw new DaemonError(`daemon already running (pid ${existing.daemon.pid}, port ${existing.daemon.port})`);
313
+ }
314
+ if (existing.state === "unknown") {
315
+ throw new DaemonError(`daemon lock cannot be safely inspected (${existing.unknownReason ?? "unknown"}); lock retained`);
316
+ }
317
+ const entry = process.argv[1];
318
+ if (!entry)
319
+ throw new DaemonError("cannot determine omb entry script for daemon launch");
320
+ const log = openSync(daemonLogPath(env), "a");
321
+ try {
322
+ const child = spawn(process.execPath, [entry, "daemon", "run"], {
323
+ cwd: env.HOME || homedir(), env, detached: true, stdio: ["ignore", log, log],
324
+ });
325
+ child.unref();
326
+ }
327
+ finally {
328
+ closeSync(log);
329
+ }
330
+ const deadline = Date.now() + 10_000;
331
+ while (Date.now() < deadline) {
332
+ const status = readDaemonStatus(env);
333
+ if (status.state === "running" && status.daemon)
334
+ return status.daemon;
335
+ await delay(100);
229
336
  }
230
- await delay(100);
231
- }
232
- releaseLease();
233
- if (!result)
234
337
  throw new DaemonError(`daemon did not become ready; see ${daemonLogPath(env)}`);
235
- return result;
338
+ }
339
+ finally {
340
+ launchLease.release();
341
+ }
342
+ }
343
+ function checkedDaemonState(env, expected) {
344
+ const current = readDaemonStatus(env);
345
+ if (current.state === "stopped")
346
+ return "stopped";
347
+ if (current.state === "unknown") {
348
+ throw new DaemonError(`daemon lock cannot be safely inspected (${current.unknownReason ?? "unknown"}); lock retained`);
349
+ }
350
+ if (!current.daemon || !sameDaemon(current.daemon, expected)) {
351
+ throw new DaemonError("daemon identity changed while waiting for shutdown; lock retained");
352
+ }
353
+ if (current.state === "stale")
354
+ return "stopped";
355
+ return "running";
236
356
  }
237
- /** Ask the running daemon to exit, then wait for the lock to disappear. */
357
+ /**
358
+ * Ask the running daemon to exit, then wait for it to release its own record.
359
+ * A daemon that exits cleanly removes the lock it published, so the record
360
+ * disappearing is the normal completion signal; a record left behind by a
361
+ * daemon that died without releasing it also counts as stopped, because
362
+ * `startDaemon` replaces a stale lock instead of trusting it.
363
+ */
238
364
  export async function stopDaemon(env = process.env) {
239
365
  const status = readDaemonStatus(env);
366
+ if (status.state === "unknown") {
367
+ throw new DaemonError(`daemon lock cannot be safely inspected (${status.unknownReason ?? "unknown"}); lock retained`);
368
+ }
240
369
  if (status.state !== "running" || !status.daemon)
241
370
  return "not-running";
242
- const { pid, port, token } = status.daemon;
371
+ const expected = status.daemon;
372
+ const { port, token } = expected;
243
373
  try {
244
374
  const response = await fetch(`http://127.0.0.1:${port}/stop`, {
245
375
  method: "POST",
@@ -254,7 +384,7 @@ export async function stopDaemon(env = process.env) {
254
384
  }
255
385
  const deadline = Date.now() + 5_000;
256
386
  while (Date.now() < deadline) {
257
- if (readDaemonStatus(env).state === "stopped")
387
+ if (checkedDaemonState(env, expected) === "stopped")
258
388
  return "stopped";
259
389
  await delay(50);
260
390
  }
@@ -262,21 +392,24 @@ export async function stopDaemon(env = process.env) {
262
392
  // SIGTERM to SIGKILL and verify the process is actually gone before clearing
263
393
  // the lock so a live orphan does not silently escape ownership tracking.
264
394
  for (const sig of ["SIGTERM", "SIGKILL"]) {
395
+ // Re-read immediately before each signal. A PID can be reused and a daemon
396
+ // may be replaced while the HTTP stop request or a previous poll was in
397
+ // flight; the lock's original identity is the only authority to signal it.
398
+ if (checkedDaemonState(env, expected) === "stopped")
399
+ return "stopped";
265
400
  try {
266
- process.kill(pid, sig);
401
+ process.kill(expected.pid, sig);
267
402
  }
268
403
  catch { /* already gone */ }
269
404
  const pollDeadline = Date.now() + (sig === "SIGTERM" ? 5_000 : 3_000);
270
405
  while (Date.now() < pollDeadline) {
271
- if (!processAlive(pid)) {
272
- rmSync(daemonLockPath(env), { force: true });
406
+ if (checkedDaemonState(env, expected) === "stopped")
273
407
  return "stopped";
274
- }
275
408
  await delay(50);
276
409
  }
277
410
  }
278
411
  // Process still alive after SIGKILL escalation — do NOT clear the lock; the
279
412
  // caller must decide how to handle an unkillable daemon.
280
- throw new DaemonError(`daemon (pid ${pid}) did not exit after SIGKILL; lock retained`);
413
+ throw new DaemonError(`daemon (pid ${expected.pid}) did not exit after SIGKILL; lock retained`);
281
414
  }
282
415
  //# sourceMappingURL=daemon.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/omp/daemon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/omp/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import type { DispatchIntent, WorkerObservation, WorkflowRun } from "../core/types.js";
2
+ import type { SessionBinding } from "./lifecycle.js";
3
+ export interface NativeTaskRequest {
4
+ name?: string;
5
+ agent: string;
6
+ isolated: boolean;
7
+ task?: string;
8
+ scope?: string[];
9
+ /**
10
+ * OMP 18.5 per-call model selector, forwarded exactly as the host sent it.
11
+ *
12
+ * Deliberately `unknown`: the raw array must survive to
13
+ * `normalizeRequestedModelSelectors`, which is the single place that decides a
14
+ * selector is malformed. Coercing it here would turn a non-string entry into
15
+ * a plausible-looking selector and journal it as admitted routing.
16
+ */
17
+ model?: unknown;
18
+ /** Per-spawn thinking effort, a dimension separate from model identity. */
19
+ effort?: string;
20
+ solutionSpace?: string;
21
+ tools?: string[];
22
+ }
23
+ type NativeOutcome = "settled" | "failed" | "cancelled" | "unknown-outcome";
24
+ /**
25
+ * Journal a Bizar dispatch for every native task an admitted `task` call runs.
26
+ *
27
+ * The dispatch is written *before* OMP executes anything and bound to OMP's own
28
+ * `toolCallId`, so a real native execution is always correlatable to the run
29
+ * that admitted it. Without that binding, `accept-work` could never find a
30
+ * settled dispatch for the work a native task actually did, and cancellation had
31
+ * no identity to propagate to.
32
+ *
33
+ * A dispatch is recorded only for a task the run's work items already back. A
34
+ * task naming something the run never admitted is left to the existing A002 and
35
+ * A004 gates, unchanged: there is no work item for `accept-work` to accept, so
36
+ * inventing a synthetic one would attach a settlement to nothing.
37
+ *
38
+ * A call with no native identity is refused: a dispatch nothing can later settle
39
+ * is not lifecycle proof, it is a record of an intention.
40
+ */
41
+ export declare function admitNativeTasks(binding: SessionBinding, run: WorkflowRun, requests: NativeTaskRequest[], toolCallId: string | undefined): DispatchIntent[];
42
+ /**
43
+ * Settle every dispatch bound to a native call.
44
+ *
45
+ * Settlement is driven by OMP's own `tool_result`, so the recorded outcome is
46
+ * the host's, never the model's. An errored call settles as `failed`; a call the
47
+ * host could not classify settles as `unknown-outcome` rather than being
48
+ * optimistically counted as work that succeeded.
49
+ */
50
+ export declare function settleNativeCall(binding: SessionBinding, run: WorkflowRun, toolCallId: string, outcome: {
51
+ isError?: boolean;
52
+ structuredStatus?: unknown;
53
+ structuredData?: unknown;
54
+ artifactRefs?: string[];
55
+ status?: NativeOutcome;
56
+ details?: unknown;
57
+ }): WorkerObservation[];
58
+ /** Dispatches still in flight for a run, in the order they were admitted. */
59
+ export declare function liveDispatches(binding: SessionBinding, runId: string): DispatchIntent[];
60
+ export {};
61
+ //# sourceMappingURL=dispatch-lifecycle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch-lifecycle.d.ts","sourceRoot":"","sources":["../../src/omp/dispatch-lifecycle.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAA8B,iBAAiB,EAAE,WAAW,EAAY,MAAM,kBAAkB,CAAC;AAC7H,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,KAAK,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,iBAAiB,CAAC;AAM5E;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,cAAc,EAAE,CAe3J;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,iBAAiB,EAAE,CA4B7Q;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,EAAE,CAEvF"}
@@ -0,0 +1,101 @@
1
+ import { ContractError } from "../core/errors.js";
2
+ import { classifyRoute } from "../core/policies.js";
3
+ import { admitDispatch } from "./dispatch-admission.js";
4
+ import { settlementForStructuredOutput, normalizeSpecialistResult } from "../services/specialist-contracts.js";
5
+ import { readObservedRouting, requestedRouting, settledResultFor } from "./task-model-selector.js";
6
+ /** Dispatch statuses that no longer represent work in flight. */
7
+ const settledStatuses = new Set(["settled", "failed", "cancelled", "unknown-outcome", "rejected"]);
8
+ /**
9
+ * Journal a Bizar dispatch for every native task an admitted `task` call runs.
10
+ *
11
+ * The dispatch is written *before* OMP executes anything and bound to OMP's own
12
+ * `toolCallId`, so a real native execution is always correlatable to the run
13
+ * that admitted it. Without that binding, `accept-work` could never find a
14
+ * settled dispatch for the work a native task actually did, and cancellation had
15
+ * no identity to propagate to.
16
+ *
17
+ * A dispatch is recorded only for a task the run's work items already back. A
18
+ * task naming something the run never admitted is left to the existing A002 and
19
+ * A004 gates, unchanged: there is no work item for `accept-work` to accept, so
20
+ * inventing a synthetic one would attach a settlement to nothing.
21
+ *
22
+ * A call with no native identity is refused: a dispatch nothing can later settle
23
+ * is not lifecycle proof, it is a record of an intention.
24
+ */
25
+ export function admitNativeTasks(binding, run, requests, toolCallId) {
26
+ if (!toolCallId?.trim())
27
+ throw new ContractError("The OMP host did not expose a tool call id; a managed task cannot be bound to the run that admitted it");
28
+ const recorded = [];
29
+ for (const request of requests) {
30
+ const workItemId = request.name?.trim() ?? "";
31
+ const item = run.workItems.find(candidate => candidate.id === workItemId);
32
+ if (!item)
33
+ continue;
34
+ const decision = classifyRoute({ text: `${item.title} ${workItemId}`, role: request.agent, files: item.scope });
35
+ const intent = admitDispatch(run, item, decision, "trusted-development", run.nativeSessionId);
36
+ const routing = requestedRouting(request);
37
+ const bound = { ...intent, status: "admitted", nativeCallId: toolCallId, idempotencyKey: `${intent.idempotencyKey}:${toolCallId}`, requestedModelSelectors: routing.selectors, routingSource: routing.source, ...(routing.effort ? { requestedEffort: routing.effort } : {}) };
38
+ binding.journal.append({ type: "dispatch.recorded", runId: run.runId, intent: bound }, `dispatch:${bound.id}:${toolCallId}`, run.revision);
39
+ recorded.push(bound);
40
+ }
41
+ return recorded;
42
+ }
43
+ /**
44
+ * Settle every dispatch bound to a native call.
45
+ *
46
+ * Settlement is driven by OMP's own `tool_result`, so the recorded outcome is
47
+ * the host's, never the model's. An errored call settles as `failed`; a call the
48
+ * host could not classify settles as `unknown-outcome` rather than being
49
+ * optimistically counted as work that succeeded.
50
+ */
51
+ export function settleNativeCall(binding, run, toolCallId, outcome) {
52
+ const snapshot = binding.journal.snapshot();
53
+ const bound = snapshot.dispatches.filter(intent => intent.runId === run.runId && intent.nativeCallId === toolCallId && !settledStatuses.has(intent.status));
54
+ const status = outcome.status ?? settlementForStructuredOutput(outcome.structuredStatus, outcome.isError === true);
55
+ const settled = [];
56
+ for (const intent of bound) {
57
+ const sequence = snapshot.observations.filter(observation => observation.dispatchId === intent.id).length + 1;
58
+ // Routing is reported per spawn, and the admitted dispatches are fewer than
59
+ // the spawns whenever a batch task names no work item, so the result is
60
+ // matched on the dispatch's own work item id rather than on admission
61
+ // order. An unmatched result stays unobserved rather than borrowing the
62
+ // model a different spawn actually ran.
63
+ const observedRouting = readObservedRouting(settledResultFor(outcome.details, intent.workItemId));
64
+ const observation = {
65
+ dispatchId: intent.id,
66
+ nativeCallId: toolCallId,
67
+ sourceEvent: "omp.tool_result",
68
+ sequence,
69
+ status,
70
+ structuredResult: normalizedResult(outcome.structuredData),
71
+ artifactRefs: outcome.artifactRefs ?? [],
72
+ observedAt: new Date().toISOString(),
73
+ ...(observedRouting ? { observedRouting } : {}),
74
+ };
75
+ binding.journal.append({ type: "dispatch.state_changed", runId: run.runId, dispatch: { ...intent, status }, observed: observation }, `dispatch-settled:${intent.id}:${sequence}`, run.revision);
76
+ settled.push(observation);
77
+ }
78
+ return settled;
79
+ }
80
+ /** Dispatches still in flight for a run, in the order they were admitted. */
81
+ export function liveDispatches(binding, runId) {
82
+ return binding.journal.snapshot().dispatches.filter(intent => intent.runId === runId && !settledStatuses.has(intent.status));
83
+ }
84
+ /**
85
+ * Persist only the normalized result.
86
+ *
87
+ * Raw child transcript stays owned by OMP and is retrieved through its own
88
+ * session and history surfaces. What Bizar keeps is the validated payload, so
89
+ * evidence lineage never carries unvalidated prose from a child.
90
+ */
91
+ function normalizedResult(data) {
92
+ if (data === undefined)
93
+ return undefined;
94
+ try {
95
+ return normalizeSpecialistResult(data);
96
+ }
97
+ catch {
98
+ return undefined;
99
+ }
100
+ }
101
+ //# sourceMappingURL=dispatch-lifecycle.js.map