@songsid/agend 2.3.5-alpha.3 → 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 (865) 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-api.d.ts +4 -0
  15. package/dist/agent-runtime-api.js +59 -0
  16. package/dist/agent-runtime-api.js.map +1 -0
  17. package/dist/agent-runtime-change.d.ts +76 -0
  18. package/dist/agent-runtime-change.js +114 -0
  19. package/dist/agent-runtime-change.js.map +1 -0
  20. package/dist/agent-workspace.d.ts +93 -0
  21. package/dist/agent-workspace.js +353 -0
  22. package/dist/agent-workspace.js.map +1 -0
  23. package/dist/auth-api.d.ts +27 -0
  24. package/dist/auth-api.js +168 -3
  25. package/dist/auth-api.js.map +1 -1
  26. package/dist/authority/session-authorizations.d.ts +28 -4
  27. package/dist/authority/session-authorizations.js +63 -17
  28. package/dist/authority/session-authorizations.js.map +1 -1
  29. package/dist/backend/antigravity.js +3 -1
  30. package/dist/backend/antigravity.js.map +1 -1
  31. package/dist/backend/codex-footer-hints.d.ts +7 -0
  32. package/dist/backend/codex-footer-hints.js +41 -0
  33. package/dist/backend/codex-footer-hints.js.map +1 -0
  34. package/dist/backend/codex-metadata.d.ts +14 -0
  35. package/dist/backend/codex-metadata.js +45 -0
  36. package/dist/backend/codex-metadata.js.map +1 -1
  37. package/dist/backend/codex-quota-history.d.ts +7 -0
  38. package/dist/backend/codex-quota-history.js +57 -0
  39. package/dist/backend/codex-quota-history.js.map +1 -0
  40. package/dist/backend/codex-session-lookup.d.ts +6 -0
  41. package/dist/backend/codex-session-lookup.js +1 -1
  42. package/dist/backend/codex-session-lookup.js.map +1 -1
  43. package/dist/backend/codex-speed.d.ts +14 -0
  44. package/dist/backend/codex-speed.js +35 -0
  45. package/dist/backend/codex-speed.js.map +1 -0
  46. package/dist/backend/codex.d.ts +7 -0
  47. package/dist/backend/codex.js +85 -24
  48. package/dist/backend/codex.js.map +1 -1
  49. package/dist/backend/grok-weekly-reset.d.ts +24 -0
  50. package/dist/backend/grok-weekly-reset.js +95 -0
  51. package/dist/backend/grok-weekly-reset.js.map +1 -0
  52. package/dist/backend/grok.d.ts +30 -1
  53. package/dist/backend/grok.js +301 -54
  54. package/dist/backend/grok.js.map +1 -1
  55. package/dist/backend/kiro.d.ts +3 -0
  56. package/dist/backend/kiro.js +50 -2
  57. package/dist/backend/kiro.js.map +1 -1
  58. package/dist/backend/muse.js +5 -3
  59. package/dist/backend/muse.js.map +1 -1
  60. package/dist/backend/native-pane.d.ts +3 -1
  61. package/dist/backend/native-pane.js +2 -2
  62. package/dist/backend/native-pane.js.map +1 -1
  63. package/dist/backend/types.d.ts +13 -1
  64. package/dist/backend/types.js +3 -0
  65. package/dist/backend/types.js.map +1 -1
  66. package/dist/build-provenance-cli.d.ts +3 -0
  67. package/dist/build-provenance-cli.js +11 -0
  68. package/dist/build-provenance-cli.js.map +1 -0
  69. package/dist/build-provenance.d.ts +20 -0
  70. package/dist/build-provenance.js +67 -0
  71. package/dist/build-provenance.js.map +1 -0
  72. package/dist/build-provenance.json +1 -0
  73. package/dist/cache-ledger.d.ts +95 -0
  74. package/dist/cache-ledger.js +276 -4
  75. package/dist/cache-ledger.js.map +1 -1
  76. package/dist/cache-service.d.ts +5 -0
  77. package/dist/cache-service.js +16 -4
  78. package/dist/cache-service.js.map +1 -1
  79. package/dist/channel/adapters/discord.js +11 -3
  80. package/dist/channel/adapters/discord.js.map +1 -1
  81. package/dist/channel/adapters/telegram.d.ts +51 -0
  82. package/dist/channel/adapters/telegram.js +235 -17
  83. package/dist/channel/adapters/telegram.js.map +1 -1
  84. package/dist/channel/mcp-tools.js +3 -3
  85. package/dist/channel/mcp-tools.js.map +1 -1
  86. package/dist/channel/types.d.ts +2 -0
  87. package/dist/claude-auth-status.d.ts +48 -0
  88. package/dist/claude-auth-status.js +149 -0
  89. package/dist/claude-auth-status.js.map +1 -0
  90. package/dist/cli.js +138 -37
  91. package/dist/cli.js.map +1 -1
  92. package/dist/config-validator.js +21 -1
  93. package/dist/config-validator.js.map +1 -1
  94. package/dist/cross-instance-notice.d.ts +10 -0
  95. package/dist/cross-instance-notice.js +67 -5
  96. package/dist/cross-instance-notice.js.map +1 -1
  97. package/dist/daemon.d.ts +70 -1
  98. package/dist/daemon.js +547 -25
  99. package/dist/daemon.js.map +1 -1
  100. package/dist/dashboard-permissions.d.ts +8 -0
  101. package/dist/dashboard-permissions.js +16 -0
  102. package/dist/dashboard-permissions.js.map +1 -1
  103. package/dist/delivery-consumed-watch.d.ts +23 -1
  104. package/dist/delivery-consumed-watch.js +30 -3
  105. package/dist/delivery-consumed-watch.js.map +1 -1
  106. package/dist/delivery-reconciliation.d.ts +1 -1
  107. package/dist/delivery-reconciliation.js +1 -1
  108. package/dist/delivery-reconciliation.js.map +1 -1
  109. package/dist/doctor.js +20 -9
  110. package/dist/doctor.js.map +1 -1
  111. package/dist/export-import.d.ts +7 -0
  112. package/dist/export-import.js +44 -10
  113. package/dist/export-import.js.map +1 -1
  114. package/dist/fleet-context.d.ts +2 -0
  115. package/dist/fleet-manager.d.ts +362 -7
  116. package/dist/fleet-manager.js +1522 -91
  117. package/dist/fleet-manager.js.map +1 -1
  118. package/dist/fleet-windows-runtime.d.ts +8 -2
  119. package/dist/fleet-windows-runtime.js +93 -6
  120. package/dist/fleet-windows-runtime.js.map +1 -1
  121. package/dist/general-knowledge/skills/concepts/SKILL.md +425 -0
  122. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +5 -2
  123. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +1 -0
  124. package/dist/general-knowledge/skills/fleet-health/SKILL.md +2 -2
  125. package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -1
  126. package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +41 -4
  127. package/dist/general-knowledge/skills/session-management/SKILL.md +1 -1
  128. package/dist/general-knowledge/skills/tui-effort/SKILL.md +10 -10
  129. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +31 -15
  130. package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
  131. package/dist/general-role.d.ts +1 -1
  132. package/dist/general-role.js +1 -0
  133. package/dist/general-role.js.map +1 -1
  134. package/dist/hub/admission.d.ts +28 -0
  135. package/dist/hub/admission.js +62 -0
  136. package/dist/hub/admission.js.map +1 -0
  137. package/dist/hub/attachments/limits.d.ts +20 -0
  138. package/dist/hub/attachments/limits.js +48 -0
  139. package/dist/hub/attachments/limits.js.map +1 -0
  140. package/dist/hub/attachments/store.d.ts +116 -0
  141. package/dist/hub/attachments/store.js +246 -0
  142. package/dist/hub/attachments/store.js.map +1 -0
  143. package/dist/hub/audit/index.d.ts +62 -0
  144. package/dist/hub/audit/index.js +344 -0
  145. package/dist/hub/audit/index.js.map +1 -0
  146. package/dist/hub/browser-certificate.d.ts +38 -0
  147. package/dist/hub/browser-certificate.js +247 -0
  148. package/dist/hub/browser-certificate.js.map +1 -0
  149. package/dist/hub/buttons-model.d.ts +9 -0
  150. package/dist/hub/buttons-model.js +42 -0
  151. package/dist/hub/buttons-model.js.map +1 -0
  152. package/dist/hub/buttons.d.ts +54 -0
  153. package/dist/hub/buttons.js +346 -0
  154. package/dist/hub/buttons.js.map +1 -0
  155. package/dist/hub/catalog.d.ts +74 -0
  156. package/dist/hub/catalog.js +195 -0
  157. package/dist/hub/catalog.js.map +1 -0
  158. package/dist/hub/client.d.ts +69 -0
  159. package/dist/hub/client.js +300 -0
  160. package/dist/hub/client.js.map +1 -0
  161. package/dist/hub/compose/member.d.ts +139 -0
  162. package/dist/hub/compose/member.js +450 -0
  163. package/dist/hub/compose/member.js.map +1 -0
  164. package/dist/hub/compose/server.d.ts +77 -0
  165. package/dist/hub/compose/server.js +349 -0
  166. package/dist/hub/compose/server.js.map +1 -0
  167. package/dist/hub/compose/views.d.ts +12 -0
  168. package/dist/hub/compose/views.js +4 -0
  169. package/dist/hub/compose/views.js.map +1 -0
  170. package/dist/hub/db.d.ts +56 -0
  171. package/dist/hub/db.js +188 -0
  172. package/dist/hub/db.js.map +1 -0
  173. package/dist/hub/directory/config.d.ts +39 -0
  174. package/dist/hub/directory/config.js +108 -0
  175. package/dist/hub/directory/config.js.map +1 -0
  176. package/dist/hub/directory/directory.d.ts +18 -0
  177. package/dist/hub/directory/directory.js +320 -0
  178. package/dist/hub/directory/directory.js.map +1 -0
  179. package/dist/hub/directory/index.d.ts +7 -0
  180. package/dist/hub/directory/index.js +4 -0
  181. package/dist/hub/directory/index.js.map +1 -0
  182. package/dist/hub/directory/profiles.d.ts +41 -0
  183. package/dist/hub/directory/profiles.js +90 -0
  184. package/dist/hub/directory/profiles.js.map +1 -0
  185. package/dist/hub/directory/types.d.ts +71 -0
  186. package/dist/hub/directory/types.js +14 -0
  187. package/dist/hub/directory/types.js.map +1 -0
  188. package/dist/hub/execution/cli-provider.d.ts +23 -0
  189. package/dist/hub/execution/cli-provider.js +341 -0
  190. package/dist/hub/execution/cli-provider.js.map +1 -0
  191. package/dist/hub/execution/index.d.ts +13 -0
  192. package/dist/hub/execution/index.js +8 -0
  193. package/dist/hub/execution/index.js.map +1 -0
  194. package/dist/hub/execution/model-broker.d.ts +24 -0
  195. package/dist/hub/execution/model-broker.js +208 -0
  196. package/dist/hub/execution/model-broker.js.map +1 -0
  197. package/dist/hub/execution/provider-setup.d.ts +11 -0
  198. package/dist/hub/execution/provider-setup.js +21 -0
  199. package/dist/hub/execution/provider-setup.js.map +1 -0
  200. package/dist/hub/execution/sandbox-runner.d.ts +1 -0
  201. package/dist/hub/execution/sandbox-runner.js +221 -0
  202. package/dist/hub/execution/sandbox-runner.js.map +1 -0
  203. package/dist/hub/execution/service.d.ts +136 -0
  204. package/dist/hub/execution/service.js +459 -0
  205. package/dist/hub/execution/service.js.map +1 -0
  206. package/dist/hub/execution/store.d.ts +61 -0
  207. package/dist/hub/execution/store.js +182 -0
  208. package/dist/hub/execution/store.js.map +1 -0
  209. package/dist/hub/execution/views.d.ts +20 -0
  210. package/dist/hub/execution/views.js +48 -0
  211. package/dist/hub/execution/views.js.map +1 -0
  212. package/dist/hub/http/compose.d.ts +20 -0
  213. package/dist/hub/http/compose.js +518 -0
  214. package/dist/hub/http/compose.js.map +1 -0
  215. package/dist/hub/http/core.d.ts +49 -0
  216. package/dist/hub/http/core.js +124 -0
  217. package/dist/hub/http/core.js.map +1 -0
  218. package/dist/hub/http/deps.d.ts +61 -0
  219. package/dist/hub/http/deps.js +2 -0
  220. package/dist/hub/http/deps.js.map +1 -0
  221. package/dist/hub/http/schema.d.ts +14 -0
  222. package/dist/hub/http/schema.js +80 -0
  223. package/dist/hub/http/schema.js.map +1 -0
  224. package/dist/hub/identity.d.ts +32 -0
  225. package/dist/hub/identity.js +80 -0
  226. package/dist/hub/identity.js.map +1 -0
  227. package/dist/hub/init/browser-certificate.d.ts +9 -0
  228. package/dist/hub/init/browser-certificate.js +78 -0
  229. package/dist/hub/init/browser-certificate.js.map +1 -0
  230. package/dist/hub/init/browser-tls.d.ts +18 -0
  231. package/dist/hub/init/browser-tls.js +62 -0
  232. package/dist/hub/init/browser-tls.js.map +1 -0
  233. package/dist/hub/init/cli.d.ts +3 -0
  234. package/dist/hub/init/cli.js +83 -0
  235. package/dist/hub/init/cli.js.map +1 -0
  236. package/dist/hub/init/directory-certificate.d.ts +24 -0
  237. package/dist/hub/init/directory-certificate.js +222 -0
  238. package/dist/hub/init/directory-certificate.js.map +1 -0
  239. package/dist/hub/init/existing-fleet.d.ts +6 -0
  240. package/dist/hub/init/existing-fleet.js +58 -0
  241. package/dist/hub/init/existing-fleet.js.map +1 -0
  242. package/dist/hub/init/handoff.d.ts +8 -0
  243. package/dist/hub/init/handoff.js +36 -0
  244. package/dist/hub/init/handoff.js.map +1 -0
  245. package/dist/hub/init/identity.d.ts +5 -0
  246. package/dist/hub/init/identity.js +24 -0
  247. package/dist/hub/init/identity.js.map +1 -0
  248. package/dist/hub/init/initializer.d.ts +24 -0
  249. package/dist/hub/init/initializer.js +385 -0
  250. package/dist/hub/init/initializer.js.map +1 -0
  251. package/dist/hub/init/inventory.d.ts +17 -0
  252. package/dist/hub/init/inventory.js +33 -0
  253. package/dist/hub/init/inventory.js.map +1 -0
  254. package/dist/hub/init/layout.d.ts +32 -0
  255. package/dist/hub/init/layout.js +53 -0
  256. package/dist/hub/init/layout.js.map +1 -0
  257. package/dist/hub/init/network.d.ts +18 -0
  258. package/dist/hub/init/network.js +104 -0
  259. package/dist/hub/init/network.js.map +1 -0
  260. package/dist/hub/init/plan-digest.d.ts +5 -0
  261. package/dist/hub/init/plan-digest.js +47 -0
  262. package/dist/hub/init/plan-digest.js.map +1 -0
  263. package/dist/hub/init/prompt.d.ts +26 -0
  264. package/dist/hub/init/prompt.js +110 -0
  265. package/dist/hub/init/prompt.js.map +1 -0
  266. package/dist/hub/init/secret-file.d.ts +1 -0
  267. package/dist/hub/init/secret-file.js +59 -0
  268. package/dist/hub/init/secret-file.js.map +1 -0
  269. package/dist/hub/init/text.d.ts +127 -0
  270. package/dist/hub/init/text.js +247 -0
  271. package/dist/hub/init/text.js.map +1 -0
  272. package/dist/hub/init/types.d.ts +114 -0
  273. package/dist/hub/init/types.js +9 -0
  274. package/dist/hub/init/types.js.map +1 -0
  275. package/dist/hub/init/wizard.d.ts +34 -0
  276. package/dist/hub/init/wizard.js +554 -0
  277. package/dist/hub/init/wizard.js.map +1 -0
  278. package/dist/hub/initialization.d.ts +23 -0
  279. package/dist/hub/initialization.js +28 -0
  280. package/dist/hub/initialization.js.map +1 -0
  281. package/dist/hub/member/agent-mode.d.ts +6 -0
  282. package/dist/hub/member/agent-mode.js +23 -0
  283. package/dist/hub/member/agent-mode.js.map +1 -0
  284. package/dist/hub/member/attachments.d.ts +29 -0
  285. package/dist/hub/member/attachments.js +107 -0
  286. package/dist/hub/member/attachments.js.map +1 -0
  287. package/dist/hub/member/exposure-api.d.ts +87 -0
  288. package/dist/hub/member/exposure-api.js +64 -0
  289. package/dist/hub/member/exposure-api.js.map +1 -0
  290. package/dist/hub/member/exposures.d.ts +123 -0
  291. package/dist/hub/member/exposures.js +282 -0
  292. package/dist/hub/member/exposures.js.map +1 -0
  293. package/dist/hub/member/pairing-api.d.ts +85 -0
  294. package/dist/hub/member/pairing-api.js +385 -0
  295. package/dist/hub/member/pairing-api.js.map +1 -0
  296. package/dist/hub/member/quota.d.ts +20 -0
  297. package/dist/hub/member/quota.js +98 -0
  298. package/dist/hub/member/quota.js.map +1 -0
  299. package/dist/hub/member-journal.d.ts +104 -0
  300. package/dist/hub/member-journal.js +336 -0
  301. package/dist/hub/member-journal.js.map +1 -0
  302. package/dist/hub/member-reconciliation.d.ts +14 -0
  303. package/dist/hub/member-reconciliation.js +97 -0
  304. package/dist/hub/member-reconciliation.js.map +1 -0
  305. package/dist/hub/mount.d.ts +39 -0
  306. package/dist/hub/mount.js +123 -0
  307. package/dist/hub/mount.js.map +1 -0
  308. package/dist/hub/pairing-client.d.ts +17 -0
  309. package/dist/hub/pairing-client.js +108 -0
  310. package/dist/hub/pairing-client.js.map +1 -0
  311. package/dist/hub/pairing.d.ts +65 -0
  312. package/dist/hub/pairing.js +211 -0
  313. package/dist/hub/pairing.js.map +1 -0
  314. package/dist/hub/policy.d.ts +63 -0
  315. package/dist/hub/policy.js +147 -0
  316. package/dist/hub/policy.js.map +1 -0
  317. package/dist/hub/preview.d.ts +32 -0
  318. package/dist/hub/preview.js +64 -0
  319. package/dist/hub/preview.js.map +1 -0
  320. package/dist/hub/private-files.d.ts +5 -0
  321. package/dist/hub/private-files.js +44 -0
  322. package/dist/hub/private-files.js.map +1 -0
  323. package/dist/hub/profile.d.ts +59 -0
  324. package/dist/hub/profile.js +73 -0
  325. package/dist/hub/profile.js.map +1 -0
  326. package/dist/hub/protocol.d.ts +779 -0
  327. package/dist/hub/protocol.js +93 -0
  328. package/dist/hub/protocol.js.map +1 -0
  329. package/dist/hub/quota.d.ts +24 -0
  330. package/dist/hub/quota.js +112 -0
  331. package/dist/hub/quota.js.map +1 -0
  332. package/dist/hub/representative.d.ts +141 -0
  333. package/dist/hub/representative.js +528 -0
  334. package/dist/hub/representative.js.map +1 -0
  335. package/dist/hub/retention.d.ts +17 -0
  336. package/dist/hub/retention.js +45 -0
  337. package/dist/hub/retention.js.map +1 -0
  338. package/dist/hub/rooms.d.ts +120 -0
  339. package/dist/hub/rooms.js +535 -0
  340. package/dist/hub/rooms.js.map +1 -0
  341. package/dist/hub/runtime.d.ts +106 -0
  342. package/dist/hub/runtime.js +298 -0
  343. package/dist/hub/runtime.js.map +1 -0
  344. package/dist/hub/server.d.ts +56 -0
  345. package/dist/hub/server.js +202 -0
  346. package/dist/hub/server.js.map +1 -0
  347. package/dist/hub/service-start.d.ts +17 -0
  348. package/dist/hub/service-start.js +109 -0
  349. package/dist/hub/service-start.js.map +1 -0
  350. package/dist/hub/sessions.d.ts +53 -0
  351. package/dist/hub/sessions.js +196 -0
  352. package/dist/hub/sessions.js.map +1 -0
  353. package/dist/hub/socket.d.ts +24 -0
  354. package/dist/hub/socket.js +79 -0
  355. package/dist/hub/socket.js.map +1 -0
  356. package/dist/hub/store.d.ts +77 -0
  357. package/dist/hub/store.js +88 -0
  358. package/dist/hub/store.js.map +1 -0
  359. package/dist/hub/tls.d.ts +31 -0
  360. package/dist/hub/tls.js +135 -0
  361. package/dist/hub/tls.js.map +1 -0
  362. package/dist/hub/types.d.ts +401 -0
  363. package/dist/hub/types.js +2 -0
  364. package/dist/hub/types.js.map +1 -0
  365. package/dist/hub/validation.d.ts +33 -0
  366. package/dist/hub/validation.js +136 -0
  367. package/dist/hub/validation.js.map +1 -0
  368. package/dist/hub/version-floor.d.ts +10 -0
  369. package/dist/hub/version-floor.js +45 -0
  370. package/dist/hub/version-floor.js.map +1 -0
  371. package/dist/hub-browser-certificate-policy.d.ts +31 -0
  372. package/dist/hub-browser-certificate-policy.js +25 -0
  373. package/dist/hub-browser-certificate-policy.js.map +1 -0
  374. package/dist/hub-membership-settings.d.ts +6 -0
  375. package/dist/hub-membership-settings.js +21 -0
  376. package/dist/hub-membership-settings.js.map +1 -0
  377. package/dist/hub-mode.d.ts +15 -0
  378. package/dist/hub-mode.js +17 -0
  379. package/dist/hub-mode.js.map +1 -0
  380. package/dist/hub-pairing-summary.d.ts +48 -0
  381. package/dist/hub-pairing-summary.js +36 -0
  382. package/dist/hub-pairing-summary.js.map +1 -0
  383. package/dist/hub-report-target.d.ts +32 -0
  384. package/dist/hub-report-target.js +33 -0
  385. package/dist/hub-report-target.js.map +1 -0
  386. package/dist/hub-retention-policy.d.ts +14 -0
  387. package/dist/hub-retention-policy.js +15 -0
  388. package/dist/hub-retention-policy.js.map +1 -0
  389. package/dist/instance-config-impact.js +3 -0
  390. package/dist/instance-config-impact.js.map +1 -1
  391. package/dist/instance-lifecycle.d.ts +17 -2
  392. package/dist/instance-lifecycle.js +58 -8
  393. package/dist/instance-lifecycle.js.map +1 -1
  394. package/dist/instance-topic-delete.d.ts +77 -0
  395. package/dist/instance-topic-delete.js +123 -0
  396. package/dist/instance-topic-delete.js.map +1 -0
  397. package/dist/instructions.d.ts +1 -1
  398. package/dist/instructions.js +1 -1
  399. package/dist/instructions.js.map +1 -1
  400. package/dist/kiro-engine-status.d.ts +11 -0
  401. package/dist/kiro-engine-status.js +6 -0
  402. package/dist/kiro-engine-status.js.map +1 -1
  403. package/dist/launchd-service-domain.d.ts +5 -0
  404. package/dist/launchd-service-domain.js +21 -0
  405. package/dist/launchd-service-domain.js.map +1 -0
  406. package/dist/locale.js +125 -3
  407. package/dist/locale.js.map +1 -1
  408. package/dist/log-service.d.ts +28 -0
  409. package/dist/log-service.js +29 -0
  410. package/dist/log-service.js.map +1 -1
  411. package/dist/log-steps.d.ts +4 -3
  412. package/dist/log-steps.js +32 -7
  413. package/dist/log-steps.js.map +1 -1
  414. package/dist/logger.d.ts +16 -2
  415. package/dist/logger.js +346 -66
  416. package/dist/logger.js.map +1 -1
  417. package/dist/login-flows.d.ts +15 -7
  418. package/dist/login-flows.js +29 -3
  419. package/dist/login-flows.js.map +1 -1
  420. package/dist/login-manager.js +25 -4
  421. package/dist/login-manager.js.map +1 -1
  422. package/dist/ls-rows.js +3 -4
  423. package/dist/ls-rows.js.map +1 -1
  424. package/dist/missed-offline.d.ts +25 -0
  425. package/dist/missed-offline.js +79 -0
  426. package/dist/missed-offline.js.map +1 -0
  427. package/dist/native-instance-api.d.ts +0 -1
  428. package/dist/native-instance-api.js +15 -3
  429. package/dist/native-instance-api.js.map +1 -1
  430. package/dist/native-instance-input.d.ts +3 -0
  431. package/dist/native-instance-input.js +6 -1
  432. package/dist/native-instance-input.js.map +1 -1
  433. package/dist/native-instance-registry.d.ts +6 -0
  434. package/dist/native-instance-registry.js +24 -0
  435. package/dist/native-instance-registry.js.map +1 -1
  436. package/dist/native-mcp.d.ts +3 -0
  437. package/dist/native-mcp.js +15 -2
  438. package/dist/native-mcp.js.map +1 -1
  439. package/dist/native-pane-lifecycle.d.ts +8 -0
  440. package/dist/native-pane-lifecycle.js +13 -4
  441. package/dist/native-pane-lifecycle.js.map +1 -1
  442. package/dist/native-pane-manager.js +17 -9
  443. package/dist/native-pane-manager.js.map +1 -1
  444. package/dist/needs-you-hub.d.ts +9 -1
  445. package/dist/needs-you-hub.js +46 -8
  446. package/dist/needs-you-hub.js.map +1 -1
  447. package/dist/needs-you.d.ts +47 -2
  448. package/dist/needs-you.js +31 -3
  449. package/dist/needs-you.js.map +1 -1
  450. package/dist/office-share-page.js +3 -3
  451. package/dist/office-share-page.js.map +1 -1
  452. package/dist/office-share.d.ts +11 -0
  453. package/dist/office-share.js +14 -0
  454. package/dist/office-share.js.map +1 -1
  455. package/dist/office-talk.d.ts +26 -0
  456. package/dist/office-talk.js +50 -0
  457. package/dist/office-talk.js.map +1 -0
  458. package/dist/outbound-handlers.d.ts +14 -0
  459. package/dist/outbound-handlers.js +49 -6
  460. package/dist/outbound-handlers.js.map +1 -1
  461. package/dist/outbound-schemas.d.ts +33 -1
  462. package/dist/outbound-schemas.js +29 -16
  463. package/dist/outbound-schemas.js.map +1 -1
  464. package/dist/pane-quota-history.d.ts +9 -0
  465. package/dist/pane-quota-history.js +67 -0
  466. package/dist/pane-quota-history.js.map +1 -0
  467. package/dist/pause-marker.d.ts +1 -1
  468. package/dist/pause-marker.js +1 -1
  469. package/dist/pause-marker.js.map +1 -1
  470. package/dist/platform-general.d.ts +46 -0
  471. package/dist/platform-general.js +91 -0
  472. package/dist/platform-general.js.map +1 -0
  473. package/dist/public-web-gateway.js +7 -0
  474. package/dist/public-web-gateway.js.map +1 -1
  475. package/dist/public-web-link.d.ts +6 -0
  476. package/dist/public-web-link.js +9 -0
  477. package/dist/public-web-link.js.map +1 -1
  478. package/dist/queued-handoffs.d.ts +33 -0
  479. package/dist/queued-handoffs.js +75 -0
  480. package/dist/queued-handoffs.js.map +1 -0
  481. package/dist/quickstart.d.ts +13 -0
  482. package/dist/quickstart.js +81 -5
  483. package/dist/quickstart.js.map +1 -1
  484. package/dist/quota-notice.d.ts +7 -0
  485. package/dist/quota-notice.js +40 -0
  486. package/dist/quota-notice.js.map +1 -1
  487. package/dist/reply-buttons-controller.js +10 -6
  488. package/dist/reply-buttons-controller.js.map +1 -1
  489. package/dist/reply-polls.d.ts +2 -2
  490. package/dist/reply-polls.js +3 -3
  491. package/dist/reply-polls.js.map +1 -1
  492. package/dist/runtime-api.d.ts +2 -0
  493. package/dist/runtime-api.js +106 -13
  494. package/dist/runtime-api.js.map +1 -1
  495. package/dist/runtime-build-info.d.ts +9 -0
  496. package/dist/runtime-build-info.js +59 -0
  497. package/dist/runtime-build-info.js.map +1 -0
  498. package/dist/runtime-bundle.d.ts +6 -1
  499. package/dist/runtime-bundle.js +17 -9
  500. package/dist/runtime-bundle.js.map +1 -1
  501. package/dist/runtime-cli.d.ts +13 -1
  502. package/dist/runtime-cli.js +173 -19
  503. package/dist/runtime-cli.js.map +1 -1
  504. package/dist/runtime-client-store.d.ts +27 -1
  505. package/dist/runtime-client-store.js +86 -6
  506. package/dist/runtime-client-store.js.map +1 -1
  507. package/dist/runtime-client.d.ts +74 -0
  508. package/dist/runtime-client.js +336 -26
  509. package/dist/runtime-client.js.map +1 -1
  510. package/dist/runtime-connection.d.ts +22 -0
  511. package/dist/runtime-connection.js +93 -0
  512. package/dist/runtime-connection.js.map +1 -0
  513. package/dist/runtime-coordinator.d.ts +16 -0
  514. package/dist/runtime-coordinator.js +287 -62
  515. package/dist/runtime-coordinator.js.map +1 -1
  516. package/dist/runtime-credential-profiles.d.ts +78 -0
  517. package/dist/runtime-credential-profiles.js +280 -0
  518. package/dist/runtime-credential-profiles.js.map +1 -0
  519. package/dist/runtime-install.d.ts +50 -0
  520. package/dist/runtime-install.js +186 -0
  521. package/dist/runtime-install.js.map +1 -0
  522. package/dist/runtime-pane-assets.d.ts +1 -1
  523. package/dist/runtime-pane-assets.js +1 -1
  524. package/dist/runtime-pane-assets.js.map +1 -1
  525. package/dist/runtime-pane-boot.d.ts +7 -0
  526. package/dist/runtime-pane-boot.js +23 -0
  527. package/dist/runtime-pane-boot.js.map +1 -1
  528. package/dist/runtime-pane-codex-index.d.ts +10 -1
  529. package/dist/runtime-pane-codex-index.js +131 -27
  530. package/dist/runtime-pane-codex-index.js.map +1 -1
  531. package/dist/runtime-pane-host.d.ts +19 -0
  532. package/dist/runtime-pane-host.js +50 -7
  533. package/dist/runtime-pane-host.js.map +1 -1
  534. package/dist/runtime-pane-link.d.ts +7 -0
  535. package/dist/runtime-pane-link.js +93 -2
  536. package/dist/runtime-pane-link.js.map +1 -1
  537. package/dist/runtime-pane-mcp-relay.d.ts +1 -0
  538. package/dist/runtime-pane-mcp-relay.js +10 -0
  539. package/dist/runtime-pane-mcp-relay.js.map +1 -1
  540. package/dist/runtime-pane-mcp.d.ts +4 -0
  541. package/dist/runtime-pane-mcp.js +6 -3
  542. package/dist/runtime-pane-mcp.js.map +1 -1
  543. package/dist/runtime-pane-native.d.ts +32 -2
  544. package/dist/runtime-pane-native.js +55 -6
  545. package/dist/runtime-pane-native.js.map +1 -1
  546. package/dist/runtime-pane-port.d.ts +5 -0
  547. package/dist/runtime-pane-port.js +17 -1
  548. package/dist/runtime-pane-port.js.map +1 -1
  549. package/dist/runtime-pane-process.d.ts +1 -1
  550. package/dist/runtime-pane-process.js +11 -2
  551. package/dist/runtime-pane-process.js.map +1 -1
  552. package/dist/runtime-pane-protocol.d.ts +11 -1
  553. package/dist/runtime-pane-protocol.js +27 -5
  554. package/dist/runtime-pane-protocol.js.map +1 -1
  555. package/dist/runtime-pane-quota-history.d.ts +6 -0
  556. package/dist/runtime-pane-quota-history.js +44 -0
  557. package/dist/runtime-pane-quota-history.js.map +1 -0
  558. package/dist/runtime-pane-service.d.ts +5 -0
  559. package/dist/runtime-pane-service.js +47 -12
  560. package/dist/runtime-pane-service.js.map +1 -1
  561. package/dist/runtime-pane-transcript.d.ts +5 -0
  562. package/dist/runtime-pane-transcript.js +66 -5
  563. package/dist/runtime-pane-transcript.js.map +1 -1
  564. package/dist/runtime-pane-worker.js +19 -6
  565. package/dist/runtime-pane-worker.js.map +1 -1
  566. package/dist/runtime-protocol.d.ts +30 -2
  567. package/dist/runtime-protocol.js +30 -0
  568. package/dist/runtime-protocol.js.map +1 -1
  569. package/dist/runtime-update-activity.d.ts +21 -0
  570. package/dist/runtime-update-activity.js +51 -0
  571. package/dist/runtime-update-activity.js.map +1 -0
  572. package/dist/runtime-update-artifact.d.ts +31 -0
  573. package/dist/runtime-update-artifact.js +252 -0
  574. package/dist/runtime-update-artifact.js.map +1 -0
  575. package/dist/runtime-update-install.d.ts +31 -0
  576. package/dist/runtime-update-install.js +205 -0
  577. package/dist/runtime-update-install.js.map +1 -0
  578. package/dist/runtime-update-journal.d.ts +44 -0
  579. package/dist/runtime-update-journal.js +121 -0
  580. package/dist/runtime-update-journal.js.map +1 -0
  581. package/dist/runtime-update-lock.d.ts +48 -0
  582. package/dist/runtime-update-lock.js +217 -0
  583. package/dist/runtime-update-lock.js.map +1 -0
  584. package/dist/runtime-update-owners.d.ts +29 -0
  585. package/dist/runtime-update-owners.js +240 -0
  586. package/dist/runtime-update-owners.js.map +1 -0
  587. package/dist/runtime-update-protocol.d.ts +15 -0
  588. package/dist/runtime-update-protocol.js +13 -0
  589. package/dist/runtime-update-protocol.js.map +1 -0
  590. package/dist/runtime-windows-bridge.d.ts +2 -1
  591. package/dist/runtime-windows-bridge.js +11 -1
  592. package/dist/runtime-windows-bridge.js.map +1 -1
  593. package/dist/scheduler/db.d.ts +2 -1
  594. package/dist/scheduler/db.js +23 -9
  595. package/dist/scheduler/db.js.map +1 -1
  596. package/dist/scheduler/task-board-text.js +1 -1
  597. package/dist/scheduler/task-board-text.js.map +1 -1
  598. package/dist/scheduler/task-board.d.ts +13 -0
  599. package/dist/scheduler/task-board.js +28 -3
  600. package/dist/scheduler/task-board.js.map +1 -1
  601. package/dist/service-drain.d.ts +19 -0
  602. package/dist/service-drain.js +64 -0
  603. package/dist/service-drain.js.map +1 -0
  604. package/dist/service-installer.d.ts +7 -2
  605. package/dist/service-installer.js +13 -10
  606. package/dist/service-installer.js.map +1 -1
  607. package/dist/settings-api.d.ts +20 -0
  608. package/dist/settings-api.js +414 -4
  609. package/dist/settings-api.js.map +1 -1
  610. package/dist/settings-baseline.d.ts +6 -0
  611. package/dist/settings-baseline.js +3 -1
  612. package/dist/settings-baseline.js.map +1 -1
  613. package/dist/settings-change.js +29 -6
  614. package/dist/settings-change.js.map +1 -1
  615. package/dist/settings-effect.d.ts +13 -0
  616. package/dist/settings-effect.js +98 -1
  617. package/dist/settings-effect.js.map +1 -1
  618. package/dist/settings-http-confirmation.d.ts +3 -0
  619. package/dist/settings-http-confirmation.js +28 -1
  620. package/dist/settings-http-confirmation.js.map +1 -1
  621. package/dist/settings-instance-patch.js +27 -0
  622. package/dist/settings-instance-patch.js.map +1 -1
  623. package/dist/setup-wizard.js +6 -2
  624. package/dist/setup-wizard.js.map +1 -1
  625. package/dist/task-board-tool.d.ts +13 -1
  626. package/dist/task-board-tool.js +104 -4
  627. package/dist/task-board-tool.js.map +1 -1
  628. package/dist/task-board-waker.d.ts +6 -0
  629. package/dist/task-board-waker.js +4 -0
  630. package/dist/task-board-waker.js.map +1 -1
  631. package/dist/tmux-binary.d.ts +59 -0
  632. package/dist/tmux-binary.js +200 -0
  633. package/dist/tmux-binary.js.map +1 -0
  634. package/dist/tmux-control.js +4 -4
  635. package/dist/tmux-control.js.map +1 -1
  636. package/dist/tmux-exec-helper.js +32 -1
  637. package/dist/tmux-exec-helper.js.map +1 -1
  638. package/dist/tmux-manager.d.ts +1 -1
  639. package/dist/tmux-manager.js +45 -36
  640. package/dist/tmux-manager.js.map +1 -1
  641. package/dist/tmux-read.js +4 -3
  642. package/dist/tmux-read.js.map +1 -1
  643. package/dist/tool-permissions.d.ts +5 -2
  644. package/dist/tool-permissions.js +6 -5
  645. package/dist/tool-permissions.js.map +1 -1
  646. package/dist/tool-progress.d.ts +2 -0
  647. package/dist/tool-progress.js +19 -3
  648. package/dist/tool-progress.js.map +1 -1
  649. package/dist/topic-commands.js +10 -5
  650. package/dist/topic-commands.js.map +1 -1
  651. package/dist/transcript-monitor.d.ts +20 -0
  652. package/dist/transcript-monitor.js +47 -3
  653. package/dist/transcript-monitor.js.map +1 -1
  654. package/dist/transcript-needles.d.ts +7 -0
  655. package/dist/transcript-needles.js +9 -1
  656. package/dist/transcript-needles.js.map +1 -1
  657. package/dist/transcript-records.d.ts +1 -1
  658. package/dist/transcript-records.js +2 -1
  659. package/dist/transcript-records.js.map +1 -1
  660. package/dist/types.d.ts +6 -0
  661. package/dist/ui/account-identity.js +27 -0
  662. package/dist/ui/accounts-view.js +214 -0
  663. package/dist/ui/agent-runtime-settings.js +68 -0
  664. package/dist/ui/agent-runtime.js +20 -2
  665. package/dist/ui/backend-signin.js +39 -21
  666. package/dist/ui/chat-ambient.js +1 -1
  667. package/dist/ui/chat-md-strings.js +3 -0
  668. package/dist/ui/chat-render.js +3 -670
  669. package/dist/ui/chat-store.js +1 -1
  670. package/dist/ui/chat-strings.js +3 -333
  671. package/dist/ui/chat-thread.js +3 -919
  672. package/dist/ui/chat-time.js +3 -80
  673. package/dist/ui/chat-tour.js +1 -1
  674. package/dist/ui/credential-profile-select.js +54 -0
  675. package/dist/ui/fleet-office-dialogue.d.ts +30 -0
  676. package/dist/ui/fleet-office-dialogue.js +382 -0
  677. package/dist/ui/fleet-office-pack.d.ts +9 -0
  678. package/dist/ui/fleet-office-pack.js +76 -4
  679. package/dist/ui/fleet-office-skin.js +23 -5
  680. package/dist/ui/fleet-office-store.js +5 -0
  681. package/dist/ui/fleet-office.js +173 -6
  682. package/dist/ui/fleet-task-card.js +10 -6
  683. package/dist/ui/fleet-task-common.js +12 -2
  684. package/dist/ui/fleet-task-menu.js +188 -0
  685. package/dist/ui/fleet-task-stats.js +124 -0
  686. package/dist/ui/fleet-task-view.js +340 -0
  687. package/dist/ui/fleet-tasks.js +131 -43
  688. package/dist/ui/fleet-usage.js +90 -27
  689. package/dist/ui/html-attachment.js +3 -40
  690. package/dist/ui/hub-agent-copy.js +23 -0
  691. package/dist/ui/hub-button-actions.js +65 -0
  692. package/dist/ui/hub-chat-store.js +158 -0
  693. package/dist/ui/hub-chat-strings.js +77 -0
  694. package/dist/ui/hub-client.js +329 -0
  695. package/dist/ui/hub-owner-strings.js +51 -0
  696. package/dist/ui/hub-provider-guidance.js +31 -0
  697. package/dist/ui/hub-quota.js +85 -0
  698. package/dist/ui/hub-strings.js +162 -0
  699. package/dist/ui/hub-switcher.js +27 -0
  700. package/dist/ui/native-instance-settings.js +5 -8
  701. package/dist/ui/native-pane-recovery.js +1 -1
  702. package/dist/ui/office-share-page.js +4 -2
  703. package/dist/ui/panel-chat.js +36 -49
  704. package/dist/ui/panel-details.js +1 -1
  705. package/dist/ui/panel-fleet.js +82 -12
  706. package/dist/ui/panel-hub.js +619 -0
  707. package/dist/ui/panel-log.js +2 -2
  708. package/dist/ui/panel-needs.js +24 -8
  709. package/dist/ui/panel-runtimes.js +239 -45
  710. package/dist/ui/panel-settings.js +266 -192
  711. package/dist/ui/panel-windows-cli.js +88 -42
  712. package/dist/ui/preview-pages.js +1 -1
  713. package/dist/ui/preview-panel.js +92 -6
  714. package/dist/ui/preview-versions.js +1 -1
  715. package/dist/ui/preview.js +3 -476
  716. package/dist/ui/runtime-commands.d.ts +4 -0
  717. package/dist/ui/runtime-commands.js +59 -0
  718. package/dist/ui/search-dialog.js +2 -0
  719. package/dist/ui/settings-access-strings.js +42 -0
  720. package/dist/ui/settings-agent-filters.js +94 -0
  721. package/dist/ui/settings-appearance.js +122 -23
  722. package/dist/ui/settings-build-version.js +35 -0
  723. package/dist/ui/settings-codex-copy.js +19 -0
  724. package/dist/ui/settings-devices.js +253 -0
  725. package/dist/ui/settings-dialogs.js +33 -12
  726. package/dist/ui/settings-guests.js +25 -11
  727. package/dist/ui/settings-hub-browser-certificate.js +74 -0
  728. package/dist/ui/settings-hub-membership.js +72 -0
  729. package/dist/ui/settings-hub-retention.js +52 -0
  730. package/dist/ui/settings-hub.js +196 -0
  731. package/dist/ui/settings-layout.js +242 -0
  732. package/dist/ui/settings-model.js +24 -2
  733. package/dist/ui/settings-outside.js +104 -38
  734. package/dist/ui/settings-registry.js +9 -4
  735. package/dist/ui/settings-shared-strings.js +143 -0
  736. package/dist/ui/settings-shared.js +345 -0
  737. package/dist/ui/settings-shortcuts.js +65 -0
  738. package/dist/ui/settings-strings.js +89 -32
  739. package/dist/ui/settings-web-authority.js +17 -11
  740. package/dist/ui/shared/accounts.css +15 -0
  741. package/dist/ui/shared/app-i18n.js +2 -2
  742. package/dist/ui/shared/app-needs.js +1 -1
  743. package/dist/ui/shared/app-route.js +6 -1
  744. package/dist/ui/shared/app-session.js +6 -2
  745. package/dist/ui/shared/app-shell.js +81 -15
  746. package/dist/ui/shared/app.css +1114 -13
  747. package/dist/ui/shared/app.js +12 -3
  748. package/dist/ui/shared/chat-composer.js +68 -0
  749. package/dist/ui/shared/chat-md-strings.js +9 -0
  750. package/dist/ui/shared/chat-render.js +682 -0
  751. package/dist/ui/shared/chat-strings.js +333 -0
  752. package/dist/ui/shared/chat-thread.js +969 -0
  753. package/dist/ui/shared/chat-time.js +80 -0
  754. package/dist/ui/shared/header-tools.js +3 -5
  755. package/dist/ui/shared/html-attachment.js +42 -0
  756. package/dist/ui/shared/hub-chat.css +85 -0
  757. package/dist/ui/shared/hub-owner.css +33 -0
  758. package/dist/ui/shared/hub-quota.css +8 -0
  759. package/dist/ui/shared/hub.css +71 -0
  760. package/dist/ui/shared/instance-nav.js +3 -2
  761. package/dist/ui/shared/machine-name.js +13 -0
  762. package/dist/ui/shared/page-head.js +8 -0
  763. package/dist/ui/shared/panel-view.js +77 -4
  764. package/dist/ui/shared/preview.js +476 -0
  765. package/dist/ui/shared/runtime-install.css +26 -0
  766. package/dist/ui/shared/settings-width.js +31 -0
  767. package/dist/ui/shared/side-rail.js +15 -0
  768. package/dist/ui/shared/signin.js +172 -0
  769. package/dist/ui/shared/task-board.css +95 -0
  770. package/dist/ui/shared/tokens.css +1 -0
  771. package/dist/ui/shared/ui-dialog.js +2 -2
  772. package/dist/ui/shared/ui-menu.js +3 -3
  773. package/dist/ui/shared/usage-dialog.js +18 -1
  774. package/dist/ui/shared/view-history.css +17 -0
  775. package/dist/ui/shared/view-history.js +438 -0
  776. package/dist/ui/shared/view-strings.js +16 -0
  777. package/dist/ui/shared/workspace.css +20 -0
  778. package/dist/ui/signin.html +21 -0
  779. package/dist/ui/windows-cli-catalog.js +41 -12
  780. package/dist/ui/workspace-panel.js +189 -0
  781. package/dist/ui/workspace-strings.js +35 -0
  782. package/dist/unattended-install.d.ts +11 -2
  783. package/dist/unattended-install.js +41 -6
  784. package/dist/unattended-install.js.map +1 -1
  785. package/dist/usage/capacity.d.ts +69 -0
  786. package/dist/usage/capacity.js +119 -0
  787. package/dist/usage/capacity.js.map +1 -0
  788. package/dist/usage/i18n-keys.d.ts +1 -1
  789. package/dist/usage/i18n-keys.js +3 -0
  790. package/dist/usage/i18n-keys.js.map +1 -1
  791. package/dist/usage/profile-timeline.d.ts +16 -0
  792. package/dist/usage/profile-timeline.js +58 -0
  793. package/dist/usage/profile-timeline.js.map +1 -0
  794. package/dist/usage/providers.js +2 -1
  795. package/dist/usage/providers.js.map +1 -1
  796. package/dist/usage/quota-history.d.ts +43 -0
  797. package/dist/usage/quota-history.js +168 -0
  798. package/dist/usage/quota-history.js.map +1 -0
  799. package/dist/usage/usage-api.d.ts +31 -0
  800. package/dist/usage/usage-api.js +80 -1
  801. package/dist/usage/usage-api.js.map +1 -1
  802. package/dist/usage-report.d.ts +25 -1
  803. package/dist/usage-report.js +55 -4
  804. package/dist/usage-report.js.map +1 -1
  805. package/dist/usage-rollup.d.ts +6 -1
  806. package/dist/usage-rollup.js +16 -4
  807. package/dist/usage-rollup.js.map +1 -1
  808. package/dist/view-api.d.ts +16 -0
  809. package/dist/view-api.js +105 -23
  810. package/dist/view-api.js.map +1 -1
  811. package/dist/view-history.d.ts +84 -0
  812. package/dist/view-history.js +116 -0
  813. package/dist/view-history.js.map +1 -0
  814. package/dist/web-api.d.ts +49 -2
  815. package/dist/web-api.js +279 -8
  816. package/dist/web-api.js.map +1 -1
  817. package/dist/web-backend-login.d.ts +23 -1
  818. package/dist/web-backend-login.js +11 -17
  819. package/dist/web-backend-login.js.map +1 -1
  820. package/dist/web-device-login.d.ts +153 -0
  821. package/dist/web-device-login.js +278 -0
  822. package/dist/web-device-login.js.map +1 -0
  823. package/dist/web-office-skins.d.ts +9 -0
  824. package/dist/web-office-skins.js +16 -1
  825. package/dist/web-office-skins.js.map +1 -1
  826. package/dist/web-session-authorization.d.ts +13 -2
  827. package/dist/web-session-authorization.js +10 -3
  828. package/dist/web-session-authorization.js.map +1 -1
  829. package/dist/web-session.d.ts +35 -0
  830. package/dist/web-session.js +7 -0
  831. package/dist/web-session.js.map +1 -1
  832. package/dist/web-settings-patch.d.ts +3 -1
  833. package/dist/web-settings-patch.js +4 -1
  834. package/dist/web-settings-patch.js.map +1 -1
  835. package/dist/web-shell-routes.d.ts +6 -0
  836. package/dist/web-shell-routes.js +7 -0
  837. package/dist/web-shell-routes.js.map +1 -1
  838. package/dist/web-terminal.d.ts +4 -30
  839. package/dist/web-terminal.js +9 -6
  840. package/dist/web-terminal.js.map +1 -1
  841. package/dist/windows-agents.d.ts +4 -1
  842. package/dist/windows-agents.js +14 -10
  843. package/dist/windows-agents.js.map +1 -1
  844. package/dist/windows-cli-api.d.ts +12 -1
  845. package/dist/windows-cli-api.js +29 -2
  846. package/dist/windows-cli-api.js.map +1 -1
  847. package/dist/windows-cli-providers.d.ts +0 -9
  848. package/dist/windows-cli-providers.js +4 -9
  849. package/dist/windows-cli-providers.js.map +1 -1
  850. package/dist/windows-cli-worker.d.ts +25 -0
  851. package/dist/windows-cli-worker.js +98 -7
  852. package/dist/windows-cli-worker.js.map +1 -1
  853. package/dist/windows-cli.d.ts +11 -0
  854. package/dist/windows-cli.js +17 -3
  855. package/dist/windows-cli.js.map +1 -1
  856. package/dist/yaml-shared-nodes.js +8 -3
  857. package/dist/yaml-shared-nodes.js.map +1 -1
  858. package/launcher/agend-install.cjs +8 -1
  859. package/launcher/launchd-session-type.cjs +14 -0
  860. package/launcher/postinstall.cjs +27 -2
  861. package/launcher/private-home.cjs +1 -1
  862. package/launcher/tmux-bundle.cjs +247 -0
  863. package/package.json +3 -2
  864. package/templates/launchd.plist.ejs +3 -1
  865. package/templates/runtime-install/install.ps1 +270 -0
