cli-jaw 2.0.1 → 2.0.2

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 (607) hide show
  1. package/README.ko.md +3 -2
  2. package/README.md +41 -12
  3. package/dist/bin/_http-client.js +34 -0
  4. package/dist/bin/_http-client.js.map +1 -0
  5. package/dist/bin/cli-jaw.js +10 -5
  6. package/dist/bin/cli-jaw.js.map +1 -1
  7. package/dist/bin/commands/browser-web-ai.js +155 -38
  8. package/dist/bin/commands/browser-web-ai.js.map +1 -1
  9. package/dist/bin/commands/browser.js +265 -37
  10. package/dist/bin/commands/browser.js.map +1 -1
  11. package/dist/bin/commands/chat.js +18 -14
  12. package/dist/bin/commands/chat.js.map +1 -1
  13. package/dist/bin/commands/clone.js +3 -2
  14. package/dist/bin/commands/clone.js.map +1 -1
  15. package/dist/bin/commands/dashboard.js +22 -18
  16. package/dist/bin/commands/dashboard.js.map +1 -1
  17. package/dist/bin/commands/dispatch.js +9 -11
  18. package/dist/bin/commands/dispatch.js.map +1 -1
  19. package/dist/bin/commands/doctor.js +26 -14
  20. package/dist/bin/commands/doctor.js.map +1 -1
  21. package/dist/bin/commands/employee.js +12 -7
  22. package/dist/bin/commands/employee.js.map +1 -1
  23. package/dist/bin/commands/init.js +9 -9
  24. package/dist/bin/commands/init.js.map +1 -1
  25. package/dist/bin/commands/launchd.js +17 -7
  26. package/dist/bin/commands/launchd.js.map +1 -1
  27. package/dist/bin/commands/mcp.js +7 -4
  28. package/dist/bin/commands/mcp.js.map +1 -1
  29. package/dist/bin/commands/memory.js +7 -5
  30. package/dist/bin/commands/memory.js.map +1 -1
  31. package/dist/bin/commands/orchestrate.js +6 -3
  32. package/dist/bin/commands/orchestrate.js.map +1 -1
  33. package/dist/bin/commands/reset.js +4 -3
  34. package/dist/bin/commands/reset.js.map +1 -1
  35. package/dist/bin/commands/serve.js +3 -2
  36. package/dist/bin/commands/serve.js.map +1 -1
  37. package/dist/bin/commands/service.js +2 -2
  38. package/dist/bin/commands/service.js.map +1 -1
  39. package/dist/bin/commands/status.js +10 -9
  40. package/dist/bin/commands/status.js.map +1 -1
  41. package/dist/bin/commands/tui/api.js +26 -18
  42. package/dist/bin/commands/tui/api.js.map +1 -1
  43. package/dist/bin/commands/tui/overlays.js +3 -1
  44. package/dist/bin/commands/tui/overlays.js.map +1 -1
  45. package/dist/bin/commands/tui/simple-mode.js +1 -1
  46. package/dist/bin/commands/tui/simple-mode.js.map +1 -1
  47. package/dist/bin/commands/tui/types.js.map +1 -1
  48. package/dist/bin/postinstall.js +153 -65
  49. package/dist/bin/postinstall.js.map +1 -1
  50. package/dist/bin/star-prompt.js +4 -3
  51. package/dist/bin/star-prompt.js.map +1 -1
  52. package/dist/lib/mcp/format-converters.js +15 -10
  53. package/dist/lib/mcp/format-converters.js.map +1 -1
  54. package/dist/lib/mcp/mcp-install.js +2 -2
  55. package/dist/lib/mcp/mcp-install.js.map +1 -1
  56. package/dist/lib/mcp/skills-distribution.js +2 -2
  57. package/dist/lib/mcp/skills-distribution.js.map +1 -1
  58. package/dist/lib/mcp/skills-reset.js +5 -4
  59. package/dist/lib/mcp/skills-reset.js.map +1 -1
  60. package/dist/lib/mcp/skills-symlinks.js +9 -9
  61. package/dist/lib/mcp/skills-symlinks.js.map +1 -1
  62. package/dist/lib/mcp/skills-utils.js +5 -4
  63. package/dist/lib/mcp/skills-utils.js.map +1 -1
  64. package/dist/lib/mcp/unified-config.js +3 -2
  65. package/dist/lib/mcp/unified-config.js.map +1 -1
  66. package/dist/lib/mime-detect.js +65 -0
  67. package/dist/lib/mime-detect.js.map +1 -0
  68. package/dist/lib/quota-copilot.js +12 -10
  69. package/dist/lib/quota-copilot.js.map +1 -1
  70. package/dist/lib/stt.js +3 -3
  71. package/dist/lib/stt.js.map +1 -1
  72. package/dist/lib/upload.js +14 -5
  73. package/dist/lib/upload.js.map +1 -1
  74. package/dist/scripts/i18n-registry.js +4 -4
  75. package/dist/scripts/i18n-registry.js.map +1 -1
  76. package/dist/server.js +61 -57
  77. package/dist/server.js.map +1 -1
  78. package/dist/src/agent/alert-escalation.js +61 -0
  79. package/dist/src/agent/alert-escalation.js.map +1 -0
  80. package/dist/src/agent/args.js +71 -2
  81. package/dist/src/agent/args.js.map +1 -1
  82. package/dist/src/agent/error-classifier.js +9 -4
  83. package/dist/src/agent/error-classifier.js.map +1 -1
  84. package/dist/src/agent/events.js +130 -101
  85. package/dist/src/agent/events.js.map +1 -1
  86. package/dist/src/agent/lifecycle-handler.js +44 -19
  87. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  88. package/dist/src/agent/live-run-state.js +7 -3
  89. package/dist/src/agent/live-run-state.js.map +1 -1
  90. package/dist/src/agent/memory-flush-controller.js +6 -4
  91. package/dist/src/agent/memory-flush-controller.js.map +1 -1
  92. package/dist/src/agent/opencode-diagnostics.js +7 -6
  93. package/dist/src/agent/opencode-diagnostics.js.map +1 -1
  94. package/dist/src/agent/session-persistence.js +1 -1
  95. package/dist/src/agent/session-persistence.js.map +1 -1
  96. package/dist/src/agent/spawn-env.js +33 -16
  97. package/dist/src/agent/spawn-env.js.map +1 -1
  98. package/dist/src/agent/spawn.js +176 -110
  99. package/dist/src/agent/spawn.js.map +1 -1
  100. package/dist/src/agent/watchdog.js +56 -0
  101. package/dist/src/agent/watchdog.js.map +1 -0
  102. package/dist/src/browser/actions.js +179 -70
  103. package/dist/src/browser/actions.js.map +1 -1
  104. package/dist/src/browser/connection.js +296 -19
  105. package/dist/src/browser/connection.js.map +1 -1
  106. package/dist/src/browser/index.js +4 -1
  107. package/dist/src/browser/index.js.map +1 -1
  108. package/dist/src/browser/launch-policy.js +1 -1
  109. package/dist/src/browser/launch-policy.js.map +1 -1
  110. package/dist/src/browser/primitives.js +11 -7
  111. package/dist/src/browser/primitives.js.map +1 -1
  112. package/dist/src/browser/runtime-diagnostics.js +45 -0
  113. package/dist/src/browser/runtime-diagnostics.js.map +1 -0
  114. package/dist/src/browser/runtime-orphans.js +127 -0
  115. package/dist/src/browser/runtime-orphans.js.map +1 -0
  116. package/dist/src/browser/runtime-owner-store.js +51 -0
  117. package/dist/src/browser/runtime-owner-store.js.map +1 -0
  118. package/dist/src/browser/runtime-owner.js +2 -2
  119. package/dist/src/browser/runtime-owner.js.map +1 -1
  120. package/dist/src/browser/tab-lifecycle.js +157 -0
  121. package/dist/src/browser/tab-lifecycle.js.map +1 -0
  122. package/dist/src/browser/vision.js +35 -11
  123. package/dist/src/browser/vision.js.map +1 -1
  124. package/dist/src/browser/web-ai/action-breadth.js +56 -0
  125. package/dist/src/browser/web-ai/action-breadth.js.map +1 -0
  126. package/dist/src/browser/web-ai/action-cache.js +9 -8
  127. package/dist/src/browser/web-ai/action-cache.js.map +1 -1
  128. package/dist/src/browser/web-ai/action-intent.js +64 -0
  129. package/dist/src/browser/web-ai/action-intent.js.map +1 -0
  130. package/dist/src/browser/web-ai/action-memory.js +82 -0
  131. package/dist/src/browser/web-ai/action-memory.js.map +1 -0
  132. package/dist/src/browser/web-ai/action-trace.js +11 -6
  133. package/dist/src/browser/web-ai/action-trace.js.map +1 -1
  134. package/dist/src/browser/web-ai/annotated-screenshot.js +2 -1
  135. package/dist/src/browser/web-ai/annotated-screenshot.js.map +1 -1
  136. package/dist/src/browser/web-ai/answer-artifact.js +97 -0
  137. package/dist/src/browser/web-ai/answer-artifact.js.map +1 -0
  138. package/dist/src/browser/web-ai/ax-snapshot.js +3 -2
  139. package/dist/src/browser/web-ai/ax-snapshot.js.map +1 -1
  140. package/dist/src/browser/web-ai/browser-primitives.js +10 -7
  141. package/dist/src/browser/web-ai/browser-primitives.js.map +1 -1
  142. package/dist/src/browser/web-ai/capability-registry.js +1 -1
  143. package/dist/src/browser/web-ai/capability-registry.js.map +1 -1
  144. package/dist/src/browser/web-ai/chatgpt-composer.js +12 -12
  145. package/dist/src/browser/web-ai/chatgpt-composer.js.map +1 -1
  146. package/dist/src/browser/web-ai/chatgpt-model.js +469 -50
  147. package/dist/src/browser/web-ai/chatgpt-model.js.map +1 -1
  148. package/dist/src/browser/web-ai/chatgpt-response.js +82 -10
  149. package/dist/src/browser/web-ai/chatgpt-response.js.map +1 -1
  150. package/dist/src/browser/web-ai/chatgpt.js +325 -49
  151. package/dist/src/browser/web-ai/chatgpt.js.map +1 -1
  152. package/dist/src/browser/web-ai/churn-log.js +1 -1
  153. package/dist/src/browser/web-ai/churn-log.js.map +1 -1
  154. package/dist/src/browser/web-ai/cli-sessions.js +42 -26
  155. package/dist/src/browser/web-ai/cli-sessions.js.map +1 -1
  156. package/dist/src/browser/web-ai/context-pack/builder.js +1 -1
  157. package/dist/src/browser/web-ai/context-pack/builder.js.map +1 -1
  158. package/dist/src/browser/web-ai/context-pack/file-selector.js +2 -2
  159. package/dist/src/browser/web-ai/context-pack/file-selector.js.map +1 -1
  160. package/dist/src/browser/web-ai/context-pack/report.js +1 -1
  161. package/dist/src/browser/web-ai/context-pack/report.js.map +1 -1
  162. package/dist/src/browser/web-ai/copy-markdown.js +25 -5
  163. package/dist/src/browser/web-ai/copy-markdown.js.map +1 -1
  164. package/dist/src/browser/web-ai/diagnostics.js +17 -14
  165. package/dist/src/browser/web-ai/diagnostics.js.map +1 -1
  166. package/dist/src/browser/web-ai/doctor.js +10 -6
  167. package/dist/src/browser/web-ai/doctor.js.map +1 -1
  168. package/dist/src/browser/web-ai/dom-hash.js.map +1 -1
  169. package/dist/src/browser/web-ai/errors.js +5 -22
  170. package/dist/src/browser/web-ai/errors.js.map +1 -1
  171. package/dist/src/browser/web-ai/gemini-live.js +7 -6
  172. package/dist/src/browser/web-ai/gemini-live.js.map +1 -1
  173. package/dist/src/browser/web-ai/grok-live.js +9 -5
  174. package/dist/src/browser/web-ai/grok-live.js.map +1 -1
  175. package/dist/src/browser/web-ai/index.js +5 -0
  176. package/dist/src/browser/web-ai/index.js.map +1 -1
  177. package/dist/src/browser/web-ai/observation-bundle.js +90 -0
  178. package/dist/src/browser/web-ai/observation-bundle.js.map +1 -0
  179. package/dist/src/browser/web-ai/observe-actions.js +186 -0
  180. package/dist/src/browser/web-ai/observe-actions.js.map +1 -0
  181. package/dist/src/browser/web-ai/observe-targets.js +6 -1
  182. package/dist/src/browser/web-ai/observe-targets.js.map +1 -1
  183. package/dist/src/browser/web-ai/planner-contract.js +18 -0
  184. package/dist/src/browser/web-ai/planner-contract.js.map +1 -0
  185. package/dist/src/browser/web-ai/post-action-assert.js +8 -7
  186. package/dist/src/browser/web-ai/post-action-assert.js.map +1 -1
  187. package/dist/src/browser/web-ai/product-surfaces.js +2 -1
  188. package/dist/src/browser/web-ai/product-surfaces.js.map +1 -1
  189. package/dist/src/browser/web-ai/provider-adapter.js.map +1 -1
  190. package/dist/src/browser/web-ai/question.js +14 -7
  191. package/dist/src/browser/web-ai/question.js.map +1 -1
  192. package/dist/src/browser/web-ai/ref-registry.js.map +1 -1
  193. package/dist/src/browser/web-ai/self-heal.js +20 -14
  194. package/dist/src/browser/web-ai/self-heal.js.map +1 -1
  195. package/dist/src/browser/web-ai/session-store.js +61 -1
  196. package/dist/src/browser/web-ai/session-store.js.map +1 -1
  197. package/dist/src/browser/web-ai/session.js +43 -2
  198. package/dist/src/browser/web-ai/session.js.map +1 -1
  199. package/dist/src/browser/web-ai/source-audit.js +116 -0
  200. package/dist/src/browser/web-ai/source-audit.js.map +1 -0
  201. package/dist/src/browser/web-ai/tab-finalizer.js +18 -0
  202. package/dist/src/browser/web-ai/tab-finalizer.js.map +1 -0
  203. package/dist/src/browser/web-ai/tab-lease-store.js +390 -0
  204. package/dist/src/browser/web-ai/tab-lease-store.js.map +1 -0
  205. package/dist/src/browser/web-ai/tab-pool.js +44 -0
  206. package/dist/src/browser/web-ai/tab-pool.js.map +1 -0
  207. package/dist/src/browser/web-ai/target-resolver.js +31 -0
  208. package/dist/src/browser/web-ai/target-resolver.js.map +1 -0
  209. package/dist/src/browser/web-ai/trace-persistence.js +4 -2
  210. package/dist/src/browser/web-ai/trace-persistence.js.map +1 -1
  211. package/dist/src/browser/web-ai/vendor-editor-contract.js.map +1 -1
  212. package/dist/src/browser/web-ai/watcher.js +8 -7
  213. package/dist/src/browser/web-ai/watcher.js.map +1 -1
  214. package/dist/src/cli/acp-client.js +40 -26
  215. package/dist/src/cli/acp-client.js.map +1 -1
  216. package/dist/src/cli/command-context.js +3 -3
  217. package/dist/src/cli/command-context.js.map +1 -1
  218. package/dist/src/cli/commands.js +25 -16
  219. package/dist/src/cli/commands.js.map +1 -1
  220. package/dist/src/cli/compact.js.map +1 -1
  221. package/dist/src/cli/handlers-completions.js +6 -4
  222. package/dist/src/cli/handlers-completions.js.map +1 -1
  223. package/dist/src/cli/handlers-runtime.js +45 -38
  224. package/dist/src/cli/handlers-runtime.js.map +1 -1
  225. package/dist/src/cli/handlers.js +44 -36
  226. package/dist/src/cli/handlers.js.map +1 -1
  227. package/dist/src/cli/readiness.js +3 -1
  228. package/dist/src/cli/readiness.js.map +1 -1
  229. package/dist/src/cli/registry.js +1 -1
  230. package/dist/src/cli/registry.js.map +1 -1
  231. package/dist/src/cli/tui/overlay.js +4 -1
  232. package/dist/src/cli/tui/overlay.js.map +1 -1
  233. package/dist/src/cli/types.js +4 -0
  234. package/dist/src/cli/types.js.map +1 -0
  235. package/dist/src/command-contract/catalog.js +1 -1
  236. package/dist/src/command-contract/catalog.js.map +1 -1
  237. package/dist/src/command-contract/help-renderer.js +1 -1
  238. package/dist/src/command-contract/help-renderer.js.map +1 -1
  239. package/dist/src/core/browser-open-default.js +13 -0
  240. package/dist/src/core/browser-open-default.js.map +1 -0
  241. package/dist/src/core/browser-open.js +41 -0
  242. package/dist/src/core/browser-open.js.map +1 -0
  243. package/dist/src/core/bus.js +13 -2
  244. package/dist/src/core/bus.js.map +1 -1
  245. package/dist/src/core/compact.js +5 -4
  246. package/dist/src/core/compact.js.map +1 -1
  247. package/dist/src/core/config.js +51 -52
  248. package/dist/src/core/config.js.map +1 -1
  249. package/dist/src/core/db.js +48 -6
  250. package/dist/src/core/db.js.map +1 -1
  251. package/dist/src/core/employees.js +9 -8
  252. package/dist/src/core/employees.js.map +1 -1
  253. package/dist/src/core/instance.js +7 -6
  254. package/dist/src/core/instance.js.map +1 -1
  255. package/dist/src/core/logger.js +1 -1
  256. package/dist/src/core/logger.js.map +1 -1
  257. package/dist/src/core/main-session.js +7 -7
  258. package/dist/src/core/main-session.js.map +1 -1
  259. package/dist/src/core/path-expand.js +10 -0
  260. package/dist/src/core/path-expand.js.map +1 -0
  261. package/dist/src/core/runtime-path.js +1 -1
  262. package/dist/src/core/runtime-path.js.map +1 -1
  263. package/dist/src/core/runtime-settings.js +13 -13
  264. package/dist/src/core/runtime-settings.js.map +1 -1
  265. package/dist/src/core/settings-merge.js +14 -14
  266. package/dist/src/core/settings-merge.js.map +1 -1
  267. package/dist/src/core/strip-undefined.js +13 -0
  268. package/dist/src/core/strip-undefined.js.map +1 -0
  269. package/dist/src/core/tcc.js +1 -1
  270. package/dist/src/core/tcc.js.map +1 -1
  271. package/dist/src/discord/bot.js +19 -18
  272. package/dist/src/discord/bot.js.map +1 -1
  273. package/dist/src/discord/channel-types.js +14 -0
  274. package/dist/src/discord/channel-types.js.map +1 -0
  275. package/dist/src/discord/commands.js +7 -6
  276. package/dist/src/discord/commands.js.map +1 -1
  277. package/dist/src/discord/discord-file.js.map +1 -1
  278. package/dist/src/discord/forwarder.js +3 -3
  279. package/dist/src/discord/forwarder.js.map +1 -1
  280. package/dist/src/http/error-middleware.js +3 -3
  281. package/dist/src/http/error-middleware.js.map +1 -1
  282. package/dist/src/http/response.js +2 -2
  283. package/dist/src/http/response.js.map +1 -1
  284. package/dist/src/ide/diff.js +7 -7
  285. package/dist/src/ide/diff.js.map +1 -1
  286. package/dist/src/manager/board/routes.js +28 -27
  287. package/dist/src/manager/board/routes.js.map +1 -1
  288. package/dist/src/manager/dashboard-home.js +3 -5
  289. package/dist/src/manager/dashboard-home.js.map +1 -1
  290. package/dist/src/manager/dashboard-service.js +2 -2
  291. package/dist/src/manager/dashboard-service.js.map +1 -1
  292. package/dist/src/manager/health-history.js +10 -9
  293. package/dist/src/manager/health-history.js.map +1 -1
  294. package/dist/src/manager/launchd-service.js +2 -2
  295. package/dist/src/manager/launchd-service.js.map +1 -1
  296. package/dist/src/manager/lifecycle-helpers.js +7 -6
  297. package/dist/src/manager/lifecycle-helpers.js.map +1 -1
  298. package/dist/src/manager/lifecycle.js +7 -6
  299. package/dist/src/manager/lifecycle.js.map +1 -1
  300. package/dist/src/manager/logs.js +18 -18
  301. package/dist/src/manager/logs.js.map +1 -1
  302. package/dist/src/manager/metadata.js +10 -2
  303. package/dist/src/manager/metadata.js.map +1 -1
  304. package/dist/src/manager/notes/assets.js +216 -0
  305. package/dist/src/manager/notes/assets.js.map +1 -0
  306. package/dist/src/manager/notes/capabilities.js +56 -0
  307. package/dist/src/manager/notes/capabilities.js.map +1 -0
  308. package/dist/src/manager/notes/constants.js +11 -0
  309. package/dist/src/manager/notes/constants.js.map +1 -0
  310. package/dist/src/manager/notes/frontmatter.js +120 -0
  311. package/dist/src/manager/notes/frontmatter.js.map +1 -0
  312. package/dist/src/manager/notes/link-resolver.js +96 -0
  313. package/dist/src/manager/notes/link-resolver.js.map +1 -0
  314. package/dist/src/manager/notes/path-guards.js +4 -0
  315. package/dist/src/manager/notes/path-guards.js.map +1 -1
  316. package/dist/src/manager/notes/remote-assets.js +128 -0
  317. package/dist/src/manager/notes/remote-assets.js.map +1 -0
  318. package/dist/src/manager/notes/routes.js +63 -13
  319. package/dist/src/manager/notes/routes.js.map +1 -1
  320. package/dist/src/manager/notes/store.js +3 -2
  321. package/dist/src/manager/notes/store.js.map +1 -1
  322. package/dist/src/manager/notes/system-trash.js +3 -3
  323. package/dist/src/manager/notes/system-trash.js.map +1 -1
  324. package/dist/src/manager/notes/vault-index.js +220 -0
  325. package/dist/src/manager/notes/vault-index.js.map +1 -0
  326. package/dist/src/manager/notes/watcher.js +27 -0
  327. package/dist/src/manager/notes/watcher.js.map +1 -0
  328. package/dist/src/manager/notes/wiki-links.js +109 -0
  329. package/dist/src/manager/notes/wiki-links.js.map +1 -0
  330. package/dist/src/manager/process-verify.js +29 -0
  331. package/dist/src/manager/process-verify.js.map +1 -1
  332. package/dist/src/manager/profiles.js +3 -2
  333. package/dist/src/manager/profiles.js.map +1 -1
  334. package/dist/src/manager/registry.js +60 -58
  335. package/dist/src/manager/registry.js.map +1 -1
  336. package/dist/src/manager/routes/electron-metrics.js +22 -22
  337. package/dist/src/manager/routes/electron-metrics.js.map +1 -1
  338. package/dist/src/manager/scan.js +2 -2
  339. package/dist/src/manager/scan.js.map +1 -1
  340. package/dist/src/manager/schedule/routes.js +24 -23
  341. package/dist/src/manager/schedule/routes.js.map +1 -1
  342. package/dist/src/manager/server.js +28 -28
  343. package/dist/src/manager/server.js.map +1 -1
  344. package/dist/src/manager/systemd-service.js +1 -1
  345. package/dist/src/manager/systemd-service.js.map +1 -1
  346. package/dist/src/memory/bootstrap.js +5 -4
  347. package/dist/src/memory/bootstrap.js.map +1 -1
  348. package/dist/src/memory/heartbeat-schedule.js +10 -10
  349. package/dist/src/memory/heartbeat-schedule.js.map +1 -1
  350. package/dist/src/memory/heartbeat.js +23 -22
  351. package/dist/src/memory/heartbeat.js.map +1 -1
  352. package/dist/src/memory/indexing.js.map +1 -1
  353. package/dist/src/memory/keyword-expand.js +1 -1
  354. package/dist/src/memory/keyword-expand.js.map +1 -1
  355. package/dist/src/memory/memory.js +2 -2
  356. package/dist/src/memory/memory.js.map +1 -1
  357. package/dist/src/memory/runtime.js +6 -5
  358. package/dist/src/memory/runtime.js.map +1 -1
  359. package/dist/src/memory/shared.js +2 -1
  360. package/dist/src/memory/shared.js.map +1 -1
  361. package/dist/src/memory/worklog.js +1 -1
  362. package/dist/src/memory/worklog.js.map +1 -1
  363. package/dist/src/messaging/runtime.js +13 -10
  364. package/dist/src/messaging/runtime.js.map +1 -1
  365. package/dist/src/messaging/send.js +16 -15
  366. package/dist/src/messaging/send.js.map +1 -1
  367. package/dist/src/orchestrator/collect.js +6 -6
  368. package/dist/src/orchestrator/collect.js.map +1 -1
  369. package/dist/src/orchestrator/distribute.js +112 -77
  370. package/dist/src/orchestrator/distribute.js.map +1 -1
  371. package/dist/src/orchestrator/gateway.js +6 -5
  372. package/dist/src/orchestrator/gateway.js.map +1 -1
  373. package/dist/src/orchestrator/pipeline.js +42 -42
  374. package/dist/src/orchestrator/pipeline.js.map +1 -1
  375. package/dist/src/orchestrator/state-machine.js +3 -3
  376. package/dist/src/orchestrator/state-machine.js.map +1 -1
  377. package/dist/src/orchestrator/worker-registry.js +4 -3
  378. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  379. package/dist/src/prompt/builder.js +24 -19
  380. package/dist/src/prompt/builder.js.map +1 -1
  381. package/dist/src/prompt/templates/a1-system.md +15 -10
  382. package/dist/src/prompt/templates/control-system.md +9 -7
  383. package/dist/src/prompt/templates/employee.md +5 -4
  384. package/dist/src/prompt/templates/vision-click.md +1 -1
  385. package/dist/src/routes/_http-error.js +15 -0
  386. package/dist/src/routes/_http-error.js.map +1 -0
  387. package/dist/src/routes/avatar.js +6 -5
  388. package/dist/src/routes/avatar.js.map +1 -1
  389. package/dist/src/routes/browser.js +132 -45
  390. package/dist/src/routes/browser.js.map +1 -1
  391. package/dist/src/routes/employees.js +28 -21
  392. package/dist/src/routes/employees.js.map +1 -1
  393. package/dist/src/routes/heartbeat.js +12 -9
  394. package/dist/src/routes/heartbeat.js.map +1 -1
  395. package/dist/src/routes/i18n.js +13 -7
  396. package/dist/src/routes/i18n.js.map +1 -1
  397. package/dist/src/routes/jaw-memory.js +15 -11
  398. package/dist/src/routes/jaw-memory.js.map +1 -1
  399. package/dist/src/routes/memory.js +25 -20
  400. package/dist/src/routes/memory.js.map +1 -1
  401. package/dist/src/routes/messaging.js +50 -29
  402. package/dist/src/routes/messaging.js.map +1 -1
  403. package/dist/src/routes/orchestrate.js +38 -24
  404. package/dist/src/routes/orchestrate.js.map +1 -1
  405. package/dist/src/routes/quota.js +81 -17
  406. package/dist/src/routes/quota.js.map +1 -1
  407. package/dist/src/routes/settings.js +28 -18
  408. package/dist/src/routes/settings.js.map +1 -1
  409. package/dist/src/routes/skills.js +22 -13
  410. package/dist/src/routes/skills.js.map +1 -1
  411. package/dist/src/routes/traces.js +77 -0
  412. package/dist/src/routes/traces.js.map +1 -0
  413. package/dist/src/security/path-guards.js +2 -1
  414. package/dist/src/security/path-guards.js.map +1 -1
  415. package/dist/src/shared/tool-log-sanitize.js +191 -0
  416. package/dist/src/shared/tool-log-sanitize.js.map +1 -0
  417. package/dist/src/telegram/bot.js +65 -55
  418. package/dist/src/telegram/bot.js.map +1 -1
  419. package/dist/src/telegram/forwarder.js +5 -9
  420. package/dist/src/telegram/forwarder.js.map +1 -1
  421. package/dist/src/telegram/telegram-file.js +28 -24
  422. package/dist/src/telegram/telegram-file.js.map +1 -1
  423. package/dist/src/telegram/voice.js +4 -3
  424. package/dist/src/telegram/voice.js.map +1 -1
  425. package/dist/src/trace/redact.js +50 -0
  426. package/dist/src/trace/redact.js.map +1 -0
  427. package/dist/src/trace/store.js +162 -0
  428. package/dist/src/trace/store.js.map +1 -0
  429. package/dist/src/trace/types.js +2 -0
  430. package/dist/src/trace/types.js.map +1 -0
  431. package/dist/src/types/cli-engine.js +34 -0
  432. package/dist/src/types/cli-engine.js.map +1 -0
  433. package/dist/src/types/cli-events.js +31 -0
  434. package/dist/src/types/cli-events.js.map +1 -0
  435. package/package.json +22 -2
  436. package/public/css/tool-ui.css +3 -1
  437. package/public/css/trace-drawer.css +48 -0
  438. package/public/dist/assets/{AdvancedExport-3WAYIabE.js → AdvancedExport-DJZ2VmBR.js} +1 -1
  439. package/public/dist/assets/Agent-CgpLT8IY.js +1 -0
  440. package/public/dist/assets/Browser-CrkiQoB8.js +1 -0
  441. package/public/dist/assets/{ChannelsDiscord-UzFPlWT4.js → ChannelsDiscord-CVUC22D4.js} +1 -1
  442. package/public/dist/assets/{ChannelsTelegram-DNWtPX0w.js → ChannelsTelegram-DEatIQNM.js} +1 -1
  443. package/public/dist/assets/{DashboardMeta-Y_6nVeJO.js → DashboardMeta-BKoxRc7i.js} +1 -1
  444. package/public/dist/assets/{Display-D8vGOl4s.js → Display-DnNGV9Km.js} +1 -1
  445. package/public/dist/assets/{Employees-YR_sIRK4.js → Employees-DZ2iJYKy.js} +1 -1
  446. package/public/dist/assets/{HealthBadge-CPePajyU.js → HealthBadge-Cq2c7G9s.js} +1 -1
  447. package/public/dist/assets/{Heartbeat-DTpAULQR.js → Heartbeat-BML6eTXZ.js} +1 -1
  448. package/public/dist/assets/{Mcp-DM-PgG6z.js → Mcp-BlEviQ3h.js} +1 -1
  449. package/public/dist/assets/{Memory-C_LvJnkn.js → Memory-BRyH80He.js} +1 -1
  450. package/public/dist/assets/MilkdownWysiwygEditor-Cm3uXfWf.js +52 -0
  451. package/public/dist/assets/ModelProvider-DxyR7EL9.js +1 -0
  452. package/public/dist/assets/Network-DDOOESh1.js +1 -0
  453. package/public/dist/assets/{Permissions-B1naJjjw.js → Permissions-Br0eSbKb.js} +1 -1
  454. package/public/dist/assets/{Permissions-BKffrMJD.js → Permissions-QHkzStqQ.js} +1 -1
  455. package/public/dist/assets/{Profile-DIqjSe2C.js → Profile-C79NKumk.js} +1 -1
  456. package/public/dist/assets/{Prompts-BMfbV6Y4.js → Prompts-BmiIDiXW.js} +1 -1
  457. package/public/dist/assets/{SpeechKeys-DjiQTzSL.js → SpeechKeys-B8304XJK.js} +1 -1
  458. package/public/dist/assets/app-Be58Cs3Y.js +32 -0
  459. package/public/dist/assets/{app-BzvwJJiv.css → app-CphocJzo.css} +1 -1
  460. package/public/dist/assets/{dist-DTvxN3ux.js → dist-BD0UXfgF2.js} +1 -1
  461. package/public/dist/assets/{dist-CASeq-Tl.js → dist-BNfXO3Yr.js} +1 -1
  462. package/public/dist/assets/{dist-BMPiaUzF.js → dist-BUnPYbK3.js} +1 -1
  463. package/public/dist/assets/{dist-CT_X3hVT.js → dist-BZosRD2u.js} +1 -1
  464. package/public/dist/assets/{dist-4J6YbNXv.js → dist-Bd9PlnQm.js} +1 -1
  465. package/public/dist/assets/{dist-BcZjyn5g.js → dist-BsT5UdNP.js} +1 -1
  466. package/public/dist/assets/{dist-BfBhOPR-.js → dist-CIuXW-sc.js} +1 -1
  467. package/public/dist/assets/{dist-BMiCig3A2.js → dist-CL4PTYWf.js} +1 -1
  468. package/public/dist/assets/{dist-VyP6-HLb.js → dist-Ch5VAlV9.js} +1 -1
  469. package/public/dist/assets/dist-ClqO40BE.js +1 -0
  470. package/public/dist/assets/{dist-c98Tp7bP.js → dist-Cp42cMcI.js} +1 -1
  471. package/public/dist/assets/{dist-CIlYL1qe.js → dist-CpUK8ypo.js} +1 -1
  472. package/public/dist/assets/dist-CxeLAw2Y.js +1 -0
  473. package/public/dist/assets/dist-D2SH8nxa.js +1 -0
  474. package/public/dist/assets/{dist-84fwQ7bO.js → dist-D6cUXP7K.js} +1 -1
  475. package/public/dist/assets/{dist-BOCcQAyF.js → dist-D7bCuS3f.js} +1 -1
  476. package/public/dist/assets/{dist-DMmpfLVP.js → dist-DFYRUAjN.js} +1 -1
  477. package/public/dist/assets/{dist-DdY6pTJr.js → dist-DZsFVYF4.js} +1 -1
  478. package/public/dist/assets/{dist-B0p3Eyme.js → dist-Db16ogVk.js} +1 -1
  479. package/public/dist/assets/{dist-DlnNtr6L.js → dist-DfodGES_.js} +1 -1
  480. package/public/dist/assets/{dist-DO9so2a2.js → dist-SU-YTAIg.js} +1 -1
  481. package/public/dist/assets/{dist-DUjXiMLP.js → dist-UYn7T-GH.js} +1 -1
  482. package/public/dist/assets/{dist-BW1409rz.js → dist-W51oDoeA.js} +1 -1
  483. package/public/dist/assets/{dist-BimBQZx1.js → dist-eU7TyC86.js} +1 -1
  484. package/public/dist/assets/dist-l9HH00ip.js +1 -0
  485. package/public/dist/assets/{dist-BrOPNxdH.js → dist-urPTQzXL.js} +1 -1
  486. package/public/dist/assets/{dist-AloEV3J52.js → dist-yHP6L0Ty.js} +1 -1
  487. package/public/dist/assets/{employees-Bbabvbyx.js → employees-CxdghzoD.js} +7 -7
  488. package/public/dist/assets/{error-normalize-DdvKGLt_.js → error-normalize-5n-zlEQ3.js} +1 -1
  489. package/public/dist/assets/insert-image-markdown-DIEa-zjk.js +22 -0
  490. package/public/dist/assets/{manager-DyB2ZUr9.css → manager-DEiyrWDP.css} +1 -1
  491. package/public/dist/assets/manager-UEXd1_9T.js +25 -0
  492. package/public/dist/assets/{memory-B_plvcuQ.js → memory-CsMNkYtv.js} +9 -9
  493. package/public/dist/assets/memory-DXad_DPO.js +1 -0
  494. package/public/dist/assets/{page-shell-DML_HneX.js → page-shell-D5tbivHH.js} +1 -1
  495. package/public/dist/assets/{render-DEhbfUAW.js → render-DGQX46ei.js} +2 -2
  496. package/public/dist/assets/{settings-D7F-_kYG.js → settings-BH213Yv3.js} +14 -14
  497. package/public/dist/assets/settings-DXT87G2U.js +1 -0
  498. package/public/dist/assets/settings-client-ajlwI-oK.js +1 -0
  499. package/public/dist/assets/skills-5o_1v0nz.js +1 -0
  500. package/public/dist/assets/{skills-DoGJOc0D.js → skills-CQtCtHPA.js} +6 -6
  501. package/public/dist/assets/slash-commands-D4-hrrmh.js +1 -0
  502. package/public/dist/assets/{slash-commands-khNFPOyF.js → slash-commands-Dzk1xHWS.js} +1 -1
  503. package/public/dist/assets/trace-drawer-SRKcfm2S.js +15 -0
  504. package/public/dist/assets/ui-CdRKN2S6.js +141 -0
  505. package/public/dist/assets/ui-n43jmg_f.js +1 -0
  506. package/public/dist/assets/{ws-B2aJ-nD2.js → ws-CTHQFzM1.js} +8 -8
  507. package/public/dist/index.html +2 -2
  508. package/public/dist/manager/index.html +2 -2
  509. package/public/index.html +1 -0
  510. package/public/js/constants.ts +5 -5
  511. package/public/js/diagram/iframe-renderer.ts +11 -11
  512. package/public/js/features/chat.ts +1 -1
  513. package/public/js/features/memory.ts +10 -10
  514. package/public/js/features/pending-queue.ts +2 -2
  515. package/public/js/features/process-block.ts +257 -29
  516. package/public/js/features/process-step-match.ts +18 -0
  517. package/public/js/features/settings-cli-status.ts +1 -1
  518. package/public/js/features/settings-stt.ts +37 -11
  519. package/public/js/features/settings-templates.ts +2 -2
  520. package/public/js/features/slash-commands.ts +1 -1
  521. package/public/js/features/tool-ui.ts +13 -7
  522. package/public/js/features/trace-drawer.ts +122 -0
  523. package/public/js/icons.ts +1 -1
  524. package/public/js/main.ts +28 -28
  525. package/public/js/provider-icons.ts +1 -1
  526. package/public/js/render.ts +29 -27
  527. package/public/js/sanitizer.ts +4 -0
  528. package/public/js/ui.ts +234 -68
  529. package/public/js/virtual-scroll.ts +19 -33
  530. package/public/js/ws.ts +22 -10
  531. package/public/manager/src/App.tsx +34 -6
  532. package/public/manager/src/api.ts +55 -1
  533. package/public/manager/src/components/ActivityTimeline.tsx +1 -1
  534. package/public/manager/src/components/InstanceDetailPanel.tsx +2 -2
  535. package/public/manager/src/components/InstanceGroups.tsx +5 -5
  536. package/public/manager/src/components/InstanceListContent.tsx +1 -1
  537. package/public/manager/src/dashboard-features.ts +1 -1
  538. package/public/manager/src/manager-notes.css +49 -2
  539. package/public/manager/src/notes/MarkdownEditor.tsx +7 -3
  540. package/public/manager/src/notes/NotesFileTree.tsx +45 -6
  541. package/public/manager/src/notes/NotesSidebar.tsx +24 -55
  542. package/public/manager/src/notes/NotesWorkspace.tsx +50 -3
  543. package/public/manager/src/notes/image-assets/clipboard-images.ts +100 -0
  544. package/public/manager/src/notes/image-assets/insert-image-markdown.ts +85 -0
  545. package/public/manager/src/notes/notes-api.ts +2 -0
  546. package/public/manager/src/notes/notes-types.ts +8 -1
  547. package/public/manager/src/notes/rendering/MarkdownRenderer.tsx +6 -0
  548. package/public/manager/src/notes/rendering/markdown-render-security.ts +19 -1
  549. package/public/manager/src/notes/rich-markdown/paste-policy.ts +6 -2
  550. package/public/manager/src/notes/rich-markdown/rich-markdown-extension.ts +5 -5
  551. package/public/manager/src/notes/rich-markdown/rich-widget.ts +8 -8
  552. package/public/manager/src/notes/useNotesExternalSync.ts +37 -0
  553. package/public/manager/src/notes/useNotesModel.ts +91 -0
  554. package/public/manager/src/notes/wysiwyg/MilkdownWysiwygEditor.tsx +157 -17
  555. package/public/manager/src/notes/wysiwyg/milkdown-block-keymap.ts +14 -2
  556. package/public/manager/src/notes/wysiwyg/milkdown-code-block-view.ts +20 -20
  557. package/public/manager/src/notes/wysiwyg/milkdown-heading-source-view.ts +8 -8
  558. package/public/manager/src/notes/wysiwyg/milkdown-math.ts +25 -25
  559. package/public/manager/src/settings/pages/Browser.tsx +38 -20
  560. package/public/manager/src/settings/pages/ModelProvider.tsx +11 -9
  561. package/public/manager/src/settings/pages/Network.tsx +10 -10
  562. package/public/manager/src/settings/pages/components/HealthBadge.tsx +12 -12
  563. package/public/manager/src/settings/pages/components/agent/runtime-employees-helpers.ts +12 -10
  564. package/public/manager/src/settings/pages/components/employees-helpers.ts +9 -9
  565. package/public/manager/src/settings/pages/components/heartbeat-helpers.ts +13 -13
  566. package/public/manager/src/settings/pages/components/memory-helpers.ts +4 -4
  567. package/public/manager/src/settings/pages/mcp-helpers.ts +7 -7
  568. package/public/manager/src/settings/settings-client.ts +4 -3
  569. package/public/manager/src/sync/IframeBridge.tsx +29 -0
  570. package/public/manager/src/sync/VisibilityBridge.tsx +24 -0
  571. package/public/manager/src/sync/invalidation-bus.ts +30 -0
  572. package/public/manager/src/sync/useInvalidationSubscription.ts +19 -0
  573. package/public/manager/src/types.ts +101 -0
  574. package/scripts/check-strict-baseline.mjs +255 -0
  575. package/scripts/claim-audit.mjs +159 -0
  576. package/scripts/i18n-registry.ts +4 -4
  577. package/scripts/install-officecli.sh +2 -2
  578. package/scripts/install-wsl.sh +2 -1
  579. package/scripts/release-gates.mjs +347 -0
  580. package/scripts/release-preview.sh +3 -0
  581. package/scripts/release.sh +4 -0
  582. package/scripts/smoke/opencode-external-dir-smoke.ts +14 -5
  583. package/public/dist/assets/Agent-BYdzZwD0.js +0 -1
  584. package/public/dist/assets/Browser-CkGeczuN.js +0 -1
  585. package/public/dist/assets/MilkdownWysiwygEditor-B7k9bAey.js +0 -52
  586. package/public/dist/assets/ModelProvider-CX3Qhowu.js +0 -1
  587. package/public/dist/assets/Network-DfPLFAvw.js +0 -1
  588. package/public/dist/assets/app-DLYoRkU9.js +0 -32
  589. package/public/dist/assets/dist-8zNAQAIa.js +0 -1
  590. package/public/dist/assets/dist-BgeY6nvK.js +0 -1
  591. package/public/dist/assets/dist-BzDGGxHQ.js +0 -1
  592. package/public/dist/assets/dist-D3YKbVi-.js +0 -1
  593. package/public/dist/assets/manager-CUSgFbMO.js +0 -25
  594. package/public/dist/assets/markdown-render-security-DJfJPWO-.js +0 -22
  595. package/public/dist/assets/memory-DQ6dU0qs.js +0 -1
  596. package/public/dist/assets/settings-DxLPUbpj.js +0 -1
  597. package/public/dist/assets/settings-client-CGf3uPPf.js +0 -1
  598. package/public/dist/assets/skills-yMfNYJ8m.js +0 -1
  599. package/public/dist/assets/slash-commands-CZcwr1W6.js +0 -1
  600. package/public/dist/assets/ui-04YlOMgn.js +0 -136
  601. package/public/dist/assets/ui-D6hlMjRq.js +0 -1
  602. /package/public/dist/assets/{InlineWarn-CqgWEC41.js → InlineWarn-BooBRm7o.js} +0 -0
  603. /package/public/dist/assets/{agent-meta-puNn13DV.js → agent-meta-DHddpWHQ.js} +0 -0
  604. /package/public/dist/assets/{fields-DH9JS3mb.js → fields-BtncIZYA.js} +0 -0
  605. /package/public/dist/assets/{mermaid-loader-6XC0y10y.js → mermaid-loader-BEFIOoJn.js} +0 -0
  606. /package/public/dist/assets/{path-utils-CtsDDGZg.js → path-utils-BuEEtj9w.js} +0 -0
  607. /package/public/dist/assets/{w3c-keyname-VSld09PZ.js → w3c-keyname-IiiZScED.js} +0 -0
