agentbox-app 0.1.12 → 0.1.16

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 (370) hide show
  1. package/README.md +24 -9
  2. package/bin/agentbox.mjs +23 -1
  3. package/briefs/message-rules.md +36 -8
  4. package/briefs/worker.md +46 -23
  5. package/main/account-discovery.mjs +122 -30
  6. package/main/account-tooling.mjs +29 -1
  7. package/main/account-usage.mjs +46 -0
  8. package/main/acp.mjs +296 -0
  9. package/main/agent-homes.mjs +158 -0
  10. package/main/agent-sessions.mjs +311 -260
  11. package/main/agent-updates.mjs +9 -22
  12. package/main/agents.mjs +179 -466
  13. package/main/analytics.mjs +42 -2
  14. package/main/answer-modes.mjs +103 -37
  15. package/main/approval-prompt-core.mjs +197 -0
  16. package/main/approval-prompt-server.mjs +4 -138
  17. package/main/approvals.mjs +101 -297
  18. package/main/artifact-path.mjs +47 -18
  19. package/main/claude-bin.mjs +45 -311
  20. package/main/claude-input.mjs +57 -7
  21. package/main/claude-launch-env.mjs +54 -0
  22. package/main/claude-models.mjs +39 -7
  23. package/main/claude-plan.mjs +64 -16
  24. package/main/claude-session-open.mjs +28 -0
  25. package/main/claude-usage-process.mjs +40 -0
  26. package/main/claude-usage.mjs +94 -59
  27. package/main/cloud/account.mjs +179 -0
  28. package/main/cloud/aws.mjs +127 -0
  29. package/main/cloud/browser-return.mjs +58 -0
  30. package/main/cloud/clients.mjs +15 -0
  31. package/main/cloud/codex-cloud.mjs +53 -0
  32. package/main/cloud/config.mjs +107 -0
  33. package/main/cloud/docs.mjs +219 -0
  34. package/main/cloud/exec.mjs +27 -0
  35. package/main/cloud/host.mjs +165 -0
  36. package/main/cloud/kit.mjs +80 -0
  37. package/main/cloud/logins.mjs +543 -0
  38. package/main/cloud/managed.mjs +115 -0
  39. package/main/cloud/marker.mjs +104 -0
  40. package/main/cloud/org.mjs +53 -0
  41. package/main/cloud/reuse.mjs +208 -0
  42. package/main/cloud/run-cli.mjs +177 -0
  43. package/main/cloud/run.mjs +1934 -0
  44. package/main/cloud/usage.mjs +76 -0
  45. package/main/cloud-permission.mjs +51 -0
  46. package/main/codex-account.mjs +78 -0
  47. package/main/codex-app-server.mjs +276 -409
  48. package/main/codex-approvals.mjs +148 -433
  49. package/main/codex-bin.mjs +51 -249
  50. package/main/codex-models.mjs +20 -2
  51. package/main/codex-session.mjs +246 -506
  52. package/main/codex-threads-worker.mjs +12 -0
  53. package/main/codex-threads.mjs +112 -11
  54. package/main/codex-usage-file.mjs +5 -3
  55. package/main/codex-usage.mjs +56 -7
  56. package/main/codex-watch.mjs +83 -5
  57. package/main/codex.mjs +95 -363
  58. package/main/config.mjs +37 -5
  59. package/main/corner-tag.mjs +810 -0
  60. package/main/crash-report.mjs +26 -3
  61. package/main/dev-window.mjs +1 -1
  62. package/main/engine-bin.mjs +545 -0
  63. package/main/engine-setup.mjs +25 -24
  64. package/main/feedback.mjs +14 -31
  65. package/main/folder-pictures.mjs +2 -2
  66. package/main/freeze-recorder-thread.mjs +86 -0
  67. package/main/freeze-recorder.mjs +146 -0
  68. package/main/fresh-user.mjs +20 -9
  69. package/main/git-change-offthread.mjs +17 -3
  70. package/main/git-change-thread.mjs +5 -2
  71. package/main/harnesses/claude-stream.mjs +208 -0
  72. package/main/harnesses/claude.mjs +105 -0
  73. package/main/harnesses/codex.mjs +72 -0
  74. package/main/harnesses/common.mjs +78 -0
  75. package/main/harnesses/instructions-file.mjs +116 -0
  76. package/main/harnesses/opencode.mjs +234 -0
  77. package/main/harnesses.mjs +65 -0
  78. package/main/importable-threads.mjs +96 -0
  79. package/main/ipc.mjs +520 -135
  80. package/main/leftovers.mjs +117 -25
  81. package/main/liquid-glass.mjs +26 -0
  82. package/main/live-replies.mjs +10 -4
  83. package/main/local-app-frames.mjs +82 -0
  84. package/main/main-went-red.mjs +330 -0
  85. package/main/main.mjs +248 -37
  86. package/main/memory-gate-history.mjs +85 -20
  87. package/main/memory-gate-server.mjs +129 -11
  88. package/main/memory-gate.mjs +62 -8
  89. package/main/memory-log.mjs +124 -0
  90. package/main/menu.mjs +4 -2
  91. package/main/message-priority.mjs +2 -2
  92. package/main/mic.mjs +38 -0
  93. package/main/native/liquid-glass/build/liquid-glass.node +0 -0
  94. package/main/new-chats-watch.mjs +110 -0
  95. package/main/new-user-window.mjs +25 -0
  96. package/main/notify.mjs +64 -5
  97. package/main/opencode-server.mjs +271 -0
  98. package/main/opencode.mjs +287 -0
  99. package/main/phone-alerts.mjs +117 -0
  100. package/main/phone-inbox.mjs +625 -0
  101. package/main/phone-link.mjs +571 -0
  102. package/main/phone-uploads.mjs +476 -0
  103. package/main/picture-shape.mjs +114 -0
  104. package/main/quit-sequence.mjs +143 -0
  105. package/main/refresh-agent-models.mjs +15 -2
  106. package/main/relay-address.mjs +28 -0
  107. package/main/relay-client.mjs +314 -0
  108. package/main/repeats.mjs +10 -4
  109. package/main/row-label.mjs +18 -47
  110. package/main/run-change.mjs +13 -0
  111. package/main/run-ledger.mjs +135 -0
  112. package/main/runs-on.mjs +32 -35
  113. package/main/save-attachments.mjs +41 -0
  114. package/main/serve.mjs +155 -9
  115. package/main/settings.mjs +364 -50
  116. package/main/shell-path.mjs +234 -0
  117. package/main/ship-conflict-brief.mjs +119 -0
  118. package/main/ship-queue.mjs +134 -20
  119. package/main/sign-in-files.mjs +3 -7
  120. package/main/source-updater.mjs +45 -11
  121. package/main/stage-attachment.mjs +68 -0
  122. package/main/stall-watch.mjs +50 -0
  123. package/main/start-hold.mjs +73 -0
  124. package/main/store/home.mjs +87 -232
  125. package/main/store/paths.mjs +11 -0
  126. package/main/store/teammates-files.mjs +99 -0
  127. package/main/store/work-items.mjs +231 -13
  128. package/main/store.mjs +227 -53
  129. package/main/supervisor.mjs +3865 -699
  130. package/main/task-commands.mjs +13 -17
  131. package/main/task-folders-offthread.mjs +6 -1
  132. package/main/task-folders.mjs +897 -105
  133. package/main/task-terminals.mjs +147 -41
  134. package/main/team/index.mjs +114 -10
  135. package/main/team/memory-cloud.mjs +183 -1
  136. package/main/team/room-hours.mjs +48 -0
  137. package/main/team/room-setup.mjs +31 -0
  138. package/main/team/rooms-memory.mjs +454 -0
  139. package/main/team/rooms-shape.mjs +42 -0
  140. package/main/team/rooms-supabase.mjs +324 -0
  141. package/main/team/rooms.mjs +575 -0
  142. package/main/team/session.mjs +96 -26
  143. package/main/team/supabase-backend.mjs +180 -0
  144. package/main/team/sync.mjs +109 -1
  145. package/main/teammates.mjs +580 -0
  146. package/main/terminal-host.mjs +143 -0
  147. package/main/terminal-hosts.mjs +261 -0
  148. package/main/transcript-search.mjs +80 -0
  149. package/main/updater.mjs +71 -9
  150. package/main/webview-guard.mjs +45 -0
  151. package/main/worktree-include.mjs +365 -0
  152. package/mcp/core/documents.mjs +3 -1
  153. package/mcp/core/repeats.mjs +88 -0
  154. package/mcp/core/teammates.mjs +222 -0
  155. package/mcp/core/work.mjs +76 -4
  156. package/mcp/stdio.mjs +24 -11
  157. package/mcp/tools.mjs +116 -8
  158. package/package.json +30 -5
  159. package/renderer/dist/assets/abnfDiagram-YUKMZFIV-CoWB6YUK.js +1 -0
  160. package/renderer/dist/assets/arc-Ch0NrCul.js +1 -0
  161. package/renderer/dist/assets/architectureDiagram-47P4ROYG-CXz9M5tQ.js +36 -0
  162. package/renderer/dist/assets/blockDiagram-E7TT5TSB-DchGUuHH.js +140 -0
  163. package/renderer/dist/assets/c4Diagram-CRA5TL53-Cip-zNyr.js +38 -0
  164. package/renderer/dist/assets/channel-BQuQSL--.js +1 -0
  165. package/renderer/dist/assets/chunk-2Q5K7J3B-BoXid_2r.js +1 -0
  166. package/renderer/dist/assets/chunk-5VM5RSS4-Cpez1rRz.js +15 -0
  167. package/renderer/dist/assets/chunk-7TKQ45FW-DKA84YkE.js +1 -0
  168. package/renderer/dist/assets/chunk-AW2ZBBNX-Dg-SumPG.js +88 -0
  169. package/renderer/dist/assets/chunk-FVRAUYC3-06TCvPm1.js +2 -0
  170. package/renderer/dist/assets/chunk-HTAEGDNF-CMEBy1Td.js +1 -0
  171. package/renderer/dist/assets/chunk-JWPE2WC7-BJ2ObmV-.js +1 -0
  172. package/renderer/dist/assets/chunk-KQW6MTUR-CGWOYXUE.js +1 -0
  173. package/renderer/dist/assets/chunk-XXDRQBXY-CiZp07XC.js +1 -0
  174. package/renderer/dist/assets/classDiagram-v2-K4WV4PDN-DJNIX719.js +217 -0
  175. package/renderer/dist/assets/cornerTag-CPgvu-q3.js +1 -0
  176. package/renderer/dist/assets/cornerTag-oMfEjzCO.css +1 -0
  177. package/renderer/dist/assets/cose-bilkent-JH36ORCC-CbkyZOUH.js +1 -0
  178. package/renderer/dist/assets/cynefin-EF2NZ3EQ-78iOroZO.js +141 -0
  179. package/renderer/dist/assets/cynefinDiagram-3GCD6N5R-GcCopMs7.js +62 -0
  180. package/renderer/dist/assets/cytoscape.esm-C5JX3QLV.js +331 -0
  181. package/renderer/dist/assets/dagre-W4DXFKR2-DHLlXLkz.js +4 -0
  182. package/renderer/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  183. package/renderer/dist/assets/diagram-2UJZ2QOL-DuZSUHcH.js +200 -0
  184. package/renderer/dist/assets/diagram-OVF4WLC6-Ckxu3cqH.js +24 -0
  185. package/renderer/dist/assets/diagram-PFPMY2P6-CsTw9Ycn.js +30 -0
  186. package/renderer/dist/assets/diagram-UMYRVEAY-CTXd8qVg.js +24 -0
  187. package/renderer/dist/assets/diagram-YEKJPTXX-CJs1T_9m.js +41 -0
  188. package/renderer/dist/assets/diagram-ZIFT7M5P-CvjI23mf.js +3 -0
  189. package/renderer/dist/assets/ebnfDiagram-VR2GEFS7-d_IeAzOJ.js +1 -0
  190. package/renderer/dist/assets/elk-IJKZMXRS-zo9KFP3N.js +27 -0
  191. package/renderer/dist/assets/erDiagram-O2IAPWRE-DqfYf5Dt.js +99 -0
  192. package/renderer/dist/assets/flowDiagram-OXPTDLAJ-DAWsMLmo.js +213 -0
  193. package/renderer/dist/assets/ganttDiagram-R7TSEDQI-4ml_bhwR.js +292 -0
  194. package/renderer/dist/assets/gitGraphDiagram-XJZIOB7I-B_WcqSId.js +106 -0
  195. package/renderer/dist/assets/graph-DGbsTEsI.js +1 -0
  196. package/renderer/dist/assets/infoDiagram-5W2HQ5XZ-CI-jYqzc.js +2 -0
  197. package/renderer/dist/assets/init-Gi6I4Gst.js +1 -0
  198. package/renderer/dist/assets/ishikawaDiagram-K3B6WC7H-B56VWRlV.js +70 -0
  199. package/renderer/dist/assets/journeyDiagram-COXZFDF6-D1-p09Lr.js +139 -0
  200. package/renderer/dist/assets/kanban-definition-P3RFRI5V-Cv3w7JoN.js +89 -0
  201. package/renderer/dist/assets/katex-C5jXJg4s.js +257 -0
  202. package/renderer/dist/assets/linear-C35V2Spi.js +1 -0
  203. package/renderer/dist/assets/main-BcoBiGwv.css +32 -0
  204. package/renderer/dist/assets/main-CLnIOulD.js +1191 -0
  205. package/renderer/dist/assets/mermaid.core-BzGT5Vo9.js +314 -0
  206. package/renderer/dist/assets/mindmap-definition-LZFPQGKD-BZUfuymC.js +96 -0
  207. package/renderer/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  208. package/renderer/dist/assets/pegDiagram-BGZESJAR-DFh9XNGe.js +1 -0
  209. package/renderer/dist/assets/pieDiagram-CAPJLFHJ-C65tPVsy.js +39 -0
  210. package/renderer/dist/assets/product-name-CSNW6d7s.js +40 -0
  211. package/renderer/dist/assets/quadrantDiagram-GDMTTRAM-Cushj_nk.js +7 -0
  212. package/renderer/dist/assets/railroadDiagram-SM67HX2B-DZGebGx5.js +1 -0
  213. package/renderer/dist/assets/requirementDiagram-X7JNWC4A-DpAB0MNo.js +84 -0
  214. package/renderer/dist/assets/sankeyDiagram-UM26HJRW-D-29rHra.js +40 -0
  215. package/renderer/dist/assets/sequenceDiagram-ZO4K6R2Y-FfOQAZol.js +169 -0
  216. package/renderer/dist/assets/sizeCapture-INFHLROL-C_n6fDBY.js +1 -0
  217. package/renderer/dist/assets/stateDiagram-v2-TBUQTH76-BZjenzJG.js +291 -0
  218. package/renderer/dist/assets/swimlanes-N4OXWK64-DxaMU9vX.js +1 -0
  219. package/renderer/dist/assets/swimlanesDiagram-K3J5GTZL-Cb2kM6rr.js +8 -0
  220. package/renderer/dist/assets/timeline-definition-YOQAKGHF-DTg5HJKz.js +120 -0
  221. package/renderer/dist/assets/usecaseDiagram-VIAY4XPW-Bc3MZDsl.js +370 -0
  222. package/renderer/dist/assets/vennDiagram-BLWOH2XV-GIVGk9Id.js +34 -0
  223. package/renderer/dist/assets/wardleyDiagram-YMQ3BMBF-NmJnbQOg.js +78 -0
  224. package/renderer/dist/assets/xychartDiagram-TAQBALBS-p-kfGfnW.js +7 -0
  225. package/renderer/dist/corner-tag.html +13 -0
  226. package/renderer/dist/emulator/audio-rules.mjs +74 -0
  227. package/renderer/dist/emulator/data/compression/README.md +11 -0
  228. package/renderer/dist/emulator/data/compression/extract7z.js +1 -0
  229. package/renderer/dist/emulator/data/compression/extractzip.js +1 -0
  230. package/renderer/dist/emulator/data/compression/libunrar.js +519 -0
  231. package/renderer/dist/emulator/data/compression/libunrar.wasm +0 -0
  232. package/renderer/dist/emulator/data/cores/README.md +22 -0
  233. package/renderer/dist/emulator/data/cores/mgba-legacy-wasm.data +0 -0
  234. package/renderer/dist/emulator/data/cores/mgba-thread-legacy-wasm.data +0 -0
  235. package/renderer/dist/emulator/data/cores/mgba-thread-wasm.data +0 -0
  236. package/renderer/dist/emulator/data/cores/mgba-wasm.data +0 -0
  237. package/renderer/dist/emulator/data/cores/package.json +65 -0
  238. package/renderer/dist/emulator/data/cores/reports/mgba.json +1 -0
  239. package/renderer/dist/emulator/data/emulator.css +1614 -0
  240. package/renderer/dist/emulator/data/loader.js +170 -0
  241. package/renderer/dist/emulator/data/localization/README.md +63 -0
  242. package/renderer/dist/emulator/data/localization/af-FR.json +339 -0
  243. package/renderer/dist/emulator/data/localization/ar-AR.json +301 -0
  244. package/renderer/dist/emulator/data/localization/ben-BEN.json +301 -0
  245. package/renderer/dist/emulator/data/localization/de-GER.json +301 -0
  246. package/renderer/dist/emulator/data/localization/el-GR.json +301 -0
  247. package/renderer/dist/emulator/data/localization/en-US.json +339 -0
  248. package/renderer/dist/emulator/data/localization/es-ES.json +310 -0
  249. package/renderer/dist/emulator/data/localization/fa-AF.json +310 -0
  250. package/renderer/dist/emulator/data/localization/hi-HI.json +301 -0
  251. package/renderer/dist/emulator/data/localization/it-IT.json +302 -0
  252. package/renderer/dist/emulator/data/localization/ja-JA.json +301 -0
  253. package/renderer/dist/emulator/data/localization/jv-JV.json +301 -0
  254. package/renderer/dist/emulator/data/localization/ko-KO.json +336 -0
  255. package/renderer/dist/emulator/data/localization/pt-BR.json +361 -0
  256. package/renderer/dist/emulator/data/localization/retroarch.json +617 -0
  257. package/renderer/dist/emulator/data/localization/ro-RO.json +310 -0
  258. package/renderer/dist/emulator/data/localization/ru-RU.json +301 -0
  259. package/renderer/dist/emulator/data/localization/tr-TR.json +310 -0
  260. package/renderer/dist/emulator/data/localization/vi-VN.json +302 -0
  261. package/renderer/dist/emulator/data/localization/zh-CN.json +351 -0
  262. package/renderer/dist/emulator/data/src/GameManager.js +464 -0
  263. package/renderer/dist/emulator/data/src/compression.js +142 -0
  264. package/renderer/dist/emulator/data/src/emulator.js +6158 -0
  265. package/renderer/dist/emulator/data/src/gamepad.js +167 -0
  266. package/renderer/dist/emulator/data/src/nipplejs.js +1 -0
  267. package/renderer/dist/emulator/data/src/shaders.js +236 -0
  268. package/renderer/dist/emulator/data/src/socket.io.min.js +7 -0
  269. package/renderer/dist/emulator/data/src/storage.js +125 -0
  270. package/renderer/dist/emulator/data/version.json +5 -0
  271. package/renderer/dist/emulator/host.js +297 -0
  272. package/renderer/dist/emulator/index.html +28 -0
  273. package/renderer/dist/emulator/provenance.json +6 -0
  274. package/renderer/dist/index.html +16 -3
  275. package/scripts/after-install.mjs +30 -8
  276. package/scripts/approval-server.sh +24 -5
  277. package/scripts/before-publish.mjs +12 -10
  278. package/scripts/cloud-shim.pl +57 -0
  279. package/shared/account-names.d.mts +6 -0
  280. package/shared/account-names.mjs +15 -0
  281. package/shared/agent-hours.mjs +136 -0
  282. package/shared/agent-import.mjs +62 -34
  283. package/shared/agents.d.mts +1 -0
  284. package/shared/agents.mjs +126 -522
  285. package/shared/analytics-events.mjs +12 -0
  286. package/shared/approval-card.mjs +36 -0
  287. package/shared/bridge-map.mjs +45 -1
  288. package/shared/claude-code-shape.mjs +6 -0
  289. package/shared/claude-commands.generated.mjs +6 -4
  290. package/shared/claude-models.generated.mjs +6 -4
  291. package/shared/claude-usage.d.mts +1 -0
  292. package/shared/claude-usage.mjs +42 -1
  293. package/shared/cloud-hand-back.d.mts +7 -0
  294. package/shared/cloud-hand-back.mjs +20 -0
  295. package/shared/cloud-kit.d.mts +219 -0
  296. package/shared/cloud-kit.mjs +341 -0
  297. package/shared/cloud-login-name.mjs +4 -0
  298. package/shared/cloud-start.mjs +17 -0
  299. package/shared/cloud-versions.mjs +23 -0
  300. package/shared/codex-import.mjs +2 -2
  301. package/shared/codex-modes.d.mts +22 -9
  302. package/shared/codex-modes.mjs +67 -11
  303. package/shared/codex-usage.mjs +108 -2
  304. package/shared/corner-tag.d.mts +36 -0
  305. package/shared/corner-tag.mjs +396 -0
  306. package/shared/dead-run-trace.mjs +19 -2
  307. package/shared/engines.mjs +76 -300
  308. package/shared/feedback.d.mts +7 -0
  309. package/shared/feedback.mjs +25 -0
  310. package/shared/first-run-practice.mjs +17 -24
  311. package/shared/harness-definitions.mjs +111 -0
  312. package/shared/instruction-defaults.json +2 -2
  313. package/shared/key-caps.d.mts +14 -0
  314. package/shared/key-caps.mjs +68 -0
  315. package/shared/message-edits.d.mts +7 -0
  316. package/shared/message-edits.mjs +35 -0
  317. package/shared/move-thread.d.mts +24 -0
  318. package/shared/move-thread.mjs +112 -0
  319. package/shared/named-threads.mjs +72 -0
  320. package/shared/not-shipped.d.mts +22 -0
  321. package/shared/not-shipped.mjs +89 -0
  322. package/shared/notify-rules.d.mts +31 -0
  323. package/shared/notify-rules.mjs +55 -8
  324. package/shared/phone-files.mjs +28 -0
  325. package/shared/phone-settings.mjs +118 -0
  326. package/shared/phone-snapshot.d.mts +16 -0
  327. package/shared/phone-snapshot.mjs +348 -0
  328. package/shared/picture-formats.d.mts +1 -0
  329. package/shared/picture-formats.mjs +13 -0
  330. package/shared/provider-commands.mjs +10 -2
  331. package/shared/rank.d.mts +4 -1
  332. package/shared/rank.mjs +82 -19
  333. package/shared/relay-address.mjs +6 -0
  334. package/shared/relay-crypto.mjs +165 -0
  335. package/shared/repeats.d.mts +8 -0
  336. package/shared/repeats.mjs +33 -2
  337. package/shared/room-cards.mjs +167 -0
  338. package/shared/room-links.d.mts +4 -0
  339. package/shared/room-links.mjs +21 -0
  340. package/shared/runs-on.d.mts +3 -13
  341. package/shared/runs-on.mjs +31 -52
  342. package/shared/shipped-note.d.mts +4 -0
  343. package/shared/shipped-note.mjs +6 -0
  344. package/shared/shortcuts.mjs +24 -10
  345. package/shared/spawn-trouble.d.mts +4 -0
  346. package/shared/spawn-trouble.mjs +484 -30
  347. package/shared/team-rules.mjs +9 -2
  348. package/shared/teammates.d.mts +19 -0
  349. package/shared/teammates.mjs +756 -0
  350. package/shared/terminal-focus.d.mts +1 -0
  351. package/shared/terminal-focus.mjs +13 -0
  352. package/shared/terminal-input.d.mts +1 -0
  353. package/shared/terminal-input.mjs +30 -0
  354. package/shared/terminal-keys.d.mts +1 -0
  355. package/shared/terminal-keys.mjs +16 -0
  356. package/shared/terminal-size.d.mts +4 -0
  357. package/shared/terminal-size.mjs +29 -0
  358. package/shared/thread-cards.mjs +4 -1
  359. package/shared/usage.d.mts +12 -0
  360. package/shared/usage.mjs +56 -3
  361. package/shared/websites.d.mts +15 -0
  362. package/shared/websites.mjs +61 -0
  363. package/shared/where-it-runs-from.d.mts +43 -0
  364. package/shared/where-it-runs-from.mjs +155 -0
  365. package/shared/work-items.mjs +150 -29
  366. package/shared/work-lines.mjs +93 -245
  367. package/shared/xterm-invalid-range.d.mts +2 -0
  368. package/shared/xterm-invalid-range.mjs +58 -0
  369. package/renderer/dist/assets/index-ChKsQkRw.js +0 -1169
  370. package/renderer/dist/assets/index-ClBXnq3B.css +0 -32
