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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (838) hide show
  1. package/THIRD_PARTY_NOTICES.md +52 -0
  2. package/dist/accounts-view.d.ts +97 -0
  3. package/dist/accounts-view.js +116 -0
  4. package/dist/accounts-view.js.map +1 -0
  5. package/dist/agent-cli-instructions.md +1 -1
  6. package/dist/agent-credentials.d.ts +24 -0
  7. package/dist/agent-credentials.js +66 -0
  8. package/dist/agent-credentials.js.map +1 -0
  9. package/dist/agent-endpoint.d.ts +3 -1
  10. package/dist/agent-endpoint.js +13 -0
  11. package/dist/agent-endpoint.js.map +1 -1
  12. package/dist/agent-file-read.js +1 -1
  13. package/dist/agent-file-read.js.map +1 -1
  14. package/dist/agent-runtime-change.d.ts +3 -1
  15. package/dist/agent-runtime-change.js +15 -3
  16. package/dist/agent-runtime-change.js.map +1 -1
  17. package/dist/agent-workspace.d.ts +93 -0
  18. package/dist/agent-workspace.js +353 -0
  19. package/dist/agent-workspace.js.map +1 -0
  20. package/dist/auth-api.d.ts +27 -0
  21. package/dist/auth-api.js +164 -3
  22. package/dist/auth-api.js.map +1 -1
  23. package/dist/authority/session-authorizations.d.ts +28 -4
  24. package/dist/authority/session-authorizations.js +63 -17
  25. package/dist/authority/session-authorizations.js.map +1 -1
  26. package/dist/backend/antigravity.js +3 -1
  27. package/dist/backend/antigravity.js.map +1 -1
  28. package/dist/backend/codex-footer-hints.d.ts +3 -0
  29. package/dist/backend/codex-footer-hints.js +14 -0
  30. package/dist/backend/codex-footer-hints.js.map +1 -1
  31. package/dist/backend/codex-metadata.d.ts +14 -0
  32. package/dist/backend/codex-metadata.js +45 -0
  33. package/dist/backend/codex-metadata.js.map +1 -1
  34. package/dist/backend/codex-quota-history.d.ts +7 -0
  35. package/dist/backend/codex-quota-history.js +57 -0
  36. package/dist/backend/codex-quota-history.js.map +1 -0
  37. package/dist/backend/codex-session-lookup.d.ts +6 -0
  38. package/dist/backend/codex-session-lookup.js +1 -1
  39. package/dist/backend/codex-session-lookup.js.map +1 -1
  40. package/dist/backend/codex-speed.d.ts +14 -0
  41. package/dist/backend/codex-speed.js +35 -0
  42. package/dist/backend/codex-speed.js.map +1 -0
  43. package/dist/backend/codex.d.ts +7 -0
  44. package/dist/backend/codex.js +78 -15
  45. package/dist/backend/codex.js.map +1 -1
  46. package/dist/backend/grok-weekly-reset.d.ts +24 -0
  47. package/dist/backend/grok-weekly-reset.js +95 -0
  48. package/dist/backend/grok-weekly-reset.js.map +1 -0
  49. package/dist/backend/grok.d.ts +30 -1
  50. package/dist/backend/grok.js +301 -54
  51. package/dist/backend/grok.js.map +1 -1
  52. package/dist/backend/kiro.d.ts +3 -0
  53. package/dist/backend/kiro.js +50 -2
  54. package/dist/backend/kiro.js.map +1 -1
  55. package/dist/backend/muse.js +5 -3
  56. package/dist/backend/muse.js.map +1 -1
  57. package/dist/backend/native-pane.d.ts +3 -1
  58. package/dist/backend/native-pane.js +2 -2
  59. package/dist/backend/native-pane.js.map +1 -1
  60. package/dist/backend/types.d.ts +13 -1
  61. package/dist/backend/types.js +3 -0
  62. package/dist/backend/types.js.map +1 -1
  63. package/dist/build-provenance-cli.d.ts +3 -0
  64. package/dist/build-provenance-cli.js +11 -0
  65. package/dist/build-provenance-cli.js.map +1 -0
  66. package/dist/build-provenance.d.ts +20 -0
  67. package/dist/build-provenance.js +67 -0
  68. package/dist/build-provenance.js.map +1 -0
  69. package/dist/build-provenance.json +1 -0
  70. package/dist/cache-ledger.d.ts +95 -0
  71. package/dist/cache-ledger.js +276 -4
  72. package/dist/cache-ledger.js.map +1 -1
  73. package/dist/cache-service.d.ts +5 -0
  74. package/dist/cache-service.js +16 -4
  75. package/dist/cache-service.js.map +1 -1
  76. package/dist/channel/adapters/discord.js +11 -3
  77. package/dist/channel/adapters/discord.js.map +1 -1
  78. package/dist/channel/adapters/telegram.d.ts +51 -0
  79. package/dist/channel/adapters/telegram.js +235 -17
  80. package/dist/channel/adapters/telegram.js.map +1 -1
  81. package/dist/channel/mcp-tools.js +3 -3
  82. package/dist/channel/mcp-tools.js.map +1 -1
  83. package/dist/channel/types.d.ts +2 -0
  84. package/dist/claude-auth-status.d.ts +48 -0
  85. package/dist/claude-auth-status.js +149 -0
  86. package/dist/claude-auth-status.js.map +1 -0
  87. package/dist/cli.js +138 -37
  88. package/dist/cli.js.map +1 -1
  89. package/dist/config-validator.js +21 -1
  90. package/dist/config-validator.js.map +1 -1
  91. package/dist/cross-instance-notice.d.ts +10 -0
  92. package/dist/cross-instance-notice.js +67 -5
  93. package/dist/cross-instance-notice.js.map +1 -1
  94. package/dist/daemon.d.ts +70 -1
  95. package/dist/daemon.js +547 -25
  96. package/dist/daemon.js.map +1 -1
  97. package/dist/dashboard-permissions.d.ts +8 -0
  98. package/dist/dashboard-permissions.js +16 -0
  99. package/dist/dashboard-permissions.js.map +1 -1
  100. package/dist/delivery-consumed-watch.d.ts +23 -1
  101. package/dist/delivery-consumed-watch.js +30 -3
  102. package/dist/delivery-consumed-watch.js.map +1 -1
  103. package/dist/delivery-reconciliation.d.ts +1 -1
  104. package/dist/delivery-reconciliation.js +1 -1
  105. package/dist/delivery-reconciliation.js.map +1 -1
  106. package/dist/doctor.js +20 -9
  107. package/dist/doctor.js.map +1 -1
  108. package/dist/export-import.d.ts +7 -0
  109. package/dist/export-import.js +44 -10
  110. package/dist/export-import.js.map +1 -1
  111. package/dist/fleet-context.d.ts +2 -0
  112. package/dist/fleet-manager.d.ts +359 -7
  113. package/dist/fleet-manager.js +1365 -90
  114. package/dist/fleet-manager.js.map +1 -1
  115. package/dist/fleet-windows-runtime.d.ts +2 -1
  116. package/dist/fleet-windows-runtime.js +25 -7
  117. package/dist/fleet-windows-runtime.js.map +1 -1
  118. package/dist/general-knowledge/skills/concepts/SKILL.md +425 -0
  119. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +5 -2
  120. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +1 -0
  121. package/dist/general-knowledge/skills/fleet-health/SKILL.md +2 -2
  122. package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -1
  123. package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +41 -4
  124. package/dist/general-knowledge/skills/session-management/SKILL.md +1 -1
  125. package/dist/general-knowledge/skills/tui-effort/SKILL.md +10 -10
  126. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +31 -15
  127. package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
  128. package/dist/general-role.d.ts +1 -1
  129. package/dist/general-role.js +1 -0
  130. package/dist/general-role.js.map +1 -1
  131. package/dist/hub/admission.d.ts +28 -0
  132. package/dist/hub/admission.js +62 -0
  133. package/dist/hub/admission.js.map +1 -0
  134. package/dist/hub/attachments/limits.d.ts +20 -0
  135. package/dist/hub/attachments/limits.js +48 -0
  136. package/dist/hub/attachments/limits.js.map +1 -0
  137. package/dist/hub/attachments/store.d.ts +116 -0
  138. package/dist/hub/attachments/store.js +246 -0
  139. package/dist/hub/attachments/store.js.map +1 -0
  140. package/dist/hub/audit/index.d.ts +62 -0
  141. package/dist/hub/audit/index.js +344 -0
  142. package/dist/hub/audit/index.js.map +1 -0
  143. package/dist/hub/browser-certificate.d.ts +38 -0
  144. package/dist/hub/browser-certificate.js +247 -0
  145. package/dist/hub/browser-certificate.js.map +1 -0
  146. package/dist/hub/buttons-model.d.ts +9 -0
  147. package/dist/hub/buttons-model.js +42 -0
  148. package/dist/hub/buttons-model.js.map +1 -0
  149. package/dist/hub/buttons.d.ts +54 -0
  150. package/dist/hub/buttons.js +346 -0
  151. package/dist/hub/buttons.js.map +1 -0
  152. package/dist/hub/catalog.d.ts +74 -0
  153. package/dist/hub/catalog.js +195 -0
  154. package/dist/hub/catalog.js.map +1 -0
  155. package/dist/hub/client.d.ts +69 -0
  156. package/dist/hub/client.js +300 -0
  157. package/dist/hub/client.js.map +1 -0
  158. package/dist/hub/compose/member.d.ts +139 -0
  159. package/dist/hub/compose/member.js +450 -0
  160. package/dist/hub/compose/member.js.map +1 -0
  161. package/dist/hub/compose/server.d.ts +77 -0
  162. package/dist/hub/compose/server.js +349 -0
  163. package/dist/hub/compose/server.js.map +1 -0
  164. package/dist/hub/compose/views.d.ts +12 -0
  165. package/dist/hub/compose/views.js +4 -0
  166. package/dist/hub/compose/views.js.map +1 -0
  167. package/dist/hub/db.d.ts +56 -0
  168. package/dist/hub/db.js +188 -0
  169. package/dist/hub/db.js.map +1 -0
  170. package/dist/hub/directory/config.d.ts +39 -0
  171. package/dist/hub/directory/config.js +108 -0
  172. package/dist/hub/directory/config.js.map +1 -0
  173. package/dist/hub/directory/directory.d.ts +18 -0
  174. package/dist/hub/directory/directory.js +320 -0
  175. package/dist/hub/directory/directory.js.map +1 -0
  176. package/dist/hub/directory/index.d.ts +7 -0
  177. package/dist/hub/directory/index.js +4 -0
  178. package/dist/hub/directory/index.js.map +1 -0
  179. package/dist/hub/directory/profiles.d.ts +41 -0
  180. package/dist/hub/directory/profiles.js +90 -0
  181. package/dist/hub/directory/profiles.js.map +1 -0
  182. package/dist/hub/directory/types.d.ts +71 -0
  183. package/dist/hub/directory/types.js +14 -0
  184. package/dist/hub/directory/types.js.map +1 -0
  185. package/dist/hub/execution/cli-provider.d.ts +23 -0
  186. package/dist/hub/execution/cli-provider.js +341 -0
  187. package/dist/hub/execution/cli-provider.js.map +1 -0
  188. package/dist/hub/execution/index.d.ts +13 -0
  189. package/dist/hub/execution/index.js +8 -0
  190. package/dist/hub/execution/index.js.map +1 -0
  191. package/dist/hub/execution/model-broker.d.ts +24 -0
  192. package/dist/hub/execution/model-broker.js +208 -0
  193. package/dist/hub/execution/model-broker.js.map +1 -0
  194. package/dist/hub/execution/provider-setup.d.ts +11 -0
  195. package/dist/hub/execution/provider-setup.js +21 -0
  196. package/dist/hub/execution/provider-setup.js.map +1 -0
  197. package/dist/hub/execution/sandbox-runner.d.ts +1 -0
  198. package/dist/hub/execution/sandbox-runner.js +221 -0
  199. package/dist/hub/execution/sandbox-runner.js.map +1 -0
  200. package/dist/hub/execution/service.d.ts +136 -0
  201. package/dist/hub/execution/service.js +459 -0
  202. package/dist/hub/execution/service.js.map +1 -0
  203. package/dist/hub/execution/store.d.ts +61 -0
  204. package/dist/hub/execution/store.js +182 -0
  205. package/dist/hub/execution/store.js.map +1 -0
  206. package/dist/hub/execution/views.d.ts +20 -0
  207. package/dist/hub/execution/views.js +48 -0
  208. package/dist/hub/execution/views.js.map +1 -0
  209. package/dist/hub/http/compose.d.ts +20 -0
  210. package/dist/hub/http/compose.js +518 -0
  211. package/dist/hub/http/compose.js.map +1 -0
  212. package/dist/hub/http/core.d.ts +49 -0
  213. package/dist/hub/http/core.js +124 -0
  214. package/dist/hub/http/core.js.map +1 -0
  215. package/dist/hub/http/deps.d.ts +61 -0
  216. package/dist/hub/http/deps.js +2 -0
  217. package/dist/hub/http/deps.js.map +1 -0
  218. package/dist/hub/http/schema.d.ts +14 -0
  219. package/dist/hub/http/schema.js +80 -0
  220. package/dist/hub/http/schema.js.map +1 -0
  221. package/dist/hub/identity.d.ts +32 -0
  222. package/dist/hub/identity.js +80 -0
  223. package/dist/hub/identity.js.map +1 -0
  224. package/dist/hub/init/browser-certificate.d.ts +9 -0
  225. package/dist/hub/init/browser-certificate.js +78 -0
  226. package/dist/hub/init/browser-certificate.js.map +1 -0
  227. package/dist/hub/init/browser-tls.d.ts +18 -0
  228. package/dist/hub/init/browser-tls.js +62 -0
  229. package/dist/hub/init/browser-tls.js.map +1 -0
  230. package/dist/hub/init/cli.d.ts +3 -0
  231. package/dist/hub/init/cli.js +83 -0
  232. package/dist/hub/init/cli.js.map +1 -0
  233. package/dist/hub/init/directory-certificate.d.ts +24 -0
  234. package/dist/hub/init/directory-certificate.js +222 -0
  235. package/dist/hub/init/directory-certificate.js.map +1 -0
  236. package/dist/hub/init/existing-fleet.d.ts +6 -0
  237. package/dist/hub/init/existing-fleet.js +58 -0
  238. package/dist/hub/init/existing-fleet.js.map +1 -0
  239. package/dist/hub/init/handoff.d.ts +8 -0
  240. package/dist/hub/init/handoff.js +36 -0
  241. package/dist/hub/init/handoff.js.map +1 -0
  242. package/dist/hub/init/identity.d.ts +5 -0
  243. package/dist/hub/init/identity.js +24 -0
  244. package/dist/hub/init/identity.js.map +1 -0
  245. package/dist/hub/init/initializer.d.ts +24 -0
  246. package/dist/hub/init/initializer.js +385 -0
  247. package/dist/hub/init/initializer.js.map +1 -0
  248. package/dist/hub/init/inventory.d.ts +17 -0
  249. package/dist/hub/init/inventory.js +33 -0
  250. package/dist/hub/init/inventory.js.map +1 -0
  251. package/dist/hub/init/layout.d.ts +32 -0
  252. package/dist/hub/init/layout.js +53 -0
  253. package/dist/hub/init/layout.js.map +1 -0
  254. package/dist/hub/init/network.d.ts +18 -0
  255. package/dist/hub/init/network.js +104 -0
  256. package/dist/hub/init/network.js.map +1 -0
  257. package/dist/hub/init/plan-digest.d.ts +5 -0
  258. package/dist/hub/init/plan-digest.js +47 -0
  259. package/dist/hub/init/plan-digest.js.map +1 -0
  260. package/dist/hub/init/prompt.d.ts +26 -0
  261. package/dist/hub/init/prompt.js +110 -0
  262. package/dist/hub/init/prompt.js.map +1 -0
  263. package/dist/hub/init/secret-file.d.ts +1 -0
  264. package/dist/hub/init/secret-file.js +59 -0
  265. package/dist/hub/init/secret-file.js.map +1 -0
  266. package/dist/hub/init/text.d.ts +127 -0
  267. package/dist/hub/init/text.js +247 -0
  268. package/dist/hub/init/text.js.map +1 -0
  269. package/dist/hub/init/types.d.ts +114 -0
  270. package/dist/hub/init/types.js +9 -0
  271. package/dist/hub/init/types.js.map +1 -0
  272. package/dist/hub/init/wizard.d.ts +34 -0
  273. package/dist/hub/init/wizard.js +554 -0
  274. package/dist/hub/init/wizard.js.map +1 -0
  275. package/dist/hub/initialization.d.ts +23 -0
  276. package/dist/hub/initialization.js +28 -0
  277. package/dist/hub/initialization.js.map +1 -0
  278. package/dist/hub/member/agent-mode.d.ts +6 -0
  279. package/dist/hub/member/agent-mode.js +23 -0
  280. package/dist/hub/member/agent-mode.js.map +1 -0
  281. package/dist/hub/member/attachments.d.ts +29 -0
  282. package/dist/hub/member/attachments.js +107 -0
  283. package/dist/hub/member/attachments.js.map +1 -0
  284. package/dist/hub/member/exposure-api.d.ts +87 -0
  285. package/dist/hub/member/exposure-api.js +64 -0
  286. package/dist/hub/member/exposure-api.js.map +1 -0
  287. package/dist/hub/member/exposures.d.ts +123 -0
  288. package/dist/hub/member/exposures.js +282 -0
  289. package/dist/hub/member/exposures.js.map +1 -0
  290. package/dist/hub/member/pairing-api.d.ts +85 -0
  291. package/dist/hub/member/pairing-api.js +385 -0
  292. package/dist/hub/member/pairing-api.js.map +1 -0
  293. package/dist/hub/member/quota.d.ts +20 -0
  294. package/dist/hub/member/quota.js +98 -0
  295. package/dist/hub/member/quota.js.map +1 -0
  296. package/dist/hub/member-journal.d.ts +104 -0
  297. package/dist/hub/member-journal.js +336 -0
  298. package/dist/hub/member-journal.js.map +1 -0
  299. package/dist/hub/member-reconciliation.d.ts +14 -0
  300. package/dist/hub/member-reconciliation.js +97 -0
  301. package/dist/hub/member-reconciliation.js.map +1 -0
  302. package/dist/hub/mount.d.ts +39 -0
  303. package/dist/hub/mount.js +123 -0
  304. package/dist/hub/mount.js.map +1 -0
  305. package/dist/hub/pairing-client.d.ts +17 -0
  306. package/dist/hub/pairing-client.js +108 -0
  307. package/dist/hub/pairing-client.js.map +1 -0
  308. package/dist/hub/pairing.d.ts +65 -0
  309. package/dist/hub/pairing.js +211 -0
  310. package/dist/hub/pairing.js.map +1 -0
  311. package/dist/hub/policy.d.ts +63 -0
  312. package/dist/hub/policy.js +147 -0
  313. package/dist/hub/policy.js.map +1 -0
  314. package/dist/hub/preview.d.ts +32 -0
  315. package/dist/hub/preview.js +64 -0
  316. package/dist/hub/preview.js.map +1 -0
  317. package/dist/hub/private-files.d.ts +5 -0
  318. package/dist/hub/private-files.js +44 -0
  319. package/dist/hub/private-files.js.map +1 -0
  320. package/dist/hub/profile.d.ts +59 -0
  321. package/dist/hub/profile.js +73 -0
  322. package/dist/hub/profile.js.map +1 -0
  323. package/dist/hub/protocol.d.ts +779 -0
  324. package/dist/hub/protocol.js +93 -0
  325. package/dist/hub/protocol.js.map +1 -0
  326. package/dist/hub/quota.d.ts +24 -0
  327. package/dist/hub/quota.js +112 -0
  328. package/dist/hub/quota.js.map +1 -0
  329. package/dist/hub/representative.d.ts +141 -0
  330. package/dist/hub/representative.js +528 -0
  331. package/dist/hub/representative.js.map +1 -0
  332. package/dist/hub/retention.d.ts +17 -0
  333. package/dist/hub/retention.js +45 -0
  334. package/dist/hub/retention.js.map +1 -0
  335. package/dist/hub/rooms.d.ts +120 -0
  336. package/dist/hub/rooms.js +535 -0
  337. package/dist/hub/rooms.js.map +1 -0
  338. package/dist/hub/runtime.d.ts +106 -0
  339. package/dist/hub/runtime.js +298 -0
  340. package/dist/hub/runtime.js.map +1 -0
  341. package/dist/hub/server.d.ts +56 -0
  342. package/dist/hub/server.js +202 -0
  343. package/dist/hub/server.js.map +1 -0
  344. package/dist/hub/service-start.d.ts +17 -0
  345. package/dist/hub/service-start.js +109 -0
  346. package/dist/hub/service-start.js.map +1 -0
  347. package/dist/hub/sessions.d.ts +53 -0
  348. package/dist/hub/sessions.js +196 -0
  349. package/dist/hub/sessions.js.map +1 -0
  350. package/dist/hub/socket.d.ts +24 -0
  351. package/dist/hub/socket.js +79 -0
  352. package/dist/hub/socket.js.map +1 -0
  353. package/dist/hub/store.d.ts +77 -0
  354. package/dist/hub/store.js +88 -0
  355. package/dist/hub/store.js.map +1 -0
  356. package/dist/hub/tls.d.ts +31 -0
  357. package/dist/hub/tls.js +135 -0
  358. package/dist/hub/tls.js.map +1 -0
  359. package/dist/hub/types.d.ts +401 -0
  360. package/dist/hub/types.js +2 -0
  361. package/dist/hub/types.js.map +1 -0
  362. package/dist/hub/validation.d.ts +33 -0
  363. package/dist/hub/validation.js +136 -0
  364. package/dist/hub/validation.js.map +1 -0
  365. package/dist/hub/version-floor.d.ts +10 -0
  366. package/dist/hub/version-floor.js +45 -0
  367. package/dist/hub/version-floor.js.map +1 -0
  368. package/dist/hub-browser-certificate-policy.d.ts +31 -0
  369. package/dist/hub-browser-certificate-policy.js +25 -0
  370. package/dist/hub-browser-certificate-policy.js.map +1 -0
  371. package/dist/hub-membership-settings.d.ts +6 -0
  372. package/dist/hub-membership-settings.js +21 -0
  373. package/dist/hub-membership-settings.js.map +1 -0
  374. package/dist/hub-mode.d.ts +15 -0
  375. package/dist/hub-mode.js +17 -0
  376. package/dist/hub-mode.js.map +1 -0
  377. package/dist/hub-pairing-summary.d.ts +48 -0
  378. package/dist/hub-pairing-summary.js +36 -0
  379. package/dist/hub-pairing-summary.js.map +1 -0
  380. package/dist/hub-report-target.d.ts +32 -0
  381. package/dist/hub-report-target.js +33 -0
  382. package/dist/hub-report-target.js.map +1 -0
  383. package/dist/hub-retention-policy.d.ts +14 -0
  384. package/dist/hub-retention-policy.js +15 -0
  385. package/dist/hub-retention-policy.js.map +1 -0
  386. package/dist/instance-config-impact.js +3 -0
  387. package/dist/instance-config-impact.js.map +1 -1
  388. package/dist/instance-lifecycle.d.ts +17 -2
  389. package/dist/instance-lifecycle.js +58 -8
  390. package/dist/instance-lifecycle.js.map +1 -1
  391. package/dist/instance-topic-delete.d.ts +77 -0
  392. package/dist/instance-topic-delete.js +123 -0
  393. package/dist/instance-topic-delete.js.map +1 -0
  394. package/dist/instructions.d.ts +1 -1
  395. package/dist/instructions.js +1 -1
  396. package/dist/instructions.js.map +1 -1
  397. package/dist/kiro-engine-status.d.ts +11 -0
  398. package/dist/kiro-engine-status.js +6 -0
  399. package/dist/kiro-engine-status.js.map +1 -1
  400. package/dist/launchd-service-domain.d.ts +5 -0
  401. package/dist/launchd-service-domain.js +21 -0
  402. package/dist/launchd-service-domain.js.map +1 -0
  403. package/dist/locale.js +125 -3
  404. package/dist/locale.js.map +1 -1
  405. package/dist/log-service.d.ts +28 -0
  406. package/dist/log-service.js +29 -0
  407. package/dist/log-service.js.map +1 -1
  408. package/dist/log-steps.d.ts +4 -3
  409. package/dist/log-steps.js +32 -7
  410. package/dist/log-steps.js.map +1 -1
  411. package/dist/logger.d.ts +16 -2
  412. package/dist/logger.js +346 -66
  413. package/dist/logger.js.map +1 -1
  414. package/dist/login-flows.d.ts +15 -7
  415. package/dist/login-flows.js +29 -3
  416. package/dist/login-flows.js.map +1 -1
  417. package/dist/login-manager.js +25 -4
  418. package/dist/login-manager.js.map +1 -1
  419. package/dist/ls-rows.js +3 -4
  420. package/dist/ls-rows.js.map +1 -1
  421. package/dist/missed-offline.d.ts +25 -0
  422. package/dist/missed-offline.js +79 -0
  423. package/dist/missed-offline.js.map +1 -0
  424. package/dist/native-instance-api.d.ts +0 -1
  425. package/dist/native-instance-api.js +15 -3
  426. package/dist/native-instance-api.js.map +1 -1
  427. package/dist/native-instance-input.d.ts +3 -0
  428. package/dist/native-instance-input.js +6 -1
  429. package/dist/native-instance-input.js.map +1 -1
  430. package/dist/native-instance-registry.d.ts +6 -0
  431. package/dist/native-instance-registry.js +24 -0
  432. package/dist/native-instance-registry.js.map +1 -1
  433. package/dist/native-mcp.d.ts +3 -0
  434. package/dist/native-mcp.js +15 -2
  435. package/dist/native-mcp.js.map +1 -1
  436. package/dist/native-pane-lifecycle.d.ts +8 -0
  437. package/dist/native-pane-lifecycle.js +13 -4
  438. package/dist/native-pane-lifecycle.js.map +1 -1
  439. package/dist/native-pane-manager.js +17 -9
  440. package/dist/native-pane-manager.js.map +1 -1
  441. package/dist/needs-you-hub.d.ts +9 -1
  442. package/dist/needs-you-hub.js +46 -8
  443. package/dist/needs-you-hub.js.map +1 -1
  444. package/dist/needs-you.d.ts +47 -2
  445. package/dist/needs-you.js +31 -3
  446. package/dist/needs-you.js.map +1 -1
  447. package/dist/office-share-page.js +2 -2
  448. package/dist/office-share-page.js.map +1 -1
  449. package/dist/office-share.d.ts +11 -0
  450. package/dist/office-share.js +14 -0
  451. package/dist/office-share.js.map +1 -1
  452. package/dist/office-talk.d.ts +26 -0
  453. package/dist/office-talk.js +50 -0
  454. package/dist/office-talk.js.map +1 -0
  455. package/dist/outbound-handlers.d.ts +14 -0
  456. package/dist/outbound-handlers.js +49 -6
  457. package/dist/outbound-handlers.js.map +1 -1
  458. package/dist/outbound-schemas.d.ts +33 -1
  459. package/dist/outbound-schemas.js +29 -16
  460. package/dist/outbound-schemas.js.map +1 -1
  461. package/dist/pane-quota-history.d.ts +9 -0
  462. package/dist/pane-quota-history.js +67 -0
  463. package/dist/pane-quota-history.js.map +1 -0
  464. package/dist/pause-marker.d.ts +1 -1
  465. package/dist/pause-marker.js +1 -1
  466. package/dist/pause-marker.js.map +1 -1
  467. package/dist/platform-general.d.ts +46 -0
  468. package/dist/platform-general.js +91 -0
  469. package/dist/platform-general.js.map +1 -0
  470. package/dist/public-web-gateway.js +7 -0
  471. package/dist/public-web-gateway.js.map +1 -1
  472. package/dist/queued-handoffs.d.ts +33 -0
  473. package/dist/queued-handoffs.js +75 -0
  474. package/dist/queued-handoffs.js.map +1 -0
  475. package/dist/quickstart.d.ts +13 -0
  476. package/dist/quickstart.js +81 -5
  477. package/dist/quickstart.js.map +1 -1
  478. package/dist/quota-notice.d.ts +7 -0
  479. package/dist/quota-notice.js +40 -0
  480. package/dist/quota-notice.js.map +1 -1
  481. package/dist/reply-buttons-controller.js +10 -6
  482. package/dist/reply-buttons-controller.js.map +1 -1
  483. package/dist/reply-polls.d.ts +2 -2
  484. package/dist/reply-polls.js +3 -3
  485. package/dist/reply-polls.js.map +1 -1
  486. package/dist/runtime-api.d.ts +2 -0
  487. package/dist/runtime-api.js +25 -7
  488. package/dist/runtime-api.js.map +1 -1
  489. package/dist/runtime-build-info.js +5 -3
  490. package/dist/runtime-build-info.js.map +1 -1
  491. package/dist/runtime-bundle.d.ts +3 -0
  492. package/dist/runtime-bundle.js +3 -1
  493. package/dist/runtime-bundle.js.map +1 -1
  494. package/dist/runtime-cli.d.ts +8 -1
  495. package/dist/runtime-cli.js +127 -8
  496. package/dist/runtime-cli.js.map +1 -1
  497. package/dist/runtime-client-store.d.ts +7 -0
  498. package/dist/runtime-client-store.js +30 -2
  499. package/dist/runtime-client-store.js.map +1 -1
  500. package/dist/runtime-client.d.ts +63 -1
  501. package/dist/runtime-client.js +295 -21
  502. package/dist/runtime-client.js.map +1 -1
  503. package/dist/runtime-coordinator.d.ts +7 -0
  504. package/dist/runtime-coordinator.js +213 -35
  505. package/dist/runtime-coordinator.js.map +1 -1
  506. package/dist/runtime-credential-profiles.d.ts +78 -0
  507. package/dist/runtime-credential-profiles.js +280 -0
  508. package/dist/runtime-credential-profiles.js.map +1 -0
  509. package/dist/runtime-install.d.ts +50 -0
  510. package/dist/runtime-install.js +186 -0
  511. package/dist/runtime-install.js.map +1 -0
  512. package/dist/runtime-pane-assets.d.ts +1 -1
  513. package/dist/runtime-pane-assets.js +1 -1
  514. package/dist/runtime-pane-assets.js.map +1 -1
  515. package/dist/runtime-pane-codex-index.d.ts +10 -1
  516. package/dist/runtime-pane-codex-index.js +131 -27
  517. package/dist/runtime-pane-codex-index.js.map +1 -1
  518. package/dist/runtime-pane-host.d.ts +19 -0
  519. package/dist/runtime-pane-host.js +50 -7
  520. package/dist/runtime-pane-host.js.map +1 -1
  521. package/dist/runtime-pane-link.d.ts +7 -0
  522. package/dist/runtime-pane-link.js +93 -2
  523. package/dist/runtime-pane-link.js.map +1 -1
  524. package/dist/runtime-pane-mcp-relay.d.ts +1 -0
  525. package/dist/runtime-pane-mcp-relay.js +10 -0
  526. package/dist/runtime-pane-mcp-relay.js.map +1 -1
  527. package/dist/runtime-pane-mcp.d.ts +4 -0
  528. package/dist/runtime-pane-mcp.js +6 -3
  529. package/dist/runtime-pane-mcp.js.map +1 -1
  530. package/dist/runtime-pane-native.d.ts +32 -2
  531. package/dist/runtime-pane-native.js +55 -6
  532. package/dist/runtime-pane-native.js.map +1 -1
  533. package/dist/runtime-pane-port.d.ts +5 -0
  534. package/dist/runtime-pane-port.js +17 -1
  535. package/dist/runtime-pane-port.js.map +1 -1
  536. package/dist/runtime-pane-process.d.ts +1 -1
  537. package/dist/runtime-pane-process.js +11 -2
  538. package/dist/runtime-pane-process.js.map +1 -1
  539. package/dist/runtime-pane-protocol.d.ts +11 -1
  540. package/dist/runtime-pane-protocol.js +27 -5
  541. package/dist/runtime-pane-protocol.js.map +1 -1
  542. package/dist/runtime-pane-quota-history.d.ts +6 -0
  543. package/dist/runtime-pane-quota-history.js +44 -0
  544. package/dist/runtime-pane-quota-history.js.map +1 -0
  545. package/dist/runtime-pane-service.d.ts +5 -0
  546. package/dist/runtime-pane-service.js +47 -12
  547. package/dist/runtime-pane-service.js.map +1 -1
  548. package/dist/runtime-pane-transcript.d.ts +5 -0
  549. package/dist/runtime-pane-transcript.js +66 -5
  550. package/dist/runtime-pane-transcript.js.map +1 -1
  551. package/dist/runtime-pane-worker.js +19 -6
  552. package/dist/runtime-pane-worker.js.map +1 -1
  553. package/dist/runtime-protocol.d.ts +17 -2
  554. package/dist/runtime-protocol.js +12 -0
  555. package/dist/runtime-protocol.js.map +1 -1
  556. package/dist/runtime-update-activity.d.ts +21 -0
  557. package/dist/runtime-update-activity.js +51 -0
  558. package/dist/runtime-update-activity.js.map +1 -0
  559. package/dist/runtime-update-artifact.d.ts +31 -0
  560. package/dist/runtime-update-artifact.js +252 -0
  561. package/dist/runtime-update-artifact.js.map +1 -0
  562. package/dist/runtime-update-install.d.ts +31 -0
  563. package/dist/runtime-update-install.js +205 -0
  564. package/dist/runtime-update-install.js.map +1 -0
  565. package/dist/runtime-update-journal.d.ts +44 -0
  566. package/dist/runtime-update-journal.js +121 -0
  567. package/dist/runtime-update-journal.js.map +1 -0
  568. package/dist/runtime-update-lock.d.ts +48 -0
  569. package/dist/runtime-update-lock.js +217 -0
  570. package/dist/runtime-update-lock.js.map +1 -0
  571. package/dist/runtime-update-owners.d.ts +29 -0
  572. package/dist/runtime-update-owners.js +240 -0
  573. package/dist/runtime-update-owners.js.map +1 -0
  574. package/dist/runtime-update-protocol.d.ts +15 -0
  575. package/dist/runtime-update-protocol.js +13 -0
  576. package/dist/runtime-update-protocol.js.map +1 -0
  577. package/dist/runtime-windows-bridge.d.ts +2 -1
  578. package/dist/runtime-windows-bridge.js +11 -1
  579. package/dist/runtime-windows-bridge.js.map +1 -1
  580. package/dist/scheduler/db.d.ts +2 -1
  581. package/dist/scheduler/db.js +23 -9
  582. package/dist/scheduler/db.js.map +1 -1
  583. package/dist/scheduler/task-board-text.js +1 -1
  584. package/dist/scheduler/task-board-text.js.map +1 -1
  585. package/dist/scheduler/task-board.d.ts +13 -0
  586. package/dist/scheduler/task-board.js +28 -3
  587. package/dist/scheduler/task-board.js.map +1 -1
  588. package/dist/service-drain.d.ts +19 -0
  589. package/dist/service-drain.js +64 -0
  590. package/dist/service-drain.js.map +1 -0
  591. package/dist/service-installer.d.ts +7 -2
  592. package/dist/service-installer.js +13 -10
  593. package/dist/service-installer.js.map +1 -1
  594. package/dist/settings-api.d.ts +20 -0
  595. package/dist/settings-api.js +414 -4
  596. package/dist/settings-api.js.map +1 -1
  597. package/dist/settings-baseline.d.ts +6 -0
  598. package/dist/settings-baseline.js +3 -1
  599. package/dist/settings-baseline.js.map +1 -1
  600. package/dist/settings-change.js +29 -6
  601. package/dist/settings-change.js.map +1 -1
  602. package/dist/settings-effect.d.ts +13 -0
  603. package/dist/settings-effect.js +97 -0
  604. package/dist/settings-effect.js.map +1 -1
  605. package/dist/settings-http-confirmation.js +13 -1
  606. package/dist/settings-http-confirmation.js.map +1 -1
  607. package/dist/settings-instance-patch.js +27 -0
  608. package/dist/settings-instance-patch.js.map +1 -1
  609. package/dist/setup-wizard.js +6 -2
  610. package/dist/setup-wizard.js.map +1 -1
  611. package/dist/task-board-tool.d.ts +13 -1
  612. package/dist/task-board-tool.js +104 -4
  613. package/dist/task-board-tool.js.map +1 -1
  614. package/dist/task-board-waker.d.ts +6 -0
  615. package/dist/task-board-waker.js +4 -0
  616. package/dist/task-board-waker.js.map +1 -1
  617. package/dist/tmux-binary.d.ts +59 -0
  618. package/dist/tmux-binary.js +200 -0
  619. package/dist/tmux-binary.js.map +1 -0
  620. package/dist/tmux-control.js +4 -4
  621. package/dist/tmux-control.js.map +1 -1
  622. package/dist/tmux-exec-helper.js +32 -1
  623. package/dist/tmux-exec-helper.js.map +1 -1
  624. package/dist/tmux-manager.d.ts +1 -1
  625. package/dist/tmux-manager.js +45 -36
  626. package/dist/tmux-manager.js.map +1 -1
  627. package/dist/tmux-read.js +4 -3
  628. package/dist/tmux-read.js.map +1 -1
  629. package/dist/tool-permissions.d.ts +5 -2
  630. package/dist/tool-permissions.js +6 -5
  631. package/dist/tool-permissions.js.map +1 -1
  632. package/dist/tool-progress.d.ts +2 -0
  633. package/dist/tool-progress.js +19 -3
  634. package/dist/tool-progress.js.map +1 -1
  635. package/dist/topic-commands.js +10 -5
  636. package/dist/topic-commands.js.map +1 -1
  637. package/dist/transcript-monitor.d.ts +20 -0
  638. package/dist/transcript-monitor.js +47 -3
  639. package/dist/transcript-monitor.js.map +1 -1
  640. package/dist/transcript-needles.d.ts +7 -0
  641. package/dist/transcript-needles.js +9 -1
  642. package/dist/transcript-needles.js.map +1 -1
  643. package/dist/transcript-records.d.ts +1 -1
  644. package/dist/transcript-records.js +2 -1
  645. package/dist/transcript-records.js.map +1 -1
  646. package/dist/types.d.ts +6 -0
  647. package/dist/ui/account-identity.js +27 -0
  648. package/dist/ui/accounts-view.js +214 -0
  649. package/dist/ui/agent-runtime-settings.js +9 -8
  650. package/dist/ui/backend-signin.js +4 -1
  651. package/dist/ui/chat-ambient.js +1 -1
  652. package/dist/ui/chat-md-strings.js +3 -0
  653. package/dist/ui/chat-render.js +3 -670
  654. package/dist/ui/chat-store.js +1 -1
  655. package/dist/ui/chat-strings.js +3 -333
  656. package/dist/ui/chat-thread.js +3 -919
  657. package/dist/ui/chat-time.js +3 -80
  658. package/dist/ui/chat-tour.js +1 -1
  659. package/dist/ui/credential-profile-select.js +54 -0
  660. package/dist/ui/fleet-office-dialogue.d.ts +30 -0
  661. package/dist/ui/fleet-office-dialogue.js +382 -0
  662. package/dist/ui/fleet-office-pack.d.ts +9 -0
  663. package/dist/ui/fleet-office-pack.js +76 -4
  664. package/dist/ui/fleet-office-skin.js +23 -5
  665. package/dist/ui/fleet-office-store.js +5 -0
  666. package/dist/ui/fleet-office.js +173 -6
  667. package/dist/ui/fleet-task-card.js +10 -6
  668. package/dist/ui/fleet-task-common.js +12 -2
  669. package/dist/ui/fleet-task-menu.js +188 -0
  670. package/dist/ui/fleet-task-stats.js +124 -0
  671. package/dist/ui/fleet-task-view.js +340 -0
  672. package/dist/ui/fleet-tasks.js +131 -43
  673. package/dist/ui/fleet-usage.js +90 -27
  674. package/dist/ui/html-attachment.js +3 -40
  675. package/dist/ui/hub-agent-copy.js +23 -0
  676. package/dist/ui/hub-button-actions.js +65 -0
  677. package/dist/ui/hub-chat-store.js +158 -0
  678. package/dist/ui/hub-chat-strings.js +77 -0
  679. package/dist/ui/hub-client.js +329 -0
  680. package/dist/ui/hub-owner-strings.js +51 -0
  681. package/dist/ui/hub-provider-guidance.js +31 -0
  682. package/dist/ui/hub-quota.js +85 -0
  683. package/dist/ui/hub-strings.js +162 -0
  684. package/dist/ui/hub-switcher.js +27 -0
  685. package/dist/ui/native-pane-recovery.js +1 -1
  686. package/dist/ui/office-share-page.js +4 -2
  687. package/dist/ui/panel-chat.js +34 -48
  688. package/dist/ui/panel-details.js +1 -1
  689. package/dist/ui/panel-fleet.js +78 -10
  690. package/dist/ui/panel-hub.js +619 -0
  691. package/dist/ui/panel-log.js +2 -2
  692. package/dist/ui/panel-needs.js +24 -8
  693. package/dist/ui/panel-runtimes.js +114 -23
  694. package/dist/ui/panel-settings.js +69 -80
  695. package/dist/ui/panel-windows-cli.js +12 -2
  696. package/dist/ui/preview-pages.js +1 -1
  697. package/dist/ui/preview-panel.js +92 -6
  698. package/dist/ui/preview-versions.js +1 -1
  699. package/dist/ui/preview.js +3 -476
  700. package/dist/ui/runtime-commands.d.ts +4 -0
  701. package/dist/ui/runtime-commands.js +59 -0
  702. package/dist/ui/search-dialog.js +2 -0
  703. package/dist/ui/settings-access-strings.js +42 -0
  704. package/dist/ui/settings-build-version.js +35 -0
  705. package/dist/ui/settings-codex-copy.js +19 -0
  706. package/dist/ui/settings-devices.js +253 -0
  707. package/dist/ui/settings-dialogs.js +28 -7
  708. package/dist/ui/settings-hub-browser-certificate.js +74 -0
  709. package/dist/ui/settings-hub-membership.js +72 -0
  710. package/dist/ui/settings-hub-retention.js +52 -0
  711. package/dist/ui/settings-hub.js +196 -0
  712. package/dist/ui/settings-layout.js +8 -11
  713. package/dist/ui/settings-model.js +16 -2
  714. package/dist/ui/settings-outside.js +104 -38
  715. package/dist/ui/settings-registry.js +4 -1
  716. package/dist/ui/settings-shared-strings.js +143 -0
  717. package/dist/ui/settings-shared.js +345 -0
  718. package/dist/ui/settings-strings.js +10 -46
  719. package/dist/ui/settings-web-authority.js +5 -2
  720. package/dist/ui/shared/accounts.css +15 -0
  721. package/dist/ui/shared/app-i18n.js +2 -2
  722. package/dist/ui/shared/app-needs.js +1 -1
  723. package/dist/ui/shared/app-route.js +6 -1
  724. package/dist/ui/shared/app-session.js +6 -2
  725. package/dist/ui/shared/app-shell.js +64 -8
  726. package/dist/ui/shared/app.css +121 -30
  727. package/dist/ui/shared/app.js +12 -3
  728. package/dist/ui/shared/chat-composer.js +68 -0
  729. package/dist/ui/shared/chat-md-strings.js +9 -0
  730. package/dist/ui/shared/chat-render.js +682 -0
  731. package/dist/ui/shared/chat-strings.js +333 -0
  732. package/dist/ui/shared/chat-thread.js +969 -0
  733. package/dist/ui/shared/chat-time.js +80 -0
  734. package/dist/ui/shared/header-tools.js +3 -5
  735. package/dist/ui/shared/html-attachment.js +42 -0
  736. package/dist/ui/shared/hub-chat.css +85 -0
  737. package/dist/ui/shared/hub-owner.css +33 -0
  738. package/dist/ui/shared/hub-quota.css +8 -0
  739. package/dist/ui/shared/hub.css +71 -0
  740. package/dist/ui/shared/page-head.js +8 -0
  741. package/dist/ui/shared/panel-view.js +77 -4
  742. package/dist/ui/shared/preview.js +476 -0
  743. package/dist/ui/shared/runtime-install.css +26 -0
  744. package/dist/ui/shared/side-rail.js +15 -0
  745. package/dist/ui/shared/signin.js +172 -0
  746. package/dist/ui/shared/task-board.css +95 -0
  747. package/dist/ui/shared/usage-dialog.js +18 -1
  748. package/dist/ui/shared/view-history.css +17 -0
  749. package/dist/ui/shared/view-history.js +438 -0
  750. package/dist/ui/shared/view-strings.js +16 -0
  751. package/dist/ui/shared/workspace.css +20 -0
  752. package/dist/ui/signin.html +21 -0
  753. package/dist/ui/workspace-panel.js +189 -0
  754. package/dist/ui/workspace-strings.js +35 -0
  755. package/dist/unattended-install.d.ts +11 -2
  756. package/dist/unattended-install.js +41 -6
  757. package/dist/unattended-install.js.map +1 -1
  758. package/dist/usage/capacity.d.ts +69 -0
  759. package/dist/usage/capacity.js +119 -0
  760. package/dist/usage/capacity.js.map +1 -0
  761. package/dist/usage/i18n-keys.d.ts +1 -1
  762. package/dist/usage/i18n-keys.js +3 -0
  763. package/dist/usage/i18n-keys.js.map +1 -1
  764. package/dist/usage/profile-timeline.d.ts +16 -0
  765. package/dist/usage/profile-timeline.js +58 -0
  766. package/dist/usage/profile-timeline.js.map +1 -0
  767. package/dist/usage/providers.js +2 -1
  768. package/dist/usage/providers.js.map +1 -1
  769. package/dist/usage/quota-history.d.ts +43 -0
  770. package/dist/usage/quota-history.js +168 -0
  771. package/dist/usage/quota-history.js.map +1 -0
  772. package/dist/usage/usage-api.d.ts +31 -0
  773. package/dist/usage/usage-api.js +80 -1
  774. package/dist/usage/usage-api.js.map +1 -1
  775. package/dist/usage-report.d.ts +25 -1
  776. package/dist/usage-report.js +55 -4
  777. package/dist/usage-report.js.map +1 -1
  778. package/dist/usage-rollup.d.ts +6 -1
  779. package/dist/usage-rollup.js +16 -4
  780. package/dist/usage-rollup.js.map +1 -1
  781. package/dist/view-api.d.ts +16 -0
  782. package/dist/view-api.js +105 -23
  783. package/dist/view-api.js.map +1 -1
  784. package/dist/view-history.d.ts +84 -0
  785. package/dist/view-history.js +116 -0
  786. package/dist/view-history.js.map +1 -0
  787. package/dist/web-api.d.ts +48 -2
  788. package/dist/web-api.js +276 -8
  789. package/dist/web-api.js.map +1 -1
  790. package/dist/web-backend-login.d.ts +23 -1
  791. package/dist/web-backend-login.js +11 -17
  792. package/dist/web-backend-login.js.map +1 -1
  793. package/dist/web-device-login.d.ts +153 -0
  794. package/dist/web-device-login.js +278 -0
  795. package/dist/web-device-login.js.map +1 -0
  796. package/dist/web-office-skins.d.ts +9 -0
  797. package/dist/web-office-skins.js +16 -1
  798. package/dist/web-office-skins.js.map +1 -1
  799. package/dist/web-session-authorization.d.ts +13 -2
  800. package/dist/web-session-authorization.js +10 -3
  801. package/dist/web-session-authorization.js.map +1 -1
  802. package/dist/web-session.d.ts +35 -0
  803. package/dist/web-session.js +7 -0
  804. package/dist/web-session.js.map +1 -1
  805. package/dist/web-settings-patch.d.ts +3 -1
  806. package/dist/web-settings-patch.js +4 -1
  807. package/dist/web-settings-patch.js.map +1 -1
  808. package/dist/web-shell-routes.d.ts +6 -0
  809. package/dist/web-shell-routes.js +7 -0
  810. package/dist/web-shell-routes.js.map +1 -1
  811. package/dist/web-terminal.d.ts +4 -30
  812. package/dist/web-terminal.js +9 -6
  813. package/dist/web-terminal.js.map +1 -1
  814. package/dist/windows-agents.d.ts +1 -0
  815. package/dist/windows-agents.js +1 -0
  816. package/dist/windows-agents.js.map +1 -1
  817. package/dist/windows-cli-api.d.ts +12 -1
  818. package/dist/windows-cli-api.js +27 -1
  819. package/dist/windows-cli-api.js.map +1 -1
  820. package/dist/windows-cli-providers.d.ts +0 -9
  821. package/dist/windows-cli-providers.js +4 -9
  822. package/dist/windows-cli-providers.js.map +1 -1
  823. package/dist/windows-cli-worker.d.ts +24 -0
  824. package/dist/windows-cli-worker.js +96 -5
  825. package/dist/windows-cli-worker.js.map +1 -1
  826. package/dist/windows-cli.d.ts +10 -0
  827. package/dist/windows-cli.js +10 -1
  828. package/dist/windows-cli.js.map +1 -1
  829. package/dist/yaml-shared-nodes.js +8 -3
  830. package/dist/yaml-shared-nodes.js.map +1 -1
  831. package/launcher/agend-install.cjs +8 -1
  832. package/launcher/launchd-session-type.cjs +14 -0
  833. package/launcher/postinstall.cjs +27 -2
  834. package/launcher/private-home.cjs +1 -1
  835. package/launcher/tmux-bundle.cjs +247 -0
  836. package/package.json +3 -2
  837. package/templates/launchd.plist.ejs +3 -1
  838. package/templates/runtime-install/install.ps1 +270 -0
