openmausbot 0.1.86 → 0.1.88

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 (216) hide show
  1. package/README.md +4 -3
  2. package/dist/assets/{abnfDiagram-O67JEVCF-DpUZNnFD.js → abnfDiagram-O67JEVCF-qd9VD3GV.js} +1 -1
  3. package/dist/assets/{arc-DW7mrI4p.js → arc-3RwkUjRe.js} +1 -1
  4. package/dist/assets/{architectureDiagram-NJMV4G6O-CyeZ5WLZ.js → architectureDiagram-NJMV4G6O-CFKSJS7a.js} +1 -1
  5. package/dist/assets/{blockDiagram-BEXU5L5S-CBVaNjO7.js → blockDiagram-BEXU5L5S-CG1rEfWD.js} +1 -1
  6. package/dist/assets/{c4Diagram-YGBWAQC7-sf8d41uT.js → c4Diagram-YGBWAQC7-CBW9N664.js} +1 -1
  7. package/dist/assets/channel-CnRnO3tF.js +1 -0
  8. package/dist/assets/{chunk-2Q5K7J3B-BOGvy7Y_.js → chunk-2Q5K7J3B-2mRfTksB.js} +1 -1
  9. package/dist/assets/{chunk-3FUC2YCW-BiF9zyiz.js → chunk-3FUC2YCW-Cv1dpErj.js} +2 -2
  10. package/dist/assets/{chunk-5VM5RSS4-EFuZ1SBZ.js → chunk-5VM5RSS4-B7IACJp-.js} +1 -1
  11. package/dist/assets/{chunk-GTNCS2PH-pJLNSAT7.js → chunk-GTNCS2PH-An0hZtYa.js} +1 -1
  12. package/dist/assets/{chunk-GWA4HPMP-Cb-3_3IT.js → chunk-GWA4HPMP-BcJB2nEm.js} +1 -1
  13. package/dist/assets/{chunk-JWPE2WC7-DAf5aogn.js → chunk-JWPE2WC7-CV_W7TN7.js} +1 -1
  14. package/dist/assets/{chunk-NETBCI7D-DR3kiwZz.js → chunk-NETBCI7D-Bcs_kwnA.js} +1 -1
  15. package/dist/assets/{chunk-WEXAMYUT-BmU8PeyM.js → chunk-WEXAMYUT-lrx_DxFP.js} +1 -1
  16. package/dist/assets/{chunk-XXDRQBXY-Buh8g8OT.js → chunk-XXDRQBXY-DabHlLGM.js} +1 -1
  17. package/dist/assets/{classDiagram-v2-NBCMYWYE-BurfmMWM.js → classDiagram-v2-NBCMYWYE-BnHj6P7d.js} +1 -1
  18. package/dist/assets/{cose-bilkent-JH36ORCC-KkGZUEkU.js → cose-bilkent-JH36ORCC-CfLp6UDi.js} +1 -1
  19. package/dist/assets/{cynefin-OW5HDTMX-C3PpV96d.js → cynefin-OW5HDTMX-Dm4dbVA1.js} +1 -1
  20. package/dist/assets/{cynefinDiagram-VND7K2PF-Dt8JwJaI.js → cynefinDiagram-VND7K2PF-B9mH-PID.js} +1 -1
  21. package/dist/assets/{dagre-6A5THRUB-DkjN8266.js → dagre-6A5THRUB-DDc_NVQJ.js} +1 -1
  22. package/dist/assets/{diagram-22UHCM2B-DUAJS0JV.js → diagram-22UHCM2B-lwr8Ip8-.js} +1 -1
  23. package/dist/assets/{diagram-3UASUU5V-Dw4KhF1a.js → diagram-3UASUU5V-BLLe6dmI.js} +1 -1
  24. package/dist/assets/{diagram-ATOU4E4O-Dd1gmQqf.js → diagram-ATOU4E4O-6eUIq4lz.js} +1 -1
  25. package/dist/assets/{diagram-CDSNMT55-CjwGs0Yw.js → diagram-CDSNMT55-O-pRN7VQ.js} +1 -1
  26. package/dist/assets/{diagram-MLGK6HIB-BL-69Zrq.js → diagram-MLGK6HIB-BietvGAI.js} +1 -1
  27. package/dist/assets/{diagram-MPIPVDR6-5Zi2N7wo.js → diagram-MPIPVDR6-Bd2Cl62X.js} +1 -1
  28. package/dist/assets/{ebnfDiagram-ZINNZB2B-D9NekWUX.js → ebnfDiagram-ZINNZB2B-B6iDy69W.js} +1 -1
  29. package/dist/assets/{elk-276RUBZZ-CkaSQjxw.js → elk-276RUBZZ-DQVHfKe0.js} +1 -1
  30. package/dist/assets/{erDiagram-OPXOYQCR-CdAVBV8-.js → erDiagram-OPXOYQCR-BWdVp2tQ.js} +1 -1
  31. package/dist/assets/{flowDiagram-KWPJA3E3-Bm_lWWH7.js → flowDiagram-KWPJA3E3-WLE6rKB4.js} +1 -1
  32. package/dist/assets/{ganttDiagram-FUAMR5RP-FZ8ejYWJ.js → ganttDiagram-FUAMR5RP-BbjS-4gn.js} +1 -1
  33. package/dist/assets/{gitGraphDiagram-X574FWY7-Dlv9rizZ.js → gitGraphDiagram-X574FWY7-Dpy2QSGq.js} +1 -1
  34. package/dist/assets/index-BIMdIbaw.css +1 -0
  35. package/dist/assets/index-CHnODCr2.js +583 -0
  36. package/dist/assets/{index-h9FFNwTu.js → index-CIaHn5NS.js} +1 -1
  37. package/dist/assets/{infoDiagram-VRGFBTTK-BdQ_gW5B.js → infoDiagram-VRGFBTTK-D_jKWlKe.js} +1 -1
  38. package/dist/assets/{ishikawaDiagram-OU5B5YK6-EwssEp2X.js → ishikawaDiagram-OU5B5YK6-DLJohSuK.js} +1 -1
  39. package/dist/assets/{journeyDiagram-ZHPQQLJL-BX1G1vOd.js → journeyDiagram-ZHPQQLJL-DPOFj0qN.js} +1 -1
  40. package/dist/assets/{kanban-definition-PNTS6WVX-BB4kAsyC.js → kanban-definition-PNTS6WVX-BI7v-xpK.js} +1 -1
  41. package/dist/assets/{linear-3su2TG93.js → linear-C2pWPSxO.js} +1 -1
  42. package/dist/assets/{mermaid.core-CDD1E0s9.js → mermaid.core-CR-j5WQU.js} +5 -5
  43. package/dist/assets/{mindmap-definition-NLK3R4M7-Ba50MsNK.js → mindmap-definition-NLK3R4M7-lz9GvXRh.js} +1 -1
  44. package/dist/assets/{pegDiagram-GJSIUBJH-DZLkkZlM.js → pegDiagram-GJSIUBJH-Dl4_ia61.js} +1 -1
  45. package/dist/assets/{pieDiagram-5QR66LMP-DaTz77Uq.js → pieDiagram-5QR66LMP-DWuT3n88.js} +1 -1
  46. package/dist/assets/{quadrantDiagram-O4NWA36T-CpaiidpR.js → quadrantDiagram-O4NWA36T-DXWe9Jx7.js} +1 -1
  47. package/dist/assets/{railroadDiagram-XR7U4H2S-mN4JrMeI.js → railroadDiagram-XR7U4H2S-COY1IBVY.js} +1 -1
  48. package/dist/assets/{requirementDiagram-PLB6GJNP-BSNDRpg7.js → requirementDiagram-PLB6GJNP-DnyVuhsQ.js} +1 -1
  49. package/dist/assets/{sankeyDiagram-IPEJSGJF-FngzGNug.js → sankeyDiagram-IPEJSGJF-BSc4NdGK.js} +1 -1
  50. package/dist/assets/{sequenceDiagram-PO4LG4MO-CM4pCC3L.js → sequenceDiagram-PO4LG4MO-kqEU2EGq.js} +1 -1
  51. package/dist/assets/{sizeCapture-INFHLROL-CRICHXkw.js → sizeCapture-INFHLROL-BvB4bkWD.js} +1 -1
  52. package/dist/assets/{stateDiagram-v2-GCMORJYK-oyTWpxH2.js → stateDiagram-v2-GCMORJYK-BIrqNv7y.js} +1 -1
  53. package/dist/assets/{swimlanes-2SLR337P-D9h9mPBq.js → swimlanes-2SLR337P-CFnalQUE.js} +1 -1
  54. package/dist/assets/swimlanesDiagram-TC7HE7FX-C4a8qNGj.js +8 -0
  55. package/dist/assets/{timeline-definition-EJHVYXUP-BJUlN9bW.js → timeline-definition-EJHVYXUP-CsSWJnSQ.js} +1 -1
  56. package/dist/assets/{usecaseDiagram-POWQR4AR-3uBNkbAb.js → usecaseDiagram-POWQR4AR-DkAmJ1EE.js} +1 -1
  57. package/dist/assets/{vennDiagram-UO4OBE2U-D2odalzT.js → vennDiagram-UO4OBE2U-C3vd9drL.js} +1 -1
  58. package/dist/assets/{wardleyDiagram-VNRHLVJA-DHgFaB9S.js → wardleyDiagram-VNRHLVJA-j26CM-pi.js} +1 -1
  59. package/dist/assets/{xychartDiagram-PMCCYNJV-w5GYM2h0.js → xychartDiagram-PMCCYNJV-BYu1Q_at.js} +1 -1
  60. package/dist/index.html +2 -2
  61. package/dist-server/browser-proxy.js +2 -1
  62. package/dist-server/companion/src/routes.js +8 -1
  63. package/dist-server/connector-proxy.js +105 -1
  64. package/dist-server/container-mcp.js +1032 -165
  65. package/dist-server/drivers/agents-proxy.js +338 -29
  66. package/dist-server/drivers/phone-proxy.js +33 -2
  67. package/dist-server/index.js +40590 -31811
  68. package/dist-server/local-computer-proxy.js +5 -3
  69. package/dist-server/local-computer.js +53 -17
  70. package/dist-server/mcp-gate.js +2 -0
  71. package/dist-server/mcp-server.js +5 -3
  72. package/dist-server/message-search.worker.js +52 -0
  73. package/dist-server/openmausbot.js +4457 -1399
  74. package/dist-server/pair-cli.js +4457 -1399
  75. package/dist-server/permission-proxy.js +29 -9
  76. package/dist-server/server/admission.js +81 -0
  77. package/dist-server/server/aside-queue.js +294 -0
  78. package/dist-server/server/attachments.js +98 -1
  79. package/dist-server/server/auto-approve.js +4 -3
  80. package/dist-server/server/auto-vm-claims.js +1 -0
  81. package/dist-server/server/bot-attachment.js +107 -0
  82. package/dist-server/server/bot-overview.js +19 -0
  83. package/dist-server/server/bot-package.js +18 -292
  84. package/dist-server/server/bot-profile.js +5 -17
  85. package/dist-server/server/box-create-idempotency.js +3 -3
  86. package/dist-server/server/box.js +57 -55
  87. package/dist-server/server/browser-proxy.js +3 -2
  88. package/dist-server/server/browser-runtime.js +37 -1
  89. package/dist-server/server/cli-api-setup.js +1 -0
  90. package/dist-server/server/cli.js +2 -2
  91. package/dist-server/server/command-allowlist.js +154 -0
  92. package/dist-server/server/composio.js +297 -1
  93. package/dist-server/server/computer-wait.js +22 -9
  94. package/dist-server/server/config.js +84 -12
  95. package/dist-server/server/connector-advertisement.js +165 -0
  96. package/dist-server/server/connector-proxy.js +14 -2
  97. package/dist-server/server/connector-verdict.js +168 -0
  98. package/dist-server/server/container-computer.js +61 -1
  99. package/dist-server/server/contracts.js +22 -0
  100. package/dist-server/server/default-model-selection.js +9 -0
  101. package/dist-server/server/delegations.js +85 -34
  102. package/dist-server/server/drivers/acp/core.js +80 -20
  103. package/dist-server/server/drivers/acp/cursor.js +3 -7
  104. package/dist-server/server/drivers/acp/droid.js +4 -7
  105. package/dist-server/server/drivers/acp/gemini.js +4 -4
  106. package/dist-server/server/drivers/acp/grok.js +4 -9
  107. package/dist-server/server/drivers/acp/hermes.js +3 -5
  108. package/dist-server/server/drivers/acp/opencode-go.js +2 -5
  109. package/dist-server/server/drivers/acp/qwen.js +9 -15
  110. package/dist-server/server/drivers/agents-call.js +179 -13
  111. package/dist-server/server/drivers/agents-catalog.js +134 -10
  112. package/dist-server/server/drivers/boxagent.js +160 -36
  113. package/dist-server/server/drivers/builtIn.js +2 -0
  114. package/dist-server/server/drivers/chat-box-tools.js +90 -0
  115. package/dist-server/server/drivers/chat-images.js +54 -0
  116. package/dist-server/server/drivers/chat-mcp-tools.js +38 -8
  117. package/dist-server/server/drivers/chat-tool-approval.js +70 -18
  118. package/dist-server/server/drivers/claude.js +38 -19
  119. package/dist-server/server/drivers/codex-catalog.js +14 -6
  120. package/dist-server/server/drivers/codex-identity.js +2 -1
  121. package/dist-server/server/drivers/codex-instructions.js +48 -6
  122. package/dist-server/server/drivers/codex-release.js +48 -0
  123. package/dist-server/server/drivers/codex-tool-surface.js +20 -0
  124. package/dist-server/server/drivers/codex.js +102 -55
  125. package/dist-server/server/drivers/mistral.js +115 -0
  126. package/dist-server/server/drivers/openai-chat.js +180 -33
  127. package/dist-server/server/drivers/openai-compat.js +1 -0
  128. package/dist-server/server/drivers/permission-command.js +35 -0
  129. package/dist-server/server/drivers/phone-proxy.js +47 -2
  130. package/dist-server/server/drivers/pi.js +306 -28
  131. package/dist-server/server/drivers/prompt-split.js +110 -0
  132. package/dist-server/server/drivers/session-idle.js +29 -0
  133. package/dist-server/server/env-path.js +15 -0
  134. package/dist-server/server/fleet.js +1 -1
  135. package/dist-server/server/group-thread-usage.js +103 -0
  136. package/dist-server/server/guarded-requests.js +2 -2
  137. package/dist-server/server/harness/registry.js +1 -0
  138. package/dist-server/server/harness-capabilities.js +46 -0
  139. package/dist-server/server/hosted-models.js +1 -1
  140. package/dist-server/server/index.js +2396 -505
  141. package/dist-server/server/local-computer.js +72 -23
  142. package/dist-server/server/managed-desktop.js +1 -1
  143. package/dist-server/server/mcp-bridge.js +6 -6
  144. package/dist-server/server/message-db.js +22 -42
  145. package/dist-server/server/message-file.js +9 -1
  146. package/dist-server/server/message-search-query.js +43 -0
  147. package/dist-server/server/message-search-worker.js +80 -0
  148. package/dist-server/server/message-search.worker.js +21 -0
  149. package/dist-server/server/model-requests.js +248 -0
  150. package/dist-server/server/new-bot-defaults.js +115 -0
  151. package/dist-server/server/options-card.js +21 -0
  152. package/dist-server/server/org-library.js +1065 -0
  153. package/dist-server/server/package-export.js +627 -39
  154. package/dist-server/server/package-import.js +458 -0
  155. package/dist-server/server/package-parts.js +87 -0
  156. package/dist-server/server/peer-approval.js +16 -7
  157. package/dist-server/server/peer-delivery.js +60 -0
  158. package/dist-server/server/peer-roster.js +67 -0
  159. package/dist-server/server/presets.js +492 -0
  160. package/dist-server/server/profile-requests.js +66 -39
  161. package/dist-server/server/profile-revision.js +9 -1
  162. package/dist-server/server/profile-versions.js +6 -3
  163. package/dist-server/server/provider-key-check.js +3 -2
  164. package/dist-server/server/published-teams.js +80 -0
  165. package/dist-server/server/room-handoffs.js +19 -3
  166. package/dist-server/server/routes/bot-presets.js +25 -0
  167. package/dist-server/server/routine-requests.js +35 -10
  168. package/dist-server/server/routines.js +41 -1
  169. package/dist-server/server/section-context.js +10 -0
  170. package/dist-server/server/skill-fetch.js +72 -14
  171. package/dist-server/server/skills.js +35 -61
  172. package/dist-server/server/steer-queue.js +3 -2
  173. package/dist-server/server/store.js +291 -17
  174. package/dist-server/server/surface.js +10 -4
  175. package/dist-server/server/system-prompt.js +38 -6
  176. package/dist-server/server/team-backup.js +6 -2
  177. package/dist-server/server/team-computers.js +10 -0
  178. package/dist-server/server/team-library.js +6 -2
  179. package/dist-server/server/team-manifest.js +4 -3
  180. package/dist-server/server/team-setup-requests.js +139 -27
  181. package/dist-server/server/thread-events.js +20 -2
  182. package/dist-server/server/tightening-requests.js +405 -0
  183. package/dist-server/server/tts/chatterbox.js +27 -5
  184. package/dist-server/server/turn-context.js +2 -0
  185. package/dist-server/server/turn-watchdog.js +12 -3
  186. package/dist-server/server/usage-ledger.js +19 -2
  187. package/dist-server/server/vps-computer.js +139 -51
  188. package/dist-server/server/vps-container-mcp.js +7 -0
  189. package/dist-server/server/vps-ssh.js +36 -7
  190. package/dist-server/server/workspace-backup-policy.js +12 -0
  191. package/dist-server/server/workspace-backup.js +42 -5
  192. package/dist-server/server/workspace-backup.worker.js +10 -0
  193. package/dist-server/server/workspace.js +1 -1
  194. package/dist-server/shared/approval-mode.js +1 -1
  195. package/dist-server/shared/ask-question.js +207 -12
  196. package/dist-server/shared/bot-profile.js +15 -0
  197. package/dist-server/shared/command-allowlist.js +1 -0
  198. package/dist-server/shared/credential-request.js +6 -2
  199. package/dist-server/shared/line-diff.js +23 -0
  200. package/dist-server/shared/model-request.js +1 -0
  201. package/dist-server/shared/options-card.js +51 -0
  202. package/dist-server/shared/package-format.js +967 -0
  203. package/dist-server/shared/profile-request.js +5 -4
  204. package/dist-server/shared/skill-md.js +64 -0
  205. package/dist-server/shared/team-backup.js +7 -0
  206. package/dist-server/shared/tightening-request.js +87 -0
  207. package/dist-server/shared/wire.js +4 -0
  208. package/dist-server/src/lib/composer-attachments.js +25 -3
  209. package/dist-server/vps-container-mcp.js +1132 -171
  210. package/dist-server/workspace-backup.worker.js +19474 -0
  211. package/enterprise/README.md +1 -1
  212. package/package.json +1 -1
  213. package/dist/assets/channel-BXFkgus9.js +0 -1
  214. package/dist/assets/index-BGgqlWPJ.css +0 -1
  215. package/dist/assets/index-BtHo8ZKl.js +0 -577
  216. package/dist/assets/swimlanesDiagram-TC7HE7FX-BWrvB2ak.js +0 -8
