aicodeman 1.19.0 → 1.19.2

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 (97) hide show
  1. package/dist/cron/cron-service.d.ts.map +1 -1
  2. package/dist/cron/cron-service.js +10 -0
  3. package/dist/cron/cron-service.js.map +1 -1
  4. package/dist/hooks-config.d.ts +34 -1
  5. package/dist/hooks-config.d.ts.map +1 -1
  6. package/dist/hooks-config.js +62 -1
  7. package/dist/hooks-config.js.map +1 -1
  8. package/dist/plan-orchestrator.d.ts.map +1 -1
  9. package/dist/plan-orchestrator.js +8 -0
  10. package/dist/plan-orchestrator.js.map +1 -1
  11. package/dist/session.d.ts +11 -0
  12. package/dist/session.d.ts.map +1 -1
  13. package/dist/session.js +47 -10
  14. package/dist/session.js.map +1 -1
  15. package/dist/web/approval-inbox.d.ts +22 -0
  16. package/dist/web/approval-inbox.d.ts.map +1 -1
  17. package/dist/web/approval-inbox.js +22 -0
  18. package/dist/web/approval-inbox.js.map +1 -1
  19. package/dist/web/public/admin-ui.js.gz +0 -0
  20. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  21. package/dist/web/public/{app.a8b08065.js → app.e1e1fe4d.js} +3 -3
  22. package/dist/web/public/app.e1e1fe4d.js.br +0 -0
  23. package/dist/web/public/app.e1e1fe4d.js.gz +0 -0
  24. package/dist/web/public/approvals-ui.js +30 -1
  25. package/dist/web/public/approvals-ui.js.br +0 -0
  26. package/dist/web/public/approvals-ui.js.gz +0 -0
  27. package/dist/web/public/{constants.35c7f91c.js → constants.d474d7d9.js} +11 -3
  28. package/dist/web/public/constants.d474d7d9.js.br +0 -0
  29. package/dist/web/public/constants.d474d7d9.js.gz +0 -0
  30. package/dist/web/public/cron-ui.js.gz +0 -0
  31. package/dist/web/public/entrance-animations.js.gz +0 -0
  32. package/dist/web/public/home-sessions.js.gz +0 -0
  33. package/dist/web/public/i18n.bb8949de.js.gz +0 -0
  34. package/dist/web/public/image-input.ee16ad88.js.gz +0 -0
  35. package/dist/web/public/index.html +4 -4
  36. package/dist/web/public/index.html.br +0 -0
  37. package/dist/web/public/index.html.gz +0 -0
  38. package/dist/web/public/input-cjk.63794d0b.js.gz +0 -0
  39. package/dist/web/public/keyboard-accessory.0454a3e9.js.gz +0 -0
  40. package/dist/web/public/mobile-handlers.05b89237.js.gz +0 -0
  41. package/dist/web/public/mobile-overview.js +6 -4
  42. package/dist/web/public/mobile-overview.js.br +0 -0
  43. package/dist/web/public/mobile-overview.js.gz +0 -0
  44. package/dist/web/public/mobile.c40d28a6.css.gz +0 -0
  45. package/dist/web/public/notification-manager.5d229063.js.gz +0 -0
  46. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  47. package/dist/web/public/panels-ui.c5a82b6e.js.gz +0 -0
  48. package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
  49. package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
  50. package/dist/web/public/readmymind-ui.js.gz +0 -0
  51. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  52. package/dist/web/public/sanitize-html.bc7078d6.js.gz +0 -0
  53. package/dist/web/public/session-lineage.js.gz +0 -0
  54. package/dist/web/public/session-ui.71a0ce9a.js.gz +0 -0
  55. package/dist/web/public/settings-ui.6cb12d4b.js.gz +0 -0
  56. package/dist/web/public/styles.325eb4f3.css.gz +0 -0
  57. package/dist/web/public/subagent-windows.e6ca799f.js.gz +0 -0
  58. package/dist/web/public/sw.js.gz +0 -0
  59. package/dist/web/public/terminal-ui.02b89e2c.js.gz +0 -0
  60. package/dist/web/public/ultracode-panel.js.gz +0 -0
  61. package/dist/web/public/ultracode-windows.js.gz +0 -0
  62. package/dist/web/public/upload.html.gz +0 -0
  63. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  64. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  65. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  66. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  67. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  68. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  69. package/dist/web/public/vendor/xterm-predictive-echo.6cec0fba.js.gz +0 -0
  70. package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
  71. package/dist/web/public/vendor/xterm.css.gz +0 -0
  72. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  73. package/dist/web/public/voice-input.4ec670b0.js.gz +0 -0
  74. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  75. package/dist/web/public/webview-tabs.js.gz +0 -0
  76. package/dist/web/routes/approval-routes.d.ts +2 -0
  77. package/dist/web/routes/approval-routes.d.ts.map +1 -1
  78. package/dist/web/routes/approval-routes.js +19 -0
  79. package/dist/web/routes/approval-routes.js.map +1 -1
  80. package/dist/web/routes/hook-event-routes.d.ts.map +1 -1
  81. package/dist/web/routes/hook-event-routes.js +5 -0
  82. package/dist/web/routes/hook-event-routes.js.map +1 -1
  83. package/dist/web/routes/session-routes.d.ts.map +1 -1
  84. package/dist/web/routes/session-routes.js +23 -38
  85. package/dist/web/routes/session-routes.js.map +1 -1
  86. package/dist/web/sensitive-path.d.ts.map +1 -1
  87. package/dist/web/sensitive-path.js +19 -1
  88. package/dist/web/sensitive-path.js.map +1 -1
  89. package/dist/web/server.d.ts +5 -0
  90. package/dist/web/server.d.ts.map +1 -1
  91. package/dist/web/server.js +21 -2
  92. package/dist/web/server.js.map +1 -1
  93. package/package.json +1 -1
  94. package/dist/web/public/app.a8b08065.js.br +0 -0
  95. package/dist/web/public/app.a8b08065.js.gz +0 -0
  96. package/dist/web/public/constants.35c7f91c.js.br +0 -0
  97. package/dist/web/public/constants.35c7f91c.js.gz +0 -0