@@ -1,3 +1,4 @@
1
+ import { SettingsBuildVersion } from "./settings-build-version.js";
1
2
  // #1408 step 3: the Settings panel (/settings[/<section>]) — agents, connections, ClassicBot rooms, general defaults,
2
3
  // the developer YAML. Behind the session gate (/ui/js/), loaded the first time it is opened.
3
4
  //
@@ -25,18 +26,21 @@ import { Menu } from "/assets/ui-menu.js";
25
26
  import { toast } from "/assets/ui-toast.js";
26
27
  import { GroupMark, groupLabel, groupOf as navGroupOf, modelText } from "/assets/instance-nav.js";
27
28
  import "./settings-strings.js";
29
+ import "./settings-shared-strings.js"; // see settings-shared.js: the words Shared agent settings added, which an older settings-strings.js in an open tab lacks
30
+ import "./settings-access-strings.js"; // the words Access & security added (settings.webLoginQr…): an older settings-strings.js from a tab that visited Fleet first lacks them (#3061)
28
31
  import { api, attach, confirmedWrite, newKey } from "./settings-confirm.js";
29
32
  import { dismissOperation, operationActive, restartFleet, startOperation, takeLeftover } from "./settings-apply.js";
30
33
  import {
31
- ACCESS_MODES, AGENT_MODES, DASHBOARD_FEATURES, SEPARATE_FEATURE_KEYS, DEFAULT_SCHEMA, ownChoiceImpact, HANG_TIMEOUT_DEFAULT_MINUTES, LOG_LEVELS, TOOL_PROGRESS, TOOL_SETS, VISIBILITY_MODES, batchImpact,
34
+ ACCESS_MODES, DASHBOARD_FEATURES, SEPARATE_FEATURE_KEYS, DEFAULT_SCHEMA, ownChoiceImpact, HANG_TIMEOUT_DEFAULT_MINUTES, TOOL_PROGRESS, TOOL_SETS, VISIBILITY_MODES, batchImpact,
32
35
  changedFields, channelId, channelsOf, chLabel, connectionState, dashboardDefault, effectiveSummary, fleetModel, fromYaml, fullModelRequests, groupAgents,
33
- hasOwn, impactOf, localeOptions, defaultsImpact, requestImpact, nonNegative, positive, replyGuardSupported, sameValue, shortName, STATUS_ORDER, toYaml,
34
- toolSetDefault, visibilityDefault, worstImpact,
36
+ hasOwn, impactOf, defaultsImpact, requestImpact, nonNegative, positive, replyGuardSupported, sameValue, shortName, STATUS_ORDER, toYaml,
37
+ visibilityDefault, worstImpact,
35
38
  } from "./settings-model.js";
