cli-jaw 2.0.10 → 2.0.16
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.ja.md +8 -5
- package/README.ko.md +8 -5
- package/README.md +31 -14
- package/README.zh-CN.md +8 -5
- package/dist/bin/commands/browser-web-ai.js +1 -0
- package/dist/bin/commands/browser-web-ai.js.map +1 -1
- package/dist/bin/commands/browser.js +1 -1
- package/dist/bin/commands/dashboard-memory.js +1 -0
- package/dist/bin/commands/dashboard-memory.js.map +1 -1
- package/dist/bin/commands/dispatch.js +34 -7
- package/dist/bin/commands/dispatch.js.map +1 -1
- package/dist/bin/commands/doctor.js +12 -6
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/init.js +1 -2
- package/dist/bin/commands/init.js.map +1 -1
- package/dist/bin/commands/orchestrate.js +6 -4
- package/dist/bin/commands/orchestrate.js.map +1 -1
- package/dist/bin/commands/serve.js +3 -1
- package/dist/bin/commands/serve.js.map +1 -1
- package/dist/bin/commands/tui/overlays.js +4 -4
- package/dist/bin/commands/tui/overlays.js.map +1 -1
- package/dist/bin/commands/tui/types.js +2 -0
- package/dist/bin/commands/tui/types.js.map +1 -1
- package/dist/bin/postinstall.js +0 -176
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/scripts/fresh-install-smoke.js +1 -2
- package/dist/scripts/fresh-install-smoke.js.map +1 -1
- package/dist/server.js +52 -18
- package/dist/server.js.map +1 -1
- package/dist/src/agent/agy-runtime.js +4 -0
- package/dist/src/agent/agy-runtime.js.map +1 -1
- package/dist/src/agent/alert-escalation.js +8 -2
- package/dist/src/agent/alert-escalation.js.map +1 -1
- package/dist/src/agent/args.js +35 -2
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/codex-app-client.js +3 -0
- package/dist/src/agent/codex-app-client.js.map +1 -1
- package/dist/src/agent/cursor-runtime.js +240 -0
- package/dist/src/agent/cursor-runtime.js.map +1 -0
- package/dist/src/agent/events/acp.js +7 -3
- package/dist/src/agent/events/acp.js.map +1 -1
- package/dist/src/agent/events/claude.js +5 -2
- package/dist/src/agent/events/claude.js.map +1 -1
- package/dist/src/agent/events/codex.js +21 -13
- package/dist/src/agent/events/codex.js.map +1 -1
- package/dist/src/agent/events/cursor.js +176 -0
- package/dist/src/agent/events/cursor.js.map +1 -0
- package/dist/src/agent/events/grok.js +13 -3
- package/dist/src/agent/events/grok.js.map +1 -1
- package/dist/src/agent/events/index.js +27 -0
- package/dist/src/agent/events/index.js.map +1 -1
- package/dist/src/agent/events/tool-labels.js +13 -6
- package/dist/src/agent/events/tool-labels.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +150 -5
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/resume-classifier.js +2 -0
- package/dist/src/agent/resume-classifier.js.map +1 -1
- package/dist/src/agent/spawn/resume.js +13 -2
- package/dist/src/agent/spawn/resume.js.map +1 -1
- package/dist/src/agent/spawn.js +44 -17
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/cli/claude-models.js +3 -0
- package/dist/src/cli/claude-models.js.map +1 -1
- package/dist/src/cli/commands.js +66 -10
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/handlers-runtime.js +2 -2
- package/dist/src/cli/handlers-runtime.js.map +1 -1
- package/dist/src/cli/handlers-workflows.js +339 -0
- package/dist/src/cli/handlers-workflows.js.map +1 -0
- package/dist/src/cli/handlers.js +11 -1
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/cli/readiness.js +22 -1
- package/dist/src/cli/readiness.js.map +1 -1
- package/dist/src/cli/registry.js +12 -0
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/cli/tui/overlay.js +2 -2
- package/dist/src/cli/tui/overlay.js.map +1 -1
- package/dist/src/command-contract/catalog.js +3 -1
- package/dist/src/command-contract/catalog.js.map +1 -1
- package/dist/src/core/cli-detection.js +203 -0
- package/dist/src/core/cli-detection.js.map +1 -0
- package/dist/src/core/config.js +2 -140
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/runtime-settings.js +31 -0
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/discord/bot.js +47 -26
- package/dist/src/discord/bot.js.map +1 -1
- package/dist/src/discord/commands.js +4 -10
- package/dist/src/discord/commands.js.map +1 -1
- package/dist/src/discord/send-only-client.js +79 -0
- package/dist/src/discord/send-only-client.js.map +1 -0
- package/dist/src/goal/heartbeat.js +51 -0
- package/dist/src/goal/heartbeat.js.map +1 -0
- package/dist/src/goal/runtime.js +31 -0
- package/dist/src/goal/runtime.js.map +1 -0
- package/dist/src/goal/store.js +153 -0
- package/dist/src/goal/store.js.map +1 -0
- package/dist/src/goal/types.js +2 -0
- package/dist/src/goal/types.js.map +1 -0
- package/dist/src/goal-run/controller.js +113 -0
- package/dist/src/goal-run/controller.js.map +1 -0
- package/dist/src/goal-run/events.js +25 -0
- package/dist/src/goal-run/events.js.map +1 -0
- package/dist/src/goal-run/failure-matrix.js +26 -0
- package/dist/src/goal-run/failure-matrix.js.map +1 -0
- package/dist/src/goal-run/policy.js +46 -0
- package/dist/src/goal-run/policy.js.map +1 -0
- package/dist/src/goal-run/types.js +2 -0
- package/dist/src/goal-run/types.js.map +1 -0
- package/dist/src/manager/git/diff-service.js +202 -0
- package/dist/src/manager/git/diff-service.js.map +1 -0
- package/dist/src/manager/notes/assets.js +11 -4
- package/dist/src/manager/notes/assets.js.map +1 -1
- package/dist/src/manager/notes/auth.js +123 -0
- package/dist/src/manager/notes/auth.js.map +1 -0
- package/dist/src/manager/notes/git.js +154 -0
- package/dist/src/manager/notes/git.js.map +1 -0
- package/dist/src/manager/notes/plugins.js +107 -0
- package/dist/src/manager/notes/plugins.js.map +1 -0
- package/dist/src/manager/notes/routes.js +91 -2
- package/dist/src/manager/notes/routes.js.map +1 -1
- package/dist/src/manager/notes/store.js +71 -1
- package/dist/src/manager/notes/store.js.map +1 -1
- package/dist/src/manager/notes/watcher.js +40 -4
- package/dist/src/manager/notes/watcher.js.map +1 -1
- package/dist/src/manager/notes/wiki-links.js +99 -10
- package/dist/src/manager/notes/wiki-links.js.map +1 -1
- package/dist/src/manager/notes/ws.js +62 -0
- package/dist/src/manager/notes/ws.js.map +1 -0
- package/dist/src/manager/preview-link-policy.js +46 -0
- package/dist/src/manager/preview-link-policy.js.map +1 -0
- package/dist/src/manager/preview-origin-proxy.js +28 -5
- package/dist/src/manager/preview-origin-proxy.js.map +1 -1
- package/dist/src/manager/preview-ports.js +12 -0
- package/dist/src/manager/preview-ports.js.map +1 -0
- package/dist/src/manager/proxy.js +15 -3
- package/dist/src/manager/proxy.js.map +1 -1
- package/dist/src/manager/registry.js +115 -0
- package/dist/src/manager/registry.js.map +1 -1
- package/dist/src/manager/routes/dashboard-git.js +106 -0
- package/dist/src/manager/routes/dashboard-git.js.map +1 -0
- package/dist/src/manager/server.js +60 -4
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/memory/heartbeat.js +4 -1
- package/dist/src/memory/heartbeat.js.map +1 -1
- package/dist/src/messaging/channel-health.js +54 -0
- package/dist/src/messaging/channel-health.js.map +1 -0
- package/dist/src/messaging/runtime.js +1 -0
- package/dist/src/messaging/runtime.js.map +1 -1
- package/dist/src/messaging/send-result.js +9 -0
- package/dist/src/messaging/send-result.js.map +1 -0
- package/dist/src/orchestrator/pipeline.js +45 -0
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/state-machine.js +50 -1
- package/dist/src/orchestrator/state-machine.js.map +1 -1
- package/dist/src/prompt/templates/a1-system.md +16 -8
- package/dist/src/prompt/templates/employee.md +3 -1
- package/dist/src/prompt/templates/orchestration.md +15 -5
- package/dist/src/routes/goal-run.js +86 -0
- package/dist/src/routes/goal-run.js.map +1 -0
- package/dist/src/routes/goal.js +118 -0
- package/dist/src/routes/goal.js.map +1 -0
- package/dist/src/routes/messaging.js +17 -11
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/orchestrate.js +47 -17
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/quota-agy-reverse.js +133 -0
- package/dist/src/routes/quota-agy-reverse.js.map +1 -0
- package/dist/src/routes/quota-cursor-dashboard.js +200 -0
- package/dist/src/routes/quota-cursor-dashboard.js.map +1 -0
- package/dist/src/routes/settings.js +6 -6
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/team/collector.js +45 -0
- package/dist/src/team/collector.js.map +1 -0
- package/dist/src/team/dispatcher.js +35 -0
- package/dist/src/team/dispatcher.js.map +1 -0
- package/dist/src/team/planner.js +58 -0
- package/dist/src/team/planner.js.map +1 -0
- package/dist/src/team/preflight.js +46 -0
- package/dist/src/team/preflight.js.map +1 -0
- package/dist/src/team/types.js +12 -0
- package/dist/src/team/types.js.map +1 -0
- package/dist/src/telegram/bot.js +41 -10
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/types/cli-engine.js +1 -0
- package/dist/src/types/cli-engine.js.map +1 -1
- package/dist/src/types/cli-events.js +1 -1
- package/dist/src/types/cli-events.js.map +1 -1
- package/dist/src/workflows/artifacts.js +148 -0
- package/dist/src/workflows/artifacts.js.map +1 -0
- package/dist/src/workflows/browser-web-ai.js +18 -0
- package/dist/src/workflows/browser-web-ai.js.map +1 -0
- package/dist/src/workflows/checkpoint/store.js +31 -0
- package/dist/src/workflows/checkpoint/store.js.map +1 -0
- package/dist/src/workflows/checkpoint/types.js +4 -0
- package/dist/src/workflows/checkpoint/types.js.map +1 -0
- package/dist/src/workflows/competitive-gap.js +96 -0
- package/dist/src/workflows/competitive-gap.js.map +1 -0
- package/dist/src/workflows/context-map/builder.js +61 -0
- package/dist/src/workflows/context-map/builder.js.map +1 -0
- package/dist/src/workflows/context.js +19 -0
- package/dist/src/workflows/context.js.map +1 -0
- package/dist/src/workflows/deliberate.js +67 -0
- package/dist/src/workflows/deliberate.js.map +1 -0
- package/dist/src/workflows/employee-boundary.js +33 -0
- package/dist/src/workflows/employee-boundary.js.map +1 -0
- package/dist/src/workflows/events.js +24 -0
- package/dist/src/workflows/events.js.map +1 -0
- package/dist/src/workflows/guards.js +18 -0
- package/dist/src/workflows/guards.js.map +1 -0
- package/dist/src/workflows/handoff.js +48 -0
- package/dist/src/workflows/handoff.js.map +1 -0
- package/dist/src/workflows/index.js +6 -0
- package/dist/src/workflows/index.js.map +1 -0
- package/dist/src/workflows/permissions/policy.js +25 -0
- package/dist/src/workflows/permissions/policy.js.map +1 -0
- package/dist/src/workflows/permissions/types.js +26 -0
- package/dist/src/workflows/permissions/types.js.map +1 -0
- package/dist/src/workflows/plan.js +70 -0
- package/dist/src/workflows/plan.js.map +1 -0
- package/dist/src/workflows/planaudit.js +64 -0
- package/dist/src/workflows/planaudit.js.map +1 -0
- package/dist/src/workflows/runtime-guards.js +46 -0
- package/dist/src/workflows/runtime-guards.js.map +1 -0
- package/dist/src/workflows/runtime.js +25 -0
- package/dist/src/workflows/runtime.js.map +1 -0
- package/dist/src/workflows/status.js +49 -0
- package/dist/src/workflows/status.js.map +1 -0
- package/dist/src/workflows/types.js +4 -0
- package/dist/src/workflows/types.js.map +1 -0
- package/dist/src/workflows/web-ai-guards.js +22 -0
- package/dist/src/workflows/web-ai-guards.js.map +1 -0
- package/package.json +9 -4
- package/public/assets/providers/cursor-color.svg +2 -0
- package/public/assets/providers/cursor.svg +2 -0
- package/public/css/chat.css +99 -0
- package/public/css/orc-state.css +11 -1
- package/public/css/sidebar.css +34 -0
- package/public/css/variables.css +23 -2
- package/public/css/workflow-cockpit.css +62 -0
- package/public/dist/assets/{AdvancedExport-CZEVPqHb.js → AdvancedExport-DLCgT_ZP.js} +1 -1
- package/public/dist/assets/{Agent-BBrJGd5m.js → Agent-CIUGaUVn.js} +1 -1
- package/public/dist/assets/{Browser-dBaU9G9D.js → Browser-C4TCAhKR.js} +1 -1
- package/public/dist/assets/BrowserPanel-BN01Lfc5.css +1 -0
- package/public/dist/assets/BrowserPanel-weeCb2qu.js +1 -0
- package/public/dist/assets/ChannelsDiscord-Bwt2-Jva.js +1 -0
- package/public/dist/assets/ChannelsTelegram-xjA3-Mr8.js +1 -0
- package/public/dist/assets/{DashboardMeta-LVAL7TtE.js → DashboardMeta-CBckkL_V.js} +1 -1
- package/public/dist/assets/DiffPanel-BHvC0wCX.css +1 -0
- package/public/dist/assets/DiffPanel-DZ4-3QSH.js +3 -0
- package/public/dist/assets/{Display-CFm1UmEo.js → Display-BPbCVOoi.js} +1 -1
- package/public/dist/assets/DocPanel-C1pGgE-S.js +1 -0
- package/public/dist/assets/DocPanel-CL1scIfq.css +1 -0
- package/public/dist/assets/Employees-BL9MAzzx.js +1 -0
- package/public/dist/assets/FolderPanel-DSkanaGN.js +1 -0
- package/public/dist/assets/FolderPanel-XCno5AI9.css +1 -0
- package/public/dist/assets/Heartbeat-D64JCg4t.js +1 -0
- package/public/dist/assets/MarkdownRenderer-CS6jvLpf.js +15 -0
- package/public/dist/assets/{Mcp-9NU4YkKO.js → Mcp-wYwJA_61.js} +1 -1
- package/public/dist/assets/{Memory-uZT30fww.js → Memory-BgN8djV4.js} +1 -1
- package/public/dist/assets/MilkdownWysiwygEditor-Btwmr5Re.js +160 -0
- package/public/dist/assets/{ModelProvider-CsIOyoZP.js → ModelProvider-DHQ1Zvw0.js} +1 -1
- package/public/dist/assets/{Network-D7hGwnyG.js → Network-B-WvB6R5.js} +1 -1
- package/public/dist/assets/NotesGraphWorkspace-CK8kKY8A.js +1 -0
- package/public/dist/assets/{Permissions-DwdU3wi8.js → Permissions-BvtVczZS.js} +1 -1
- package/public/dist/assets/Permissions-QxvByCop.js +1 -0
- package/public/dist/assets/{Profile-BNTKD_Ex.js → Profile-D_6kFj73.js} +1 -1
- package/public/dist/assets/{Prompts-D_mCfYiu.js → Prompts--4CM3enz.js} +1 -1
- package/public/dist/assets/{SpeechKeys-BTXCM-Fs.js → SpeechKeys-Cx4_SXTM.js} +1 -1
- package/public/dist/assets/TerminalPanel-AKKXu8dJ.js +36 -0
- package/public/dist/assets/TerminalPanel-DdE69MNo.css +1 -0
- package/public/dist/assets/TransportStatusChips-BwR7Sq4s.js +1 -0
- package/public/dist/assets/agent-meta-BhEbjy4P.js +1 -0
- package/public/dist/assets/api-30EcU_Lb.js +1 -0
- package/public/dist/assets/app-DLDdZ41k.js +48 -0
- package/public/dist/assets/app-RpnKs-sT.css +1 -0
- package/public/dist/assets/architecture-7EHR7CIX-GHIeXYpv.js +1 -0
- package/public/dist/assets/{architectureDiagram-3BPJPVTR-CJCPEsxo.js → architectureDiagram-3BPJPVTR-ByOUFrxp.js} +1 -1
- package/public/dist/assets/{blockDiagram-GPEHLZMM-CO1bkn0E.js → blockDiagram-GPEHLZMM-BcefwseF.js} +2 -2
- package/public/dist/assets/{c4Diagram-AAUBKEIU-D2R36Xu6.js → c4Diagram-AAUBKEIU-C9FinBRA.js} +1 -1
- package/public/dist/assets/channel-5QxFRU5l.js +1 -0
- package/public/dist/assets/{chunk-2J33WTMH-xiPJWKcl.js → chunk-2J33WTMH-N9wxleFR.js} +1 -1
- package/public/dist/assets/{chunk-3OPIFGDE-DixnEkZw.js → chunk-3OPIFGDE-B1qdy3mP.js} +1 -1
- package/public/dist/assets/{chunk-4BX2VUAB-6lTRwyT0.js → chunk-4BX2VUAB-Dbg5PjGD.js} +1 -1
- package/public/dist/assets/{chunk-4EGX6M5U-DXtAEgX6.js → chunk-4EGX6M5U-BIFnMXqg.js} +1 -1
- package/public/dist/assets/chunk-55IACEB6-C9gRJHcb.js +1 -0
- package/public/dist/assets/{chunk-5DO6E6H7-DDcMHB95.js → chunk-5DO6E6H7-Dc9k92pO.js} +1 -1
- package/public/dist/assets/{chunk-5ZQYHXKU-Bli4k6GI.js → chunk-5ZQYHXKU-BOYB4Qmp.js} +2 -2
- package/public/dist/assets/{chunk-727SXJPM-sp4W8bhf.js → chunk-727SXJPM-2OgKkBMF.js} +1 -1
- package/public/dist/assets/{chunk-AQP2D5EJ-Co6ucdGq.js → chunk-AQP2D5EJ-CIXopxD6.js} +1 -1
- package/public/dist/assets/{chunk-BR22UD5L-CVuYkAd1.js → chunk-BR22UD5L-DlNCrhSA.js} +1 -1
- package/public/dist/assets/{chunk-BSJP7CBP-B47GpxcW.js → chunk-BSJP7CBP-CpgaSqhR.js} +1 -1
- package/public/dist/assets/{chunk-CSCIHK7Q-CAE1p4Em.js → chunk-CSCIHK7Q-R-Y9ue5N.js} +1 -1
- package/public/dist/assets/{chunk-FHYWG6QK-CxZt-yZZ.js → chunk-FHYWG6QK-DVrRFYRd.js} +1 -1
- package/public/dist/assets/{chunk-FMBD7UC4-CwqBlx0l.js → chunk-FMBD7UC4-jn5b6_kv.js} +1 -1
- package/public/dist/assets/{chunk-KSCS5N6A-Beq1s5eO.js → chunk-KSCS5N6A-DayXQgYz.js} +2 -2
- package/public/dist/assets/{chunk-L5ZTLDWV-DfUlBdXN.js → chunk-L5ZTLDWV-CtcQ12uz.js} +1 -1
- package/public/dist/assets/{chunk-LZXEDZCA-B_yP4UKw.js → chunk-LZXEDZCA-BuEa86aU.js} +1 -1
- package/public/dist/assets/{chunk-MPE355IW-Bp4qAOUf.js → chunk-MPE355IW-Be8tT5FQ.js} +1 -1
- package/public/dist/assets/{chunk-MZUSXYTE-DAU-v-0c.js → chunk-MZUSXYTE-bFnwST0F.js} +1 -1
- package/public/dist/assets/{chunk-N66VUXT2-CpPz1L5u.js → chunk-N66VUXT2-BSpsJq6A.js} +1 -1
- package/public/dist/assets/{chunk-ND2GUHAM-3qbNb7I9.js → chunk-ND2GUHAM-CnEcVn6T.js} +1 -1
- package/public/dist/assets/{chunk-NZK2D7GU-CTqFQ8K5.js → chunk-NZK2D7GU-asW9Yrwq.js} +1 -1
- package/public/dist/assets/{chunk-O5CBEL6O-D-jDqsN2.js → chunk-O5CBEL6O-BVoXQ09V.js} +1 -1
- package/public/dist/assets/{chunk-PUPMXCY4-ppZvktf-.js → chunk-PUPMXCY4-BU48euO5.js} +1 -1
- package/public/dist/assets/chunk-QZHKN3VN-CC7ecfZE.js +1 -0
- package/public/dist/assets/{chunk-UIBZB4QT-rJZEVBX0.js → chunk-UIBZB4QT-aXCea_7h.js} +1 -1
- package/public/dist/assets/{chunk-WCWK7LTN-CGvUyB8h.js → chunk-WCWK7LTN-fR0CutHV.js} +1 -1
- package/public/dist/assets/chunk-WU5MYG2G-CDC6hlhk.js +1 -0
- package/public/dist/assets/{chunk-XPW4576I-BaQfzRci.js → chunk-XPW4576I-CFkDqujt.js} +1 -1
- package/public/dist/assets/classDiagram-4FO5ZUOK-Bfu4_8Yk.js +1 -0
- package/public/dist/assets/classDiagram-v2-Q7XG4LA2-_XyS72AY.js +1 -0
- package/public/dist/assets/constants-ahKI_aEG.js +1 -0
- package/public/dist/assets/{cose-bilkent-S5V4N54A-Bt9AAJCx.js → cose-bilkent-S5V4N54A-CZbCTJt4.js} +1 -1
- package/public/dist/assets/{dagre-BM42HDAG-CXEA1wvZ.js → dagre-BM42HDAG-BB0IJKjW.js} +1 -1
- package/public/dist/assets/{dagre-Ve-IAfyz.js → dagre-D4AB5Dyv.js} +1 -1
- package/public/dist/assets/desktop-bridge-CrqidwSb.js +1 -0
- package/public/dist/assets/{diagram-2AECGRRQ-CCB0OKc2.js → diagram-2AECGRRQ-CHUQ78BD.js} +1 -1
- package/public/dist/assets/{diagram-5GNKFQAL-Cki9HABy.js → diagram-5GNKFQAL-onxHMGMn.js} +1 -1
- package/public/dist/assets/{diagram-KO2AKTUF-DNBDjE2o.js → diagram-KO2AKTUF-BlgkTTwi.js} +1 -1
- package/public/dist/assets/{diagram-LMA3HP47-Cy23RDPa.js → diagram-LMA3HP47-BVWYubzU.js} +1 -1
- package/public/dist/assets/{diagram-OG6HWLK6-CT_YF8cA.js → diagram-OG6HWLK6-BM7IcJ6z.js} +1 -1
- package/public/dist/assets/dist-2S2B_MeU.js +1 -0
- package/public/dist/assets/dist-B2d2NOJ3.js +1 -0
- package/public/dist/assets/dist-BSF2Z7j1.js +6 -0
- package/public/dist/assets/dist-BZh7LRrp.js +1 -0
- package/public/dist/assets/dist-BaazPVzw.js +1 -0
- package/public/dist/assets/dist-Bn4kv_Se.js +1 -0
- package/public/dist/assets/dist-CB1fgeSN.js +1 -0
- package/public/dist/assets/dist-CG0XIeov.js +1 -0
- package/public/dist/assets/dist-CG65f_qI.js +1 -0
- package/public/dist/assets/dist-CJwXuDux.js +39 -0
- package/public/dist/assets/dist-CU9b0vPA.js +1 -0
- package/public/dist/assets/dist-CkWMWu5F.js +23 -0
- package/public/dist/assets/dist-CsK9fYYW.js +1 -0
- package/public/dist/assets/dist-CuNACpdD.js +1 -0
- package/public/dist/assets/dist-CzDHA1yv.js +1 -0
- package/public/dist/assets/dist-D0mdXpwq.js +1 -0
- package/public/dist/assets/{dist-3R3GxjCf.js → dist-DCefgfkj.js} +5 -5
- package/public/dist/assets/dist-DJ5byDHS2.js +1 -0
- package/public/dist/assets/dist-DLSl_Nbu.js +1 -0
- package/public/dist/assets/dist-DLa7--1u.js +1 -0
- package/public/dist/assets/dist-DZ1vWpde.js +1 -0
- package/public/dist/assets/dist-D_ULP6ER.js +1 -0
- package/public/dist/assets/dist-Dgo6P711.js +1 -0
- package/public/dist/assets/dist-DtkJvqbT.js +9 -0
- package/public/dist/assets/dist-DwzmyMDC.js +1 -0
- package/public/dist/assets/dist-H3yurMdo.js +11 -0
- package/public/dist/assets/dist-HtoUbUb4.js +1 -0
- package/public/dist/assets/dist-P76w4V8t.js +2 -0
- package/public/dist/assets/{dist-DuuoJfRB.js → dist-SWkyI5gN.js} +2 -2
- package/public/dist/assets/dist-w85EQGWO.js +1 -0
- package/public/dist/assets/{dockerfile-DAfh5qoE.js → dockerfile-O79f3xVO.js} +1 -1
- package/public/dist/assets/employees-DZSPGlaH.js +33 -0
- package/public/dist/assets/{erDiagram-TEJ5UH35-Cq7oHdXg.js → erDiagram-TEJ5UH35-Dr-3ziJG.js} +1 -1
- package/public/dist/assets/eventmodeling-FCH6USID-Du0rADZ8.js +1 -0
- package/public/dist/assets/{factor-BpoYJieo.js → factor-2MJ0aFHQ.js} +1 -1
- package/public/dist/assets/{flowDiagram-I6XJVG4X-D8CdEnfM.js → flowDiagram-I6XJVG4X-COxvv8bU.js} +1 -1
- package/public/dist/assets/{ganttDiagram-6RSMTGT7-B1rzKXi_.js → ganttDiagram-6RSMTGT7-BztWk1Ow.js} +2 -2
- package/public/dist/assets/gitGraph-WXDBUCRP-Cw5oPUI1.js +1 -0
- package/public/dist/assets/{gitGraphDiagram-PVQCEYII-CqLh-joi.js → gitGraphDiagram-PVQCEYII-Dw-pLiB8.js} +1 -1
- package/public/dist/assets/{graphlib-W5bESv3F.js → graphlib-DCNdUnXF.js} +1 -1
- package/public/dist/assets/info-J43DQDTF-bda--3fv.js +1 -0
- package/public/dist/assets/{infoDiagram-5YYISTIA-C1zVxumj.js → infoDiagram-5YYISTIA-BSM5RFYV.js} +1 -1
- package/public/dist/assets/{ishikawaDiagram-YF4QCWOH-x-9J6xPM.js → ishikawaDiagram-YF4QCWOH-DGqEaMN9.js} +1 -1
- package/public/dist/assets/javascript-BIzwdG_f.js +1 -0
- package/public/dist/assets/{journeyDiagram-JHISSGLW-BDYzHrtn.js → journeyDiagram-JHISSGLW-CBGlHr__.js} +1 -1
- package/public/dist/assets/{kanban-definition-UN3LZRKU-BJ-06i6Z.js → kanban-definition-UN3LZRKU-CtvwD90I.js} +1 -1
- package/public/dist/assets/manager-CFxbpg7j.css +1 -0
- package/public/dist/assets/manager-wAHlX68t.js +12 -0
- package/public/dist/assets/memory-B4RpXXJ7.js +20 -0
- package/public/dist/assets/memory-C9EVOb_D.js +1 -0
- package/public/dist/assets/mermaid-loader-BPeAxEES.js +1 -0
- package/public/dist/assets/{mermaid-parser.core-C62NUJRb.js → mermaid-parser.core-BB62R3s0.js} +1 -1
- package/public/dist/assets/mermaid.core-86z3EI0c.js +1 -0
- package/public/dist/assets/{mermaid.core-D8VnfThU.js → mermaid.core-Eh0d41ge.js} +2 -2
- package/public/dist/assets/{mindmap-definition-RKZ34NQL-D8NDuIhn.js → mindmap-definition-RKZ34NQL-Cg1Nirgc.js} +1 -1
- package/public/dist/assets/notes-graph-settings-CznA-Qu0.js +1 -0
- package/public/dist/assets/{nsis-Ch4QINLN.js → nsis-CVYtDIFk.js} +1 -1
- package/public/dist/assets/packet-YPE3B663-CdmMldz9.js +1 -0
- package/public/dist/assets/pie-LRSECV5Y-Bh7evnjl.js +1 -0
- package/public/dist/assets/{pieDiagram-4H26LBE5-CpBePil_.js → pieDiagram-4H26LBE5--PRag7Te.js} +1 -1
- package/public/dist/assets/{provider-icons-ClVd2suJ.js → provider-icons-XEfJPGTe.js} +9 -5
- package/public/dist/assets/{pug-CXYqmmpP.js → pug-DplZiQL-.js} +1 -1
- package/public/dist/assets/{quadrantDiagram-W4KKPZXB-C1WWpn88.js → quadrantDiagram-W4KKPZXB-BTql-Bsn.js} +1 -1
- package/public/dist/assets/radar-GUYGQ44K-Bi6iY53d.js +1 -0
- package/public/dist/assets/render-DnylWKO1.js +28 -0
- package/public/dist/assets/{requirementDiagram-4Y6WPE33-C_D5VbNk.js → requirementDiagram-4Y6WPE33-43_zBMme.js} +1 -1
- package/public/dist/assets/{sankeyDiagram-5OEKKPKP--RH3Es8R.js → sankeyDiagram-5OEKKPKP-Bhvu7fVp.js} +1 -1
- package/public/dist/assets/{sequenceDiagram-3UESZ5HK-CVI4AjhN.js → sequenceDiagram-3UESZ5HK-DiT6UbHL.js} +1 -1
- package/public/dist/assets/settings-DIG_i79X.js +1 -0
- package/public/dist/assets/settings-VCXKhhhz.js +66 -0
- package/public/dist/assets/sidebar-Bi_ktFVw.js +18 -0
- package/public/dist/assets/{skills-DbRVI-zf.js → skills-CW7NEhew.js} +2 -2
- package/public/dist/assets/skills-RjRqvykb.js +1 -0
- package/public/dist/assets/slash-commands-CAydTUgf.js +19 -0
- package/public/dist/assets/slash-commands-DdXu96Zd.js +1 -0
- package/public/dist/assets/{state-xhhyIPlq.js → state-D04-chBy.js} +1 -1
- package/public/dist/assets/{stateDiagram-AJRCARHV-4bx1rPZ3.js → stateDiagram-AJRCARHV-EdHNB699.js} +1 -1
- package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CwXjV0-w.js +1 -0
- package/public/dist/assets/{timeline-definition-PNZ67QCA-DeQoGRE2.js → timeline-definition-PNZ67QCA-DLCG8ciJ.js} +1 -1
- package/public/dist/assets/{trace-drawer-CIVBXyRH.js → trace-drawer-G-KP3IbQ.js} +1 -1
- package/public/dist/assets/treeView-BLDUP644-gIRuNooA.js +1 -0
- package/public/dist/assets/treemap-LRROVOQU-DGFQnuQ3.js +1 -0
- package/public/dist/assets/ui-CIQjTLzc.js +1 -0
- package/public/dist/assets/ui-CkHB9Jmo.js +140 -0
- package/public/dist/assets/vendor-utils-BydMkEGM.js +1 -0
- package/public/dist/assets/{vennDiagram-CIIHVFJN-CejyJK0L.js → vennDiagram-CIIHVFJN-C93tL0id.js} +1 -1
- package/public/dist/assets/wardley-L42UT6IY-D7Pv8rzC.js +1 -0
- package/public/dist/assets/{wardleyDiagram-YWT4CUSO-DqXV0sa1.js → wardleyDiagram-YWT4CUSO-BQQr2bW2.js} +1 -1
- package/public/dist/assets/wiki-link-resolver-CQwLeKpN.js +22 -0
- package/public/dist/assets/wiki-link-suggestions-DnVtu7Jb.js +2 -0
- package/public/dist/assets/{xychartDiagram-2RQKCTM6-CWLoVl2b.js → xychartDiagram-2RQKCTM6-DGZ5VpP9.js} +2 -2
- package/public/dist/index.html +36 -10
- package/public/dist/manager/index.html +2 -2
- package/public/index.html +35 -8
- package/public/js/constants.ts +22 -1
- package/public/js/diagram/iframe-renderer.ts +2 -1
- package/public/js/features/chat-messages.ts +2 -2
- package/public/js/features/chat.ts +144 -17
- package/public/js/features/copy-text.ts +39 -0
- package/public/js/features/employees.ts +5 -5
- package/public/js/features/memory.ts +3 -4
- package/public/js/features/message-actions.ts +3 -2
- package/public/js/features/message-history.ts +2 -2
- package/public/js/features/pending-queue.ts +3 -2
- package/public/js/features/preview-shortcut-bridge.ts +25 -10
- package/public/js/features/settings-channel.ts +3 -0
- package/public/js/features/settings-cli-status.ts +254 -45
- package/public/js/features/settings-core.ts +8 -0
- package/public/js/features/settings.ts +1 -1
- package/public/js/features/slash-commands.ts +34 -2
- package/public/js/features/theme.ts +34 -6
- package/public/js/features/transport-status-row.ts +91 -0
- package/public/js/features/workflow-event-adapter.ts +77 -0
- package/public/js/main.ts +21 -4
- package/public/js/preview-parent-origin.ts +38 -0
- package/public/js/provider-icons.ts +6 -1
- package/public/js/render/code-copy.ts +16 -18
- package/public/js/render/file-links.ts +127 -30
- package/public/js/render/notes-vault-path.ts +64 -0
- package/public/js/render/post-render.ts +2 -2
- package/public/js/render/svg-actions.ts +4 -1
- package/public/js/render.ts +1 -0
- package/public/js/state.ts +19 -1
- package/public/js/ws.ts +121 -8
- package/public/locales/en.json +40 -0
- package/public/locales/ja.json +31 -0
- package/public/locales/ko.json +40 -0
- package/public/locales/zh.json +31 -0
- package/public/manager/src/App.tsx +65 -64
- package/public/manager/src/AppChrome.tsx +14 -5
- package/public/manager/src/InstancePreview.tsx +113 -2
- package/public/manager/src/SidebarRailRouter.tsx +67 -4
- package/public/manager/src/api.ts +46 -0
- package/public/manager/src/browser-panel/BrowserPanel.tsx +445 -0
- package/public/manager/src/browser-panel/browser-panel.css +241 -0
- package/public/manager/src/browser-panel/browser-url.ts +55 -0
- package/public/manager/src/clipboard/copy-text.ts +27 -0
- package/public/manager/src/components/CommandBar.tsx +2 -0
- package/public/manager/src/components/CommandCenter.tsx +3 -1
- package/public/manager/src/components/DesktopPanelControls.tsx +79 -0
- package/public/manager/src/components/SidebarRail.tsx +1 -1
- package/public/manager/src/components/WorkspaceLayout.tsx +71 -1
- package/public/manager/src/dashboard-settings/DashboardDeveloperSettingsSection.tsx +123 -0
- package/public/manager/src/dashboard-settings/DashboardSettingsSidebar.tsx +6 -2
- package/public/manager/src/dashboard-settings/DashboardSettingsWorkspace.tsx +4 -1
- package/public/manager/src/dashboard-settings/dashboard-settings-ui.ts +8 -0
- package/public/manager/src/desktop-link.tsx +6 -1
- package/public/manager/src/diff-panel/DiffPanel.tsx +219 -0
- package/public/manager/src/diff-panel/diff-client.ts +46 -0
- package/public/manager/src/diff-panel/diff-panel.css +163 -0
- package/public/manager/src/diff-panel/diff-root-candidates.ts +54 -0
- package/public/manager/src/doc-panel/DocPanel.tsx +113 -0
- package/public/manager/src/doc-panel/doc-panel.css +57 -0
- package/public/manager/src/folder-panel/FolderPanel.tsx +144 -0
- package/public/manager/src/folder-panel/folder-panel.css +82 -0
- package/public/manager/src/folder-panel/folder-sources.ts +93 -0
- package/public/manager/src/help/helpContent.tsx +3 -0
- package/public/manager/src/hooks/useDashboardView.ts +22 -1
- package/public/manager/src/main.tsx +2 -0
- package/public/manager/src/manager-components.css +12 -0
- package/public/manager/src/manager-dashboard-reminders-priority.css +11 -0
- package/public/manager/src/manager-dashboard-reminders.css +29 -0
- package/public/manager/src/manager-layout.css +68 -22
- package/public/manager/src/manager-notes.css +181 -0
- package/public/manager/src/manager-p0-1-1.css +118 -1
- package/public/manager/src/manager-polish.css +15 -12
- package/public/manager/src/manager-shortcuts.ts +17 -0
- package/public/manager/src/manager-tokens.css +25 -0
- package/public/manager/src/notes/MarkdownEditor.tsx +26 -3
- package/public/manager/src/notes/NotesFileTree.tsx +24 -2
- package/public/manager/src/notes/NotesGraphView.tsx +1 -145
- package/public/manager/src/notes/NotesSidebar.tsx +4 -0
- package/public/manager/src/notes/NotesThemeLoader.tsx +104 -0
- package/public/manager/src/notes/NotesWorkspace.tsx +33 -5
- package/public/manager/src/notes/graph/NotesGraphCanvas.tsx +195 -0
- package/public/manager/src/notes/graph/NotesGraphControlsPanel.tsx +172 -0
- package/public/manager/src/notes/graph/NotesGraphWorkspace.tsx +116 -0
- package/public/manager/src/notes/graph/notes-graph-filter.ts +192 -0
- package/public/manager/src/notes/graph/notes-graph-force.ts +36 -0
- package/public/manager/src/notes/graph/notes-graph-settings.ts +121 -0
- package/public/manager/src/notes/notes-graph.css +382 -0
- package/public/manager/src/notes/rendering/CodeBlock.tsx +5 -4
- package/public/manager/src/notes/rendering/MarkdownRenderer.tsx +3 -0
- package/public/manager/src/notes/useNoteSync.ts +67 -0
- package/public/manager/src/notes/wysiwyg/MilkdownWysiwygEditor.tsx +4 -0
- package/public/manager/src/notes/wysiwyg/milkdown-code-block-view.ts +5 -1
- package/public/manager/src/notes/wysiwyg/milkdown-slash-menu.ts +192 -0
- package/public/manager/src/notes/wysiwyg/milkdown-table-menu.ts +120 -0
- package/public/manager/src/panels/BottomPanel.tsx +61 -0
- package/public/manager/src/panels/BottomPanelTabBar.tsx +71 -0
- package/public/manager/src/panels/PanelLayoutProvider.tsx +288 -0
- package/public/manager/src/panels/PanelResizer.tsx +71 -0
- package/public/manager/src/panels/RightSidebar.tsx +192 -0
- package/public/manager/src/panels/desktop-bridge.ts +112 -0
- package/public/manager/src/panels/panel-capabilities.ts +44 -0
- package/public/manager/src/panels/panel-layout-registry-state.ts +38 -0
- package/public/manager/src/panels/panel-shortcut-bus.ts +15 -0
- package/public/manager/src/panels/panels.css +274 -0
- package/public/manager/src/panels/types.ts +16 -0
- package/public/manager/src/preview.ts +11 -1
- package/public/manager/src/settings/pages/ChannelsDiscord.tsx +3 -1
- package/public/manager/src/settings/pages/ChannelsTelegram.tsx +3 -1
- package/public/manager/src/settings/pages/components/ActiveChannelToggle.tsx +2 -2
- package/public/manager/src/settings/pages/components/TransportStatusChips.tsx +108 -0
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +22 -3
- package/public/manager/src/settings/pages/components/employees-helpers.ts +1 -0
- package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +1 -0
- package/public/manager/src/settings-controls.css +57 -0
- package/public/manager/src/settings-embedding.css +3 -3
- package/public/manager/src/terminal/TerminalPanel.tsx +362 -0
- package/public/manager/src/terminal/terminal-bridge.ts +12 -0
- package/public/manager/src/terminal/terminal.css +175 -0
- package/public/manager/src/types.ts +66 -2
- package/public/manager/src/usePreviewShortcutMessages.ts +12 -3
- package/scripts/fresh-install-smoke.ts +1 -2
- package/scripts/install-risk-gate.mjs +0 -18
- package/scripts/install-wsl.sh +0 -46
- package/scripts/install.sh +0 -28
- package/scripts/release-gates.mjs +52 -0
- package/scripts/release.sh +9 -1
- package/scripts/require-release-evidence.mjs +0 -2
- package/public/dist/assets/ChannelsDiscord-CbmWms9-.js +0 -1
- package/public/dist/assets/ChannelsTelegram-BD4Eyztg.js +0 -1
- package/public/dist/assets/Employees-DcMChleU.js +0 -1
- package/public/dist/assets/HealthBadge-CfLTPTPW.js +0 -1
- package/public/dist/assets/Heartbeat-BoobN35p.js +0 -1
- package/public/dist/assets/MilkdownWysiwygEditor-Otw40DDF.js +0 -160
- package/public/dist/assets/NotesGraphView-CwdEnL7d.js +0 -1
- package/public/dist/assets/Permissions-CcIBptg3.js +0 -1
- package/public/dist/assets/agent-meta-BC7mLqo6.js +0 -1
- package/public/dist/assets/app-C7MAcAMu.js +0 -39
- package/public/dist/assets/app-CkFBKUf8.css +0 -1
- package/public/dist/assets/architecture-7EHR7CIX-wVaUQezY.js +0 -1
- package/public/dist/assets/channel-CCQujL1n.js +0 -1
- package/public/dist/assets/chunk-55IACEB6-DhWWzzdj.js +0 -1
- package/public/dist/assets/chunk-QZHKN3VN-CBAtPPT7.js +0 -1
- package/public/dist/assets/chunk-WU5MYG2G-DlBJtD7-.js +0 -1
- package/public/dist/assets/classDiagram-4FO5ZUOK-DmPJvqRM.js +0 -1
- package/public/dist/assets/classDiagram-v2-Q7XG4LA2-ECmTUt7U.js +0 -1
- package/public/dist/assets/constants-BXWl7LTi.js +0 -1
- package/public/dist/assets/dist-BLd7xdyq.js +0 -1
- package/public/dist/assets/dist-BaRrwDy3.js +0 -1
- package/public/dist/assets/dist-Bbsp4OF7.js +0 -1
- package/public/dist/assets/dist-BkBGlG70.js +0 -1
- package/public/dist/assets/dist-BkJ_1mj9.js +0 -1
- package/public/dist/assets/dist-BxCRVW5D.js +0 -1
- package/public/dist/assets/dist-C-v7Rm67.js +0 -23
- package/public/dist/assets/dist-CNgDEAy8.js +0 -1
- package/public/dist/assets/dist-CO_W5rr2.js +0 -1
- package/public/dist/assets/dist-ChAUfTbO.js +0 -1
- package/public/dist/assets/dist-D-k-lzQT.js +0 -1
- package/public/dist/assets/dist-D1hPukqY.js +0 -1
- package/public/dist/assets/dist-D5Qx-jQQ.js +0 -1
- package/public/dist/assets/dist-D7VNzYBv.js +0 -6
- package/public/dist/assets/dist-DAxnodoa.js +0 -1
- package/public/dist/assets/dist-DHSyODkR.js +0 -1
- package/public/dist/assets/dist-DaYTPjbb2.js +0 -1
- package/public/dist/assets/dist-DlWi9tVO.js +0 -1
- package/public/dist/assets/dist-Dv36UUXz.js +0 -1
- package/public/dist/assets/dist-F4CVhitP.js +0 -9
- package/public/dist/assets/dist-LHbJYy3N.js +0 -1
- package/public/dist/assets/dist-VIlx7JdU.js +0 -1
- package/public/dist/assets/dist-cgDt2PmY.js +0 -11
- package/public/dist/assets/dist-eW2LjRIK.js +0 -1
- package/public/dist/assets/dist-vGn3_sWA.js +0 -1
- package/public/dist/assets/employees-BmxY8Mw3.js +0 -33
- package/public/dist/assets/eventmodeling-FCH6USID-Cq0nylxO.js +0 -1
- package/public/dist/assets/gitGraph-WXDBUCRP-DDq6-3D3.js +0 -1
- package/public/dist/assets/info-J43DQDTF-OUnqwpUV.js +0 -1
- package/public/dist/assets/javascript-CZjRNq5R.js +0 -1
- package/public/dist/assets/manager-B2NWzG7j.css +0 -1
- package/public/dist/assets/manager-q68thm66.js +0 -25
- package/public/dist/assets/memory-BqqibBIE.js +0 -1
- package/public/dist/assets/memory-CRL72HB-.js +0 -20
- package/public/dist/assets/mermaid-loader-Dqb4ZUz6.js +0 -1
- package/public/dist/assets/mermaid.core-DYHvk6Pd.js +0 -1
- package/public/dist/assets/packet-YPE3B663-Bb9hBQ06.js +0 -1
- package/public/dist/assets/pie-LRSECV5Y-CNRQnRNZ.js +0 -1
- package/public/dist/assets/radar-GUYGQ44K-BxngU2v0.js +0 -1
- package/public/dist/assets/render-o_YEiCEO.js +0 -28
- package/public/dist/assets/settings-B0RlyAkI.js +0 -1
- package/public/dist/assets/settings-CCXRL5Ar.js +0 -46
- package/public/dist/assets/sidebar-DRJffqO1.js +0 -14
- package/public/dist/assets/skills-CFdzXbtK.js +0 -1
- package/public/dist/assets/slash-commands-BUM6u-Ex.js +0 -1
- package/public/dist/assets/slash-commands-C2YBMaQV.js +0 -14
- package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CrfGPzHb.js +0 -1
- package/public/dist/assets/treeView-BLDUP644-cXRzPGzz.js +0 -1
- package/public/dist/assets/treemap-LRROVOQU-BsZE5HPE.js +0 -1
- package/public/dist/assets/ui-C3ArwMhv.js +0 -140
- package/public/dist/assets/ui-CboUuc_E.js +0 -1
- package/public/dist/assets/vendor-utils-rVejrfMR.js +0 -1
- package/public/dist/assets/wardley-L42UT6IY-D_qm0cZD.js +0 -1
- package/public/dist/assets/wiki-link-suggestions-e5BzJAZH.js +0 -23
- /package/public/dist/assets/{DashboardEmbeddingSection-6F8zSSja.js → DashboardEmbeddingSection-ChF63KXJ.js} +0 -0
- /package/public/dist/assets/{InlineWarn-C7ISyzDI.js → InlineWarn-CY6dBBMq.js} +0 -0
- /package/public/dist/assets/{apl-CieDeb7B.js → apl-CQGZdmVU.js} +0 -0
- /package/public/dist/assets/{asciiarmor-BRTyulZY.js → asciiarmor-6rdc1JOx.js} +0 -0
- /package/public/dist/assets/{asn1-DoNAtQ5o.js → asn1-D8iCH-On.js} +0 -0
- /package/public/dist/assets/{asterisk-CR7oKPxi.js → asterisk-ChqZLgq_.js} +0 -0
- /package/public/dist/assets/{brainfuck-abzPcrOz.js → brainfuck-CDmGO_27.js} +0 -0
- /package/public/dist/assets/{chunk-AGHRB4JF-CYdXVA2-.js → chunk-AGHRB4JF-BgIXD8KY.js} +0 -0
- /package/public/dist/assets/{chunk-NNHCCRGN-BaiX9a5F.js → chunk-NNHCCRGN-BPmsUfnh.js} +0 -0
- /package/public/dist/assets/{clike-B71Zq38G.js → clike-CSGpadKW.js} +0 -0
- /package/public/dist/assets/{clojure-Zm0UzHPq.js → clojure-CST35Ic-.js} +0 -0
- /package/public/dist/assets/{cmake-D3UNdg6L.js → cmake-BVvLLL-M.js} +0 -0
- /package/public/dist/assets/{cobol-4fYvwQR0.js → cobol-Ck6DkJOz.js} +0 -0
- /package/public/dist/assets/{coffeescript-Ct6bZdRU.js → coffeescript-D_Wxovbg.js} +0 -0
- /package/public/dist/assets/{commonlisp-CrgXVPcd.js → commonlisp-B8ANOF1p.js} +0 -0
- /package/public/dist/assets/{crystal-bGOl67VM.js → crystal-Daoo63FI.js} +0 -0
- /package/public/dist/assets/{css-B_EV3Xq2.js → css-BLiiJuyL.js} +0 -0
- /package/public/dist/assets/{cypher-DXDlHTYf.js → cypher-BMqftmWo.js} +0 -0
- /package/public/dist/assets/{cytoscape.esm-BK7ao2Ti.js → cytoscape.esm-Dgu56jtY.js} +0 -0
- /package/public/dist/assets/{d-RL5ynsiz.js → d-DOGkwbDi.js} +0 -0
- /package/public/dist/assets/{diff-B5McBGjz.js → diff-VsLDmRbo.js} +0 -0
- /package/public/dist/assets/{dist-DrIWh2fi.js → dist-DJlNCT5R.js} +0 -0
- /package/public/dist/assets/{dtd-l3sK4p_C.js → dtd-CxrLPib8.js} +0 -0
- /package/public/dist/assets/{dylan-WjJGY-rW.js → dylan-QB82VE9N.js} +0 -0
- /package/public/dist/assets/{ebnf-BGY79HOS.js → ebnf-B6cp6Red.js} +0 -0
- /package/public/dist/assets/{ecl-BKh7OE1d.js → ecl-zYbBq-k7.js} +0 -0
- /package/public/dist/assets/{eiffel-Bzvlg3oK.js → eiffel-DnQZC9e4.js} +0 -0
- /package/public/dist/assets/{elm-5_BqNmKu.js → elm-Cx44SA5e.js} +0 -0
- /package/public/dist/assets/{erlang-BdVwz8I8.js → erlang-CEHBsR_g.js} +0 -0
- /package/public/dist/assets/{fcl-B9cnfODD.js → fcl-D0vOEWq5.js} +0 -0
- /package/public/dist/assets/{fields-BwD_NGxe.js → fields-C-y_8RgA.js} +0 -0
- /package/public/dist/assets/{forth-wZbbnGzb.js → forth-KL0mdDBU.js} +0 -0
- /package/public/dist/assets/{fortran-BAJZrRfU.js → fortran-Dq4mvV2Z.js} +0 -0
- /package/public/dist/assets/{gas-D60ZhBat.js → gas-C1IQIiP2.js} +0 -0
- /package/public/dist/assets/{gherkin-B8tKjAAi.js → gherkin-DJavHCGq.js} +0 -0
- /package/public/dist/assets/{groovy-BAG9eJUD.js → groovy-DYXu3zX-.js} +0 -0
- /package/public/dist/assets/{haskell-Cj4TmWbg.js → haskell-CEbLR9qt.js} +0 -0
- /package/public/dist/assets/{haxe-8chnvz-o.js → haxe-BpJF7A4A.js} +0 -0
- /package/public/dist/assets/{http-DDYeO71z.js → http-DWdENtd1.js} +0 -0
- /package/public/dist/assets/{idl-D1hY-Gp_.js → idl-CE1kS3NQ.js} +0 -0
- /package/public/dist/assets/{javascript-Sh0ZUMP2.js → javascript-CJNkmBfh.js} +0 -0
- /package/public/dist/assets/{julia-BibioBF2.js → julia-BJgPYrDa.js} +0 -0
- /package/public/dist/assets/{livescript-CSZrB6F4.js → livescript-DsrJVqPX.js} +0 -0
- /package/public/dist/assets/{lua-BvTlo5w3.js → lua-C7UuQSXZ.js} +0 -0
- /package/public/dist/assets/{mathematica-Bexv8BWZ.js → mathematica-DUerNKxF.js} +0 -0
- /package/public/dist/assets/{mbox-BAhbA8z2.js → mbox-l0MV8RAb.js} +0 -0
- /package/public/dist/assets/{mirc-BzT5Kh4S.js → mirc-Bs-bacTk.js} +0 -0
- /package/public/dist/assets/{mllike-DeoJnUZQ.js → mllike-DDa-ra-x.js} +0 -0
- /package/public/dist/assets/{modelica-FD_-Fxlc.js → modelica-DorVekoh.js} +0 -0
- /package/public/dist/assets/{mscgen-C-OyhbwB.js → mscgen-Bu9Rmf5j.js} +0 -0
- /package/public/dist/assets/{mumps-BxkCDTK7.js → mumps-BERv0OoY.js} +0 -0
- /package/public/dist/assets/{nginx-2JaV__gC.js → nginx-Bsa-KRWy.js} +0 -0
- /package/public/dist/assets/{ntriples--rhhCzqb.js → ntriples-CQMTRhrZ.js} +0 -0
- /package/public/dist/assets/{octave-rS4nMzRe.js → octave-Bl83K6Ag.js} +0 -0
- /package/public/dist/assets/{oz-I4fMb_NC.js → oz-CCTboWOh.js} +0 -0
- /package/public/dist/assets/{page-shell-uNOxwdbr.js → page-shell-k5-hYhKb.js} +0 -0
- /package/public/dist/assets/{pascal-BEghJs8t.js → pascal-D-i7gVLf.js} +0 -0
- /package/public/dist/assets/{path-utils-h2GAj3hH.js → path-utils-ztBHV7MX.js} +0 -0
- /package/public/dist/assets/{perl-BRO9ZFo9.js → perl-BiLLXF9c.js} +0 -0
- /package/public/dist/assets/{pig-L4Ii6KI0.js → pig-D_F2azNe.js} +0 -0
- /package/public/dist/assets/{powershell-BBeqUCRp.js → powershell-AJ59gf0u.js} +0 -0
- /package/public/dist/assets/{properties-Boi0jF2J.js → properties-CPYgUZZu.js} +0 -0
- /package/public/dist/assets/{protobuf-fB2aGypX.js → protobuf-BTkGCn64.js} +0 -0
- /package/public/dist/assets/{puppet-BRmsErtO.js → puppet-CQcFSvge.js} +0 -0
- /package/public/dist/assets/{python-Be4P9Dgp.js → python-txj4co98.js} +0 -0
- /package/public/dist/assets/{q-DZGhDLYt.js → q-D48iiS-J.js} +0 -0
- /package/public/dist/assets/{r-B4NERjRM.js → r-KvgSjvcw.js} +0 -0
- /package/public/dist/assets/{rough.esm-C0Gkx4O1.js → rough.esm-DEk5_dnJ.js} +0 -0
- /package/public/dist/assets/{rpm-e-QbHJ1q.js → rpm-BcHYZFkz.js} +0 -0
- /package/public/dist/assets/{ruby-BSVP_v59.js → ruby-C_Hj_59H.js} +0 -0
- /package/public/dist/assets/{sas-DHlU4v4g.js → sas-iqYBvleh.js} +0 -0
- /package/public/dist/assets/{scheme-BGXbz5Hz.js → scheme-BIcb4en6.js} +0 -0
- /package/public/dist/assets/{shell-yonx6xY2.js → shell-CJbQRqgD.js} +0 -0
- /package/public/dist/assets/{sieve-ClPJUZyi.js → sieve-CEVqHONw.js} +0 -0
- /package/public/dist/assets/{simple-mode-CjViblDK.js → simple-mode-CyEi8-qy.js} +0 -0
- /package/public/dist/assets/{smalltalk-CHXubeqS.js → smalltalk-CzJ9RPAW.js} +0 -0
- /package/public/dist/assets/{solr-C6q6YwPz.js → solr-DhrIF5tD.js} +0 -0
- /package/public/dist/assets/{sparql-CcspZvEd.js → sparql-p9uHdCLs.js} +0 -0
- /package/public/dist/assets/{spreadsheet-DH3a4LBS.js → spreadsheet-BEYojJ7u.js} +0 -0
- /package/public/dist/assets/{sql-meoY6gNi.js → sql-CnA4GIza.js} +0 -0
- /package/public/dist/assets/{stex-D2bn6Zsh.js → stex-6IVJg-2X.js} +0 -0
- /package/public/dist/assets/{stylus-DbXGih0S.js → stylus-fqPouKsv.js} +0 -0
- /package/public/dist/assets/{swift-Ch391uOd.js → swift-DHXFQ55a.js} +0 -0
- /package/public/dist/assets/{tcl-CQBgGWDP.js → tcl-DI621_2I.js} +0 -0
- /package/public/dist/assets/{textile-4i3oG3tg.js → textile-CpiPRB46.js} +0 -0
- /package/public/dist/assets/{tiddlywiki-CXG1-CcK.js → tiddlywiki-DASPoia0.js} +0 -0
- /package/public/dist/assets/{tiki-DJqKUhA-.js → tiki-H2_-xfcb.js} +0 -0
- /package/public/dist/assets/{toml-C1FnyICQ.js → toml-BLGegqRu.js} +0 -0
- /package/public/dist/assets/{troff-Cp8NvRO0.js → troff-BH_j1MPi.js} +0 -0
- /package/public/dist/assets/{ttcn-cfg-BVuxfGZf.js → ttcn-cfg-kxhuYjqY.js} +0 -0
- /package/public/dist/assets/{ttcn-NlmW_fji.js → ttcn-q84VxP8I.js} +0 -0
- /package/public/dist/assets/{turtle-Ba9ERlnm.js → turtle-COu2Ajrp.js} +0 -0
- /package/public/dist/assets/{vb-DDs4gjJb.js → vb-7GRadaxb.js} +0 -0
- /package/public/dist/assets/{vbscript-gOFmdMJN.js → vbscript-Bibo3Rcb.js} +0 -0
- /package/public/dist/assets/{velocity-DtSNZA7i.js → velocity-CRfDkZn8.js} +0 -0
- /package/public/dist/assets/{verilog-Pldmtxe7.js → verilog-B1kgqsBR.js} +0 -0
- /package/public/dist/assets/{vhdl-BFfSgWGp.js → vhdl-qL7iOc7c.js} +0 -0
- /package/public/dist/assets/{w3c-keyname-BggQEPNo.js → w3c-keyname-BkTDclMX.js} +0 -0
- /package/public/dist/assets/{webidl-B6ZFYE2L.js → webidl-Bpu8XQq2.js} +0 -0
- /package/public/dist/assets/{xquery-DhxUT98N.js → xquery-C_ocxvPR.js} +0 -0
- /package/public/dist/assets/{yacas-jSkQeF1Q.js → yacas-DByFiVRK.js} +0 -0
- /package/public/dist/assets/{z80-D7Lt6v61.js → z80-CKuzqVbN.js} +0 -0
|
@@ -4,6 +4,7 @@ import { api, apiJson } from '../api.js';
|
|
|
4
4
|
import { ICONS } from '../icons.js';
|
|
5
5
|
import { t } from '../locale.js';
|
|
6
6
|
import { t as i18n } from './i18n.js';
|
|
7
|
+
import { copyText } from './copy-text.js';
|
|
7
8
|
|
|
8
9
|
interface MemoryFile {
|
|
9
10
|
name: string;
|
|
@@ -212,7 +213,7 @@ function renderBasicFiles(files: MemoryFile[]) {
|
|
|
212
213
|
<span style="font-size:12px;font-family:monospace">${escapeHtml(f.name)}</span>
|
|
213
214
|
<span style="font-size:10px;color:var(--accent);margin-left:6px">${f.entries} entries</span>
|
|
214
215
|
</div>
|
|
215
|
-
<button data-mem-delete="${escapeHtml(f.name)}" style="background:none;border:none;color
|
|
216
|
+
<button data-mem-delete="${escapeHtml(f.name)}" style="background:none;border:none;color:var(--error);cursor:pointer;font-size:14px">${ICONS.trash}</button>
|
|
216
217
|
</div>
|
|
217
218
|
`).join('');
|
|
218
219
|
}
|
|
@@ -394,9 +395,7 @@ export async function reindexAdvancedMemory(): Promise<void> {
|
|
|
394
395
|
export function openCorruptedFolder(): void {
|
|
395
396
|
const text = $('advStorageRoot')?.textContent || '';
|
|
396
397
|
const path = text ? `${text}/corrupted` : 'JAW_HOME/memory/structured/corrupted';
|
|
397
|
-
|
|
398
|
-
navigator.clipboard.writeText(path).catch(() => { });
|
|
399
|
-
}
|
|
398
|
+
void copyText(path);
|
|
400
399
|
alert(`Corrupted folder path copied/shown:\n${path}`);
|
|
401
400
|
}
|
|
402
401
|
|
|
@@ -3,6 +3,7 @@ import { escapeHtml } from '../render.js';
|
|
|
3
3
|
import { ICONS } from '../icons.js';
|
|
4
4
|
import { bindToolItemInteractions } from './tool-ui.js';
|
|
5
5
|
import { bindProcessBlockInteractions } from './process-block.js';
|
|
6
|
+
import { copyText } from './copy-text.js';
|
|
6
7
|
|
|
7
8
|
type MessageActionSource = {
|
|
8
9
|
role: string;
|
|
@@ -72,8 +73,8 @@ function setCopied(btn: HTMLElement): void {
|
|
|
72
73
|
async function copyMessage(btn: HTMLElement): Promise<void> {
|
|
73
74
|
const msg = btn.closest('.msg');
|
|
74
75
|
if (!msg) return;
|
|
75
|
-
await
|
|
76
|
-
setCopied(btn);
|
|
76
|
+
const result = await copyText(messageText(msg));
|
|
77
|
+
if (result.ok) setCopied(btn);
|
|
77
78
|
}
|
|
78
79
|
|
|
79
80
|
async function pinMessage(btn: HTMLElement, options: MessageActionsOptions): Promise<void> {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { api } from '../api.js';
|
|
2
|
-
import { renderMarkdown,
|
|
2
|
+
import { renderMarkdown, linkifyFilePathsWithNotesRoot } from '../render.js';
|
|
3
3
|
import { renderMermaidBlocks } from '../render.js';
|
|
4
4
|
import { getVirtualScroll, VS_THRESHOLD, type VirtualItem } from '../virtual-scroll.js';
|
|
5
5
|
import { bootstrapVirtualHistory, type VirtualHistoryBootstrapDeps } from '../virtual-scroll-bootstrap.js';
|
|
@@ -43,7 +43,7 @@ export function registerVirtualScrollCallbacks(vs: ReturnType<typeof getVirtualS
|
|
|
43
43
|
};
|
|
44
44
|
vs.onPostRender = (viewport: HTMLElement) => {
|
|
45
45
|
activateWidgets(viewport);
|
|
46
|
-
|
|
46
|
+
void linkifyFilePathsWithNotesRoot(viewport);
|
|
47
47
|
void renderMermaidBlocks(viewport, { immediate: true });
|
|
48
48
|
};
|
|
49
49
|
}
|
|
@@ -10,6 +10,7 @@ import { escapeHtml } from '../render.js';
|
|
|
10
10
|
import { ICONS } from '../icons.js';
|
|
11
11
|
import { apiJson } from '../api.js';
|
|
12
12
|
import { t } from './i18n.js';
|
|
13
|
+
import { setStatus } from './ui-status.js';
|
|
13
14
|
|
|
14
15
|
export interface PendingItem {
|
|
15
16
|
id: string;
|
|
@@ -140,13 +141,13 @@ async function fire(id: string, action: Action): Promise<void> {
|
|
|
140
141
|
? `/api/orchestrate/queue/${encodeURIComponent(id)}/steer`
|
|
141
142
|
: `/api/orchestrate/queue/${encodeURIComponent(id)}`;
|
|
142
143
|
const method = action === 'steer' ? 'POST' : 'DELETE';
|
|
144
|
+
if (action === 'steer') setStatus('running');
|
|
143
145
|
const result = await apiJson<{ pending: number }>(path, method, {});
|
|
144
146
|
if (result == null) {
|
|
145
|
-
// Server already removed the item or call failed — let snapshot resync.
|
|
146
147
|
unpaintArmed(id, action);
|
|
148
|
+
if (action === 'steer') setStatus('idle');
|
|
147
149
|
return;
|
|
148
150
|
}
|
|
149
|
-
// Optimistic local removal — queue_update broadcast will resync.
|
|
150
151
|
lastItems = lastItems.filter(it => it.id !== id);
|
|
151
152
|
renderPendingQueue(lastItems);
|
|
152
153
|
}
|
|
@@ -1,27 +1,42 @@
|
|
|
1
|
-
// Forward
|
|
1
|
+
// Forward manager keyboard shortcuts from iframe to parent manager window.
|
|
2
2
|
// Only active when the page is embedded as an iframe (preview mode).
|
|
3
3
|
|
|
4
4
|
const FORWARD_KEYS = new Set(['j', 'k', 'i', 'n', 'p']);
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
if (
|
|
8
|
-
|
|
9
|
-
document.addEventListener('keydown', (e) => {
|
|
10
|
-
if (!e.altKey) return;
|
|
11
|
-
if (e.ctrlKey || e.metaKey) return;
|
|
6
|
+
function isForwardedManagerShortcut(e: KeyboardEvent): boolean {
|
|
7
|
+
if (e.altKey && !e.ctrlKey && !e.metaKey) {
|
|
12
8
|
let key = e.key.toLowerCase();
|
|
13
9
|
// macOS Option+letter produces special chars (e.g. ∆ for Alt+J).
|
|
14
10
|
if (key.length !== 1 || !FORWARD_KEYS.has(key)) {
|
|
15
11
|
if (e.code?.startsWith('Key')) key = e.code.slice(3).toLowerCase();
|
|
16
12
|
}
|
|
17
|
-
|
|
13
|
+
return FORWARD_KEYS.has(key);
|
|
14
|
+
}
|
|
15
|
+
if (e.ctrlKey && e.shiftKey && !e.metaKey && !e.altKey) {
|
|
16
|
+
return e.code === 'Backquote';
|
|
17
|
+
}
|
|
18
|
+
if (e.metaKey && !e.ctrlKey && !e.altKey) {
|
|
19
|
+
if (!e.shiftKey && (e.code === 'Backquote' || e.code === 'KeyB' || e.code === 'KeyJ')) return true;
|
|
20
|
+
if (e.shiftKey && (e.code === 'KeyB' || e.code === 'KeyD' || e.code === 'KeyE')) return true;
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function initPreviewShortcutBridge(): void {
|
|
26
|
+
if (window.parent === window) return;
|
|
27
|
+
|
|
28
|
+
document.addEventListener('keydown', (e) => {
|
|
29
|
+
if (!isForwardedManagerShortcut(e)) return;
|
|
18
30
|
|
|
19
31
|
e.preventDefault();
|
|
20
32
|
try {
|
|
21
33
|
window.parent.postMessage({
|
|
22
34
|
type: 'jaw-preview-shortcut',
|
|
23
|
-
key,
|
|
24
|
-
|
|
35
|
+
key: e.key,
|
|
36
|
+
code: e.code,
|
|
37
|
+
altKey: e.altKey,
|
|
38
|
+
ctrlKey: e.ctrlKey,
|
|
39
|
+
metaKey: e.metaKey,
|
|
25
40
|
shiftKey: e.shiftKey,
|
|
26
41
|
}, '*');
|
|
27
42
|
} catch { /* cross-origin guard */ }
|
|
@@ -4,6 +4,7 @@ import { escapeHtml } from '../render.js';
|
|
|
4
4
|
import { getCliMeta } from '../constants.js';
|
|
5
5
|
import { providerLabel } from '../provider-icons.js';
|
|
6
6
|
import { t } from './i18n.js';
|
|
7
|
+
import { refreshTransportStatusRow } from './transport-status-row.js';
|
|
7
8
|
import type { SettingsData } from './settings-types.js';
|
|
8
9
|
|
|
9
10
|
export async function setActiveChannel(ch: 'telegram' | 'discord'): Promise<void> {
|
|
@@ -12,6 +13,7 @@ export async function setActiveChannel(ch: 'telegram' | 'discord'): Promise<void
|
|
|
12
13
|
document.getElementById('channelTelegramSettings')?.style.setProperty('display', ch === 'telegram' ? '' : 'none');
|
|
13
14
|
document.getElementById('channelDiscordSettings')?.style.setProperty('display', ch === 'discord' ? '' : 'none');
|
|
14
15
|
await apiJson('/api/settings', 'PUT', { channel: ch });
|
|
16
|
+
await refreshTransportStatusRow();
|
|
15
17
|
}
|
|
16
18
|
|
|
17
19
|
export function loadActiveChannel(s: SettingsData): void {
|
|
@@ -20,6 +22,7 @@ export function loadActiveChannel(s: SettingsData): void {
|
|
|
20
22
|
document.getElementById('chDiscord')?.classList.toggle('active', ch === 'discord');
|
|
21
23
|
document.getElementById('channelTelegramSettings')?.style.setProperty('display', ch === 'telegram' ? '' : 'none');
|
|
22
24
|
document.getElementById('channelDiscordSettings')?.style.setProperty('display', ch === 'discord' ? '' : 'none');
|
|
25
|
+
void refreshTransportStatusRow();
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
export function loadFallbackOrder(s: SettingsData): void {
|
|
@@ -9,16 +9,71 @@ import type { QuotaEntry } from './settings-types.js';
|
|
|
9
9
|
|
|
10
10
|
const CLI_STATUS_INTERVAL_VALUES = new Set([0, 600, 1800]);
|
|
11
11
|
const DEFAULT_CLI_STATUS_INTERVAL_SEC = 0;
|
|
12
|
+
/** Defer heavy /api/quota so chat/history APIs win on initial page load. */
|
|
13
|
+
const QUOTA_LOAD_DEFER_MS = 2000;
|
|
12
14
|
|
|
13
15
|
const QUOTA_HIDDEN_CLIS = new Set(['ai-e', 'codex-app']);
|
|
14
16
|
const QUOTA_CUSTOM_MSG: Record<string, string> = {
|
|
15
17
|
claude: 'Currently subscribed, by June with credit',
|
|
16
18
|
};
|
|
17
19
|
|
|
20
|
+
type QuotaSetupHint = {
|
|
21
|
+
title: string;
|
|
22
|
+
commands: string[];
|
|
23
|
+
note?: string;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/** Actionable setup when plan quota is not wired yet (quotaCapable=false). */
|
|
27
|
+
const QUOTA_SETUP_HINTS: Record<string, QuotaSetupHint> = {
|
|
28
|
+
cursor: {
|
|
29
|
+
title: 'Enable quota bars (dashboard session)',
|
|
30
|
+
commands: [
|
|
31
|
+
'cursor-agent login',
|
|
32
|
+
'export CURSOR_SESSION_TOKEN="<WorkosCursorSessionToken from cursor.com DevTools>"',
|
|
33
|
+
'echo "$CURSOR_SESSION_TOKEN" > ~/.cli-jaw/quota/cursor-session-token && chmod 600 ~/.cli-jaw/quota/cursor-session-token',
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
agy: {
|
|
37
|
+
title: 'Enable Gem / Cla quota bars',
|
|
38
|
+
commands: [
|
|
39
|
+
'npx antigravity-usage login',
|
|
40
|
+
'npx antigravity-usage --json',
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
grok: {
|
|
44
|
+
title: 'Grok Build auth (plan quota not in grok CLI)',
|
|
45
|
+
commands: [
|
|
46
|
+
'grok login --oauth',
|
|
47
|
+
'grok models # verify auth',
|
|
48
|
+
],
|
|
49
|
+
note: 'Subscription remaining quota: xAI console only. No official grok quota subcommand.',
|
|
50
|
+
},
|
|
51
|
+
opencode: {
|
|
52
|
+
title: 'OpenCode auth + optional plan quota plugin',
|
|
53
|
+
commands: [
|
|
54
|
+
'opencode auth login',
|
|
55
|
+
'opencode plugin add @slkiser/opencode-quota',
|
|
56
|
+
'npx @slkiser/opencode-quota show',
|
|
57
|
+
],
|
|
58
|
+
note: 'Built-in opencode stats shows session tokens/cost, not subscription limits. opencode-go/* models use the same CLI.',
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
|
|
18
62
|
let cliStatusTimer: number | null = null;
|
|
63
|
+
let cliStatusPreviewHooksRegistered = false;
|
|
64
|
+
let cliStatusLoadSeq = 0;
|
|
65
|
+
let cliStatusLoadInFlight: Promise<void> | null = null;
|
|
19
66
|
|
|
20
67
|
const CLI_STATUS_COLLAPSED_KEY = 'cliStatusCollapsed';
|
|
21
68
|
|
|
69
|
+
export function isEmbeddedPreviewFrame(): boolean {
|
|
70
|
+
try {
|
|
71
|
+
return window.parent !== window;
|
|
72
|
+
} catch {
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
22
77
|
function readCliStatusCollapsed(): boolean {
|
|
23
78
|
try { return localStorage.getItem(CLI_STATUS_COLLAPSED_KEY) === 'true'; }
|
|
24
79
|
catch { return false; }
|
|
@@ -91,11 +146,24 @@ export function scheduleCliStatusRefresh(): void {
|
|
|
91
146
|
if (interval <= 0) return;
|
|
92
147
|
|
|
93
148
|
cliStatusTimer = window.setInterval(() => {
|
|
94
|
-
if (document.hidden || !
|
|
149
|
+
if (document.hidden || !cliStatusExpanded) return;
|
|
150
|
+
// Parent dashboard keeps focus while iframe preview is visible.
|
|
151
|
+
if (!isEmbeddedPreviewFrame() && !document.hasFocus()) return;
|
|
95
152
|
void loadCliStatus(true);
|
|
96
153
|
}, interval * 1000);
|
|
97
154
|
}
|
|
98
155
|
|
|
156
|
+
export function initCliStatusPreviewHooks(): void {
|
|
157
|
+
if (cliStatusPreviewHooksRegistered || !isEmbeddedPreviewFrame()) return;
|
|
158
|
+
cliStatusPreviewHooksRegistered = true;
|
|
159
|
+
window.addEventListener('message', (event: MessageEvent) => {
|
|
160
|
+
const data = event.data as { type?: unknown; visible?: unknown } | null;
|
|
161
|
+
if (data?.type !== 'jaw-preview-visibility' || data.visible !== true) return;
|
|
162
|
+
if (!cliStatusExpanded) return;
|
|
163
|
+
void loadCliStatus(false);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
99
167
|
export function setCliStatusInterval(value: string): void {
|
|
100
168
|
const parsed = Number(value);
|
|
101
169
|
const interval = CLI_STATUS_INTERVAL_VALUES.has(parsed) ? parsed : DEFAULT_CLI_STATUS_INTERVAL_SEC;
|
|
@@ -131,26 +199,176 @@ function describeStatusOnlyQuota(cliName: string, q: QuotaEntry): string {
|
|
|
131
199
|
return cliName === 'opencode' ? 'Auth/status only' : 'Usage data not exposed by this CLI';
|
|
132
200
|
}
|
|
133
201
|
|
|
134
|
-
|
|
135
|
-
|
|
202
|
+
function normalizeAccountToken(value: string): string {
|
|
203
|
+
return value.toLowerCase().replace(/^cursor\s+/i, '').trim();
|
|
204
|
+
}
|
|
136
205
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
206
|
+
const ACCOUNT_LABEL_SKIP = new Set([
|
|
207
|
+
'auth/status only',
|
|
208
|
+
'google cloud code',
|
|
209
|
+
'runtime-checked',
|
|
210
|
+
]);
|
|
211
|
+
|
|
212
|
+
const PROVIDER_ACCOUNT_TYPES = new Set([
|
|
213
|
+
'cursor',
|
|
214
|
+
'antigravity.google',
|
|
215
|
+
'antigravity',
|
|
216
|
+
'max',
|
|
217
|
+
'copilot',
|
|
218
|
+
'gemini',
|
|
219
|
+
]);
|
|
220
|
+
|
|
221
|
+
function buildAccountParts(_cliName: string, q: QuotaEntry): string[] {
|
|
222
|
+
const account = q.account;
|
|
223
|
+
if (!account) return [];
|
|
224
|
+
|
|
225
|
+
const parts: string[] = [];
|
|
226
|
+
if (account.email) parts.push(account.email);
|
|
227
|
+
|
|
228
|
+
const seen = new Set(parts.map(normalizeAccountToken));
|
|
229
|
+
for (const value of [account.plan, account.tier]) {
|
|
230
|
+
if (!value) continue;
|
|
231
|
+
const norm = normalizeAccountToken(value);
|
|
232
|
+
if (!norm || ACCOUNT_LABEL_SKIP.has(norm)) continue;
|
|
233
|
+
if (PROVIDER_ACCOUNT_TYPES.has(norm)) continue;
|
|
234
|
+
if (seen.has(norm)) continue;
|
|
235
|
+
seen.add(norm);
|
|
236
|
+
parts.push(value);
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return parts;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
function renderSetupHelpMark(cliName: string, q: QuotaEntry, extraTooltip: string[] = []): string {
|
|
244
|
+
const hint = QUOTA_SETUP_HINTS[cliName];
|
|
245
|
+
const tooltipParts = [
|
|
246
|
+
...extraTooltip,
|
|
247
|
+
...(hint ? hint.commands : []),
|
|
248
|
+
...(hint?.note ? [hint.note] : []),
|
|
249
|
+
].filter(Boolean);
|
|
250
|
+
if (!tooltipParts.length) return '';
|
|
251
|
+
return `<span style="cursor:help;opacity:0.55;margin-left:4px;font-weight:400" title="${escapeHtml(tooltipParts.join('\n'))}">?</span>`;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function renderQuotaSetupBox(cliName: string, q: QuotaEntry): string {
|
|
255
|
+
const hint = QUOTA_SETUP_HINTS[cliName];
|
|
256
|
+
const usage = q.sessionUsage;
|
|
257
|
+
const extraTooltip: string[] = [];
|
|
258
|
+
if (usage?.primaryModelId) extraTooltip.push(`Model: ${usage.primaryModelId}`);
|
|
259
|
+
if (usage?.contextTokensUsed && usage?.contextWindowTokens) {
|
|
260
|
+
extraTooltip.push(`Session context: ${Math.round(usage.contextTokensUsed).toLocaleString()} / ${Math.round(usage.contextWindowTokens).toLocaleString()} tokens`);
|
|
261
|
+
} else if (usage?.turnCount) {
|
|
262
|
+
extraTooltip.push(`Session turns: ${Math.round(usage.turnCount).toLocaleString()}`);
|
|
263
|
+
}
|
|
264
|
+
const helpMark = renderSetupHelpMark(cliName, q, extraTooltip);
|
|
265
|
+
|
|
266
|
+
if (hint) {
|
|
267
|
+
const commandLines = hint.commands.map(cmd => `
|
|
268
|
+
<div style="margin-top:3px"><code style="font-size:10px;background:var(--border);padding:1px 4px;border-radius:2px;word-break:break-all">${escapeHtml(cmd)}</code></div>
|
|
269
|
+
`).join('');
|
|
270
|
+
return `
|
|
271
|
+
<div style="font-size:10px;color:var(--text-dim);margin:4px 0 0 16px;padding:5px 7px;background:var(--surface);border:1px solid var(--border);border-radius:5px">
|
|
272
|
+
<div style="color:var(--text);font-weight:600">${escapeHtml(hint.title)}${helpMark}</div>
|
|
273
|
+
${commandLines}
|
|
274
|
+
${hint.note ? `<div style="margin-top:4px;opacity:0.75">${escapeHtml(hint.note)}</div>` : ''}
|
|
275
|
+
</div>
|
|
276
|
+
`;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return `
|
|
280
|
+
<div style="font-size:10px;color:var(--text-dim);margin:4px 0 0 16px;padding:5px 7px;background:var(--surface);border:1px solid var(--border);border-radius:5px">
|
|
281
|
+
<div style="color:var(--text);font-weight:600">${escapeHtml(q.displayTier || providerLabel(cliName))}${helpMark}</div>
|
|
282
|
+
<div style="margin-top:2px">${escapeHtml(describeStatusOnlyQuota(cliName, q))}</div>
|
|
283
|
+
</div>
|
|
284
|
+
`;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
function scheduleEmbeddedQuotaRetry(
|
|
288
|
+
seq: number,
|
|
289
|
+
cliStatus: Record<string, { available: boolean }>,
|
|
290
|
+
cachedQuota: Record<string, QuotaEntry> | null | undefined,
|
|
291
|
+
): void {
|
|
292
|
+
if (!isEmbeddedPreviewFrame()) return;
|
|
293
|
+
void (async () => {
|
|
294
|
+
await new Promise(resolve => window.setTimeout(resolve, 600));
|
|
295
|
+
if (seq !== cliStatusLoadSeq) return;
|
|
296
|
+
const retry = await api<Record<string, QuotaEntry>>('/api/quota');
|
|
297
|
+
if (seq !== cliStatusLoadSeq || !retry) return;
|
|
298
|
+
state.cliStatusCache = { cliStatus, quota: retry } as Record<string, unknown>;
|
|
299
|
+
state.cliStatusTs = Date.now();
|
|
300
|
+
renderCliStatus({ cliStatus, quota: retry });
|
|
301
|
+
})();
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
async function fetchAndRenderQuota(
|
|
305
|
+
seq: number,
|
|
306
|
+
cliStatus: Record<string, { available: boolean }>,
|
|
307
|
+
cachedQuota: Record<string, QuotaEntry> | null | undefined,
|
|
308
|
+
): Promise<void> {
|
|
309
|
+
const quota = await api<Record<string, QuotaEntry>>('/api/quota');
|
|
310
|
+
if (seq !== cliStatusLoadSeq) return;
|
|
311
|
+
|
|
312
|
+
const resolvedQuota = quota ?? cachedQuota ?? null;
|
|
313
|
+
state.cliStatusCache = { cliStatus, quota: resolvedQuota } as Record<string, unknown>;
|
|
314
|
+
if (quota) state.cliStatusTs = Date.now();
|
|
315
|
+
renderCliStatus({ cliStatus, quota: resolvedQuota });
|
|
316
|
+
|
|
317
|
+
if (!quota) scheduleEmbeddedQuotaRetry(seq, cliStatus, cachedQuota);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
function scheduleQuotaFetch(
|
|
321
|
+
force: boolean,
|
|
322
|
+
seq: number,
|
|
323
|
+
cliStatus: Record<string, { available: boolean }>,
|
|
324
|
+
cachedQuota: Record<string, QuotaEntry> | null | undefined,
|
|
325
|
+
): void {
|
|
326
|
+
const run = () => { void fetchAndRenderQuota(seq, cliStatus, cachedQuota); };
|
|
327
|
+
if (force) {
|
|
328
|
+
void fetchAndRenderQuota(seq, cliStatus, cachedQuota);
|
|
140
329
|
return;
|
|
141
330
|
}
|
|
331
|
+
window.setTimeout(run, QUOTA_LOAD_DEFER_MS);
|
|
332
|
+
}
|
|
142
333
|
|
|
143
|
-
|
|
144
|
-
if (
|
|
334
|
+
export async function loadCliStatus(force = false): Promise<void> {
|
|
335
|
+
if (!cliStatusExpanded) return;
|
|
336
|
+
|
|
337
|
+
if (cliStatusLoadInFlight) {
|
|
338
|
+
if (force) await cliStatusLoadInFlight.catch(() => {});
|
|
339
|
+
else return;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
cliStatusLoadInFlight = (async () => {
|
|
343
|
+
const seq = ++cliStatusLoadSeq;
|
|
344
|
+
const interval = readCliStatusInterval();
|
|
345
|
+
if (!force && state.cliStatusCache && interval > 0 && (Date.now() - state.cliStatusTs) < interval * 1000) {
|
|
346
|
+
renderCliStatus({
|
|
347
|
+
cliStatus: (state.cliStatusCache as Record<string, unknown>)?.['cliStatus'] as Record<string, { available: boolean }> | null,
|
|
348
|
+
quota: (state.cliStatusCache as Record<string, unknown>)?.['quota'] as Record<string, QuotaEntry> | null,
|
|
349
|
+
});
|
|
350
|
+
return;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
const el = document.getElementById('cliStatusList');
|
|
354
|
+
const cachedQuota = (state.cliStatusCache as Record<string, unknown> | null)?.['quota'] as Record<string, QuotaEntry> | null | undefined;
|
|
355
|
+
if (el && !cachedQuota) el.innerHTML = '<div style="color:var(--text-dim);font-size:11px">Loading...</div>';
|
|
356
|
+
|
|
357
|
+
const cliStatus = await api<Record<string, { available: boolean }>>('/api/cli-status');
|
|
358
|
+
if (seq !== cliStatusLoadSeq) return;
|
|
359
|
+
if (!cliStatus || typeof cliStatus !== 'object') {
|
|
360
|
+
if (el) el.innerHTML = '<div style="color:var(--text-dim);font-size:11px">Failed to load CLI status</div>';
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
145
363
|
|
|
146
|
-
|
|
147
|
-
api<Record<string, { available: boolean }>>('/api/cli-status'),
|
|
148
|
-
api<Record<string, QuotaEntry>>('/api/quota'),
|
|
149
|
-
]);
|
|
364
|
+
renderCliStatus({ cliStatus, quota: cachedQuota ?? null });
|
|
150
365
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
366
|
+
scheduleQuotaFetch(force, seq, cliStatus, cachedQuota);
|
|
367
|
+
})().finally(() => {
|
|
368
|
+
cliStatusLoadInFlight = null;
|
|
369
|
+
});
|
|
370
|
+
|
|
371
|
+
await cliStatusLoadInFlight;
|
|
154
372
|
}
|
|
155
373
|
|
|
156
374
|
function renderCliStatus(data: { cliStatus: Record<string, { available: boolean }> | null; quota: Record<string, QuotaEntry> | null }): void {
|
|
@@ -158,12 +376,13 @@ function renderCliStatus(data: { cliStatus: Record<string, { available: boolean
|
|
|
158
376
|
const el = document.getElementById('cliStatusList');
|
|
159
377
|
|
|
160
378
|
const AUTH_HINTS: Record<string, { install: string; auth: string }> = {
|
|
161
|
-
agy: { install: 'curl -fsSL https://antigravity.google/cli/install.sh | bash', auth: 'agy auth
|
|
379
|
+
agy: { install: 'curl -fsSL https://antigravity.google/cli/install.sh | bash', auth: 'agy runtime auth, antigravity-usage login, or ~/.gemini oauth for quota' },
|
|
162
380
|
'ai-e': { install: 'Install AI-E helper', auth: 'delegates to selected AI-E provider' },
|
|
163
381
|
claude: { install: 'npm i -g @anthropic-ai/claude-code', auth: 'claude auth' },
|
|
164
382
|
'claude-e': { install: 'Install claude-e helper', auth: 'claude auth' },
|
|
165
383
|
codex: { install: 'npm i -g @openai/codex', auth: 'codex login' },
|
|
166
384
|
'codex-app': { install: 'npm i -g @openai/codex', auth: 'codex login' },
|
|
385
|
+
cursor: { install: 'curl https://cursor.com/install -fsS | bash', auth: 'cursor-agent login, CURSOR_API_KEY, or CURSOR_SESSION_TOKEN for quota' },
|
|
167
386
|
gemini: { install: 'npm i -g @google/gemini-cli', auth: `gemini (${t('cli.gemini.auth')})` },
|
|
168
387
|
grok: { install: 'curl -fsSL https://x.ai/cli/install.sh | bash', auth: 'grok login --oauth' },
|
|
169
388
|
opencode: { install: 'npm i -g opencode-ai', auth: 'opencode auth' },
|
|
@@ -191,12 +410,13 @@ function renderCliStatus(data: { cliStatus: Record<string, { available: boolean
|
|
|
191
410
|
}
|
|
192
411
|
|
|
193
412
|
let accountLine = '';
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
413
|
+
const showSetupBox = q?.quotaCapable === false
|
|
414
|
+
&& q.authenticated !== false
|
|
415
|
+
&& info.available
|
|
416
|
+
&& !QUOTA_CUSTOM_MSG[name]
|
|
417
|
+
&& !QUOTA_HIDDEN_CLIS.has(name);
|
|
418
|
+
if (q?.account && !showSetupBox) {
|
|
419
|
+
const parts = buildAccountParts(name, q);
|
|
200
420
|
if (parts.length) accountLine = `<div style="font-size:10px;color:var(--text-dim);margin:2px 0 4px 16px">${escapeHtml(parts.join(' · '))}</div>`;
|
|
201
421
|
}
|
|
202
422
|
|
|
@@ -206,9 +426,9 @@ function renderCliStatus(data: { cliStatus: Record<string, { available: boolean
|
|
|
206
426
|
if (hint) {
|
|
207
427
|
const isNotInstalled = !info.available;
|
|
208
428
|
const title = isNotInstalled ? t('cli.authRequired') : t('cli.notAuthenticated');
|
|
209
|
-
const borderColor = isNotInstalled ? '
|
|
429
|
+
const borderColor = isNotInstalled ? 'var(--error)' : 'var(--warning)';
|
|
210
430
|
authHint = `
|
|
211
|
-
<div style="font-size:10px;margin:4px 0 2px 16px;padding:6px 8px;background:var(--
|
|
431
|
+
<div style="font-size:10px;margin:4px 0 2px 16px;padding:6px 8px;background:var(--surface);border-radius:4px;border-left:2px solid ${borderColor}">
|
|
212
432
|
<div style="color:${borderColor};margin-bottom:3px">${title}</div>
|
|
213
433
|
${isNotInstalled ? `<div style="color:var(--text-dim)"><code style="font-size:10px;background:var(--border);padding:1px 4px;border-radius:2px">${escapeHtml(hint.install)}</code></div>` : ''}
|
|
214
434
|
<div style="color:var(--text-dim)${isNotInstalled ? ';margin-top:2px' : ''}"><code style="font-size:10px;background:var(--border);padding:1px 4px;border-radius:2px">${escapeHtml(hint.auth)}</code></div>
|
|
@@ -223,31 +443,16 @@ function renderCliStatus(data: { cliStatus: Record<string, { available: boolean
|
|
|
223
443
|
// no quota display for this CLI
|
|
224
444
|
} else if (customQuotaMsg && info.available) {
|
|
225
445
|
windowsHtml = `
|
|
226
|
-
<div style="font-size:10px;color:var(--text-dim);margin:4px 0 0 16px;padding:5px 7px;background:var(--
|
|
446
|
+
<div style="font-size:10px;color:var(--text-dim);margin:4px 0 0 16px;padding:5px 7px;background:var(--surface);border:1px solid var(--border);border-radius:5px">
|
|
227
447
|
${escapeHtml(customQuotaMsg)}
|
|
228
448
|
</div>
|
|
229
449
|
`;
|
|
230
|
-
} else if (
|
|
231
|
-
|
|
232
|
-
const contextLine = usage?.contextTokensUsed && usage?.contextWindowTokens
|
|
233
|
-
? `Session context: ${Math.round(usage.contextTokensUsed).toLocaleString()} / ${Math.round(usage.contextWindowTokens).toLocaleString()} tokens`
|
|
234
|
-
: usage?.turnCount
|
|
235
|
-
? `Session turns: ${Math.round(usage.turnCount).toLocaleString()}`
|
|
236
|
-
: '';
|
|
237
|
-
const modelLine = usage?.primaryModelId ? `Model: ${usage.primaryModelId}` : '';
|
|
238
|
-
const detail = [modelLine, contextLine, describeStatusOnlyQuota(name, q)]
|
|
239
|
-
.filter(Boolean)
|
|
240
|
-
.join(' · ');
|
|
241
|
-
windowsHtml = `
|
|
242
|
-
<div style="font-size:10px;color:var(--text-dim);margin:4px 0 0 16px;padding:5px 7px;background:var(--bg-dim, #1e1e2e);border:1px solid var(--border);border-radius:5px">
|
|
243
|
-
<div style="color:var(--text);font-weight:600">${escapeHtml(q.displayTier || providerLabel(name))}</div>
|
|
244
|
-
<div style="margin-top:2px">${escapeHtml(detail || 'Auth/status only')}</div>
|
|
245
|
-
</div>
|
|
246
|
-
`;
|
|
450
|
+
} else if (showSetupBox) {
|
|
451
|
+
windowsHtml = renderQuotaSetupBox(name, q);
|
|
247
452
|
} else if (q?.windows?.length) {
|
|
248
453
|
windowsHtml = q.windows.map(w => {
|
|
249
454
|
const pct = Math.round(w.percent);
|
|
250
|
-
const barColor = pct > 80 ? '
|
|
455
|
+
const barColor = pct > 80 ? 'var(--error)' : pct > 50 ? 'var(--warning)' : 'var(--info)';
|
|
251
456
|
const shortLabel = normalizeQuotaWindowLabel(name, w.label);
|
|
252
457
|
let resetStr = '';
|
|
253
458
|
if (w.resetsAt) {
|
|
@@ -275,12 +480,16 @@ function renderCliStatus(data: { cliStatus: Record<string, { available: boolean
|
|
|
275
480
|
windowsHtml = `<div style="font-size:10px;color:var(--text-dim);margin:2px 0 0 16px;opacity:0.7">${ICONS.warning} ${msg}</div>`;
|
|
276
481
|
}
|
|
277
482
|
|
|
483
|
+
const quotaHelpMark = q?.quotaCapable && QUOTA_SETUP_HINTS[name]
|
|
484
|
+
? renderSetupHelpMark(name, q)
|
|
485
|
+
: '';
|
|
486
|
+
|
|
278
487
|
html += `
|
|
279
488
|
<div class="settings-group" style="margin-bottom:6px;padding:8px 10px">
|
|
280
489
|
<div class="cli-status-row">
|
|
281
490
|
<span class="cli-dot ${dotClass}"></span>
|
|
282
491
|
<span class="cli-provider-icon" aria-hidden="true">${providerIcon(name) || ''}</span>
|
|
283
|
-
<span class="cli-name" style="font-weight:600">${escapeHtml(providerLabel(name))}</span>${name === 'copilot' ? `<button id="copilotKeychainBtn" style="font-size:9px;margin-left:6px;padding:1px 5px;background:var(--border);color:var(--text-dim);border:1px solid var(--text-dim);border-radius:3px;cursor:pointer;vertical-align:middle;line-height:1" title="${t('copilot.keychainHint')}">${ICONS.key}</button>` : ''}
|
|
492
|
+
<span class="cli-name" style="font-weight:600">${escapeHtml(providerLabel(name))}${quotaHelpMark}</span>${name === 'copilot' ? `<button id="copilotKeychainBtn" style="font-size:9px;margin-left:6px;padding:1px 5px;background:var(--border);color:var(--text-dim);border:1px solid var(--text-dim);border-radius:3px;cursor:pointer;vertical-align:middle;line-height:1" title="${t('copilot.keychainHint')}">${ICONS.key}</button>` : ''}
|
|
284
493
|
</div>
|
|
285
494
|
${accountLine}
|
|
286
495
|
${authHint}
|
|
@@ -299,7 +508,7 @@ function renderCliStatus(data: { cliStatus: Record<string, { available: boolean
|
|
|
299
508
|
});
|
|
300
509
|
if (!hasReadyCli && allEntries.length > 0 && el) {
|
|
301
510
|
el.insertAdjacentHTML('afterbegin',
|
|
302
|
-
`<div style="padding:8px 10px;margin-bottom:8px;background
|
|
511
|
+
`<div style="padding:8px 10px;margin-bottom:8px;background:var(--warning-dim);border:1px solid var(--warning);border-radius:6px;font-size:11px;color:var(--warning)">
|
|
303
512
|
${ICONS.warning} ${t('cli.noReadyCli')}
|
|
304
513
|
</div>`
|
|
305
514
|
);
|
|
@@ -487,6 +487,14 @@ export function onCliChange(save = true): void {
|
|
|
487
487
|
const model = ao.model || pc.model;
|
|
488
488
|
const effort = ao.effort || pc.effort || '';
|
|
489
489
|
if (model && modelSel) {
|
|
490
|
+
if (cli === 'ai-e') {
|
|
491
|
+
const savedProvider = s.perCli?.['ai-e']?.provider || 'claude';
|
|
492
|
+
const currentProvider = getSelectedAiEProvider();
|
|
493
|
+
if (savedProvider !== currentProvider) {
|
|
494
|
+
syncActiveEffortOptions(cli, effort);
|
|
495
|
+
return;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
490
498
|
const displayModel = normalizeModelForDisplay(cli, model);
|
|
491
499
|
appendCustomOption(modelSel, displayModel);
|
|
492
500
|
modelSel.value = displayModel;
|
|
@@ -5,6 +5,6 @@ export { setDiscord, setDiscordForwardAll, setDiscordAllowBots, setDiscordMentio
|
|
|
5
5
|
export { setActiveChannel, loadFallbackOrder, saveFallbackOrder } from './settings-channel.js';
|
|
6
6
|
export { loadMcpServers, syncMcpServers, installMcpGlobal } from './settings-mcp.js';
|
|
7
7
|
export { loadCliStatus, scheduleCliStatusRefresh, setCliStatusInterval } from './settings-cli-status.js';
|
|
8
|
-
export { initCliStatusToggle, isCliStatusExpanded, expandCliStatus } from './settings-cli-status.js';
|
|
8
|
+
export { initCliStatusToggle, initCliStatusPreviewHooks, isCliStatusExpanded, expandCliStatus, isEmbeddedPreviewFrame } from './settings-cli-status.js';
|
|
9
9
|
export { initSttSettings } from './settings-stt.js';
|
|
10
10
|
export { openPromptModal, closePromptModal, savePromptFromModal, openTemplateModal, saveTemplateFromModal, closeTemplateModal, templateGoBack, toggleDevMode } from './settings-templates.js';
|
|
@@ -4,11 +4,24 @@ import { t } from './i18n.js';
|
|
|
4
4
|
import { api } from '../api.js';
|
|
5
5
|
import { escapeHtml } from '../render.js';
|
|
6
6
|
|
|
7
|
+
interface WorkflowCommandMeta {
|
|
8
|
+
kind: 'workflow';
|
|
9
|
+
phase: string;
|
|
10
|
+
risk: 'low' | 'medium' | 'high';
|
|
11
|
+
output: string;
|
|
12
|
+
prerequisites?: string[];
|
|
13
|
+
workflowArgs?: Array<{ name: string; required: boolean; kind: string }>;
|
|
14
|
+
gatedUntilPhase?: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
7
17
|
interface SlashCommand {
|
|
8
18
|
name: string;
|
|
9
19
|
desc: string;
|
|
10
|
-
args?: string;
|
|
20
|
+
args?: string | null;
|
|
11
21
|
category?: string;
|
|
22
|
+
aliases?: string[];
|
|
23
|
+
workflow?: WorkflowCommandMeta | null;
|
|
24
|
+
capability?: string | null;
|
|
12
25
|
}
|
|
13
26
|
|
|
14
27
|
let cmdList: SlashCommand[] = [];
|
|
@@ -31,6 +44,22 @@ function filterCommands(partial: string): SlashCommand[] {
|
|
|
31
44
|
return cmdList.filter(c => (`/${c.name}`).startsWith(prefix));
|
|
32
45
|
}
|
|
33
46
|
|
|
47
|
+
function formatWorkflowArgs(cmd: SlashCommand): string {
|
|
48
|
+
const args = cmd.workflow?.workflowArgs || [];
|
|
49
|
+
if (!args.length) return cmd.args || '';
|
|
50
|
+
return args.map(a => a.required ? `<${a.name}>` : `[${a.name}]`).join(' ');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function renderWorkflowMeta(cmd: SlashCommand): string {
|
|
54
|
+
const wf = cmd.workflow;
|
|
55
|
+
if (!wf) return '';
|
|
56
|
+
return `<span class="cmd-meta">
|
|
57
|
+
<span class="cmd-chip">${escapeHtml(wf.phase)}</span>
|
|
58
|
+
<span class="cmd-chip cmd-risk-${escapeHtml(wf.risk)}">${escapeHtml(wf.risk)}</span>
|
|
59
|
+
<span class="cmd-chip">${escapeHtml(wf.output)}</span>
|
|
60
|
+
</span>`;
|
|
61
|
+
}
|
|
62
|
+
|
|
34
63
|
function showDropdown(): void {
|
|
35
64
|
const el = dropdown();
|
|
36
65
|
const inp = input();
|
|
@@ -66,6 +95,8 @@ function render(): void {
|
|
|
66
95
|
|
|
67
96
|
el.innerHTML = filtered.map((cmd, i) => {
|
|
68
97
|
const selected = i === selectedIdx;
|
|
98
|
+
const args = formatWorkflowArgs(cmd);
|
|
99
|
+
const workflowMeta = renderWorkflowMeta(cmd);
|
|
69
100
|
return `<div class="cmd-item${selected ? ' selected' : ''}"
|
|
70
101
|
role="option"
|
|
71
102
|
id="cmd-item-${i}"
|
|
@@ -73,7 +104,8 @@ function render(): void {
|
|
|
73
104
|
data-index="${i}">
|
|
74
105
|
<span class="cmd-name">/${escapeHtml(cmd.name)}</span>
|
|
75
106
|
<span class="cmd-desc">${escapeHtml(cmd.desc)}</span>
|
|
76
|
-
${
|
|
107
|
+
${workflowMeta}
|
|
108
|
+
${args ? `<span class="cmd-args">${escapeHtml(args)}</span>` : ''}
|
|
77
109
|
</div>`;
|
|
78
110
|
}).join('');
|
|
79
111
|
|