cli-jaw 2.17.62 → 2.17.63

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 (360) hide show
  1. package/README.ja.md +17 -17
  2. package/README.ko.md +17 -17
  3. package/README.md +17 -17
  4. package/README.zh-CN.md +17 -17
  5. package/dist/bin/commands/tui/input-handler.js +19 -0
  6. package/dist/bin/commands/tui/input-handler.js.map +1 -1
  7. package/dist/bin/commands/tui/overlays.js +8 -4
  8. package/dist/bin/commands/tui/overlays.js.map +1 -1
  9. package/dist/bin/star-prompt.js +1 -1
  10. package/dist/bin/star-prompt.js.map +1 -1
  11. package/dist/server.js +14 -1
  12. package/dist/server.js.map +1 -1
  13. package/dist/src/agent/claude-runtime-pool.js +2 -1
  14. package/dist/src/agent/claude-runtime-pool.js.map +1 -1
  15. package/dist/src/agent/claude-runtime-run.js +28 -7
  16. package/dist/src/agent/claude-runtime-run.js.map +1 -1
  17. package/dist/src/agent/lifecycle-handler.js +34 -6
  18. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  19. package/dist/src/agent/runtime/claude-sdk-events.js +136 -9
  20. package/dist/src/agent/runtime/claude-sdk-events.js.map +1 -1
  21. package/dist/src/agent/runtime/claude-sdk-history-loader.js +24 -0
  22. package/dist/src/agent/runtime/claude-sdk-history-loader.js.map +1 -0
  23. package/dist/src/agent/runtime/claude-sdk-hooks.js +10 -4
  24. package/dist/src/agent/runtime/claude-sdk-hooks.js.map +1 -1
  25. package/dist/src/agent/runtime/claude-sdk-messages.js +25 -2
  26. package/dist/src/agent/runtime/claude-sdk-messages.js.map +1 -1
  27. package/dist/src/agent/runtime/claude-sdk-options.js +36 -3
  28. package/dist/src/agent/runtime/claude-sdk-options.js.map +1 -1
  29. package/dist/src/agent/runtime/claude-sdk-permissions.js +32 -9
  30. package/dist/src/agent/runtime/claude-sdk-permissions.js.map +1 -1
  31. package/dist/src/agent/runtime/claude-sdk-session.js +165 -17
  32. package/dist/src/agent/runtime/claude-sdk-session.js.map +1 -1
  33. package/dist/src/agent/runtime/claude-sdk-version.js +8 -0
  34. package/dist/src/agent/runtime/claude-sdk-version.js.map +1 -0
  35. package/dist/src/agent/spawn/backend-codex-app.js +619 -0
  36. package/dist/src/agent/spawn/backend-codex-app.js.map +1 -0
  37. package/dist/src/agent/spawn/backend-context.js +2 -0
  38. package/dist/src/agent/spawn/backend-context.js.map +1 -0
  39. package/dist/src/agent/spawn/backend-copilot.js +385 -0
  40. package/dist/src/agent/spawn/backend-copilot.js.map +1 -0
  41. package/dist/src/agent/spawn/backend-native-acp.js +379 -0
  42. package/dist/src/agent/spawn/backend-native-acp.js.map +1 -0
  43. package/dist/src/agent/spawn/backend-pi.js +565 -0
  44. package/dist/src/agent/spawn/backend-pi.js.map +1 -0
  45. package/dist/src/agent/spawn/types.js +2 -0
  46. package/dist/src/agent/spawn/types.js.map +1 -0
  47. package/dist/src/agent/spawn.js +44 -1858
  48. package/dist/src/agent/spawn.js.map +1 -1
  49. package/dist/src/cli/claude-default-model-boot.js +36 -0
  50. package/dist/src/cli/claude-default-model-boot.js.map +1 -0
  51. package/dist/src/cli/claude-model-discovery.js +13 -1
  52. package/dist/src/cli/claude-model-discovery.js.map +1 -1
  53. package/dist/src/cli/claude-models.js +7 -1
  54. package/dist/src/cli/claude-models.js.map +1 -1
  55. package/dist/src/cli/commands.js +5 -15
  56. package/dist/src/cli/commands.js.map +1 -1
  57. package/dist/src/cli/tui/composer.js +3 -3
  58. package/dist/src/cli/tui/composer.js.map +1 -1
  59. package/dist/src/cli/tui/skill-mention.js +15 -0
  60. package/dist/src/cli/tui/skill-mention.js.map +1 -0
  61. package/dist/src/code-mode/manager.js +174 -9
  62. package/dist/src/code-mode/manager.js.map +1 -1
  63. package/dist/src/code-mode/providers/catalog.js +5 -3
  64. package/dist/src/code-mode/providers/catalog.js.map +1 -1
  65. package/dist/src/code-mode/providers/claude-history.js +132 -0
  66. package/dist/src/code-mode/providers/claude-history.js.map +1 -0
  67. package/dist/src/code-mode/providers/claude.js +74 -7
  68. package/dist/src/code-mode/providers/claude.js.map +1 -1
  69. package/dist/src/code-mode/providers/codex-app.js +7 -1
  70. package/dist/src/code-mode/providers/codex-app.js.map +1 -1
  71. package/dist/src/code-mode/session.js +158 -11
  72. package/dist/src/code-mode/session.js.map +1 -1
  73. package/dist/src/code-mode/store.js +416 -28
  74. package/dist/src/code-mode/store.js.map +1 -1
  75. package/dist/src/command-contract/catalog.js +3 -22
  76. package/dist/src/command-contract/catalog.js.map +1 -1
  77. package/dist/src/core/codex-config.js +3 -62
  78. package/dist/src/core/codex-config.js.map +1 -1
  79. package/dist/src/core/config.js +116 -14
  80. package/dist/src/core/config.js.map +1 -1
  81. package/dist/src/core/runtime-settings.js +20 -10
  82. package/dist/src/core/runtime-settings.js.map +1 -1
  83. package/dist/src/core/settings-watch.js +1 -0
  84. package/dist/src/core/settings-watch.js.map +1 -1
  85. package/dist/src/core/skill-mentions.js +83 -0
  86. package/dist/src/core/skill-mentions.js.map +1 -0
  87. package/dist/src/manager/registry.js +5 -1
  88. package/dist/src/manager/registry.js.map +1 -1
  89. package/dist/src/manager/routes/desktop-status.js +1 -1
  90. package/dist/src/manager/routes/desktop-status.js.map +1 -1
  91. package/dist/src/orchestrator/pipeline.js +11 -1
  92. package/dist/src/orchestrator/pipeline.js.map +1 -1
  93. package/dist/src/prompt/builder.js +10 -4
  94. package/dist/src/prompt/builder.js.map +1 -1
  95. package/dist/src/prompt/templates/a1-system.md +1 -1
  96. package/dist/src/routes/code-native.js +51 -3
  97. package/dist/src/routes/code-native.js.map +1 -1
  98. package/dist/src/routes/settings.js +1 -4
  99. package/dist/src/routes/settings.js.map +1 -1
  100. package/dist/src/routes/skills.js +7 -0
  101. package/dist/src/routes/skills.js.map +1 -1
  102. package/dist/src/shared/skill-mention.js +61 -0
  103. package/dist/src/shared/skill-mention.js.map +1 -0
  104. package/dist/src/shared/tool-input.js +137 -0
  105. package/dist/src/shared/tool-input.js.map +1 -0
  106. package/package.json +7 -5
  107. package/public/css/activity.css +83 -20
  108. package/public/css/layout.css +2 -2
  109. package/public/css/sidebar.css +18 -0
  110. package/public/css/variables.css +23 -2
  111. package/public/dist/.vite/manifest.json +302 -334
  112. package/public/dist/assets/Activity-DPLlOJ46.js +1 -0
  113. package/public/dist/assets/AdvancedExport-BgOgGvc5.js +1 -0
  114. package/public/dist/assets/Agent-O_U8ny90.js +1 -0
  115. package/public/dist/assets/Browser-m6VynQXV.js +1 -0
  116. package/public/dist/assets/BrowserPanel-Bb-Bge6B.js +3 -0
  117. package/public/dist/assets/ChannelEnablementControl-BSuKQhTW.js +85 -0
  118. package/public/dist/assets/ChannelSetupEntry-DHLoZEzJ.js +1 -0
  119. package/public/dist/assets/ChannelsDiscord-B-G8vsYy.js +1 -0
  120. package/public/dist/assets/ChannelsSlack-oPuh922z.js +1 -0
  121. package/public/dist/assets/ChannelsTelegram-PmTv43KQ.js +1 -0
  122. package/public/dist/assets/CodeCanvas-CVbdp0S-.js +3 -0
  123. package/public/dist/assets/DashboardMeta-BqEiJrvr.js +1 -0
  124. package/public/dist/assets/DesignPanel-BOb-HMbl.js +2 -0
  125. package/public/dist/assets/{Developer-BdKPcw8Z.js → Developer-CbySB7_Z.js} +1 -1
  126. package/public/dist/assets/{DiffPanel-DtJuvU5y.js → DiffPanel-D9Cch5FG.js} +1 -1
  127. package/public/dist/assets/Display-C0Zdamcb.js +1 -0
  128. package/public/dist/assets/Display-DU4_76cS.js +1 -0
  129. package/public/dist/assets/DocPanel-DvtFw8AP.js +1 -0
  130. package/public/dist/assets/{Embedding-DvdTj1BF.js → Embedding-CCFMOB_2.js} +1 -1
  131. package/public/dist/assets/Employees-BanvF58d.js +1 -0
  132. package/public/dist/assets/FolderPanel-CJvwRwIV.js +3 -0
  133. package/public/dist/assets/Heartbeat-uyi_MpUd.js +1 -0
  134. package/public/dist/assets/InlineWarn-Cq4z28F3.js +1 -0
  135. package/public/dist/assets/MarkdownRenderer-Cc3DeHvm.js +1 -0
  136. package/public/dist/assets/{MarkdownRenderer-DhonsAPC.js → MarkdownRenderer-DzN66XVb.js} +1 -1
  137. package/public/dist/assets/Mcp-rjPoL_Zo.js +4 -0
  138. package/public/dist/assets/Memory-C9I33pIi.js +1 -0
  139. package/public/dist/assets/{MilkdownWysiwygEditor-D6JaLDE4.js → MilkdownWysiwygEditor-xObhviw7.js} +1 -1
  140. package/public/dist/assets/ModelProvider-fiUktMaO.js +1 -0
  141. package/public/dist/assets/Network-CuqFrOvR.js +1 -0
  142. package/public/dist/assets/NotesGraphWorkspace-DO9LtVGF.js +1 -0
  143. package/public/dist/assets/PanelLayoutProvider-DRZ4QkBC.js +1 -0
  144. package/public/dist/assets/Permissions-BltXiZnz.js +1 -0
  145. package/public/dist/assets/{Permissions-BwiMEoTV.js → Permissions-DcCbFMIq.js} +1 -1
  146. package/public/dist/assets/Profile-DUL7-RE_.js +1 -0
  147. package/public/dist/assets/Prompts-C9vY8ivQ.js +1 -0
  148. package/public/dist/assets/SpeechKeys-BJ8V7U5E.js +1 -0
  149. package/public/dist/assets/TelegramHub-DtyjLGFR.js +1 -0
  150. package/public/dist/assets/{TerminalPanel-Bu9i-P2f.js → TerminalPanel-c1xhiy53.js} +1 -1
  151. package/public/dist/assets/app-BjKzqXCv.css +1 -0
  152. package/public/dist/assets/app-CZwx0V6K.js +59 -0
  153. package/public/dist/assets/bgtask-badge-CnVkcp3c.js +1 -0
  154. package/public/dist/assets/{bgtask-badge-DfiHuzxT.js → bgtask-badge-Cp26S8Uq.js} +1 -1
  155. package/public/dist/assets/client-platform-WO8m6kPQ.js +1 -0
  156. package/public/dist/assets/{employees-BQaJNp-u.js → employees-CsvI0_5V.js} +1 -1
  157. package/public/dist/assets/error-normalize-clOi-AAA.js +1 -0
  158. package/public/dist/assets/fields-CicOWY-X.js +1 -0
  159. package/public/dist/assets/iframe-renderer-DWx9v2Iz.js +1 -0
  160. package/public/dist/assets/iframe-renderer-DmHYOI1A.js +142 -0
  161. package/public/dist/assets/{react-C_pPTFsM.js → jsx-runtime-CkEUZM6i.js} +1 -1
  162. package/public/dist/assets/manager-CCXm5Yfe.js +5 -0
  163. package/public/dist/assets/manager-D9rhKFKc.css +1 -0
  164. package/public/dist/assets/manager-shortcuts-Cqmr0mEq.js +1 -0
  165. package/public/dist/assets/{memory-EG1B51up.js → memory-C6qtAMdJ.js} +1 -1
  166. package/public/dist/assets/memory-PPofQPeB.js +1 -0
  167. package/public/dist/assets/message-history-DcjBuubA.js +4 -0
  168. package/public/dist/assets/message-history-bw4qF01Z.js +1 -0
  169. package/public/dist/assets/page-shell-DfinU3mb.js +1 -0
  170. package/public/dist/assets/react-dom-URBLzV3w.js +1 -0
  171. package/public/dist/assets/{render-Dp07lZAJ.js → render-DfYro-fG.js} +1 -1
  172. package/public/dist/assets/{settings-jlI4X-zt.js → settings-CvsLWlJn.js} +38 -30
  173. package/public/dist/assets/settings-DMiQe469.js +1 -0
  174. package/public/dist/assets/settings-DgAlohx9.js +1 -0
  175. package/public/dist/assets/settings-core-BH7J_Rbm.js +1 -0
  176. package/public/dist/assets/{settings-core-B5Uf_lWY.js → settings-core-pnpw-eZv.js} +1 -1
  177. package/public/dist/assets/{settings-embedding-BfWzWKMM.js → settings-embedding-BRW0WZvh.js} +3 -3
  178. package/public/dist/assets/{settings-embedding-DhEdT86W.css → settings-embedding-CUQ8Is3y.css} +1 -1
  179. package/public/dist/assets/settings-types-CYKy0xz4.js +1 -0
  180. package/public/dist/assets/shared-D1begqvi.js +1 -0
  181. package/public/dist/assets/{sidebar-BUemG2ZN.js → sidebar-C_80w4iY.js} +3 -3
  182. package/public/dist/assets/{skills-CKUcEN9m.js → skills-D_2adqge.js} +1 -1
  183. package/public/dist/assets/skills-DeNVAVgt.js +1 -0
  184. package/public/dist/assets/{slash-commands-D34GgHFX.js → slash-commands-B_Hq5RkC.js} +2 -2
  185. package/public/dist/assets/slash-commands-Cj5qoRWc.js +1 -0
  186. package/public/dist/assets/tool-input-DI7uu8Ah.js +2 -0
  187. package/public/dist/assets/{trace-drawer-DBmK-5F_.js → trace-drawer-B6XuPodh.js} +1 -1
  188. package/public/dist/assets/ui-BbR_fFiK.js +1 -0
  189. package/public/dist/assets/{ui-vm2iuLcS.js → ui-D8xzm7DN.js} +1 -1
  190. package/public/dist/index.html +11 -3
  191. package/public/dist/manager/index.html +3 -3
  192. package/public/dist/settings/index.html +2 -2
  193. package/public/index.html +9 -1
  194. package/public/js/features/activity-history.ts +50 -21
  195. package/public/js/features/activity-rows.ts +158 -10
  196. package/public/js/features/activity-view.ts +5 -5
  197. package/public/js/features/chat.ts +2 -0
  198. package/public/js/features/employees.ts +1 -0
  199. package/public/js/features/resize-guard.ts +39 -0
  200. package/public/js/features/settings-cli-status.ts +49 -17
  201. package/public/js/features/settings-types.ts +39 -1
  202. package/public/js/features/skill-mentions.ts +143 -0
  203. package/public/js/main.ts +15 -0
  204. package/public/js/virtual-scroll.ts +67 -1
  205. package/public/locales/en.json +2 -0
  206. package/public/locales/ja.json +2 -0
  207. package/public/locales/ko.json +2 -0
  208. package/public/locales/zh.json +2 -0
  209. package/public/manager/src/AppChrome.tsx +2 -0
  210. package/public/manager/src/InstancePreview.tsx +1 -1
  211. package/public/manager/src/SidebarRailRouter.tsx +3 -1
  212. package/public/manager/src/browser-panel/BrowserPanel.tsx +47 -12
  213. package/public/manager/src/browser-panel/browser-address-state.ts +11 -0
  214. package/public/manager/src/client-platform.ts +18 -0
  215. package/public/manager/src/code/CodeCanvas.tsx +4 -2
  216. package/public/manager/src/code/CodeComposer.tsx +22 -10
  217. package/public/manager/src/code/CodeDraftEmptyState.tsx +64 -0
  218. package/public/manager/src/code/CodeSessionList.tsx +154 -40
  219. package/public/manager/src/code/CodeTranscript.tsx +104 -16
  220. package/public/manager/src/code/CodeWorkbench.tsx +21 -11
  221. package/public/manager/src/code/CodeWorkspaceHeader.tsx +5 -10
  222. package/public/manager/src/code/ComposerFooter.tsx +9 -1
  223. package/public/manager/src/code/code-composer.css +1 -1
  224. package/public/manager/src/code/code-controller-draft-storage.ts +16 -8
  225. package/public/manager/src/code/code-controller-drafts.ts +33 -6
  226. package/public/manager/src/code/code-controller-runtime.ts +189 -17
  227. package/public/manager/src/code/code-controller-types.ts +19 -1
  228. package/public/manager/src/code/code-recent-workspaces.ts +25 -0
  229. package/public/manager/src/code/code-session-client.ts +19 -1
  230. package/public/manager/src/code/code-session-sidebar.css +38 -0
  231. package/public/manager/src/code/code-session-state.ts +2 -0
  232. package/public/manager/src/code/code-types.ts +47 -0
  233. package/public/manager/src/code/code-workbench.css +36 -1
  234. package/public/manager/src/code/code.css +171 -7
  235. package/public/manager/src/code/session-order.ts +80 -0
  236. package/public/manager/src/code/tool-summary.ts +45 -11
  237. package/public/manager/src/folder-panel/folder-shortcuts.ts +5 -9
  238. package/public/manager/src/hooks/useCommandPalette.ts +3 -7
  239. package/public/manager/src/main.tsx +1 -0
  240. package/public/manager/src/manager-components.css +25 -23
  241. package/public/manager/src/manager-dashboard-reminders.css +2 -2
  242. package/public/manager/src/manager-layout.css +1 -1
  243. package/public/manager/src/manager-shortcut-runner.ts +9 -2
  244. package/public/manager/src/manager-shortcuts.ts +83 -21
  245. package/public/manager/src/panels/desktop-bridge.ts +4 -1
  246. package/public/manager/src/panels/panels.css +9 -0
  247. package/public/manager/src/preview.ts +19 -4
  248. package/public/manager/src/settings/pages/AdvancedExport.tsx +28 -30
  249. package/public/manager/src/settings/pages/Browser.tsx +45 -47
  250. package/public/manager/src/settings/pages/ChannelsDiscord.tsx +51 -26
  251. package/public/manager/src/settings/pages/ChannelsSlack.tsx +59 -17
  252. package/public/manager/src/settings/pages/ChannelsTelegram.tsx +51 -26
  253. package/public/manager/src/settings/pages/Display.tsx +2 -1
  254. package/public/manager/src/settings/pages/Employees.tsx +3 -3
  255. package/public/manager/src/settings/pages/Mcp.tsx +220 -200
  256. package/public/manager/src/settings/pages/Memory.tsx +35 -41
  257. package/public/manager/src/settings/pages/ModelProvider.tsx +23 -98
  258. package/public/manager/src/settings/pages/Network.tsx +5 -4
  259. package/public/manager/src/settings/pages/Permissions.tsx +38 -16
  260. package/public/manager/src/settings/pages/Prompts.tsx +12 -9
  261. package/public/manager/src/settings/pages/SpeechKeys.tsx +132 -139
  262. package/public/manager/src/settings/pages/TelegramHub.tsx +67 -20
  263. package/public/manager/src/settings/pages/components/AvatarCard.tsx +9 -8
  264. package/public/manager/src/settings/pages/components/ChannelSetupEntry.tsx +2 -2
  265. package/public/manager/src/settings/pages/components/EmployeeRow.tsx +6 -12
  266. package/public/manager/src/settings/pages/components/HealthBadge.tsx +11 -6
  267. package/public/manager/src/settings/pages/components/HeartbeatJobRow.tsx +35 -16
  268. package/public/manager/src/settings/pages/components/HeartbeatJobsSection.tsx +11 -11
  269. package/public/manager/src/settings/pages/components/HeartbeatMarkdownSection.tsx +7 -7
  270. package/public/manager/src/settings/pages/components/InlineWarn.tsx +4 -9
  271. package/public/manager/src/settings/pages/components/McpServerCard.tsx +39 -27
  272. package/public/manager/src/settings/pages/components/MemoryRow.tsx +21 -16
  273. package/public/manager/src/settings/pages/components/PerCliRow.tsx +122 -121
  274. package/public/manager/src/settings/pages/components/PiProfileDialog.tsx +9 -6
  275. package/public/manager/src/settings/pages/components/SlackSetup.tsx +8 -8
  276. package/public/manager/src/settings/pages/components/TransportStatusChips.tsx +14 -10
  277. package/public/manager/src/settings/pages/components/agent/AgentEmployeesSection.tsx +26 -26
  278. package/public/manager/src/settings/pages/components/agent/PermissionQuickSection.tsx +5 -5
  279. package/public/manager/src/settings/pages/components/agent/RuntimeEmployeeRow.tsx +14 -11
  280. package/public/manager/src/settings/pages/components/agent/RuntimeHeader.tsx +1 -3
  281. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +0 -2
  282. package/public/manager/src/settings/pages/components/runtime-transport-field.tsx +2 -2
  283. package/public/manager/src/settings/pages/manager/Activity.tsx +6 -2
  284. package/public/manager/src/settings/pages/manager/Display.tsx +3 -8
  285. package/public/manager/src/settings/pages/manager/shared.tsx +44 -33
  286. package/public/manager/src/settings/pages/page-shell.tsx +66 -0
  287. package/public/manager/src/settings-agent.css +185 -36
  288. package/public/manager/src/settings-standalone.tsx +1 -0
  289. package/public/manager/src/settings-surface.css +96 -0
  290. package/public/manager/src/types.ts +1 -0
  291. package/scripts/ci/install-ripgrep.sh +35 -0
  292. package/scripts/collect-fresh-install-evidence.sh +2 -2
  293. package/scripts/install-risk-gate.mjs +2 -3
  294. package/scripts/install-wsl.sh +1 -1
  295. package/scripts/install.ps1 +1 -1
  296. package/scripts/install.sh +1 -1
  297. package/scripts/release-1.6.0.sh +1 -1
  298. package/scripts/release-gates.mjs +48 -13
  299. package/scripts/release-preview.sh +2 -2
  300. package/scripts/restack-pr.sh +88 -0
  301. package/scripts/verify-electron-update-metadata.mjs +1 -1
  302. package/scripts/windows-support-contract.json +1 -1
  303. package/public/dist/assets/Activity-BUrp73Re.js +0 -1
  304. package/public/dist/assets/AdvancedExport-B7h_ZvBu.js +0 -1
  305. package/public/dist/assets/Agent-DnbZJP7b.js +0 -1
  306. package/public/dist/assets/Browser-CiBoK5Qx.js +0 -1
  307. package/public/dist/assets/BrowserPanel-SZAUc9T2.js +0 -3
  308. package/public/dist/assets/ChannelEnablementControl-Dl0uYx38.js +0 -85
  309. package/public/dist/assets/ChannelSetupEntry-DxtOrN01.js +0 -1
  310. package/public/dist/assets/ChannelsDiscord-BEGGwd_3.js +0 -1
  311. package/public/dist/assets/ChannelsSlack-BryC2Ahr.js +0 -1
  312. package/public/dist/assets/ChannelsTelegram-CGSpaImJ.js +0 -1
  313. package/public/dist/assets/CodeCanvas-DpkFi5Au.js +0 -2
  314. package/public/dist/assets/DashboardMeta-Dh-tasbY.js +0 -1
  315. package/public/dist/assets/DesignPanel-NLNK9wCo.js +0 -2
  316. package/public/dist/assets/Display-BHGFX3O0.js +0 -1
  317. package/public/dist/assets/Display-BW-_pKRf.js +0 -1
  318. package/public/dist/assets/DocPanel-BM41cYpS.js +0 -1
  319. package/public/dist/assets/Employees-BuFw6-fT.js +0 -1
  320. package/public/dist/assets/FolderPanel-C-eQT3Yq.js +0 -3
  321. package/public/dist/assets/Heartbeat-CIVtKWNc.js +0 -1
  322. package/public/dist/assets/InlineWarn-DIMbcbzk.js +0 -1
  323. package/public/dist/assets/MarkdownRenderer-DyVx6DxM.js +0 -1
  324. package/public/dist/assets/Mcp-uKjor7vh.js +0 -4
  325. package/public/dist/assets/Memory-BSDIXT0B.js +0 -1
  326. package/public/dist/assets/ModelProvider-DMh2tXUx.js +0 -1
  327. package/public/dist/assets/Network-4Pa6JkhK.js +0 -1
  328. package/public/dist/assets/NotesGraphWorkspace-CgdC-fM6.js +0 -1
  329. package/public/dist/assets/PanelLayoutProvider-mn8sI0h-.js +0 -1
  330. package/public/dist/assets/Permissions-CodIW-Yd.js +0 -1
  331. package/public/dist/assets/Profile-DPqrYA44.js +0 -1
  332. package/public/dist/assets/Prompts-CvAx7QqR.js +0 -1
  333. package/public/dist/assets/SpeechKeys-CVBCqoBn.js +0 -1
  334. package/public/dist/assets/TelegramHub-4zKwpk0P.js +0 -1
  335. package/public/dist/assets/app-ByMfeXp-.js +0 -55
  336. package/public/dist/assets/app-DAJWqs33.css +0 -1
  337. package/public/dist/assets/bgtask-badge-Ch88fnhf.js +0 -1
  338. package/public/dist/assets/error-normalize-CL69Bl7z.js +0 -1
  339. package/public/dist/assets/fields-mlGpofqQ.js +0 -1
  340. package/public/dist/assets/iframe-renderer-Bj1JolO8.js +0 -142
  341. package/public/dist/assets/iframe-renderer-DWnvUSrx.js +0 -1
  342. package/public/dist/assets/jsx-runtime-NZYk81nU.js +0 -1
  343. package/public/dist/assets/manager-Bi_xw7TW.js +0 -5
  344. package/public/dist/assets/manager-BnQHAKk6.css +0 -1
  345. package/public/dist/assets/manager-shortcuts-BDOzd8zm.js +0 -1
  346. package/public/dist/assets/memory-Bk_cb3sw.js +0 -1
  347. package/public/dist/assets/message-history-D2vniu04.js +0 -4
  348. package/public/dist/assets/message-history-GAtF_wbZ.js +0 -1
  349. package/public/dist/assets/page-shell-BeGD0rRQ.js +0 -1
  350. package/public/dist/assets/react-dom-DyUOYpVL.js +0 -1
  351. package/public/dist/assets/settings-W4KG9ivu.js +0 -1
  352. package/public/dist/assets/settings-WVGhtneN.js +0 -1
  353. package/public/dist/assets/settings-client-CmwRsVd1.js +0 -1
  354. package/public/dist/assets/settings-core-CgKGnMA5.js +0 -1
  355. package/public/dist/assets/settings-types-D3cd6SWy.js +0 -1
  356. package/public/dist/assets/shared-CiNP20HB.js +0 -1
  357. package/public/dist/assets/skills-Co7Mr-qP.js +0 -1
  358. package/public/dist/assets/slash-commands-BEr-vmIr.js +0 -1
  359. package/public/dist/assets/ui-TUyJsMUf.js +0 -1
  360. package/public/manager/src/settings/pages/components/EngineSubsection.tsx +0 -25