36
39
  import {
37
- AgentDialog, BackendSelect, BotDialog, ChipList, ClassicDialog, DefaultMark, Drawer, Feedback, Impact, InEffect, Inherited, Label, ModelSelect,
40
+ AgentDialog, BackendSelect, BotDialog, ChipList, ClassicDialog, DefaultMark, Feedback, Impact, InEffect, Inherited, Label,
38
41
  NewBotDialog, Override, Select, ask, impactText, inAgentDefaults, valueText,
39
42
  } from "./settings-dialogs.js";
43
+ import { SharedAgentSettings, sharedNotes } from "./settings-shared.js";
40
44
  import { SetupWizard } from "./settings-wizard.js";
41
45
  import { CreateInstanceDialog } from "./panel-fleet.js";
42
46
  import { RuntimesPanel } from "./panel-runtimes.js";
@@ -46,7 +50,7 @@ import { takeAgentRequest } from "./settings-request.js";
46
50
  // #1604: This device — the preview opt-in (one path: the app's confirm, then preview.js) and the tour, from the chat.
47
51
  import { setPreviewOptIn } from "./panel-chat.js";
48
52
  import { startTour } from "./chat-tour.js";
49
- import "./chat-strings.js";
53
+ import "/assets/chat-strings.js";
50
54
  import { AppearanceSection } from "./settings-appearance.js";