@@ -106,6 +106,8 @@ function knownDirs() {
106
106
  join(home, ".volta", "bin"),
107
107
  join(home, ".bun", "bin"),
108
108
  join(home, ".asdf", "shims"),
109
+ join(home, ".local", "share", "mise", "shims"),
110
+ // mise installer
109
111
  join(home, ".deno", "bin"),
110
112
  join(home, "bin"),
111
113
  ...nvmBinDirs()
@@ -260,11 +262,11 @@ function createToolListNormalizer() {
260
262
  // server/mcp-bridge.ts
261
263
  var BRIDGE_INACTIVITY_MS = 45e3;
262
264
  var PROBE_TIMEOUT_MS = 1e4;
263
- function runLivenessProbe(probe, timeoutMs = PROBE_TIMEOUT_MS) {
265
+ function runLivenessProbe(probe, timeoutMs = PROBE_TIMEOUT_MS, env) {
264
266
  return new Promise((resolve) => {
265
267
  const child = spawn(probe.command, probe.args, {
266
268
  shell: false,
267
- env: { ...process.env, PATH: augmentedPath() },
269
+ env: env ?? { ...process.env, PATH: augmentedPath() },
268
270
  stdio: ["ignore", "ignore", "ignore"]
269
271
  });
270
272
  const timer = setTimeout(() => {
@@ -451,7 +453,7 @@ function runMcpBridge(options) {
451
453
  const liveness = options.liveness;
452
454
  watchdog = createInactivityWatchdog({
453
455
  inactivityMs: BRIDGE_INACTIVITY_MS,
454
- probe: () => runLivenessProbe(liveness),
456
+ probe: () => runLivenessProbe(liveness, PROBE_TIMEOUT_MS, options.env),
455
457
  onDead: () => {
456
458
  process.stderr.write(
457
459
  `${options.label} transport went silent and stopped answering liveness probes; ending the bridge
@@ -91,16 +91,14 @@ function sameDriverFileIdentity(expected, actual) {
91
91
  }
92
92
  function decodeLegacyDescriptor(value, platform) {
93
93
  const supportedPlatform = legacyPlatform(platform);
94
- if (!supportedPlatform || !value || value.mode === "unavailable" || typeof value.mcpCommand !== "string") {
94
+ if (!supportedPlatform || !value || !(value.mode === "embedded" || supportedPlatform === "darwin" && value.mode === "standalone") || Object.hasOwn(value, "status") && value.status !== "ready" || typeof value.socketPath !== "string" || !value.socketPath || typeof value.mcpCommand !== "string" || !value.mcpCommand.trim()) {
95
95
  return null;
96
96
  }
97
- if (value.mcpArgs !== void 0 && !Array.isArray(value.mcpArgs)) return null;
98
- if (value.mcpEnv !== void 0 && (!value.mcpEnv || typeof value.mcpEnv !== "object" || Array.isArray(value.mcpEnv))) {
99
- return null;
100
- }
101
- const args = value.mcpArgs ?? ["mcp"];
97
+ if (!Array.isArray(value.mcpArgs) || value.mcpArgs[0] !== "mcp") return null;
98
+ if (!value.mcpEnv || typeof value.mcpEnv !== "object" || Array.isArray(value.mcpEnv)) return null;
99
+ const args = value.mcpArgs;
102
100
  if (!args.every((arg) => typeof arg === "string")) return null;
103
- const env = value.mcpEnv ?? {};
101
+ const env = value.mcpEnv;
104
102
  if (!Object.values(env).every((entry) => typeof entry === "string")) return null;
105
103
  return {
106
104
  command: value.mcpCommand,
@@ -219,6 +217,17 @@ function validateLegacyDescriptorRuntime(descriptorFile, platform, { uid = proce
219
217
  return false;
220
218
  }
221
219
  }
220
+ function firstPresentCuaDescriptor(candidates) {
221
+ for (const file of new Set(candidates)) {
222
+ try {
223
+ lstatSync(file);
224
+ return file;
225
+ } catch (error) {
226
+ if (error.code !== "ENOENT") return file;
227
+ }
228
+ }
229
+ return null;
230
+ }
222
231
  function readCuaConnection({
223
232
  platform = process.platform,
224
233
  userData = process.env.OMB_USER_DATA,
@@ -227,23 +236,49 @@ function readCuaConnection({
227
236
  validateLegacyRuntime = validateLegacyDescriptorRuntime
228
237
  } = {}) {
229
238
  const candidates = userData ? [join2(userData, "cua-connection.json")] : [];
230
- if (platform === "darwin") {
239
+ if (platform === "darwin" && !userData) {
231
240
  for (const directory of ["OpenMausBot", "openmausbot", "OpenGrokBot", "opengrokbot"]) {
232
241
  candidates.push(join2(home, "Library", "Application Support", directory, "cua-connection.json"));
233
242
  }
234
243
  }
235
- for (const file of new Set(candidates)) {
236
- try {
244
+ const file = firstPresentCuaDescriptor(candidates);
245
+ if (!file) return null;
246
+ try {
247
+ const raw = JSON.parse(readFileSync(file, "utf8"));
248
+ if (platform === "linux") {
249
+ const decoded = decodeLinuxDescriptor(raw);
250
+ if (decoded && validateLinuxRuntime(file, raw)) return decoded;
251
+ } else {
252
+ const decoded = decodeLegacyDescriptor(raw, platform);
253
+ if (decoded && validateLegacyRuntime(file, platform)) return decoded;
254
+ }
255
+ } catch {
256
+ }
257
+ return null;
258
+ }
259
+ function readCuaUnavailableReason({
260
+ platform = process.platform,
261
+ userData = process.env.OMB_USER_DATA,
262
+ home = homedir()
263
+ } = {}) {
264
+ if (!legacyPlatform(platform)) return null;
265
+ const candidates = userData ? [join2(userData, "cua-connection.json")] : [];
266
+ if (platform === "darwin" && !userData) {
267
+ for (const directory of ["OpenMausBot", "openmausbot", "OpenGrokBot", "opengrokbot"]) {
268
+ candidates.push(join2(home, "Library", "Application Support", directory, "cua-connection.json"));
269
+ }
270
+ }
271
+ const file = firstPresentCuaDescriptor(candidates);
272
+ if (!file) return null;
273
+ try {
274
+ if (validateLegacyDescriptorRuntime(file, platform)) {
237
275
  const raw = JSON.parse(readFileSync(file, "utf8"));
238
- if (platform === "linux") {
239
- const decoded = decodeLinuxDescriptor(raw);
240
- if (decoded && validateLinuxRuntime(file, raw)) return decoded;
241
- } else {
242
- const decoded = decodeLegacyDescriptor(raw, platform);
243
- if (decoded && validateLegacyRuntime(file, platform)) return decoded;
276
+ if (raw && typeof raw === "object" && !Array.isArray(raw) && Object.keys(raw).length === 2 && raw.mode === "unavailable") {
277
+ const reason = raw.reason;
278
+ if (typeof reason === "string" && reason.trim() && reason.length <= 2e3) return reason.trim();
244
279
  }
245
- } catch {
246
280
  }
281
+ } catch {
247
282
  }
248
283
  return null;
249
284
  }
@@ -253,5 +288,6 @@ export {
253
288
  decodeLinuxDescriptor,
254
289
  gatedLocalComputer,
255
290
  readCuaConnection,
291
+ readCuaUnavailableReason,
256
292
  validateLinuxDescriptorRuntime
257
293
  };
@@ -39,6 +39,8 @@ function knownDirs() {
39
39
  join(home, ".volta", "bin"),
40
40
  join(home, ".bun", "bin"),
41
41
  join(home, ".asdf", "shims"),
42
+ join(home, ".local", "share", "mise", "shims"),
43
+ // mise installer
42
44
  join(home, ".deno", "bin"),
43
45
  join(home, "bin"),
44
46
  ...nvmBinDirs()
@@ -569,7 +569,8 @@ function projectMessage(message) {
569
569
  subtitle: message.card.subtitle,
570
570
  options: message.card.options,
571
571
  answered: message.card.answered,
572
- dismissed: message.card.dismissed
572
+ dismissed: message.card.dismissed,
573
+ expired: message.card.expired
573
574
  } : void 0;
574
575
  const tool = isRecord(message.tool) ? {
575
576
  name: message.tool.name,
@@ -594,6 +595,7 @@ function projectMessage(message) {
594
595
  helpUrl: message.secret.helpUrl,
595
596
  provided: message.secret.provided,
596
597
  dismissed: message.secret.dismissed,
598
+ superseded: message.secret.superseded,
597
599
  resumed: message.secret.resumed
598
600
  } : void 0;
599
601
  return {
@@ -621,9 +623,9 @@ function taskBelongsTo(owner, taskId) {
621
623
  return owner.threadId === taskId || records(owner.tasks).some((task) => task.threadId === taskId);
622
624
  }
623
625
  function messageNeedsInput(message) {
624
- const card = isRecord(message.card) && message.card.requestId && !message.card.answered && !message.card.dismissed;
626
+ const card = isRecord(message.card) && message.card.requestId && !message.card.answered && !message.card.dismissed && !message.card.expired;
625
627
  const connector = isRecord(message.connector) && !message.connector.dismissed && !message.connector.resumed && message.connector.status !== "connected";
626
- const secret = isRecord(message.secret) && !message.secret.provided && !message.secret.dismissed;
628
+ const secret = isRecord(message.secret) && !message.secret.provided && !message.secret.dismissed && !message.secret.superseded;
627
629
  return Boolean(card || connector || secret);
628
630
  }
629
631
  function dispatchFailedAfterLatestUser(messages) {
@@ -0,0 +1,52 @@
1
+ // server/message-search.worker.ts
2
+ import { DatabaseSync } from "node:sqlite";
3
+ import { parentPort, workerData } from "node:worker_threads";
4
+
5
+ // server/message-search-query.ts
6
+ function searchMessagesInDatabase(database, query, limit = 40, threadId) {
7
+ const needle = query.trim().toLowerCase();
8
+ if (!needle) return [];
9
+ const pattern = `%${needle.replace(/([\\%_])/g, "\\$1")}%`;
10
+ const scope = threadId ? "thread_id = ? AND " : "";
11
+ const statement = database.prepare(
12
+ `SELECT thread_id, id, at, role, kind, text, json_extract(json, '$.tool.name') AS tool_name, json_extract(json, '$.from.name') AS from_name FROM messages WHERE ${scope}((kind = 'text' AND text IS NOT NULL AND lower(text) LIKE ? ESCAPE '\\') OR (kind = 'activity' AND tool_name IS NOT NULL AND lower(tool_name) LIKE ? ESCAPE '\\')) ORDER BY at DESC LIMIT ?`
13
+ );
14
+ const rows = threadId ? statement.all(threadId, pattern, pattern, limit) : statement.all(pattern, pattern, limit);
15
+ return rows.map((row) => {
16
+ const haystack = row.kind === "activity" ? row.tool_name ?? "" : row.text ?? "";
17
+ const hitAt = Math.max(0, haystack.toLowerCase().indexOf(needle));
18
+ const start = Math.max(0, hitAt - 60);
19
+ const end = Math.min(haystack.length, hitAt + needle.length + 90);
20
+ const head = start > 0 ? "\u2026" : "";
21
+ const body = haystack.slice(start, end).replace(/\s+/g, " ").trim();
22
+ const snippet = head + body + (end < haystack.length ? "\u2026" : "");
23
+ const folded = needle.replace(/\s+/g, " ");
24
+ const matchStart = snippet.toLowerCase().indexOf(folded);
25
+ return {
26
+ threadId: row.thread_id,
27
+ messageId: row.id,
28
+ at: row.at,
29
+ role: row.role,
30
+ kind: row.kind,
31
+ snippet,
32
+ matchStart: matchStart < 0 ? head.length : matchStart,
33
+ // A defensive fallback must not mark arbitrary snippet text as the hit.
34
+ matchLength: matchStart < 0 ? 0 : folded.length,
35
+ ...row.from_name ? { from: row.from_name } : {}
36
+ };
37
+ });
38
+ }
39
+
40
+ // server/message-search.worker.ts
41
+ parentPort.on("message", (request) => {
42
+ let db;
43
+ try {
44
+ db = new DatabaseSync(workerData.file, { readOnly: true });
45
+ const hits = searchMessagesInDatabase(db, request.query, request.limit, request.threadId);
46
+ parentPort.postMessage({ id: request.id, hits });
47
+ } catch {
48
+ parentPort.postMessage({ id: request.id, failed: true });
49
+ } finally {
50
+ db?.close();
51
+ }
52
+ });