@songsid/agend 2.3.5-alpha.4 → 2.3.5-alpha.5

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 (838) hide show
  1. package/THIRD_PARTY_NOTICES.md +52 -0
  2. package/dist/accounts-view.d.ts +97 -0
  3. package/dist/accounts-view.js +116 -0
  4. package/dist/accounts-view.js.map +1 -0
  5. package/dist/agent-cli-instructions.md +1 -1
  6. package/dist/agent-credentials.d.ts +24 -0
  7. package/dist/agent-credentials.js +66 -0
  8. package/dist/agent-credentials.js.map +1 -0
  9. package/dist/agent-endpoint.d.ts +3 -1
  10. package/dist/agent-endpoint.js +13 -0
  11. package/dist/agent-endpoint.js.map +1 -1
  12. package/dist/agent-file-read.js +1 -1
  13. package/dist/agent-file-read.js.map +1 -1
  14. package/dist/agent-runtime-change.d.ts +3 -1
  15. package/dist/agent-runtime-change.js +15 -3
  16. package/dist/agent-runtime-change.js.map +1 -1
  17. package/dist/agent-workspace.d.ts +93 -0
  18. package/dist/agent-workspace.js +353 -0
  19. package/dist/agent-workspace.js.map +1 -0
  20. package/dist/auth-api.d.ts +27 -0
  21. package/dist/auth-api.js +164 -3
  22. package/dist/auth-api.js.map +1 -1
  23. package/dist/authority/session-authorizations.d.ts +28 -4
  24. package/dist/authority/session-authorizations.js +63 -17
  25. package/dist/authority/session-authorizations.js.map +1 -1
  26. package/dist/backend/antigravity.js +3 -1
  27. package/dist/backend/antigravity.js.map +1 -1
  28. package/dist/backend/codex-footer-hints.d.ts +3 -0
  29. package/dist/backend/codex-footer-hints.js +14 -0
  30. package/dist/backend/codex-footer-hints.js.map +1 -1
  31. package/dist/backend/codex-metadata.d.ts +14 -0
  32. package/dist/backend/codex-metadata.js +45 -0
  33. package/dist/backend/codex-metadata.js.map +1 -1
  34. package/dist/backend/codex-quota-history.d.ts +7 -0
  35. package/dist/backend/codex-quota-history.js +57 -0
  36. package/dist/backend/codex-quota-history.js.map +1 -0
  37. package/dist/backend/codex-session-lookup.d.ts +6 -0
  38. package/dist/backend/codex-session-lookup.js +1 -1
  39. package/dist/backend/codex-session-lookup.js.map +1 -1
  40. package/dist/backend/codex-speed.d.ts +14 -0
  41. package/dist/backend/codex-speed.js +35 -0
  42. package/dist/backend/codex-speed.js.map +1 -0
  43. package/dist/backend/codex.d.ts +7 -0
  44. package/dist/backend/codex.js +78 -15
  45. package/dist/backend/codex.js.map +1 -1
  46. package/dist/backend/grok-weekly-reset.d.ts +24 -0
  47. package/dist/backend/grok-weekly-reset.js +95 -0
  48. package/dist/backend/grok-weekly-reset.js.map +1 -0
  49. package/dist/backend/grok.d.ts +30 -1
  50. package/dist/backend/grok.js +301 -54
  51. package/dist/backend/grok.js.map +1 -1
  52. package/dist/backend/kiro.d.ts +3 -0
  53. package/dist/backend/kiro.js +50 -2
  54. package/dist/backend/kiro.js.map +1 -1
  55. package/dist/backend/muse.js +5 -3
  56. package/dist/backend/muse.js.map +1 -1
  57. package/dist/backend/native-pane.d.ts +3 -1
  58. package/dist/backend/native-pane.js +2 -2
  59. package/dist/backend/native-pane.js.map +1 -1
  60. package/dist/backend/types.d.ts +13 -1
  61. package/dist/backend/types.js +3 -0
  62. package/dist/backend/types.js.map +1 -1
  63. package/dist/build-provenance-cli.d.ts +3 -0
  64. package/dist/build-provenance-cli.js +11 -0
  65. package/dist/build-provenance-cli.js.map +1 -0
  66. package/dist/build-provenance.d.ts +20 -0
  67. package/dist/build-provenance.js +67 -0
  68. package/dist/build-provenance.js.map +1 -0
  69. package/dist/build-provenance.json +1 -0
  70. package/dist/cache-ledger.d.ts +95 -0
  71. package/dist/cache-ledger.js +276 -4
  72. package/dist/cache-ledger.js.map +1 -1
  73. package/dist/cache-service.d.ts +5 -0
  74. package/dist/cache-service.js +16 -4
  75. package/dist/cache-service.js.map +1 -1
  76. package/dist/channel/adapters/discord.js +11 -3
  77. package/dist/channel/adapters/discord.js.map +1 -1
  78. package/dist/channel/adapters/telegram.d.ts +51 -0
  79. package/dist/channel/adapters/telegram.js +235 -17
  80. package/dist/channel/adapters/telegram.js.map +1 -1
  81. package/dist/channel/mcp-tools.js +3 -3
  82. package/dist/channel/mcp-tools.js.map +1 -1
  83. package/dist/channel/types.d.ts +2 -0
  84. package/dist/claude-auth-status.d.ts +48 -0
  85. package/dist/claude-auth-status.js +149 -0
  86. package/dist/claude-auth-status.js.map +1 -0
  87. package/dist/cli.js +138 -37
  88. package/dist/cli.js.map +1 -1
  89. package/dist/config-validator.js +21 -1
  90. package/dist/config-validator.js.map +1 -1
  91. package/dist/cross-instance-notice.d.ts +10 -0
  92. package/dist/cross-instance-notice.js +67 -5
  93. package/dist/cross-instance-notice.js.map +1 -1
  94. package/dist/daemon.d.ts +70 -1
  95. package/dist/daemon.js +547 -25
  96. package/dist/daemon.js.map +1 -1
  97. package/dist/dashboard-permissions.d.ts +8 -0
  98. package/dist/dashboard-permissions.js +16 -0
  99. package/dist/dashboard-permissions.js.map +1 -1
  100. package/dist/delivery-consumed-watch.d.ts +23 -1
  101. package/dist/delivery-consumed-watch.js +30 -3
  102. package/dist/delivery-consumed-watch.js.map +1 -1
  103. package/dist/delivery-reconciliation.d.ts +1 -1
  104. package/dist/delivery-reconciliation.js +1 -1
  105. package/dist/delivery-reconciliation.js.map +1 -1
  106. package/dist/doctor.js +20 -9
  107. package/dist/doctor.js.map +1 -1
  108. package/dist/export-import.d.ts +7 -0
  109. package/dist/export-import.js +44 -10
  110. package/dist/export-import.js.map +1 -1
  111. package/dist/fleet-context.d.ts +2 -0
  112. package/dist/fleet-manager.d.ts +359 -7
  113. package/dist/fleet-manager.js +1365 -90
  114. package/dist/fleet-manager.js.map +1 -1
  115. package/dist/fleet-windows-runtime.d.ts +2 -1
  116. package/dist/fleet-windows-runtime.js +25 -7
  117. package/dist/fleet-windows-runtime.js.map +1 -1
  118. package/dist/general-knowledge/skills/concepts/SKILL.md +425 -0
  119. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +5 -2
  120. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +1 -0
  121. package/dist/general-knowledge/skills/fleet-health/SKILL.md +2 -2
  122. package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -1
  123. package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +41 -4
  124. package/dist/general-knowledge/skills/session-management/SKILL.md +1 -1
  125. package/dist/general-knowledge/skills/tui-effort/SKILL.md +10 -10
  126. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +31 -15
  127. package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
  128. package/dist/general-role.d.ts +1 -1
  129. package/dist/general-role.js +1 -0
  130. package/dist/general-role.js.map +1 -1
  131. package/dist/hub/admission.d.ts +28 -0
  132. package/dist/hub/admission.js +62 -0
  133. package/dist/hub/admission.js.map +1 -0
  134. package/dist/hub/attachments/limits.d.ts +20 -0
  135. package/dist/hub/attachments/limits.js +48 -0
  136. package/dist/hub/attachments/limits.js.map +1 -0
  137. package/dist/hub/attachments/store.d.ts +116 -0
  138. package/dist/hub/attachments/store.js +246 -0
  139. package/dist/hub/attachments/store.js.map +1 -0
  140. package/dist/hub/audit/index.d.ts +62 -0
  141. package/dist/hub/audit/index.js +344 -0
  142. package/dist/hub/audit/index.js.map +1 -0
  143. package/dist/hub/browser-certificate.d.ts +38 -0
  144. package/dist/hub/browser-certificate.js +247 -0
  145. package/dist/hub/browser-certificate.js.map +1 -0
  146. package/dist/hub/buttons-model.d.ts +9 -0
  147. package/dist/hub/buttons-model.js +42 -0
  148. package/dist/hub/buttons-model.js.map +1 -0
  149. package/dist/hub/buttons.d.ts +54 -0
  150. package/dist/hub/buttons.js +346 -0
  151. package/dist/hub/buttons.js.map +1 -0
  152. package/dist/hub/catalog.d.ts +74 -0
  153. package/dist/hub/catalog.js +195 -0
  154. package/dist/hub/catalog.js.map +1 -0
  155. package/dist/hub/client.d.ts +69 -0
  156. package/dist/hub/client.js +300 -0
  157. package/dist/hub/client.js.map +1 -0
  158. package/dist/hub/compose/member.d.ts +139 -0
  159. package/dist/hub/compose/member.js +450 -0
  160. package/dist/hub/compose/member.js.map +1 -0
  161. package/dist/hub/compose/server.d.ts +77 -0
  162. package/dist/hub/compose/server.js +349 -0
  163. package/dist/hub/compose/server.js.map +1 -0
  164. package/dist/hub/compose/views.d.ts +12 -0
  165. package/dist/hub/compose/views.js +4 -0
  166. package/dist/hub/compose/views.js.map +1 -0
  167. package/dist/hub/db.d.ts +56 -0
  168. package/dist/hub/db.js +188 -0
  169. package/dist/hub/db.js.map +1 -0
  170. package/dist/hub/directory/config.d.ts +39 -0
  171. package/dist/hub/directory/config.js +108 -0
  172. package/dist/hub/directory/config.js.map +1 -0
  173. package/dist/hub/directory/directory.d.ts +18 -0
  174. package/dist/hub/directory/directory.js +320 -0
  175. package/dist/hub/directory/directory.js.map +1 -0
  176. package/dist/hub/directory/index.d.ts +7 -0
  177. package/dist/hub/directory/index.js +4 -0
  178. package/dist/hub/directory/index.js.map +1 -0
  179. package/dist/hub/directory/profiles.d.ts +41 -0
  180. package/dist/hub/directory/profiles.js +90 -0
  181. package/dist/hub/directory/profiles.js.map +1 -0
  182. package/dist/hub/directory/types.d.ts +71 -0
  183. package/dist/hub/directory/types.js +14 -0
  184. package/dist/hub/directory/types.js.map +1 -0
  185. package/dist/hub/execution/cli-provider.d.ts +23 -0
  186. package/dist/hub/execution/cli-provider.js +341 -0
  187. package/dist/hub/execution/cli-provider.js.map +1 -0
  188. package/dist/hub/execution/index.d.ts +13 -0
  189. package/dist/hub/execution/index.js +8 -0
  190. package/dist/hub/execution/index.js.map +1 -0
  191. package/dist/hub/execution/model-broker.d.ts +24 -0
  192. package/dist/hub/execution/model-broker.js +208 -0
  193. package/dist/hub/execution/model-broker.js.map +1 -0
  194. package/dist/hub/execution/provider-setup.d.ts +11 -0
  195. package/dist/hub/execution/provider-setup.js +21 -0
  196. package/dist/hub/execution/provider-setup.js.map +1 -0
  197. package/dist/hub/execution/sandbox-runner.d.ts +1 -0
  198. package/dist/hub/execution/sandbox-runner.js +221 -0
  199. package/dist/hub/execution/sandbox-runner.js.map +1 -0
  200. package/dist/hub/execution/service.d.ts +136 -0
  201. package/dist/hub/execution/service.js +459 -0
  202. package/dist/hub/execution/service.js.map +1 -0
  203. package/dist/hub/execution/store.d.ts +61 -0
  204. package/dist/hub/execution/store.js +182 -0
  205. package/dist/hub/execution/store.js.map +1 -0
  206. package/dist/hub/execution/views.d.ts +20 -0
  207. package/dist/hub/execution/views.js +48 -0
  208. package/dist/hub/execution/views.js.map +1 -0
  209. package/dist/hub/http/compose.d.ts +20 -0
  210. package/dist/hub/http/compose.js +518 -0
  211. package/dist/hub/http/compose.js.map +1 -0
  212. package/dist/hub/http/core.d.ts +49 -0
  213. package/dist/hub/http/core.js +124 -0
  214. package/dist/hub/http/core.js.map +1 -0
  215. package/dist/hub/http/deps.d.ts +61 -0
  216. package/dist/hub/http/deps.js +2 -0
  217. package/dist/hub/http/deps.js.map +1 -0
  218. package/dist/hub/http/schema.d.ts +14 -0
  219. package/dist/hub/http/schema.js +80 -0
  220. package/dist/hub/http/schema.js.map +1 -0
  221. package/dist/hub/identity.d.ts +32 -0
  222. package/dist/hub/identity.js +80 -0
  223. package/dist/hub/identity.js.map +1 -0
  224. package/dist/hub/init/browser-certificate.d.ts +9 -0
  225. package/dist/hub/init/browser-certificate.js +78 -0
  226. package/dist/hub/init/browser-certificate.js.map +1 -0
  227. package/dist/hub/init/browser-tls.d.ts +18 -0
  228. package/dist/hub/init/browser-tls.js +62 -0
  229. package/dist/hub/init/browser-tls.js.map +1 -0
  230. package/dist/hub/init/cli.d.ts +3 -0
  231. package/dist/hub/init/cli.js +83 -0
  232. package/dist/hub/init/cli.js.map +1 -0
  233. package/dist/hub/init/directory-certificate.d.ts +24 -0
  234. package/dist/hub/init/directory-certificate.js +222 -0
  235. package/dist/hub/init/directory-certificate.js.map +1 -0
  236. package/dist/hub/init/existing-fleet.d.ts +6 -0
  237. package/dist/hub/init/existing-fleet.js +58 -0
  238. package/dist/hub/init/existing-fleet.js.map +1 -0
  239. package/dist/hub/init/handoff.d.ts +8 -0
  240. package/dist/hub/init/handoff.js +36 -0
  241. package/dist/hub/init/handoff.js.map +1 -0
  242. package/dist/hub/init/identity.d.ts +5 -0
  243. package/dist/hub/init/identity.js +24 -0
  244. package/dist/hub/init/identity.js.map +1 -0
  245. package/dist/hub/init/initializer.d.ts +24 -0
  246. package/dist/hub/init/initializer.js +385 -0
  247. package/dist/hub/init/initializer.js.map +1 -0
  248. package/dist/hub/init/inventory.d.ts +17 -0
  249. package/dist/hub/init/inventory.js +33 -0
  250. package/dist/hub/init/inventory.js.map +1 -0
  251. package/dist/hub/init/layout.d.ts +32 -0
  252. package/dist/hub/init/layout.js +53 -0
  253. package/dist/hub/init/layout.js.map +1 -0
  254. package/dist/hub/init/network.d.ts +18 -0
  255. package/dist/hub/init/network.js +104 -0
  256. package/dist/hub/init/network.js.map +1 -0
  257. package/dist/hub/init/plan-digest.d.ts +5 -0
  258. package/dist/hub/init/plan-digest.js +47 -0
  259. package/dist/hub/init/plan-digest.js.map +1 -0
  260. package/dist/hub/init/prompt.d.ts +26 -0
  261. package/dist/hub/init/prompt.js +110 -0
  262. package/dist/hub/init/prompt.js.map +1 -0
  263. package/dist/hub/init/secret-file.d.ts +1 -0
  264. package/dist/hub/init/secret-file.js +59 -0
  265. package/dist/hub/init/secret-file.js.map +1 -0
  266. package/dist/hub/init/text.d.ts +127 -0
  267. package/dist/hub/init/text.js +247 -0
  268. package/dist/hub/init/text.js.map +1 -0
  269. package/dist/hub/init/types.d.ts +114 -0
  270. package/dist/hub/init/types.js +9 -0
  271. package/dist/hub/init/types.js.map +1 -0
  272. package/dist/hub/init/wizard.d.ts +34 -0
  273. package/dist/hub/init/wizard.js +554 -0
  274. package/dist/hub/init/wizard.js.map +1 -0
  275. package/dist/hub/initialization.d.ts +23 -0
  276. package/dist/hub/initialization.js +28 -0
  277. package/dist/hub/initialization.js.map +1 -0
  278. package/dist/hub/member/agent-mode.d.ts +6 -0
  279. package/dist/hub/member/agent-mode.js +23 -0
  280. package/dist/hub/member/agent-mode.js.map +1 -0
  281. package/dist/hub/member/attachments.d.ts +29 -0
  282. package/dist/hub/member/attachments.js +107 -0
  283. package/dist/hub/member/attachments.js.map +1 -0
  284. package/dist/hub/member/exposure-api.d.ts +87 -0
  285. package/dist/hub/member/exposure-api.js +64 -0
  286. package/dist/hub/member/exposure-api.js.map +1 -0
  287. package/dist/hub/member/exposures.d.ts +123 -0
  288. package/dist/hub/member/exposures.js +282 -0
  289. package/dist/hub/member/exposures.js.map +1 -0
  290. package/dist/hub/member/pairing-api.d.ts +85 -0
  291. package/dist/hub/member/pairing-api.js +385 -0
  292. package/dist/hub/member/pairing-api.js.map +1 -0
  293. package/dist/hub/member/quota.d.ts +20 -0
  294. package/dist/hub/member/quota.js +98 -0
  295. package/dist/hub/member/quota.js.map +1 -0
  296. package/dist/hub/member-journal.d.ts +104 -0
  297. package/dist/hub/member-journal.js +336 -0
  298. package/dist/hub/member-journal.js.map +1 -0
  299. package/dist/hub/member-reconciliation.d.ts +14 -0
  300. package/dist/hub/member-reconciliation.js +97 -0
  301. package/dist/hub/member-reconciliation.js.map +1 -0
  302. package/dist/hub/mount.d.ts +39 -0
  303. package/dist/hub/mount.js +123 -0
  304. package/dist/hub/mount.js.map +1 -0
  305. package/dist/hub/pairing-client.d.ts +17 -0
  306. package/dist/hub/pairing-client.js +108 -0
  307. package/dist/hub/pairing-client.js.map +1 -0
  308. package/dist/hub/pairing.d.ts +65 -0
  309. package/dist/hub/pairing.js +211 -0
  310. package/dist/hub/pairing.js.map +1 -0
  311. package/dist/hub/policy.d.ts +63 -0
  312. package/dist/hub/policy.js +147 -0
  313. package/dist/hub/policy.js.map +1 -0
  314. package/dist/hub/preview.d.ts +32 -0
  315. package/dist/hub/preview.js +64 -0
  316. package/dist/hub/preview.js.map +1 -0
  317. package/dist/hub/private-files.d.ts +5 -0
  318. package/dist/hub/private-files.js +44 -0
  319. package/dist/hub/private-files.js.map +1 -0
  320. package/dist/hub/profile.d.ts +59 -0
  321. package/dist/hub/profile.js +73 -0
  322. package/dist/hub/profile.js.map +1 -0
  323. package/dist/hub/protocol.d.ts +779 -0
  324. package/dist/hub/protocol.js +93 -0
  325. package/dist/hub/protocol.js.map +1 -0
  326. package/dist/hub/quota.d.ts +24 -0
  327. package/dist/hub/quota.js +112 -0
  328. package/dist/hub/quota.js.map +1 -0
  329. package/dist/hub/representative.d.ts +141 -0
  330. package/dist/hub/representative.js +528 -0
  331. package/dist/hub/representative.js.map +1 -0
  332. package/dist/hub/retention.d.ts +17 -0
  333. package/dist/hub/retention.js +45 -0
  334. package/dist/hub/retention.js.map +1 -0
  335. package/dist/hub/rooms.d.ts +120 -0
  336. package/dist/hub/rooms.js +535 -0
  337. package/dist/hub/rooms.js.map +1 -0
  338. package/dist/hub/runtime.d.ts +106 -0
  339. package/dist/hub/runtime.js +298 -0
  340. package/dist/hub/runtime.js.map +1 -0
  341. package/dist/hub/server.d.ts +56 -0
  342. package/dist/hub/server.js +202 -0
  343. package/dist/hub/server.js.map +1 -0
  344. package/dist/hub/service-start.d.ts +17 -0
  345. package/dist/hub/service-start.js +109 -0
  346. package/dist/hub/service-start.js.map +1 -0
  347. package/dist/hub/sessions.d.ts +53 -0
  348. package/dist/hub/sessions.js +196 -0
  349. package/dist/hub/sessions.js.map +1 -0
  350. package/dist/hub/socket.d.ts +24 -0
  351. package/dist/hub/socket.js +79 -0
  352. package/dist/hub/socket.js.map +1 -0
  353. package/dist/hub/store.d.ts +77 -0
  354. package/dist/hub/store.js +88 -0
  355. package/dist/hub/store.js.map +1 -0
  356. package/dist/hub/tls.d.ts +31 -0
  357. package/dist/hub/tls.js +135 -0
  358. package/dist/hub/tls.js.map +1 -0
  359. package/dist/hub/types.d.ts +401 -0
  360. package/dist/hub/types.js +2 -0
  361. package/dist/hub/types.js.map +1 -0
  362. package/dist/hub/validation.d.ts +33 -0
  363. package/dist/hub/validation.js +136 -0
  364. package/dist/hub/validation.js.map +1 -0
  365. package/dist/hub/version-floor.d.ts +10 -0
  366. package/dist/hub/version-floor.js +45 -0
  367. package/dist/hub/version-floor.js.map +1 -0
  368. package/dist/hub-browser-certificate-policy.d.ts +31 -0
  369. package/dist/hub-browser-certificate-policy.js +25 -0
  370. package/dist/hub-browser-certificate-policy.js.map +1 -0
  371. package/dist/hub-membership-settings.d.ts +6 -0
  372. package/dist/hub-membership-settings.js +21 -0
  373. package/dist/hub-membership-settings.js.map +1 -0
  374. package/dist/hub-mode.d.ts +15 -0
  375. package/dist/hub-mode.js +17 -0
  376. package/dist/hub-mode.js.map +1 -0
  377. package/dist/hub-pairing-summary.d.ts +48 -0
  378. package/dist/hub-pairing-summary.js +36 -0
  379. package/dist/hub-pairing-summary.js.map +1 -0
  380. package/dist/hub-report-target.d.ts +32 -0
  381. package/dist/hub-report-target.js +33 -0
  382. package/dist/hub-report-target.js.map +1 -0
  383. package/dist/hub-retention-policy.d.ts +14 -0
  384. package/dist/hub-retention-policy.js +15 -0
  385. package/dist/hub-retention-policy.js.map +1 -0
  386. package/dist/instance-config-impact.js +3 -0
  387. package/dist/instance-config-impact.js.map +1 -1
  388. package/dist/instance-lifecycle.d.ts +17 -2
  389. package/dist/instance-lifecycle.js +58 -8
  390. package/dist/instance-lifecycle.js.map +1 -1
  391. package/dist/instance-topic-delete.d.ts +77 -0
  392. package/dist/instance-topic-delete.js +123 -0
  393. package/dist/instance-topic-delete.js.map +1 -0
  394. package/dist/instructions.d.ts +1 -1
  395. package/dist/instructions.js +1 -1
  396. package/dist/instructions.js.map +1 -1
  397. package/dist/kiro-engine-status.d.ts +11 -0
  398. package/dist/kiro-engine-status.js +6 -0
  399. package/dist/kiro-engine-status.js.map +1 -1
  400. package/dist/launchd-service-domain.d.ts +5 -0
  401. package/dist/launchd-service-domain.js +21 -0
  402. package/dist/launchd-service-domain.js.map +1 -0
  403. package/dist/locale.js +125 -3
  404. package/dist/locale.js.map +1 -1
  405. package/dist/log-service.d.ts +28 -0
  406. package/dist/log-service.js +29 -0
  407. package/dist/log-service.js.map +1 -1
  408. package/dist/log-steps.d.ts +4 -3
  409. package/dist/log-steps.js +32 -7
  410. package/dist/log-steps.js.map +1 -1
  411. package/dist/logger.d.ts +16 -2
  412. package/dist/logger.js +346 -66
  413. package/dist/logger.js.map +1 -1
  414. package/dist/login-flows.d.ts +15 -7
  415. package/dist/login-flows.js +29 -3
  416. package/dist/login-flows.js.map +1 -1
  417. package/dist/login-manager.js +25 -4
  418. package/dist/login-manager.js.map +1 -1
  419. package/dist/ls-rows.js +3 -4
  420. package/dist/ls-rows.js.map +1 -1
  421. package/dist/missed-offline.d.ts +25 -0
  422. package/dist/missed-offline.js +79 -0
  423. package/dist/missed-offline.js.map +1 -0
  424. package/dist/native-instance-api.d.ts +0 -1
  425. package/dist/native-instance-api.js +15 -3
  426. package/dist/native-instance-api.js.map +1 -1
  427. package/dist/native-instance-input.d.ts +3 -0
  428. package/dist/native-instance-input.js +6 -1
  429. package/dist/native-instance-input.js.map +1 -1
  430. package/dist/native-instance-registry.d.ts +6 -0
  431. package/dist/native-instance-registry.js +24 -0
  432. package/dist/native-instance-registry.js.map +1 -1
  433. package/dist/native-mcp.d.ts +3 -0
  434. package/dist/native-mcp.js +15 -2
  435. package/dist/native-mcp.js.map +1 -1
  436. package/dist/native-pane-lifecycle.d.ts +8 -0
  437. package/dist/native-pane-lifecycle.js +13 -4
  438. package/dist/native-pane-lifecycle.js.map +1 -1
  439. package/dist/native-pane-manager.js +17 -9
  440. package/dist/native-pane-manager.js.map +1 -1
  441. package/dist/needs-you-hub.d.ts +9 -1
  442. package/dist/needs-you-hub.js +46 -8
  443. package/dist/needs-you-hub.js.map +1 -1
  444. package/dist/needs-you.d.ts +47 -2
  445. package/dist/needs-you.js +31 -3
  446. package/dist/needs-you.js.map +1 -1
  447. package/dist/office-share-page.js +2 -2
  448. package/dist/office-share-page.js.map +1 -1
  449. package/dist/office-share.d.ts +11 -0
  450. package/dist/office-share.js +14 -0
  451. package/dist/office-share.js.map +1 -1
  452. package/dist/office-talk.d.ts +26 -0
  453. package/dist/office-talk.js +50 -0
  454. package/dist/office-talk.js.map +1 -0
  455. package/dist/outbound-handlers.d.ts +14 -0
  456. package/dist/outbound-handlers.js +49 -6
  457. package/dist/outbound-handlers.js.map +1 -1
  458. package/dist/outbound-schemas.d.ts +33 -1
  459. package/dist/outbound-schemas.js +29 -16
  460. package/dist/outbound-schemas.js.map +1 -1
  461. package/dist/pane-quota-history.d.ts +9 -0
  462. package/dist/pane-quota-history.js +67 -0
  463. package/dist/pane-quota-history.js.map +1 -0
  464. package/dist/pause-marker.d.ts +1 -1
  465. package/dist/pause-marker.js +1 -1
  466. package/dist/pause-marker.js.map +1 -1
  467. package/dist/platform-general.d.ts +46 -0
  468. package/dist/platform-general.js +91 -0
  469. package/dist/platform-general.js.map +1 -0
  470. package/dist/public-web-gateway.js +7 -0
  471. package/dist/public-web-gateway.js.map +1 -1
  472. package/dist/queued-handoffs.d.ts +33 -0
  473. package/dist/queued-handoffs.js +75 -0
  474. package/dist/queued-handoffs.js.map +1 -0
  475. package/dist/quickstart.d.ts +13 -0
  476. package/dist/quickstart.js +81 -5
  477. package/dist/quickstart.js.map +1 -1
  478. package/dist/quota-notice.d.ts +7 -0
  479. package/dist/quota-notice.js +40 -0
  480. package/dist/quota-notice.js.map +1 -1
  481. package/dist/reply-buttons-controller.js +10 -6
  482. package/dist/reply-buttons-controller.js.map +1 -1
  483. package/dist/reply-polls.d.ts +2 -2
  484. package/dist/reply-polls.js +3 -3
  485. package/dist/reply-polls.js.map +1 -1
  486. package/dist/runtime-api.d.ts +2 -0
  487. package/dist/runtime-api.js +25 -7
  488. package/dist/runtime-api.js.map +1 -1
  489. package/dist/runtime-build-info.js +5 -3
  490. package/dist/runtime-build-info.js.map +1 -1
  491. package/dist/runtime-bundle.d.ts +3 -0
  492. package/dist/runtime-bundle.js +3 -1
  493. package/dist/runtime-bundle.js.map +1 -1
  494. package/dist/runtime-cli.d.ts +8 -1
  495. package/dist/runtime-cli.js +127 -8
  496. package/dist/runtime-cli.js.map +1 -1
  497. package/dist/runtime-client-store.d.ts +7 -0
  498. package/dist/runtime-client-store.js +30 -2
  499. package/dist/runtime-client-store.js.map +1 -1
  500. package/dist/runtime-client.d.ts +63 -1
  501. package/dist/runtime-client.js +295 -21
  502. package/dist/runtime-client.js.map +1 -1
  503. package/dist/runtime-coordinator.d.ts +7 -0
  504. package/dist/runtime-coordinator.js +213 -35
  505. package/dist/runtime-coordinator.js.map +1 -1
  506. package/dist/runtime-credential-profiles.d.ts +78 -0
  507. package/dist/runtime-credential-profiles.js +280 -0
  508. package/dist/runtime-credential-profiles.js.map +1 -0
  509. package/dist/runtime-install.d.ts +50 -0
  510. package/dist/runtime-install.js +186 -0
  511. package/dist/runtime-install.js.map +1 -0
  512. package/dist/runtime-pane-assets.d.ts +1 -1
  513. package/dist/runtime-pane-assets.js +1 -1
  514. package/dist/runtime-pane-assets.js.map +1 -1
  515. package/dist/runtime-pane-codex-index.d.ts +10 -1
  516. package/dist/runtime-pane-codex-index.js +131 -27
  517. package/dist/runtime-pane-codex-index.js.map +1 -1
  518. package/dist/runtime-pane-host.d.ts +19 -0
  519. package/dist/runtime-pane-host.js +50 -7
  520. package/dist/runtime-pane-host.js.map +1 -1
  521. package/dist/runtime-pane-link.d.ts +7 -0
  522. package/dist/runtime-pane-link.js +93 -2
  523. package/dist/runtime-pane-link.js.map +1 -1
  524. package/dist/runtime-pane-mcp-relay.d.ts +1 -0
  525. package/dist/runtime-pane-mcp-relay.js +10 -0
  526. package/dist/runtime-pane-mcp-relay.js.map +1 -1
  527. package/dist/runtime-pane-mcp.d.ts +4 -0
  528. package/dist/runtime-pane-mcp.js +6 -3
  529. package/dist/runtime-pane-mcp.js.map +1 -1
  530. package/dist/runtime-pane-native.d.ts +32 -2
  531. package/dist/runtime-pane-native.js +55 -6
  532. package/dist/runtime-pane-native.js.map +1 -1
  533. package/dist/runtime-pane-port.d.ts +5 -0
  534. package/dist/runtime-pane-port.js +17 -1
  535. package/dist/runtime-pane-port.js.map +1 -1
  536. package/dist/runtime-pane-process.d.ts +1 -1
  537. package/dist/runtime-pane-process.js +11 -2
  538. package/dist/runtime-pane-process.js.map +1 -1
  539. package/dist/runtime-pane-protocol.d.ts +11 -1
  540. package/dist/runtime-pane-protocol.js +27 -5
  541. package/dist/runtime-pane-protocol.js.map +1 -1
  542. package/dist/runtime-pane-quota-history.d.ts +6 -0
  543. package/dist/runtime-pane-quota-history.js +44 -0
  544. package/dist/runtime-pane-quota-history.js.map +1 -0
  545. package/dist/runtime-pane-service.d.ts +5 -0
  546. package/dist/runtime-pane-service.js +47 -12
  547. package/dist/runtime-pane-service.js.map +1 -1
  548. package/dist/runtime-pane-transcript.d.ts +5 -0
  549. package/dist/runtime-pane-transcript.js +66 -5
  550. package/dist/runtime-pane-transcript.js.map +1 -1
  551. package/dist/runtime-pane-worker.js +19 -6
  552. package/dist/runtime-pane-worker.js.map +1 -1
  553. package/dist/runtime-protocol.d.ts +17 -2
  554. package/dist/runtime-protocol.js +12 -0
  555. package/dist/runtime-protocol.js.map +1 -1
  556. package/dist/runtime-update-activity.d.ts +21 -0
  557. package/dist/runtime-update-activity.js +51 -0
  558. package/dist/runtime-update-activity.js.map +1 -0
  559. package/dist/runtime-update-artifact.d.ts +31 -0
  560. package/dist/runtime-update-artifact.js +252 -0
  561. package/dist/runtime-update-artifact.js.map +1 -0
  562. package/dist/runtime-update-install.d.ts +31 -0
  563. package/dist/runtime-update-install.js +205 -0
  564. package/dist/runtime-update-install.js.map +1 -0
  565. package/dist/runtime-update-journal.d.ts +44 -0
  566. package/dist/runtime-update-journal.js +121 -0
  567. package/dist/runtime-update-journal.js.map +1 -0
  568. package/dist/runtime-update-lock.d.ts +48 -0
  569. package/dist/runtime-update-lock.js +217 -0
  570. package/dist/runtime-update-lock.js.map +1 -0
  571. package/dist/runtime-update-owners.d.ts +29 -0
  572. package/dist/runtime-update-owners.js +240 -0
  573. package/dist/runtime-update-owners.js.map +1 -0
  574. package/dist/runtime-update-protocol.d.ts +15 -0
  575. package/dist/runtime-update-protocol.js +13 -0
  576. package/dist/runtime-update-protocol.js.map +1 -0
  577. package/dist/runtime-windows-bridge.d.ts +2 -1
  578. package/dist/runtime-windows-bridge.js +11 -1
  579. package/dist/runtime-windows-bridge.js.map +1 -1
  580. package/dist/scheduler/db.d.ts +2 -1
  581. package/dist/scheduler/db.js +23 -9
  582. package/dist/scheduler/db.js.map +1 -1
  583. package/dist/scheduler/task-board-text.js +1 -1
  584. package/dist/scheduler/task-board-text.js.map +1 -1
  585. package/dist/scheduler/task-board.d.ts +13 -0
  586. package/dist/scheduler/task-board.js +28 -3
  587. package/dist/scheduler/task-board.js.map +1 -1
  588. package/dist/service-drain.d.ts +19 -0
  589. package/dist/service-drain.js +64 -0
  590. package/dist/service-drain.js.map +1 -0
  591. package/dist/service-installer.d.ts +7 -2
  592. package/dist/service-installer.js +13 -10
  593. package/dist/service-installer.js.map +1 -1
  594. package/dist/settings-api.d.ts +20 -0
  595. package/dist/settings-api.js +414 -4
  596. package/dist/settings-api.js.map +1 -1
  597. package/dist/settings-baseline.d.ts +6 -0
  598. package/dist/settings-baseline.js +3 -1
  599. package/dist/settings-baseline.js.map +1 -1
  600. package/dist/settings-change.js +29 -6
  601. package/dist/settings-change.js.map +1 -1
  602. package/dist/settings-effect.d.ts +13 -0
  603. package/dist/settings-effect.js +97 -0
  604. package/dist/settings-effect.js.map +1 -1
  605. package/dist/settings-http-confirmation.js +13 -1
  606. package/dist/settings-http-confirmation.js.map +1 -1
  607. package/dist/settings-instance-patch.js +27 -0
  608. package/dist/settings-instance-patch.js.map +1 -1
  609. package/dist/setup-wizard.js +6 -2
  610. package/dist/setup-wizard.js.map +1 -1
  611. package/dist/task-board-tool.d.ts +13 -1
  612. package/dist/task-board-tool.js +104 -4
  613. package/dist/task-board-tool.js.map +1 -1
  614. package/dist/task-board-waker.d.ts +6 -0
  615. package/dist/task-board-waker.js +4 -0
  616. package/dist/task-board-waker.js.map +1 -1
  617. package/dist/tmux-binary.d.ts +59 -0
  618. package/dist/tmux-binary.js +200 -0
  619. package/dist/tmux-binary.js.map +1 -0
  620. package/dist/tmux-control.js +4 -4
  621. package/dist/tmux-control.js.map +1 -1
  622. package/dist/tmux-exec-helper.js +32 -1
  623. package/dist/tmux-exec-helper.js.map +1 -1
  624. package/dist/tmux-manager.d.ts +1 -1
  625. package/dist/tmux-manager.js +45 -36
  626. package/dist/tmux-manager.js.map +1 -1
  627. package/dist/tmux-read.js +4 -3
  628. package/dist/tmux-read.js.map +1 -1
  629. package/dist/tool-permissions.d.ts +5 -2
  630. package/dist/tool-permissions.js +6 -5
  631. package/dist/tool-permissions.js.map +1 -1
  632. package/dist/tool-progress.d.ts +2 -0
  633. package/dist/tool-progress.js +19 -3
  634. package/dist/tool-progress.js.map +1 -1
  635. package/dist/topic-commands.js +10 -5
  636. package/dist/topic-commands.js.map +1 -1
  637. package/dist/transcript-monitor.d.ts +20 -0
  638. package/dist/transcript-monitor.js +47 -3
  639. package/dist/transcript-monitor.js.map +1 -1
  640. package/dist/transcript-needles.d.ts +7 -0
  641. package/dist/transcript-needles.js +9 -1
  642. package/dist/transcript-needles.js.map +1 -1
  643. package/dist/transcript-records.d.ts +1 -1
  644. package/dist/transcript-records.js +2 -1
  645. package/dist/transcript-records.js.map +1 -1
  646. package/dist/types.d.ts +6 -0
  647. package/dist/ui/account-identity.js +27 -0
  648. package/dist/ui/accounts-view.js +214 -0
  649. package/dist/ui/agent-runtime-settings.js +9 -8
  650. package/dist/ui/backend-signin.js +4 -1
  651. package/dist/ui/chat-ambient.js +1 -1
  652. package/dist/ui/chat-md-strings.js +3 -0
  653. package/dist/ui/chat-render.js +3 -670
  654. package/dist/ui/chat-store.js +1 -1
  655. package/dist/ui/chat-strings.js +3 -333
  656. package/dist/ui/chat-thread.js +3 -919
  657. package/dist/ui/chat-time.js +3 -80
  658. package/dist/ui/chat-tour.js +1 -1
  659. package/dist/ui/credential-profile-select.js +54 -0
  660. package/dist/ui/fleet-office-dialogue.d.ts +30 -0
  661. package/dist/ui/fleet-office-dialogue.js +382 -0
  662. package/dist/ui/fleet-office-pack.d.ts +9 -0
  663. package/dist/ui/fleet-office-pack.js +76 -4
  664. package/dist/ui/fleet-office-skin.js +23 -5
  665. package/dist/ui/fleet-office-store.js +5 -0
  666. package/dist/ui/fleet-office.js +173 -6
  667. package/dist/ui/fleet-task-card.js +10 -6
  668. package/dist/ui/fleet-task-common.js +12 -2
  669. package/dist/ui/fleet-task-menu.js +188 -0
  670. package/dist/ui/fleet-task-stats.js +124 -0
  671. package/dist/ui/fleet-task-view.js +340 -0
  672. package/dist/ui/fleet-tasks.js +131 -43
  673. package/dist/ui/fleet-usage.js +90 -27
  674. package/dist/ui/html-attachment.js +3 -40
  675. package/dist/ui/hub-agent-copy.js +23 -0
  676. package/dist/ui/hub-button-actions.js +65 -0
  677. package/dist/ui/hub-chat-store.js +158 -0
  678. package/dist/ui/hub-chat-strings.js +77 -0
  679. package/dist/ui/hub-client.js +329 -0
  680. package/dist/ui/hub-owner-strings.js +51 -0
  681. package/dist/ui/hub-provider-guidance.js +31 -0
  682. package/dist/ui/hub-quota.js +85 -0
  683. package/dist/ui/hub-strings.js +162 -0
  684. package/dist/ui/hub-switcher.js +27 -0
  685. package/dist/ui/native-pane-recovery.js +1 -1
  686. package/dist/ui/office-share-page.js +4 -2
  687. package/dist/ui/panel-chat.js +34 -48
  688. package/dist/ui/panel-details.js +1 -1
  689. package/dist/ui/panel-fleet.js +78 -10
  690. package/dist/ui/panel-hub.js +619 -0
  691. package/dist/ui/panel-log.js +2 -2
  692. package/dist/ui/panel-needs.js +24 -8
  693. package/dist/ui/panel-runtimes.js +114 -23
  694. package/dist/ui/panel-settings.js +69 -80
  695. package/dist/ui/panel-windows-cli.js +12 -2
  696. package/dist/ui/preview-pages.js +1 -1
  697. package/dist/ui/preview-panel.js +92 -6
  698. package/dist/ui/preview-versions.js +1 -1
  699. package/dist/ui/preview.js +3 -476
  700. package/dist/ui/runtime-commands.d.ts +4 -0
  701. package/dist/ui/runtime-commands.js +59 -0
  702. package/dist/ui/search-dialog.js +2 -0
  703. package/dist/ui/settings-access-strings.js +42 -0
  704. package/dist/ui/settings-build-version.js +35 -0
  705. package/dist/ui/settings-codex-copy.js +19 -0
  706. package/dist/ui/settings-devices.js +253 -0
  707. package/dist/ui/settings-dialogs.js +28 -7
  708. package/dist/ui/settings-hub-browser-certificate.js +74 -0
  709. package/dist/ui/settings-hub-membership.js +72 -0
  710. package/dist/ui/settings-hub-retention.js +52 -0
  711. package/dist/ui/settings-hub.js +196 -0
  712. package/dist/ui/settings-layout.js +8 -11
  713. package/dist/ui/settings-model.js +16 -2
  714. package/dist/ui/settings-outside.js +104 -38
  715. package/dist/ui/settings-registry.js +4 -1
  716. package/dist/ui/settings-shared-strings.js +143 -0
  717. package/dist/ui/settings-shared.js +345 -0
  718. package/dist/ui/settings-strings.js +10 -46
  719. package/dist/ui/settings-web-authority.js +5 -2
  720. package/dist/ui/shared/accounts.css +15 -0
  721. package/dist/ui/shared/app-i18n.js +2 -2
  722. package/dist/ui/shared/app-needs.js +1 -1
  723. package/dist/ui/shared/app-route.js +6 -1
  724. package/dist/ui/shared/app-session.js +6 -2
  725. package/dist/ui/shared/app-shell.js +64 -8
  726. package/dist/ui/shared/app.css +121 -30
  727. package/dist/ui/shared/app.js +12 -3
  728. package/dist/ui/shared/chat-composer.js +68 -0
  729. package/dist/ui/shared/chat-md-strings.js +9 -0
  730. package/dist/ui/shared/chat-render.js +682 -0
  731. package/dist/ui/shared/chat-strings.js +333 -0
  732. package/dist/ui/shared/chat-thread.js +969 -0
  733. package/dist/ui/shared/chat-time.js +80 -0
  734. package/dist/ui/shared/header-tools.js +3 -5
  735. package/dist/ui/shared/html-attachment.js +42 -0
  736. package/dist/ui/shared/hub-chat.css +85 -0
  737. package/dist/ui/shared/hub-owner.css +33 -0
  738. package/dist/ui/shared/hub-quota.css +8 -0
  739. package/dist/ui/shared/hub.css +71 -0
  740. package/dist/ui/shared/page-head.js +8 -0
  741. package/dist/ui/shared/panel-view.js +77 -4
  742. package/dist/ui/shared/preview.js +476 -0
  743. package/dist/ui/shared/runtime-install.css +26 -0
  744. package/dist/ui/shared/side-rail.js +15 -0
  745. package/dist/ui/shared/signin.js +172 -0
  746. package/dist/ui/shared/task-board.css +95 -0
  747. package/dist/ui/shared/usage-dialog.js +18 -1
  748. package/dist/ui/shared/view-history.css +17 -0
  749. package/dist/ui/shared/view-history.js +438 -0
  750. package/dist/ui/shared/view-strings.js +16 -0
  751. package/dist/ui/shared/workspace.css +20 -0
  752. package/dist/ui/signin.html +21 -0
  753. package/dist/ui/workspace-panel.js +189 -0
  754. package/dist/ui/workspace-strings.js +35 -0
  755. package/dist/unattended-install.d.ts +11 -2
  756. package/dist/unattended-install.js +41 -6
  757. package/dist/unattended-install.js.map +1 -1
  758. package/dist/usage/capacity.d.ts +69 -0
  759. package/dist/usage/capacity.js +119 -0
  760. package/dist/usage/capacity.js.map +1 -0
  761. package/dist/usage/i18n-keys.d.ts +1 -1
  762. package/dist/usage/i18n-keys.js +3 -0
  763. package/dist/usage/i18n-keys.js.map +1 -1
  764. package/dist/usage/profile-timeline.d.ts +16 -0
  765. package/dist/usage/profile-timeline.js +58 -0
  766. package/dist/usage/profile-timeline.js.map +1 -0
  767. package/dist/usage/providers.js +2 -1
  768. package/dist/usage/providers.js.map +1 -1
  769. package/dist/usage/quota-history.d.ts +43 -0
  770. package/dist/usage/quota-history.js +168 -0
  771. package/dist/usage/quota-history.js.map +1 -0
  772. package/dist/usage/usage-api.d.ts +31 -0
  773. package/dist/usage/usage-api.js +80 -1
  774. package/dist/usage/usage-api.js.map +1 -1
  775. package/dist/usage-report.d.ts +25 -1
  776. package/dist/usage-report.js +55 -4
  777. package/dist/usage-report.js.map +1 -1
  778. package/dist/usage-rollup.d.ts +6 -1
  779. package/dist/usage-rollup.js +16 -4
  780. package/dist/usage-rollup.js.map +1 -1
  781. package/dist/view-api.d.ts +16 -0
  782. package/dist/view-api.js +105 -23
  783. package/dist/view-api.js.map +1 -1
  784. package/dist/view-history.d.ts +84 -0
  785. package/dist/view-history.js +116 -0
  786. package/dist/view-history.js.map +1 -0
  787. package/dist/web-api.d.ts +48 -2
  788. package/dist/web-api.js +276 -8
  789. package/dist/web-api.js.map +1 -1
  790. package/dist/web-backend-login.d.ts +23 -1
  791. package/dist/web-backend-login.js +11 -17
  792. package/dist/web-backend-login.js.map +1 -1
  793. package/dist/web-device-login.d.ts +153 -0
  794. package/dist/web-device-login.js +278 -0
  795. package/dist/web-device-login.js.map +1 -0
  796. package/dist/web-office-skins.d.ts +9 -0
  797. package/dist/web-office-skins.js +16 -1
  798. package/dist/web-office-skins.js.map +1 -1
  799. package/dist/web-session-authorization.d.ts +13 -2
  800. package/dist/web-session-authorization.js +10 -3
  801. package/dist/web-session-authorization.js.map +1 -1
  802. package/dist/web-session.d.ts +35 -0
  803. package/dist/web-session.js +7 -0
  804. package/dist/web-session.js.map +1 -1
  805. package/dist/web-settings-patch.d.ts +3 -1
  806. package/dist/web-settings-patch.js +4 -1
  807. package/dist/web-settings-patch.js.map +1 -1
  808. package/dist/web-shell-routes.d.ts +6 -0
  809. package/dist/web-shell-routes.js +7 -0
  810. package/dist/web-shell-routes.js.map +1 -1
  811. package/dist/web-terminal.d.ts +4 -30
  812. package/dist/web-terminal.js +9 -6
  813. package/dist/web-terminal.js.map +1 -1
  814. package/dist/windows-agents.d.ts +1 -0
  815. package/dist/windows-agents.js +1 -0
  816. package/dist/windows-agents.js.map +1 -1
  817. package/dist/windows-cli-api.d.ts +12 -1
  818. package/dist/windows-cli-api.js +27 -1
  819. package/dist/windows-cli-api.js.map +1 -1
  820. package/dist/windows-cli-providers.d.ts +0 -9
  821. package/dist/windows-cli-providers.js +4 -9
  822. package/dist/windows-cli-providers.js.map +1 -1
  823. package/dist/windows-cli-worker.d.ts +24 -0
  824. package/dist/windows-cli-worker.js +96 -5
  825. package/dist/windows-cli-worker.js.map +1 -1
  826. package/dist/windows-cli.d.ts +10 -0
  827. package/dist/windows-cli.js +10 -1
  828. package/dist/windows-cli.js.map +1 -1
  829. package/dist/yaml-shared-nodes.js +8 -3
  830. package/dist/yaml-shared-nodes.js.map +1 -1
  831. package/launcher/agend-install.cjs +8 -1
  832. package/launcher/launchd-session-type.cjs +14 -0
  833. package/launcher/postinstall.cjs +27 -2
  834. package/launcher/private-home.cjs +1 -1
  835. package/launcher/tmux-bundle.cjs +247 -0
  836. package/package.json +3 -2
  837. package/templates/launchd.plist.ejs +3 -1
  838. package/templates/runtime-install/install.ps1 +270 -0