@@ -997,13 +997,16 @@ function computeRewriteScrollLine(input) {
997
997
  * never match) and terminated by a known extension (so the end of the path is
998
998
  * unambiguous — a trailing `)` or `.` after the extension stays out). Longer
999
999
  * extensions come first in each family (`tsx|ts`), so the trailing `\b` cannot
1000
- * be satisfied by the shorter branch mid-word.
1000
+ * be satisfied by the shorter branch mid-word. `/etc` is deliberately NOT a
1001
+ * root: DEFAULT_BLOCKED_TREES (config/attachment-guard.ts) refuses the whole
1002
+ * tree server-side, so every `/etc/...` link was a guaranteed 403 — a link
1003
+ * that renders clickable and then dies is worse than plain text.
1001
1004
  *
1002
1005
  * ⚠ Consumers must never share one instance: `lastIndex` is per-object state on
1003
1006
  * a `/g` regex, so {@link absoluteFilePathPattern} mints a fresh one per call.
1004
1007
  */
1005
1008
  const FILE_PATH_LINK_PATTERN =
1006
- /(\/(?:home|Users|tmp|var|private|etc|opt|mnt|srv|media|data|workspace)\/[^\s"'<>|;&\n\x00-\x1f]*\.(?:log|txt|json|md|ya?ml|csv|xml|sh|py|tsx|ts|jsx|js|mjs|cjs|css|html|toml|ini|sql|png|jpe?g|gif|webp|bmp|svg|pdf|docx|pptx|mp4|webm|mov|mp3|wav))\b/g;
1009
+ /(\/(?:home|Users|tmp|var|private|opt|mnt|srv|media|data|workspace)\/[^\s"'<>|;&\n\x00-\x1f]*\.(?:log|txt|json|md|ya?ml|csv|xml|sh|py|tsx|ts|jsx|js|mjs|cjs|css|html|toml|ini|sql|png|jpe?g|gif|webp|bmp|svg|pdf|docx|pptx|mp4|webm|mov|mp3|wav))\b/g;
1007
1010
 
1008
1011
  /** A fresh, zero-state instance of {@link FILE_PATH_LINK_PATTERN}. */
1009
1012
  function absoluteFilePathPattern() {
@@ -1014,9 +1017,14 @@ function absoluteFilePathPattern() {
1014
1017
  * Extensions the file-preview overlay renders itself. Everything else a link
1015
1018
  * points at goes to the tail/log viewer, which is the right home for a growing
1016
1019
  * text file and the wrong one for bytes (tailing a PNG shows binary noise).
1020
+ *
1021
+ * The media entries mirror VIDEO_ATTACHMENT_EXTENSIONS/AUDIO_ATTACHMENT_EXTENSIONS
1022
+ * (src/attachment-registry.ts, the single source) — they diverged once and an
1023
+ * in-workspace `.m4a` opened as binary noise in the log viewer while the same
1024
+ * file in /tmp played fine. test/media-extension-parity.test.ts pins the sync.
1017
1025
  */
1018
1026
  const FILE_PREVIEW_EXTENSIONS = new Set(
1019
- ('png jpg jpeg gif webp bmp svg pdf docx pptx mp4 webm mov mp3 wav').split(' ')
1027
+ ('png jpg jpeg gif webp bmp svg pdf docx pptx mp4 webm mov m4v ogv mp3 wav ogg oga m4a aac flac opus').split(' ')
1020
1028
  );
1021
1029
 
1022
1030
  /** Whether a path's extension is one {@link FILE_PREVIEW_EXTENSIONS} covers. */
Binary file
Binary file
Binary file
@@ -24,8 +24,8 @@
24
24
  <!-- Preload critical resources — lets browser discover these during HTML parse
25
25
  instead of waiting until <script> tags at bottom-of-body are reached. -->
26
26
  <link rel="preload" href="vendor/xterm.min.js" as="script">
27
- <link rel="preload" href="constants.35c7f91c.js" as="script">
28
- <link rel="preload" href="app.a8b08065.js" as="script">
27
+ <link rel="preload" href="constants.d474d7d9.js" as="script">
28
+ <link rel="preload" href="app.e1e1fe4d.js" as="script">
29
29
  <!-- Self-hosted xterm.js — eliminates CDN DNS/TLS latency (~100ms).
30
30
  'defer' preserves execution order (xterm loads before fit addon). -->
31
31
  <script defer src="vendor/xterm.min.js"></script>
@@ -3283,7 +3283,7 @@
3283
3283
  <div class="approvals-list"></div>
3284
3284
  </div>
3285
3285
 
3286
- <script defer src="constants.35c7f91c.js"></script>
3286
+ <script defer src="constants.d474d7d9.js"></script>
3287
3287
  <script defer src="i18n.bb8949de.js"></script>
3288
3288
  <script defer src="mobile-handlers.05b89237.js"></script>
3289
3289
  <script defer src="voice-input.4ec670b0.js"></script>
@@ -3292,7 +3292,7 @@
3292
3292
  <script defer src="input-cjk.63794d0b.js"></script>
3293
3293
  <!-- Hardened markdown HTML sanitizer (wires DOMPurify). Must precede app.js. -->
3294
3294
  <script defer src="sanitize-html.bc7078d6.js"></script>
3295
- <script defer src="app.a8b08065.js"></script>
3295
+ <script defer src="app.e1e1fe4d.js"></script>
3296
3296
  <script defer src="terminal-ui.02b89e2c.js"></script>
3297
3297
  <script defer src="respawn-ui.ff0dae4c.js"></script>
3298
3298
  <script defer src="ralph-panel.6de2d0f8.js"></script>
Binary file
Binary file
@@ -118,14 +118,16 @@ Object.assign(CodemanApp.prototype, {
118
118
  * A WORKING pane is the opposite: it repaints about once a second, so its
119
119
  * last-activity stamp is always "now" and would report every running turn as
120
120
  * 0m. The turn's own start is the pane's last Enter (`lastSubmitAt`), which is
121
- * persisted server-side and therefore survives a Codeman restart. A session
122
- * that has never submitted has no anchor at all, and gets no stamp rather than
123
- * a made-up one.
121
+ * persisted server-side and therefore survives a Codeman restart. A working
122
+ * session with NO submit stamp falls back to `lastActivityAt`, because that is
123
+ * exactly what `sessionActivityAnchor` (constants.js) sorts it by: a row must
124
+ * never be ranked by a number it does not show.
124
125
  *
125
126
  * @returns {{key: string, at: number}|null}
126
127
  */
127
128
  _mobileOverviewSince(state, session) {
128
- const at = state === 'working' ? Number(session.lastSubmitAt) || 0 : Number(session.lastActivityAt) || 0;
129
+ const activeAt = Number(session.lastActivityAt) || 0;
130
+ const at = state === 'working' ? Number(session.lastSubmitAt) || activeAt : activeAt;
129
131
  if (!at) return null;
130
132
  return { key: MOBILE_OVERVIEW_SINCE_LABEL[state] || state, at };
131
133
  },
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -7,6 +7,8 @@
7
7
  * - `POST /api/approvals/:id/answer`: answer in place by sending the
8
8
  * corresponding keystrokes to the session (digit / Esc / idle-prompt text)
9
9
  * - `POST /api/approvals/:id/dismiss`: drop the item without keystrokes
10
+ * - `POST /api/approvals/session/:sessionId/viewed`: mark the session's pending
11
+ * IDLE prompt as seen (tab alert spent, item still pending)
10
12
  *
11
13
  * Normal authed API surface (NOT the localhost hook-secret bypass). Answering
12
14
  * is take-then-write: the item is removed BEFORE keystrokes go out so a
@@ -1 +1 @@
1
- {"version":3,"file":"approval-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/approval-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAsCrD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAgEnF"}
1
+ {"version":3,"file":"approval-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/approval-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAM1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAsCrD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAkFnF"}
@@ -7,6 +7,8 @@
7
7
  * - `POST /api/approvals/:id/answer`: answer in place by sending the
8
8
  * corresponding keystrokes to the session (digit / Esc / idle-prompt text)
9
9
  * - `POST /api/approvals/:id/dismiss`: drop the item without keystrokes
10
+ * - `POST /api/approvals/session/:sessionId/viewed`: mark the session's pending
11
+ * IDLE prompt as seen (tab alert spent, item still pending)
10
12
  *
11
13
  * Normal authed API surface (NOT the localhost hook-secret bypass). Answering
12
14
  * is take-then-write: the item is removed BEFORE keystrokes go out so a
@@ -106,6 +108,23 @@ export function registerApprovalRoutes(app, ctx) {
106
108
  }
107
109
  return { success: true, data: { id: item.id, sessionId: item.sessionId, action: answer.action } };
108
110
  });
111
+ /**
112
+ * "A human is looking at this session": acknowledge its pending IDLE prompt.
113
+ * The yellow tab alert used to be cleared in the browser's memory only, so
114
+ * `GET /api/approvals` re-armed it on the next reload (a tab you had already
115
+ * checked went yellow again) and the user's other devices never heard about
116
+ * it at all. The item is NOT resolved, only marked seen; the
117
+ * `approval:updated` broadcast is what clears the alert everywhere else.
118
+ *
119
+ * ⚠️ Idle only, by construction (`acknowledge()` defaults to `['idle']`):
120
+ * viewing a permission/question dialog does not answer it, so the red alert
121
+ * must survive being viewed.
122
+ */
123
+ app.post('/api/approvals/session/:sessionId/viewed', async (req) => {
124
+ const session = findSessionOrFail(ctx, req.params.sessionId, req);
125
+ const item = approvalInbox.acknowledge(session.id);
126
+ return { success: true, data: { sessionId: session.id, acknowledged: item?.id ?? null } };
127
+ });
109
128
  app.post('/api/approvals/:id/dismiss', async (req) => {
110
129
  const item = approvalInbox.getById(req.params.id);
111
130
  if (!item) {
@@ -1 +1 @@
1
- {"version":3,"file":"approval-routes.js","sourceRoot":"","sources":["../../../src/web/routes/approval-routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"approval-routes.js","sourceRoot":"","sources":["../../../src/web/routes/approval-routes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"hook-event-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/hook-event-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAQ1C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAYpG,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAClE,IAAI,CAuIN"}
1
+ {"version":3,"file":"hook-event-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/hook-event-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAQ1C,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAYpG,wBAAgB,uBAAuB,CACrC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAClE,IAAI,CA4IN"}
@@ -131,6 +131,11 @@ export function registerHookEventRoutes(app, ctx) {
131
131
  ...safeData,
132
132
  ...(approvalId && { approvalId }),
133
133
  });
134
+ // Full state ride-along, same shape as the working/idle handlers: the home
135
+ // screens rank the blocked group on lastActivityAt, and without this a
136
+ // permission prompt raised after page load kept ranking by whatever stamp
137
+ // the browser loaded with. Debounced, so a hook burst costs one broadcast.
138
+ ctx.broadcastSessionStateDebounced(sessionId);
134
139
  // Send push notifications for hook events
135
140
  ctx.sendPushNotifications(`hook:${event}`, {
136
141
  sessionId,
@@ -1 +1 @@
1
- {"version":3,"file":"hook-event-routes.js","sourceRoot":"","sources":["../../../src/web/routes/hook-event-routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hook-event-routes.js","sourceRoot":"","sources":["../../../src/web/routes/hook-event-routes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"session-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/session-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAqB,MAAM,SAAS,CAAC;AAQ7D,OAAO,EAOL,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAC;AAmFxB,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA+DjG;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0C1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAmCvE;AAWD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAiBhF;AAGD,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,iBAAe,8BAA8B,CAC3C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,WAAW,EAAE,WAAW,GAAG,SAAS,EACpC,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,EAChD,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAC7B,OAAO,CAAC;IACT,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACjD,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;CAChC,CAAC,CAkBD;AAED,kGAAkG;AAClG,eAAO,MAAM,+BAA+B,uCAAiC,CAAC;AA8L9E,2FAA2F;AAC3F,wBAAgB,uBAAuB,IAAI,IAAI,CAI9C;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AA8FD,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAC/D,IAAI,CA89GN"}
1
+ {"version":3,"file":"session-routes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/session-routes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,EAAqB,MAAM,SAAS,CAAC;AAQ7D,OAAO,EAOL,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAC;AAmFxB,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AA+DjG;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CA0C1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAmCvE;AAWD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAiBhF;AAGD,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,iBAAe,8BAA8B,CAC3C,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,WAAW,EAAE,WAAW,GAAG,SAAS,EACpC,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,EAChD,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAC7B,OAAO,CAAC;IACT,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IACrC,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,iBAAiB,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACjD,QAAQ,EAAE,QAAQ,GAAG,SAAS,CAAC;CAChC,CAAC,CAkBD;AAED,kGAAkG;AAClG,eAAO,MAAM,+BAA+B,uCAAiC,CAAC;AA8L9E,2FAA2F;AAC3F,wBAAgB,uBAAuB,IAAI,IAAI,CAI9C;AAED,+EAA+E;AAC/E,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AA2ED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,QAAQ,GAC/D,IAAI,CAg+GN"}
@@ -20,7 +20,7 @@ import { autoConfigureRalph, canAccessOwned, CASES_DIR, findSessionOrFail, getAu
20
20
  import { canUsernameRunPrivilegedCommands, resolveClaudeModeForUsername } from '../../user-store.js';
21
21
  import { isMultiUserMode } from '../../config/multiuser.js';
22
22
  import { AUTH_COOKIE_NAME } from '../middleware/auth.js';
23
- import { writeHooksConfig, updateCaseModel, stripCaseEnvKeys, applyStatusLineConfig, applyAgentSkill, refreshUserAgentSkill, seedAgentSessionPreamble, ensureCodemanHooks, refreshStaleCodemanHooks, } from '../../hooks-config.js';
23
+ import { writeHooksConfig, updateCaseModel, stripCaseEnvKeys, applyStatusLineConfig, applyAgentSkill, refreshUserAgentSkill, seedAgentSessionPreamble, applyWorkspaceHooks, refreshStaleCodemanHooks, } from '../../hooks-config.js';
24
24
  import { generateClaudeMd } from '../../templates/claude-md.js';
25
25
  import { imageWatcher } from '../../image-watcher.js';
26
26
  import { convertHeicToJpeg } from '../heic-jpeg-converter.js';
@@ -499,31 +499,12 @@ async function injectAgentSkill(casePath) {
499
499
  console.warn(`[agent-skill] injection failed for ${skillDir}: ${getErrorMessage(err)}`);
500
500
  }
501
501
  }
502
- /**
503
- * Hooks for the workspace a Claude session is about to run in. ONE decision point,
504
- * shared by every create path, so the setting cannot apply to some of them only.
505
- *
506
- * ON (`workspaceHooksEnabled`, the default): INSTALL Codeman's hooks block, merging
507
- * so a user's own hook entries and every other settings key survive. Hooks were
508
- * previously written only when Codeman CREATED the case DIRECTORY, so a linked case
509
- * or any pre-existing repo — where most sessions actually run — had none, and every
510
- * hook-driven surface was silently dead there: no tab alert or phone-overview row
511
- * when a dialog blocks the pane, no Approvals Inbox item, no push, no definitive
512
- * `stop`/`idle_prompt` for respawn, and no `stop`/`blocked` for the wait endpoints.
513
- * Measured 2026-08-15 in a linked case: an AskUserQuestion dialog on screen with the
514
- * tab reporting a calm `idle`. Claude Code re-reads the file, so a session already
515
- * running in that workspace starts firing hooks without a restart (verified live).
516
- *
517
- * OFF: the older, narrower behavior. A Codeman block that is already there is still
518
- * refreshed when stale (COD-91: a pre-secret block 401s once the hook-secret gate
519
- * went unconditional), but one is never added, so Codeman leaves the repo alone.
520
- *
521
- * Best-effort either way: a refusal or a thrown error must never fail the create.
522
- */
523
- async function applyWorkspaceHooks(ctx, workspace) {
524
- const install = await ctx.getWorkspaceHooksEnabled();
525
- await (install ? ensureCodemanHooks(workspace) : refreshStaleCodemanHooks(workspace)).catch(() => { });
526
- }
502
+ // Workspace hooks: the install-vs-refresh decision core moved to
503
+ // `applyWorkspaceHooks` in hooks-config.ts (imported above) so the non-route
504
+ // claude create paths — cron fires, legacy scheduled runs, the plan-orchestrator
505
+ // one-shots, the boot recovery sweep — share the SAME decision instead of
506
+ // bypassing the `workspaceHooksEnabled` setting. Route handlers here resolve the
507
+ // setting through the ConfigPort (tests stub it) and pass it as the second arg.
527
508
  export function registerSessionRoutes(app, ctx) {
528
509
  // ═══════════════════════════════════════════════════════════════
529
510
  // Auth
@@ -644,7 +625,14 @@ export function registerSessionRoutes(app, ctx) {
644
625
  // chip's data feed for everyone. The exporter is benign when the chip is off
645
626
  // (the footer just shows session status). isOurs-guarded so a user's own
646
627
  // statusLine is never touched.
647
- if ((body.mode ?? 'claude') === 'claude' && body.statusLineTelemetry === true) {
628
+ //
629
+ // Same guard as the hooks call below (499d355): never for a remote attach
630
+ // (workingDir is a user@host:session pseudo-path — the mkdir inside
631
+ // applyStatusLineConfig would create it as a junk local dir), and only when
632
+ // the caller named a workingDir — the process-cwd fallback is $HOME under
633
+ // installer-created services, and a statusLine materializing in
634
+ // ~/.claude/settings.local.json was never asked for.
635
+ if (!remote && body.workingDir && (body.mode ?? 'claude') === 'claude' && body.statusLineTelemetry === true) {
648
636
  await applyStatusLineConfig(workingDir, true);
649
637
  }
650
638
  // Hooks for the workspace this session runs in (install vs refresh-only is the
@@ -654,7 +642,7 @@ export function registerSessionRoutes(app, ctx) {
654
642
  // process-cwd fallback is $HOME under installer-created services, and hooks
655
643
  // materializing in ~/.claude/settings.local.json was never asked for.
656
644
  if (!remote && body.workingDir && (body.mode ?? 'claude') === 'claude') {
657
- await applyWorkspaceHooks(ctx, workingDir);
645
+ await applyWorkspaceHooks(workingDir, await ctx.getWorkspaceHooksEnabled());
658
646
  // Agent skill (docs/agent-control-plan.md §2): ADD-ONLY on create, same shared-
659
647
  // .claude rationale as the statusLine above: a create must never remove the
660
648
  // skill from under other live sessions in the repo. Marker-guarded, so a
@@ -2532,7 +2520,7 @@ export function registerSessionRoutes(app, ctx) {
2532
2520
  // of its own. Skipped for remote cases — resolvedCasePath is a REMOTE path that
2533
2521
  // doesn't exist on the local filesystem.
2534
2522
  if (mode === 'claude') {
2535
- await applyWorkspaceHooks(ctx, resolvedCasePath);
2523
+ await applyWorkspaceHooks(resolvedCasePath, await ctx.getWorkspaceHooksEnabled());
2536
2524
  }
2537
2525
  else {
2538
2526
  await refreshStaleCodemanHooks(resolvedCasePath).catch(() => { });
@@ -2549,14 +2537,11 @@ export function registerSessionRoutes(app, ctx) {
2549
2537
  // Docker cases: the workspace is a REAL host dir bind-mounted into the container.
2550
2538
  // Scaffold hooks (+ a CLAUDE.md) if MISSING so in-container permission prompts and
2551
2539
  // hook-idle detection fire (decision: wire hooks now). Never clobbers an existing
2552
- // configured project. Skipped for external CLIs (they use their own systems).
2553
- if (docker &&
2554
- docker.hooksEnabled &&
2555
- mode !== 'opencode' &&
2556
- mode !== 'codex' &&
2557
- mode !== 'gemini' &&
2558
- mode !== 'antigravity' &&
2559
- mode !== 'pi') {
2540
+ // configured project. Claude mode ONLY — only claude reads `.claude` hooks, so a
2541
+ // shell or external-CLI quick-start must not author a block of its own (the same
2542
+ // rule the existing-case branch above states; this branch used to exclude just
2543
+ // the five external CLIs and let `shell` through).
2544
+ if (docker && docker.hooksEnabled && mode === 'claude') {
2560
2545
  try {
2561
2546
  if (!existsSync(join(resolvedCasePath, 'CLAUDE.md'))) {
2562
2547
  const templatePath = await ctx.getDefaultClaudeMdPath();
@@ -2569,7 +2554,7 @@ export function registerSessionRoutes(app, ctx) {
2569
2554
  // A settings file with no hooks in it is the same dead-surface case as a
2570
2555
  // linked case. This branch is already gated on `docker.hooksEnabled`, and
2571
2556
  // applyWorkspaceHooks adds the user-level gate on top.
2572
- await applyWorkspaceHooks(ctx, resolvedCasePath);
2557
+ await applyWorkspaceHooks(resolvedCasePath, await ctx.getWorkspaceHooksEnabled());
2573
2558
  }
2574
2559
  }
2575
2560
  catch {