@@ -33,6 +33,7 @@
33
33
  import { execFile, execFileSync, spawn } from 'node:child_process';
34
34
  import fs from 'node:fs';
35
35
  import { describe } from './updater.mjs';
36
+ import { loginShell } from './shell-path.mjs';
36
37
 
37
38
  const FIRST_CHECK_MS = 20_000;
38
39
  const EVERY_MS = 30 * 60 * 1000;
@@ -55,7 +56,13 @@ const SAY = {
55
56
  // on this Mac, and the restart below runs that build. Counted as her changes,
56
57
  // they made every update after the first say "changes of your own" for good
57
58
  // (tests/a-build-does-not-stop-the-next-update.test.mjs).
58
- const isBuildOutput = (file) => /^shared\/[^/]+\.generated\.[cm]?[jt]s$/.test(file);
59
+ //
60
+ // THE LOCKFILE IS NPM'S, TOO (2026-10-07). The restart's `npm install` rewrote
61
+ // package-lock.json (this npm drops its `libc` lines), and the card never came
62
+ // back while main ran 21 commits ahead. An edit to the dependencies themselves
63
+ // is in package.json, which still blocks
64
+ // (tests/a-package-install-does-not-stop-the-next-update.test.mjs).
65
+ const isBuildOutput = (file) => file === 'package-lock.json' || /^shared\/[^/]+\.generated\.[cm]?[jt]s$/.test(file);
59
66
  // The status code is one or two letters and `gitIn` trims the output, which
60
67
  // takes the leading space off the first line, so it is matched, not sliced.
61
68
  const changedPaths = (porcelain) => String(porcelain ?? '').split('\n').filter(Boolean).map((l) => l.replace(/^[ MADRCUT?!]{1,2} /, '').replace(/^"|"$/g, ''));
@@ -97,19 +104,26 @@ function collect(bin, args, { cwd, timeout }) {
97
104
 
98
105
  // WHICH npm. Started with `npm start`, the process carries npm's own path in
99
106
  // its environment, so that one is used and nvm or a version manager never
100
- // matters. Started any other way, her login shell is asked, the way
101
- // main/claude-bin.mjs finds Claude Code. The arguments are fixed strings from
102
- // this file, never anything read from disk.
107
+ // matters. Started any other way, their login shell is asked, the way
108
+ // main/claude-bin.mjs finds Claude Code, and only a shell this machine has: a
109
+ // Linux launcher start carries no SHELL, so the old `|| '/bin/zsh'` was a path
110
+ // to nothing and every update on a box without zsh failed in two seconds. With
111
+ // no shell at all, npm on PATH is the better guess. The arguments are fixed
112
+ // strings from this file, never anything read from disk.
113
+ export function npmCommand(args, { env = process.env, exists = fs.existsSync } = {}) {
114
+ const node = env.npm_node_execpath;
115
+ const cli = env.npm_execpath;
116
+ if (node && cli && exists(node) && exists(cli)) return [node, [cli, ...args]];
117
+ const shell = loginShell(env, exists);
118
+ if (!exists(shell)) return ['npm', args];
119
+ return [shell, ['-lic', `npm ${args.join(' ')}`]];
120
+ }
121
+
103
122
  export function defaultNpm(appDir, env = process.env) {
104
123
  return (args) => {
105
124
  const timeout = args[0] === 'install' ? INSTALL_MS : BUILD_MS;
106
- const node = env.npm_node_execpath;
107
- const cli = env.npm_execpath;
108
- if (node && cli && fs.existsSync(node) && fs.existsSync(cli)) {
109
- return collect(node, [cli, ...args], { cwd: appDir, timeout });
110
- }
111
- const shell = env.SHELL || '/bin/zsh';
112
- return collect(shell, ['-lic', `npm ${args.join(' ')}`], { cwd: appDir, timeout });
125
+ const [bin, argv] = npmCommand(args, { env });
126
+ return collect(bin, argv, { cwd: appDir, timeout });
113
127
  };
114
128
  }
115
129
 
@@ -128,6 +142,18 @@ export function createSourceUpdater({
128
142
  log = console,
129
143
  onChanged = () => {},
130
144
  npm = defaultNpm(appDir),
145
+ // THE STEP `npm start` DOES AND THIS DID NOT. A from-source run gets its
146
+ // name, icon and bundle id from scripts/brand-electron.mjs, which npm runs
147
+ // before Electron. An update does not go through npm: it builds and calls
148
+ // app.relaunch(), which re-executes the same binary. So the branding had
149
+ // never once run on a self-restart, and a fix to it could sit on disk for
150
+ // days without reaching the bundle (measured 2026-10-09, with the
151
+ // Info.plist four days older than the fix meant to change it).
152
+ // Imported here and not at the top of the file: scripts/ is deliberately not
153
+ // in the downloadable build (`build.files`, and a test holds it there), and
154
+ // a static import would stop that build booting at all. This path only ever
155
+ // runs from source, where the script is on disk.
156
+ brand = async () => (await import('../scripts/brand-electron.mjs')).brandElectron(),
131
157
  relaunch = () => { app?.relaunch(); app?.quit(); },
132
158
  } = {}) {
133
159
  const git = gitIn(appDir);
@@ -251,12 +277,20 @@ export function createSourceUpdater({
251
277
  set({ phase: 'ready', error: `The new packages would not install: ${failureLine(installed.out)}` });
252
278
  return;
253
279
  }
280
+ // What the install rewrote goes back, so the folder is left as main has
281
+ // it and anything else that fast-forwards it cannot trip on the file.
282
+ await git(['checkout', '--', 'package-lock.json']);
254
283
  }
255
284
  const built = await npm(['run', 'build']);
256
285
  if (built.code !== 0) {
257
286
  set({ phase: 'ready', error: `The new code would not build: ${failureLine(built.out)}` });
258
287
  return;
259
288
  }
289
+ // Before the relaunch, never after: the next launch is the one that reads
290
+ // the Info.plist. And never fatally, for the reason brand-electron.mjs
291
+ // opens with about itself — an app that does not come back up is worse
292
+ // than one wearing the wrong icon.
293
+ try { await brand(); } catch (e) { log.warn?.('[source-updater] could not rebrand the bundle:', e?.message ?? e); }
260
294
  log.info?.('[source-updater] built', state.newVersion, '- relaunching');
261
295
  relaunch();
262
296
  }
@@ -0,0 +1,68 @@
1
+ // STAGING A FILE FOR A REPLY BOX, before it is sent: the bytes of a paste, or
2
+ // a copy of a picture dropped in, written into the account's .staging folder,
3
+ // which the window may draw from (main/ipc.mjs `zero:stage-attachment` says
4
+ // why). A picture the window cannot draw is turned into one that it can here,
5
+ // so the box, the message and the teammate all get a picture.
6
+ import { execFile } from 'node:child_process';
7
+ import fs from 'node:fs';
8
+ import path from 'node:path';
9
+ import { turnedName } from '../shared/picture-formats.mjs';
10
+
11
+ const WEEK = 7 * 24 * 60 * 60 * 1000;
12
+ const SIPS_MS = 30_000;
13
+
14
+ /**
15
+ * Answers `{ path }`, and `name` too when the file was turned into another
16
+ * format, which is the name it goes on under.
17
+ */
18
+ export async function stageAttachment(dir, { name, dataBase64, srcPath } = {}, { turn = turnIntoPicture } = {}) {
19
+ fs.mkdirSync(dir, { recursive: true });
20
+ // Sweep on the way in rather than on a timer: an abandoned paste is only
21
+ // ever discovered by the next one, and a week is longer than any draft has
22
+ // been left open. Failure to sweep must never fail the paste.
23
+ try {
24
+ const week = Date.now() - WEEK;
25
+ for (const f of fs.readdirSync(dir)) {
26
+ const p = path.join(dir, f);
27
+ try { if (fs.statSync(p).mtimeMs < week) fs.unlinkSync(p); } catch { /* leave it */ }
28
+ }
29
+ } catch { /* a sweep that cannot run is not a paste that failed */ }
30
+ const safe = String(name ?? 'pasted.png').replace(/[^\w.-]+/g, '-').slice(0, 80);
31
+ const abs = path.join(dir, `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}-${safe}`);
32
+ // A path is a drag, bytes are a paste. Already inside the folder we serve
33
+ // from is left alone: copying it would only make a second file to sweep.
34
+ if (typeof srcPath === 'string' && srcPath) {
35
+ if (path.resolve(srcPath) === path.resolve(path.join(dir, path.basename(srcPath)))) return { path: srcPath };
36
+ fs.copyFileSync(srcPath, abs);
37
+ } else {
38
+ fs.writeFileSync(abs, Buffer.from(String(dataBase64 ?? ''), 'base64'));
39
+ }
40
+ const as = turnedName(name ?? safe);
41
+ if (!as) return { path: abs };
42
+ // One that cannot be turned goes as the file it is, which is how every TIFF went before.
43
+ const drawn = await Promise.resolve().then(() => turn(abs)).catch(() => null);
44
+ if (!drawn) return { path: abs };
45
+ try { fs.unlinkSync(abs); } catch { /* swept within the week */ }
46
+ return { path: drawn, name: as };
47
+ }
48
+
49
+ /**
50
+ * Turns a TIFF or HEIC into a PNG or JPEG beside it with the Mac's own sips,
51
+ * and answers the new file's path. Null off a Mac, for any other file, or
52
+ * when sips fails or writes nothing.
53
+ */
54
+ export async function turnIntoPicture(file, { platform = process.platform, run = sips } = {}) {
55
+ const as = turnedName(path.basename(file));
56
+ if (!as || platform !== 'darwin') return null;
57
+ const out = path.join(path.dirname(file), as);
58
+ try {
59
+ await run(['-s', 'format', as.endsWith('.png') ? 'png' : 'jpeg', file, '--out', out]);
60
+ return fs.statSync(out).size > 0 ? out : null;
61
+ } catch {
62
+ return null;
63
+ }
64
+ }
65
+
66
+ const sips = (args) => new Promise((resolve, reject) => {
67
+ execFile('/usr/bin/sips', args, { timeout: SIPS_MS }, (err) => (err ? reject(err) : resolve()));
68
+ });
@@ -0,0 +1,50 @@
1
+ // WHICH REQUEST HELD THE APP. A spinning wheel on a Mac is the main process
2
+ // not answering, and nothing used to record what it was doing instead. This
3
+ // times every request the window makes and keeps the longest freeze; the
4
+ // memory log writes both into its minute line (main/memory-log.mjs).
5
+ //
6
+ // Only the synchronous part of a handler is timed. That is the part that holds
7
+ // the process: once a handler waits on a promise the window is free again.
8
+ import { monitorEventLoopDelay, performance } from 'node:perf_hooks';
9
+
10
+ export const SLOW_MS = 100;
11
+
12
+ export function stallWatch({ clock = () => performance.now(), loop = monitorEventLoopDelay({ resolution: 20 }) } = {}) {
13
+ loop.enable();
14
+ let slow = new Map();
15
+ let freezes = [];
16
+ return {
17
+ /** A freeze main/freeze-recorder.mjs caught, with the function that held it. */
18
+ noteFreeze({ ms, where }) {
19
+ freezes.push({ ms, where });
20
+ },
21
+ time(channel, fn) {
22
+ return (...args) => {
23
+ const start = clock();
24
+ try {
25
+ return fn(...args);
26
+ } finally {
27
+ const ms = Math.round(clock() - start);
28
+ if (ms >= SLOW_MS) {
29
+ const seen = slow.get(channel) ?? { channel, times: 0, maxMs: 0 };
30
+ seen.times += 1;
31
+ seen.maxMs = Math.max(seen.maxMs, ms);
32
+ slow.set(channel, seen);
33
+ }
34
+ }
35
+ };
36
+ },
37
+ /** The minute so far, and a fresh start. */
38
+ take() {
39
+ const out = {
40
+ longestStallMs: Math.round(loop.max / 1e6),
41
+ slowRequests: [...slow.values()].sort((a, b) => b.maxMs - a.maxMs).slice(0, 5),
42
+ ...(freezes.length ? { freezes: freezes.sort((a, b) => b.ms - a.ms).slice(0, 5) } : {}),
43
+ };
44
+ loop.reset();
45
+ slow = new Map();
46
+ freezes = [];
47
+ return out;
48
+ },
49
+ };
50
+ }
@@ -0,0 +1,73 @@
1
+ // NO NEW AGENT STARTS WHILE MEMORY IS SHORT (w-ec27ff1a51).
2
+ //
3
+ // 2026-10-11, a 16 GB Mac ran out of application memory with Agentbox at
4
+ // 22 GB and six agents running. The memory check (main/memory-gate.mjs) held
5
+ // tests and builds back, but nothing asked memory before STARTING an agent, so
6
+ // the fleet filled every slot it had into a Mac that was already short.
7
+ //
8
+ // So while the memory switch is on and the Mac reads tight or very short, a new
9
+ // agent waits. That is the whole rule. Everything else here is a way out of it,
10
+ // because the founder's condition was that urgent work still comes first and
11
+ // that nothing sits stuck for long on a misread:
12
+ //
13
+ // - NOTHING RUNNING, ONE STARTS. Whatever is filling memory then is not us,
14
+ // and an app with no agent running at all is broken rather than careful.
15
+ // - AN URGENT ROW, OR ONE SHE ASKED FOR BY NAME, starts while tight and waits
16
+ // only while very short: the command gate's rule for urgent commands.
17
+ // - A SWAP IS NOT A NEW AGENT. A row something was paused for (an Urgent row
18
+ // taking a lesser session's slot, or Run now) always starts, so urgent work
19
+ // still takes over while memory is very short, by replacing, not adding.
20
+ // - A READING THAT IS MISSING, UNREADABLE OR OLDER THAN A MINUTE IS NOT A
21
+ // REASON TO HOLD. The hold acts only on a reading it actually has.
22
+ // - TEN MINUTES HELD, ONE STARTS ANYWAY, and the ten minutes start again from
23
+ // it. A reading stuck on "tight" by mistake costs a slow queue, never a
24
+ // stopped one.
25
+ //
26
+ // Pure, so every one of those is a test (tests/no-new-agent-starts-while-memory-is-short).
27
+
28
+ import { execFileSync } from 'node:child_process';
29
+ import { pressureFrom } from './memory-gate.mjs';
30
+
31
+ /** One reading, synchronously, for the moment before a restart brings the
32
+ * fleet back. Nulls (so no hold) when it cannot be read. */
33
+ export function readMacPressureNow() {
34
+ let level = null;
35
+ let freePct = null;
36
+ try {
37
+ const out = execFileSync('/usr/sbin/sysctl', ['-n', 'kern.memorystatus_vm_pressure_level', 'kern.memorystatus_level'],
38
+ { timeout: 2_000, encoding: 'utf8', stdio: ['ignore', 'pipe', 'ignore'] });
39
+ [level, freePct] = out.trim().split(/\s+/).map(Number);
40
+ } catch { /* not a Mac, or sysctl did not answer */ }
41
+ return { level: Number.isFinite(level) ? level : null, freePct: Number.isFinite(freePct) ? freePct : null, at: Date.now() };
42
+ }
43
+
44
+ /** A reading older than this is not acted on. */
45
+ export const STALE_MS = 60_000;
46
+ /** The longest new work waits on memory before one agent starts anyway. */
47
+ export const MAX_HOLD_MS = 10 * 60_000;
48
+
49
+ /**
50
+ * Whether one more agent may start now, and why. `reading` is
51
+ * `{ level, freePct, at }` from `readMacPressure`, stamped when it arrived.
52
+ * `heldSince` is when the current hold began (null when nothing is held);
53
+ * `lastStartAt` is when an agent last started.
54
+ */
55
+ export function startDecision({
56
+ on, reading, now, running,
57
+ urgent = false, asked = false, swap = false,
58
+ lastStartAt = 0, heldSince = null,
59
+ staleMs = STALE_MS, maxHoldMs = MAX_HOLD_MS,
60
+ }) {
61
+ if (!on) return { start: true, why: 'off' };
62
+ if (!(running > 0)) return { start: true, why: 'nothing-running' };
63
+ if (swap) return { start: true, why: 'swap' };
64
+ const at = Number(reading?.at);
65
+ const known = reading && (Number.isFinite(reading.level) || Number.isFinite(reading.freePct));
66
+ if (!known || !Number.isFinite(at) || Math.abs(now - at) > staleMs) return { start: true, why: 'no-reading' };
67
+ const pressure = pressureFrom(reading);
68
+ if (pressure === 'normal') return { start: true, why: 'normal' };
69
+ if (pressure === 'tight' && (urgent || asked)) return { start: true, why: 'urgent' };
70
+ const waitingSince = Math.max(heldSince ?? now, Number(lastStartAt) || 0);
71
+ if (now - waitingSince >= maxHoldMs) return { start: true, why: 'overdue' };
72
+ return { start: false, why: pressure };
73
+ }