agentbox-app 0.1.11 → 0.1.13

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 (239) hide show
  1. package/README.md +24 -16
  2. package/bin/agentbox.mjs +18 -9
  3. package/briefs/message-rules.md +15 -4
  4. package/main/account-tooling.mjs +2 -1
  5. package/main/acp.mjs +296 -0
  6. package/main/agent-homes.mjs +158 -0
  7. package/main/agent-sessions.mjs +57 -20
  8. package/main/agent-updates.mjs +9 -20
  9. package/main/analytics.mjs +30 -0
  10. package/main/approvals.mjs +14 -5
  11. package/main/claude-bin.mjs +45 -310
  12. package/main/claude-input.mjs +9 -3
  13. package/main/claude-launch-env.mjs +54 -0
  14. package/main/claude-models.mjs +39 -7
  15. package/main/claude-plan.mjs +14 -2
  16. package/main/claude-usage.mjs +82 -25
  17. package/main/codex-bin.mjs +51 -248
  18. package/main/codex-launch-env.mjs +31 -0
  19. package/main/codex-session.mjs +38 -3
  20. package/main/codex-threads.mjs +41 -8
  21. package/main/codex-watch.mjs +67 -3
  22. package/main/config.mjs +40 -13
  23. package/main/corner-tag.mjs +489 -0
  24. package/main/crash-report.mjs +26 -3
  25. package/main/demo.mjs +17 -14
  26. package/main/engine-bin.mjs +595 -0
  27. package/main/engine-setup.mjs +27 -27
  28. package/main/feedback.mjs +11 -6
  29. package/main/fresh-user.mjs +1 -1
  30. package/main/git-change.mjs +8 -2
  31. package/main/harnesses/claude-stream.mjs +208 -0
  32. package/main/harnesses/claude.mjs +84 -0
  33. package/main/harnesses/codex.mjs +65 -0
  34. package/main/harnesses/common.mjs +78 -0
  35. package/main/harnesses/instructions-file.mjs +116 -0
  36. package/main/harnesses/opencode.mjs +234 -0
  37. package/main/harnesses.mjs +65 -0
  38. package/main/importable-threads.mjs +38 -0
  39. package/main/instruction-settings.mjs +47 -11
  40. package/main/ipc.mjs +175 -22
  41. package/main/local-app-frames.mjs +82 -0
  42. package/main/machine.mjs +1 -1
  43. package/main/main.mjs +120 -5
  44. package/main/memory-gate-history.mjs +51 -12
  45. package/main/memory-gate-server.mjs +67 -11
  46. package/main/memory-gate.mjs +49 -8
  47. package/main/memory-log.mjs +124 -0
  48. package/main/notify.mjs +48 -5
  49. package/main/opencode-server.mjs +271 -0
  50. package/main/opencode.mjs +287 -0
  51. package/main/phone-link.mjs +551 -0
  52. package/main/refresh-agent-models.mjs +2 -1
  53. package/main/relay-address.mjs +28 -0
  54. package/main/relay-client.mjs +246 -0
  55. package/main/row-label.mjs +8 -7
  56. package/main/runs-on.mjs +90 -0
  57. package/main/serve.mjs +124 -10
  58. package/main/settings.mjs +171 -11
  59. package/main/shell-path.mjs +86 -0
  60. package/main/ship-queue.mjs +25 -7
  61. package/main/sign-in-files.mjs +3 -7
  62. package/main/source-updater.mjs +27 -1
  63. package/main/start-hold.mjs +73 -0
  64. package/main/store/home.mjs +37 -5
  65. package/main/store/project.mjs +15 -19
  66. package/main/store.mjs +10 -4
  67. package/main/supervisor.mjs +1030 -447
  68. package/main/task-commands.mjs +13 -17
  69. package/main/task-folders-offthread.mjs +6 -1
  70. package/main/task-folders.mjs +491 -82
  71. package/main/task-terminals.mjs +49 -8
  72. package/main/team/index.mjs +2 -2
  73. package/main/team/projects.mjs +1 -1
  74. package/main/updater.mjs +71 -9
  75. package/main/worktree-include.mjs +494 -0
  76. package/mcp/core/page.mjs +1 -1
  77. package/mcp/core/work.mjs +34 -3
  78. package/mcp/tools.mjs +2 -1
  79. package/package.json +10 -1
  80. package/renderer/dist/assets/abnfDiagram-YUKMZFIV-DPPuMWt-.js +1 -0
  81. package/renderer/dist/assets/arc-HmFfdseH.js +1 -0
  82. package/renderer/dist/assets/architectureDiagram-47P4ROYG-DxJ3zHrH.js +36 -0
  83. package/renderer/dist/assets/blockDiagram-E7TT5TSB-CbTXzOqQ.js +140 -0
  84. package/renderer/dist/assets/c4Diagram-CRA5TL53-X5ItFyLn.js +38 -0
  85. package/renderer/dist/assets/channel-BlT2g9Sz.js +1 -0
  86. package/renderer/dist/assets/chunk-2Q5K7J3B-DC12Ho_L.js +1 -0
  87. package/renderer/dist/assets/chunk-5VM5RSS4-ClVtfPd0.js +15 -0
  88. package/renderer/dist/assets/chunk-7TKQ45FW-DgcOm0HT.js +1 -0
  89. package/renderer/dist/assets/chunk-AW2ZBBNX-C01s4yoF.js +88 -0
  90. package/renderer/dist/assets/chunk-FVRAUYC3-Bj0zxhR4.js +2 -0
  91. package/renderer/dist/assets/chunk-HTAEGDNF-DWDeEhLU.js +1 -0
  92. package/renderer/dist/assets/chunk-JWPE2WC7-Dsqwv3eW.js +1 -0
  93. package/renderer/dist/assets/chunk-KQW6MTUR-CE86ANL2.js +1 -0
  94. package/renderer/dist/assets/chunk-XXDRQBXY-CoNTASfs.js +1 -0
  95. package/renderer/dist/assets/classDiagram-v2-K4WV4PDN-2wprLqtw.js +217 -0
  96. package/renderer/dist/assets/cornerTag-BLrxiDE5.css +1 -0
  97. package/renderer/dist/assets/cornerTag-BOT6u3Tn.js +1 -0
  98. package/renderer/dist/assets/cose-bilkent-JH36ORCC-enqMiYbn.js +1 -0
  99. package/renderer/dist/assets/cynefin-EF2NZ3EQ-DHngLxvQ.js +141 -0
  100. package/renderer/dist/assets/cynefinDiagram-3GCD6N5R-C0rZZIl3.js +62 -0
  101. package/renderer/dist/assets/cytoscape.esm-C5JX3QLV.js +331 -0
  102. package/renderer/dist/assets/dagre-W4DXFKR2-DQnaEWO7.js +4 -0
  103. package/renderer/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  104. package/renderer/dist/assets/diagram-2UJZ2QOL-CS8AlGPx.js +200 -0
  105. package/renderer/dist/assets/diagram-OVF4WLC6-yiDMHIkY.js +24 -0
  106. package/renderer/dist/assets/diagram-PFPMY2P6-XbQKzbBA.js +30 -0
  107. package/renderer/dist/assets/diagram-UMYRVEAY-dhVvlfl_.js +24 -0
  108. package/renderer/dist/assets/diagram-YEKJPTXX-DZHe8SCf.js +41 -0
  109. package/renderer/dist/assets/diagram-ZIFT7M5P-B5h6aXVR.js +3 -0
  110. package/renderer/dist/assets/ebnfDiagram-VR2GEFS7-PR9ScDco.js +1 -0
  111. package/renderer/dist/assets/elk-IJKZMXRS-Cg-yQXPd.js +27 -0
  112. package/renderer/dist/assets/erDiagram-O2IAPWRE-omOrJMxu.js +99 -0
  113. package/renderer/dist/assets/flowDiagram-OXPTDLAJ-aOX2hzvT.js +213 -0
  114. package/renderer/dist/assets/ganttDiagram-R7TSEDQI-B1H3pWyI.js +292 -0
  115. package/renderer/dist/assets/gitGraphDiagram-XJZIOB7I-Cvw304HC.js +106 -0
  116. package/renderer/dist/assets/graph-DGbsTEsI.js +1 -0
  117. package/renderer/dist/assets/infoDiagram-5W2HQ5XZ-_ZXcNViH.js +2 -0
  118. package/renderer/dist/assets/init-Gi6I4Gst.js +1 -0
  119. package/renderer/dist/assets/ishikawaDiagram-K3B6WC7H-C7Mx_qQk.js +70 -0
  120. package/renderer/dist/assets/journeyDiagram-COXZFDF6-fr62QoAt.js +139 -0
  121. package/renderer/dist/assets/kanban-definition-P3RFRI5V-J8zsabCe.js +89 -0
  122. package/renderer/dist/assets/katex-C5jXJg4s.js +257 -0
  123. package/renderer/dist/assets/linear-BmNdEtIi.js +1 -0
  124. package/renderer/dist/assets/main-ChNdnUvt.js +1132 -0
  125. package/renderer/dist/assets/main-nj0QR5kg.css +32 -0
  126. package/renderer/dist/assets/mermaid.core-CnYzvFkz.js +314 -0
  127. package/renderer/dist/assets/mindmap-definition-LZFPQGKD-Bfcxc7PM.js +96 -0
  128. package/renderer/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  129. package/renderer/dist/assets/pegDiagram-BGZESJAR-CwUJOq6X.js +1 -0
  130. package/renderer/dist/assets/pieDiagram-CAPJLFHJ-BrwMmqfC.js +39 -0
  131. package/renderer/dist/assets/product-name-CTKLYNWY.js +40 -0
  132. package/renderer/dist/assets/quadrantDiagram-GDMTTRAM-BN4Stoj-.js +7 -0
  133. package/renderer/dist/assets/railroadDiagram-SM67HX2B-CPZ5bbeR.js +1 -0
  134. package/renderer/dist/assets/requirementDiagram-X7JNWC4A-CgRnimVe.js +84 -0
  135. package/renderer/dist/assets/sankeyDiagram-UM26HJRW-Bt2rej__.js +40 -0
  136. package/renderer/dist/assets/sequenceDiagram-ZO4K6R2Y-Dd5nKe9G.js +169 -0
  137. package/renderer/dist/assets/sizeCapture-INFHLROL-usyNyXyh.js +1 -0
  138. package/renderer/dist/assets/stateDiagram-v2-TBUQTH76-CRzUBb0u.js +291 -0
  139. package/renderer/dist/assets/swimlanes-N4OXWK64-C1GJvMS0.js +1 -0
  140. package/renderer/dist/assets/swimlanesDiagram-K3J5GTZL-Cy4Av2_p.js +8 -0
  141. package/renderer/dist/assets/timeline-definition-YOQAKGHF-caeyPlcc.js +120 -0
  142. package/renderer/dist/assets/usecaseDiagram-VIAY4XPW-BN_SV6PC.js +370 -0
  143. package/renderer/dist/assets/vennDiagram-BLWOH2XV-BLGuaUX-.js +34 -0
  144. package/renderer/dist/assets/wardleyDiagram-YMQ3BMBF-Da0cJeNc.js +78 -0
  145. package/renderer/dist/assets/xychartDiagram-TAQBALBS-cGfUffMk.js +7 -0
  146. package/renderer/dist/corner-tag.html +13 -0
  147. package/renderer/dist/emulator/audio-rules.mjs +74 -0
  148. package/renderer/dist/emulator/data/compression/README.md +11 -0
  149. package/renderer/dist/emulator/data/compression/extract7z.js +1 -0
  150. package/renderer/dist/emulator/data/compression/extractzip.js +1 -0
  151. package/renderer/dist/emulator/data/compression/libunrar.js +519 -0
  152. package/renderer/dist/emulator/data/compression/libunrar.wasm +0 -0
  153. package/renderer/dist/emulator/data/cores/README.md +22 -0
  154. package/renderer/dist/emulator/data/cores/mgba-legacy-wasm.data +0 -0
  155. package/renderer/dist/emulator/data/cores/mgba-thread-legacy-wasm.data +0 -0
  156. package/renderer/dist/emulator/data/cores/mgba-thread-wasm.data +0 -0
  157. package/renderer/dist/emulator/data/cores/mgba-wasm.data +0 -0
  158. package/renderer/dist/emulator/data/cores/package.json +65 -0
  159. package/renderer/dist/emulator/data/cores/reports/mgba.json +1 -0
  160. package/renderer/dist/emulator/data/emulator.css +1614 -0
  161. package/renderer/dist/emulator/data/loader.js +170 -0
  162. package/renderer/dist/emulator/data/localization/README.md +63 -0
  163. package/renderer/dist/emulator/data/localization/af-FR.json +339 -0
  164. package/renderer/dist/emulator/data/localization/ar-AR.json +301 -0
  165. package/renderer/dist/emulator/data/localization/ben-BEN.json +301 -0
  166. package/renderer/dist/emulator/data/localization/de-GER.json +301 -0
  167. package/renderer/dist/emulator/data/localization/el-GR.json +301 -0
  168. package/renderer/dist/emulator/data/localization/en-US.json +339 -0
  169. package/renderer/dist/emulator/data/localization/es-ES.json +310 -0
  170. package/renderer/dist/emulator/data/localization/fa-AF.json +310 -0
  171. package/renderer/dist/emulator/data/localization/hi-HI.json +301 -0
  172. package/renderer/dist/emulator/data/localization/it-IT.json +302 -0
  173. package/renderer/dist/emulator/data/localization/ja-JA.json +301 -0
  174. package/renderer/dist/emulator/data/localization/jv-JV.json +301 -0
  175. package/renderer/dist/emulator/data/localization/ko-KO.json +336 -0
  176. package/renderer/dist/emulator/data/localization/pt-BR.json +361 -0
  177. package/renderer/dist/emulator/data/localization/retroarch.json +617 -0
  178. package/renderer/dist/emulator/data/localization/ro-RO.json +310 -0
  179. package/renderer/dist/emulator/data/localization/ru-RU.json +301 -0
  180. package/renderer/dist/emulator/data/localization/tr-TR.json +310 -0
  181. package/renderer/dist/emulator/data/localization/vi-VN.json +302 -0
  182. package/renderer/dist/emulator/data/localization/zh-CN.json +351 -0
  183. package/renderer/dist/emulator/data/src/GameManager.js +464 -0
  184. package/renderer/dist/emulator/data/src/compression.js +142 -0
  185. package/renderer/dist/emulator/data/src/emulator.js +6158 -0
  186. package/renderer/dist/emulator/data/src/gamepad.js +167 -0
  187. package/renderer/dist/emulator/data/src/nipplejs.js +1 -0
  188. package/renderer/dist/emulator/data/src/shaders.js +236 -0
  189. package/renderer/dist/emulator/data/src/socket.io.min.js +7 -0
  190. package/renderer/dist/emulator/data/src/storage.js +125 -0
  191. package/renderer/dist/emulator/data/version.json +5 -0
  192. package/renderer/dist/emulator/host.js +297 -0
  193. package/renderer/dist/emulator/index.html +28 -0
  194. package/renderer/dist/emulator/provenance.json +6 -0
  195. package/renderer/dist/index.html +16 -3
  196. package/scripts/after-install.mjs +14 -0
  197. package/scripts/approval-server.sh +31 -7
  198. package/scripts/before-publish.mjs +12 -10
  199. package/shared/agent-import.mjs +3 -1
  200. package/shared/agents.d.mts +1 -0
  201. package/shared/bridge-map.mjs +19 -0
  202. package/shared/claude-commands.generated.mjs +8 -6
  203. package/shared/claude-models.generated.mjs +10 -8
  204. package/shared/codex-modes.mjs +1 -1
  205. package/shared/corner-tag.d.mts +14 -0
  206. package/shared/corner-tag.mjs +141 -0
  207. package/shared/demo-world.mjs +1 -1
  208. package/shared/engines.mjs +20 -5
  209. package/shared/fresh-user-home.mjs +12 -1
  210. package/shared/harness-definitions.mjs +103 -0
  211. package/shared/instruction-defaults.json +1 -1
  212. package/shared/notify-rules.d.mts +25 -0
  213. package/shared/notify-rules.mjs +19 -0
  214. package/shared/project-folder-check.mjs +3 -3
  215. package/shared/provider-commands.mjs +10 -2
  216. package/shared/rank.d.mts +2 -0
  217. package/shared/rank.mjs +50 -0
  218. package/shared/relay-address.mjs +6 -0
  219. package/shared/relay-crypto.mjs +165 -0
  220. package/shared/runs-on.d.mts +10 -0
  221. package/shared/runs-on.mjs +55 -0
  222. package/shared/shortcuts.mjs +11 -5
  223. package/shared/spawn-trouble.mjs +58 -7
  224. package/shared/terminal-input.d.mts +1 -0
  225. package/shared/terminal-input.mjs +30 -0
  226. package/shared/terminal-keys.d.mts +1 -0
  227. package/shared/terminal-keys.mjs +16 -0
  228. package/shared/terminal-size.d.mts +4 -0
  229. package/shared/terminal-size.mjs +29 -0
  230. package/shared/usage.d.mts +3 -0
  231. package/shared/usage.mjs +7 -0
  232. package/shared/where-it-runs-from.d.mts +43 -0
  233. package/shared/where-it-runs-from.mjs +155 -0
  234. package/shared/work-items.mjs +28 -2
  235. package/shared/work-lines.mjs +1 -1
  236. package/shared/xterm-invalid-range.d.mts +2 -0
  237. package/shared/xterm-invalid-range.mjs +58 -0
  238. package/renderer/dist/assets/index-B-2Az952.css +0 -32
  239. package/renderer/dist/assets/index-D6qncgai.js +0 -1168
