@songsid/agend 2.3.5-alpha.4 → 2.3.5-beta.1

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 (670) hide show
  1. package/README.md +0 -2
  2. package/README.zh-TW.md +0 -2
  3. package/THIRD_PARTY_NOTICES.md +12 -28
  4. package/dist/agent-cli-instructions.md +1 -1
  5. package/dist/agent-credentials.d.ts +24 -0
  6. package/dist/agent-credentials.js +66 -0
  7. package/dist/agent-credentials.js.map +1 -0
  8. package/dist/agent-endpoint.d.ts +4 -6
  9. package/dist/agent-endpoint.js +15 -12
  10. package/dist/agent-endpoint.js.map +1 -1
  11. package/dist/auth-api.d.ts +0 -21
  12. package/dist/auth-api.js +8 -93
  13. package/dist/auth-api.js.map +1 -1
  14. package/dist/authority/session-authorizations.d.ts +30 -4
  15. package/dist/authority/session-authorizations.js +69 -17
  16. package/dist/authority/session-authorizations.js.map +1 -1
  17. package/dist/authority/web-authority.d.ts +2 -12
  18. package/dist/authority/web-authority.js +4 -25
  19. package/dist/authority/web-authority.js.map +1 -1
  20. package/dist/backend/antigravity.js +3 -1
  21. package/dist/backend/antigravity.js.map +1 -1
  22. package/dist/backend/claude-code.d.ts +12 -15
  23. package/dist/backend/claude-code.js +133 -152
  24. package/dist/backend/claude-code.js.map +1 -1
  25. package/dist/backend/codex-metadata.d.ts +14 -0
  26. package/dist/backend/codex-metadata.js +45 -0
  27. package/dist/backend/codex-metadata.js.map +1 -1
  28. package/dist/backend/codex-package.d.ts +2 -5
  29. package/dist/backend/codex-package.js +5 -1
  30. package/dist/backend/codex-package.js.map +1 -1
  31. package/dist/backend/codex-quota-history.d.ts +7 -0
  32. package/dist/backend/codex-quota-history.js +72 -0
  33. package/dist/backend/codex-quota-history.js.map +1 -0
  34. package/dist/backend/codex-session-lookup.d.ts +6 -0
  35. package/dist/backend/codex-session-lookup.js +1 -1
  36. package/dist/backend/codex-session-lookup.js.map +1 -1
  37. package/dist/backend/codex-speed.d.ts +14 -0
  38. package/dist/backend/codex-speed.js +35 -0
  39. package/dist/backend/codex-speed.js.map +1 -0
  40. package/dist/backend/codex.d.ts +116 -136
  41. package/dist/backend/codex.js +912 -942
  42. package/dist/backend/codex.js.map +1 -1
  43. package/dist/backend/grok-weekly-reset.d.ts +24 -0
  44. package/dist/backend/grok-weekly-reset.js +95 -0
  45. package/dist/backend/grok-weekly-reset.js.map +1 -0
  46. package/dist/backend/grok.d.ts +30 -3
  47. package/dist/backend/grok.js +301 -76
  48. package/dist/backend/grok.js.map +1 -1
  49. package/dist/backend/kiro.d.ts +3 -0
  50. package/dist/backend/kiro.js +50 -2
  51. package/dist/backend/kiro.js.map +1 -1
  52. package/dist/backend/muse.js +5 -3
  53. package/dist/backend/muse.js.map +1 -1
  54. package/dist/backend/types.d.ts +15 -8
  55. package/dist/backend/types.js +3 -0
  56. package/dist/backend/types.js.map +1 -1
  57. package/dist/bundled-tmux-guard.d.ts +21 -0
  58. package/dist/bundled-tmux-guard.js +96 -0
  59. package/dist/bundled-tmux-guard.js.map +1 -0
  60. package/dist/cache-ledger.d.ts +95 -0
  61. package/dist/cache-ledger.js +276 -4
  62. package/dist/cache-ledger.js.map +1 -1
  63. package/dist/cache-service.d.ts +5 -0
  64. package/dist/cache-service.js +16 -4
  65. package/dist/cache-service.js.map +1 -1
  66. package/dist/channel/adapters/discord.js +11 -3
  67. package/dist/channel/adapters/discord.js.map +1 -1
  68. package/dist/channel/adapters/telegram.d.ts +51 -0
  69. package/dist/channel/adapters/telegram.js +235 -17
  70. package/dist/channel/adapters/telegram.js.map +1 -1
  71. package/dist/channel/ipc-bridge.d.ts +0 -2
  72. package/dist/channel/mcp-tools.js +3 -3
  73. package/dist/channel/mcp-tools.js.map +1 -1
  74. package/dist/channel/types.d.ts +2 -0
  75. package/dist/classic-channel-manager.d.ts +2 -0
  76. package/dist/classic-channel-manager.js +5 -1
  77. package/dist/classic-channel-manager.js.map +1 -1
  78. package/dist/cli.js +14 -10
  79. package/dist/cli.js.map +1 -1
  80. package/dist/config-validator.js +30 -71
  81. package/dist/config-validator.js.map +1 -1
  82. package/dist/config.js +3 -17
  83. package/dist/config.js.map +1 -1
  84. package/dist/cross-instance-notice.d.ts +10 -0
  85. package/dist/cross-instance-notice.js +67 -5
  86. package/dist/cross-instance-notice.js.map +1 -1
  87. package/dist/daemon.d.ts +70 -68
  88. package/dist/daemon.js +774 -846
  89. package/dist/daemon.js.map +1 -1
  90. package/dist/dashboard-permissions.d.ts +8 -0
  91. package/dist/dashboard-permissions.js +16 -0
  92. package/dist/dashboard-permissions.js.map +1 -1
  93. package/dist/delivery-consumed-watch.d.ts +26 -16
  94. package/dist/delivery-consumed-watch.js +31 -26
  95. package/dist/delivery-consumed-watch.js.map +1 -1
  96. package/dist/delivery-outbox.d.ts +0 -5
  97. package/dist/delivery-outbox.js +4 -32
  98. package/dist/delivery-outbox.js.map +1 -1
  99. package/dist/delivery-reconciliation.d.ts +42 -2
  100. package/dist/delivery-reconciliation.js +164 -2
  101. package/dist/delivery-reconciliation.js.map +1 -1
  102. package/dist/export-import.d.ts +7 -0
  103. package/dist/export-import.js +44 -10
  104. package/dist/export-import.js.map +1 -1
  105. package/dist/fleet-context.d.ts +4 -2
  106. package/dist/fleet-level-config.d.ts +1 -1
  107. package/dist/fleet-level-config.js +0 -2
  108. package/dist/fleet-level-config.js.map +1 -1
  109. package/dist/fleet-manager.d.ts +108 -245
  110. package/dist/fleet-manager.js +656 -2028
  111. package/dist/fleet-manager.js.map +1 -1
  112. package/dist/general-instance.d.ts +0 -7
  113. package/dist/general-instance.js +3 -20
  114. package/dist/general-instance.js.map +1 -1
  115. package/dist/general-knowledge/skills/concepts/SKILL.md +393 -0
  116. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +1 -0
  117. package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -1
  118. package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +41 -4
  119. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +9 -3
  120. package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
  121. package/dist/instance-config-impact.js +6 -7
  122. package/dist/instance-config-impact.js.map +1 -1
  123. package/dist/instance-lifecycle.d.ts +19 -23
  124. package/dist/instance-lifecycle.js +216 -383
  125. package/dist/instance-lifecycle.js.map +1 -1
  126. package/dist/instance-topic-delete.d.ts +77 -0
  127. package/dist/instance-topic-delete.js +123 -0
  128. package/dist/instance-topic-delete.js.map +1 -0
  129. package/dist/instructions.d.ts +1 -3
  130. package/dist/instructions.js +1 -7
  131. package/dist/instructions.js.map +1 -1
  132. package/dist/kiro-engine-status.d.ts +11 -0
  133. package/dist/kiro-engine-status.js +6 -0
  134. package/dist/kiro-engine-status.js.map +1 -1
  135. package/dist/locale.js +63 -86
  136. package/dist/locale.js.map +1 -1
  137. package/dist/log-service.d.ts +28 -0
  138. package/dist/log-service.js +29 -0
  139. package/dist/log-service.js.map +1 -1
  140. package/dist/log-steps.d.ts +4 -3
  141. package/dist/log-steps.js +32 -7
  142. package/dist/log-steps.js.map +1 -1
  143. package/dist/logger.d.ts +16 -2
  144. package/dist/logger.js +346 -66
  145. package/dist/logger.js.map +1 -1
  146. package/dist/login-flows.d.ts +7 -0
  147. package/dist/login-flows.js +5 -2
  148. package/dist/login-flows.js.map +1 -1
  149. package/dist/login-manager.js +25 -4
  150. package/dist/login-manager.js.map +1 -1
  151. package/dist/missed-offline.d.ts +25 -0
  152. package/dist/missed-offline.js +79 -0
  153. package/dist/missed-offline.js.map +1 -0
  154. package/dist/muse-usage-relay.d.ts +2 -0
  155. package/dist/muse-usage-relay.js +5 -3
  156. package/dist/muse-usage-relay.js.map +1 -1
  157. package/dist/needs-you-hub.d.ts +6 -3
  158. package/dist/needs-you-hub.js +31 -9
  159. package/dist/needs-you-hub.js.map +1 -1
  160. package/dist/needs-you.d.ts +20 -18
  161. package/dist/needs-you.js +18 -14
  162. package/dist/needs-you.js.map +1 -1
  163. package/dist/office-share-page.js +1 -1
  164. package/dist/office-share-page.js.map +1 -1
  165. package/dist/outbound-handlers.d.ts +2 -16
  166. package/dist/outbound-handlers.js +10 -72
  167. package/dist/outbound-handlers.js.map +1 -1
  168. package/dist/outbound-schemas.d.ts +0 -38
  169. package/dist/outbound-schemas.js +5 -14
  170. package/dist/outbound-schemas.js.map +1 -1
  171. package/dist/pane-quota-history.d.ts +7 -0
  172. package/dist/pane-quota-history.js +47 -0
  173. package/dist/pane-quota-history.js.map +1 -0
  174. package/dist/platform-general.d.ts +46 -0
  175. package/dist/platform-general.js +91 -0
  176. package/dist/platform-general.js.map +1 -0
  177. package/dist/public-web-gateway.js +0 -9
  178. package/dist/public-web-gateway.js.map +1 -1
  179. package/dist/public-web-link.d.ts +0 -11
  180. package/dist/public-web-link.js +0 -13
  181. package/dist/public-web-link.js.map +1 -1
  182. package/dist/queued-handoffs.d.ts +33 -0
  183. package/dist/queued-handoffs.js +75 -0
  184. package/dist/queued-handoffs.js.map +1 -0
  185. package/dist/quickstart-api.js +5 -9
  186. package/dist/quickstart-api.js.map +1 -1
  187. package/dist/quickstart.d.ts +8 -1
  188. package/dist/quickstart.js +42 -4
  189. package/dist/quickstart.js.map +1 -1
  190. package/dist/quota-notice-config.d.ts +22 -0
  191. package/dist/quota-notice-config.js +41 -0
  192. package/dist/quota-notice-config.js.map +1 -0
  193. package/dist/quota-notice.d.ts +7 -0
  194. package/dist/quota-notice.js +40 -0
  195. package/dist/quota-notice.js.map +1 -1
  196. package/dist/reply-buttons-controller.js +10 -6
  197. package/dist/reply-buttons-controller.js.map +1 -1
  198. package/dist/reply-polls.d.ts +2 -2
  199. package/dist/reply-polls.js +3 -3
  200. package/dist/reply-polls.js.map +1 -1
  201. package/dist/scheduler/db.d.ts +2 -1
  202. package/dist/scheduler/db.js +23 -9
  203. package/dist/scheduler/db.js.map +1 -1
  204. package/dist/scheduler/task-board.d.ts +9 -0
  205. package/dist/scheduler/task-board.js +19 -0
  206. package/dist/scheduler/task-board.js.map +1 -1
  207. package/dist/settings-api.d.ts +13 -5
  208. package/dist/settings-api.js +26 -96
  209. package/dist/settings-api.js.map +1 -1
  210. package/dist/settings-baseline.d.ts +0 -1
  211. package/dist/settings-baseline.js +1 -1
  212. package/dist/settings-baseline.js.map +1 -1
  213. package/dist/settings-change.js +23 -28
  214. package/dist/settings-change.js.map +1 -1
  215. package/dist/settings-confirmation.d.ts +1 -16
  216. package/dist/settings-confirmation.js +9 -47
  217. package/dist/settings-confirmation.js.map +1 -1
  218. package/dist/settings-effect.d.ts +0 -4
  219. package/dist/settings-effect.js +1 -58
  220. package/dist/settings-effect.js.map +1 -1
  221. package/dist/settings-http-confirmation.d.ts +0 -4
  222. package/dist/settings-http-confirmation.js +3 -31
  223. package/dist/settings-http-confirmation.js.map +1 -1
  224. package/dist/settings-instance-patch.js +28 -1
  225. package/dist/settings-instance-patch.js.map +1 -1
  226. package/dist/settings-request-capability.d.ts +0 -2
  227. package/dist/settings-request-capability.js +0 -4
  228. package/dist/settings-request-capability.js.map +1 -1
  229. package/dist/settings-transaction.d.ts +0 -4
  230. package/dist/settings-transaction.js +0 -9
  231. package/dist/settings-transaction.js.map +1 -1
  232. package/dist/setup-form.js +3 -6
  233. package/dist/setup-form.js.map +1 -1
  234. package/dist/setup-i18n.js +0 -3
  235. package/dist/setup-i18n.js.map +1 -1
  236. package/dist/task-board-tool.d.ts +11 -0
  237. package/dist/task-board-tool.js +44 -0
  238. package/dist/task-board-tool.js.map +1 -1
  239. package/dist/task-board-waker.d.ts +6 -0
  240. package/dist/task-board-waker.js +4 -0
  241. package/dist/task-board-waker.js.map +1 -1
  242. package/dist/tmux-control.d.ts +1 -2
  243. package/dist/tmux-control.js.map +1 -1
  244. package/dist/tmux-manager.d.ts +1 -2
  245. package/dist/tmux-manager.js.map +1 -1
  246. package/dist/tool-permissions.d.ts +5 -2
  247. package/dist/tool-permissions.js +7 -7
  248. package/dist/tool-permissions.js.map +1 -1
  249. package/dist/tool-progress.d.ts +2 -0
  250. package/dist/tool-progress.js +19 -3
  251. package/dist/tool-progress.js.map +1 -1
  252. package/dist/topic-commands.js +4 -3
  253. package/dist/topic-commands.js.map +1 -1
  254. package/dist/transcript-delta-reader.d.ts +1 -1
  255. package/dist/transcript-delta-reader.js +1 -1
  256. package/dist/transcript-delta-reader.js.map +1 -1
  257. package/dist/transcript-monitor.d.ts +20 -3
  258. package/dist/transcript-monitor.js +92 -24
  259. package/dist/transcript-monitor.js.map +1 -1
  260. package/dist/transcript-sources.d.ts +0 -5
  261. package/dist/transcript-sources.js +79 -8
  262. package/dist/transcript-sources.js.map +1 -1
  263. package/dist/types.d.ts +3 -23
  264. package/dist/ui/app.html +8 -1
  265. package/dist/ui/backend-signin.js +21 -36
  266. package/dist/ui/chat-md-strings.js +9 -0
  267. package/dist/ui/chat-store.js +2 -13
  268. package/dist/ui/chat-strings.js +2 -50
  269. package/dist/ui/chat-thread.js +53 -3
  270. package/dist/ui/fleet-task-card.js +3 -3
  271. package/dist/ui/fleet-task-common.js +10 -0
  272. package/dist/ui/fleet-tasks.js +7 -5
  273. package/dist/ui/fleet-usage.js +90 -27
  274. package/dist/ui/panel-chat.js +37 -66
  275. package/dist/ui/panel-details.js +1 -2
  276. package/dist/ui/panel-fleet.js +88 -107
  277. package/dist/ui/panel-needs.js +21 -163
  278. package/dist/ui/panel-notices.js +4 -3
  279. package/dist/ui/panel-settings.js +149 -239
  280. package/dist/ui/preview-panel.js +84 -6
  281. package/dist/ui/search-dialog.js +3 -2
  282. package/dist/ui/settings-appearance.js +23 -122
  283. package/dist/ui/settings-catalog.js +10 -37
  284. package/dist/ui/settings-codex-copy.js +19 -0
  285. package/dist/ui/settings-confirm.js +1 -3
  286. package/dist/ui/settings-dialogs.js +20 -27
  287. package/dist/ui/settings-guests.js +14 -27
  288. package/dist/ui/settings-model.js +17 -12
  289. package/dist/ui/settings-quota-notice.js +100 -0
  290. package/dist/ui/settings-registry.js +4 -11
  291. package/dist/ui/settings-strings.js +4 -113
  292. package/dist/ui/settings-web-authority.js +13 -15
  293. package/dist/ui/shared/app-i18n.js +2 -2
  294. package/dist/ui/shared/app-needs.js +1 -1
  295. package/dist/ui/shared/app-route.js +2 -6
  296. package/dist/ui/shared/app-shell.js +18 -23
  297. package/dist/ui/shared/app-store.js +2 -3
  298. package/dist/ui/shared/app-stream.js +1 -3
  299. package/dist/ui/shared/app.css +40 -1312
  300. package/dist/ui/shared/app.js +2 -5
  301. package/dist/ui/shared/header-tools.js +4 -6
  302. package/dist/ui/shared/instance-nav.js +7 -34
  303. package/dist/ui/shared/instance-switch.js +3 -4
  304. package/dist/ui/shared/loading.css +37 -0
  305. package/dist/ui/shared/panel-view.js +77 -4
  306. package/dist/ui/shared/signin.js +6 -39
  307. package/dist/ui/shared/tokens.css +0 -1
  308. package/dist/ui/shared/ui-dialog.js +2 -2
  309. package/dist/ui/shared/ui-menu.js +10 -30
  310. package/dist/ui/shared/ui-states.js +14 -3
  311. package/dist/ui/shared/usage-dialog.js +18 -1
  312. package/dist/ui/shared/vendor/vendor.json +2 -19
  313. package/dist/ui/shared/view-history.css +17 -0
  314. package/dist/ui/shared/view-history.js +438 -0
  315. package/dist/ui/shared/view-strings.js +16 -8
  316. package/dist/ui/signin.html +5 -2
  317. package/dist/unattended-install.d.ts +11 -2
  318. package/dist/unattended-install.js +39 -5
  319. package/dist/unattended-install.js.map +1 -1
  320. package/dist/usage/capacity.d.ts +69 -0
  321. package/dist/usage/capacity.js +119 -0
  322. package/dist/usage/capacity.js.map +1 -0
  323. package/dist/usage/i18n-keys.d.ts +1 -1
  324. package/dist/usage/i18n-keys.js +3 -0
  325. package/dist/usage/i18n-keys.js.map +1 -1
  326. package/dist/usage/profile-timeline.d.ts +16 -0
  327. package/dist/usage/profile-timeline.js +58 -0
  328. package/dist/usage/profile-timeline.js.map +1 -0
  329. package/dist/usage/providers.d.ts +5 -0
  330. package/dist/usage/providers.js +5 -0
  331. package/dist/usage/providers.js.map +1 -1
  332. package/dist/usage/quota-history.d.ts +43 -0
  333. package/dist/usage/quota-history.js +168 -0
  334. package/dist/usage/quota-history.js.map +1 -0
  335. package/dist/usage/quota-notices.d.ts +38 -0
  336. package/dist/usage/quota-notices.js +160 -0
  337. package/dist/usage/quota-notices.js.map +1 -0
  338. package/dist/usage/usage-api.d.ts +32 -0
  339. package/dist/usage/usage-api.js +96 -1
  340. package/dist/usage/usage-api.js.map +1 -1
  341. package/dist/usage-report.d.ts +25 -1
  342. package/dist/usage-report.js +55 -4
  343. package/dist/usage-report.js.map +1 -1
  344. package/dist/usage-rollup.d.ts +6 -1
  345. package/dist/usage-rollup.js +16 -4
  346. package/dist/usage-rollup.js.map +1 -1
  347. package/dist/view-api.d.ts +16 -0
  348. package/dist/view-api.js +100 -16
  349. package/dist/view-api.js.map +1 -1
  350. package/dist/view-history.d.ts +84 -0
  351. package/dist/view-history.js +116 -0
  352. package/dist/view-history.js.map +1 -0
  353. package/dist/web-api.d.ts +6 -38
  354. package/dist/web-api.js +20 -255
  355. package/dist/web-api.js.map +1 -1
  356. package/dist/web-chat-history.d.ts +2 -19
  357. package/dist/web-chat-history.js +3 -72
  358. package/dist/web-chat-history.js.map +1 -1
  359. package/dist/web-only-fleet.d.ts +0 -20
  360. package/dist/web-only-fleet.js +0 -21
  361. package/dist/web-only-fleet.js.map +1 -1
  362. package/dist/web-session-authorization.d.ts +13 -2
  363. package/dist/web-session-authorization.js +10 -3
  364. package/dist/web-session-authorization.js.map +1 -1
  365. package/dist/web-session.d.ts +0 -7
  366. package/dist/web-session.js +0 -2
  367. package/dist/web-session.js.map +1 -1
  368. package/dist/web-shell-routes.d.ts +1 -4
  369. package/dist/web-shell-routes.js +2 -7
  370. package/dist/web-shell-routes.js.map +1 -1
  371. package/launcher/private-home.cjs +1 -1
  372. package/package.json +3 -9
  373. package/dist/agent-runtime-api.d.ts +0 -4
  374. package/dist/agent-runtime-api.js +0 -59
  375. package/dist/agent-runtime-api.js.map +0 -1
  376. package/dist/agent-runtime-change.d.ts +0 -74
  377. package/dist/agent-runtime-change.js +0 -102
  378. package/dist/agent-runtime-change.js.map +0 -1
  379. package/dist/backend/grok-model-cache.d.ts +0 -7
  380. package/dist/backend/grok-model-cache.js +0 -65
  381. package/dist/backend/grok-model-cache.js.map +0 -1
  382. package/dist/backend/native-pane.d.ts +0 -9
  383. package/dist/backend/native-pane.js +0 -59
  384. package/dist/backend/native-pane.js.map +0 -1
  385. package/dist/fleet-windows-runtime.d.ts +0 -97
  386. package/dist/fleet-windows-runtime.js +0 -449
  387. package/dist/fleet-windows-runtime.js.map +0 -1
  388. package/dist/general-binding.d.ts +0 -85
  389. package/dist/general-binding.js +0 -298
  390. package/dist/general-binding.js.map +0 -1
  391. package/dist/general-host-owner.d.ts +0 -8
  392. package/dist/general-host-owner.js +0 -26
  393. package/dist/general-host-owner.js.map +0 -1
  394. package/dist/general-role.d.ts +0 -5
  395. package/dist/general-role.js +0 -26
  396. package/dist/general-role.js.map +0 -1
  397. package/dist/local-pane-endpoint.d.ts +0 -46
  398. package/dist/local-pane-endpoint.js +0 -189
  399. package/dist/local-pane-endpoint.js.map +0 -1
  400. package/dist/local-pane-launcher.d.ts +0 -2
  401. package/dist/local-pane-launcher.js +0 -38
  402. package/dist/local-pane-launcher.js.map +0 -1
  403. package/dist/local-pane-stage.ps1 +0 -101
  404. package/dist/model-catalog-defaults.d.ts +0 -14
  405. package/dist/model-catalog-defaults.js +0 -20
  406. package/dist/model-catalog-defaults.js.map +0 -1
  407. package/dist/native-agent-admission.d.ts +0 -7
  408. package/dist/native-agent-admission.js +0 -26
  409. package/dist/native-agent-admission.js.map +0 -1
  410. package/dist/native-daemon-client.d.ts +0 -13
  411. package/dist/native-daemon-client.js +0 -28
  412. package/dist/native-daemon-client.js.map +0 -1
  413. package/dist/native-instance-api.d.ts +0 -14
  414. package/dist/native-instance-api.js +0 -205
  415. package/dist/native-instance-api.js.map +0 -1
  416. package/dist/native-instance-input.d.ts +0 -84
  417. package/dist/native-instance-input.js +0 -54
  418. package/dist/native-instance-input.js.map +0 -1
  419. package/dist/native-instance-registry.d.ts +0 -32
  420. package/dist/native-instance-registry.js +0 -105
  421. package/dist/native-instance-registry.js.map +0 -1
  422. package/dist/native-mcp.d.ts +0 -40
  423. package/dist/native-mcp.js +0 -278
  424. package/dist/native-mcp.js.map +0 -1
  425. package/dist/native-model-catalog.d.ts +0 -5
  426. package/dist/native-model-catalog.js +0 -76
  427. package/dist/native-model-catalog.js.map +0 -1
  428. package/dist/native-pane-crash-budget.d.ts +0 -20
  429. package/dist/native-pane-crash-budget.js +0 -60
  430. package/dist/native-pane-crash-budget.js.map +0 -1
  431. package/dist/native-pane-create.d.ts +0 -26
  432. package/dist/native-pane-create.js +0 -53
  433. package/dist/native-pane-create.js.map +0 -1
  434. package/dist/native-pane-lifecycle.d.ts +0 -65
  435. package/dist/native-pane-lifecycle.js +0 -230
  436. package/dist/native-pane-lifecycle.js.map +0 -1
  437. package/dist/native-pane-manager.d.ts +0 -59
  438. package/dist/native-pane-manager.js +0 -584
  439. package/dist/native-pane-manager.js.map +0 -1
  440. package/dist/native-pane-output-log.d.ts +0 -15
  441. package/dist/native-pane-output-log.js +0 -108
  442. package/dist/native-pane-output-log.js.map +0 -1
  443. package/dist/native-pane-reconciliation.d.ts +0 -4
  444. package/dist/native-pane-reconciliation.js +0 -40
  445. package/dist/native-pane-reconciliation.js.map +0 -1
  446. package/dist/native-pane-recovery.d.ts +0 -12
  447. package/dist/native-pane-recovery.js +0 -10
  448. package/dist/native-pane-recovery.js.map +0 -1
  449. package/dist/native-pane-tools.d.ts +0 -2
  450. package/dist/native-pane-tools.js +0 -14
  451. package/dist/native-pane-tools.js.map +0 -1
  452. package/dist/pane-port.d.ts +0 -118
  453. package/dist/pane-port.js +0 -2
  454. package/dist/pane-port.js.map +0 -1
  455. package/dist/runtime-api.d.ts +0 -8
  456. package/dist/runtime-api.js +0 -171
  457. package/dist/runtime-api.js.map +0 -1
  458. package/dist/runtime-assets/@xterm/addon-serialize/LICENSE +0 -21
  459. package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.js +0 -2
  460. package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.mjs +0 -19
  461. package/dist/runtime-assets/@xterm/addon-serialize/package.json +0 -29
  462. package/dist/runtime-assets/@xterm/headless/LICENSE +0 -21
  463. package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.js +0 -2
  464. package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.mjs +0 -46
  465. package/dist/runtime-assets/@xterm/headless/package.json +0 -29
  466. package/dist/runtime-assets/node-pty/CONPTY-LICENSE +0 -21
  467. package/dist/runtime-assets/node-pty/CONPTY-NOTICE.md +0 -503
  468. package/dist/runtime-assets/node-pty/LICENSE +0 -69
  469. package/dist/runtime-assets/node-pty/lib/conpty_console_list_agent.js +0 -16
  470. package/dist/runtime-assets/node-pty/lib/eventEmitter2.js +0 -47
  471. package/dist/runtime-assets/node-pty/lib/index.js +0 -52
  472. package/dist/runtime-assets/node-pty/lib/interfaces.js +0 -7
  473. package/dist/runtime-assets/node-pty/lib/shared/conout.js +0 -11
  474. package/dist/runtime-assets/node-pty/lib/terminal.js +0 -190
  475. package/dist/runtime-assets/node-pty/lib/types.js +0 -7
  476. package/dist/runtime-assets/node-pty/lib/unixTerminal.js +0 -346
  477. package/dist/runtime-assets/node-pty/lib/utils.js +0 -39
  478. package/dist/runtime-assets/node-pty/lib/windowsConoutConnection.js +0 -125
  479. package/dist/runtime-assets/node-pty/lib/windowsPtyAgent.js +0 -320
  480. package/dist/runtime-assets/node-pty/lib/windowsTerminal.js +0 -199
  481. package/dist/runtime-assets/node-pty/lib/worker/conoutSocketWorker.js +0 -22
  482. package/dist/runtime-assets/node-pty/package.json +0 -64
  483. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
  484. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
  485. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
  486. package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
  487. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
  488. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
  489. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty.node +0 -0
  490. package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
  491. package/dist/runtime-build-info.d.ts +0 -9
  492. package/dist/runtime-build-info.js +0 -57
  493. package/dist/runtime-build-info.js.map +0 -1
  494. package/dist/runtime-bundle.d.ts +0 -19
  495. package/dist/runtime-bundle.js +0 -156
  496. package/dist/runtime-bundle.js.map +0 -1
  497. package/dist/runtime-cli.d.ts +0 -7
  498. package/dist/runtime-cli.js +0 -152
  499. package/dist/runtime-cli.js.map +0 -1
  500. package/dist/runtime-client-store.d.ts +0 -68
  501. package/dist/runtime-client-store.js +0 -344
  502. package/dist/runtime-client-store.js.map +0 -1
  503. package/dist/runtime-client.d.ts +0 -112
  504. package/dist/runtime-client.js +0 -736
  505. package/dist/runtime-client.js.map +0 -1
  506. package/dist/runtime-connection.d.ts +0 -22
  507. package/dist/runtime-connection.js +0 -93
  508. package/dist/runtime-connection.js.map +0 -1
  509. package/dist/runtime-coordinator.d.ts +0 -91
  510. package/dist/runtime-coordinator.js +0 -911
  511. package/dist/runtime-coordinator.js.map +0 -1
  512. package/dist/runtime-general-protocol.d.ts +0 -22
  513. package/dist/runtime-general-protocol.js +0 -57
  514. package/dist/runtime-general-protocol.js.map +0 -1
  515. package/dist/runtime-general-workspace.d.ts +0 -17
  516. package/dist/runtime-general-workspace.js +0 -213
  517. package/dist/runtime-general-workspace.js.map +0 -1
  518. package/dist/runtime-pane-assets.d.ts +0 -17
  519. package/dist/runtime-pane-assets.js +0 -23
  520. package/dist/runtime-pane-assets.js.map +0 -1
  521. package/dist/runtime-pane-boot.d.ts +0 -9
  522. package/dist/runtime-pane-boot.js +0 -47
  523. package/dist/runtime-pane-boot.js.map +0 -1
  524. package/dist/runtime-pane-codex-index.d.ts +0 -1
  525. package/dist/runtime-pane-codex-index.js +0 -47
  526. package/dist/runtime-pane-codex-index.js.map +0 -1
  527. package/dist/runtime-pane-config.d.ts +0 -16
  528. package/dist/runtime-pane-config.js +0 -54
  529. package/dist/runtime-pane-config.js.map +0 -1
  530. package/dist/runtime-pane-host.d.ts +0 -44
  531. package/dist/runtime-pane-host.js +0 -424
  532. package/dist/runtime-pane-host.js.map +0 -1
  533. package/dist/runtime-pane-job-owner.d.ts +0 -1
  534. package/dist/runtime-pane-job-owner.js +0 -29
  535. package/dist/runtime-pane-job-owner.js.map +0 -1
  536. package/dist/runtime-pane-job.ps1 +0 -116
  537. package/dist/runtime-pane-link.d.ts +0 -40
  538. package/dist/runtime-pane-link.js +0 -246
  539. package/dist/runtime-pane-link.js.map +0 -1
  540. package/dist/runtime-pane-mcp-protocol.d.ts +0 -32
  541. package/dist/runtime-pane-mcp-protocol.js +0 -39
  542. package/dist/runtime-pane-mcp-protocol.js.map +0 -1
  543. package/dist/runtime-pane-mcp-relay.d.ts +0 -17
  544. package/dist/runtime-pane-mcp-relay.js +0 -70
  545. package/dist/runtime-pane-mcp-relay.js.map +0 -1
  546. package/dist/runtime-pane-mcp.d.ts +0 -51
  547. package/dist/runtime-pane-mcp.js +0 -150
  548. package/dist/runtime-pane-mcp.js.map +0 -1
  549. package/dist/runtime-pane-native.d.ts +0 -45
  550. package/dist/runtime-pane-native.js +0 -65
  551. package/dist/runtime-pane-native.js.map +0 -1
  552. package/dist/runtime-pane-output.d.ts +0 -19
  553. package/dist/runtime-pane-output.js +0 -53
  554. package/dist/runtime-pane-output.js.map +0 -1
  555. package/dist/runtime-pane-port.d.ts +0 -139
  556. package/dist/runtime-pane-port.js +0 -558
  557. package/dist/runtime-pane-port.js.map +0 -1
  558. package/dist/runtime-pane-private.d.ts +0 -14
  559. package/dist/runtime-pane-private.js +0 -51
  560. package/dist/runtime-pane-private.js.map +0 -1
  561. package/dist/runtime-pane-private.ps1 +0 -14
  562. package/dist/runtime-pane-process.d.ts +0 -4
  563. package/dist/runtime-pane-process.js +0 -108
  564. package/dist/runtime-pane-process.js.map +0 -1
  565. package/dist/runtime-pane-protocol.d.ts +0 -172
  566. package/dist/runtime-pane-protocol.js +0 -195
  567. package/dist/runtime-pane-protocol.js.map +0 -1
  568. package/dist/runtime-pane-screen.d.ts +0 -19
  569. package/dist/runtime-pane-screen.js +0 -76
  570. package/dist/runtime-pane-screen.js.map +0 -1
  571. package/dist/runtime-pane-service.d.ts +0 -11
  572. package/dist/runtime-pane-service.js +0 -221
  573. package/dist/runtime-pane-service.js.map +0 -1
  574. package/dist/runtime-pane-stdio-protocol.d.ts +0 -54
  575. package/dist/runtime-pane-stdio-protocol.js +0 -94
  576. package/dist/runtime-pane-stdio-protocol.js.map +0 -1
  577. package/dist/runtime-pane-stdio.d.ts +0 -3
  578. package/dist/runtime-pane-stdio.js +0 -123
  579. package/dist/runtime-pane-stdio.js.map +0 -1
  580. package/dist/runtime-pane-store.d.ts +0 -33
  581. package/dist/runtime-pane-store.js +0 -164
  582. package/dist/runtime-pane-store.js.map +0 -1
  583. package/dist/runtime-pane-transcript-protocol.d.ts +0 -43
  584. package/dist/runtime-pane-transcript-protocol.js +0 -58
  585. package/dist/runtime-pane-transcript-protocol.js.map +0 -1
  586. package/dist/runtime-pane-transcript.d.ts +0 -45
  587. package/dist/runtime-pane-transcript.js +0 -605
  588. package/dist/runtime-pane-transcript.js.map +0 -1
  589. package/dist/runtime-pane-worker.d.ts +0 -1
  590. package/dist/runtime-pane-worker.js +0 -154
  591. package/dist/runtime-pane-worker.js.map +0 -1
  592. package/dist/runtime-protocol.d.ts +0 -162
  593. package/dist/runtime-protocol.js +0 -37
  594. package/dist/runtime-protocol.js.map +0 -1
  595. package/dist/runtime-switches.d.ts +0 -79
  596. package/dist/runtime-switches.js +0 -90
  597. package/dist/runtime-switches.js.map +0 -1
  598. package/dist/runtime-transcript-delta-reader.d.ts +0 -23
  599. package/dist/runtime-transcript-delta-reader.js +0 -74
  600. package/dist/runtime-transcript-delta-reader.js.map +0 -1
  601. package/dist/runtime-transcript-source.d.ts +0 -36
  602. package/dist/runtime-transcript-source.js +0 -189
  603. package/dist/runtime-transcript-source.js.map +0 -1
  604. package/dist/runtime-windows-bridge.d.ts +0 -41
  605. package/dist/runtime-windows-bridge.js +0 -157
  606. package/dist/runtime-windows-bridge.js.map +0 -1
  607. package/dist/settings-route-lifetime.d.ts +0 -14
  608. package/dist/settings-route-lifetime.js +0 -48
  609. package/dist/settings-route-lifetime.js.map +0 -1
  610. package/dist/tmux-pane-host.d.ts +0 -26
  611. package/dist/tmux-pane-host.js +0 -25
  612. package/dist/tmux-pane-host.js.map +0 -1
  613. package/dist/transcript-needles.d.ts +0 -35
  614. package/dist/transcript-needles.js +0 -158
  615. package/dist/transcript-needles.js.map +0 -1
  616. package/dist/transcript-records.d.ts +0 -21
  617. package/dist/transcript-records.js +0 -140
  618. package/dist/transcript-records.js.map +0 -1
  619. package/dist/ui/agent-proposals.js +0 -90
  620. package/dist/ui/agent-runtime-settings.js +0 -67
  621. package/dist/ui/agent-runtime.js +0 -124
  622. package/dist/ui/cli-picker.js +0 -42
  623. package/dist/ui/general-location.js +0 -71
  624. package/dist/ui/native-instance-settings.js +0 -44
  625. package/dist/ui/native-pane-recovery.js +0 -45
  626. package/dist/ui/panel-runtimes.js +0 -334
  627. package/dist/ui/panel-windows-agent.js +0 -86
  628. package/dist/ui/panel-windows-cli.js +0 -179
  629. package/dist/ui/provider-marks.js +0 -83
  630. package/dist/ui/runtime-catalog.js +0 -55
  631. package/dist/ui/settings-agent-filters.js +0 -94
  632. package/dist/ui/settings-layout.js +0 -245
  633. package/dist/ui/settings-outside.js +0 -176
  634. package/dist/ui/settings-shortcuts.js +0 -65
  635. package/dist/ui/shared/machine-name.js +0 -13
  636. package/dist/ui/shared/qrcode.module.js +0 -2237
  637. package/dist/ui/shared/settings-width.js +0 -31
  638. package/dist/ui/shared/vendor/qrcode-generator.LICENSE +0 -27
  639. package/dist/ui/windows-agents-nav.js +0 -2
  640. package/dist/ui/windows-cli-catalog.js +0 -108
  641. package/dist/web-remote-access.d.ts +0 -152
  642. package/dist/web-remote-access.js +0 -368
  643. package/dist/web-remote-access.js.map +0 -1
  644. package/dist/windows-agents.d.ts +0 -126
  645. package/dist/windows-agents.js +0 -490
  646. package/dist/windows-agents.js.map +0 -1
  647. package/dist/windows-cli-api.d.ts +0 -23
  648. package/dist/windows-cli-api.js +0 -159
  649. package/dist/windows-cli-api.js.map +0 -1
  650. package/dist/windows-cli-providers.d.ts +0 -115
  651. package/dist/windows-cli-providers.js +0 -429
  652. package/dist/windows-cli-providers.js.map +0 -1
  653. package/dist/windows-cli-worker.d.ts +0 -59
  654. package/dist/windows-cli-worker.js +0 -479
  655. package/dist/windows-cli-worker.js.map +0 -1
  656. package/dist/windows-cli.d.ts +0 -116
  657. package/dist/windows-cli.js +0 -407
  658. package/dist/windows-cli.js.map +0 -1
  659. package/dist/windows-native-mcp.d.ts +0 -19
  660. package/dist/windows-native-mcp.js +0 -143
  661. package/dist/windows-native-mcp.js.map +0 -1
  662. package/dist/windows-pane-mcp.d.ts +0 -26
  663. package/dist/windows-pane-mcp.js +0 -187
  664. package/dist/windows-pane-mcp.js.map +0 -1
  665. package/templates/runtime-assets/conpty-LICENSE +0 -21
  666. package/templates/runtime-assets/conpty-NOTICE.md +0 -503
  667. package/templates/runtime-assets/local-pane-stage.ps1 +0 -101
  668. package/templates/runtime-assets/runtime-pane-job.ps1 +0 -116
  669. package/templates/runtime-assets/runtime-pane-private.ps1 +0 -14
  670. package/templates/runtime-assets/xterm-LICENSE +0 -21
