aicodeman 1.47.0 → 1.49.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 +15 -3
- package/dist/cli-notify.d.ts +34 -0
- package/dist/cli-notify.d.ts.map +1 -0
- package/dist/cli-notify.js +100 -0
- package/dist/cli-notify.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +16 -0
- package/dist/cli.js.map +1 -1
- package/dist/config/cli-registry/patterns.d.ts +1 -1
- package/dist/config/cli-registry/patterns.d.ts.map +1 -1
- package/dist/config/cli-registry/patterns.js +4 -0
- package/dist/config/cli-registry/patterns.js.map +1 -1
- package/dist/config/cli-registry/schema.d.ts +7 -0
- package/dist/config/cli-registry/schema.d.ts.map +1 -1
- package/dist/config/cli-registry/schema.js +67 -3
- 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 +114 -31
- package/dist/config/cli-registry/stock.js.map +1 -1
- package/dist/config/cli-registry/types.d.ts +51 -21
- package/dist/config/cli-registry/types.d.ts.map +1 -1
- package/dist/config/foreign-tmux.d.ts +48 -0
- package/dist/config/foreign-tmux.d.ts.map +1 -0
- package/dist/config/foreign-tmux.js +48 -0
- package/dist/config/foreign-tmux.js.map +1 -0
- package/dist/config/path-probe.d.ts +6 -0
- package/dist/config/path-probe.d.ts.map +1 -1
- package/dist/config/path-probe.js +6 -0
- package/dist/config/path-probe.js.map +1 -1
- package/dist/config-backup.d.ts +1 -1
- package/dist/config-backup.d.ts.map +1 -1
- package/dist/config-backup.js +2 -0
- package/dist/config-backup.js.map +1 -1
- package/dist/custom-model-hosts.d.ts +32 -8
- package/dist/custom-model-hosts.d.ts.map +1 -1
- package/dist/custom-model-hosts.js +10 -0
- package/dist/custom-model-hosts.js.map +1 -1
- package/dist/custom-model-injection-apply.d.ts +21 -5
- package/dist/custom-model-injection-apply.d.ts.map +1 -1
- package/dist/custom-model-injection-apply.js +121 -27
- package/dist/custom-model-injection-apply.js.map +1 -1
- package/dist/custom-model-injection.d.ts +6 -0
- package/dist/custom-model-injection.d.ts.map +1 -1
- package/dist/custom-model-injection.js +92 -10
- package/dist/custom-model-injection.js.map +1 -1
- package/dist/discord-bridge.d.ts +338 -0
- package/dist/discord-bridge.d.ts.map +1 -0
- package/dist/discord-bridge.js +1256 -0
- package/dist/discord-bridge.js.map +1 -0
- package/dist/docker-hosts.d.ts +8 -1
- package/dist/docker-hosts.d.ts.map +1 -1
- package/dist/docker-hosts.js +5 -5
- package/dist/docker-hosts.js.map +1 -1
- package/dist/edit-history-local-source.d.ts +83 -0
- package/dist/edit-history-local-source.d.ts.map +1 -0
- package/dist/edit-history-local-source.js +198 -0
- package/dist/edit-history-local-source.js.map +1 -0
- package/dist/edit-history-parse.d.ts +114 -0
- package/dist/edit-history-parse.d.ts.map +1 -0
- package/dist/edit-history-parse.js +312 -0
- package/dist/edit-history-parse.js.map +1 -0
- package/dist/edit-history-store.d.ts +209 -0
- package/dist/edit-history-store.d.ts.map +1 -0
- package/dist/edit-history-store.js +599 -0
- package/dist/edit-history-store.js.map +1 -0
- package/dist/foreign-tmux-discovery.d.ts +140 -0
- package/dist/foreign-tmux-discovery.d.ts.map +1 -0
- package/dist/foreign-tmux-discovery.js +366 -0
- package/dist/foreign-tmux-discovery.js.map +1 -0
- package/dist/foreign-tmux.d.ts +381 -0
- package/dist/foreign-tmux.d.ts.map +1 -0
- package/dist/foreign-tmux.js +775 -0
- package/dist/foreign-tmux.js.map +1 -0
- package/dist/git-clone.d.ts +6 -1
- package/dist/git-clone.d.ts.map +1 -1
- package/dist/git-clone.js +79 -14
- package/dist/git-clone.js.map +1 -1
- package/dist/git-fetch-scheduler.d.ts +2 -0
- package/dist/git-fetch-scheduler.d.ts.map +1 -1
- package/dist/git-fetch-scheduler.js +1 -1
- package/dist/git-fetch-scheduler.js.map +1 -1
- package/dist/git-fetch.d.ts +1 -1
- package/dist/git-fetch.d.ts.map +1 -1
- package/dist/git-workspace-status.d.ts +2 -2
- package/dist/git-workspace-status.d.ts.map +1 -1
- package/dist/hooks-config.d.ts +2 -1
- package/dist/hooks-config.d.ts.map +1 -1
- package/dist/hooks-config.js +2 -1
- package/dist/hooks-config.js.map +1 -1
- package/dist/image-watcher.js +4 -4
- package/dist/image-watcher.js.map +1 -1
- package/dist/live-worktree.d.ts +53 -0
- package/dist/live-worktree.d.ts.map +1 -0
- package/dist/live-worktree.js +97 -0
- package/dist/live-worktree.js.map +1 -0
- package/dist/mux-interface.d.ts +22 -2
- package/dist/mux-interface.d.ts.map +1 -1
- package/dist/reboot-restore.d.ts +1 -1
- package/dist/reboot-restore.d.ts.map +1 -1
- package/dist/reboot-restore.js +9 -0
- package/dist/reboot-restore.js.map +1 -1
- package/dist/remote-files.d.ts +150 -5
- package/dist/remote-files.d.ts.map +1 -1
- package/dist/remote-files.js +505 -7
- package/dist/remote-files.js.map +1 -1
- package/dist/remote-hosts.d.ts +15 -9
- package/dist/remote-hosts.d.ts.map +1 -1
- package/dist/remote-hosts.js +42 -20
- package/dist/remote-hosts.js.map +1 -1
- package/dist/session-cli-registry-bridge.d.ts.map +1 -1
- package/dist/session-cli-registry-bridge.js +23 -8
- package/dist/session-cli-registry-bridge.js.map +1 -1
- package/dist/session-env-clamp.d.ts +1 -1
- package/dist/session-env-clamp.d.ts.map +1 -1
- package/dist/session-env-clamp.js +4 -3
- package/dist/session-env-clamp.js.map +1 -1
- package/dist/session.d.ts +161 -24
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +337 -37
- package/dist/session.js.map +1 -1
- package/dist/tmux-manager.d.ts +114 -12
- package/dist/tmux-manager.d.ts.map +1 -1
- package/dist/tmux-manager.js +318 -41
- package/dist/tmux-manager.js.map +1 -1
- package/dist/types/discord.d.ts +55 -0
- package/dist/types/discord.d.ts.map +1 -0
- package/dist/types/discord.js +18 -0
- package/dist/types/discord.js.map +1 -0
- package/dist/types/foreign-tmux.d.ts +101 -0
- package/dist/types/foreign-tmux.d.ts.map +1 -0
- package/dist/types/foreign-tmux.js +27 -0
- package/dist/types/foreign-tmux.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/session.d.ts +119 -2
- package/dist/types/session.d.ts.map +1 -1
- package/dist/types/session.js.map +1 -1
- package/dist/types/update.d.ts +4 -1
- package/dist/types/update.d.ts.map +1 -1
- package/dist/web/case-path.d.ts +2 -0
- package/dist/web/case-path.d.ts.map +1 -1
- package/dist/web/case-path.js +3 -3
- package/dist/web/case-path.js.map +1 -1
- package/dist/web/edit-history-sync.d.ts +178 -0
- package/dist/web/edit-history-sync.d.ts.map +1 -0
- package/dist/web/edit-history-sync.js +461 -0
- package/dist/web/edit-history-sync.js.map +1 -0
- package/dist/web/launch-defaults.d.ts +1 -1
- package/dist/web/launch-defaults.js +2 -2
- package/dist/web/launch-defaults.js.map +1 -1
- package/dist/web/linked-cases-writer.d.ts +43 -0
- package/dist/web/linked-cases-writer.d.ts.map +1 -0
- package/dist/web/linked-cases-writer.js +107 -0
- package/dist/web/linked-cases-writer.js.map +1 -0
- package/dist/web/paste-image-gc.d.ts +10 -1
- package/dist/web/paste-image-gc.d.ts.map +1 -1
- package/dist/web/paste-image-gc.js +10 -2
- package/dist/web/paste-image-gc.js.map +1 -1
- package/dist/web/ports/session-port.d.ts +13 -0
- 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.fe8a6b4c.js → app.9ea37070.js} +6 -6
- package/dist/web/public/app.9ea37070.js.br +0 -0
- package/dist/web/public/app.9ea37070.js.gz +0 -0
- package/dist/web/public/approvals-ui.js.gz +0 -0
- package/dist/web/public/{constants.affcdde6.js → constants.782170e1.js} +114 -25
- package/dist/web/public/constants.782170e1.js.br +0 -0
- package/dist/web/public/constants.782170e1.js.gz +0 -0
- package/dist/web/public/cron-ui.js.gz +0 -0
- package/dist/web/public/edit-history-ui.js +643 -0
- package/dist/web/public/edit-history-ui.js.br +0 -0
- package/dist/web/public/edit-history-ui.js.gz +0 -0
- package/dist/web/public/entrance-animations.js.gz +0 -0
- package/dist/web/public/foreign-sessions.js +476 -0
- package/dist/web/public/foreign-sessions.js.br +0 -0
- package/dist/web/public/foreign-sessions.js.gz +0 -0
- package/dist/web/public/git-status-ui.js +5 -3
- package/dist/web/public/git-status-ui.js.br +0 -0
- package/dist/web/public/git-status-ui.js.gz +0 -0
- package/dist/web/public/header-divider.eb2d2463.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.a5e82c95.js +2 -0
- package/dist/web/public/i18n.a5e82c95.js.br +0 -0
- package/dist/web/public/i18n.a5e82c95.js.gz +0 -0
- package/dist/web/public/image-input.a5d0f8f3.js.gz +0 -0
- package/dist/web/public/index.html +183 -18
- 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.ff64fafc.js → keyboard-accessory.b941676c.js} +75 -2
- package/dist/web/public/keyboard-accessory.b941676c.js.br +0 -0
- package/dist/web/public/keyboard-accessory.b941676c.js.gz +0 -0
- package/dist/web/public/mobile-handlers.f7c3f692.js.gz +0 -0
- package/dist/web/public/mobile-ime-preview.2dbaf262.js.gz +0 -0
- package/dist/web/public/mobile-overview.js +10 -0
- 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.67c8eb5b.css +1 -0
- package/dist/web/public/mobile.67c8eb5b.css.br +0 -0
- package/dist/web/public/mobile.67c8eb5b.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.4a56ee63.js → panels-ui.8bcd4473.js} +5 -5
- package/dist/web/public/panels-ui.8bcd4473.js.br +0 -0
- package/dist/web/public/panels-ui.8bcd4473.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.d7adcf6a.js → respawn-ui.304ba0d4.js} +1 -1
- package/dist/web/public/respawn-ui.304ba0d4.js.br +0 -0
- package/dist/web/public/respawn-ui.304ba0d4.js.gz +0 -0
- package/dist/web/public/sanitize-html.e7147e76.js.gz +0 -0
- package/dist/web/public/security-notices.json +1 -21
- package/dist/web/public/session-lineage.js.gz +0 -0
- package/dist/web/public/{session-ui.426fb671.js → session-ui.a7c8c095.js} +30 -30
- package/dist/web/public/session-ui.a7c8c095.js.br +0 -0
- package/dist/web/public/session-ui.a7c8c095.js.gz +0 -0
- package/dist/web/public/settings-ui.18f92052.js +106 -0
- package/dist/web/public/settings-ui.18f92052.js.br +0 -0
- package/dist/web/public/settings-ui.18f92052.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview-worker.js.gz +0 -0
- package/dist/web/public/spreadsheet-preview.75c751de.js.gz +0 -0
- package/dist/web/public/spreadsheet-xlsx-core.js.gz +0 -0
- package/dist/web/public/styles.6a718331.css +1 -0
- package/dist/web/public/styles.6a718331.css.br +0 -0
- package/dist/web/public/styles.6a718331.css.gz +0 -0
- package/dist/web/public/subagent-windows.07277a58.js.gz +0 -0
- package/dist/web/public/sw.js +2 -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.gz +0 -0
- package/dist/web/public/tab-rail-resize.b5cdceaf.js.gz +0 -0
- package/dist/web/public/terminal-keycode229-recovery.98843069.js.gz +0 -0
- package/dist/web/public/terminal-split.js.gz +0 -0
- package/dist/web/public/terminal-tile.js +2 -2
- 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.a7883640.js +4 -0
- package/dist/web/public/terminal-ui.a7883640.js.br +0 -0
- package/dist/web/public/terminal-ui.a7883640.js.gz +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.276b11d9.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.1be42307.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.gz +0 -0
- package/dist/web/public/whats-new.json +9 -8
- package/dist/web/routes/case-routes.d.ts.map +1 -1
- package/dist/web/routes/case-routes.js +165 -50
- package/dist/web/routes/case-routes.js.map +1 -1
- package/dist/web/routes/config-backup-routes.d.ts +5 -1
- package/dist/web/routes/config-backup-routes.d.ts.map +1 -1
- package/dist/web/routes/config-backup-routes.js +4 -1
- package/dist/web/routes/config-backup-routes.js.map +1 -1
- package/dist/web/routes/custom-model-routes.d.ts +7 -2
- package/dist/web/routes/custom-model-routes.d.ts.map +1 -1
- package/dist/web/routes/custom-model-routes.js +51 -6
- package/dist/web/routes/custom-model-routes.js.map +1 -1
- package/dist/web/routes/discord-routes.d.ts +25 -0
- package/dist/web/routes/discord-routes.d.ts.map +1 -0
- package/dist/web/routes/discord-routes.js +206 -0
- package/dist/web/routes/discord-routes.js.map +1 -0
- package/dist/web/routes/edit-history-routes.d.ts +43 -0
- package/dist/web/routes/edit-history-routes.d.ts.map +1 -0
- package/dist/web/routes/edit-history-routes.js +107 -0
- package/dist/web/routes/edit-history-routes.js.map +1 -0
- package/dist/web/routes/file-routes.d.ts.map +1 -1
- package/dist/web/routes/file-routes.js +273 -102
- package/dist/web/routes/file-routes.js.map +1 -1
- package/dist/web/routes/git-status-routes.d.ts.map +1 -1
- package/dist/web/routes/git-status-routes.js +7 -2
- package/dist/web/routes/git-status-routes.js.map +1 -1
- 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/mux-routes.d.ts +10 -3
- package/dist/web/routes/mux-routes.d.ts.map +1 -1
- package/dist/web/routes/mux-routes.js +59 -1
- package/dist/web/routes/mux-routes.js.map +1 -1
- package/dist/web/routes/ralph-routes.d.ts.map +1 -1
- package/dist/web/routes/ralph-routes.js +22 -0
- package/dist/web/routes/ralph-routes.js.map +1 -1
- package/dist/web/routes/readmymind-routes.d.ts.map +1 -1
- package/dist/web/routes/readmymind-routes.js +3 -2
- package/dist/web/routes/readmymind-routes.js.map +1 -1
- package/dist/web/routes/respawn-routes.d.ts.map +1 -1
- package/dist/web/routes/respawn-routes.js +24 -0
- package/dist/web/routes/respawn-routes.js.map +1 -1
- package/dist/web/routes/session-routes.d.ts +21 -1
- package/dist/web/routes/session-routes.d.ts.map +1 -1
- package/dist/web/routes/session-routes.js +338 -55
- package/dist/web/routes/session-routes.js.map +1 -1
- package/dist/web/routes/system-routes.d.ts.map +1 -1
- package/dist/web/routes/system-routes.js +4 -2
- package/dist/web/routes/system-routes.js.map +1 -1
- package/dist/web/schemas.d.ts +92 -2
- package/dist/web/schemas.d.ts.map +1 -1
- package/dist/web/schemas.js +111 -10
- package/dist/web/schemas.js.map +1 -1
- package/dist/web/self-update.d.ts +9 -0
- package/dist/web/self-update.d.ts.map +1 -1
- package/dist/web/self-update.js +19 -3
- package/dist/web/self-update.js.map +1 -1
- package/dist/web/sensitive-path.d.ts.map +1 -1
- package/dist/web/sensitive-path.js +15 -0
- package/dist/web/sensitive-path.js.map +1 -1
- package/dist/web/server.d.ts +56 -0
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +285 -17
- package/dist/web/server.js.map +1 -1
- package/dist/web/session-wait-registry.d.ts +13 -0
- package/dist/web/session-wait-registry.d.ts.map +1 -1
- package/dist/web/session-wait-registry.js +16 -8
- package/dist/web/session-wait-registry.js.map +1 -1
- package/package.json +2 -2
- package/skills/codeman/SKILL.md +20 -4
- package/dist/web/public/app.fe8a6b4c.js.br +0 -0
- package/dist/web/public/app.fe8a6b4c.js.gz +0 -0
- package/dist/web/public/constants.affcdde6.js.br +0 -0
- package/dist/web/public/constants.affcdde6.js.gz +0 -0
- package/dist/web/public/i18n.a618ef4e.js +0 -2
- package/dist/web/public/i18n.a618ef4e.js.br +0 -0
- package/dist/web/public/i18n.a618ef4e.js.gz +0 -0
- package/dist/web/public/keyboard-accessory.ff64fafc.js.br +0 -0
- package/dist/web/public/keyboard-accessory.ff64fafc.js.gz +0 -0
- package/dist/web/public/mobile.1bbd2d67.css +0 -1
- package/dist/web/public/mobile.1bbd2d67.css.br +0 -0
- package/dist/web/public/mobile.1bbd2d67.css.gz +0 -0
- package/dist/web/public/panels-ui.4a56ee63.js.br +0 -0
- package/dist/web/public/panels-ui.4a56ee63.js.gz +0 -0
- 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/session-ui.426fb671.js.br +0 -0
- package/dist/web/public/session-ui.426fb671.js.gz +0 -0
- package/dist/web/public/settings-ui.a191154e.js +0 -106
- package/dist/web/public/settings-ui.a191154e.js.br +0 -0
- package/dist/web/public/settings-ui.a191154e.js.gz +0 -0
- package/dist/web/public/styles.4f0c67a0.css +0 -1
- package/dist/web/public/styles.4f0c67a0.css.br +0 -0
- package/dist/web/public/styles.4f0c67a0.css.gz +0 -0
- package/dist/web/public/terminal-ui.7e787829.js +0 -4
- package/dist/web/public/terminal-ui.7e787829.js.br +0 -0
- package/dist/web/public/terminal-ui.7e787829.js.gz +0 -0
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
<link rel="manifest" href="manifest.json">
|
|
17
17
|
<title>Codeman</title>
|
|
18
18
|
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Cdefs%3E%3ClinearGradient id='g' x1='0%25' y1='0%25' x2='100%25' y2='100%25'%3E%3Cstop offset='0%25' stop-color='%2360a5fa'/%3E%3Cstop offset='100%25' stop-color='%233b82f6'/%3E%3C/linearGradient%3E%3C/defs%3E%3Crect width='32' height='32' rx='6' fill='%230a0a0a'/%3E%3Cpath d='M18 4L8 18h6l-2 10 10-14h-6z' fill='url(%23g)'/%3E%3C/svg%3E">
|
|
19
|
-
<link rel="stylesheet" href="styles.
|
|
20
|
-
<link rel="stylesheet" href="mobile.
|
|
19
|
+
<link rel="stylesheet" href="styles.6a718331.css">
|
|
20
|
+
<link rel="stylesheet" href="mobile.67c8eb5b.css" media="(max-width: 1023px)">
|
|
21
21
|
<!-- xterm.css loaded async — terminal won't display until xterm.js runs anyway -->
|
|
22
22
|
<link rel="preload" href="vendor/xterm.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
|
|
23
23
|
<noscript><link rel="stylesheet" href="vendor/xterm.css"></noscript>
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
<!-- Symbols font before the terminal first paints — a late-loading icon font
|
|
28
28
|
leaves tofu in xterm's glyph atlas until something forces a re-render. -->
|
|
29
29
|
<link rel="preload" href="fonts/symbols-nerd-font-mono.woff2" as="font" type="font/woff2" crossorigin>
|
|
30
|
-
<link rel="preload" href="constants.
|
|
31
|
-
<link rel="preload" href="app.
|
|
30
|
+
<link rel="preload" href="constants.782170e1.js" as="script">
|
|
31
|
+
<link rel="preload" href="app.9ea37070.js" as="script">
|
|
32
32
|
<!-- Self-hosted xterm.js — eliminates CDN DNS/TLS latency (~100ms).
|
|
33
33
|
'defer' preserves execution order (xterm loads before fit addon). -->
|
|
34
34
|
<script defer src="vendor/xterm.min.js"></script>
|
|
@@ -216,6 +216,13 @@
|
|
|
216
216
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"/></svg>
|
|
217
217
|
<span class="attachment-history-badge" id="attachmentHistoryBadge" style="display:none;">0</span>
|
|
218
218
|
</button>
|
|
219
|
+
<!-- Edit history of the active session (edit-history-ui.js), next to Attachments: both show
|
|
220
|
+
what the session produced, and the panel opens right below. Optional and per-device
|
|
221
|
+
(App Settings → Header & Panels → Header, default OFF): hidden by its marker class,
|
|
222
|
+
never on phones (mobile.css). -->
|
|
223
|
+
<button type="button" class="btn-icon-header btn-edit-history btn-edit-history--hidden" id="editHistoryBtn" aria-expanded="false" aria-controls="editHistoryPanel" title="Edit history" aria-label="Open edit history" onclick="app.toggleEditHistoryPanel()">
|
|
224
|
+
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"/><path d="M3 3v5h5"/><path d="M12 7v5l4 2"/></svg>
|
|
225
|
+
</button>
|
|
219
226
|
<button class="btn-icon-header btn-file-viewer" onclick="app.toggleFileBrowserButton()" title="File Viewer" aria-label="Open file viewer" aria-expanded="false"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path class="icon-folder-closed" d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><g class="icon-folder-open"><path d="M3 17V7a2 2 0 0 1 2-2h4l2 2h6a2 2 0 0 1 2 2v1.5"/><path d="M3 17l2.3-5.4A2 2 0 0 1 7.2 10.5H20a1.5 1.5 0 0 1 1.4 2l-1.9 5.2A2 2 0 0 1 17.6 19H5a2 2 0 0 1-2-2z"/></g></svg></button>
|
|
220
227
|
<button class="btn-icon-header btn-multimonitor btn-multimonitor--hidden" onclick="app.launchMultiMonitor()" title="Open Codeman across all displays" aria-label="Open Codeman across all displays"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2" y="4" width="13" height="9" rx="1.5"/><rect x="11" y="9" width="11" height="8" rx="1.5"/></svg></button>
|
|
221
228
|
<button class="btn-icon-header btn-split btn-split--hidden" onclick="app.openSplitPicker(event)" title="Split: open a second session beside this one" aria-label="Split: open a second session beside this one" aria-pressed="false"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2" y="3" width="20" height="18" rx="2"/><line x1="12" y1="3" x2="12" y2="21"/></svg></button>
|
|
@@ -576,6 +583,12 @@
|
|
|
576
583
|
</div>
|
|
577
584
|
<div class="history-list" id="historyList"></div>
|
|
578
585
|
</div>
|
|
586
|
+
<!-- Sessions a human started outside Codeman (foreign-sessions.js).
|
|
587
|
+
Hidden until a scan finds one; never rendered empty on a fresh
|
|
588
|
+
install, where an empty block reads as a broken feature. -->
|
|
589
|
+
<div class="welcome-foreign">
|
|
590
|
+
<div class="foreign-sessions" id="foreignSessions" hidden></div>
|
|
591
|
+
</div>
|
|
579
592
|
<p class="welcome-hint">Or click Run to start</p>
|
|
580
593
|
<button class="welcome-ralph-link" onclick="app.showRalphWizard()">Start Ralph Loop →</button>
|
|
581
594
|
</div>
|
|
@@ -610,6 +623,11 @@
|
|
|
610
623
|
<button class="btn-icon-sm" onclick="app.closeFileBrowserPanel()" title="Close">×</button>
|
|
611
624
|
</div>
|
|
612
625
|
</div>
|
|
626
|
+
<div class="file-browser-root" id="fileBrowserRoot" hidden>
|
|
627
|
+
<span class="file-browser-root-label" id="fileBrowserRootLabel"></span>
|
|
628
|
+
<span class="file-browser-root-name" id="fileBrowserRootName" data-i18n-skip></span>
|
|
629
|
+
<button type="button" class="file-browser-root-switch" id="fileBrowserRootSwitch" onclick="app.toggleFileBrowserRoot()">Session folder</button>
|
|
630
|
+
</div>
|
|
613
631
|
<div class="file-browser-search">
|
|
614
632
|
<input type="text" id="fileBrowserSearch" placeholder="Filter files..." oninput="app.filterFileBrowser(this.value)">
|
|
615
633
|
</div>
|
|
@@ -633,6 +651,22 @@
|
|
|
633
651
|
<div class="git-status-footer" id="gitStatusFooter" data-i18n-skip></div>
|
|
634
652
|
</div>
|
|
635
653
|
|
|
654
|
+
<!-- Edit history panel (edit-history-ui.js): every file edit the active session's agents made. -->
|
|
655
|
+
<div class="edit-history-panel" id="editHistoryPanel" role="dialog" aria-label="Edit history">
|
|
656
|
+
<div class="edit-history-header">
|
|
657
|
+
<span class="edit-history-title">Edit history <span class="edit-history-count" id="editHistoryCount" data-i18n-skip></span></span>
|
|
658
|
+
<div class="edit-history-actions">
|
|
659
|
+
<button class="btn-icon-sm" onclick="app.refreshEditHistory()" title="Refresh" aria-label="Refresh edit history">↻</button>
|
|
660
|
+
<button class="btn-icon-sm" onclick="app.closeEditHistoryPanel()" title="Close" aria-label="Close edit history">×</button>
|
|
661
|
+
</div>
|
|
662
|
+
</div>
|
|
663
|
+
<div class="edit-history-controls">
|
|
664
|
+
<label class="edit-history-toggle"><input type="checkbox" id="editHistoryGroupToggle" onchange="app.setEditHistoryGrouped(this.checked)"><span>Group by file</span></label>
|
|
665
|
+
<label class="edit-history-toggle"><input type="checkbox" id="editHistoryMainOnlyToggle" onchange="app.setEditHistoryMainOnly(this.checked)"><span>Main agent only</span></label>
|
|
666
|
+
</div>
|
|
667
|
+
<div class="edit-history-body" id="editHistoryBody" data-i18n-skip></div>
|
|
668
|
+
</div>
|
|
669
|
+
|
|
636
670
|
<!-- File Preview Overlay -->
|
|
637
671
|
<div class="file-preview-overlay" id="filePreviewOverlay">
|
|
638
672
|
<div class="file-preview-window">
|
|
@@ -1033,6 +1067,20 @@
|
|
|
1033
1067
|
</div>
|
|
1034
1068
|
<div class="modal-body">
|
|
1035
1069
|
<p class="form-hint" id="customModelPickHint"></p>
|
|
1070
|
+
<!-- Case-insensitive filter over the rendered rows (app.filterCustomModelPick):
|
|
1071
|
+
a display layer only, the rows themselves are never re-rendered. Reset on every
|
|
1072
|
+
open and focused only on non-touch devices, same in-memory rule as the rail's
|
|
1073
|
+
search box. -->
|
|
1074
|
+
<input type="search" id="customModelPickSearch" class="session-sidebar-filter-input custom-model-pick-search"
|
|
1075
|
+
placeholder="Search models" aria-label="Search models"
|
|
1076
|
+
autocomplete="off" autocapitalize="off" spellcheck="false" enterkeyhint="search"
|
|
1077
|
+
oninput="app.filterCustomModelPick(this.value)">
|
|
1078
|
+
<p class="form-hint custom-model-pick-no-matches" id="customModelPickNoMatches" role="status" hidden>No models match</p>
|
|
1079
|
+
<!-- Shown only when no row carries a loaded/in-use/last-used mark AND the
|
|
1080
|
+
running-status probe answered `isLlamaSwap: false` (see
|
|
1081
|
+
_openCustomModelPickModal): it says out loud WHY nothing is marked, in the user's language, rather than leaving an
|
|
1082
|
+
alphabetical wall that looks like the question was ignored. -->
|
|
1083
|
+
<p class="form-hint custom-model-pick-unknown" id="customModelPickUnknown" role="status" hidden>Nothing is marked: this endpoint did not report which model it has loaded, and none of your running sessions uses one. Pick the model to launch.</p>
|
|
1036
1084
|
<div id="customModelPickList" class="run-mode-custom-models"></div>
|
|
1037
1085
|
</div>
|
|
1038
1086
|
</div>
|
|
@@ -1792,11 +1840,11 @@
|
|
|
1792
1840
|
<p class="modal-session-name" id="closeConfirmSessionName"></p>
|
|
1793
1841
|
</div>
|
|
1794
1842
|
<div class="close-options">
|
|
1795
|
-
<button class="close-option" onclick="app.confirmCloseSession(false)">
|
|
1796
|
-
<span class="close-option-title">Remove Tab</span>
|
|
1797
|
-
<span class="close-option-desc">Tmux session keeps running in background</span>
|
|
1843
|
+
<button class="close-option" onclick="app.confirmCloseSession(false)" id="closeConfirmKeepBtn">
|
|
1844
|
+
<span class="close-option-title" id="closeConfirmKeepTitle">Remove Tab</span>
|
|
1845
|
+
<span class="close-option-desc" id="closeConfirmKeepDesc">Tmux session keeps running in background</span>
|
|
1798
1846
|
</button>
|
|
1799
|
-
<button class="close-option close-option-danger" onclick="app.confirmCloseSession(true)">
|
|
1847
|
+
<button class="close-option close-option-danger" onclick="app.confirmCloseSession(true)" id="closeConfirmKillBtn">
|
|
1800
1848
|
<span class="close-option-title" id="closeConfirmKillTitle">Kill Tmux & Claude Code</span>
|
|
1801
1849
|
<span class="close-option-desc">Terminate the session completely</span>
|
|
1802
1850
|
</button>
|
|
@@ -2191,6 +2239,7 @@
|
|
|
2191
2239
|
<label class="set-chip" data-preview="header" data-preview-order="5"><input type="checkbox" id="appSettingsShowAwayDigestButton"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M8 6h13"/><path d="M8 12h13"/><path d="M8 18h13"/><path d="M3 6h.01"/><path d="M3 12h.01"/><path d="M3 18h.01"/></svg><span>Away Digest</span></label>
|
|
2192
2240
|
<label class="set-chip" data-preview="header" data-preview-order="6"><input type="checkbox" id="appSettingsShowSessionButton"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><polyline points="12 2 2 7 12 12 22 7 12 2"/><polyline points="2 17 12 22 22 17"/><polyline points="2 12 12 17 22 12"/></svg><span>Session Manager</span></label>
|
|
2193
2241
|
<label class="set-chip" data-preview="header" data-preview-order="9"><input type="checkbox" id="appSettingsShowAttachmentsButton"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48"/></svg><span>Attachments</span></label>
|
|
2242
|
+
<label class="set-chip" data-search="edit history edits changed files diffs" data-preview="header" data-preview-order="9.5"><input type="checkbox" id="appSettingsShowEditHistory"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8"/><path d="M3 3v5h5"/><path d="M12 7v5l4 2"/></svg><span>Edit history</span></label>
|
|
2194
2243
|
<label class="set-chip" data-preview="header" data-preview-order="10"><input type="checkbox" id="appSettingsShowFileViewerButton"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/></svg><span>File Viewer</span></label>
|
|
2195
2244
|
<label class="set-chip" data-preview="header" data-preview-order="11"><input type="checkbox" id="appSettingsShowMultiMonitorButton"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2" y="4" width="13" height="9" rx="1.5"/><rect x="11" y="9" width="11" height="8" rx="1.5"/></svg><span>Multi-monitor</span></label>
|
|
2196
2245
|
<label class="set-chip" data-search="split pane side by side two sessions" data-preview="header" data-preview-order="11.5"><input type="checkbox" id="appSettingsShowSplitButton"><svg class="set-chip-ico" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="2" y="3" width="20" height="18" rx="2"/><line x1="12" y1="3" x2="12" y2="21"/></svg><span>Split</span></label>
|
|
@@ -2791,6 +2840,10 @@
|
|
|
2791
2840
|
<div class="set-row-text"><span class="set-row-label">Base URL</span></div>
|
|
2792
2841
|
<input type="text" id="customModelHostBaseUrl" class="set-input" placeholder="http://192.168.1.50:8080">
|
|
2793
2842
|
</div>
|
|
2843
|
+
<div class="set-row has-field">
|
|
2844
|
+
<div class="set-row-text"><span class="set-row-label">Default context length (tokens)</span><span class="set-row-desc">Used for models whose size cannot be discovered. The model's whole window; the Claude floor check divides it by any stored slot count. Leave empty to let each CLI assume its own default.</span></div>
|
|
2845
|
+
<input type="number" id="customModelHostDefaultContextLength" class="set-input" min="1" max="100000000" step="1" placeholder="131072">
|
|
2846
|
+
</div>
|
|
2794
2847
|
<div class="set-row has-field">
|
|
2795
2848
|
<div class="set-row-text"><span class="set-row-label">API key</span><span class="set-row-desc">Optional. Left blank on edit keeps the existing key.</span></div>
|
|
2796
2849
|
<input type="password" id="customModelHostApiKey" class="set-input" autocomplete="new-password">
|
|
@@ -3003,6 +3056,13 @@
|
|
|
3003
3056
|
</div>
|
|
3004
3057
|
<label class="switch switch-sm"><input type="checkbox" id="appSettingsCodexDangerouslyBypassApprovals"><span class="slider"></span></label>
|
|
3005
3058
|
</div>
|
|
3059
|
+
<div class="set-row" data-search="codex network access sandbox loopback codeman skill orchestrate spawn">
|
|
3060
|
+
<div class="set-row-text">
|
|
3061
|
+
<span class="set-row-label">Allow network access</span>
|
|
3062
|
+
<span class="set-row-desc">Lets commands in Codex's workspace-write sandbox use the network, which the Codeman skill needs to reach this server. Those commands can then call Codeman's API, which can start a session outside the sandbox with no approval prompt, even when a password is set. So with this on, Codex's sandbox does not contain a prompt-injected command: treat it as close to Bypass. Applies to every new local Codex session, not scheduled jobs. It does not change Codex's sandbox mode: a folder Codex runs read-only (one it does not trust) keeps the network closed and asks per command.</span>
|
|
3063
|
+
</div>
|
|
3064
|
+
<label class="switch switch-sm"><input type="checkbox" id="appSettingsCodexNetworkAccess"><span class="slider"></span></label>
|
|
3065
|
+
</div>
|
|
3006
3066
|
<div class="set-row" data-search="codex animations status effects">
|
|
3007
3067
|
<div class="set-row-text">
|
|
3008
3068
|
<span class="set-row-label">Animated status effects</span>
|
|
@@ -3234,6 +3294,97 @@
|
|
|
3234
3294
|
<div id="webhookResult" class="set-note" style="display:none" data-i18n-skip></div>
|
|
3235
3295
|
</div>
|
|
3236
3296
|
</div>
|
|
3297
|
+
<div class="set-group" id="discordGroup" style="display:none">
|
|
3298
|
+
<div class="set-group-head"><h4>Discord (two-way, one thread per tab)</h4><span class="set-scope">server</span></div>
|
|
3299
|
+
<div class="set-group-body">
|
|
3300
|
+
<div class="set-row" data-search="discord bot thread reply phone notification blocked">
|
|
3301
|
+
<div class="set-row-text">
|
|
3302
|
+
<span class="set-row-label">Talk to your sessions from Discord</span>
|
|
3303
|
+
<span class="set-row-desc">Posts alerts into a thread per tab and types your reply in that thread into the tab. Only the user IDs listed below can reply. Setup (bot, least-privilege permissions) is in docs/discord-bridge.md. This group has its own Save button.</span>
|
|
3304
|
+
</div>
|
|
3305
|
+
<label class="switch switch-sm"><input type="checkbox" id="discordEnabled"><span class="slider"></span></label>
|
|
3306
|
+
</div>
|
|
3307
|
+
<div class="set-row has-field">
|
|
3308
|
+
<div class="set-row-text">
|
|
3309
|
+
<span class="set-row-label">Bot token</span>
|
|
3310
|
+
<span class="set-row-desc" id="discordTokenHint">Nothing saved yet.</span>
|
|
3311
|
+
</div>
|
|
3312
|
+
<input type="password" id="discordToken" class="set-input" autocomplete="off" spellcheck="false" placeholder="Bot token from the Developer Portal">
|
|
3313
|
+
</div>
|
|
3314
|
+
<div class="set-row has-field">
|
|
3315
|
+
<div class="set-row-text"><span class="set-row-label">Guild (server) ID</span></div>
|
|
3316
|
+
<input type="text" id="discordGuildId" class="set-input" autocomplete="off" spellcheck="false" inputmode="numeric">
|
|
3317
|
+
</div>
|
|
3318
|
+
<div class="set-row has-field">
|
|
3319
|
+
<div class="set-row-text"><span class="set-row-label">Parent channel ID</span><span class="set-row-desc">Threads are created inside this channel.</span></div>
|
|
3320
|
+
<input type="text" id="discordParentChannelId" class="set-input" autocomplete="off" spellcheck="false" inputmode="numeric">
|
|
3321
|
+
</div>
|
|
3322
|
+
<div class="set-row has-field">
|
|
3323
|
+
<div class="set-row-text"><span class="set-row-label">Allowed user IDs</span><span class="set-row-desc">Comma separated. Only these Discord users can reply into a session.</span></div>
|
|
3324
|
+
<input type="text" id="discordAllowedUserIds" class="set-input" autocomplete="off" spellcheck="false">
|
|
3325
|
+
</div>
|
|
3326
|
+
<div class="set-row has-field">
|
|
3327
|
+
<div class="set-row-text"><span class="set-row-label">Create threads</span></div>
|
|
3328
|
+
<select id="discordThreadCreation" class="set-select">
|
|
3329
|
+
<option value="lazy">On the first alert</option>
|
|
3330
|
+
<option value="onSessionStart">For every new tab</option>
|
|
3331
|
+
</select>
|
|
3332
|
+
</div>
|
|
3333
|
+
<div class="set-row has-field">
|
|
3334
|
+
<div class="set-row-text"><span class="set-row-label">When a tab is deleted</span><span class="set-row-desc">Deleting a thread needs the Manage Threads permission on the channel.</span></div>
|
|
3335
|
+
<select id="discordOnSessionDelete" class="set-select">
|
|
3336
|
+
<option value="keep">Keep the thread</option>
|
|
3337
|
+
<option value="archive">Archive the thread</option>
|
|
3338
|
+
<option value="delete">Delete the thread</option>
|
|
3339
|
+
</select>
|
|
3340
|
+
</div>
|
|
3341
|
+
<div class="set-row has-field">
|
|
3342
|
+
<div class="set-row-text"><span class="set-row-label">Stale threads</span><span class="set-row-desc">Threads this bot made that no tab uses any more, checked after startup and then daily. This includes threads that "When a tab is deleted" kept or archived. Threads under an hour old are skipped. Use one channel per Codeman.</span></div>
|
|
3343
|
+
<select id="discordStaleThreads" class="set-select">
|
|
3344
|
+
<option value="keep">Leave them</option>
|
|
3345
|
+
<option value="archive">Archive them</option>
|
|
3346
|
+
<option value="delete">Delete them</option>
|
|
3347
|
+
</select>
|
|
3348
|
+
</div>
|
|
3349
|
+
<div class="set-row has-field">
|
|
3350
|
+
<div class="set-row-text"><span class="set-row-label">@ ping</span></div>
|
|
3351
|
+
<select id="discordPingMode" class="set-select">
|
|
3352
|
+
<option value="off">Never</option>
|
|
3353
|
+
<option value="critical">Critical events only</option>
|
|
3354
|
+
<option value="all">Every post</option>
|
|
3355
|
+
</select>
|
|
3356
|
+
</div>
|
|
3357
|
+
<div class="set-row">
|
|
3358
|
+
<div class="set-row-text">
|
|
3359
|
+
<span class="set-row-label">Tell Claude how to reach you</span>
|
|
3360
|
+
<span class="set-row-desc">Adds a short note about the codeman notify command to Claude's system prompt at launch, for when it is blocked on something only you can do. Nothing appears in the conversation. Local tabs only: remote and Docker tabs have no codeman command.</span>
|
|
3361
|
+
</div>
|
|
3362
|
+
<label class="switch switch-sm"><input type="checkbox" id="discordStartupHint"><span class="slider"></span></label>
|
|
3363
|
+
</div>
|
|
3364
|
+
<div class="set-row has-field">
|
|
3365
|
+
<div class="set-row-text">
|
|
3366
|
+
<span class="set-row-label">Which events</span>
|
|
3367
|
+
<span class="set-row-desc">"Needs attention" skips the routine "response complete" message.</span>
|
|
3368
|
+
</div>
|
|
3369
|
+
<select id="discordScope" class="set-select">
|
|
3370
|
+
<option value="attention">Needs attention</option>
|
|
3371
|
+
<option value="all">Everything</option>
|
|
3372
|
+
</select>
|
|
3373
|
+
</div>
|
|
3374
|
+
<div class="set-row">
|
|
3375
|
+
<div class="set-row-text">
|
|
3376
|
+
<span class="set-row-label">Save and test</span>
|
|
3377
|
+
<span class="set-row-desc">Send test saves first, then posts to the parent channel.</span>
|
|
3378
|
+
</div>
|
|
3379
|
+
<span>
|
|
3380
|
+
<button class="btn-toolbar btn-sm btn-primary" id="discordSaveBtn" onclick="app.saveDiscord()">Save</button>
|
|
3381
|
+
<button class="btn-toolbar btn-sm" id="discordTestBtn" onclick="app.testDiscord()">Send test</button>
|
|
3382
|
+
<button class="btn-toolbar btn-sm" id="discordClearBtn" onclick="app.clearDiscord()" style="display:none">Remove token</button>
|
|
3383
|
+
</span>
|
|
3384
|
+
</div>
|
|
3385
|
+
<div id="discordResult" class="set-note" style="display:none" data-i18n-skip></div>
|
|
3386
|
+
</div>
|
|
3387
|
+
</div>
|
|
3237
3388
|
</section>
|
|
3238
3389
|
|
|
3239
3390
|
<!-- ══ Voice ════════════════════════════════════════════════════ -->
|
|
@@ -3654,7 +3805,19 @@
|
|
|
3654
3805
|
<div class="form-row">
|
|
3655
3806
|
<label>Case Name</label>
|
|
3656
3807
|
<input type="text" id="cloneCaseName" placeholder="repo" pattern="[a-zA-Z0-9_-]+" autocomplete="off" autocapitalize="off" spellcheck="false" oninput="app.onCloneNameEdited()">
|
|
3657
|
-
<span class="form-hint">Filled in from the URL. Cloned into ~/codeman-cases/<name>, so deleting the case deletes this working tree.</span>
|
|
3808
|
+
<span class="form-hint" id="cloneCaseNameHint">Filled in from the URL. Cloned into ~/codeman-cases/<name>, so deleting the case deletes this working tree.</span>
|
|
3809
|
+
</div>
|
|
3810
|
+
<div class="form-row" id="cloneCustomPathToggleRow">
|
|
3811
|
+
<label class="checkbox-row"><input type="checkbox" id="cloneCustomPathToggle" onchange="app.toggleCloneCustomPath()"> 📁 Clone into a custom folder</label>
|
|
3812
|
+
<span class="form-hint">By default the clone goes under ~/codeman-cases. Choose a folder instead and the repository is cloned into a subfolder of it named after the case, the same way it goes under ~/codeman-cases; it is listed like any other case, and deleting the case only unlinks it (your files stay).</span>
|
|
3813
|
+
</div>
|
|
3814
|
+
<div class="form-row" id="cloneCustomPathRow" style="display:none">
|
|
3815
|
+
<label>Parent Folder</label>
|
|
3816
|
+
<div class="path-input-group">
|
|
3817
|
+
<input type="text" id="cloneCasePath" placeholder="~/projects" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" oninput="app.updateCloneCasePathPreview()">
|
|
3818
|
+
<button type="button" class="btn path-input-browse" onclick="app.openCloneCasePathPicker()">Browse…</button>
|
|
3819
|
+
</div>
|
|
3820
|
+
<span class="form-hint" id="cloneCasePathPreview">Pick the folder the repository should be cloned inside. It goes into a subfolder named after the case.</span>
|
|
3658
3821
|
</div>
|
|
3659
3822
|
<div class="form-row">
|
|
3660
3823
|
<label>Branch or Tag (optional)</label>
|
|
@@ -4481,12 +4644,12 @@
|
|
|
4481
4644
|
<div class="approvals-list"></div>
|
|
4482
4645
|
</div>
|
|
4483
4646
|
|
|
4484
|
-
<script defer src="constants.
|
|
4485
|
-
<script defer src="i18n.
|
|
4647
|
+
<script defer src="constants.782170e1.js"></script>
|
|
4648
|
+
<script defer src="i18n.a5e82c95.js"></script>
|
|
4486
4649
|
<script defer src="mobile-handlers.f7c3f692.js"></script>
|
|
4487
4650
|
<script defer src="voice-input.2342c37b.js"></script>
|
|
4488
4651
|
<script defer src="notification-manager.feb82c04.js"></script>
|
|
4489
|
-
<script defer src="keyboard-accessory.
|
|
4652
|
+
<script defer src="keyboard-accessory.b941676c.js"></script>
|
|
4490
4653
|
<script defer src="input-cjk.8bc46081.js"></script>
|
|
4491
4654
|
<!-- Shows iOS Safari IME composition text inside the terminal. Must precede terminal-ui.js. -->
|
|
4492
4655
|
<script defer src="mobile-ime-preview.2dbaf262.js"></script>
|
|
@@ -4496,30 +4659,32 @@
|
|
|
4496
4659
|
<script defer src="sanitize-html.e7147e76.js"></script>
|
|
4497
4660
|
<!-- Owner tab layout projection (grouped vertical rail); pure, read by app.js. -->
|
|
4498
4661
|
<script defer src="tab-layout-browser.2d6189f7.js"></script>
|
|
4499
|
-
<script defer src="app.
|
|
4662
|
+
<script defer src="app.9ea37070.js"></script>
|
|
4500
4663
|
<script defer src="tab-rail-resize.b5cdceaf.js"></script>
|
|
4501
4664
|
<script defer src="header-divider.eb2d2463.js"></script>
|
|
4502
|
-
<script defer src="terminal-ui.
|
|
4665
|
+
<script defer src="terminal-ui.a7883640.js"></script>
|
|
4503
4666
|
<script defer src="terminal-tile.js"></script>
|
|
4504
4667
|
<script defer src="terminal-split.js"></script>
|
|
4505
4668
|
<script defer src="tile-grid.js"></script>
|
|
4506
|
-
<script defer src="respawn-ui.
|
|
4669
|
+
<script defer src="respawn-ui.304ba0d4.js"></script>
|
|
4507
4670
|
<script defer src="ralph-panel.b350e2ef.js"></script>
|
|
4508
4671
|
<script defer src="orchestrator-panel.js"></script>
|
|
4509
4672
|
<script defer src="cron-ui.js"></script>
|
|
4510
|
-
<script defer src="settings-ui.
|
|
4511
|
-
<script defer src="panels-ui.
|
|
4673
|
+
<script defer src="settings-ui.18f92052.js"></script>
|
|
4674
|
+
<script defer src="panels-ui.8bcd4473.js"></script>
|
|
4512
4675
|
<script defer src="readmymind-ui.js"></script>
|
|
4513
4676
|
<script defer src="ultracode-panel.js"></script>
|
|
4514
4677
|
<script defer src="approvals-ui.js"></script>
|
|
4515
4678
|
<script defer src="reboot-restore-ui.js"></script>
|
|
4516
4679
|
<script defer src="admin-ui.js"></script>
|
|
4517
|
-
<script defer src="session-ui.
|
|
4680
|
+
<script defer src="session-ui.a7c8c095.js"></script>
|
|
4518
4681
|
<script defer src="host-wake-ui.js"></script>
|
|
4519
4682
|
<script defer src="webview-tabs.js"></script>
|
|
4520
4683
|
<script defer src="mobile-overview.js"></script>
|
|
4521
4684
|
<script defer src="home-sessions.js"></script>
|
|
4685
|
+
<script defer src="foreign-sessions.js"></script>
|
|
4522
4686
|
<script defer src="git-status-ui.js"></script>
|
|
4687
|
+
<script defer src="edit-history-ui.js"></script>
|
|
4523
4688
|
<script defer src="entrance-animations.js"></script>
|
|
4524
4689
|
<script defer src="ralph-wizard.b6c0dd19.js"></script>
|
|
4525
4690
|
<script defer src="api-client.c9b1cddc.js"></script>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -80,7 +80,7 @@ const PathPicker = {
|
|
|
80
80
|
/**
|
|
81
81
|
* Open the lazy filesystem browser.
|
|
82
82
|
* @param {{sessionId?: string, initialPath?: string, directoriesOnly?: boolean,
|
|
83
|
-
* title?: string, onSelect: (path: string) => void}} options
|
|
83
|
+
* allowNewFolder?: boolean, title?: string, onSelect: (path: string) => void}} options
|
|
84
84
|
*/
|
|
85
85
|
open(options) {
|
|
86
86
|
this.close(false);
|
|
@@ -114,9 +114,15 @@ const PathPicker = {
|
|
|
114
114
|
<input type="text" class="path-picker-current" aria-label="Current folder path" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" enterkeyhint="go">
|
|
115
115
|
<button type="submit" class="path-picker-go" title="Go to this path" aria-label="Go to this path">Go</button>
|
|
116
116
|
</form>
|
|
117
|
+
<button type="button" class="path-picker-newfolder" title="New folder" aria-label="New folder" hidden>+📁</button>
|
|
117
118
|
<button type="button" class="path-picker-hidden" title="Show hidden files and folders" aria-label="Show hidden files and folders" aria-pressed="false">.*</button>
|
|
118
119
|
<button type="button" class="path-picker-refresh" title="Refresh" aria-label="Refresh">↻</button>
|
|
119
120
|
</div>
|
|
121
|
+
<form class="path-picker-newfolder-form" hidden>
|
|
122
|
+
<input type="text" class="path-picker-newfolder-name" aria-label="New folder name" placeholder="New folder name" maxlength="255" autocomplete="off" autocapitalize="off" autocorrect="off" spellcheck="false" enterkeyhint="done">
|
|
123
|
+
<button type="submit" class="path-picker-newfolder-create">Create</button>
|
|
124
|
+
<button type="button" class="path-picker-newfolder-cancel">Cancel</button>
|
|
125
|
+
</form>
|
|
120
126
|
<div class="path-picker-toolbar">
|
|
121
127
|
<div class="path-picker-status" aria-live="polite">Loading...</div>
|
|
122
128
|
<label class="path-picker-sort-label">Sort
|
|
@@ -147,6 +153,7 @@ const PathPicker = {
|
|
|
147
153
|
overlay.querySelector('.path-picker-refresh').addEventListener('click', () => this.load(this._currentPath));
|
|
148
154
|
overlay.querySelector('.path-picker-hidden').addEventListener('click', () => this.toggleHidden());
|
|
149
155
|
this._syncHiddenButton();
|
|
156
|
+
this._wireNewFolder(overlay, !!options.allowNewFolder);
|
|
150
157
|
// Typing a path is the fast way there. The listing is loaded ONLY on Enter/Go,
|
|
151
158
|
// never on each keystroke: a half-typed path is a 404 the server has to
|
|
152
159
|
// answer for nothing, and jumping mid-edit would yank the field around.
|
|
@@ -183,6 +190,70 @@ const PathPicker = {
|
|
|
183
190
|
this.load(options.initialPath || '');
|
|
184
191
|
},
|
|
185
192
|
|
|
193
|
+
/**
|
|
194
|
+
* "New folder": opt-in per caller (`allowNewFolder`), so a picker that browses somewhere the host
|
|
195
|
+
* filesystem route cannot create in (the container-workdir picker) never shows it. The folder is made
|
|
196
|
+
* inside the folder being viewed and is selected once it exists.
|
|
197
|
+
*/
|
|
198
|
+
_wireNewFolder(overlay, enabled) {
|
|
199
|
+
const button = overlay.querySelector('.path-picker-newfolder');
|
|
200
|
+
const form = overlay.querySelector('.path-picker-newfolder-form');
|
|
201
|
+
const input = overlay.querySelector('.path-picker-newfolder-name');
|
|
202
|
+
if (!enabled) return;
|
|
203
|
+
button.hidden = false;
|
|
204
|
+
const close = () => {
|
|
205
|
+
form.hidden = true;
|
|
206
|
+
input.value = '';
|
|
207
|
+
};
|
|
208
|
+
button.addEventListener('click', () => {
|
|
209
|
+
form.hidden = !form.hidden;
|
|
210
|
+
if (!form.hidden) input.focus();
|
|
211
|
+
});
|
|
212
|
+
overlay.querySelector('.path-picker-newfolder-cancel').addEventListener('click', close);
|
|
213
|
+
input.addEventListener('keydown', (event) => {
|
|
214
|
+
// Escape closes the form first; the document handler would close the whole picker.
|
|
215
|
+
if (event.key !== 'Escape') return;
|
|
216
|
+
event.preventDefault();
|
|
217
|
+
event.stopPropagation();
|
|
218
|
+
close();
|
|
219
|
+
});
|
|
220
|
+
form.addEventListener('submit', async (event) => {
|
|
221
|
+
event.preventDefault();
|
|
222
|
+
const name = input.value.trim();
|
|
223
|
+
if (!name || !this._currentPath) return;
|
|
224
|
+
const status = overlay.querySelector('.path-picker-status');
|
|
225
|
+
const create = overlay.querySelector('.path-picker-newfolder-create');
|
|
226
|
+
const parent = this._currentPath;
|
|
227
|
+
// One request at a time: a double tap would send a second one whose 409 shows after the first succeeded.
|
|
228
|
+
create.disabled = true;
|
|
229
|
+
try {
|
|
230
|
+
const res = await fetch('/api/filesystem/mkdir', {
|
|
231
|
+
method: 'POST',
|
|
232
|
+
headers: { 'Content-Type': 'application/json' },
|
|
233
|
+
body: JSON.stringify({
|
|
234
|
+
path: parent,
|
|
235
|
+
name,
|
|
236
|
+
sessionId: this._options?.sessionId || undefined,
|
|
237
|
+
showHidden: this._showHidden ? 'true' : undefined,
|
|
238
|
+
}),
|
|
239
|
+
});
|
|
240
|
+
const result = await res.json();
|
|
241
|
+
if (!result?.success) throw new Error(result?.error || 'Could not create the folder');
|
|
242
|
+
if (!this.overlay) return;
|
|
243
|
+
close();
|
|
244
|
+
await this.load(parent);
|
|
245
|
+
// The listing may have moved on while the request ran; only select it if it is still on screen.
|
|
246
|
+
if (this._currentPath === parent) this.select(result.data.path);
|
|
247
|
+
} catch (error) {
|
|
248
|
+
if (!this.overlay) return;
|
|
249
|
+
status.textContent = error.message || 'Could not create the folder';
|
|
250
|
+
status.classList.add('error');
|
|
251
|
+
} finally {
|
|
252
|
+
create.disabled = false;
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
},
|
|
256
|
+
|
|
186
257
|
_loadShowHidden() {
|
|
187
258
|
try {
|
|
188
259
|
return localStorage.getItem(PATH_PICKER_SHOW_HIDDEN_KEY) === '1';
|
|
@@ -1300,7 +1371,7 @@ const KeyboardAccessoryBar = {
|
|
|
1300
1371
|
<strong>Compose prompt</strong>
|
|
1301
1372
|
<span>Enter adds a new line</span>
|
|
1302
1373
|
</div>
|
|
1303
|
-
<textarea class="paste-textarea prompt-composer-textarea" aria-label="Prompt" placeholder="Write your prompt…" autocorrect="on" autocapitalize="sentences" spellcheck="true"></textarea>
|
|
1374
|
+
<textarea class="paste-textarea prompt-composer-textarea" dir="auto" aria-label="Prompt" placeholder="Write your prompt…" autocorrect="on" autocapitalize="sentences" spellcheck="true"></textarea>
|
|
1304
1375
|
<div class="paste-actions prompt-composer-actions">
|
|
1305
1376
|
<button type="button" class="prompt-composer-terminal">Use terminal keyboard</button>
|
|
1306
1377
|
<button type="button" class="paste-image">📎 Attach</button>
|
|
@@ -1313,6 +1384,8 @@ const KeyboardAccessoryBar = {
|
|
|
1313
1384
|
|
|
1314
1385
|
this._composerOverlay = overlay;
|
|
1315
1386
|
const textarea = overlay.querySelector('.prompt-composer-textarea');
|
|
1387
|
+
// The textarea's dir="auto" lays a prompt written in Persian, Arabic or
|
|
1388
|
+
// Hebrew out right to left, from its first letter (#715).
|
|
1316
1389
|
// i18n.js skips <textarea> subtrees (what is typed there is user content),
|
|
1317
1390
|
// so the placeholder and label are translated here, when the dialog is built.
|
|
1318
1391
|
const i18n = typeof window !== 'undefined' ? window.CodemanI18n : undefined;
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -508,6 +508,16 @@ Object.assign(CodemanApp.prototype, {
|
|
|
508
508
|
)
|
|
509
509
|
);
|
|
510
510
|
|
|
511
|
+
// Sessions a human opened outside Codeman. Its own container, rebuilt by the
|
|
512
|
+
// ONE renderer in foreign-sessions.js: the phone must not grow a second row
|
|
513
|
+
// builder that could describe the same session differently from the desktop.
|
|
514
|
+
const foreign = document.createElement('div');
|
|
515
|
+
foreign.className = 'foreign-sessions mobile-foreign-sessions';
|
|
516
|
+
foreign.id = 'mobileForeignSessions';
|
|
517
|
+
foreign.hidden = true;
|
|
518
|
+
el.appendChild(foreign);
|
|
519
|
+
this.renderForeignSessions?.(foreign);
|
|
520
|
+
|
|
511
521
|
el.appendChild(
|
|
512
522
|
this._buildMobileOverviewSection(
|
|
513
523
|
'Past sessions',
|
|
Binary file
|
|
Binary file
|