@@ -0,0 +1,2 @@
1
+ var e={command:[`command`,`cmd`],path:[`file_path`,`path`,`file`],url:[`url`],query:[`pattern`,`query`]},t=[`description`],n=Object.values(e).flat(),r={};for(let[t,n]of Object.entries(e))for(let e of n)r[e]=t;function i(e){let t=e?.trim();if(!t||!t.startsWith(`{`))return null;try{let e=JSON.parse(t);return typeof e==`object`&&e&&!Array.isArray(e)?e:null}catch{return null}}function a(e,t){for(let n of t){let t=e[n];if(typeof t==`string`&&t.trim())return t}return null}function o(e){let o=i(e);if(o){let e=a(o,t);for(let t of n){let n=a(o,[t]);if(n!==null)return{object:o,value:n,key:t,field:r[t],description:e}}return{object:o,value:null,key:null,field:null,description:e}}let s=e?.trim()??``;if(s.startsWith(`{`)){let e=c(s,n),i=c(s,t)?.value??null;if(e)return{object:null,value:e.value,key:e.key,field:r[e.key],description:i};if(i)return{object:null,value:null,key:null,field:null,description:i}}return{object:null,value:null,key:null,field:null,description:null}}function s(e){let t={n:`
2
+ `,t:` `,r:`\r`,'"':`"`,"\\":`\\`,"/":`/`,b:`\b`,f:`\f`},n=``;for(let r=0;r<e.length;r++){let i=e[r];if(i!==`\\`){n+=i;continue}let a=e[r+1];if(a===void 0)break;if(t[a]!==void 0){n+=t[a],r++;continue}if(a===`u`){let t=e.slice(r+2,r+6);if(!/^[0-9a-fA-F]{4}$/.test(t))break;n+=String.fromCharCode(Number.parseInt(t,16)),r+=5;continue}n+=a,r++}return n}function c(e,t){for(let n of t){let t=RegExp(`"${n}"\\s*:\\s*"`).exec(e);if(!t)continue;let r=``;for(let n=t.index+t[0].length;n<e.length;n++){let t=e[n];if(t===`\\`&&n+1<e.length){r+=t+e[++n];continue}if(t===`"`)break;r+=t}let i=s(r).trim();if(i)return{key:n,value:i}}return null}function l(e){return(e.split(/\r?\n/).find(e=>e.trim())??``).replace(/\s+/g,` `).trim()}function u(e){let t=i(e);return t?JSON.stringify(t,null,2):e}export{a,u as c,l as i,e as n,i as o,n as r,o as s,t};
@@ -1,4 +1,4 @@
1
- import{n as e}from"./bounded-api-DdpT93LB.js";import{O as t}from"./render-Dp07lZAJ.js";import{r as n}from"./provider-icons-Bge6teOj.js";var r=80,i=16777216,a=``,o=0,s=0,c=!1,l=null,u=0,d=!1,f=0,p=null,m=null,h=null,g=null,_=null;function v(e){return e.eventType||e.event_type||`event`}function y(e,t=a){return e===f&&t===a}function b(e){return m?e+(e.includes(`?`)?`&`:`?`)+new URLSearchParams({session:m}):e}async function x(t,n){let r=await e(t,{method:`GET`},n,i);if(r&&typeof r==`object`&&`ok`in r){if(r.ok!==!0||!(`data`in r))throw Error(`trace_unavailable`);return r.data}if(!r||typeof r!=`object`)throw Error(`trace_unavailable`);return r}function S(){let e=document.getElementById(`traceDrawerOverlay`);return e||(e=document.createElement(`div`),e.id=`traceDrawerOverlay`,e.className=`trace-drawer-overlay`,e.innerHTML=`<aside class="trace-drawer" role="dialog" aria-modal="true" aria-labelledby="traceDrawerTitle">
1
+ import{n as e}from"./bounded-api-DdpT93LB.js";import{O as t}from"./render-DfYro-fG.js";import{r as n}from"./provider-icons-Bge6teOj.js";var r=80,i=16777216,a=``,o=0,s=0,c=!1,l=null,u=0,d=!1,f=0,p=null,m=null,h=null,g=null,_=null;function v(e){return e.eventType||e.event_type||`event`}function y(e,t=a){return e===f&&t===a}function b(e){return m?e+(e.includes(`?`)?`&`:`?`)+new URLSearchParams({session:m}):e}async function x(t,n){let r=await e(t,{method:`GET`},n,i);if(r&&typeof r==`object`&&`ok`in r){if(r.ok!==!0||!(`data`in r))throw Error(`trace_unavailable`);return r.data}if(!r||typeof r!=`object`)throw Error(`trace_unavailable`);return r}function S(){let e=document.getElementById(`traceDrawerOverlay`);return e||(e=document.createElement(`div`),e.id=`traceDrawerOverlay`,e.className=`trace-drawer-overlay`,e.innerHTML=`<aside class="trace-drawer" role="dialog" aria-modal="true" aria-labelledby="traceDrawerTitle">
2
2
  <header class="trace-drawer-header">
3
3
  <div><p class="trace-drawer-kicker">Raw trace</p><h2 id="traceDrawerTitle">Trace</h2></div>
4
4
  <button class="trace-drawer-close" type="button" aria-label="Close trace drawer">×</button>
@@ -0,0 +1 @@
1
+ import{p as e}from"./iframe-renderer-DmHYOI1A.js";import{I as t,s as n}from"./message-history-DcjBuubA.js";import{r}from"./ui-D8xzm7DN.js";export{r as cleanupToolActivity,n as loadMessages,e as reconcileChatBottomAfterRestore,t as updateQueueBadge};
@@ -1,2 +1,2 @@
1
1
  const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-render-DSSkXCir.css"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./state-Dl-xxPoS.js";import{t}from"./preload-helper-CfbQpVni.js";import{E as n,T as r,k as i,t as a}from"./render-Dp07lZAJ.js";import{a as o,n as s}from"./icons-CVkqyECl.js";import{A as c,C as l,D as u,N as d,O as f,S as p,_ as ee,b as m,k as h,m as g,t as _,v,w as y,x as b}from"./iframe-renderer-Bj1JolO8.js";import{B as x,F as S,G as C,H as w,J as T,K as E,L as te,P as ne,Q as D,R as re,U as ie,V as O,W as k,Y as A,Z as j,a as ae,l as oe,q as M,z as N}from"./message-history-D2vniu04.js";import{c as se}from"./idb-cache-BRpjf_a8.js";var P=2e3,F=80,ce=400;function le(e){if(e<=P)return F;let t=e/P*F;return Math.min(ce,Math.round(t))}function I(e){return{chunks:[],fullText:``,textDirty:!1,element:e,pendingRAF:null,isFinalized:!1,lastRenderTime:0}}function ue(e,t=``){let n=I(e);return t?(n.chunks=[t],n.fullText=t,n.textDirty=!1,n.element.innerHTML=a(t,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`):n.element.innerHTML=`<span class="stream-cursor" aria-hidden="true"></span>`,n}function L(e){return e.textDirty&&=(e.fullText=e.chunks.join(``),!1),e.fullText}function R(e,t){e.chunks.push(t),e.textDirty=!0,!e.pendingRAF&&!e.isFinalized&&(e.pendingRAF=requestAnimationFrame(()=>{if(e.pendingRAF=null,e.isFinalized)return;let t=performance.now(),n=L(e);n.length<P||t-e.lastRenderTime>le(n.length)?(e.element.innerHTML=a(n,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=t):e.pendingRAF=requestAnimationFrame(()=>{e.pendingRAF=null,!e.isFinalized&&(e.element.innerHTML=a(L(e),!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=performance.now())})}))}function z(e,t=!1){e.isFinalized=!0,e.pendingRAF&&=(cancelAnimationFrame(e.pendingRAF),null);let n=L(e);return t||(e.element.innerHTML=a(n)),n}function B(e){return typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function V(e,t){return!!t.traceRunId&&!!e.traceRunId&&t.traceRunId===e.traceRunId&&B(t)&&B(e)&&t.traceSeq===e.traceSeq&&t.type===e.type&&t.label===e.label&&!!t.isEmployee==!!e.isEmployee}function H(e,t){return t.stepRef&&e.stepRef===t.stepRef?!0:V(e,t)}function U(e,t,n={}){return[...e].reverse().filter(e=>n.includeDone||e.status===`running`).find(e=>H(e,t))??null}function de(e,t){let n=e.filter(e=>e.status===`running`&&!e.stepRef&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee);return n.length===1?n[0]:null}function fe(e,t){let n=[...e].reverse().filter(e=>e.status===`running`);return U(n,t)||de(n,t)}function pe(){e.currentProcessBlock&&u(e.currentProcessBlock),e.currentAgentDiv instanceof HTMLElement&&u(e.currentAgentDiv),D(),c(),e.currentAgentDiv=null,e.currentProcessBlock=null,q=null}var W=0;function me(){W=Date.now()}function he(){W=0}function ge(){return Date.now()-W<8e3}function G(e){for(let t of document.querySelectorAll(`.msg-user`))if(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING)return!0;return!1}function K(){let t=e.currentAgentDiv&&e.currentAgentDiv.isConnected?e.currentAgentDiv:null;return t?G(t)?(e.currentAgentDiv=null,e.currentProcessBlock=null,q=null,null):t:null}function _e(){let e=Array.from(document.querySelectorAll(`.msg-agent`)).at(-1)??null;return!e||G(e)?null:e}function ve(t,n){k();let r=K();if(r||(r=w(`agent`,``),e.currentAgentDiv=r,e.currentProcessBlock=null),M(r),!e.currentProcessBlock){let t=r.querySelector(`.agent-body`);t&&(e.currentProcessBlock=C(r)),!e.currentProcessBlock&&t&&(T(r),e.currentProcessBlock=p(t))}if(n&&e.currentProcessBlock&&!e.currentProcessBlock.startedAt&&(e.currentProcessBlock.startedAt=n),e.currentProcessBlock){let n=t.rawIcon||t.icon,r=t.status||s(t.icon)||`running`;if(r===`done`||r===`error`){let i=fe(e.currentProcessBlock.steps,t);if(i){t.icon=o(t.icon);let a=t.type===`thinking`?h(i.id,t.detail):y(i.id,t.detail);f(e.currentProcessBlock,i.id,{...i,...t,id:i.id,rawIcon:n,detail:a,detailPreview:a,label:t.label||i.label,status:r,startTime:i.startTime}),g();return}if(t.stepRef&&(r===`done`||r===`error`)){let i=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&(e.status===`done`||e.status===`error`));if(i){t.icon=o(t.icon);let a=t.type===`thinking`?h(i.id,t.detail):y(i.id,t.detail);f(e.currentProcessBlock,i.id,{...i,...t,id:i.id,rawIcon:n,status:r,detail:a,detailPreview:a,startTime:i.startTime}),g();return}}}if(t.stepRef&&r===`running`){let r=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&e.status===`running`);if(r){t.rawIcon=n,t.icon=o(t.icon);let i=h(r.id,t.detail);f(e.currentProcessBlock,r.id,{...r,...t,id:r.id,rawIcon:n,status:`running`,detail:i,detailPreview:i,label:t.label||r.label,startTime:r.startTime}),g();return}}let i=U(e.currentProcessBlock.steps,t,{includeDone:!0});if(i){t.rawIcon=n,t.icon=o(t.icon);let a=t.detail||``,s=l(i.id)||i.detail||i.detailPreview||``,c=a.length>=s.length?a:s,u=h(i.id,c),d=(i.status===`done`||i.status===`error`)&&r===`running`?i.status:r;f(e.currentProcessBlock,i.id,{...i,...t,id:i.id,rawIcon:n,status:d,detail:u,detailPreview:u,label:t.label||i.label,startTime:i.startTime}),g();return}if(t.detail){let n=[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee&&!e.detail);if(n){f(e.currentProcessBlock,n.id,t),g();return}}t.rawIcon=n,t.icon=o(t.icon),v(e.currentProcessBlock,t)}g()}var q=null,J=`data-active-run-hydrated`;function Y(e){document.querySelectorAll(`[${J}="true"]`).forEach(t=>{e&&t===e||t.remove()})}function ye(e){let t=K()??_e();Y(t);let n=t||w(`agent`,``,e||null);return n.setAttribute(J,`true`),n}function be(e,t){let n=l(e.id)||e.detail||e.detailPreview||``,r=t.detail||t.detailPreview||``;return r.length>=n.length?r:n}function X(e){return e.stepRef?!0:!!e.traceRunId&&typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function xe(e,t){let n=e.steps.filter(e=>!X(e)),r=0,i=!0;for(let a of t){let t=e.steps.find(e=>H(e,a))??null;if(!t&&!X(a)&&i){let e=n[r]??null;e?e.type===a.type&&!!e.isEmployee==!!a.isEmployee?(t=e,r++):i=!1:r++}if(!t){let n=e.steps.filter(e=>e.label===a.label&&e.type===a.type&&!!e.isEmployee==!!a.isEmployee);t=n.length===1?n[0]:null}if(!t){if(v(e,a),!X(a)&&i){let t=e.steps[e.steps.length-1];t&&n.push(t)}continue}let o=h(t.id,be(t,a));f(e,t.id,{...t,...a,id:t.id,detail:o,detailPreview:o,label:a.label||t.label})}}function Se(e=[]){document.querySelectorAll(`[data-queued-overlay="true"]`).forEach(e=>e.remove())}var Z=``;function Ce(e){let t=Array.isArray(e.toolLog)?e.toolLog:[],n=t.map(e=>`${e.stepRef||``}~${e.traceRunId||``}~${e.traceSeq??``}~${e.status||``}~${e.label||``}~${(e.detail||``).length}`).join(`|`);return`${e.traceRunId||``}:${e.cli||``}:${(e.text||``).length}:${t.length}:${n}`}function we(t){if(!t?.running){Z=``,Y();return}let n=Ce(t);if(n===Z&&K())return;D(),k(),e.currentAgentDiv=ye(t.cli||null);let r=e.currentAgentDiv.querySelector(`.agent-body`),i=N(t.toolLog||[]);M(e.currentAgentDiv),e.currentProcessBlock=C(e.currentAgentDiv),r&&i.length?(e.currentProcessBlock||(T(e.currentAgentDiv),e.currentProcessBlock=p(r)),t.startedAt&&(e.currentProcessBlock.startedAt=t.startedAt),xe(e.currentProcessBlock,O(i,t.startedAt))):e.currentProcessBlock=C(e.currentAgentDiv);let a=e.currentAgentDiv.querySelector(`.msg-content`);a&&(q=ue(a,t.text||``)),Z=n}function Q(t){if(!t)return;k(),K()||(e.currentAgentDiv=w(`agent`,``),q=null);let n=e.currentAgentDiv?.querySelector(`.msg-content`);n&&(q||=I(n),R(q,t)),g()}var $=0;function Te(e){e.querySelectorAll(`.mermaid-pending`).forEach(e=>{delete e.dataset.mermaidQueued,delete e.dataset.mermaidQueuedAt})}function Ee(e,t){let o=e.querySelector(`.msg-content`);if(!o)return;let s=i(t);(o.getAttribute(`data-raw`)!==s||!s&&o.childNodes.length!==0)&&(r(o),o.innerHTML=s?a(t):``,o.setAttribute(`data-raw`,s),o.classList.remove(`lazy-pending`),_(o),n(o,{immediate:!0}))}function De(t,r,o,s,c,l){let f=o===`present`||o===`absent`,p=Date.now();if(!e.currentAgentDiv&&p-$<500)return;Z=``,D(),k(),e.currentAgentDiv&&M(e.currentAgentDiv);let h=A(e.currentProcessBlock??e.currentAgentDiv,!0),g=N(re(Array.isArray(r)?r:[],h)),v=x(g),y=!!e.currentProcessBlock||!!(e.currentAgentDiv&&E(e.currentAgentDiv));e.currentProcessBlock&&(b(e.currentProcessBlock),e.currentProcessBlock=null);let C=g.length>0;if(t||C||f){(!e.currentAgentDiv||!e.currentAgentDiv.isConnected)&&(e.currentAgentDiv=w(`agent`,``));let r=!!(e.currentAgentDiv.dataset.activityKey||e.currentAgentDiv.dataset.activityAnswerPending||s&&l&&e.currentAgentDiv.dataset.traceRunId===s&&e.currentAgentDiv.dataset.messageSessionId===l);s&&(e.currentAgentDiv.dataset.traceRunId=s),delete e.currentAgentDiv.dataset.activityRecovering,e.currentAgentDiv.removeAttribute(J);let o=e.currentAgentDiv?.querySelector(`.msg-content`),p=q?z(q,!0):``,h=f?t??``:t||p;if(q=null,o&&(o.innerHTML=f&&!h?``:a(h)),C&&e.currentAgentDiv&&!y&&!E(e.currentAgentDiv)){let t=e.currentAgentDiv.querySelector(`.msg-content`);t&&t.insertAdjacentHTML(`beforebegin`,m(O(g),!0))}e.currentAgentDiv&&M(e.currentAgentDiv),o&&o.setAttribute(`data-raw`,i(h)),o&&_(o);let b=ee(),x=!!(b.active&&e.currentAgentDiv&&e.currentAgentDiv.isConnected);if(o&&!x&&n(o,{immediate:!0}),x){let t=e.currentAgentDiv;Te(t),t.querySelectorAll(`.diagram-widget`).forEach(e=>{let t=e,n=t.dataset.widgetHtml,r=t.dataset.widgetId;if(!n&&!r)return;let i=document.createElement(`div`);i.className=`diagram-widget-pending`,r?i.dataset.widgetId=r:n&&(i.dataset.diagramHtml=n),e.replaceWith(i)}),v&&!r?(b.onLazyRender||oe(b),b.appendItem(te({role:`assistant`,content:h,cli:null,tool_log:v,trace_run_id:t.dataset.traceRunId??null},b.count)),u(t),b.scrollToBottom()):(t.dataset.turnIndex=String(b.count),t.dataset.messageId||(t.dataset.messageId=d()),r&&ae(b),b.appendLiveItem(t)),t.remove()}(h||s&&r)&&se({role:`assistant`,content:h,tool_log:v,trace_run_id:e.currentAgentDiv?.dataset.traceRunId??null,timestamp:Date.now(),...c===void 0?{}:{scope:c},...l===void 0?{}:{session_id:l}}).catch(()=>{})}q=null,e.currentAgentDiv=null,$=Date.now(),S(`idle`),ne()}function Oe(e,n){document.querySelectorAll(`.tab-btn`).forEach(e=>{e.classList.remove(`active`),e.setAttribute(`aria-selected`,`false`)}),document.querySelectorAll(`.tab-content`).forEach(e=>e.classList.remove(`active`)),document.getElementById({agents:`tabAgents`,settings:`tabSettings`,skills:`tabSkills`}[e])?.classList.add(`active`),n&&(n.classList.add(`active`),n.setAttribute(`aria-selected`,`true`)),e===`agents`&&t(()=>import(`./employees-BQaJNp-u.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0])),e===`skills`&&t(()=>import(`./skills-Co7Mr-qP.js`).then(e=>e.loadSkills()),__vite__mapDeps([0]))}function ke(){document.getElementById(`tabSettings`)?.classList.contains(`active`)||t(()=>import(`./settings-WVGhtneN.js`).then(e=>e.updateSettings()),__vite__mapDeps([0]))}function Ae(){j({onStatus:ie})}export{De as a,Ae as c,Ee as d,ve as f,he as i,ge as l,Se as n,ke as o,Oe as p,pe as r,we as s,Q as t,me as u};
2
+ import{t as e}from"./state-Dl-xxPoS.js";import{t}from"./preload-helper-CfbQpVni.js";import{E as n,T as r,k as i,t as a}from"./render-DfYro-fG.js";import{a as o,n as s}from"./icons-CVkqyECl.js";import{A as c,C as l,D as u,N as d,O as f,S as p,_ as ee,b as m,k as h,m as g,t as _,v,w as y,x as b}from"./iframe-renderer-DmHYOI1A.js";import{B as x,F as S,G as C,H as w,J as T,K as E,L as te,P as ne,Q as D,R as re,U as ie,V as O,W as k,Y as A,Z as j,a as ae,l as oe,q as M,z as N}from"./message-history-DcjBuubA.js";import{c as se}from"./idb-cache-BRpjf_a8.js";var P=2e3,F=80,ce=400;function le(e){if(e<=P)return F;let t=e/P*F;return Math.min(ce,Math.round(t))}function I(e){return{chunks:[],fullText:``,textDirty:!1,element:e,pendingRAF:null,isFinalized:!1,lastRenderTime:0}}function ue(e,t=``){let n=I(e);return t?(n.chunks=[t],n.fullText=t,n.textDirty=!1,n.element.innerHTML=a(t,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`):n.element.innerHTML=`<span class="stream-cursor" aria-hidden="true"></span>`,n}function L(e){return e.textDirty&&=(e.fullText=e.chunks.join(``),!1),e.fullText}function R(e,t){e.chunks.push(t),e.textDirty=!0,!e.pendingRAF&&!e.isFinalized&&(e.pendingRAF=requestAnimationFrame(()=>{if(e.pendingRAF=null,e.isFinalized)return;let t=performance.now(),n=L(e);n.length<P||t-e.lastRenderTime>le(n.length)?(e.element.innerHTML=a(n,!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=t):e.pendingRAF=requestAnimationFrame(()=>{e.pendingRAF=null,!e.isFinalized&&(e.element.innerHTML=a(L(e),!0)+`<span class="stream-cursor" aria-hidden="true"></span>`,e.lastRenderTime=performance.now())})}))}function z(e,t=!1){e.isFinalized=!0,e.pendingRAF&&=(cancelAnimationFrame(e.pendingRAF),null);let n=L(e);return t||(e.element.innerHTML=a(n)),n}function B(e){return typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function V(e,t){return!!t.traceRunId&&!!e.traceRunId&&t.traceRunId===e.traceRunId&&B(t)&&B(e)&&t.traceSeq===e.traceSeq&&t.type===e.type&&t.label===e.label&&!!t.isEmployee==!!e.isEmployee}function H(e,t){return t.stepRef&&e.stepRef===t.stepRef?!0:V(e,t)}function U(e,t,n={}){return[...e].reverse().filter(e=>n.includeDone||e.status===`running`).find(e=>H(e,t))??null}function de(e,t){let n=e.filter(e=>e.status===`running`&&!e.stepRef&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee);return n.length===1?n[0]:null}function fe(e,t){let n=[...e].reverse().filter(e=>e.status===`running`);return U(n,t)||de(n,t)}function pe(){e.currentProcessBlock&&u(e.currentProcessBlock),e.currentAgentDiv instanceof HTMLElement&&u(e.currentAgentDiv),D(),c(),e.currentAgentDiv=null,e.currentProcessBlock=null,q=null}var W=0;function me(){W=Date.now()}function he(){W=0}function ge(){return Date.now()-W<8e3}function G(e){for(let t of document.querySelectorAll(`.msg-user`))if(e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING)return!0;return!1}function K(){let t=e.currentAgentDiv&&e.currentAgentDiv.isConnected?e.currentAgentDiv:null;return t?G(t)?(e.currentAgentDiv=null,e.currentProcessBlock=null,q=null,null):t:null}function _e(){let e=Array.from(document.querySelectorAll(`.msg-agent`)).at(-1)??null;return!e||G(e)?null:e}function ve(t,n){k();let r=K();if(r||(r=w(`agent`,``),e.currentAgentDiv=r,e.currentProcessBlock=null),M(r),!e.currentProcessBlock){let t=r.querySelector(`.agent-body`);t&&(e.currentProcessBlock=C(r)),!e.currentProcessBlock&&t&&(T(r),e.currentProcessBlock=p(t))}if(n&&e.currentProcessBlock&&!e.currentProcessBlock.startedAt&&(e.currentProcessBlock.startedAt=n),e.currentProcessBlock){let n=t.rawIcon||t.icon,r=t.status||s(t.icon)||`running`;if(r===`done`||r===`error`){let i=fe(e.currentProcessBlock.steps,t);if(i){t.icon=o(t.icon);let a=t.type===`thinking`?h(i.id,t.detail):y(i.id,t.detail);f(e.currentProcessBlock,i.id,{...i,...t,id:i.id,rawIcon:n,detail:a,detailPreview:a,label:t.label||i.label,status:r,startTime:i.startTime}),g();return}if(t.stepRef&&(r===`done`||r===`error`)){let i=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&(e.status===`done`||e.status===`error`));if(i){t.icon=o(t.icon);let a=t.type===`thinking`?h(i.id,t.detail):y(i.id,t.detail);f(e.currentProcessBlock,i.id,{...i,...t,id:i.id,rawIcon:n,status:r,detail:a,detailPreview:a,startTime:i.startTime}),g();return}}}if(t.stepRef&&r===`running`){let r=[...e.currentProcessBlock.steps].reverse().find(e=>e.stepRef===t.stepRef&&e.status===`running`);if(r){t.rawIcon=n,t.icon=o(t.icon);let i=h(r.id,t.detail);f(e.currentProcessBlock,r.id,{...r,...t,id:r.id,rawIcon:n,status:`running`,detail:i,detailPreview:i,label:t.label||r.label,startTime:r.startTime}),g();return}}let i=U(e.currentProcessBlock.steps,t,{includeDone:!0});if(i){t.rawIcon=n,t.icon=o(t.icon);let a=t.detail||``,s=l(i.id)||i.detail||i.detailPreview||``,c=a.length>=s.length?a:s,u=h(i.id,c),d=(i.status===`done`||i.status===`error`)&&r===`running`?i.status:r;f(e.currentProcessBlock,i.id,{...i,...t,id:i.id,rawIcon:n,status:d,detail:u,detailPreview:u,label:t.label||i.label,startTime:i.startTime}),g();return}if(t.detail){let n=[...e.currentProcessBlock.steps].reverse().find(e=>e.status===`running`&&e.label===t.label&&e.type===t.type&&!!e.isEmployee==!!t.isEmployee&&!e.detail);if(n){f(e.currentProcessBlock,n.id,t),g();return}}t.rawIcon=n,t.icon=o(t.icon),v(e.currentProcessBlock,t)}g()}var q=null,J=`data-active-run-hydrated`;function Y(e){document.querySelectorAll(`[${J}="true"]`).forEach(t=>{e&&t===e||t.remove()})}function ye(e){let t=K()??_e();Y(t);let n=t||w(`agent`,``,e||null);return n.setAttribute(J,`true`),n}function be(e,t){let n=l(e.id)||e.detail||e.detailPreview||``,r=t.detail||t.detailPreview||``;return r.length>=n.length?r:n}function X(e){return e.stepRef?!0:!!e.traceRunId&&typeof e.traceSeq==`number`&&Number.isFinite(e.traceSeq)&&e.traceSeq>0}function xe(e,t){let n=e.steps.filter(e=>!X(e)),r=0,i=!0;for(let a of t){let t=e.steps.find(e=>H(e,a))??null;if(!t&&!X(a)&&i){let e=n[r]??null;e?e.type===a.type&&!!e.isEmployee==!!a.isEmployee?(t=e,r++):i=!1:r++}if(!t){let n=e.steps.filter(e=>e.label===a.label&&e.type===a.type&&!!e.isEmployee==!!a.isEmployee);t=n.length===1?n[0]:null}if(!t){if(v(e,a),!X(a)&&i){let t=e.steps[e.steps.length-1];t&&n.push(t)}continue}let o=h(t.id,be(t,a));f(e,t.id,{...t,...a,id:t.id,detail:o,detailPreview:o,label:a.label||t.label})}}function Se(e=[]){document.querySelectorAll(`[data-queued-overlay="true"]`).forEach(e=>e.remove())}var Z=``;function Ce(e){let t=Array.isArray(e.toolLog)?e.toolLog:[],n=t.map(e=>`${e.stepRef||``}~${e.traceRunId||``}~${e.traceSeq??``}~${e.status||``}~${e.label||``}~${(e.detail||``).length}`).join(`|`);return`${e.traceRunId||``}:${e.cli||``}:${(e.text||``).length}:${t.length}:${n}`}function we(t){if(!t?.running){Z=``,Y();return}let n=Ce(t);if(n===Z&&K())return;D(),k(),e.currentAgentDiv=ye(t.cli||null);let r=e.currentAgentDiv.querySelector(`.agent-body`),i=N(t.toolLog||[]);M(e.currentAgentDiv),e.currentProcessBlock=C(e.currentAgentDiv),r&&i.length?(e.currentProcessBlock||(T(e.currentAgentDiv),e.currentProcessBlock=p(r)),t.startedAt&&(e.currentProcessBlock.startedAt=t.startedAt),xe(e.currentProcessBlock,O(i,t.startedAt))):e.currentProcessBlock=C(e.currentAgentDiv);let a=e.currentAgentDiv.querySelector(`.msg-content`);a&&(q=ue(a,t.text||``)),Z=n}function Q(t){if(!t)return;k(),K()||(e.currentAgentDiv=w(`agent`,``),q=null);let n=e.currentAgentDiv?.querySelector(`.msg-content`);n&&(q||=I(n),R(q,t)),g()}var $=0;function Te(e){e.querySelectorAll(`.mermaid-pending`).forEach(e=>{delete e.dataset.mermaidQueued,delete e.dataset.mermaidQueuedAt})}function Ee(e,t){let o=e.querySelector(`.msg-content`);if(!o)return;let s=i(t);(o.getAttribute(`data-raw`)!==s||!s&&o.childNodes.length!==0)&&(r(o),o.innerHTML=s?a(t):``,o.setAttribute(`data-raw`,s),o.classList.remove(`lazy-pending`),_(o),n(o,{immediate:!0}))}function De(t,r,o,s,c,l){let f=o===`present`||o===`absent`,p=Date.now();if(!e.currentAgentDiv&&p-$<500)return;Z=``,D(),k(),e.currentAgentDiv&&M(e.currentAgentDiv);let h=A(e.currentProcessBlock??e.currentAgentDiv,!0),g=N(re(Array.isArray(r)?r:[],h)),v=x(g),y=!!e.currentProcessBlock||!!(e.currentAgentDiv&&E(e.currentAgentDiv));e.currentProcessBlock&&(b(e.currentProcessBlock),e.currentProcessBlock=null);let C=g.length>0;if(t||C||f){(!e.currentAgentDiv||!e.currentAgentDiv.isConnected)&&(e.currentAgentDiv=w(`agent`,``));let r=!!(e.currentAgentDiv.dataset.activityKey||e.currentAgentDiv.dataset.activityAnswerPending||s&&l&&e.currentAgentDiv.dataset.traceRunId===s&&e.currentAgentDiv.dataset.messageSessionId===l);s&&(e.currentAgentDiv.dataset.traceRunId=s),delete e.currentAgentDiv.dataset.activityRecovering,e.currentAgentDiv.removeAttribute(J);let o=e.currentAgentDiv?.querySelector(`.msg-content`),p=q?z(q,!0):``,h=f?t??``:t||p;if(q=null,o&&(o.innerHTML=f&&!h?``:a(h)),C&&e.currentAgentDiv&&!y&&!E(e.currentAgentDiv)){let t=e.currentAgentDiv.querySelector(`.msg-content`);t&&t.insertAdjacentHTML(`beforebegin`,m(O(g),!0))}e.currentAgentDiv&&M(e.currentAgentDiv),o&&o.setAttribute(`data-raw`,i(h)),o&&_(o);let b=ee(),x=!!(b.active&&e.currentAgentDiv&&e.currentAgentDiv.isConnected);if(o&&!x&&n(o,{immediate:!0}),x){let t=e.currentAgentDiv;Te(t),t.querySelectorAll(`.diagram-widget`).forEach(e=>{let t=e,n=t.dataset.widgetHtml,r=t.dataset.widgetId;if(!n&&!r)return;let i=document.createElement(`div`);i.className=`diagram-widget-pending`,r?i.dataset.widgetId=r:n&&(i.dataset.diagramHtml=n),e.replaceWith(i)}),v&&!r?(b.onLazyRender||oe(b),b.appendItem(te({role:`assistant`,content:h,cli:null,tool_log:v,trace_run_id:t.dataset.traceRunId??null},b.count)),u(t),b.scrollToBottom()):(t.dataset.turnIndex=String(b.count),t.dataset.messageId||(t.dataset.messageId=d()),r&&ae(b),b.appendLiveItem(t)),t.remove()}(h||s&&r)&&se({role:`assistant`,content:h,tool_log:v,trace_run_id:e.currentAgentDiv?.dataset.traceRunId??null,timestamp:Date.now(),...c===void 0?{}:{scope:c},...l===void 0?{}:{session_id:l}}).catch(()=>{})}q=null,e.currentAgentDiv=null,$=Date.now(),S(`idle`),ne()}function Oe(e,n){document.querySelectorAll(`.tab-btn`).forEach(e=>{e.classList.remove(`active`),e.setAttribute(`aria-selected`,`false`)}),document.querySelectorAll(`.tab-content`).forEach(e=>e.classList.remove(`active`)),document.getElementById({agents:`tabAgents`,settings:`tabSettings`,skills:`tabSkills`}[e])?.classList.add(`active`),n&&(n.classList.add(`active`),n.setAttribute(`aria-selected`,`true`)),e===`agents`&&t(()=>import(`./employees-CsvI0_5V.js`).then(e=>e.loadEmployees()),__vite__mapDeps([0])),e===`skills`&&t(()=>import(`./skills-DeNVAVgt.js`).then(e=>e.loadSkills()),__vite__mapDeps([0]))}function ke(){document.getElementById(`tabSettings`)?.classList.contains(`active`)||t(()=>import(`./settings-DgAlohx9.js`).then(e=>e.updateSettings()),__vite__mapDeps([0]))}function Ae(){j({onStatus:ie})}export{De as a,Ae as c,Ee as d,ve as f,he as i,ge as l,Se as n,ke as o,Oe as p,pe as r,we as s,Q as t,me as u};
@@ -10,11 +10,17 @@
10
10
  localStorage.setItem('jaw.uiTheme', localStorage.getItem('theme'));
11
11
  localStorage.removeItem('theme');
12
12
  }
13
- var q = new URLSearchParams(location.search).get('jawTheme');
13
+ var params = new URLSearchParams(location.search);
14
+ var q = params.get('jawTheme');
14
15
  var raw = (q === 'dark' || q === 'light') ? q : localStorage.getItem('jaw.uiTheme');
15
16
  var t = (raw === 'dark' || raw === 'light') ? raw :
16
17
  (matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');
17
18
  document.documentElement.setAttribute('data-theme', t);
19
+ // The desktop shell's preload can't mark this document when it loads in
20
+ // a cross-origin iframe, so the manager passes the flag on the URL.
21
+ if (params.get('jawDesktop') === '1') {
22
+ document.documentElement.setAttribute('data-cli-jaw-desktop', 'true');
23
+ }
18
24
  })();
19
25
  </script>
20
26
  <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
@@ -31,9 +37,9 @@
31
37
  href="https://fonts.googleapis.com/css2?family=Chakra+Petch:wght@400;500;600;700&family=Outfit:wght@400;500;600;700&display=swap"
32
38
  rel="stylesheet">
33
39
  <!-- Vite handles module bundling in dev (HMR) and production (build) -->
34
- <script type="module" crossorigin src="/dist/assets/app-ByMfeXp-.js"></script>
40
+ <script type="module" crossorigin src="/dist/assets/app-CZwx0V6K.js"></script>
35
41
  <link rel="stylesheet" crossorigin href="/dist/assets/vendor-render-DSSkXCir.css">
36
- <link rel="stylesheet" crossorigin href="/dist/assets/app-DAJWqs33.css">
42
+ <link rel="stylesheet" crossorigin href="/dist/assets/app-BjKzqXCv.css">
37
43
  </head>
38
44
 
39
45
  <body>
@@ -246,6 +252,8 @@
246
252
  <div class="chat-input-area">
247
253
  <div id="cmdDropdown" class="cmd-dropdown" role="listbox" data-i18n-aria="aria.cmdList" aria-label="커맨드 목록"
248
254
  style="display:none"></div>
255
+ <div id="skillMentionDropdown" class="cmd-dropdown" role="listbox" data-i18n-aria="aria.skillMentionList"
256
+ aria-label="스킬 목록" style="display:none"></div>
249
257
  <button class="btn-attach" data-i18n-title="btn.attach" title="파일 첨부"><span data-icon="paperclip"></span></button>
250
258
  <input type="file" id="fileInput" hidden multiple>
251
259
  <button class="btn-voice" id="btnVoice" aria-describedby="voiceShortcutHint" data-i18n-title="voice.start" title="음성 녹음"><span data-icon="mic"></span></button>
@@ -6,10 +6,10 @@
6
6
  <link rel="icon" type="image/png" href="/dist/assets/icon-192-CADbZUeU.png">
7
7
  <title>Jaw Manager</title>
8
8
  <script src="/manager/theme-boot.js"></script>
9
- <script type="module" crossorigin src="/dist/assets/manager-Bi_xw7TW.js"></script>
9
+ <script type="module" crossorigin src="/dist/assets/manager-CCXm5Yfe.js"></script>
10
10
  <link rel="stylesheet" crossorigin href="/dist/assets/vendor-render-DSSkXCir.css">
11
- <link rel="stylesheet" crossorigin href="/dist/assets/settings-embedding-DhEdT86W.css">
12
- <link rel="stylesheet" crossorigin href="/dist/assets/manager-BnQHAKk6.css">
11
+ <link rel="stylesheet" crossorigin href="/dist/assets/settings-embedding-CUQ8Is3y.css">
12
+ <link rel="stylesheet" crossorigin href="/dist/assets/manager-D9rhKFKc.css">
13
13
  </head>
14
14
  <body>
15
15
  <div id="manager-root"></div>
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
6
  <title>Settings</title>
7
7
  <script src="/manager/theme-boot.js"></script>
8
- <script type="module" crossorigin src="/dist/assets/settings-W4KG9ivu.js"></script>
9
- <link rel="stylesheet" crossorigin href="/dist/assets/settings-embedding-DhEdT86W.css">
8
+ <script type="module" crossorigin src="/dist/assets/settings-DMiQe469.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/dist/assets/settings-embedding-CUQ8Is3y.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="settings-root"></div>
package/public/index.html CHANGED
@@ -10,11 +10,17 @@
10
10
  localStorage.setItem('jaw.uiTheme', localStorage.getItem('theme'));
11
11
  localStorage.removeItem('theme');
12
12
  }
13
- var q = new URLSearchParams(location.search).get('jawTheme');
13
+ var params = new URLSearchParams(location.search);
14
+ var q = params.get('jawTheme');
14
15
  var raw = (q === 'dark' || q === 'light') ? q : localStorage.getItem('jaw.uiTheme');
15
16
  var t = (raw === 'dark' || raw === 'light') ? raw :
16
17
  (matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');
17
18
  document.documentElement.setAttribute('data-theme', t);
19
+ // The desktop shell's preload can't mark this document when it loads in
20
+ // a cross-origin iframe, so the manager passes the flag on the URL.
21
+ if (params.get('jawDesktop') === '1') {
22
+ document.documentElement.setAttribute('data-cli-jaw-desktop', 'true');
23
+ }
18
24
  })();
19
25
  </script>
20
26
  <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover">
@@ -258,6 +264,8 @@
258
264
  <div class="chat-input-area">
259
265
  <div id="cmdDropdown" class="cmd-dropdown" role="listbox" data-i18n-aria="aria.cmdList" aria-label="커맨드 목록"
260
266
  style="display:none"></div>
267
+ <div id="skillMentionDropdown" class="cmd-dropdown" role="listbox" data-i18n-aria="aria.skillMentionList"
268
+ aria-label="스킬 목록" style="display:none"></div>
261
269
  <button class="btn-attach" data-i18n-title="btn.attach" title="파일 첨부"><span data-icon="paperclip"></span></button>
262
270
  <input type="file" id="fileInput" hidden multiple>
263
271
  <button class="btn-voice" id="btnVoice" aria-describedby="voiceShortcutHint" data-i18n-title="voice.start" title="음성 녹음"><span data-icon="mic"></span></button>
@@ -19,7 +19,7 @@ interface Callbacks {
19
19
  }
20
20
  type Host = {
21
21
  message: HTMLElement; runId: string; cacheScope: string; controller: AbortController;
22
- box: HTMLElement; status: HTMLElement; retry: HTMLButtonElement;
22
+ box: HTMLElement; status: HTMLElement; live: HTMLElement; retry: HTMLButtonElement;
23
23
  pending: boolean; loaded: boolean; promise: Promise<void> | null; resolve: (() => void) | null;
24
24
  };
25
25
  const SELECTOR = '.msg-agent[data-trace-run-id]';
@@ -65,15 +65,31 @@ function finishPromise(host: Host): void {
65
65
  host.retry.disabled = false;
66
66
  host.pending = false; host.resolve?.(); host.resolve = null; host.promise = null;
67
67
  }
68
+ /** Status and retry never stand alone in the message flow: they live inside the
69
+ mounted Activity disclosure when one exists, otherwise inside this host's own
70
+ collapsed details so the text only appears once expanded. */
71
+ function present(host: Host): void {
72
+ const disclosure = host.message.querySelector<HTMLElement>('.activity-disclosure');
73
+ if (disclosure) {
74
+ if (host.status.parentElement !== disclosure) {
75
+ const footer = disclosure.querySelector('.activity-footer');
76
+ if (footer) footer.before(host.status, host.retry); else disclosure.append(host.status, host.retry);
77
+ }
78
+ } else if (host.status.parentElement !== host.box) host.box.append(host.status, host.retry);
79
+ host.status.hidden = !host.status.textContent;
80
+ if (host.live.textContent !== host.status.textContent) host.live.textContent = host.status.textContent;
81
+ host.box.hidden = !!disclosure || (!host.status.textContent && host.retry.hidden);
82
+ }
68
83
  function cancel(host: Host, remove: boolean): void {
69
84
  host.controller.abort();
70
85
  if (remove) observer?.unobserve(host.message);
71
86
  else {
72
87
  host.status.textContent = 'Activity read cancelled. Retry to inspect.';
73
- host.retry.textContent = 'Retry activity'; host.retry.hidden = false; host.box.hidden = false;
88
+ host.retry.textContent = 'Retry activity'; host.retry.hidden = false;
89
+ present(host);
74
90
  }
75
91
  if (queued.delete(host.message)) finishPromise(host);
76
- if (remove) { hosts.delete(host.message); host.box.remove(); }
92
+ if (remove) { hosts.delete(host.message); host.status.remove(); host.retry.remove(); host.live.remove(); host.box.remove(); }
77
93
  }
78
94
  function prune(): void {
79
95
  for (const host of hosts.values()) if (!host.message.isConnected) cancel(host, true);
@@ -82,7 +98,7 @@ function prune(): void {
82
98
 
83
99
  function entry(message: HTMLElement, runId: string): Host | null {
84
100
  const previous = hosts.get(message);
85
- if (previous?.runId === runId) return previous;
101
+ if (previous?.runId === runId) { present(previous); return previous; }
86
102
  if (previous) cancel(previous, true);
87
103
  prune();
88
104
  if (hosts.size >= MAX_HOSTS) {
@@ -94,13 +110,20 @@ function entry(message: HTMLElement, runId: string): Host | null {
94
110
  }
95
111
  return null;
96
112
  }
97
- message.querySelector('.activity-read-control')?.remove();
98
- const box = document.createElement('div'); box.className = 'activity-read-control';
99
- const status = document.createElement('p'); status.setAttribute('role', 'status');
100
- const retry = document.createElement('button'); retry.type = 'button'; retry.textContent = 'Load activity';
101
- box.append(status, retry); message.querySelector('.agent-body')?.prepend(box);
113
+ message.querySelectorAll('.activity-read-control, .activity-read-status, .activity-read-live, .activity-read-retry')
114
+ .forEach(node => node.remove());
115
+ const box = document.createElement('details'); box.className = 'activity-read-control';
116
+ const summary = document.createElement('summary'); summary.className = 'activity-read-summary';
117
+ summary.textContent = 'Activity status';
118
+ const status = document.createElement('p'); status.className = 'activity-read-status';
119
+ status.hidden = true;
120
+ const live = document.createElement('p'); live.className = 'activity-read-live';
121
+ live.setAttribute('role', 'status');
122
+ const retry = document.createElement('button'); retry.className = 'activity-read-retry';
123
+ retry.type = 'button'; retry.textContent = 'Load activity';
124
+ box.append(summary, status, retry); message.querySelector('.agent-body')?.prepend(live, box);
102
125
  const host: Host = { message, runId, cacheScope: getMessageScope(), controller: new AbortController(),
103
- box, status, retry, pending: false, loaded: false, promise: null, resolve: null };
126
+ box, status, live, retry, pending: false, loaded: false, promise: null, resolve: null };
104
127
  retry.onclick = () => { void hydrateActivityHost(message, runId, true); };
105
128
  hosts.set(message, host); if (mode()) traceAllowed(message, false);
106
129
  return host;
@@ -110,8 +133,9 @@ function entry(message: HTMLElement, runId: string): Host | null {
110
133
  export function markActivityHistoryUnavailable(message: HTMLElement): void {
111
134
  if (!identity || !owns(message, message.dataset['traceRunId'] ?? '', identity.sessionId)) return;
112
135
  const host = entry(message, message.dataset['traceRunId']!); if (!host) return;
113
- host.loaded = false; host.box.hidden = false; host.retry.hidden = false;
136
+ host.loaded = false; host.retry.hidden = false;
114
137
  host.status.textContent = 'Activity preview is no longer retained in memory. Load it again to inspect.';
138
+ present(host);
115
139
  }
116
140
 
117
141
  function combine(seed: ActivityRunReadResult, tail: ActivityRunReadResult): RuntimeEvent[] {
@@ -193,14 +217,17 @@ async function execute(host: Host): Promise<void> {
193
217
  : '';
194
218
  host.retry.textContent = 'Refresh activity';
195
219
  host.retry.hidden = !incomplete && !noActivity && !answerError && status !== 'running' && answer.kind === 'saved';
196
- host.box.hidden = host.retry.hidden;
197
- if (hadFocus && host.box.hidden) host.message.querySelector<HTMLElement>('.activity-summary')?.focus({ preventScroll: true });
220
+ present(host);
221
+ if (hadFocus && ((!host.status.textContent && host.retry.hidden)
222
+ || !!host.retry.closest('details:not([open])'))) {
223
+ host.message.querySelector<HTMLElement>('.activity-summary')?.focus({ preventScroll: true });
224
+ }
198
225
  } catch (error) {
199
226
  if (hosts.get(host.message) !== host || generation !== epoch || path !== locationKey()) return;
200
227
  if (host.controller.signal.aborted && host.controller.signal.reason?.name !== 'TimeoutError') return;
201
228
  host.status.textContent = error instanceof ActivityReadError ? error.message
202
229
  : 'Activity could not be restored. The transcript is unchanged; retry to inspect it.';
203
- host.retry.hidden = false; host.box.hidden = false; host.retry.textContent = 'Retry activity';
230
+ host.retry.hidden = false; host.retry.textContent = 'Retry activity'; present(host);
204
231
  if (error instanceof ActivityReadError && error.status === 404) {
205
232
  try {
206
233
  await readActivityHttp(`/api/traces/${encodeURIComponent(host.runId)}?${new URLSearchParams({ session: captured.sessionId })}`,
@@ -208,7 +235,7 @@ async function execute(host: Host): Promise<void> {
208
235
  if (current(host, captured, epoch, path)) {
209
236
  traceAllowed(host.message, true);
210
237
  host.status.textContent = 'Detailed Activity was not recorded for this turn. The saved transcript is shown.';
211
- host.retry.hidden = true;
238
+ host.retry.hidden = true; present(host);
212
239
  }
213
240
  } catch { /* A copied/foreign/expired pointer does not gain raw authority. */ }
214
241
  }
@@ -228,7 +255,7 @@ function pump(): void {
228
255
  if (!host.message.isConnected || host.controller.signal.aborted || hosts.get(host.message) !== host) {
229
256
  finishPromise(host); queueMicrotask(pump); return;
230
257
  }
231
- active = host; host.status.textContent = 'Loading recorded activity.';
258
+ active = host; host.status.textContent = 'Loading recorded activity.'; present(host);
232
259
  void execute(host).catch(error => console.warn('[activity] history read failed', error)).finally(() => {
233
260
  finishPromise(host); if (active === host) active = null; pump();
234
261
  });
@@ -242,14 +269,15 @@ export function hydrateActivityHost(message: HTMLElement, runId: string, manual
242
269
  const turn = findLiveActivity(runId);
243
270
  if (!manual && host.loaded) return Promise.resolve();
244
271
  if (!manual && turn?.message === message && !turn.degraded && !message.dataset['activityRecovering']) {
245
- host.box.hidden = true; traceAllowed(message, true); return Promise.resolve();
272
+ host.status.textContent = ''; host.retry.hidden = true; present(host);
273
+ traceAllowed(message, true); return Promise.resolve();
246
274
  }
247
275
  if (queued.size >= MAX_QUEUED) {
248
276
  host.status.textContent = 'Activity reads are at their limit. Use Load activity to retry.';
249
- host.box.hidden = false; host.retry.hidden = false; return Promise.resolve();
277
+ host.retry.hidden = false; present(host); return Promise.resolve();
250
278
  }
251
- host.controller = new AbortController(); host.pending = true; host.box.hidden = false;
252
- host.status.textContent = 'Activity read queued.'; host.retry.disabled = true;
279
+ host.controller = new AbortController(); host.pending = true;
280
+ host.status.textContent = 'Activity read queued.'; host.retry.disabled = true; present(host);
253
281
  host.promise = new Promise(resolve => { host.resolve = resolve; });
254
282
  const promise = host.promise; queued.set(message, host); pump(); return promise;
255
283
  }
@@ -276,7 +304,8 @@ export function observeActivityHistory(root: ParentNode): void {
276
304
  const runId = message.dataset['traceRunId']!;
277
305
  if (!owns(message, runId, identity.sessionId)) continue;
278
306
  const host = entry(message, runId); if (!host) continue;
279
- if (!mode()) { host.box.hidden = true; traceAllowed(message, true); continue; }
307
+ if (!mode()) { host.status.textContent = ''; host.retry.hidden = true; present(host);
308
+ traceAllowed(message, true); continue; }
280
309
  if (message.closest('details:not([open])')) continue;
281
310
  if (observer) observer.observe(message); else void hydrateActivityHost(message, runId);
282
311
  }
@@ -1,5 +1,7 @@
1
- import { activityEntryLabel, activityEntryText, type ActivityEntry } from '../../../src/shared/activity-state.js';
1
+ import { activityEntryLabel, type ActivityEntry } from '../../../src/shared/activity-state.js';
2
2
  import { classifyActivityTool, isActivityFileEdit, type ActivityRenderGroup, type ActivityToolKind } from '../../../src/shared/activity-kind.js';
3
+ import { firstInputLine, parseToolInput, prettyToolInput, TOOL_DESCRIPTION_KEYS, TOOL_INPUT_KEYS } from '../../../src/shared/tool-input.js';
4
+ import { copyText } from './copy-text.js';
3
5
  import { hydrateIcons, type IconName } from '../icons.js';
4
6
  const glyphs: Record<ActivityToolKind, IconName> = { command: 'terminal', file: 'file', search: 'search', mcp: 'plug', other: 'tool' };
5
7
  function el<K extends keyof HTMLElementTagNameMap>(doc: Document, tag: K, cls: string) {
@@ -9,34 +11,180 @@ function glyph(node: HTMLElement, name: IconName) {
9
11
  if (node.dataset['icon'] === name) return;
10
12
  node.dataset['icon'] = name; node.setAttribute('aria-hidden', 'true');
11
13
  hydrateIcons(node.parentElement!); }
14
+
15
+ // Past ~15 wrapped lines the capped scroll height already engages; only then is
16
+ // a Show-all toggle worth showing (jsdom cannot measure overflow, so estimate).
17
+ function isTallContent(value: string): boolean {
18
+ return value.length > 1400 || value.split('\n').length > 14;
19
+ }
20
+
21
+ /** One flash per copy button: a second click restarts it instead of being cut short. */
22
+ const copyFlash = new WeakMap<HTMLButtonElement, number>();
23
+
24
+ function flashCopied(btn: HTMLButtonElement, doc: Document): void {
25
+ const icon = btn.querySelector<HTMLElement>('[data-icon]');
26
+ if (!icon) return;
27
+ const pending = copyFlash.get(btn);
28
+ if (pending !== undefined) doc.defaultView?.clearTimeout(pending);
29
+ icon.dataset['icon'] = 'checkSimple'; hydrateIcons(btn); btn.classList.add('copied');
30
+ const timer = doc.defaultView?.setTimeout(() => { icon.dataset['icon'] = 'copy'; hydrateIcons(btn); btn.classList.remove('copied'); }, 800);
31
+ if (timer !== undefined) copyFlash.set(btn, timer);
32
+ }
33
+
34
+ interface Block { key: string; label: string; content: string; copy: boolean }
35
+
36
+ /** Rebuild when the block set or a label changes; text stays live between rebuilds. */
37
+ function syncBody(body: HTMLElement, blocks: readonly Block[], waiting: boolean): void {
38
+ // Labels follow the entry (the detail block becomes `Error` on failure), so they
39
+ // belong in the signature: a key-only signature left `Detail` on a failed row.
40
+ const signature = `${waiting ? 'wait|' : ''}${blocks.map(block => `${block.key}:${block.label}`).join('|')}`;
41
+ if (body.dataset['sig'] !== signature) {
42
+ body.dataset['sig'] = signature;
43
+ for (const child of [...body.children]) child.remove();
44
+ const doc = body.ownerDocument;
45
+ for (const block of blocks) {
46
+ const section = el(doc, 'section', 'activity-block');
47
+ section.dataset['block'] = block.key;
48
+ const head = el(doc, 'div', 'activity-block-head');
49
+ const label = el(doc, 'span', 'activity-block-label');
50
+ text(label, block.label);
51
+ head.append(label);
52
+ if (block.copy) {
53
+ const copy = el(doc, 'button', 'activity-block-copy');
54
+ copy.type = 'button';
55
+ copy.setAttribute('aria-label', `Copy ${block.label.toLowerCase()}`);
56
+ const icon = el(doc, 'span', 'activity-block-copy-icon');
57
+ icon.dataset['icon'] = 'copy'; icon.setAttribute('aria-hidden', 'true');
58
+ copy.append(icon);
59
+ copy.onclick = () => {
60
+ const value = section.querySelector('pre')?.textContent;
61
+ if (value) void copyText(value).then(result => { if (result.ok) flashCopied(copy, doc); });
62
+ };
63
+ head.append(copy);
64
+ }
65
+ const pre = el(doc, 'pre', 'activity-item-text activity-block-text');
66
+ pre.setAttribute('aria-label', block.label);
67
+ section.append(head, pre);
68
+ body.append(section);
69
+ }
70
+ if (waiting) {
71
+ const line = el(doc, 'p', 'activity-waiting');
72
+ text(line, 'Waiting for output…');
73
+ body.append(line);
74
+ }
75
+ const toggle = el(doc, 'button', 'activity-block-toggle');
76
+ toggle.type = 'button';
77
+ toggle.onclick = () => {
78
+ const next = body.dataset['expanded'] !== 'true';
79
+ body.dataset['expanded'] = String(next);
80
+ toggle.textContent = next ? 'Show less' : 'Show all';
81
+ toggle.setAttribute('aria-expanded', String(next));
82
+ };
83
+ body.append(toggle);
84
+ hydrateIcons(body);
85
+ }
86
+ const sections = body.querySelectorAll<HTMLElement>('.activity-block');
87
+ const pres = blocks.map((_, index) => sections[index]!.querySelector('pre')!);
88
+ blocks.forEach((block, index) => text(pres[index]!, block.content));
89
+ // Measure real overflow when layout exists (browser); jsdom reports 0
90
+ // everywhere and falls back to the character estimate.
91
+ const unmeasured = pres.every(pre => pre.scrollHeight === 0);
92
+ const overflowing = pres.map((pre, index) => unmeasured
93
+ ? isTallContent(blocks[index]!.content)
94
+ : pre.scrollHeight > pre.clientHeight + 2);
95
+ // Only a block that actually scrolls belongs in the tab order.
96
+ pres.forEach((pre, index) => {
97
+ if (overflowing[index]) pre.tabIndex = 0;
98
+ else pre.removeAttribute('tabindex');
99
+ });
100
+ // The reader's choice outranks the measurement: an expanded body has the cap
101
+ // lifted, so it measures as short and would otherwise collapse itself on the
102
+ // next render, taking the toggle away with it.
103
+ const expanded = body.dataset['expanded'] === 'true';
104
+ const tall = expanded || overflowing.some(Boolean);
105
+ const toggle = body.querySelector<HTMLElement>('.activity-block-toggle')!;
106
+ toggle.hidden = !tall;
107
+ text(toggle, expanded ? 'Show less' : 'Show all');
108
+ toggle.setAttribute('aria-expanded', String(expanded));
109
+ }
110
+
111
+ function toolBlocks(entry: Extract<ActivityEntry, { kind: 'tool' }>, kind: ActivityToolKind): Block[] {
112
+ const blocks: Block[] = [];
113
+ const parsed = parseToolInput(entry.input);
114
+ if (parsed.value !== null || parsed.object || entry.input) {
115
+ const command = parsed.field === 'command' || (!parsed.object && kind === 'command');
116
+ blocks.push({
117
+ key: 'input',
118
+ label: command ? 'Command' : 'Input',
119
+ content: parsed.field === 'command' && parsed.value !== null ? parsed.value
120
+ : parsed.object ? prettyToolInput(entry.input ?? '') : parsed.value ?? entry.input ?? '',
121
+ copy: true,
122
+ });
123
+ // A command envelope can carry more than the command (timeout, cwd…):
124
+ // surface the remaining fields so nothing the call sent is hidden.
125
+ if (parsed.object && parsed.field === 'command') {
126
+ const hidden = new Set([...TOOL_INPUT_KEYS.command, ...TOOL_DESCRIPTION_KEYS]);
127
+ const rest = Object.fromEntries(Object.entries(parsed.object).filter(([key]) => !hidden.has(key)));
128
+ if (Object.keys(rest).length)
129
+ blocks.push({ key: 'params', label: 'Parameters', content: JSON.stringify(rest, null, 2), copy: false });
130
+ }
131
+ if (parsed.description)
132
+ blocks.push({ key: 'description', label: 'Description', content: parsed.description, copy: false });
133
+ }
134
+ if (entry.output) blocks.push({ key: 'output', label: 'Output', content: entry.output, copy: false });
135
+ if (entry.detail) blocks.push({ key: 'detail', label: entry.status === 'error' ? 'Error' : 'Detail', content: entry.detail, copy: false });
136
+ return blocks;
137
+ }
138
+
12
139
  export function createActivityRow(doc: Document, id: string): HTMLDetailsElement {
13
140
  const row = el(doc, 'details', 'activity-item activity-row'); row.dataset['activityItemId'] = id;
14
141
  const head = el(doc, 'summary', 'activity-item-summary');
15
- head.append(el(doc, 'span', 'activity-row-icon'), el(doc, 'span', 'activity-row-label'),
142
+ const labelWrap = el(doc, 'span', 'activity-row-text');
143
+ const desc = el(doc, 'span', 'activity-row-desc'); desc.hidden = true;
144
+ labelWrap.append(el(doc, 'span', 'activity-row-label'), desc);
145
+ head.append(el(doc, 'span', 'activity-row-icon'), labelWrap,
16
146
  el(doc, 'span', 'activity-row-status'), el(doc, 'span', 'activity-chevron-sm'));
17
- const body = el(doc, 'pre', 'activity-item-text'); body.tabIndex = 0; body.setAttribute('aria-label', 'Activity preview');
147
+ const body = el(doc, 'div', 'activity-item-body');
18
148
  row.append(head, body); glyph(head.lastElementChild as HTMLElement, 'chevronDown'); return row; }
19
- export function updateActivityRow(row: HTMLDetailsElement, entry: ActivityEntry, limit: number): void {
149
+ export function updateActivityRow(row: HTMLDetailsElement, entry: ActivityEntry): void {
20
150
  const kind = entry.kind === 'tool' ? classifyActivityTool(entry.name) : entry.kind;
21
151
  row.className = `activity-item activity-row${entry.kind === 'tool' ? '' : ` activity-row-${entry.kind}`}`;
22
152
  row.dataset['kind'] = kind; row.dataset['status'] = entry.kind === 'tool' ? entry.status : '';
23
- const head = row.querySelector('summary')!; head.setAttribute('aria-label', activityEntryLabel(entry));
153
+ const head = row.querySelector('summary')!;
24
154
  glyph(head.querySelector<HTMLElement>('.activity-row-icon')!, entry.kind === 'tool' ? glyphs[classifyActivityTool(entry.name)]
25
155
  : entry.kind === 'reasoning' ? 'brain' : 'thinking');
26
- let label = activityEntryLabel(entry), status = '';
156
+ const desc = head.querySelector<HTMLElement>('.activity-row-desc')!;
157
+ let label = activityEntryLabel(entry), status = '', description = '';
27
158
  if (entry.kind === 'tool') {
28
159
  const edit = kind === 'file' && isActivityFileEdit(entry.name);
29
160
  const past = kind === 'command' ? 'Ran' : kind === 'file' ? edit ? 'Edited' : 'Read' : kind === 'search' ? 'Searched' : 'Called';
30
161
  const active = kind === 'command' ? 'Running' : kind === 'file' ? edit ? 'Editing' : 'Reading' : kind === 'search' ? 'Searching' : 'Calling';
31
162
  const verb = entry.status === 'done' ? past : entry.status === 'running' ? active : entry.status === 'error' ? 'Failed' : 'Stopped';
32
- const first = (entry.input ?? '').split(/\r?\n/, 1)[0]!.trim() || entry.name;
33
- label = `${verb} ${first}`; status = entry.status === 'error' ? 'failed' : entry.status === 'done' ? '' : entry.status;
163
+ const parsed = parseToolInput(entry.input);
164
+ // Never label a row with a raw {"command": ...} object: decode the
165
+ // recognised argument, else fall back to the tool's own name. Retention can
166
+ // cut the input before any recognised field, and that prefix is still an
167
+ // envelope, so the tool name is the honest label there too.
168
+ const raw = entry.input?.trim() ?? '';
169
+ const target = parsed.value !== null ? firstInputLine(parsed.value)
170
+ : (parsed.object || raw.startsWith('{')) ? entry.name
171
+ : firstInputLine(raw) || entry.name;
172
+ description = parsed.description ? firstInputLine(parsed.description) : '';
173
+ label = `${verb} ${target}`;
174
+ status = entry.status === 'error' ? 'failed' : entry.status === 'done' ? '' : entry.status;
34
175
  }
35
176
  text(head.querySelector('.activity-row-label')!, label);
177
+ text(desc, description); desc.hidden = !description;
178
+ head.setAttribute('aria-label', description ? `${label} — ${description}` : label);
36
179
  const state = head.querySelector<HTMLElement>('.activity-row-status')!;
37
180
  text(state, status); state.setAttribute('aria-label', status === 'failed' ? 'Tool call failed' : status);
38
- const full = activityEntryText(entry);
39
- text(row.querySelector('pre')!, full.length > limit ? `${full.slice(0, limit)}\n[Preview limited; some text is omitted]` : full);
181
+ const body = row.querySelector<HTMLElement>('.activity-item-body')!;
182
+ if (entry.kind === 'tool') {
183
+ syncBody(body, toolBlocks(entry, kind as ActivityToolKind),
184
+ entry.status === 'running' && !entry.output && !entry.detail);
185
+ } else {
186
+ syncBody(body, entry.text ? [{ key: 'text', label: 'Activity preview', content: entry.text, copy: false }] : [], false);
187
+ }
40
188
  }
41
189
  export function createActivityRows(doc: Document, list: HTMLElement) {
42
190
  const groups = new Map<string, { root: HTMLDivElement; head: HTMLButtonElement; body: HTMLDivElement }>();
@@ -1,4 +1,4 @@
1
- import { activityEntryText, activityStatus, type ActivityState } from '../../../src/shared/activity-state.js';
1
+ import { activityStatus, type ActivityState } from '../../../src/shared/activity-state.js';
2
2
  import { groupActivityEntries } from '../../../src/shared/activity-kind.js';
3
3
  import { createActivityRow, updateActivityRow, createActivityRows } from './activity-rows.js';
4
4
  import type { RuntimeItemStatus } from '../../../src/shared/runtime-contract.js';
@@ -12,7 +12,6 @@ export interface ActivityChoices {
12
12
 
13
13
  const MAX_CHOICES = 128;
14
14
  const PAGE_SIZE = 40;
15
- const PREVIEW_CHARS = 3000;
16
15
 
17
16
  export const createActivityChoices = (): ActivityChoices => ({ open: false, items: new Map(), page: null });
18
17
 
@@ -178,8 +177,9 @@ export function createActivityView(
178
177
  connection.hidden = !display.connectionUnavailable;
179
178
  const loss = model.omitted;
180
179
  const entries = [...model.entries.values()];
181
- const limited = !!(loss.entries || loss.textChars || loss.requests || loss.finalChars)
182
- || entries.some(entry => activityEntryText(entry).length > PREVIEW_CHARS);
180
+ // Rows render everything retention kept, so the notice fires only when
181
+ // retention itself dropped something — never for display clipping.
182
+ const limited = !!(loss.entries || loss.textChars || loss.requests || loss.finalChars);
183
183
  text(omitted, limited
184
184
  ? 'Preview is limited. Some activity, text or request notices are omitted.' : '');
185
185
  omitted.hidden = !limited;
@@ -210,7 +210,7 @@ export function createActivityView(
210
210
  node.ontoggle = () => saveItem(entry.itemId, itemNode);
211
211
  nodes.set(entry.itemId, node);
212
212
  }
213
- updateActivityRow(node, entry, PREVIEW_CHARS);
213
+ updateActivityRow(node, entry);
214
214
  const open = choices.items.get(entry.itemId) ?? (entry.kind === 'tool' && entry.status === 'running');
215
215
  renderedOpen.set(node, open);
216
216
  if (node.open !== open) node.open = open;
@@ -4,6 +4,7 @@ import { addMessage, addSystemMsg } from '../ui.js';
4
4
  import { getPreferredLocale } from '../locale.js';
5
5
  import { t } from './i18n.js';
6
6
  import * as slashCmd from './slash-commands.js';
7
+ import * as skillMention from './skill-mentions.js';
7
8
  import { api, apiJson, apiFire, getAuthToken, API_BASE } from '../api.js';
8
9
  import { escapeHtml, cancelPostRender } from '../render.js';
9
10
  import { getVirtualScroll } from '../virtual-scroll.js';
@@ -282,6 +283,7 @@ export async function sendMessage(source: SendSource = 'enter'): Promise<void> {
282
283
 
283
284
  // Double-submit guard: if a previous send is still in flight, drop this call.
284
285
  if (__chatSending) return;
286
+ skillMention.close();
285
287
 
286
288
  if (!text && !state.attachedFiles.length) return;
287
289
  clearUnreadResponses();
@@ -54,6 +54,7 @@ function normalizeEmployeeModel(_cli: string, model?: string): string {
54
54
 
55
55
  function getDefaultEmployeeModel(cli: string, models: string[]): string {
56
56
  if (cli === 'claude') {
57
+ if (models.includes('claude-opus-5-5')) return 'claude-opus-5-5';
57
58
  if (models.includes('claude-opus-4-8')) return 'claude-opus-4-8';
58
59
  if (models.includes('opus')) return 'opus';
59
60
  }