openmausbot 0.1.90 → 0.1.92

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 (177) hide show
  1. package/dist/assets/DesktopViewer-Do6lBa4C.js +5 -0
  2. package/dist/assets/{abnfDiagram-O67JEVCF-DUyXd0kL.js → abnfDiagram-O67JEVCF-Cd3X7Hxc.js} +1 -1
  3. package/dist/assets/{arc-q73qM-At.js → arc-DIYc7Ymx.js} +1 -1
  4. package/dist/assets/{architectureDiagram-NJMV4G6O-D33O3Wur.js → architectureDiagram-NJMV4G6O-DBmRGVyP.js} +1 -1
  5. package/dist/assets/{blockDiagram-BEXU5L5S-DLsJeoXC.js → blockDiagram-BEXU5L5S-CPFePSEE.js} +1 -1
  6. package/dist/assets/{c4Diagram-YGBWAQC7-DnaljZnu.js → c4Diagram-YGBWAQC7-DD_DO1qy.js} +1 -1
  7. package/dist/assets/channel-Dtk5Mtic.js +1 -0
  8. package/dist/assets/{chunk-2Q5K7J3B-Da0h2i79.js → chunk-2Q5K7J3B-BNEeNSjX.js} +1 -1
  9. package/dist/assets/{chunk-3FUC2YCW-CfzHi54f.js → chunk-3FUC2YCW-BbinLaqH.js} +2 -2
  10. package/dist/assets/{chunk-5VM5RSS4-LjE4d9Jf.js → chunk-5VM5RSS4-BBgYrgDR.js} +1 -1
  11. package/dist/assets/{chunk-GTNCS2PH-DY-UGmvc.js → chunk-GTNCS2PH-ezXj-kA-.js} +1 -1
  12. package/dist/assets/{chunk-GWA4HPMP-BqeGhyhP.js → chunk-GWA4HPMP-9FxZ3diV.js} +1 -1
  13. package/dist/assets/{chunk-JWPE2WC7-BYa9EBAg.js → chunk-JWPE2WC7-CO-40JpI.js} +1 -1
  14. package/dist/assets/{chunk-NETBCI7D-vTrDtWyb.js → chunk-NETBCI7D-BEhjslYE.js} +1 -1
  15. package/dist/assets/{chunk-WEXAMYUT-ic5tXadM.js → chunk-WEXAMYUT-CNeq4n7_.js} +1 -1
  16. package/dist/assets/{chunk-XXDRQBXY-DvRCY-c6.js → chunk-XXDRQBXY-OsCY7KSi.js} +1 -1
  17. package/dist/assets/{classDiagram-v2-NBCMYWYE-DVbmgz_L.js → classDiagram-v2-NBCMYWYE-CloRUEtk.js} +1 -1
  18. package/dist/assets/{cose-bilkent-JH36ORCC-vdUs2n57.js → cose-bilkent-JH36ORCC-D1BGZhp4.js} +1 -1
  19. package/dist/assets/{cynefin-OW5HDTMX-BvLGlV3U.js → cynefin-OW5HDTMX-CUf4T2CN.js} +1 -1
  20. package/dist/assets/{cynefinDiagram-VND7K2PF-C4GcJQDt.js → cynefinDiagram-VND7K2PF-DPEZrFGA.js} +1 -1
  21. package/dist/assets/{dagre-6A5THRUB-BMSaHpt_.js → dagre-6A5THRUB-bDe6GIv5.js} +1 -1
  22. package/dist/assets/{diagram-22UHCM2B-D5b9UBhC.js → diagram-22UHCM2B-CdcUQz55.js} +1 -1
  23. package/dist/assets/{diagram-3UASUU5V-CIKLlB7Y.js → diagram-3UASUU5V-BZpqGg7c.js} +1 -1
  24. package/dist/assets/{diagram-ATOU4E4O-BzXb-7k7.js → diagram-ATOU4E4O-DvGM6ugp.js} +1 -1
  25. package/dist/assets/{diagram-CDSNMT55-HsTvJ7uT.js → diagram-CDSNMT55-DSTmMm0s.js} +1 -1
  26. package/dist/assets/{diagram-MLGK6HIB-Db9ySNbQ.js → diagram-MLGK6HIB-15cucnMn.js} +1 -1
  27. package/dist/assets/{diagram-MPIPVDR6-D6BKbpqY.js → diagram-MPIPVDR6-tMbuaE6n.js} +1 -1
  28. package/dist/assets/{ebnfDiagram-ZINNZB2B-Bq067L0t.js → ebnfDiagram-ZINNZB2B-BYxYzjHI.js} +1 -1
  29. package/dist/assets/{elk-276RUBZZ-DhaD7fNJ.js → elk-276RUBZZ-v6bj852W.js} +1 -1
  30. package/dist/assets/{erDiagram-OPXOYQCR-fwIhfz36.js → erDiagram-OPXOYQCR-5lBBlnd2.js} +1 -1
  31. package/dist/assets/{flowDiagram-KWPJA3E3-DygIyu0V.js → flowDiagram-KWPJA3E3-CZyl1zIj.js} +1 -1
  32. package/dist/assets/{ganttDiagram-FUAMR5RP-DPYfSO96.js → ganttDiagram-FUAMR5RP-BiAI-ltZ.js} +1 -1
  33. package/dist/assets/{gitGraphDiagram-X574FWY7-DhkHeCle.js → gitGraphDiagram-X574FWY7-BAZISkj3.js} +1 -1
  34. package/dist/assets/index-Cdmjrl28.css +1 -0
  35. package/dist/assets/{index-G1PHKGyh.js → index-DGBaEXrM.js} +1 -1
  36. package/dist/assets/index-DR7YPMkW.js +597 -0
  37. package/dist/assets/{infoDiagram-VRGFBTTK-DstBLxME.js → infoDiagram-VRGFBTTK-B6ooOy-Z.js} +1 -1
  38. package/dist/assets/{ishikawaDiagram-OU5B5YK6-CrIsGgch.js → ishikawaDiagram-OU5B5YK6-BZ9ksi-B.js} +1 -1
  39. package/dist/assets/{journeyDiagram-ZHPQQLJL-CYypGDbB.js → journeyDiagram-ZHPQQLJL-DWqlzIEe.js} +1 -1
  40. package/dist/assets/{kanban-definition-PNTS6WVX-DGjPt8E_.js → kanban-definition-PNTS6WVX-JX6piDwL.js} +1 -1
  41. package/dist/assets/{linear-Dwc3Hrru.js → linear-CmOWzX0P.js} +1 -1
  42. package/dist/assets/{mermaid.core-Dc4OePBL.js → mermaid.core-CF1zwoQ-.js} +5 -5
  43. package/dist/assets/{mindmap-definition-NLK3R4M7-DV-vepj-.js → mindmap-definition-NLK3R4M7-CGh2K4fW.js} +1 -1
  44. package/dist/assets/{pegDiagram-GJSIUBJH-lx5Kj-n5.js → pegDiagram-GJSIUBJH-CDwYN0s7.js} +1 -1
  45. package/dist/assets/{pieDiagram-5QR66LMP-Bq7Vmm15.js → pieDiagram-5QR66LMP-1rfjJocB.js} +1 -1
  46. package/dist/assets/{quadrantDiagram-O4NWA36T-DeqeqOBj.js → quadrantDiagram-O4NWA36T-tKPvPiok.js} +1 -1
  47. package/dist/assets/{railroadDiagram-XR7U4H2S-CXwRQzSC.js → railroadDiagram-XR7U4H2S-BHLm5vXR.js} +1 -1
  48. package/dist/assets/{requirementDiagram-PLB6GJNP-8tAeoB88.js → requirementDiagram-PLB6GJNP-CB45STp7.js} +1 -1
  49. package/dist/assets/{sankeyDiagram-IPEJSGJF-BG5zjGWU.js → sankeyDiagram-IPEJSGJF-55QA_huC.js} +1 -1
  50. package/dist/assets/{sequenceDiagram-PO4LG4MO-DKF3iLcw.js → sequenceDiagram-PO4LG4MO-BckFmQHn.js} +1 -1
  51. package/dist/assets/{sizeCapture-INFHLROL-B-y1qUgT.js → sizeCapture-INFHLROL-BFCOJF11.js} +1 -1
  52. package/dist/assets/{stateDiagram-v2-GCMORJYK-MkzPgxAc.js → stateDiagram-v2-GCMORJYK-CZvmiVVN.js} +1 -1
  53. package/dist/assets/{swimlanes-2SLR337P-DnbaOEwH.js → swimlanes-2SLR337P-BpDUCEKy.js} +1 -1
  54. package/dist/assets/swimlanesDiagram-TC7HE7FX-M0GYW9Y3.js +8 -0
  55. package/dist/assets/{timeline-definition-EJHVYXUP-Bb4xG_Bt.js → timeline-definition-EJHVYXUP-BpxHq6IK.js} +1 -1
  56. package/dist/assets/{usecaseDiagram-POWQR4AR-JgkR9pFf.js → usecaseDiagram-POWQR4AR-Cj66vm02.js} +1 -1
  57. package/dist/assets/{vennDiagram-UO4OBE2U-CIPIrAYe.js → vennDiagram-UO4OBE2U-C9nRkWE_.js} +1 -1
  58. package/dist/assets/{wardleyDiagram-VNRHLVJA-BjCLuUvJ.js → wardleyDiagram-VNRHLVJA-D-me_nWj.js} +1 -1
  59. package/dist/assets/{xychartDiagram-PMCCYNJV-DKgiaYxT.js → xychartDiagram-PMCCYNJV-Dc_fL4mk.js} +1 -1
  60. package/dist/index.html +2 -2
  61. package/dist/novnc-NOTICE.txt +118 -0
  62. package/dist-server/cloud-home-start.js +128 -15
  63. package/dist-server/container-mcp.js +277 -45
  64. package/dist-server/drivers/agents-proxy.js +16 -4
  65. package/dist-server/enterprise/server/index.js +5 -1
  66. package/dist-server/index.js +46703 -39955
  67. package/dist-server/local-computer-proxy.js +128 -7
  68. package/dist-server/mcp-gate.js +11 -5
  69. package/dist-server/model-catalog/models-dev.snapshot.json +7299 -0
  70. package/dist-server/openmausbot.js +4099 -1217
  71. package/dist-server/pair-cli.js +4099 -1217
  72. package/dist-server/server/boat.js +67 -22
  73. package/dist-server/server/bot-overview.js +7 -4
  74. package/dist-server/server/browser-engine.js +10 -1
  75. package/dist-server/server/browser-live.js +46 -2
  76. package/dist-server/server/browser-runtime.js +74 -8
  77. package/dist-server/server/browser-tool-shape.js +6 -4
  78. package/dist-server/server/chief-of-staff.js +1 -1
  79. package/dist-server/server/cloud-home-start.js +136 -26
  80. package/dist-server/server/cloud-home.js +64 -5
  81. package/dist-server/server/cloud-lending.js +167 -0
  82. package/dist-server/server/cloud-move-http.js +268 -0
  83. package/dist-server/server/cloud-move.js +418 -0
  84. package/dist-server/server/cloud-owner.js +196 -0
  85. package/dist-server/server/cloud-secrets-boot.js +6 -0
  86. package/dist-server/server/cloud-secrets.js +65 -0
  87. package/dist-server/server/config.js +215 -17
  88. package/dist-server/server/container-computer.js +3 -2
  89. package/dist-server/server/decider/index.js +238 -0
  90. package/dist-server/server/decider/jev.js +183 -0
  91. package/dist-server/server/decider/log.js +62 -0
  92. package/dist-server/server/decider/relay.js +52 -0
  93. package/dist-server/server/decider/room-routing.js +88 -0
  94. package/dist-server/server/decider/types.js +5 -0
  95. package/dist-server/server/desktop-viewer-targets.js +26 -0
  96. package/dist-server/server/drivers/acp/core.js +167 -21
  97. package/dist-server/server/drivers/acp/opencode-go.js +614 -85
  98. package/dist-server/server/drivers/agents-catalog.js +22 -6
  99. package/dist-server/server/drivers/antigravity-acp.js +69 -11
  100. package/dist-server/server/drivers/antigravity-temp.js +360 -0
  101. package/dist-server/server/drivers/antigravity.js +21 -0
  102. package/dist-server/server/drivers/boatagent.js +20 -12
  103. package/dist-server/server/drivers/chatgpt-plan-auth.js +481 -0
  104. package/dist-server/server/drivers/claude.js +313 -34
  105. package/dist-server/server/drivers/codex.js +228 -18
  106. package/dist-server/server/drivers/grok.js +2 -2
  107. package/dist-server/server/drivers/mistral.js +4 -3
  108. package/dist-server/server/drivers/openai-chat-protocol.js +4 -3
  109. package/dist-server/server/drivers/openai-chat.js +41 -3
  110. package/dist-server/server/drivers/openai-compat.js +73 -23
  111. package/dist-server/server/engine-install.js +46 -12
  112. package/dist-server/server/env-path.js +15 -3
  113. package/dist-server/server/group-goal-run.js +6 -4
  114. package/dist-server/server/harness/registry.js +2 -2
  115. package/dist-server/server/harness-capabilities.js +2 -0
  116. package/dist-server/server/included-services.js +70 -0
  117. package/dist-server/server/index.js +1753 -263
  118. package/dist-server/server/lending-memory.js +479 -0
  119. package/dist-server/server/local-vm-idle.js +24 -6
  120. package/dist-server/server/managed-desktop.js +3 -0
  121. package/dist-server/server/mcp-bridge.js +5 -3
  122. package/dist-server/server/mcp-http.js +6 -3
  123. package/dist-server/server/mcp-oauth-discovery.js +133 -0
  124. package/dist-server/server/mcp-oauth-store.js +70 -0
  125. package/dist-server/server/mcp-oauth.js +550 -0
  126. package/dist-server/server/mcp-probe.js +14 -1
  127. package/dist-server/server/mcp-registry.js +43 -0
  128. package/dist-server/server/memory-upkeep.js +94 -84
  129. package/dist-server/server/model-catalog/catalog.js +374 -0
  130. package/dist-server/server/model-catalog/presets.js +176 -0
  131. package/dist-server/server/model-catalog/trim.js +219 -0
  132. package/dist-server/server/model-context-window.js +4 -4
  133. package/dist-server/server/package-export.js +17 -10
  134. package/dist-server/server/package-import.js +6 -3
  135. package/dist-server/server/package-parts.js +3 -1
  136. package/dist-server/server/provider-key-check.js +4 -2
  137. package/dist-server/server/recent-work.js +1 -1
  138. package/dist-server/server/request-auth.js +25 -0
  139. package/dist-server/server/routes/antigravity-leftovers.js +45 -0
  140. package/dist-server/server/routes/bot-memory.js +31 -6
  141. package/dist-server/server/routes/decider.js +19 -0
  142. package/dist-server/server/routes/desktop-viewer.js +194 -0
  143. package/dist-server/server/routine-requests.js +1 -1
  144. package/dist-server/server/routines.js +1 -1
  145. package/dist-server/server/sessions.js +56 -9
  146. package/dist-server/server/shared-computers.js +116 -30
  147. package/dist-server/server/skills.js +25 -10
  148. package/dist-server/server/store.js +79 -124
  149. package/dist-server/server/surface.js +13 -0
  150. package/dist-server/server/system-prompt.js +11 -0
  151. package/dist-server/server/team-backup.js +6 -2
  152. package/dist-server/server/team-manifest.js +11 -3
  153. package/dist-server/server/thread-events.js +2 -0
  154. package/dist-server/server/thread-starters.js +33 -0
  155. package/dist-server/server/thread-title.js +46 -0
  156. package/dist-server/server/tts/elevenlabs.js +11 -6
  157. package/dist-server/server/tts/fish.js +4 -5
  158. package/dist-server/server/tts/index.js +20 -11
  159. package/dist-server/server/vps-computer.js +79 -12
  160. package/dist-server/server/webhooks.js +18 -1
  161. package/dist-server/server/workspace-backup-policy.js +25 -3
  162. package/dist-server/server/workspace-backup.js +28 -8
  163. package/dist-server/server/workspace.js +65 -15
  164. package/dist-server/shared/cloud-home.js +4 -0
  165. package/dist-server/shared/package-format.js +30 -4
  166. package/dist-server/shared/team-backup.js +20 -3
  167. package/dist-server/shared/workspace-backup-client.js +1 -0
  168. package/dist-server/src/lib/citations.js +177 -0
  169. package/dist-server/src/lib/composer-attachments.js +7 -1
  170. package/dist-server/vps-container-mcp.js +278 -45
  171. package/dist-server/workspace-backup.worker.js +184 -38
  172. package/enterprise/server/index.js +5 -1
  173. package/package.json +1 -1
  174. package/dist/assets/channel-BCuyHjFV.js +0 -1
  175. package/dist/assets/index-CRvo-DS2.css +0 -1
  176. package/dist/assets/index-CWYGlA63.js +0 -588
  177. package/dist/assets/swimlanesDiagram-TC7HE7FX-BZQ07DGE.js +0 -8
