aicodeman 1.19.0 → 1.19.1

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 (87) 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/public/admin-ui.js.gz +0 -0
  16. package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
  17. package/dist/web/public/{app.a8b08065.js → app.8a9a705e.js} +3 -3
  18. package/dist/web/public/app.8a9a705e.js.br +0 -0
  19. package/dist/web/public/app.8a9a705e.js.gz +0 -0
  20. package/dist/web/public/approvals-ui.js.gz +0 -0
  21. package/dist/web/public/{constants.35c7f91c.js → constants.d474d7d9.js} +11 -3
  22. package/dist/web/public/constants.d474d7d9.js.br +0 -0
  23. package/dist/web/public/constants.d474d7d9.js.gz +0 -0
  24. package/dist/web/public/cron-ui.js.gz +0 -0
  25. package/dist/web/public/entrance-animations.js.gz +0 -0
  26. package/dist/web/public/home-sessions.js.gz +0 -0
  27. package/dist/web/public/i18n.bb8949de.js.gz +0 -0
  28. package/dist/web/public/image-input.ee16ad88.js.gz +0 -0
  29. package/dist/web/public/index.html +4 -4
  30. package/dist/web/public/index.html.br +0 -0
  31. package/dist/web/public/index.html.gz +0 -0
  32. package/dist/web/public/input-cjk.63794d0b.js.gz +0 -0
  33. package/dist/web/public/keyboard-accessory.0454a3e9.js.gz +0 -0
  34. package/dist/web/public/mobile-handlers.05b89237.js.gz +0 -0
  35. package/dist/web/public/mobile-overview.js +6 -4
  36. package/dist/web/public/mobile-overview.js.br +0 -0
  37. package/dist/web/public/mobile-overview.js.gz +0 -0
  38. package/dist/web/public/mobile.c40d28a6.css.gz +0 -0
  39. package/dist/web/public/notification-manager.5d229063.js.gz +0 -0
  40. package/dist/web/public/orchestrator-panel.js.gz +0 -0
  41. package/dist/web/public/panels-ui.c5a82b6e.js.gz +0 -0
  42. package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
  43. package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
  44. package/dist/web/public/readmymind-ui.js.gz +0 -0
  45. package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
  46. package/dist/web/public/sanitize-html.bc7078d6.js.gz +0 -0
  47. package/dist/web/public/session-lineage.js.gz +0 -0
  48. package/dist/web/public/session-ui.71a0ce9a.js.gz +0 -0
  49. package/dist/web/public/settings-ui.6cb12d4b.js.gz +0 -0
  50. package/dist/web/public/styles.325eb4f3.css.gz +0 -0
  51. package/dist/web/public/subagent-windows.e6ca799f.js.gz +0 -0
  52. package/dist/web/public/sw.js.gz +0 -0
  53. package/dist/web/public/terminal-ui.02b89e2c.js.gz +0 -0
  54. package/dist/web/public/ultracode-panel.js.gz +0 -0
  55. package/dist/web/public/ultracode-windows.js.gz +0 -0
  56. package/dist/web/public/upload.html.gz +0 -0
  57. package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
  58. package/dist/web/public/vendor/marked.min.js.gz +0 -0
  59. package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
  60. package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
  61. package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
  62. package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
  63. package/dist/web/public/vendor/xterm-predictive-echo.6cec0fba.js.gz +0 -0
  64. package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
  65. package/dist/web/public/vendor/xterm.css.gz +0 -0
  66. package/dist/web/public/vendor/xterm.min.js.gz +0 -0
  67. package/dist/web/public/voice-input.4ec670b0.js.gz +0 -0
  68. package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
  69. package/dist/web/public/webview-tabs.js.gz +0 -0
  70. package/dist/web/routes/hook-event-routes.d.ts.map +1 -1
  71. package/dist/web/routes/hook-event-routes.js +5 -0
  72. package/dist/web/routes/hook-event-routes.js.map +1 -1
  73. package/dist/web/routes/session-routes.d.ts.map +1 -1
  74. package/dist/web/routes/session-routes.js +23 -38
  75. package/dist/web/routes/session-routes.js.map +1 -1
  76. package/dist/web/sensitive-path.d.ts.map +1 -1
  77. package/dist/web/sensitive-path.js +19 -1
  78. package/dist/web/sensitive-path.js.map +1 -1
  79. package/dist/web/server.d.ts +5 -0
  80. package/dist/web/server.d.ts.map +1 -1
  81. package/dist/web/server.js +21 -2
  82. package/dist/web/server.js.map +1 -1
  83. package/package.json +1 -1
  84. package/dist/web/public/app.a8b08065.js.br +0 -0
  85. package/dist/web/public/app.a8b08065.js.gz +0 -0
  86. package/dist/web/public/constants.35c7f91c.js.br +0 -0
  87. package/dist/web/public/constants.35c7f91c.js.gz +0 -0