package/dist/types.d.ts CHANGED
@@ -93,19 +93,9 @@ export declare function resolveDeliveryWorkerMode(config: {
93
93
  delivery_worker?: unknown;
94
94
  }>;
95
95
  } | null | undefined, name: string): DeliveryWorkerMode;
96
+ import type { QuotaNoticeRule, QuotaNoticeSettings } from "./quota-notice-config.js";
96
97
  export interface InstanceConfig {
97
- /** Execution host. Unset preserves the existing Linux/WSL runtime. */
98
- runtime?: "wsl" | "windows";
99
- /** Paired execution machine. Unset keeps the existing local runtime and provider session. */
100
- machine_id?: string;
101
- /** Stable native conversation/profile identity; set only for Windows instances. */
102
- native_agent_id?: string;
103
- /** Persistent terminal opt-in. Unset/exec preserves the per-turn adapter and rollback. */
104
- native_adapter?: "exec" | "pane";
105
- /** Internal administrator-created General binding; runner computes its dedicated workspace. */
106
- native_general_binding?: string;
107
- /** Native CLI permission selection; independent of Linux terminal permissions. */
108
- native_sandbox?: "read-only" | "workspace-write";
98
+ quota_notice?: QuotaNoticeRule;
109
99
  /** Proactive interrupted-work continuation; defaults true, inherited from fleet defaults. */
110
100
  resume_interrupted_work?: boolean;
111
101
  working_directory: string;
@@ -277,6 +267,7 @@ export interface WebhookConfig {
277
267
  headers?: Record<string, string>;
278
268
  }
279
269
  export interface FleetDefaults extends Partial<InstanceConfig> {
270
+ quota_notice?: QuotaNoticeSettings;
280
271
  /** UI/notification language for user-facing text: "en" or "zh-TW". Auto-detects from timezone if unset. */
281
272
  locale?: string;
282
273
  /** Seconds before the cancel button starts showing elapsed time (default 30). */
@@ -649,17 +640,6 @@ export interface FleetConfig {
649
640
  fleet_label?: string;
650
641
  login?: LoginConfig;
651
642
  web_terminal?: WebTerminalConfig;
652
- /**
653
- * M-2255: Settings → Runtime. `windows_cli`: agents may run this PC's Windows CLIs (through WSL); `remote_runtime`:
654
- * other Windows computers may pair with this fleet and run its agents. Both off by default; AGEND_WINDOWS_CLI /
655
- * AGEND_REMOTE_RUNTIME ("1" on, "0" off) override them. `max_agents_per_machine` (#2953 1.8): Windows agents running at
656
- * once on each Windows computer, 1..16, default 4.
657
- */
658
- runtimes?: {
659
- windows_cli?: boolean;
660
- remote_runtime?: boolean;
661
- max_agents_per_machine?: number;
662
- };
663
643
  }
664
644
  /**
665
645
  * User-authored fleet.yaml before defaults are merged into instances.
package/dist/ui/app.html CHANGED
@@ -13,11 +13,18 @@
13
13
  <script src="/assets/theme.js"></script>
14
14
  <link rel="stylesheet" href="/assets/tokens.css">
15
15
  <link rel="stylesheet" href="/assets/app.css">
16
+ <link rel="stylesheet" href="/assets/loading.css">
16
17
  <script src="/assets/agend-auth.js"></script>
17
18
  <script type="module" src="/assets/app.js"></script>
18
19
  </head>
19
20
  <body>
20
- <div id="app" class="app-root"></div>
21
+ <div id="app" class="app-root"><div class="sk-boot" role="status" aria-busy="true" aria-label="Loading…">
22
+ <div class="sk-boot-side" aria-hidden="true"><div class="skeleton"><div class="sk-line"></div><div class="sk-line"></div><div class="sk-line"></div></div></div>
23
+ <div class="sk-boot-main" aria-hidden="true"><div class="sk-boot-head skeleton"><div class="sk-line"></div></div>
24
+ <div class="skeleton sk-rows"><div class="sk-row"><div class="sk-line sk-thumb"></div><div class="sk-copy"><div class="sk-line"></div><div class="sk-line"></div></div><div class="sk-line sk-pill"></div></div>
25
+ <div class="sk-row"><div class="sk-line sk-thumb"></div><div class="sk-copy"><div class="sk-line"></div><div class="sk-line"></div></div><div class="sk-line sk-pill"></div></div>
26
+ <div class="sk-row"><div class="sk-line sk-thumb"></div><div class="sk-copy"><div class="sk-line"></div><div class="sk-line"></div></div><div class="sk-line sk-pill"></div></div></div>
27
+ </div></div></div>
21
28
  <noscript><p class="noscript">AgEnD's web app needs JavaScript.</p></noscript>
22
29
  </body>
23
30
  </html>
@@ -12,7 +12,6 @@ import { closeDialog, shellStore, showDialog } from "/assets/app-shell.js";
12
12
  import { Dialog } from "/assets/ui-dialog.js";
13
13
  import { toast } from "/assets/ui-toast.js";
14
14
  import { mountStructuredSignIns } from "./structured-signin.js";
15
- import { CliProductMark, cliLabel } from "./cli-picker.js";
16
15
 
17
16
  register("signin", {
18
17
  en: {
@@ -232,12 +231,11 @@ export function BrowserSignInDialog({ backend, backends, onClose }) {
232
231
  if (!result.ok) { toast(tn("failed")); return; }
233
232
  showDialog(SignInDialog, { backend: chosen });
234
233
  };
235
- const actions = html`<div class="signin-browser-actions">
234
+ return html`<${Dialog} title=${backends ? tn("listTitle") : tn("title", backend)} onClose=${close}>
235
+ <div ref=${root}></div>
236
236
  ${backends ? backends.filter(b => b !== "antigravity").map(b => html`<button type="button" class="btn" onClick=${() => fallback(b)}>${b} · ${tn("consoleFallback")}</button>`) : null}
237
- ${backend ? html`<button type="button" class="btn" onClick=${() => fallback(backend)}>${tn("consoleFallback")}</button>` : null}
238
- <button type="button" class="btn" onClick=${close}>${tn("close")}</button></div>`;
239
- return html`<${Dialog} title=${backends ? tn("listTitle") : tn("title", cliLabel(backend))} onClose=${close} actions=${actions}>
240
- <div class="signin-browser" ref=${root}></div>
237
+ <div class="s-actions">${backend ? html`<button type="button" class="btn" onClick=${() => fallback(backend)}>${tn("consoleFallback")}</button>` : null}
238
+ <button type="button" class="btn" onClick=${close}>${tn("close")}</button></div>
241
239
  </${Dialog}>`;
242
240
  }
243
241
 
@@ -329,41 +327,28 @@ export function SignInLine() {
329
327
 
330
328
  const STATE_KEY = { usable: "stUsable", not_signed_in: "stNotSignedIn", not_installed: "stNotInstalled", too_old: "stTooOld", unknown: "stUnknown" };
331
329
 
332
- register("signin", {
333
- en: {
334
- hostTitle: "CLI sign-ins", hostHint: "Accounts used by CLIs on the host running AgEnD.",
335
- hostBadge: "AgEnD host", hostProfile: "Credential profile: {0}", hostLoading: "Reading CLI sign-ins…", hostEmpty: "No CLI sign-ins were reported on this host.",
336
- installHelp: "Installation instructions", updateHelp: "Update instructions", hostHelp: "Sign-in instructions",
337
- commandHint: "Run these instructions in a terminal on the host running AgEnD.",
338
- },
339
- "zh-TW": {
340
- hostTitle: "CLI 登入", hostHint: "執行 AgEnD 的主機上,各個 CLI 使用的帳號。",
341
- hostBadge: "AgEnD 主機", hostProfile: "憑證設定檔:{0}", hostLoading: "正在讀取 CLI 登入狀態…", hostEmpty: "這台主機尚未回報 CLI 登入項目。",
342
- installHelp: "安裝說明", updateHelp: "更新說明", hostHelp: "登入說明",
343
- commandHint: "請在執行 AgEnD 的主機終端機中操作。",
344
- },
345
- });
346
-
347
- /** Settings → Agents: existing host sign-in actions, with commands disclosed only when needed. */
330
+ /** Settings → Agents: each login on this machine, with Sign in where the dashboard can do it. */
348
331
  export function SignInList() {
349
332
  const { targets, loaded, login, structured } = useStore(signInStore);
350
- // Public-link authority remains unchanged: this page neither reads nor offers host sign-in there.
333
+ // Not over the temporary public link: only the dashboard reached directly signs a backend in, and the link does not
334
+ // serve this read (it was a 404 in the console there, found by smoke-1939-authorize-defaults).
351
335
  const offered = signInOffered();
352
336
  useEffect(() => { if (offered) void refreshSignIn(); }, []);
353
- if (!offered) return null;
337
+ if (!offered || !loaded || !targets.length) return null;
354
338
  const active = structured?.login;
355
339
  const running = (login && login.phase === "running") || (active && active.phase !== "done" && !(active.phase === "failed" && active.reason));
356
- return html`<section class="s-group signin-list s-auth-section" aria-label=${tn("hostTitle")}>
357
- <header class="s-auth-section-head"><div><h3>${tn("hostTitle")}</h3><p>${tn("hostHint")}</p></div><span class="s-auth-host-badge">${tn("hostBadge")}</span></header>
358
- ${!loaded ? html`<p class="note" role="status">${tn("hostLoading")}</p>` : !targets.length ? html`<p class="note">${tn("hostEmpty")}</p>` : html`<div class="s-host-cli-list">${targets.map((x) => {
359
- const commands = [["install", x.install], ["update", x.update], ["onHost", x.hostCommand]].filter(([, value]) => value);
360
- return html`<div key=${`${x.backend}:${x.profile || ""}`} class="s-row s-host-cli-row" data-backend=${x.backend}>
361
- <div class="s-host-cli-identity"><${CliProductMark} id=${x.backend} size=${24} /><div><strong class="s-name">${cliLabel(x.backend)}</strong>${x.profile ? html`<small>${tn("hostProfile", x.profile)}</small>` : null}</div></div>
362
- <span class=${`tag s-auth-state is-${x.state || "unknown"}`}>${tn(STATE_KEY[x.state] || "stUnknown")}</span>
363
- ${x.signIn ? html`<span class="s-actions"><button type="button" class=${x.state === "not_signed_in" ? "btn btn-sm btn-primary" : "btn btn-sm"} disabled=${!!running}
364
- onClick=${() => openSignIn(x)}>${x.state === "usable" ? tn("signInAgain") : tn("signIn")}</button></span>` : null}
365
- ${commands.length ? html`<details class="s-host-cli-help" data-inline-help=${x.signIn ? "false" : "true"}><summary>${tn(x.install ? "installHelp" : x.update ? "updateHelp" : "hostHelp")}</summary><div><p class="note">${tn("commandHint")}</p>${commands.map(([kind, command]) => html`<p class="s-host-cli-command"><code>${tn(kind, command)}</code></p>`)}</div></details>` : null}
366
- </div>`;
367
- })}</div>`}
340
+ return html`<section class="s-group signin-list" aria-label=${tn("listTitle")}>
341
+ <div class="list-head"><span>${tn("listTitle")}</span></div>
342
+ <p class="sub">${tn("listHint")}</p>
343
+ ${targets.map((x) => html`<div key=${`${x.backend}:${x.profile || ""}`} class="s-row">
344
+ <span class="s-name">${shownOf(x.backend, x.profile)}</span>
345
+ <span class="tag">${tn(STATE_KEY[x.state] || "stUnknown")}</span>
346
+ <span class="s-br" aria-hidden="true"></span>
347
+ ${x.install ? html`<span class="s-meta"><code>${tn("install", x.install)}</code></span>` : null}
348
+ ${x.update ? html`<span class="s-meta"><code>${tn("update", x.update)}</code></span>` : null}
349
+ ${x.hostCommand ? html`<span class="s-meta"><code>${tn("onHost", x.hostCommand)}</code></span>` : null}
350
+ <span class="s-actions">${x.signIn ? html`<button type="button" class=${x.state === "not_signed_in" ? "btn btn-sm btn-primary" : "btn btn-sm"} disabled=${!!running}
351
+ onClick=${() => openSignIn(x)}>${x.state === "usable" ? tn("signInAgain") : tn("signIn")}</button>` : null}</span>
352
+ </div>`)}
368
353
  </section>`;
369
354
  }
@@ -0,0 +1,9 @@
1
+ // M-2448 (Prism on #3155): the Markdown side panel's own words, registered by the panel's module (preview-panel.js). A
2
+ // page that opened Log or Details before an upgrade may hold an older chat-strings.js without them; these keep the
3
+ // panel saying what it shows, never a raw key.
4
+ import { register } from "/assets/app-i18n.js";
5
+
6
+ register("chat", {
7
+ en: { pvMdPanel: "Markdown preview", pvMdRendered: "Formatted", pvMdSource: "Source" },
8
+ "zh-TW": { pvMdPanel: "Markdown 預覽", pvMdRendered: "排版", pvMdSource: "原始內容" },
9
+ });
@@ -70,14 +70,7 @@ export function createChatStore(deps) {
70
70
  const r = await deps.fetch(path, o);
71
71
  return r.json();
72
72
  }
73
- // The server supplies the role. Display names can differ from an instance's ID (or change during a chat).
74
- // Keep the sender heuristic only for older messages that do not carry a recognized role.
75
- const isUser = (x, instance) => {
76
- if (x.role === "user") return true;
77
- if (x.role === "agent" || x.role === "status") return false;
78
- const sender = typeof x.sender === "string" ? x.sender : "";
79
- return sender === "web-user" || (!sender.startsWith("agend") && sender !== instance && sender !== "general");
80
- };
73
+ const isUser = (x, instance) => x.sender === "web-user" || (!x.sender.startsWith("agend") && x.sender !== instance && x.sender !== "general");
81
74
 
82
75
  // ── The turn (#1307): when this page saw the agent start working (its own monotonic clock, so approximate), a Stop
83
76
  // on its way, and an instance waiting on a terminal prompt.
@@ -400,11 +393,7 @@ export function createChatStore(deps) {
400
393
  if (r && r.reason === "reply_gone") { e.quote = undefined; e.replyTo = undefined; }
401
394
  const why = r && r.reason;
402
395
  const key = typeof why === "string" ? `chat.sendFailure_${why}` : "";
403
- // M-2297: the per-PC limit names its number and the agents holding the slots.
404
- const holders = why === "machine_limit" && Array.isArray(r.holders)
405
- ? r.holders.filter((h) => h && typeof h.name === "string").map((h) => (h.unknown ? t("chat.machineLimitUnknown", h.name) : h.name)).join(", ")
406
- : "";
407
- const localized = key ? (why === "machine_limit" ? t(key, String(r.limit ?? "?"), holders || "?") : t(key)) : "";
396
+ const localized = key ? t(key) : "";
408
397
  e.outgoing = { state: "failed", error: localized && localized !== key ? localized : (r && r.error ? r.error : t("chat.disconnected")) };
409
398
  changed(target, "msgs"); changed(target);
410
399
  deps.toast(e.outgoing.error, false);
@@ -3,28 +3,6 @@ import { register } from "/assets/app-i18n.js";
3
3
 
4
4
  register("chat", {
5
5
  en: {
6
- runtimeNoAttachments: "This runtime does not support attachments yet. Paste text instead.",
7
- runtimeNoCommands: "This runtime does not support this CLI command yet. Use Agent settings instead.",
8
- nativeBusy: "Windows CLI is running another task. Your draft is kept until it is ready.",
9
- nativeBlocked: "The last Windows execution outcome is unknown. Verify its processes have stopped before unlocking.",
10
- nativeRecover: "Processes stopped — unlock agent",
11
- paneHostUpgrade: "This Windows pane host uses an older adapter. Stop its Windows agents, restart Windows, then choose Start. Saved conversations are kept.",
12
- paneCodexSessionUnconfirmed: "Windows Codex's saved conversation could not be checked. This agent is stopped; an administrator can start a new conversation.",
13
- paneSessionUnconfirmed: "Windows Claude's saved conversation could not be checked. This agent is stopped; an administrator can start a new conversation.",
14
- paneNewConversation: "Start a new conversation",
15
- paneNewConversationConfirm: "Start a new conversation for {0}? The previous session ID stays in its receipt; old input will not be replayed.",
16
- paneRecoveryNeeded: "The previous Windows pane exit is unconfirmed. Its saved conversation is kept and no old input will be replayed. An administrator can recover it after stopping its Windows processes.",
17
- paneRecover: "Recover saved session",
18
- paneRecoverConfirm: "Recover {0} without replaying its previous input. Confirm that all Windows processes belonging to this agent have stopped. Then choose Start to resume its saved conversation.",
19
- paneProcessesStopped: "I have stopped all Windows processes belonging to this agent.",
20
- paneRecoverConfirmed: "Processes stopped — recover session",
21
- nativeComposerHint: "Enter to send · Shift+Enter for a new line",
22
- nativeComposerHintTouch: "Return adds a line · tap Send to send",
23
- machineOffline: "Computer offline",
24
- machineRevoked: "Connection revoked",
25
- machineRevokedHint: "Runtime access for {0} was revoked. Your draft and conversation are kept. Check Settings → Runtime.",
26
- machineUnavailable: "The Runtime on {0} is not connected. Your draft is kept. Reconnect it before sending.",
27
- machineName: "Computer: {0}",
28
6
  waking: "Waking {0}…", retrySend: "Retry send",
29
7
  // A message being sent (its own bubble at once) and its files' uploads.
30
8
  you: "You", sending: "Sending…", uploadingFile: "Uploading {0}", uploadWaiting: "waiting", uploadFailed: "failed",
@@ -34,8 +12,6 @@ register("chat", {
34
12
  sendFailure_wake_timeout: "The instance did not become ready in time. Retry, or check its status on the host.",
35
13
  sendFailure_instance_stopped: "This instance was stopped or removed. Start it on the host before retrying.",
36
14
  sendFailure_delivery_unavailable: "The instance could not receive this message. Check its status on the host, then retry.",
37
- sendFailure_machine_limit: "This Windows computer already runs its limit of {0} agents: {1}. Stop one of them (or check and unlock one marked “outcome unknown”), then retry.",
38
- machineLimitUnknown: "{0} (outcome unknown)",
39
15
  sendFailure_delivery_changed: "The session or instance changed before this message was sent. Sign in again if needed, then retry.",
40
16
  sendFailure_reply_gone: "The message you replied to is no longer in this chat. Your text is still here: send it without the reply, or reply to another message.",
41
17
  reply: "Reply", replyingTo: "Replying to {0}", replyCancel: "Cancel the reply (Esc)", replyHidden: "an earlier message", replyPhoto: "[Photo]", replyFile: "[File]",
@@ -144,7 +120,7 @@ register("chat", {
144
120
  pick: "Choose an agent to start chatting.", noAgents: "Create an agent to start chatting.", newAgent: "New agent", notFound: "No instance called “{0}”", notFoundHint: "It may have been deleted or renamed.", backToList: "Choose an agent",
145
121
  details: "Instance details", fullWidth: "Full width", start: "Start instance", stopInstance: "Stop instance", restart: "Restart instance", delete: "Delete instance…",
146
122
  started: "{0} started", stoppedInst: "{0} stopped", restarted: "{0} restarted", instanceDeleted: "{0} was deleted",
147
- deleteTitle: "Delete {0}?", deleteHelp: "This removes the instance from the fleet and stops it. Its working directory is kept. Type “delete {0}” to confirm.", deleteGo: "Delete", cancel: "Cancel",
123
+ deleteTitle: "Delete {0}?", deleteHelp: "This removes the instance from the fleet and stops it, and deletes its chat topic (on Discord, its channel and history). Its working directory is kept. Type “delete {0}” to confirm.", deleteGo: "Delete", cancel: "Cancel",
148
124
  loadFailed: "Failed to load", tour: "Chat tour", tourBtnTitle: "Show the chat tour on an agent's chat", tourNoAgent: "Choose an agent before opening the chat tour.",
149
125
  dName: "Name", dStatus: "Status", dDisplay: "Display name", dDescription: "Description", dDirectory: "Directory", dBackend: "Backend", dModel: "Model", dEffort: "Effort",
150
126
  dCost: "Cost", dCostNote: "(session accumulated)", dContext: "Context", dRate5: "Rate 5h", dRate7: "Rate 7d", dActivity: "Recent activity", dInstance: "Instance", dRuntime: "Runtime",
@@ -171,28 +147,6 @@ register("chat", {
171
147
  configured: "(configured)", fleetDefault: "(fleet default)",
172
148
  },
173
149
  "zh-TW": {
174
- runtimeNoAttachments: "這個 Runtime 目前不支援附件,請貼上文字。",
175
- runtimeNoCommands: "這個 Runtime 目前不支援此 CLI 指令,請在 Agent 設定中調整。",
176
- nativeBusy: "Windows CLI 正在執行其他任務,完成後即可傳送;輸入內容會保留。",
177
- nativeBlocked: "上次 Windows 執行的結束狀態不明。請先確認相關程序已停止,再解除鎖定。",
178
- nativeRecover: "已確認程序停止,解除鎖定",
179
- paneHostUpgrade: "這台 Windows 的終端主機仍使用舊版轉接器。請先停止這台電腦的 Windows 代理,重新啟動 Windows,再按「啟動」。已儲存的對話會保留。",
180
- paneCodexSessionUnconfirmed: "無法確認 Windows Codex 已儲存的對話。這個代理已停止,管理員可以開始新對話。",
181
- paneSessionUnconfirmed: "無法確認 Windows Claude 已儲存的對話。這個代理已停止,管理員可以開始新對話。",
182
- paneNewConversation: "開始新對話",
183
- paneNewConversationConfirm: "要為 {0} 開始新對話嗎?原本的對話識別碼會保留在收據中,也不會重送舊輸入。",
184
- paneRecoveryNeeded: "無法確認上一個 Windows 終端是否已結束。已儲存的對話會保留,也不會重送舊輸入。管理員可在停止這個代理的 Windows 程序後復原。",
185
- paneRecover: "復原已儲存的對話",
186
- paneRecoverConfirm: "復原 {0},不重送先前的輸入。請確認這個代理在 Windows 上的所有程序都已停止,再按「啟動」接續已儲存的對話。",
187
- paneProcessesStopped: "我已停止這個代理在 Windows 上的所有程序。",
188
- paneRecoverConfirmed: "已停止程序,復原對話",
189
- nativeComposerHint: "Enter 送出 · Shift+Enter 換行",
190
- nativeComposerHintTouch: "Return 換行 · 按「送出」傳送",
191
- machineOffline: "電腦離線",
192
- machineRevoked: "連線已撤銷",
193
- machineRevokedHint: "{0} 的 Runtime 存取權已撤銷,輸入與對話會保留。請前往設定 → Runtime 檢查。",
194
- machineUnavailable: "{0} 的 Runtime 尚未連線,輸入內容會保留。請先恢復連線再傳送。",
195
- machineName: "電腦:{0}",
196
150
  waking: "正在喚醒 {0}…", retrySend: "重試傳送",
197
151
  you: "你", sending: "傳送中…", uploadingFile: "正在上傳 {0}", uploadWaiting: "等待中", uploadFailed: "失敗",
198
152
  uploadNoConnection: "上傳中斷了,請檢查網路連線", sendNoConnection: "沒有送到 AgEnD,請檢查網路連線", notSentBecause: "沒有送出:{0}", deleteUnsent: "刪除",
@@ -201,8 +155,6 @@ register("chat", {
201
155
  sendFailure_wake_timeout: "實例未能及時就緒。請重試,或在主機檢查它的狀態。",
202
156
  sendFailure_instance_stopped: "這個實例已停止或移除。請先在主機啟動它,再重試。",
203
157
  sendFailure_delivery_unavailable: "實例目前無法接收這則訊息。請在主機檢查它的狀態,再重試。",
204
- sendFailure_machine_limit: "這台 Windows 電腦同時執行的 agent 已達上限 {0} 個:{1}。請先停止其中一個(或檢查並解鎖標示「結果未知」的那個),再重試。",
205
- machineLimitUnknown: "{0}(結果未知)",
206
158
  sendFailure_delivery_changed: "訊息送出前,登入或實例狀態已改變。必要時請重新登入,再重試。",
207
159
  sendFailure_reply_gone: "你回覆的訊息已不在這個聊天裡。內容還在:可以不帶回覆直接送出,或改回覆其他訊息。",
208
160
  reply: "回覆", replyingTo: "回覆 {0}", replyCancel: "取消回覆(Esc)", replyHidden: "之前的一則訊息", replyPhoto: "[圖片]", replyFile: "[檔案]",
@@ -307,7 +259,7 @@ register("chat", {
307
259
  pick: "選一個 Agent 開始聊天。", noAgents: "先建立一個 Agent,再開始聊天。", newAgent: "新增 Agent", notFound: "沒有叫「{0}」的 instance", notFoundHint: "它可能已被刪除或改名。", backToList: "選擇 Agent",
308
260
  details: "Instance 詳細資料", fullWidth: "全寬", start: "啟動 instance", stopInstance: "停止 instance", restart: "重新啟動 instance", delete: "刪除 instance…",
309
261
  started: "{0} 已啟動", stoppedInst: "{0} 已停止", restarted: "{0} 已重新啟動", instanceDeleted: "{0} 已刪除",
310
- deleteTitle: "要刪除 {0} 嗎?", deleteHelp: "這會把 instance 從 fleet 移除並停止它,工作目錄會保留。請輸入「delete {0}」確認。", deleteGo: "刪除", cancel: "取消",
262
+ deleteTitle: "要刪除 {0} 嗎?", deleteHelp: "這會把 instance 從 fleet 移除並停止它,並刪除它的聊天 topic(在 Discord 上是它的頻道與訊息記錄)。工作目錄會保留。請輸入「delete {0}」確認。", deleteGo: "刪除", cancel: "取消",
311
263
  loadFailed: "載入失敗", tour: "聊天導覽", tourBtnTitle: "在 Agent 的聊天上開啟聊天導覽", tourNoAgent: "請先選一個 Agent,再開啟聊天導覽。",
312
264
  dName: "名稱", dStatus: "狀態", dDisplay: "顯示名稱", dDescription: "說明", dDirectory: "目錄", dBackend: "Backend", dModel: "模型", dEffort: "Effort",
313
265
  dCost: "花費", dCostNote: "(本次 session 累計)", dContext: "Context", dRate5: "5 小時額度", dRate7: "7 天額度", dActivity: "最近活動", dInstance: "Instance", dRuntime: "執行環境",
@@ -45,6 +45,47 @@ const COPY = '<svg class="icon" width="14" height="14" viewBox="0 0 24 24" fill=
45
45
  /** Escapes & " ' < >: safe for text and inside a quoted attribute. */
46
46
  export function escAttr(s) { return String(s == null ? "" : s).replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/</g, "&lt;").replace(/>/g, "&gt;"); }
47
47
  export const msgKey = (x) => `${x.boot}-${x.id}`;
48
+ /** How many elements an HTML string would build: its opening tags (escaped text has none). */
49
+ function tagsIn(html) {
50
+ let n = 0;
51
+ for (let i = html.indexOf("<"); i !== -1; i = html.indexOf("<", i + 1)) { const c = html.charCodeAt(i + 1); if ((c | 32) >= 97 && (c | 32) <= 122) n++; }
52
+ return n;
53
+ }
54
+ /**
55
+ * M-2448: a Markdown file drawn into `el` for the side panel — renderMarkdown, which escapes first (no raw HTML, no
56
+ * script: the same renderer and the same output as the chat's Markdown card), or the text as plain text when its
57
+ * formatting would build more than TEXT_PREVIEW_NODES elements. This module is the one that writes rendered Markdown
58
+ * (web-csp-1268); the panel asks it. Returns "md" or "plain".
59
+ */
60
+ export function drawMarkdown(el, src) {
61
+ const doc = el.ownerDocument;
62
+ el.textContent = "";
63
+ const html = globalThis.AgendChatRender.renderMarkdown(String(src));
64
+ // Each code block gains three elements below (its frame, head and label): counted before anything is built.
65
+ const pres = (html.match(/<pre[\s>]/g) || []).length;
66
+ if (tagsIn(html) + 3 * pres > TEXT_PREVIEW_NODES) {
67
+ const pre = doc.createElement("pre"), code = doc.createElement("code");
68
+ pre.className = "tc-pre"; code.textContent = String(src); pre.append(code); el.append(pre);
69
+ return "plain";
70
+ }
71
+ // Inside the chat's own message container, so the chat's Markdown look applies as it is (lists, links, tables, code)
72
+ // — also with a stylesheet from before this panel existed.
73
+ const msg = doc.createElement("div"), md = doc.createElement("div");
74
+ msg.className = "msg pv-md-msg";
75
+ md.className = "md";
76
+ md.innerHTML = html;
77
+ // Code blocks in the chat's frame, with their language (the thread's Wrap/Copy controls belong to the thread).
78
+ for (const pre of md.querySelectorAll("pre")) {
79
+ const box = doc.createElement("div"), head = doc.createElement("div"), lang = doc.createElement("span");
80
+ box.className = "codeblock"; head.className = "cb-head"; lang.className = "cb-lang";
81
+ lang.textContent = pre.dataset.lang || "text";
82
+ head.append(lang);
83
+ pre.replaceWith(box); box.append(head, pre);
84
+ }
85
+ msg.append(md);
86
+ el.append(msg);
87
+ return "md";
88
+ }
48
89
  /**
49
90
  * Board 00ef2430: a thread opens with only its newest messages drawn — enough for a screen — so switching chats paints
50
91
  * at once; the older ones are drawn after that, a chunk at a time between frames, the reader's place kept.
@@ -365,10 +406,10 @@ export function createThread(list, scroller, opts) {
365
406
  const att = atts.find(a => a && a.id === ph.dataset.att);
366
407
  const type = att ? R().attachmentPreviewType(att) : null;
367
408
  if (!att || !type || type !== ph.dataset.type) continue;
368
- buildTextCard(ph, att, type);
409
+ buildTextCard(ph, att, type, x);
369
410
  }
370
411
  }
371
- function buildTextCard(ph, att, type) {
412
+ function buildTextCard(ph, att, type, x) {
372
413
  const doc = list.ownerDocument;
373
414
  const el = (tag, cls, text) => { const e = doc.createElement(tag); if (cls) e.className = cls; if (text != null) e.textContent = text; return e; };
374
415
  ph.textContent = "";
@@ -376,7 +417,16 @@ export function createThread(list, scroller, opts) {
376
417
  const label = el("span", "tc-label", att.name);
377
418
  const show = el("button", "btn btn-sm tc-show", tr("chat.tcShow")); show.type = "button";
378
419
  const dl = el("a", "btn btn-sm tc-dl", tr("chat.tcDownload")); dl.href = `/ui/file/${att.id}`; dl.setAttribute("download", att.name);
379
- head.append(label, show, dl);
420
+ head.append(label, show);
421
+ // M-2448: a Markdown file opens in the side panel too (the panel reads it, or takes what Show already read).
422
+ const panel = opts.panel || null;
423
+ if (type === "md" && panel && typeof panel.openMarkdown === "function" && x) {
424
+ const toPanel = el("button", "btn btn-sm btn-ghost tc-panel", tr("chat.pvOpenPanel")); toPanel.type = "button";
425
+ toPanel.onclick = () => panel.openMarkdown({ key: `${msgKey(x)}:m${att.id}`, instance: x.instance, msgKey: msgKey(x),
426
+ att: { id: att.id, name: att.name, size: att.size }, sender: x.sender, ts: x.ts, ...(text !== null ? { text } : {}) });
427
+ head.append(toPanel);
428
+ }
429
+ head.append(dl);
380
430
  const note = el("div", "pv-note"); note.setAttribute("data-trust", "thread-control");
381
431
  const body = el("div", "tc-body"); body.hidden = true;
382
432
  ph.append(head, note, body);
@@ -8,7 +8,7 @@ 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
12
 
13
13
  register("taskcard", {
14
14
  en: {
@@ -85,7 +85,7 @@ const fieldName = (k) => { const key = `taskcard.f${k[0].toUpperCase()}${k.slice
85
85
  * `writable`: false over the public link (the card is shown, nothing on it changes). `place`: up and down in its column,
86
86
  * for touch and keyboard (null when it cannot move).
87
87
  */
88
- export function CardDialog({ id, tick, projects, writable = true, place = null, onClose, onOpen, reloadBoard }) {
88
+ export function CardDialog({ id, tick, projects, boardOff = [], writable = true, place = null, onClose, onOpen, reloadBoard }) {
89
89
  const { instances } = useStore(appStore);
90
90
  const [detail, setDetail] = useState(null);
91
91
  const [missing, setMissing] = useState(false);
@@ -199,7 +199,7 @@ export function CardDialog({ id, tick, projects, writable = true, place = null,
199
199
  ${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
200
  <option value="\u0000pick" disabled hidden>${t("taskcard.change")}</option>
201
201
  ${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>`)}
202
+ ${names.filter((n) => n !== card.assignee).map((n) => html`<${AssigneeOption} key=${n} name=${n} boardOff=${boardOff} />`)}
203
203
  <option value="\u0000other">${t("taskcard.other")}</option>
204
204
  </select>` : null}</dd>
205
205
  ${isMain && children.length ? html`<dt>${t("taskcard.now")}</dt><dd>${(() => {
@@ -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",
@@ -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) {
@@ -15,7 +15,7 @@ import { Empty, ErrorState, Skeleton } from "/assets/ui-states.js";
15
15
  import { Icon } from "/assets/ui-icons.js";
16
16
  import { Menu } from "/assets/ui-menu.js";
17
17
  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";
18
+ import { AskHost, AssigneeOption, 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
19
  import { CardDialog } from "./fleet-task-card.js";
20
20
  import { InstancesDrawer } from "./fleet-task-work.js";
21
21
 
@@ -107,6 +107,8 @@ export function TaskBoardTab({ lease }) {
107
107
  const projects = Array.isArray(state.data.projects) ? state.data.projects : [];
108
108
  // #2355 review: the names a project's lead may be, as the server accepts them (the fleet's instances).
109
109
  const leads = Array.isArray(state.data.leads) ? state.data.leads : [];
110
+ // The instances with the task board switched off: the board hands them no cards, so the pickers do not offer them.
111
+ const boardOff = Array.isArray(state.data.boardOff) ? state.data.boardOff : [];
110
112
  // The server's numbers cover every card (finished ones are not all on the board); computed here only without them.
111
113
  const stats = (key) => (state.data.stats && state.data.stats[String(key)]) || projectStats(key, cards);
112
114
  const project = at === null ? null : at === NO_PROJECT ? NO_PROJECT : projects.find((p) => p.id === at) || null;
@@ -117,9 +119,9 @@ export function TaskBoardTab({ lease }) {
117
119
  return html`<div class="tb">
118
120
  ${writable ? null : html`<p class="tb-readonly" role="note"><${Icon} name="eye" size=${16} />${t("tasks.readOnly")}</p>`}
119
121
  ${body}
120
- ${openId ? html`<${CardDialog} key=${openId} id=${openId} tick=${tick} projects=${projects} writable=${writable} place=${writable ? placeOf(cards, openId, reload) : null}
122
+ ${openId ? html`<${CardDialog} key=${openId} id=${openId} tick=${tick} projects=${projects} boardOff=${boardOff} writable=${writable} place=${writable ? placeOf(cards, openId, reload) : null}
121
123
  onClose=${closeCard} onOpen=${openCard} reloadBoard=${reload} />` : null}
122
- ${dialog && dialog.kind === "main" ? html`<${CreateMainDialog} projects=${projects} project=${dialog.project} onClose=${() => setDialog(null)}
124
+ ${dialog && dialog.kind === "main" ? html`<${CreateMainDialog} projects=${projects} project=${dialog.project} boardOff=${boardOff} onClose=${() => setDialog(null)}
123
125
  onCreated=${(id) => { if (!lease.current()) return; setDialog(null); reload(); openCard(id); }} />` : null}
124
126
  ${dialog && dialog.kind === "instances" ? html`<${InstancesDrawer} tick=${tick} onClose=${() => setDialog(null)} onOpen=${(id) => { setDialog(null); openCard(id); }} />` : null}
125
127
  ${dialog && dialog.kind === "project" ? html`<${ProjectDialog} project=${dialog.project} leads=${leads} onClose=${() => setDialog(null)}
@@ -471,7 +473,7 @@ function Tile({ card, dragging, flash, subs = [], expanded, writable, onToggleSu
471
473
 
472
474
  // ── Dialogs: a new main task, a project ───────────────────
473
475
 
474
- function CreateMainDialog({ projects, project, onClose, onCreated }) {
476
+ function CreateMainDialog({ projects, project, boardOff = [], onClose, onCreated }) {
475
477
  const { instances } = useStore(appStore);
476
478
  const active = projects.filter((p) => !p.archived);
477
479
  const [f, setF] = useState({ project: project === null || project === undefined ? "" : String(project), title: "", goal: "", scope: "", acceptance: "", context: "", size: "", priority: "normal", assignee: "", needsReview: true });
@@ -502,7 +504,7 @@ function CreateMainDialog({ projects, project, onClose, onCreated }) {
502
504
  ${field(t("tasks.definition"), html`<textarea rows="3" placeholder=${t("tasks.definitionHint")} value=${f.acceptance} onInput=${set("acceptance")}></textarea>`)}
503
505
  ${field(t("tasks.context"), html`<textarea rows="2" maxlength="1000" placeholder=${t("tasks.contextHint")} value=${f.context} onInput=${set("context")}></textarea>`)}
504
506
  <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>`)}
507
+ ${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
508
  ${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
509
  ${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
510
  </div>