@polderlabs/bizar-omp 0.7.9 → 0.7.10

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 (64) hide show
  1. package/README.md +35 -4
  2. package/dist/cli/agents.d.ts.map +1 -1
  3. package/dist/cli/agents.js +46 -23
  4. package/dist/cli/agents.js.map +1 -1
  5. package/dist/cli/doctor.d.ts +4 -4
  6. package/dist/cli/install.d.ts +126 -9
  7. package/dist/cli/install.d.ts.map +1 -1
  8. package/dist/cli/install.js +19 -4
  9. package/dist/cli/install.js.map +1 -1
  10. package/dist/cli/mobile-claim.d.ts +143 -0
  11. package/dist/cli/mobile-claim.d.ts.map +1 -0
  12. package/dist/cli/mobile-claim.js +399 -0
  13. package/dist/cli/mobile-claim.js.map +1 -0
  14. package/dist/cli/omb-commands.d.ts +1 -1
  15. package/dist/cli/omb-commands.d.ts.map +1 -1
  16. package/dist/cli/omb-commands.js +22 -1
  17. package/dist/cli/omb-commands.js.map +1 -1
  18. package/dist/cli/omb-mobile.d.ts +47 -0
  19. package/dist/cli/omb-mobile.d.ts.map +1 -0
  20. package/dist/cli/omb-mobile.js +307 -0
  21. package/dist/cli/omb-mobile.js.map +1 -0
  22. package/dist/cli/omb-sessions.d.ts +64 -0
  23. package/dist/cli/omb-sessions.d.ts.map +1 -0
  24. package/dist/cli/omb-sessions.js +231 -0
  25. package/dist/cli/omb-sessions.js.map +1 -0
  26. package/dist/cli/omb.js +20 -15
  27. package/dist/cli/omb.js.map +1 -1
  28. package/dist/cli/omp-mobile-dispatch.d.ts +10 -0
  29. package/dist/cli/omp-mobile-dispatch.d.ts.map +1 -0
  30. package/dist/cli/omp-mobile-dispatch.js +148 -0
  31. package/dist/cli/omp-mobile-dispatch.js.map +1 -0
  32. package/dist/omp/compatibility-receipt.d.ts +69 -0
  33. package/dist/omp/compatibility-receipt.d.ts.map +1 -0
  34. package/dist/omp/compatibility-receipt.js +60 -0
  35. package/dist/omp/compatibility-receipt.js.map +1 -0
  36. package/dist/omp/compatibility.d.ts +5 -5
  37. package/dist/omp/compatibility.d.ts.map +1 -1
  38. package/dist/omp/compatibility.js +2 -2
  39. package/dist/omp/compatibility.js.map +1 -1
  40. package/dist/omp/daemon-service.d.ts +4 -0
  41. package/dist/omp/daemon-service.d.ts.map +1 -1
  42. package/dist/omp/daemon-service.js +418 -8
  43. package/dist/omp/daemon-service.js.map +1 -1
  44. package/dist/omp/omb-sessions.d.ts +10 -0
  45. package/dist/omp/omb-sessions.d.ts.map +1 -1
  46. package/dist/omp/omb-sessions.js +8 -6
  47. package/dist/omp/omb-sessions.js.map +1 -1
  48. package/dist/omp/tmux.d.ts +6 -0
  49. package/dist/omp/tmux.d.ts.map +1 -1
  50. package/dist/omp/tmux.js +11 -0
  51. package/dist/omp/tmux.js.map +1 -1
  52. package/dist/scripts/emit-compatibility-receipt.d.ts +2 -0
  53. package/dist/scripts/emit-compatibility-receipt.d.ts.map +1 -0
  54. package/dist/scripts/emit-compatibility-receipt.js +33 -0
  55. package/dist/scripts/emit-compatibility-receipt.js.map +1 -0
  56. package/docs/07-bizarharness-integration.md +44 -0
  57. package/docs/compatibility/baseline.json +9 -8
  58. package/docs/compatibility/supported-surfaces.json +2 -1
  59. package/docs/releases/0.7.10.md +27 -0
  60. package/docs/releases/support-matrix.md +8 -1
  61. package/package.json +6 -4
  62. package/skills/omp-native-development/SKILL.md +1 -1
  63. package/skills/omp-native-development/references/accuracy-and-versioning.md +1 -1
  64. package/skills/omp-native-development/references/source-manifest.json +3 -3
