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.
Files changed (294) hide show
  1. package/README.ja.md +24 -11
  2. package/README.ko.md +24 -11
  3. package/README.md +95 -11
  4. package/README.zh-CN.md +24 -11
  5. package/dist/bin/cli-jaw.js +4 -1
  6. package/dist/bin/cli-jaw.js.map +1 -1
  7. package/dist/bin/commands/browser-web-ai.js +2 -2
  8. package/dist/bin/commands/browser-web-ai.js.map +1 -1
  9. package/dist/bin/commands/doctor.js +12 -2
  10. package/dist/bin/commands/doctor.js.map +1 -1
  11. package/dist/bin/commands/init.js +4 -2
  12. package/dist/bin/commands/init.js.map +1 -1
  13. package/dist/bin/commands/project.js +167 -0
  14. package/dist/bin/commands/project.js.map +1 -0
  15. package/dist/bin/commands/tui/types.js +20 -4
  16. package/dist/bin/commands/tui/types.js.map +1 -1
  17. package/dist/bin/postinstall.js +226 -24
  18. package/dist/bin/postinstall.js.map +1 -1
  19. package/dist/lib/mime-detect.js +5 -0
  20. package/dist/lib/mime-detect.js.map +1 -1
  21. package/dist/scripts/fresh-install-smoke.js +78 -6
  22. package/dist/scripts/fresh-install-smoke.js.map +1 -1
  23. package/dist/src/agent/agy-runtime.js +15 -0
  24. package/dist/src/agent/agy-runtime.js.map +1 -0
  25. package/dist/src/agent/args.js +44 -5
  26. package/dist/src/agent/args.js.map +1 -1
  27. package/dist/src/agent/cli-helpers.js +1 -1
  28. package/dist/src/agent/cli-helpers.js.map +1 -1
  29. package/dist/src/agent/lifecycle-handler.js +6 -3
  30. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  31. package/dist/src/agent/session-persistence.js +1 -1
  32. package/dist/src/agent/session-persistence.js.map +1 -1
  33. package/dist/src/agent/smoke-detector.js +3 -0
  34. package/dist/src/agent/smoke-detector.js.map +1 -1
  35. package/dist/src/agent/spawn/resume.js +2 -0
  36. package/dist/src/agent/spawn/resume.js.map +1 -1
  37. package/dist/src/agent/spawn-env.js +6 -0
  38. package/dist/src/agent/spawn-env.js.map +1 -1
  39. package/dist/src/agent/spawn.js +120 -15
  40. package/dist/src/agent/spawn.js.map +1 -1
  41. package/dist/src/browser/web-ai/capability-observation-presets.js +1 -1
  42. package/dist/src/browser/web-ai/capability-observation-presets.js.map +1 -1
  43. package/dist/src/browser/web-ai/capability-registry.js +6 -5
  44. package/dist/src/browser/web-ai/capability-registry.js.map +1 -1
  45. package/dist/src/browser/web-ai/chatgpt-attachments.js +7 -0
  46. package/dist/src/browser/web-ai/chatgpt-attachments.js.map +1 -1
  47. package/dist/src/browser/web-ai/context-pack/builder.js +19 -4
  48. package/dist/src/browser/web-ai/context-pack/builder.js.map +1 -1
  49. package/dist/src/browser/web-ai/context-pack/zip-writer.js +116 -0
  50. package/dist/src/browser/web-ai/context-pack/zip-writer.js.map +1 -0
  51. package/dist/src/browser/web-ai/gemini-live.js +21 -3
  52. package/dist/src/browser/web-ai/gemini-live.js.map +1 -1
  53. package/dist/src/browser/web-ai/gemini-model.js +26 -8
  54. package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
  55. package/dist/src/cli/commands.js +2 -0
  56. package/dist/src/cli/commands.js.map +1 -1
  57. package/dist/src/cli/handlers-project.js +55 -0
  58. package/dist/src/cli/handlers-project.js.map +1 -0
  59. package/dist/src/cli/readiness.js +6 -1
  60. package/dist/src/cli/readiness.js.map +1 -1
  61. package/dist/src/cli/registry.js +11 -0
  62. package/dist/src/cli/registry.js.map +1 -1
  63. package/dist/src/core/claude-install.js +10 -1
  64. package/dist/src/core/claude-install.js.map +1 -1
  65. package/dist/src/core/config.js +63 -7
  66. package/dist/src/core/config.js.map +1 -1
  67. package/dist/src/core/db.js +11 -4
  68. package/dist/src/core/db.js.map +1 -1
  69. package/dist/src/core/runtime-settings.js +4 -1
  70. package/dist/src/core/runtime-settings.js.map +1 -1
  71. package/dist/src/manager/metadata.js +7 -2
  72. package/dist/src/manager/metadata.js.map +1 -1
  73. package/dist/src/manager/notes/routes.js +7 -0
  74. package/dist/src/manager/notes/routes.js.map +1 -1
  75. package/dist/src/manager/notes/store.js +72 -0
  76. package/dist/src/manager/notes/store.js.map +1 -1
  77. package/dist/src/manager/registry.js +1 -1
  78. package/dist/src/manager/registry.js.map +1 -1
  79. package/dist/src/manager/scan.js +2 -0
  80. package/dist/src/manager/scan.js.map +1 -1
  81. package/dist/src/messaging/send.js +1 -1
  82. package/dist/src/messaging/send.js.map +1 -1
  83. package/dist/src/orchestrator/distribute.js +25 -4
  84. package/dist/src/orchestrator/distribute.js.map +1 -1
  85. package/dist/src/orchestrator/pipeline.js +21 -5
  86. package/dist/src/orchestrator/pipeline.js.map +1 -1
  87. package/dist/src/orchestrator/state-machine.js +7 -1
  88. package/dist/src/orchestrator/state-machine.js.map +1 -1
  89. package/dist/src/orchestrator/workspace-context.js +49 -14
  90. package/dist/src/orchestrator/workspace-context.js.map +1 -1
  91. package/dist/src/routes/messaging.js +1 -1
  92. package/dist/src/routes/messaging.js.map +1 -1
  93. package/dist/src/routes/orchestrate.js +11 -4
  94. package/dist/src/routes/orchestrate.js.map +1 -1
  95. package/dist/src/routes/settings.js +73 -8
  96. package/dist/src/routes/settings.js.map +1 -1
  97. package/dist/src/security/path-guards.js +35 -14
  98. package/dist/src/security/path-guards.js.map +1 -1
  99. package/dist/src/types/cli-engine.js +1 -0
  100. package/dist/src/types/cli-engine.js.map +1 -1
  101. package/package.json +19 -4
  102. package/public/css/chat.css +6 -2
  103. package/public/dist/assets/{AdvancedExport-CBvz4_IZ.js → AdvancedExport-CZEVPqHb.js} +1 -1
  104. package/public/dist/assets/{Agent-DlUqCMXJ.js → Agent-BBrJGd5m.js} +1 -1
  105. package/public/dist/assets/{Browser-66BpLQck.js → Browser-dBaU9G9D.js} +1 -1
  106. package/public/dist/assets/{ChannelsDiscord-BifT2Dum.js → ChannelsDiscord-CbmWms9-.js} +1 -1
  107. package/public/dist/assets/{ChannelsTelegram-CK6tYQ8k.js → ChannelsTelegram-BD4Eyztg.js} +1 -1
  108. package/public/dist/assets/{DashboardMeta-Cc03HT5R.js → DashboardMeta-LVAL7TtE.js} +1 -1
  109. package/public/dist/assets/{Display-arOjcMQZ.js → Display-CFm1UmEo.js} +1 -1
  110. package/public/dist/assets/{Employees-YbW-mI67.js → Employees-DcMChleU.js} +1 -1
  111. package/public/dist/assets/{Heartbeat-CW4eIhtJ.js → Heartbeat-BoobN35p.js} +1 -1
  112. package/public/dist/assets/{Mcp-ZQ6ARQb6.js → Mcp-9NU4YkKO.js} +1 -1
  113. package/public/dist/assets/{Memory-BAUWJMqc.js → Memory-uZT30fww.js} +1 -1
  114. package/public/dist/assets/{MilkdownWysiwygEditor-IAqFtXvM.js → MilkdownWysiwygEditor-Otw40DDF.js} +1 -1
  115. package/public/dist/assets/{ModelProvider-DUtmFh0J.js → ModelProvider-CsIOyoZP.js} +1 -1
  116. package/public/dist/assets/{Network-B_4E82zQ.js → Network-D7hGwnyG.js} +1 -1
  117. package/public/dist/assets/NotesGraphView-CJuk9lKn.js +1 -0
  118. package/public/dist/assets/Permissions-CcIBptg3.js +1 -0
  119. package/public/dist/assets/{Permissions-BkADXjQ4.js → Permissions-DwdU3wi8.js} +1 -1
  120. package/public/dist/assets/{Profile-BcnTCSYM.js → Profile-BNTKD_Ex.js} +1 -1
  121. package/public/dist/assets/{Prompts-CUs_RoRE.js → Prompts-D_mCfYiu.js} +1 -1
  122. package/public/dist/assets/{SpeechKeys-qxc-ROWN.js → SpeechKeys-BTXCM-Fs.js} +1 -1
  123. package/public/dist/assets/agent-meta-BC7mLqo6.js +1 -0
  124. package/public/dist/assets/{app-CGqTcIeF.js → app-C7MAcAMu.js} +5 -5
  125. package/public/dist/assets/app-CkFBKUf8.css +1 -0
  126. package/public/dist/assets/{architectureDiagram-3BPJPVTR-kYIVzmWe.js → architectureDiagram-3BPJPVTR-CJCPEsxo.js} +1 -1
  127. package/public/dist/assets/{blockDiagram-GPEHLZMM-B204CPhe.js → blockDiagram-GPEHLZMM-CO1bkn0E.js} +2 -2
  128. package/public/dist/assets/{c4Diagram-AAUBKEIU-DAv6TAjg.js → c4Diagram-AAUBKEIU-D2R36Xu6.js} +1 -1
  129. package/public/dist/assets/{chunk-3OPIFGDE-DOAvk9x8.js → chunk-3OPIFGDE-DixnEkZw.js} +1 -1
  130. package/public/dist/assets/chunk-55IACEB6-DhWWzzdj.js +1 -0
  131. package/public/dist/assets/{chunk-5ZQYHXKU-Bd-RFO5i.js → chunk-5ZQYHXKU-Bli4k6GI.js} +2 -2
  132. package/public/dist/assets/{chunk-727SXJPM-BrsRzj8z.js → chunk-727SXJPM-sp4W8bhf.js} +1 -1
  133. package/public/dist/assets/{chunk-AQP2D5EJ-Di6Gstk-.js → chunk-AQP2D5EJ-Co6ucdGq.js} +1 -1
  134. package/public/dist/assets/{chunk-KSCS5N6A-D9a4ZkOy.js → chunk-KSCS5N6A-Beq1s5eO.js} +2 -2
  135. package/public/dist/assets/{chunk-L5ZTLDWV-D208QbfC.js → chunk-L5ZTLDWV-DfUlBdXN.js} +1 -1
  136. package/public/dist/assets/{chunk-LZXEDZCA-CE2KFduj.js → chunk-LZXEDZCA-B_yP4UKw.js} +1 -1
  137. package/public/dist/assets/{chunk-ND2GUHAM-zZ7h1CPf.js → chunk-ND2GUHAM-3qbNb7I9.js} +1 -1
  138. package/public/dist/assets/{chunk-O5CBEL6O-BTuvXKFi.js → chunk-O5CBEL6O-D-jDqsN2.js} +1 -1
  139. package/public/dist/assets/{chunk-WU5MYG2G-C3fKlSvP.js → chunk-WU5MYG2G-DlBJtD7-.js} +1 -1
  140. package/public/dist/assets/classDiagram-4FO5ZUOK-DmPJvqRM.js +1 -0
  141. package/public/dist/assets/classDiagram-v2-Q7XG4LA2-ECmTUt7U.js +1 -0
  142. package/public/dist/assets/constants-BXWl7LTi.js +1 -0
  143. package/public/dist/assets/{cose-bilkent-S5V4N54A-D1zmarou.js → cose-bilkent-S5V4N54A-Bt9AAJCx.js} +1 -1
  144. package/public/dist/assets/{dagre-BM42HDAG-BVkBttzA.js → dagre-BM42HDAG-CXEA1wvZ.js} +1 -1
  145. package/public/dist/assets/{dagre-DnoxfNXr.js → dagre-Ve-IAfyz.js} +1 -1
  146. package/public/dist/assets/{diagram-2AECGRRQ-Bs32KPnT.js → diagram-2AECGRRQ-CCB0OKc2.js} +1 -1
  147. package/public/dist/assets/{diagram-5GNKFQAL-YDYgPOQj.js → diagram-5GNKFQAL-Cki9HABy.js} +1 -1
  148. package/public/dist/assets/{diagram-KO2AKTUF-1tIdFl26.js → diagram-KO2AKTUF-DNBDjE2o.js} +1 -1
  149. package/public/dist/assets/{diagram-LMA3HP47-B1y15kav.js → diagram-LMA3HP47-Cy23RDPa.js} +1 -1
  150. package/public/dist/assets/{diagram-OG6HWLK6-C25j1jGg.js → diagram-OG6HWLK6-CT_YF8cA.js} +1 -1
  151. package/public/dist/assets/dist-3R3GxjCf.js +13 -0
  152. package/public/dist/assets/{dist-D0PYXGt2.js → dist-BLd7xdyq.js} +1 -1
  153. package/public/dist/assets/{dist-fJAyK82z.js → dist-BaRrwDy3.js} +1 -1
  154. package/public/dist/assets/{dist-Rs_Khtjb.js → dist-Bbsp4OF7.js} +1 -1
  155. package/public/dist/assets/{dist-Cv8S3FhF.js → dist-BkBGlG70.js} +1 -1
  156. package/public/dist/assets/{dist-0v1UKkQ3.js → dist-BkJ_1mj9.js} +1 -1
  157. package/public/dist/assets/{dist-BQNQk-1M.js → dist-BxCRVW5D.js} +1 -1
  158. package/public/dist/assets/{dist-DDDFJ8jG.js → dist-C-v7Rm67.js} +1 -1
  159. package/public/dist/assets/dist-CNgDEAy8.js +1 -0
  160. package/public/dist/assets/dist-CO_W5rr2.js +1 -0
  161. package/public/dist/assets/{dist-vQskrHxt.js → dist-ChAUfTbO.js} +1 -1
  162. package/public/dist/assets/{dist-CjPin7Mr.js → dist-D-k-lzQT.js} +1 -1
  163. package/public/dist/assets/dist-D1hPukqY.js +1 -0
  164. package/public/dist/assets/{dist-C1VqWrYZ.js → dist-D5Qx-jQQ.js} +1 -1
  165. package/public/dist/assets/{dist-DTQW91xt.js → dist-D7VNzYBv.js} +1 -1
  166. package/public/dist/assets/{dist-DHQI31dn.js → dist-DAxnodoa.js} +1 -1
  167. package/public/dist/assets/{dist-CnIrGAPx.js → dist-DHSyODkR.js} +1 -1
  168. package/public/dist/assets/{dist-CE4s7vg82.js → dist-DaYTPjbb2.js} +1 -1
  169. package/public/dist/assets/{dist-jcptfm_T.js → dist-DlWi9tVO.js} +1 -1
  170. package/public/dist/assets/{dist-D66X8iAn.js → dist-DuuoJfRB.js} +1 -1
  171. package/public/dist/assets/{dist-DzT7frM2.js → dist-Dv36UUXz.js} +1 -1
  172. package/public/dist/assets/{dist-BVpa_e6W.js → dist-F4CVhitP.js} +1 -1
  173. package/public/dist/assets/{dist-Qs7HHNCC.js → dist-LHbJYy3N.js} +1 -1
  174. package/public/dist/assets/{dist-Ck6PnIlo.js → dist-VIlx7JdU.js} +1 -1
  175. package/public/dist/assets/{dist-D5GUqT-6.js → dist-cgDt2PmY.js} +1 -1
  176. package/public/dist/assets/dist-eW2LjRIK.js +1 -0
  177. package/public/dist/assets/{dist-Dm7RAaUo.js → dist-vGn3_sWA.js} +1 -1
  178. package/public/dist/assets/{employees-DRmX2RDd.js → employees-BmxY8Mw3.js} +1 -1
  179. package/public/dist/assets/{erDiagram-TEJ5UH35-CRvCbztR.js → erDiagram-TEJ5UH35-Cq7oHdXg.js} +1 -1
  180. package/public/dist/assets/{flowDiagram-I6XJVG4X-CzvVnib_.js → flowDiagram-I6XJVG4X-D8CdEnfM.js} +1 -1
  181. package/public/dist/assets/ganttDiagram-6RSMTGT7-B1rzKXi_.js +292 -0
  182. package/public/dist/assets/{gitGraphDiagram-PVQCEYII-CbKdM7nW.js → gitGraphDiagram-PVQCEYII-CqLh-joi.js} +1 -1
  183. package/public/dist/assets/{graphlib-BLOO0H5r.js → graphlib-W5bESv3F.js} +1 -1
  184. package/public/dist/assets/{infoDiagram-5YYISTIA-BrZmg1At.js → infoDiagram-5YYISTIA-C1zVxumj.js} +1 -1
  185. package/public/dist/assets/{ishikawaDiagram-YF4QCWOH-BDWXqJi5.js → ishikawaDiagram-YF4QCWOH-x-9J6xPM.js} +1 -1
  186. package/public/dist/assets/{journeyDiagram-JHISSGLW-CPFRd_M3.js → journeyDiagram-JHISSGLW-BDYzHrtn.js} +1 -1
  187. package/public/dist/assets/{kanban-definition-UN3LZRKU-BcQbBplS.js → kanban-definition-UN3LZRKU-BJ-06i6Z.js} +1 -1
  188. package/public/dist/assets/manager-B2NWzG7j.css +1 -0
  189. package/public/dist/assets/manager-C5e1IxEN.js +25 -0
  190. package/public/dist/assets/memory-BqqibBIE.js +1 -0
  191. package/public/dist/assets/{memory-BA-ki3gn.js → memory-CRL72HB-.js} +1 -1
  192. package/public/dist/assets/mermaid-loader-Dqb4ZUz6.js +1 -0
  193. package/public/dist/assets/{mermaid.core-ArqR5iFa.js → mermaid.core-D8VnfThU.js} +2 -2
  194. package/public/dist/assets/mermaid.core-DYHvk6Pd.js +1 -0
  195. package/public/dist/assets/{mindmap-definition-RKZ34NQL-C35cGkNU.js → mindmap-definition-RKZ34NQL-D8NDuIhn.js} +1 -1
  196. package/public/dist/assets/{pieDiagram-4H26LBE5-B8C_hoqJ.js → pieDiagram-4H26LBE5-CpBePil_.js} +3 -3
  197. package/public/dist/assets/{quadrantDiagram-W4KKPZXB-BEPrine5.js → quadrantDiagram-W4KKPZXB-C1WWpn88.js} +1 -1
  198. package/public/dist/assets/{render-C7_e0J_X.js → render-o_YEiCEO.js} +2 -2
  199. package/public/dist/assets/{requirementDiagram-4Y6WPE33-ClDDon9c.js → requirementDiagram-4Y6WPE33-C_D5VbNk.js} +1 -1
  200. package/public/dist/assets/{sankeyDiagram-5OEKKPKP-Bjs3OE-1.js → sankeyDiagram-5OEKKPKP--RH3Es8R.js} +3 -3
  201. package/public/dist/assets/{sequenceDiagram-3UESZ5HK-BM8IAaEe.js → sequenceDiagram-3UESZ5HK-CVI4AjhN.js} +1 -1
  202. package/public/dist/assets/settings-B0RlyAkI.js +1 -0
  203. package/public/dist/assets/settings-CCXRL5Ar.js +46 -0
  204. package/public/dist/assets/sidebar-DRJffqO1.js +14 -0
  205. package/public/dist/assets/skills-CFdzXbtK.js +1 -0
  206. package/public/dist/assets/{skills-Dq7fD8I3.js → skills-DbRVI-zf.js} +1 -1
  207. package/public/dist/assets/slash-commands-BUM6u-Ex.js +1 -0
  208. package/public/dist/assets/{slash-commands-DRsKtuGT.js → slash-commands-C2YBMaQV.js} +1 -1
  209. package/public/dist/assets/{stateDiagram-AJRCARHV-BvNABuXE.js → stateDiagram-AJRCARHV-4bx1rPZ3.js} +1 -1
  210. package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CrfGPzHb.js +1 -0
  211. package/public/dist/assets/{timeline-definition-PNZ67QCA-CIvTvac3.js → timeline-definition-PNZ67QCA-DeQoGRE2.js} +1 -1
  212. package/public/dist/assets/{trace-drawer-DDFdU07_.js → trace-drawer-CIVBXyRH.js} +1 -1
  213. package/public/dist/assets/ui-C3ArwMhv.js +140 -0
  214. package/public/dist/assets/ui-CboUuc_E.js +1 -0
  215. package/public/dist/assets/vendor-utils-rVejrfMR.js +1 -0
  216. package/public/dist/assets/{vennDiagram-CIIHVFJN-C5cbS2KC.js → vennDiagram-CIIHVFJN-CejyJK0L.js} +1 -1
  217. package/public/dist/assets/{wardleyDiagram-YWT4CUSO-BsRBBGFP.js → wardleyDiagram-YWT4CUSO-DqXV0sa1.js} +1 -1
  218. package/public/dist/assets/wiki-link-suggestions-e5BzJAZH.js +23 -0
  219. package/public/dist/assets/{xychartDiagram-2RQKCTM6-B6rqui6F.js → xychartDiagram-2RQKCTM6-CWLoVl2b.js} +2 -2
  220. package/public/dist/index.html +20 -2
  221. package/public/dist/manager/index.html +2 -2
  222. package/public/index.html +18 -0
  223. package/public/js/constants.ts +12 -1
  224. package/public/js/features/settings-cli-status.ts +27 -4
  225. package/public/js/features/settings-core.ts +28 -15
  226. package/public/js/features/settings-types.ts +1 -0
  227. package/public/js/features/ui-status.ts +3 -0
  228. package/public/js/ws.ts +5 -1
  229. package/public/manager/src/SidebarRailRouter.tsx +5 -2
  230. package/public/manager/src/api.ts +13 -0
  231. package/public/manager/src/components/WorkbenchHeader.tsx +10 -0
  232. package/public/manager/src/manager-notes.css +228 -0
  233. package/public/manager/src/notes/NotesBacklinksPanel.tsx +91 -0
  234. package/public/manager/src/notes/NotesCommandPalette.tsx +212 -0
  235. package/public/manager/src/notes/NotesGraphView.tsx +145 -0
  236. package/public/manager/src/notes/NotesSidebar.tsx +183 -5
  237. package/public/manager/src/notes/NotesToolbar.tsx +9 -3
  238. package/public/manager/src/notes/NotesWorkspace.tsx +140 -4
  239. package/public/manager/src/notes/notes-api.ts +2 -0
  240. package/public/manager/src/notes/notes-command-registry.tsx +79 -0
  241. package/public/manager/src/notes/notes-quick-switcher.css +151 -0
  242. package/public/manager/src/notes/notes-shortcuts.ts +23 -0
  243. package/public/manager/src/notes/notes-types.ts +1 -1
  244. package/public/manager/src/notes/template-engine.ts +27 -0
  245. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +7 -1
  246. package/public/manager/src/types.ts +2 -1
  247. package/scripts/audit-fresh-install-evidence.mjs +278 -0
  248. package/scripts/collect-fresh-install-evidence.sh +459 -0
  249. package/scripts/fresh-install-smoke.ts +85 -6
  250. package/scripts/install-officecli.ps1 +14 -1
  251. package/scripts/install-risk-gate.mjs +161 -0
  252. package/scripts/install-wsl.sh +78 -16
  253. package/scripts/install.sh +272 -72
  254. package/scripts/postinstall-guard.cjs +2 -2
  255. package/scripts/release-preview.sh +25 -3
  256. package/scripts/release.sh +37 -8
  257. package/scripts/require-release-evidence.mjs +236 -0
  258. package/scripts/verify-fresh-install.sh +120 -0
  259. package/scripts/verify-release-evidence.mjs +158 -0
  260. package/public/dist/assets/Permissions-DvUCB8wA.js +0 -1
  261. package/public/dist/assets/agent-meta-Du8y6mSM.js +0 -1
  262. package/public/dist/assets/app-Dpk6cE6C.css +0 -1
  263. package/public/dist/assets/chunk-55IACEB6-Dx2JkQLw.js +0 -1
  264. package/public/dist/assets/classDiagram-4FO5ZUOK-Cb-qL5u3.js +0 -1
  265. package/public/dist/assets/classDiagram-v2-Q7XG4LA2-BPhGdj15.js +0 -1
  266. package/public/dist/assets/constants-BxG09J6S.js +0 -1
  267. package/public/dist/assets/dist-BMi_buEb.js +0 -1
  268. package/public/dist/assets/dist-BkrbW_LS.js +0 -1
  269. package/public/dist/assets/dist-C3vh7d65.js +0 -13
  270. package/public/dist/assets/dist-D815C1Fv.js +0 -1
  271. package/public/dist/assets/dist-sOV2kBhQ.js +0 -1
  272. package/public/dist/assets/ganttDiagram-6RSMTGT7-BbUYP6iv.js +0 -292
  273. package/public/dist/assets/manager-B5OmizBL.css +0 -1
  274. package/public/dist/assets/manager-Cs3eMBcx.js +0 -25
  275. package/public/dist/assets/memory-DLQbyBA3.js +0 -1
  276. package/public/dist/assets/mermaid-loader-BVPsKrpr.js +0 -1
  277. package/public/dist/assets/mermaid.core-BAwu4U2Y.js +0 -1
  278. package/public/dist/assets/settings-DjyKdqev.js +0 -1
  279. package/public/dist/assets/settings-pUJzyeX2.js +0 -42
  280. package/public/dist/assets/sidebar-CO9Qjj6v.js +0 -14
  281. package/public/dist/assets/skills-CX3qJ77s.js +0 -1
  282. package/public/dist/assets/slash-commands-UbS8w9ij.js +0 -1
  283. package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CCIo81qy.js +0 -1
  284. package/public/dist/assets/ui-CeBmBBZM.js +0 -140
  285. package/public/dist/assets/ui-TMXjvH0r.js +0 -1
  286. package/public/dist/assets/vendor-utils-BnxL60_-.js +0 -1
  287. package/public/dist/assets/wiki-link-suggestions-BHwNQXT_.js +0 -23
  288. /package/public/dist/assets/{HealthBadge-DEPFkcA0.js → HealthBadge-CfLTPTPW.js} +0 -0
  289. /package/public/dist/assets/{InlineWarn-DoJS7AgM.js → InlineWarn-C7ISyzDI.js} +0 -0
  290. /package/public/dist/assets/{fields-DUawAHWZ.js → fields-BwD_NGxe.js} +0 -0
  291. /package/public/dist/assets/{locale-BHMJIzyw.js → locale-DT1WRaeJ.js} +0 -0
  292. /package/public/dist/assets/{page-shell-CVAobxbP.js → page-shell-uNOxwdbr.js} +0 -0
  293. /package/public/dist/assets/{path-utils-r2bJIu28.js → path-utils-h2GAj3hH.js} +0 -0
  294. /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">