51
55
  import { GuestsCard } from "./settings-guests.js";
52
56
  import { OfficeSharesCard } from "./office-share-dialog.js";
@@ -54,8 +58,26 @@ import { PageSharesCard } from "./page-share-dialog.js";
54
58
  import { syncStage, useDraft } from "./settings-draft.js";
55
59
  import { WebAuthorityCard } from "./settings-web-authority.js";
56
60
  import { OutsideCard } from "./settings-outside.js";
61
+ import { DevicesCard } from "./settings-devices.js";
62
+ /** The pure owner Settings switch is available while off; its pairing UI remains lazy and member-mark gated. */
63
+ function HubCardSlot() {
64
+ const [Card, setCard] = useState(null);
65
+ useEffect(() => { let live = true; import("./settings-hub-membership.js").then((m) => { if (live) setCard(() => m.HubMembershipSettings); }, () => {}); return () => { live = false; }; }, []);
66
+ return Card ? html`<${Card} />` : null;
67
+ }
68
+ function HubBrowserCertificateSlot() {
69
+ const [Card, setCard] = useState(null);
70
+ useEffect(() => { let live = true; import("./settings-hub-browser-certificate.js").then(m => { if (live) setCard(() => m.HubBrowserCertificateSettings); }, () => {}); return () => { live = false; }; }, []);
71
+ return Card ? html`<${Card} />` : null;
72
+ }
73
+ function HubRetentionSlot() {
74
+ const [Card, setCard] = useState(null);
75
+ useEffect(() => { let live = true; import("./settings-hub-retention.js").then(m => { if (live) setCard(() => m.HubRetentionSettings); }, () => {}); return () => { live = false; }; }, []);
76
+ return Card ? html`<${Card} />` : null;
77
+ }
57
78
  import { NamedLinkTest, setTypedTunnelToken } from "./settings-named-test.js";
58
79
  import { SignInList } from "./backend-signin.js";
80
+ import { AccountsView, defaultsBackendOptions } from "./accounts-view.js"; // #3212: SignInList stays exported for a page that still imports it
59
81
  import { ProviderMark } from "./provider-marks.js";