@@ -91,6 +91,11 @@
91
91
  // ≤ 40 characters each), in place of the page's own
92
92
  // "room": { "floor": "floor.png", "wall": "wall.png" }, "desk": { "back": …, "front": …, "lit": … }
93
93
  // optional: for the desks layout (a pack without stateZones)
94
+ // "portraits": { "default": FACE, "byInstance": { "atlas": FACE }, "byUser": { "discord:1": FACE }, "npc": { "<item id>": FACE } }
95
+ // optional (#2861): the dialogue box's faces — FACE is a file, or
96
+ // { "idle", "working", "needs" } files; PNGs up to 1024×1536 (host)
97
+ // "dialogBox": { "frame": "box.png", "slice": 8, "background": "#rrggbb", "border", "text", "name" }
98
+ // optional (#2861): the box's 9-slice frame (≤ 512×512) and colours
94
99
  // "levels": { optional (#2661): the Office levels' words
95
100
  // "titles": [{ "from": 1, "name": "Intern" }, …], the title from each level up (≤ 32, `from` 0–100000
96
101
  // rising, a name 1–24 characters), in place of the page's own
@@ -162,7 +167,12 @@ const RESERVED = new Set(["cozy", "guild", "school"]);
162
167
  const ID = /^[A-Za-z0-9_-]{1,40}$/;