@@ -0,0 +1,231 @@
1
+ import { claimSessionForMobile, describeClaim, listClaims, releaseMobileClaim, } from "./mobile-claim.js";
2
+ import { listOmbSessions, sessionMatchesCwdScope } from "../omp/omb-sessions.js";
3
+ /**
4
+ * `omb sessions list --json` — a machine-readable session inventory.
5
+ *
6
+ * Until this existed there was no stable way for another tool to learn what
7
+ * sessions Bizar owns. The dashboard's `GET /sessions` is the only other
8
+ * machine-readable surface, and it is deliberately gated behind a loopback
9
+ * bearer token; a companion process on the same host has no way to reach it
10
+ * without minting one.
11
+ *
12
+ * Two properties are load-bearing and must not be relaxed:
13
+ *
14
+ * - **Scan authority travels with the data.** An empty list is ambiguous with
15
+ * "the multiplexer did not answer", and a consumer that treats it as
16
+ * authoritative blanks every row on a transient tmux restart. `authority.known`
17
+ * is what lets a caller tell those apart.
18
+ * - **Liveness is never inferred.** `processObserved`, `authorityKnown` and
19
+ * `uncertainLiveness` are three separate observations, reported as three
20
+ * separate fields. Collapsing them would turn "we could not tell" into "no".
21
+ */
22
+ export const SESSIONS_USAGE = `omb sessions list [--all] [--json]
23
+
24
+ Lists the Bizar-owned sessions for this project; --all selects every project.
25
+
26
+ --json print machine-readable output for other tools.
27
+ --all include sessions from every project known to this OMB host.
28
+
29
+ Fields are observations, not inferences. authority.known is false when the
30
+ multiplexer did not answer, and an empty sessions list in that state means
31
+ "unknown", not "none". uncertainLiveness and processObserved are reported
32
+ separately for the same reason: unknown liveness is never downgraded to
33
+ absent.`;
34
+ /**
35
+ * Projects an internal session row onto the published shape.
36
+ *
37
+ * `command` and all prompt/tool content are dropped. The process id and native
38
+ * id remain only for trusted host-side consumers that prove claim eligibility;
39
+ * the mobile host removes both before projecting any row to the phone.
40
+ */
41
+ function toInventorySession(session) {
42
+ return {
43
+ name: session.name,
44
+ displayName: session.displayName ?? session.name,
45
+ state: session.state,
46
+ generation: session.generation,
47
+ project: session.project,
48
+ cwd: session.cwd,
49
+ hosted: session.hosted,
50
+ attached: session.attached,
51
+ authorityKnown: session.authorityKnown,
52
+ processObserved: session.processObserved,
53
+ uncertainLiveness: session.uncertainLiveness,
54
+ ...(session.activity === undefined ? {} : { activity: (({ pid: _pid, ...activity }) => activity)(session.activity) }),
55
+ ...(session.nativeId === undefined ? {} : { nativeId: session.nativeId }),
56
+ ...(session.pid === undefined ? {} : { pid: session.pid }),
57
+ };
58
+ }
59
+ /**
60
+ * One scan, one authority value.
61
+ *
62
+ * An earlier version probed authority and then listed sessions separately. That
63
+ * is wrong: if the multiplexer changes state between the two probes, the
64
+ * payload can claim `authority.known: true` alongside an empty list, which is
65
+ * exactly the "blank every row on a transient restart" failure the field
66
+ * exists to prevent. `requireMultiplexer` makes the listing itself fail
67
+ * closed, so authority and data are always the same observation.
68
+ */
69
+ export async function collectSessionsInventory(cwd = process.cwd(), env = process.env, options = {}) {
70
+ let sessions;
71
+ try {
72
+ sessions = await listOmbSessions(cwd, env, { includeStopped: true, requireMultiplexer: true, includeAllStopped: true });
73
+ }
74
+ catch (error) {
75
+ // The scan is unavailable, so authority is unknown and the list is
76
+ // explicitly empty. A consumer sees "unknown", not "none".
77
+ const reason = error instanceof Error ? error.message : "the multiplexer did not answer a session scan";
78
+ return { authority: { known: false, reason }, sessions: [] };
79
+ }
80
+ const scoped = options.scope === "all" ? sessions : sessions.filter((session) => sessionMatchesCwdScope(session, cwd));
81
+ return { authority: { known: true }, sessions: scoped.map(toInventorySession) };
82
+ }
83
+ export async function runSessionsCommand(cwd, args, env) {
84
+ // Help is handled before subcommand parsing: `omb sessions --help` is the
85
+ // direct help form every other registered command supports, so it must not be
86
+ // read as a subcommand name and rejected as unknown.
87
+ if (args.includes("--help") || args.includes("-h")) {
88
+ process.stdout.write(`${SESSIONS_USAGE}\n`);
89
+ return 0;
90
+ }
91
+ const sub = args[0] ?? "list";
92
+ const json = args.includes("--json");
93
+ if (sub !== "list") {
94
+ process.stderr.write(`omb sessions: unknown subcommand "${sub}"\n\n${SESSIONS_USAGE}\n`);
95
+ return 2;
96
+ }
97
+ const inventory = await collectSessionsInventory(cwd, env, { scope: args.includes("--all") ? "all" : "project" });
98
+ if (json) {
99
+ process.stdout.write(`${JSON.stringify(inventory, null, 2)}\n`);
100
+ return 0;
101
+ }
102
+ if (inventory.sessions.length === 0) {
103
+ // Say *why* it is empty rather than implying there are no sessions.
104
+ process.stdout.write(inventory.authority.known
105
+ ? "No Bizar sessions for this project.\n"
106
+ : `No sessions could be listed: ${inventory.authority.reason ?? "session authority is unknown"}.\n`);
107
+ return inventory.authority.known ? 0 : 1;
108
+ }
109
+ for (const session of inventory.sessions) {
110
+ const liveness = session.processObserved ? "" : session.uncertainLiveness ? " (liveness unknown)" : " (no live process observed)";
111
+ process.stdout.write(`${session.name} ${session.state}${session.attached ? " attached" : ""}${liveness}\n`);
112
+ }
113
+ return 0;
114
+ }
115
+ /** Mobile ownership controls live under the mobile command family. */
116
+ export async function runMobileSessionsCommand(cwd, args, env) {
117
+ if (args.includes("--help") || args.includes("-h")) {
118
+ process.stdout.write(`${MOBILE_SESSIONS_USAGE}\n`);
119
+ return 0;
120
+ }
121
+ const sub = args[0] ?? "list";
122
+ const json = args.includes("--json");
123
+ if (sub === "claims")
124
+ return runListClaims(env, json);
125
+ if (sub === "claim")
126
+ return await runClaimMobile(cwd, ["claim-mobile", ...args.slice(1)], env, json);
127
+ if (sub === "release")
128
+ return await runReleaseMobile(cwd, ["release-mobile", ...args.slice(1)], env, json);
129
+ if (sub === "list")
130
+ return await runSessionsCommand(cwd, ["list", ...(args.includes("--project") ? [] : ["--all"]), ...args.slice(1)], env);
131
+ process.stderr.write(`omb mobile sessions: unknown subcommand "${sub}"\n\n${MOBILE_SESSIONS_USAGE}\n`);
132
+ return 2;
133
+ }
134
+ export const MOBILE_SESSIONS_USAGE = `omb mobile sessions <list|claims|claim|release> [options]
135
+
136
+ list List OMB sessions across projects (add --project for this directory only).
137
+ claims List outstanding mobile ownership claims.
138
+ claim <name> <generation> [--owner <label>] [--holder-pid <pid>] [--json]
139
+ Claim one stopped session generation for the mobile host.
140
+ release <claim-id> [--json]
141
+ Release a mobile ownership claim.
142
+
143
+ Claims require an exact generation and confirmed stopped, unattached session.
144
+ A session with a live local owner is refused.
145
+ `;
146
+ function runListClaims(env, json) {
147
+ const claims = listClaims(env).map((claim) => describeClaim(claim));
148
+ if (json) {
149
+ process.stdout.write(`${JSON.stringify({ claims }, null, 2)}\n`);
150
+ return 0;
151
+ }
152
+ if (claims.length === 0) {
153
+ process.stdout.write("No mobile claims.\n");
154
+ return 0;
155
+ }
156
+ for (const claim of claims) {
157
+ process.stdout.write(`${String(claim.claimId)} ${String(claim.session)} ${String(claim.owner)}${claim.stale === true ? " (stale)" : ""}\n`);
158
+ }
159
+ return 0;
160
+ }
161
+ async function runClaimMobile(cwd, args, env, json) {
162
+ const name = args[1];
163
+ const generation = args[2];
164
+ if (name === undefined || generation === undefined) {
165
+ process.stderr.write("usage: omb mobile sessions claim <session> <generation> [--owner <label>] [--holder-pid <n>] [--json]\n");
166
+ return 2;
167
+ }
168
+ const ownerIndex = args.indexOf("--owner");
169
+ const owner = ownerIndex >= 0 && args[ownerIndex + 1] !== undefined ? String(args[ownerIndex + 1]) : "mobile";
170
+ const holderIndex = args.indexOf("--holder-pid");
171
+ const holderRaw = holderIndex >= 0 ? args[holderIndex + 1] : undefined;
172
+ const holderPid = holderRaw === undefined ? undefined : Number(holderRaw);
173
+ if (holderPid !== undefined && (!Number.isInteger(holderPid) || holderPid <= 0)) {
174
+ process.stderr.write("omb sessions: --holder-pid must be a positive integer\n");
175
+ return 2;
176
+ }
177
+ try {
178
+ const outcome = await claimSessionForMobile({ cwd, name, generation, owner, holderPid, env });
179
+ if (json) {
180
+ process.stdout.write(`${JSON.stringify(outcome, null, 2)}\n`);
181
+ return 0;
182
+ }
183
+ const lines = [
184
+ `claimed ${outcome.claim.session}`,
185
+ `claim id ${outcome.claim.claimId}`,
186
+ `generation ${outcome.claim.generation}`,
187
+ `directory ${outcome.sessionDir}`,
188
+ ...(outcome.takeover ? ["note took over a stale claim"] : []),
189
+ ];
190
+ process.stdout.write(`${lines.join("\n")}\n`);
191
+ return 0;
192
+ }
193
+ catch (error) {
194
+ return reportFailure(error, json);
195
+ }
196
+ }
197
+ async function runReleaseMobile(cwd, args, env, json) {
198
+ const claimId = args[1];
199
+ if (claimId === undefined) {
200
+ process.stderr.write("usage: omb mobile sessions release <claim-id> [--json]\n");
201
+ return 2;
202
+ }
203
+ try {
204
+ const outcome = await releaseMobileClaim({ claimId, cwd, env });
205
+ if (json) {
206
+ process.stdout.write(`${JSON.stringify(outcome, null, 2)}\n`);
207
+ return 0;
208
+ }
209
+ process.stdout.write(`released ${outcome.claim.session} (claim ${outcome.claim.claimId})\n`);
210
+ // A claim that lost its generation is reported, not buried: the caller has
211
+ // to know the session moved on while it held the claim.
212
+ if (!outcome.generationHeld) {
213
+ process.stderr.write("note: the session changed generation while claimed; the claim did not protect it\n");
214
+ }
215
+ return 0;
216
+ }
217
+ catch (error) {
218
+ return reportFailure(error, json);
219
+ }
220
+ }
221
+ function reportFailure(error, json) {
222
+ const message = error instanceof Error ? error.message : String(error);
223
+ if (json) {
224
+ process.stdout.write(`${JSON.stringify({ ok: false, error: message }, null, 2)}\n`);
225
+ }
226
+ else {
227
+ process.stderr.write(`omb sessions: ${message}\n`);
228
+ }
229
+ return 1;
230
+ }
231
+ //# sourceMappingURL=omb-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omb-sessions.js","sourceRoot":"","sources":["../../src/cli/omb-sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,UAAU,EACV,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAuB,MAAM,wBAAwB,CAAC;AAGtG;;;;;;;;;;;;;;;;;;GAkBG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;UAWpB,CAAC;AA0BX;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAC,OAAuB;IACjD,OAAO;QACL,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI;QAChD,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,eAAe,EAAE,OAAO,CAAC,eAAe;QACxC,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;QAC5C,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrH,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzE,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,GAAG,GAAsB,OAAO,CAAC,GAAG,EACpC,OAAO,GAA2C,EAAE;IAEpD,IAAI,QAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1H,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,mEAAmE;QACnE,2DAA2D;QAC3D,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,+CAA+C,CAAC;QACxG,OAAO,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC/D,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;IACvH,OAAO,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAW,EACX,IAAc,EACd,GAAsB;IAEtB,0EAA0E;IAC1E,8EAA8E;IAC9E,qDAAqD;IACrD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,cAAc,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAErC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,GAAG,QAAQ,cAAc,IAAI,CAAC,CAAC;QACzF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAClH,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,oEAAoE;QACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,SAAS,CAAC,SAAS,CAAC,KAAK;YACvB,CAAC,CAAC,uCAAuC;YACzC,CAAC,CAAC,gCAAgC,SAAS,CAAC,SAAS,CAAC,MAAM,IAAI,8BAA8B,KAAK,CACtG,CAAC;QACF,OAAO,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,8BAA8B,CAAC;QACpI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,IAAI,CAAC,CAAC;IAChH,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,GAAW,EACX,IAAc,EACd,GAAsB;IAEtB,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,qBAAqB,IAAI,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,GAAG,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACtD,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,MAAM,cAAc,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACrG,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,MAAM,gBAAgB,CAAC,GAAG,EAAE,CAAC,gBAAgB,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAC3G,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,MAAM,kBAAkB,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5I,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4CAA4C,GAAG,QAAQ,qBAAqB,IAAI,CAAC,CAAC;IACvG,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;CAWpC,CAAC;AAEF,SAAS,aAAa,CAAC,GAAsB,EAAE,IAAa;IAC1D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;IACpE,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QACjE,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC5C,OAAO,CAAC,CAAC;IACX,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjJ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,IAAc,EAAE,GAAsB,EAAE,IAAa;IAC9F,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,IAAI,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QACnD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yGAAyG,CAAC,CAAC;QAChI,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC9G,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,MAAM,SAAS,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1E,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC;QAChF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAChF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9F,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9D,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,KAAK,GAAG;YACZ,eAAe,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE;YACtC,eAAe,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE;YACtC,eAAe,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE;YACzC,eAAe,OAAO,CAAC,UAAU,EAAE;YACnC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SACrE,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,GAAW,EAAE,IAAc,EAAE,GAAsB,EAAE,IAAa;IAChG,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QACjF,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC9D,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,KAAK,CAAC,OAAO,WAAW,OAAO,CAAC,KAAK,CAAC,OAAO,KAAK,CAAC,CAAC;QAC7F,2EAA2E;QAC3E,wDAAwD;QACxD,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oFAAoF,CAAC,CAAC;QAC7G,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,IAAa;IAClD,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;IACtF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,OAAO,IAAI,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
package/dist/cli/omb.js CHANGED
@@ -5,23 +5,28 @@ import { parseOmbCommand } from "./omb-invocation.js";
5
5
  import { launchOmb, shouldLaunchOmbInTmux } from "../omp/tmux.js";
