@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
@@ -5,7 +5,8 @@
5
5
  // (an agent's tool, another tab) arrives as a "tasks" stream event with the board's revision; the board reads again
6
6
  // when its revision moved. Over the temporary public link the board is read-only (the server refuses its writes there).
7
7
  // A card moves by drag, by Alt+arrow keys on its title, or by its dialog ("Move to…", up and down) — touch and keyboard
8
- // need no drag.
8
+ // need no drag. A project shows as the board or as a list, and filters stack (fleet-task-view.js). A right click on a
9
+ // card (or the menu key) opens its menu; its dialog steps to the previous / next card (fleet-task-menu.js).
9
10
  import { html, useEffect, useMemo, useRef, useState } from "/assets/app-html.js";
10
11
  import { t } from "/assets/app-i18n.js";
11
12
  import { recordEdit } from "/assets/text-undo.js";
@@ -15,18 +16,21 @@ import { Empty, ErrorState, Skeleton } from "/assets/ui-states.js";
15
16
  import { Icon } from "/assets/ui-icons.js";
16
17
  import { Menu } from "/assets/ui-menu.js";
17
18
  import { toast } from "/assets/ui-toast.js";
18
- import { AskHost, COLUMNS, NO_PROJECT, ProgressBar, StatusPill, UNASSIGNED, Who, answerBlocked, boardApi, currentWork, dropNeighbours, errorText, followsSubs, moveCard, onPublicLink, projectKey, projectStats, readStored, recentlyDone, relTime, reviewLabel, waitsForYou, workersOf, wrapUpText, writeStored } from "./fleet-task-common.js";
19
+ import { AskHost, AssigneeOption, COLUMNS, NO_PROJECT, ProgressBar, StatusPill, Who, answerBlocked, askText, boardApi, currentWork, dropNeighbours, errorText, followsSubs, moveCard, notesForPeople, onPublicLink, projectKey, projectStats, readStored, relTime, reviewLabel, waitsForYou, workersOf, wrapUpText, writeStored } from "./fleet-task-common.js";
19
20
  import { CardDialog } from "./fleet-task-card.js";
21
+ import { CardMenu, cardAt, cardMenuItems, pageOrder, stepsOf } from "./fleet-task-menu.js";
22
+ import { DisplayMenu, FilterBar, FilterMenu, ListView, SubList, doneShown, formatFilters, keepFilters, listRows, mainMatches, readDisplay, startFilters, writeDisplay } from "./fleet-task-view.js";
20
23
  import { InstancesDrawer } from "./fleet-task-work.js";
24
+ import { InsightsDialog } from "./fleet-task-stats.js";
21
25
 
22
26
  const PROJECT_KEY = "agend_tasks_project";
23
- const FILTER_KEY = "agend_tasks_assignee";
24
27
 
25
28
  // ── The tab ───────────────────────────────────────────────
26
29
 
27
30
  /**
28
31
  * Fleet › Tasks. `?card=M-3` in the address opens that card (a link from a notice). The project last looked at is
29
- * remembered on this device.
32
+ * remembered on this device; on a project's board the address says which (`?tp=`) and its filters (`?tf=`), so the
33
+ * filtered board can be sent as a link — and such a link opens it.
30
34
  */