163
168
  const SRC = /^[A-Za-z0-9._/-]{1,200}$/;
164
169
  const HEX = /^#[0-9a-f]{6}$/i;
165
- const LIMIT = { areas: 32, seats: 64, furniture: 128, waypoints: 512, edges: 2048, sets: 64, byInstance: 500, lines: 12, line: 40, seatFor: 16, titles: 32, title: 24, fixed: 500 };
170
+ const LIMIT = { areas: 32, seats: 64, furniture: 128, waypoints: 512, edges: 2048, sets: 64, byInstance: 500, lines: 12, line: 40, seatFor: 16, titles: 32, title: 24, fixed: 500,
171
+ portraitInstances: 500, portraitUsers: 200, portraitNpcs: 128, slice: 128 };
172
+ /** #2861: a portrait's expressions, by the state it is shown in (a missing one: idle, then any given). */
173
+ export const PORTRAIT_STATES = ["idle", "working", "needs"];
174
+ /** #2861: a person's account as the chat records it (`adapter:id`, web-chat-history.ts FROM). */
175
+ const ACCOUNT = /^[^\s:]{1,64}:[^\s:]{1,128}$/;
166
176
 
167
177
  class Refused extends Error { constructor(at, why) { super(`${at}: ${why}`); } }
168
178
  /** `o[k]` when it is o's own property, else undefined: a name from a pack or a page never reaches Object.prototype. */
