cli-jaw 2.0.6 → 2.0.13
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 +24 -11
- package/README.ko.md +24 -11
- package/README.md +95 -11
- package/README.zh-CN.md +24 -11
- package/dist/bin/cli-jaw.js +4 -1
- package/dist/bin/cli-jaw.js.map +1 -1
- package/dist/bin/commands/browser-web-ai.js +2 -2
- package/dist/bin/commands/browser-web-ai.js.map +1 -1
- package/dist/bin/commands/doctor.js +12 -2
- package/dist/bin/commands/doctor.js.map +1 -1
- package/dist/bin/commands/init.js +4 -2
- package/dist/bin/commands/init.js.map +1 -1
- package/dist/bin/commands/project.js +167 -0
- package/dist/bin/commands/project.js.map +1 -0
- package/dist/bin/commands/tui/types.js +20 -4
- package/dist/bin/commands/tui/types.js.map +1 -1
- package/dist/bin/postinstall.js +226 -24
- package/dist/bin/postinstall.js.map +1 -1
- package/dist/lib/mime-detect.js +5 -0
- package/dist/lib/mime-detect.js.map +1 -1
- package/dist/scripts/fresh-install-smoke.js +78 -6
- package/dist/scripts/fresh-install-smoke.js.map +1 -1
- package/dist/src/agent/agy-runtime.js +15 -0
- package/dist/src/agent/agy-runtime.js.map +1 -0
- package/dist/src/agent/args.js +44 -5
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/cli-helpers.js +1 -1
- package/dist/src/agent/cli-helpers.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +6 -3
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/session-persistence.js +1 -1
- package/dist/src/agent/session-persistence.js.map +1 -1
- package/dist/src/agent/smoke-detector.js +3 -0
- package/dist/src/agent/smoke-detector.js.map +1 -1
- package/dist/src/agent/spawn/resume.js +2 -0
- package/dist/src/agent/spawn/resume.js.map +1 -1
- package/dist/src/agent/spawn-env.js +6 -0
- package/dist/src/agent/spawn-env.js.map +1 -1
- package/dist/src/agent/spawn.js +120 -15
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/browser/web-ai/capability-observation-presets.js +1 -1
- package/dist/src/browser/web-ai/capability-observation-presets.js.map +1 -1
- package/dist/src/browser/web-ai/capability-registry.js +6 -5
- package/dist/src/browser/web-ai/capability-registry.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-attachments.js +7 -0
- package/dist/src/browser/web-ai/chatgpt-attachments.js.map +1 -1
- package/dist/src/browser/web-ai/context-pack/builder.js +19 -4
- package/dist/src/browser/web-ai/context-pack/builder.js.map +1 -1
- package/dist/src/browser/web-ai/context-pack/zip-writer.js +116 -0
- package/dist/src/browser/web-ai/context-pack/zip-writer.js.map +1 -0
- package/dist/src/browser/web-ai/gemini-live.js +21 -3
- package/dist/src/browser/web-ai/gemini-live.js.map +1 -1
- package/dist/src/browser/web-ai/gemini-model.js +26 -8
- package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
- package/dist/src/cli/commands.js +2 -0
- package/dist/src/cli/commands.js.map +1 -1
- package/dist/src/cli/handlers-project.js +55 -0
- package/dist/src/cli/handlers-project.js.map +1 -0
- package/dist/src/cli/readiness.js +6 -1
- package/dist/src/cli/readiness.js.map +1 -1
- package/dist/src/cli/registry.js +11 -0
- package/dist/src/cli/registry.js.map +1 -1
- package/dist/src/core/claude-install.js +10 -1
- package/dist/src/core/claude-install.js.map +1 -1
- package/dist/src/core/config.js +63 -7
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/db.js +11 -4
- package/dist/src/core/db.js.map +1 -1
- package/dist/src/core/runtime-settings.js +4 -1
- package/dist/src/core/runtime-settings.js.map +1 -1
- package/dist/src/manager/metadata.js +7 -2
- package/dist/src/manager/metadata.js.map +1 -1
- package/dist/src/manager/notes/routes.js +7 -0
- package/dist/src/manager/notes/routes.js.map +1 -1
- package/dist/src/manager/notes/store.js +72 -0
- package/dist/src/manager/notes/store.js.map +1 -1
- package/dist/src/manager/registry.js +1 -1
- package/dist/src/manager/registry.js.map +1 -1
- package/dist/src/manager/scan.js +2 -0
- package/dist/src/manager/scan.js.map +1 -1
- package/dist/src/messaging/send.js +1 -1
- package/dist/src/messaging/send.js.map +1 -1
- package/dist/src/orchestrator/distribute.js +25 -4
- package/dist/src/orchestrator/distribute.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +21 -5
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/state-machine.js +7 -1
- package/dist/src/orchestrator/state-machine.js.map +1 -1
- package/dist/src/orchestrator/workspace-context.js +49 -14
- package/dist/src/orchestrator/workspace-context.js.map +1 -1
- package/dist/src/routes/messaging.js +1 -1
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/orchestrate.js +11 -4
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/routes/settings.js +73 -8
- package/dist/src/routes/settings.js.map +1 -1
- package/dist/src/security/path-guards.js +35 -14
- package/dist/src/security/path-guards.js.map +1 -1
- package/dist/src/types/cli-engine.js +1 -0
- package/dist/src/types/cli-engine.js.map +1 -1
- package/package.json +19 -4
- package/public/css/chat.css +6 -2
- package/public/dist/assets/{AdvancedExport-CBvz4_IZ.js → AdvancedExport-CZEVPqHb.js} +1 -1
- package/public/dist/assets/{Agent-DlUqCMXJ.js → Agent-BBrJGd5m.js} +1 -1
- package/public/dist/assets/{Browser-66BpLQck.js → Browser-dBaU9G9D.js} +1 -1
- package/public/dist/assets/{ChannelsDiscord-BifT2Dum.js → ChannelsDiscord-CbmWms9-.js} +1 -1
- package/public/dist/assets/{ChannelsTelegram-CK6tYQ8k.js → ChannelsTelegram-BD4Eyztg.js} +1 -1
- package/public/dist/assets/{DashboardMeta-Cc03HT5R.js → DashboardMeta-LVAL7TtE.js} +1 -1
- package/public/dist/assets/{Display-arOjcMQZ.js → Display-CFm1UmEo.js} +1 -1
- package/public/dist/assets/{Employees-YbW-mI67.js → Employees-DcMChleU.js} +1 -1
- package/public/dist/assets/{Heartbeat-CW4eIhtJ.js → Heartbeat-BoobN35p.js} +1 -1
- package/public/dist/assets/{Mcp-ZQ6ARQb6.js → Mcp-9NU4YkKO.js} +1 -1
- package/public/dist/assets/{Memory-BAUWJMqc.js → Memory-uZT30fww.js} +1 -1
- package/public/dist/assets/{MilkdownWysiwygEditor-IAqFtXvM.js → MilkdownWysiwygEditor-Otw40DDF.js} +1 -1
- package/public/dist/assets/{ModelProvider-DUtmFh0J.js → ModelProvider-CsIOyoZP.js} +1 -1
- package/public/dist/assets/{Network-B_4E82zQ.js → Network-D7hGwnyG.js} +1 -1
- package/public/dist/assets/NotesGraphView-CJuk9lKn.js +1 -0
- package/public/dist/assets/Permissions-CcIBptg3.js +1 -0
- package/public/dist/assets/{Permissions-BkADXjQ4.js → Permissions-DwdU3wi8.js} +1 -1
- package/public/dist/assets/{Profile-BcnTCSYM.js → Profile-BNTKD_Ex.js} +1 -1
- package/public/dist/assets/{Prompts-CUs_RoRE.js → Prompts-D_mCfYiu.js} +1 -1
- package/public/dist/assets/{SpeechKeys-qxc-ROWN.js → SpeechKeys-BTXCM-Fs.js} +1 -1
- package/public/dist/assets/agent-meta-BC7mLqo6.js +1 -0
- package/public/dist/assets/{app-CGqTcIeF.js → app-C7MAcAMu.js} +5 -5
- package/public/dist/assets/app-CkFBKUf8.css +1 -0
- package/public/dist/assets/{architectureDiagram-3BPJPVTR-kYIVzmWe.js → architectureDiagram-3BPJPVTR-CJCPEsxo.js} +1 -1
- package/public/dist/assets/{blockDiagram-GPEHLZMM-B204CPhe.js → blockDiagram-GPEHLZMM-CO1bkn0E.js} +2 -2
- package/public/dist/assets/{c4Diagram-AAUBKEIU-DAv6TAjg.js → c4Diagram-AAUBKEIU-D2R36Xu6.js} +1 -1
- package/public/dist/assets/{chunk-3OPIFGDE-DOAvk9x8.js → chunk-3OPIFGDE-DixnEkZw.js} +1 -1
- package/public/dist/assets/chunk-55IACEB6-DhWWzzdj.js +1 -0
- package/public/dist/assets/{chunk-5ZQYHXKU-Bd-RFO5i.js → chunk-5ZQYHXKU-Bli4k6GI.js} +2 -2
- package/public/dist/assets/{chunk-727SXJPM-BrsRzj8z.js → chunk-727SXJPM-sp4W8bhf.js} +1 -1
- package/public/dist/assets/{chunk-AQP2D5EJ-Di6Gstk-.js → chunk-AQP2D5EJ-Co6ucdGq.js} +1 -1
- package/public/dist/assets/{chunk-KSCS5N6A-D9a4ZkOy.js → chunk-KSCS5N6A-Beq1s5eO.js} +2 -2
- package/public/dist/assets/{chunk-L5ZTLDWV-D208QbfC.js → chunk-L5ZTLDWV-DfUlBdXN.js} +1 -1
- package/public/dist/assets/{chunk-LZXEDZCA-CE2KFduj.js → chunk-LZXEDZCA-B_yP4UKw.js} +1 -1
- package/public/dist/assets/{chunk-ND2GUHAM-zZ7h1CPf.js → chunk-ND2GUHAM-3qbNb7I9.js} +1 -1
- package/public/dist/assets/{chunk-O5CBEL6O-BTuvXKFi.js → chunk-O5CBEL6O-D-jDqsN2.js} +1 -1
- package/public/dist/assets/{chunk-WU5MYG2G-C3fKlSvP.js → chunk-WU5MYG2G-DlBJtD7-.js} +1 -1
- package/public/dist/assets/classDiagram-4FO5ZUOK-DmPJvqRM.js +1 -0
- package/public/dist/assets/classDiagram-v2-Q7XG4LA2-ECmTUt7U.js +1 -0
- package/public/dist/assets/constants-BXWl7LTi.js +1 -0
- package/public/dist/assets/{cose-bilkent-S5V4N54A-D1zmarou.js → cose-bilkent-S5V4N54A-Bt9AAJCx.js} +1 -1
- package/public/dist/assets/{dagre-BM42HDAG-BVkBttzA.js → dagre-BM42HDAG-CXEA1wvZ.js} +1 -1
- package/public/dist/assets/{dagre-DnoxfNXr.js → dagre-Ve-IAfyz.js} +1 -1
- package/public/dist/assets/{diagram-2AECGRRQ-Bs32KPnT.js → diagram-2AECGRRQ-CCB0OKc2.js} +1 -1
- package/public/dist/assets/{diagram-5GNKFQAL-YDYgPOQj.js → diagram-5GNKFQAL-Cki9HABy.js} +1 -1
- package/public/dist/assets/{diagram-KO2AKTUF-1tIdFl26.js → diagram-KO2AKTUF-DNBDjE2o.js} +1 -1
- package/public/dist/assets/{diagram-LMA3HP47-B1y15kav.js → diagram-LMA3HP47-Cy23RDPa.js} +1 -1
- package/public/dist/assets/{diagram-OG6HWLK6-C25j1jGg.js → diagram-OG6HWLK6-CT_YF8cA.js} +1 -1
- package/public/dist/assets/dist-3R3GxjCf.js +13 -0
- package/public/dist/assets/{dist-D0PYXGt2.js → dist-BLd7xdyq.js} +1 -1
- package/public/dist/assets/{dist-fJAyK82z.js → dist-BaRrwDy3.js} +1 -1
- package/public/dist/assets/{dist-Rs_Khtjb.js → dist-Bbsp4OF7.js} +1 -1
- package/public/dist/assets/{dist-Cv8S3FhF.js → dist-BkBGlG70.js} +1 -1
- package/public/dist/assets/{dist-0v1UKkQ3.js → dist-BkJ_1mj9.js} +1 -1
- package/public/dist/assets/{dist-BQNQk-1M.js → dist-BxCRVW5D.js} +1 -1
- package/public/dist/assets/{dist-DDDFJ8jG.js → dist-C-v7Rm67.js} +1 -1
- package/public/dist/assets/dist-CNgDEAy8.js +1 -0
- package/public/dist/assets/dist-CO_W5rr2.js +1 -0
- package/public/dist/assets/{dist-vQskrHxt.js → dist-ChAUfTbO.js} +1 -1
- package/public/dist/assets/{dist-CjPin7Mr.js → dist-D-k-lzQT.js} +1 -1
- package/public/dist/assets/dist-D1hPukqY.js +1 -0
- package/public/dist/assets/{dist-C1VqWrYZ.js → dist-D5Qx-jQQ.js} +1 -1
- package/public/dist/assets/{dist-DTQW91xt.js → dist-D7VNzYBv.js} +1 -1
- package/public/dist/assets/{dist-DHQI31dn.js → dist-DAxnodoa.js} +1 -1
- package/public/dist/assets/{dist-CnIrGAPx.js → dist-DHSyODkR.js} +1 -1
- package/public/dist/assets/{dist-CE4s7vg82.js → dist-DaYTPjbb2.js} +1 -1
- package/public/dist/assets/{dist-jcptfm_T.js → dist-DlWi9tVO.js} +1 -1
- package/public/dist/assets/{dist-D66X8iAn.js → dist-DuuoJfRB.js} +1 -1
- package/public/dist/assets/{dist-DzT7frM2.js → dist-Dv36UUXz.js} +1 -1
- package/public/dist/assets/{dist-BVpa_e6W.js → dist-F4CVhitP.js} +1 -1
- package/public/dist/assets/{dist-Qs7HHNCC.js → dist-LHbJYy3N.js} +1 -1
- package/public/dist/assets/{dist-Ck6PnIlo.js → dist-VIlx7JdU.js} +1 -1
- package/public/dist/assets/{dist-D5GUqT-6.js → dist-cgDt2PmY.js} +1 -1
- package/public/dist/assets/dist-eW2LjRIK.js +1 -0
- package/public/dist/assets/{dist-Dm7RAaUo.js → dist-vGn3_sWA.js} +1 -1
- package/public/dist/assets/{employees-DRmX2RDd.js → employees-BmxY8Mw3.js} +1 -1
- package/public/dist/assets/{erDiagram-TEJ5UH35-CRvCbztR.js → erDiagram-TEJ5UH35-Cq7oHdXg.js} +1 -1
- package/public/dist/assets/{flowDiagram-I6XJVG4X-CzvVnib_.js → flowDiagram-I6XJVG4X-D8CdEnfM.js} +1 -1
- package/public/dist/assets/ganttDiagram-6RSMTGT7-B1rzKXi_.js +292 -0
- package/public/dist/assets/{gitGraphDiagram-PVQCEYII-CbKdM7nW.js → gitGraphDiagram-PVQCEYII-CqLh-joi.js} +1 -1
- package/public/dist/assets/{graphlib-BLOO0H5r.js → graphlib-W5bESv3F.js} +1 -1
- package/public/dist/assets/{infoDiagram-5YYISTIA-BrZmg1At.js → infoDiagram-5YYISTIA-C1zVxumj.js} +1 -1
- package/public/dist/assets/{ishikawaDiagram-YF4QCWOH-BDWXqJi5.js → ishikawaDiagram-YF4QCWOH-x-9J6xPM.js} +1 -1
- package/public/dist/assets/{journeyDiagram-JHISSGLW-CPFRd_M3.js → journeyDiagram-JHISSGLW-BDYzHrtn.js} +1 -1
- package/public/dist/assets/{kanban-definition-UN3LZRKU-BcQbBplS.js → kanban-definition-UN3LZRKU-BJ-06i6Z.js} +1 -1
- package/public/dist/assets/manager-B2NWzG7j.css +1 -0
- package/public/dist/assets/manager-C5e1IxEN.js +25 -0
- package/public/dist/assets/memory-BqqibBIE.js +1 -0
- package/public/dist/assets/{memory-BA-ki3gn.js → memory-CRL72HB-.js} +1 -1
- package/public/dist/assets/mermaid-loader-Dqb4ZUz6.js +1 -0
- package/public/dist/assets/{mermaid.core-ArqR5iFa.js → mermaid.core-D8VnfThU.js} +2 -2
- package/public/dist/assets/mermaid.core-DYHvk6Pd.js +1 -0
- package/public/dist/assets/{mindmap-definition-RKZ34NQL-C35cGkNU.js → mindmap-definition-RKZ34NQL-D8NDuIhn.js} +1 -1
- package/public/dist/assets/{pieDiagram-4H26LBE5-B8C_hoqJ.js → pieDiagram-4H26LBE5-CpBePil_.js} +3 -3
- package/public/dist/assets/{quadrantDiagram-W4KKPZXB-BEPrine5.js → quadrantDiagram-W4KKPZXB-C1WWpn88.js} +1 -1
- package/public/dist/assets/{render-C7_e0J_X.js → render-o_YEiCEO.js} +2 -2
- package/public/dist/assets/{requirementDiagram-4Y6WPE33-ClDDon9c.js → requirementDiagram-4Y6WPE33-C_D5VbNk.js} +1 -1
- package/public/dist/assets/{sankeyDiagram-5OEKKPKP-Bjs3OE-1.js → sankeyDiagram-5OEKKPKP--RH3Es8R.js} +3 -3
- package/public/dist/assets/{sequenceDiagram-3UESZ5HK-BM8IAaEe.js → sequenceDiagram-3UESZ5HK-CVI4AjhN.js} +1 -1
- package/public/dist/assets/settings-B0RlyAkI.js +1 -0
- package/public/dist/assets/settings-CCXRL5Ar.js +46 -0
- package/public/dist/assets/sidebar-DRJffqO1.js +14 -0
- package/public/dist/assets/skills-CFdzXbtK.js +1 -0
- package/public/dist/assets/{skills-Dq7fD8I3.js → skills-DbRVI-zf.js} +1 -1
- package/public/dist/assets/slash-commands-BUM6u-Ex.js +1 -0
- package/public/dist/assets/{slash-commands-DRsKtuGT.js → slash-commands-C2YBMaQV.js} +1 -1
- package/public/dist/assets/{stateDiagram-AJRCARHV-BvNABuXE.js → stateDiagram-AJRCARHV-4bx1rPZ3.js} +1 -1
- package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CrfGPzHb.js +1 -0
- package/public/dist/assets/{timeline-definition-PNZ67QCA-CIvTvac3.js → timeline-definition-PNZ67QCA-DeQoGRE2.js} +1 -1
- package/public/dist/assets/{trace-drawer-DDFdU07_.js → trace-drawer-CIVBXyRH.js} +1 -1
- package/public/dist/assets/ui-C3ArwMhv.js +140 -0
- package/public/dist/assets/ui-CboUuc_E.js +1 -0
- package/public/dist/assets/vendor-utils-rVejrfMR.js +1 -0
- package/public/dist/assets/{vennDiagram-CIIHVFJN-C5cbS2KC.js → vennDiagram-CIIHVFJN-CejyJK0L.js} +1 -1
- package/public/dist/assets/{wardleyDiagram-YWT4CUSO-BsRBBGFP.js → wardleyDiagram-YWT4CUSO-DqXV0sa1.js} +1 -1
- package/public/dist/assets/wiki-link-suggestions-e5BzJAZH.js +23 -0
- package/public/dist/assets/{xychartDiagram-2RQKCTM6-B6rqui6F.js → xychartDiagram-2RQKCTM6-CWLoVl2b.js} +2 -2
- package/public/dist/index.html +20 -2
- package/public/dist/manager/index.html +2 -2
- package/public/index.html +18 -0
- package/public/js/constants.ts +12 -1
- package/public/js/features/settings-cli-status.ts +27 -4
- package/public/js/features/settings-core.ts +28 -15
- package/public/js/features/settings-types.ts +1 -0
- package/public/js/features/ui-status.ts +3 -0
- package/public/js/ws.ts +5 -1
- package/public/manager/src/SidebarRailRouter.tsx +5 -2
- package/public/manager/src/api.ts +13 -0
- package/public/manager/src/components/WorkbenchHeader.tsx +10 -0
- package/public/manager/src/manager-notes.css +228 -0
- package/public/manager/src/notes/NotesBacklinksPanel.tsx +91 -0
- package/public/manager/src/notes/NotesCommandPalette.tsx +212 -0
- package/public/manager/src/notes/NotesGraphView.tsx +145 -0
- package/public/manager/src/notes/NotesSidebar.tsx +183 -5
- package/public/manager/src/notes/NotesToolbar.tsx +9 -3
- package/public/manager/src/notes/NotesWorkspace.tsx +140 -4
- package/public/manager/src/notes/notes-api.ts +2 -0
- package/public/manager/src/notes/notes-command-registry.tsx +79 -0
- package/public/manager/src/notes/notes-quick-switcher.css +151 -0
- package/public/manager/src/notes/notes-shortcuts.ts +23 -0
- package/public/manager/src/notes/notes-types.ts +1 -1
- package/public/manager/src/notes/template-engine.ts +27 -0
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +7 -1
- package/public/manager/src/types.ts +2 -1
- package/scripts/audit-fresh-install-evidence.mjs +278 -0
- package/scripts/collect-fresh-install-evidence.sh +459 -0
- package/scripts/fresh-install-smoke.ts +85 -6
- package/scripts/install-officecli.ps1 +14 -1
- package/scripts/install-risk-gate.mjs +161 -0
- package/scripts/install-wsl.sh +78 -16
- package/scripts/install.sh +272 -72
- package/scripts/postinstall-guard.cjs +2 -2
- package/scripts/release-preview.sh +25 -3
- package/scripts/release.sh +37 -8
- package/scripts/require-release-evidence.mjs +236 -0
- package/scripts/verify-fresh-install.sh +120 -0
- package/scripts/verify-release-evidence.mjs +158 -0
- package/public/dist/assets/Permissions-DvUCB8wA.js +0 -1
- package/public/dist/assets/agent-meta-Du8y6mSM.js +0 -1
- package/public/dist/assets/app-Dpk6cE6C.css +0 -1
- package/public/dist/assets/chunk-55IACEB6-Dx2JkQLw.js +0 -1
- package/public/dist/assets/classDiagram-4FO5ZUOK-Cb-qL5u3.js +0 -1
- package/public/dist/assets/classDiagram-v2-Q7XG4LA2-BPhGdj15.js +0 -1
- package/public/dist/assets/constants-BxG09J6S.js +0 -1
- package/public/dist/assets/dist-BMi_buEb.js +0 -1
- package/public/dist/assets/dist-BkrbW_LS.js +0 -1
- package/public/dist/assets/dist-C3vh7d65.js +0 -13
- package/public/dist/assets/dist-D815C1Fv.js +0 -1
- package/public/dist/assets/dist-sOV2kBhQ.js +0 -1
- package/public/dist/assets/ganttDiagram-6RSMTGT7-BbUYP6iv.js +0 -292
- package/public/dist/assets/manager-B5OmizBL.css +0 -1
- package/public/dist/assets/manager-Cs3eMBcx.js +0 -25
- package/public/dist/assets/memory-DLQbyBA3.js +0 -1
- package/public/dist/assets/mermaid-loader-BVPsKrpr.js +0 -1
- package/public/dist/assets/mermaid.core-BAwu4U2Y.js +0 -1
- package/public/dist/assets/settings-DjyKdqev.js +0 -1
- package/public/dist/assets/settings-pUJzyeX2.js +0 -42
- package/public/dist/assets/sidebar-CO9Qjj6v.js +0 -14
- package/public/dist/assets/skills-CX3qJ77s.js +0 -1
- package/public/dist/assets/slash-commands-UbS8w9ij.js +0 -1
- package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CCIo81qy.js +0 -1
- package/public/dist/assets/ui-CeBmBBZM.js +0 -140
- package/public/dist/assets/ui-TMXjvH0r.js +0 -1
- package/public/dist/assets/vendor-utils-BnxL60_-.js +0 -1
- package/public/dist/assets/wiki-link-suggestions-BHwNQXT_.js +0 -23
- /package/public/dist/assets/{HealthBadge-DEPFkcA0.js → HealthBadge-CfLTPTPW.js} +0 -0
- /package/public/dist/assets/{InlineWarn-DoJS7AgM.js → InlineWarn-C7ISyzDI.js} +0 -0
- /package/public/dist/assets/{fields-DUawAHWZ.js → fields-BwD_NGxe.js} +0 -0
- /package/public/dist/assets/{locale-BHMJIzyw.js → locale-DT1WRaeJ.js} +0 -0
- /package/public/dist/assets/{page-shell-CVAobxbP.js → page-shell-uNOxwdbr.js} +0 -0
- /package/public/dist/assets/{path-utils-r2bJIu28.js → path-utils-h2GAj3hH.js} +0 -0
- /package/public/dist/assets/{provider-icons-dxT69zGg.js → provider-icons-ClVd2suJ.js} +0 -0
package/public/index.html
CHANGED
|
@@ -270,6 +270,7 @@
|
|
|
270
270
|
<option value="ai-e">AI-E</option>
|
|
271
271
|
<option value="claude">Claude</option>
|
|
272
272
|
<option value="claude-e">Claude E</option>
|
|
273
|
+
<option value="agy">Antigravity</option>
|
|
273
274
|
<option value="codex">Codex</option>
|
|
274
275
|
<option value="codex-app">Codex App</option>
|
|
275
276
|
<option value="gemini">Gemini</option>
|
|
@@ -341,6 +342,7 @@
|
|
|
341
342
|
<option value="ai-e">AI-E</option>
|
|
342
343
|
<option value="claude">Claude</option>
|
|
343
344
|
<option value="claude-e">Claude E</option>
|
|
345
|
+
<option value="agy">Antigravity</option>
|
|
344
346
|
<option value="codex">Codex</option>
|
|
345
347
|
<option value="codex-app">Codex App</option>
|
|
346
348
|
<option value="gemini">Gemini</option>
|
|
@@ -578,6 +580,22 @@
|
|
|
578
580
|
</div>
|
|
579
581
|
</div>
|
|
580
582
|
|
|
583
|
+
<div class="settings-group">
|
|
584
|
+
<h4><span data-provider="agy"></span> Antigravity</h4>
|
|
585
|
+
<div class="settings-row">
|
|
586
|
+
<label>Model</label>
|
|
587
|
+
<select id="modelAgy"></select>
|
|
588
|
+
<input type="text" id="customModelAgy" class="custom-model-input"
|
|
589
|
+
data-i18n-placeholder="model.placeholder" placeholder="model ID 입력" style="display:none">
|
|
590
|
+
</div>
|
|
591
|
+
<div class="settings-row sub-row">
|
|
592
|
+
<label>Effort</label>
|
|
593
|
+
<select id="effortAgy">
|
|
594
|
+
<option value="" selected>— none</option>
|
|
595
|
+
</select>
|
|
596
|
+
</div>
|
|
597
|
+
</div>
|
|
598
|
+
|
|
581
599
|
<div class="settings-group">
|
|
582
600
|
<h4><span data-provider="codex"></span> Codex</h4>
|
|
583
601
|
<div class="settings-row">
|
package/public/js/constants.ts
CHANGED
|
@@ -10,11 +10,19 @@ export interface CliEntry {
|
|
|
10
10
|
modelsByProvider?: Record<string, string[]>;
|
|
11
11
|
effortsByProvider?: Record<string, string[]>;
|
|
12
12
|
effortNote?: string;
|
|
13
|
+
modelNote?: string;
|
|
13
14
|
}
|
|
14
15
|
|
|
15
16
|
export type CliRegistry = Record<string, CliEntry>;
|
|
16
17
|
|
|
17
18
|
const FALLBACK_CLI_REGISTRY: CliRegistry = {
|
|
19
|
+
agy: {
|
|
20
|
+
label: 'Antigravity',
|
|
21
|
+
efforts: [],
|
|
22
|
+
effortNote: 'Change at TUI',
|
|
23
|
+
modelNote: 'Change at TUI',
|
|
24
|
+
models: [],
|
|
25
|
+
},
|
|
18
26
|
'ai-e': {
|
|
19
27
|
label: 'AI-E',
|
|
20
28
|
defaultProvider: 'claude',
|
|
@@ -152,6 +160,9 @@ function normalizeRegistry(input: Record<string, unknown>): CliRegistry {
|
|
|
152
160
|
if (typeof v['effortNote'] === 'string' && v['effortNote'].trim()) {
|
|
153
161
|
normalized['effortNote'] = v['effortNote'];
|
|
154
162
|
}
|
|
163
|
+
if (typeof v['modelNote'] === 'string' && v['modelNote'].trim()) {
|
|
164
|
+
normalized['modelNote'] = v['modelNote'];
|
|
165
|
+
}
|
|
155
166
|
if (typeof v['defaultProvider'] === 'string') normalized.defaultProvider = v['defaultProvider'];
|
|
156
167
|
if (Array.isArray(v['providers'])) normalized.providers = [...v['providers']] as string[];
|
|
157
168
|
if (v['modelsByProvider'] && typeof v['modelsByProvider'] === 'object') {
|
|
@@ -205,7 +216,7 @@ export function getCliMeta(cli: string): CliEntry | null {
|
|
|
205
216
|
return CLI_REGISTRY[cli] || null;
|
|
206
217
|
}
|
|
207
218
|
|
|
208
|
-
export const PRIMARY_CLIS: readonly string[] = ['claude', 'codex', 'gemini'];
|
|
219
|
+
export const PRIMARY_CLIS: readonly string[] = ['claude', 'claude-e', 'agy', 'codex', 'gemini'];
|
|
209
220
|
|
|
210
221
|
export interface RolePreset {
|
|
211
222
|
value: string;
|
|
@@ -10,6 +10,11 @@ import type { QuotaEntry } from './settings-types.js';
|
|
|
10
10
|
const CLI_STATUS_INTERVAL_VALUES = new Set([0, 600, 1800]);
|
|
11
11
|
const DEFAULT_CLI_STATUS_INTERVAL_SEC = 0;
|
|
12
12
|
|
|
13
|
+
const QUOTA_HIDDEN_CLIS = new Set(['ai-e', 'codex-app']);
|
|
14
|
+
const QUOTA_CUSTOM_MSG: Record<string, string> = {
|
|
15
|
+
claude: 'Currently subscribed, by June with credit',
|
|
16
|
+
};
|
|
17
|
+
|
|
13
18
|
let cliStatusTimer: number | null = null;
|
|
14
19
|
|
|
15
20
|
const CLI_STATUS_COLLAPSED_KEY = 'cliStatusCollapsed';
|
|
@@ -118,6 +123,14 @@ export function normalizeQuotaWindowLabel(cliName: string, label: string): strin
|
|
|
118
123
|
.replace(' Opus', '');
|
|
119
124
|
}
|
|
120
125
|
|
|
126
|
+
function describeStatusOnlyQuota(cliName: string, q: QuotaEntry): string {
|
|
127
|
+
if (q.delegatedProvider) return `Delegates quota/status to ${q.delegatedProvider}`;
|
|
128
|
+
const match = q.quotaSource?.match(/^not-exposed-by-(.*?)-cli$/);
|
|
129
|
+
if (match) return `Quota not exposed by ${match[1].toUpperCase()} CLI`;
|
|
130
|
+
if (q.quotaSource) return q.quotaSource;
|
|
131
|
+
return cliName === 'opencode' ? 'Auth/status only' : 'Usage data not exposed by this CLI';
|
|
132
|
+
}
|
|
133
|
+
|
|
121
134
|
export async function loadCliStatus(force = false): Promise<void> {
|
|
122
135
|
if (!cliStatusExpanded && !force) return;
|
|
123
136
|
|
|
@@ -145,13 +158,14 @@ function renderCliStatus(data: { cliStatus: Record<string, { available: boolean
|
|
|
145
158
|
const el = document.getElementById('cliStatusList');
|
|
146
159
|
|
|
147
160
|
const AUTH_HINTS: Record<string, { install: string; auth: string }> = {
|
|
161
|
+
agy: { install: 'curl -fsSL https://antigravity.google/cli/install.sh | bash', auth: 'agy auth is checked by the CLI at run time' },
|
|
148
162
|
'ai-e': { install: 'Install AI-E helper', auth: 'delegates to selected AI-E provider' },
|
|
149
163
|
claude: { install: 'npm i -g @anthropic-ai/claude-code', auth: 'claude auth' },
|
|
150
164
|
'claude-e': { install: 'Install claude-e helper', auth: 'claude auth' },
|
|
151
165
|
codex: { install: 'npm i -g @openai/codex', auth: 'codex login' },
|
|
152
166
|
'codex-app': { install: 'npm i -g @openai/codex', auth: 'codex login' },
|
|
153
167
|
gemini: { install: 'npm i -g @google/gemini-cli', auth: `gemini (${t('cli.gemini.auth')})` },
|
|
154
|
-
grok: { install: '
|
|
168
|
+
grok: { install: 'curl -fsSL https://x.ai/cli/install.sh | bash', auth: 'grok login --oauth' },
|
|
155
169
|
opencode: { install: 'npm i -g opencode-ai', auth: 'opencode auth' },
|
|
156
170
|
copilot: { install: 'npm i -g copilot', auth: t('cli.copilot.authHint') },
|
|
157
171
|
};
|
|
@@ -204,7 +218,16 @@ function renderCliStatus(data: { cliStatus: Record<string, { available: boolean
|
|
|
204
218
|
}
|
|
205
219
|
|
|
206
220
|
let windowsHtml = '';
|
|
207
|
-
|
|
221
|
+
const customQuotaMsg = QUOTA_CUSTOM_MSG[name];
|
|
222
|
+
if (QUOTA_HIDDEN_CLIS.has(name)) {
|
|
223
|
+
// no quota display for this CLI
|
|
224
|
+
} else if (customQuotaMsg && info.available) {
|
|
225
|
+
windowsHtml = `
|
|
226
|
+
<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">
|
|
227
|
+
${escapeHtml(customQuotaMsg)}
|
|
228
|
+
</div>
|
|
229
|
+
`;
|
|
230
|
+
} else if (q?.quotaCapable === false && q.authenticated !== false && info.available) {
|
|
208
231
|
const usage = q.sessionUsage;
|
|
209
232
|
const contextLine = usage?.contextTokensUsed && usage?.contextWindowTokens
|
|
210
233
|
? `Session context: ${Math.round(usage.contextTokensUsed).toLocaleString()} / ${Math.round(usage.contextWindowTokens).toLocaleString()} tokens`
|
|
@@ -212,12 +235,12 @@ function renderCliStatus(data: { cliStatus: Record<string, { available: boolean
|
|
|
212
235
|
? `Session turns: ${Math.round(usage.turnCount).toLocaleString()}`
|
|
213
236
|
: '';
|
|
214
237
|
const modelLine = usage?.primaryModelId ? `Model: ${usage.primaryModelId}` : '';
|
|
215
|
-
const detail = [modelLine, contextLine, q
|
|
238
|
+
const detail = [modelLine, contextLine, describeStatusOnlyQuota(name, q)]
|
|
216
239
|
.filter(Boolean)
|
|
217
240
|
.join(' · ');
|
|
218
241
|
windowsHtml = `
|
|
219
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">
|
|
220
|
-
<div style="color:var(--text);font-weight:600">${escapeHtml(q.displayTier ||
|
|
243
|
+
<div style="color:var(--text);font-weight:600">${escapeHtml(q.displayTier || providerLabel(name))}</div>
|
|
221
244
|
<div style="margin-top:2px">${escapeHtml(detail || 'Auth/status only')}</div>
|
|
222
245
|
</div>
|
|
223
246
|
`;
|
|
@@ -137,15 +137,22 @@ function syncPerCliModelAndEffortControls(settings: SettingsData | null = null):
|
|
|
137
137
|
const aiEProvider = cli === 'ai-e' ? getSelectedAiEProvider() : '';
|
|
138
138
|
const modelSel = getModelSelect(cli);
|
|
139
139
|
if (modelSel) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
140
|
+
if (meta?.modelNote) {
|
|
141
|
+
modelSel.innerHTML = `<option value="">${escapeHtml(meta.modelNote)}</option>`;
|
|
142
|
+
modelSel.title = meta.modelNote;
|
|
143
|
+
modelSel.disabled = true;
|
|
144
|
+
} else {
|
|
145
|
+
const raw = settings?.perCli?.[cli]?.model || modelSel.value || '';
|
|
146
|
+
const selected = normalizeModelForDisplay(cli, raw);
|
|
147
|
+
const models = cli === 'ai-e'
|
|
148
|
+
? (meta?.modelsByProvider?.[aiEProvider] || MODEL_MAP[cli] || [])
|
|
149
|
+
: (MODEL_MAP[cli] || []);
|
|
150
|
+
setSelectOptions(modelSel, models, { includeCustom: true, selected });
|
|
151
|
+
if (selected && !Array.from(modelSel.options).some(o => o.value === selected)) {
|
|
152
|
+
appendCustomOption(modelSel, selected);
|
|
153
|
+
modelSel.value = selected;
|
|
154
|
+
}
|
|
155
|
+
modelSel.disabled = false;
|
|
149
156
|
}
|
|
150
157
|
}
|
|
151
158
|
|
|
@@ -313,16 +320,16 @@ export async function loadSettings(): Promise<void> {
|
|
|
313
320
|
}
|
|
314
321
|
|
|
315
322
|
export async function updateSettings(): Promise<void> {
|
|
316
|
-
const
|
|
317
|
-
|
|
318
|
-
};
|
|
323
|
+
const cli = (document.getElementById('selCli') as HTMLSelectElement)?.value || 'claude';
|
|
324
|
+
const s: Record<string, unknown> = { cli };
|
|
325
|
+
if (cli === 'ai-e') s['perCli'] = { 'ai-e': { provider: getSelectedAiEProvider() } };
|
|
319
326
|
return trackSettingsSave((async () => {
|
|
320
327
|
const result = await apiJson<SettingsData>('/api/settings', 'PUT', s);
|
|
321
328
|
if (!result) {
|
|
322
329
|
await loadSettings();
|
|
323
330
|
return;
|
|
324
331
|
}
|
|
325
|
-
const confirmedCli = result.cli ||
|
|
332
|
+
const confirmedCli = result.cli || cli;
|
|
326
333
|
const selCli = document.getElementById('selCli') as HTMLSelectElement | null;
|
|
327
334
|
if (selCli && Array.from(selCli.options).some(o => o.value === confirmedCli)) {
|
|
328
335
|
selCli.value = confirmedCli;
|
|
@@ -435,7 +442,14 @@ export function onCliChange(save = true): void {
|
|
|
435
442
|
? (meta?.modelsByProvider?.[aiEProvider] || MODEL_MAP[cli] || [])
|
|
436
443
|
: (MODEL_MAP[cli] || []);
|
|
437
444
|
const modelSel = document.getElementById('selModel') as HTMLSelectElement | null;
|
|
438
|
-
|
|
445
|
+
if (meta?.modelNote && modelSel) {
|
|
446
|
+
modelSel.innerHTML = `<option value="">${escapeHtml(meta.modelNote)}</option>`;
|
|
447
|
+
modelSel.title = meta.modelNote;
|
|
448
|
+
modelSel.disabled = true;
|
|
449
|
+
} else {
|
|
450
|
+
setSelectOptions(modelSel, models, { includeCustom: true, includeDefault: true });
|
|
451
|
+
if (modelSel) { modelSel.disabled = false; modelSel.title = ''; }
|
|
452
|
+
}
|
|
439
453
|
setHeaderCli(cli);
|
|
440
454
|
syncActiveEffortOptions(cli);
|
|
441
455
|
|
|
@@ -470,7 +484,6 @@ export function onCliChange(save = true): void {
|
|
|
470
484
|
if (!s) return;
|
|
471
485
|
const ao = s.activeOverrides?.[cli] || {};
|
|
472
486
|
const pc = s.perCli?.[cli] || {};
|
|
473
|
-
if (cli === 'ai-e') syncAiEProviderControl(s, cli);
|
|
474
487
|
const model = ao.model || pc.model;
|
|
475
488
|
const effort = ao.effort || pc.effort || '';
|
|
476
489
|
if (model && modelSel) {
|
|
@@ -8,15 +8,18 @@ import type { MessageItem } from './process-log-adapter.js';
|
|
|
8
8
|
export function setStatus(s: string): void {
|
|
9
9
|
const badge = document.getElementById('statusBadge');
|
|
10
10
|
const btn = document.getElementById('btnSend');
|
|
11
|
+
const label = document.getElementById('typingIndicator')?.querySelector('.label') as HTMLElement | null;
|
|
11
12
|
state.agentBusy = s === 'running';
|
|
12
13
|
document.getElementById('typingIndicator')?.classList.toggle('active', state.agentBusy);
|
|
13
14
|
if (s === 'running') {
|
|
14
15
|
if (badge) { badge.className = 'status-badge status-running'; badge.textContent = 'running'; }
|
|
15
16
|
if (btn) { btn.innerHTML = ICONS.stop; btn.title = t('btn.stop'); btn.classList.add('stop-mode'); }
|
|
17
|
+
if (label) label.textContent = t('status.responding');
|
|
16
18
|
showSkeleton();
|
|
17
19
|
} else {
|
|
18
20
|
if (badge) { badge.className = 'status-badge status-idle'; badge.textContent = 'idle'; }
|
|
19
21
|
if (btn) { btn.innerHTML = ICONS.send; btn.title = 'Send'; btn.classList.remove('stop-mode'); }
|
|
22
|
+
if (label) label.textContent = t('status.responding');
|
|
20
23
|
removeSkeleton();
|
|
21
24
|
}
|
|
22
25
|
}
|
package/public/js/ws.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ── WebSocket Connection ──
|
|
2
2
|
import { state } from './state.js';
|
|
3
3
|
import { API_BASE } from './api.js';
|
|
4
|
-
import { setStatus, updateQueueBadge, addSystemMsg, appendAgentText, finalizeAgent, addMessage, showProcessStep, cleanupToolActivity, applyQueuedOverlay, hydrateActiveRun, reconcileChatBottomAfterRestore, showChatRestoreIndicator } from './ui.js';
|
|
4
|
+
import { setStatus, updateQueueBadge, addSystemMsg, appendAgentText, finalizeAgent, addMessage, showProcessStep, cleanupToolActivity, showLiveToolActivity, applyQueuedOverlay, hydrateActiveRun, reconcileChatBottomAfterRestore, showChatRestoreIndicator } from './ui.js';
|
|
5
5
|
import { renderPendingQueue } from './features/pending-queue.js';
|
|
6
6
|
import { t, getLang } from './features/i18n.js';
|
|
7
7
|
import { getVirtualScroll } from './virtual-scroll.js';
|
|
@@ -10,6 +10,7 @@ import { escapeHtml, cancelPostRender } from './render.js';
|
|
|
10
10
|
import type { HeartbeatRuntimeState, OrcStateName, ResolvedSelectionState } from './state.js';
|
|
11
11
|
import { notifyUnreadResponse } from './features/attention-badge.js';
|
|
12
12
|
import { shouldApplyOrcStateEvent } from './features/orchestrate-scope.js';
|
|
13
|
+
import { providerLabel } from './provider-icons.js';
|
|
13
14
|
|
|
14
15
|
const ROADMAP_PHASES = ['P', 'A', 'B', 'C'] as const;
|
|
15
16
|
|
|
@@ -112,6 +113,7 @@ async function refreshRuntimeSnapshot(options: { hydrateRun?: boolean } = {}): P
|
|
|
112
113
|
renderPendingQueue(snap.queued || []);
|
|
113
114
|
if (options.hydrateRun) hydrateActiveRun(snap.activeRun);
|
|
114
115
|
setStatus(snap.runtime.busy ? 'running' : 'idle');
|
|
116
|
+
if (snap.runtime.busy && snap.activeRun?.cli === 'agy') showLiveToolActivity(`${providerLabel(snap.activeRun.cli)} working...`);
|
|
115
117
|
import('./features/employees.js').then(m => {
|
|
116
118
|
if (typeof m.renderEmployees === 'function') m.renderEmployees();
|
|
117
119
|
});
|
|
@@ -356,8 +358,10 @@ export function connect(): void {
|
|
|
356
358
|
if (msg.type === 'agent_status') {
|
|
357
359
|
if (msg.running !== undefined) {
|
|
358
360
|
setStatus(msg.running ? 'running' : 'idle');
|
|
361
|
+
if (msg.running && msg.cli === 'agy') showLiveToolActivity(`${providerLabel(msg.cli)} working...`);
|
|
359
362
|
} else {
|
|
360
363
|
setStatus(msg.status || 'idle');
|
|
364
|
+
if (msg.status === 'running' && msg.cli === 'agy') showLiveToolActivity(`${providerLabel(msg.cli)} working...`);
|
|
361
365
|
}
|
|
362
366
|
// Track per-agent phase for badge rendering
|
|
363
367
|
if (msg.agentId && msg.phase) {
|
|
@@ -20,6 +20,8 @@ import { DashboardRemindersSidebar, type RemindersView } from './dashboard-remin
|
|
|
20
20
|
import { DashboardRemindersWorkspace } from './dashboard-reminders/DashboardRemindersWorkspace';
|
|
21
21
|
import { useRemindersFeed } from './dashboard-reminders/useRemindersFeed';
|
|
22
22
|
import type { HelpTopicId } from './help/helpContent';
|
|
23
|
+
import { NotesCommandPalette } from './notes/NotesCommandPalette';
|
|
24
|
+
import { NotesCommandProvider } from './notes/notes-command-registry';
|
|
23
25
|
import type { NotesModelState } from './notes/useNotesModel';
|
|
24
26
|
import type {
|
|
25
27
|
DashboardDetailTab,
|
|
@@ -126,7 +128,7 @@ export function SidebarRailRouter(props: Props) {
|
|
|
126
128
|
);
|
|
127
129
|
|
|
128
130
|
return (
|
|
129
|
-
|
|
131
|
+
<NotesCommandProvider>
|
|
130
132
|
{props.jawCeoVoiceOverlay}
|
|
131
133
|
<WorkspaceLayout
|
|
132
134
|
sidebarCollapsed={props.sidebarCollapsed}
|
|
@@ -168,6 +170,7 @@ export function SidebarRailRouter(props: Props) {
|
|
|
168
170
|
)}
|
|
169
171
|
workbench={(
|
|
170
172
|
<div className="workspace-surface-stack">
|
|
173
|
+
<NotesCommandPalette active={props.sidebarMode === 'notes'} />
|
|
171
174
|
{props.lifecycleMessage && (
|
|
172
175
|
<section className="state lifecycle-state" role="status">
|
|
173
176
|
<span>{props.lifecycleMessage}</span>
|
|
@@ -224,6 +227,6 @@ export function SidebarRailRouter(props: Props) {
|
|
|
224
227
|
</InstanceDrawer>
|
|
225
228
|
)}
|
|
226
229
|
/>
|
|
227
|
-
|
|
230
|
+
</NotesCommandProvider>
|
|
228
231
|
);
|
|
229
232
|
}
|
|
@@ -163,6 +163,19 @@ export async function fetchNotesTree(): Promise<DashboardNoteTreeEntry[]> {
|
|
|
163
163
|
return await parseNotesResponse<DashboardNoteTreeEntry[]>(response, `notes tree fetch failed: ${response.status}`);
|
|
164
164
|
}
|
|
165
165
|
|
|
166
|
+
export type NoteTemplate = { name: string; path: string };
|
|
167
|
+
export type NoteTemplateContent = { name: string; path: string; content: string };
|
|
168
|
+
|
|
169
|
+
export async function fetchNoteTemplates(): Promise<NoteTemplate[]> {
|
|
170
|
+
const response = await fetch('/api/dashboard/notes/templates');
|
|
171
|
+
return await parseNotesResponse<NoteTemplate[]>(response, `note templates fetch failed: ${response.status}`);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export async function fetchNoteTemplate(name: string): Promise<NoteTemplateContent> {
|
|
175
|
+
const response = await fetch(`/api/dashboard/notes/template?name=${encodeURIComponent(name)}`);
|
|
176
|
+
return await parseNotesResponse<NoteTemplateContent>(response, `note template fetch failed: ${response.status}`);
|
|
177
|
+
}
|
|
178
|
+
|
|
166
179
|
export async function fetchNotesIndex(): Promise<VaultIndexSnapshot> {
|
|
167
180
|
const response = await fetch('/api/dashboard/notes/index');
|
|
168
181
|
return await parseNotesResponse<VaultIndexSnapshot>(response, `notes index fetch failed: ${response.status}`);
|
|
@@ -23,6 +23,16 @@ export function WorkbenchHeader(props: WorkbenchHeaderProps) {
|
|
|
23
23
|
<p className="eyebrow">Selected instance</p>
|
|
24
24
|
<h2>{instance ? instanceLabel(instance) : 'No instance selected'}</h2>
|
|
25
25
|
<span>{instance?.workingDir || instance?.url || 'Select an online instance to inspect it.'}</span>
|
|
26
|
+
{instance?.projectDirs && instance.projectDirs.length > 0 && (
|
|
27
|
+
<div className="project-dirs">
|
|
28
|
+
<span className="label">Projects:</span>
|
|
29
|
+
{instance.projectDirs.map((dir, i) => (
|
|
30
|
+
<span key={i} className="project-dir" title={dir}>
|
|
31
|
+
{dir.split(/[/\\]/).slice(-2).join('/')}
|
|
32
|
+
</span>
|
|
33
|
+
))}
|
|
34
|
+
</div>
|
|
35
|
+
)}
|
|
26
36
|
</div>
|
|
27
37
|
{hasActions && (
|
|
28
38
|
<div className="detail-header-actions">
|
|
@@ -238,6 +238,89 @@
|
|
|
238
238
|
color: var(--text-secondary);
|
|
239
239
|
}
|
|
240
240
|
|
|
241
|
+
.notes-template-picker {
|
|
242
|
+
padding: 8px 12px;
|
|
243
|
+
border-bottom: 1px solid var(--border-subtle);
|
|
244
|
+
background: var(--canvas-deep);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
.notes-template-picker-label {
|
|
248
|
+
font-size: 12px;
|
|
249
|
+
color: var(--text-secondary);
|
|
250
|
+
margin-bottom: 6px;
|
|
251
|
+
overflow: hidden;
|
|
252
|
+
text-overflow: ellipsis;
|
|
253
|
+
white-space: nowrap;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
.notes-template-picker-options {
|
|
257
|
+
display: flex;
|
|
258
|
+
flex-wrap: wrap;
|
|
259
|
+
gap: 4px;
|
|
260
|
+
margin-bottom: 4px;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.notes-template-picker-option {
|
|
264
|
+
padding: 4px 10px;
|
|
265
|
+
border: 1px solid var(--border-subtle);
|
|
266
|
+
border-radius: 6px;
|
|
267
|
+
background: var(--accent-soft);
|
|
268
|
+
color: var(--text-primary);
|
|
269
|
+
font: inherit;
|
|
270
|
+
font-size: 12px;
|
|
271
|
+
cursor: pointer;
|
|
272
|
+
transition: background 0.15s;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
.notes-template-picker-option:hover {
|
|
276
|
+
background: var(--accent);
|
|
277
|
+
color: var(--bg-panel);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
.notes-template-picker-cancel {
|
|
281
|
+
padding: 2px 8px;
|
|
282
|
+
border: none;
|
|
283
|
+
border-radius: 4px;
|
|
284
|
+
background: transparent;
|
|
285
|
+
color: var(--text-tertiary);
|
|
286
|
+
font: inherit;
|
|
287
|
+
font-size: 11px;
|
|
288
|
+
cursor: pointer;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
.notes-template-picker-cancel:hover {
|
|
292
|
+
color: var(--text-secondary);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.notes-today-bar {
|
|
296
|
+
display: flex;
|
|
297
|
+
padding: 6px 12px;
|
|
298
|
+
border-bottom: 1px solid var(--border-subtle);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.notes-today-button {
|
|
302
|
+
flex: 1;
|
|
303
|
+
display: flex;
|
|
304
|
+
align-items: center;
|
|
305
|
+
justify-content: center;
|
|
306
|
+
gap: 6px;
|
|
307
|
+
min-height: 32px;
|
|
308
|
+
border: 1px solid var(--border-subtle);
|
|
309
|
+
border-radius: 8px;
|
|
310
|
+
background: var(--accent-soft);
|
|
311
|
+
color: var(--text-primary);
|
|
312
|
+
font: inherit;
|
|
313
|
+
font-weight: 600;
|
|
314
|
+
font-size: 13px;
|
|
315
|
+
cursor: pointer;
|
|
316
|
+
transition: background 0.15s, color 0.15s;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
.notes-today-button:hover {
|
|
320
|
+
background: var(--accent);
|
|
321
|
+
color: var(--bg-panel);
|
|
322
|
+
}
|
|
323
|
+
|
|
241
324
|
.notes-main {
|
|
242
325
|
min-width: 0;
|
|
243
326
|
min-height: 0;
|
|
@@ -1213,3 +1296,148 @@
|
|
|
1213
1296
|
border-bottom: 1px solid var(--border-subtle);
|
|
1214
1297
|
}
|
|
1215
1298
|
}
|
|
1299
|
+
|
|
1300
|
+
/* --- Backlinks Panel --- */
|
|
1301
|
+
|
|
1302
|
+
.notes-backlinks-panel {
|
|
1303
|
+
border-top: 1px solid var(--border-secondary, #333);
|
|
1304
|
+
background: var(--canvas-deep, #1a1a1a);
|
|
1305
|
+
max-height: 220px;
|
|
1306
|
+
overflow-y: auto;
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
.notes-backlinks-header {
|
|
1310
|
+
display: flex;
|
|
1311
|
+
align-items: center;
|
|
1312
|
+
gap: 6px;
|
|
1313
|
+
width: 100%;
|
|
1314
|
+
padding: 8px 14px;
|
|
1315
|
+
background: none;
|
|
1316
|
+
border: none;
|
|
1317
|
+
color: var(--text-secondary);
|
|
1318
|
+
font-size: 12px;
|
|
1319
|
+
font-weight: 600;
|
|
1320
|
+
text-transform: uppercase;
|
|
1321
|
+
letter-spacing: 0.5px;
|
|
1322
|
+
cursor: pointer;
|
|
1323
|
+
user-select: none;
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
.notes-backlinks-header:hover {
|
|
1327
|
+
color: var(--text-primary);
|
|
1328
|
+
}
|
|
1329
|
+
|
|
1330
|
+
.notes-backlinks-chevron {
|
|
1331
|
+
font-size: 9px;
|
|
1332
|
+
width: 12px;
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
.notes-backlinks-count {
|
|
1336
|
+
margin-left: auto;
|
|
1337
|
+
background: var(--surface-secondary, #2a2a2a);
|
|
1338
|
+
padding: 1px 6px;
|
|
1339
|
+
border-radius: 8px;
|
|
1340
|
+
font-size: 11px;
|
|
1341
|
+
font-weight: 500;
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
.notes-backlinks-list {
|
|
1345
|
+
padding: 0 8px 8px;
|
|
1346
|
+
}
|
|
1347
|
+
|
|
1348
|
+
.notes-backlinks-empty {
|
|
1349
|
+
padding: 8px 14px;
|
|
1350
|
+
color: var(--text-tertiary);
|
|
1351
|
+
font-size: 12px;
|
|
1352
|
+
font-style: italic;
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
.notes-backlink-entry {
|
|
1356
|
+
display: flex;
|
|
1357
|
+
flex-wrap: wrap;
|
|
1358
|
+
gap: 4px;
|
|
1359
|
+
width: 100%;
|
|
1360
|
+
padding: 6px 10px;
|
|
1361
|
+
background: none;
|
|
1362
|
+
border: none;
|
|
1363
|
+
border-radius: 4px;
|
|
1364
|
+
text-align: left;
|
|
1365
|
+
cursor: pointer;
|
|
1366
|
+
color: var(--text-primary);
|
|
1367
|
+
}
|
|
1368
|
+
|
|
1369
|
+
.notes-backlink-entry:hover {
|
|
1370
|
+
background: var(--surface-hover, #2a2a2a);
|
|
1371
|
+
}
|
|
1372
|
+
|
|
1373
|
+
.notes-backlink-title {
|
|
1374
|
+
font-size: 13px;
|
|
1375
|
+
font-weight: 500;
|
|
1376
|
+
color: var(--accent-primary, #8ab4ff);
|
|
1377
|
+
}
|
|
1378
|
+
|
|
1379
|
+
.notes-backlink-line {
|
|
1380
|
+
font-size: 11px;
|
|
1381
|
+
color: var(--text-tertiary);
|
|
1382
|
+
}
|
|
1383
|
+
|
|
1384
|
+
.notes-backlink-context {
|
|
1385
|
+
width: 100%;
|
|
1386
|
+
font-size: 12px;
|
|
1387
|
+
color: var(--text-tertiary);
|
|
1388
|
+
white-space: nowrap;
|
|
1389
|
+
overflow: hidden;
|
|
1390
|
+
text-overflow: ellipsis;
|
|
1391
|
+
}
|
|
1392
|
+
|
|
1393
|
+
mark.backlink-highlight {
|
|
1394
|
+
background: none;
|
|
1395
|
+
color: var(--accent-primary, #8ab4ff);
|
|
1396
|
+
font-weight: 600;
|
|
1397
|
+
}
|
|
1398
|
+
|
|
1399
|
+
/* --- Graph View --- */
|
|
1400
|
+
|
|
1401
|
+
.notes-graph-view {
|
|
1402
|
+
position: relative;
|
|
1403
|
+
width: 100%;
|
|
1404
|
+
height: 100%;
|
|
1405
|
+
min-height: 400px;
|
|
1406
|
+
background: var(--canvas-deep, #111);
|
|
1407
|
+
overflow: hidden;
|
|
1408
|
+
grid-row: 3;
|
|
1409
|
+
}
|
|
1410
|
+
|
|
1411
|
+
.notes-graph-svg {
|
|
1412
|
+
display: block;
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1415
|
+
.notes-graph-info {
|
|
1416
|
+
position: absolute;
|
|
1417
|
+
bottom: 12px;
|
|
1418
|
+
right: 16px;
|
|
1419
|
+
font-size: 11px;
|
|
1420
|
+
color: var(--text-tertiary, #666);
|
|
1421
|
+
pointer-events: none;
|
|
1422
|
+
user-select: none;
|
|
1423
|
+
}
|
|
1424
|
+
|
|
1425
|
+
.notes-graph-loading,
|
|
1426
|
+
.notes-graph-empty {
|
|
1427
|
+
display: flex;
|
|
1428
|
+
align-items: center;
|
|
1429
|
+
justify-content: center;
|
|
1430
|
+
height: 100%;
|
|
1431
|
+
min-height: 400px;
|
|
1432
|
+
color: var(--text-secondary);
|
|
1433
|
+
font-size: 14px;
|
|
1434
|
+
grid-row: 3;
|
|
1435
|
+
}
|
|
1436
|
+
|
|
1437
|
+
.graph-node circle:hover {
|
|
1438
|
+
filter: brightness(1.3);
|
|
1439
|
+
}
|
|
1440
|
+
|
|
1441
|
+
.graph-node text {
|
|
1442
|
+
text-shadow: 0 0 4px var(--canvas-deep, #111);
|
|
1443
|
+
}
|