60
82
  import { CliProductMark, cliLabel } from "./cli-picker.js";
61
83
  import { SettingsPageHead, SettingsTabs, SettingsTabPanel, useSettingsTabs, revealSettingsTarget, layoutText } from "./settings-layout.js";
@@ -71,7 +93,6 @@ const APPLY_ERRORS = new Set(["unsupported_sensitive_effect", "confirmation_diff
71
93
  // #2726: a code or words of the setup host (the wizard's commit) in the page's language; anything else as it came.
72
94
  export const applyErrorText = (code) => (APPLY_ERRORS.has(code) ? tn(`applyError_${code}`) : tn("applyErrorOther", hostText(String(code), lang())));
73
95
  const ICONS = { preferences: "user", look: "palette", agents: "bot", runtimes: "view", "agent-defaults": "sliders", chat: "chat", "web-dashboard": "globe", access: "key", advanced: "code" };
74
- const RELEASES = "https://github.com/songsid/AgEnD/releases";
75
96
 
76
97
  /** GET under the panel's lease → { ok, status, body }. */
77
98
  async function read(lease, path) {
@@ -121,7 +142,7 @@ async function loadLive(lease) {
121
142
  if (!lease.current()) return null;
122
143
  const classicStatus = {};
123
144
  if (pr.ok && Array.isArray(pr.body)) for (const r of pr.body) classicStatus[r.instance_name] = r.status;
124
- return { live, classicLive, classicStatus, fleetUp: f.ok, version: (f.ok && f.body && f.body.version) || "" };
145
+ return { live, classicLive, classicStatus, fleetUp: f.ok, version: (f.ok && f.body && f.body.version) || "", build: f.ok && f.body ? f.body.build : null };
125
146
  }
126
147
 
127
148
  export function SettingsPanel({ route, navKey }) {
@@ -394,7 +415,14 @@ export function SettingsPanel({ route, navKey }) {
394
415
  : data.error ? html`<${ErrorState} message=${tn("configLoadFailed")} onRetry=${reload} />`
395
416
  : section === "agents" ? html`<${YamlLock} staged=${staged}><${Agents} ctx=${ctx} search=${search} clearSearch=${() => setSearch("")} openDialog=${toDialog} /></${YamlLock}><details class="s-ui-disclosure s-ai-accounts"><summary><span>${layoutText("aiAccounts")}</span><small>${layoutText("aiAccountsSummary")}</small></summary><div class="s-disclosure-body s-auth-body">
396
417
  <div class="s-auth-scope"><${Icon} name="view" size=${18} /><div><strong>${layoutText("aiHostScope")}</strong><p>${layoutText("aiAccountsHint")}</p><a href=${settingsPath("runtimes")}>${layoutText("aiWindowsLink")}<span aria-hidden="true">→</span></a></div></div>
397
- <${SignInList} />${ctx.providerOk ? html`<${ProviderKeys} ctx=${ctx} />` : html`<section class="s-auth-section s-api-unavailable"><header class="s-auth-section-head"><div><h3>${layoutText("apiKeysTitle")}</h3><p>${layoutText("apiKeysHint")}</p></div><span class="s-auth-state">${layoutText("apiKeysUnavailableState")}</span></header><p class="note">${layoutText("apiKeysUnavailable")}</p></section>`}
418
+ <${AccountsView} instances=${ctx.fleet.instances || {}} stageAgent=${ctx.stageAgent}
419
+ stageDefault=${(backend, profile) => {
420
+ // One change for every CLI's fleet default, carrying the whole map (the write replaces it whole).
421
+ const opts = defaultsBackendOptions((ctx.fleet.defaults || {}).backend_options, stagedRef.current.get("defaults:account")?.request?.body?.backend_options, backend, profile);
422
+ if (!opts) { ctx.unstage("defaults:account"); return; }
423
+ ctx.stage("defaults:account", { label: tn("updateDefaults"), count: 1, impact: defaultsImpact(ctx.schema, "backend_options"),
424
+ request: { method: "PUT", url: "/api/settings/fleet/defaults", body: { backend_options: opts } } });
425
+ }} />${ctx.providerOk ? html`<${ProviderKeys} ctx=${ctx} />` : html`<section class="s-auth-section s-api-unavailable"><header class="s-auth-section-head"><div><h3>${layoutText("apiKeysTitle")}</h3><p>${layoutText("apiKeysHint")}</p></div><span class="s-auth-state">${layoutText("apiKeysUnavailableState")}</span></header><p class="note">${layoutText("apiKeysUnavailable")}</p></section>`}
398
426
  </div></details>`
399
427
  : section === "agent-defaults" ? html`<${GeneralLocation} /><${YamlLock} staged=${staged}><${General} key=${formKey} ctx=${ctx} part="fleet" /></${YamlLock}>`
400
428
  : section === "chat" ? html`<${YamlLock} staged=${staged}><${Bots} ctx=${ctx} search=${search} openDialog=${toDialog} /></${YamlLock}>
@@ -481,7 +509,7 @@ export function SettingsPanel({ route, navKey }) {
481
509
  // Which one is shown is the root's data-view: its class stays exactly the effects producer's ("panel p-settings", #1629).
482
510
  const atList = typeof location !== "undefined" && location.pathname === "/settings";
483
511
  return html`<div data-effect-panel="settings" class="panel p-settings" data-view=${atList ? "index" : "section"}>
484
- <${PanelHeader} title=${tn("title")} sub=${data && data.version ? html`<a class="pill ver" href=${data.version.includes("-") ? `${RELEASES}/latest` : `${RELEASES}/tag/v${data.version}`} target="_blank" rel="noopener">v${data.version}</a>` : null}>
512
+ <${PanelHeader} title=${tn("title")} sub=${data ? html`<${SettingsBuildVersion} version=${data.version} build=${data.build} />` : null}>
485
513
  <button type="button" class="btn btn-ghost btn-sm" disabled=${!ctx || yamlStaged(staged)} title=${ctx && yamlStaged(staged) ? tn("yamlUnsaved") : undefined} onClick=${openWizard}><${Icon} name="wand" size=${16} /><span class="hide-narrow">${tn("wizardButton")}</span></button>
486
514
  <button type="button" class="icon-btn" aria-label=${tn("helpButton")} title=${tn("helpButton")} onClick=${() => setDialog({ kind: "help", key: navKey })}><${Icon} name="info" /></button>
487
515
  </${PanelHeader}>
@@ -1050,7 +1078,6 @@ function General({ ctx, part = "all" }) {
1050
1078
  const { schema } = ctx;
1051
1079
  const d = ctx.fleet.defaults || {}, c = (ctx.classic && ctx.classic.defaults) || {};
1052
1080
  const hang = d.hang_detector || {}, startup = d.startup || {};
1053
- const primary = channelsOf(ctx.fleet)[0];
1054
1081
  const original = useMemo(() => ({ c: structuredClone(c) }), []);
1055
1082
  const base = useMemo(() => generalForm(d, c, ctx.fleet, schema), []);
1056
1083
  const [f, setF] = useDraft(ctx, "general", () => base);
@@ -1066,6 +1093,9 @@ function General({ ctx, part = "all" }) {
1066
1093
  const warnings = { concurrency: f.concurrency.trim() !== "" && num(f.concurrency) > 4 ? "concurrencyWarning" : "", stagger: num(f.stagger) < 100 ? "staggerWarning" : "" };
1067
1094
  const ready = !Object.values(errors).some(Boolean);
1068
1095
  const firstError = Object.values(errors).find(Boolean);
1096
+ // What saving the edited fields costs (the schema's impact, the agents that set the field themselves): shown under each
1097
+ // edited field, and added up on the Save bar.
1098
+ const notes = sharedNotes({ schema, fleet: ctx.fleet, classic: ctx.classic, classicStatus: (name) => ctx.classicRuntime(name).status, live: ctx.live, fleetUp: ctx.fleetUp, f, base, errors });
1069
1099
  // #2347: every edit, staged as it is made (the first render included: a draft kept from before is staged again).
1070
1100
  useEffect(() => {
1071
1101
  if (!ready) {
@@ -1112,10 +1142,12 @@ function General({ ctx, part = "all" }) {
1112
1142
  // that sets it (POST /ui/config; a change to it waits for a fleet admin's OK, as it did there).
1113
1143
  const roots = f.roots.map((r) => String(r).trim()).filter(Boolean); // ChipList keeps "2024" as a number; paths are text
1114
1144
  syncStage(ctx, "fleet:project_roots", sameValue(roots, base.roots) ? null : { label: tn("projectRootsTitle"), count: 1,
1115
- impact: impactOf(schema, "fleet.project_roots"), request: { method: "POST", url: "/ui/config", body: { project_roots: roots } } });
1145
+ impact: impactOf(schema, "fleet.project_roots"), notes: notes.bar.roots,
1146
+ request: { method: "POST", url: "/ui/config", body: { project_roots: roots } } });
1116
1147
  const dKeys = Object.keys(defaultsPatch), cKeys = Object.keys(classicPatch);
1148
+ // The bar says what this Save costs in the page's own words (how many agents restart), not a bare impact label.
1117
1149
  syncStage(ctx, "defaults:fleet", dKeys.length ? { label: tn("updateDefaults"), count: dKeys.length,
1118
- impact: batchImpact(schema, dKeys, (k) => defaultsImpact(schema, k)),
1150
+ impact: batchImpact(schema, dKeys, (k) => defaultsImpact(schema, k)), notes: notes.bar.defaults,
1119
1151
  request: { method: "PUT", url: "/api/settings/fleet/defaults", body: defaultsPatch } } : null);
1120
1152
  syncStage(ctx, "defaults:classic", cKeys.length ? { label: tn("updateClassicDefaults"), count: cKeys.length,
1121
1153
  impact: cKeys.every((k) => impactOf(schema, `classic_defaults.${k}`) === "now") ? "now" : "fleet",
@@ -1129,52 +1161,17 @@ function General({ ctx, part = "all" }) {
1129
1161
  log_level: !d.log_level, agent_mode: !d.agent_mode, hangOn: !hasOwn(hang, "enabled"), hang: !hasOwn(hang, "timeout_minutes"),
1130
1162
  concurrency: !hasOwn(startup, "concurrency"), stagger: !hasOwn(startup, "stagger_delay_ms"),
1131
1163
  };
1132
- const dm = (k) => (unset[k] && sameValue(f[k], base[k]) ? html`<${DefaultMark} />` : null);
1133
1164
  const fromDefaults = (k, value, target) => ({ text: valueText(value), builtin: !hasOwn(d, k), from: inAgentDefaults(target) });
1134
- const L = (text, field, id, k) => html`<${Label} text=${text} schema=${schema} field=${field} htmlFor=${id} mark=${k ? dm(k) : null} />`;
1165
+ const L = (text, field, id) => html`<${Label} text=${text} schema=${schema} field=${field} htmlFor=${id} />`;
1135
1166
  const fleetReply = replyGuardSupported(f.backend, f.agent_mode, d.kiro_ui) ? tn("replyGuardSupported") : tn("replyGuardUnsupported", f.backend, f.agent_mode);
1136
1167
  const classicReply = replyGuardSupported(f.classicBackend, f.agent_mode, d.kiro_ui) ? tn("replyGuardSupported") : tn("replyGuardUnsupported", f.classicBackend, f.agent_mode);
1137
1168
  // #2347: Agent defaults show the fleet's part; Chat & connections ClassicBot's. One form, one draft either way.
1138
1169
  const fleetPart = part !== "classic", classicPart = part !== "fleet";
1139
1170
  return html`<div class=${fleetPart ? "s-defaults-layout" : "s-classic-layout"}><div class=${`form s-general s-part-${part}`}>
1140
- ${fleetPart ? html`<section class="card s-defaults-model"><h3>${tn("uiDefaultsModelsTitle")}</h3>
1141
- <div class="grid2">
1142
- <div class=${fc("field", "backend")}>${L(tn("defaultBackend"), "defaults.backend", "g-be", "backend")}<${BackendSelect} id="g-be" value=${f.backend} onChange=${set("backend")} /></div>
1143
- <div class=${fc("field", "model")}>${L(tn("defaultModel"), "defaults.model", "g-model", "model")}<${ModelSelect} id="g-model" value=${f.model} onChange=${set("model")}
1144
- backend=${f.backend || "claude-code"} inherit=${tn("modelCliDefault")} /></div>
1145
- <div class=${fc("field", "locale")}>${L(tn("language"), "defaults.locale", "g-locale", "locale")}<${Select} id="g-locale" value=${f.locale} onChange=${set("locale")}
1146
- options=${localeOptions(f.locale).map((o) => (o.auto ? { value: "", label: tn("localeAuto") } : o))} /></div>
1147
- </div>
1148
- </section>
1149
- <section class="card s-defaults-work"><h3>${tn("uiDefaultsWorkTitle")}</h3>
1150
- <div class="grid2">
1151
- <div class=${fc("field", "auto")}>${L(`${tn("autoPause")} (${tn("minutes")})`, "defaults.auto_pause_after", "g-auto", "auto")}<input id="g-auto" type="number" min="0" step="1" class=${errors.auto ? "invalid" : ""} value=${f.auto} onInput=${(e) => set("auto")(e.target.value)} /><${Feedback} error=${errors.auto} /></div>
1152
- <div class=${fc("field", "tool_progress")}>${L(tn("toolProgress"), "defaults.tool_progress", "g-tp", "tool_progress")}<${Select} id="g-tp" value=${f.tool_progress} onChange=${set("tool_progress")} options=${TOOL_PROGRESS} /></div>
1153
- <div class=${fc("field", "tips")}>${L(tn("dailyTips"), "defaults.tips", "g-tips", "tips")}<${Select} id="g-tips" value=${f.tips} onChange=${set("tips")} options=${noticeChoices()} /><${InEffect} text=${noticeLabel(noticeMode(f.tips))} /><p class="note">${tn("dailyTipsHint")}</p></div>
1154
- </div>
1155
- </section>
1156
- <section class="card s-defaults-collaboration"><h3>${tn("uiDefaultsCollaborationTitle")}</h3>
1157
- <div class="grid2">
1158
- <div class=${fc("field", "visibility")}>${L(tn("crossInstanceVisibility"), "defaults.cross_instance_visibility", "g-vis", "visibility")}<${Select} id="g-vis" value=${f.visibility} onChange=${set("visibility")} options=${VISIBILITY_MODES} />
1159
- <p class="note">${tn("crossInstanceVisibilityHint")}</p></div>
1160
- <div class=${fc("field", "replyTriggers")}><label for="g-reply-triggers" class="s-defaults-toggle-label"><span>${tn("replyTriggers")}</span>${dm("replyTriggers")}</label>
1161
- <input id="g-reply-triggers" class="s-ui-toggle" type="checkbox" checked=${f.replyTriggers} onChange=${(e) => set("replyTriggers")(e.target.checked)} />
1162
- <div class="s-defaults-toggle-help"><details class="s-defaults-explanation"><summary>${layoutText("replyRulesHelp")}</summary><p class="note">${tn("replyTriggersHint")}</p></details><${Impact} schema=${schema} field="defaults.reply_triggers" /></div></div>
1163
- <div class=${fc("field", "reply")}><label for="g-reply" class="s-defaults-toggle-label"><span>${tn("replyCompletionGuard")}</span>${dm("reply")}</label>
1164
- <input id="g-reply" class="s-ui-toggle" type="checkbox" checked=${f.reply} onChange=${(e) => set("reply")(e.target.checked)} />
1165
- <div class="s-defaults-toggle-help"><details class="s-defaults-explanation"><summary>${layoutText("replySupportHelp")}</summary><p class="note">${fleetReply}</p></details><${Impact} schema=${schema} field="defaults.reply_completion_guard" /></div></div>
1166
- </div>
1167
- </section>
1168
- <details class="s-ui-disclosure s-defaults-permissions"><summary>${tn("uiDefaultsCapabilitiesTitle")}</summary><div class="s-ui-disclosure-body">
1169
- <fieldset id="g-dash" class=${fc("field dash-perms", ...DASHBOARD_FEATURES.map((k) => `dash_${k}`))}><legend>${L(tn("dashboardAccess"), "defaults.dashboard")}</legend>
1170
- <p class="note">${tn("dashboardDefaultsHint")}</p>
1171
- ${DASHBOARD_FEATURES.map((k) => html`<label key=${k} class="check"><input type="checkbox" checked=${f[`dash_${k}`]}
1172
- onChange=${(e) => set(`dash_${k}`)(e.target.checked)} /><span>${tn(`dashboard_${k}`)}</span></label>`)}
1173
- </fieldset>
1174
- </div></details>` : null}
1171
+ ${fleetPart ? html`<${SharedAgentSettings} ctx=${ctx} form=${{ f, set, base, errors, warnings, unset, fc, notes, replyNote: fleetReply }} />` : null}
1175
1172
  ${classicPart ? html`<section class="card s-classic-defaults-card"><h3>${tn("classicDefaultsTitle")}</h3>
1176
1173
  <div class="grid2">
1177
- <div class=${fc("field", "classicBackend")}>${L(tn("classicBackend"), "classic_defaults.backend", "g-cbe")}<${BackendSelect} id="g-cbe" value=${f.classicBackend} onChange=${set("classicBackend")} />
1174
+ <div class=${fc("field", "classicBackend")}>${L(tn("classicBackend"), "classic_defaults.backend", "g-cbe")}<${BackendSelect} id="g-cbe" value=${f.classicBackend} onChange=${set("classicBackend")} hostOnly />
1178
1175
  ${!c.backend && f.classicBackend === base.classicBackend ? html`<${Inherited} text=${valueText(f.classicBackend, "backend")} builtin=${!d.backend} from=${inAgentDefaults("#g-be")} />` : null}</div>
1179
1176
  <div class=${fc("field", "classicToolProgress", "classicToolProgressInherit")}>${L(tn("toolProgress"), "classic_defaults.tool_progress", "g-ctp")}
1180
1177
  <${Override} inherit=${f.classicToolProgressInherit} onInherit=${set("classicToolProgressInherit")} inherited=${fromDefaults("tool_progress", d.tool_progress ?? "off", "#g-tp")}>
@@ -1193,30 +1190,6 @@ function General({ ctx, part = "all" }) {
1193
1190
  <div id="g-guilds" class=${fc("field", "guilds")}>${L(tn("allowedGuilds"), "classic.allowed_guilds")}<${ChipList} items=${f.guilds} onChange=${set("guilds")} placeholder=${tn("guildIdPlaceholder")} label=${tn("allowedGuilds")} /></div>
1194
1191
  </div>
1195
1192
  </section>` : null}
1196
- ${fleetPart ? html`<details class="s-ui-disclosure s-defaults-workspace" id="project-roots"><summary>${tn("uiDefaultsWorkspaceTitle")}</summary><div class="s-ui-disclosure-body"><section class="card"><h3>${tn("projectRootsTitle")}</h3>
1197
- <p class="note">${tn("projectRootsHint")}</p>
1198
- <div id="g-roots" class=${fc("field", "roots")}>${L(tn("projectRootsTitle"), "fleet.project_roots")}<${ChipList} items=${f.roots} onChange=${set("roots")} placeholder="/path/to/projects" label=${tn("projectRootsTitle")} />
1199
- ${f.roots.length ? null : html`<${InEffect} text=${tn("projectRootsAnywhere")} />`}</div>
1200
- </section></div></details>` : null}
1201
- ${fleetPart ? html`<${Drawer} title=${tn("uiDefaultsAdvancedTitle")}>
1202
- <section class="card"><h3>${tn("runtimeResources")}</h3><div class="grid2">
1203
- <div class=${fc("field", "tool_set")}>${L(tn("toolSet"), "defaults.tool_set", "g-ts", "tool_set")}<${Select} id="g-ts" value=${f.tool_set} onChange=${set("tool_set")}
1204
- options=${[{ value: "", label: tn("toolSetUnset", toolSetDefault({}, {}), toolSetDefault({}, { general_topic: true })) }, ...TOOL_SETS]} /></div>
1205
- <div class=${fc("field", "log_level")}>${L(tn("logLevel"), "defaults.log_level", "g-ll", "log_level")}<${Select} id="g-ll" value=${f.log_level} onChange=${set("log_level")} options=${LOG_LEVELS} /></div>
1206
- <div class=${fc("field", "agent_mode")}>${L(tn("agentMode"), "defaults.agent_mode", "g-am", "agent_mode")}<${Select} id="g-am" value=${f.agent_mode} onChange=${set("agent_mode")} options=${AGENT_MODES} /></div>
1207
- </div></section>
1208
- <section class="card"><h3>${tn("detection")}</h3><div class="grid2">
1209
- <label class=${fc("check", "hangOn")}><input id="g-hang-on" type="checkbox" checked=${f.hangOn} onChange=${(e) => set("hangOn")(e.target.checked)} /><span>${tn("hangEnabled")}</span>${dm("hangOn")}<${Impact} schema=${schema} field="defaults.hang_detector" /></label>
1210
- <div class=${fc("field", "hang")}>${L(`${tn("hangTimeout")} (${tn("minutes")})`, "defaults.hang_detector", "g-hang", "hang")}<input id="g-hang" type="number" min="0.1" step="0.5" class=${errors.hang ? "invalid" : ""} value=${f.hang} onInput=${(e) => set("hang")(e.target.value)} /><${Feedback} error=${errors.hang} /></div>
1211
- </div></section>
1212
- <section class="card"><h3>${tn("startup")}</h3><div class="grid2">
1213
- <div class=${fc("field", "concurrency")}>${L(tn("concurrency"), "fleet.spawn_concurrency", "g-conc")}<input id="g-conc" type="number" min="1" max="20" step="1" class=${errors.concurrency ? "invalid" : ""} value=${f.concurrency} onInput=${(e) => set("concurrency")(e.target.value)} /><${Feedback} error=${errors.concurrency} warning=${warnings.concurrency} />
1214
- ${f.concurrency.trim() === "" ? html`<${InEffect} text=${tn("concurrencyAuto")} />` : null}</div>
1215
- <div class=${fc("field", "stagger")}>${L(`${tn("staggerDelay")} (ms)`, "fleet.spawn_stagger_ms", "g-stag", "stagger")}<input id="g-stag" type="number" min="0" max="30000" step="100" class=${errors.stagger ? "invalid" : ""} value=${f.stagger} onInput=${(e) => set("stagger")(e.target.value)} /><${Feedback} error=${errors.stagger} warning=${warnings.stagger} /></div>
1216
- </div></section>
1217
- <section class="card"><h3>${tn("accessTitle")}</h3>
1218
- <p class="note">${primary ? tn("accessMovedHint", primary.id || chLabel(0)) : tn("noBots")}</p></section>
1219
- </${Drawer}>` : null}
1220
1193
  </div></div>`;
1221
1194
  }
1222
1195
 
@@ -1269,13 +1242,14 @@ function WebSection({ ctx, staged, part = "all" }) {
1269
1242
  usagePub: web.usage_report_on_public_link === true, // #2122: off by default
1270
1243
  levels: web.office_levels !== false, // #2661: on by default
1271
1244
  cdn: web.preview_cdn === true, // #2911 (7): off by default
1245
+ loginQr: web.login_qr === true, // #3061 (P2b): off by default
1272
1246
  pub: { allow_public: (web.public_link && web.public_link.allow_public) ?? true, ttl_minutes: (web.public_link && web.public_link.ttl_minutes) ?? 120, protocol: (web.public_link && web.public_link.protocol) ?? "http2", hostname: (web.public_link && web.public_link.hostname) ?? "", tunnel_token_env: (web.public_link && web.public_link.tunnel_token_env) ?? "", origin_port: (web.public_link && web.public_link.origin_port) ?? 19282, auto_open: (web.public_link && web.public_link.auto_open) ?? false },
1273
1247
  session: { absolute_hours: local.absolute_hours ?? null, idle_hours: local.idle_hours ?? null },
1274
1248
  terminal: { enabled: term.enabled ?? null, ttl_minutes: term.ttl_minutes ?? null },
1275
1249
  }), []);
1276
1250
  const text = (v) => (v === null || v === undefined ? "" : String(v));
1277
1251
  /** #2347: a field's row class: `s-dirty` while it differs from what is saved (the draft may come from before). */
1278
- const savedForm = useMemo(() => ({ notify: String(original.notify), echo: original.echo, log: original.log, usagePub: original.usagePub, levels: original.levels, cdn: original.cdn, pub: original.pub.allow_public,
1252
+ const savedForm = useMemo(() => ({ notify: String(original.notify), echo: original.echo, log: original.log, usagePub: original.usagePub, levels: original.levels, cdn: original.cdn, loginQr: original.loginQr, pub: original.pub.allow_public,
1279
1253
  ttl: String(original.pub.ttl_minutes), protocol: original.pub.protocol, hostname: original.pub.hostname, originPort: String(original.pub.origin_port),
1280
1254
  abs: text(original.session.absolute_hours), idle: text(original.session.idle_hours), termOn: original.terminal.enabled !== false,
1281
1255
  termTtl: text(original.terminal.ttl_minutes), autoOpen: original.pub.auto_open }), []);
@@ -1289,7 +1263,7 @@ function WebSection({ ctx, staged, part = "all" }) {
1289
1263
  return {
1290
1264
  notify: String(pick(pending, "notify_login", original.notify)),
1291
1265
  echo: pick(pending, "echo_to_channel", original.echo), log: pick(pending, "log_tab", original.log), usagePub: pick(pending, "usage_report_on_public_link", original.usagePub),
1292
- levels: pick(pending, "office_levels", original.levels), cdn: pick(pending, "preview_cdn", original.cdn),
1266
+ levels: pick(pending, "office_levels", original.levels), cdn: pick(pending, "preview_cdn", original.cdn), loginQr: pick(pending, "login_qr", original.loginQr),
1293
1267
  pub: pick(pub, "allow_public", original.pub.allow_public), ttl: String(pick(pub, "ttl_minutes", original.pub.ttl_minutes)), protocol: pick(pub, "protocol", original.pub.protocol),
1294
1268
  hostname: pick(pub, "hostname", original.pub.hostname), originPort: String(pick(pub, "origin_port", original.pub.origin_port)), autoOpen: pick(pub, "auto_open", original.pub.auto_open),
1295
1269
  abs: text(pick(session, "absolute_hours", original.session.absolute_hours)), idle: text(pick(session, "idle_hours", original.session.idle_hours)),
@@ -1343,6 +1317,7 @@ function WebSection({ ctx, staged, part = "all" }) {
1343
1317
  ...(f.usagePub !== original.usagePub ? { usage_report_on_public_link: f.usagePub } : {}),
1344
1318
  ...(f.levels !== original.levels ? { office_levels: f.levels } : {}),
1345
1319
  ...(f.cdn !== original.cdn ? { preview_cdn: f.cdn } : {}),
1320
+ ...(f.loginQr !== original.loginQr ? { login_qr: f.loginQr } : {}),
1346
1321
  ...(Object.keys(publicPatch).length ? { public_link: publicPatch } : {}),
1347
1322
  ...(Object.keys(sessionPatch).length ? { session: { local: sessionPatch } } : {}),
1348
1323
  ...(Object.keys(terminalPatch).length ? { web_terminal: terminalPatch } : {}),
@@ -1354,6 +1329,7 @@ function WebSection({ ctx, staged, part = "all" }) {
1354
1329
  ...(body.usage_report_on_public_link !== undefined ? ["web.usage_report_on_public_link"] : []),
1355
1330
  ...(body.office_levels !== undefined ? ["web.office_levels"] : []),
1356
1331
  ...(body.preview_cdn !== undefined ? ["web.preview_cdn"] : []),
1332
+ ...(body.login_qr !== undefined ? ["web.login_qr"] : []),
1357
1333
  ...Object.keys(publicPatch).map((k) => `web.public_link.${k}`),
1358
1334
  ...Object.keys(sessionPatch).map((k) => `web.session.local.${k}`),
1359
1335
  ...Object.keys(terminalPatch).map((k) => `web_terminal.${k}`),
@@ -1411,6 +1387,10 @@ function WebSection({ ctx, staged, part = "all" }) {
1411
1387
  <div class="s-access-banner"><${Icon} name="info" size=${18} /><p>${layoutText("revAccessPolicy")}</p><details class="s-access-policy"><summary>${layoutText("revDetails")}</summary><p class="note">${tn("webLead")}</p></details></div>
1412
1388
  <${SettingsTabPanel} group="access" id="login" active=${accessTab === "login"}>
1413
1389
  <div class="s-access-login-layout"><div class="s-access-stack">
1390
+ ${/* #3008: a web-only fleet's connections from outside — changed on this computer only, shown (read-only) elsewhere. */ ""}
1391
+ <${OutsideCard} />
1392
+ ${/* Refs #3061 (P2a): sign a new device in with its 8-character code — approved here by the verified owner. */ ""}
1393
+ <${DevicesCard} />
1414
1394
  ${lock(html`<section class="card s-access-session"><h3>${layoutText("revLoginSessions")}</h3>
1415
1395
  <div class=${fc("field", "notify")}><label for="webNotifyLogin">${tn("webNotifyLogin")}<${Impact} schema=${schema} field="web.notify_login" /></label><${Select} id="webNotifyLogin" value=${f.notify} onChange=${set("notify")} options=${noticeChoices()} /><${InEffect} text=${noticeLabel(noticeMode(f.notify))} /></div>
1416
1396
  <div class="grid2">
@@ -1422,11 +1402,14 @@ function WebSection({ ctx, staged, part = "all" }) {
1422
1402
  ${value(f.idle) === null && !errors.abs ? html`<${InEffect} text=${tn("hoursValue", idle)} why=${idle < 48 ? tn("cappedBySession") : null} />` : null}</div>
1423
1403
  </div>
1424
1404
  <p class="note s-session-ceiling">${layoutText("revPublicSessionLimit")}</p>
1405
+ ${/* Refs #3061 (P2b): the QR code on a new device's sign-in page (a web-only fleet's "Sign in with another device"). */ ""}
1406
+ <label class=${fc("check", "loginQr")}><input id="webLoginQr" type="checkbox" checked=${f.loginQr} aria-describedby="webLoginQr-hint" onChange=${(e) => set("loginQr")(e.target.checked)} /><span>${tn("webLoginQr")}</span><${Impact} schema=${schema} field="web.login_qr" /></label>
1407
+ <p class="note" id="webLoginQr-hint">${tn("webLoginQrHint")}</p>
1425
1408
  <details class="s-setting-details"><summary>${layoutText("revSessionDetails")}</summary><p class="note">${tn("webSessionHint")}</p><p class="note">${tn("webNotifyLoginHint")}</p></details>
1426
1409
  </section>`)}
1427
1410
  ${!overPublicLink ? html`<${WebAuthorityCard} ctx=${ctx} staged=${staged} />` : null}
1428
- ${/* #3008: a web-only fleet's connections from outside — changed on this computer only, shown (read-only) elsewhere. */ ""}
1429
- <${OutsideCard} />
1411
+ ${!overPublicLink ? html`<${HubCardSlot} />` : null}
1412
+ ${!overPublicLink && ctx.fleet.hub?.hubId ? html`<${HubRetentionSlot} /><${HubBrowserCertificateSlot} />` : null}
1430
1413
  <details class="drawer s-terminal-disclosure"><summary>${tn("webTerminalTitle")}</summary><div class="drawer-body">${lock(html`<section class="card s-access-terminal"><h3>${tn("webTerminalTitle")}</h3>
1431
1414
  <p class="note">${tn("webTerminalHint")}</p>
1432
1415
  <label class=${fc("check", "termOn")}><input id="webTerminalEnabled" type="checkbox" checked=${f.termOn} onChange=${(e) => set("termOn")(e.target.checked)} /><span>${tn("webTerminalEnabled")}</span><${Impact} schema=${schema} field="web_terminal.enabled" /></label>
@@ -1561,7 +1544,13 @@ function Developer({ ctx }) {
1561
1544
  */
1562
1545
  function PendingBar({ staged, busy, onApply, onDiscard, section }) {
1563
1546
  const changes = [...staged.values()];
1564
- const kinds = [...new Set(changes.filter((c) => !c.invalid).map((c) => c.impact))];
1547
+ // What Save will cost, one line each: a change that knows its own words (the shared agent settings: how many agents
1548
+ // restart) says them; any other says its impact label.
1549
+ const costs = [];
1550
+ for (const c of changes) {
1551
+ if (c.invalid) continue;
1552
+ for (const line of Array.isArray(c.notes) && c.notes.length ? c.notes : [impactText(c.impact)]) if (!costs.includes(line)) costs.push(line);
1553
+ }
1565
1554
  const invalid = changes.filter((c) => c.invalid).length;
1566
1555
  // #2382 review: a field to fix in another section is named, and the message goes there (its field focused).
1567
1556
  const elsewhere = changes.find((c) => c.invalid && c.section && c.section !== section);
@@ -1569,7 +1558,7 @@ function PendingBar({ staged, busy, onApply, onDiscard, section }) {
1569
1558
  const count = changes.reduce((n, c) => n + (Number.isInteger(c.count) && c.count > 0 ? c.count : 1), 0);
1570
1559
  return html`<div data-trust="panel-controls" class="s-pending" role="region" aria-label=${tn("pendingRegion")}>
1571
1560
  <strong>${tn("changesPending", count)}</strong>
1572
- <span class="note">${kinds.map(impactText).join(" · ")}</span>
1561
+ <span class="note">${costs.join(" · ")}</span>
1573
1562
  <span class="s-pending-actions">
1574
1563
  ${!invalid ? null : problem ? html`<button type="button" class="link-btn feedback error s-fix" role="status" onClick=${() => goToTarget(problem.section || section, problem.target)}>${elsewhere ? tn("fixToSaveIn", invalid, tn(`sec_${elsewhere.section}`)) : tn("fixToSave", invalid)}</button>`
1575
1564
  : html`<span class="feedback error s-fix" role="status">${tn("fixToSave", invalid)}</span>`}
@@ -15,6 +15,10 @@ register("wincli", {
15
15
  "zh-TW": { workspace:"Windows 本機工作區", native:"Windows 本機", providers:"本機 CLI", available:"可派工", unavailableBadge:"尚未就緒", detectionOnly:"僅偵測", notDetected:"尚未偵測", checking:"檢查中", path:"執行檔路徑", taskHint:"使用 Windows Codex,在指定專案中執行一次性任務。", folderHint:"請填入已存在的 Windows 專案資料夾。", promptPlaceholder:"例如:檢查這個專案的結構,說明如何在 Windows 上啟動。", readHint:"適合檢查、查詢與分析", writeHint:"適合修改程式與檔案", taskLimits:"同時 1 個任務 · 5 分鐘後請求取消", policy:"存取與核准方式", policyText:"沿用本機 CLI 的沙箱與核准政策,包含已設定的自動審查。此頁不提供互動核准按鈕。", ready:"Codex 已就緒", busy:"Windows 任務執行中", unavailable:"請先確認 Codex 已安裝並登入", historyHint:"查看執行狀態與 CLI 輸出", emptyHint:"派送第一個任務後,進度與結果會出現在這裡。", noOutput:"這個任務沒有回傳輸出。", records:"筆", historyNote:"保留最近 20 筆,重啟後清空", output:"執行輸出", submitting:"正在提交…" },
16
16
  en: { workspace:"Your Windows workspace", native:"Native Windows", providers:"Local CLIs", available:"Tasks enabled", unavailableBadge:"Not ready", detectionOnly:"Detection only", notDetected:"Not detected yet", checking:"Checking", path:"Executable path", taskHint:"Run a one-off task in your project with Windows Codex.", folderHint:"Use an existing Windows project folder.", promptPlaceholder:"For example: inspect this project and explain how to run it on Windows.", readHint:"Inspect, query and analyze", writeHint:"Edit code and files", taskLimits:"One task at a time · Cancellation after 5 min", policy:"Access and approvals", policyText:"Uses the local CLI's sandbox and approval policy, including any configured automatic reviewer. This page has no interactive approval controls.", ready:"Codex is ready", busy:"Windows task in progress", unavailable:"Check that Codex is installed and signed in", historyHint:"Execution status and CLI output", emptyHint:"Send your first task to see its progress and results here.", noOutput:"This task returned no output.", records:"tasks", historyNote:"Latest 20 tasks; cleared on restart", output:"Execution output", submitting:"Submitting…" },
17
17
  });
18
+ register("wincli", {
19
+ en: { paneUnverified:"Not yet verified", paneUnverifiedHint:"AgEnD has not tested this version in Windows panes yet. It still runs; any screen AgEnD does not recognise stops and waits for you in Needs you.", paneDenied:"Known not to work", paneDeniedHint:"AgEnD knows this version does not work in Windows panes, so it will not start it. Install a different version." },
20
+ "zh-TW": { paneUnverified:"尚未驗證", paneUnverifiedHint:"AgEnD 還沒在 Windows 面板中測試過這個版本。它仍然可以執行;遇到 AgEnD 認不得的畫面時,會停下來在「需要你」等你處理。", paneDenied:"已知無法使用", paneDeniedHint:"AgEnD 已知這個版本無法在 Windows 面板中使用,所以不會啟動它。請改裝其他版本。" },
21
+ });
18
22
  const tn = key => t(`wincli.${key}`);
19
23
  register("wincli", {
20
24
  "zh-TW": { newTask:"派送 Windows CLI 任務", taskHint:"選擇本機 CLI 與模型,在指定專案中執行任務。", ready:"CLI 已就緒", unavailable:"請先確認 CLI 已安裝並登入", model:"模型", defaultModel:"使用 CLI 預設模型", write:"使用本機 CLI 權限", writeHint:"依照此 CLI 的本機核准設定", writeHintClaude:"可修改工作目錄內的檔案;目錄外的寫入、會修改檔案的 Shell 指令與網路都會被拒絕(唯讀指令仍會執行)", noReadOnly:"此 CLI 無法保證唯讀,請明確選擇本機 CLI 權限。", noProviders:"沒有找到已安裝的 CLI。安裝後可重新偵測。" },
@@ -30,12 +34,18 @@ register("wincli", {
30
34
  });
31
35
  const active = task => ["starting","running","cancelling"].includes(task.status);
32
36
 
37
+ /** cc3ce4fe: a persistent-pane CLI's version AgEnD has not audited (or knows is broken), from the coordinator's label.
38
+ * Drawn inside the version's own cell: the diagnostics summary is a fixed five-cell grid. */
39
+ function paneVerificationTag(cli) {
40
+ const key = cli.paneVerification === "unverified" ? "paneUnverified" : cli.paneVerification === "denied" ? "paneDenied" : "";
41
+ return key ? html`<span class="tag" title=${tn(`${key}Hint`)}>${tn(key)}</span>` : null;
42
+ }
33
43
  function CliCard({ cli, probing, diagnostic = false }) {
34
44
  const signedIn = cli.authenticated === true;
35
45
  const checking = probing && !cli.path;
36
46
  const authKey = checking ? "checking" : !cli.path ? "missing" : signedIn ? "signedIn" : cli.authenticated === false ? "signedOut" : "unknown";
37
47
  const providerLabel = cli.company || ({codex:"OpenAI","claude-code":"Anthropic",antigravity:"Google",grok:"xAI","kiro-cli":"AWS",opencode:"Anomaly",muse:"Meta"})[cli.id];
38
- if(diagnostic) return html`<details class="windows-cli-diagnostic-row"><summary><${CliProductMark} id=${cli.id} size=${24} /><strong>${cliLabel(cli.id)}</strong><span class="windows-cli-diagnostic-version">${cli.version || "—"}</span><span class=${`windows-cli-auth ${signedIn ? "tone-ready" : "tone-neutral"}`}><span class="windows-cli-dot"></span>${tn(authKey)}</span><${Icon} name="chevron" size=${16} /></summary>
48
+ if(diagnostic) return html`<details class="windows-cli-diagnostic-row"><summary><${CliProductMark} id=${cli.id} size=${24} /><strong>${cliLabel(cli.id)}</strong><span class="windows-cli-diagnostic-version">${cli.version || "—"}${paneVerificationTag(cli) ? html` ${paneVerificationTag(cli)}` : null}</span><span class=${`windows-cli-auth ${signedIn ? "tone-ready" : "tone-neutral"}`}><span class="windows-cli-dot"></span>${tn(authKey)}</span><${Icon} name="chevron" size=${16} /></summary>
39
49
  <div class="windows-cli-diagnostic-facts"><span class=${`windows-cli-badge ${cli.runnable ? "tone-ready" : "tone-neutral"}`}>${tn(cli.runnable ? "available" : cli.supports?.execution === false ? "detectionOnly" : "unavailableBadge")}</span><dl><dt>${tn("path")}</dt><dd><code class="windows-cli-path">${cli.path || tn("missing")}</code></dd>${cli.models?.length ? html`<dt>${tn("modelsFound")}</dt><dd><ul class="windows-cli-model-list">${cli.models.map(model=>html`<li key=${model.id}><code>${model.id}</code>${model.label && model.label!==model.id ? html`<span>${model.label}</span>` : null}</li>`)}</ul></dd>` : null}</dl>${cli.reason ? html`<p class="note">${cli.reason}</p>` : null}</div>
40
50
  </details>`;
41
51
  return html`<article class=${`windows-cli-provider is-${cli.id}`}>
@@ -44,7 +54,7 @@ function CliCard({ cli, probing, diagnostic = false }) {
44
54
  <div class="windows-cli-provider-name"><span>${providerLabel}</span><h3>${cliLabel(cli.id)}</h3></div>
45
55
  <span class=${`windows-cli-badge ${cli.runnable ? "tone-ready" : "tone-neutral"}`}>${tn(cli.runnable ? "available" : cli.supports?.execution === false ? "detectionOnly" : checking ? "checking" : "unavailableBadge")}</span>
46
56
  </div>
47
- <div class="windows-cli-provider-status"><span class=${`windows-cli-auth ${signedIn ? "tone-ready" : "tone-neutral"}`}><span class="windows-cli-dot"></span>${tn(authKey)}</span><span class="windows-cli-version">${cli.version || "—"}</span></div>
57
+ <div class="windows-cli-provider-status"><span class=${`windows-cli-auth ${signedIn ? "tone-ready" : "tone-neutral"}`}><span class="windows-cli-dot"></span>${tn(authKey)}</span><span class="windows-cli-version">${cli.version || "—"}${paneVerificationTag(cli) ? html` ${paneVerificationTag(cli)}` : null}</span></div>
48
58
  <details class="windows-cli-location"><summary>${tn("path")}<${Icon} name="chevron" size=${14} /></summary><code class="windows-cli-path">${cli.path || tn(checking ? "checking" : "notDetected")}</code></details>
49
59
  ${cli.reason ? html`<p class="note">${cli.reason}</p>` : null}
50
60
  </article>`;
@@ -1,7 +1,7 @@
1
1
  // #2911 (6): every page in the thread — the list the preview panel shows. A page is what preview-versions.js counts as
2
2
  // versions of one thing: the agent's complete ```html blocks with one <title> (the untitled ones together), or its
3
3
  // attached .html files of one name. Pure: the panel draws it; nothing here runs a preview.
4
- import "./chat-render.js";
4
+ import "/assets/chat-render.js";
5
5
  import { htmlTitle } from "./preview-versions.js";
6
6
 
7
7
  const R = () => globalThis.AgendChatRender;
@@ -13,13 +13,16 @@
13
13
  import { html, useEffect, useRef, useState } from "/assets/app-html.js";
14
14
  import { t } from "/assets/app-i18n.js";
15
15
  import { Icon } from "/assets/ui-icons.js";
16
- import "./chat-render.js";
17
- import "./preview.js";
18
- import { loadHtmlAttachment } from "./html-attachment.js";
19
- import { chatTime, onDayChange } from "./chat-time.js";
16
+ import "/assets/chat-render.js";
17
+ import "/assets/preview.js";
18
+ import { loadHtmlAttachment } from "/assets/html-attachment.js";
19
+ import { chatTime, onDayChange } from "/assets/chat-time.js";
20
20
  import { PanelActions } from "./preview-panel-actions.js";
21
21
  import { htmlTitle, versionsOf, lineDiff, diffHunks, DIFF_LIMITS } from "./preview-versions.js";
22
22
  import { pagesOf, pageIdOf } from "./preview-pages.js";
23
+ import { WorkspacePanel } from "./workspace-panel.js";
24
+ import { drawMarkdown, TEXT_CARD_MAX } from "/assets/chat-thread.js";
25
+ import "/assets/chat-md-strings.js"; // M-2448: the Markdown panel's own words (an older cached chat-strings.js lacks them)
23
26
 
24
27
  export { htmlTitle };
25
28
 
@@ -57,6 +60,23 @@ export function openPanel(spec, { run = false } = {}) {
57
60
  set({ open: { ...spec, kind: "html" }, run: run ? ++runs : 0 });
58
61
  retire(old); // State changes first: cleanup reentry cannot close a newer panel.
59
62
  }
63
+ /** #3153 P1: an agent's Files / Changes in the panel — `spec`: { key, instance } (read-only; nothing runs). */
64
+ export function openWorkspace(spec) {
65
+ const old = state.open;
66
+ set({ open: { ...spec, kind: "workspace" }, run: 0 });
67
+ retire(old);
68
+ }
69
+
70
+ /**
71
+ * M-2448: show a Markdown file in the panel — `spec`: { key, instance, msgKey, att: { id, name, size }, sender, ts,
72
+ * text? } (text: what the card's Show already read). Nothing runs: it is rendered by the chat's own Markdown renderer.
73
+ * The block shown before stops, as for any open.
74
+ */
75
+ export function openMarkdown(spec) {
76
+ const old = state.open;
77
+ set({ open: { ...spec, kind: "md" }, run: 0 });
78
+ retire(old);
79
+ }
60
80
  /** Close publishes the empty slot before old-owner callbacks can reenter. */
61
81
  export function closePanel() {
62
82
  const old = state.open; if (!old) return;
@@ -363,7 +383,35 @@ export function PreviewPanel({ name, split, msgs, subscribe, keyOf, reveal, down
363
383
  }
364
384
  return () => { live = false; };
365
385
  }, [shown, open && open.key, prev && prev.key]);
386
+ // M-2448: a Markdown file's text (read once per open: the same capped, same-origin read as the chat's card) and
387
+ // which view shows it — rendered (the chat's Markdown renderer, which escapes first) or its source.
388
+ const [md, setMd] = useState(null); // { state: "loading" | "ready" | "failed", text?, reason? }
389
+ const [mdView, setMdView] = useState("rendered");
390
+ const [mdPlain, setMdPlain] = useState(false);
391
+ const mdBody = useRef(null);
392
+ const isMd = !!open && open.kind === "md";
393
+ useEffect(() => {
394
+ if (!isMd) { setMd(null); return undefined; }
395
+ setMdView("rendered");
396
+ if (typeof open.text === "string") { setMd({ state: "ready", text: open.text }); return undefined; }
397
+ let live = true;
398
+ setMd({ state: "loading" });
399
+ loadHtmlAttachment(open.att, undefined, { ask: TEXT_CARD_MAX, max: TEXT_CARD_MAX }).then((r) => {
400
+ if (!live) return;
401
+ setMd(r.ok ? { state: "ready", text: r.code } : { state: "failed", reason: r.reason === "over" ? t("chat.tcOver") : attReason(r) });
402
+ }, () => { if (live) setMd({ state: "failed", reason: t("chat.pvAttFailed") }); });
403
+ return () => { live = false; };
404
+ }, [isMd && open.key]);
405
+ useEffect(() => {
406
+ if (!isMd || !md || md.state !== "ready" || mdView !== "rendered" || !mdBody.current) return;
407
+ setMdPlain(drawMarkdown(mdBody.current, md.text) === "plain");
408
+ }, [isMd && open.key, md, mdView]);
366
409
  const fileName = open && open.att ? open.att.name : undefined;
410
+ // The divider between the thread and the panel (both kinds): drag, or the arrow keys, Home and End.
411
+ function divider0() {
412
+ return html`<div data-trust="preview" class="pv-divider" ref=${divider} role="separator" aria-orientation="vertical" tabindex="0" aria-label=${t("chat.pvResize")}
413
+ aria-valuemin=${String(MIN_PANEL)} onKeyDown=${onKey} onPointerDown=${onDown}></div>`;
414
+ }
367
415
  // Esc in the panel closes it (and is not the chat's "stop the reply").
368
416
  const onPanelKey = (e) => {
369
417
  if (e.key !== "Escape" || e.isComposing) return;
@@ -372,6 +420,10 @@ export function PreviewPanel({ name, split, msgs, subscribe, keyOf, reveal, down
372
420
  };
373
421
 
374
422
  if (!open) return null;
423
+ if (open.kind === "workspace") return html`${divider0()}
424
+ <${WorkspacePanel} open=${open} name=${name} panel=${panel} fs=${fs} enterFs=${enterFs} leaveFs=${leaveFs} onKey=${onPanelKey} subscribe=${subscribe} close=${closePanel} />`;
425
+ if (isMd) return html`${divider0()}<${MarkdownPanel} open=${open} name=${name} md=${md} view=${mdView} setView=${setMdView} plain=${mdPlain}
426
+ body=${mdBody} panel=${panel} fs=${fs} enterFs=${enterFs} leaveFs=${leaveFs} onKey=${onPanelKey} reveal=${reveal} />`;
375
427
  const going = run.state === "starting" || run.state === "running";
376
428
  const a = P().availability();
377
429
  // #1554: a device that has not allowed previews is offered the same "Allow previews" here (the same confirm). Allowing
@@ -390,8 +442,7 @@ export function PreviewPanel({ name, split, msgs, subscribe, keyOf, reveal, down
390
442
  if (want && pending.current === want && panelStore.get().run === want) start();
391
443
  };
392
444
  const source = t("chat.pvSource", open.sender || name, timeOf(open.ts));
393
- return html`<div data-trust="preview" class="pv-divider" ref=${divider} role="separator" aria-orientation="vertical" tabindex="0" aria-label=${t("chat.pvResize")}
394
- aria-valuemin=${String(MIN_PANEL)} onKeyDown=${onKey} onPointerDown=${onDown}></div>
445
+ return html`${divider0()}
395
446
  <aside data-trust="preview" class=${`pv-panel${fs ? ` pv-fs pv-fs-${fs}` : ""}`} ref=${panel} aria-label=${t("chat.pvPanel")} onKeyDown=${onPanelKey}>
396
447
  <div class="pv-panel-head">
397
448
  <button type="button" class="icon-btn only-narrow pv-panel-close" title=${t("chat.pvBack")} aria-label=${t("chat.pvBack")} onClick=${closePanel}><${Icon} name="back" size=${18} /></button>
@@ -440,6 +491,41 @@ export function PreviewPanel({ name, split, msgs, subscribe, keyOf, reveal, down
440
491
  </aside>`;
441
492
  }
442
493
 
494
+ /**
495
+ * M-2448: a Markdown file in the panel — the HTML preview's frame (head, source, close, full screen; a full-screen
496
+ * sheet on a phone), with Rendered / Source and Download. Nothing in the file runs: Rendered is the chat's Markdown
497
+ * renderer (escaped first, no raw HTML), Source is text.
498
+ */
499
+ function MarkdownPanel({ open, name, md, view, setView, plain, body, panel, fs, enterFs, leaveFs, onKey, reveal }) {
500
+ const source = t("chat.pvSource", open.sender || name, timeOf(open.ts));
501
+ const ready = md && md.state === "ready";
502
+ return html`<aside data-trust="preview" class=${`pv-panel pv-md-panel${fs ? ` pv-fs pv-fs-${fs}` : ""}`} ref=${panel} aria-label=${t("chat.pvMdPanel")} onKeyDown=${onKey}>
503
+ <div class="pv-panel-head">
504
+ <button type="button" class="icon-btn only-narrow pv-panel-close" title=${t("chat.pvBack")} aria-label=${t("chat.pvBack")} onClick=${closePanel}><${Icon} name="back" size=${18} /></button>
505
+ <div class="pv-panel-title"><strong>${open.att ? open.att.name : t("chat.pvMdPanel")}</strong>
506
+ <button type="button" class="pv-source" title=${source} onClick=${() => { if (window.matchMedia && window.matchMedia("(max-width: 899px)").matches) closePanel(); reveal(open.msgKey); }}>${source}</button></div>
507
+ <button type="button" class="icon-btn only-wide pv-panel-close" title=${t("chat.pvClose")} aria-label=${t("chat.pvClose")} onClick=${closePanel}><${Icon} name="close" size=${18} /></button>
508
+ </div>
509
+ <div class="pv-panel-bar">
510
+ <div class="seg-inline" role="group" aria-label=${t("chat.pvMdPanel")}>
511
+ <button type="button" class=${`btn btn-sm${view === "rendered" ? " on" : ""}`} aria-pressed=${view === "rendered" ? "true" : "false"} title=${t("chat.pvMdRendered")} onClick=${() => setView("rendered")}><${Icon} name="eye" size=${14} /><span class="lbl">${t("chat.pvMdRendered")}</span></button>
512
+ <button type="button" class=${`btn btn-sm${view === "source" ? " on" : ""}`} aria-pressed=${view === "source" ? "true" : "false"} title=${t("chat.pvMdSource")} onClick=${() => setView("source")}><${Icon} name="code" size=${14} /><span class="lbl">${t("chat.pvMdSource")}</span></button>
513
+ </div>
514
+ <span class="grow"></span>
515
+ <button type="button" class=${`btn btn-sm only-wide pv-panel-fs${fs ? " on" : ""}`} aria-pressed=${fs ? "true" : "false"} title=${t(fs ? "chat.pvFsExit" : "chat.pvFs")} aria-label=${t(fs ? "chat.pvFsExit" : "chat.pvFs")}
516
+ onClick=${() => (fs ? leaveFs() : enterFs())}><${Icon} name=${fs ? "fullscreenexit" : "fullscreen"} size=${14} /></button>
517
+ ${open.att ? html`<a class="btn btn-sm pv-panel-dl" href=${`/ui/file/${open.att.id}`} download=${open.att.name} title=${t("chat.pvDownload")}><${Icon} name="download" size=${14} /><span class="lbl">${t("chat.pvDownload")}</span></a>` : null}
518
+ </div>
519
+ ${md && md.state === "loading" ? html`<div class="pv-note" role="status">${t("chat.pvLoading")}</div>` : null}
520
+ ${md && md.state === "failed" ? html`<div class="pv-note" role="alert">${md.reason}</div>` : null}
521
+ ${ready && view === "rendered" && plain ? html`<div class="pv-note" role="status">${t("chat.tcPlain")}</div>` : null}
522
+ <div class="pv-panel-body show-code">
523
+ ${ready && view === "rendered" ? html`<div class="pv-code pv-md" ref=${body}></div>` : null}
524
+ ${ready && view === "source" ? html`<pre class="pv-code"><code>${md.text}</code></pre>` : null}
525
+ </div>
526
+ </aside>`;
527
+ }
528
+
443
529
  /** The Changes view: hunks of the line diff as a unified diff shows them, drawn as text (never as HTML). */
444
530
  function Changes({ changes }) {
445
531
  if (!changes || changes.state === "loading") return html`<div class="pv-note pv-diff-note">${t("chat.pvLoading")}</div>`;
@@ -1,7 +1,7 @@
1
1
  // #2911 (1): the versions of a page in the preview panel, and the changes from one to the next. Pure functions: the
2
2
  // panel (preview-panel.js) draws them. Nothing here runs a preview — a version is shown as any block is, waiting for
3
3
  // Preview (#1481 §14).
4
- import "./chat-render.js";
4
+ import "/assets/chat-render.js";
5
5
 
6
6
  const R = () => globalThis.AgendChatRender;
7
7