@@ -288,6 +298,59 @@ function levelsOf(v) {
288
298
  return out;
289
299
  }
290
300
 
301
+ /** #2861: one portrait — a file, or { idle, working, needs } files (at least one): always the expressions' object. */
302
+ function portraitOf(v, at) {
303
+ if (typeof v === "string") return { idle: src(v, at) };
304
+ obj(v, at); keys(v, PORTRAIT_STATES, at);
305
+ const out = {};
306
+ for (const k of PORTRAIT_STATES) if (v[k] !== undefined) out[k] = src(v[k], `${at}.${k}`);
307
+ if (!Object.keys(out).length) throw new Refused(at, `a file, or at least one of ${PORTRAIT_STATES.join(", ")}`);
308
+ return out;
309
+ }
310
+ /** #2861: a table of portraits by key (`keyOk` says which keys it takes), at most `max`. */
311
+ function portraitTable(v, at, max, keyOk, what) {
312
+ if (v === undefined) return {};
313
+ obj(v, at);
314
+ if (Object.keys(v).length > max) throw new Refused(at, `at most ${max}`);
315
+ const out = {};
316
+ for (const [k, p] of Object.entries(v)) {
317
+ if (inherited(k) || !keyOk(k)) throw new Refused(`${at}.${k}`, what);
318
+ out[k] = portraitOf(p, `${at}.${k}`);
319
+ }
320
+ return out;
321
+ }
322
+ /**
323
+ * #2861: a pack's `portraits` — `default` (agents), `byInstance`, `byUser` (a person's `adapter:id`) and `npc` (a
324
+ * furniture item the pack defines: `fids`); null when it has none.
325
+ */
326
+ function portraitsOf(v, fids) {
327
+ if (v === undefined) return null;
328
+ obj(v, "portraits");
329
+ keys(v, ["default", "byInstance", "byUser", "npc"], "portraits");
330
+ const instanceOk = (k) => !!k && k.length <= 200 && !/[\u0000-\u001f\u007f]/.test(k);
331
+ return {
332
+ ...(v.default !== undefined ? { default: portraitOf(v.default, "portraits.default") } : {}),
333
+ byInstance: portraitTable(v.byInstance, "portraits.byInstance", LIMIT.portraitInstances, instanceOk, "an instance's name"),
334
+ byUser: portraitTable(v.byUser, "portraits.byUser", LIMIT.portraitUsers, (k) => ACCOUNT.test(k), 'an account as "adapter:id"'),
335
+ npc: portraitTable(v.npc, "portraits.npc", LIMIT.portraitNpcs, (k) => fids.has(k), "a furniture item the pack defines"),
336
+ };
337
+ }
338
+ /** #2861: a pack's `dialogBox` — a 9-slice `frame` (`slice` image px a side) and colours; null when it has none. */
339
+ function dialogBoxOf(v) {
340
+ if (v === undefined) return null;
341
+ obj(v, "dialogBox");
342
+ keys(v, ["frame", "slice", "background", "border", "text", "name"], "dialogBox");
343
+ if (v.slice !== undefined && v.frame === undefined) throw new Refused("dialogBox.slice", "only with frame");
344
+ const out = {};
345
+ if (v.frame !== undefined) { out.frame = src(v.frame, "dialogBox.frame"); out.slice = v.slice === undefined ? 8 : int(v.slice, 1, LIMIT.slice, "dialogBox.slice"); }
346
+ for (const k of ["background", "border", "text", "name"]) {
347
+ if (v[k] === undefined) continue;
348
+ if (!matteOk(v[k])) throw new Refused(`dialogBox.${k}`, "a colour as #rrggbb");
349
+ out[k] = v[k].toLowerCase();
350
+ }
351
+ return out;
352
+ }
353
+
291
354
  /**
292
355
  * A pack's manifest, strictly: { ok: true, pack } or { ok: false, error: "<where>: <why>" }. `kept`: a pack the host
293
356
  * keeps already (read back, not uploaded), which may hold a RESERVED id.
@@ -295,7 +358,7 @@ function levelsOf(v) {
295
358
  export function checkSkinPack(x, { kept = false } = {}) {
296
359
  try {
297
360
  obj(x, "pack");
298
- keys(x, ["format", "id", "scale", "background", "foreground", "matte", "areas", "stateZones", "door", "mailDrop", "waypoints", "edges", "straight", "furniture", "characters", "byInstance", "props", "bubbles", "room", "desk", "levels"], "pack");
361
+ keys(x, ["format", "id", "scale", "background", "foreground", "matte", "areas", "stateZones", "door", "mailDrop", "waypoints", "edges", "straight", "furniture", "characters", "byInstance", "props", "bubbles", "room", "desk", "levels", "portraits", "dialogBox"], "pack");
299
362
  if (x.format !== 1) throw new Refused("format", "1");
300
363
  if (typeof x.id !== "string" || !ID.test(x.id)) throw new Refused("id", "1–40 letters, digits, _ or -");
301
364
  if (BUILT_IN.has(x.id) || (!kept && RESERVED.has(x.id))) throw new Refused("id", "a built-in skin's id");
@@ -394,6 +457,7 @@ export function checkSkinPack(x, { kept = false } = {}) {
394
457
  }
395
458
  }
396
459
  const levels = levelsOf(x.levels);
460
+ const portraits = portraitsOf(x.portraits, fids), dialogBox = dialogBoxOf(x.dialogBox);
397
461
  const room = x.room === undefined ? {} : obj(x.room, "room"), desk = x.desk === undefined ? {} : obj(x.desk, "desk");
398
462
  keys(room, ["floor", "wall"], "room"); keys(desk, ["back", "front", "lit"], "desk");
399
463
  const opt = (v, at) => (v === undefined ? undefined : src(v, at));
@@ -404,6 +468,7 @@ export function checkSkinPack(x, { kept = false } = {}) {
404
468
  props: x.props === undefined ? {} : strips(x.props, PROPS, "props", scale), bubbles,
405
469
  room: { floor: opt(room.floor, "room.floor"), wall: opt(room.wall, "room.wall") }, desk: { back: opt(desk.back, "desk.back"), front: opt(desk.front, "desk.front"), lit: opt(desk.lit, "desk.lit") },
406
470
  ...(levels ? { levels } : {}),
471
+ ...(portraits ? { portraits } : {}), ...(dialogBox ? { dialogBox } : {}),
407
472
  } };
408
473
  } catch (err) {
409
474
  if (err instanceof Refused) return { ok: false, error: err.message };
@@ -412,10 +477,17 @@ export function checkSkinPack(x, { kept = false } = {}) {
412
477
  }
413
478
  /** The checked pack, or null. */
