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.
- package/dist/cron/cron-service.d.ts.map +1 -1
- package/dist/cron/cron-service.js +10 -0
- package/dist/cron/cron-service.js.map +1 -1
- package/dist/hooks-config.d.ts +34 -1
- package/dist/hooks-config.d.ts.map +1 -1
- package/dist/hooks-config.js +62 -1
- package/dist/hooks-config.js.map +1 -1
- package/dist/plan-orchestrator.d.ts.map +1 -1
- package/dist/plan-orchestrator.js +8 -0
- package/dist/plan-orchestrator.js.map +1 -1
- package/dist/session.d.ts +11 -0
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +47 -10
- package/dist/session.js.map +1 -1
- package/dist/web/approval-inbox.d.ts +22 -0
- package/dist/web/approval-inbox.d.ts.map +1 -1
- package/dist/web/approval-inbox.js +22 -0
- package/dist/web/approval-inbox.js.map +1 -1
- package/dist/web/public/admin-ui.js.gz +0 -0
- package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
- package/dist/web/public/{app.a8b08065.js → app.e1e1fe4d.js} +3 -3
- package/dist/web/public/app.e1e1fe4d.js.br +0 -0
- package/dist/web/public/app.e1e1fe4d.js.gz +0 -0
- package/dist/web/public/approvals-ui.js +30 -1
- package/dist/web/public/approvals-ui.js.br +0 -0
- package/dist/web/public/approvals-ui.js.gz +0 -0
- package/dist/web/public/{constants.35c7f91c.js → constants.d474d7d9.js} +11 -3
- package/dist/web/public/constants.d474d7d9.js.br +0 -0
- package/dist/web/public/constants.d474d7d9.js.gz +0 -0
- package/dist/web/public/cron-ui.js.gz +0 -0
- package/dist/web/public/entrance-animations.js.gz +0 -0
- package/dist/web/public/home-sessions.js.gz +0 -0
- package/dist/web/public/i18n.bb8949de.js.gz +0 -0
- package/dist/web/public/image-input.ee16ad88.js.gz +0 -0
- package/dist/web/public/index.html +4 -4
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/input-cjk.63794d0b.js.gz +0 -0
- package/dist/web/public/keyboard-accessory.0454a3e9.js.gz +0 -0
- package/dist/web/public/mobile-handlers.05b89237.js.gz +0 -0
- package/dist/web/public/mobile-overview.js +6 -4
- package/dist/web/public/mobile-overview.js.br +0 -0
- package/dist/web/public/mobile-overview.js.gz +0 -0
- package/dist/web/public/mobile.c40d28a6.css.gz +0 -0
- package/dist/web/public/notification-manager.5d229063.js.gz +0 -0
- package/dist/web/public/orchestrator-panel.js.gz +0 -0
- package/dist/web/public/panels-ui.c5a82b6e.js.gz +0 -0
- package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
- package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
- package/dist/web/public/readmymind-ui.js.gz +0 -0
- package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
- package/dist/web/public/sanitize-html.bc7078d6.js.gz +0 -0
- package/dist/web/public/session-lineage.js.gz +0 -0
- package/dist/web/public/session-ui.71a0ce9a.js.gz +0 -0
- package/dist/web/public/settings-ui.6cb12d4b.js.gz +0 -0
- package/dist/web/public/styles.325eb4f3.css.gz +0 -0
- package/dist/web/public/subagent-windows.e6ca799f.js.gz +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/terminal-ui.02b89e2c.js.gz +0 -0
- package/dist/web/public/ultracode-panel.js.gz +0 -0
- package/dist/web/public/ultracode-windows.js.gz +0 -0
- package/dist/web/public/upload.html.gz +0 -0
- package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
- package/dist/web/public/vendor/marked.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-predictive-echo.6cec0fba.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.4ec670b0.js.gz +0 -0
- package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
- package/dist/web/public/webview-tabs.js.gz +0 -0
- package/dist/web/routes/approval-routes.d.ts +2 -0
- package/dist/web/routes/approval-routes.d.ts.map +1 -1
- package/dist/web/routes/approval-routes.js +19 -0
- package/dist/web/routes/approval-routes.js.map +1 -1
- package/dist/web/routes/hook-event-routes.d.ts.map +1 -1
- package/dist/web/routes/hook-event-routes.js +5 -0
- package/dist/web/routes/hook-event-routes.js.map +1 -1
- package/dist/web/routes/session-routes.d.ts.map +1 -1
- package/dist/web/routes/session-routes.js +23 -38
- package/dist/web/routes/session-routes.js.map +1 -1
- package/dist/web/sensitive-path.d.ts.map +1 -1
- package/dist/web/sensitive-path.js +19 -1
- package/dist/web/sensitive-path.js.map +1 -1
- package/dist/web/server.d.ts +5 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +21 -2
- package/dist/web/server.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/public/app.a8b08065.js.br +0 -0
- package/dist/web/public/app.a8b08065.js.gz +0 -0
- package/dist/web/public/constants.35c7f91c.js.br +0 -0
- 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|
|
|
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
|
|
Binary file
|
|
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.
|
|
28
|
-
<link rel="preload" href="app.
|
|
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.
|
|
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.
|
|
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
|
|
Binary file
|
|
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
|
|
122
|
-
*
|
|
123
|
-
* a
|
|
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
|
|
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
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/dist/web/public/sw.js.gz
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
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
|
|
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":"AAAA
|
|
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,
|
|
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;
|
|
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,
|
|
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
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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.
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2556
|
-
|
|
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(
|
|
2557
|
+
await applyWorkspaceHooks(resolvedCasePath, await ctx.getWorkspaceHooksEnabled());
|
|
2573
2558
|
}
|
|
2574
2559
|
}
|
|
2575
2560
|
catch {
|