aicodeman 1.41.0 → 1.42.0
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/README.md +101 -21
- package/dist/attachment-registry.d.ts +2 -0
- package/dist/attachment-registry.d.ts.map +1 -1
- package/dist/attachment-registry.js +14 -3
- package/dist/attachment-registry.js.map +1 -1
- package/dist/cli-agent.d.ts +2 -0
- package/dist/cli-agent.d.ts.map +1 -1
- package/dist/cli-agent.js +13 -9
- package/dist/cli-agent.js.map +1 -1
- package/dist/cli.d.ts +25 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +97 -11
- package/dist/cli.js.map +1 -1
- package/dist/config/buffer-limits.d.ts +9 -0
- package/dist/config/buffer-limits.d.ts.map +1 -1
- package/dist/config/buffer-limits.js +9 -0
- package/dist/config/buffer-limits.js.map +1 -1
- package/dist/config/cli-registry/schema.d.ts +10 -0
- package/dist/config/cli-registry/schema.d.ts.map +1 -1
- package/dist/config/cli-registry/schema.js +26 -0
- package/dist/config/cli-registry/schema.js.map +1 -1
- package/dist/config/cli-registry/stock.d.ts.map +1 -1
- package/dist/config/cli-registry/stock.js +89 -6
- package/dist/config/cli-registry/stock.js.map +1 -1
- package/dist/config/cli-registry/types.d.ts +61 -0
- package/dist/config/cli-registry/types.d.ts.map +1 -1
- package/dist/folder-listing.d.ts +94 -0
- package/dist/folder-listing.d.ts.map +1 -0
- package/dist/folder-listing.js +241 -0
- package/dist/folder-listing.js.map +1 -0
- package/dist/git-worktrees.d.ts +292 -0
- package/dist/git-worktrees.d.ts.map +1 -0
- package/dist/git-worktrees.js +791 -0
- package/dist/git-worktrees.js.map +1 -0
- package/dist/hooks-config.d.ts +36 -16
- package/dist/hooks-config.d.ts.map +1 -1
- package/dist/hooks-config.js +45 -20
- package/dist/hooks-config.js.map +1 -1
- package/dist/html-view-capabilities.d.ts +54 -0
- package/dist/html-view-capabilities.d.ts.map +1 -0
- package/dist/html-view-capabilities.js +103 -0
- package/dist/html-view-capabilities.js.map +1 -0
- package/dist/mcp-server.d.ts +114 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +918 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/mcp-sync.d.ts +5 -0
- package/dist/mcp-sync.d.ts.map +1 -1
- package/dist/mcp-sync.js +51 -5
- package/dist/mcp-sync.js.map +1 -1
- package/dist/mux-interface.d.ts +36 -1
- package/dist/mux-interface.d.ts.map +1 -1
- package/dist/remote-files.d.ts +37 -0
- package/dist/remote-files.d.ts.map +1 -1
- package/dist/remote-files.js +103 -0
- package/dist/remote-files.js.map +1 -1
- package/dist/remote-pane-history.d.ts +103 -0
- package/dist/remote-pane-history.d.ts.map +1 -0
- package/dist/remote-pane-history.js +258 -0
- package/dist/remote-pane-history.js.map +1 -0
- package/dist/remote-ssh-limiter.d.ts +16 -3
- package/dist/remote-ssh-limiter.d.ts.map +1 -1
- package/dist/remote-ssh-limiter.js +37 -6
- package/dist/remote-ssh-limiter.js.map +1 -1
- package/dist/services/unified-session-service.d.ts +8 -0
- package/dist/services/unified-session-service.d.ts.map +1 -1
- package/dist/services/unified-session-service.js +21 -0
- package/dist/services/unified-session-service.js.map +1 -1
- package/dist/session-activity.d.ts +51 -0
- package/dist/session-activity.d.ts.map +1 -1
- package/dist/session-activity.js +62 -0
- package/dist/session-activity.js.map +1 -1
- package/dist/session-submit-verifier.js +1 -1
- package/dist/session.d.ts +90 -2
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +247 -9
- package/dist/session.js.map +1 -1
- package/dist/tab-layout-legacy-order.d.ts.map +1 -1
- package/dist/tab-layout-legacy-order.js +72 -13
- package/dist/tab-layout-legacy-order.js.map +1 -1
- package/dist/tab-layout-service.d.ts +33 -2
- package/dist/tab-layout-service.d.ts.map +1 -1
- package/dist/tab-layout-service.js +102 -7
- package/dist/tab-layout-service.js.map +1 -1
- package/dist/tab-layout.d.ts +9 -0
- package/dist/tab-layout.d.ts.map +1 -1
- package/dist/tab-layout.js +15 -2
- package/dist/tab-layout.js.map +1 -1
- package/dist/tmux-manager.d.ts +130 -7
- package/dist/tmux-manager.d.ts.map +1 -1
- package/dist/tmux-manager.js +263 -36
- package/dist/tmux-manager.js.map +1 -1
- package/dist/types/session.d.ts +53 -0
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js.map +1 -1
- package/dist/usage-telemetry.d.ts +44 -7
- package/dist/usage-telemetry.d.ts.map +1 -1
- package/dist/usage-telemetry.js +72 -7
- package/dist/usage-telemetry.js.map +1 -1
- package/dist/utils/deepseek-cli-resolver.d.ts.map +1 -1
- package/dist/utils/deepseek-cli-resolver.js +1 -1
- package/dist/utils/deepseek-cli-resolver.js.map +1 -1
- package/dist/web/approval-inbox.d.ts +24 -2
- package/dist/web/approval-inbox.d.ts.map +1 -1
- package/dist/web/approval-inbox.js +8 -2
- package/dist/web/approval-inbox.js.map +1 -1
- package/dist/web/middleware/auth.d.ts.map +1 -1
- package/dist/web/middleware/auth.js +33 -0
- package/dist/web/middleware/auth.js.map +1 -1
- package/dist/web/ports/session-port.d.ts +8 -1
- package/dist/web/ports/session-port.d.ts.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.f04bb2a5.js +43 -0
- package/dist/web/public/app.f04bb2a5.js.br +0 -0
- package/dist/web/public/app.f04bb2a5.js.gz +0 -0
- package/dist/web/public/approvals-ui.js +4 -0
- 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.bc9c1f63.js → constants.12b0c247.js} +395 -7
- package/dist/web/public/constants.12b0c247.js.br +0 -0
- package/dist/web/public/constants.12b0c247.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/gesture/gesture-codeman.js +112 -6
- package/dist/web/public/git-status-ui.js.gz +0 -0
- package/dist/web/public/home-sessions.js.gz +0 -0
- package/dist/web/public/host-wake-ui.js.gz +0 -0
- package/dist/web/public/i18n.06659676.js +2 -0
- package/dist/web/public/i18n.06659676.js.br +0 -0
- package/dist/web/public/i18n.06659676.js.gz +0 -0
- package/dist/web/public/image-input.fcdcb46c.js +462 -0
- package/dist/web/public/image-input.fcdcb46c.js.br +0 -0
- package/dist/web/public/image-input.fcdcb46c.js.gz +0 -0
- package/dist/web/public/index.html +169 -24
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/input-cjk.8bc46081.js.gz +0 -0
- package/dist/web/public/{keyboard-accessory.c1e7c7b7.js → keyboard-accessory.b42f539b.js} +124 -44
- package/dist/web/public/keyboard-accessory.b42f539b.js.br +0 -0
- package/dist/web/public/keyboard-accessory.b42f539b.js.gz +0 -0
- package/dist/web/public/mobile-handlers.0ef9c311.js.gz +0 -0
- package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
- package/dist/web/public/mobile-overview.js +11 -2
- 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.2dff1580.css +1 -0
- package/dist/web/public/mobile.2dff1580.css.br +0 -0
- package/dist/web/public/mobile.2dff1580.css.gz +0 -0
- package/dist/web/public/notification-manager.feb82c04.js.gz +0 -0
- package/dist/web/public/orchestrator-panel.js.gz +0 -0
- package/dist/web/public/{panels-ui.71846fcb.js → panels-ui.73ec0137.js} +87 -87
- package/dist/web/public/panels-ui.73ec0137.js.br +0 -0
- package/dist/web/public/panels-ui.73ec0137.js.gz +0 -0
- package/dist/web/public/ralph-panel.b350e2ef.js.gz +0 -0
- package/dist/web/public/ralph-wizard.b6c0dd19.js.gz +0 -0
- package/dist/web/public/readmymind-ui.js.gz +0 -0
- package/dist/web/public/reboot-restore-ui.js.gz +0 -0
- package/dist/web/public/{respawn-ui.ff0dae4c.js → respawn-ui.d7adcf6a.js} +1 -1
- package/dist/web/public/respawn-ui.d7adcf6a.js.br +0 -0
- package/dist/web/public/respawn-ui.d7adcf6a.js.gz +0 -0
- package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
- package/dist/web/public/session-lineage.js.gz +0 -0
- package/dist/web/public/session-ui.d52ff6aa.js +100 -0
- package/dist/web/public/session-ui.d52ff6aa.js.br +0 -0
- package/dist/web/public/session-ui.d52ff6aa.js.gz +0 -0
- package/dist/web/public/settings-ui.3a22bd2a.js +97 -0
- package/dist/web/public/settings-ui.3a22bd2a.js.br +0 -0
- package/dist/web/public/settings-ui.3a22bd2a.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview-worker.js +11 -0
- package/dist/web/public/spreadsheet-preview-worker.js.br +0 -0
- package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
- package/dist/web/public/{spreadsheet-preview.af82fa2f.js → spreadsheet-preview.75c751de.js} +1 -1
- package/dist/web/public/spreadsheet-preview.75c751de.js.br +0 -0
- package/dist/web/public/spreadsheet-preview.75c751de.js.gz +0 -0
- package/dist/web/public/spreadsheet-xlsx-core.js +110 -0
- package/dist/web/public/spreadsheet-xlsx-core.js.br +0 -0
- package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
- package/dist/web/public/styles.ba6a9b84.css +1 -0
- package/dist/web/public/styles.ba6a9b84.css.br +0 -0
- package/dist/web/public/styles.ba6a9b84.css.gz +0 -0
- package/dist/web/public/subagent-windows.07277a58.js.gz +0 -0
- package/dist/web/public/sw.js +6 -2
- package/dist/web/public/sw.js.br +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/tab-layout-browser.2d6189f7.js +1 -0
- package/dist/web/public/tab-layout-browser.2d6189f7.js.br +0 -0
- package/dist/web/public/tab-layout-browser.2d6189f7.js.gz +0 -0
- package/dist/web/public/{tab-rail-resize.a5867793.js → tab-rail-resize.7157e0bd.js} +1 -1
- package/dist/web/public/tab-rail-resize.7157e0bd.js.br +0 -0
- package/dist/web/public/tab-rail-resize.7157e0bd.js.gz +0 -0
- package/dist/web/public/terminal-keycode229-recovery.af09f99a.js.gz +0 -0
- package/dist/web/public/terminal-split.js.gz +0 -0
- package/dist/web/public/terminal-tile.js +45 -24
- package/dist/web/public/terminal-tile.js.br +0 -0
- package/dist/web/public/terminal-tile.js.gz +0 -0
- package/dist/web/public/terminal-ui.0a7ccc29.js +2 -0
- package/dist/web/public/terminal-ui.0a7ccc29.js.br +0 -0
- package/dist/web/public/terminal-ui.0a7ccc29.js.gz +0 -0
- package/dist/web/public/tile-grid.js +439 -18
- package/dist/web/public/tile-grid.js.br +0 -0
- package/dist/web/public/tile-grid.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/vendor/dompurify.min.js.gz +0 -0
- package/dist/web/public/vendor/exceljs.min.js.gz +0 -0
- package/dist/web/public/vendor/fflate.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.ae5e3d5d.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.0b69623c.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.2342c37b.js.gz +0 -0
- package/dist/web/public/voice-pcm-worklet.js.gz +0 -0
- package/dist/web/public/webview-tabs.js +12 -0
- package/dist/web/public/webview-tabs.js.br +0 -0
- package/dist/web/public/webview-tabs.js.gz +0 -0
- package/dist/web/public/whats-new.json +13 -0
- package/dist/web/route-helpers.d.ts +8 -0
- package/dist/web/route-helpers.d.ts.map +1 -1
- package/dist/web/route-helpers.js +8 -0
- package/dist/web/route-helpers.js.map +1 -1
- package/dist/web/routes/admin-routes.d.ts.map +1 -1
- package/dist/web/routes/admin-routes.js +4 -1
- package/dist/web/routes/admin-routes.js.map +1 -1
- package/dist/web/routes/approval-routes.d.ts.map +1 -1
- package/dist/web/routes/approval-routes.js +12 -10
- package/dist/web/routes/approval-routes.js.map +1 -1
- package/dist/web/routes/case-routes.d.ts.map +1 -1
- package/dist/web/routes/case-routes.js +10 -3
- package/dist/web/routes/case-routes.js.map +1 -1
- package/dist/web/routes/file-routes.d.ts +46 -1
- package/dist/web/routes/file-routes.d.ts.map +1 -1
- package/dist/web/routes/file-routes.js +214 -27
- package/dist/web/routes/file-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 +8 -1
- package/dist/web/routes/hook-event-routes.js.map +1 -1
- package/dist/web/routes/html-view-routes.d.ts +60 -0
- package/dist/web/routes/html-view-routes.d.ts.map +1 -0
- package/dist/web/routes/html-view-routes.js +288 -0
- package/dist/web/routes/html-view-routes.js.map +1 -0
- package/dist/web/routes/index.d.ts +2 -0
- package/dist/web/routes/index.d.ts.map +1 -1
- package/dist/web/routes/index.js +2 -0
- package/dist/web/routes/index.js.map +1 -1
- package/dist/web/routes/ralph-routes.d.ts.map +1 -1
- package/dist/web/routes/ralph-routes.js +19 -14
- package/dist/web/routes/ralph-routes.js.map +1 -1
- package/dist/web/routes/reboot-restore-routes.js +2 -2
- package/dist/web/routes/reboot-restore-routes.js.map +1 -1
- package/dist/web/routes/session-routes.d.ts +8 -5
- package/dist/web/routes/session-routes.d.ts.map +1 -1
- package/dist/web/routes/session-routes.js +462 -109
- package/dist/web/routes/session-routes.js.map +1 -1
- package/dist/web/routes/status-telemetry-routes.d.ts.map +1 -1
- package/dist/web/routes/status-telemetry-routes.js +24 -6
- package/dist/web/routes/status-telemetry-routes.js.map +1 -1
- package/dist/web/routes/system-routes.d.ts +9 -0
- package/dist/web/routes/system-routes.d.ts.map +1 -1
- package/dist/web/routes/system-routes.js +91 -12
- package/dist/web/routes/system-routes.js.map +1 -1
- package/dist/web/routes/worktree-routes.d.ts +52 -0
- package/dist/web/routes/worktree-routes.d.ts.map +1 -0
- package/dist/web/routes/worktree-routes.js +220 -0
- package/dist/web/routes/worktree-routes.js.map +1 -0
- package/dist/web/schemas.d.ts +45 -0
- package/dist/web/schemas.d.ts.map +1 -1
- package/dist/web/schemas.js +105 -0
- package/dist/web/schemas.js.map +1 -1
- package/dist/web/screen-blocked.d.ts +80 -0
- package/dist/web/screen-blocked.d.ts.map +1 -0
- package/dist/web/screen-blocked.js +106 -0
- package/dist/web/screen-blocked.js.map +1 -0
- package/dist/web/server.d.ts +6 -1
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +73 -14
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-listener-wiring.d.ts +1 -0
- package/dist/web/session-listener-wiring.d.ts.map +1 -1
- package/dist/web/session-listener-wiring.js +20 -0
- package/dist/web/session-listener-wiring.js.map +1 -1
- package/dist/web/session-wait-registry.d.ts +27 -9
- package/dist/web/session-wait-registry.d.ts.map +1 -1
- package/dist/web/session-wait-registry.js +36 -13
- package/dist/web/session-wait-registry.js.map +1 -1
- package/dist/web/sse-events.d.ts +12 -4
- package/dist/web/sse-events.d.ts.map +1 -1
- package/dist/web/sse-events.js +12 -4
- package/dist/web/sse-events.js.map +1 -1
- package/package.json +3 -2
- package/skills/codeman/SKILL.md +47 -27
- package/skills/codeman/preamble.sh +14 -11
- package/skills/codeman/reference/endpoints.md +1 -1
- package/skills/codeman/reference/recipes.md +12 -9
- package/skills/codeman/reference/verbs.md +3 -1
- package/dist/web/public/app.6f8552e1.js +0 -43
- package/dist/web/public/app.6f8552e1.js.br +0 -0
- package/dist/web/public/app.6f8552e1.js.gz +0 -0
- package/dist/web/public/constants.bc9c1f63.js.br +0 -0
- package/dist/web/public/constants.bc9c1f63.js.gz +0 -0
- package/dist/web/public/i18n.a9840ea2.js +0 -2
- package/dist/web/public/i18n.a9840ea2.js.br +0 -0
- package/dist/web/public/i18n.a9840ea2.js.gz +0 -0
- package/dist/web/public/image-input.e00471c6.js +0 -283
- package/dist/web/public/image-input.e00471c6.js.br +0 -0
- package/dist/web/public/image-input.e00471c6.js.gz +0 -0
- package/dist/web/public/keyboard-accessory.c1e7c7b7.js.br +0 -0
- package/dist/web/public/keyboard-accessory.c1e7c7b7.js.gz +0 -0
- package/dist/web/public/mobile.111b187d.css +0 -1
- package/dist/web/public/mobile.111b187d.css.br +0 -0
- package/dist/web/public/mobile.111b187d.css.gz +0 -0
- package/dist/web/public/panels-ui.71846fcb.js.br +0 -0
- package/dist/web/public/panels-ui.71846fcb.js.gz +0 -0
- package/dist/web/public/respawn-ui.ff0dae4c.js.br +0 -0
- package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
- package/dist/web/public/session-ui.f731602c.js +0 -100
- package/dist/web/public/session-ui.f731602c.js.br +0 -0
- package/dist/web/public/session-ui.f731602c.js.gz +0 -0
- package/dist/web/public/settings-ui.4e33390f.js +0 -97
- package/dist/web/public/settings-ui.4e33390f.js.br +0 -0
- package/dist/web/public/settings-ui.4e33390f.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview.af82fa2f.js.br +0 -0
- package/dist/web/public/spreadsheet-preview.af82fa2f.js.gz +0 -0
- package/dist/web/public/styles.81a72906.css +0 -1
- package/dist/web/public/styles.81a72906.css.br +0 -0
- package/dist/web/public/styles.81a72906.css.gz +0 -0
- package/dist/web/public/tab-layout-browser.065fcba4.js +0 -1
- package/dist/web/public/tab-layout-browser.065fcba4.js.br +0 -0
- package/dist/web/public/tab-layout-browser.065fcba4.js.gz +0 -0
- package/dist/web/public/tab-rail-resize.a5867793.js.br +0 -0
- package/dist/web/public/tab-rail-resize.a5867793.js.gz +0 -0
- package/dist/web/public/terminal-ui.b7267005.js +0 -2
- package/dist/web/public/terminal-ui.b7267005.js.br +0 -0
- package/dist/web/public/terminal-ui.b7267005.js.gz +0 -0
package/dist/web/server.js
CHANGED
|
@@ -62,6 +62,7 @@ import { subagentWatcher, } from '../subagent-watcher.js';
|
|
|
62
62
|
import { imageWatcher } from '../image-watcher.js';
|
|
63
63
|
import { workflowRunWatcher, summarizeRun } from '../workflow-run-watcher.js';
|
|
64
64
|
import { attachmentRegistry, buildFileThumbnailRoute, registerExternalAttachment } from '../attachment-registry.js';
|
|
65
|
+
import { folderGrants } from '../folder-listing.js';
|
|
65
66
|
import { getCli, enabledClis, listClis } from '../config/cli-registry/registry.js';
|
|
66
67
|
import { isCliEntryInstalled, probeStockCliAvailability } from '../utils/cli-installed-probes.js';
|
|
67
68
|
import { readCustomModelHosts } from '../custom-model-hosts.js';
|
|
@@ -87,6 +88,7 @@ import { sessionWaits } from './session-wait-registry.js';
|
|
|
87
88
|
import { intentStore } from '../intent-store.js';
|
|
88
89
|
import { AI_CHECK_MODEL } from '../config/ai-defaults.js';
|
|
89
90
|
import { approvalInbox } from './approval-inbox.js';
|
|
91
|
+
import { SCREEN_BLOCKED_SOURCE } from './screen-blocked.js';
|
|
90
92
|
import { stopDeepSeekWeb } from '../deepseek-web-server.js';
|
|
91
93
|
import { wireRespawnListeners, setupTimedRespawn, restoreRespawnController, saveRespawnConfig, } from './respawn-event-wiring.js';
|
|
92
94
|
import { reconcileUpdateOnBoot } from './self-update.js';
|
|
@@ -111,6 +113,7 @@ import { MAX_CONCURRENT_SESSIONS, MAX_SSE_CLIENTS } from '../config/map-limits.j
|
|
|
111
113
|
import { MAX_PASTE_IMAGE_BYTES } from '../config/buffer-limits.js';
|
|
112
114
|
import { resolveTerminalHistoryConfig } from '../config/terminal-history.js';
|
|
113
115
|
import { SseEvent } from './sse-events.js';
|
|
116
|
+
import { MAX_ROUTE_PARAM_LENGTH } from './route-helpers.js';
|
|
114
117
|
import { getLatestPlanUsage, setLatestCodexPlanUsage } from './plan-usage-latest.js';
|
|
115
118
|
import { telemetrySignature } from '../usage-telemetry.js';
|
|
116
119
|
import { readCodexPlanUsage, resolveCodexBinaryPath } from '../utils/codex-cli-resolver.js';
|
|
@@ -119,7 +122,7 @@ import { isMultiUserMode } from '../config/multiuser.js';
|
|
|
119
122
|
import { bootstrapInitialAdmin, hasUsers, resolveClaudeModeForUsername } from '../user-store.js';
|
|
120
123
|
import { installRouteErrorHandler } from './route-error-handler.js';
|
|
121
124
|
import { isExplicitlyEnabled, isLoopbackBindHost, buildHostPolicy } from './network-auth-policy.js';
|
|
122
|
-
import { registerPushRoutes, registerTeamRoutes, registerMuxRoutes, registerFileRoutes, registerScheduledRoutes, registerHookEventRoutes, registerApprovalRoutes, registerRebootRestoreRoutes, registerReadMyMindRoutes, registerGitStatusRoutes, registerStatusTelemetryRoutes, registerSystemRoutes, registerCaseRoutes, registerSessionRoutes, registerRespawnRoutes, registerRalphRoutes, registerPlanRoutes, registerClipboardRoutes, registerSearchRoutes, registerOrchestratorRoutes, registerCronRoutes, registerMeRoutes, registerAdminRoutes, registerWsRoutes, registerVoiceRoutes, registerWebviewRoutes, registerTabLayoutRoutes, registerMcpSyncRoutes, registerWebhookRoutes, registerDoctorRoutes, registerCustomModelRoutes, refreshAllCustomModelHosts, readCustomModelEndpointsEnabled, closeAllLlamaSwapLogTails, detectCustomModelSwapDisplacements, pruneIdleLlamaSwapLogTails, tryWebviewRefererFallback, registerCliRegistryRoutes, } from './routes/index.js';
|
|
125
|
+
import { registerPushRoutes, registerTeamRoutes, registerMuxRoutes, registerFileRoutes, registerHtmlViewRoutes, registerScheduledRoutes, registerHookEventRoutes, registerApprovalRoutes, registerRebootRestoreRoutes, registerReadMyMindRoutes, registerGitStatusRoutes, registerStatusTelemetryRoutes, registerSystemRoutes, registerCaseRoutes, registerWorktreeRoutes, registerSessionRoutes, registerRespawnRoutes, registerRalphRoutes, registerPlanRoutes, registerClipboardRoutes, registerSearchRoutes, registerOrchestratorRoutes, registerCronRoutes, registerMeRoutes, registerAdminRoutes, registerWsRoutes, registerVoiceRoutes, registerWebviewRoutes, registerTabLayoutRoutes, registerMcpSyncRoutes, registerWebhookRoutes, registerDoctorRoutes, registerCustomModelRoutes, refreshAllCustomModelHosts, readCustomModelEndpointsEnabled, closeAllLlamaSwapLogTails, detectCustomModelSwapDisplacements, pruneIdleLlamaSwapLogTails, tryWebviewRefererFallback, registerCliRegistryRoutes, } from './routes/index.js';
|
|
123
126
|
import { isLostWebviewFrameNavigation } from './webview-proxy.js';
|
|
124
127
|
import { CronService } from '../cron/cron-service.js';
|
|
125
128
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
@@ -282,10 +285,15 @@ export class WebServer extends EventEmitter {
|
|
|
282
285
|
const rewriteUrl = (req) => rewriteApiV1Url(stripBasePath(this.basePath, req.url || ''));
|
|
283
286
|
if (https) {
|
|
284
287
|
const { key, cert } = getOrCreateSelfSignedCert();
|
|
285
|
-
this.app = Fastify({
|
|
288
|
+
this.app = Fastify({
|
|
289
|
+
logger: false,
|
|
290
|
+
https: { key, cert },
|
|
291
|
+
rewriteUrl,
|
|
292
|
+
routerOptions: { maxParamLength: MAX_ROUTE_PARAM_LENGTH },
|
|
293
|
+
});
|
|
286
294
|
}
|
|
287
295
|
else {
|
|
288
|
-
this.app = Fastify({ logger: false, rewriteUrl });
|
|
296
|
+
this.app = Fastify({ logger: false, rewriteUrl, routerOptions: { maxParamLength: MAX_ROUTE_PARAM_LENGTH } });
|
|
289
297
|
}
|
|
290
298
|
this.mux = createMultiplexer();
|
|
291
299
|
this.sse = new SseStreamManager({
|
|
@@ -304,6 +312,9 @@ export class WebServer extends EventEmitter {
|
|
|
304
312
|
this.cachedLightState = null;
|
|
305
313
|
this.sse.broadcastSessionOrder(change);
|
|
306
314
|
},
|
|
315
|
+
// Fresh, not the 2s cache: the settings PUT does not invalidate it, and a
|
|
316
|
+
// flip must apply to the very next spawn.
|
|
317
|
+
childrenFollowParent: async () => (await this.readSettings(true)).spawnedTabsFollowParent === true,
|
|
307
318
|
});
|
|
308
319
|
if (this.testMode)
|
|
309
320
|
this.tabLayouts.markRestorationSkipped();
|
|
@@ -537,16 +548,20 @@ export class WebServer extends EventEmitter {
|
|
|
537
548
|
this.teamWatcherHandlers = null;
|
|
538
549
|
}
|
|
539
550
|
}
|
|
540
|
-
/**
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
551
|
+
/**
|
|
552
|
+
* Add a tentative session only after its owner layout accepts the creation.
|
|
553
|
+
* The session enters the live map inside the layout service's owner lock, so
|
|
554
|
+
* the placement it asked for (`tabGroupId`) lands in the same versioned write
|
|
555
|
+
* that first records it.
|
|
556
|
+
*/
|
|
557
|
+
async registerSessionWithLayout(session, placement) {
|
|
558
|
+
return this.tabLayouts.sessionCreated(ownerLayoutKey(session.owner), session.id, placement, () => {
|
|
559
|
+
this.sessions.set(session.id, session);
|
|
560
|
+
return () => {
|
|
561
|
+
if (this.sessions.get(session.id) === session)
|
|
562
|
+
this.sessions.delete(session.id);
|
|
563
|
+
};
|
|
564
|
+
});
|
|
550
565
|
}
|
|
551
566
|
/**
|
|
552
567
|
* Build a route context object satisfying all 5 port interfaces.
|
|
@@ -944,6 +959,7 @@ export class WebServer extends EventEmitter {
|
|
|
944
959
|
registerTeamRoutes(this.app, ctx);
|
|
945
960
|
registerMuxRoutes(this.app, ctx);
|
|
946
961
|
registerFileRoutes(this.app, ctx);
|
|
962
|
+
registerHtmlViewRoutes(this.app, ctx);
|
|
947
963
|
registerScheduledRoutes(this.app, ctx);
|
|
948
964
|
registerHookEventRoutes(this.app, ctx);
|
|
949
965
|
registerApprovalRoutes(this.app, ctx);
|
|
@@ -953,6 +969,7 @@ export class WebServer extends EventEmitter {
|
|
|
953
969
|
registerStatusTelemetryRoutes(this.app, ctx);
|
|
954
970
|
registerSystemRoutes(this.app, ctx);
|
|
955
971
|
registerCaseRoutes(this.app, ctx);
|
|
972
|
+
registerWorktreeRoutes(this.app, ctx);
|
|
956
973
|
// The registry's lifetime is the server's: it drops per-session wake state on every
|
|
957
974
|
// cleanup path and resolves in-flight wakes on shutdown.
|
|
958
975
|
this.remoteWake = registerSessionRoutes(this.app, ctx);
|
|
@@ -1296,6 +1313,7 @@ export class WebServer extends EventEmitter {
|
|
|
1296
1313
|
fileStreamManager.closeSessionStreams(sessionId);
|
|
1297
1314
|
// Drop live external attachment registrations for this session
|
|
1298
1315
|
attachmentRegistry.clearSession(sessionId);
|
|
1316
|
+
folderGrants.clearSession(sessionId);
|
|
1299
1317
|
// Stop watching for images in this session's directory
|
|
1300
1318
|
imageWatcher.unwatchSession(sessionId);
|
|
1301
1319
|
// Clean up pasted images directory for this session. The dir belongs to the
|
|
@@ -1533,6 +1551,16 @@ export class WebServer extends EventEmitter {
|
|
|
1533
1551
|
gutterClis[entry.id] = columns;
|
|
1534
1552
|
}
|
|
1535
1553
|
html = html.replace('</head>', () => `<script>window.__codemanTranscriptGutter=${JSON.stringify(gutterClis)};</script>\n</head>`);
|
|
1554
|
+
// Which run modes page their own transcript on PageUp/PageDown, for the scroll
|
|
1555
|
+
// fallback over a pane with no local history (`_maybePageCliTranscript`). Read off
|
|
1556
|
+
// the `transcriptPageKeys` capability, never an id list here, and injected for a
|
|
1557
|
+
// solo window too for the same reason as the gutter map: it scrolls a terminal.
|
|
1558
|
+
// Ids only, which the registry schema bounds to kebab tokens, so JSON.stringify
|
|
1559
|
+
// alone is enough.
|
|
1560
|
+
const pageKeyClis = enabledClis()
|
|
1561
|
+
.filter((entry) => entry.capabilities.transcriptPageKeys === true)
|
|
1562
|
+
.map((entry) => entry.id);
|
|
1563
|
+
html = html.replace('</head>', () => `<script>window.__codemanTranscriptPageKeys=${JSON.stringify(pageKeyClis)};</script>\n</head>`);
|
|
1536
1564
|
if (!soloSessionId && process.env.CODEMAN_GESTURE === '1') {
|
|
1537
1565
|
html = html.replace('</head>', () => `<script>window.__codemanGestureAvailable=true;</script>\n</head>`);
|
|
1538
1566
|
if (settings.gestureControlEnabled === true) {
|
|
@@ -2401,9 +2429,12 @@ export class WebServer extends EventEmitter {
|
|
|
2401
2429
|
// Approvals Inbox item id: lets sw.js answer an Approve/Deny action
|
|
2402
2430
|
// click directly (POST /api/approvals/:id/answer) with no tab open.
|
|
2403
2431
|
// Gated on the opt-in setting together with the action buttons.
|
|
2432
|
+
// Approve/Deny only when we also have an approvalId to answer with.
|
|
2433
|
+
// Supervised-hook CLIs (DeepSeek) omit approvalId upstream so this also
|
|
2434
|
+
// strips their action buttons — buttons without an id can never answer.
|
|
2404
2435
|
approvalId: approvalsEnabled && typeof data.approvalId === 'string' ? data.approvalId : undefined,
|
|
2405
2436
|
urgency: template.urgency,
|
|
2406
|
-
actions: approvalsEnabled ? template.actions : undefined,
|
|
2437
|
+
actions: approvalsEnabled && typeof data.approvalId === 'string' ? template.actions : undefined,
|
|
2407
2438
|
});
|
|
2408
2439
|
for (const sub of subscriptions) {
|
|
2409
2440
|
// Check per-subscription preferences
|
|
@@ -2461,6 +2492,15 @@ export class WebServer extends EventEmitter {
|
|
|
2461
2492
|
body += body ? ' ' : '';
|
|
2462
2493
|
body += `Tool: ${String(data.tool_name)}`;
|
|
2463
2494
|
}
|
|
2495
|
+
else if (event === SseEvent.HookPermissionPrompt && data.source === SCREEN_BLOCKED_SOURCE && data.message) {
|
|
2496
|
+
// A dialog read off a hook-less CLI's screen (web/screen-blocked.ts), whose message
|
|
2497
|
+
// is built from the CLI's label, never from the screen. Keyed on the source so a
|
|
2498
|
+
// Claude hook's own `message` keeps the body it always had; capped like the error
|
|
2499
|
+
// text, since a hook poster holding the secret can claim the source too (as it can
|
|
2500
|
+
// already claim any `tool_name` above).
|
|
2501
|
+
body += body ? ' ' : '';
|
|
2502
|
+
body += String(data.message).slice(0, 200);
|
|
2503
|
+
}
|
|
2464
2504
|
return body;
|
|
2465
2505
|
}
|
|
2466
2506
|
cleanupDeadSSEClients() {
|
|
@@ -3005,6 +3045,7 @@ export class WebServer extends EventEmitter {
|
|
|
3005
3045
|
// otherwise meet the retry, which reuses the same session id by design.
|
|
3006
3046
|
this.stopTranscriptWatcher(sessionId);
|
|
3007
3047
|
attachmentRegistry.clearSession(sessionId);
|
|
3048
|
+
folderGrants.clearSession(sessionId);
|
|
3008
3049
|
sessionWaits.notifySignal(sessionId, 'exit');
|
|
3009
3050
|
sessionWaits.cancelAll(sessionId);
|
|
3010
3051
|
approvalInbox.resolveForSession(sessionId, 'session_ended');
|
|
@@ -3145,6 +3186,11 @@ export class WebServer extends EventEmitter {
|
|
|
3145
3186
|
// tile header keeps naming it until the next report; an idle claude
|
|
3146
3187
|
// session re-renders its statusline only on its next turn.
|
|
3147
3188
|
displayModel: savedState?.displayModel,
|
|
3189
|
+
// The last prompt-cache report, restored for the same reason: an idle claude
|
|
3190
|
+
// session re-renders its statusline only on its next turn, so without this the
|
|
3191
|
+
// Session Options readout would read "not reported yet" after every restart. The
|
|
3192
|
+
// readout is time-aware, so a value past its expiry shows as cold, not stale-warm.
|
|
3193
|
+
promptCache: savedState?.promptCache,
|
|
3148
3194
|
// A record rebuilt from the socket has no provenance, so its
|
|
3149
3195
|
// apparent locality is a guess (see `MuxSession.discovered`).
|
|
3150
3196
|
discoveredMuxSession: muxSession.discovered,
|
|
@@ -3243,6 +3289,19 @@ export class WebServer extends EventEmitter {
|
|
|
3243
3289
|
if (savedState.flickerFilterEnabled !== undefined) {
|
|
3244
3290
|
session.flickerFilterEnabled = savedState.flickerFilterEnabled;
|
|
3245
3291
|
}
|
|
3292
|
+
// Tab colour, pin and the image watcher are user-set and persisted like the settings
|
|
3293
|
+
// above, but this path never read them back: after a restart every surviving pane came
|
|
3294
|
+
// back uncoloured and unpinned with its image watcher off, and the next persist
|
|
3295
|
+
// overwrote the saved values. `reapplyPersistedSessionState()` (the reboot-restore
|
|
3296
|
+
// path) already restores all three. The watcher flag has to be set before
|
|
3297
|
+
// `setupSessionListeners()` below, which reads it to decide whether to start one.
|
|
3298
|
+
if (savedState.color)
|
|
3299
|
+
session.setColor(savedState.color);
|
|
3300
|
+
if (savedState.pinned)
|
|
3301
|
+
session.restorePin(true, savedState.pinnedAt);
|
|
3302
|
+
if (savedState.imageWatcherEnabled !== undefined) {
|
|
3303
|
+
session.imageWatcherEnabled = savedState.imageWatcherEnabled;
|
|
3304
|
+
}
|
|
3246
3305
|
// Respawn controller (not supported for external-CLI sessions)
|
|
3247
3306
|
if (!isExternalCliMode(session.mode) && savedState.respawnEnabled && savedState.respawnConfig) {
|
|
3248
3307
|
try {
|