@@ -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: 'Install Grok CLI', auth: 'grok login --oauth' },
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
- if (name === 'grok' && q?.quotaCapable === false && q.authenticated !== false && info.available) {
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.quotaSource ? 'Quota not exposed by Grok CLI' : 'Auth/status only']
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 || 'Grok Heavy')}</div>
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
- const raw = settings?.perCli?.[cli]?.model || modelSel.value || '';
141
- const selected = normalizeModelForDisplay(cli, raw);
142
- const models = cli === 'ai-e'
143
- ? (meta?.modelsByProvider?.[aiEProvider] || MODEL_MAP[cli] || [])
144
- : (MODEL_MAP[cli] || []);
145
- setSelectOptions(modelSel, models, { includeCustom: true, selected });
146
- if (selected && !Array.from(modelSel.options).some(o => o.value === selected)) {
147
- appendCustomOption(modelSel, selected);
148
- modelSel.value = selected;
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 s = {
317
- cli: (document.getElementById('selCli') as HTMLSelectElement)?.value || 'claude',
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 || s.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
- setSelectOptions(modelSel, models, { includeCustom: true, includeDefault: true });
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) {
@@ -14,6 +14,7 @@ export interface QuotaEntry {
14
14
  quotaSource?: string;
15
15
  sessionUsageCapable?: boolean;
16
16
  displayTier?: string;
17
+ delegatedProvider?: string;
17
18
  sessionUsage?: {
18
19
  contextTokensUsed?: number | null;
19
20
  contextWindowTokens?: number | null;
@@ -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
+ }