@@ -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.8a9a705e.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.8a9a705e.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
@@ -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":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,gCAAgC,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAClF,OAAO,EAAE,aAAa,EAAqB,MAAM,sBAAsB,CAAC;AAGxE,qDAAqD;AACrD,MAAM,sBAAsB,GAAiC;IAC3D,iBAAiB,EAAE,YAAY;IAC/B,kBAAkB,EAAE,UAAU;IAC9B,WAAW,EAAE,MAAM;CACpB,CAAC;AAEF,+EAA+E;AAC/E,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,sBAAsB,EAAE,sBAAsB,CAAC,CAAC,CAAC;AAEpG,MAAM,UAAU,uBAAuB,CACrC,GAAoB,EACpB,GAAmE;IAEnE,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACxC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,eAAe,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,OAAO,mBAAmB,CAAC,YAAY,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAC1E,CAAC;QAED,4EAA4E;QAC5E,gFAAgF;QAChF,8EAA8E;QAC9E,WAAW;QACX,EAAE;QACF,+EAA+E;QAC/E,kFAAkF;QAClF,iFAAiF;QACjF,kFAAkF;QAClF,mFAAmF;QACnF,+EAA+E;QAC/E,wBAAwB;QACxB,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChD,IAAI,WAAW,IAAI,qBAAqB,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3D,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBACrB,YAAY,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAC/C,CAAC;iBAAM,IAAI,KAAK,KAAK,mBAAmB,IAAI,KAAK,KAAK,oBAAoB,EAAE,CAAC;gBAC3E,YAAY,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,yDAAyD;QACzD,MAAM,UAAU,GAAG,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,KAAK,KAAK,oBAAoB,EAAE,CAAC;gBACnC,yCAAyC;gBACzC,UAAU,CAAC,iBAAiB,EAAE,CAAC;YACjC,CAAC;iBAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;gBAC5B,sDAAsD;gBACtD,UAAU,CAAC,cAAc,EAAE,CAAC;YAC9B,CAAC;iBAAM,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;gBACnC,gEAAgE;gBAChE,UAAU,CAAC,gBAAgB,EAAE,CAAC;YAChC,CAAC;QACH,CAAC;QAED,oEAAoE;QACpE,IAAI,IAAI,IAAI,iBAAiB,IAAI,IAAI,EAAE,CAAC;YACtC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpD,IAAI,cAAc,IAAI,iBAAiB,CAAC,cAAc,CAAC,EAAE,CAAC;gBACxD,GAAG,CAAC,sBAAsB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QAED,0EAA0E;QAC1E,2EAA2E;QAC3E,mEAAmE;QACnE,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACnE,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,mBAAmB,GAAG,OAAO,EAAE,eAAe,CAAC;YACrD,OAAO,EAAE,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/C,kEAAkE;YAClE,qEAAqE;YACrE,yCAAyC;YACzC,IAAI,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,eAAe,KAAK,mBAAmB,EAAE,CAAC;gBAClG,KAAK,gCAAgC,CACnC,UAAU,EAAE,EACZ,OAAO,CAAC,MAAM,CAAC,aAAa,EAC5B,OAAO,CAAC,eAAe,CACxB,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAED,sEAAsE;QACtE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE3D,yEAAyE;QACzE,yEAAyE;QACzE,4EAA4E;QAC5E,uEAAuE;QACvE,IAAI,UAA8B,CAAC;QACnC,MAAM,YAAY,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;QACnD,IAAI,OAAO,IAAI,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,SAAS,GACb,QAAQ,CAAC,UAAU,IAAI,OAAO,QAAQ,CAAC,UAAU,KAAK,QAAQ;oBAC5D,CAAC,CAAE,QAAQ,CAAC,UAAsC;oBAClD,CAAC,CAAC,SAAS,CAAC;gBAChB,MAAM,WAAW,GAAG,SAAS;oBAC3B,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;oBACpG,CAAC,CAAC,SAAS,CAAC;gBACd,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC;oBACpC,SAAS;oBACT,WAAW;oBACX,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,OAAO,QAAQ,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;oBACjF,WAAW,EAAE,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;oBACtE,OAAO,EAAE,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;oBAC5E,GAAG,EAAE,OAAO,QAAQ,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS;oBAChE,uEAAuE;oBACvE,+DAA+D;oBAC/D,OAAO,EAAE,GAAG,EAAE;wBACZ,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;wBAChC,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;wBAC9E,OAAO,KAAK,IAAI,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;oBAC9D,CAAC;iBACF,CAAC,CAAC;gBACH,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC;YACvB,CAAC;iBAAM,IAAI,yBAAyB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChD,aAAa,CAAC,iBAAiB,CAAC,SAAS,EAAE,sBAAsB,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,GAAG,CAAC,SAAS,CAAC,QAAQ,KAAK,EAAE,EAAE;YAC7B,SAAS;YACT,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,GAAG,QAAQ;YACX,GAAG,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,CAAC;SAClC,CAAC,CAAC;QAEH,0CAA0C;QAC1C,GAAG,CAAC,qBAAqB,CAAC,QAAQ,KAAK,EAAE,EAAE;YACzC,SAAS;YACT,WAAW;YACX,GAAG,QAAQ;YACX,GAAG,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,CAAC;SAClC,CAAC,CAAC;QAEH,uBAAuB;QACvB,MAAM,cAAc,GAAG,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC7D,IAAI,cAAc,EAAE,CAAC;YACnB,cAAc,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;AACL,CAAC"}
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 {