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
@@ -1,7 +1,7 @@
1
1
  import type { NotesAuthoringMode, NotesViewMode } from './notes-types';
2
2
  import { canSaveNote, noteDisplayName } from './note-revisions';
3
3
 
4
- type NotesPrimaryMode = 'raw' | 'split' | 'preview' | 'wysiwyg';
4
+ type NotesPrimaryMode = 'raw' | 'split' | 'preview' | 'wysiwyg' | 'graph';
5
5
 
6
6
  type NotesToolbarProps = {
7
7
  selectedPath: string | null;
@@ -17,17 +17,19 @@ type NotesToolbarProps = {
17
17
  onReload: () => void;
18
18
  };
19
19
 
20
- const PRIMARY_MODES: NotesPrimaryMode[] = ['raw', 'split', 'preview', 'wysiwyg'];
20
+ const PRIMARY_MODES: NotesPrimaryMode[] = ['raw', 'split', 'preview', 'wysiwyg', 'graph'];
21
21
 
22
22
  function primaryModeLabel(mode: NotesPrimaryMode): string {
23
23
  if (mode === 'raw') return 'Raw';
24
24
  if (mode === 'split') return 'Split';
25
25
  if (mode === 'preview') return 'Preview';
26
+ if (mode === 'graph') return 'Graph';
26
27
  return 'WYSIWYG';
27
28
  }
28
29
 
29
30
  function activePrimaryMode(viewMode: NotesViewMode, authoringMode: NotesAuthoringMode): NotesPrimaryMode | null {
30
31
  if (viewMode === 'settings') return null;
32
+ if (viewMode === 'graph') return 'graph';
31
33
  if (viewMode === 'split') return 'split';
32
34
  if (viewMode === 'preview') return 'preview';
33
35
  if (authoringMode === 'wysiwyg') return 'wysiwyg';
@@ -36,6 +38,10 @@ function activePrimaryMode(viewMode: NotesViewMode, authoringMode: NotesAuthorin
36
38
 
37
39
  export function NotesToolbar(props: NotesToolbarProps) {
38
40
  function activatePrimaryMode(mode: NotesPrimaryMode): void {
41
+ if (mode === 'graph') {
42
+ props.onViewModeChange('graph');
43
+ return;
44
+ }
39
45
  if (mode === 'split') {
40
46
  props.onViewModeChange('split');
41
47
  props.onAuthoringModeChange('plain');
@@ -66,7 +72,7 @@ export function NotesToolbar(props: NotesToolbarProps) {
66
72
  role="tab"
67
73
  aria-selected={activeMode === mode}
68
74
  className={activeMode === mode ? 'is-active' : ''}
69
- disabled={!props.selectedPath}
75
+ disabled={mode === 'graph' ? false : !props.selectedPath}
70
76
  onClick={() => activatePrimaryMode(mode)}
71
77
  >
72
78
  {primaryModeLabel(mode)}
@@ -1,15 +1,24 @@
1
- import { useEffect, useRef, useState } from 'react';
1
+ import { lazy, Suspense, useEffect, useMemo, useRef, useState } from 'react';
2
2
  import { MarkdownEditor } from './MarkdownEditor';
3
3
  import { MarkdownPreview } from './MarkdownPreview';
4
+ import { NotesBacklinksPanel } from './NotesBacklinksPanel';
4
5
  import { NotesEmptyState } from './NotesEmptyState';
5
6
  import { NotesFrontmatterStrip } from './NotesFrontmatterStrip';
6
7
  import { NotesQuickSwitcher } from './NotesQuickSwitcher';
7
8
  import { NotesToolbar } from './NotesToolbar';
9
+ import { canSaveNote } from './note-revisions';
10
+ import { useRegisterNoteCommands, type NoteCommand } from './notes-command-registry';
11
+ import { isQuickSwitcherShortcut } from './notes-shortcuts';
8
12
  import { renameNotePath } from './notes-api';
9
13
  import { useNoteDocument } from './useNoteDocument';
10
14
  import { publishInvalidation } from '../sync/invalidation-bus';
11
15
  import type { NotesAuthoringMode, NotesNoteMetadata, NotesVaultIndexSnapshot, NotesViewMode } from './notes-types';
12
16
 
17
+ const NotesGraphView = lazy(async () => {
18
+ const module = await import('./NotesGraphView');
19
+ return { default: module.NotesGraphView };
20
+ });
21
+
13
22
  type NotesPrimaryMode = 'raw' | 'preview' | 'wysiwyg';
14
23
 
15
24
  type NotesWorkspaceProps = {
@@ -107,7 +116,7 @@ export function NotesWorkspace(props: NotesWorkspaceProps) {
107
116
  useEffect(() => {
108
117
  if (!props.active) return;
109
118
  function handleQuickSwitcherShortcut(event: KeyboardEvent): void {
110
- if (!(event.metaKey || event.ctrlKey) || event.key.toLowerCase() !== 'p') return;
119
+ if (!isQuickSwitcherShortcut(event)) return;
111
120
  event.preventDefault();
112
121
  setQuickSwitcherOpen(open => !open);
113
122
  }
@@ -116,6 +125,114 @@ export function NotesWorkspace(props: NotesWorkspaceProps) {
116
125
  return () => window.removeEventListener('keydown', handleQuickSwitcherShortcut);
117
126
  }, [props.active]);
118
127
 
128
+ const saveDisabledReason = !props.selectedPath
129
+ ? 'No note selected'
130
+ : document.saving
131
+ ? 'Save in progress'
132
+ : !document.dirty
133
+ ? 'No unsaved changes'
134
+ : undefined;
135
+ const workspaceCommands = useMemo<NoteCommand[]>(() => [
136
+ {
137
+ id: 'workspace:save',
138
+ section: 'File',
139
+ label: 'Save note',
140
+ shortcut: 'Cmd+S',
141
+ disabled: !canSaveNote(props.selectedPath, document.dirty, document.saving),
142
+ disabledReason: saveDisabledReason,
143
+ keywords: ['write', 'persist'],
144
+ run: () => void document.save(),
145
+ },
146
+ {
147
+ id: 'workspace:reload',
148
+ section: 'File',
149
+ label: 'Reload note from disk',
150
+ keywords: ['refresh', 'discard'],
151
+ disabled: !props.selectedPath,
152
+ disabledReason: 'No note selected',
153
+ run: () => void document.reloadFromDisk(),
154
+ },
155
+ {
156
+ id: 'workspace:view-raw',
157
+ section: 'View',
158
+ label: 'Switch to raw editor',
159
+ run: () => {
160
+ props.onViewModeChange('raw');
161
+ props.onAuthoringModeChange('plain');
162
+ },
163
+ },
164
+ {
165
+ id: 'workspace:view-split',
166
+ section: 'View',
167
+ label: 'Switch to split view',
168
+ run: () => {
169
+ props.onViewModeChange('split');
170
+ props.onAuthoringModeChange('plain');
171
+ },
172
+ },
173
+ {
174
+ id: 'workspace:view-preview',
175
+ section: 'View',
176
+ label: 'Switch to preview',
177
+ shortcut: 'Cmd+E',
178
+ run: () => props.onViewModeChange('preview'),
179
+ },
180
+ {
181
+ id: 'workspace:view-wysiwyg',
182
+ section: 'View',
183
+ label: 'Switch to WYSIWYG editor',
184
+ run: () => {
185
+ props.onViewModeChange('raw');
186
+ props.onAuthoringModeChange('wysiwyg');
187
+ },
188
+ },
189
+ {
190
+ id: 'workspace:view-graph',
191
+ section: 'View',
192
+ label: 'Open graph view',
193
+ run: () => props.onViewModeChange('graph'),
194
+ },
195
+ {
196
+ id: 'workspace:open-settings',
197
+ section: 'View',
198
+ label: 'Open Notes settings',
199
+ run: () => props.onViewModeChange('settings'),
200
+ },
201
+ {
202
+ id: 'workspace:toggle-word-wrap',
203
+ section: 'Editor',
204
+ label: props.wordWrap ? 'Disable word wrap' : 'Enable word wrap',
205
+ run: () => props.onWordWrapChange(!props.wordWrap),
206
+ },
207
+ {
208
+ id: 'workspace:open-search',
209
+ section: 'Navigate',
210
+ label: 'Search notes',
211
+ shortcut: 'Cmd+Shift+F',
212
+ run: props.onOpenSidebarSearch,
213
+ },
214
+ {
215
+ id: 'workspace:quick-switch-note',
216
+ section: 'Navigate',
217
+ label: 'Quick switch note',
218
+ shortcut: 'Cmd+P',
219
+ run: () => setQuickSwitcherOpen(true),
220
+ },
221
+ ], [
222
+ document.dirty,
223
+ document.reloadFromDisk,
224
+ document.save,
225
+ document.saving,
226
+ props.onAuthoringModeChange,
227
+ props.onOpenSidebarSearch,
228
+ props.onViewModeChange,
229
+ props.onWordWrapChange,
230
+ props.selectedPath,
231
+ props.wordWrap,
232
+ saveDisabledReason,
233
+ ]);
234
+ useRegisterNoteCommands(workspaceCommands, props.active);
235
+
119
236
  async function handleTitleBlur(event: React.FocusEvent<HTMLInputElement>): Promise<void> {
120
237
  if (renamingRef.current || !props.selectedPath) return;
121
238
  const newTitle = event.currentTarget.value.trim().replace(INVALID_TITLE_CHARS, '');
@@ -147,6 +264,7 @@ export function NotesWorkspace(props: NotesWorkspaceProps) {
147
264
  const showEditor = props.viewMode === 'raw' || props.viewMode === 'split';
148
265
  const showPreview = props.viewMode === 'preview' || props.viewMode === 'split';
149
266
  const selectedOutgoingLinks = (props.selectedPath && props.vaultIndex?.outgoingLinks?.[props.selectedPath]) || [];
267
+ const selectedBacklinks = (props.selectedPath && props.vaultIndex?.backlinks?.[props.selectedPath]) || [];
150
268
  const indexedNotes = props.vaultIndex?.notes || [];
151
269
  const wysiwygOwnsFrontmatter = props.authoringMode === 'wysiwyg' && showEditor;
152
270
 
@@ -198,8 +316,20 @@ export function NotesWorkspace(props: NotesWorkspaceProps) {
198
316
  </label>
199
317
  </section>
200
318
  )}
201
- {!props.selectedPath && props.viewMode !== 'settings' && <NotesEmptyState />}
202
- {props.selectedPath && props.viewMode !== 'settings' && (
319
+ {props.viewMode === 'graph' && (
320
+ <Suspense fallback={<div className="notes-graph-loading">Loading graph...</div>}>
321
+ <NotesGraphView
322
+ graph={props.vaultIndex?.graph ?? { nodes: [], edges: [] }}
323
+ selectedPath={props.selectedPath}
324
+ onNavigate={(path) => {
325
+ props.onSelectedPathChange(path);
326
+ props.onViewModeChange('raw');
327
+ }}
328
+ />
329
+ </Suspense>
330
+ )}
331
+ {!props.selectedPath && props.viewMode !== 'settings' && props.viewMode !== 'graph' && <NotesEmptyState />}
332
+ {props.selectedPath && props.viewMode !== 'settings' && props.viewMode !== 'graph' && (
203
333
  <div className="notes-document-grid">
204
334
  <input
205
335
  className="notes-inline-title"
@@ -244,6 +374,12 @@ export function NotesWorkspace(props: NotesWorkspaceProps) {
244
374
  </div>
245
375
  )}
246
376
  </div>
377
+ {props.viewMode !== 'graph' && props.viewMode !== 'settings' && props.selectedPath && (
378
+ <NotesBacklinksPanel
379
+ backlinks={selectedBacklinks}
380
+ onNavigate={props.onWikiLinkNavigate}
381
+ />
382
+ )}
247
383
  </main>
248
384
  <NotesQuickSwitcher
249
385
  open={quickSwitcherOpen}
@@ -3,6 +3,8 @@ export {
3
3
  fetchNotesIndex,
4
4
  fetchNotesCapabilities,
5
5
  fetchNotesTree,
6
+ fetchNoteTemplates,
7
+ fetchNoteTemplate,
6
8
  searchNotes,
7
9
  fetchNoteFile,
8
10
  createNoteFile,
@@ -0,0 +1,79 @@
1
+ import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from 'react';
2
+
3
+ export type NoteCommand = {
4
+ id: string;
5
+ section: string;
6
+ label: string;
7
+ keywords?: string[] | undefined;
8
+ shortcut?: string | undefined;
9
+ disabled?: boolean | undefined;
10
+ disabledReason?: string | undefined;
11
+ run: () => void | Promise<void>;
12
+ };
13
+
14
+ type NotesCommandRegistry = {
15
+ commands: NoteCommand[];
16
+ register: (commands: NoteCommand[]) => () => void;
17
+ };
18
+
19
+ const NotesCommandRegistryContext = createContext<NotesCommandRegistry | null>(null);
20
+
21
+ export function NotesCommandProvider(props: { children: ReactNode }) {
22
+ const [commandsById, setCommandsById] = useState<Map<string, NoteCommand>>(() => new Map());
23
+
24
+ const register = useCallback((commands: NoteCommand[]) => {
25
+ const incoming = new Map(commands.map(command => [command.id, command]));
26
+ setCommandsById(previous => {
27
+ const next = new Map(previous);
28
+ for (const command of commands) {
29
+ const existing = next.get(command.id);
30
+ if (existing && existing !== command) {
31
+ console.warn(`[notes-command-palette] duplicate command id: ${command.id}`);
32
+ }
33
+ next.set(command.id, command);
34
+ }
35
+ return next;
36
+ });
37
+
38
+ return () => {
39
+ setCommandsById(previous => {
40
+ const next = new Map(previous);
41
+ for (const [id, command] of incoming) {
42
+ if (next.get(id) === command) next.delete(id);
43
+ }
44
+ return next;
45
+ });
46
+ };
47
+ }, []);
48
+
49
+ const commands = useMemo(() => [...commandsById.values()].sort((a, b) => {
50
+ const section = a.section.localeCompare(b.section);
51
+ if (section !== 0) return section;
52
+ return a.label.localeCompare(b.label);
53
+ }), [commandsById]);
54
+
55
+ const value = useMemo(() => ({ commands, register }), [commands, register]);
56
+
57
+ return (
58
+ <NotesCommandRegistryContext.Provider value={value}>
59
+ {props.children}
60
+ </NotesCommandRegistryContext.Provider>
61
+ );
62
+ }
63
+
64
+ export function useNoteCommands(): NoteCommand[] {
65
+ const registry = useContext(NotesCommandRegistryContext);
66
+ if (!registry) throw new Error('useNoteCommands must be used inside NotesCommandProvider');
67
+ return registry.commands;
68
+ }
69
+
70
+ export function useRegisterNoteCommands(commands: NoteCommand[], active = true): void {
71
+ const registry = useContext(NotesCommandRegistryContext);
72
+ if (!registry) throw new Error('useRegisterNoteCommands must be used inside NotesCommandProvider');
73
+ const register = registry.register;
74
+
75
+ useEffect(() => {
76
+ if (!active || commands.length === 0) return undefined;
77
+ return register(commands);
78
+ }, [active, commands, register]);
79
+ }
@@ -149,3 +149,154 @@
149
149
  grid-row: auto;
150
150
  }
151
151
  }
152
+
153
+ .notes-command-palette-backdrop {
154
+ position: fixed;
155
+ inset: 0;
156
+ z-index: 72;
157
+ display: grid;
158
+ place-items: start center;
159
+ padding: 12vh 16px 24px;
160
+ background: color-mix(in srgb, var(--canvas-deep) 58%, transparent);
161
+ }
162
+
163
+ .notes-command-palette {
164
+ width: min(620px, 100%);
165
+ max-height: min(620px, 78vh);
166
+ display: grid;
167
+ grid-template-rows: auto minmax(0, 1fr) auto;
168
+ overflow: hidden;
169
+ border: 1px solid var(--border-subtle);
170
+ border-radius: 8px;
171
+ background: var(--surface-raised);
172
+ color: var(--text-primary);
173
+ }
174
+
175
+ .notes-command-palette-input {
176
+ width: 100%;
177
+ min-height: 48px;
178
+ border: 0;
179
+ border-bottom: 1px solid var(--border-subtle);
180
+ border-radius: 0;
181
+ background: var(--surface-panel);
182
+ color: var(--text-primary);
183
+ padding: 0 16px;
184
+ font: inherit;
185
+ font-size: 15px;
186
+ }
187
+
188
+ .notes-command-palette-input:focus {
189
+ outline: 2px solid var(--accent-soft);
190
+ outline-offset: -2px;
191
+ }
192
+
193
+ .notes-command-palette-list {
194
+ min-height: 0;
195
+ overflow: auto;
196
+ padding: 8px;
197
+ }
198
+
199
+ .notes-command-palette-item {
200
+ width: 100%;
201
+ min-height: 56px;
202
+ display: grid;
203
+ grid-template-columns: minmax(0, 1fr) max-content;
204
+ gap: 4px 12px;
205
+ align-items: center;
206
+ margin: 0 0 4px;
207
+ padding: 9px 10px;
208
+ border: 1px solid transparent;
209
+ border-radius: 7px;
210
+ background: transparent;
211
+ color: var(--text-primary);
212
+ text-align: left;
213
+ font: inherit;
214
+ }
215
+
216
+ .notes-command-palette-item:hover,
217
+ .notes-command-palette-item.is-active {
218
+ border-color: var(--border-subtle);
219
+ background: var(--accent-soft);
220
+ }
221
+
222
+ .notes-command-palette-item.is-disabled {
223
+ opacity: 0.58;
224
+ }
225
+
226
+ .notes-command-palette-title {
227
+ min-width: 0;
228
+ overflow: hidden;
229
+ text-overflow: ellipsis;
230
+ white-space: nowrap;
231
+ font-weight: 500;
232
+ }
233
+
234
+ .notes-command-palette-meta {
235
+ min-width: 0;
236
+ grid-column: 1 / 2;
237
+ overflow: hidden;
238
+ text-overflow: ellipsis;
239
+ white-space: nowrap;
240
+ color: var(--text-secondary);
241
+ font-size: 12px;
242
+ }
243
+
244
+ .notes-command-palette-shortcut {
245
+ grid-column: 2 / 3;
246
+ grid-row: 1 / span 2;
247
+ align-self: center;
248
+ border: 1px solid var(--border-subtle);
249
+ border-radius: 5px;
250
+ background: var(--surface-panel);
251
+ color: var(--text-secondary);
252
+ padding: 1px 5px;
253
+ font: inherit;
254
+ font-size: 12px;
255
+ }
256
+
257
+ .notes-command-palette-empty {
258
+ margin: 0;
259
+ padding: 18px 12px;
260
+ color: var(--text-secondary);
261
+ font-size: 13px;
262
+ }
263
+
264
+ .notes-command-palette-footer {
265
+ display: flex;
266
+ flex-wrap: wrap;
267
+ gap: 10px;
268
+ padding: 9px 12px;
269
+ border-top: 1px solid var(--border-subtle);
270
+ color: var(--text-tertiary);
271
+ font-size: 12px;
272
+ }
273
+
274
+ .notes-command-palette-footer kbd {
275
+ border: 1px solid var(--border-subtle);
276
+ border-radius: 5px;
277
+ background: var(--surface-panel);
278
+ color: var(--text-secondary);
279
+ padding: 1px 5px;
280
+ font: inherit;
281
+ }
282
+
283
+ @media (max-width: 720px) {
284
+ .notes-command-palette-backdrop {
285
+ place-items: start stretch;
286
+ padding: 10vh 10px 16px;
287
+ }
288
+
289
+ .notes-command-palette {
290
+ max-height: 82vh;
291
+ }
292
+
293
+ .notes-command-palette-item {
294
+ grid-template-columns: minmax(0, 1fr);
295
+ }
296
+
297
+ .notes-command-palette-shortcut {
298
+ grid-column: 1 / 2;
299
+ grid-row: auto;
300
+ width: max-content;
301
+ }
302
+ }
@@ -0,0 +1,23 @@
1
+ type NotesShortcutEvent = Pick<KeyboardEvent, 'altKey' | 'ctrlKey' | 'key' | 'metaKey' | 'shiftKey' | 'target'>;
2
+
3
+ function hasPrimaryModifier(event: NotesShortcutEvent): boolean {
4
+ return (event.metaKey || event.ctrlKey) && !event.altKey;
5
+ }
6
+
7
+ function isInsideNotesPalette(target: EventTarget | null): boolean {
8
+ if (typeof HTMLElement === 'undefined' || !(target instanceof HTMLElement)) return false;
9
+ return Boolean(target.closest('[data-notes-palette]'));
10
+ }
11
+
12
+ export function isQuickSwitcherShortcut(event: NotesShortcutEvent): boolean {
13
+ return hasPrimaryModifier(event)
14
+ && !event.shiftKey
15
+ && event.key.toLowerCase() === 'p'
16
+ && !isInsideNotesPalette(event.target);
17
+ }
18
+
19
+ export function isCommandPaletteShortcut(event: NotesShortcutEvent): boolean {
20
+ return hasPrimaryModifier(event)
21
+ && event.shiftKey
22
+ && event.key.toLowerCase() === 'p';
23
+ }
@@ -8,7 +8,7 @@ import type {
8
8
  VaultIndexSnapshot,
9
9
  } from '../types';
10
10
 
11
- export type NotesViewMode = 'raw' | 'split' | 'preview' | 'settings';
11
+ export type NotesViewMode = 'raw' | 'split' | 'preview' | 'settings' | 'graph';
12
12
  export type NotesAuthoringMode = 'plain' | 'rich' | 'wysiwyg';
13
13
 
14
14
  export type NotesTreeSelection = {
@@ -0,0 +1,27 @@
1
+ type TemplateVars = Record<string, string>;
2
+
3
+ const VARIABLE_PATTERN = /\{\{(\w+)\}\}/g;
4
+
5
+ function defaultVars(): TemplateVars {
6
+ const now = new Date();
7
+ const pad = (n: number) => String(n).padStart(2, '0');
8
+ const yyyy = now.getFullYear();
9
+ const mm = pad(now.getMonth() + 1);
10
+ const dd = pad(now.getDate());
11
+ const hh = pad(now.getHours());
12
+ const mi = pad(now.getMinutes());
13
+ return {
14
+ date: `${yyyy}-${mm}-${dd}`,
15
+ time: `${hh}:${mi}`,
16
+ year: String(yyyy),
17
+ month: mm,
18
+ day: dd,
19
+ };
20
+ }
21
+
22
+ export function applyTemplate(template: string, extraVars: TemplateVars = {}): string {
23
+ const vars: TemplateVars = { ...defaultVars(), ...extraVars };
24
+ return template.replace(VARIABLE_PATTERN, (match, key: string) => {
25
+ return Object.hasOwn(vars, key) ? vars[key] : match;
26
+ });
27
+ }
@@ -25,9 +25,15 @@ export type ActiveOverride = {
25
25
  effort?: string;
26
26
  };
27
27
 
28
- export const PRIMARY_CLIS: ReadonlyArray<string> = ['claude', 'codex', 'gemini'];
28
+ export const PRIMARY_CLIS: ReadonlyArray<string> = ['claude', 'claude-e', 'agy', 'codex', 'gemini'];
29
29
 
30
30
  export const CLI_META: Record<string, CliMeta> = {
31
+ agy: {
32
+ label: 'Antigravity',
33
+ models: ['gemini-3.5-flash'],
34
+ efforts: [],
35
+ effortNote: 'AGY print mode uses the current AGY-selected model; switch models in native AGY UI, no --model/--effort flags in agy 1.0.0',
36
+ },
31
37
  'ai-e': {
32
38
  label: 'AI-E',
33
39
  defaultProvider: 'claude',
@@ -19,7 +19,7 @@ export type DashboardShortcutAction =
19
19
  | 'previousInstance'
20
20
  | 'nextInstance';
21
21
  export type DashboardShortcutKeymap = Record<DashboardShortcutAction, string>;
22
- export type DashboardNotesViewMode = 'raw' | 'split' | 'preview' | 'settings';
22
+ export type DashboardNotesViewMode = 'raw' | 'split' | 'preview' | 'settings' | 'graph';
23
23
  export type DashboardNotesAuthoringMode = 'plain' | 'rich' | 'wysiwyg';
24
24
  export type DashboardActivityTitleSupportStatus = 'ready' | 'legacy' | 'offline';
25
25
  export type DashboardProfileId = string;
@@ -60,6 +60,7 @@ export type DashboardInstance = {
60
60
  instanceId: string | null;
61
61
  homeDisplay: string | null;
62
62
  workingDir: string | null;
63
+ projectDirs: string[] | null;
63
64
  currentCli: string | null;
64
65
  currentModel: string | null;
65
66
  serviceMode: DashboardServiceMode;