cli-jaw 2.0.5 → 2.0.6

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 (614) hide show
  1. package/README.ja.md +229 -315
  2. package/README.ko.md +248 -315
  3. package/README.md +103 -186
  4. package/README.zh-CN.md +282 -296
  5. package/dist/bin/commands/browser-web-ai.js +4 -2
  6. package/dist/bin/commands/browser-web-ai.js.map +1 -1
  7. package/dist/bin/commands/browser.js +76 -0
  8. package/dist/bin/commands/browser.js.map +1 -1
  9. package/dist/bin/commands/doctor.js +122 -4
  10. package/dist/bin/commands/doctor.js.map +1 -1
  11. package/dist/bin/commands/skill.js +5 -3
  12. package/dist/bin/commands/skill.js.map +1 -1
  13. package/dist/bin/postinstall.js +507 -89
  14. package/dist/bin/postinstall.js.map +1 -1
  15. package/dist/lib/mcp/format-converters.js +32 -4
  16. package/dist/lib/mcp/format-converters.js.map +1 -1
  17. package/dist/lib/mcp/mcp-install.js +5 -0
  18. package/dist/lib/mcp/mcp-install.js.map +1 -1
  19. package/dist/lib/mcp/skills-distribution.js +52 -53
  20. package/dist/lib/mcp/skills-distribution.js.map +1 -1
  21. package/dist/lib/mcp/skills-reset.js +29 -16
  22. package/dist/lib/mcp/skills-reset.js.map +1 -1
  23. package/dist/lib/mcp/skills-utils.js +64 -2
  24. package/dist/lib/mcp/skills-utils.js.map +1 -1
  25. package/dist/lib/mcp/unified-config.js +7 -3
  26. package/dist/lib/mcp/unified-config.js.map +1 -1
  27. package/dist/scripts/fresh-install-smoke.js +1 -1
  28. package/dist/scripts/fresh-install-smoke.js.map +1 -1
  29. package/dist/server.js +44 -4
  30. package/dist/server.js.map +1 -1
  31. package/dist/src/agent/args.js +148 -1
  32. package/dist/src/agent/args.js.map +1 -1
  33. package/dist/src/agent/claude-e-runtime.js +42 -0
  34. package/dist/src/agent/claude-e-runtime.js.map +1 -0
  35. package/dist/src/agent/claude-i-runtime.js +42 -0
  36. package/dist/src/agent/claude-i-runtime.js.map +1 -0
  37. package/dist/src/agent/cli-helpers.js +9 -0
  38. package/dist/src/agent/cli-helpers.js.map +1 -0
  39. package/dist/src/agent/codex-app-client.js +240 -0
  40. package/dist/src/agent/codex-app-client.js.map +1 -0
  41. package/dist/src/agent/codex-app-events.js +268 -0
  42. package/dist/src/agent/codex-app-events.js.map +1 -0
  43. package/dist/src/agent/error-classifier.js +8 -2
  44. package/dist/src/agent/error-classifier.js.map +1 -1
  45. package/dist/src/agent/events/acp.js +200 -0
  46. package/dist/src/agent/events/acp.js.map +1 -0
  47. package/dist/src/agent/events/claude.js +200 -0
  48. package/dist/src/agent/events/claude.js.map +1 -0
  49. package/dist/src/agent/events/codex.js +118 -0
  50. package/dist/src/agent/events/codex.js.map +1 -0
  51. package/dist/src/agent/events/gemini.js +100 -0
  52. package/dist/src/agent/events/gemini.js.map +1 -0
  53. package/dist/src/agent/events/grok.js +298 -0
  54. package/dist/src/agent/events/grok.js.map +1 -0
  55. package/dist/src/agent/events/helpers.js +237 -0
  56. package/dist/src/agent/events/helpers.js.map +1 -0
  57. package/dist/src/agent/events/index.js +315 -0
  58. package/dist/src/agent/events/index.js.map +1 -0
  59. package/dist/src/agent/events/opencode.js +171 -0
  60. package/dist/src/agent/events/opencode.js.map +1 -0
  61. package/dist/src/agent/events/summary.js +128 -0
  62. package/dist/src/agent/events/summary.js.map +1 -0
  63. package/dist/src/agent/events/tool-labels.js +299 -0
  64. package/dist/src/agent/events/tool-labels.js.map +1 -0
  65. package/dist/src/agent/events/types.js +3 -0
  66. package/dist/src/agent/events/types.js.map +1 -0
  67. package/dist/src/agent/events.js +2 -1487
  68. package/dist/src/agent/events.js.map +1 -1
  69. package/dist/src/agent/grok-trace-backfill.js +153 -0
  70. package/dist/src/agent/grok-trace-backfill.js.map +1 -0
  71. package/dist/src/agent/lifecycle-handler.js +60 -16
  72. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  73. package/dist/src/agent/live-run-state.js +1 -1
  74. package/dist/src/agent/live-run-state.js.map +1 -1
  75. package/dist/src/agent/memory-flush-controller.js +26 -0
  76. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  77. package/dist/src/agent/resume-classifier.js +9 -0
  78. package/dist/src/agent/resume-classifier.js.map +1 -1
  79. package/dist/src/agent/session-persistence.js +7 -2
  80. package/dist/src/agent/session-persistence.js.map +1 -1
  81. package/dist/src/agent/spawn/process-kill.js +29 -0
  82. package/dist/src/agent/spawn/process-kill.js.map +1 -0
  83. package/dist/src/agent/spawn/queue.js +273 -0
  84. package/dist/src/agent/spawn/queue.js.map +1 -0
  85. package/dist/src/agent/spawn/resume.js +56 -0
  86. package/dist/src/agent/spawn/resume.js.map +1 -0
  87. package/dist/src/agent/spawn.js +435 -371
  88. package/dist/src/agent/spawn.js.map +1 -1
  89. package/dist/src/agent/watchdog.js +5 -1
  90. package/dist/src/agent/watchdog.js.map +1 -1
  91. package/dist/src/browser/adaptive-fetch/browser-escalation.js +177 -0
  92. package/dist/src/browser/adaptive-fetch/browser-escalation.js.map +1 -0
  93. package/dist/src/browser/adaptive-fetch/browser-runtime.js +38 -0
  94. package/dist/src/browser/adaptive-fetch/browser-runtime.js.map +1 -0
  95. package/dist/src/browser/adaptive-fetch/browser-session.js +97 -0
  96. package/dist/src/browser/adaptive-fetch/browser-session.js.map +1 -0
  97. package/dist/src/browser/adaptive-fetch/challenge-detector.js +88 -0
  98. package/dist/src/browser/adaptive-fetch/challenge-detector.js.map +1 -0
  99. package/dist/src/browser/adaptive-fetch/content-scorer.js +145 -0
  100. package/dist/src/browser/adaptive-fetch/content-scorer.js.map +1 -0
  101. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js +382 -0
  102. package/dist/src/browser/adaptive-fetch/endpoint-resolvers.js.map +1 -0
  103. package/dist/src/browser/adaptive-fetch/fetcher.js +105 -0
  104. package/dist/src/browser/adaptive-fetch/fetcher.js.map +1 -0
  105. package/dist/src/browser/adaptive-fetch/human-loop.js +101 -0
  106. package/dist/src/browser/adaptive-fetch/human-loop.js.map +1 -0
  107. package/dist/src/browser/adaptive-fetch/index.js +586 -0
  108. package/dist/src/browser/adaptive-fetch/index.js.map +1 -0
  109. package/dist/src/browser/adaptive-fetch/metadata.js +169 -0
  110. package/dist/src/browser/adaptive-fetch/metadata.js.map +1 -0
  111. package/dist/src/browser/adaptive-fetch/output.js +71 -0
  112. package/dist/src/browser/adaptive-fetch/output.js.map +1 -0
  113. package/dist/src/browser/adaptive-fetch/reader-adapters.js +135 -0
  114. package/dist/src/browser/adaptive-fetch/reader-adapters.js.map +1 -0
  115. package/dist/src/browser/adaptive-fetch/safety.js +296 -0
  116. package/dist/src/browser/adaptive-fetch/safety.js.map +1 -0
  117. package/dist/src/browser/adaptive-fetch/third-party-readers.js +43 -0
  118. package/dist/src/browser/adaptive-fetch/third-party-readers.js.map +1 -0
  119. package/dist/src/browser/adaptive-fetch/trace.js +61 -0
  120. package/dist/src/browser/adaptive-fetch/trace.js.map +1 -0
  121. package/dist/src/browser/adaptive-fetch/transforms.js +81 -0
  122. package/dist/src/browser/adaptive-fetch/transforms.js.map +1 -0
  123. package/dist/src/browser/adaptive-fetch/validators.js +108 -0
  124. package/dist/src/browser/adaptive-fetch/validators.js.map +1 -0
  125. package/dist/src/browser/adaptive-fetch/waf-profiles.js +135 -0
  126. package/dist/src/browser/adaptive-fetch/waf-profiles.js.map +1 -0
  127. package/dist/src/browser/index.js +1 -0
  128. package/dist/src/browser/index.js.map +1 -1
  129. package/dist/src/browser/web-ai/gemini-model.js +42 -15
  130. package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
  131. package/dist/src/cli/claude-models.js +1 -1
  132. package/dist/src/cli/claude-models.js.map +1 -1
  133. package/dist/src/cli/compact.js +2 -0
  134. package/dist/src/cli/compact.js.map +1 -1
  135. package/dist/src/cli/handlers-completions.js +3 -0
  136. package/dist/src/cli/handlers-completions.js.map +1 -1
  137. package/dist/src/cli/handlers-runtime.js +5 -2
  138. package/dist/src/cli/handlers-runtime.js.map +1 -1
  139. package/dist/src/cli/readiness.js +43 -1
  140. package/dist/src/cli/readiness.js.map +1 -1
  141. package/dist/src/cli/registry.js +58 -0
  142. package/dist/src/cli/registry.js.map +1 -1
  143. package/dist/src/core/browser-open.js +4 -1
  144. package/dist/src/core/browser-open.js.map +1 -1
  145. package/dist/src/core/claude-install.js +4 -0
  146. package/dist/src/core/claude-install.js.map +1 -1
  147. package/dist/src/core/cli-detect.js +61 -13
  148. package/dist/src/core/cli-detect.js.map +1 -1
  149. package/dist/src/core/compact.js +295 -63
  150. package/dist/src/core/compact.js.map +1 -1
  151. package/dist/src/core/config.js +151 -11
  152. package/dist/src/core/config.js.map +1 -1
  153. package/dist/src/core/db.js +10 -1
  154. package/dist/src/core/db.js.map +1 -1
  155. package/dist/src/core/employees.js +1 -1
  156. package/dist/src/core/employees.js.map +1 -1
  157. package/dist/src/core/logger.js +28 -9
  158. package/dist/src/core/logger.js.map +1 -1
  159. package/dist/src/core/runtime-settings.js +32 -5
  160. package/dist/src/core/runtime-settings.js.map +1 -1
  161. package/dist/src/manager/memory/embedding/state-machine.js +2 -1
  162. package/dist/src/manager/memory/embedding/state-machine.js.map +1 -1
  163. package/dist/src/manager/memory/embedding/sync.js +52 -33
  164. package/dist/src/manager/memory/embedding/sync.js.map +1 -1
  165. package/dist/src/manager/memory/embedding/vec-store.js +10 -10
  166. package/dist/src/manager/memory/embedding/vec-store.js.map +1 -1
  167. package/dist/src/manager/routes/dashboard-memory.js +43 -16
  168. package/dist/src/manager/routes/dashboard-memory.js.map +1 -1
  169. package/dist/src/manager/server.js +11 -0
  170. package/dist/src/manager/server.js.map +1 -1
  171. package/dist/src/memory/indexing.js +6 -1
  172. package/dist/src/memory/indexing.js.map +1 -1
  173. package/dist/src/orchestrator/distribute.js +5 -4
  174. package/dist/src/orchestrator/distribute.js.map +1 -1
  175. package/dist/src/prompt/builder.js +12 -1
  176. package/dist/src/prompt/builder.js.map +1 -1
  177. package/dist/src/prompt/runtime-context.js +69 -0
  178. package/dist/src/prompt/runtime-context.js.map +1 -0
  179. package/dist/src/routes/browser.js +33 -0
  180. package/dist/src/routes/browser.js.map +1 -1
  181. package/dist/src/routes/employees.js +1 -1
  182. package/dist/src/routes/employees.js.map +1 -1
  183. package/dist/src/routes/memory.js +1 -1
  184. package/dist/src/routes/memory.js.map +1 -1
  185. package/dist/src/routes/orchestrate.js +37 -10
  186. package/dist/src/routes/orchestrate.js.map +1 -1
  187. package/dist/src/routes/quota.js +91 -1
  188. package/dist/src/routes/quota.js.map +1 -1
  189. package/dist/src/routes/runtime-context.js +43 -0
  190. package/dist/src/routes/runtime-context.js.map +1 -0
  191. package/dist/src/routes/security-audit.js +14 -0
  192. package/dist/src/routes/security-audit.js.map +1 -0
  193. package/dist/src/routes/settings.js +8 -1
  194. package/dist/src/routes/settings.js.map +1 -1
  195. package/dist/src/security/security-audit-log.js +99 -0
  196. package/dist/src/security/security-audit-log.js.map +1 -0
  197. package/dist/src/telegram/bot.js +4 -2
  198. package/dist/src/telegram/bot.js.map +1 -1
  199. package/dist/src/types/cli-engine.js +4 -0
  200. package/dist/src/types/cli-engine.js.map +1 -1
  201. package/dist/src/types/cli-events.js +1 -1
  202. package/dist/src/types/cli-events.js.map +1 -1
  203. package/package.json +9 -3
  204. package/public/assets/providers/antigravity-color.svg +1 -0
  205. package/public/assets/providers/antigravity.svg +1 -0
  206. package/public/assets/providers/copilot-color.svg +1 -1
  207. package/public/assets/providers/copilot.svg +1 -1
  208. package/public/assets/providers/grok-color.svg +1 -0
  209. package/public/assets/providers/grok.svg +1 -0
  210. package/public/css/chat-search.css +168 -0
  211. package/public/css/chat.css +43 -1
  212. package/public/css/modals.css +41 -0
  213. package/public/dist/assets/{AdvancedExport-BAdZUC-6.js → AdvancedExport-CBvz4_IZ.js} +1 -1
  214. package/public/dist/assets/Agent-DlUqCMXJ.js +1 -0
  215. package/public/dist/assets/{Browser-BsdxDVgM.js → Browser-66BpLQck.js} +1 -1
  216. package/public/dist/assets/{ChannelsDiscord-Dg_jto6l.js → ChannelsDiscord-BifT2Dum.js} +1 -1
  217. package/public/dist/assets/{ChannelsTelegram-DGyZfJGS.js → ChannelsTelegram-CK6tYQ8k.js} +1 -1
  218. package/public/dist/assets/DashboardEmbeddingSection-6F8zSSja.js +2 -0
  219. package/public/dist/assets/{DashboardMeta-CAH9ONTb.js → DashboardMeta-Cc03HT5R.js} +1 -1
  220. package/public/dist/assets/{Display-DM_yvyKL.js → Display-arOjcMQZ.js} +1 -1
  221. package/public/dist/assets/Employees-YbW-mI67.js +1 -0
  222. package/public/dist/assets/{HealthBadge-Dtr-dDnw.js → HealthBadge-DEPFkcA0.js} +1 -1
  223. package/public/dist/assets/Heartbeat-CW4eIhtJ.js +1 -0
  224. package/public/dist/assets/{InlineWarn-E64UaKFh.js → InlineWarn-DoJS7AgM.js} +1 -1
  225. package/public/dist/assets/{Mcp-Dlp2X7X7.js → Mcp-ZQ6ARQb6.js} +1 -1
  226. package/public/dist/assets/Memory-BAUWJMqc.js +1 -0
  227. package/public/dist/assets/{MilkdownWysiwygEditor-Ctww8i0L.js → MilkdownWysiwygEditor-IAqFtXvM.js} +1 -1
  228. package/public/dist/assets/ModelProvider-DUtmFh0J.js +1 -0
  229. package/public/dist/assets/{Network-Df1R2YcQ.js → Network-B_4E82zQ.js} +1 -1
  230. package/public/dist/assets/{Permissions-BKJ5K6EL.js → Permissions-BkADXjQ4.js} +1 -1
  231. package/public/dist/assets/{Permissions-CcWZoOVP.js → Permissions-DvUCB8wA.js} +1 -1
  232. package/public/dist/assets/{Profile-DZ7xf1WZ.js → Profile-BcnTCSYM.js} +1 -1
  233. package/public/dist/assets/{Prompts-Bh5DYt8e.js → Prompts-CUs_RoRE.js} +1 -1
  234. package/public/dist/assets/{SpeechKeys-CQwtVxOP.js → SpeechKeys-qxc-ROWN.js} +1 -1
  235. package/public/dist/assets/agent-meta-Du8y6mSM.js +1 -0
  236. package/public/dist/assets/app-CGqTcIeF.js +39 -0
  237. package/public/dist/assets/app-Dpk6cE6C.css +1 -0
  238. package/public/dist/assets/architecture-7EHR7CIX-wVaUQezY.js +1 -0
  239. package/public/dist/assets/architectureDiagram-3BPJPVTR-kYIVzmWe.js +36 -0
  240. package/public/dist/assets/blockDiagram-GPEHLZMM-B204CPhe.js +132 -0
  241. package/public/dist/assets/{c4Diagram-AHTNJAMY-Bp2QLC-s.js → c4Diagram-AAUBKEIU-DAv6TAjg.js} +6 -6
  242. package/public/dist/assets/channel-CCQujL1n.js +1 -0
  243. package/public/dist/assets/{chunk-EDXVE4YY-COudQKkJ.js → chunk-2J33WTMH-xiPJWKcl.js} +1 -1
  244. package/public/dist/assets/chunk-3OPIFGDE-DOAvk9x8.js +62 -0
  245. package/public/dist/assets/{chunk-4BX2VUAB-Cm3KqBkS.js → chunk-4BX2VUAB-6lTRwyT0.js} +1 -1
  246. package/public/dist/assets/chunk-4EGX6M5U-DXtAEgX6.js +1 -0
  247. package/public/dist/assets/chunk-55IACEB6-Dx2JkQLw.js +1 -0
  248. package/public/dist/assets/chunk-5DO6E6H7-DDcMHB95.js +1 -0
  249. package/public/dist/assets/chunk-5ZQYHXKU-Bd-RFO5i.js +2 -0
  250. package/public/dist/assets/chunk-727SXJPM-BrsRzj8z.js +206 -0
  251. package/public/dist/assets/{chunk-AGHRB4JF-DIMn8T3_.js → chunk-AGHRB4JF-CYdXVA2-.js} +1 -1
  252. package/public/dist/assets/chunk-AQP2D5EJ-Di6Gstk-.js +231 -0
  253. package/public/dist/assets/{chunk-LIHQZDEY-Xw9ZX8of.js → chunk-BR22UD5L-CVuYkAd1.js} +1 -1
  254. package/public/dist/assets/{chunk-BSJP7CBP-DnSYKjii.js → chunk-BSJP7CBP-B47GpxcW.js} +1 -1
  255. package/public/dist/assets/chunk-CSCIHK7Q-CAE1p4Em.js +123 -0
  256. package/public/dist/assets/chunk-FHYWG6QK-CxZt-yZZ.js +1 -0
  257. package/public/dist/assets/{chunk-FMBD7UC4-6yXYicjw.js → chunk-FMBD7UC4-CwqBlx0l.js} +1 -1
  258. package/public/dist/assets/chunk-KSCS5N6A-D9a4ZkOy.js +10 -0
  259. package/public/dist/assets/{chunk-ZZ45TVLE-D5oxCC1O.js → chunk-L5ZTLDWV-D208QbfC.js} +1 -1
  260. package/public/dist/assets/{chunk-336JU56O-CAt5aBOe.js → chunk-LZXEDZCA-CE2KFduj.js} +1 -1
  261. package/public/dist/assets/chunk-MPE355IW-Bp4qAOUf.js +1 -0
  262. package/public/dist/assets/chunk-MZUSXYTE-DAU-v-0c.js +1 -0
  263. package/public/dist/assets/chunk-N66VUXT2-CpPz1L5u.js +1 -0
  264. package/public/dist/assets/chunk-ND2GUHAM-zZ7h1CPf.js +1 -0
  265. package/public/dist/assets/chunk-NNHCCRGN-BaiX9a5F.js +159 -0
  266. package/public/dist/assets/{chunk-X2U36JSP-CoMFMVNF.js → chunk-NZK2D7GU-CTqFQ8K5.js} +1 -1
  267. package/public/dist/assets/chunk-O5CBEL6O-BTuvXKFi.js +11 -0
  268. package/public/dist/assets/chunk-PUPMXCY4-ppZvktf-.js +1 -0
  269. package/public/dist/assets/chunk-QZHKN3VN-CBAtPPT7.js +1 -0
  270. package/public/dist/assets/chunk-UIBZB4QT-rJZEVBX0.js +1 -0
  271. package/public/dist/assets/chunk-WCWK7LTN-CGvUyB8h.js +1 -0
  272. package/public/dist/assets/chunk-WU5MYG2G-C3fKlSvP.js +1 -0
  273. package/public/dist/assets/{chunk-XPW4576I-CmAz5C-j.js → chunk-XPW4576I-BaQfzRci.js} +1 -1
  274. package/public/dist/assets/classDiagram-4FO5ZUOK-Cb-qL5u3.js +1 -0
  275. package/public/dist/assets/classDiagram-v2-Q7XG4LA2-BPhGdj15.js +1 -0
  276. package/public/dist/assets/constants-BxG09J6S.js +1 -0
  277. package/public/dist/assets/cose-bilkent-S5V4N54A-D1zmarou.js +1 -0
  278. package/public/dist/assets/dagre-BM42HDAG-BVkBttzA.js +4 -0
  279. package/public/dist/assets/dagre-DnoxfNXr.js +1 -0
  280. package/public/dist/assets/diagram-2AECGRRQ-Bs32KPnT.js +43 -0
  281. package/public/dist/assets/{diagram-5BDNPKRD-Cl4PzCD0.js → diagram-5GNKFQAL-YDYgPOQj.js} +2 -2
  282. package/public/dist/assets/diagram-KO2AKTUF-1tIdFl26.js +3 -0
  283. package/public/dist/assets/{diagram-TYMM5635-B_Xoa1Gp.js → diagram-LMA3HP47-B1y15kav.js} +1 -1
  284. package/public/dist/assets/diagram-OG6HWLK6-C25j1jGg.js +24 -0
  285. package/public/dist/assets/{dist-C9LWf2uC.js → dist-0v1UKkQ3.js} +1 -1
  286. package/public/dist/assets/dist-BMi_buEb.js +1 -0
  287. package/public/dist/assets/{dist-B6G8pbap.js → dist-BQNQk-1M.js} +1 -1
  288. package/public/dist/assets/{dist-CCKktDoF.js → dist-BVpa_e6W.js} +1 -1
  289. package/public/dist/assets/dist-BkrbW_LS.js +1 -0
  290. package/public/dist/assets/{dist-CkMC2PPt.js → dist-C1VqWrYZ.js} +1 -1
  291. package/public/dist/assets/{dist-BA7sRne4.js → dist-C3vh7d65.js} +1 -1
  292. package/public/dist/assets/{dist-BhzKO6nt2.js → dist-CE4s7vg82.js} +1 -1
  293. package/public/dist/assets/{dist-BDMNMdPF.js → dist-CjPin7Mr.js} +1 -1
  294. package/public/dist/assets/{dist-W7IGn2ug.js → dist-Ck6PnIlo.js} +1 -1
  295. package/public/dist/assets/{dist-B1rKu9eP.js → dist-CnIrGAPx.js} +1 -1
  296. package/public/dist/assets/{dist-CEDX2HGI.js → dist-Cv8S3FhF.js} +1 -1
  297. package/public/dist/assets/{dist-55MYVjjj.js → dist-D0PYXGt2.js} +1 -1
  298. package/public/dist/assets/{dist-C0sOT_UM.js → dist-D5GUqT-6.js} +1 -1
  299. package/public/dist/assets/{dist-C5S-Rbvc.js → dist-D66X8iAn.js} +1 -1
  300. package/public/dist/assets/dist-D815C1Fv.js +1 -0
  301. package/public/dist/assets/{dist-Ch6JG5jE.js → dist-DDDFJ8jG.js} +1 -1
  302. package/public/dist/assets/{dist-2oDfqE98.js → dist-DHQI31dn.js} +1 -1
  303. package/public/dist/assets/{dist-BTp_Oy_x.js → dist-DTQW91xt.js} +1 -1
  304. package/public/dist/assets/{dist-BuaQLcgQ.js → dist-Dm7RAaUo.js} +1 -1
  305. package/public/dist/assets/{dist-BJyDhGpS.js → dist-DrIWh2fi.js} +1 -1
  306. package/public/dist/assets/{dist-BGzHP3f8.js → dist-DzT7frM2.js} +1 -1
  307. package/public/dist/assets/{dist-wdLr2dSH.js → dist-Qs7HHNCC.js} +1 -1
  308. package/public/dist/assets/{dist-BjqyutOM.js → dist-Rs_Khtjb.js} +1 -1
  309. package/public/dist/assets/{dist-DdhWu7OM.js → dist-fJAyK82z.js} +1 -1
  310. package/public/dist/assets/{dist-G7QUHtDS.js → dist-jcptfm_T.js} +1 -1
  311. package/public/dist/assets/dist-sOV2kBhQ.js +1 -0
  312. package/public/dist/assets/{dist-BoG5I6U5.js → dist-vQskrHxt.js} +1 -1
  313. package/public/dist/assets/{dockerfile-CrC2HXHP.js → dockerfile-DAfh5qoE.js} +1 -1
  314. package/public/dist/assets/{employees-CIkIyvtL.js → employees-DRmX2RDd.js} +2 -2
  315. package/public/dist/assets/{erDiagram-SMLLAGMA-BvtqhMsS.js → erDiagram-TEJ5UH35-CRvCbztR.js} +6 -6
  316. package/public/dist/assets/{error-normalize-CkhPeQYx.js → error-normalize-CNbPE4lO.js} +1 -1
  317. package/public/dist/assets/eventmodeling-FCH6USID-Cq0nylxO.js +1 -0
  318. package/public/dist/assets/{factor-1CttFx2G.js → factor-BpoYJieo.js} +1 -1
  319. package/public/dist/assets/fields-DUawAHWZ.js +1 -0
  320. package/public/dist/assets/flowDiagram-I6XJVG4X-CzvVnib_.js +162 -0
  321. package/public/dist/assets/ganttDiagram-6RSMTGT7-BbUYP6iv.js +292 -0
  322. package/public/dist/assets/gitGraph-WXDBUCRP-DDq6-3D3.js +1 -0
  323. package/public/dist/assets/gitGraphDiagram-PVQCEYII-CbKdM7nW.js +106 -0
  324. package/public/dist/assets/graphlib-BLOO0H5r.js +1 -0
  325. package/public/dist/assets/info-J43DQDTF-OUnqwpUV.js +1 -0
  326. package/public/dist/assets/infoDiagram-5YYISTIA-BrZmg1At.js +2 -0
  327. package/public/dist/assets/{ishikawaDiagram-UXIWVN3A-DZW-Nqsf.js → ishikawaDiagram-YF4QCWOH-BDWXqJi5.js} +2 -2
  328. package/public/dist/assets/javascript-CZjRNq5R.js +1 -0
  329. package/public/dist/assets/{journeyDiagram-VCZTEJTY-ByVRJxVF.js → journeyDiagram-JHISSGLW-CPFRd_M3.js} +6 -6
  330. package/public/dist/assets/{jsx-runtime-BjL7qHh8.js → jsx-runtime-BZmCptaP.js} +1 -1
  331. package/public/dist/assets/{kanban-definition-6JOO6SKY-xwN0YCW2.js → kanban-definition-UN3LZRKU-BcQbBplS.js} +10 -10
  332. package/public/dist/assets/katex-CF5bGce6.js +1 -0
  333. package/public/dist/assets/manager-B5OmizBL.css +1 -0
  334. package/public/dist/assets/manager-Cs3eMBcx.js +25 -0
  335. package/public/dist/assets/{memory-CnBc2_Va.js → memory-BA-ki3gn.js} +1 -1
  336. package/public/dist/assets/memory-DLQbyBA3.js +1 -0
  337. package/public/dist/assets/mermaid-loader-BVPsKrpr.js +1 -0
  338. package/public/dist/assets/mermaid-parser.core-C62NUJRb.js +3 -0
  339. package/public/dist/assets/mermaid.core-ArqR5iFa.js +9 -0
  340. package/public/dist/assets/mermaid.core-BAwu4U2Y.js +1 -0
  341. package/public/dist/assets/{mindmap-definition-QFDTVHPH-Chqgsh1N.js → mindmap-definition-RKZ34NQL-C35cGkNU.js} +29 -29
  342. package/public/dist/assets/{nsis-_CjIiUyF.js → nsis-Ch4QINLN.js} +1 -1
  343. package/public/dist/assets/packet-YPE3B663-Bb9hBQ06.js +1 -0
  344. package/public/dist/assets/{page-shell-CTxVDJ8Y.js → page-shell-CVAobxbP.js} +1 -1
  345. package/public/dist/assets/pie-LRSECV5Y-CNRQnRNZ.js +1 -0
  346. package/public/dist/assets/pieDiagram-4H26LBE5-B8C_hoqJ.js +30 -0
  347. package/public/dist/assets/provider-icons-dxT69zGg.js +8 -0
  348. package/public/dist/assets/{pug-CbR8lCtK.js → pug-CXYqmmpP.js} +1 -1
  349. package/public/dist/assets/quadrantDiagram-W4KKPZXB-BEPrine5.js +7 -0
  350. package/public/dist/assets/radar-GUYGQ44K-BxngU2v0.js +1 -0
  351. package/public/dist/assets/{render-lpTpN1El.js → render-C7_e0J_X.js} +3 -3
  352. package/public/dist/assets/{requirementDiagram-MS252O5E-wnPtv0LG.js → requirementDiagram-4Y6WPE33-ClDDon9c.js} +4 -4
  353. package/public/dist/assets/rolldown-runtime-XQCOJYun.js +1 -0
  354. package/public/dist/assets/sankeyDiagram-5OEKKPKP-Bjs3OE-1.js +40 -0
  355. package/public/dist/assets/sequenceDiagram-3UESZ5HK-BM8IAaEe.js +162 -0
  356. package/public/dist/assets/settings-DjyKdqev.js +1 -0
  357. package/public/dist/assets/settings-pUJzyeX2.js +42 -0
  358. package/public/dist/assets/{sidebar-Cwt0FxQl.js → sidebar-CO9Qjj6v.js} +2 -2
  359. package/public/dist/assets/skills-CX3qJ77s.js +1 -0
  360. package/public/dist/assets/{skills-DDmTyywh.js → skills-Dq7fD8I3.js} +1 -1
  361. package/public/dist/assets/{slash-commands-D5y5AVvS.js → slash-commands-DRsKtuGT.js} +1 -1
  362. package/public/dist/assets/slash-commands-UbS8w9ij.js +1 -0
  363. package/public/dist/assets/stateDiagram-AJRCARHV-BvNABuXE.js +1 -0
  364. package/public/dist/assets/stateDiagram-v2-BHNVJYJU-CCIo81qy.js +1 -0
  365. package/public/dist/assets/{timeline-definition-GMOUNBTQ-DUz1-iOx.js → timeline-definition-PNZ67QCA-CIvTvac3.js} +8 -8
  366. package/public/dist/assets/trace-drawer-DDFdU07_.js +15 -0
  367. package/public/dist/assets/treeView-BLDUP644-cXRzPGzz.js +1 -0
  368. package/public/dist/assets/treemap-LRROVOQU-BsZE5HPE.js +1 -0
  369. package/public/dist/assets/ui-CeBmBBZM.js +140 -0
  370. package/public/dist/assets/ui-TMXjvH0r.js +1 -0
  371. package/public/dist/assets/{vendor-render-DEStnpJ8.js → vendor-render-DCb9B75Q.js} +38 -37
  372. package/public/dist/assets/vendor-utils-BnxL60_-.js +1 -0
  373. package/public/dist/assets/vennDiagram-CIIHVFJN-C5cbS2KC.js +34 -0
  374. package/public/dist/assets/wardley-L42UT6IY-D_qm0cZD.js +1 -0
  375. package/public/dist/assets/{wardleyDiagram-NUSXRM2D-CLAhOzap.js → wardleyDiagram-YWT4CUSO-BsRBBGFP.js} +61 -3
  376. package/public/dist/assets/{wiki-link-suggestions-LQuYT22G.js → wiki-link-suggestions-BHwNQXT_.js} +2 -2
  377. package/public/dist/assets/{xychartDiagram-5P7HB3ND-DLnY9i8z.js → xychartDiagram-2RQKCTM6-B6rqui6F.js} +6 -6
  378. package/public/dist/index.html +102 -3
  379. package/public/dist/manager/index.html +2 -2
  380. package/public/index.html +101 -1
  381. package/public/js/constants.ts +72 -0
  382. package/public/js/diagram/iframe-renderer.ts +7 -0
  383. package/public/js/features/chat-scroll.ts +31 -0
  384. package/public/js/features/chat-search.ts +223 -0
  385. package/public/js/features/help-content.ts +20 -2
  386. package/public/js/features/help-dialog.ts +38 -2
  387. package/public/js/features/pending-queue.ts +6 -0
  388. package/public/js/features/process-block.ts +20 -0
  389. package/public/js/features/settings-channel.ts +3 -1
  390. package/public/js/features/settings-cli-status.ts +24 -3
  391. package/public/js/features/settings-core.ts +134 -21
  392. package/public/js/features/settings-types.ts +12 -1
  393. package/public/js/features/settings.ts +1 -1
  394. package/public/js/features/trace-drawer.ts +2 -1
  395. package/public/js/features/voice-recorder.ts +222 -42
  396. package/public/js/main.ts +58 -4
  397. package/public/js/provider-icons.ts +46 -27
  398. package/public/js/render/markdown.ts +6 -0
  399. package/public/js/ui.ts +33 -7
  400. package/public/js/ws.ts +5 -1
  401. package/public/locales/en.json +31 -7
  402. package/public/locales/ja.json +31 -7
  403. package/public/locales/ko.json +31 -7
  404. package/public/locales/zh.json +31 -7
  405. package/public/manager/src/App.tsx +19 -55
  406. package/public/manager/src/InstancePreview.tsx +46 -1
  407. package/public/manager/src/components/InstanceDetailPanel.tsx +7 -2
  408. package/public/manager/src/components/InstanceLogsPanel.tsx +138 -0
  409. package/public/manager/src/dashboard-settings/DashboardEmbeddingSection.tsx +37 -7
  410. package/public/manager/src/jaw-ceo/useJawCeoDashboardBridge.tsx +1 -0
  411. package/public/manager/src/manager-components.css +76 -0
  412. package/public/manager/src/preview.ts +26 -3
  413. package/public/manager/src/settings/fields/SelectField.tsx +51 -17
  414. package/public/manager/src/settings/pages/Agent.tsx +37 -2
  415. package/public/manager/src/settings/pages/Heartbeat.tsx +3 -2
  416. package/public/manager/src/settings/pages/Memory.tsx +3 -2
  417. package/public/manager/src/settings/pages/components/EmployeeRow.tsx +8 -4
  418. package/public/manager/src/settings/pages/components/PerCliRow.tsx +31 -5
  419. package/public/manager/src/settings/pages/components/agent/FlushAgentSection.tsx +4 -2
  420. package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +1 -1
  421. package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +23 -1
  422. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +49 -0
  423. package/public/manager/src/settings/pages/components/employees-helpers.ts +6 -1
  424. package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +11 -1
  425. package/public/manager/src/settings-controls.css +25 -0
  426. package/public/manager/src/usePreviewShortcutMessages.ts +30 -0
  427. package/public/manager/src/usePreviewSttLifecycle.ts +31 -0
  428. package/scripts/fresh-install-smoke.ts +1 -1
  429. package/scripts/install-officecli.ps1 +33 -5
  430. package/scripts/install-officecli.sh +52 -8
  431. package/scripts/install-wsl.sh +96 -24
  432. package/scripts/install.sh +82 -11
  433. package/scripts/postinstall-guard.cjs +57 -30
  434. package/public/dist/assets/Agent-DNpehKB2.js +0 -1
  435. package/public/dist/assets/DashboardEmbeddingSection-BYdGgqg7.js +0 -2
  436. package/public/dist/assets/Employees-CuYuTy0R.js +0 -1
  437. package/public/dist/assets/Heartbeat-C-vq02MW.js +0 -1
  438. package/public/dist/assets/Memory-BPKWJDXK.js +0 -1
  439. package/public/dist/assets/ModelProvider-Bd6vGkXT.js +0 -1
  440. package/public/dist/assets/agent-meta-C1pQzExf.js +0 -1
  441. package/public/dist/assets/app-BxsIleo0.js +0 -32
  442. package/public/dist/assets/app-CB9n5A77.css +0 -1
  443. package/public/dist/assets/architecture-YZFGNWBL-BRI-0IaU.js +0 -1
  444. package/public/dist/assets/architectureDiagram-Q4EWVU46-z0JCgZrJ.js +0 -36
  445. package/public/dist/assets/blockDiagram-DXYQGD6D-KaOz3aFS.js +0 -132
  446. package/public/dist/assets/channel-jLopKIgm.js +0 -1
  447. package/public/dist/assets/chunk-2KRD3SAO-C8hJZPJu.js +0 -1
  448. package/public/dist/assets/chunk-426QAEUC-atJRhvKN.js +0 -1
  449. package/public/dist/assets/chunk-4TB4RGXK-BD7UhIN8.js +0 -206
  450. package/public/dist/assets/chunk-55IACEB6-CAWcPDdr.js +0 -1
  451. package/public/dist/assets/chunk-5FUZZQ4R-Cg1pzs6p.js +0 -62
  452. package/public/dist/assets/chunk-5PVQY5BW-otv3HwE_.js +0 -2
  453. package/public/dist/assets/chunk-67CJDMHE-AU2iOKLT.js +0 -1
  454. package/public/dist/assets/chunk-7N4EOEYR-BTIS4jBw.js +0 -1
  455. package/public/dist/assets/chunk-AA7GKIK3-c9UUJO_T.js +0 -1
  456. package/public/dist/assets/chunk-CIAEETIT-Dwbln6rM.js +0 -1
  457. package/public/dist/assets/chunk-ENJZ2VHE-PT_jAckw.js +0 -10
  458. package/public/dist/assets/chunk-FOC6F5B3-BqDmFFeg.js +0 -1
  459. package/public/dist/assets/chunk-ICPOFSXX-P6V6jqiT.js +0 -122
  460. package/public/dist/assets/chunk-K5T4RW27-C42sOmZR.js +0 -27
  461. package/public/dist/assets/chunk-KGLVRYIC-K-BVa8b2.js +0 -1
  462. package/public/dist/assets/chunk-ORNJ4GCN-CEXU6WaD.js +0 -1
  463. package/public/dist/assets/chunk-OYMX7WX6-DmJG2z1S.js +0 -231
  464. package/public/dist/assets/chunk-QZHKN3VN-BkVLii_3.js +0 -1
  465. package/public/dist/assets/chunk-U2HBQHQK-Ny6UwUgK.js +0 -11
  466. package/public/dist/assets/chunk-YZCP3GAM-c7FYtZME.js +0 -1
  467. package/public/dist/assets/classDiagram-6PBFFD2Q-BgOyAynm.js +0 -1
  468. package/public/dist/assets/classDiagram-v2-HSJHXN6E-5gBdoVH9.js +0 -1
  469. package/public/dist/assets/constants-4A2GptQT.js +0 -1
  470. package/public/dist/assets/cose-bilkent-S5V4N54A-CvH6qY_r.js +0 -1
  471. package/public/dist/assets/dagre--20B2-ZQ.js +0 -1
  472. package/public/dist/assets/dagre-KV5264BT-CQ0wo0ma.js +0 -4
  473. package/public/dist/assets/diagram-G4DWMVQ6-_aP6kMTh.js +0 -24
  474. package/public/dist/assets/diagram-MMDJMWI5-J1l6Q0JG.js +0 -43
  475. package/public/dist/assets/dist-B1p80u1b.js +0 -1
  476. package/public/dist/assets/dist-BKyzWv22.js +0 -1
  477. package/public/dist/assets/dist-CxJpXP6s.js +0 -1
  478. package/public/dist/assets/dist-DNLFuTrS.js +0 -1
  479. package/public/dist/assets/fields-BISouxp2.js +0 -1
  480. package/public/dist/assets/flowDiagram-DWJPFMVM-C_F0rqqT.js +0 -162
  481. package/public/dist/assets/ganttDiagram-T4ZO3ILL-B5S8EZRg.js +0 -292
  482. package/public/dist/assets/gitGraph-7Q5UKJZL-DTTW6pxr.js +0 -1
  483. package/public/dist/assets/gitGraphDiagram-UUTBAWPF-DMGzYJeb.js +0 -106
  484. package/public/dist/assets/graphlib-CZk_Ii16.js +0 -1
  485. package/public/dist/assets/info-OMHHGYJF-BU-iuaSm.js +0 -1
  486. package/public/dist/assets/infoDiagram-42DDH7IO-dzSaYFFK.js +0 -2
  487. package/public/dist/assets/javascript-BhB45e0W.js +0 -1
  488. package/public/dist/assets/katex-DamPUmTE.js +0 -1
  489. package/public/dist/assets/manager-B84u-pcn.js +0 -25
  490. package/public/dist/assets/manager-DMg_sTEP.css +0 -1
  491. package/public/dist/assets/memory-BV62wlsG.js +0 -1
  492. package/public/dist/assets/mermaid-loader-DxFGz4EE.js +0 -1
  493. package/public/dist/assets/mermaid-parser.core-CMIZ0my_.js +0 -3
  494. package/public/dist/assets/mermaid.core-CicVBD9l.js +0 -1
  495. package/public/dist/assets/mermaid.core-Dj6viEzN.js +0 -11
  496. package/public/dist/assets/packet-4T2RLAQJ-DzmBsAf0.js +0 -1
  497. package/public/dist/assets/pie-ZZUOXDRM-DyG1KzTn.js +0 -1
  498. package/public/dist/assets/pieDiagram-DEJITSTG-DJLiSymi.js +0 -30
  499. package/public/dist/assets/quadrantDiagram-34T5L4WZ-qcnWmcRr.js +0 -7
  500. package/public/dist/assets/radar-PYXPWWZC-CEBZARUu.js +0 -1
  501. package/public/dist/assets/rolldown-runtime-DE9SaGGd.js +0 -1
  502. package/public/dist/assets/sankeyDiagram-XADWPNL6-Bn3pUd_K.js +0 -10
  503. package/public/dist/assets/sequenceDiagram-FGHM5R23-DfxcHSdj.js +0 -157
  504. package/public/dist/assets/settings-CfAXLa8a.js +0 -1
  505. package/public/dist/assets/settings-FWgmcubl.js +0 -40
  506. package/public/dist/assets/skills-D-qUVJ-e.js +0 -1
  507. package/public/dist/assets/slash-commands-BfI19vIz.js +0 -1
  508. package/public/dist/assets/stateDiagram-FHFEXIEX-CiR7P2OG.js +0 -1
  509. package/public/dist/assets/stateDiagram-v2-QKLJ7IA2-BaWWpysK.js +0 -1
  510. package/public/dist/assets/trace-drawer-DVF5F1df.js +0 -15
  511. package/public/dist/assets/treeView-SZITEDCU-D5-TP7Qp.js +0 -1
  512. package/public/dist/assets/treemap-W4RFUUIX-BQhm_ZSp.js +0 -1
  513. package/public/dist/assets/ui-BJXY16Dk.js +0 -140
  514. package/public/dist/assets/ui-BXm3OPPh.js +0 -1
  515. package/public/dist/assets/vendor-utils-IVTPs69f.js +0 -68
  516. package/public/dist/assets/vennDiagram-DHZGUBPP-CYu7SDdG.js +0 -34
  517. package/public/dist/assets/wardley-RL74JXVD-CpnBMRe0.js +0 -1
  518. package/public/manager/src/settings/pages/Embedding.tsx +0 -382
  519. /package/public/dist/assets/{apl-HYRstREL.js → apl-CieDeb7B.js} +0 -0
  520. /package/public/dist/assets/{asciiarmor-BDXCrhAK.js → asciiarmor-BRTyulZY.js} +0 -0
  521. /package/public/dist/assets/{asn1-CnSBhb0M.js → asn1-DoNAtQ5o.js} +0 -0
  522. /package/public/dist/assets/{asterisk-AqV7rnIi.js → asterisk-CR7oKPxi.js} +0 -0
  523. /package/public/dist/assets/{brainfuck-Dv46-iL9.js → brainfuck-abzPcrOz.js} +0 -0
  524. /package/public/dist/assets/{clike-GRffz5hY.js → clike-B71Zq38G.js} +0 -0
  525. /package/public/dist/assets/{clojure-DzgT_fqE.js → clojure-Zm0UzHPq.js} +0 -0
  526. /package/public/dist/assets/{cmake-Co1237r5.js → cmake-D3UNdg6L.js} +0 -0
  527. /package/public/dist/assets/{cobol-rUaLketb.js → cobol-4fYvwQR0.js} +0 -0
  528. /package/public/dist/assets/{coffeescript-DQyfHE86.js → coffeescript-Ct6bZdRU.js} +0 -0
  529. /package/public/dist/assets/{commonlisp-Buue1PGW.js → commonlisp-CrgXVPcd.js} +0 -0
  530. /package/public/dist/assets/{crystal-BMWO0kOJ.js → crystal-bGOl67VM.js} +0 -0
  531. /package/public/dist/assets/{css-DaxibPo5.js → css-B_EV3Xq2.js} +0 -0
  532. /package/public/dist/assets/{cypher-CmpGfiBR.js → cypher-DXDlHTYf.js} +0 -0
  533. /package/public/dist/assets/{cytoscape.esm-zT8GwLFm.js → cytoscape.esm-BK7ao2Ti.js} +0 -0
  534. /package/public/dist/assets/{d-qmdtoIzU.js → d-RL5ynsiz.js} +0 -0
  535. /package/public/dist/assets/{diff-B40m6u1h.js → diff-B5McBGjz.js} +0 -0
  536. /package/public/dist/assets/{dtd-569ynYVj.js → dtd-l3sK4p_C.js} +0 -0
  537. /package/public/dist/assets/{dylan-Dxolp30i.js → dylan-WjJGY-rW.js} +0 -0
  538. /package/public/dist/assets/{ebnf-BZiX9Iq3.js → ebnf-BGY79HOS.js} +0 -0
  539. /package/public/dist/assets/{ecl-B8F1Q0oZ.js → ecl-BKh7OE1d.js} +0 -0
  540. /package/public/dist/assets/{eiffel-Bv8Kvgh1.js → eiffel-Bzvlg3oK.js} +0 -0
  541. /package/public/dist/assets/{elm-QWXQaIis.js → elm-5_BqNmKu.js} +0 -0
  542. /package/public/dist/assets/{erlang-CuDGzTGm.js → erlang-BdVwz8I8.js} +0 -0
  543. /package/public/dist/assets/{fcl-BiFeqtHf.js → fcl-B9cnfODD.js} +0 -0
  544. /package/public/dist/assets/{forth-R7Uc2VcL.js → forth-wZbbnGzb.js} +0 -0
  545. /package/public/dist/assets/{fortran-kDRG6BzW.js → fortran-BAJZrRfU.js} +0 -0
  546. /package/public/dist/assets/{gas-CyRkuC5T.js → gas-D60ZhBat.js} +0 -0
  547. /package/public/dist/assets/{gherkin-BE0p00ey.js → gherkin-B8tKjAAi.js} +0 -0
  548. /package/public/dist/assets/{groovy-B_Sh3D1t.js → groovy-BAG9eJUD.js} +0 -0
  549. /package/public/dist/assets/{haskell-DWXgCy4o.js → haskell-Cj4TmWbg.js} +0 -0
  550. /package/public/dist/assets/{haxe-xGxZ54Hv.js → haxe-8chnvz-o.js} +0 -0
  551. /package/public/dist/assets/{http-CKv9cSBA.js → http-DDYeO71z.js} +0 -0
  552. /package/public/dist/assets/{idl-DmlI3XzS.js → idl-D1hY-Gp_.js} +0 -0
  553. /package/public/dist/assets/{javascript-j6r5uf_k.js → javascript-Sh0ZUMP2.js} +0 -0
  554. /package/public/dist/assets/{julia-CQSp9Qa0.js → julia-BibioBF2.js} +0 -0
  555. /package/public/dist/assets/{livescript-CqvtVTlb.js → livescript-CSZrB6F4.js} +0 -0
  556. /package/public/dist/assets/{lua-DazQKUZ0.js → lua-BvTlo5w3.js} +0 -0
  557. /package/public/dist/assets/{mathematica-DqhJVCs9.js → mathematica-Bexv8BWZ.js} +0 -0
  558. /package/public/dist/assets/{mbox-Dsyo1_UL.js → mbox-BAhbA8z2.js} +0 -0
  559. /package/public/dist/assets/{mirc-D7ThhoF-.js → mirc-BzT5Kh4S.js} +0 -0
  560. /package/public/dist/assets/{mllike-EPZ6pqQD.js → mllike-DeoJnUZQ.js} +0 -0
  561. /package/public/dist/assets/{modelica-PU45hbqg.js → modelica-FD_-Fxlc.js} +0 -0
  562. /package/public/dist/assets/{mscgen-DEnh2Ojr.js → mscgen-C-OyhbwB.js} +0 -0
  563. /package/public/dist/assets/{mumps-8GhR7rRa.js → mumps-BxkCDTK7.js} +0 -0
  564. /package/public/dist/assets/{nginx-CXwagpwp.js → nginx-2JaV__gC.js} +0 -0
  565. /package/public/dist/assets/{ntriples-BDQxxstw.js → ntriples--rhhCzqb.js} +0 -0
  566. /package/public/dist/assets/{octave-2c90WnyU.js → octave-rS4nMzRe.js} +0 -0
  567. /package/public/dist/assets/{oz-CO0rQ8EL.js → oz-I4fMb_NC.js} +0 -0
  568. /package/public/dist/assets/{pascal-CcVwOGeN.js → pascal-BEghJs8t.js} +0 -0
  569. /package/public/dist/assets/{path-utils-DySmCVZK.js → path-utils-r2bJIu28.js} +0 -0
  570. /package/public/dist/assets/{perl-B9UvGoAV.js → perl-BRO9ZFo9.js} +0 -0
  571. /package/public/dist/assets/{pig-Cd1f86ZJ.js → pig-L4Ii6KI0.js} +0 -0
  572. /package/public/dist/assets/{powershell-DV4cOnkJ.js → powershell-BBeqUCRp.js} +0 -0
  573. /package/public/dist/assets/{properties-DaSVPhrZ.js → properties-Boi0jF2J.js} +0 -0
  574. /package/public/dist/assets/{protobuf-CEtFnY22.js → protobuf-fB2aGypX.js} +0 -0
  575. /package/public/dist/assets/{puppet-Ca0DHfcW.js → puppet-BRmsErtO.js} +0 -0
  576. /package/public/dist/assets/{python-ydzCwWG-.js → python-Be4P9Dgp.js} +0 -0
  577. /package/public/dist/assets/{q-Cl8kzQmk.js → q-DZGhDLYt.js} +0 -0
  578. /package/public/dist/assets/{r-DKZPJFrD.js → r-B4NERjRM.js} +0 -0
  579. /package/public/dist/assets/{rough.esm-Dnk3WN4D.js → rough.esm-C0Gkx4O1.js} +0 -0
  580. /package/public/dist/assets/{rpm-D0lqeHoZ.js → rpm-e-QbHJ1q.js} +0 -0
  581. /package/public/dist/assets/{ruby-RVmtmNDw.js → ruby-BSVP_v59.js} +0 -0
  582. /package/public/dist/assets/{sas-CEzodAB7.js → sas-DHlU4v4g.js} +0 -0
  583. /package/public/dist/assets/{scheme-Pqmt6dh3.js → scheme-BGXbz5Hz.js} +0 -0
  584. /package/public/dist/assets/{settings-client-BN3XzwEo.js → settings-client-DPuJroyk.js} +0 -0
  585. /package/public/dist/assets/{shell-CLG3zy-u.js → shell-yonx6xY2.js} +0 -0
  586. /package/public/dist/assets/{sieve-C95IWC3O.js → sieve-ClPJUZyi.js} +0 -0
  587. /package/public/dist/assets/{simple-mode-B9ErAHMD.js → simple-mode-CjViblDK.js} +0 -0
  588. /package/public/dist/assets/{smalltalk-4cL-gRJb.js → smalltalk-CHXubeqS.js} +0 -0
  589. /package/public/dist/assets/{solr-CEA7oOx_.js → solr-C6q6YwPz.js} +0 -0
  590. /package/public/dist/assets/{sparql-w8kHjP6I.js → sparql-CcspZvEd.js} +0 -0
  591. /package/public/dist/assets/{spreadsheet-C8bDfTgC.js → spreadsheet-DH3a4LBS.js} +0 -0
  592. /package/public/dist/assets/{sql-BrKz8968.js → sql-meoY6gNi.js} +0 -0
  593. /package/public/dist/assets/{stex-xFw1nXeT.js → stex-D2bn6Zsh.js} +0 -0
  594. /package/public/dist/assets/{stylus-gS_68vPk.js → stylus-DbXGih0S.js} +0 -0
  595. /package/public/dist/assets/{swift-D5lXmY2d.js → swift-Ch391uOd.js} +0 -0
  596. /package/public/dist/assets/{tcl-D-41REtC.js → tcl-CQBgGWDP.js} +0 -0
  597. /package/public/dist/assets/{textile-D-Znao0j.js → textile-4i3oG3tg.js} +0 -0
  598. /package/public/dist/assets/{tiddlywiki-Co8lXJKd.js → tiddlywiki-CXG1-CcK.js} +0 -0
  599. /package/public/dist/assets/{tiki-DsiNRYMP.js → tiki-DJqKUhA-.js} +0 -0
  600. /package/public/dist/assets/{toml-CaVZGou4.js → toml-C1FnyICQ.js} +0 -0
  601. /package/public/dist/assets/{troff-DJvDVr-d.js → troff-Cp8NvRO0.js} +0 -0
  602. /package/public/dist/assets/{ttcn-DAC92l4d.js → ttcn-NlmW_fji.js} +0 -0
  603. /package/public/dist/assets/{ttcn-cfg-C0X-mYlr.js → ttcn-cfg-BVuxfGZf.js} +0 -0
  604. /package/public/dist/assets/{turtle-D6WHyCrL.js → turtle-Ba9ERlnm.js} +0 -0
  605. /package/public/dist/assets/{vb-CEo_ccq3.js → vb-DDs4gjJb.js} +0 -0
  606. /package/public/dist/assets/{vbscript-B_PKDV1v.js → vbscript-gOFmdMJN.js} +0 -0
  607. /package/public/dist/assets/{velocity-ClKnKBLH.js → velocity-DtSNZA7i.js} +0 -0
  608. /package/public/dist/assets/{verilog-Pnuspgw6.js → verilog-Pldmtxe7.js} +0 -0
  609. /package/public/dist/assets/{vhdl-CZnyY4fs.js → vhdl-BFfSgWGp.js} +0 -0
  610. /package/public/dist/assets/{w3c-keyname-DJlC6DTY.js → w3c-keyname-BggQEPNo.js} +0 -0
  611. /package/public/dist/assets/{webidl-DHr762Dm.js → webidl-B6ZFYE2L.js} +0 -0
  612. /package/public/dist/assets/{xquery-5-FiyUtN.js → xquery-DhxUT98N.js} +0 -0
  613. /package/public/dist/assets/{yacas-GlqsXIeT.js → yacas-jSkQeF1Q.js} +0 -0
  614. /package/public/dist/assets/{z80-CI7N40Oo.js → z80-D7Lt6v61.js} +0 -0