@@ -22,6 +22,9 @@ function nvmBinDirs() {
22
22
  return [];
23
23
  }
24
24
  }
25
+ function sealedFixture() {
26
+ return process.env.OMB_TEST_SEALED_PATH === "1";
27
+ }
25
28
  function knownDirs() {
26
29
  const home = homedir();
27
30
  return [
@@ -37,10 +40,13 @@ function knownDirs() {
37
40
  // opencode installer
38
41
  join(home, ".claude", "local"),
39
42
  // claude "local install"
40
- "/opt/homebrew/bin",
41
- // brew, Apple silicon
42
- "/usr/local/bin",
43
- // brew Intel / classic installs
43
+ // Machine-wide rather than under the (possibly temporary) home.
44
+ ...sealedFixture() ? [] : [
45
+ "/opt/homebrew/bin",
46
+ // brew, Apple silicon
47
+ "/usr/local/bin"
48
+ // brew Intel / classic installs
49
+ ],
44
50
  join(home, ".volta", "bin"),
45
51
  join(home, ".bun", "bin"),
46
52
  join(home, ".asdf", "shims"),
@@ -92,7 +98,7 @@ function augmentedPath() {
92
98
  ...(process.platform === "win32" ? windowsKnownDirs() : knownDirs()).filter((d) => existsSync(d))
93
99
  ]);
94
100
  }
95
- if (!probed && !process.env.VITEST && process.platform !== "win32") {
101
+ if (!probed && !process.env.VITEST && !sealedFixture() && process.platform !== "win32") {
96
102
  probed = true;
97
103
  probeLoginShellPath();
98
104
  }
@@ -116,10 +122,123 @@ function probeLoginShellPath() {
116
122
  }
117
123
  );
118
124
  }