@@ -15,7 +15,10 @@
15
15
  // and repeat rules all sat in it.
16
16
  //
17
17
  // So this is the same convention, one name over: a dot-folder in her home
18
- // named after this app.
18
+ // named after this app. On Linux a fresh install does not get that dot-folder,
19
+ // and it does not get a visible folder of the app's name in $HOME. Application
20
+ // data belongs in $XDG_DATA_HOME (see defaultStoreRoot). An existing dot-folder
21
+ // is still read, so a store already on disk is not orphaned.
19
22
  //
20
23
  // WHAT MOVES AND WHAT DOES NOT, because the line is not "everything of ours".
21
24
  // The app's own RECORDS move: the work item ledger, session traces, run
@@ -37,7 +40,7 @@ import fs from 'node:fs';
37
40
  import os from 'node:os';
38
41
  import path from 'node:path';
39
42
  import crypto from 'node:crypto';
40
- import { WAS, envNames, nameSlug, readEnv } from '../../shared/product-name.mjs';
43
+ import { Name, WAS, envNames, nameSlug, readEnv } from '../../shared/product-name.mjs';
41
44
 
42
45
  const isDir = (dir) => { try { return fs.statSync(dir).isDirectory(); } catch { return false; } };
43
46
 
@@ -61,6 +64,25 @@ export function storeRootEnv(storeRoot) {
61
64
  return env;
62
65
  }