6
6
  try {
7
7
  const [token = "", ...args] = process.argv.slice(2);
8
- const command = findOmbCommand(token);
9
- if (command) {
10
- process.exitCode = await command.run(args, process.env);
8
+ if (token === "--internal-mobile") {
9
+ process.exitCode = await (await import("./omb-mobile.js")).runMobileCommand(args, process.env);
11
10
  }
12
11
  else {
13
- // Anything omb does not own is an OMP invocation: run or attach it, then
14
- // return to the hub when the launch took over an opaque terminal.
15
- const invocation = parseOmbCommand(process.argv.slice(2));
16
- const returnToHub = shouldLaunchOmbInTmux({
17
- args: invocation.ompArgs,
18
- env: process.env,
19
- stdinIsTTY: process.stdin.isTTY === true,
20
- stdoutIsTTY: process.stdout.isTTY === true,
21
- });
22
- process.exitCode = await launchOmb(process.cwd(), invocation.ompArgs, process.env, invocation.sessionId);
23
- if (returnToHub)
24
- process.exitCode = await runAgentsHub(process.cwd(), [], process.env);
12
+ const command = findOmbCommand(token);
13
+ if (command) {
14
+ process.exitCode = await command.run(args, process.env);
15
+ }
16
+ else {
17
+ // Anything omb does not own is an OMP invocation: run or attach it, then
18
+ // return to the hub when the launch took over an opaque terminal.
19
+ const invocation = parseOmbCommand(process.argv.slice(2));
20
+ const returnToHub = shouldLaunchOmbInTmux({
21
+ args: invocation.ompArgs,
22
+ env: process.env,
23
+ stdinIsTTY: process.stdin.isTTY === true,
24
+ stdoutIsTTY: process.stdout.isTTY === true,
25
+ });
26
+ process.exitCode = await launchOmb(process.cwd(), invocation.ompArgs, process.env, invocation.sessionId);
27
+ if (returnToHub)
28
+ process.exitCode = await runAgentsHub(process.cwd(), [], process.env);
29
+ }
25
30
  }
26
31
  }
27
32
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"omb.js","sourceRoot":"","sources":["../../src/cli/omb.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAElE,IAAI,CAAC;IACH,MAAM,CAAC,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1D,CAAC;SAAM,CAAC;QACN,yEAAyE;QACzE,kEAAkE;QAClE,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,qBAAqB,CAAC;YACxC,IAAI,EAAE,UAAU,CAAC,OAAO;YACxB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI;YACxC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI;SAC3C,CAAC,CAAC;QACH,OAAO,CAAC,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;QACzG,IAAI,WAAW;YAAE,OAAO,CAAC,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACzF,CAAC;AACH,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"omb.js","sourceRoot":"","sources":["../../src/cli/omb.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAElE,IAAI,CAAC;IACH,MAAM,CAAC,KAAK,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,KAAK,KAAK,mBAAmB,EAAE,CAAC;QAClC,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IACjG,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACN,yEAAyE;YACzE,kEAAkE;YAClE,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,WAAW,GAAG,qBAAqB,CAAC;gBACxC,IAAI,EAAE,UAAU,CAAC,OAAO;gBACxB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI;gBACxC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI;aAC3C,CAAC,CAAC;YACH,OAAO,CAAC,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;YACzG,IAAI,WAAW;gBAAE,OAAO,CAAC,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;AACH,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC"}
@@ -0,0 +1,10 @@
1
+ export declare function installOmpMobileDispatch(command?: string, env?: NodeJS.ProcessEnv): {
2
+ path: string;
3
+ nativePath: string;
4
+ installed: boolean;
5
+ };
6
+ export declare function removeOmpMobileDispatch(command?: string, env?: NodeJS.ProcessEnv): {
7
+ path: string;
8
+ restored: boolean;
9
+ };
10
+ //# sourceMappingURL=omp-mobile-dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omp-mobile-dispatch.d.ts","sourceRoot":"","sources":["../../src/cli/omp-mobile-dispatch.ts"],"names":[],"mappings":"AA4CA,wBAAgB,wBAAwB,CAAC,OAAO,SAAQ,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAwCxJ;AAED,wBAAgB,uBAAuB,CAAC,OAAO,SAAQ,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CA4BlI"}
@@ -0,0 +1,148 @@
1
+ import { chmodSync, existsSync, statSync, openSync, closeSync, linkSync, readSync, readFileSync, realpathSync, renameSync, rmSync, writeFileSync } from "node:fs";
2
+ import { delimiter, isAbsolute, join, resolve } from "node:path";
3
+ const MARKER = "# bizar-omp-mobile-dispatch:v1";
4
+ const NATIVE_SUFFIX = ".bizar-native";
5
+ function executableOnPath(command, env) {
6
+ if (command.includes("/") || command.includes("\\")) {
7
+ const candidate = resolve(command);
8
+ return existsSync(candidate) ? candidate : undefined;
9
+ }
10
+ for (const directory of (env.PATH ?? "").split(delimiter)) {
11
+ if (!directory)
12
+ continue;
13
+ const candidate = join(directory, command);
14
+ try {
15
+ if (statSync(candidate).isFile())
16
+ return candidate;
17
+ }
18
+ catch {
19
+ // Continue through PATH; the CLI prints a single useful error below.
20
+ }
21
+ }
22
+ return undefined;
23
+ }
24
+ function wrapper(nativePath) {
25
+ const quote = (value) => `'${value.replaceAll("'", "'\\''")}'`;
26
+ return `#!/bin/sh\n${MARKER}\nif [ "\${1-}" = mobile ]; then\n shift\n exec omb --internal-mobile "$@"\nfi\nexec ${quote(nativePath)} "$@"\n`;
27
+ }
28
+ function readHeader(path) {
29
+ const fd = openSync(path, "r");
30
+ try {
31
+ const buffer = Buffer.alloc(96);
32
+ const count = readSync(fd, buffer, 0, buffer.length, 0);
33
+ return buffer.toString("utf8", 0, count);
34
+ }
35
+ finally {
36
+ closeSync(fd);
37
+ }
38
+ }
39
+ function resolveTarget(command, env) {
40
+ const target = executableOnPath(command, env);
41
+ if (!target)
42
+ throw new Error(`Cannot find OMP executable "${command}" on PATH`);
43
+ if (process.platform === "win32")
44
+ throw new Error("The omp mobile dispatcher currently requires a POSIX shell");
45
+ return realpathSync(target);
46
+ }
47
+ export function installOmpMobileDispatch(command = "omp", env = process.env) {
48
+ const target = resolveTarget(command, env);
49
+ if (!executableOnPath("omb", env))
50
+ throw new Error("Cannot install omp mobile routing because the Bizar OMB command is not on PATH");
51
+ const targetHeader = readHeader(target);
52
+ const nativePath = `${target}${NATIVE_SUFFIX}`;
53
+ if (targetHeader.startsWith(`#!/bin/sh\n${MARKER}\n`)) {
54
+ if (!existsSync(nativePath) || !statSync(nativePath).isFile())
55
+ throw new Error(`omp dispatcher is installed but its native OMP backup is missing: ${nativePath}`);
56
+ return { path: target, nativePath, installed: false };
57
+ }
58
+ if (!statSync(target).isFile())
59
+ throw new Error(`OMP path is not a regular executable file: ${target}`);
60
+ if (existsSync(nativePath)) {
61
+ const targetStat = statSync(target);
62
+ const backupStat = statSync(nativePath);
63
+ if (targetStat.dev === backupStat.dev && targetStat.ino === backupStat.ino)
64
+ rmSync(nativePath);
65
+ else
66
+ throw new Error(`Refusing to replace an existing OMP backup: ${nativePath}`);
67
+ }
68
+ const lockPath = `${target}.bizar-mobile.lock`;
69
+ let lock;
70
+ try {
71
+ lock = openSync(lockPath, "wx", 0o600);
72
+ }
73
+ catch {
74
+ throw new Error(`Another OMP mobile dispatcher change is in progress (${lockPath})`);
75
+ }
76
+ const temporary = `${target}.${process.pid}.bizar-mobile.tmp`;
77
+ try {
78
+ writeFileSync(temporary, wrapper(nativePath), { mode: 0o755, flag: "wx" });
79
+ chmodSync(temporary, 0o755);
80
+ // Preserve the complete native OMP executable through a hard link, then
81
+ // atomically replace only its command path with the dispatcher.
82
+ try {
83
+ linkSync(target, nativePath);
84
+ }
85
+ catch (error) {
86
+ throw new Error(`Could not preserve native OMP at ${nativePath}: ${error instanceof Error ? error.message : String(error)}`);
87
+ }
88
+ try {
89
+ renameSync(temporary, target);
90
+ }
91
+ catch (error) {
92
+ rmSync(nativePath, { force: true });
93
+ throw error;
94
+ }
95
+ return { path: target, nativePath, installed: true };
96
+ }
97
+ finally {
98
+ rmSync(temporary, { force: true });
99
+ closeSync(lock);
100
+ rmSync(lockPath, { force: true });
101
+ }
102
+ }
103
+ export function removeOmpMobileDispatch(command = "omp", env = process.env) {
104
+ const target = resolveTarget(command, env);
105
+ let contents;
106
+ try {
107
+ contents = readHeader(target);
108
+ }
109
+ catch {
110
+ return { path: target, restored: false };
111
+ }
112
+ if (!contents.startsWith(`#!/bin/sh\n${MARKER}\n`))
113
+ return { path: target, restored: false };
114
+ contents = readFileSync(target, "utf8");
115
+ const nativePath = `${target}${NATIVE_SUFFIX}`;
116
+ if (!existsSync(nativePath) || !statSync(nativePath).isFile())
117
+ throw new Error(`Cannot restore OMP; native executable is missing: ${nativePath}`);
118
+ if (process.platform === "win32" || !isAbsolute(target))
119
+ throw new Error("Cannot safely restore the OMP dispatcher at this path");
120
+ const expected = wrapper(nativePath);
121
+ if (contents !== expected)
122
+ throw new Error("The omp dispatcher was modified; refusing to replace an unrecognized executable");
123
+ const lockPath = `${target}.bizar-mobile.lock`;
124
+ let lock;
125
+ try {
126
+ lock = openSync(lockPath, "wx", 0o600);
127
+ }
128
+ catch {
129
+ throw new Error(`Another OMP mobile dispatcher change is in progress (${lockPath})`);
130
+ }
131
+ const temporary = `${target}.${process.pid}.bizar-native.tmp`;
132
+ try {
133
+ renameSync(nativePath, temporary);
134
+ try {
135
+ renameSync(temporary, target);
136
+ }
137
+ catch (error) {
138
+ renameSync(temporary, nativePath);
139
+ throw error;
140
+ }
141
+ return { path: target, restored: true };
142
+ }
143
+ finally {
144
+ closeSync(lock);
145
+ rmSync(lockPath, { force: true });
146
+ }
147
+ }
148
+ //# sourceMappingURL=omp-mobile-dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omp-mobile-dispatch.js","sourceRoot":"","sources":["../../src/cli/omp-mobile-dispatch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Generated compatibility receipt.
3
+ *
4
+ * The mobile project consumes Bizar's qualification evidence, and until this
5
+ * existed it had to hand-copy it. That is how `omp-mobile/docs/COMPATIBILITY.json`
6
+ * came to be pinned at Bizar 0.7.8 while 0.7.9 had already shipped the
7
+ * claim/release contract: nothing failed, the two files simply disagreed and
8
+ * nobody was told.
9
+ *
10
+ * Everything here is derived. The version and commit come from `package.json` and
11
+ * the caller's git invocation, the OMP baseline comes from the same constant
12
+ * `doctor` reports, and the capabilities are asserted by tests that fail if a
13
+ * command is removed. A hand-maintained receipt would drift in exactly the way
14
+ * this replaces.
15
+ */
16
+ /**
17
+ * Mobile integration capabilities.
18
+ *
19
+ * Each one is a promise about the CLI surface, and each is covered by a test
20
+ * that fails when the promise stops being kept. Additions are forward
21
+ * compatible — a consumer ignores what it does not recognise. Removal or a
22
+ * change of meaning requires bumping `MOBILE_INTEGRATION_CONTRACT_VERSION`,
23
+ * because a consumer that sees an unknown capability can cope and a consumer
24
+ * that sees a *missing* one cannot.
25
+ */
26
+ export declare const MOBILE_INTEGRATION_CONTRACT_VERSION = 1;
27
+ export declare const MOBILE_INTEGRATION_CAPABILITIES: readonly ["omb-mobile-delegate", "host-capability-contract", "session-inventory-authority", "exact-generation-claim", "claim-holder-pid", "claim-release", "claim-liveness-policy", "local-attach-enforcement"];
28
+ export type MobileIntegrationCapability = (typeof MOBILE_INTEGRATION_CAPABILITIES)[number];
29
+ export interface CompatibilityReceipt {
30
+ readonly schemaVersion: 1;
31
+ readonly generatedFrom: "source";
32
+ readonly bizar: {
33
+ readonly packageVersion: string;
34
+ /** Null when the tree is not a git checkout, rather than a guess. */
35
+ readonly commit: string | null;
36
+ };
37
+ readonly omp: {
38
+ readonly qualifiedVersion: string;
39
+ readonly qualifiedCommit: string;
40
+ readonly bun: string;
41
+ /**
42
+ * Stated rather than implied. The OMP baseline is qualified for a
43
+ * specific tagged commit, and a consumer pinning a different one is
44
+ * outside what this receipt asserts.
45
+ */
46
+ readonly evidence: "qualified-baseline";
47
+ };
48
+ readonly mobileIntegration: {
49
+ readonly contractVersion: number;
50
+ readonly capabilities: readonly MobileIntegrationCapability[];
51
+ };
52
+ /**
53
+ * Bizar does not reimplement the phone transport, and says so in the receipt
54
+ * so a consumer does not have to infer it from what is absent.
55
+ */
56
+ readonly boundaries: {
57
+ readonly ombOwnsTerminalRuntime: true;
58
+ readonly mobileHostOwnsPhoneTransport: true;
59
+ };
60
+ }
61
+ export interface ReceiptInputs {
62
+ readonly packageVersion: string;
63
+ /** From the caller; never invented here. */
64
+ readonly commit: string | null;
65
+ }
66
+ export declare function buildCompatibilityReceipt(inputs: ReceiptInputs): CompatibilityReceipt;
67
+ /** Renders the receipt as the file content, so generation and publication agree. */
68
+ export declare function renderCompatibilityReceipt(receipt: CompatibilityReceipt): string;
69
+ //# sourceMappingURL=compatibility-receipt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility-receipt.d.ts","sourceRoot":"","sources":["../../src/omp/compatibility-receipt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;;;;;;;;GASG;AACH,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD,eAAO,MAAM,+BAA+B,YAC3C,qBAAqB,EACrB,0BAA0B,EAC1B,6BAA6B,EAC7B,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,0BAA0B,CACjB,CAAC;AAEX,MAAM,MAAM,2BAA2B,GAAG,CAAC,OAAO,+BAA+B,CAAC,CAAC,MAAM,CAAC,CAAC;AAE3F,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE;QACf,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;QAChC,qEAAqE;QACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,CAAC;IACF,QAAQ,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAClC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB;;;;WAIG;QACH,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;KACxC,CAAC;IACF,QAAQ,CAAC,iBAAiB,EAAE;QAC3B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;QACjC,QAAQ,CAAC,YAAY,EAAE,SAAS,2BAA2B,EAAE,CAAC;KAC9D,CAAC;IACF;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE;QACpB,QAAQ,CAAC,sBAAsB,EAAE,IAAI,CAAC;QACtC,QAAQ,CAAC,4BAA4B,EAAE,IAAI,CAAC;KAC5C,CAAC;CACF;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,GAAG,oBAAoB,CAiBrF;AAED,oFAAoF;AACpF,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAEhF"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Generated compatibility receipt.
3
+ *
4
+ * The mobile project consumes Bizar's qualification evidence, and until this
5
+ * existed it had to hand-copy it. That is how `omp-mobile/docs/COMPATIBILITY.json`
6
+ * came to be pinned at Bizar 0.7.8 while 0.7.9 had already shipped the
7
+ * claim/release contract: nothing failed, the two files simply disagreed and
8
+ * nobody was told.
9
+ *
10
+ * Everything here is derived. The version and commit come from `package.json` and
11
+ * the caller's git invocation, the OMP baseline comes from the same constant
12
+ * `doctor` reports, and the capabilities are asserted by tests that fail if a
13
+ * command is removed. A hand-maintained receipt would drift in exactly the way
14
+ * this replaces.
15
+ */
16
+ import { SUPPORTED_BUN, SUPPORTED_OMP } from "../omp/compatibility.js";
17
+ /**
18
+ * Mobile integration capabilities.
19
+ *
20
+ * Each one is a promise about the CLI surface, and each is covered by a test
21
+ * that fails when the promise stops being kept. Additions are forward
22
+ * compatible — a consumer ignores what it does not recognise. Removal or a
23
+ * change of meaning requires bumping `MOBILE_INTEGRATION_CONTRACT_VERSION`,
24
+ * because a consumer that sees an unknown capability can cope and a consumer
25
+ * that sees a *missing* one cannot.
26
+ */
27
+ export const MOBILE_INTEGRATION_CONTRACT_VERSION = 1;
28
+ export const MOBILE_INTEGRATION_CAPABILITIES = [
29
+ "omb-mobile-delegate",
30
+ "host-capability-contract",
31
+ "session-inventory-authority",
32
+ "exact-generation-claim",
33
+ "claim-holder-pid",
34
+ "claim-release",
35
+ "claim-liveness-policy",
36
+ "local-attach-enforcement",
37
+ ];
38
+ export function buildCompatibilityReceipt(inputs) {
39
+ return {
40
+ schemaVersion: 1,
41
+ generatedFrom: "source",
42
+ bizar: { packageVersion: inputs.packageVersion, commit: inputs.commit },
43
+ omp: {
44
+ qualifiedVersion: SUPPORTED_OMP.version,
45
+ qualifiedCommit: SUPPORTED_OMP.commit,
46
+ bun: SUPPORTED_BUN,
47
+ evidence: "qualified-baseline",
48
+ },
49
+ mobileIntegration: {
50
+ contractVersion: MOBILE_INTEGRATION_CONTRACT_VERSION,
51
+ capabilities: MOBILE_INTEGRATION_CAPABILITIES,
52
+ },
53
+ boundaries: { ombOwnsTerminalRuntime: true, mobileHostOwnsPhoneTransport: true },
54
+ };
55
+ }
56
+ /** Renders the receipt as the file content, so generation and publication agree. */
57
+ export function renderCompatibilityReceipt(receipt) {
58
+ return `${JSON.stringify(receipt, null, 2)}\n`;
59
+ }
60
+ //# sourceMappingURL=compatibility-receipt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatibility-receipt.js","sourceRoot":"","sources":["../../src/omp/compatibility-receipt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEvE;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAG,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,+BAA+B,GAAG;IAC9C,qBAAqB;IACrB,0BAA0B;IAC1B,6BAA6B;IAC7B,wBAAwB;IACxB,kBAAkB;IAClB,eAAe;IACf,uBAAuB;IACvB,0BAA0B;CACjB,CAAC;AA2CX,MAAM,UAAU,yBAAyB,CAAC,MAAqB;IAC9D,OAAO;QACN,aAAa,EAAE,CAAC;QAChB,aAAa,EAAE,QAAQ;QACvB,KAAK,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;QACvE,GAAG,EAAE;YACJ,gBAAgB,EAAE,aAAa,CAAC,OAAO;YACvC,eAAe,EAAE,aAAa,CAAC,MAAM;YACrC,GAAG,EAAE,aAAa;YAClB,QAAQ,EAAE,oBAAoB;SAC9B;QACD,iBAAiB,EAAE;YAClB,eAAe,EAAE,mCAAmC;YACpD,YAAY,EAAE,+BAA+B;SAC7C;QACD,UAAU,EAAE,EAAE,sBAAsB,EAAE,IAAI,EAAE,4BAA4B,EAAE,IAAI,EAAE;KAChF,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,0BAA0B,CAAC,OAA6B;IACvE,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAChD,CAAC"}
@@ -1,8 +1,8 @@
1
1
  export declare const SUPPORTED_OMP: {
2
- readonly version: "18.4.2";
3
- readonly commit: "4620bb8338e0ecace7ea237da9d5088d16068617";
2
+ readonly version: "18.4.4";
3
+ readonly commit: "8ac1309bd8adaddc891eeb389c545345073875be";
4
4
  };
5
- export declare const QUALIFIED_OMP_VERSIONS: readonly ["18.2.4", "18.2.5", "18.2.6", "18.2.7", "18.2.8", "18.2.11", "18.3.0", "18.3.2", "18.4.1", "18.4.2"];
5
+ export declare const QUALIFIED_OMP_VERSIONS: readonly ["18.2.4", "18.2.5", "18.2.6", "18.2.7", "18.2.8", "18.2.11", "18.3.0", "18.3.2", "18.4.1", "18.4.2", "18.4.4"];
6
6
  export declare const SUPPORTED_BUN = ">=1.3.14";
7
7
  export declare function isQualifiedOmpVersion(version: string): boolean;
8
8
  /** Highest semver currently in {@link QUALIFIED_OMP_VERSIONS}. */
@@ -28,8 +28,8 @@ export interface RuntimeProbe {
28
28
  }
29
29
  export declare function compatibilityReport(probe: RuntimeProbe): {
30
30
  supportedBaseline: {
31
- readonly version: "18.4.2";
32
- readonly commit: "4620bb8338e0ecace7ea237da9d5088d16068617";
31
+ readonly version: "18.4.4";
32
+ readonly commit: "8ac1309bd8adaddc891eeb389c545345073875be";
33
33
  };
34
34
  bun: string;
35
35
  probe: RuntimeProbe;