414
479
  export const skinPackOk = (x) => { const r = checkSkinPack(x); return r.ok ? r.pack : null; };
415
- /** Every image a pack names (what a loader fetches before spriteSkin draws). */
416
- export const packImages = (pack) => [...new Set([pack.background, pack.foreground, pack.room.floor, pack.room.wall, pack.desk.back, pack.desk.front, pack.desk.lit,
480
+ /** #2861: the pictures only the dialogue box uses — every portrait and the box's frame (loaded when it first needs one). */
481
+ export const packPortraitImages = (pack) => {
482
+ const p = pack.portraits, all = p ? [p.default, ...Object.values(p.byInstance), ...Object.values(p.byUser), ...Object.values(p.npc)] : [];
483
+ return [...new Set([...all.flatMap((e) => (e ? Object.values(e) : [])), pack.dialogBox && pack.dialogBox.frame].filter(Boolean))];
484
+ };
485
+ /** The pictures the scene draws (what a loader fetches before spriteSkin draws). */
486
+ export const packSceneImages = (pack) => [...new Set([pack.background, pack.foreground, pack.room.floor, pack.room.wall, pack.desk.back, pack.desk.front, pack.desk.lit,
417
487
  ...pack.furniture.flatMap((f) => [f.sprite.src, f.activeSprite && f.activeSprite.src, f.night && f.night.sprite.src, ...Object.values(f.walk || {}).map((st) => st.src)]),
418
488
  ...Object.values(pack.characters).flatMap((s) => Object.values(s).map((st) => st.src)), ...Object.values(pack.props).map((st) => st.src)].filter(Boolean))];
489
+ /** Every image a pack names: the scene's and (#2861) the dialogue box's — what an upload must send, and nothing else. */
490
+ export const packImages = (pack) => [...new Set([...packSceneImages(pack), ...packPortraitImages(pack)])];
419
491
 
420
492
  /** Every frame strip a checked pack names, with where (the host checks each image is frames·w × h). */
421
493
  export function packStrips(pack) {
@@ -45,7 +45,7 @@
45
45
  // among them by base y), then the foreground, then the crowd counts, tags and bubbles.
46
46
  import { t } from "/assets/app-i18n.js";
47
47
  import { frameAt, nameHash } from "./fleet-office-model.js";
48
- import { CHAR_DEPTH, LOGICAL, checkSkinPack, own, packImages, poseStrip, stripBox, walkStrip } from "./fleet-office-pack.js";
48
+ import { CHAR_DEPTH, LOGICAL, checkSkinPack, own, packPortraitImages, packSceneImages, poseStrip, stripBox, walkStrip } from "./fleet-office-pack.js";
49
49
  import { tierColours } from "./fleet-office-levels.js";
50
50
 
51
51
  export { nameHash };
@@ -792,13 +792,31 @@ export function loadPackSkin(id, sha, { fetch: get = globalThis.fetch, image = d
792
792
  if (!c.ok || c.pack.id !== id) return null;
793
793
  const files = d.files && typeof d.files === "object" ? d.files : {};
794
794
  const images = new Map();
795
- await Promise.all(packImages(c.pack).map(async (src) => {
796
- const fid = own(files, src);
797
- if (typeof fid !== "string" || !/^[0-9a-f]{32}$/.test(fid)) return;
795
+ const fidOf = (src) => { const fid = own(files, src); return typeof fid === "string" && /^[0-9a-f]{32}$/.test(fid) ? fid : null; };
796
+ await Promise.all(packSceneImages(c.pack).map(async (src) => {
797
+ const fid = fidOf(src);
798
+ if (!fid) return;
798
799
  const im = await image(url(`${base}/img/${fid}.png`));
799
800
  if (im) images.set(src, im);
800
801
  }));
801
- return spriteSkin(c.pack, images);
802
+ // #2861: the dialogue box's pictures (portraits, its frame) are read the first time it asks for one — never by an
803
+ // Office that does not show the box. `picture(src, done)`: the picture, or null (not read yet: `done` is called
804
+ // once it is in; never there: null for good).
805
+ const portraits = new Set(packPortraitImages(c.pack)), late = new Map();
806
+ const picture = (src, done) => {
807
+ if (!src || !portraits.has(src)) return null;
808
+ const had = late.get(src);
809
+ if (had) { if (had.im === undefined && done) had.waiting.add(done); return had.im || null; }
810
+ const fid = fidOf(src), entry = { im: fid ? undefined : null, waiting: new Set(done ? [done] : []) };
811
+ late.set(src, entry);
812
+ if (fid) Promise.resolve(image(url(`${base}/img/${fid}.png`))).catch(() => null).then((im) => {
813
+ entry.im = im || null;
814
+ for (const fn of entry.waiting) { try { fn(); } catch { /* the page's own */ } }
815
+ entry.waiting.clear();
816
+ });
817
+ return null;
818
+ };
819
+ return { ...spriteSkin(c.pack, images), picture };
802
820
  } catch { return null; }
803
821
  })();
804
822
  loaded.set(key, job);
@@ -21,6 +21,8 @@ const CHOICE_KEY = "agend_org_office", FILTER_KEY = "agend_org_office_filter", S
21
21
  const LOBBY_KEY = "agend_org_office_lobby";
22
22
  /** #2946: whether the key to the items in the air is open here (default: folded). */
23
23
  const KEY_OPEN_KEY = "agend_org_office_key";
24
+ /** #2861: whether the dialogue box shows here (default: off — nothing changes until a person ticks it). */
25
+ const DIALOGUE_KEY = "agend_org_office_dialogue";
24
26
  /** #2540: { "<office>@<style>": [k, cx, cy] (and a 1 after them: a fit) } — the last VIEWS_MAX views, the most recent last. */
25
27
  const VIEW_KEY = "agend_org_office_view", VIEWS_MAX = 32;
26
28
  /** #2540: { "<office>@<style>": "cover" } — the offices whose fit fills the panel (the rest: "contain"), the last VIEWS_MAX. */
@@ -200,6 +202,9 @@ export function createOfficeStore({ fetch: get = globalThis.fetch, storage } = {
200
202
  /** #2946: whether the key to the items carried between desks is open here (default: folded). */
201
203
  keyOpen: () => read(KEY_OPEN_KEY) === "1",
202
204
  saveKeyOpen: (v) => write(KEY_OPEN_KEY, v ? "1" : "0"),
205
+ /** #2861: whether the dialogue box shows here (default: off). */
206
+ dialogueOn: () => read(DIALOGUE_KEY) === "1",
207
+ saveDialogueOn: (v) => write(DIALOGUE_KEY, v ? "1" : "0"),
203
208
  saveLobbyTile: (v) => write(LOBBY_KEY, v ? "1" : "0"),
204
209
  /** The view kept for `key` (an office and its style): { k, cx, cy } (fleet-office-view.js savedOf), or null. */
205
210
  view: (key) => {
@@ -59,6 +59,7 @@ import { html, useEffect, useLayoutEffect, useMemo, useRef, useState } from "/as
59
59
  import { appStore } from "/assets/app-store.js";
60
60
  import { t, lang, register } from "/assets/app-i18n.js";
61
61
  import { identityOf } from "/assets/identity-color.js";
62
+ import { avatarOf, firstCharacter } from "/assets/instance-nav.js";
62
63
  import { Icon } from "/assets/ui-icons.js";
63
64
  import { nodeText, stateWords } from "./fleet-org.js";
64
65
  import { hits, needle } from "./fleet-canvas-layout.js";
@@ -73,6 +74,7 @@ import { POLL_MS } from "./fleet-traffic.js";
73
74
  import { OfficeEditor, officeForSave } from "./fleet-office-editor.js";
74
75
  import { LayoutEditor, handlesOf } from "./fleet-office-layout.js";
75
76
  import { ShareButton } from "./office-share-dialog.js";
77
+ import { DLG, boxColours, boxLayout, createDialogue, createFaces, drawBox, fitBox, messageOf, onBox, pickFront, portraitSrc, stageOf, talkOf, wrap } from "./fleet-office-dialogue.js";
76
78
  import { applyOverrides, fitNight, fitSeatFor, stripBox } from "./fleet-office-pack.js";
77
79
  import { ALL_ID, LOBBY_TILE, OV, createCrossFlights, cropToRooms, fromTile, inTile, labelAt, lobbyNodes, overviewOk, tileAt, tileBox, tileLayout, visibleTiles } from "./fleet-office-overview.js";
78
80
  import { centreOn, gestureState, gestures, miniPoint, toScreen, toWorld, wheelFactor, zoomKey, zoomTo } from "./fleet-canvas-view.js";
@@ -99,6 +101,9 @@ register("orgo", {
99
101
  key: "Key", keyTitle: "What the items carried between desks are", keyLabel: "Carried between desks",
100
102
  keyTask: "Folder: a task", keySend: "Envelope: a message", keyReport: "Paper: a report", keyBroadcast: "Horn: a broadcast",
101
103
  tileLabel: "{0} ({1})", openOffice: "Open the office {0}", lobbyTile: "Lobby tile (in no office)", lobbyEveryone: "Everyone is in an office", overviewNoEdit: "Pick one office to edit offices or a layout",
104
+ dialogue: "Dialogue", dialogueTitle: "When a person messages someone here, show their words and the reply in a box at the bottom (this browser only)",
105
+ dlgWorking: "Working…", dlgSomeone: "Someone", dlgHeardShare: "Sent {0} a message.", dlgAnsweredShare: "Replied.", dlgFile: "(sent a file)", dlgSays: "{0}: {1}",
106
+ dlgBox: "Dialogue: {0}. Click for their card, double-click for their chat.",
102
107
  },
103
108
  "zh-TW": {
104
109
  label: "辦公室:每個 team 是一間房間,每個 instance 一張桌子;General 和未加入 team 的 instance 在大廳。拖曳平移;滾輪、雙指、+ 和 − 縮放,0 顯示整個場景,F 切換全螢幕。",
@@ -119,6 +124,9 @@ register("orgo", {
119
124
  key: "圖例", keyTitle: "桌子之間傳遞的物品代表什麼", keyLabel: "桌子之間傳遞的物品",
120
125
  keyTask: "資料夾:任務", keySend: "信封:訊息", keyReport: "紙張:回報", keyBroadcast: "喇叭:廣播",
121
126
  tileLabel: "{0}({1})", openOffice: "開啟辦公室「{0}」", lobbyTile: "大廳格(不在任何辦公室)", lobbyEveryone: "每個成員都已在某間辦公室", overviewNoEdit: "請先選一間辦公室,再編輯辦公室或配置",
127
+ dialogue: "對話框", dialogueTitle: "有人傳訊息給這裡的成員時,在下方的對話框顯示訊息與回覆(只限這個瀏覽器)",
128
+ dlgWorking: "處理中…", dlgSomeone: "有人", dlgHeardShare: "傳了一則訊息給 {0}。", dlgAnsweredShare: "已回覆。", dlgFile: "(傳了一個檔案)", dlgSays: "{0}:{1}",
129
+ dlgBox: "對話框:{0}。點一下看資料卡,點兩下開啟聊天。",
122
130
  },
123
131
  });
124
132
  const to = (k, ...v) => t(`orgo.${k}`, ...v);
@@ -615,9 +623,10 @@ export function OfficeKey({ pal }) {
615
623
  * `lease` the tab's (its reads); `onOpen(name)` what a desk opens (the canvas's: the chat; none: a desk opens nothing,
616
624
  * as on a share link's page, #2636); `assetUrl(path)` where a skin pack's picture is read (the share's address), and
617
625
  * `assetImage(url)` how (the share's, which waits out a 429, #2662; none: the loader's own);
618
- * `opening` the office it opens on (the share's), instead of the one this browser chose last.
626
+ * `opening` the office it opens on (the share's), instead of the one this browser chose last; #2861: `talk` the share's
627
+ * conversations (its /state's: who heard or answered a person, when — never what was said), instead of the stream's.
619
628
  */
620
- export function Office({ view, traffic, q = "", lease, onOpen, assetUrl, assetImage, opening }) {
629
+ export function Office({ view, traffic, q = "", lease, onOpen, assetUrl, assetImage, opening, talk }) {
621
630
  const store = useMemo(() => createOfficeStore(lease ? { fetch: (path, o) => lease.fetch(path, o) } : {}), [lease]);
622
631
  const [stored, setStored] = useState([]);
623
632
  const [storedRev, setStoredRev] = useState(null); // the rev the list was read at (a save sends it)
@@ -636,6 +645,15 @@ export function Office({ view, traffic, q = "", lease, onOpen, assetUrl, assetIm
636
645
  // Bedtime (#2568), when it is on here: the idle sleep from NIGHT.FROM to NIGHT.TO on this device's clock (read every NIGHT.TICK).
637
646
  const [nightOn, setNightOn] = useState(() => store.nightOn());
638
647
  const [keyOpen, setKeyOpen] = useState(() => store.keyOpen());
648
+ // #2861: the dialogue box, when it is on here (off by default: until then nothing below listens or draws). The
649
+ // conversations; the avatars read for it; what it last said for a screen reader. `dlgRef`: what draw() reads (it runs
650
+ // from the loop, outside a render); `dlgShown`: the box as last drawn (its clicks).
651
+ const [dialogueOn, setDialogueOn] = useState(() => store.dialogueOn());
652
+ const dlg = useMemo(createDialogue, []);
653
+ const faces = useMemo(() => createFaces(), []);
654
+ const [dlgSay, setDlgSay] = useState("");
655
+ const [dlgHot, setDlgHot] = useState(false);
656
+ const dlgRef = useRef(null), dlgShown = useRef(null), dlgLines = useRef(new Map()), talkSeen = useRef(new Set());
639
657
  const [nightNow, setNightNow] = useState(() => isNight());
640
658
  useEffect(() => { if (!nightOn) return undefined; setNightNow(isNight()); const h = setInterval(() => setNightNow(isNight()), NIGHT.TICK); return () => clearInterval(h); }, [nightOn]);
641
659
  const night = nightOn && nightNow;
@@ -752,6 +770,68 @@ export function Office({ view, traffic, q = "", lease, onOpen, assetUrl, assetIm
752
770
  const h = lease.interval(() => { if (polled() && !globalThis.document?.hidden) void read(); }, POLL_MS);
753
771
  return () => { for (const off of offs) off(); lease.clear(h); };
754
772
  }, [lease, store]);
773
+ // #2861: the dialogue box's news. On the dashboard: the stream's `message` events (SSE, or the public link's poll) —
774
+ // the same ones the chat gets, so only words this viewer can already read; a person's (role "user") opens a
775
+ // conversation, the agent's reply (role "agent") answers it; a replay or a catch-up is not news (messageOf: FRESH_MS
776
+ // on the server's clock, which the stream's `clock` events give). On a share: its `talk` (no words, no one named).
777
+ const dlgWake = () => {
778
+ const sc = scene.current;
779
+ if (sc) sc.dirty = true;
780
+ if (still) { if (sc && !globalThis.document?.hidden) draw(0); } else loop.current?.wake();
781
+ };
782
+ const sayFor = (instance, words) => {
783
+ const who = dlgRef.current && dlgRef.current.who.get(instance);
784
+ if (who) setDlgSay(to("dlgSays", ...words(who)));
785
+ };
786
+ useEffect(() => {
787
+ if (!dialogueOn || talk !== undefined) return undefined;
788
+ const sub = appStore.get().streamOn;
789
+ if (!sub) return undefined;
790
+ let skew = 0;
791
+ const seen = new Set();
792
+ const take = (m) => {
793
+ const x = messageOf(m, Date.now() + skew);
794
+ if (!x) return;
795
+ const k = `${x.instance}|${x.kind}|${m.ts}|${String(m.text ?? "").slice(0, 80)}`;
796
+ if (seen.has(k)) return;
797
+ seen.add(k);
798
+ if (seen.size > 400) seen.delete(seen.values().next().value);
799
+ const words = x.files ? to("dlgFile") : x.text;
800
+ if (x.kind === "heard") { const c = dlg.heard(x.instance, x.person, words, now()); if (c) sayFor(x.instance, () => [x.person.name || to("dlgSomeone"), c.text]); }
801
+ else { const c = dlg.answered(x.instance, words, now()); if (c) sayFor(x.instance, (who) => [nodeText(who.node).primary, c.reply]); }
802
+ dlgWake();
803
+ };
804
+ const hold = (off) => (lease ? lease.hold(off) : off);
805
+ const offs = [hold(sub("clock", (d) => { if (d && typeof d.now === "number") skew = d.now - Date.now(); })), hold(sub("message", take))];
806
+ return () => { for (const off of offs) if (typeof off === "function") off(); };
807
+ }, [dialogueOn, lease, talk === undefined]);
808
+ useEffect(() => {
809
+ if (!dialogueOn || !talk) return;
810
+ let changed = false;
811
+ for (const x of talkOf(talk)) {
812
+ const k = `${x.instance}|${x.kind}|${x.at}`;
813
+ if (talkSeen.current.has(k)) continue;
814
+ talkSeen.current.add(k);
815
+ if (talkSeen.current.size > 400) talkSeen.current.delete(talkSeen.current.values().next().value);
816
+ const c = x.kind === "heard" ? dlg.heard(x.instance, null, null, now()) : dlg.answered(x.instance, null, now());
817
+ if (!c) continue;
818
+ changed = true;
819
+ sayFor(x.instance, (who) => (x.kind === "heard" ? [to("dlgSomeone"), to("dlgHeardShare", nodeText(who.node).primary)] : [nodeText(who.node).primary, to("dlgAnsweredShare")]));
820
+ }
821
+ if (changed) dlgWake();
822
+ }, [dialogueOn, talk]);
823
+ // What is over goes (an answer after its fade, a conversation never answered); the box is drawn again meanwhile.
824
+ useEffect(() => {
825
+ if (!dialogueOn) return undefined;
826
+ const h = setInterval(() => { if (dlg.sweep(now(), still) || dlg.size()) dlgWake(); }, 1000);
827
+ return () => clearInterval(h);
828
+ }, [dialogueOn]);
829
+ const toggleDialogue = () => {
830
+ const v = !dialogueOn;
831
+ store.saveDialogueOn(v); setDialogueOn(v);
832
+ if (!v) { dlg.clear(); setDlgSay(""); setDlgHot(false); }
833
+ dlgWake();
834
+ };
755
835
  // The skin packs: on opening, and again whenever the stream says one was uploaded or deleted.
756
836
  useEffect(() => {
757
837
  if (!lease) return undefined;
@@ -1200,7 +1280,7 @@ export function Office({ view, traffic, q = "", lease, onOpen, assetUrl, assetIm
1200
1280
  ctx.clearRect(0, 0, BW, BH);
1201
1281
  ctx.fillStyle = s.matte; ctx.fillRect(0, 0, BW, BH);
1202
1282
  ctx.imageSmoothingEnabled = false;
1203
- if (!s.overview) return drawPart(ctx, s.part, a, ox, oy, ms, still, tipNow.current, env);
1283
+ if (!s.overview) { const moved = drawPart(ctx, s.part, a, ox, oy, ms, still, tipNow.current, env); return drawDialogue(ctx, s, ms) || moved; }
1204
1284
  // All offices: each tile on screen drawn as its own view, scaled into it and clipped to it; one off screen is not
1205
1285
  // drawn (its flights still land). Then a frame round each tile, and the items flying between tiles.
1206
1286
  const hot = tipNow.current, on = new Set(visibleTiles(s.lay, v, sizeRef.current).map((tt) => tt.key)), said = [];
@@ -1227,7 +1307,64 @@ export function Office({ view, traffic, q = "", lease, onOpen, assetUrl, assetIm
1227
1307
  if (from) { ctx.setTransform(a * from.tile.s, 0, 0, a * from.tile.s, ox, oy); from.skin.drawProp(ctx, { ...it, x: it.x / from.tile.s, y: it.y / from.tile.s }, ms, env); }
1228
1308
  else { ctx.setTransform(a, 0, 0, a, ox, oy); skinFor("pixel").drawProp(ctx, it, ms, env); }
1229
1309
  }
1230
- return moving || up.length > 0 || cross.size() > 0;
1310
+ return drawDialogue(ctx, s, ms) || moving || up.length > 0 || cross.size() > 0;
1311
+ }
1312
+ /**
1313
+ * #2861: the dialogue box over the scene, in the stage's CSS px — its newest conversation whose agent is drawn here and
1314
+ * awake (pickFront), with their faces (the pack's portraits; else the agent's avatar, else initials), the speaker's
1315
+ * words typed out, the agent's line while it works and "+N". Nothing at all while it is off. Whether it moves.
1316
+ */
1317
+ function drawDialogue(ctx, s, ms) {
1318
+ const d = dlgRef.current;
1319
+ if (!d) { dlgShown.current = null; return false; }
1320
+ const t = ms > 0 ? ms : now();
1321
+ const { front, more } = pickFront(dlg.list(), (n) => d.who.has(n), (n) => d.who.get(n).look?.pose === "paused");
1322
+ if (!front) { dlgShown.current = null; return false; }
1323
+ const who = d.who.get(front.instance), node = who.node, sz = sizeRef.current, L0 = boxLayout(sz.w, sz.h);
1324
+ const stage = stageOf(front, t, node.state === "working", still);
1325
+ if (stage.done) { dlgShown.current = null; return false; }
1326
+ const skinOf = who.skin, pack = skinOf && skinOf.pack;
1327
+ const pic = (src) => (src && skinOf && typeof skinOf.picture === "function" ? skinOf.picture(src, dlgWake) : null);
1328
+ const agentName = nodeText(node).primary;
1329
+ const idColour = (it) => { try { const id = identityOf(it); return id.off ? null : s.env.mode === "light" ? id.light : id.dark; } catch { return null; } };
1330
+ const agentFace = () => {
1331
+ const im = pic(portraitSrc(pack, { agent: front.instance, state: node.state }));
1332
+ if (im) return { kind: "portrait", im };
1333
+ if (!d.share && node.i) {
1334
+ const av = avatarOf(node.i);
1335
+ if (av.src) { const fim = faces(av.src, dlgWake); if (fim) return { kind: "image", im: fim }; }
1336
+ if (av.kind === "emoji" && av.text) return { kind: "emoji", text: av.text };
1337
+ if (av.kind === "initial" && av.text) return { kind: "initial", text: av.text, color: idColour(node.i) };
1338
+ }
1339
+ return { kind: "initial", text: firstCharacter(agentName), color: node.i ? idColour(node.i) : null };
1340
+ };
1341
+ const personFace = () => {
1342
+ if (!front.person) return { kind: "initial", text: "?" };
1343
+ const im = pic(portraitSrc(pack, { account: front.person.account }));
1344
+ return im ? { kind: "portrait", im } : { kind: "initial", text: firstCharacter(front.person.name || to("dlgSomeone")) };
1345
+ };
1346
+ const answered = stage.phase === "answered";
1347
+ const words = answered ? front.reply ?? to("dlgAnsweredShare") : front.person ? front.text ?? "" : to("dlgHeardShare", agentName);
1348
+ ctx.setTransform(s.ratio, 0, 0, s.ratio, 0, 0);
1349
+ ctx.font = `400 ${L0.font}px system-ui, sans-serif`;
1350
+ const lk = `${front.id}|${answered ? 1 : 0}|${L0.text.w}|${L0.font}`;
1351
+ let lines = dlgLines.current.get(lk);
1352
+ if (!lines) {
1353
+ lines = wrap((x) => ctx.measureText(x).width, words, L0.text.w, L0.text.lines);
1354
+ if (dlgLines.current.size > 32) dlgLines.current.clear();
1355
+ dlgLines.current.set(lk, lines);
1356
+ }
1357
+ const act = d.acts && d.acts.get(front.instance);
1358
+ const status = stage.phase === "working" ? (actLive(act, node.state, Date.now(), null) && act.say ? act.say : to("dlgWorking")) : null;
1359
+ const L = fitBox(L0, lines.length, !!status);
1360
+ dlgShown.current = { L, stage, key: who.key, name: front.instance };
1361
+ const frameSrc = pack && pack.dialogBox && pack.dialogBox.frame, frameIm = frameSrc ? pic(frameSrc) : null;
1362
+ return drawBox(ctx, {
1363
+ L, stage, left: personFace(), right: stage.phase === "heard" ? null : agentFace(),
1364
+ name: answered ? agentName : front.person ? front.person.name || to("dlgSomeone") : to("dlgSomeone"),
1365
+ lines, status: status ? `${agentName} · ${status}` : null, more,
1366
+ colours: boxColours(pack && pack.dialogBox, s.env.pal), frame: frameIm ? { im: frameIm, slice: pack.dialogBox.slice || 8, k: pack.scale || 2 } : null,
1367
+ }, t, { ...s.env, still });
1231
1368
  }
1232
1369
  // The loop: drawing only when the frame (FPS) changed or something is in the air; stopped while the tab is hidden,
1233
1370
  // gone with the view. Office review: while something walks or flies, one requestAnimationFrame per display frame (the
@@ -1281,6 +1418,12 @@ export function Office({ view, traffic, q = "", lease, onOpen, assetUrl, assetIm
1281
1418
  area: tl.zones ? areaName(d.area) : roomOf(tl.L, d), skin: tl.skin, look: lk && lk.get(d.key) })) : []; })
1282
1419
  : desksOf(L).map((d) => ({ key: d.key, node: d.node, box: d, office: null, dot: zones ? d.seat : { x: d.x + d.w / 2, y: d.y + d.h / 2 },
1283
1420
  area: zones ? areaName(d.area) : roomOf(L, d), skin, look: looks.get(d.key) }));
1421
+ // #2861: who the dialogue box may speak for — everyone drawn here (All offices: the first tile they are in), with what
1422
+ // draws them; null while it is off (draw() then draws nothing of it).
1423
+ dlgRef.current = dialogueOn ? {
1424
+ who: new Map(people.filter((d) => d.node && d.node.name).reverse().map((d) => [d.node.name, { key: d.key, node: d.node, look: d.look, skin: d.skin || skin }])),
1425
+ acts: actsHere, share: talk !== undefined,
1426
+ } : null;
1284
1427
  // Preact owns the markup, not the view: put it back on the overview, the overlay and the tooltip after every render.
1285
1428
  const tipDesk = tip ? people.find((d) => d.key === tip) || null : null;
1286
1429
  tipDeskRef.current = tipDesk ? tipDesk.box : null;
@@ -1342,10 +1485,30 @@ export function Office({ view, traffic, q = "", lease, onOpen, assetUrl, assetIm
1342
1485
  const d = key ? people.find((x) => x.key === key) : null;
1343
1486
  if (d) show(d.box);
1344
1487
  };
1345
- const onMove = (e) => { if (e.pointerType === "touch" || g.busy()) return; const d = deskOf(e); const key = d ? d.key : null; if (key !== tip) setTip(key); };
1488
+ /** #2861: the dialogue box under a pointer event ({ key, name }: its agent), or null. */
1489
+ const dlgAt = (e) => {
1490
+ const b = dlgShown.current, r = canvasRef.current ? canvasRef.current.getBoundingClientRect() : null;
1491
+ return b && r && onBox(b.L, b.stage, e.clientX - r.left, e.clientY - r.top) ? b : null;
1492
+ };
1493
+ const onMove = (e) => {
1494
+ if (e.pointerType === "touch" || g.busy()) return;
1495
+ const onDlg = !!dlgAt(e);
1496
+ if (onDlg !== dlgHot) setDlgHot(onDlg);
1497
+ const d = onDlg ? null : deskOf(e); const key = d ? d.key : null; if (key !== tip) setTip(key);
1498
+ };
1499
+ /** #2861: the box clicked is its agent clicked — their card, and the view brought to them. */
1500
+ const focusPerson = (key) => {
1501
+ const d = people.find((x) => x.key === key);
1502
+ if (!d) return;
1503
+ cardFrom.current = null; setTip(null); setCard(key);
1504
+ const w = zones && !overview ? walkers.at(d.node.name, now()) : null;
1505
+ show(w ? { x: w.x - 24, y: w.y - 64, w: 48, h: 64 } : d.box);
1506
+ };
1346
1507
  // #2661: a click (or a tap) on a person opens their card; on the same person again, or off everyone, closes it; on
1347
1508
  // someone else, switches to theirs. A double-click skips the card and opens the chat.
1348
1509
  const onClick = (e) => {
1510
+ const box = dlgAt(e);
1511
+ if (box) { focusPerson(box.key); return; }
1349
1512
  const d = deskOf(e);
1350
1513
  if (!d || !d.node.i) { setTip(null); setCard(null); return; }
1351
1514
  if (lastType.current === "touch") setTip(null);
@@ -1354,6 +1517,8 @@ export function Office({ view, traffic, q = "", lease, onOpen, assetUrl, assetIm
1354
1517
  };
1355
1518
  // All offices: a double-click on a tile (off its people) opens that office; the lobby is no office.
1356
1519
  const onDblClick = (e) => {
1520
+ const box = dlgAt(e);
1521
+ if (box) { setCard(null); open(box.name); return; }
1357
1522
  const s = scene.current, w = pointOf(e), hit = deskOf(e);
1358
1523
  if (hit && hit.node.i) { setCard(null); open(hit.node.name); return; } // #2661: a person's chat, past the card
1359
1524
  if (!overview || !s || !s.overview || !w || hit) return;
@@ -1479,6 +1644,7 @@ export function Office({ view, traffic, q = "", lease, onOpen, assetUrl, assetIm
1479
1644
  <${People} nodes=${everyone} pinned=${f.pinned} onChange=${(pinned) => setF({ ...f, pinned })} />` : null}
1480
1645
  <label class="check oo-hide-asleep"><input type="checkbox" checked=${hideAsleep} onChange=${() => { const v = !hideAsleep; store.saveHideAsleep(v); setHideAsleep(v); setTip(null); }} /><span>${to("hideAsleep")}</span></label>
1481
1646
  ${zones || overview ? html`<label class="check oo-night"><input type="checkbox" checked=${nightOn} onChange=${() => { const v = !nightOn; store.saveNightOn(v); setNightOn(v); }} /><span>${to("nightOn")}</span></label>` : null}
1647
+ <label class="check oo-dialogue" title=${to("dialogueTitle")}><input type="checkbox" checked=${dialogueOn} onChange=${toggleDialogue} /><span>${to("dialogue")}</span></label>
1482
1648
  ${overview ? html`<label class="check oo-lobby-tile" title=${lobbyAll.length ? undefined : to("lobbyEveryone")}><input type="checkbox" checked=${lobbyOn && lobbyAll.length > 0}
1483
1649
  disabled=${!lobbyAll.length} onChange=${() => { const v = !lobbyOn; store.saveLobbyTile(v); setLobbyOn(v); setTip(null); }} /><span>${to("lobbyTile")}</span></label>
1484
1650
  ${lobbyAll.length ? null : html`<span class="muted oo-note oo-lobby-none">${to("lobbyEveryone")}</span>`}` : null}
@@ -1500,7 +1666,8 @@ export function Office({ view, traffic, q = "", lease, onOpen, assetUrl, assetIm
1500
1666
  ${overview || people.length || L.rooms.length ? null : html`<p class="note oo-empty">${to("nobody")} ${auto && (f.team || f.pinned.length) ? html`<button type="button" class="btn btn-sm" onClick=${() => setF({ team: "", pinned: [] })}>${to("everyone")}</button>` : null}</p>`}
1501
1667
  <div class=${`oo-stage${layout ? " editing" : ""}`} ref=${stageRef} onPointerDown=${onDown} onPointerMove=${g.move} onPointerUp=${g.up} onPointerCancel=${g.up}
1502
1668
  onWheel=${onWheel} onKeyDown=${onKeyDown} onFocusIn=${onFocusIn} onClickCapture=${g.clickCapture}>
1503
- <canvas ref=${canvasRef} class=${`oo-canvas${tipDesk && tipDesk.node.i ? " hot" : ""}`} role="application" tabindex="0" aria-label=${to(overview ? "labelAll" : "label")}
1669
+ ${dialogueOn ? html`<div class="sr-only oo-dialogue-live" aria-live="polite">${dlgSay}</div>` : null}
1670
+ <canvas ref=${canvasRef} class=${`oo-canvas${(tipDesk && tipDesk.node.i) || dlgHot ? " hot" : ""}`} role="application" tabindex="0" aria-label=${to(overview ? "labelAll" : "label")}
1504
1671
  onPointerMove=${onMove} onPointerLeave=${() => setTip(null)} onClick=${onClick} ondblclick=${onDblClick}></canvas>
1505
1672
  ${overview ? tiles.map((tl) => {
1506
1673
  const text = to("tileLabel", tl.name, tl.count), at = (el) => { if (el) labelEls.current.set(tl.key, el); else labelEls.current.delete(tl.key); };
@@ -8,7 +8,8 @@ import { appStore, useStore } from "/assets/app-store.js";
8
8
  import { Dialog } from "/assets/ui-dialog.js";
9
9
  import { Icon } from "/assets/ui-icons.js";
10
10
  import { toast } from "/assets/ui-toast.js";
11
- import { StatusPill, Who, answerBlocked, askText, boardApi, currentWork, errorText, followsSubs, moveCard, notesForPeople, relTime, wrapUpText } from "./fleet-task-common.js";
11
+ import { AssigneeOption, StatusPill, Who, answerBlocked, askText, boardApi, currentWork, errorText, followsSubs, moveCard, notesForPeople, relTime, wrapUpText } from "./fleet-task-common.js";
12
+ import { StepButtons } from "./fleet-task-menu.js";
12
13
 
13
14
  register("taskcard", {
14
15
  en: {
@@ -83,9 +84,10 @@ const fieldName = (k) => { const key = `taskcard.f${k[0].toUpperCase()}${k.slice
83
84
 
84
85
  /**
85
86
  * `writable`: false over the public link (the card is shown, nothing on it changes). `place`: up and down in its column,
86
- * for touch and keyboard (null when it cannot move).
87
+ * for touch and keyboard (null when it cannot move). `steps`: the previous and next card the page showed, and where
88
+ * this one is among them (null: nowhere to step).
87
89
  */
88
- export function CardDialog({ id, tick, projects, writable = true, place = null, onClose, onOpen, reloadBoard }) {
90
+ export function CardDialog({ id, tick, projects, boardOff = [], writable = true, place = null, steps = null, onClose, onOpen, reloadBoard }) {
89
91
  const { instances } = useStore(appStore);
90
92
  const [detail, setDetail] = useState(null);
91
93
  const [missing, setMissing] = useState(false);
@@ -131,8 +133,10 @@ export function CardDialog({ id, tick, projects, writable = true, place = null,
131
133
  finally { moving.current = false; setBusy(false); }
132
134
  }
133
135
 
136
+ // Previous / Next: the page's cards (fleet-task-menu.js), in the header from the first frame (no jump once it loads).
137
+ const tools = steps ? html`<${StepButtons} steps=${steps} onOpen=${onOpen} />` : null;
134
138
  if (missing || !detail) {
135
- return html`<${Dialog} title=${id} onClose=${onClose} wide drawer><p class="muted">${missing ? t("taskcard.missing", id) : t("taskcard.loading")}</p></${Dialog}>`;
139
+ return html`<${Dialog} title=${id} onClose=${onClose} wide drawer tools=${tools}><p class="muted">${missing ? t("taskcard.missing", id) : t("taskcard.loading")}</p></${Dialog}>`;
136
140
  }
137
141
 
138
142
  const { card, parent, children } = detail;
@@ -166,7 +170,7 @@ export function CardDialog({ id, tick, projects, writable = true, place = null,
166
170
  } catch { /* no clipboard */ }
167
171
  }
168
172
 
169
- return html`<${Dialog} title=${`${card.id} · ${t(`tasks.${card.kind}`)}`} onClose=${onClose} wide drawer label=${`${card.id} ${card.title}`}>
173
+ return html`<${Dialog} title=${`${card.id} · ${t(`tasks.${card.kind}`)}`} onClose=${onClose} wide drawer label=${`${card.id} ${card.title}`} tools=${tools}>
170
174
  <div class="tc">
171
175
  <div class="tc-head">
172
176
  ${writable ? html`<${InlineTitle} value=${card.title} version=${card.version} onSave=${(title, base) => save({ title }, base)} />` : html`<h3 class="tc-title">${card.title}</h3>`}
@@ -199,7 +203,7 @@ export function CardDialog({ id, tick, projects, writable = true, place = null,
199
203
  ${writable ? html`<select class="tb-select" value="\u0000pick" aria-label=${t("taskcard.assignee")} onChange=${(e) => { const v = e.target.value; e.target.value = "\u0000pick"; void chooseAssignee(v); }}>
200
204
  <option value="\u0000pick" disabled hidden>${t("taskcard.change")}</option>
201
205
  ${card.assignee ? html`<option value="\u0000none">${t("taskcard.unassign")}</option>` : null}
202
- ${names.filter((n) => n !== card.assignee).map((n) => html`<option key=${n} value=${n}>${n}</option>`)}
206
+ ${names.filter((n) => n !== card.assignee).map((n) => html`<${AssigneeOption} key=${n} name=${n} boardOff=${boardOff} />`)}
203
207
  <option value="\u0000other">${t("taskcard.other")}</option>
204
208
  </select>` : null}</dd>
205
209
  ${isMain && children.length ? html`<dt>${t("taskcard.now")}</dt><dd>${(() => {
@@ -23,7 +23,7 @@ register("tasks", {
23
23
  mainCount: "{0} main tasks", mainOne: "1 main task", waiting: "{0} waiting for you", blockedN: "{0} blocked", lastActivity: "Last change {0}",
24
24
  percentTitle: "Done: finished sub tasks out of all of them; a main task without sub tasks counts once you confirm it",
25
25
  allProjects: "All projects", back: "Projects",
26
- everyone: "Everyone", nobody: "Unassigned", filterLabel: "Filter by assignee",
26
+ nobody: "Unassigned",
27
27
  recent: "Last 7 days", all: "All", toggleDone: "Show the last 7 days / everything",
28
28
  emptyBoard: "No main tasks here yet", emptyFiltered: "No main tasks match the filter",
29
29
  emptyBoardHint: "A main task is an outcome you want. Assign it to an instance: it does a small one directly and splits a big one into sub tasks.",
@@ -42,6 +42,7 @@ register("tasks", {
42
42
  definitionHint: "One per line: conditions anyone can check", acceptanceHint: "One per line",
43
43
  context: "Context", contextHint: "Paths, related cards, decisions already made (pointers only)",
44
44
  assignee: "Assignee", assigneeHint: "Which instance", project: "Project", size: "Size", priority: "Priority",
45
+ boardOff: "{0} (task board off)", boardOffHint: "Instances with the task board switched off cannot be handed cards: they have no task tool to read them with.",
45
46
  reviewBox: "Stop at review for my confirmation", created: "Opened {0}", titleRequired: "A title is required",
46
47
  search: "Search cards", searchHint: "Search titles, fields, checklists and comments", searchEmpty: "No cards match", inField: "in {0}",
47
48
  fieldgoal: "goal", fieldscope: "scope", fieldcontext: "context", fieldstate: "state", fieldresult: "result", fieldblockedReason: "blocked reason",
@@ -71,6 +72,7 @@ register("tasks", {
71
72
  "err.dep_own_main": "A sub task cannot depend on its own main task {0}", "err.dep_own_sub": "A main task cannot depend on its own sub task {0}",
72
73
  "err.dep_cycle": "These dependencies would wait on each other forever: {0}", "err.conflict": "{0} was changed meanwhile (last by {1})",
73
74
  "err.signed_in_only": "The task board takes changes from a signed-in dashboard", "err.unavailable": "The task board is not available right now", "err.not_over_public_link": "The public link can only read the board",
75
+ "err.assignee_board_off": "{0} has the task board switched off: it cannot read or move cards. Switch it on for {0} (Settings → the agent → Dashboard access), or hand it the work in the chat",
74
76
  "note.review_waiting": "{0} “{1}”: every sub task is done — it waits for your confirmation",
75
77
  "note.back_to": "{0} has unfinished sub tasks again: it is back to {1}", "note.deps_done": "{0}'s dependencies are all done: it can start",
76
78
  "note.deps_unmet": "Note: {0} not done yet",
@@ -96,7 +98,7 @@ register("tasks", {
96
98
  mainCount: "{0} 個主任務", mainOne: "1 個主任務", waiting: "等你確認 {0}", blockedN: "卡住 {0}", lastActivity: "最後動態 {0}",
97
99
  percentTitle: "完成度:已完成的子任務佔全部的比例;沒有子任務的主任務算一份,你確認後才算完成",
98
100
  allProjects: "所有專案", back: "專案",
99
- everyone: "全部負責人", nobody: "沒人負責", filterLabel: "依負責人篩選",
101
+ nobody: "沒人負責",
100
102
  recent: "近 7 天", all: "全部", toggleDone: "切換:只看近 7 天/全部",
101
103
  emptyBoard: "這個專案還沒有主任務", emptyFiltered: "沒有符合篩選的主任務",
102
104
  emptyBoardHint: "主任務是你要的成果,可大可小。指派給 instance,它會自己決定直接做,或先拆成子任務。",
@@ -115,6 +117,7 @@ register("tasks", {
115
117
  definitionHint: "一行一項:能客觀判斷是否達成的條件", acceptanceHint: "一行一項",
116
118
  context: "背景", contextHint: "檔案路徑、相關卡號、已經做的決定(只放指引)",
117
119
  assignee: "負責人", assigneeHint: "交給哪個 instance", project: "專案", size: "大小", priority: "優先度",
120
+ boardOff: "{0}(看板已關閉)", boardOffHint: "關閉任務看板的 instance 不能被派卡:它沒有 task 工具,讀不到卡片。",
118
121
  reviewBox: "做完要停在待確認,等我確認", created: "已開 {0}", titleRequired: "標題必填",
119
122
  search: "搜尋卡片", searchHint: "搜尋標題、各欄位、驗收條件和留言", searchEmpty: "沒有符合的卡片", inField: "在{0}",
120
123
  fieldgoal: "目標", fieldscope: "範圍", fieldcontext: "背景", fieldstate: "目前狀態", fieldresult: "產出", fieldblockedReason: "卡住原因",
@@ -144,6 +147,7 @@ register("tasks", {
144
147
  "err.dep_own_main": "子任務不能相依自己的主任務 {0}", "err.dep_own_sub": "主任務不能相依自己的子任務 {0}",
145
148
  "err.dep_cycle": "相依會形成循環,大家會互相等待:{0}", "err.conflict": "{0} 已經被改過(最後由 {1} 修改)",
146
149
  "err.signed_in_only": "看板只接受已登入網頁的修改", "err.unavailable": "看板目前無法使用", "err.not_over_public_link": "公開連結只能看看板,不能修改",
150
+ "err.assignee_board_off": "{0} 關閉了任務看板,讀不到也動不了卡片。請先替 {0} 開啟(Settings → 該 agent → Dashboard access),或改在聊天中交辦",
147
151
  "note.review_waiting": "{0}「{1}」的子任務都完成了,等你確認",
148
152
  "note.back_to": "{0} 又有沒完成的子任務,已回到{1}", "note.deps_done": "{0} 的相依都完成了,可以開始",
149
153
  "note.deps_unmet": "提醒:{0} 還沒完成",
@@ -322,6 +326,12 @@ function word(key, arg, i) {
322
326
  return arg;
323
327
  }
324
328
 
329
+ /** An assignee picker's choice: an instance with the task board switched off is shown, greyed out — the board refuses it. */
330
+ export function AssigneeOption({ name, boardOff = [] }) {
331
+ const off = boardOff.includes(name);
332
+ return html`<option value=${name} disabled=${off} title=${off ? t("tasks.boardOffHint") : undefined}>${off ? t("tasks.boardOff", name) : name}</option>`;
333
+ }
334
+
325
335
  /** A refusal in the page's language when the board named it (tasks.err.<key>), else the board's own sentence. */
326
336
  export function errorText(err) {
327
337
  if (err && err.key) {