63
66
 
67
+ // Where a config that names no store keeps the inbox.
68
+ //
69
+ // macOS, and anything that is not Linux: a folder of the app's name in the
70
+ // home directory. That is the folder this app has used since 2026-09-22.
71
+ // Linux: $XDG_DATA_HOME/<slug>, or ~/.local/share/<slug> when the variable is
72
+ // unset, blank, or not an absolute path. A visible directory in $HOME is not
73
+ // where an application writes. Measured 2026-10-07: a config that named no
74
+ // store created one.
75
+ //
76
+ // The home and the environment are arguments so a test can ask about another
77
+ // machine. A caller that passes a stand-in home must pass an environment that
78
+ // belongs to it. This function does not decide that; it uses the env it is given.
79
+ export function defaultStoreRoot({ home = os.homedir(), platform = process.platform, env = process.env } = {}) {
80
+ if (platform !== 'linux') return path.join(home, Name);
81
+ const given = typeof env?.XDG_DATA_HOME === 'string' ? env.XDG_DATA_HOME.trim() : '';
82
+ const base = given && path.isAbsolute(given) ? given : path.join(home, '.local', 'share');
83
+ return path.join(base, nameSlug);
84
+ }
85
+
64
86
  // One env var, for tests and for anyone who keeps their home somewhere else.