@@ -0,0 +1,143 @@
1
+ // #3087 review: the settings.* words that Shared agent settings (the page formerly called "Agent defaults") added or reworded,
2
+ // kept in a file of their own on purpose.
3
+ //
4
+ // Why a file of their own: a tab opened before an upgrade has already run the old settings-strings.js, and the browser hands
5
+ // the same module back when the new Settings page imports that URL again — so a key the page added would read as the raw
6
+ // "settings.…" key in a tab that opened Fleet (or search) first. This file's URL is new, so no tab can hold an old copy of it:
7
+ // every module that draws one of these words imports it, right after settings-strings.js, and register() merges its words over
8
+ // whatever that file said (the later call wins), so a reworded key also reads in its new words.
9
+ //
10
+ // Rules for this file:
11
+ // - A key lives here or in settings-strings.js, never in both. Move a key here when a change to the Shared agent settings page
12
+ // adds it or rewords it; delete it from settings-strings.js in the same change.
13
+ // - Every module that reads one of these keys imports "./settings-shared-strings.js" after "./settings-strings.js": the
14
+ // Settings page (panel-settings.js, settings-shared.js), the dialogs it borrows (settings-dialogs.js) and the paths outside
15
+ // Settings that print one — search (search-dialog.js, settings-registry.js). tests/settings-shared-strings-3087.test.ts
16
+ // checks that every module that reads a key from here imports this file.
17
+ import { register } from "/assets/app-i18n.js";
18
+
19
+ register("settings", {
20
+ en: {
21
+ // Reworded (settings-strings.js had these keys before; the new words win).
22
+ dailyTips: "Daily tips (General topic)",
23
+ dailyTipsHint: "Posts one usage tip a day in the General topic. Off stops them; /tips still posts where you call it.",
24
+ changeInDefaults: "change in Shared agent settings",
25
+ hangEnabled: "Hang detector",
26
+ crossInstanceVisibility: "Bot-to-bot messages in topics",
27
+ crossInstanceVisibilityHint: "How much of a message from one agent to another is shown in this agent's topic: all of it, one line, or nothing. Messages are always delivered; the Mirror Topic still shows them.",
28
+ "sec_agent-defaults": "Shared agent settings",
29
+ updateDefaults: "Update shared agent settings",
30
+ devFormsUnsaved: "Save or discard the unsaved changes to agents, shared agent settings or connections first: this editor writes the same settings.",
31
+ help4: "General: shared agent settings and ClassicBot defaults. Web: the dashboard's sign-in sessions, browser terminal, web echo, Log and public link. Review changes stages them.",
32
+ // Added.
33
+ defaultMarkTip: "Nobody set this in fleet.yaml, so the built-in value shown is in use. Editing it saves your own value.",
34
+ // The same five, as one or two words (the hover on the usage pill lists who sets which).
35
+ dashboardShort_appearance: "Appearance", dashboardShort_task_board: "Task board", dashboardShort_web_settings: "Web settings", dashboardShort_office: "Office", dashboardShort_office_packs: "Office packs",
36
+ // Shared agent settings (formerly "Agent defaults"): what the page is, what each field does (the ⓘ), what an edit costs.
37
+ sharedGroupAgents: "Shared agent settings", sharedGroupAgentsSub: "An individual agent can override these",
38
+ sharedGroupSystem: "System & channels", sharedGroupSystemSub: "One value for the whole fleet — an agent can't change it",
39
+ sharedGroupSystemAdvancedSub: "One value for the whole fleet — an agent can't change it, except the hang detector, which an agent can also set for itself",
40
+ advancedCount: "Advanced ({0})",
41
+ hostTag: "this host", switchOn: "On", switchOff: "Off", hangUnit: "minutes without output → alert", tipLabel: "About \u201c{0}\u201d",
42
+ usageCount: "{0}/{1} in use", usageOwn: "{0} custom", usagePartly: "{0} partly custom", usageMany: "{0} agents",
43
+ usageTipAll: "Every agent uses the value on this page.",
44
+ usageTipOwners: "Set on their own under Agents, so a change here does not reach them: {0}.",
45
+ usageTipParts: "An agent that sets an item on its own (under Agents) is not reached by a change to that item here; it still follows this page for its other items. Set on their own: {0}.",
46
+ usageRooms: "{0} ClassicBot room(s) follow this value too (they are not in this count).",
47
+ backendInfo: "Only this host is checked. For a CLI on a Windows PC, open that agent's settings and choose Change runtime / CLI.", backendInfoLink: "Windows PCs and their CLIs: Runtime",
48
+ tipBackend: "The coding CLI an agent runs on (claude-code, codex, kiro-cli …). The installed / signed-in status beside each name is read on the machine AgEnD runs on, not on other computers.",
49
+ tipModel: "The model an agent asks its CLI for. “CLI default” lets the CLI choose. The list follows the default backend and is read on this host.",
50
+ tipAutoPause: "An agent idle this long is paused to free memory; a new message wakes it. 0 = never pause.",
51
+ tipToolProgress: "How much of an agent's tool activity shows in the chat while it works. Off: nothing. Standard: short labels (“Reading a file”). Verbose: labels plus command previews.",
52
+ tipLocale: "The language of bot replies and notices. Read when AgEnD starts. Auto follows the system.",
53
+ tipReplyGuard: "When a person's message ends without the agent sending a reply, AgEnD nudges it to answer.",
54
+ tipToolSet: "Which tools an agent may call. Worker is the usual one; Coordinator adds fleet management; Full allows every tool.",
55
+ tipAgentMode: "How an agent talks to AgEnD. MCP is the default and recommended; CLI (HTTP commands) is for a CLI without MCP.",
56
+ tipLogLevel: "How much detail an agent writes to its log. Info is normal; Debug and Trace are for troubleshooting and write a lot.",
57
+ tipHang: "Raise an alert when an agent produces no output at all for this long. An individual agent can set its own minutes under Agents.",
58
+ tipConcurrency: "How many agents AgEnD starts at the same time when it boots. Empty picks 2–10 from free memory and CPU cores.",
59
+ tipStagger: "The least AgEnD waits between starting one agent and the next, in milliseconds. Default: 500.",
60
+ seg_tool_progress_off: "Off", seg_tool_progress_standard: "Standard", seg_tool_progress_verbose: "Verbose",
61
+ seg_visibility_full: "Full", seg_visibility_summary: "Summary", seg_visibility_hidden: "Hidden",
62
+ seg_agent_mode_mcp: "MCP (recommended)", seg_agent_mode_cli: "CLI",
63
+ opt_tool_set_worker: "Worker — talk, read, do the work", opt_tool_set_coordinator: "Coordinator — worker plus fleet management",
64
+ opt_tool_set_standard: "Standard — a mid-sized set", opt_tool_set_minimal: "Minimal — only the basics", opt_tool_set_full: "Full — every tool",
65
+ opt_log_level_trace: "Trace — everything", opt_log_level_debug: "Debug — for troubleshooting", opt_log_level_info: "Info — normal",
66
+ opt_log_level_warn: "Warn — problems only", opt_log_level_error: "Error — failures only",
67
+ noteRestartAgents: "↻ After saving, {0} agent(s) restart", noteSkip: " ({0} set their own — not affected)",
68
+ noteApplyAgents: "↻ After saving, {0} agent(s) use the new value; the {1} running restart",
69
+ noteApplyIdle: "After saving, {0} agent(s) use the new value; none is running, so none restarts",
70
+ noteRestartRooms: "↻ After saving, {0} ClassicBot room(s) that follow this value restart",
71
+ noteApplyRooms: "↻ After saving, {0} ClassicBot room(s) use the new value; the {1} running restart",
72
+ noteIdleRooms: "After saving, {0} ClassicBot room(s) use the new value; none is running, so none restarts",
73
+ noteAllOverride: "Every agent sets this on its own, so none is affected.", noteNoAgents: "No agents yet — agents you create later start with this value.",
74
+ noteRestartFleet: "↻ AgEnD has to restart for this to take effect", noteConfirmAdmin: "A fleet admin has to confirm when you save",
75
+ noteConfirmTick: "Newly ticked items are confirmed first",
76
+ barRestartAgents: "↻ {0} agent(s) restart after saving", barRestartFleet: "↻ AgEnD restarts",
77
+ barApplyAgents: "↻ {0} agent(s) use the new value; the {1} running restart", barApplyIdle: "{0} agent(s) use the new value; none is running",
78
+ barRestartRooms: "↻ {0} ClassicBot room(s) restart after saving", barApplyRooms: "↻ {0} ClassicBot room(s) use the new value; the {1} running restart",
79
+ barIdleRooms: "{0} ClassicBot room(s) use the new value; none is running",
80
+ backendNotInstalledHost: "not installed on this host",
81
+ },
82
+ "zh-TW": {
83
+ // 改過字句的 key(settings-strings.js 原本就有;以這裡的新字句為準)。
84
+ dailyTips: "每日提示(General 頻道)",
85
+ dailyTipsHint: "每天在 General 頻道發一則使用小提示。關閉就不再發;/tips 仍會發到你呼叫的聊天室。",
86
+ changeInDefaults: "到 Agent 共用設定變更",
87
+ hangEnabled: "卡住偵測",
88
+ crossInstanceVisibility: "Agent 之間的訊息",
89
+ crossInstanceVisibilityHint: "Agent 傳給 Agent 的訊息,要在這個 Agent 的主題裡顯示多少:完整、一行摘要,或不顯示。訊息一律照常送達,Mirror Topic 也照常顯示。",
90
+ "sec_agent-defaults": "Agent 共用設定",
91
+ updateDefaults: "更新 Agent 共用設定",
92
+ devFormsUnsaved: "請先儲存或捨棄 Agent、Agent 共用設定或連線中未儲存的變更:這個編輯器會寫入相同的設定。",
93
+ help4: "一般:Agent 共用設定與 ClassicBot 預設值。網頁:儀表板的登入 session、瀏覽器終端機、網頁轉發、紀錄與公開連結。「檢查變更」會把它們暫存。",
94
+ // 新增的 key。
95
+ defaultMarkTip: "fleet.yaml 沒有設定這一項,目前使用的是內建值。修改後會存成你自己的值。",
96
+ dashboardShort_appearance: "外觀", dashboardShort_task_board: "任務看板", dashboardShort_web_settings: "網頁外觀設定", dashboardShort_office: "辦公室", dashboardShort_office_packs: "辦公室外觀包",
97
+ // Agent 共用設定(原「Agent 預設值」):這一頁是什麼、每個欄位做什麼(ⓘ)、改了會怎樣。
98
+ sharedGroupAgents: "Agent 共用設定", sharedGroupAgentsSub: "個別 Agent 可以自己改掉",
99
+ sharedGroupSystem: "系統與頻道", sharedGroupSystemSub: "整個 Fleet 一起,不能個別改",
100
+ sharedGroupSystemAdvancedSub: "整個 Fleet 一起,不能個別改;只有卡住偵測可以另外在個別 Agent 設定",
101
+ advancedCount: "進階設定({0} 項)",
102
+ hostTag: "此主機", switchOn: "開", switchOff: "關", hangUnit: "分鐘沒輸出就提醒", tipLabel: "「{0}」的說明",
103
+ usageCount: "{0}/{1} 套用中", usageOwn: "{0} 自訂", usagePartly: "{0} 部分自訂", usageMany: "{0} 個 Agent",
104
+ usageTipAll: "所有 Agent 都用這裡的值。",
105
+ usageTipOwners: "在 Agents 頁自己設定了這一項,這裡改了不影響它們:{0}。",
106
+ usageTipParts: "Agent 在 Agents 頁自己設定了某一項,這裡改那一項就不會影響它;其他項目仍然跟著這裡。自己設定的:{0}。",
107
+ usageRooms: "另有 {0} 個 ClassicBot 房間也沿用這個值(不在上面的數字裡)。",
108
+ backendInfo: "只檢查這台主機。Windows 電腦上的 CLI,請在個別 Agent 的設定裡按「切換 Runtime/CLI」。", backendInfoLink: "查看 Windows 電腦與 CLI:Runtime",
109
+ tipBackend: "Agent 用哪一種 coding CLI 執行(claude-code、codex、kiro-cli…)。每個名稱旁的「已安裝/已登入」狀態,是在 AgEnD 所在的這台主機上檢查的,不包含其他電腦。",
110
+ tipModel: "Agent 向 CLI 要求使用的模型。「CLI 自己的預設」就是讓 CLI 自己決定。清單跟著預設後端換,內容是這台主機上讀到的。",
111
+ tipAutoPause: "Agent 閒置這麼久就暫停、釋放記憶體,有新訊息會自動喚醒。0=不自動暫停。",
112
+ tipToolProgress: "Agent 工作時,聊天室顯示多少工具活動。關:不顯示。標準:簡短說明(例如「正在讀取檔案」)。詳細:說明加上指令預覽。",
113
+ tipLocale: "Bot 回覆與通知使用的語言。AgEnD 啟動時讀取。「自動」會跟隨系統。",
114
+ tipReplyGuard: "使用者的訊息處理完卻沒有回覆時,AgEnD 會提醒 Agent 補上回覆。",
115
+ tipToolSet: "Agent 可以呼叫哪些工具。Worker 最常用;Coordinator 多了管理 Fleet 的工具;Full 全部開放。",
116
+ tipAgentMode: "Agent 跟 AgEnD 溝通的方式。MCP 是預設、建議;CLI(HTTP 指令)給不支援 MCP 的 CLI 用。",
117
+ tipLogLevel: "Agent 的 log 寫多詳細。Info 是一般;Debug、Trace 用來除錯,會寫很多。",
118
+ tipHang: "Agent 超過這段時間完全沒有輸出,就發出提醒。個別 Agent 可以在 Agents 頁自己設定分鐘數。",
119
+ tipConcurrency: "AgEnD 開機時同時啟動幾個 Agent。留空會依可用記憶體與 CPU 核心數在 2–10 之間自動決定。",
120
+ tipStagger: "啟動一個 Agent 到下一個之間至少等多久(毫秒)。預設:500。",
121
+ seg_tool_progress_off: "關", seg_tool_progress_standard: "標準", seg_tool_progress_verbose: "詳細",
122
+ seg_visibility_full: "完整", seg_visibility_summary: "摘要", seg_visibility_hidden: "隱藏",
123
+ seg_agent_mode_mcp: "MCP(建議)", seg_agent_mode_cli: "CLI",
124
+ opt_tool_set_worker: "Worker — 溝通、讀取、做事", opt_tool_set_coordinator: "Coordinator — Worker 加上管理 Fleet",
125
+ opt_tool_set_standard: "Standard — 中等規模", opt_tool_set_minimal: "Minimal — 只有最基本的", opt_tool_set_full: "Full — 全部工具",
126
+ opt_log_level_trace: "Trace — 全部", opt_log_level_debug: "Debug — 除錯用", opt_log_level_info: "Info — 一般",
127
+ opt_log_level_warn: "Warn — 只記問題", opt_log_level_error: "Error — 只記失敗",
128
+ noteRestartAgents: "↻ 儲存後,{0} 個 Agent 會重新啟動", noteSkip: "({0} 自訂,不受影響)",
129
+ noteApplyAgents: "↻ 儲存後,{0} 個 Agent 會套用新值,其中執行中的 {1} 個會重新啟動",
130
+ noteApplyIdle: "儲存後,{0} 個 Agent 會套用新值;目前都沒有執行中,所以不會重新啟動",
131
+ noteRestartRooms: "↻ 儲存後,沿用這個值的 {0} 個 ClassicBot 房間會重新啟動",
132
+ noteApplyRooms: "↻ 儲存後,{0} 個 ClassicBot 房間會套用新值,其中執行中的 {1} 個會重新啟動",
133
+ noteIdleRooms: "儲存後,{0} 個 ClassicBot 房間會套用新值;目前都沒有執行中,所以不會重新啟動",
134
+ noteAllOverride: "每個 Agent 都自己設定了這一項,所以都不受影響。", noteNoAgents: "目前還沒有 Agent;之後新建的會使用這個值。",
135
+ noteRestartFleet: "↻ 需要重新啟動 AgEnD 才生效", noteConfirmAdmin: "儲存時需要 Fleet 管理員確認",
136
+ noteConfirmTick: "勾選的項目要先確認才生效",
137
+ barRestartAgents: "↻ 儲存後 {0} 個 Agent 會重新啟動", barRestartFleet: "↻ 需要重新啟動 AgEnD",
138
+ barApplyAgents: "↻ {0} 個 Agent 會套用新值,其中執行中的 {1} 個會重新啟動", barApplyIdle: "{0} 個 Agent 會套用新值,目前都沒有執行中",
139
+ barRestartRooms: "↻ 儲存後 {0} 個 ClassicBot 房間會重新啟動", barApplyRooms: "↻ {0} 個 ClassicBot 房間會套用新值,其中執行中的 {1} 個會重新啟動",
140
+ barIdleRooms: "{0} 個 ClassicBot 房間會套用新值,目前都沒有執行中",
141
+ backendNotInstalledHost: "此主機未安裝",
142
+ },
143
+ });
@@ -0,0 +1,345 @@
1
+ // Settings → Shared agent settings (the section id stays `agent-defaults`; its address and every `#g-…` anchor are unchanged):
2
+ // the page's parts. The form, its draft and its staging stay in General (panel-settings.js) — ClassicBot's defaults share
3
+ // them — and this file draws the fleet's half and does the arithmetic behind it:
4
+ // - which agents set a field themselves (the "N/M in use" pill and its list), from fleet.yaml's instances — item by item for
5
+ // a field of several items (the dashboard's features), so an agent that sets only some of them is "partly custom";
6
+ // - what saving an edited field costs, in words, from the schema (`impactOf`), shown under the field only once it is
7
+ // edited and gone again when it is put back — never as a badge that is always there. The agents are fleet.yaml's
8
+ // instances; the ClassicBot rooms that follow the value are counted beside them (the fleet restarts those too);
9
+ // - the same costs added up for the Save bar.
10
+ import { html, useEffect, useRef, useState } from "/assets/app-html.js";
11
+ import { t } from "/assets/app-i18n.js";
12
+ import { settingsPath } from "/assets/app-route.js";
13
+ import "./settings-strings.js";
14
+ import "./settings-shared-strings.js"; // the words this page added: a tab that already ran an older settings-strings.js has none of them (#3087)
15
+ import {
16
+ AGENT_MODES, DASHBOARD_FEATURES, LOG_LEVELS, SEPARATE_FEATURE_KEYS, TOOL_PROGRESS, TOOL_SETS, VISIBILITY_MODES,
17
+ channelsOf, chLabel, hasOwn, impactOf, localeOptions, sameValue, shortName, toolSetDefault,
18
+ } from "./settings-model.js";
19
+ import { BackendSelect, ChipList, DefaultMark, Drawer, Feedback, InEffect, ModelSelect, Select } from "./settings-dialogs.js";
20
+
21
+ const tn = (k, ...v) => t(`settings.${k}`, ...v);
22
+ const label = (kind, v) => { const key = `opt_${kind}_${v}`; const s = tn(key); return s === key ? v : s; }; // t() hands back the key for a string it lacks
23
+
24
+ /** Option objects for a fixed list, each with its plain-words label (settings.opt_<kind>_<value>); an unknown value stays as it is. */
25
+ export const plainOptions = (kind, values) => values.map((v) => ({ value: v, label: label(kind, v) }));
26
+
27
+ // ── Which agents set a field themselves ──
28
+ /** The agents of a fleet's configuration: [name, its own settings]. General and every other instance count — each one inherits like any other. */
29
+ export const agentsOf = (fleet) => Object.entries((fleet && fleet.instances) || {});
30
+ /** A key with a value: `null` / `undefined` is the same as no key (the agent follows the default). */
31
+ const given = (obj, key) => hasOwn(obj, key) && obj[key] != null;
32
+ /**
33
+ * An agent has set one dashboard feature itself: its own key beside `dashboard` (office, office packs), or the feature under
34
+ * `dashboard` (where the older files kept all five), with a value. The fleet merges the features one by one
35
+ * (dashboard-permissions.ts dashboardFeaturesOffIn), so setting one leaves the others following the defaults.
36
+ */
37
+ export function ownsDashboardFeature(inst, feature) {
38
+ const key = hasOwn(SEPARATE_FEATURE_KEYS, feature) ? SEPARATE_FEATURE_KEYS[feature] : null;
39
+ const dash = inst && inst.dashboard;
40
+ return (!!key && given(inst, key)) || (!!dash && typeof dash === "object" && !Array.isArray(dash) && given(dash, feature));
41
+ }
42
+ /** An agent's own `a` or `a.b`, with a value (the hang detector's two settings are merged one by one: setting the timeout leaves `enabled` inherited). */
43
+ const ownsPath = (inst, path) => {
44
+ const [a, b] = path.split(".");
45
+ return b ? given((inst && inst[a]) || {}, b) : given(inst, a);
46
+ };
47
+
48
+ /**
49
+ * One entry per field the page draws, by the form key it is called in General's form:
50
+ * `keys` — the form keys it edits (it is "edited" while one differs from what is saved);
51
+ * `path` — its entry in the impact schema (what saving it costs);
52
+ * `own` — the agent setting that overrides it (an agent that has it is not affected by an edit here); none: agents cannot;
53
+ * `parts` — a field of several settings that agents override one by one: each part's keys and own settings (an edit to one part
54
+ * reaches the agents that do not set that part, however the other parts stand); `label` names a part where it is listed;
55
+ * `room` — the ClassicBot setting that follows this one: a room restarts for an edit here when neither the room nor
56
+ * ClassicBot's defaults set it (ClassicChannelManager's own → defaults → fleet chain), only for the settings the fleet's
57
+ * reconciliation compares (backend, model, auto-pause: `Classic cold config changed`; the rest is hot or read at the next start);
58
+ * `agentGroup` — it is one of the "Shared agent settings" (individual agents may override it), else of "System & channels";
59
+ * `confirm` — saving it asks for someone's OK first.
60
+ */
61
+ export const FIELDS = Object.freeze({
62
+ backend: { keys: ["backend"], path: "defaults.backend", own: ["backend"], room: "backend", agentGroup: true },
63
+ model: { keys: ["model"], path: "defaults.model", own: ["model"], room: "model", agentGroup: true },
64
+ auto: { keys: ["auto"], path: "defaults.auto_pause_after", own: ["auto_pause_after"], room: "auto_pause_after", agentGroup: true },
65
+ tool_progress: { keys: ["tool_progress"], path: "defaults.tool_progress", own: ["tool_progress"], agentGroup: true },
66
+ visibility: { keys: ["visibility"], path: "defaults.cross_instance_visibility", own: ["cross_instance_visibility"], agentGroup: true },
67
+ reply: { keys: ["reply"], path: "defaults.reply_completion_guard", own: ["reply_completion_guard"], agentGroup: true },
68
+ replyTriggers: { keys: ["replyTriggers"], path: "defaults.reply_triggers", own: ["reply_triggers"], agentGroup: true },
69
+ tool_set: { keys: ["tool_set"], path: "defaults.tool_set", own: ["tool_set"], agentGroup: true },
70
+ agent_mode: { keys: ["agent_mode"], path: "defaults.agent_mode", own: ["agent_mode"], agentGroup: true },
71
+ log_level: { keys: ["log_level"], path: "defaults.log_level", own: ["log_level"], agentGroup: true },
72
+ // One part per feature: an agent that sets the office switch still follows the others (a change to the appearance reaches it).
73
+ dash: { keys: DASHBOARD_FEATURES.map((k) => `dash_${k}`), path: "defaults.dashboard", agentGroup: true,
74
+ parts: DASHBOARD_FEATURES.map((k) => ({ keys: [`dash_${k}`], owns: (inst) => ownsDashboardFeature(inst, k), label: `dashboardShort_${k}` })) },
75
+ locale: { keys: ["locale"], path: "defaults.locale" },
76
+ tips: { keys: ["tips"], path: "defaults.tips" },
77
+ roots: { keys: ["roots"], path: "fleet.project_roots", confirm: "noteConfirmAdmin" },
78
+ hang: { keys: ["hangOn", "hang"], path: "defaults.hang_detector",
79
+ parts: [{ keys: ["hangOn"], own: ["hang_detector.enabled"] }, { keys: ["hang"], own: ["hang_detector.timeout_minutes"] }] },
80
+ concurrency: { keys: ["concurrency"], path: "fleet.spawn_concurrency" },
81
+ stagger: { keys: ["stagger"], path: "fleet.spawn_stagger_ms" },
82
+ });
83
+ /** How many fields the Advanced drawer holds (the title says so). */
84
+ export const ADVANCED_COUNT = 10;
85
+
86
+ /** The parts of a field that agents override one by one (one part: the field itself). */
87
+ const partsOf = (spec) => spec.parts || [{ keys: spec.keys, own: spec.own, owns: spec.owns }];
88
+ const ownsPart = (part, inst) => (part.owns ? part.owns(inst) : (part.own || []).some((path) => ownsPath(inst, path)));
89
+ /**
90
+ * The agents that set a field themselves, and how many there are. Fields agents cannot override have none. `parts`: only
91
+ * these parts count — an agent is left out of an edit only when it sets every one of them (default: all of the field's).
92
+ * A field of several parts also says who sets only some of them (`partial`: they follow this page for the rest) and who
93
+ * sets each part (`byPart`, for the list under the pill).
94
+ */
95
+ export function usageOf(fleet, field, parts = partsOf(FIELDS[field])) {
96
+ const agents = agentsOf(fleet);
97
+ const who = (name, inst) => ({ name, label: shortName(name, inst) });
98
+ const owners = agents.filter(([, inst]) => parts.every((part) => ownsPart(part, inst))).map(([name, inst]) => who(name, inst));
99
+ const partial = parts.length > 1 ? agents.filter(([, inst]) => parts.some((part) => ownsPart(part, inst)) && !parts.every((part) => ownsPart(part, inst))).map(([name, inst]) => who(name, inst)) : [];
100
+ const byPart = parts.length > 1 ? parts.map((part) => ({ label: part.label, owners: agents.filter(([, inst]) => ownsPart(part, inst)).map(([name, inst]) => who(name, inst)) })) : [];
101
+ return { total: agents.length, owners, partial, byPart, names: agents.map(([name]) => name) };
102
+ }
103
+ // ── Which ClassicBot rooms follow a field ──
104
+ /** The ClassicBot rooms of classicBot.yaml: [key, room]. */
105
+ export const roomsOf = (classic) => Object.entries((classic && classic.channels) || {}).filter(([, room]) => room && typeof room === "object");
106
+ /** ClassicChannelManager reads a room's backend and model with `||` (an empty value follows), its auto-pause with `??`. */
107
+ const roomGiven = (obj, key) => (key === "auto_pause_after" ? obj != null && obj[key] != null : !!obj && !!obj[key]);
108
+ /**
109
+ * The rooms that take this page's value for `field`: those that neither set it themselves nor have it in ClassicBot's
110
+ * defaults (room → ClassicBot defaults → the fleet's: ClassicChannelManager.getBackend / getModel / getAutoPauseAfter).
111
+ * Fields the fleet's reconciliation leaves alone (it compares only backend, model and auto-pause) have none.
112
+ */
113
+ export function roomsFollowing(classic, field) {
114
+ const key = FIELDS[field].room;
115
+ if (!key) return [];
116
+ const defaults = (classic && classic.defaults) || {};
117
+ if (roomGiven(defaults, key)) return [];
118
+ return roomsOf(classic).filter(([, room]) => !roomGiven(room, key)).map(([k, room]) => ({ key: k, instanceName: room.instanceName }));
119
+ }
120
+ const NAMES_SHOWN = 5;
121
+ /** A list of agent names for a sentence: the first few, then how many more. */
122
+ export const nameList = (names) => (names.length > NAMES_SHOWN ? `${names.slice(0, NAMES_SHOWN).join(", ")} +${names.length - NAMES_SHOWN}` : names.join(", "));
123
+
124
+ // ── What an edit costs ──
125
+ const edited = (f, base, field) => FIELDS[field].keys.some((k) => !sameValue(f[k], base[k]));
126
+ /**
127
+ * What saving the edited fields costs, as notes: `fields` — per field, its notes (`{ text }` each); `bar` — the same added
128
+ * up for the Save bar, one line per kind of cost (an agent restarted by two fields counted once), for the write of the
129
+ * defaults (`bar.defaults`) and for the project folders' own (`bar.roots`). A field that applies at once has no note;
130
+ * an invalid one has none yet. Besides the agents of fleet.yaml, the ClassicBot rooms that follow the value (`classic`: what
131
+ * classicBot.yaml says; `classicStatus(instanceName)`: a room's status) are named — the fleet restarts a running one too.
132
+ */
133
+ export function sharedNotes({ schema, fleet, classic, classicStatus = () => "stopped", live = {}, fleetUp = true, f, base, errors = {} }) {
134
+ const fields = {}, hit = new Set(), hitRooms = new Map(), bar = { defaults: [], roots: [] };
135
+ // Whether an agent restarts when a setting that is not hot changes: one that is running, and one that crashed (the fleet
136
+ // restarts a crash-looping daemon too); a paused or stopped one just takes the value at its next start. When the page
137
+ // could not read the agents' state (the fleet did not answer, or listed none) it cannot tell: every agent counts as restarting.
138
+ const known = fleetUp !== false && !!live && Object.keys(live).length > 0;
139
+ // A Windows agent that runs one command at a time (not a persistent terminal) has no process of its own: it takes a changed default at its next run.
140
+ const oneShot = (name) => { const inst = fleet && fleet.instances && fleet.instances[name]; return !!inst && inst.runtime === "windows" && inst.native_adapter !== "pane"; };
141
+ const restarts = (name) => !oneShot(name) && (!known || (!!live[name] && (live[name].status === "running" || live[name].status === "crashed")));
142
+ // A ClassicBot room restarts on the same terms (the reconciliation restarts the ones that have a daemon). A room of the older
143
+ // classicBot.yaml format (its key is the channel id) has no `instanceName` in the file — the manager makes one up when it loads —
144
+ // so its state cannot be looked up here: like an unreadable state, it counts as restarting.
145
+ const roomRestarts = (room) => !known || !room.instanceName || ["running", "crashed"].includes(classicStatus(room.instanceName));
146
+ const roomsText = (rooms, kind) => { const n = rooms.filter(roomRestarts).length; return n === rooms.length ? tn(`${kind}RestartRooms`, rooms.length) : n ? tn(`${kind}ApplyRooms`, rooms.length, n) : tn(`${kind}IdleRooms`, rooms.length); };
147
+ let fleetRestart = false;
148
+ const add = (list, text) => { if (!list.includes(text)) list.push(text); };
149
+ for (const [field, spec] of Object.entries(FIELDS)) {
150
+ if (!edited(f, base, field) || errors[field]) continue;
151
+ const notes = [], kind = impactOf(schema, spec.path);
152
+ // The ClassicBot rooms that follow it. A room has its own idea of "hot" (a ClassicBot channel takes tool progress and the reply
153
+ // guard at once, nothing else): auto-pause applies at once to an agent but restarts a room, so this does not depend on `kind`.
154
+ // A fleet restart (`kind` "fleet") restarts them with everything else.
155
+ const rooms = kind !== "fleet" && spec.room && impactOf(schema, `classic.${spec.room}`) === "instance" ? roomsFollowing(classic, field) : [];
156
+ for (const room of rooms) hitRooms.set(room.key, room);
157
+ if (kind === "fleet") { notes.push({ text: tn("noteRestartFleet") }); fleetRestart = true; }
158
+ else if (kind === "instance") {
159
+ // Only the parts that were edited count: an agent is left alone when it sets all of them itself.
160
+ const u = usageOf(fleet, field, partsOf(spec).filter((part) => part.keys.some((k) => !sameValue(f[k], base[k]))));
161
+ const skipped = u.owners.map((o) => o.label), skippedNames = new Set(u.owners.map((o) => o.name));
162
+ const reached = u.names.filter((n) => !skippedNames.has(n));
163
+ for (const n of reached) hit.add(n);
164
+ // Every agent without its own value takes the new one (a stopped agent at its next start), but only a running one restarts.
165
+ const restarting = reached.filter(restarts).length;
166
+ const main = restarting === reached.length ? tn("noteRestartAgents", reached.length)
167
+ : restarting ? tn("noteApplyAgents", reached.length, restarting) : tn("noteApplyIdle", reached.length);
168
+ // With only rooms, "No agents yet — agents you create later start with this value" would read as if nothing is affected.
169
+ if (!(u.total === 0 && rooms.length)) notes.push({ text: u.total === 0 ? tn("noteNoAgents") : !reached.length ? tn("noteAllOverride") : `${main}${skipped.length ? tn("noteSkip", nameList(skipped)) : ""}` });
170
+ }
171
+ if (rooms.length) notes.push({ text: roomsText(rooms, "note") });
172
+ if (spec.confirm) { notes.push({ text: tn(spec.confirm) }); add(field === "roots" ? bar.roots : bar.defaults, tn(spec.confirm)); }
173
+ // Ticking a dashboard feature on is confirmed first (unticking applies at once): only a feature newly ticked asks.
174
+ if (field === "dash" && DASHBOARD_FEATURES.some((k) => f[`dash_${k}`] === true && base[`dash_${k}`] !== true)) {
175
+ notes.push({ text: tn("noteConfirmTick") }); add(bar.defaults, tn("noteConfirmTick"));
176
+ }
177
+ if (notes.length) fields[field] = notes;
178
+ }
179
+ const lead = [];
180
+ if (hit.size) {
181
+ const restarting = [...hit].filter(restarts).length;
182
+ lead.push(restarting === hit.size ? tn("barRestartAgents", hit.size) : restarting ? tn("barApplyAgents", hit.size, restarting) : tn("barApplyIdle", hit.size));
183
+ }
184
+ if (hitRooms.size) lead.push(roomsText([...hitRooms.values()], "bar"));
185
+ bar.defaults.unshift(...lead);
186
+ if (fleetRestart) add(bar.defaults, tn("barRestartFleet"));
187
+ return { fields, bar };
188
+ }
189
+
190
+ // ── Pieces ──
191
+ let tipSeq = 0;
192
+ const TIP_WIDTH = 290;
193
+ /**
194
+ * Words for a hover, a focus or a tap, on a small button. They sit under the button (over the line above it when the
195
+ * button is low in the window), pushed sideways to stay inside the window, and are always in the page for a screen reader
196
+ * (the button describes itself by them).
197
+ */
198
+ export function Tip({ text, cls = "", ariaLabel, children }) {
199
+ const [at, setAt] = useState(null);
200
+ const [pinned, setPinned] = useState(false);
201
+ const idRef = useRef(null);
202
+ const btn = useRef(null);
203
+ const body = useRef(null);
204
+ if (!idRef.current) idRef.current = `s-tip-${++tipSeq}`;
205
+ const show = () => {
206
+ const r = btn.current && btn.current.getBoundingClientRect ? btn.current.getBoundingClientRect() : null;
207
+ const w = (typeof window !== "undefined" && window.innerWidth) || 0, hgt = (typeof window !== "undefined" && window.innerHeight) || 0;
208
+ // How far sideways it must move to stay inside the window (a custom property: the page allows no style attribute).
209
+ const dx = r && w ? Math.max(8 - r.left, Math.min(0, w - TIP_WIDTH - 12 - r.left)) : 0;
210
+ if (body.current && body.current.style) body.current.style.setProperty("--tip-dx", `${Math.round(dx)}px`);
211
+ setAt({ above: !!(r && hgt && r.bottom + 150 > hgt) });
212
+ };
213
+ const hide = () => { setAt(null); setPinned(false); };
214
+ useEffect(() => {
215
+ if (!at) return undefined;
216
+ const esc = (e) => { if (e.key === "Escape") hide(); };
217
+ const away = (e) => { if (btn.current && !btn.current.contains(e.target)) hide(); };
218
+ document.addEventListener("keydown", esc); document.addEventListener("click", away);
219
+ return () => { document.removeEventListener("keydown", esc); document.removeEventListener("click", away); };
220
+ }, [!!at]);
221
+ return html`<span class=${`s-tipwrap ${cls}`.trim()}><button type="button" class="s-tipbtn" ref=${btn} aria-label=${ariaLabel} aria-describedby=${idRef.current}
222
+ onMouseEnter=${show} onMouseLeave=${() => { if (!pinned) hide(); }} onFocus=${show} onBlur=${hide}
223
+ onClick=${(e) => { e.stopPropagation(); if (pinned) hide(); else { show(); setPinned(true); } }}>${children}</button>
224
+ <span id=${idRef.current} ref=${body} class=${`s-tipbody${at && at.above ? " above" : ""}`} role="tooltip" hidden=${!at}>${text}</span></span>`;
225
+ }
226
+ /** The ⓘ beside a label: what the field is for, when it matters, what its default means. */
227
+ export function InfoTip({ text, name }) {
228
+ return html`<${Tip} text=${text} cls="s-i" ariaLabel=${tn("tipLabel", name)}>i</${Tip}>`;
229
+ }
230
+ /**
231
+ * "6/7 in use · artist custom" at a field's right: how many agents use this page's value; hover lists the ones that set their own.
232
+ * A field of several items (the dashboard's features) says "partly custom" for an agent that sets only some of them — it still
233
+ * follows this page for the rest — and the hover lists who sets which item. The count is agents only: the ClassicBot rooms that
234
+ * follow the value are named in the hover (`rooms`), not counted.
235
+ */
236
+ export function UsageBadge({ usage }) {
237
+ if (!usage || !usage.total) return null;
238
+ const { total, owners, partial = [], byPart = [], rooms = 0 } = usage;
239
+ const who = (list, key) => tn(key, list.length === 1 ? list[0].label : tn("usageMany", list.length));
240
+ const text = [tn("usageCount", total - owners.length, total), owners.length ? who(owners, "usageOwn") : "", partial.length ? who(partial, "usagePartly") : ""].filter(Boolean).join(" · ");
241
+ const parts = byPart.filter((p) => p.owners.length).map((p) => `${tn(p.label)}: ${nameList(p.owners.map((o) => o.label))}`);
242
+ const tip = parts.length ? tn("usageTipParts", parts.join("; "))
243
+ : owners.length ? tn("usageTipOwners", nameList(owners.map((o) => o.label))) : tn("usageTipAll");
244
+ return html`<${Tip} text=${rooms ? `${tip} ${tn("usageRooms", rooms)}` : tip} cls="s-use" ariaLabel=${text}>${text}</${Tip}>`;
245
+ }
246
+ /** A field's header: its name, where it applies ("this host"), "default" when nobody set it, the ⓘ and the usage pill. */
247
+ export function FieldHead({ id, text, tip, mark, host, usage, bare }) {
248
+ return html`<div class="s-lab">${bare ? html`<span id=${`${id}-l`} class="s-lab-text">${text}</span>` : html`<label for=${id}>${text}</label>`}
249
+ ${host ? html`<span class="tag s-host">${tn("hostTag")}</span>` : null}${mark}<${InfoTip} text=${tip} name=${text} />${usage ? html`<${UsageBadge} usage=${usage} />` : null}</div>`;
250
+ }
251
+ /** A segmented choice (radio group underneath: arrow keys move through it). */
252
+ export function Seg({ id, value, options, onChange, labelledBy }) {
253
+ return html`<div id=${id} class="s-seg" role="radiogroup" aria-labelledby=${labelledBy}>${options.map((o) => html`<label key=${o.value} class=${`s-seg-opt${o.value === value ? " on" : ""}`}>
254
+ <input type="radio" name=${id} value=${o.value} checked=${o.value === value} onChange=${() => onChange(o.value)} /><span>${o.label}</span></label>`)}</div>`;
255
+ }
256
+ /** An on/off switch (a checkbox with the role of one: the same events, the same focus), with its state in words. */
257
+ export function Switch({ id, checked, onChange, name }) {
258
+ return html`<label class="s-switch"><input id=${id} type="checkbox" role="switch" checked=${checked} aria-label=${name} onChange=${(e) => onChange(e.target.checked)} />
259
+ <span class="s-track" aria-hidden="true"></span><span class="s-switch-text">${tn(checked ? "switchOn" : "switchOff")}</span></label>`;
260
+ }
261
+ /** What an edit costs, under its field — only while the field is edited. */
262
+ export function Notes({ notes }) {
263
+ return notes && notes.length ? html`<div class="s-note" role="status">${notes.map((n, i) => html`<p key=${i}>${n.text}</p>`)}</div>` : null;
264
+ }
265
+ /** A quiet line of explanation (grey — never a warning). */
266
+ export function Info({ children }) {
267
+ return html`<p class="s-info"><span aria-hidden="true">ⓘ</span> <span>${children}</span></p>`;
268
+ }
269
+
270
+ // ── The page ──
271
+ /**
272
+ * The fleet's half of General: two cards — what individual agents may override, and what the whole fleet shares — each
273
+ * with its rarer settings under Advanced. `form` is General's: `f` (the draft), `set`, `base` (what is saved), `errors`,
274
+ * `warnings`, `unset` (what fleet.yaml leaves out), `fc` (a row's class), and `notes` (sharedNotes).
275
+ */
276
+ export function SharedAgentSettings({ ctx, form }) {
277
+ const { f, set, base, errors, warnings, unset, fc, notes, replyNote } = form;
278
+ const fleet = ctx.fleet;
279
+ const primary = channelsOf(fleet)[0];
280
+ const defaultTip = tn("defaultMarkTip");
281
+ const mark = (...ks) => (ks.every((k) => unset[k] && sameValue(f[k], base[k])) ? html`<${DefaultMark} tip=${defaultTip} />` : null);
282
+ const u = (field) => ({ ...usageOf(fleet, field), rooms: roomsFollowing(ctx.classic, field).length });
283
+ const note = (field) => html`<${Notes} notes=${notes.fields[field]} />`;
284
+ const head = (field, id, text, tip, extra = {}) => html`<${FieldHead} id=${id} text=${text} tip=${tip} usage=${FIELDS[field].agentGroup ? u(field) : null} ...${extra} />`;
285
+ const seg = (kind, values) => values.map((v) => ({ value: v, label: tn(`seg_${kind}_${v}`) }));
286
+ const toolSetUnset = { value: "", label: tn("toolSetUnset", toolSetDefault({}, {}), toolSetDefault({}, { general_topic: true })) };
287
+
288
+ const agentMain = html`
289
+ <div class=${fc("field", "backend")}>${head("backend", "g-be", tn("defaultBackend"), tn("tipBackend"), { mark: mark("backend"), host: true })}
290
+ <${BackendSelect} id="g-be" value=${f.backend} onChange=${set("backend")} hostOnly /><${Info}>${tn("backendInfo")} <a href=${settingsPath("runtimes")}>${tn("backendInfoLink")}<span aria-hidden="true"> →</span></a></${Info}>${note("backend")}</div>
291
+ <div class=${fc("field", "model")}>${head("model", "g-model", tn("defaultModel"), tn("tipModel"), { mark: mark("model") })}
292
+ <${ModelSelect} id="g-model" value=${f.model} onChange=${set("model")} backend=${f.backend || "claude-code"} inherit=${tn("modelCliDefault")} />${note("model")}</div>
293
+ <div class=${fc("field", "auto")}>${head("auto", "g-auto", `${tn("autoPause")} (${tn("minutes")})`, tn("tipAutoPause"), { mark: mark("auto") })}
294
+ <input id="g-auto" type="number" min="0" step="1" class=${errors.auto ? "invalid" : ""} value=${f.auto} onInput=${(e) => set("auto")(e.target.value)} /><${Feedback} error=${errors.auto} />${note("auto")}</div>
295
+ <div class=${fc("field", "tool_progress")}>${head("tool_progress", "g-tp", tn("toolProgress"), tn("tipToolProgress"), { mark: mark("tool_progress"), bare: true })}
296
+ <${Seg} id="g-tp" labelledBy="g-tp-l" value=${f.tool_progress} onChange=${set("tool_progress")} options=${seg("tool_progress", TOOL_PROGRESS)} />${note("tool_progress")}</div>`;
297
+
298
+ const systemMain = html`
299
+ <div class=${fc("field", "locale")}>${head("locale", "g-locale", tn("language"), tn("tipLocale"), { mark: mark("locale") })}
300
+ <${Select} id="g-locale" value=${f.locale} onChange=${set("locale")} options=${localeOptions(f.locale).map((o) => (o.auto ? { value: "", label: tn("localeAuto") } : o))} />${note("locale")}</div>
301
+ <div class=${fc("field", "tips")}>${head("tips", "g-tips", tn("dailyTips"), tn("dailyTipsHint"), { mark: mark("tips") })}
302
+ <${Switch} id="g-tips" name=${tn("dailyTips")} checked=${f.tips === "true"} onChange=${(on) => set("tips")(String(on))} />${note("tips")}</div>
303
+ <div id="project-roots" class="s-wide"><div id="g-roots" class=${fc("field", "roots")}>${head("roots", "g-roots-c", tn("projectRootsTitle"), tn("projectRootsHint"), { bare: true })}
304
+ <${ChipList} items=${f.roots} onChange=${set("roots")} placeholder="/path/to/projects" label=${tn("projectRootsTitle")} />
305
+ ${f.roots.length ? null : html`<${InEffect} text=${tn("projectRootsAnywhere")} tip=${defaultTip} />`}${note("roots")}</div></div>`;
306
+
307
+ const agentAdvanced = html`
308
+ <div class=${fc("field", "visibility")}>${head("visibility", "g-vis", tn("crossInstanceVisibility"), tn("crossInstanceVisibilityHint"), { mark: mark("visibility"), bare: true })}
309
+ <${Seg} id="g-vis" labelledBy="g-vis-l" value=${f.visibility} onChange=${set("visibility")} options=${seg("visibility", VISIBILITY_MODES)} />${note("visibility")}</div>
310
+ <div class=${fc("field", "reply")}>${head("reply", "g-reply", tn("replyCompletionGuard"), tn("tipReplyGuard"), { mark: mark("reply") })}
311
+ <${Switch} id="g-reply" name=${tn("replyCompletionGuard")} checked=${f.reply} onChange=${set("reply")} /><${Info}>${replyNote}</${Info}>${note("reply")}</div>
312
+ <div class=${fc("field", "tool_set")}>${head("tool_set", "g-ts", tn("toolSet"), tn("tipToolSet"), { mark: mark("tool_set") })}
313
+ <${Select} id="g-ts" value=${f.tool_set} onChange=${set("tool_set")} options=${[toolSetUnset, ...plainOptions("tool_set", TOOL_SETS)]} />${note("tool_set")}</div>
314
+ <div class=${fc("field", "agent_mode")}>${head("agent_mode", "g-am", tn("agentMode"), tn("tipAgentMode"), { mark: mark("agent_mode"), bare: true })}
315
+ <${Seg} id="g-am" labelledBy="g-am-l" value=${f.agent_mode} onChange=${set("agent_mode")} options=${seg("agent_mode", AGENT_MODES)} />${note("agent_mode")}</div>
316
+ <div class=${fc("field", "log_level")}>${head("log_level", "g-ll", tn("logLevel"), tn("tipLogLevel"), { mark: mark("log_level") })}
317
+ <${Select} id="g-ll" value=${f.log_level} onChange=${set("log_level")} options=${plainOptions("log_level", LOG_LEVELS)} />${note("log_level")}</div>
318
+ <div class=${fc("field", "replyTriggers")}>${head("replyTriggers", "g-reply-triggers", tn("replyTriggers"), tn("replyTriggersHint"), { mark: mark("replyTriggers") })}
319
+ <${Switch} id="g-reply-triggers" name=${tn("replyTriggers")} checked=${f.replyTriggers} onChange=${set("replyTriggers")} />${note("replyTriggers")}</div>
320
+ <div id="g-dash" role="group" aria-labelledby="g-dash-l" class=${fc("field s-wide dash-perms", ...FIELDS.dash.keys)}>${head("dash", "g-dash", tn("dashboardAccess"), tn("dashboardDefaultsHint"), { bare: true })}
321
+ <div class="s-checks">${DASHBOARD_FEATURES.map((k) => html`<label key=${k} class="check"><input type="checkbox" checked=${f[`dash_${k}`]}
322
+ onChange=${(e) => set(`dash_${k}`)(e.target.checked)} /><span>${tn(`dashboard_${k}`)}</span></label>`)}</div>${note("dash")}</div>`;
323
+
324
+ const systemAdvanced = html`
325
+ <div class=${fc("field s-hang", "hangOn", "hang")}>${head("hang", "g-hang-on", tn("hangEnabled"), tn("tipHang"), { mark: mark("hangOn", "hang"), bare: true })}
326
+ <div class="s-hang-row"><${Switch} id="g-hang-on" name=${tn("hangEnabled")} checked=${f.hangOn} onChange=${set("hangOn")} />
327
+ <input id="g-hang" type="number" min="0.1" step="0.5" class=${errors.hang ? "invalid" : ""} aria-label=${tn("hangTimeout")} value=${f.hang} onInput=${(e) => set("hang")(e.target.value)} />
328
+ <span class="s-unit">${tn("hangUnit")}</span></div><${Feedback} error=${errors.hang} />${note("hang")}</div>
329
+ <div class=${fc("field", "concurrency")}>${head("concurrency", "g-conc", tn("concurrency"), tn("tipConcurrency"), { mark: mark("concurrency") })}
330
+ <input id="g-conc" type="number" min="1" max="20" step="1" class=${errors.concurrency ? "invalid" : ""} value=${f.concurrency} onInput=${(e) => set("concurrency")(e.target.value)} />
331
+ <${Feedback} error=${errors.concurrency} warning=${warnings.concurrency} />${f.concurrency.trim() === "" ? html`<${InEffect} text=${tn("concurrencyAuto")} tip=${defaultTip} />` : null}${note("concurrency")}</div>
332
+ <div class=${fc("field", "stagger")}>${head("stagger", "g-stag", `${tn("staggerDelay")} (ms)`, tn("tipStagger"), { mark: mark("stagger") })}
333
+ <input id="g-stag" type="number" min="0" max="30000" step="100" class=${errors.stagger ? "invalid" : ""} value=${f.stagger} onInput=${(e) => set("stagger")(e.target.value)} />
334
+ <${Feedback} error=${errors.stagger} warning=${warnings.stagger} />${note("stagger")}</div>`;
335
+
336
+ const card = (title, sub, body, extra) => html`<section class="card s-group"><div><h3>${title}</h3><p class="note">${sub}</p></div><div class="grid2">${body}</div>${extra || null}</section>`;
337
+ return html`<div class="s-shared">
338
+ ${card(tn("sharedGroupAgents"), tn("sharedGroupAgentsSub"), agentMain)}
339
+ ${card(tn("sharedGroupSystem"), tn("sharedGroupSystemSub"), systemMain)}
340
+ <${Drawer} title=${tn("advancedCount", ADVANCED_COUNT)}>
341
+ ${card(tn("sharedGroupAgents"), tn("sharedGroupAgentsSub"), agentAdvanced)}
342
+ ${card(tn("sharedGroupSystem"), tn("sharedGroupSystemAdvancedSub"), systemAdvanced, html`<${Info}>${primary ? tn("accessMovedHint", primary.id || chLabel(0)) : tn("noBots")}</${Info}>`)}
343
+ </${Drawer}>
344
+ </div>`;
345
+ }