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
@@ -11,7 +11,7 @@ function codeText(node: ProseMirrorNode): string {
11
11
  }
12
12
 
13
13
  function codeLanguage(node: ProseMirrorNode): string {
14
- return String(node.attrs.language ?? '');
14
+ return String(node.attrs['language'] ?? '');
15
15
  }
16
16
 
17
17
  function fencedCodeSource(node: ProseMirrorNode): string {
@@ -92,7 +92,7 @@ function commitAndExitCodeBlock(
92
92
  return;
93
93
  }
94
94
  }
95
- const paragraph = view.state.schema.nodes.paragraph?.create();
95
+ const paragraph = view.state.schema.nodes['paragraph']?.create();
96
96
  if (!paragraph) return;
97
97
  tr.insert(codeAfter, paragraph);
98
98
  tr.setSelection(TextSelection.create(tr.doc, codeAfter + 1));
@@ -112,7 +112,7 @@ function commitAndExitCodeBlock(
112
112
  }
113
113
  }
114
114
 
115
- const paragraph = view.state.schema.nodes.paragraph?.create();
115
+ const paragraph = view.state.schema.nodes['paragraph']?.create();
116
116
  if (!paragraph) return;
117
117
  tr.insert(pos, paragraph);
118
118
  tr.setSelection(TextSelection.create(tr.doc, pos + 1));