65
87
  // Read at call time rather than captured, because a test sets it per case.
66
88
  //
@@ -74,9 +96,10 @@ export function storeRootEnv(storeRoot) {
74
96
  // store goes missing on the release that renames the app.
75
97
  // `homeDir` is injected so a test can ask what this answers on a machine with
76
98
  // an old dot-folder on it, without one having to exist on the machine running
77
- // the test. Production never passes it.
78
- export function appHome(homeDir = os.homedir()) {
79
- const override = readEnv('HOME');
99
+ // the test. `platform` and `env` are the same kind of injection: this suite
100
+ // runs on a Mac and still has to answer a Linux home. Production passes neither.
101
+ export function appHome(homeDir = os.homedir(), { platform = process.platform, env } = {}) {
102
+ const override = readEnv('HOME', env);
80
103
  if (override) return override;
81
104
  const here = path.join(homeDir, `.${nameSlug}`);
82
105
  if (isDir(here)) return here;
@@ -84,6 +107,15 @@ export function appHome(homeDir = os.homedir()) {
84
107
  const older = path.join(homeDir, `.${was.toLowerCase()}`);
85
108
  if (isDir(older)) return older;
86
109
  }
110
+ // A fresh Linux directory has nothing of ours on disk yet. The answer has to
111
+ // be the same path loadConfig opens, or the desktop and this lookup write two
112
+ // stores. The machine's own XDG_DATA_HOME is an absolute path in the real
113
+ // home; applying it to a stand-in home writes that stand-in's store there.
114
+ // A caller that passes `env` is asking about that environment, not this one.
115
+ if (platform === 'linux') {
116
+ const real = env === undefined && path.resolve(homeDir) === path.resolve(os.homedir());
117
+ return defaultStoreRoot({ home: homeDir, platform: 'linux', env: real ? process.env : (env ?? {}) });
118
+ }
87
119
  return here;
88
120
  }
89
121
 
@@ -4,34 +4,30 @@
4
4
 
5
5
  import fs from 'node:fs';
6
6
  import path from 'node:path';
7
- import os from 'node:os';
8
7
  import crypto from 'node:crypto';
9
8
  import { SCHEMA_VERSION, validateCreation, creationText, TEXT_CREATION_KINDS } from '../../shared/contracts.mjs';
10
9
  import { assertInside, assertCreationDir, deniesGitOrEnvPath } from './paths.mjs';
11
10
  import { migrateIndex } from './migrate.mjs';
12
11
  import { withProjectLockSync } from './project-lock.mjs';
13
- import { Name, readEnv } from '../../shared/product-name.mjs';
14
-
15
- // The machine-wide root: ASTRAL_HOME, else the folder named below. This is
16
- // where device-local files live (settings.json, ui-state.json, usage.json,
17
- // .runtime-pids, ...) and where a founder's PRE-account projects sit until they
18
- // are migrated into an account space. It is NEVER account-scoped: those files
19
- // stay global (Phase 1).
12
+ import { readEnv } from '../../shared/product-name.mjs';
13
+ import { defaultStoreRoot } from './home.mjs';
14
+
15
+ // The machine-wide root: the store-home variable, else the same default
16
+ // loadConfig uses when a config names no store. This is where device-local
17
+ // files live (settings.json, ui-state.json, usage.json, .runtime-pids, ...)
18
+ // and where a founder's PRE-account projects sit until they are migrated into
19
+ // an account space. It is NEVER account-scoped: those files stay global
20
+ // (Phase 1).
20
21
  //
21
- // THE FALLBACK IS THE APP'S OWN NAME NOW, where it used to be an older
22
- // product's folder.
22
+ // THE FALLBACK IS defaultStoreRoot. On macOS that is a folder of the app's
23
+ // name. On Linux it is the XDG data directory. A visible folder in $HOME was
24
+ // the fallback until 2026-10-07, and a config that named no store created one.
23
25
  //
24
- // NOTHING WAS DELETED AND NOTHING MOVED. That folder is still on disk exactly
25
- // as it was. What changed is that this app stops reaching for it by default.
26
26
  // Her live store is named in zero.config.json and handed to every worker as
27
- // the app's own home variable, so this line was never the path she runs on; it
28
- // was only ever
29
- // the answer for an install carrying no config at all.
30
- //
31
- // An older product's HOME env var used to sit between these two. It is gone:
32
- // nothing sets it any more now that the store server carries the app's own name.
27
+ // the app's own home variable, so this line is only ever the answer for an
28
+ // install carrying no config and no store-home variable.
33
29
  export function legacyRoot() {
34
- return readEnv('HOME') || path.join(os.homedir(), Name);
30
+ return readEnv('HOME') || defaultStoreRoot();
35
31
  }
36
32
 
37
33
  // The account currently signed in, if any. Set once at boot and re-resolved on
package/main/store.mjs CHANGED
@@ -471,10 +471,7 @@ export class Store {
471
471
  // app restart, a reboot, and a store restored onto another machine, and so no
472
472
  // agent line can quietly move a time she set. 0 clears it.
473
473
  //
474
- // This is the one write behind both gestures: deferring an agent's proposal
475
- // out of the inbox and scheduling her own work to start at six. They were
476
- // separate mechanisms before, and only the first existed: the old snooze was
477
- // a renderer localStorage map that hid a row and deferred no work at all.
474
+ // Execution scheduling only. Inbox reminders use snoozeItem instead.
478
475
  scheduleItem(slug, id, runAt) {
479
476
  const { workItemsDisk } = this.modules;
480
477
  return workItemsDisk.updateWorkItem(
@@ -482,6 +479,15 @@ export class Store {
482
479
  );
483
480
  }
484
481
 
482
+ // Put the existing thread back in the person's inbox later. This never
483
+ // changes its execution schedule, answer, status, claim or delivery marks.
484
+ snoozeItem(slug, id, snoozedUntil) {
485
+ if (!Number.isFinite(snoozedUntil)) throw new Error('Later needs a valid time');
486
+ return this.modules.workItemsDisk.updateWorkItem(
487
+ this.productDir(slug), id, { snoozedUntil: Math.max(0, Math.trunc(snoozedUntil)) }, { source: 'founder' },
488
+ );
489
+ }
490
+
485
491
  // WHO A SHARED ROW IS WITH, changed by a person: handed to an agent, kept,
486
492
  // handed back, or passed on by a reply. Only the team fields, on the
487
493
  // person's own authority, so an agent writing afterwards cannot undo it.