@@ -21,6 +21,7 @@ REPO="${ENV_REPO:-lidge-jun/OfficeCLI}"
21
21
  INSTALL_DIR="${HOME}/.local/bin"
22
22
  TARGET_BIN="${INSTALL_DIR}/officecli"
23
23
  DOWNLOAD_BIN="${INSTALL_DIR}/officecli.download"
24
+ SIDECAR_DOWNLOAD="${INSTALL_DIR}/officecli-sidecar.download"
24
25
 
25
26
  UPSTREAM=false
26
27
  FORCE=false
@@ -98,20 +99,28 @@ get_latest_version() {
98
99
  # ── Check existing installation ──
99
100
  if [ -f "$TARGET_BIN" ] && [ "$FORCE" = "false" ] && [ "$UPDATE" = "false" ]; then
100
101
  if CURRENT=$("$TARGET_BIN" --version 2>/dev/null); then
101
- ok "officecli already installed: v${CURRENT}"
102
- echo " Use --force to reinstall or --update to refresh only when outdated"
103
- exit 0
104
- fi
102
+ if [ -f "${INSTALL_DIR}/rhwp-field-bridge" ] && [ -f "${INSTALL_DIR}/rhwp-officecli-bridge" ]; then
103
+ ok "officecli already installed: v${CURRENT}"
104
+ echo " Use --force to reinstall or --update to refresh only when outdated"
105
+ exit 0
106
+ fi
105
107
 
106
- warn "Existing officecli is not executable; reinstalling"
108
+ warn "officecli is installed, but HWP sidecars are missing; refreshing installation"
109
+ else
110
+ warn "Existing officecli is not executable; reinstalling"
111
+ fi
107
112
  fi
108
113
 
109
114
  if [ -f "$TARGET_BIN" ] && [ "$FORCE" = "false" ] && [ "$UPDATE" = "true" ]; then
110
115
  CURRENT=$("$TARGET_BIN" --version 2>/dev/null || true)
111
116
  LATEST=$(get_latest_version)
112
117
  if [ -n "$CURRENT" ] && [ -n "$LATEST" ] && [ "$(normalize_version "$CURRENT")" = "$(normalize_version "$LATEST")" ]; then
113
- ok "officecli already up to date: v$(normalize_version "$CURRENT")"
114
- exit 0
118
+ if [ ! -f "${INSTALL_DIR}/rhwp-field-bridge" ] || [ ! -f "${INSTALL_DIR}/rhwp-officecli-bridge" ]; then
119
+ warn "officecli is current, but HWP sidecars are missing; refreshing installation"
120
+ else
121
+ ok "officecli already up to date: v$(normalize_version "$CURRENT")"
122
+ exit 0
123
+ fi
115
124
  fi
116
125
  if [ -n "$CURRENT" ] && [ -n "$LATEST" ]; then
117
126
  info "Updating officecli v$(normalize_version "$CURRENT") → v$(normalize_version "$LATEST")"
@@ -124,9 +133,14 @@ fi
124
133
  mkdir -p "$INSTALL_DIR"
125
134
  DOWNLOAD_URL="https://github.com/${REPO}/releases/latest/download/${ASSET}"
126
135
  CHECKSUM_URL="https://github.com/${REPO}/releases/latest/download/SHA256SUMS"
136
+ ASSET_BASE="${ASSET%.exe}"
137
+ SIDECAR_EXT=""
138
+ if [[ "$ASSET" == *.exe ]]; then
139
+ SIDECAR_EXT=".exe"
140
+ fi
127
141
 
128
142
  info "Downloading officecli from ${REPO}..."
129
- trap 'rm -f "$DOWNLOAD_BIN"' EXIT
143
+ trap 'rm -f "$DOWNLOAD_BIN" "$SIDECAR_DOWNLOAD"' EXIT
130
144
  curl -fsSL "$DOWNLOAD_URL" -o "$DOWNLOAD_BIN" || fail "Download failed: $DOWNLOAD_URL"
131
145
  chmod +x "$DOWNLOAD_BIN"
132
146
 
@@ -163,6 +177,36 @@ VERSION=$("$DOWNLOAD_BIN" --version 2>/dev/null) || fail "Binary exists but won'
163
177
  mv "$DOWNLOAD_BIN" "$TARGET_BIN"
164
178
  ok "officecli v${VERSION} installed → ${TARGET_BIN}"
165
179
 
180
+ install_sidecar() {
181
+ local sidecar="$1"
182
+ local sidecar_asset="${ASSET_BASE}-${sidecar}${SIDECAR_EXT}"
183
+ local sidecar_target="${INSTALL_DIR}/${sidecar}${SIDECAR_EXT}"
184
+ local sidecar_url="https://github.com/${REPO}/releases/latest/download/${sidecar_asset}"
185
+
186
+ info "Checking optional HWP sidecar ${sidecar_asset}..."
187
+ if ! curl -fsSL "$sidecar_url" -o "$SIDECAR_DOWNLOAD"; then
188
+ warn "Optional HWP sidecar unavailable: ${sidecar_asset}. Binary .hwp create/read/edit will be dependency-gated."
189
+ rm -f "$SIDECAR_DOWNLOAD"
190
+ return 0
191
+ fi
192
+
193
+ chmod +x "$SIDECAR_DOWNLOAD"
194
+ if [ "$OS" = "darwin" ]; then
195
+ if command -v xattr >/dev/null 2>&1; then
196
+ xattr -d com.apple.quarantine "$SIDECAR_DOWNLOAD" >/dev/null 2>&1 || true
197
+ fi
198
+ if command -v codesign >/dev/null 2>&1; then
199
+ codesign --force --deep --sign - "$SIDECAR_DOWNLOAD" >/dev/null 2>&1 || warn "Ad-hoc codesign failed for ${sidecar}; continuing"
200
+ fi
201
+ fi
202
+
203
+ mv "$SIDECAR_DOWNLOAD" "$sidecar_target"
204
+ ok "HWP sidecar installed → ${sidecar_target}"
205
+ }
206
+
207
+ install_sidecar "rhwp-field-bridge"
208
+ install_sidecar "rhwp-officecli-bridge"
209
+
166
210
  # ── Source info ──
167
211
  echo "Installed: $("$TARGET_BIN" --version 2>/dev/null || echo 'unknown')"
168
212
  if [ "$UPSTREAM" = "true" ]; then
@@ -37,6 +37,11 @@ HAS_SUDO=false
37
37
  NPM_PREFIX="$HOME/.local"
38
38
  NPM_PATH_LINE='export PATH="$HOME/.local/bin:$PATH"'
39
39
 
40
+ # Guard: reject Windows HOME (e.g. /mnt/c/Users/...)
41
+ case "$HOME" in
42
+ /mnt/*) fail "HOME points to Windows path: $HOME — launch a proper WSL shell (wsl.exe -d Ubuntu)" ;;
43
+ esac
44
+
40
45
  ensure_sudo() {
41
46
  if [ "$(id -u)" -eq 0 ]; then
42
47
  HAS_SUDO=true
@@ -94,23 +99,58 @@ install_prerequisites() {
94
99
  # Step 1: Node.js version manager
95
100
  # ═══════════════════════════════════════
96
101
  install_node() {
97
- # Check if Node.js >= 22 already exists
102
+ # Check if Node.js >= 22 already exists AND is WSL-native
98
103
  if command -v node &>/dev/null; then
99
- local ver
100
- ver=$(node -v | sed 's/v//' | cut -d. -f1)
101
- if [ "$ver" -ge "$NODE_MAJOR" ] 2>/dev/null; then
102
- ok "Node.js $(node -v) already installed (>= $NODE_MAJOR)"
103
- return 0
104
- else
105
- warn "Node.js $(node -v) found but < $NODE_MAJOR — upgrading..."
106
- fi
104
+ local node_path
105
+ node_path="$(command -v node)"
106
+ # Reject Windows Node accessed via /mnt/c (not usable in WSL)
107
+ case "$node_path" in
108
+ /mnt/*)
109
+ warn "Found Windows Node at $node_path — not usable in WSL, installing WSL-native..."
110
+ ;;
111
+ *)
112
+ local ver
113
+ ver=$(node -v | sed 's/v//' | cut -d. -f1)
114
+ if [ "$ver" -ge "$NODE_MAJOR" ] 2>/dev/null; then
115
+ # Also verify npm is WSL-native before early return
116
+ case "$(command -v npm)" in
117
+ /mnt/*)
118
+ warn "Node is WSL-native but npm resolves to Windows: $(command -v npm) — reinstalling..."
119
+ ;;
120
+ *)
121
+ ok "Node.js $(node -v) already installed (>= $NODE_MAJOR) at $node_path"
122
+ return 0
123
+ ;;
124
+ esac
125
+ else
126
+ warn "Node.js $(node -v) found but < $NODE_MAJOR — upgrading..."
127
+ fi
128
+ ;;
129
+ esac
107
130
  fi
108
131
 
109
132
  # Prefer fnm (fast, single binary), fall back to nvm if already present
133
+ # Skip Windows version managers found via /mnt/c PATH
134
+ local use_fnm=false use_nvm=false
110
135
  if command -v fnm &>/dev/null; then
136
+ case "$(command -v fnm)" in
137
+ /mnt/*) warn "Ignoring Windows fnm at $(command -v fnm)" ;;
138
+ *) use_fnm=true ;;
139
+ esac
140
+ fi
141
+ if ! $use_fnm; then
142
+ if command -v nvm &>/dev/null || [ -s "$HOME/.nvm/nvm.sh" ]; then
143
+ case "$(command -v nvm 2>/dev/null || echo "$HOME/.nvm/nvm.sh")" in
144
+ /mnt/*) warn "Ignoring Windows nvm at $(command -v nvm)" ;;
145
+ *) use_nvm=true ;;
146
+ esac
147
+ fi
148
+ fi
149
+
150
+ if $use_fnm; then
111
151
  info "fnm detected — installing Node.js $NODE_MAJOR..."
112
152
  fnm install "$NODE_MAJOR" && fnm use "$NODE_MAJOR" && fnm default "$NODE_MAJOR"
113
- elif command -v nvm &>/dev/null || [ -s "$HOME/.nvm/nvm.sh" ]; then
153
+ elif $use_nvm; then
114
154
  info "nvm detected — installing Node.js $NODE_MAJOR..."
115
155
  # shellcheck disable=SC1091
116
156
  [ -s "$HOME/.nvm/nvm.sh" ] && source "$HOME/.nvm/nvm.sh"
@@ -127,12 +167,19 @@ install_node() {
127
167
  fnm install "$NODE_MAJOR" && fnm use "$NODE_MAJOR" && fnm default "$NODE_MAJOR"
128
168
  fi
129
169
 
130
- # Verify
131
- if command -v node &>/dev/null; then
132
- ok "Node.js $(node -v) ready"
133
- else
170
+ # Verify Node is installed AND WSL-native
171
+ if ! command -v node &>/dev/null; then
134
172
  fail "Node.js installation failed. Please install manually: https://nodejs.org"
135
173
  fi
174
+ local final_node
175
+ final_node="$(command -v node)"
176
+ case "$final_node" in
177
+ /mnt/*) fail "Node.js installed but resolves to Windows path: $final_node — install WSL-native Node" ;;
178
+ esac
179
+ case "$(command -v npm)" in
180
+ /mnt/*) fail "npm resolves to Windows path: $(command -v npm) — install WSL-native Node" ;;
181
+ esac
182
+ ok "Node.js $(node -v) ready at $final_node"
136
183
  }
137
184
 
138
185
  # ═══════════════════════════════════════
@@ -157,18 +204,36 @@ add_npm_path_to_profile() {
157
204
 
158
205
  configure_npm_prefix() {
159
206
  local prefix="$NPM_PREFIX"
207
+
208
+ # Sanitize npm env vars that can override prefix or config paths
209
+ unset npm_config_prefix NPM_CONFIG_PREFIX
210
+ unset npm_config_globalconfig NPM_CONFIG_GLOBALCONFIG
211
+ unset npm_config_userconfig NPM_CONFIG_USERCONFIG
212
+ unset npm_config_cache NPM_CONFIG_CACHE
213
+ unset PREFIX
214
+
160
215
  mkdir -p "$prefix/bin" "$prefix/lib"
161
216
  npm config set prefix "$prefix"
162
217
  export PATH="$prefix/bin:$PATH"
163
218
  hash -r 2>/dev/null || true
164
219
 
220
+ # Verify effective prefix is WSL-native and matches intent
221
+ local effective
222
+ effective="$(npm config get prefix 2>/dev/null || echo "$prefix")"
223
+ case "$effective" in
224
+ /mnt/*) fail "npm effective prefix points to Windows: $effective" ;;
225
+ esac
226
+ if [ "$effective" != "$prefix" ]; then
227
+ warn "npm prefix mismatch: expected $prefix, got $effective"
228
+ fi
229
+
165
230
  add_npm_path_to_profile "$HOME/.bashrc"
166
231
  add_npm_path_to_profile "$HOME/.profile"
167
232
  if [ -f "$HOME/.zshrc" ] || [ "${SHELL:-}" != "${SHELL%zsh}" ]; then
168
233
  add_npm_path_to_profile "$HOME/.zshrc"
169
234
  fi
170
235
 
171
- ok "npm global prefix set to $(npm config get prefix)"
236
+ ok "npm global prefix set to $effective"
172
237
  }
173
238
 
174
239
  verify_jaw_command() {
@@ -212,13 +277,11 @@ install_jaw() {
212
277
  info "Updating to latest..."
213
278
  CLI_JAW_INSTALL_CLI_TOOLS=1 \
214
279
  CLI_JAW_REQUIRE_CLI_TOOLS=1 \
215
- CLI_JAW_REQUIRE_OFFICECLI=1 \
216
280
  npm install -g cli-jaw@latest
217
281
  else
218
282
  info "Installing cli-jaw globally..."
219
283
  CLI_JAW_INSTALL_CLI_TOOLS=1 \
220
284
  CLI_JAW_REQUIRE_CLI_TOOLS=1 \
221
- CLI_JAW_REQUIRE_OFFICECLI=1 \
222
285
  npm install -g cli-jaw
223
286
  fi
224
287
 
@@ -278,13 +341,22 @@ install_officecli() {
278
341
  global_root="$(npm root -g 2>/dev/null || true)"
279
342
  local installer="${global_root}/cli-jaw/scripts/install-officecli.sh"
280
343
  if [ ! -f "$installer" ]; then
281
- fail "OfficeCLI installer not found in global package: $installer"
344
+ warn "OfficeCLI installer not found in global package — skipping HWP features: $installer"
345
+ return 0
282
346
  fi
283
347
 
284
- info "Installing OfficeCLI..."
285
- bash "$installer"
286
- verify_officecli_command
287
- ok "OfficeCLI installed: $(officecli --version 2>/dev/null || echo 'ready')"
348
+ info "Installing OfficeCLI (optional — HWP support)..."
349
+ if bash "$installer"; then
350
+ if command -v officecli &>/dev/null && officecli --version &>/dev/null; then
351
+ ok "OfficeCLI installed: $(officecli --version 2>/dev/null || echo 'ready')"
352
+ else
353
+ warn "OfficeCLI installed but not on PATH — add ~/.local/bin to PATH"
354
+ fi
355
+ else
356
+ warn "OfficeCLI install failed — continuing without HWP features"
357
+ warn "Install manually: bash \"\$(npm root -g)/cli-jaw/scripts/install-officecli.sh\""
358
+ return 0
359
+ fi
288
360
  }
289
361
 
290
362
  # ═══════════════════════════════════════
@@ -321,10 +393,10 @@ main() {
321
393
  install_browser_deps
322
394
  echo ""
323
395
 
324
- install_officecli
396
+ run_doctor
325
397
  echo ""
326
398
 
327
- run_doctor
399
+ install_officecli
328
400
  echo ""
329
401
 
330
402
  echo -e "${GREEN}${BOLD}═══════════════════════════════════════${NC}"
@@ -180,15 +180,26 @@ ensure_node() {
180
180
  # Strategy: brew → nvm → fail
181
181
  if command -v brew &>/dev/null; then
182
182
  info "Homebrew detected — installing Node.js via brew"
183
- brew install node@${NODE_MAJOR}
184
- # brew link if needed
185
- brew link --overwrite node@${NODE_MAJOR} 2>/dev/null || true
186
- ok "Node.js installed via Homebrew"
187
- return 0
183
+ if brew install node@${NODE_MAJOR} 2>/dev/null; then
184
+ brew link --overwrite node@${NODE_MAJOR} 2>/dev/null || true
185
+ hash -r 2>/dev/null || true
186
+ # Verify brew actually delivered a working node >= NODE_MAJOR
187
+ if command -v node &>/dev/null; then
188
+ local brew_ver
189
+ brew_ver=$(node -v | sed 's/v//' | cut -d. -f1)
190
+ if [ "$brew_ver" -ge "$NODE_MAJOR" ] 2>/dev/null; then
191
+ ok "Node.js $(node -v) installed via Homebrew"
192
+ return 0
193
+ fi
194
+ fi
195
+ warn "Homebrew installed but Node.js ≥ ${NODE_MAJOR} not working — falling through to nvm"
196
+ else
197
+ warn "Homebrew install failed — falling through to nvm"
198
+ fi
188
199
  fi
189
200
 
190
- # No brew → install nvm + Node.js
191
- info "No Homebrew — installing via nvm"
201
+ # brew unavailable or failed → install nvm + Node.js
202
+ info "Installing via nvm"
192
203
  export NVM_DIR="${NVM_DIR:-$HOME/.nvm}"
193
204
 
194
205
  if [ ! -s "$NVM_DIR/nvm.sh" ]; then
@@ -260,8 +271,12 @@ install_cli_jaw() {
260
271
  else
261
272
  info "Installing CLI-JAW..."
262
273
  fi
274
+ export CLI_JAW_INSTALL_CLI_TOOLS=1
275
+ export CLI_JAW_REQUIRE_CLI_TOOLS=1
263
276
  eval "$pkg_cmd"
264
277
 
278
+ hash -r 2>/dev/null || true
279
+
265
280
  # Post-install verification: re-resolve and check version
266
281
  local new_bin new_ver
267
282
  new_bin="$(get_installed_jaw_binary || true)"
@@ -271,6 +286,11 @@ install_cli_jaw() {
271
286
  else
272
287
  warn "CLI-JAW install completed but binary not responding — check your PATH"
273
288
  fi
289
+
290
+ # Verify jaw actually runs
291
+ if command -v jaw &>/dev/null; then
292
+ jaw --version >/dev/null 2>&1 || warn "jaw is on PATH but failed to run"
293
+ fi
274
294
  }
275
295
 
276
296
  # ═══════════════════════════════════════
@@ -355,18 +375,69 @@ install_browser_deps() {
355
375
  esac
356
376
  }
357
377
 
378
+ # ═══════════════════════════════════════
379
+ # Step 4: OfficeCLI (optional — HWP support)
380
+ # ═══════════════════════════════════════
381
+ install_officecli() {
382
+ local global_root
383
+ global_root="$(npm root -g 2>/dev/null || true)"
384
+ local installer="${global_root}/cli-jaw/scripts/install-officecli.sh"
385
+ if [ ! -f "$installer" ]; then
386
+ warn "OfficeCLI installer not found — skipping HWP features"
387
+ return 0
388
+ fi
389
+
390
+ info "Installing OfficeCLI (optional — HWP support)..."
391
+ if bash "$installer"; then
392
+ if command -v officecli &>/dev/null && officecli --version &>/dev/null; then
393
+ ok "OfficeCLI installed: $(officecli --version 2>/dev/null || echo 'ready')"
394
+ else
395
+ warn "OfficeCLI installed but not on PATH — add ~/.local/bin to PATH"
396
+ fi
397
+ else
398
+ warn "OfficeCLI install failed — continuing without HWP features"
399
+ warn "Install manually: bash \"\$(npm root -g)/cli-jaw/scripts/install-officecli.sh\""
400
+ return 0
401
+ fi
402
+ }
403
+
404
+ # ═══════════════════════════════════════
405
+ # Step 5: Doctor check
406
+ # ═══════════════════════════════════════
407
+ run_doctor() {
408
+ info "Running diagnostics..."
409
+ if command -v jaw &>/dev/null; then
410
+ jaw doctor || true
411
+ else
412
+ warn "jaw not found on PATH — skipping diagnostics"
413
+ fi
414
+ }
415
+
358
416
  # ═══════════════════════════════════════
359
417
  # Run
360
418
  # ═══════════════════════════════════════
361
419
  ensure_node
420
+ echo ""
362
421
  install_cli_jaw
422
+ echo ""
363
423
  install_browser_deps
424
+ echo ""
425
+ run_doctor
426
+ echo ""
427
+ install_officecli
428
+ echo ""
364
429
  print_cli_dependency_guidance
365
430
 
366
431
  echo ""
367
- echo -e "${GREEN}${BOLD} 🎉 All done!${NC}"
432
+ echo -e "${GREEN}${BOLD}═══════════════════════════════════════${NC}"
433
+ echo -e "${GREEN}${BOLD} 🦈 CLI-JAW is ready!${NC}"
434
+ echo -e "${GREEN}${BOLD}═══════════════════════════════════════${NC}"
435
+ echo ""
436
+ echo -e " Run: ${CYAN}jaw dashboard${NC}"
437
+ echo -e " Also: ${CYAN}jaw serve${NC} ${DIM}# classic server mode${NC}"
368
438
  echo ""
369
- echo -e " Start your AI assistant:"
370
- echo -e " ${CYAN}${BOLD}jaw serve${NC}"
371
- echo -e " ${DIM} http://localhost:3457${NC}"
439
+ echo -e "${DIM} Tip: Authenticate at least one AI engine:${NC}"
440
+ echo -e "${DIM} gh auth login # GitHub Copilot (free)${NC}"
441
+ echo -e "${DIM} claude auth login # Anthropic Claude${NC}"
442
+ echo -e "${DIM} codex login # OpenAI Codex${NC}"
372
443
  echo ""
@@ -8,8 +8,9 @@
8
8
  * Must work with bare Node.js on all platforms (macOS/Linux/Windows).
9
9
  *
10
10
  * 1. Node version check (fail-fast before any build attempt)
11
- * 2. dist/bin/postinstall.js exists? → exit 0
12
- * 3. Dev clone fallback: local tsc build → exit 0
11
+ * 2. Safe mode? → exit 0 before build/install work
12
+ * 3. dist/bin/postinstall.js exists?run it
13
+ * 4. Dev clone fallback: local tsc → build → run dist/bin/postinstall.js
13
14
  * - No local tsc → exit 1 with clear instruction
14
15
  * - tsc fails → exit 1
15
16
  *
@@ -19,6 +20,7 @@
19
20
  const fs = require('fs');
20
21
  const { execFileSync } = require('child_process');
21
22
  const path = require('path');
23
+ const { pathToFileURL } = require('url');
22
24
 
23
25
  // ─── 1. Node version fail-fast ──────────────────────
24
26
  const major = parseInt(process.versions.node.split('.')[0], 10);
@@ -28,41 +30,66 @@ if (major < 22) {
28
30
  process.exit(1);
29
31
  }
30
32
 
31
- // ─── 2. dist/ exists? ───────────────────────────────
32
- const root = path.join(__dirname, '..');
33
- const target = path.join(root, 'dist', 'bin', 'postinstall.js');
33
+ // ─── 2. Safe mode: no build/install work ────────────
34
+ const safeMode =
35
+ process.env.JAW_SAFE === '1'
36
+ || process.env.JAW_SAFE === 'true'
37
+ || process.env.CLI_JAW_SAFE === '1'
38
+ || process.env.CLI_JAW_SAFE === 'true'
39
+ || process.env.npm_config_jaw_safe === '1'
40
+ || process.env.npm_config_jaw_safe === 'true';
34
41
 
35
- if (fs.existsSync(target)) {
36
- // Registry install or already built proceed directly
42
+ if (safeMode) {
43
+ console.log('[jaw:init] safe mode skipping postinstall build and installers');
37
44
  process.exit(0);
38
45
  }
39
46
 
40
- // ─── 3. Dev clone: build with local tsc ─────────────
41
- // Check both unix and Windows (.cmd) shim paths
42
- const binDir = path.join(root, 'node_modules', '.bin');
43
- const localTsc = [
44
- path.join(binDir, 'tsc'),
45
- path.join(binDir, 'tsc.cmd'),
46
- path.join(binDir, 'tsc.ps1'),
47
- ].find(p => fs.existsSync(p));
47
+ // ─── 3. dist/ target ────────────────────────────────
48
+ const root = path.join(__dirname, '..');
49
+ const target = path.join(root, 'dist', 'bin', 'postinstall.js');
48
50
 
49
- if (!localTsc) {
50
- console.error('[jaw:init] dist/ not found and typescript not installed locally');
51
- console.error(' Run: npm install --ignore-scripts && npm run build && node dist/bin/postinstall.js');
52
- process.exit(1);
51
+ async function runCompiledPostinstall() {
52
+ const mod = await import(pathToFileURL(target).href);
53
+ if (typeof mod.runPostinstall !== 'function') {
54
+ throw new Error('dist/bin/postinstall.js does not export runPostinstall()');
55
+ }
56
+ await mod.runPostinstall();
53
57
  }
54
58
 
55
- console.log('[jaw:init] dist/ not found, building...');
56
- try {
57
- // execFileSync avoids shell parsing issues with spaces in paths
58
- execFileSync(localTsc, [], { stdio: 'inherit', cwd: root, timeout: 60000 });
59
- } catch {
60
- console.error('[jaw:init] ❌ build failed — run manually:');
61
- console.error(' npm run build && node dist/bin/postinstall.js');
62
- process.exit(1);
59
+ // ─── 4. Dev clone: build with local tsc ─────────────
60
+ if (!fs.existsSync(target)) {
61
+ // Check both unix and Windows (.cmd) shim paths
62
+ const binDir = path.join(root, 'node_modules', '.bin');
63
+ const localTsc = [
64
+ path.join(binDir, 'tsc'),
65
+ path.join(binDir, 'tsc.cmd'),
66
+ path.join(binDir, 'tsc.ps1'),
67
+ ].find(p => fs.existsSync(p));
68
+
69
+ if (!localTsc) {
70
+ console.error('[jaw:init] ❌ dist/ not found and typescript not installed locally');
71
+ console.error(' Run: npm install --ignore-scripts && npm run build && node dist/bin/postinstall.js');
72
+ process.exit(1);
73
+ }
74
+
75
+ console.log('[jaw:init] dist/ not found, building...');
76
+ try {
77
+ // execFileSync avoids shell parsing issues with spaces in paths
78
+ execFileSync(localTsc, [], { stdio: 'inherit', cwd: root, timeout: 60000 });
79
+ } catch {
80
+ console.error('[jaw:init] ❌ build failed — run manually:');
81
+ console.error(' npm run build && node dist/bin/postinstall.js');
82
+ process.exit(1);
83
+ }
84
+
85
+ if (!fs.existsSync(target)) {
86
+ console.error('[jaw:init] ❌ tsc completed but dist/bin/postinstall.js not found');
87
+ process.exit(1);
88
+ }
63
89
  }
64
90
 
65
- if (!fs.existsSync(target)) {
66
- console.error('[jaw:init] ❌ tsc completed but dist/bin/postinstall.js not found');
91
+ runCompiledPostinstall().catch((error) => {
92
+ console.error('[jaw:init] ❌ postinstall failed');
93
+ console.error(error instanceof Error ? error.message : String(error));
67
94
  process.exit(1);
68
- }
95
+ });
@@ -1 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CTxVDJ8Y.js";import{i as c,s as l}from"./fields-BISouxp2.js";import{a as u,n as d,o as f}from"./Permissions-BKJ5K6EL.js";import{i as p,n as m,r as h,t as g}from"./agent-meta-C1pQzExf.js";import{t as _}from"./path-utils-DySmCVZK.js";var v=e(t(),1),y=n();function ee({cli:e,cliOptions:t,model:n,modelOptions:r,effort:a,effortOptions:o,workingDir:s,workingDirError:u,onCliChange:d,onModelChange:f,onEffortChange:p,onWorkingDirChange:m}){return(0,y.jsx)(i,{title:`Agent runtime`,hint:`Active CLI, model, effort, and workspace used by this instance.`,children:(0,y.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,y.jsx)(c,{id:`agent-cli`,label:`Active CLI`,value:e,options:t.map(e=>({value:e,label:e})),onChange:d}),(0,y.jsx)(c,{id:`agent-model`,label:`Active model`,value:n,options:r.length>0?r:[{value:``,label:`(default)`}],onChange:f}),(0,y.jsx)(c,{id:`agent-effort`,label:`Effort`,value:a,options:[{value:``,label:`(default)`},...o.map(e=>({value:e,label:e}))],disabled:o.length===0,onChange:p}),(0,y.jsx)(l,{id:`agent-workingDir`,label:`Working directory`,value:s,error:u,placeholder:`/path/to/project`,onChange:m})]})})}var b=[{value:`auto`,label:`Auto`},{value:`custom`,label:`Custom allowlist`}];function x({value:e,onChange:t}){let n=u(e),r=n.mode===`custom`?`custom`:`auto`,a=n.mode===`custom`?n.tokens:[],o=n.mode===`custom`?`${a.length} explicit token${a.length===1?``:`s`}`:`Runtime resolves allowed capabilities`;return(0,y.jsxs)(i,{title:`Permissions`,hint:`Quick runtime mode. Open Permissions for detailed allowlist editing.`,children:[(0,y.jsx)(c,{id:`agent-permissions-mode`,label:`Mode`,value:r,options:b,onChange:e=>{t(e===`auto`?`auto`:a.length>0&&d(a)?a:f(null))}}),(0,y.jsx)(`p`,{className:`settings-agent-note`,children:o})]})}function S({activeCli:e,flushCli:t,flushModel:n,cliOptions:r,modelOptions:a,loading:o,error:s,onFlushCliChange:l,onFlushModelChange:u}){return(0,y.jsx)(i,{title:`Flush Agent`,hint:`Separate summary agent used for context flush and compact work.`,children:(0,y.jsxs)(`details`,{className:`settings-agent-flush`,children:[(0,y.jsxs)(`summary`,{children:[(0,y.jsx)(`span`,{children:`Flush runtime`}),(0,y.jsxs)(`code`,{children:[t||e||`active`,n&&n!==`default`?` / ${n}`:``]})]}),o?(0,y.jsx)(`p`,{className:`settings-agent-note`,children:`Loading flush settings...`}):null,s?(0,y.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:s}):null,(0,y.jsxs)(`div`,{className:`settings-agent-runtime-grid`,children:[(0,y.jsx)(c,{id:`agent-flush-cli`,label:`Flush CLI`,value:t,options:[{value:``,label:`(active CLI)`},...r.map(e=>({value:e,label:e}))],onChange:l}),(0,y.jsx)(c,{id:`agent-flush-model`,label:`Flush model`,value:n,options:[{value:``,label:`(default)`},...a],onChange:u})]})]})})}function C(e){return e.source===`static`||e.id.startsWith(`static:`)}function w(){return`new:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,8)}`}function T(e){let t=e[0]||`claude`;return{id:w(),name:`New Agent`,cli:t,model:`default`,role:``,status:`idle`,source:`db`}}function E(e){return Array.isArray(e)?e.map(D).filter(Boolean):e.data.map(D).filter(Boolean)}function D(e){if(!e||typeof e!=`object`)return null;let t=e,n=typeof t.id==`string`?t.id:``,r=typeof t.name==`string`?t.name:``;if(!n||!r)return null;let i=t.source===`static`||n.startsWith(`static:`)?`static`:`db`,a={id:n,name:r,cli:typeof t.cli==`string`&&t.cli?t.cli:`claude`,model:typeof t.model==`string`&&t.model?t.model:`default`,role:typeof t.role==`string`?t.role:``,source:i};return typeof t.status==`string`&&(a.status=t.status),a}function O(e){return e.name.trim()?e.cli.trim()?e.model.trim()?null:`Model is required`:`CLI is required`:`Name is required`}function k(e){return e.some(e=>O(e)!==null)}function A(e,t){return JSON.stringify(e.map(I))===JSON.stringify(t.map(I))}function j(e,t){let n=new Map(e.map(e=>[e.id,e])),r=new Set(t.map(e=>e.id)),i=[],a=[],o=[];for(let e of t){let t=n.get(e.id);if(!t||e.id.startsWith(`new:`)){i.push(e);continue}let r=P(t,e);Object.keys(r).length>0&&a.push({before:t,after:e,patch:r})}for(let t of e)!r.has(t.id)&&!C(t)&&o.push(t);return{added:i,updated:a,removed:o}}function M(e,t){let n=j(e,t);return{added:n.added.length,updated:n.updated.length,removed:n.removed.length}}async function N(e,t,n){let r=j(t,n);for(let t of r.removed)await e.delete(`/api/employees/${encodeURIComponent(t.id)}`);for(let t of r.added)await e.post(`/api/employees`,F(t));for(let t of r.updated)await e.put(`/api/employees/${encodeURIComponent(t.after.id)}`,t.patch)}function P(e,t){if(C(t))return e.model===t.model?{}:{model:t.model};let n={};for(let r of[`name`,`cli`,`model`,`role`,`status`])(e[r]||``)!==(t[r]||``)&&(n[r]=t[r]||``);return n}function F(e){return{name:e.name.trim()||`New Agent`,cli:e.cli.trim()||`claude`,model:e.model.trim()||`default`,role:e.role.trim()}}function I(e){let t={id:e.id,name:e.name,cli:e.cli,model:e.model,role:e.role,source:e.source};return e.status!==void 0&&(t.status=e.status),t}function L({employee:e,index:t,cliOptions:n,onChange:r,onRemove:i}){let a=C(e),o=m(g(e.cli).models,e.model),s=O(e),u=Array.from(new Set([...n,e.cli,`claude`])).filter(Boolean);return(0,y.jsxs)(`fieldset`,{className:`settings-runtime-employee-row`,children:[(0,y.jsxs)(`legend`,{children:[e.name||`Employee ${t+1}`,a?(0,y.jsx)(`span`,{children:`static`}):null]}),(0,y.jsxs)(`div`,{className:`settings-runtime-employee-grid`,children:[(0,y.jsx)(l,{id:`runtime-employee-${e.id}-name`,label:`Name`,value:e.name,disabled:a,error:s===`Name is required`?s:null,onChange:e=>r({name:e})}),(0,y.jsx)(c,{id:`runtime-employee-${e.id}-cli`,label:`CLI`,value:e.cli,disabled:a,options:u.map(e=>({value:e,label:e})),onChange:e=>{r({cli:e,model:g(e).models[0]||`default`})}}),(0,y.jsx)(c,{id:`runtime-employee-${e.id}-model`,label:`Model`,value:e.model,options:o.length>0?o:[{value:`default`,label:`default`}],onChange:e=>r({model:e})}),(0,y.jsx)(l,{id:`runtime-employee-${e.id}-role`,label:`Role`,value:e.role,disabled:a,onChange:e=>r({role:e})})]}),(0,y.jsxs)(`div`,{className:`settings-runtime-employee-footer`,children:[(0,y.jsxs)(`span`,{children:[e.source,e.status?` / ${e.status}`:``]}),(0,y.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,disabled:a,onClick:i,"aria-label":`Remove employee ${e.name||t+1}`,children:`Remove`})]})]})}function R({roster:e,original:t,cliOptions:n,loading:r,error:a,onRosterChange:o}){let s=M(t,e),c=k(e);function l(t,n){o(e.map((e,r)=>r===t?{...e,...n}:e))}function u(t){o(e.filter((e,n)=>n!==t))}return(0,y.jsxs)(i,{title:`Employees`,hint:`Runtime dispatch roster. Static employees keep their locked identity; database employees can be edited.`,children:[(0,y.jsxs)(`div`,{className:`settings-runtime-employee-summary`,children:[(0,y.jsxs)(`span`,{children:[`+`,s.added]}),(0,y.jsxs)(`span`,{children:[`~`,s.updated]}),(0,y.jsxs)(`span`,{children:[`-`,s.removed]}),c?(0,y.jsx)(`strong`,{children:`Fix invalid rows before saving.`}):null]}),r?(0,y.jsx)(`p`,{className:`settings-agent-note`,children:`Loading employees...`}):null,a?(0,y.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:a}):null,e.length===0?(0,y.jsx)(`p`,{className:`settings-empty`,children:`No runtime employees configured.`}):(0,y.jsx)(`div`,{className:`settings-runtime-employee-list`,children:e.map((e,t)=>(0,y.jsx)(L,{employee:e,index:t,cliOptions:n,onChange:e=>l(t,e),onRemove:()=>u(t)},e.id))}),(0,y.jsx)(`div`,{className:`settings-employee-footer-bar`,children:(0,y.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:()=>o([...e,T(n)]),children:`+ Add employee`})})]})}var z=new Set([`runtimeEmployees`,`flushCli`,`flushModel`]);function B(e){let t={},n=null,r=null;for(let[i,a]of Object.entries(e))i===`runtimeEmployees`?r=a:i===`flushCli`||i===`flushModel`?(n??={},n[i===`flushCli`?`cli`:`model`]=String(a??``)):z.has(i)||(t[i]=a);return{settingsBundle:t,flushPatch:n,runtimeEmployeesNext:r}}async function V(e){let{client:t,bundle:n,employeeDraft:r,employeeOriginal:i}=e;if(k(r))throw Error(`runtime employees: fix invalid rows before saving`);let{settingsBundle:a,flushPatch:o,runtimeEmployeesNext:s}=B(n),c=null;try{if(Object.keys(a).length>0){let e=await t.put(`/api/settings`,_(a));c=e&&typeof e==`object`&&`data`in e?e.data:e}}catch(e){throw Error(`settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{o&&await t.put(`/api/memory-files/settings`,o)}catch(e){throw Error(`flush settings save failed: ${e instanceof Error?e.message:String(e)}`)}try{s&&await N(t,i,s)}catch(e){throw Error(`runtime employees save failed: ${e instanceof Error?e.message:String(e)}`)}return c}function H({port:e,client:t,dirty:n,registerSave:i}){let{state:c,refresh:l,setData:d}=r(t,`/api/settings`),[f,_]=(0,v.useState)({cli:``,model:``,effort:``,workingDir:``,permissions:`auto`}),[b,C]=(0,v.useState)({}),[w,T]=(0,v.useState)({}),[D,O]=(0,v.useState)(!0),[j,M]=(0,v.useState)(null),[N,P]=(0,v.useState)([]),[F,I]=(0,v.useState)([]),[L,z]=(0,v.useState)(!0),[B,H]=(0,v.useState)(null),U=(0,v.useCallback)(async()=>{O(!0),M(null);try{let e=await t.get(`/api/memory-files`),n={cli:e.cli||``,model:e.model||``};C(n),T(n)}catch(e){M(e instanceof Error?e.message:String(e))}finally{O(!1)}},[t]),W=(0,v.useCallback)(async()=>{z(!0),H(null);try{let e=E(await t.get(`/api/employees`));P(e),I(e)}catch(e){H(e instanceof Error?e.message:String(e))}finally{z(!1)}},[t]);(0,v.useEffect)(()=>{U(),W()},[W,U]),(0,v.useEffect)(()=>{if(c.kind!==`ready`)return;let e=Object.keys(c.data.perCli||{}),t=c.data.cli||e[0]||``,n=u(c.data.permissions);_({cli:t,model:p(t,c.data.perCli,c.data.activeOverrides),effort:h(t,c.data.perCli,c.data.activeOverrides),workingDir:c.data.workingDir||``,permissions:n.mode===`custom`?n.tokens:`auto`})},[c]),(0,v.useEffect)(()=>()=>{for(let e of Array.from(n.pending.keys()))(e===`cli`||e===`workingDir`||e===`permissions`||e===`runtimeEmployees`||e===`flushCli`||e===`flushModel`||e.startsWith(`activeOverrides.`))&&n.remove(e)},[n]);let G=(0,v.useCallback)((e,t)=>n.set(e,t),[n]),K=(0,v.useCallback)(async()=>{let e=n.saveBundle();if(Object.keys(e).length===0)return;let r=await V({client:t,bundle:e,employeeDraft:F,employeeOriginal:N});n.clear(),r&&d(r),await l(),await U(),await W()},[t,n,F,N,W,U,l,d]);(0,v.useEffect)(()=>{if(i)return i(K),()=>i(null)},[i,K]);let q=c.kind===`ready`?c.data:{},J=q.perCli||{},Y=q.activeOverrides||{},X=(0,v.useMemo)(()=>Object.keys(J),[J]),Z=g(f.cli),Q=f.workingDir.trim()?null:`Required`;if(c.kind===`loading`)return(0,y.jsx)(a,{});if(c.kind===`offline`)return(0,y.jsx)(o,{port:e});if(c.kind===`error`)return(0,y.jsx)(s,{message:c.message});function te(){for(let e of Array.from(n.pending.keys()))e.startsWith(`activeOverrides.`)&&n.remove(e)}function $(e){_(e)}return(0,y.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),K()},children:[(0,y.jsx)(ee,{cli:f.cli,cliOptions:X.length>0?X:[f.cli||`claude`],model:f.model,modelOptions:m(Z.models,f.model),effort:f.effort,effortOptions:Z.efforts,workingDir:f.workingDir,workingDirError:Q,onCliChange:e=>{let t={...f,cli:e,model:p(e,J,Y),effort:h(e,J,Y)};te(),$(t),G(`cli`,{value:e,original:q.cli||``,valid:!0})},onModelChange:e=>{$({...f,model:e}),G(`activeOverrides.${f.cli}.model`,{value:e,original:p(f.cli,J,Y),valid:e.trim().length>0})},onEffortChange:e=>{$({...f,effort:e}),G(`activeOverrides.${f.cli}.effort`,{value:e,original:h(f.cli,J,Y),valid:!0})},onWorkingDirChange:e=>{$({...f,workingDir:e}),G(`workingDir`,{value:e,original:q.workingDir||``,valid:e.trim().length>0})}}),(0,y.jsx)(x,{value:f.permissions,onChange:e=>{$({...f,permissions:e}),G(`permissions`,{value:e,original:q.permissions??`auto`,valid:e===`auto`||e.length>0})}}),(0,y.jsx)(S,{activeCli:f.cli,flushCli:w.cli||``,flushModel:w.model||``,cliOptions:X,modelOptions:m(g(w.cli||f.cli).models,w.model||``),loading:D,error:j,onFlushCliChange:e=>{let t=e&&g(e).models[0]||``;T({cli:e,model:t}),G(`flushCli`,{value:e,original:b.cli||``,valid:!0}),G(`flushModel`,{value:t,original:b.model||``,valid:!0})},onFlushModelChange:e=>{T({...w,model:e}),G(`flushModel`,{value:e,original:b.model||``,valid:!0})}}),(0,y.jsx)(R,{roster:F,original:N,cliOptions:X,loading:L,error:B,onRosterChange:e=>{if(I(e),A(e,N)){n.remove(`runtimeEmployees`);return}n.set(`runtimeEmployees`,{value:e,original:N,valid:!k(e)})}})]})}export{H as default,B as splitAgentSaveBundle};
@@ -1,2 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";var r=e(t(),1),i=n(),a=`/api/dashboard/memory`,o=[`provider`,`apikey`,`test`,`indexing`,`active`],s={provider:`Provider`,apikey:`API Key`,test:`Test connection`,indexing:`Indexing`,active:`Active`},c=[{value:``,label:`(select)`},{value:`openai`,label:`OpenAI`},{value:`gemini`,label:`Gemini`},{value:`voyage`,label:`Voyage AI`},{value:`vertex`,label:`Vertex AI`},{value:`local`,label:`Local (Ollama)`}],l=[{value:`hybrid`,label:`Hybrid (FTS5 + Embedding)`},{value:`embedding`,label:`Embedding only`},{value:`fts5`,label:`FTS5 only (no vectors)`}];async function u(e,t){let n=await fetch(`${a}${e}`,{credentials:`same-origin`,headers:{"Content-Type":`application/json`},...t});if(!n.ok)throw Error(`HTTP ${n.status}`);return n.json()}function d(e,t,n){return e?.provider?e.provider!==`local`&&!e.apiKey?`apikey`:t?.state===`ACTIVE_HYBRID`||t?.state===`ACTIVE_EMBEDDING`?`active`:t?.state===`INDEXING`?`indexing`:n?!t?.active&&(t?.indexedChunks??0)<(t?.totalChunks??1)?`indexing`:`active`:`test`:`provider`}function f({current:e}){let t=o.indexOf(e);return(0,i.jsx)(`div`,{className:`embed-stepper`,role:`list`,children:o.map((e,n)=>{let r=n<t,a=n===t;return(0,i.jsxs)(`div`,{className:r?`embed-step is-done`:a?`embed-step is-active`:`embed-step`,role:`listitem`,"aria-current":a?`step`:void 0,children:[(0,i.jsx)(`span`,{className:`embed-step-badge`,children:r?`✓`:n+1}),(0,i.jsx)(`span`,{className:`embed-step-label`,children:s[e]})]},e)})})}function p(){let[e,t]=(0,r.useState)(null),[n,o]=(0,r.useState)(null),[s,p]=(0,r.useState)(null),[m,h]=(0,r.useState)(!0),[g,_]=(0,r.useState)(``),[v,y]=(0,r.useState)(``),[b,x]=(0,r.useState)(`hybrid`),[S,C]=(0,r.useState)(``),[w,T]=(0,r.useState)(null),[E,D]=(0,r.useState)(``),[O,k]=(0,r.useState)(!1),[A,j]=(0,r.useState)(!1),[M,N]=(0,r.useState)({done:0,total:0}),[P,F]=(0,r.useState)(null),I=(0,r.useRef)(null),L=(0,r.useCallback)(async()=>{try{let[e,n,r]=await Promise.all([u(`/embed-config`),u(`/embed-state`),u(`/embed-estimate`)]);t(e.config),o(n.status);let{ok:i,...a}=r;p(a)}catch{F(`Failed to load embedding state`)}finally{h(!1)}},[]);(0,r.useEffect)(()=>{L()},[L]),(0,r.useEffect)(()=>{e&&(_(e.provider||``),y(e.apiKey||``),x(e.searchMode||`hybrid`),C(e.baseUrl||``))},[e]);let R=d(e,n,w),z=(0,r.useCallback)(async e=>{k(!0),F(null);try{await u(`/embed-config`,{method:`POST`,body:JSON.stringify(e)}),await L()}catch(e){F(e instanceof Error?e.message:String(e))}finally{k(!1)}},[L]),B=(0,r.useCallback)(()=>{if(!g)return;T(null),D(``);let e={provider:g,searchMode:b};S&&(e.baseUrl=S),z(e)},[g,b,S,z]),V=(0,r.useCallback)(()=>{z({apiKey:v})},[v,z]),H=(0,r.useCallback)(async()=>{T(null),D(`Testing...`),F(null);try{let e=await u(`/embed-config`,{method:`POST`,body:JSON.stringify({provider:g,apiKey:v,test:!0})});e.testResult===`ok`?(T(!0),D(`Connection successful`)):(T(!1),D(e.testError||`Connection failed`))}catch(e){T(!1),D(e instanceof Error?e.message:String(e))}},[g,v]),U=(0,r.useCallback)(async()=>{j(!0),N({done:0,total:0}),F(null);let e=new AbortController;I.current=e;try{let t=await fetch(`${a}/reindex-stream`,{signal:e.signal,credentials:`same-origin`});if(!t.ok||!t.body)throw Error(`HTTP ${t.status}`);let n=t.body.getReader(),r=new TextDecoder,i=``;for(;;){let{done:e,value:t}=await n.read();if(e)break;i+=r.decode(t,{stream:!0});let a=i.split(`
2
- `);i=a.pop()||``;for(let e of a)if(e.startsWith(`data: `))try{let t=JSON.parse(e.slice(6));if(t.complete){j(!1),await L();return}if(t.error){F(String(t.error)),j(!1);return}typeof t.done==`number`&&N({done:t.done,total:t.total||0})}catch{}}j(!1),await L()}catch(e){e.name!==`AbortError`&&F(e instanceof Error?e.message:String(e)),j(!1)}},[L]);if((0,r.useEffect)(()=>()=>I.current?.abort(),[]),m)return(0,i.jsx)(`p`,{className:`dashboard-settings-row-description`,children:`Loading...`});let W=n?.state===`NEEDS_REINDEX`,G=n?.state===`ACTIVE_HYBRID`||n?.state===`ACTIVE_EMBEDDING`;return(0,i.jsxs)(`div`,{className:`dashboard-embed-section`,children:[(0,i.jsx)(f,{current:R}),(0,i.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,i.jsx)(`legend`,{children:`Provider`}),(0,i.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,i.jsx)(`label`,{htmlFor:`embed-provider`,children:`Provider`}),(0,i.jsx)(`select`,{id:`embed-provider`,value:g,onChange:e=>{_(e.target.value),T(null)},children:c.map(e=>(0,i.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(0,i.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,i.jsx)(`label`,{htmlFor:`embed-search-mode`,children:`Search mode`}),(0,i.jsx)(`select`,{id:`embed-search-mode`,value:b,onChange:e=>x(e.target.value),children:l.map(e=>(0,i.jsx)(`option`,{value:e.value,children:e.label},e.value))})]}),(g===`local`||g===`vertex`)&&(0,i.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,i.jsx)(`label`,{htmlFor:`embed-base-url`,children:g===`vertex`?`Project ID / Region`:`Base URL`}),(0,i.jsx)(`input`,{id:`embed-base-url`,type:`text`,value:S,onChange:e=>C(e.target.value),placeholder:g===`local`?`http://localhost:11434`:`project-id/us-central1`})]}),(0,i.jsx)(`button`,{type:`button`,className:`dashboard-embed-btn`,disabled:!g||O,onClick:B,children:O?`Saving...`:`Save provider`})]}),(0,i.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,i.jsx)(`legend`,{children:`API Key`}),g===`local`?(0,i.jsx)(`p`,{className:`dashboard-settings-row-description`,children:`Local provider uses Ollama — no API key needed.`}):(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(`div`,{className:`dashboard-embed-field`,children:[(0,i.jsx)(`label`,{htmlFor:`embed-api-key`,children:`API Key`}),(0,i.jsx)(`input`,{id:`embed-api-key`,type:`password`,value:v,onChange:e=>y(e.target.value),placeholder:`sk-...`,disabled:!g})]}),(0,i.jsx)(`button`,{type:`button`,className:`dashboard-embed-btn`,disabled:!v||O,onClick:V,children:`Save key`})]})]}),(0,i.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,i.jsx)(`legend`,{children:`Connection test`}),(0,i.jsx)(`button`,{type:`button`,className:`dashboard-embed-btn`,disabled:!g||!v&&g!==`local`,onClick:()=>void H(),children:`Test connection`}),E&&(0,i.jsxs)(`p`,{className:w?`dashboard-embed-ok`:`dashboard-embed-err`,role:`status`,children:[w?`✓ `:`✗ `,E]})]}),(0,i.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,i.jsxs)(`legend`,{children:[`Indexing`,s&&(0,i.jsxs)(`small`,{children:[` — `,s.totalChunks,` chunks · ~`,s.batches,` batches · ~`,Math.ceil(s.estimatedSeconds),`s · $`,s.estimatedCost.toFixed(4)]})]}),A?(0,i.jsxs)(`div`,{className:`embed-progress`,children:[(0,i.jsx)(`div`,{className:`embed-progress-bar`,children:(0,i.jsx)(`div`,{className:`embed-progress-fill`,style:{width:M.total>0?`${Math.round(M.done/M.total*100)}%`:`0%`}})}),(0,i.jsxs)(`span`,{className:`dashboard-settings-row-description`,children:[M.done,`/`,M.total,` batches`]})]}):(0,i.jsx)(`button`,{type:`button`,className:`dashboard-embed-btn`,disabled:!w&&!G&&!W,onClick:()=>void U(),children:W?`Re-index (provider changed)`:G?`Re-index`:`Start indexing`})]}),(0,i.jsxs)(`fieldset`,{className:`dashboard-embed-fieldset`,children:[(0,i.jsx)(`legend`,{children:`Status`}),n?(0,i.jsxs)(`dl`,{className:`embed-status-grid`,children:[(0,i.jsx)(`dt`,{children:`State`}),(0,i.jsx)(`dd`,{children:(0,i.jsx)(`code`,{children:n.state})}),(0,i.jsx)(`dt`,{children:`Mode`}),(0,i.jsx)(`dd`,{children:n.mode}),(0,i.jsx)(`dt`,{children:`Provider`}),(0,i.jsxs)(`dd`,{children:[n.provider||`-`,` / `,n.model||`-`]}),(0,i.jsx)(`dt`,{children:`Indexed`}),(0,i.jsxs)(`dd`,{children:[n.indexedChunks,` chunks`]}),(0,i.jsx)(`dt`,{children:`DB size`}),(0,i.jsx)(`dd`,{children:n.dbSizeBytes>0?`${(n.dbSizeBytes/1024/1024).toFixed(1)} MB`:`-`}),(0,i.jsx)(`dt`,{children:`Last sync`}),(0,i.jsx)(`dd`,{children:n.lastSyncAt||`never`}),(0,i.jsx)(`dt`,{children:`Fallback`}),(0,i.jsx)(`dd`,{children:n.fallback?`Yes (${n.reason})`:`No`})]}):(0,i.jsx)(`p`,{className:`dashboard-settings-row-description`,children:`No state available`})]}),P&&(0,i.jsx)(`p`,{className:`dashboard-embed-err`,role:`alert`,children:P})]})}export{p as DashboardEmbeddingSection};
@@ -1 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{i as r}from"./page-shell-CTxVDJ8Y.js";var i=e(t(),1),a=n(),o=[`employees`],s=[`codex`,`claude`,`copilot`,`gemini`],c=0;function l(){return c+=1,`emp_${Date.now().toString(36)}_${c}`}function u(){let e=globalThis.crypto;if(e&&typeof e.randomUUID==`function`)try{return e.randomUUID()}catch{}return l()}function d(e=u()){return{id:e,name:``,cli:`claude`,role:``,prompt:``,active:!0}}function f(e){if(!Array.isArray(e))return[];let t=[],n=0;for(let r of e){if(typeof r==`string`){n+=1,t.push({...d(`emp_legacy_${n}`),name:r});continue}if(!r||typeof r!=`object`)continue;let e=r,i=typeof e.name==`string`?e.name:``;if(!i&&!e.id)continue;n+=1;let a=typeof e.id==`string`&&e.id.trim()?e.id.trim():`emp_unknown_${n}`,o=typeof e.cli==`string`&&e.cli.trim()?e.cli.trim():`claude`,s=typeof e.role==`string`?e.role:``,c=typeof e.prompt==`string`?e.prompt:``,l=e.active!==!1;t.push({id:a,name:i,cli:o,role:s,prompt:c,active:l})}return t}function p(e){return e.name.trim()?e.cli.trim()?null:`CLI is required`:`Name is required`}function m(e){return e.some(e=>p(e)!==null)}function h(e){let t=new Map;for(let n of e){let e=n.name.trim().toLowerCase();e&&t.set(e,(t.get(e)??0)+1)}let n=new Set;for(let[e,r]of t)r>1&&n.add(e);return n}function g(e){return e.map(e=>{let t={id:e.id,name:e.name.trim(),cli:e.cli.trim()||`claude`,role:e.role.trim(),active:e.active};return e.prompt.trim()&&(t.prompt=e.prompt),t})}function _({registerSave:e}){return(0,i.useEffect)(()=>{if(e)return e(null),()=>e(null)},[e]),(0,a.jsx)(`form`,{className:`settings-page-form`,onSubmit:e=>e.preventDefault(),children:(0,a.jsx)(r,{title:`Employees`,hint:`Runtime employees are now managed from the Agent page.`,children:(0,a.jsx)(`p`,{className:`settings-section-hint`,children:`Open Runtime / Agent to edit dispatchable employees, static employee model overrides, and database-backed employees in one place.`})})})}export{s as DEFAULT_CLI_OPTIONS,o as EMPLOYEE_KEYS,_ as default,h as duplicateNameSet,p as employeeRowError,m as employeesHaveErrors,d as makeDefaultEmployee,u as newEmployeeId,f as normalizeEmployees,g as toPersistShape};
@@ -1 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-DE9SaGGd.js";import{n as t,t as n}from"./jsx-runtime-BjL7qHh8.js";import{a as r,i,n as a,r as o,t as s}from"./page-shell-CTxVDJ8Y.js";import{a as c,i as l,s as u}from"./fields-BISouxp2.js";import{t as d}from"./path-utils-DySmCVZK.js";var f=e(t(),1),p=n(),m=[{value:`every`,label:`every (interval)`},{value:`cron`,label:`cron expression`}];function h({job:e,index:t,bodyError:n,timeZoneError:r,onChange:i,onRemove:a}){let o=(0,f.useId)(),s=e.schedule.kind,d=e.schedule.timeZone??``;return(0,p.jsxs)(`fieldset`,{className:`settings-heartbeat-job`,"aria-label":`Heartbeat job ${t+1}${e.name?` (${e.name})`:``}`,children:[(0,p.jsx)(`legend`,{className:`settings-heartbeat-job-legend`,children:e.name||`Job ${t+1}`}),(0,p.jsx)(c,{id:`${o}-enabled`,label:`Enabled`,value:e.enabled,onChange:e=>i({enabled:e})}),(0,p.jsx)(u,{id:`${o}-name`,label:`Name`,value:e.name,placeholder:`Morning summary`,onChange:e=>i({name:e})}),(0,p.jsx)(l,{id:`${o}-kind`,label:`Schedule kind`,value:s,options:m,onChange:e=>{e===`every`&&s!==`every`?i({schedule:{kind:`every`,minutes:30,...d?{timeZone:d}:{}}}):e===`cron`&&s!==`cron`&&i({schedule:{kind:`cron`,cron:`0 9 * * *`,...d?{timeZone:d}:{}}})}}),s===`every`?(0,p.jsx)(u,{id:`${o}-minutes`,label:`Every (minutes)`,value:String(e.schedule.minutes??``),placeholder:`30`,error:n??null,onChange:e=>{let t=e.trim(),n=Number(t);i({schedule:{kind:`every`,minutes:Number.isFinite(n)?n:NaN,...d?{timeZone:d}:{}}})}}):(0,p.jsx)(u,{id:`${o}-cron`,label:`Cron expression`,value:e.schedule.cron??``,placeholder:`0 9 * * *`,error:n??null,onChange:e=>i({schedule:{kind:`cron`,cron:e,...d?{timeZone:d}:{}}})}),(0,p.jsx)(u,{id:`${o}-tz`,label:`Time zone (optional)`,value:d,placeholder:`Asia/Seoul`,error:r??null,onChange:t=>{let n=t.trim();i(s===`every`?{schedule:{kind:`every`,minutes:e.schedule.minutes,...n?{timeZone:n}:{}}}:{schedule:{kind:`cron`,cron:e.schedule.cron,...n?{timeZone:n}:{}}})}}),(0,p.jsxs)(`label`,{className:`settings-field settings-field-textarea`,htmlFor:`${o}-prompt`,children:[(0,p.jsx)(`span`,{className:`settings-field-label`,children:`Prompt`}),(0,p.jsx)(`textarea`,{id:`${o}-prompt`,rows:3,value:e.prompt,placeholder:`What should this heartbeat do?`,onChange:e=>i({prompt:e.target.value})})]}),(0,p.jsx)(`div`,{className:`settings-heartbeat-job-footer`,children:(0,p.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:a,children:`Remove job`})})]})}var g=/^\d+[smh]$/,_=/^([01]\d|2[0-3]):[0-5]\d$/,v=[`codex`,`claude`,`copilot`,`gemini`],y=[`heartbeat.enabled`,`heartbeat.every`,`heartbeat.activeHours.start`,`heartbeat.activeHours.end`,`heartbeat.target`],b=[`heartbeat.jobs`,`heartbeat.md`];function x(e){return g.test(e.trim())}function S(e){return _.test(e.trim())}function C(e=Date.now()){return{id:`hb_${e}`,name:``,enabled:!0,schedule:{kind:`every`,minutes:30},prompt:``}}function w(e){return e.startsWith(`heartbeat.`)&&e!==`heartbeat.jobs`&&e!==`heartbeat.md`}function T(e,t){if(!e||typeof e!=`object`)return null;let n=e,r=typeof n.id==`string`&&n.id.trim()?n.id.trim():`hb_unknown_${t}`,i=typeof n.name==`string`?n.name:``,a=n.enabled!==!1,o=typeof n.prompt==`string`?n.prompt:``,s=n.schedule,c;if(s&&typeof s==`object`){let e=s;c=e.kind===`cron`&&typeof e.cron==`string`?{kind:`cron`,cron:e.cron,...typeof e.timeZone==`string`&&e.timeZone?{timeZone:e.timeZone}:{}}:{kind:`every`,minutes:typeof e.minutes==`number`?e.minutes:30,...typeof e.timeZone==`string`&&e.timeZone?{timeZone:e.timeZone}:{}}}else c={kind:`every`,minutes:30};return{id:r,name:i,enabled:a,schedule:c,prompt:o}}function E(e){if(!e||typeof e!=`object`)return[];let t=e.jobs;return Array.isArray(t)?t.map((e,t)=>T(e,t)).filter(e=>e!==null):[]}function D(e){if(e.kind===`every`){let t=e.minutes;return!Number.isFinite(t)||t<=0||!Number.isInteger(t)?`Minutes must be a positive integer`:null}let t=e.cron?.trim()??``;return t?t.split(/\s+/).length<5?`Cron must have at least 5 fields`:null:`Cron expression required`}function O(e){return e.some(e=>D(e.schedule)!==null)}function k({port:e,client:t,dirty:n,snapshot:r}){let[i,a]=(0,f.useState)([]),[c,l]=(0,f.useState)([]),[u,d]=(0,f.useState)(!1),[m,g]=(0,f.useState)(null);(0,f.useEffect)(()=>{if(r.kind!==`ready`)return;let e=E(r.data);a(e),l(e)},[r]),(0,f.useEffect)(()=>{n.set(`heartbeat.jobs`,{value:i,original:c,valid:!O(i)})},[i,c,n]),(0,f.useEffect)(()=>()=>{n.remove(`heartbeat.jobs`)},[n]);let _=(0,f.useCallback)(async()=>{if(O(i)){g(`Fix invalid schedules before saving.`);return}d(!0),g(null);try{let e=E(await t.put(`/api/heartbeat`,{jobs:i}));a(e),l(e),n.remove(`heartbeat.jobs`)}catch(e){g(e instanceof Error?e.message:String(e))}finally{d(!1)}},[t,n,i]);if(r.kind===`loading`)return(0,p.jsx)(`p`,{className:`settings-section-hint`,children:`Loading jobs…`});if(r.kind===`offline`)return(0,p.jsx)(o,{port:e});if(r.kind===`error`)return(0,p.jsx)(s,{message:r.message});let v=n.pending.has(`heartbeat.jobs`),y=O(i);function b(e,t){a(n=>n.map((n,r)=>r===e?{...n,...t}:n))}function x(){a(e=>[...e,C()])}function S(e){a(t=>t.filter((t,n)=>n!==e))}return(0,p.jsxs)(p.Fragment,{children:[i.length===0?(0,p.jsx)(`p`,{className:`settings-section-hint`,children:`No jobs configured. Add one below.`}):(0,p.jsx)(`div`,{className:`settings-heartbeat-jobs-list`,children:i.map((e,t)=>(0,p.jsx)(h,{job:e,index:t,bodyError:D(e.schedule),onChange:e=>b(t,e),onRemove:()=>S(t)},e.id))}),(0,p.jsxs)(`div`,{className:`settings-heartbeat-jobs-footer`,children:[(0,p.jsx)(`button`,{type:`button`,className:`settings-action settings-action-discard`,onClick:x,children:`+ Add job`}),(0,p.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void _(),disabled:u||!v||y,children:u?`Saving…`:`Apply jobs`})]}),m?(0,p.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:m}):null]})}function A({port:e,client:t,dirty:n,snapshot:r}){let[i,a]=(0,f.useState)(``),[c,l]=(0,f.useState)(``),[u,d]=(0,f.useState)(!1),[m,h]=(0,f.useState)(null);(0,f.useEffect)(()=>{if(r.kind!==`ready`)return;let e=r.data.content??``;a(e),l(e)},[r]),(0,f.useEffect)(()=>{n.set(`heartbeat.md`,{value:i,original:c,valid:!0})},[i,c,n]),(0,f.useEffect)(()=>()=>{n.remove(`heartbeat.md`)},[n]);let g=(0,f.useCallback)(async()=>{d(!0),h(null);try{await t.put(`/api/heartbeat-md`,{content:i}),l(i),n.remove(`heartbeat.md`)}catch(e){h(e instanceof Error?e.message:String(e))}finally{d(!1)}},[t,n,i]);if(r.kind===`loading`)return(0,p.jsx)(`p`,{className:`settings-section-hint`,children:`Loading template…`});if(r.kind===`offline`)return(0,p.jsx)(o,{port:e});if(r.kind===`error`)return(0,p.jsx)(s,{message:r.message});let _=n.pending.has(`heartbeat.md`);return(0,p.jsxs)(p.Fragment,{children:[(0,p.jsxs)(`label`,{className:`settings-field settings-field-textarea`,htmlFor:`hb-md`,children:[(0,p.jsx)(`span`,{className:`settings-field-label`,children:`Template`}),(0,p.jsx)(`textarea`,{id:`hb-md`,rows:10,spellCheck:!1,value:i,onChange:e=>a(e.target.value),style:{fontFamily:`ui-monospace, monospace`}})]}),(0,p.jsx)(`div`,{className:`settings-heartbeat-md-footer`,children:(0,p.jsx)(`button`,{type:`button`,className:`settings-action settings-action-save`,onClick:()=>void g(),disabled:u||!_,children:u?`Saving…`:`Save template`})}),m?(0,p.jsx)(`p`,{className:`settings-field-error`,role:`alert`,children:m}):null]})}function j({port:e,client:t,dirty:n,registerSave:m}){let h=r(t,`/api/settings`),g=r(t,`/api/heartbeat`),_=r(t,`/api/heartbeat-md`),[b,C]=(0,f.useState)(!1),[T,E]=(0,f.useState)(`30m`),[D,O]=(0,f.useState)(`08:00`),[j,M]=(0,f.useState)(`22:00`),[N,P]=(0,f.useState)(`all`);(0,f.useEffect)(()=>{if(h.state.kind!==`ready`)return;let e=h.state.data.heartbeat||{};C(!!e.enabled),E(typeof e.every==`string`?e.every:`30m`),O(e.activeHours?.start??`08:00`),M(e.activeHours?.end??`22:00`),P(typeof e.target==`string`?e.target:`all`)},[h.state]),(0,f.useEffect)(()=>()=>{for(let e of y)n.remove(e)},[n]);let F=(0,f.useMemo)(()=>h.state.kind===`ready`&&h.state.data.heartbeat||{},[h.state]),I=(0,f.useCallback)((e,t)=>n.set(e,t),[n]),L=(0,f.useRef)(0),R=(0,f.useCallback)(async()=>{let e=n.saveBundle(),r={};for(let[t,n]of Object.entries(e))w(t)&&(r[t]=n);if(Object.keys(r).length===0)return;let i=++L.current,a=d(r),o=await t.put(`/api/settings`,a);if(i!==L.current)return;let s=o&&typeof o==`object`&&`data`in o?o.data:o;for(let e of y)n.remove(e);h.setData(s);let c=s.heartbeat||{};C(!!c.enabled),E(typeof c.every==`string`?c.every:`30m`),O(c.activeHours?.start??`08:00`),M(c.activeHours?.end??`22:00`),P(typeof c.target==`string`?c.target:`all`),await h.refresh()},[t,n,h]);if((0,f.useEffect)(()=>{if(m)return m(R),()=>m(null)},[m,R]),h.state.kind===`loading`)return(0,p.jsx)(a,{});if(h.state.kind===`offline`)return(0,p.jsx)(o,{port:e});if(h.state.kind===`error`)return(0,p.jsx)(s,{message:h.state.message});let z=x(T)?null:"Use the form `<n>s|m|h`, e.g. `30m`",B=S(D)?null:`Use HH:MM (24h)`,V=S(j)?null:`Use HH:MM (24h)`,H=h.state.data.perCli||{},U=Object.keys(H),W=[{value:`all`,label:`all (broadcast)`},...(U.length>0?U:[...v]).map(e=>({value:e,label:e}))];return W.some(e=>e.value===N)||W.push({value:N,label:`${N} (legacy)`}),(0,p.jsxs)(`form`,{className:`settings-page-form`,onSubmit:e=>{e.preventDefault(),R()},children:[(0,p.jsxs)(i,{title:`Heartbeat`,hint:`Background prompts the agent runs on a schedule.`,children:[(0,p.jsx)(c,{id:`hb-enabled`,label:`Heartbeat enabled`,value:b,onChange:e=>{C(e),I(`heartbeat.enabled`,{value:e,original:!!F.enabled,valid:!0})}}),(0,p.jsx)(u,{id:`hb-every`,label:`Default interval`,value:T,placeholder:`30m`,error:z,onChange:e=>{E(e),I(`heartbeat.every`,{value:e,original:F.every??`30m`,valid:x(e)})}}),(0,p.jsx)(u,{id:`hb-start`,label:`Active hours start`,value:D,placeholder:`08:00`,error:B,onChange:e=>{O(e),I(`heartbeat.activeHours.start`,{value:e,original:F.activeHours?.start??`08:00`,valid:S(e)})}}),(0,p.jsx)(u,{id:`hb-end`,label:`Active hours end`,value:j,placeholder:`22:00`,error:V,onChange:e=>{M(e),I(`heartbeat.activeHours.end`,{value:e,original:F.activeHours?.end??`22:00`,valid:S(e)})}}),(0,p.jsx)(l,{id:`hb-target`,label:`Target`,value:N,options:W,onChange:e=>{P(e),I(`heartbeat.target`,{value:e,original:F.target??`all`,valid:!0})}})]}),(0,p.jsx)(i,{title:`Jobs`,hint:`Each job replaces the entire heartbeat.json on save. Concurrent edits from multiple browsers will overwrite — last write wins.`,children:(0,p.jsx)(k,{port:e,client:t,dirty:n,snapshot:g.state})}),(0,p.jsx)(i,{title:`Default heartbeat prompt template`,hint:`Markdown shown to the agent when a heartbeat fires without a job-specific prompt.`,children:(0,p.jsx)(A,{port:e,client:t,dirty:n,snapshot:_.state})})]})}export{b as PAGE_LOCAL_KEYS,y as SECTION_A_KEYS,v as TARGET_FALLBACK,j as default,w as isHeartbeatSettingsKey,D as jobScheduleBodyError,O as jobsHaveErrors,C as makeDefaultJob,E as normalizeJobsResponse,S as validateHHMM,x as validateInterval};