cli-jaw 1.4.11 → 1.5.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.ko.md +56 -26
- package/README.md +30 -24
- package/README.zh-CN.md +56 -26
- package/dist/bin/commands/browser.js +3 -1
- package/dist/bin/commands/browser.js.map +1 -1
- package/dist/bin/commands/chat.js +358 -9
- package/dist/bin/commands/chat.js.map +1 -1
- package/dist/bin/commands/doctor.js +80 -2
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/init.js +88 -6
- package/dist/bin/commands/init.js.map +1 -1
- package/dist/bin/commands/serve.js +1 -0
- package/dist/bin/commands/serve.js.map +1 -1
- package/dist/lib/mcp-sync.js +101 -51
- package/dist/lib/mcp-sync.js.map +1 -1
- package/dist/lib/quota-copilot.js +4 -0
- package/dist/lib/quota-copilot.js.map +1 -1
- package/dist/server.js +131 -35
- package/dist/server.js.map +1 -1
- package/dist/src/agent/events.js +198 -29
- package/dist/src/agent/events.js.map +1 -1
- package/dist/src/agent/smoke-detector.js +111 -0
- package/dist/src/agent/smoke-detector.js.map +1 -0
- package/dist/src/agent/spawn.js +157 -26
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/browser/connection.js +9 -1
- package/dist/src/browser/connection.js.map +1 -1
- package/dist/src/browser/launch-policy.js +32 -0
- package/dist/src/browser/launch-policy.js.map +1 -0
- package/dist/src/cli/claude-models.js +46 -0
- package/dist/src/cli/claude-models.js.map +1 -0
- package/dist/src/cli/command-context.js +19 -8
- package/dist/src/cli/command-context.js.map +1 -1
- package/dist/src/cli/commands.js +16 -13
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/compact.js +93 -0
- package/dist/src/cli/compact.js.map +1 -0
- package/dist/src/cli/handlers.js +94 -32
- package/dist/src/cli/handlers.js.map +1 -1
- package/dist/src/cli/readiness.js +69 -0
- package/dist/src/cli/readiness.js.map +1 -0
- package/dist/src/cli/registry.js +3 -2
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/cli/tui/composer.js +6 -4
- package/dist/src/cli/tui/composer.js.map +1 -1
- package/dist/src/cli/tui/keymap.js +2 -0
- package/dist/src/cli/tui/keymap.js.map +1 -1
- package/dist/src/cli/tui/overlay.js +170 -0
- package/dist/src/cli/tui/overlay.js.map +1 -1
- package/dist/src/cli/tui/store.js +25 -0
- package/dist/src/cli/tui/store.js.map +1 -1
- package/dist/src/cli/tui/transcript.js +46 -0
- package/dist/src/cli/tui/transcript.js.map +1 -0
- package/dist/src/command-contract/catalog.js +8 -4
- package/dist/src/command-contract/catalog.js.map +1 -1
- package/dist/src/core/bus.js +1 -0
- package/dist/src/core/bus.js.map +1 -1
- package/dist/src/core/compact.js +70 -0
- package/dist/src/core/compact.js.map +1 -0
- package/dist/src/core/config.js +109 -3
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +13 -4
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/main-session.js +15 -0
- package/dist/src/core/main-session.js.map +1 -1
- package/dist/src/core/runtime-settings.js +19 -4
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/core/settings-merge.js +1 -1
- package/dist/src/core/settings-merge.js.map +1 -1
- package/dist/src/discord/bot.js +274 -0
- package/dist/src/discord/bot.js.map +1 -0
- package/dist/src/discord/commands.js +103 -0
- package/dist/src/discord/commands.js.map +1 -0
- package/dist/src/discord/discord-file.js +43 -0
- package/dist/src/discord/discord-file.js.map +1 -0
- package/dist/src/discord/forwarder.js +45 -0
- package/dist/src/discord/forwarder.js.map +1 -0
- package/dist/src/memory/bootstrap.js +341 -0
- package/dist/src/memory/bootstrap.js.map +1 -0
- package/dist/src/memory/heartbeat.js +11 -22
- package/dist/src/memory/heartbeat.js.map +1 -1
- package/dist/src/memory/indexing.js +329 -0
- package/dist/src/memory/indexing.js.map +1 -0
- package/dist/src/memory/keyword-expand.js +247 -0
- package/dist/src/memory/keyword-expand.js.map +1 -0
- package/dist/src/memory/runtime.js +56 -1090
- package/dist/src/memory/runtime.js.map +1 -1
- package/dist/src/memory/shared.js +167 -0
- package/dist/src/memory/shared.js.map +1 -0
- package/dist/src/messaging/runtime.js +122 -0
- package/dist/src/messaging/runtime.js.map +1 -0
- package/dist/src/messaging/send.js +120 -0
- package/dist/src/messaging/send.js.map +1 -0
- package/dist/src/messaging/session-key.js +25 -0
- package/dist/src/messaging/session-key.js.map +1 -0
- package/dist/src/messaging/types.js +6 -0
- package/dist/src/messaging/types.js.map +1 -0
- package/dist/src/orchestrator/collect.js +5 -0
- package/dist/src/orchestrator/collect.js.map +1 -1
- package/dist/src/orchestrator/distribute.js +34 -8
- package/dist/src/orchestrator/distribute.js.map +1 -1
- package/dist/src/orchestrator/gateway.js +18 -12
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/parser.js +0 -28
- package/dist/src/orchestrator/parser.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +94 -75
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/state-machine.js +23 -20
- package/dist/src/orchestrator/state-machine.js.map +1 -1
- package/dist/src/orchestrator/worker-monitor.js +50 -0
- package/dist/src/orchestrator/worker-monitor.js.map +1 -0
- package/dist/src/orchestrator/worker-registry.js +107 -0
- package/dist/src/orchestrator/worker-registry.js.map +1 -0
- package/dist/src/prompt/builder.js +78 -6
- package/dist/src/prompt/builder.js.map +1 -1
- package/dist/src/prompt/templates/a1-system.md +52 -10
- package/dist/src/prompt/templates/employee.md +17 -5
- package/dist/src/prompt/templates/orchestration.md +11 -10
- package/dist/src/prompt/templates/research-worker.md +1 -1
- package/dist/src/prompt/templates/worker-context.md +4 -4
- package/dist/src/routes/browser.js +14 -3
- package/dist/src/routes/browser.js.map +1 -1
- package/dist/src/telegram/bot.js +92 -8
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/types/agent.js +4 -0
- package/dist/src/types/agent.js.map +1 -0
- package/package.json +27 -15
- package/public/css/chat.css +365 -127
- package/public/css/layout.css +67 -10
- package/public/css/markdown.css +219 -54
- package/public/css/modals.css +35 -15
- package/public/css/orc-state.css +16 -16
- package/public/css/sidebar.css +12 -12
- package/public/css/tool-ui.css +483 -0
- package/public/css/variables.css +334 -6
- package/public/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/public/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/public/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/public/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/public/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/public/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/public/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/public/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/public/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/public/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/public/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/public/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/public/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/public/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/public/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/public/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/public/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/public/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/public/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/public/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/public/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/public/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/public/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/public/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/public/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/public/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/public/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/public/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/public/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/public/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/public/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/public/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/public/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/public/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/public/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/public/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/public/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/public/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/public/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/public/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/public/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/public/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/public/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/public/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/public/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/public/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/public/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/public/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/public/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/public/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/public/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/public/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/public/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/public/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/public/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/public/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/public/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/public/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/public/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/public/dist/assets/api-B8XKQ4OT.js +1 -0
- package/public/dist/assets/api-BlPw3bUI.js +1 -0
- package/public/dist/assets/architecture-YZFGNWBL-BkS7SZQi.js +1 -0
- package/public/dist/assets/architectureDiagram-Q4EWVU46-Dl3iBKeR.js +1 -0
- package/public/dist/assets/blockDiagram-DXYQGD6D-DPr4D17p.js +1 -0
- package/public/dist/assets/c4Diagram-AHTNJAMY-CfoxJtDk.js +1 -0
- package/public/dist/assets/classDiagram-6PBFFD2Q-BOAdHnnB.js +1 -0
- package/public/dist/assets/classDiagram-v2-HSJHXN6E-B2QCJXWC.js +1 -0
- package/public/dist/assets/constants-DshMUJbo.js +1 -0
- package/public/dist/assets/cose-bilkent-S5V4N54A-CA14jk7w.js +1 -0
- package/public/dist/assets/dagre-KV5264BT-BVwNaSwC.js +1 -0
- package/public/dist/assets/diagram-5BDNPKRD-CHqIAvdc.js +1 -0
- package/public/dist/assets/diagram-G4DWMVQ6-DxvsCvTP.js +1 -0
- package/public/dist/assets/diagram-MMDJMWI5-DqOPO7dl.js +1 -0
- package/public/dist/assets/diagram-TYMM5635-C9xMWPQn.js +1 -0
- package/public/dist/assets/employees-CFRlsbHm.js +39 -0
- package/public/dist/assets/erDiagram-SMLLAGMA-BTmpfRkm.js +1 -0
- package/public/dist/assets/flowDiagram-DWJPFMVM-DZBSQAKA.js +1 -0
- package/public/dist/assets/ganttDiagram-T4ZO3ILL-TAEMCRbT.js +1 -0
- package/public/dist/assets/gitGraph-7Q5UKJZL-bbxndRNA.js +1 -0
- package/public/dist/assets/gitGraphDiagram-UUTBAWPF-CBxtx0MB.js +1 -0
- package/public/dist/assets/icon-192-CwXPIYF5.png +0 -0
- package/public/dist/assets/index-1Gg-6jeC.css +1 -0
- package/public/dist/assets/index-CQHqXjrK.js +49 -0
- package/public/dist/assets/info-OMHHGYJF-DRXq_Ywr.js +1 -0
- package/public/dist/assets/infoDiagram-42DDH7IO-C7FFwX4m.js +1 -0
- package/public/dist/assets/ishikawaDiagram-UXIWVN3A-DEZJE79j.js +1 -0
- package/public/dist/assets/journeyDiagram-VCZTEJTY-ZHLiY6GV.js +1 -0
- package/public/dist/assets/kanban-definition-6JOO6SKY-NP7pY7ML.js +1 -0
- package/public/dist/assets/katex-DZLS_HFU.js +1 -0
- package/public/dist/assets/locale-BjoAcbis.js +1 -0
- package/public/dist/assets/manifest-Bw-LRm-c.json +20 -0
- package/public/dist/assets/mermaid.core-CHuluSlD.js +1 -0
- package/public/dist/assets/mindmap-definition-QFDTVHPH-Bd1OgfN_.js +1 -0
- package/public/dist/assets/packet-4T2RLAQJ-CGu8ST97.js +1 -0
- package/public/dist/assets/pie-ZZUOXDRM-CDG65mhS.js +1 -0
- package/public/dist/assets/pieDiagram-DEJITSTG-BbMBHLDM.js +1 -0
- package/public/dist/assets/quadrantDiagram-34T5L4WZ-CDCDgI1e.js +1 -0
- package/public/dist/assets/radar-PYXPWWZC-1gS-6ylu.js +1 -0
- package/public/dist/assets/render-YHvL5VM_.js +6 -0
- package/public/dist/assets/requirementDiagram-MS252O5E-DkmvOtYz.js +1 -0
- package/public/dist/assets/rolldown-runtime-FhOqtrmT.js +1 -0
- package/public/dist/assets/sankeyDiagram-XADWPNL6-GNcXIYsL.js +1 -0
- package/public/dist/assets/sequenceDiagram-FGHM5R23-BFrw2n6x.js +1 -0
- package/public/dist/assets/settings-BQF_u5px.js +37 -0
- package/public/dist/assets/settings-C5Q9IPjJ.js +1 -0
- package/public/dist/assets/shark-sprite-B3AAuERd.png +0 -0
- package/public/dist/assets/skills-9Pd2rOw-.js +1 -0
- package/public/dist/assets/skills-BI7sQAdk.js +12 -0
- package/public/dist/assets/slash-commands-DMsE88bu.js +14 -0
- package/public/dist/assets/slash-commands-FMpJzlDB.js +1 -0
- package/public/dist/assets/state-O6NVkWcL.js +1 -0
- package/public/dist/assets/stateDiagram-FHFEXIEX-BLgKnllT.js +1 -0
- package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-CbzuWsSa.js +1 -0
- package/public/dist/assets/timeline-definition-GMOUNBTQ-CcZTJ3gL.js +1 -0
- package/public/dist/assets/treeView-SZITEDCU-BDqBsaH1.js +1 -0
- package/public/dist/assets/treemap-W4RFUUIX-BaWHA3Di.js +1 -0
- package/public/dist/assets/ui-BukgLHuh.js +29 -0
- package/public/dist/assets/ui-Bvz1JfTE.js +1 -0
- package/public/dist/assets/vendor-mermaid-COidH9HB.js +2934 -0
- package/public/dist/assets/vendor-render-Bjnw0wQ6.css +1 -0
- package/public/dist/assets/vendor-render-D2YP6GiF.js +322 -0
- package/public/dist/assets/vennDiagram-DHZGUBPP-BWV_j1bh.js +1 -0
- package/public/dist/assets/wardley-RL74JXVD-C7gKA3d7.js +1 -0
- package/public/dist/assets/wardleyDiagram-NUSXRM2D-BUoq_wug.js +1 -0
- package/public/dist/assets/ws-S_AZgx7L.js +2 -0
- package/public/dist/assets/xychartDiagram-5P7HB3ND-PvT5Ec82.js +1 -0
- package/public/dist/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/public/dist/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/public/dist/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/public/dist/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/public/dist/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/public/dist/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/public/dist/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/public/dist/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/public/dist/dist/assets/api-B8XKQ4OT.js +1 -0
- package/public/dist/dist/assets/api-BlPw3bUI.js +1 -0
- package/public/dist/dist/assets/architecture-YZFGNWBL-BkS7SZQi.js +1 -0
- package/public/dist/dist/assets/architectureDiagram-Q4EWVU46-Dl3iBKeR.js +1 -0
- package/public/dist/dist/assets/blockDiagram-DXYQGD6D-DPr4D17p.js +1 -0
- package/public/dist/dist/assets/c4Diagram-AHTNJAMY-CfoxJtDk.js +1 -0
- package/public/dist/dist/assets/classDiagram-6PBFFD2Q-BOAdHnnB.js +1 -0
- package/public/dist/dist/assets/classDiagram-v2-HSJHXN6E-B2QCJXWC.js +1 -0
- package/public/dist/dist/assets/constants-DshMUJbo.js +1 -0
- package/public/dist/dist/assets/cose-bilkent-S5V4N54A-CA14jk7w.js +1 -0
- package/public/dist/dist/assets/dagre-KV5264BT-BVwNaSwC.js +1 -0
- package/public/dist/dist/assets/diagram-5BDNPKRD-CHqIAvdc.js +1 -0
- package/public/dist/dist/assets/diagram-G4DWMVQ6-DxvsCvTP.js +1 -0
- package/public/dist/dist/assets/diagram-MMDJMWI5-DqOPO7dl.js +1 -0
- package/public/dist/dist/assets/diagram-TYMM5635-C9xMWPQn.js +1 -0
- package/public/dist/dist/assets/employees-CFRlsbHm.js +39 -0
- package/public/dist/dist/assets/erDiagram-SMLLAGMA-BTmpfRkm.js +1 -0
- package/public/dist/dist/assets/flowDiagram-DWJPFMVM-DZBSQAKA.js +1 -0
- package/public/dist/dist/assets/ganttDiagram-T4ZO3ILL-TAEMCRbT.js +1 -0
- package/public/dist/dist/assets/gitGraph-7Q5UKJZL-bbxndRNA.js +1 -0
- package/public/dist/dist/assets/gitGraphDiagram-UUTBAWPF-CBxtx0MB.js +1 -0
- package/public/dist/dist/assets/icon-192-CwXPIYF5.png +0 -0
- package/public/dist/dist/assets/index-1Gg-6jeC.css +1 -0
- package/public/dist/dist/assets/index-CQHqXjrK.js +49 -0
- package/public/dist/dist/assets/info-OMHHGYJF-DRXq_Ywr.js +1 -0
- package/public/dist/dist/assets/infoDiagram-42DDH7IO-C7FFwX4m.js +1 -0
- package/public/dist/dist/assets/ishikawaDiagram-UXIWVN3A-DEZJE79j.js +1 -0
- package/public/dist/dist/assets/journeyDiagram-VCZTEJTY-ZHLiY6GV.js +1 -0
- package/public/dist/dist/assets/kanban-definition-6JOO6SKY-NP7pY7ML.js +1 -0
- package/public/dist/dist/assets/katex-DZLS_HFU.js +1 -0
- package/public/dist/dist/assets/locale-BjoAcbis.js +1 -0
- package/public/dist/dist/assets/manifest-Bw-LRm-c.json +20 -0
- package/public/dist/dist/assets/mermaid.core-CHuluSlD.js +1 -0
- package/public/dist/dist/assets/mindmap-definition-QFDTVHPH-Bd1OgfN_.js +1 -0
- package/public/dist/dist/assets/packet-4T2RLAQJ-CGu8ST97.js +1 -0
- package/public/dist/dist/assets/pie-ZZUOXDRM-CDG65mhS.js +1 -0
- package/public/dist/dist/assets/pieDiagram-DEJITSTG-BbMBHLDM.js +1 -0
- package/public/dist/dist/assets/quadrantDiagram-34T5L4WZ-CDCDgI1e.js +1 -0
- package/public/dist/dist/assets/radar-PYXPWWZC-1gS-6ylu.js +1 -0
- package/public/dist/dist/assets/render-YHvL5VM_.js +6 -0
- package/public/dist/dist/assets/requirementDiagram-MS252O5E-DkmvOtYz.js +1 -0
- package/public/dist/dist/assets/rolldown-runtime-FhOqtrmT.js +1 -0
- package/public/dist/dist/assets/sankeyDiagram-XADWPNL6-GNcXIYsL.js +1 -0
- package/public/dist/dist/assets/sequenceDiagram-FGHM5R23-BFrw2n6x.js +1 -0
- package/public/dist/dist/assets/settings-BQF_u5px.js +37 -0
- package/public/dist/dist/assets/settings-C5Q9IPjJ.js +1 -0
- package/public/dist/dist/assets/shark-sprite-B3AAuERd.png +0 -0
- package/public/dist/dist/assets/skills-9Pd2rOw-.js +1 -0
- package/public/dist/dist/assets/skills-BI7sQAdk.js +12 -0
- package/public/dist/dist/assets/slash-commands-DMsE88bu.js +14 -0
- package/public/dist/dist/assets/slash-commands-FMpJzlDB.js +1 -0
- package/public/dist/dist/assets/state-O6NVkWcL.js +1 -0
- package/public/dist/dist/assets/stateDiagram-FHFEXIEX-BLgKnllT.js +1 -0
- package/public/dist/dist/assets/stateDiagram-v2-QKLJ7IA2-CbzuWsSa.js +1 -0
- package/public/dist/dist/assets/timeline-definition-GMOUNBTQ-CcZTJ3gL.js +1 -0
- package/public/dist/dist/assets/treeView-SZITEDCU-BDqBsaH1.js +1 -0
- package/public/dist/dist/assets/treemap-W4RFUUIX-BaWHA3Di.js +1 -0
- package/public/dist/dist/assets/ui-BukgLHuh.js +29 -0
- package/public/dist/dist/assets/ui-Bvz1JfTE.js +1 -0
- package/public/dist/dist/assets/vendor-mermaid-COidH9HB.js +2934 -0
- package/public/dist/dist/assets/vendor-render-Bjnw0wQ6.css +1 -0
- package/public/dist/dist/assets/vendor-render-D2YP6GiF.js +322 -0
- package/public/dist/dist/assets/vennDiagram-DHZGUBPP-BWV_j1bh.js +1 -0
- package/public/dist/dist/assets/wardley-RL74JXVD-C7gKA3d7.js +1 -0
- package/public/dist/dist/assets/wardleyDiagram-NUSXRM2D-BUoq_wug.js +1 -0
- package/public/dist/dist/assets/ws-S_AZgx7L.js +2 -0
- package/public/dist/dist/assets/xychartDiagram-5P7HB3ND-PvT5Ec82.js +1 -0
- package/public/dist/dist/index.html +708 -0
- package/public/dist/index.html +708 -0
- package/public/icons/icon-192.png +0 -0
- package/public/icons/icon-512-maskable.png +0 -0
- package/public/icons/icon-512.png +0 -0
- package/public/index.html +178 -125
- package/public/js/constants.ts +6 -6
- package/public/js/features/chat.ts +23 -3
- package/public/js/features/employees.ts +12 -12
- package/public/js/features/gesture.ts +61 -0
- package/public/js/features/heartbeat.ts +1 -1
- package/public/js/features/idb-cache.ts +89 -0
- package/public/js/features/memory.ts +4 -1
- package/public/js/features/process-block.ts +236 -0
- package/public/js/features/settings-channel.ts +53 -0
- package/public/js/features/settings-cli-status.ts +164 -0
- package/public/js/features/settings-core.ts +357 -0
- package/public/js/features/settings-discord.ts +52 -0
- package/public/js/features/settings-mcp.ts +54 -0
- package/public/js/features/settings-stt.ts +78 -0
- package/public/js/features/settings-telegram.ts +40 -0
- package/public/js/features/settings-templates.ts +129 -0
- package/public/js/features/settings-types.ts +24 -0
- package/public/js/features/settings.ts +9 -815
- package/public/js/features/sidebar.ts +4 -2
- package/public/js/features/skills.ts +5 -4
- package/public/js/features/slash-commands.ts +1 -8
- package/public/js/features/theme.ts +16 -10
- package/public/js/features/tool-ui.ts +113 -0
- package/public/js/main.ts +67 -8
- package/public/js/render.ts +128 -90
- package/public/js/state.ts +4 -0
- package/public/js/streaming-render.ts +55 -0
- package/public/js/ui.ts +289 -46
- package/public/js/virtual-scroll.ts +189 -0
- package/public/js/ws.ts +175 -112
- package/public/locales/en.json +6 -1
- package/public/locales/ko.json +6 -1
- package/public/manifest.json +20 -0
- package/public/public/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/public/public/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/public/public/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/public/public/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/public/public/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/public/public/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/public/public/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/public/public/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/public/public/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/public/public/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/public/public/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/public/public/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/public/public/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/public/public/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/public/public/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/public/public/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/public/public/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/public/public/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/public/public/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/public/public/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/public/public/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/public/public/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/public/public/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/public/public/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/public/public/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/public/public/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/public/public/dist/assets/api-B8XKQ4OT.js +1 -0
- package/public/public/dist/assets/api-BlPw3bUI.js +1 -0
- package/public/public/dist/assets/architecture-YZFGNWBL-BkS7SZQi.js +1 -0
- package/public/public/dist/assets/architectureDiagram-Q4EWVU46-Dl3iBKeR.js +1 -0
- package/public/public/dist/assets/blockDiagram-DXYQGD6D-DPr4D17p.js +1 -0
- package/public/public/dist/assets/c4Diagram-AHTNJAMY-CfoxJtDk.js +1 -0
- package/public/public/dist/assets/classDiagram-6PBFFD2Q-BOAdHnnB.js +1 -0
- package/public/public/dist/assets/classDiagram-v2-HSJHXN6E-B2QCJXWC.js +1 -0
- package/public/public/dist/assets/constants-DshMUJbo.js +1 -0
- package/public/public/dist/assets/cose-bilkent-S5V4N54A-CA14jk7w.js +1 -0
- package/public/public/dist/assets/dagre-KV5264BT-BVwNaSwC.js +1 -0
- package/public/public/dist/assets/diagram-5BDNPKRD-CHqIAvdc.js +1 -0
- package/public/public/dist/assets/diagram-G4DWMVQ6-DxvsCvTP.js +1 -0
- package/public/public/dist/assets/diagram-MMDJMWI5-DqOPO7dl.js +1 -0
- package/public/public/dist/assets/diagram-TYMM5635-C9xMWPQn.js +1 -0
- package/public/public/dist/assets/employees-CFRlsbHm.js +39 -0
- package/public/public/dist/assets/erDiagram-SMLLAGMA-BTmpfRkm.js +1 -0
- package/public/public/dist/assets/flowDiagram-DWJPFMVM-DZBSQAKA.js +1 -0
- package/public/public/dist/assets/ganttDiagram-T4ZO3ILL-TAEMCRbT.js +1 -0
- package/public/public/dist/assets/gitGraph-7Q5UKJZL-bbxndRNA.js +1 -0
- package/public/public/dist/assets/gitGraphDiagram-UUTBAWPF-CBxtx0MB.js +1 -0
- package/public/public/dist/assets/icon-192-CwXPIYF5.png +0 -0
- package/public/public/dist/assets/index-1Gg-6jeC.css +1 -0
- package/public/public/dist/assets/index-CQHqXjrK.js +49 -0
- package/public/public/dist/assets/info-OMHHGYJF-DRXq_Ywr.js +1 -0
- package/public/public/dist/assets/infoDiagram-42DDH7IO-C7FFwX4m.js +1 -0
- package/public/public/dist/assets/ishikawaDiagram-UXIWVN3A-DEZJE79j.js +1 -0
- package/public/public/dist/assets/journeyDiagram-VCZTEJTY-ZHLiY6GV.js +1 -0
- package/public/public/dist/assets/kanban-definition-6JOO6SKY-NP7pY7ML.js +1 -0
- package/public/public/dist/assets/katex-DZLS_HFU.js +1 -0
- package/public/public/dist/assets/locale-BjoAcbis.js +1 -0
- package/public/public/dist/assets/manifest-Bw-LRm-c.json +20 -0
- package/public/public/dist/assets/mermaid.core-CHuluSlD.js +1 -0
- package/public/public/dist/assets/mindmap-definition-QFDTVHPH-Bd1OgfN_.js +1 -0
- package/public/public/dist/assets/packet-4T2RLAQJ-CGu8ST97.js +1 -0
- package/public/public/dist/assets/pie-ZZUOXDRM-CDG65mhS.js +1 -0
- package/public/public/dist/assets/pieDiagram-DEJITSTG-BbMBHLDM.js +1 -0
- package/public/public/dist/assets/quadrantDiagram-34T5L4WZ-CDCDgI1e.js +1 -0
- package/public/public/dist/assets/radar-PYXPWWZC-1gS-6ylu.js +1 -0
- package/public/public/dist/assets/render-YHvL5VM_.js +6 -0
- package/public/public/dist/assets/requirementDiagram-MS252O5E-DkmvOtYz.js +1 -0
- package/public/public/dist/assets/rolldown-runtime-FhOqtrmT.js +1 -0
- package/public/public/dist/assets/sankeyDiagram-XADWPNL6-GNcXIYsL.js +1 -0
- package/public/public/dist/assets/sequenceDiagram-FGHM5R23-BFrw2n6x.js +1 -0
- package/public/public/dist/assets/settings-BQF_u5px.js +37 -0
- package/public/public/dist/assets/settings-C5Q9IPjJ.js +1 -0
- package/public/public/dist/assets/shark-sprite-B3AAuERd.png +0 -0
- package/public/public/dist/assets/skills-9Pd2rOw-.js +1 -0
- package/public/public/dist/assets/skills-BI7sQAdk.js +12 -0
- package/public/public/dist/assets/slash-commands-DMsE88bu.js +14 -0
- package/public/public/dist/assets/slash-commands-FMpJzlDB.js +1 -0
- package/public/public/dist/assets/state-O6NVkWcL.js +1 -0
- package/public/public/dist/assets/stateDiagram-FHFEXIEX-BLgKnllT.js +1 -0
- package/public/public/dist/assets/stateDiagram-v2-QKLJ7IA2-CbzuWsSa.js +1 -0
- package/public/public/dist/assets/timeline-definition-GMOUNBTQ-CcZTJ3gL.js +1 -0
- package/public/public/dist/assets/treeView-SZITEDCU-BDqBsaH1.js +1 -0
- package/public/public/dist/assets/treemap-W4RFUUIX-BaWHA3Di.js +1 -0
- package/public/public/dist/assets/ui-BukgLHuh.js +29 -0
- package/public/public/dist/assets/ui-Bvz1JfTE.js +1 -0
- package/public/public/dist/assets/vendor-mermaid-COidH9HB.js +2934 -0
- package/public/public/dist/assets/vendor-render-Bjnw0wQ6.css +1 -0
- package/public/public/dist/assets/vendor-render-D2YP6GiF.js +322 -0
- package/public/public/dist/assets/vennDiagram-DHZGUBPP-BWV_j1bh.js +1 -0
- package/public/public/dist/assets/wardley-RL74JXVD-C7gKA3d7.js +1 -0
- package/public/public/dist/assets/wardleyDiagram-NUSXRM2D-BUoq_wug.js +1 -0
- package/public/public/dist/assets/ws-S_AZgx7L.js +2 -0
- package/public/public/dist/assets/xychartDiagram-5P7HB3ND-PvT5Ec82.js +1 -0
- package/public/public/dist/index.html +708 -0
- package/public/sw.js +104 -0
- package/scripts/install-officecli.sh +145 -0
- package/scripts/release-preview.sh +18 -10
- package/scripts/release.sh +3 -3
- package/public/dist/bundle.js +0 -151
- package/public/dist/bundle.js.map +0 -7
package/public/js/constants.ts
CHANGED
|
@@ -14,7 +14,7 @@ const FALLBACK_CLI_REGISTRY: CliRegistry = {
|
|
|
14
14
|
claude: {
|
|
15
15
|
label: 'Claude',
|
|
16
16
|
efforts: ['low', 'medium', 'high'],
|
|
17
|
-
models: ['
|
|
17
|
+
models: ['sonnet', 'opus', 'sonnet[1m]', 'opus[1m]', 'haiku'],
|
|
18
18
|
},
|
|
19
19
|
codex: {
|
|
20
20
|
label: 'Codex',
|
|
@@ -134,10 +134,10 @@ export interface RolePreset {
|
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
export const ROLE_PRESETS: readonly RolePreset[] = [
|
|
137
|
-
{ value: 'frontend', labelKey: 'role.label.frontend', label: 'Frontend', prompt: 'UI/UX, CSS, components', skill: 'dev-frontend' },
|
|
138
|
-
{ value: 'backend', labelKey: 'role.label.backend', label: 'Backend', prompt: 'API, DB, server logic', skill: 'dev-backend' },
|
|
139
|
-
{ value: 'research', labelKey: 'role.label.research', label: 'Research', prompt: '
|
|
140
|
-
{ value: 'data', labelKey: 'role.label.data', label: 'Data', prompt: 'Data pipeline, analysis, ML', skill: 'dev-data' },
|
|
141
|
-
{ value: 'docs', labelKey: 'role.label.docs', label: 'Docs', prompt: '
|
|
137
|
+
{ value: 'frontend', labelKey: 'role.label.frontend', label: 'Frontend', prompt: 'Frontend employee — UI/UX, CSS, components', skill: 'dev-frontend' },
|
|
138
|
+
{ value: 'backend', labelKey: 'role.label.backend', label: 'Backend', prompt: 'Backend employee — API, DB, server logic', skill: 'dev-backend' },
|
|
139
|
+
{ value: 'research', labelKey: 'role.label.research', label: 'Research', prompt: 'Research employee — search, codebase exploration, uncertainty reduction, read-only reports', skill: 'research-worker' },
|
|
140
|
+
{ value: 'data', labelKey: 'role.label.data', label: 'Data', prompt: 'Data employee — data pipeline, analysis, ML', skill: 'dev-data' },
|
|
141
|
+
{ value: 'docs', labelKey: 'role.label.docs', label: 'Docs', prompt: 'Docs employee — documentation, README, API docs', skill: 'documentation' },
|
|
142
142
|
{ value: 'custom', labelKey: 'role.label.custom', label: 'Custom...', prompt: '', skill: null },
|
|
143
143
|
] as const;
|
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
// ── Chat Feature ──
|
|
2
2
|
import { state } from '../state.js';
|
|
3
|
-
import { addMessage, addSystemMsg
|
|
3
|
+
import { addMessage, addSystemMsg } from '../ui.js';
|
|
4
4
|
import { getPreferredLocale } from '../locale.js';
|
|
5
5
|
import { t } from './i18n.js';
|
|
6
6
|
import * as slashCmd from './slash-commands.js';
|
|
7
7
|
import { api, apiJson, apiFire } from '../api.js';
|
|
8
|
+
import { escapeHtml } from '../render.js';
|
|
9
|
+
import { getVirtualScroll } from '../virtual-scroll.js';
|
|
10
|
+
import { clearCache } from './idb-cache.js';
|
|
11
|
+
|
|
12
|
+
let activeObjectURLs: string[] = [];
|
|
8
13
|
|
|
9
14
|
interface CommandResult { code?: string; text?: string; type?: string; }
|
|
10
15
|
interface MessageResult { queued?: boolean; pending?: number; continued?: boolean; error?: string; }
|
|
@@ -63,6 +68,7 @@ export async function sendMessage(): Promise<void> {
|
|
|
63
68
|
}
|
|
64
69
|
if (!res.ok && !result?.text) throw new Error(`HTTP ${res.status}`);
|
|
65
70
|
if (result?.code === 'clear_screen') {
|
|
71
|
+
getVirtualScroll().clear();
|
|
66
72
|
const chatEl = document.getElementById('chatMessages');
|
|
67
73
|
if (chatEl) chatEl.innerHTML = '';
|
|
68
74
|
}
|
|
@@ -143,6 +149,8 @@ export function removeAttachedFile(index: number): void {
|
|
|
143
149
|
}
|
|
144
150
|
|
|
145
151
|
export function clearAttachedFiles(): void {
|
|
152
|
+
activeObjectURLs.forEach(url => URL.revokeObjectURL(url));
|
|
153
|
+
activeObjectURLs = [];
|
|
146
154
|
state.attachedFiles = [];
|
|
147
155
|
renderFilePreview();
|
|
148
156
|
const fi = document.getElementById('fileInput') as HTMLInputElement | null;
|
|
@@ -153,6 +161,9 @@ function renderFilePreview(): void {
|
|
|
153
161
|
const preview = document.getElementById('filePreview');
|
|
154
162
|
const listEl = document.getElementById('filePreviewList');
|
|
155
163
|
if (!preview) return;
|
|
164
|
+
// Revoke all previous object URLs before creating new ones
|
|
165
|
+
activeObjectURLs.forEach(url => URL.revokeObjectURL(url));
|
|
166
|
+
activeObjectURLs = [];
|
|
156
167
|
if (!state.attachedFiles.length) {
|
|
157
168
|
preview.classList.remove('visible');
|
|
158
169
|
if (listEl) listEl.innerHTML = '';
|
|
@@ -163,10 +174,15 @@ function renderFilePreview(): void {
|
|
|
163
174
|
listEl.innerHTML = state.attachedFiles.map((f: File, i: number) => {
|
|
164
175
|
const size = (f.size / 1024).toFixed(1);
|
|
165
176
|
const isImg = f.type.startsWith('image/');
|
|
166
|
-
|
|
177
|
+
let thumb = '';
|
|
178
|
+
if (isImg) {
|
|
179
|
+
const url = URL.createObjectURL(f);
|
|
180
|
+
activeObjectURLs.push(url);
|
|
181
|
+
thumb = `<img src="${url}" class="file-chip-thumb" alt="">`;
|
|
182
|
+
}
|
|
167
183
|
return `<div class="file-chip">
|
|
168
184
|
${thumb}
|
|
169
|
-
<span class="file-chip-name">📎 ${f.name} (${size}KB)</span>
|
|
185
|
+
<span class="file-chip-name">📎 ${escapeHtml(f.name)} (${size}KB)</span>
|
|
170
186
|
<button class="file-chip-remove" data-file-idx="${i}" title="Remove">✕</button>
|
|
171
187
|
</div>`;
|
|
172
188
|
}).join('');
|
|
@@ -174,8 +190,12 @@ function renderFilePreview(): void {
|
|
|
174
190
|
|
|
175
191
|
export async function clearChat(): Promise<void> {
|
|
176
192
|
apiFire('/api/clear', 'POST');
|
|
193
|
+
getVirtualScroll().clear();
|
|
177
194
|
const chatEl = document.getElementById('chatMessages');
|
|
178
195
|
if (chatEl) chatEl.innerHTML = '';
|
|
196
|
+
const { cleanupToolActivity } = await import('../ui.js');
|
|
197
|
+
cleanupToolActivity();
|
|
198
|
+
clearCache().catch(() => {});
|
|
179
199
|
}
|
|
180
200
|
|
|
181
201
|
// ── Auto-resize textarea ──
|
|
@@ -70,7 +70,7 @@ export function renderEmployees(): void {
|
|
|
70
70
|
const p = ps?.phase || a.phase;
|
|
71
71
|
const pl = ps?.phaseLabel || a.phaseLabel;
|
|
72
72
|
const phaseBadge = p
|
|
73
|
-
? `<span style="background:${PHASE_COLORS[p] || '#888'};color:#000;padding:1px 6px;border-radius:9px;font-size:9px">${pl || 'P' + p}</span>`
|
|
73
|
+
? `<span style="background:${PHASE_COLORS[p] || '#888'};color:#000;padding:1px 6px;border-radius:9px;font-size:9px">${escapeHtml(pl || 'P' + p)}</span>`
|
|
74
74
|
: '';
|
|
75
75
|
|
|
76
76
|
return `
|
|
@@ -79,36 +79,36 @@ export function renderEmployees(): void {
|
|
|
79
79
|
<span style="width:8px;height:8px;border-radius:50%;background:var(--accent);display:inline-block;flex-shrink:0"></span>
|
|
80
80
|
<input style="flex:1;background:none;border:none;color:var(--text);font-size:12px;font-weight:600;font-family:inherit;outline:none"
|
|
81
81
|
value="${escapeHtml(a.name || 'Agent')}"
|
|
82
|
-
data-emp-name="${a.id}">
|
|
83
|
-
<button style="background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:12px" data-emp-delete="${a.id}" title="${t('emp.delete')}">✕</button>
|
|
82
|
+
data-emp-name="${escapeHtml(a.id)}">
|
|
83
|
+
<button style="background:none;border:none;color:var(--text-dim);cursor:pointer;font-size:12px" data-emp-delete="${escapeHtml(a.id)}" title="${t('emp.delete')}">✕</button>
|
|
84
84
|
</div>
|
|
85
85
|
<div style="display:grid;grid-template-columns:1fr 1fr;gap:4px;margin-bottom:4px">
|
|
86
86
|
<div>
|
|
87
87
|
<label>CLI</label>
|
|
88
|
-
<select data-emp-cli="${a.id}">
|
|
89
|
-
${cliKeys.map(c => `<option${a.cli === c ? ' selected' : ''}>${c}</option>`).join('')}
|
|
88
|
+
<select data-emp-cli="${escapeHtml(a.id)}">
|
|
89
|
+
${cliKeys.map(c => `<option${a.cli === c ? ' selected' : ''}>${escapeHtml(c)}</option>`).join('')}
|
|
90
90
|
</select>
|
|
91
91
|
</div>
|
|
92
92
|
<div>
|
|
93
93
|
<label>Model</label>
|
|
94
|
-
<select data-emp-model="${a.id}">
|
|
94
|
+
<select data-emp-model="${escapeHtml(a.id)}">
|
|
95
95
|
<option value="default"${(!a.model || a.model === 'default') ? ' selected' : ''}>default</option>
|
|
96
|
-
${models.map(m => `<option${a.model === m ? ' selected' : ''}>${m}</option>`).join('')}
|
|
97
|
-
${a.model && a.model !== 'default' && !models.includes(a.model) ? `<option selected>${a.model}</option>` : ''}
|
|
96
|
+
${models.map(m => `<option${a.model === m ? ' selected' : ''}>${escapeHtml(m)}</option>`).join('')}
|
|
97
|
+
${a.model && a.model !== 'default' && !models.includes(a.model) ? `<option selected>${escapeHtml(a.model)}</option>` : ''}
|
|
98
98
|
<option value="__custom__">${t('emp.customModel')}</option>
|
|
99
99
|
</select>
|
|
100
100
|
</div>
|
|
101
101
|
</div>
|
|
102
102
|
<div>
|
|
103
103
|
<label>Role</label>
|
|
104
|
-
<select data-emp-role="${a.id}">
|
|
104
|
+
<select data-emp-role="${escapeHtml(a.id)}">
|
|
105
105
|
${ROLE_PRESETS.map(r => `<option value="${r.value}"${presetVal === r.value ? ' selected' : ''}>${r.label}</option>`).join('')}
|
|
106
106
|
</select>
|
|
107
|
-
<textarea data-emp-custom="${a.id}" style="display:${isCustom ? 'block' : 'none'};margin-top:4px;width:100%;height:40px;background:var(--bg);border:1px solid var(--border);color:var(--text);padding:4px 6px;border-radius:4px;font-size:10px;font-family:inherit;resize:vertical"
|
|
107
|
+
<textarea data-emp-custom="${escapeHtml(a.id)}" style="display:${isCustom ? 'block' : 'none'};margin-top:4px;width:100%;height:40px;background:var(--bg);border:1px solid var(--border);color:var(--text);padding:4px 6px;border-radius:4px;font-size:10px;font-family:inherit;resize:vertical"
|
|
108
108
|
placeholder="${t('emp.customRole')}">${isCustom ? escapeHtml(a.role || '') : ''}</textarea>
|
|
109
109
|
</div>
|
|
110
110
|
<div style="margin-top:4px;font-size:10px;display:flex;align-items:center;gap:6px">
|
|
111
|
-
<span style="color:${a.status === 'running' ? '#fbbf24' : 'var(--green)'}">● ${a.status || 'idle'}</span>
|
|
111
|
+
<span style="color:${a.status === 'running' ? '#fbbf24' : 'var(--green)'}">● ${escapeHtml(a.status || 'idle')}</span>
|
|
112
112
|
${phaseBadge}
|
|
113
113
|
</div>
|
|
114
114
|
</div>`;
|
|
@@ -135,7 +135,7 @@ export function onEmpCliChange(id: string, cli: string): void {
|
|
|
135
135
|
models.map(m => `<option>${escapeHtml(m)}</option>`).join('') +
|
|
136
136
|
`<option value="__custom__">${t('emp.customModel')}</option>`;
|
|
137
137
|
}
|
|
138
|
-
updateEmployee(id, { cli, model: 'default' });
|
|
138
|
+
updateEmployee(id, { cli, model: cli === 'claude' ? 'sonnet' : 'default' });
|
|
139
139
|
}
|
|
140
140
|
|
|
141
141
|
export function onEmpRoleChange(id: string, presetVal: string): void {
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// ── Touch Gestures ──
|
|
2
|
+
// Swipe from screen edges to toggle sidebars on mobile
|
|
3
|
+
|
|
4
|
+
import { toggleLeft, toggleRight } from './sidebar.js';
|
|
5
|
+
|
|
6
|
+
const SWIPE_THRESHOLD = 50;
|
|
7
|
+
const EDGE_ZONE = 30;
|
|
8
|
+
const MAX_Y_DRIFT = 80;
|
|
9
|
+
const MAX_TIME = 500;
|
|
10
|
+
|
|
11
|
+
interface TouchState {
|
|
12
|
+
startX: number;
|
|
13
|
+
startY: number;
|
|
14
|
+
startTime: number;
|
|
15
|
+
isEdge: 'left' | 'right' | null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let touch: TouchState | null = null;
|
|
19
|
+
let initialized = false;
|
|
20
|
+
|
|
21
|
+
export function initGestures(): void {
|
|
22
|
+
if (initialized || !('ontouchstart' in window)) return;
|
|
23
|
+
initialized = true;
|
|
24
|
+
|
|
25
|
+
const chat = document.querySelector('.chat-area') as HTMLElement | null;
|
|
26
|
+
if (!chat) return;
|
|
27
|
+
|
|
28
|
+
chat.addEventListener('touchstart', onTouchStart as EventListener, { passive: true });
|
|
29
|
+
chat.addEventListener('touchend', onTouchEnd as EventListener, { passive: true });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function onTouchStart(e: TouchEvent): void {
|
|
33
|
+
const t = e.touches[0];
|
|
34
|
+
const vw = window.innerWidth;
|
|
35
|
+
|
|
36
|
+
let isEdge: 'left' | 'right' | null = null;
|
|
37
|
+
if (t.clientX < EDGE_ZONE) isEdge = 'left';
|
|
38
|
+
else if (t.clientX > vw - EDGE_ZONE) isEdge = 'right';
|
|
39
|
+
|
|
40
|
+
touch = {
|
|
41
|
+
startX: t.clientX,
|
|
42
|
+
startY: t.clientY,
|
|
43
|
+
startTime: Date.now(),
|
|
44
|
+
isEdge,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function onTouchEnd(e: TouchEvent): void {
|
|
49
|
+
if (!touch) return;
|
|
50
|
+
const t = e.changedTouches[0];
|
|
51
|
+
const dx = t.clientX - touch.startX;
|
|
52
|
+
const dy = Math.abs(t.clientY - touch.startY);
|
|
53
|
+
const dt = Date.now() - touch.startTime;
|
|
54
|
+
const prev = touch;
|
|
55
|
+
touch = null;
|
|
56
|
+
|
|
57
|
+
if (dy > MAX_Y_DRIFT || dt > MAX_TIME || Math.abs(dx) < SWIPE_THRESHOLD) return;
|
|
58
|
+
|
|
59
|
+
if (dx > 0 && prev.isEdge === 'left') toggleLeft();
|
|
60
|
+
if (dx < 0 && prev.isEdge === 'right') toggleRight();
|
|
61
|
+
}
|
|
@@ -54,7 +54,7 @@ export function renderHeartbeatJobs(): void {
|
|
|
54
54
|
<input type="text" value="${escapeHtml(String(job.name || ''))}" placeholder="${escapeHtml(t('hb.name'))}"
|
|
55
55
|
data-hb-name="${i}">
|
|
56
56
|
<button class="hb-toggle ${job.enabled ? 'on' : 'off'}"
|
|
57
|
-
data-hb-toggle="${i}"></button>
|
|
57
|
+
data-hb-toggle="${i}" aria-label="${escapeHtml(String(job.name || 'job') + ' toggle')}"></button>
|
|
58
58
|
<button class="hb-del" data-hb-remove="${i}">✕</button>
|
|
59
59
|
</div>
|
|
60
60
|
<div class="hb-job-schedule">
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// ── IndexedDB Offline Cache ──
|
|
2
|
+
// Caches conversation messages for offline viewing
|
|
3
|
+
// Auto-syncs when server reconnects
|
|
4
|
+
|
|
5
|
+
const DB_NAME = 'clijaw';
|
|
6
|
+
const DB_VERSION = 1;
|
|
7
|
+
const STORE = 'messages';
|
|
8
|
+
|
|
9
|
+
export interface CachedMessage {
|
|
10
|
+
id?: number;
|
|
11
|
+
role: string;
|
|
12
|
+
content: string;
|
|
13
|
+
timestamp: number;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
let dbPromise: Promise<IDBDatabase> | null = null;
|
|
17
|
+
|
|
18
|
+
function openDB(): Promise<IDBDatabase> {
|
|
19
|
+
if (dbPromise) return dbPromise;
|
|
20
|
+
dbPromise = new Promise((resolve, reject) => {
|
|
21
|
+
const req = indexedDB.open(DB_NAME, DB_VERSION);
|
|
22
|
+
req.onupgradeneeded = () => {
|
|
23
|
+
const db = req.result;
|
|
24
|
+
if (!db.objectStoreNames.contains(STORE)) {
|
|
25
|
+
const store = db.createObjectStore(STORE, { keyPath: 'id', autoIncrement: true });
|
|
26
|
+
store.createIndex('timestamp', 'timestamp');
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
req.onsuccess = () => resolve(req.result);
|
|
30
|
+
req.onerror = () => {
|
|
31
|
+
dbPromise = null;
|
|
32
|
+
reject(req.error);
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
return dbPromise;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export async function cacheMessages(messages: CachedMessage[]): Promise<void> {
|
|
39
|
+
try {
|
|
40
|
+
const db = await openDB();
|
|
41
|
+
const tx = db.transaction(STORE, 'readwrite');
|
|
42
|
+
const store = tx.objectStore(STORE);
|
|
43
|
+
store.clear();
|
|
44
|
+
for (const msg of messages) {
|
|
45
|
+
store.add({ role: msg.role, content: msg.content, timestamp: msg.timestamp || Date.now() });
|
|
46
|
+
}
|
|
47
|
+
await new Promise<void>((resolve, reject) => {
|
|
48
|
+
tx.oncomplete = () => resolve();
|
|
49
|
+
tx.onerror = () => reject(tx.error);
|
|
50
|
+
});
|
|
51
|
+
} catch (e) {
|
|
52
|
+
console.warn('[idb-cache] cacheMessages failed:', e);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function getCachedMessages(): Promise<CachedMessage[]> {
|
|
57
|
+
try {
|
|
58
|
+
const db = await openDB();
|
|
59
|
+
return new Promise((resolve, reject) => {
|
|
60
|
+
const tx = db.transaction(STORE, 'readonly');
|
|
61
|
+
const req = tx.objectStore(STORE).getAll();
|
|
62
|
+
req.onsuccess = () => resolve(req.result);
|
|
63
|
+
req.onerror = () => reject(req.error);
|
|
64
|
+
});
|
|
65
|
+
} catch (e) {
|
|
66
|
+
console.warn('[idb-cache] getCachedMessages failed:', e);
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export async function appendCachedMessage(role: string, content: string): Promise<void> {
|
|
72
|
+
try {
|
|
73
|
+
const db = await openDB();
|
|
74
|
+
const tx = db.transaction(STORE, 'readwrite');
|
|
75
|
+
tx.objectStore(STORE).add({ role, content, timestamp: Date.now() });
|
|
76
|
+
} catch (e) {
|
|
77
|
+
console.warn('[idb-cache] appendCachedMessage failed:', e);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export async function clearCache(): Promise<void> {
|
|
82
|
+
try {
|
|
83
|
+
const db = await openDB();
|
|
84
|
+
const tx = db.transaction(STORE, 'readwrite');
|
|
85
|
+
tx.objectStore(STORE).clear();
|
|
86
|
+
} catch (e) {
|
|
87
|
+
console.warn('[idb-cache] clearCache failed:', e);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -256,6 +256,9 @@ export function switchMemTab(tab: string): void {
|
|
|
256
256
|
$('memTabBtnSettings')?.classList.toggle('active', tab === 'settings');
|
|
257
257
|
$('memTabBtnAdvOps')?.classList.toggle('active', tab === 'status');
|
|
258
258
|
$('memTabBtnFiles')?.classList.toggle('active', tab === 'files');
|
|
259
|
+
$('memTabBtnSettings')?.setAttribute('aria-selected', String(tab === 'settings'));
|
|
260
|
+
$('memTabBtnAdvOps')?.setAttribute('aria-selected', String(tab === 'status'));
|
|
261
|
+
$('memTabBtnFiles')?.setAttribute('aria-selected', String(tab === 'files'));
|
|
259
262
|
}
|
|
260
263
|
|
|
261
264
|
export async function setMemEnabled(v: boolean): Promise<void> {
|
|
@@ -327,7 +330,7 @@ export async function viewMemFile(name: string): Promise<void> {
|
|
|
327
330
|
if (!container) return;
|
|
328
331
|
container.innerHTML = `
|
|
329
332
|
<div style="margin-bottom:8px;display:flex;justify-content:space-between;align-items:center">
|
|
330
|
-
<span style="font-size:12px;font-weight:600">${data.name}</span>
|
|
333
|
+
<span style="font-size:12px;font-weight:600">${escapeHtml(data.name)}</span>
|
|
331
334
|
<button data-mem-back style="background:none;border:none;color:var(--accent);cursor:pointer;font-size:11px">← back</button>
|
|
332
335
|
</div>
|
|
333
336
|
<pre style="background:var(--bg);padding:8px;border-radius:4px;font-size:11px;white-space:pre-wrap;max-height:50vh;overflow-y:auto;color:var(--text)">${escapeHtml(data.content)}</pre>
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
// ── Process Block ──
|
|
2
|
+
// Collapsible panel showing tool/thinking activity during agent responses.
|
|
3
|
+
|
|
4
|
+
import { escapeHtml } from '../render.js';
|
|
5
|
+
|
|
6
|
+
export interface ProcessStep {
|
|
7
|
+
id: string;
|
|
8
|
+
type: 'tool' | 'thinking' | 'search';
|
|
9
|
+
icon: string;
|
|
10
|
+
label: string;
|
|
11
|
+
detail?: string;
|
|
12
|
+
stepRef?: string;
|
|
13
|
+
status: 'running' | 'done' | 'error';
|
|
14
|
+
startTime: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface ProcessBlockState {
|
|
18
|
+
element: HTMLElement;
|
|
19
|
+
steps: ProcessStep[];
|
|
20
|
+
collapsed: boolean;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function buildSummaryText(steps: ProcessStep[]): string {
|
|
24
|
+
const counts: Record<string, number> = {};
|
|
25
|
+
for (const s of steps) {
|
|
26
|
+
const key = s.type === 'thinking' ? '💭 Thinking'
|
|
27
|
+
: s.type === 'search' ? '🔍 Search'
|
|
28
|
+
: '🔧 Tool';
|
|
29
|
+
counts[key] = (counts[key] || 0) + 1;
|
|
30
|
+
}
|
|
31
|
+
return Object.entries(counts)
|
|
32
|
+
.map(([k, n]) => n > 1 ? `${k}×${n}` : k)
|
|
33
|
+
.join(' + ');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function previewText(text: string, max = 120): string {
|
|
37
|
+
const singleLine = text.replace(/\s+/g, ' ').trim();
|
|
38
|
+
if (!singleLine) return '';
|
|
39
|
+
return singleLine.length > max ? `${singleLine.slice(0, max - 1)}…` : singleLine;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function hasExpandableDetail(step: ProcessStep): boolean {
|
|
43
|
+
const detail = (step.detail || '').trim();
|
|
44
|
+
if (!detail) return false;
|
|
45
|
+
return detail !== (step.label || '').trim();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function renderStep(step: ProcessStep): string {
|
|
49
|
+
const dotClass = `process-step-dot ${step.status}`;
|
|
50
|
+
const badgeClass = `process-step-badge ${step.type}`;
|
|
51
|
+
const badgeText = step.type.toUpperCase();
|
|
52
|
+
const label = escapeHtml(step.label || step.icon || '');
|
|
53
|
+
const detail = step.detail || '';
|
|
54
|
+
const detailId = `process-detail-${step.id}`;
|
|
55
|
+
const detailPreview = hasExpandableDetail(step)
|
|
56
|
+
? previewText(detail, step.type === 'thinking' ? 120 : 100)
|
|
57
|
+
: '';
|
|
58
|
+
const snippetHtml = detailPreview
|
|
59
|
+
? `<span class="process-step-snippet">${escapeHtml(detailPreview)}</span>`
|
|
60
|
+
: '';
|
|
61
|
+
|
|
62
|
+
if (hasExpandableDetail(step)) {
|
|
63
|
+
return `<div class="process-step process-step-expandable" data-step-id="${step.id}" data-type="${step.type}">
|
|
64
|
+
<button class="process-step-toggle" aria-expanded="false" aria-controls="${detailId}">
|
|
65
|
+
<span class="${dotClass}"></span>
|
|
66
|
+
<span class="${badgeClass}">${badgeText}</span>
|
|
67
|
+
<span class="process-step-main">
|
|
68
|
+
<span class="process-step-label">${label}</span>
|
|
69
|
+
${snippetHtml}
|
|
70
|
+
</span>
|
|
71
|
+
<span class="process-step-chevron">▸</span>
|
|
72
|
+
</button>
|
|
73
|
+
<div class="process-step-details collapsed" id="${detailId}">
|
|
74
|
+
<pre class="process-step-full">${escapeHtml(detail)}</pre>
|
|
75
|
+
</div>
|
|
76
|
+
</div>`;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return `<div class="process-step" data-step-id="${step.id}" data-type="${step.type}">
|
|
80
|
+
<span class="${dotClass}"></span>
|
|
81
|
+
<span class="${badgeClass}">${badgeText}</span>
|
|
82
|
+
<span class="process-step-label">${label}</span>
|
|
83
|
+
</div>`;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function blockShell(summaryText = '', collapsed = false): string {
|
|
87
|
+
return `<div class="process-block${collapsed ? ' collapsed' : ''}">
|
|
88
|
+
<button class="process-summary" aria-expanded="${collapsed ? 'false' : 'true'}">
|
|
89
|
+
<span class="process-dot ${collapsed ? 'done' : 'running'}"></span>
|
|
90
|
+
<span class="process-summary-text">${escapeHtml(summaryText)}</span>
|
|
91
|
+
<span class="process-duration"></span>
|
|
92
|
+
<span class="process-chevron">${collapsed ? '▸' : '▾'}</span>
|
|
93
|
+
</button>
|
|
94
|
+
<div class="process-details">
|
|
95
|
+
<div class="process-steps-inner"></div>
|
|
96
|
+
</div>
|
|
97
|
+
</div>`;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function toggleStepDetails(toggle: HTMLElement): void {
|
|
101
|
+
const wrapper = toggle.closest('.process-step');
|
|
102
|
+
const details = wrapper?.querySelector('.process-step-details') as HTMLElement | null;
|
|
103
|
+
const chevron = toggle.querySelector('.process-step-chevron');
|
|
104
|
+
if (!wrapper || !details) return;
|
|
105
|
+
const expanding = details.classList.contains('collapsed');
|
|
106
|
+
details.classList.toggle('collapsed', !expanding);
|
|
107
|
+
wrapper.classList.toggle('expanded', expanding);
|
|
108
|
+
toggle.setAttribute('aria-expanded', expanding ? 'true' : 'false');
|
|
109
|
+
if (chevron) chevron.textContent = expanding ? '▾' : '▸';
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function bindProcessBlockInteractions(root: HTMLElement): void {
|
|
113
|
+
if (root.dataset.processBlockBound === '1') return;
|
|
114
|
+
root.addEventListener('click', (event) => {
|
|
115
|
+
const target = event.target as HTMLElement | null;
|
|
116
|
+
if (!target) return;
|
|
117
|
+
|
|
118
|
+
const stepToggle = target.closest('.process-step-toggle') as HTMLElement | null;
|
|
119
|
+
if (stepToggle) {
|
|
120
|
+
toggleStepDetails(stepToggle);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const summary = target.closest('.process-summary') as HTMLElement | null;
|
|
125
|
+
if (summary) {
|
|
126
|
+
const block = summary.closest('.process-block');
|
|
127
|
+
if (!block) return;
|
|
128
|
+
const expanding = block.classList.contains('collapsed');
|
|
129
|
+
block.classList.toggle('collapsed', !expanding);
|
|
130
|
+
summary.setAttribute('aria-expanded', expanding ? 'true' : 'false');
|
|
131
|
+
const chevron = summary.querySelector('.process-chevron');
|
|
132
|
+
if (chevron) chevron.textContent = expanding ? '▾' : '▸';
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
root.dataset.processBlockBound = '1';
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export function buildProcessBlockHtml(steps: ProcessStep[], collapsed = true): string {
|
|
139
|
+
const summaryText = buildSummaryText(steps);
|
|
140
|
+
const html = blockShell(summaryText, collapsed);
|
|
141
|
+
const wrapper = document.createElement('div');
|
|
142
|
+
wrapper.innerHTML = html;
|
|
143
|
+
const inner = wrapper.querySelector('.process-steps-inner');
|
|
144
|
+
if (inner) inner.innerHTML = steps.map(renderStep).join('');
|
|
145
|
+
const dot = wrapper.querySelector('.process-dot');
|
|
146
|
+
if (dot) {
|
|
147
|
+
const anyRunning = steps.some(step => step.status === 'running');
|
|
148
|
+
dot.classList.toggle('running', anyRunning && !collapsed);
|
|
149
|
+
dot.classList.toggle('done', !anyRunning || collapsed);
|
|
150
|
+
}
|
|
151
|
+
return wrapper.innerHTML;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function updateSummary(pb: ProcessBlockState): void {
|
|
155
|
+
const summaryText = pb.element.querySelector('.process-summary-text');
|
|
156
|
+
if (summaryText) summaryText.textContent = buildSummaryText(pb.steps);
|
|
157
|
+
|
|
158
|
+
const anyRunning = pb.steps.some(s => s.status === 'running');
|
|
159
|
+
const dot = pb.element.querySelector('.process-dot');
|
|
160
|
+
if (dot) {
|
|
161
|
+
dot.classList.toggle('running', anyRunning && !pb.collapsed);
|
|
162
|
+
dot.classList.toggle('done', !anyRunning || pb.collapsed);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const elapsed = pb.steps.length > 0
|
|
166
|
+
? Math.round((Date.now() - pb.steps[0].startTime) / 1000)
|
|
167
|
+
: 0;
|
|
168
|
+
const dur = pb.element.querySelector('.process-duration');
|
|
169
|
+
if (dur) dur.textContent = elapsed > 0 ? `${elapsed}s` : '';
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export function createProcessBlock(parentEl: HTMLElement): ProcessBlockState {
|
|
173
|
+
const host = document.createElement('div');
|
|
174
|
+
host.innerHTML = blockShell('', false);
|
|
175
|
+
const el = host.firstElementChild as HTMLElement;
|
|
176
|
+
|
|
177
|
+
const content = parentEl.querySelector('.msg-content');
|
|
178
|
+
if (content) content.before(el);
|
|
179
|
+
else parentEl.appendChild(el);
|
|
180
|
+
|
|
181
|
+
return { element: el, steps: [], collapsed: false };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export function addStep(pb: ProcessBlockState, step: ProcessStep): void {
|
|
185
|
+
pb.steps.push(step);
|
|
186
|
+
const inner = pb.element.querySelector('.process-steps-inner');
|
|
187
|
+
if (inner) inner.insertAdjacentHTML('beforeend', renderStep(step));
|
|
188
|
+
updateSummary(pb);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function replaceStep(pb: ProcessBlockState, oldStepId: string, newStep: ProcessStep): void {
|
|
192
|
+
const idx = pb.steps.findIndex(s => s.id === oldStepId);
|
|
193
|
+
if (idx === -1) return;
|
|
194
|
+
pb.steps[idx] = newStep;
|
|
195
|
+
const oldEl = pb.element.querySelector(`[data-step-id="${oldStepId}"]`);
|
|
196
|
+
if (oldEl) {
|
|
197
|
+
const temp = document.createElement('div');
|
|
198
|
+
temp.innerHTML = renderStep(newStep);
|
|
199
|
+
const newEl = temp.firstElementChild;
|
|
200
|
+
if (newEl) oldEl.replaceWith(newEl);
|
|
201
|
+
}
|
|
202
|
+
updateSummary(pb);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export function updateStepStatus(pb: ProcessBlockState, stepId: string, status: ProcessStep['status']): void {
|
|
206
|
+
const step = pb.steps.find(s => s.id === stepId);
|
|
207
|
+
if (!step) return;
|
|
208
|
+
step.status = status;
|
|
209
|
+
const stepEl = pb.element.querySelector(`[data-step-id="${stepId}"]`);
|
|
210
|
+
if (stepEl) {
|
|
211
|
+
const dot = stepEl.querySelector('.process-step-dot');
|
|
212
|
+
if (dot) {
|
|
213
|
+
dot.classList.remove('running', 'done', 'error');
|
|
214
|
+
dot.classList.add(status);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
updateSummary(pb);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export function collapseBlock(pb: ProcessBlockState): void {
|
|
221
|
+
pb.collapsed = true;
|
|
222
|
+
pb.element.classList.add('collapsed');
|
|
223
|
+
const btn = pb.element.querySelector('.process-summary');
|
|
224
|
+
if (btn) btn.setAttribute('aria-expanded', 'false');
|
|
225
|
+
const chevron = pb.element.querySelector('.process-chevron');
|
|
226
|
+
if (chevron) chevron.textContent = '▸';
|
|
227
|
+
|
|
228
|
+
for (const step of pb.steps) {
|
|
229
|
+
if (step.status === 'running') step.status = 'done';
|
|
230
|
+
}
|
|
231
|
+
pb.element.querySelectorAll('.process-step-dot.running').forEach(dot => {
|
|
232
|
+
dot.classList.remove('running');
|
|
233
|
+
dot.classList.add('done');
|
|
234
|
+
});
|
|
235
|
+
updateSummary(pb);
|
|
236
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// ── Active Channel & Fallback Order ──
|
|
2
|
+
import { apiJson } from '../api.js';
|
|
3
|
+
import { escapeHtml } from '../render.js';
|
|
4
|
+
import { t } from './i18n.js';
|
|
5
|
+
import type { SettingsData } from './settings-types.js';
|
|
6
|
+
|
|
7
|
+
export async function setActiveChannel(ch: 'telegram' | 'discord'): Promise<void> {
|
|
8
|
+
document.getElementById('chTelegram')?.classList.toggle('active', ch === 'telegram');
|
|
9
|
+
document.getElementById('chDiscord')?.classList.toggle('active', ch === 'discord');
|
|
10
|
+
document.getElementById('channelTelegramSettings')?.style.setProperty('display', ch === 'telegram' ? '' : 'none');
|
|
11
|
+
document.getElementById('channelDiscordSettings')?.style.setProperty('display', ch === 'discord' ? '' : 'none');
|
|
12
|
+
await apiJson('/api/settings', 'PUT', { channel: ch });
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function loadActiveChannel(s: SettingsData): void {
|
|
16
|
+
const ch = s.channel || 'telegram';
|
|
17
|
+
document.getElementById('chTelegram')?.classList.toggle('active', ch === 'telegram');
|
|
18
|
+
document.getElementById('chDiscord')?.classList.toggle('active', ch === 'discord');
|
|
19
|
+
document.getElementById('channelTelegramSettings')?.style.setProperty('display', ch === 'telegram' ? '' : 'none');
|
|
20
|
+
document.getElementById('channelDiscordSettings')?.style.setProperty('display', ch === 'discord' ? '' : 'none');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function loadFallbackOrder(s: SettingsData): void {
|
|
24
|
+
const container = document.getElementById('fallbackOrderList');
|
|
25
|
+
if (!container) return;
|
|
26
|
+
const allClis = Object.keys(s.perCli || {});
|
|
27
|
+
const active = s.fallbackOrder || [];
|
|
28
|
+
const slotCount = Math.min(allClis.length - 1, 3);
|
|
29
|
+
|
|
30
|
+
let html = '';
|
|
31
|
+
for (let i = 0; i < slotCount; i++) {
|
|
32
|
+
const current = active[i] || '';
|
|
33
|
+
const opts = allClis.map(cli =>
|
|
34
|
+
`<option value="${escapeHtml(cli)}" ${cli === current ? 'selected' : ''}>${escapeHtml(cli)}</option>`
|
|
35
|
+
).join('');
|
|
36
|
+
html += `
|
|
37
|
+
<div class="settings-row sub-row">
|
|
38
|
+
<label style="min-width:60px">Fallback ${i + 1}</label>
|
|
39
|
+
<select id="fallback${i}"
|
|
40
|
+
style="font-size:11px;padding:4px;background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:4px;flex:1">
|
|
41
|
+
<option value="">${t('settings.none')}</option>
|
|
42
|
+
${opts}
|
|
43
|
+
</select>
|
|
44
|
+
</div>`;
|
|
45
|
+
}
|
|
46
|
+
container.innerHTML = html;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export async function saveFallbackOrder(): Promise<void> {
|
|
50
|
+
const selects = document.querySelectorAll<HTMLSelectElement>('#fallbackOrderList select');
|
|
51
|
+
const fallbackOrder = [...selects].map(s => s.value).filter(Boolean);
|
|
52
|
+
await apiJson('/api/settings', 'PUT', { fallbackOrder });
|
|
53
|
+
}
|