31
35
  export function TaskBoardTab({ lease }) {
32
36
  const [state, setState] = useState(null);
@@ -34,8 +38,9 @@ export function TaskBoardTab({ lease }) {
34
38
  const [version, setVersion] = useState({ n: 0, ifMoved: false });
35
39
  const writable = !onPublicLink();
36
40
  const [at, setAtRaw] = useState(() => {
37
- const v = readStored(PROJECT_KEY, "");
38
- return v === "" ? null : v === NO_PROJECT ? NO_PROJECT : Number(v);
41
+ let v = readStored(PROJECT_KEY, "");
42
+ try { v = new URLSearchParams(globalThis.location?.search || "").get("tp") ?? v; } catch { /* no address bar */ }
43
+ return v === "" ? null : v === NO_PROJECT ? NO_PROJECT : Number.isInteger(Number(v)) ? Number(v) : null;
39
44
  });
40
45
  const [openId, setOpenId] = useState(() => {
41
46
  try { return new URLSearchParams(globalThis.location?.search || "").get("card"); } catch { return null; }
@@ -43,8 +48,16 @@ export function TaskBoardTab({ lease }) {
43
48
  const [tick, setTick] = useState(0);
44
49
  const [flashed, setFlashed] = useState(() => new Map());
45
50
  const [dialog, setDialog] = useState(null);
46
- // The Done column's "All": every done main task is read only when asked for (the server keeps recent ones otherwise).
47
- const [allDone, setAllDone] = useState(false);
51
+ // A card's menu ({ card, x, y, el }), and the cards the page showed when a card's dialog opened (its Previous / Next).
52
+ const [menu, setMenu] = useState(null);
53
+ const [trail, setTrail] = useState([]);
54
+ // How a project shows (board or list, …) and its filters: remembered on this device, the filters also in the address.
55
+ const [display, setDisplayRaw] = useState(readDisplay);
56
+ const [filters, setFiltersRaw] = useState(() => startFilters(globalThis.location?.search));
57
+ const setDisplay = (d) => { setDisplayRaw(d); writeDisplay(d); };
58
+ const setFilters = (f) => { setFiltersRaw(f); keepFilters(f); };
59
+ // Finished cards "All": every done main task is read only when asked for (the server keeps recent ones otherwise).
60
+ const allDone = display.done === "all";
48
61
  const seq = useRef(0);
49
62
  const setAt = (v) => { setAtRaw(v); writeStored(PROJECT_KEY, v === null ? null : String(v)); };
50
63
  const reload = (ifMoved = false) => setVersion((v) => ({ n: v.n + 1, ifMoved }));
@@ -89,15 +102,31 @@ export function TaskBoardTab({ lease }) {
89
102
  return () => { off(); offConn(); if (timer) clearTimeout(timer); };
90
103
  }, [lease]);
91
104
 
105
+ // The project and its filters in the address (Home has neither), for a link to this very board.
106
+ useEffect(() => {
107
+ try {
108
+ const u = new URL(globalThis.location.href);
109
+ const before = u.search;
110
+ const f = formatFilters(filters);
111
+ if (at === null) { u.searchParams.delete("tp"); u.searchParams.delete("tf"); }
112
+ else { u.searchParams.set("tp", String(at)); if (f) u.searchParams.set("tf", f); else u.searchParams.delete("tf"); }
113
+ if (u.search !== before) globalThis.history.replaceState(globalThis.history.state, "", u);
114
+ } catch { /* no address bar */ }
115
+ }, [at, filters]);
116
+
92
117
  const openCard = (id) => {
93
118
  setOpenId(id);
94
119
  try { const u = new URL(globalThis.location.href); u.searchParams.set("card", id); globalThis.history.replaceState(globalThis.history.state, "", u); } catch { /* no address bar */ }
95
120
  };
96
121
  const closeCard = () => {
97
122
  setOpenId(null);
123
+ setTrail([]);
98
124
  try { const u = new URL(globalThis.location.href); u.searchParams.delete("card"); globalThis.history.replaceState(globalThis.history.state, "", u); } catch { /* no address bar */ }
99
125
  };
100
126
 
127
+ // A card's dialog walks the page's cards in the order shown when it opened (read once the page is drawn).
128
+ useEffect(() => { if (openId && !trail.length) setTrail(pageOrder()); }, [openId, state]);
129
+
101
130
  // #2246 step 3: who works on what — the drawer gives way to a card opened from it (one drawer at a time).
102
131
  const showInstances = () => setDialog({ kind: "instances" });
103
132
 
@@ -107,19 +136,69 @@ export function TaskBoardTab({ lease }) {
107
136
  const projects = Array.isArray(state.data.projects) ? state.data.projects : [];
108
137
  // #2355 review: the names a project's lead may be, as the server accepts them (the fleet's instances).
109
138
  const leads = Array.isArray(state.data.leads) ? state.data.leads : [];
139
+ // The instances with the task board switched off: the board hands them no cards, so the pickers do not offer them.
140
+ const boardOff = Array.isArray(state.data.boardOff) ? state.data.boardOff : [];
110
141
  // The server's numbers cover every card (finished ones are not all on the board); computed here only without them.
111
142
  const stats = (key) => (state.data.stats && state.data.stats[String(key)]) || projectStats(key, cards);
112
143
  const project = at === null ? null : at === NO_PROJECT ? NO_PROJECT : projects.find((p) => p.id === at) || null;
113
144
  const body = project === null
114
145
  ? html`<${Home} cards=${cards} projects=${projects} stats=${stats} writable=${writable} onOpenProject=${setAt} onOpen=${openCard} onDialog=${setDialog} onInstances=${showInstances} reload=${reload} />`
115
- : html`<${ProjectBoard} project=${project} cards=${cards} stats=${stats} flashed=${flashed} allDone=${allDone} writable=${writable} onAllDone=${setAllDone} onBack=${() => setAt(null)}
146
+ : html`<${ProjectBoard} project=${project} cards=${cards} stats=${stats} flashed=${flashed} display=${display} filters=${filters} writable=${writable}
147
+ onDisplay=${setDisplay} onFilters=${setFilters} onBack=${() => setAt(null)}
116
148
  onOpen=${openCard} onCreate=${() => setDialog({ kind: "main", project: project === NO_PROJECT ? null : project.id })} onInstances=${showInstances} reload=${reload} />`;
117
- return html`<div class="tb">
149
+
150
+ /** A right click on a card, or the keyboard's menu key on it (no pointer: the menu goes under the card). */
151
+ function onMenu(e) {
152
+ const hit = cardAt(e);
153
+ const card = hit && cards.find((c) => c.id === hit.id);
154
+ if (!card) return;
155
+ e.preventDefault();
156
+ let x = e.clientX || 0, y = e.clientY || 0;
157
+ if (!x && !y && typeof hit.el.getBoundingClientRect === "function") { const r = hit.el.getBoundingClientRect(); x = r.left + 8; y = r.bottom; }
158
+ setMenu({ id: card.id, x, y, el: hit.el });
159
+ }
160
+ function closeMenu(refocus) {
161
+ const el = menu && menu.el;
162
+ setMenu(null);
163
+ if (refocus && el && document.contains?.(el)) (el.querySelector("button") || el).focus?.();
164
+ }
165
+ /** A menu choice, through the calls and questions the card's dialog uses. */
166
+ async function menuAct(card, a) {
167
+ const after = (r, said) => { if (r) { if (said) toast(t(said, card.id)); reload(); } };
168
+ try {
169
+ if (a.kind === "open") openCard(card.id);
170
+ else if (a.kind === "confirm") after(await moveCard(card, "done"), "tasks.confirmed");
171
+ else if (a.kind === "sendBack") after(await moveCard(card, "claimed"), "tasks.sentBack");
172
+ else if (a.kind === "answer") after(await answerBlocked(card), "tasks.answered");
173
+ else if (a.kind === "move") after(await moveCard(card, a.to));
174
+ else if (a.kind === "cancel") after(await moveCard(card, "cancelled"));
175
+ else if (a.kind === "assign" || a.kind === "assignOther" || a.kind === "priority") {
176
+ const value = a.kind === "assignOther" ? await askText({ title: t("taskcard.otherTitle"), label: t("taskcard.otherLabel"), required: true }) : a.value;
177
+ if (a.kind === "assignOther" && !value) return;
178
+ const r = await boardApi.update(card.id, { [a.kind === "priority" ? "priority" : "assignee"]: value, version: card.version });
179
+ for (const n of notesForPeople(r.notes)) toast(n);
180
+ reload();
181
+ } else if (a.kind === "copyLink" || a.kind === "copyId") {
182
+ const u = new URL(globalThis.location.href);
183
+ u.searchParams.set("card", card.id);
184
+ const text = a.kind === "copyLink" ? u.toString() : card.id;
185
+ // Without a clipboard (a plain-http address) the text is shown to copy by hand.
186
+ if (navigator.clipboard) { await navigator.clipboard.writeText(text); toast(t("taskmenu.copied", text)); } else toast(text);
187
+ }
188
+ } catch (err) { toast(errorText(err), false); }
189
+ }
190
+ const menuCard = menu ? cards.find((c) => c.id === menu.id) : null;
191
+ // The assignees a card's menu offers: who has cards in its project (Other… names anyone else).
192
+ const names = menuCard ? cards.filter((c) => projectKey(c) === projectKey(menuCard) && c.assignee).map((c) => c.assignee) : [];
193
+
194
+ return html`<div class="tb" onContextMenu=${onMenu}>
118
195
  ${writable ? null : html`<p class="tb-readonly" role="note"><${Icon} name="eye" size=${16} />${t("tasks.readOnly")}</p>`}
119
196
  ${body}
120
- ${openId ? html`<${CardDialog} key=${openId} id=${openId} tick=${tick} projects=${projects} writable=${writable} place=${writable ? placeOf(cards, openId, reload) : null}
121
- onClose=${closeCard} onOpen=${openCard} reloadBoard=${reload} />` : null}
122
- ${dialog && dialog.kind === "main" ? html`<${CreateMainDialog} projects=${projects} project=${dialog.project} onClose=${() => setDialog(null)}
197
+ ${menuCard ? html`<${CardMenu} at=${{ x: menu.x, y: menu.y }} label=${t("taskmenu.label", menuCard.id)} onClose=${closeMenu}
198
+ items=${cardMenuItems(menuCard, { writable, names, act: (a) => menuAct(menuCard, a) })} />` : null}
199
+ ${openId ? html`<${CardDialog} key=${openId} id=${openId} tick=${tick} projects=${projects} boardOff=${boardOff} writable=${writable} place=${writable ? placeOf(cards, openId, reload) : null}
200
+ steps=${stepsOf(trail, openId, cards)} onClose=${closeCard} onOpen=${openCard} reloadBoard=${reload} />` : null}
201
+ ${dialog && dialog.kind === "main" ? html`<${CreateMainDialog} projects=${projects} project=${dialog.project} boardOff=${boardOff} onClose=${() => setDialog(null)}
123
202
  onCreated=${(id) => { if (!lease.current()) return; setDialog(null); reload(); openCard(id); }} />` : null}
124
203
  ${dialog && dialog.kind === "instances" ? html`<${InstancesDrawer} tick=${tick} onClose=${() => setDialog(null)} onOpen=${(id) => { setDialog(null); openCard(id); }} />` : null}
125
204
  ${dialog && dialog.kind === "project" ? html`<${ProjectDialog} project=${dialog.project} leads=${leads} onClose=${() => setDialog(null)}
@@ -208,7 +287,7 @@ function Waiting({ cards, writable, onOpen, reload }) {
208
287
  };
209
288
  return html`<section class="tb-waiting" aria-label=${t("tasks.waitingTitle")}>
210
289
  <h3 class="tb-section-title"><${Icon} name="inbox" size=${16} />${t("tasks.waitingTitle")}</h3>
211
- <ul class="rows">${[...review, ...blocked].map((c) => html`<li key=${c.id} class="row-item tb-wait-row">
290
+ <ul class="rows">${[...review, ...blocked].map((c) => html`<li key=${c.id} class="row-item tb-wait-row" data-wait=${c.id}>
212
291
  <div class="tb-wait-main">
213
292
  <${StatusPill} status=${c.status} />
214
293
  <button type="button" class="tb-wait-title" onClick=${() => onOpen(c.id)}><span class="tb-code">${c.id}</span> ${c.title}
@@ -264,15 +343,13 @@ function SearchBox({ onOpen }) {
264
343
 
265
344
  // ── A project's board ─────────────────────────────────────
266
345
 
267
- function ProjectBoard({ project, cards, stats: statsOf, flashed, allDone, writable, onAllDone, onBack, onOpen, onCreate, onInstances, reload }) {
268
- const { instances } = useStore(appStore);
269
- const [assignee, setAssigneeRaw] = useState(() => readStored(FILTER_KEY, ""));
346
+ function ProjectBoard({ project, cards, stats: statsOf, flashed, display, filters, writable, onDisplay, onFilters, onBack, onOpen, onCreate, onInstances, reload }) {
270
347
  const [expanded, setExpanded] = useState({});
271
348
  const [drag, setDrag] = useState(null);
272
349
  const [spot, setSpot] = useState(null);
273
- const setAssignee = (v) => { setAssigneeRaw(v); writeStored(FILTER_KEY, v || null); };
274
350
  const key = project === NO_PROJECT ? NO_PROJECT : project.id;
275
351
  const archived = project !== NO_PROJECT && project.archived;
352
+ const [insights, setInsights] = useState(false);
276
353
  const stats = statsOf(key);
277
354
  const now = Date.now();
278
355
 
@@ -281,11 +358,25 @@ function ProjectBoard({ project, cards, stats: statsOf, flashed, allDone, writab
281
358
  for (const c of cards) if (c.kind === "sub" && c.parentId && c.status !== "cancelled") m.set(c.parentId, [...(m.get(c.parentId) || []), c]);
282
359
  return m;
283
360
  }, [cards]);
284
- const matches = (c) => !assignee || (assignee === UNASSIGNED ? c.assignee === null : c.assignee === assignee);
285
- const mains = cards.filter((c) => c.kind === "main" && projectKey(c) === key && c.status !== "cancelled"
286
- && (c.status !== "done" || allDone || recentlyDone(c, now))
287
- && (matches(c) || (subsOf.get(c.id) || []).some(matches)));
288
- const names = [...new Set([...instances.map((i) => i.name), ...cards.map((c) => c.assignee).filter(Boolean)])].sort();
361
+ const byId = useMemo(() => new Map(cards.map((c) => [c.id, c])), [cards]);
362
+ const live = cards.filter((c) => c.kind === "main" && projectKey(c) === key && c.status !== "cancelled");
363
+ // What the filters offer: this project's main tasks and their sub tasks.
364
+ const own = live.flatMap((c) => [c, ...(subsOf.get(c.id) || [])]);
365
+ const mains = live.filter((c) => doneShown(c, display.done, now) && mainMatches(c, subsOf.get(c.id), filters));
366
+ // Finished cards hidden: no Done column (a card is still confirmed or finished from its dialog).
367
+ const columns = display.done === "hide" ? COLUMNS.filter((s) => s !== "done") : COLUMNS;
368
+ const toggleSubs = (id) => setExpanded({ ...expanded, [id]: !expanded[id] });
369
+ const empty = () => html`<${Empty} icon="tasks" title=${filters.length ? t("tasks.emptyFiltered") : t("tasks.emptyBoard")} hint=${filters.length || archived ? undefined : t("tasks.emptyBoardHint")} />`;
370
+ // Insights counts what the page shows. A list with sub-task rows shows exactly its rows (each matched by the filter, a
371
+ // finished one as Done shows it); the board, or a list without them, shows a main task with all its sub tasks.
372
+ const insightCards = () => (display.view === "list" && display.subs
373
+ ? listRows(mains, subsOf, display, filters, now)
374
+ : mains.flatMap((c) => [c, ...(subsOf.get(c.id) || [])]));
375
+ const listBody = () => {
376
+ const rows = listRows(mains, subsOf, display, filters, now);
377
+ return rows.length === 0 ? empty() : html`<${ListView} rows=${rows} display=${display} subsOf=${subsOf} byId=${byId} flashed=${flashed} now=${now}
378
+ expanded=${expanded} onToggleSubs=${toggleSubs} onOpen=${onOpen} />`;
379
+ };
289
380
 
290
381
  const dropping = useRef(false);
291
382
  // A card moved from the keyboard is drawn again in its new place, and the focus it had goes with the old tile: give it
@@ -326,7 +417,7 @@ function ProjectBoard({ project, cards, stats: statsOf, flashed, allDone, writab
326
417
  if (e.key === "ArrowUp" && i > 0) void drop(card, card.status, column[i - 2]?.id ?? null, column[i - 1].id);
327
418
  else if (e.key === "ArrowDown" && i < column.length - 1) void drop(card, card.status, column[i + 1].id, column[i + 2]?.id ?? null);
328
419
  else if (e.key === "ArrowLeft" || e.key === "ArrowRight") {
329
- const to = COLUMNS[COLUMNS.indexOf(card.status) + (e.key === "ArrowLeft" ? -1 : 1)];
420
+ const to = columns[columns.indexOf(card.status) + (e.key === "ArrowLeft" ? -1 : 1)];
330
421
  if (to) void drop(card, to, null, null);
331
422
  }
332
423
  }
@@ -362,36 +453,39 @@ function ProjectBoard({ project, cards, stats: statsOf, flashed, allDone, writab
362
453
  <span class="muted">${stats.mains === 1 ? t("tasks.mainOne") : t("tasks.mainCount", stats.mains)}</span>
363
454
  ${stats.waiting ? html`<span class="tb-flag st-review">${t("tasks.waiting", stats.waiting)}</span>` : null}
364
455
  ${stats.blocked ? html`<span class="tb-flag st-blocked">${t("tasks.blockedN", stats.blocked)}</span>` : null}
456
+ <button type="button" class="btn btn-ghost btn-sm tb-insights" title=${t("taskstats.buttonTip")} onClick=${() => setInsights(true)}><${Icon} name="chart" size=${16} />${t("taskstats.button")}</button>
365
457
  </div>
366
458
  <span class="tb-grow"></span>
367
- <select class="tb-select" value=${assignee} aria-label=${t("tasks.filterLabel")} onChange=${(e) => setAssignee(e.target.value)}>
368
- <option value="">${t("tasks.everyone")}</option>
369
- <option value=${UNASSIGNED}>${t("tasks.nobody")}</option>
370
- ${names.map((n) => html`<option key=${n} value=${n}>${n}</option>`)}
371
- </select>
372
459
  <${InstancesButton} onClick=${onInstances} />
373
460
  ${archived || !writable ? null : html`<button type="button" class="btn btn-primary" onClick=${onCreate}><${Icon} name="plus" size=${16} />${t("tasks.newMain")}</button>`}
374
461
  </div>
375
- ${mains.length === 0 && !drag ? html`<${Empty} icon="tasks" title=${assignee ? t("tasks.emptyFiltered") : t("tasks.emptyBoard")} hint=${assignee || archived ? undefined : t("tasks.emptyBoardHint")} />`
376
- : html`<div class="tb-scroll"><div class="tb-columns">
377
- ${COLUMNS.map((status) => {
462
+ <div class="tb-view-bar">
463
+ <${FilterMenu} cards=${own} filters=${filters} onChange=${onFilters} />
464
+ <${DisplayMenu} display=${display} onChange=${onDisplay} />
465
+ <${FilterBar} cards=${own} filters=${filters} onChange=${onFilters} />
466
+ </div>
467
+ ${display.view === "list" ? listBody() : mains.length === 0 && !drag ? empty()
468
+ : html`<div class="tb-scroll"><div class=${`tb-columns${columns.length < COLUMNS.length ? " no-done" : ""}`}>
469
+ ${columns.map((status) => {
378
470
  const list = mains.filter((c) => c.status === status);
379
471
  const line = spot && spot.status === status ? spot.index : -1;
380
472
  return html`<section key=${status} class=${`tb-col st-${status}${drag ? " can-drop" : ""}${line >= 0 ? " over" : ""}`} aria-label=${t(`tasks.${status}`)}
381
473
  onDragOver=${(e) => over(e, status)} onDrop=${(e) => dropOn(e, status, list)}>
382
474
  <h3 class="tb-col-head"><span class="tb-dot"></span>${t(`tasks.${status}`)}
383
- ${status === "done" ? html`<button type="button" class="tb-link" title=${t("tasks.toggleDone")} onClick=${() => onAllDone(!allDone)}>${allDone ? t("tasks.all") : t("tasks.recent")}</button>` : null}
475
+ ${status === "done" ? html`<button type="button" class="tb-link" title=${t("tasks.toggleDone")} onClick=${() => onDisplay({ ...display, done: display.done === "all" ? "recent" : "all" })}>${display.done === "all" ? t("tasks.all") : t("tasks.recent")}</button>` : null}
384
476
  <span class="tb-count">${list.length}</span></h3>
385
477
  ${cellItems(list, drag ? drag.id : null, line, (card, dragging) => {
386
478
  const lit = Math.max(flashed.get(card.id) || 0, ...(subsOf.get(card.id) || []).map((s) => flashed.get(s.id) || 0));
387
479
  return html`<${Tile} key=${card.id} card=${card} dragging=${dragging} flash=${now - lit < 4000} subs=${subsOf.get(card.id)} writable=${writable}
388
- expanded=${!!expanded[card.id]} onToggleSubs=${() => setExpanded({ ...expanded, [card.id]: !expanded[card.id] })}
480
+ expanded=${!!expanded[card.id]} onToggleSubs=${() => toggleSubs(card.id)}
389
481
  onOpen=${onOpen} onKeyMove=${(e) => keyMove(card, e)}
390
482
  onDragStart=${(e) => { e.dataTransfer.setData("text/plain", card.id); e.dataTransfer.effectAllowed = "move"; setDrag(card); }} onDragEnd=${end} />`;
391
483
  })}
392
484
  </section>`;
393
485
  })}
394
486
  </div></div>`}
487
+ ${insights ? html`<${InsightsDialog} name=${project === NO_PROJECT ? t("tasks.noProject") : project.name} onClose=${() => setInsights(false)}
488
+ cards=${insightCards()} />` : null}
395
489
  </div>`;
396
490
  }
397
491
 
@@ -445,13 +539,7 @@ function Tile({ card, dragging, flash, subs = [], expanded, writable, onToggleSu
445
539
  ${progress.blocked ? html`<span class="tb-flag st-blocked"><${Icon} name="alert" size=${12} />${progress.blocked}</span>` : null}
446
540
  <${Icon} name="chevron" size=${14} cls=${expanded ? "tb-chev open" : "tb-chev"} />
447
541
  </button>` : null}
448
- ${hasSubs && expanded ? html`<ul class="tb-subs" onClick=${(e) => e.stopPropagation()}>
449
- ${subs.map((s) => html`<li key=${s.id}><button type="button" onClick=${() => onOpen(s.id)} title=${`${s.id} ${s.title} (${t(`tasks.${s.status}`)})`}>
450
- <span class=${`tb-dot st-${s.status}`} aria-label=${t(`tasks.${s.status}`)}></span><span class="tb-code">${s.id}</span><span class="tb-sub-title">${s.title}</span>
451
- ${s.assignee ? html`<span class="tb-who">${s.assignee}</span>` : null}</button>
452
- ${s.status === "blocked" && s.blockedReason ? html`<div class="tb-sub-blocked">${s.blockedReason}</div>` : null}</li>`)}
453
- ${older > 0 ? html`<li class="muted tb-sub-more">${t("tasks.olderSubs", older)}</li>` : null}
454
- </ul>` : null}
542
+ ${hasSubs && expanded ? html`<${SubList} subs=${subs} older=${older} onOpen=${onOpen} />` : null}
455
543
  ${now ? html`<div class="tb-tile-now" title=${now.cards.map((c) => `${c.id} ${c.title}`).join("\n")}>
456
544
  <span class=${`tb-now-label st-${now.tone}`}>${t(now.label)}</span><span class="tb-code">${now.cards[0].id}</span>
457
545
  <span class="tb-now-title">${now.cards[0].title}</span>${now.cards.length > 1 ? html`<span class="muted">${t("tasks.moreCards", now.cards.length - 1)}</span>` : null}</div>` : null}
@@ -471,7 +559,7 @@ function Tile({ card, dragging, flash, subs = [], expanded, writable, onToggleSu
471
559
 
472
560
  // ── Dialogs: a new main task, a project ───────────────────
473
561
 
474
- function CreateMainDialog({ projects, project, onClose, onCreated }) {
562
+ function CreateMainDialog({ projects, project, boardOff = [], onClose, onCreated }) {
475
563
  const { instances } = useStore(appStore);
476
564
  const active = projects.filter((p) => !p.archived);
477
565
  const [f, setF] = useState({ project: project === null || project === undefined ? "" : String(project), title: "", goal: "", scope: "", acceptance: "", context: "", size: "", priority: "normal", assignee: "", needsReview: true });
@@ -502,7 +590,7 @@ function CreateMainDialog({ projects, project, onClose, onCreated }) {
502
590
  ${field(t("tasks.definition"), html`<textarea rows="3" placeholder=${t("tasks.definitionHint")} value=${f.acceptance} onInput=${set("acceptance")}></textarea>`)}
503
591
  ${field(t("tasks.context"), html`<textarea rows="2" maxlength="1000" placeholder=${t("tasks.contextHint")} value=${f.context} onInput=${set("context")}></textarea>`)}
504
592
  <div class="tb-form-row">
505
- ${field(t("tasks.assignee"), html`<select value=${f.assignee} onChange=${set("assignee")}><option value="">${t("tasks.nobody")}</option>${instances.map((i) => html`<option key=${i.name} value=${i.name}>${i.name}</option>`)}</select>`)}
593
+ ${field(t("tasks.assignee"), html`<select value=${f.assignee} onChange=${set("assignee")}><option value="">${t("tasks.nobody")}</option>${instances.map((i) => html`<${AssigneeOption} key=${i.name} name=${i.name} boardOff=${boardOff} />`)}</select>`)}
506
594
  ${field(t("tasks.size"), html`<select value=${f.size} onChange=${set("size")}><option value="">${t("tasks.sizeNone")}</option><option value="S">${t("tasks.sizeS")}</option><option value="M">${t("tasks.sizeM")}</option><option value="L">${t("tasks.sizeL")}</option></select>`)}
507
595
  ${field(t("tasks.priority"), html`<select value=${f.priority} onChange=${set("priority")}>${["urgent", "high", "normal", "low"].map((p) => html`<option key=${p} value=${p}>${t(`tasks.${p}`)}</option>`)}</select>`)}
508
596
  </div>
@@ -14,11 +14,20 @@ register("fusage", {
14
14
  en: {
15
15
  range: "Range", today: "Today", r7d: "7 days", month: "This month", all: "All", custom: "Custom", from: "From", to: "To", apply: "Apply",
16
16
  group: "Group by", g_instance: "Agent", g_backend: "Backend", g_model: "Model", g_profile: "Credential profile", g_team: "Team (as configured now)",
17
- csv: "Download CSV", basis: "API-equivalent at list price (checked {0}) — not money spent. Subscriptions are not billed per token.",
17
+ csv: "Download CSV", basis: "API-equivalent at list price ({0}) — not money spent.", basisMore: "Subscriptions are not billed per token.",
18
18
  amount: "API-equivalent", input: "Input", output: "Output", reasoning: "Reasoning", read: "Cache read", write: "Cache write", total: "Total tokens", requests: "Requests", messages: "Messages",
19
19
  notPriced: "not priced", partial: "partial", noTeam: "(no team)", unknown: "unknown",
20
- f_cache_write_not_reported: "cache writes not reported (Codex, Muse) — an estimate", f_not_priced: "not priced: {0}", f_source_unknown: "read before backend and profile were recorded",
21
- f_estimated: "estimated from text size — Kiro records no token counts", f_includes_estimates: "includes estimates (Kiro)", f_cost_reported: "amount as the CLI reported it (no list price for this model)", estimatedPart: "of which estimated: {0}",
20
+ // #3066 §3: what a row's numbers are, said once each as a small mark with its tooltip (never a pill per row).
21
+ t_not_priced: "Not priced: {0}", t_partial: "Part of this row's models have no price", t_write_unreported: "Codex/Muse don't report cache writes",
22
+ t_cost_reported: "Amount as the CLI reported it", t_estimated: "Estimated from text size (Kiro records no token counts)", t_reasoning_none: "Not reported by this CLI",
23
+ sourceNote: "Some hours were read before AgEnD recorded their backend and profile.", profileUnrecorded: "profile not recorded",
24
+ l_partial: "◐ partly priced", l_cost_reported: "† amount from the CLI", l_estimated: "≈ estimated",
25
+ // #3066 §2: output speed (Claude after the first token, Codex over the response window).
26
+ speed: "Speed", speedUnit: "{0} tok/s", speedCoverage: "{0} of {1} requests timed", speedSpread: "p10–p90: {0}–{1} tok/s",
27
+ speedNone: "no timing in its transcripts", speedByModel: "Speed by model",
28
+ speedBasis: "Output tokens ÷ the model's own response time (tool time excluded); method after tokdash.",
29
+
30
+ f_includes_estimates: "includes estimates (Kiro)", estimatedPart: "of which estimated: {0}",
22
31
  scanning: "Scanning — totals may still grow.", updated: "Updated {0} · read every 10 min", since: "Collected since {0}", notYet: "Not collected yet",
23
32
  refresh: "Refresh",
24
33
  notMeasured: "Not measured", nm_credit_billed: "Kiro is credit-billed and records no tokens", nm_unsupported: "AgEnD can't read this CLI's usage yet", nm_no_data: "nothing read yet",
@@ -42,11 +51,18 @@ register("fusage", {
42
51
  "zh-TW": {
43
52
  range: "期間", today: "今天", r7d: "7 天", month: "本月", all: "全部", custom: "自訂", from: "從", to: "到", apply: "套用",
44
53
  group: "分組", g_instance: "Agent", g_backend: "Backend", g_model: "模型", g_profile: "憑證 profile", g_team: "Team(依目前設定)",
45
- csv: "下載 CSV", basis: "依牌價換算的 API 等值(查證日期 {0})——不是實際花費。訂閱方案不按 token 計費。",
54
+ csv: "下載 CSV", basis: "依牌價換算的 API 等值({0})——不是實際花費。", basisMore: "訂閱方案不按 token 計費。",
46
55
  amount: "API 等值", input: "輸入", output: "輸出", reasoning: "推理", read: "快取讀取", write: "快取寫入", total: "token 總計", requests: "請求數", messages: "訊息數",
47
56
  notPriced: "未定價", partial: "部分", noTeam: "(不屬於任何 team)", unknown: "未知",
48
- f_cache_write_not_reported: "未回報快取寫入(Codex、Muse)——是估算", f_not_priced: "未定價:{0}", f_source_unknown: "讀取時尚未記錄 backend 與 profile",
49
- f_estimated: "依文字長度估算——Kiro 不記錄 token 數", f_includes_estimates: "含估算值(Kiro)", f_cost_reported: "金額為 CLI 自行回報(價目表沒有此模型)", estimatedPart: "其中估算:{0}",
57
+ t_not_priced: "未定價:{0}", t_partial: "這一列有部分模型沒有價格", t_write_unreported: "Codex/Muse 不回報快取寫入",
58
+ t_cost_reported: "金額為 CLI 自行回報", t_estimated: "依文字長度估算(Kiro 不記錄 token 數)", t_reasoning_none: "這個 CLI 不回報",
59
+ sourceNote: "部分時段在 AgEnD 記錄 backend 與 profile 之前就已讀取。", profileUnrecorded: "未記錄 profile",
60
+ l_partial: "◐ 部分定價", l_cost_reported: "† 金額由 CLI 回報", l_estimated: "≈ 估算值",
61
+ speed: "速度", speedUnit: "{0} token/秒", speedCoverage: "{1} 個請求中有 {0} 個可計時", speedSpread: "p10–p90:{0}–{1} token/秒",
62
+ speedNone: "transcript 沒有計時資訊", speedByModel: "各模型速度",
63
+ speedBasis: "輸出 token ÷ 模型本身的回應時間(不含工具執行時間);方法參考 tokdash。",
64
+
65
+ f_includes_estimates: "含估算值(Kiro)", estimatedPart: "其中估算:{0}",
50
66
  scanning: "掃描中——總數可能還會增加。", updated: "更新於 {0} · 每 10 分鐘讀取一次", since: "自 {0} 起收集", notYet: "尚未收集",
51
67
  refresh: "重新整理",
52
68
  notMeasured: "未量測", nm_credit_billed: "Kiro 以 credit 計費,不記錄 token", nm_unsupported: "AgEnD 目前還讀不到這個 CLI 的用量", nm_no_data: "尚未讀到任何資料",
@@ -95,10 +111,6 @@ export function keyText(group, key) {
95
111
  return key;
96
112
  }
97
113
  const writes = (r) => (r.cacheWrite5m || 0) + (r.cacheWrite1h || 0) + (r.cacheWrite || 0);
98
- function flagText(f, r) {
99
- if (f === "not_priced") return tu("f_not_priced", (r.unpriced || []).join(", "));
100
- return ["cache_write_not_reported", "source_unknown", "estimated", "includes_estimates", "cost_reported"].includes(f) ? tu(`f_${f}`) : f;
101
- }
102
114
 
103
115
  // ── CSV (design §4): the daily rows of this same answer; messages on their own rows (they are per agent, not per model).
104
116
  const CSV_COLUMNS = ["date", "zone", "instance", "backend", "model", "tier", "profile", "input", "output", "reasoning", "cache_read", "cache_write_5m", "cache_write_1h", "cache_write", "requests", "messages", "amount", "basis", "flags", "estimated"];
@@ -318,25 +330,73 @@ function Heatmap({ report, dates }) {
318
330
  </section>`;
319
331
  }
320
332
 
321
- function Row({ r, group, max, measure }) {
333
+ /**
334
+ * A mark with what it means: shown as its sign, said (title, and aria-label for readers) as words. role="img" makes it
335
+ * nameable (#3067 review, Prism P3: aria-label is not allowed on a generic span).
336
+ */
337
+ const mark = (sign, words, cls = "us-mark") => html`<span class=${cls} role="img" title=${words} aria-label=${words}>${sign}</span>`;
338
+ /** "—" that says why there is no number (nameable the same way). */
339
+ const dash = (words) => html`<span class="us-none" role="img" title=${words} aria-label=${words}>—</span>`;
340
+ /** The marks a row's numbers carry (#3066 §3): ◐ partly priced, † the CLI's own amount, ≈ estimated. */
341
+ export function rowMarks(r) {
342
+ const flags = r.flags || [];
343
+ return { partial: r.priced === "partial", cost: flags.includes("cost_reported"), est: flags.includes("estimated") || r.estimated === true,
344
+ writeUnreported: flags.includes("cache_write_not_reported") && writes(r) === 0, unpriced: r.amount === null || r.amount === undefined };
345
+ }
346
+ /** A profile as shown: Codex's older hours were never tagged with one. */
347
+ const profileText = (p) => (p === "unrecorded" ? tu("profileUnrecorded") : p);
348
+
349
+ function Row({ r, group, max, measure, cols }) {
322
350
  const share = max > 0 ? Math.max(0.01, measure(r) / max) : 0;
323
- const meta = [r.backends.join(", "), r.models.join(", "), r.profiles.join(", ")].filter(Boolean).join(" · ");
351
+ const meta = [r.backends.join(", "), r.models.join(", "), r.profiles.map(profileText).join(", ")].filter(Boolean).join(" · ");
352
+ const m = rowMarks(r);
353
+ // Estimated rows (Kiro): every number is an estimate — "≈" before each, the reason in its tooltip.
354
+ const num = (text) => (m.est ? html`${mark("≈", tu("t_estimated"), "us-mark us-approx")}${text}` : text);
355
+ const key = group === "profile" ? profileText(keyText(group, r.key)) : keyText(group, r.key);
324
356
  return html`<tr class="us-row">
325
- <th scope="row" class="us-name"><span class="mono">${keyText(group, r.key)}</span>
357
+ <th scope="row" class="us-name"><span class="mono">${key}</span>
326
358
  <svg class="us-bar" aria-hidden="true"><rect class="us-bar-bg" width="100%" height="6" rx="3" /><rect class="us-bar-fg" width=${`${Math.round(share * 100)}%`} height="6" rx="3" /></svg>
327
- ${group !== "instance" || meta ? html`<span class="us-meta">${meta}</span>` : null}
328
- ${r.flags.length ? html`<span class="us-flags">${r.flags.map((f) => html`<span key=${f} class="ch-tag">${flagText(f, r)}</span>`)}</span>` : null}</th>
329
- <td data-label=${tu("amount")} class=${`num${r.amount === null ? " muted" : ""}`}>${amountText(r)}</td>
330
- <td data-label=${tu("input")} class="num">${tokens(r.input)}</td>
331
- <td data-label=${tu("output")} class="num">${tokens(r.output)}</td>
332
- <td data-label=${tu("reasoning")} class="num">${r.reasoningReported === false ? "—" : tokens(r.reasoning || 0)}</td>
333
- <td data-label=${tu("read")} class="num">${tokens(r.cacheRead)}</td>
334
- <td data-label=${tu("write")} class="num">${r.flags.includes("cache_write_not_reported") && writes(r) === 0 ? "—" : tokens(writes(r))}</td>
335
- <td data-label=${tu("total")} class="num">${tokens(r.total)}</td>
359
+ ${group !== "instance" || meta ? html`<span class="us-meta">${meta}</span>` : null}</th>
360
+ <td data-label=${tu("amount")} class=${`num${m.unpriced ? " muted" : ""}`}>${m.unpriced ? dash(tu("t_not_priced", (r.unpriced || []).join(", "))) : html`${num(money(r.amount))}${m.partial ? mark("◐", tu("t_partial")) : null}${m.cost ? mark("†", tu("t_cost_reported")) : null}`}</td>
361
+ <td data-label=${tu("input")} class="num">${num(tokens(r.input))}</td>
362
+ <td data-label=${tu("output")} class="num">${num(tokens(r.output))}</td>
363
+ ${cols.reasoning ? html`<td data-label=${tu("reasoning")} class="num">${r.reasoningReported === false ? dash(tu("t_reasoning_none")) : num(tokens(r.reasoning || 0))}</td>` : null}
364
+ <td data-label=${tu("read")} class="num">${num(tokens(r.cacheRead))}</td>
365
+ <td data-label=${tu("write")} class="num">${m.writeUnreported ? dash(tu("t_write_unreported")) : num(tokens(writes(r)))}</td>
366
+ <td data-label=${tu("total")} class="num">${num(tokens(r.total))}</td>
336
367
  <td data-label=${tu("requests")} class="num">${n(r.requests)}</td>
337
- <td data-label=${tu("messages")} class="num">${r.messages === null ? "—" : n(r.messages)}</td>
368
+ ${cols.messages ? html`<td data-label=${tu("messages")} class="num">${r.messages === null ? "—" : n(r.messages)}</td>` : null}
369
+ ${cols.speed ? html`<td data-label=${tu("speed")} class="num">${r.speed ? speedText(r.speed) : dash(tu("speedNone"))}</td>` : null}
338
370
  </tr>`;
339
371
  }
372
+ /** #3066 §2: a rate as shown — whole tok/s, one decimal below 10. */
373
+ export const speedText = (s) => tu("speedUnit", s.tokPerSec >= 10 ? Math.round(s.tokPerSec).toLocaleString("en-US") : s.tokPerSec.toFixed(1));
374
+ /** Columns worth a place (#3066 §3): Reasoning only when some row reports it; Messages only when some row has them; Speed (§2) only when some response was timed. */
375
+ export function usageColumns(rows) {
376
+ return { reasoning: rows.some((r) => r.reasoningReported !== false), messages: rows.some((r) => r.messages !== null && r.messages !== undefined),
377
+ speed: rows.some((r) => !!r.speed) };
378
+ }
379
+ /** #3066 §2: each model's speed — rate · requests timed (coverage) · p10–p90 from 30 timed. */
380
+ function SpeedCard({ report }) {
381
+ const list = report.speedByModel || [];
382
+ if (!list.length) return null;
383
+ return html`<section class="us-speed card" aria-labelledby="us-speed-h">
384
+ <h3 id="us-speed-h">${tu("speedByModel")}</h3>
385
+ <ul class="rows">${list.map((m) => html`<li key=${m.model} class="row-item"><span class="grow strong mono">${m.model}</span>
386
+ <span class="num">${speedText(m.speed)}</span>
387
+ <span class="muted">${[m.requests > 0 ? tu("speedCoverage", n(m.speed.timedRequests), n(m.requests)) : null,
388
+ m.speed.p10 !== null && m.speed.p90 !== null ? tu("speedSpread", Math.round(m.speed.p10), Math.round(m.speed.p90)) : null].filter(Boolean).join(" · ")}</span></li>`)}</ul>
389
+ <p class="note">${tu("speedBasis")}</p>
390
+ </section>`;
391
+ }
392
+ /** The legend under the table: only the marks that appear, and the one footnote when an hour's source was not recorded. */
393
+ function Legend({ rows }) {
394
+ const marks = rows.map(rowMarks);
395
+ const parts = [marks.some((m) => m.partial) && tu("l_partial"), marks.some((m) => m.cost) && tu("l_cost_reported"), marks.some((m) => m.est) && tu("l_estimated")].filter(Boolean);
396
+ const source = rows.some((r) => (r.flags || []).includes("source_unknown"));
397
+ if (!parts.length && !source) return null;
398
+ return html`<p class="note us-key">${parts.join(" · ")}${parts.length && source ? html`<br />` : null}${source ? tu("sourceNote") : null}</p>`;
399
+ }
340
400
 
341
401
  /** The tab's body for one answer of GET /ui/usage-report. */
342
402
  export function UsageReport({ report, choice, setChoice, refresh, fetchedAt }) {
@@ -355,6 +415,7 @@ export function UsageReport({ report, choice, setChoice, refresh, fetchedAt }) {
355
415
  const zones = zonesChanged(report);
356
416
  const csvFrom = report.dailyTruncated ? report.dailyFrom : report.range.kind === "all" ? "all" : report.range.from;
357
417
  const rows = report.rows.filter((r) => r.total > 0 || (r.messages || 0) > 0);
418
+ const cols = usageColumns(rows);
358
419
  const anyAmount = rows.some((r) => r.amount !== null && r.amount > 0);
359
420
  const measure = (r) => (anyAmount ? r.amount || 0 : r.total);
360
421
  const max = Math.max(0, ...rows.map(measure));
@@ -375,7 +436,7 @@ export function UsageReport({ report, choice, setChoice, refresh, fetchedAt }) {
375
436
  <label>${tu("from")} <input type="date" value=${draft.from} max=${draft.to} onInput=${(e) => setDraft({ ...draft, from: e.target.value })} /></label>
376
437
  <label>${tu("to")} <input type="date" value=${draft.to} min=${draft.from} onInput=${(e) => setDraft({ ...draft, to: e.target.value })} /></label>
377
438
  <button type="submit" class="btn btn-sm">${tu("apply")}</button></form>` : null}
378
- <p class="us-basis" role="note">${tu("basis", report.pricesChecked)}</p>
439
+ <p class="us-basis" role="note" title=${tu("basisMore")}>${tu("basis", report.pricesChecked)}</p>
379
440
  ${noDaily ? html`<p class="us-partial" role="status">${tu("noDaily")}</p>` : report.dailyTruncated ? html`<p class="us-partial" role="status">${tu("partialDays", report.dailyFrom)}</p>` : null}
380
441
  ${zones ? html`<p class="us-partial" role="status">${tu("zoneChanged", zones.join(", "), report.zone)}</p>` : null}
381
442
  <p class="note us-fresh">${tu("updated", new Date(fetchedAt).toLocaleTimeString([], { hour: "2-digit", minute: "2-digit" }))} · ${Number.isFinite(since) ? tu("since", new Date(since).toLocaleDateString()) : tu("notYet")} · ${tu("zoneNote", report.zone)}${group === "team" ? ` ${tu("teamsNote")}` : ""}
@@ -389,10 +450,12 @@ export function UsageReport({ report, choice, setChoice, refresh, fetchedAt }) {
389
450
  <div class="ch-metric"><dt>${tu("messages")}</dt><dd>${report.totals.messages === null ? "—" : n(report.totals.messages)}</dd></div>
390
451
  </dl>
391
452
  ${rows.length ? html`<table class="us-table"><thead><tr><th scope="col">${tu(`g_${group}`)}</th><th scope="col" class="num">${tu("amount")}</th>
392
- <th scope="col" class="num">${tu("input")}</th><th scope="col" class="num">${tu("output")}</th><th scope="col" class="num">${tu("reasoning")}</th><th scope="col" class="num">${tu("read")}</th><th scope="col" class="num">${tu("write")}</th>
393
- <th scope="col" class="num">${tu("total")}</th><th scope="col" class="num">${tu("requests")}</th><th scope="col" class="num">${tu("messages")}</th></tr></thead>
394
- <tbody>${rows.map((r) => html`<${Row} key=${r.key} r=${r} group=${group} max=${max} measure=${measure} />`)}</tbody></table>`
453
+ <th scope="col" class="num">${tu("input")}</th><th scope="col" class="num">${tu("output")}</th>${cols.reasoning ? html`<th scope="col" class="num">${tu("reasoning")}</th>` : null}<th scope="col" class="num">${tu("read")}</th><th scope="col" class="num">${tu("write")}</th>
454
+ <th scope="col" class="num">${tu("total")}</th><th scope="col" class="num">${tu("requests")}</th>${cols.messages ? html`<th scope="col" class="num">${tu("messages")}</th>` : null}${cols.speed ? html`<th scope="col" class="num">${tu("speed")}</th>` : null}</tr></thead>
455
+ <tbody>${rows.map((r) => html`<${Row} key=${r.key} r=${r} group=${group} max=${max} measure=${measure} cols=${cols} />`)}</tbody></table>
456
+ <${Legend} rows=${rows} />`
395
457
  : html`<p class="note">${tu("noRows")}</p>`}
458
+ <${SpeedCard} report=${report} />
396
459
  <${Trend} report=${report} dates=${dates} />
397
460
  <${Heatmap} report=${report} dates=${dates} />`}
398
461
  ${report.notMeasured.length || report.shared.length ? html`<section class="us-rest" aria-labelledby="us-rest-h"><h3 id="us-rest-h">${tu("notMeasured")}</h3>
@@ -1,40 +1,3 @@
1
- // #1306 §6.1 (Q4): an agent's .html / .htm attachment gets the same preview card as a ```html block. Its HTML is read
2
- // from /ui/file/<id> — same origin, this session's cookie — only on a click (Preview, Open in panel), never to show a
3
- // card. What runs is then handed to the preview frame exactly like a block's (AgendPreview.start): the file URL itself
4
- // is never opened or framed on the dashboard's origin.
5
-
6
- /**
7
- * #2863: the sizes a preview takes (UTF-8 bytes of the HTML), the same as a block's (preview.js LIMITS): up to ASK it
8
- * runs at once; above it the person is asked first ("Preview anyway?"); above MAX there is no preview, only the
9
- * download. MAX is the frame's own ceiling (web-preview.ts PREVIEW_HTML_MAX_BYTES).
10
- */
11
- export const HTML_PREVIEW_ASK = 8 * 1024 * 1024;
12
- export const HTML_PREVIEW_MAX = 50 * 1024 * 1024;
13
-
14
- /**
15
- * Read an attachment's HTML: { ok: true, code } or { ok: false, reason } with reason "large" (above `ask` and not
16
- * `anyway`: nothing is fetched when its listed size says so; `size` is what it is), "over" (above `max`: its listed size
17
- * is checked before anything is fetched, the bytes again after), "gone" (the fleet no longer serves that id — the file
18
- * changed, or the fleet restarted), or "failed". The text card reads with its own, single cap (ask = max).
19
- */
20
- export async function loadHtmlAttachment(att, fetchImpl = globalThis.fetch, { ask = HTML_PREVIEW_ASK, max = HTML_PREVIEW_MAX, anyway = false } = {}) {
21
- if (!att || typeof att.id !== "string" || !/^[0-9a-f]{32}$/.test(att.id)) return { ok: false, reason: "failed" };
22
- if (typeof att.size === "number" && att.size > max) return { ok: false, reason: "over" };
23
- if (typeof att.size === "number" && att.size > ask && !anyway) return { ok: false, reason: "large", size: att.size };
24
- let res;
25
- try { res = await fetchImpl(`/ui/file/${att.id}`, { credentials: "same-origin", cache: "no-store" }); }
26
- catch { return { ok: false, reason: "failed" }; }
27
- if (!res || !res.ok) return { ok: false, reason: res && res.status === 404 ? "gone" : "failed" };
28
- let bytes;
29
- try { bytes = await res.arrayBuffer(); } catch { return { ok: false, reason: "failed" }; }
30
- if (bytes.byteLength > max) return { ok: false, reason: "over" };
31
- if (bytes.byteLength > ask && !anyway) return { ok: false, reason: "large", size: bytes.byteLength };
32
- // UTF-8, as a block's text is; a BOM is dropped.
33
- return { ok: true, code: new TextDecoder("utf-8").decode(bytes) };
34
- }
35
-
36
- /** #2863: a size as the person reads it: "12.3 MB" (1 MB = 1024 × 1024 bytes, as the caps are). */
37
- export function sizeLabel(bytes) {
38
- const mb = bytes / (1024 * 1024);
39
- return `${mb >= 10 ? Math.round(mb) : Math.round(mb * 10) / 10} MB`;
40
- }
1
+ // Hub PR A (#3226): this module moved to /assets/html-attachment.js (src/ui/shared/), shared by the fleet and the Hub. A tab opened
2
+ // before the move still imports it from here: the same module (one instance), re-exported.
3
+ export * from "/assets/html-attachment.js";
@@ -0,0 +1,23 @@
1
+ // Lazy, fixed local-owner copy for the representative-agent share (docs/design/hub-representative-agent.md).
2
+ // A member switcher may retain the old hub-strings module before Settings loads. Own these new words here.
3
+ import { register } from "/assets/app-i18n.js";
4
+ register("hub", {
5
+ en: {
6
+ agentLead: "Every agent is private unless you share it. A shared agent answers Hub questions in its own conversation, with its own folder and the tools its Settings allow. Actions that need approval still come to you.",
7
+ agentShared: "Shared: Hub questions go to this agent's own conversation.",
8
+ republishRequired: "Shared under the older restricted mode. Hub questions are refused until you share this agent again.",
9
+ shareAgain: "Share again",
10
+ agentNotShareable: "This agent can't be shared right now. Reload the page and try again.",
11
+ agentDeliveryUnavailable: "Sharing isn't available on this fleet yet: Hub questions can't reach an agent here.",
12
+ },
13
+ "zh-TW": {
14
+ agentLead: "每個 Agent 預設都不公開。公開後,Agent 會在自己的對話中回答 Hub 的提問,使用它自己的資料夾和設定允許的工具。需要核准的動作仍會交給你。",
15
+ agentShared: "已公開:Hub 的提問會送到這個 Agent 自己的對話。",
16
+ republishRequired: "這是舊的受限模式公開。重新公開這個 Agent 之前,Hub 的提問都會被拒絕。",
17
+ shareAgain: "重新公開",
18
+ agentNotShareable: "目前無法公開這個 Agent。請重新整理頁面後再試一次。",
19
+ agentDeliveryUnavailable: "這個 Fleet 還不能公開:Hub 的提問目前無法送到這裡的 Agent。",
20
+ },
21
+ });
22
+ /** What a Share sends: the agent itself, no Hub tools (agent-mode.ts on the member). */
23
+ export const AGENT_CHOICE = Object.freeze({ dataViewId: "agent", tools: Object.freeze([]) });