@@ -173,27 +173,27 @@ function createCodeBlockView(): NodeViewConstructor {
173
173
  function sync(): void {
174
174
  const language = codeLanguage(currentNode);
175
175
  const source = codeText(currentNode);
176
- dom.dataset.language = language;
177
- pre.dataset.language = language;
176
+ dom.dataset['language'] = language;
177
+ pre.dataset['language'] = language;
178
178
  copyBtn.textContent = copyButtonLabel();
179
179
  const highlighted = highlightCode(source, language);
180
180
  code.className = `hljs language-${highlighted.language}`;
181
- code.dataset.highlighted = highlighted.highlighted ? 'yes' : 'no';
181
+ code.dataset['highlighted'] = highlighted['highlighted'] ? 'yes' : 'no';
182
182
  code.innerHTML = highlighted.html;
183
- if (dom.dataset.editing !== 'true') raw.value = fencedCodeSource(currentNode);
183
+ if (dom.dataset['editing'] !== 'true') raw.value = fencedCodeSource(currentNode);
184
184
  }
185
185
 
186
186
  function setEditing(editing: boolean, options: { commit?: boolean } = {}): void {
187
- if (dom.dataset.editing === 'true' && editing) return;
188
- if (!editing && dom.dataset.editing !== 'true') return;
187
+ if (dom.dataset['editing'] === 'true' && editing) return;
188
+ if (!editing && dom.dataset['editing'] !== 'true') return;
189
189
  if (!editing && options.commit !== false) {
190
190
  const source = raw.value;
191
- dom.dataset.editing = 'false';
191
+ dom.dataset['editing'] = 'false';
192
192
  raw.blur();
193
193
  updateCodeBlockNode(view, getPos, source);
194
194
  return;
195
195
  }
196
- dom.dataset.editing = editing ? 'true' : 'false';
196
+ dom.dataset['editing'] = editing ? 'true' : 'false';
197
197
  if (editing) {
198
198
  raw.value = fencedCodeSource(currentNode);
199
199
  raw.focus();
@@ -204,10 +204,10 @@ function createCodeBlockView(): NodeViewConstructor {
204
204
  }
205
205
 
206
206
  function closeAfterOutsidePointer(event: Event): void {
207
- if (dom.dataset.editing !== 'true') return;
207
+ if (dom.dataset['editing'] !== 'true') return;
208
208
  if (dom.contains(event.target as Node)) return;
209
209
  setTimeout(() => {
210
- if (dom.dataset.editing === 'true') setEditing(false, { commit: false });
210
+ if (dom.dataset['editing'] === 'true') setEditing(false, { commit: false });
211
211
  }, 0);
212
212
  }
213
213
 
@@ -222,7 +222,7 @@ function createCodeBlockView(): NodeViewConstructor {
222
222
  if (!(targetDom instanceof HTMLElement)) return;
223
223
  const targetRaw = targetDom.querySelector('textarea.notes-code-raw');
224
224
  if (!(targetRaw instanceof HTMLTextAreaElement)) return;
225
- targetDom.dataset.editing = 'true';
225
+ targetDom.dataset['editing'] = 'true';
226
226
  targetRaw.focus();
227
227
  targetRaw.select();
228
228
  }
@@ -230,7 +230,7 @@ function createCodeBlockView(): NodeViewConstructor {
230
230
  function openFromRenderedEvent(event: Event): void {
231
231
  if (raw.contains(event.target as Node)) return;
232
232
  if (copyBtn.contains(event.target as Node)) return;
233
- if (dom.dataset.editing === 'true') return;
233
+ if (dom.dataset['editing'] === 'true') return;
234
234
  event.preventDefault();
235
235
  event.stopPropagation();
236
236
  const pointer = event instanceof PointerEvent || event instanceof MouseEvent
@@ -253,7 +253,7 @@ function createCodeBlockView(): NodeViewConstructor {
253
253
  dom.addEventListener('click', openFromRenderedEvent);
254
254
  dom.addEventListener('keydown', event => {
255
255
  if (event.target !== dom) return;
256
- if (dom.dataset.editing === 'true') return;
256
+ if (dom.dataset['editing'] === 'true') return;
257
257
  if (event.key === 'Enter' || event.key === ' ') {
258
258
  event.preventDefault();
259
259
  setEditing(true);
@@ -311,7 +311,7 @@ function createCodeBlockView(): NodeViewConstructor {
311
311
  });
312
312
  raw.addEventListener('blur', () => {
313
313
  setTimeout(() => {
314
- if (dom.dataset.editing === 'true' && document.activeElement !== raw) {
314
+ if (dom.dataset['editing'] === 'true' && document.activeElement !== raw) {
315
315
  setEditing(false, { commit: false });
316
316
  }
317
317
  }, 0);
@@ -353,11 +353,11 @@ function createCodeBlockView(): NodeViewConstructor {
353
353
  return true;
354
354
  },
355
355
  selectNode: () => {
356
- dom.dataset.selected = 'true';
356
+ dom.dataset['selected'] = 'true';
357
357
  },
358
358
  deselectNode: () => {
359
- dom.dataset.selected = 'false';
360
- if (dom.dataset.editing === 'true') {
359
+ dom.dataset['selected'] = 'false';
360
+ if (dom.dataset['editing'] === 'true') {
361
361
  setEditing(false, { commit: false });
362
362
  }
363
363
  },
@@ -10,7 +10,7 @@ const MAX_HEADING_LEVEL = 6;
10
10
  const HEADING_SOURCE_UPDATED_EVENT = 'notes-heading-source-updated';
11
11
 
12
12
  function headingLevel(node: ProseMirrorNode): number {
13
- const raw = Number(node.attrs.level);
13
+ const raw = Number(node.attrs['level']);
14
14
  if (!Number.isFinite(raw)) return MIN_HEADING_LEVEL;
15
15
  return Math.min(MAX_HEADING_LEVEL, Math.max(MIN_HEADING_LEVEL, Math.trunc(raw)));
16
16
  }
@@ -41,7 +41,7 @@ function updateHeadingLevel(
41
41
  const current = view.state.doc.nodeAt(pos);
42
42
  if (!current || current.type.name !== 'heading') return;
43
43
 
44
- const paragraph = view.state.schema.nodes.paragraph;
44
+ const paragraph = view.state.schema.nodes['paragraph'];
45
45
  const tr = level === 0 && paragraph
46
46
  ? view.state.tr.setNodeMarkup(pos, paragraph as NodeType)
47
47
  : view.state.tr.setNodeMarkup(pos, undefined, { ...node.attrs, level });
@@ -70,7 +70,7 @@ function createHeadingSourceView(): NodeViewConstructor {
70
70
 
71
71
  function sync(): void {
72
72
  const level = headingLevel(currentNode);
73
- dom.dataset.level = String(level);
73
+ dom.dataset['level'] = String(level);
74
74
  dom.setAttribute('role', 'heading');
75
75
  dom.setAttribute('aria-level', String(level));
76
76
  dom.setAttribute('aria-label', currentNode.textContent);
@@ -102,7 +102,7 @@ function createHeadingSourceView(): NodeViewConstructor {
102
102
  }
103
103
 
104
104
  function handleFocus(): void {
105
- dom.dataset.editing = 'true';
105
+ dom.dataset['editing'] = 'true';
106
106
  marker.select();
107
107
  }
108
108
 
@@ -114,7 +114,7 @@ function createHeadingSourceView(): NodeViewConstructor {
114
114
  }
115
115
 
116
116
  function handleBlur(): void {
117
- dom.dataset.editing = 'false';
117
+ dom.dataset['editing'] = 'false';
118
118
  commitMarker();
119
119
  }
120
120
 
@@ -127,7 +127,7 @@ function createHeadingSourceView(): NodeViewConstructor {
127
127
  if (event.key === 'Escape') {
128
128
  event.preventDefault();
129
129
  marker.value = markerForLevel(headingLevel(currentNode));
130
- dom.dataset.editing = 'false';
130
+ dom.dataset['editing'] = 'false';
131
131
  marker.blur();
132
132
  view.focus();
133
133
  }
@@ -153,10 +153,10 @@ function createHeadingSourceView(): NodeViewConstructor {
153
153
  return true;
154
154
  },
155
155
  selectNode(): void {
156
- dom.dataset.selected = 'true';
156
+ dom.dataset['selected'] = 'true';
157
157
  },
158
158
  deselectNode(): void {
159
- delete dom.dataset.selected;
159
+ delete dom.dataset['selected'];
160
160
  },
161
161
  stopEvent(event: Event): boolean {
162
162
  return marker.contains(event.target as Node)
@@ -115,7 +115,7 @@ function commitAndExitMathNode(
115
115
  return;
116
116
  }
117
117
  }
118
- const paragraph = view.state.schema.nodes.paragraph?.create();
118
+ const paragraph = view.state.schema.nodes['paragraph']?.create();
119
119
  if (!paragraph) return;
120
120
  tr.insert(pos, paragraph);
121
121
  tr.setSelection(TextSelection.create(tr.doc, pos + 1));
@@ -136,7 +136,7 @@ function commitAndExitMathNode(
136
136
  }
137
137
  }
138
138
  if (!landed) {
139
- const paragraph = view.state.schema.nodes.paragraph?.create();
139
+ const paragraph = view.state.schema.nodes['paragraph']?.create();
140
140
  if (!paragraph) return;
141
141
  tr.insert(after, paragraph);
142
142
  tr.setSelection(TextSelection.create(tr.doc, after + 1));
@@ -191,13 +191,13 @@ function createMathView(options: {
191
191
  dom.append(rendered, raw);
192
192
 
193
193
  function value(): string {
194
- return String(currentNode.attrs.value ?? '');
194
+ return String(currentNode.attrs['value'] ?? '');
195
195
  }
196
196
 
197
197
  function setEditing(editing: boolean): void {
198
- if (dom.dataset.editing === 'true' && editing) return;
199
- if (!editing && dom.dataset.editing !== 'true') return;
200
- dom.dataset.editing = editing ? 'true' : 'false';
198
+ if (dom.dataset['editing'] === 'true' && editing) return;
199
+ if (!editing && dom.dataset['editing'] !== 'true') return;
200
+ dom.dataset['editing'] = editing ? 'true' : 'false';
201
201
  if (editing) {
202
202
  raw.value = options.block ? blockMathSource(value()) : inlineMathSource(value());
203
203
  raw.focus();
@@ -216,8 +216,8 @@ function createMathView(options: {
216
216
 
217
217
  function sync(): void {
218
218
  const code = value();
219
- dom.dataset.value = code;
220
- if (dom.dataset.editing !== 'true') {
219
+ dom.dataset['value'] = code;
220
+ if (dom.dataset['editing'] !== 'true') {
221
221
  raw.value = options.block ? blockMathSource(code) : inlineMathSource(code);
222
222
  }
223
223
  options.render(rendered, code);
@@ -227,14 +227,14 @@ function createMathView(options: {
227
227
  if (!(targetDom instanceof HTMLElement)) return;
228
228
  const targetRaw = targetDom.querySelector('.notes-math-raw');
229
229
  if (!(targetRaw instanceof HTMLInputElement || targetRaw instanceof HTMLTextAreaElement)) return;
230
- targetDom.dataset.editing = 'true';
230
+ targetDom.dataset['editing'] = 'true';
231
231
  targetRaw.focus();
232
232
  targetRaw.select();
233
233
  }
234
234
 
235
235
  function openFromRenderedEvent(event: Event): void {
236
236
  if (raw.contains(event.target as Node)) return;
237
- if (dom.dataset.editing === 'true') return;
237
+ if (dom.dataset['editing'] === 'true') return;
238
238
  event.preventDefault();
239
239
  event.stopPropagation();
240
240
  const pointer = event instanceof PointerEvent || event instanceof MouseEvent
@@ -258,7 +258,7 @@ function createMathView(options: {
258
258
  dom.addEventListener('keydown', event => {
259
259
  const keyEvent = event as KeyboardEvent;
260
260
  if (keyEvent.target !== dom) return;
261
- if (dom.dataset.editing === 'true') return;
261
+ if (dom.dataset['editing'] === 'true') return;
262
262
  if (keyEvent.key === 'Enter' || keyEvent.key === ' ') {
263
263
  keyEvent.preventDefault();
264
264
  setEditing(true);
@@ -346,10 +346,10 @@ function createMathView(options: {
346
346
  return true;
347
347
  },
348
348
  selectNode: () => {
349
- dom.dataset.selected = 'true';
349
+ dom.dataset['selected'] = 'true';
350
350
  },
351
351
  deselectNode: () => {
352
- dom.dataset.selected = 'false';
352
+ dom.dataset['selected'] = 'false';
353
353
  },
354
354
  stopEvent: event =>
355
355
  event.target === raw
@@ -377,28 +377,28 @@ export const notesMathInlineSchema = $nodeSchema(mathInlineId, ctx => ({
377
377
  {
378
378
  tag: `span[data-type="${mathInlineId}"]`,
379
379
  getAttrs: dom => ({
380
- value: dom instanceof HTMLElement ? dom.dataset.value ?? '' : '',
380
+ value: dom instanceof HTMLElement ? dom.dataset['value'] ?? '' : '',
381
381
  }),
382
382
  },
383
383
  ],
384
384
  toDOM: node => {
385
- const code = node.attrs.value as string;
385
+ const code = node.attrs['value'] as string;
386
386
  const dom = document.createElement('span');
387
- dom.dataset.type = mathInlineId;
388
- dom.dataset.value = code;
387
+ dom.dataset['type'] = mathInlineId;
388
+ dom.dataset['value'] = code;
389
389
  renderKatex(dom, code, ctx.get(notesMilkdownKatexOptionsCtx.key));
390
390
  return dom;
391
391
  },
392
392
  parseMarkdown: {
393
393
  match: node => node.type === 'inlineMath',
394
394
  runner: (state, node, type) => {
395
- state.addNode(type, { value: node.value as string });
395
+ state.addNode(type, { value: node['value'] as string });
396
396
  },
397
397
  },
398
398
  toMarkdown: {
399
399
  match: node => node.type.name === mathInlineId,
400
400
  runner: (state, node) => {
401
- state.addNode('inlineMath', undefined, node.attrs.value as string);
401
+ state.addNode('inlineMath', undefined, node.attrs['value'] as string);
402
402
  },
403
403
  },
404
404
  }));
@@ -418,28 +418,28 @@ export const notesMathBlockSchema = $nodeSchema(mathBlockId, ctx => ({
418
418
  tag: `div[data-type="${mathBlockId}"]`,
419
419
  preserveWhitespace: 'full',
420
420
  getAttrs: dom => ({
421
- value: dom instanceof HTMLElement ? dom.dataset.value ?? '' : '',
421
+ value: dom instanceof HTMLElement ? dom.dataset['value'] ?? '' : '',
422
422
  }),
423
423
  },
424
424
  ],
425
425
  toDOM: node => {
426
- const code = node.attrs.value as string;
426
+ const code = node.attrs['value'] as string;
427
427
  const dom = document.createElement('div');
428
- dom.dataset.type = mathBlockId;
429
- dom.dataset.value = code;
428
+ dom.dataset['type'] = mathBlockId;
429
+ dom.dataset['value'] = code;
430
430
  renderKatex(dom, code, ctx.get(notesMilkdownKatexOptionsCtx.key));
431
431
  return dom;
432
432
  },
433
433
  parseMarkdown: {
434
434
  match: node => node.type === 'math',
435
435
  runner: (state, node, type) => {
436
- state.addNode(type, { value: node.value as string });
436
+ state.addNode(type, { value: node['value'] as string });
437
437
  },
438
438
  },
439
439
  toMarkdown: {
440
440
  match: node => node.type.name === mathBlockId,
441
441
  runner: (state, node) => {
442
- state.addNode('math', undefined, node.attrs.value as string);
442
+ state.addNode('math', undefined, node.attrs['value'] as string);
443
443
  },
444
444
  },
445
445
  }));
@@ -43,31 +43,35 @@ const POLL_INTERVAL_MS = 3000;
43
43
 
44
44
  export function normalizeBrowserStatus(raw: unknown): BrowserStatus {
45
45
  if (!raw || typeof raw !== 'object') {
46
- return { running: false, tabs: 0, cdpUrl: undefined };
46
+ return { running: false, tabs: 0 };
47
47
  }
48
48
  const r = raw as Record<string, unknown>;
49
- return {
50
- running: r.running === true,
51
- tabs: typeof r.tabs === 'number' && Number.isFinite(r.tabs) ? r.tabs : 0,
52
- cdpUrl: typeof r.cdpUrl === 'string' ? r.cdpUrl : undefined,
49
+ const status: BrowserStatus = {
50
+ running: r['running'] === true,
51
+ tabs: typeof r['tabs'] === 'number' && Number.isFinite(r['tabs']) ? r['tabs'] : 0,
53
52
  };
53
+ if (typeof r['cdpUrl'] === 'string') status.cdpUrl = r['cdpUrl'];
54
+ return status;
54
55
  }
55
56
 
56
57
  export function normalizeActiveTab(raw: unknown): ActiveTab | null {
57
58
  if (!raw || typeof raw !== 'object') return null;
58
59
  const r = raw as Record<string, unknown>;
59
- const tab = r.tab && typeof r.tab === 'object' ? (r.tab as Record<string, unknown>) : null;
60
- return {
61
- ok: r.ok === true,
62
- reason: typeof r.reason === 'string' ? r.reason : undefined,
63
- tab: tab
64
- ? {
65
- url: typeof tab.url === 'string' ? tab.url : undefined,
66
- title: typeof tab.title === 'string' ? tab.title : undefined,
67
- targetId: typeof tab.targetId === 'string' ? tab.targetId : undefined,
68
- }
69
- : null,
60
+ const tab = r['tab'] && typeof r['tab'] === 'object' ? (r['tab'] as Record<string, unknown>) : null;
61
+ const active: ActiveTab = {
62
+ ok: r['ok'] === true,
70
63
  };
64
+ if (typeof r['reason'] === 'string') active.reason = r['reason'];
65
+ if (tab) {
66
+ const normalizedTab: NonNullable<ActiveTab['tab']> = {};
67
+ if (typeof tab['url'] === 'string') normalizedTab.url = tab['url'];
68
+ if (typeof tab['title'] === 'string') normalizedTab.title = tab['title'];
69
+ if (typeof tab['targetId'] === 'string') normalizedTab.targetId = tab['targetId'];
70
+ active.tab = normalizedTab;
71
+ } else {
72
+ active.tab = null;
73
+ }
74
+ return active;
71
75
  }
72
76
 
73
77
  export function describeStatus(status: BrowserStatus | null): string {
@@ -145,8 +149,14 @@ export default function Browser({ port, client }: SettingsPageProps) {
145
149
  [fetchStatus],
146
150
  );
147
151
 
148
- const onStart = useCallback(() => {
149
- void runAction('Start', () =>
152
+ const onStartVisible = useCallback(() => {
153
+ void runAction('Start visible browser', () =>
154
+ client.post('/api/browser/start', { mode: 'manual', headless: false }),
155
+ );
156
+ }, [client, runAction]);
157
+
158
+ const onStartAgent = useCallback(() => {
159
+ void runAction('Start agent browser', () =>
150
160
  client.post('/api/browser/start', { mode: 'agent', headless: true }),
151
161
  );
152
162
  }, [client, runAction]);
@@ -201,9 +211,17 @@ export default function Browser({ port, client }: SettingsPageProps) {
201
211
  type="button"
202
212
  className="settings-action settings-action-save"
203
213
  disabled={status.running || actionPending}
204
- onClick={onStart}
214
+ onClick={onStartVisible}
215
+ >
216
+ Start visible browser
217
+ </button>
218
+ <button
219
+ type="button"
220
+ className="settings-action"
221
+ disabled={status.running || actionPending}
222
+ onClick={onStartAgent}
205
223
  >
206
- Start (agent, headless)
224
+ Start agent browser
207
225
  </button>
208
226
  <button
209
227
  type="button"
@@ -50,13 +50,15 @@ export default function ModelProvider({ port, client, dirty, registerSave }: Set
50
50
  if (state.kind !== 'ready') return;
51
51
  setPerCliDraft({ ...(state.data.perCli || {}) });
52
52
  setFallback([...(state.data.fallbackOrder || [])]);
53
- const codex = state.data.perCli?.codex || {};
54
- setCodexCtx({
55
- contextWindowSize: typeof codex.contextWindowSize === 'number'
56
- ? codex.contextWindowSize : undefined,
57
- contextWindowCompactLimit: typeof codex.contextWindowCompactLimit === 'number'
58
- ? codex.contextWindowCompactLimit : undefined,
59
- });
53
+ const codex = state.data.perCli?.['codex'] || {};
54
+ const nextCodexCtx: typeof codexCtx = {};
55
+ if (typeof codex.contextWindowSize === 'number') {
56
+ nextCodexCtx.contextWindowSize = codex.contextWindowSize;
57
+ }
58
+ if (typeof codex.contextWindowCompactLimit === 'number') {
59
+ nextCodexCtx.contextWindowCompactLimit = codex.contextWindowCompactLimit;
60
+ }
61
+ setCodexCtx(nextCodexCtx);
60
62
  }, [state]);
61
63
 
62
64
  useEffect(() => {
@@ -120,7 +122,7 @@ export default function ModelProvider({ port, client, dirty, registerSave }: Set
120
122
  const data = state.data;
121
123
  const perCliOriginal = data.perCli || {};
122
124
  const cliKeys = Object.keys(perCliOriginal);
123
- const codexOriginal = perCliOriginal.codex || {};
125
+ const codexOriginal = perCliOriginal['codex'] || {};
124
126
  const overrides = data.activeOverrides || {};
125
127
  const overrideRows = Object.entries(overrides);
126
128
 
@@ -153,7 +155,7 @@ export default function ModelProvider({ port, client, dirty, registerSave }: Set
153
155
  )}
154
156
  </SettingsSection>
155
157
 
156
- {perCliOriginal.codex ? (
158
+ {perCliOriginal['codex'] ? (
157
159
  <SettingsSection
158
160
  title="Codex context window"
159
161
  hint="Codex-only sliders. Other CLIs ignore these values."
@@ -63,6 +63,14 @@ const REMOTE_ACCESS_OPTIONS = [
63
63
  { value: 'full', label: 'full — HTTP + WebSocket from remote' },
64
64
  ];
65
65
 
66
+ function normalizeNetworkBlock(block: NetworkBlock): NetworkBlock {
67
+ const next: NetworkBlock = {};
68
+ if (block.bindHost !== undefined) next.bindHost = block.bindHost;
69
+ if (block.lanBypass !== undefined) next.lanBypass = block.lanBypass;
70
+ next.remoteAccess = { ...(block.remoteAccess ?? {}) };
71
+ return next;
72
+ }
73
+
66
74
  // ─── Pure helpers (exported for tests) ───────────────────────────────
67
75
 
68
76
  export type PublicOriginValidation =
@@ -123,11 +131,7 @@ export default function Network({ port, client, dirty, registerSave }: SettingsP
123
131
  useEffect(() => {
124
132
  if (state.kind === 'ready') {
125
133
  const block = state.data.network ?? {};
126
- setDraft({
127
- bindHost: block.bindHost,
128
- lanBypass: block.lanBypass,
129
- remoteAccess: { ...(block.remoteAccess ?? {}) },
130
- });
134
+ setDraft(normalizeNetworkBlock(block));
131
135
  }
132
136
  }, [state]);
133
137
 
@@ -192,11 +196,7 @@ export default function Network({ port, client, dirty, registerSave }: SettingsP
192
196
  : updated) as NetworkSnapshot;
193
197
  dirty.clear();
194
198
  const block = fresh.network ?? {};
195
- setDraft({
196
- bindHost: block.bindHost,
197
- lanBypass: block.lanBypass,
198
- remoteAccess: { ...(block.remoteAccess ?? {}) },
199
- });
199
+ setDraft(normalizeNetworkBlock(block));
200
200
  setData(fresh);
201
201
  await refresh();
202
202
  }, [client, dirty, lockoutRisk, refresh, setData]);
@@ -112,11 +112,11 @@ export function interpretTelegramProbe(payload: unknown): HealthState {
112
112
  return { kind: 'unknown', reason: 'Empty probe response.' };
113
113
  }
114
114
  const p = payload as Record<string, unknown>;
115
- if (p.ok === true) {
116
- const username = typeof p.username === 'string' ? p.username : undefined;
117
- return { kind: 'ok', detail: username ? `@${username}` : undefined };
115
+ if (p['ok'] === true) {
116
+ const username = typeof p['username'] === 'string' ? p['username'] : undefined;
117
+ return username ? { kind: 'ok', detail: `@${username}` } : { kind: 'ok' };
118
118
  }
119
- const reason = typeof p.error === 'string' ? p.error : 'Probe failed.';
119
+ const reason = typeof p['error'] === 'string' ? p['error'] : 'Probe failed.';
120
120
  return { kind: 'error', reason };
121
121
  }
122
122
 
@@ -125,23 +125,23 @@ export function interpretDiscordHealth(payload: unknown): HealthState {
125
125
  return { kind: 'unknown', reason: 'Empty health response.' };
126
126
  }
127
127
  const p = payload as Record<string, unknown>;
128
- const discord = (p.discord && typeof p.discord === 'object')
129
- ? p.discord as Record<string, unknown>
128
+ const discord = (p['discord'] && typeof p['discord'] === 'object')
129
+ ? p['discord'] as Record<string, unknown>
130
130
  : null;
131
131
  if (!discord) {
132
132
  return { kind: 'unknown', reason: 'No discord block in /api/health.' };
133
133
  }
134
- if (discord.ready === true && discord.degraded !== true) {
134
+ if (discord['ready'] === true && discord['degraded'] !== true) {
135
135
  return { kind: 'ok' };
136
136
  }
137
- if (discord.degraded === true) {
138
- const why = typeof discord.degradedReason === 'string'
139
- ? discord.degradedReason
137
+ if (discord['degraded'] === true) {
138
+ const why = typeof discord['degradedReason'] === 'string'
139
+ ? discord['degradedReason']
140
140
  : 'MESSAGE_CONTENT intent missing — slash commands only.';
141
141
  return { kind: 'degraded', detail: why };
142
142
  }
143
- if (discord.ready === false) {
144
- const why = typeof discord.error === 'string' ? discord.error : 'Bot not connected.';
143
+ if (discord['ready'] === false) {
144
+ const why = typeof discord['error'] === 'string' ? discord['error'] : 'Bot not connected.';
145
145
  return { kind: 'error', reason: why };
146
146
  }
147
147
  return { kind: 'unknown', reason: 'Discord status indeterminate.' };
@@ -58,19 +58,20 @@ export function unwrapRuntimeEmployees(response: RuntimeEmployeesResponse | Runt
58
58
  export function normalizeRuntimeEmployee(value: unknown): RuntimeEmployeeRecord | null {
59
59
  if (!value || typeof value !== 'object') return null;
60
60
  const row = value as Record<string, unknown>;
61
- const id = typeof row.id === 'string' ? row.id : '';
62
- const name = typeof row.name === 'string' ? row.name : '';
61
+ const id = typeof row['id'] === 'string' ? row['id'] : '';
62
+ const name = typeof row['name'] === 'string' ? row['name'] : '';
63
63
  if (!id || !name) return null;
64
- const source = row.source === 'static' || id.startsWith('static:') ? 'static' : 'db';
65
- return {
64
+ const source = row['source'] === 'static' || id.startsWith('static:') ? 'static' : 'db';
65
+ const employee: RuntimeEmployeeRecord = {
66
66
  id,
67
67
  name,
68
- cli: typeof row.cli === 'string' && row.cli ? row.cli : 'claude',
69
- model: typeof row.model === 'string' && row.model ? row.model : 'default',
70
- role: typeof row.role === 'string' ? row.role : '',
71
- status: typeof row.status === 'string' ? row.status : undefined,
68
+ cli: typeof row['cli'] === 'string' && row['cli'] ? row['cli'] : 'claude',
69
+ model: typeof row['model'] === 'string' && row['model'] ? row['model'] : 'default',
70
+ role: typeof row['role'] === 'string' ? row['role'] : '',
72
71
  source,
73
72
  };
73
+ if (typeof row['status'] === 'string') employee.status = row['status'];
74
+ return employee;
74
75
  }
75
76
 
76
77
  export function runtimeEmployeeError(row: RuntimeEmployeeRecord): string | null {
@@ -174,13 +175,14 @@ function toDbCreatePayload(row: RuntimeEmployeeRecord): Record<string, string> {
174
175
  }
175
176
 
176
177
  function stableRuntimeEmployee(row: RuntimeEmployeeRecord): RuntimeEmployeeRecord {
177
- return {
178
+ const stable: RuntimeEmployeeRecord = {
178
179
  id: row.id,
179
180
  name: row.name,
180
181
  cli: row.cli,
181
182
  model: row.model,
182
183
  role: row.role,
183
- status: row.status,
184
184
  source: row.source,
185
185
  };
186
+ if (row.status !== undefined) stable.status = row.status;
187
+ return stable;
186
188
  }
@@ -73,18 +73,18 @@ export function normalizeEmployees(payload: unknown): EmployeeRecord[] {
73
73
  }
74
74
  if (!raw || typeof raw !== 'object') continue;
75
75
  const r = raw as Record<string, unknown>;
76
- const name = typeof r.name === 'string' ? r.name : '';
77
- if (!name && !r.id) continue;
76
+ const name = typeof r['name'] === 'string' ? r['name'] : '';
77
+ if (!name && !r['id']) continue;
78
78
  fallback += 1;
79
79
  const id =
80
- typeof r.id === 'string' && r.id.trim()
81
- ? r.id.trim()
80
+ typeof r['id'] === 'string' && r['id'].trim()
81
+ ? r['id'].trim()
82
82
  : `emp_unknown_${fallback}`;
83
83
  const cli =
84
- typeof r.cli === 'string' && r.cli.trim() ? r.cli.trim() : 'claude';
85
- const role = typeof r.role === 'string' ? r.role : '';
86
- const prompt = typeof r.prompt === 'string' ? r.prompt : '';
87
- const active = r.active !== false;
84
+ typeof r['cli'] === 'string' && r['cli'].trim() ? r['cli'].trim() : 'claude';
85
+ const role = typeof r['role'] === 'string' ? r['role'] : '';
86
+ const prompt = typeof r['prompt'] === 'string' ? r['prompt'] : '';
87
+ const active = r['active'] !== false;
88
88
  out.push({ id, name, cli, role, prompt, active });
89
89
  }
90
90
  return out;
@@ -136,7 +136,7 @@ export function toPersistShape(rows: ReadonlyArray<EmployeeRecord>): unknown[] {
136
136
  role: row.role.trim(),
137
137
  active: row.active,
138
138
  };
139
- if (row.prompt.trim()) out.prompt = row.prompt;
139
+ if (row['prompt'].trim()) out['prompt'] = row['prompt'];
140
140
  return out;
141
141
  });
142
142
  }