125
+ function splitCliString(cli) {
126
+ const out = [];
127
+ let cur = "";
128
+ let quote = null;
129
+ for (const ch of cli.trim()) {
130
+ if (quote) {
131
+ if (ch === quote) quote = null;
132
+ else cur += ch;
133
+ } else if (ch === '"' || ch === "'") {
134
+ quote = ch;
135
+ } else if (/\s/.test(ch)) {
136
+ if (cur) out.push(cur);
137
+ cur = "";
138
+ } else {
139
+ cur += ch;
140
+ }
141
+ }
142
+ if (cur) out.push(cur);
143
+ return out;
144
+ }
145
+ function isFile(p2) {
146
+ try {
147
+ return statSync(p2, { throwIfNoEntry: false })?.isFile() ?? false;
148
+ } catch {
149
+ return false;
150
+ }
151
+ }
152
+ function whichWin(cli, env) {
153
+ const exts = ((env ?? process.env).PATHEXT ?? ".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean);
154
+ const probe = (base) => {
155
+ const order = extname(base) ? [base, ...exts.map((e) => base + e)] : [...exts.map((e) => base + e), base];
156
+ return order.find(isFile) ?? null;
157
+ };
158
+ if (/[\\/]/.test(cli) || /^[a-zA-Z]:/.test(cli)) return probe(cli);
159
+ const path = env ? env.PATH ?? env.Path ?? "" : augmentedPath();
160
+ for (const dir of path.split(delimiter)) {
161
+ if (!dir) continue;
162
+ const hit = probe(join(dir, cli));
163
+ if (hit) return hit;
164
+ }
165
+ return null;
166
+ }
167
+ function nodeExe(near, env) {
168
+ const local = join(near, "node.exe");
169
+ if (isFile(local)) return local;
170
+ const onPath = whichWin("node.exe", env);
171
+ if (onPath && extname(onPath).toLowerCase() === ".exe") return onPath;
172
+ return process.versions.electron ? null : process.execPath;
173
+ }
174
+ function parseCmdShim(shim, env) {
175
+ let text;
176
+ try {
177
+ text = readFileSync(shim, "utf8");
178
+ } catch {
179
+ return null;
180
+ }
181
+ const dir = dirname(shim);
182
+ const npmEntry = /^SET "NP[MX]_CLI_JS=%~dp0\\([^"]+)"/im.exec(text);
183
+ const targets = [...npmEntry ? [npmEntry] : [], ...text.matchAll(/"%~?dp0%?\\?([^"]+)"/g)].map((m2) => join(dir, m2[1])).filter((p2) => isFile(p2) && basename(p2).toLowerCase() !== "node.exe");
184
+ const script = targets.find((p2) => /\.[cm]?js$/i.test(p2));
185
+ if (script) {
186
+ const node = nodeExe(dir, env);
187
+ if (node) return { command: node, args: [script] };
188
+ }
189
+ const exe = targets.find((p2) => extname(p2).toLowerCase() === ".exe");
190
+ return exe ? { command: exe, args: [] } : null;
191
+ }
192
+ function parseNodeShebang(file2, env) {
193
+ let head = "";
194
+ let fd = null;
195
+ try {
196
+ fd = openSync(file2, "r");
197
+ const buf = Buffer.alloc(128);
198
+ const n = readSync(fd, buf, 0, buf.length, 0);
199
+ head = buf.subarray(0, n).toString("utf8").split("\n", 1)[0];
200
+ } catch {
201
+ return null;
202
+ } finally {
203
+ if (fd !== null) {
204
+ try {
205
+ closeSync(fd);
206
+ } catch {
207
+ }
208
+ }
209
+ }
210
+ if (!/^#!.*\bnode(\.exe)?\b/.test(head)) return null;
211
+ const node = nodeExe(dirname(file2), env);
212
+ return node ? { command: node, args: [file2] } : null;
213
+ }
214
+ function resolveWord(cli, args, env) {
215
+ if (process.platform !== "win32") return { command: cli, args };
216
+ const file2 = whichWin(cli, env);
217
+ if (!file2) return { command: cli, args };
218
+ const ext = extname(file2).toLowerCase();
219
+ if (ext === ".cmd" || ext === ".bat") {
220
+ const direct = parseCmdShim(file2, env);
221
+ return direct ? { command: direct.command, args: [...direct.args, ...args] } : { command: file2, args };
222
+ }
223
+ if (ext === ".exe" || ext === ".com") return { command: file2, args };
224
+ const viaNode = parseNodeShebang(file2, env);
225
+ return viaNode ? { command: viaNode.command, args: [...viaNode.args, ...args] } : { command: file2, args };
226
+ }
227
+ function resolveCliSpawn(cli, args, env) {
228
+ const trimmed = cli.trim();
229
+ if (trimmed.includes(" ") && existsSync(trimmed)) return resolveWord(trimmed, args, env);
230
+ const split = splitCliString(cli);
231
+ if (split.length > 1 || split[0] !== trimmed) {
232
+ const [head, ...fixed] = split;
233
+ if (!head) return { command: cli, args };
234
+ return resolveWord(head, [...fixed, ...args], env);
235
+ }
236
+ return resolveWord(cli, args, env);
237
+ }
119
238
 
120
239
  // server/config.ts
121
240
  import { homedir as homedir2 } from "node:os";
122
- import { join as join2 } from "node:path";
241
+ import { join as join3 } from "node:path";
123
242
 
124
243
  // node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/classic/external.js
125
244
  var external_exports = {};
@@ -15624,26 +15743,109 @@ var stdioEntrySchema = external_exports.object({
15624
15743
  var stdioMutationSchema = stdioEntrySchema.extend({
15625
15744
  env: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional()
15626
15745
  });
15746
+ var CLIENT_ID = /^[\x20-\x7e]+$/;
15747
+ var SCOPE = /^[\x21\x23-\x5b\x5d-\x7e]+$/;
15748
+ var CLIENT_SECRET_MAX = 4096;
15749
+ var oauthClientSchema = external_exports.object({
15750
+ clientId: external_exports.string().trim().min(1, "Enter the client ID of the app registered with this server's sign-in provider.").max(512).regex(CLIENT_ID, "A client ID is printable text on one line."),
15751
+ clientSecret: external_exports.string().min(1).max(CLIENT_SECRET_MAX).regex(CLIENT_ID, "A client secret is printable text on one line.").optional(),
15752
+ scopes: external_exports.array(external_exports.string().max(256).regex(SCOPE, "Scopes are single words, like offline_access or api://my-app/mcp.read.")).max(32).optional()
15753
+ }).strict();
15627
15754
  var remoteEntrySchema = external_exports.object({
15628
15755
  /** Streamable HTTP unless the entry says the older SSE transport. */
15629
15756
  type: external_exports.enum(["http", "sse"]).optional(),
15630
15757
  url: external_exports.string().trim().min(1).max(2048),
15631
15758
  headers: external_exports.record(external_exports.string(), external_exports.string().max(16384)).optional(),
15759
+ oauth: oauthClientSchema.optional(),
15632
15760
  enabled: external_exports.boolean().optional()
15633
15761
  }).strict();
15634
15762
  var remoteMutationSchema = remoteEntrySchema.extend({
15635
- headers: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional()
15763
+ headers: external_exports.record(external_exports.string(), external_exports.union([external_exports.string().max(16384), external_exports.literal(true)])).optional(),
15764
+ oauth: oauthClientSchema.extend({
15765
+ clientSecret: external_exports.union([external_exports.string().min(1).max(CLIENT_SECRET_MAX).regex(CLIENT_ID, "A client secret is printable text on one line."), external_exports.literal(true)]).optional()
15766
+ }).optional()
15636
15767
  });
15637
15768
 
15638
15769
  // server/cloud-overflow.ts
15639
15770
  var CLOUD_SEAT_IDLE_STOP_MS = 5 * 6e4;
15640
15771
  var CLOUD_SEAT_SLEEP_RETRY_MAX_MS = 10 * 6e4;
15641
15772
 
15773
+ // server/proxy-paths.ts
15774
+ import { existsSync as existsSync2 } from "node:fs";
15775
+ import { dirname as dirname2, join as join2 } from "node:path";
15776
+ import { fileURLToPath } from "node:url";
15777
+ var SERVER_ROOT = dirname2(fileURLToPath(import.meta.url));
15778
+ function resolveProxy(relative) {
15779
+ const source = join2(SERVER_ROOT, `${relative}.ts`);
15780
+ return existsSync2(source) ? source : join2(SERVER_ROOT, `${relative}.js`);
15781
+ }
15782
+ var SPAWNED_PROXIES = {
15783
+ browser: resolveProxy("browser-proxy"),
15784
+ localComputer: resolveProxy("local-computer-proxy"),
15785
+ permission: resolveProxy("permission-proxy"),
15786
+ containerMcp: resolveProxy("container-mcp"),
15787
+ vpsContainerMcp: resolveProxy("vps-container-mcp"),
15788
+ agents: resolveProxy("drivers/agents-proxy"),
15789
+ dweb: resolveProxy("drivers/dweb-proxy"),
15790
+ connectors: resolveProxy("connector-proxy"),
15791
+ mcpGate: resolveProxy("mcp-gate"),
15792
+ phone: resolveProxy("drivers/phone-proxy"),
15793
+ hook: resolveProxy("hooks/omb-hook"),
15794
+ // Loaded by the external `pi` process via `-e`, not by this server — but
15795
+ // resolved through the same single source of truth so the packaged layout
15796
+ // check can assert it ships.
15797
+ piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
15798
+ };
15799
+
15800
+ // server/enterprise.ts
15801
+ var layerSchema = external_exports.object({
15802
+ customer: external_exports.string().min(1),
15803
+ features: external_exports.array(external_exports.string().min(1)),
15804
+ expiresAt: external_exports.string().nullable()
15805
+ });
15806
+ var DAY_MS = 24 * 60 * 6e4;
15807
+
15808
+ // server/sessions.ts
15809
+ var PAIRING_CODE_TTL_MS = 5 * 6e4;
15810
+ function daysMs(value, fallbackDays) {
15811
+ const days = Number(value);
15812
+ const ok = Number.isInteger(days) && days >= 1 && days <= 3650;
15813
+ return (ok ? days : fallbackDays) * 24 * 60 * 6e4;
15814
+ }
15815
+ var SESSION_TTL_MS = daysMs(process.env.OMB_SESSION_TTL_DAYS, 30);
15816
+ var SESSION_MAX_AGE_MS = daysMs(process.env.OMB_SESSION_MAX_DAYS, 180);
15817
+ var SESSION_RENEW_WHEN_LEFT_MS = SESSION_TTL_MS / 2;
15818
+ var STREAM_TICKET_TTL_MS = 5 * 6e4;
15819
+ var scopeSchema = external_exports.enum(["admin", "client"]);
15820
+ var sessionSchema = external_exports.object({
15821
+ id: external_exports.string().min(1),
15822
+ tokenHash: external_exports.string().length(64),
15823
+ label: external_exports.string().max(80),
15824
+ scopes: external_exports.array(scopeSchema).min(1),
15825
+ createdAt: external_exports.number(),
15826
+ lastSeenAt: external_exports.number(),
15827
+ expiresAt: external_exports.number(),
15828
+ /** Set when the session came from an account sign-in rather than a code. */
15829
+ userId: external_exports.string().max(256).optional(),
15830
+ email: external_exports.string().max(320).optional(),
15831
+ /** Set only by the internal verified-portal issuance path, never by email or pairing input. */
15832
+ membershipAuthority: external_exports.literal("portal").optional(),
15833
+ /** A browser sign-in (PairingCode `browser`): accepted only as its browser's cookie, never as a bearer token. */
15834
+ cookieOnly: external_exports.literal(true).optional(),
15835
+ /** Whose OMB Cloud a browser sign-in signed in to (its PairingCode `owner`). */
15836
+ owner: external_exports.string().max(254).optional()
15837
+ });
15838
+ var fileSchema = external_exports.object({ version: external_exports.literal(1), sessions: external_exports.array(sessionSchema) });
15839
+
15840
+ // server/cloud-home.ts
15841
+ var CLOUD_PAIRING_NONCE_MS = 10 * 6e4;
15842
+
15642
15843
  // server/config.ts
15643
15844
  var optionalText = external_exports.string().optional();
15644
15845
  var SSH_ALIAS = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,127}$/;
15645
15846
  var LEGACY_BROWSER_PROFILE_ID = /^[A-Za-z0-9_-]{1,40}$/;
15646
15847
  var BROWSER_PROFILE_ID = /^[a-z0-9_-]{1,40}$/;
15848
+ var FISH_TTS_MODELS = ["s2.1-pro", "s2.1-pro-free"];
15647
15849
  var MIN_ROOM_TURN_TIMEOUT_MINUTES = 1;
15648
15850
  var MAX_ROOM_TURN_TIMEOUT_MINUTES = 1440;
15649
15851
  var DEFAULT_ROOM_HANDOFF_LIFETIME_MINUTES = 30;
@@ -15654,6 +15856,8 @@ var MIN_THREAD_EVENT_LOG_BYTES = 256 * 1024;
15654
15856
  var MAX_THREAD_EVENT_LOG_BYTES = 4 * 1024 * 1024 * 1024;
15655
15857
  var MIN_LOCAL_VM_MAX_INSTANCES = 1;
15656
15858
  var MAX_LOCAL_VM_MAX_INSTANCES = 8;
15859
+ var MIN_LOCAL_VM_IDLE_TIMEOUT_MINUTES = 5;
15860
+ var MAX_LOCAL_VM_IDLE_TIMEOUT_MINUTES = 1440;
15657
15861
  function isValidSshAlias(value) {
15658
15862
  return typeof value === "string" && SSH_ALIAS.test(value);
15659
15863
  }
@@ -15691,7 +15895,8 @@ var roomConfigSchema = external_exports.object({
15691
15895
  );
15692
15896
  var localVmConfigSchema = external_exports.object({
15693
15897
  mode: external_exports.enum(["shared", "per-bot", "pool"]).optional(),
15694
- maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional()
15898
+ maxInstances: external_exports.number().int().min(MIN_LOCAL_VM_MAX_INSTANCES).max(MAX_LOCAL_VM_MAX_INSTANCES).optional(),
15899
+ idleTimeoutMinutes: external_exports.number().int().min(MIN_LOCAL_VM_IDLE_TIMEOUT_MINUTES).max(MAX_LOCAL_VM_IDLE_TIMEOUT_MINUTES).optional()
15695
15900
  });
15696
15901
  var browserProfileSchema = external_exports.object({
15697
15902
  // "guest" is the throwaway session's reserved id, never a saved profile
@@ -15850,7 +16055,11 @@ var onboardingConfigSchema = external_exports.object({
15850
16055
  /** Which welcome flow was completed; a newer flow may re-show itself. */
15851
16056
  version: external_exports.number().int().min(0).max(1e3).optional(),
15852
16057
  reelSeen: external_exports.boolean().optional(),
15853
- hintsSeen: external_exports.array(external_exports.string().trim().min(1).max(60)).max(100).optional()
16058
+ hintsSeen: external_exports.array(external_exports.string().trim().min(1).max(60)).max(100).optional(),
16059
+ /** OMB Cloud home only: when a bot's turn first finished on this machine
16060
+ * (cloud-home.ts firstCloudTurnPatch). Written by the server, read by the
16061
+ * Cloud's setup checklist. */
16062
+ firstTurnAt: external_exports.string().trim().max(40).optional()
15854
16063
  }).strict();
15855
16064
  var instanceConfigSchema = external_exports.object({
15856
16065
  driver: external_exports.string().min(1),
@@ -15862,6 +16071,7 @@ var instanceConfigSchema = external_exports.object({
15862
16071
  ]).optional(),
15863
16072
  environment: external_exports.record(external_exports.string(), external_exports.string()).optional(),
15864
16073
  enabled: external_exports.boolean().optional(),
16074
+ access: external_exports.enum(["subscription", "custom", "api"]).optional(),
15865
16075
  config: external_exports.json().optional()
15866
16076
  });
15867
16077
  var instanceConfigMapSchema = external_exports.record(external_exports.string(), instanceConfigSchema);
@@ -15923,7 +16133,12 @@ var appConfigSchema = external_exports.object({
15923
16133
  /** Anthropic API key for Claude Code billed per token, handed only to
15924
16134
  * Claude instances; `url` only for a proxy or a test double. Never a
15925
16135
  * personal-login OAuth token. */
15926
- anthropic: external_exports.object({ key: optionalText, url: optionalText }).optional(),
16136
+ anthropic: external_exports.object({ key: optionalText, url: optionalText, everyClaudeBot: external_exports.boolean().optional() }).optional(),
16137
+ /** OpenAI's own API key, for the `openai` instance only. Codex keeps its
16138
+ * own ChatGPT or API login and never reads this. */
16139
+ openai: external_exports.object({ key: optionalText }).optional(),
16140
+ /** OpenRouter key, for the `openrouter` instance only. */
16141
+ openrouter: external_exports.object({ key: optionalText }).optional(),
15927
16142
  /** Monthly spend limit for the whole workspace, against the cost engines
15928
16143
  * report to the usage ledger. Enforced only with the `budgets` entitlement. */
15929
16144
  budgets: external_exports.object({
@@ -15957,8 +16172,8 @@ var appConfigSchema = external_exports.object({
15957
16172
  opencodeGo: external_exports.object({ apiKey: optionalText }).optional(),
15958
16173
  /** Voice settings and the selected voice id. `provider` picks the
15959
16174
  * engine: "elevenlabs" (default; needs `key`), "fish" (needs its own
15960
- * `fishKey`), "system" (the Mac's built-in voices, no key), or
15961
- * "xai" (Grok TTS, reusing `xai.key`), or
16175
+ * `fishKey`; `fishModel` picks its speech model), "system" (the Mac's
16176
+ * built-in voices, no key), "xai" (Grok TTS, reusing `xai.key`), or
15962
16177
  * "chatterbox" (a local OpenAI-compatible Chatterbox server; `baseUrl`
15963
16178
  * and `model` are settings, not secrets). Cloud keys stay separate so
15964
16179
  * switching providers never overwrites or misuses the other key. */
@@ -15968,7 +16183,21 @@ var appConfigSchema = external_exports.object({
15968
16183
  voice: optionalText,
15969
16184
  provider: external_exports.enum(["elevenlabs", "fish", "system", "chatterbox", "xai"]).optional(),
15970
16185
  baseUrl: external_exports.string().trim().max(2048).refine((value) => !value || /^https?:\/\//i.test(value), "the Chatterbox server address must start with http:// or https://").optional(),
15971
- model: optionalText
16186
+ model: optionalText,
16187
+ fishModel: external_exports.enum(FISH_TTS_MODELS).optional()
16188
+ }).optional(),
16189
+ /** The decision model (server/decider): a fast classifier that picks
16190
+ * things for bots, starting with who answers a room message. `key` is
16191
+ * write-only like every credential; `baseUrl` points at a Jev-compatible
16192
+ * server instead of TypeSafe's (an operator setting with no UI); `jobs`
16193
+ * switches each decision on or off. Not `decisions`: that section is the
16194
+ * authorization log's retention. */
16195
+ decider: external_exports.object({
16196
+ enabled: external_exports.boolean().optional(),
16197
+ provider: external_exports.enum(["jev", "off"]).optional(),
16198
+ key: optionalText,
16199
+ baseUrl: external_exports.string().trim().max(2048).refine((value) => !value || /^https?:\/\//i.test(value), "the decision model address must start with http:// or https://").optional(),
16200
+ jobs: external_exports.object({ roomRouting: external_exports.boolean().optional() }).optional()
15972
16201
  }).optional(),
15973
16202
  /** Avatar provider credentials stay separate; choosing a router never reuses a cloud key. */
15974
16203
  imageGen: external_exports.object({
@@ -16039,36 +16268,37 @@ var storedAppConfigSchema = appConfigSchema.extend({
16039
16268
  var appConfigPatchSchema = appConfigSchema.omit({ instances: true, mcpServers: true, cliStartup: true, customDomain: true }).extend({ threads: threadsPatchSchema.optional(), newBots: newBotsPatchSchema.optional() });
16040
16269
  var jsonObjectSchema = external_exports.record(external_exports.string(), external_exports.json());
16041
16270
  var DEFAULT_CAPTURE_QUIET_MS = 2 * 6e4;
16042
- var DATA_DIR = process.env.OMB_DATA_DIR ?? join2(homedir2(), ".openmausbot");
16043
- var LEGACY_DATA_DIR = join2(homedir2(), ".opengrokbot");
16044
- var EVENTS_DIR = join2(DATA_DIR, "events");
16045
- var NATIVE_DIR = join2(DATA_DIR, "native");
16046
-
16047
- // server/proxy-paths.ts
16048
- import { existsSync as existsSync2 } from "node:fs";
16049
- import { dirname as dirname2, join as join3 } from "node:path";
16050
- import { fileURLToPath } from "node:url";
16051
- var SERVER_ROOT = dirname2(fileURLToPath(import.meta.url));
16052
- function resolveProxy(relative) {
16053
- const source = join3(SERVER_ROOT, `${relative}.ts`);
16054
- return existsSync2(source) ? source : join3(SERVER_ROOT, `${relative}.js`);
16055
- }
16056
- var SPAWNED_PROXIES = {
16057
- browser: resolveProxy("browser-proxy"),
16058
- localComputer: resolveProxy("local-computer-proxy"),
16059
- permission: resolveProxy("permission-proxy"),
16060
- containerMcp: resolveProxy("container-mcp"),
16061
- vpsContainerMcp: resolveProxy("vps-container-mcp"),
16062
- agents: resolveProxy("drivers/agents-proxy"),
16063
- dweb: resolveProxy("drivers/dweb-proxy"),
16064
- connectors: resolveProxy("connector-proxy"),
16065
- mcpGate: resolveProxy("mcp-gate"),
16066
- phone: resolveProxy("drivers/phone-proxy"),
16067
- hook: resolveProxy("hooks/omb-hook"),
16068
- // Loaded by the external `pi` process via `-e`, not by this server — but
16069
- // resolved through the same single source of truth so the packaged layout
16070
- // check can assert it ships.
16071
- piMcpExtension: resolveProxy("drivers/pi-mcp-extension")
16271
+ var DATA_DIR = process.env.OMB_DATA_DIR ?? join3(homedir2(), ".openmausbot");
16272
+ var LEGACY_DATA_DIR = join3(homedir2(), ".opengrokbot");
16273
+ var EVENTS_DIR = join3(DATA_DIR, "events");
16274
+ var NATIVE_DIR = join3(DATA_DIR, "native");
16275
+ var OPENAI_API_INSTANCE = "openai";
16276
+ var OPENROUTER_API_INSTANCE = "openrouter";
16277
+ var XAI_API_INSTANCE = "xaiApi";
16278
+ var CLAUDE_API_INSTANCE = "claudeApi";
16279
+ var API_KEY_FLEET = {
16280
+ [OPENAI_API_INSTANCE]: {
16281
+ driver: "openai-compat",
16282
+ displayName: "OpenAI",
16283
+ access: "api",
16284
+ icon: { kind: "preset", preset: "openai" },
16285
+ config: { url: "https://api.openai.com/v1", apiKeyEnv: "OMB_OPENAI_API_KEY", catalog: "openai" }
16286
+ },
16287
+ [CLAUDE_API_INSTANCE]: {
16288
+ driver: "claudeAgent",
16289
+ displayName: "Claude (API key)",
16290
+ access: "api",
16291
+ icon: { kind: "preset", preset: "anthropic" },
16292
+ config: { requireApiKey: true }
16293
+ },
16294
+ [XAI_API_INSTANCE]: { driver: "grok", displayName: "xAI", access: "api", icon: { kind: "preset", preset: "xai" } },
16295
+ [OPENROUTER_API_INSTANCE]: {
16296
+ driver: "openai-compat",
16297
+ displayName: "OpenRouter",
16298
+ access: "api",
16299
+ icon: { kind: "preset", preset: "openrouter" },
16300
+ config: { url: "https://openrouter.ai/api/v1", apiKeyEnv: "OMB_OPENROUTER_API_KEY" }
16301
+ }
16072
16302
  };
16073
16303
 
16074
16304
  // server/container-computer.ts
@@ -16402,9 +16632,11 @@ function createMcpBridgeInterceptor(options) {
16402
16632
  };
16403
16633
  }
16404
16634
  function runMcpBridge(options) {
16405
- const child = spawn(options.command, options.args, {
16635
+ const env = options.env ?? { ...process.env, PATH: augmentedPath() };
16636
+ const { command, args } = resolveCliSpawn(options.command, options.args, env);
16637
+ const child = spawn(command, args, {
16406
16638
  shell: false,
16407
- env: options.env ?? { ...process.env, PATH: augmentedPath() },
16639
+ env,
16408
16640
  stdio: ["pipe", "pipe", "pipe"]
16409
16641
  });
16410
16642
  child.stdin.on("error", () => {
@@ -129,6 +129,8 @@ function catalogProfileFromEnv(env) {
129
129
  skillAuthoring: env.OMB_SKILL_AUTHORING_ENABLED === "1",
130
130
  sharedComputers: env.OMB_SHARED_COMPUTERS_ENABLED === "1",
131
131
  voiceNotes: env.OMB_VOICE_NOTES === "1",
132
+ cloudHome: env.OMB_CLOUD_HOME === "1",
133
+ memoryEnabled: env.OMB_MEMORY_ENABLED !== "0",
132
134
  botId: env.OMB_BOT_ID ?? ""
133
135
  };
134
136
  }
@@ -309,14 +311,14 @@ var toolDefinitions = (externalRuntime) => [
309
311
  },
310
312
  {
311
313
  name: "coordinate_bots",
312
- description: "Ask existing OpenMausBot teammates for advice or assign concrete work. From normal chat every assignment you send a teammate continues your one standing conversation with that teammate, so they keep the context of what you asked before; from a room it defaults to this room. Use group_id from list_room_targets for a specific room. Give 1-4 bot_ids \u2014 teammate ids as list_bots or your roster prints them; a unique teammate name also resolves: they receive only your brief and use their own model, tools and permissions. Busy bots queue. They can consult their specialists; all results return here and resume you automatically. Include exact file paths, constraints and what must be verified. After sending all assignments, END your turn; do not poll or wait. On return, resolve tradeoffs, verify the requested outcome and request concrete corrections if necessary before giving one final answer. Do not send acknowledgements as new work.",
314
+ description: "Ask existing OpenMausBot teammates for advice or assign concrete work. From normal chat each distinct assignment starts a fresh thread for that teammate; from a room it defaults to this room. Give a self-contained brief. Use group_id from list_room_targets for a specific room. Give 1-4 bot_ids \u2014 teammate ids as list_bots or your roster prints them; a unique teammate name also resolves: they receive only your brief and use their own model, tools and permissions. Busy bots queue. They can consult their specialists; all results return here and resume you automatically. Include exact file paths, constraints and what must be verified. After sending all assignments, END your turn; do not poll or wait. On return, resolve tradeoffs, verify the requested outcome and request concrete corrections if necessary before giving one final answer. Do not send acknowledgements as new work.",
313
315
  inputSchema: { type: "object", additionalProperties: false, properties: {
314
- group_id: { type: "string", description: "Optional destination room. Omit for this room, or your standing conversation with each teammate when chatting directly." },
316
+ group_id: { type: "string", description: "Optional destination room. Omit for this room, or a fresh thread for each teammate when chatting directly." },
315
317
  bot_ids: { type: "array", items: { type: "string", description: "A teammate's id exactly as list_bots or your roster prints it ([id: \u2026]). A teammate's unique display name also resolves; a name shared by two reachable teammates is refused." }, minItems: 1, maxItems: 4, uniqueItems: true },
316
318
  message: { type: "string", minLength: 1, maxLength: 4e3, description: "Self-contained question or task for these teammates. Send separate requests when responsibilities differ." },
317
319
  request_key: { type: "string", description: "A short unique assignment key. Reuse for an identical retry." },
318
320
  rework: { type: "boolean", description: "True only for concrete additional work from someone who already completed a request." },
319
- label: { type: "string", description: "Optional short name (one line, at most 60 characters) for this job. Used only when the teammate is still working on your previous assignment and this one therefore runs in its own thread beside your standing conversation." }
321
+ label: { type: "string", description: "Optional short name (one line, at most 60 characters) for this job. Names the new direct assignment thread." }
320
322
  }, required: ["bot_ids", "message", "request_key"] }
321
323
  },
322
324
  {
@@ -853,9 +855,19 @@ var ROOM_ONLY_TOOLS = /* @__PURE__ */ new Set(["list_room_targets", "coordinate_
853
855
  var ROOM_REPLACED_TOOLS = /* @__PURE__ */ new Set(["ask_bot", "delegate_bot", "check_delegation", "wait_delegation", "start_thread", "send_to_thread", "wait_thread"]);
854
856
  var EXTERNAL_TOOL_NAMES = /* @__PURE__ */ new Set(["list_bots", "ask_bot", "delegate_bot", "check_delegation", "wait_delegation"]);
855
857
  var WATCHER_TOOL_NAMES = /* @__PURE__ */ new Set(["create_options_card"]);
858
+ var LOCAL_VM_TOOL_NAMES = /* @__PURE__ */ new Set(["vm_exec"]);
859
+ var CLOUD_HOME_SURFACE = {
860
+ type: "string",
861
+ enum: ["auto", "cloud", "browser"],
862
+ description: "auto = suitable configured computer, cloud = remote Boat/VPS, browser = built-in browser. Omit to list. This server runs in the cloud: the user's own computer and a Local VM are not places here."
863
+ };
856
864
  function availableTools(profile) {
865
+ const tools = catalogTools(profile);
866
+ return profile.cloudHome ? tools.filter((tool) => !LOCAL_VM_TOOL_NAMES.has(tool.name)).map((tool) => tool.name === "select_computer" ? { ...tool, inputSchema: { ...tool.inputSchema, properties: { surface: CLOUD_HOME_SURFACE } } } : tool) : tools;
867
+ }
868
+ function catalogTools(profile) {
857
869
  const TOOLS = toolDefinitions(profile.externalRuntime);
858
- const BOT_SCOPED_TOOLS = profile.botId === WATCHER_OPTIONS_CARD_BOT_ID ? TOOLS : TOOLS.filter((tool) => !WATCHER_TOOL_NAMES.has(tool.name));
870
+ const BOT_SCOPED_TOOLS = TOOLS.filter((tool) => (profile.botId === WATCHER_OPTIONS_CARD_BOT_ID || !WATCHER_TOOL_NAMES.has(tool.name)) && (profile.memoryEnabled !== false || tool.name !== "memory_update" && tool.name !== "memory_log"));
859
871
  const AUTHORING_TOOLS = profile.skillAuthoring ? BOT_SCOPED_TOOLS : BOT_SCOPED_TOOLS.filter((tool) => !SKILL_TOOL_NAMES.has(tool.name));
860
872
  const SHAREABLE_TOOLS = profile.sharedComputers ? AUTHORING_TOOLS : AUTHORING_TOOLS.filter((tool) => !SHARED_COMPUTER_TOOL_NAMES.has(tool.name));
861
873
  const VOICE_READY_TOOLS = profile.voiceNotes ? SHAREABLE_TOOLS : SHAREABLE_TOOLS.filter((tool) => !VOICE_TOOL_NAMES.has(tool.name));
@@ -14728,7 +14728,11 @@ var sessionSchema = external_exports.object({
14728
14728
  userId: external_exports.string().max(256).optional(),
14729
14729
  email: external_exports.string().max(320).optional(),
14730
14730
  /** Set only by the internal verified-portal issuance path, never by email or pairing input. */
14731
- membershipAuthority: external_exports.literal("portal").optional()
14731
+ membershipAuthority: external_exports.literal("portal").optional(),
14732
+ /** A browser sign-in (PairingCode `browser`): accepted only as its browser's cookie, never as a bearer token. */
14733
+ cookieOnly: external_exports.literal(true).optional(),
14734
+ /** Whose OMB Cloud a browser sign-in signed in to (its PairingCode `owner`). */
14735
+ owner: external_exports.string().max(254).optional()
14732
14736
  });
14733
14737
  var fileSchema = external_exports.object({ version: external_exports.literal(1), sessions: external_exports.array(sessionSchema) });
14734
14738