@@ -7,10 +7,9 @@ import {
7
7
  } from '@tanstack/virtual-core';
8
8
  import { generateId } from './uuid.js';
9
9
  import { releaseMermaidNodes } from './render.js';
10
+ import { releaseProcessBlockDetails } from './features/process-block.js';
10
11
 
11
- // Activates at THRESHOLD messages to prevent DOM bloat
12
- // Activate immediately — tanstack virtualizes DOM so only visible
13
- // items are rendered, preventing DOM bloat at any message count
12
+ // Activate immediately: tanstack keeps only visible items mounted.
14
13
  const THRESHOLD = 1;
15
14
  const EST_HEIGHT = 80;
16
15
  const OVERSCAN = 5;
@@ -31,6 +30,7 @@ export interface VirtualItem {
31
30
  id: string;
32
31
  html: string;
33
32
  height: number; // used as estimateSize hint; tanstack measures real heights
33
+ rehydratesProcessDetails?: boolean;
34
34
  }
35
35
 
36
36
  export type LazyRenderCallback = (targets: HTMLElement[]) => void;
@@ -86,8 +86,6 @@ export class VirtualScroll {
86
86
  get active(): boolean { return this._active; }
87
87
  get count(): number { return this.items.length; }
88
88
 
89
- // ── Measure gap from CSS ──
90
-
91
89
  private measureGap(): number {
92
90
  if (this.itemGap > 0) return this.itemGap;
93
91
  const probe = document.createElement('div');
@@ -114,8 +112,6 @@ export class VirtualScroll {
114
112
  this.renderItems();
115
113
  }
116
114
 
117
- // ── Public API (preserved for callers) ──
118
-
119
115
  /** Bulk-load items. Call AFTER registering onLazyRender/onPostRender. */
120
116
  setItems(
121
117
  items: VirtualItem[],
@@ -128,9 +124,7 @@ export class VirtualScroll {
128
124
  }
129
125
  }
130
126
 
131
- /** Seed heights into items so estimateSize returns accurate values.
132
- * tanstack will re-measure via ResizeObserver on mount, but seeding
133
- * gives accurate initial getTotalSize() for scrollToIndex precision. */
127
+ /** Seed heights so estimateSize is accurate before ResizeObserver runs. */
134
128
  seedMeasuredHeights(startIndex: number, heights: number[]): void {
135
129
  for (let offset = 0; offset < heights.length; offset++) {
136
130
  const idx = startIndex + offset;
@@ -148,7 +142,10 @@ export class VirtualScroll {
148
142
  }
149
143
 
150
144
  addItem(id: string, html: string): void {
151
- const item: VirtualItem = { id, html, height: EST_HEIGHT };
145
+ this.appendItem({ id, html, height: EST_HEIGHT });
146
+ }
147
+
148
+ appendItem(item: VirtualItem): void {
152
149
  this.items.push(item);
153
150
  if (!this._active && this.items.length >= THRESHOLD) {
154
151
  this.activate(true);
@@ -409,14 +406,15 @@ export class VirtualScroll {
409
406
  }
410
407
  this.virtualizer = null;
411
408
  this._active = false;
412
- for (const el of this.mounted.values()) releaseMermaidNodes(el);
409
+ for (const el of this.mounted.values()) {
410
+ releaseMermaidNodes(el);
411
+ releaseProcessBlockDetails(el);
412
+ }
413
413
  this.mounted.clear();
414
414
  this.container.classList.remove('vs-active');
415
415
  this.container.innerHTML = '';
416
416
  }
417
417
 
418
- // ── Render loop (called by tanstack onChange) ──
419
-
420
418
  private renderItems(): void {
421
419
  if (!this.virtualizer) return;
422
420
  this.virtualizer._willUpdate();
@@ -424,50 +422,42 @@ export class VirtualScroll {
424
422
  const virtualItems = this.virtualizer.getVirtualItems();
425
423
  const totalSize = this.virtualizer.getTotalSize();
426
424
 
427
- // Update inner container height (provides scrollbar range)
428
425
  this.innerEl.style.height = `${totalSize}px`;
429
426
 
430
- // Determine which indices tanstack wants rendered
431
427
  const wantedSet = new Set(virtualItems.map(vi => vi.index));
432
428
 
433
- // Remove items no longer in range
434
429
  for (const [idx, el] of this.mounted) {
435
430
  if (!wantedSet.has(idx)) {
436
431
  releaseMermaidNodes(el);
432
+ const item = this.items[idx];
433
+ if (item?.rehydratesProcessDetails) releaseProcessBlockDetails(el);
437
434
  el.remove();
438
435
  this.mounted.delete(idx);
439
436
  }
440
437
  }
441
438
 
442
- // Mount / reposition items
443
439
  const newlyMounted: HTMLElement[] = [];
444
440
  for (const vItem of virtualItems) {
445
441
  let el = this.mounted.get(vItem.index);
446
442
 
447
443
  if (!el) {
448
- // Create new element from stored HTML
449
444
  const item = this.items[vItem.index];
450
445
  if (!item) continue;
451
446
  const wrapper = document.createElement('div');
452
447
  wrapper.innerHTML = item.html;
453
448
  el = wrapper.firstElementChild as HTMLElement;
454
449
  if (!el) continue;
455
- el.dataset.vsIdx = String(vItem.index);
450
+ el.dataset['vsIdx'] = String(vItem.index);
456
451
  this.innerEl.appendChild(el);
457
452
  this.mounted.set(vItem.index, el);
458
453
  newlyMounted.push(el);
459
454
  }
460
455
 
461
- // Position via transform only — left/right/width handled by CSS
462
- // so .msg-user align-self / left:auto works correctly
456
+ // CSS owns left/right/width, including .msg-user alignment.
463
457
  el.style.transform = `translateY(${vItem.start}px)`;
464
458
  }
465
459
 
466
- // Lazy render BEFORE measuring onLazyRender processes markdown,
467
- // code blocks, math which dramatically changes element heights.
468
- // Measuring first would record pre-render heights (e.g. 50px),
469
- // then lazy render expands to 300px+, causing overlap until the
470
- // deferred ResizeObserver catches up (1+ frames later).
460
+ // Lazy render before measuring; markdown/code/math change heights.
471
461
  if (this.onLazyRender) {
472
462
  const lazyTargets = this.innerEl.querySelectorAll<HTMLElement>('.lazy-pending');
473
463
  if (lazyTargets.length > 0) {
@@ -475,23 +465,19 @@ export class VirtualScroll {
475
465
  }
476
466
  }
477
467
 
478
- // Post render: activate widgets, linkify paths
479
468
  if (this.onPostRender) {
480
469
  this.onPostRender(this.innerEl);
481
470
  }
482
471
 
483
- // Now measure real heights — elements have their final rendered content.
484
- // Only for newly mounted elements (already-observed ones are tracked).
472
+ // Newly mounted elements now have their final rendered content.
485
473
  for (const el of newlyMounted) {
486
- const index = Number(el.dataset.vsIdx || '-1');
474
+ const index = Number(el.dataset['vsIdx'] || '-1');
487
475
  syncMeasuredItemHeight(this.items, index, el);
488
476
  this.virtualizer!.measureElement(el);
489
477
  }
490
478
  }
491
479
  }
492
480
 
493
- // ── Singleton ──
494
-
495
481
  let instance: VirtualScroll | null = null;
496
482
 
497
483
  export function getVirtualScroll(): VirtualScroll {
package/public/js/ws.ts CHANGED
@@ -55,12 +55,18 @@ interface WsMessage {
55
55
  subtasks?: { agent?: string; name?: string }[];
56
56
  action?: string;
57
57
  icon?: string;
58
+ rawIcon?: string;
58
59
  label?: string;
59
60
  toolType?: string;
60
61
  detail?: string;
61
62
  stepRef?: string;
63
+ traceRunId?: string;
64
+ traceSeq?: number;
65
+ detailAvailable?: boolean;
66
+ detailBytes?: number;
67
+ rawRetentionStatus?: string;
62
68
  text?: string;
63
- toolLog?: { icon: string; label: string; detail?: string; toolType?: string; stepRef?: string }[];
69
+ toolLog?: { icon: string; label: string; detail?: string; toolType?: string; stepRef?: string; traceRunId?: string; traceSeq?: number; detailAvailable?: boolean; detailBytes?: number; rawRetentionStatus?: string }[];
64
70
  from?: string;
65
71
  to?: string;
66
72
  source?: string;
@@ -263,8 +269,8 @@ function applyOrcState(orcState: string, title?: string) {
263
269
  const brand = document.getElementById('pabcBrand');
264
270
 
265
271
  if (roadmap && shark) {
266
- if (!roadmap.dataset.resizeObserved) {
267
- roadmap.dataset.resizeObserved = '1';
272
+ if (!roadmap.dataset['resizeObserved']) {
273
+ roadmap.dataset['resizeObserved'] = '1';
268
274
  new ResizeObserver(() => {
269
275
  if (currentSharkPhase && shark.classList.contains('running')) {
270
276
  positionShark(roadmap, shark, currentSharkPhase);
@@ -379,10 +385,15 @@ export function connect(): void {
379
385
  id: `step-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,
380
386
  type: stepType,
381
387
  icon: msg.icon || ICONS.tool,
382
- rawIcon: (msg as any).rawIcon || msg.icon || '',
388
+ rawIcon: msg.rawIcon || msg.icon || '',
383
389
  label: empPrefix + (msg.label || ''),
384
390
  detail: msg.detail || '',
385
391
  stepRef: msg.stepRef || '',
392
+ traceRunId: msg.traceRunId || '',
393
+ traceSeq: msg.traceSeq,
394
+ detailAvailable: msg.detailAvailable,
395
+ detailBytes: msg.detailBytes,
396
+ rawRetentionStatus: msg.rawRetentionStatus,
386
397
  status: (msg.status as 'running' | 'done' | 'error') || 'running',
387
398
  startTime: Date.now(),
388
399
  });
@@ -413,14 +424,15 @@ export function connect(): void {
413
424
  } else if (msg.type === 'agent_added' || msg.type === 'agent_updated' || msg.type === 'agent_deleted') {
414
425
  import('./features/employees.js').then(m => m.loadEmployees());
415
426
  } else if (msg.type === 'heartbeat_pending') {
416
- applyHeartbeatRuntime({
427
+ const heartbeatRuntimePatch: Partial<HeartbeatRuntimeState> = {
417
428
  pending: msg.pending || 0,
418
429
  deferredPending: msg.deferredPending || 0,
419
- reason: msg.reason,
420
- policy: msg.policy,
421
- jobId: msg.jobId,
422
- jobName: msg.jobName,
423
- });
430
+ };
431
+ if (msg.reason !== undefined) heartbeatRuntimePatch.reason = msg.reason;
432
+ if (msg.policy !== undefined) heartbeatRuntimePatch.policy = msg.policy;
433
+ if (msg.jobId !== undefined) heartbeatRuntimePatch.jobId = msg.jobId;
434
+ if (msg.jobName !== undefined) heartbeatRuntimePatch.jobName = msg.jobName;
435
+ applyHeartbeatRuntime(heartbeatRuntimePatch);
424
436
  } else if (msg.type === 'orc_state') {
425
437
  if (!shouldApplyOrcStateEvent(msg.scope, currentOrcScope)) return;
426
438
  applyOrcState(typeof msg.state === 'string' ? msg.state : 'IDLE', msg.title);
@@ -26,6 +26,11 @@ import { summarizeActivityTitleSupport } from './dashboard-settings/activity-tit
26
26
  import { dashboardSettingsUiFromView } from './dashboard-settings/dashboard-settings-ui';
27
27
  import { NotesSidebar } from './notes/NotesSidebar';
28
28
  import { NotesWorkspace } from './notes/NotesWorkspace';
29
+ import { useNotesModel } from './notes/useNotesModel';
30
+ import { publishInvalidation } from './sync/invalidation-bus';
31
+ import { useInvalidationSubscription } from './sync/useInvalidationSubscription';
32
+ import { IframeBridge } from './sync/IframeBridge';
33
+ import { VisibilityBridge } from './sync/VisibilityBridge';
29
34
  import { DashboardBoardSidebar } from './dashboard-board/DashboardBoardSidebar';
30
35
  import { DashboardBoardWorkspace } from './dashboard-board/DashboardBoardWorkspace';
31
36
  import type { BoardView } from './dashboard-board/board-view';
@@ -198,6 +203,8 @@ export function App() {
198
203
  } : current);
199
204
  }
200
205
 
206
+ useInvalidationSubscription('instances', () => void load(), 'app');
207
+
201
208
  useEffect(() => {
202
209
  async function initialize(): Promise<void> {
203
210
  try {
@@ -233,7 +240,7 @@ export function App() {
233
240
  }, []);
234
241
 
235
242
  async function saveUi(ui: Parameters<typeof registry.save>[0]['ui']): Promise<void> {
236
- if (!hydrated) return;
243
+ if (!hydrated || ui === undefined) return;
237
244
  await registry.save({ ui });
238
245
  }
239
246
 
@@ -245,7 +252,7 @@ export function App() {
245
252
  }, [instances]);
246
253
  const summary = useMemo(() => {
247
254
  return instances.reduce((acc, instance) => {
248
- acc.total += 1;
255
+ acc['total'] += 1;
249
256
  acc[instance.status] = (acc[instance.status] || 0) + 1;
250
257
  return acc;
251
258
  }, { total: 0 } as Record<string, number>);
@@ -287,6 +294,10 @@ export function App() {
287
294
  function handleTabChange(tab: DashboardDetailTab): void {
288
295
  if (tab !== 'settings' && !canLeaveDirtySettings()) return;
289
296
  if (tab !== 'settings') setSettingsDirty(false);
297
+ if (view.activeDetailTab === 'preview' && tab !== 'preview') {
298
+ const port = view.selectedPort;
299
+ if (port != null) activityUnread.markPortSeen(port);
300
+ }
290
301
  view.setActiveDetailTab(tab);
291
302
  if (tab === 'preview') {
292
303
  const port = view.selectedPort;
@@ -318,6 +329,10 @@ export function App() {
318
329
  }
319
330
 
320
331
  function handleSidebarModeChange(mode: DashboardSidebarMode): void {
332
+ if (view.sidebarMode === 'instances' && mode !== 'instances' && view.activeDetailTab === 'preview') {
333
+ const port = view.selectedPort;
334
+ if (port != null) activityUnread.markPortSeen(port);
335
+ }
321
336
  const sidebarMode = normalizeSidebarModeForBuild(mode);
322
337
  view.setSidebarMode(sidebarMode); void saveUi({ sidebarMode });
323
338
  }
@@ -342,6 +357,12 @@ export function App() {
342
357
  view.setNotesTreeWidth(value); void saveUi({ notesTreeWidth: value });
343
358
  }
344
359
 
360
+ const notesModel = useNotesModel({
361
+ active: view.sidebarMode === 'notes',
362
+ selectedPath: view.notesSelectedPath,
363
+ onSelectedPathChange: handleNotesSelectedPathChange,
364
+ });
365
+
345
366
  function handleDashboardSettingsPatch(ui: NonNullable<Parameters<typeof saveUi>[0]>): void {
346
367
  if (ui.showLatestActivityTitles !== undefined) view.setShowLatestActivityTitles(ui.showLatestActivityTitles);
347
368
  if (ui.showInlineLabelEditor !== undefined) view.setShowInlineLabelEditor(ui.showInlineLabelEditor);
@@ -387,6 +408,7 @@ export function App() {
387
408
  setLifecycleMessage(`${result.message} (not yet reachable, refresh manually if needed)`);
388
409
  }
389
410
  await load();
411
+ publishInvalidation({ topics: ['instances'], reason: 'instance:lifecycle', source: 'ui', sourceId: 'app' });
390
412
  view.setSelectedPort(instance.port);
391
413
  } catch (err) {
392
414
  setLifecycleMessage((err as Error).message);
@@ -452,15 +474,21 @@ export function App() {
452
474
  onSettingsDirtyChange={setSettingsDirty}
453
475
  onSettingsSaved={() => {
454
476
  if (selectedInstance) void refreshInstance(selectedInstance.port);
477
+ publishInvalidation({ topics: ['instances'], reason: 'instance:settings-saved', source: 'ui', sourceId: 'app' });
455
478
  }}
456
479
  onRegistryPatch={(port, patch) => {
457
- void registry.save({ instances: { [String(port)]: patch } }).then(() => load());
480
+ void registry.save({ instances: { [String(port)]: patch } }).then(() => {
481
+ load();
482
+ publishInvalidation({ topics: ['instances'], reason: 'instance:registry-patched', source: 'ui', sourceId: 'app' });
483
+ });
458
484
  }}
459
485
  />
460
486
  );
461
487
 
462
488
  return (
463
489
  <>
490
+ <IframeBridge />
491
+ <VisibilityBridge />
464
492
  <ManagerShell
465
493
  sidebarCollapsed={view.sidebarCollapsed}
466
494
  commandBar={(
@@ -484,12 +512,12 @@ export function App() {
484
512
  onCloseDrawer={() => view.setDrawerOpen(false)}
485
513
  navigator={(
486
514
  <>
487
- <SidebarRail onlineCount={summary.online || 0} collapsed={view.sidebarCollapsed} mode={view.sidebarMode} scheduleWorkspaceEnabled={SCHEDULE_WORKSPACE_ENABLED} onModeChange={handleSidebarModeChange} onToggleSidebar={handleSidebarToggle} helpOpen={helpOpen} onToggleHelp={() => setHelpOpen(open => !open)} />
515
+ <SidebarRail onlineCount={summary['online'] || 0} collapsed={view.sidebarCollapsed} mode={view.sidebarMode} scheduleWorkspaceEnabled={SCHEDULE_WORKSPACE_ENABLED} onModeChange={handleSidebarModeChange} onToggleSidebar={handleSidebarToggle} helpOpen={helpOpen} onToggleHelp={() => setHelpOpen(open => !open)} />
488
516
  <div id="manager-sidebar-list" className="manager-sidebar-list">
489
517
  {view.sidebarMode === 'settings' ? (
490
518
  <DashboardSettingsSidebar activeSection={dashboardSettingsSection} locale={view.locale} onSectionChange={setDashboardSettingsSection} />
491
519
  ) : view.sidebarMode === 'notes' ? (
492
- <NotesSidebar selectedPath={view.notesSelectedPath} dirtyPath={notesDirtyPath} treeWidth={view.notesTreeWidth} onSelectedPathChange={handleNotesSelectedPathChange} />
520
+ <NotesSidebar tree={notesModel.tree} loading={notesModel.loading} error={notesModel.error} notesRoot={notesModel.notesRoot} selectedPath={view.notesSelectedPath} dirtyPath={notesDirtyPath} treeWidth={view.notesTreeWidth} onSelectedPathChange={handleNotesSelectedPathChange} onRefreshTree={notesModel.refresh} />
493
521
  ) : view.sidebarMode === 'board' ? (
494
522
  <DashboardBoardSidebar view={boardView} onViewChange={setBoardView} instances={instances} titlesByPort={messageActivity.titlesByPort} busyPorts={messageActivity.busyPorts} />
495
523
  ) : SCHEDULE_WORKSPACE_ENABLED && view.sidebarMode === 'schedule' ? (
@@ -524,7 +552,7 @@ export function App() {
524
552
  )} logs={detailContent('logs')} settings={detailContent('settings')} />
525
553
  </WorkspaceSurface>
526
554
  <WorkspaceSurface active={view.sidebarMode === 'notes'}>
527
- <NotesWorkspace active={view.sidebarMode === 'notes'} selectedPath={view.notesSelectedPath} viewMode={view.notesViewMode} authoringMode={view.notesAuthoringMode} wordWrap={view.notesWordWrap} treeWidth={view.notesTreeWidth} onSelectedPathChange={handleNotesSelectedPathChange} onDirtyPathChange={setNotesDirtyPath} onViewModeChange={handleNotesViewModeChange} onAuthoringModeChange={handleNotesAuthoringModeChange} onWordWrapChange={handleNotesWordWrapChange} onTreeWidthChange={handleNotesTreeWidthChange} />
555
+ <NotesWorkspace active={view.sidebarMode === 'notes'} selectedPath={view.notesSelectedPath} vaultIndex={notesModel.index} viewMode={view.notesViewMode} authoringMode={view.notesAuthoringMode} wordWrap={view.notesWordWrap} treeWidth={view.notesTreeWidth} onSelectedPathChange={handleNotesSelectedPathChange} onDirtyPathChange={setNotesDirtyPath} onViewModeChange={handleNotesViewModeChange} onAuthoringModeChange={handleNotesAuthoringModeChange} onWordWrapChange={handleNotesWordWrapChange} onTreeWidthChange={handleNotesTreeWidthChange} />
528
556
  </WorkspaceSurface>
529
557
  <WorkspaceSurface active={view.sidebarMode === 'settings'}>
530
558
  <DashboardSettingsWorkspace activeSection={dashboardSettingsSection} ui={dashboardSettingsUi} titleSupport={titleSupport} onUiPatch={handleDashboardSettingsPatch} />
@@ -2,7 +2,9 @@ import type {
2
2
  DashboardInstance,
3
3
  DashboardLifecycleAction,
4
4
  DashboardLifecycleResult,
5
+ DashboardNoteAssetResponse,
5
6
  DashboardNoteFileResponse,
7
+ DashboardNotesCapabilities,
6
8
  DashboardNoteTreeEntry,
7
9
  DashboardPutNoteRequest,
8
10
  DashboardProcessControlState,
@@ -14,6 +16,7 @@ import type {
14
16
  HealthEvent,
15
17
  InstanceLogSnapshot,
16
18
  ManagerEvent,
19
+ VaultIndexSnapshot,
17
20
  } from './types';
18
21
 
19
22
  export class DashboardApiError extends Error {
@@ -90,7 +93,9 @@ export async function stopManagedProcesses(): Promise<DashboardProcessControlSta
90
93
  }
91
94
 
92
95
  export async function fetchInstanceStatus(port: number, options: { signal?: AbortSignal } = {}): Promise<DashboardInstance | null> {
93
- const response = await fetch(`/api/dashboard/instances/${port}`, { signal: options.signal });
96
+ const init: RequestInit = {};
97
+ if (options.signal !== undefined) init.signal = options.signal;
98
+ const response = await fetch(`/api/dashboard/instances/${port}`, init);
94
99
  if (!response.ok) throw new Error(`status fetch failed: ${response.status}`);
95
100
  const body = await response.json() as { ok: boolean; instance: DashboardInstance | null };
96
101
  return body.instance;
@@ -146,11 +151,27 @@ export async function fetchNotesInfo(): Promise<{ root: string }> {
146
151
  return await parseNotesResponse<{ root: string }>(response, `notes info fetch failed: ${response.status}`);
147
152
  }
148
153
 
154
+ export async function fetchNotesVersion(): Promise<number> {
155
+ const response = await fetch('/api/dashboard/notes/version');
156
+ const body = await parseNotesResponse<{ version: number }>(response, `notes version fetch failed: ${response.status}`);
157
+ return body.version;
158
+ }
159
+
149
160
  export async function fetchNotesTree(): Promise<DashboardNoteTreeEntry[]> {
150
161
  const response = await fetch('/api/dashboard/notes/tree');
151
162
  return await parseNotesResponse<DashboardNoteTreeEntry[]>(response, `notes tree fetch failed: ${response.status}`);
152
163
  }
153
164
 
165
+ export async function fetchNotesIndex(): Promise<VaultIndexSnapshot> {
166
+ const response = await fetch('/api/dashboard/notes/index');
167
+ return await parseNotesResponse<VaultIndexSnapshot>(response, `notes index fetch failed: ${response.status}`);
168
+ }
169
+
170
+ export async function fetchNotesCapabilities(): Promise<DashboardNotesCapabilities> {
171
+ const response = await fetch('/api/dashboard/notes/capabilities');
172
+ return await parseNotesResponse<DashboardNotesCapabilities>(response, `notes capabilities fetch failed: ${response.status}`);
173
+ }
174
+
154
175
  export async function fetchNoteFile(path: string): Promise<DashboardNoteFileResponse> {
155
176
  const response = await fetch(`/api/dashboard/notes/file?path=${encodeURIComponent(path)}`);
156
177
  return await parseNotesResponse<DashboardNoteFileResponse>(response, `note fetch failed: ${response.status}`);
@@ -174,6 +195,39 @@ export async function saveNoteFile(request: DashboardPutNoteRequest): Promise<Da
174
195
  return await parseNotesResponse<DashboardNoteFileResponse>(response, `note save failed: ${response.status}`);
175
196
  }
176
197
 
198
+ function bytesToBase64(bytes: Uint8Array): string {
199
+ let binary = '';
200
+ const chunkSize = 0x8000;
201
+ for (let index = 0; index < bytes.length; index += chunkSize) {
202
+ const chunk = bytes.subarray(index, index + chunkSize);
203
+ binary += String.fromCharCode(...chunk);
204
+ }
205
+ return btoa(binary);
206
+ }
207
+
208
+ export async function uploadNoteAsset(notePath: string, file: File): Promise<DashboardNoteAssetResponse> {
209
+ const bytes = new Uint8Array(await file.arrayBuffer());
210
+ const response = await fetch('/api/dashboard/notes/asset', {
211
+ method: 'POST',
212
+ headers: { 'content-type': 'application/json' },
213
+ body: JSON.stringify({
214
+ notePath,
215
+ mime: file.type,
216
+ dataBase64: bytesToBase64(bytes),
217
+ }),
218
+ });
219
+ return await parseNotesResponse<DashboardNoteAssetResponse>(response, `note asset upload failed: ${response.status}`);
220
+ }
221
+
222
+ export async function uploadRemoteNoteAsset(notePath: string, url: string): Promise<DashboardNoteAssetResponse> {
223
+ const response = await fetch('/api/dashboard/notes/asset/remote', {
224
+ method: 'POST',
225
+ headers: { 'content-type': 'application/json' },
226
+ body: JSON.stringify({ notePath, url }),
227
+ });
228
+ return await parseNotesResponse<DashboardNoteAssetResponse>(response, `remote note asset upload failed: ${response.status}`);
229
+ }
230
+
177
231
  export async function createNoteFolder(path: string): Promise<{ path: string }> {
178
232
  const response = await fetch('/api/dashboard/notes/folder', {
179
233
  method: 'POST',
@@ -58,7 +58,7 @@ const FIVE_MINUTES_MS = 5 * 60 * 1000;
58
58
 
59
59
  function normalize(entry: ActivityEntry | ManagerEvent | string, fallbackAt: string): ActivityEntry {
60
60
  if (typeof entry === 'string') {
61
- return { at: fallbackAt, source: undefined, message: entry };
61
+ return { at: fallbackAt, message: entry };
62
62
  }
63
63
  if ('kind' in entry) {
64
64
  return eventToEntry(entry);
@@ -47,8 +47,8 @@ export function InstanceDetailPanel(props: InstanceDetailPanelProps) {
47
47
  key={instance.port}
48
48
  port={instance.port}
49
49
  instanceUrl={`http://localhost:${instance.port}`}
50
- onDirtyChange={props.onSettingsDirtyChange}
51
- onSaved={props.onSettingsSaved}
50
+ {...(props.onSettingsDirtyChange !== undefined ? { onDirtyChange: props.onSettingsDirtyChange } : {})}
51
+ {...(props.onSettingsSaved !== undefined ? { onSaved: props.onSettingsSaved } : {})}
52
52
  />
53
53
  )}
54
54
 
@@ -79,17 +79,17 @@ function renderInstanceRow(
79
79
  <InstanceRow
80
80
  key={instance.port}
81
81
  instance={instance}
82
- profile={profile}
82
+ {...(profile !== undefined ? { profile } : {})}
83
83
  selected={props.selectedPort === instance.port}
84
84
  busy={props.lifecycleBusyPort === instance.port}
85
85
  transitioning={props.transitioningPort === instance.port ? props.transitionAction || null : null}
86
86
  activityUnreadCount={props.activityUnreadByPort?.[instance.port] || 0}
87
87
  latestActivityTitle={props.latestTitleByPort?.[instance.port] || null}
88
88
  agentBusy={props.busyPorts?.has(instance.port) || false}
89
- showLatestActivityTitle={props.showLatestActivityTitles}
90
- showInlineLabelEditor={props.showInlineLabelEditor}
91
- showRuntimeLine={props.showSidebarRuntimeLine}
92
- showSelectedActions={props.showSelectedRowActions}
89
+ {...(props.showLatestActivityTitles !== undefined ? { showLatestActivityTitle: props.showLatestActivityTitles } : {})}
90
+ {...(props.showInlineLabelEditor !== undefined ? { showInlineLabelEditor: props.showInlineLabelEditor } : {})}
91
+ {...(props.showSidebarRuntimeLine !== undefined ? { showRuntimeLine: props.showSidebarRuntimeLine } : {})}
92
+ {...(props.showSelectedRowActions !== undefined ? { showSelectedActions: props.showSelectedRowActions } : {})}
93
93
  label={props.getLabel(instance)}
94
94
  uptime={props.formatUptime(instance.uptime)}
95
95
  onSelect={props.onSelect}
@@ -60,7 +60,7 @@ export function InstanceListContent(props: InstanceListContentProps) {
60
60
  transitionAction={props.transitionAction}
61
61
  activityUnreadByPort={props.activityUnreadByPort}
62
62
  latestTitleByPort={props.latestTitleByPort}
63
- busyPorts={props.busyPorts}
63
+ {...(props.busyPorts !== undefined ? { busyPorts: props.busyPorts } : {})}
64
64
  showLatestActivityTitles={props.showLatestActivityTitles}
65
65
  showInlineLabelEditor={props.showInlineLabelEditor}
66
66
  showSidebarRuntimeLine={props.showSidebarRuntimeLine}
@@ -3,7 +3,7 @@ import type { DashboardSidebarMode } from './types';
3
3
  export const NPM_HIDDEN_WORKSPACE_MODES = new Set<DashboardSidebarMode>(['schedule']);
4
4
 
5
5
  export const SCHEDULE_WORKSPACE_ENABLED =
6
- import.meta.env.DEV || import.meta.env.VITE_CLI_JAW_EXPERIMENTAL_DASHBOARD === '1';
6
+ import.meta.env.DEV || import.meta.env['VITE_CLI_JAW_EXPERIMENTAL_DASHBOARD'] === '1';
7
7
 
8
8
  export function isNpmHiddenWorkspaceMode(mode: DashboardSidebarMode): boolean {
9
9
  return NPM_HIDDEN_WORKSPACE_MODES.has(mode);
@@ -313,10 +313,34 @@
313
313
  min-height: 0;
314
314
  display: grid;
315
315
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
316
- grid-auto-rows: minmax(0, 1fr);
316
+ grid-template-rows: max-content minmax(0, 1fr);
317
317
  overflow: hidden;
318
318
  }
319
319
 
320
+ .notes-inline-title {
321
+ grid-column: 1 / -1;
322
+ grid-row: 1;
323
+ display: block;
324
+ width: 100%;
325
+ box-sizing: border-box;
326
+ padding: 8px 28px 4px;
327
+ border: none;
328
+ outline: none;
329
+ background: transparent;
330
+ font-size: 22px;
331
+ font-weight: 700;
332
+ color: var(--text-primary);
333
+ line-height: 1.3;
334
+ font-family: inherit;
335
+ overflow: hidden;
336
+ text-overflow: ellipsis;
337
+ white-space: nowrap;
338
+ }
339
+
340
+ .notes-inline-title:focus {
341
+ background: var(--canvas-panel);
342
+ }
343
+
320
344
  .notes-mode-raw .notes-document-grid,
321
345
  .notes-mode-preview .notes-document-grid {
322
346
  grid-template-columns: minmax(0, 1fr);
@@ -329,8 +353,15 @@
329
353
  overflow: auto;
330
354
  }
331
355
 
332
- .notes-editor,
333
356
  .notes-preview {
357
+ grid-row: 2;
358
+ min-width: 0;
359
+ min-height: 0;
360
+ height: 100%;
361
+ overflow: auto;
362
+ }
363
+
364
+ .notes-editor {
334
365
  min-width: 0;
335
366
  min-height: 0;
336
367
  height: 100%;
@@ -338,6 +369,7 @@
338
369
  }
339
370
 
340
371
  .notes-editor-pane {
372
+ grid-row: 2;
341
373
  min-width: 0;
342
374
  min-height: 0;
343
375
  height: 100%;
@@ -437,6 +469,18 @@
437
469
  background: var(--danger-soft, var(--canvas-panel));
438
470
  }
439
471
 
472
+ .notes-wysiwyg-upload-status {
473
+ padding: 4px 12px;
474
+ font-size: 13px;
475
+ color: var(--text-secondary, #888);
476
+ border-bottom: 1px solid var(--border-subtle);
477
+ }
478
+
479
+ .notes-wysiwyg-upload-status[data-status="error"] {
480
+ color: var(--danger-strong, var(--text-primary));
481
+ background: var(--danger-soft, var(--canvas-panel));
482
+ }
483
+
440
484
  .notes-milkdown-root .ProseMirror {
441
485
  min-height: 100%;
442
486
  padding: 24px 28px 160px;
@@ -832,9 +876,12 @@
832
876
  vertical-align: top;
833
877
  }
834
878
 
879
+ .notes-preview img,
835
880
  .notes-milkdown-root .ProseMirror img {
881
+ display: block;
836
882
  max-width: 100%;
837
883
  height: auto;
884
+ border-radius: 6px;
838
885
  }
839
886
 
840
887
  .notes-milkdown-root .ProseMirror hr {
@@ -22,6 +22,7 @@ type MarkdownEditorProps = {
22
22
  active: boolean;
23
23
  authoringMode: NotesAuthoringMode;
24
24
  content: string;
25
+ notePath: string;
25
26
  wordWrap: boolean;
26
27
  onChange: (value: string) => void;
27
28
  };
@@ -53,7 +54,10 @@ export function MarkdownEditor(props: MarkdownEditorProps) {
53
54
  notesEditorTheme,
54
55
  notesSyntaxHighlighting,
55
56
  markdown({ codeLanguages: languages }),
56
- richMarkdownPastePolicy(),
57
+ richMarkdownPastePolicy({
58
+ notePath: props.notePath,
59
+ onError: error => console.warn('[notes-image-paste]', error),
60
+ }),
57
61
  richMarkdownExtension({
58
62
  enabled: props.authoringMode === 'rich' || props.authoringMode === 'wysiwyg',
59
63
  active: props.active,
@@ -64,13 +68,13 @@ export function MarkdownEditor(props: MarkdownEditorProps) {
64
68
  ];
65
69
  if (props.wordWrap) base.push(EditorView.lineWrapping);
66
70
  return base;
67
- }, [props.active, props.authoringMode, props.wordWrap, registerWidget, requestMeasure, unregisterWidget]);
71
+ }, [props.active, props.authoringMode, props.notePath, props.wordWrap, registerWidget, requestMeasure, unregisterWidget]);
68
72
 
69
73
  if (isWysiwyg) {
70
74
  return (
71
75
  <div className="notes-editor notes-wysiwyg-editor">
72
76
  <Suspense fallback={<div className="notes-wysiwyg-loading">Loading WYSIWYG editor...</div>}>
73
- <MilkdownWysiwygEditor active={props.active} content={props.content} onChange={props.onChange} />
77
+ <MilkdownWysiwygEditor active={props.active} content={props.content} notePath={props.notePath} onChange={props.onChange} />
74
78
  </Suspense>
75
79
  </div>
76
80
  );