@songsid/agend 2.3.1 → 2.3.2-beta.10

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 (338) hide show
  1. package/THIRD_PARTY_NOTICES.md +40 -0
  2. package/dist/agent-cli.js +21 -2
  3. package/dist/agent-cli.js.map +1 -1
  4. package/dist/agent-endpoint.js +5 -0
  5. package/dist/agent-endpoint.js.map +1 -1
  6. package/dist/antigravity-usage-scan.d.ts +58 -0
  7. package/dist/antigravity-usage-scan.js +257 -0
  8. package/dist/antigravity-usage-scan.js.map +1 -0
  9. package/dist/antigravity-usage-worker.d.ts +1 -0
  10. package/dist/antigravity-usage-worker.js +10 -0
  11. package/dist/antigravity-usage-worker.js.map +1 -0
  12. package/dist/auth-api.js +4 -0
  13. package/dist/auth-api.js.map +1 -1
  14. package/dist/authority/authority-state.d.ts +4 -0
  15. package/dist/authority/authority-state.js +16 -10
  16. package/dist/authority/authority-state.js.map +1 -1
  17. package/dist/authority/session-authorizations.d.ts +7 -1
  18. package/dist/authority/session-authorizations.js +6 -4
  19. package/dist/authority/session-authorizations.js.map +1 -1
  20. package/dist/authority/web-authority.d.ts +19 -6
  21. package/dist/authority/web-authority.js +22 -8
  22. package/dist/authority/web-authority.js.map +1 -1
  23. package/dist/backend/kiro-identity.d.ts +64 -0
  24. package/dist/backend/kiro-identity.js +101 -0
  25. package/dist/backend/kiro-identity.js.map +1 -1
  26. package/dist/backend/kiro-retired-model.d.ts +62 -0
  27. package/dist/backend/kiro-retired-model.js +160 -0
  28. package/dist/backend/kiro-retired-model.js.map +1 -0
  29. package/dist/backend/kiro.d.ts +71 -2
  30. package/dist/backend/kiro.js +352 -11
  31. package/dist/backend/kiro.js.map +1 -1
  32. package/dist/backend/types.d.ts +59 -0
  33. package/dist/backend/types.js.map +1 -1
  34. package/dist/backend-signin-guide.d.ts +1 -0
  35. package/dist/backend-signin-guide.js +9 -0
  36. package/dist/backend-signin-guide.js.map +1 -0
  37. package/dist/backend-signin-pending.d.ts +10 -0
  38. package/dist/backend-signin-pending.js +44 -0
  39. package/dist/backend-signin-pending.js.map +1 -0
  40. package/dist/browser-backend-signins.d.ts +56 -0
  41. package/dist/browser-backend-signins.js +189 -0
  42. package/dist/browser-backend-signins.js.map +1 -0
  43. package/dist/cache-ledger.d.ts +38 -2
  44. package/dist/cache-ledger.js +133 -8
  45. package/dist/cache-ledger.js.map +1 -1
  46. package/dist/cache-prices.d.ts +2 -1
  47. package/dist/cache-prices.js +5 -2
  48. package/dist/cache-prices.js.map +1 -1
  49. package/dist/cache-service.d.ts +68 -0
  50. package/dist/cache-service.js +355 -13
  51. package/dist/cache-service.js.map +1 -1
  52. package/dist/channel/adapters/discord.d.ts +13 -0
  53. package/dist/channel/adapters/discord.js +103 -16
  54. package/dist/channel/adapters/discord.js.map +1 -1
  55. package/dist/channel/mcp-tools.js +34 -7
  56. package/dist/channel/mcp-tools.js.map +1 -1
  57. package/dist/channel/tool-router.js +2 -1
  58. package/dist/channel/tool-router.js.map +1 -1
  59. package/dist/channel/types.d.ts +11 -0
  60. package/dist/classic-channel-manager.d.ts +11 -0
  61. package/dist/classic-channel-manager.js +39 -1
  62. package/dist/classic-channel-manager.js.map +1 -1
  63. package/dist/cli.js +21 -2
  64. package/dist/cli.js.map +1 -1
  65. package/dist/config-validator.d.ts +7 -1
  66. package/dist/config-validator.js +92 -12
  67. package/dist/config-validator.js.map +1 -1
  68. package/dist/config.d.ts +19 -0
  69. package/dist/config.js +31 -1
  70. package/dist/config.js.map +1 -1
  71. package/dist/cpu-quota.d.ts +23 -0
  72. package/dist/cpu-quota.js +86 -0
  73. package/dist/cpu-quota.js.map +1 -0
  74. package/dist/daemon.d.ts +57 -3
  75. package/dist/daemon.js +330 -50
  76. package/dist/daemon.js.map +1 -1
  77. package/dist/dashboard-permissions.d.ts +20 -6
  78. package/dist/dashboard-permissions.js +58 -9
  79. package/dist/dashboard-permissions.js.map +1 -1
  80. package/dist/delivery-outbox.d.ts +12 -1
  81. package/dist/delivery-outbox.js +67 -15
  82. package/dist/delivery-outbox.js.map +1 -1
  83. package/dist/doctor.d.ts +3 -0
  84. package/dist/doctor.js +11 -1
  85. package/dist/doctor.js.map +1 -1
  86. package/dist/event-log.d.ts +5 -0
  87. package/dist/event-log.js +13 -0
  88. package/dist/event-log.js.map +1 -1
  89. package/dist/fleet-manager.d.ts +212 -0
  90. package/dist/fleet-manager.js +914 -111
  91. package/dist/fleet-manager.js.map +1 -1
  92. package/dist/fleet-process-handlers.d.ts +1 -0
  93. package/dist/fleet-process-handlers.js +9 -1
  94. package/dist/fleet-process-handlers.js.map +1 -1
  95. package/dist/forged-envelope-scan.d.ts +9 -0
  96. package/dist/forged-envelope-scan.js +30 -5
  97. package/dist/forged-envelope-scan.js.map +1 -1
  98. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +5 -2
  99. package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +14 -1
  100. package/dist/general-knowledge/skills/web-appearance/SKILL.canvas-worker-off.md +28 -5
  101. package/dist/general-knowledge/skills/web-appearance/SKILL.md +31 -8
  102. package/dist/general-knowledge/skills/web-dashboard/SKILL.canvas-worker-off.md +138 -59
  103. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +145 -61
  104. package/dist/guest-seen-people.d.ts +38 -0
  105. package/dist/guest-seen-people.js +78 -0
  106. package/dist/guest-seen-people.js.map +1 -0
  107. package/dist/instance-config-impact.js +14 -6
  108. package/dist/instance-config-impact.js.map +1 -1
  109. package/dist/instance-lifecycle.d.ts +20 -0
  110. package/dist/instance-lifecycle.js +71 -13
  111. package/dist/instance-lifecycle.js.map +1 -1
  112. package/dist/kiro-db-reader.d.ts +5 -0
  113. package/dist/kiro-db-reader.js +18 -0
  114. package/dist/kiro-db-reader.js.map +1 -1
  115. package/dist/kiro-engine-status.d.ts +2 -0
  116. package/dist/kiro-engine-status.js +9 -0
  117. package/dist/kiro-engine-status.js.map +1 -1
  118. package/dist/kiro-migrate.d.ts +49 -0
  119. package/dist/kiro-migrate.js +105 -0
  120. package/dist/kiro-migrate.js.map +1 -0
  121. package/dist/kiro-transcript-lane.d.ts +2 -0
  122. package/dist/kiro-transcript-lane.js.map +1 -1
  123. package/dist/kiro-transcript-worker.js +1 -0
  124. package/dist/kiro-transcript-worker.js.map +1 -1
  125. package/dist/kiro-tui-forensic.d.ts +7 -0
  126. package/dist/kiro-tui-forensic.js +110 -0
  127. package/dist/kiro-tui-forensic.js.map +1 -0
  128. package/dist/kiro-usage-run.d.ts +7 -0
  129. package/dist/kiro-usage-run.js +39 -0
  130. package/dist/kiro-usage-run.js.map +1 -0
  131. package/dist/kiro-usage-scan.d.ts +49 -0
  132. package/dist/kiro-usage-scan.js +223 -0
  133. package/dist/kiro-usage-scan.js.map +1 -0
  134. package/dist/kiro-usage-worker.d.ts +1 -0
  135. package/dist/kiro-usage-worker.js +10 -0
  136. package/dist/kiro-usage-worker.js.map +1 -0
  137. package/dist/kiro-usage.d.ts +58 -0
  138. package/dist/kiro-usage.js +310 -0
  139. package/dist/kiro-usage.js.map +1 -0
  140. package/dist/locale.js +120 -12
  141. package/dist/locale.js.map +1 -1
  142. package/dist/log-service.js +1 -1
  143. package/dist/log-service.js.map +1 -1
  144. package/dist/login-url.d.ts +4 -0
  145. package/dist/login-url.js +22 -0
  146. package/dist/login-url.js.map +1 -0
  147. package/dist/mac-auto-restore.d.ts +117 -0
  148. package/dist/mac-auto-restore.js +294 -0
  149. package/dist/mac-auto-restore.js.map +1 -0
  150. package/dist/needs-you-hub.d.ts +2 -1
  151. package/dist/needs-you-hub.js +1 -1
  152. package/dist/needs-you-hub.js.map +1 -1
  153. package/dist/needs-you.d.ts +8 -2
  154. package/dist/needs-you.js +6 -0
  155. package/dist/needs-you.js.map +1 -1
  156. package/dist/notice-delivery.d.ts +16 -0
  157. package/dist/notice-delivery.js +35 -0
  158. package/dist/notice-delivery.js.map +1 -0
  159. package/dist/office-share-page.d.ts +16 -0
  160. package/dist/office-share-page.js +85 -0
  161. package/dist/office-share-page.js.map +1 -0
  162. package/dist/office-share-service.d.ts +91 -0
  163. package/dist/office-share-service.js +176 -0
  164. package/dist/office-share-service.js.map +1 -0
  165. package/dist/office-share.d.ts +258 -0
  166. package/dist/office-share.js +549 -0
  167. package/dist/office-share.js.map +1 -0
  168. package/dist/opencode-usage-scan.d.ts +28 -0
  169. package/dist/opencode-usage-scan.js +92 -0
  170. package/dist/opencode-usage-scan.js.map +1 -0
  171. package/dist/opencode-usage-worker.d.ts +1 -0
  172. package/dist/opencode-usage-worker.js +10 -0
  173. package/dist/opencode-usage-worker.js.map +1 -0
  174. package/dist/outbound-handlers.js +22 -2
  175. package/dist/outbound-handlers.js.map +1 -1
  176. package/dist/outbound-schemas.d.ts +28 -2
  177. package/dist/outbound-schemas.js +29 -2
  178. package/dist/outbound-schemas.js.map +1 -1
  179. package/dist/public-web-gateway.js +16 -2
  180. package/dist/public-web-gateway.js.map +1 -1
  181. package/dist/quickstart-api.js +13 -2
  182. package/dist/quickstart-api.js.map +1 -1
  183. package/dist/quickstart.js +2 -1
  184. package/dist/quickstart.js.map +1 -1
  185. package/dist/remote-card-answer.d.ts +83 -0
  186. package/dist/remote-card-answer.js +208 -0
  187. package/dist/remote-card-answer.js.map +1 -0
  188. package/dist/reply-triggers.d.ts +2 -0
  189. package/dist/reply-triggers.js +3 -0
  190. package/dist/reply-triggers.js.map +1 -0
  191. package/dist/settings-api.d.ts +28 -0
  192. package/dist/settings-api.js +148 -17
  193. package/dist/settings-api.js.map +1 -1
  194. package/dist/settings-change.js +54 -17
  195. package/dist/settings-change.js.map +1 -1
  196. package/dist/settings-effect.js +12 -3
  197. package/dist/settings-effect.js.map +1 -1
  198. package/dist/settings-instance-patch.js +4 -1
  199. package/dist/settings-instance-patch.js.map +1 -1
  200. package/dist/setup-form.d.ts +1 -1
  201. package/dist/setup-form.js +55 -6
  202. package/dist/setup-form.js.map +1 -1
  203. package/dist/setup-host.d.ts +9 -0
  204. package/dist/setup-host.js +127 -6
  205. package/dist/setup-host.js.map +1 -1
  206. package/dist/setup-signin-assets.d.ts +2 -0
  207. package/dist/setup-signin-assets.js +6 -0
  208. package/dist/setup-signin-assets.js.map +1 -0
  209. package/dist/setup-wizard.js +2 -0
  210. package/dist/setup-wizard.js.map +1 -1
  211. package/dist/start-attempt.d.ts +9 -5
  212. package/dist/start-attempt.js +27 -8
  213. package/dist/start-attempt.js.map +1 -1
  214. package/dist/start-failure-chat.d.ts +4 -0
  215. package/dist/start-failure-chat.js +23 -6
  216. package/dist/start-failure-chat.js.map +1 -1
  217. package/dist/start-failure-notice.d.ts +4 -0
  218. package/dist/start-failure-notice.js +8 -0
  219. package/dist/start-failure-notice.js.map +1 -1
  220. package/dist/start-failure.d.ts +25 -0
  221. package/dist/start-failure.js +75 -2
  222. package/dist/start-failure.js.map +1 -1
  223. package/dist/structured-signin-transport.d.ts +8 -0
  224. package/dist/structured-signin-transport.js +79 -0
  225. package/dist/structured-signin-transport.js.map +1 -0
  226. package/dist/structured-signin.d.ts +131 -0
  227. package/dist/structured-signin.js +388 -0
  228. package/dist/structured-signin.js.map +1 -0
  229. package/dist/tool-permissions.js +12 -0
  230. package/dist/tool-permissions.js.map +1 -1
  231. package/dist/topic-commands.js +6 -2
  232. package/dist/topic-commands.js.map +1 -1
  233. package/dist/transcript-sources.d.ts +26 -2
  234. package/dist/transcript-sources.js +103 -40
  235. package/dist/transcript-sources.js.map +1 -1
  236. package/dist/turn-reply-guard.d.ts +25 -0
  237. package/dist/turn-reply-guard.js +111 -12
  238. package/dist/turn-reply-guard.js.map +1 -1
  239. package/dist/types.d.ts +46 -9
  240. package/dist/ui/backend-signin.js +68 -12
  241. package/dist/ui/chat-ambient.js +1 -1
  242. package/dist/ui/chat-effects.js +4 -4
  243. package/dist/ui/chat-render.js +5 -2
  244. package/dist/ui/chat-strings.js +4 -4
  245. package/dist/ui/chat-thread.js +2 -2
  246. package/dist/ui/first-run.js +2 -2
  247. package/dist/ui/fleet-canvas-view.js +114 -0
  248. package/dist/ui/fleet-canvas.js +15 -77
  249. package/dist/ui/fleet-office-editor.js +94 -14
  250. package/dist/ui/fleet-office-layout.js +235 -0
  251. package/dist/ui/fleet-office-model.js +12 -6
  252. package/dist/ui/fleet-office-overview.js +167 -0
  253. package/dist/ui/fleet-office-pack.d.ts +44 -0
  254. package/dist/ui/fleet-office-pack.js +352 -37
  255. package/dist/ui/fleet-office-skin.js +220 -36
  256. package/dist/ui/fleet-office-store.js +112 -7
  257. package/dist/ui/fleet-office-view.js +155 -0
  258. package/dist/ui/fleet-office-zones.js +264 -42
  259. package/dist/ui/fleet-office.js +957 -160
  260. package/dist/ui/fleet-usage.js +26 -21
  261. package/dist/ui/office-share-dialog.js +145 -0
  262. package/dist/ui/office-share-page.js +164 -0
  263. package/dist/ui/panel-chat.js +9 -2
  264. package/dist/ui/panel-details.js +2 -2
  265. package/dist/ui/panel-fleet.js +11 -77
  266. package/dist/ui/panel-log.js +4 -4
  267. package/dist/ui/panel-needs.js +4 -4
  268. package/dist/ui/panel-settings.js +608 -167
  269. package/dist/ui/search-dialog.js +26 -7
  270. package/dist/ui/settings-appearance.js +82 -29
  271. package/dist/ui/settings-apply.js +42 -7
  272. package/dist/ui/settings-dialogs.js +76 -23
  273. package/dist/ui/settings-draft.js +51 -0
  274. package/dist/ui/settings-guests.js +255 -79
  275. package/dist/ui/settings-learn.js +2 -2
  276. package/dist/ui/settings-model.js +16 -6
  277. package/dist/ui/settings-registry.js +146 -0
  278. package/dist/ui/settings-strings.js +116 -44
  279. package/dist/ui/settings-web-authority.js +34 -23
  280. package/dist/ui/shared/app-i18n.js +18 -2
  281. package/dist/ui/shared/app-nav.js +10 -5
  282. package/dist/ui/shared/app-prefs.js +80 -2
  283. package/dist/ui/shared/app-route.js +39 -5
  284. package/dist/ui/shared/app-shell.js +73 -10
  285. package/dist/ui/shared/app-stream.js +3 -1
  286. package/dist/ui/shared/app.css +307 -17
  287. package/dist/ui/shared/app.js +3 -0
  288. package/dist/ui/shared/effect-stock-trust.js +1 -1
  289. package/dist/ui/shared/identity-color.js +4 -4
  290. package/dist/ui/shared/office/cozy.png +0 -0
  291. package/dist/ui/shared/side-panel.js +95 -0
  292. package/dist/ui/shared/signin.js +2 -2
  293. package/dist/ui/shared/ui-dialog.js +6 -1
  294. package/dist/ui/shared/ui-icons.js +2 -0
  295. package/dist/ui/shared/web-authorize.js +13 -12
  296. package/dist/ui/structured-signin.js +115 -0
  297. package/dist/usage-report.d.ts +20 -0
  298. package/dist/usage-report.js +54 -17
  299. package/dist/usage-report.js.map +1 -1
  300. package/dist/usage-rollup.d.ts +9 -1
  301. package/dist/usage-rollup.js +20 -4
  302. package/dist/usage-rollup.js.map +1 -1
  303. package/dist/web-api.d.ts +26 -2
  304. package/dist/web-api.js +361 -5
  305. package/dist/web-api.js.map +1 -1
  306. package/dist/web-auth.js +8 -2
  307. package/dist/web-auth.js.map +1 -1
  308. package/dist/web-backend-login.d.ts +1 -7
  309. package/dist/web-backend-login.js +2 -24
  310. package/dist/web-backend-login.js.map +1 -1
  311. package/dist/web-experimental.d.ts +1 -1
  312. package/dist/web-experimental.js +1 -1
  313. package/dist/web-experimental.js.map +1 -1
  314. package/dist/web-mod-agent.js +2 -2
  315. package/dist/web-mod-agent.js.map +1 -1
  316. package/dist/web-office-acts.d.ts +173 -0
  317. package/dist/web-office-acts.js +285 -0
  318. package/dist/web-office-acts.js.map +1 -0
  319. package/dist/web-office-skins.d.ts +109 -0
  320. package/dist/web-office-skins.js +299 -0
  321. package/dist/web-office-skins.js.map +1 -0
  322. package/dist/web-office-store.d.ts +8 -2
  323. package/dist/web-office-store.js +77 -14
  324. package/dist/web-office-store.js.map +1 -1
  325. package/dist/web-settings-patch.d.ts +8 -1
  326. package/dist/web-settings-patch.js +65 -5
  327. package/dist/web-settings-patch.js.map +1 -1
  328. package/dist/web-shell-routes.d.ts +4 -2
  329. package/dist/web-shell-routes.js +17 -7
  330. package/dist/web-shell-routes.js.map +1 -1
  331. package/dist/working-recovery.d.ts +104 -0
  332. package/dist/working-recovery.js +298 -0
  333. package/dist/working-recovery.js.map +1 -0
  334. package/dist/working-state-journal.d.ts +5 -1
  335. package/dist/working-state-journal.js +31 -3
  336. package/dist/working-state-journal.js.map +1 -1
  337. package/package.json +3 -2
  338. package/templates/windows-shortcuts.ps1 +155 -140
@@ -0,0 +1,35 @@
1
+ /** Sign-in notices post in the topic unless turned off; a legacy "dm" or `notice_delivery.login` route reads as on. */
2
+ export function loginNoticeMode(web) {
3
+ return web?.notify_login !== false;
4
+ }
5
+ /** Daily tips always post in the General topic; an old "dm" reads as on. */
6
+ export function tipNoticeMode(config) {
7
+ return config.defaults.tips !== false;
8
+ }
9
+ /** Disk keeps only the boolean field; setting it clears the stale `notice_delivery` route #2591 stored beside it. */
10
+ export function setNoticeMode(config, kind, mode) {
11
+ const web = config.web = { ...config.web };
12
+ const delivery = { ...web.notice_delivery };
13
+ delete delivery[kind];
14
+ if (Object.keys(delivery).length)
15
+ web.notice_delivery = delivery;
16
+ else
17
+ delete web.notice_delivery;
18
+ if (kind === "login")
19
+ web.notify_login = mode !== false;
20
+ else
21
+ config.defaults.tips = mode !== false;
22
+ }
23
+ /** Accept the short-lived #2581 string form and #2591's routes, but write back only booleans. */
24
+ export function normalizeNoticeDelivery(config) {
25
+ if (config.web?.notify_login === "dm" || config.web?.notice_delivery?.login)
26
+ setNoticeMode(config, "login", config.web.notify_login !== false);
27
+ if (config.defaults.tips === "dm" || config.web?.notice_delivery?.tips)
28
+ setNoticeMode(config, "tips", config.defaults.tips !== false);
29
+ // Even an empty `notice_delivery: {}` is dropped, or the startup migration would rewrite the file on every start.
30
+ if (config.web && Object.hasOwn(config.web, "notice_delivery")) {
31
+ config.web = { ...config.web };
32
+ delete config.web.notice_delivery;
33
+ }
34
+ }
35
+ //# sourceMappingURL=notice-delivery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notice-delivery.js","sourceRoot":"","sources":["../src/notice-delivery.ts"],"names":[],"mappings":"AAKA,uHAAuH;AACvH,MAAM,UAAU,eAAe,CAAC,GAAe;IAC7C,OAAO,GAAG,EAAE,YAAY,KAAK,KAAK,CAAC;AACrC,CAAC;AACD,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,MAAoB;IAChD,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC;AACxC,CAAC;AACD,qHAAqH;AACrH,MAAM,UAAU,aAAa,CAAC,MAAoB,EAAE,IAAsB,EAAE,IAAgB;IAC1F,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAG,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;IAC5C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtB,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM;QAAE,GAAG,CAAC,eAAe,GAAG,QAAQ,CAAC;;QAAM,OAAO,GAAG,CAAC,eAAe,CAAC;IAClG,IAAI,IAAI,KAAK,OAAO;QAAE,GAAG,CAAC,YAAY,GAAG,IAAI,KAAK,KAAK,CAAC;;QAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,KAAK,KAAK,CAAC;AACtG,CAAC;AACD,iGAAiG;AACjG,MAAM,UAAU,uBAAuB,CAAC,MAAoB;IAC1D,IAAI,MAAM,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK;QAAE,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC;IAC/I,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI;QAAE,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;IACtI,kHAAkH;IAClH,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAAC,MAAM,CAAC,GAAG,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,CAAC;QAAC,OAAO,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC;IAAC,CAAC;AACxI,CAAC"}
@@ -0,0 +1,16 @@
1
+ /** `/assets/<name>` → src/ui/shared/<name>: the share page's closure there, its stylesheets, the font they name and the
2
+ * Cozy style's picture (#2631). */
3
+ export declare const SHARE_ASSETS: Readonly<Record<string, string>>;
4
+ /** An asset kept below src/ui/shared/ rather than in it, by name. */
5
+ export declare const SHARE_ASSET_FILES: Readonly<Record<string, string>>;
6
+ /** `/ui/js/<name>` → src/ui/<name>: the share page's own module and the Office's. */
7
+ export declare const SHARE_MODULES: readonly string[];
8
+ /** A static file the share page loads, by its path on the share origin, or null (not one of them). */
9
+ export declare function officeShareStatic(path: string): {
10
+ body: Buffer;
11
+ type: string;
12
+ } | null;
13
+ /** The page's policy: its own scripts, styles, pictures and reads; nothing inline, nothing framed, no form. */
14
+ export declare const OFFICE_SHARE_PAGE_CSP: string;
15
+ /** The page itself: the same for every share (the module reads the token from the address). */
16
+ export declare const OFFICE_SHARE_PAGE = "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1, viewport-fit=cover\">\n<meta name=\"referrer\" content=\"no-referrer\">\n<meta name=\"robots\" content=\"noindex, nofollow\">\n<title>AgEnD Office</title>\n<link rel=\"stylesheet\" href=\"/assets/tokens.css\">\n<link rel=\"stylesheet\" href=\"/assets/app.css\">\n<script type=\"module\" src=\"/ui/js/office-share-page.js\"></script>\n</head>\n<body>\n<div id=\"app\" class=\"app-root\" data-share=\"1\"></div>\n<noscript><p class=\"noscript\">This live Office view needs JavaScript.</p></noscript>\n</body>\n</html>\n";
@@ -0,0 +1,85 @@
1
+ /**
2
+ * #2636: an Office share link's page and the static files it loads, as the share gateway serves them (office-share.ts).
3
+ *
4
+ * The page (`/o/<token>`) is a fixed document — no data in it, no inline script — that loads the share page's module
5
+ * (src/ui/office-share-page.js), which reads the share's own addresses. Its modules and stylesheets are served at the
6
+ * dashboard's own paths (`/assets/<name>`, `/ui/js/<name>`) so the Office's imports work unchanged, without a token:
7
+ * they are the app's static code (published with AgEnD), never data — and only the files named here, the page
8
+ * module's import closure (a test checks the list against the imports), not the directory.
9
+ */
10
+ import { readFileSync } from "node:fs";
11
+ import { dirname, join } from "node:path";
12
+ import { fileURLToPath } from "node:url";
13
+ const UI_DIR = join(dirname(fileURLToPath(import.meta.url)), "ui");
14
+ const JS = "text/javascript; charset=utf-8";
15
+ /** `/assets/<name>` → src/ui/shared/<name>: the share page's closure there, its stylesheets, the font they name and the
16
+ * Cozy style's picture (#2631). */
17
+ export const SHARE_ASSETS = {
18
+ ...Object.fromEntries([
19
+ "app-ctx.js", "app-html.js", "app-i18n.js", "app-nav.js", "app-prefs.js", "app-route.js", "app-store.js", "app-themes.js", "header-tools.js",
20
+ "htm.module.js", "identity-color.js", "instance-nav.js", "owner-css.js", "preact-hooks.module.js", "preact.module.js", "read-stream.js",
21
+ "side-panel.js", "text-undo.js", "ui-confirm.js", "ui-dialog.js", "ui-icons.js", "ui-states.js", "ui-toast.js", "usage-dialog.js",
22
+ "view-roster-store.js", "view-strings.js",
23
+ ].map(name => [name, JS])),
24
+ "tokens.css": "text/css; charset=utf-8", "app.css": "text/css; charset=utf-8", "inter.woff2": "font/woff2", "office-cozy.png": "image/png",
25
+ };
26
+ /** An asset kept below src/ui/shared/ rather than in it, by name. */
27
+ export const SHARE_ASSET_FILES = { "inter.woff2": join("fonts", "inter.woff2"), "office-cozy.png": join("office", "cozy.png") };
28
+ /** `/ui/js/<name>` → src/ui/<name>: the share page's own module and the Office's. */
29
+ export const SHARE_MODULES = [
30
+ "office-share-page.js", "fleet-office.js", "fleet-office-model.js", "fleet-office-skin.js", "fleet-office-zones.js", "fleet-office-store.js",
31
+ "fleet-office-editor.js", "fleet-office-layout.js", "fleet-office-pack.js", "fleet-office-overview.js", "fleet-office-view.js",
32
+ "fleet-org.js", "fleet-canvas-layout.js", "fleet-canvas-view.js", "fleet-traffic.js", "office-share-dialog.js",
33
+ ];
34
+ const cache = new Map();
35
+ const read = (file) => {
36
+ const hit = cache.get(file);
37
+ if (hit)
38
+ return hit;
39
+ try {
40
+ const b = readFileSync(file);
41
+ cache.set(file, b);
42
+ return b;
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ };
48
+ /** A static file the share page loads, by its path on the share origin, or null (not one of them). */
49
+ export function officeShareStatic(path) {
50
+ const asset = /^\/assets\/([A-Za-z0-9_.-]+)$/.exec(path);
51
+ if (asset && Object.prototype.hasOwnProperty.call(SHARE_ASSETS, asset[1])) {
52
+ const name = asset[1];
53
+ const body = read(join(UI_DIR, "shared", SHARE_ASSET_FILES[name] ?? name));
54
+ return body ? { body, type: SHARE_ASSETS[name] } : null;
55
+ }
56
+ const mod = /^\/ui\/js\/([a-z0-9_-]+\.js)$/.exec(path);
57
+ if (mod && SHARE_MODULES.includes(mod[1])) {
58
+ const body = read(join(UI_DIR, mod[1]));
59
+ return body ? { body, type: JS } : null;
60
+ }
61
+ return null;
62
+ }
63
+ /** The page's policy: its own scripts, styles, pictures and reads; nothing inline, nothing framed, no form. */
64
+ export const OFFICE_SHARE_PAGE_CSP = "default-src 'none'; script-src 'self'; style-src 'self'; img-src 'self' data: blob:; font-src 'self'; "
65
+ + "connect-src 'self'; base-uri 'none'; form-action 'none'; frame-ancestors 'none'";
66
+ /** The page itself: the same for every share (the module reads the token from the address). */
67
+ export const OFFICE_SHARE_PAGE = `<!DOCTYPE html>
68
+ <html lang="en">
69
+ <head>
70
+ <meta charset="utf-8">
71
+ <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
72
+ <meta name="referrer" content="no-referrer">
73
+ <meta name="robots" content="noindex, nofollow">
74
+ <title>AgEnD Office</title>
75
+ <link rel="stylesheet" href="/assets/tokens.css">
76
+ <link rel="stylesheet" href="/assets/app.css">
77
+ <script type="module" src="/ui/js/office-share-page.js"></script>
78
+ </head>
79
+ <body>
80
+ <div id="app" class="app-root" data-share="1"></div>
81
+ <noscript><p class="noscript">This live Office view needs JavaScript.</p></noscript>
82
+ </body>
83
+ </html>
84
+ `;
85
+ //# sourceMappingURL=office-share-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"office-share-page.js","sourceRoot":"","sources":["../src/office-share-page.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * #2636 part 3: Office share links, running — the shares (office-share.ts OfficeShares), their gateway, and the quick
3
+ * tunnel they share. Design: #2636, confirmed with the leader's two additions (2026-10-25):
4
+ *
5
+ * - The tunnel starts with the first share and stops when the last one ends (expired, revoked, its owner no longer an
6
+ * admin, the feature turned off). trycloudflare.com limits new quick tunnels: a start it refuses (429) fails that one
7
+ * share with "try again later" — nothing retries on its own. A share is only handed out once the tunnel is up.
8
+ * - No step beyond the admin check (decision a94a1bab): whoever may make one gets the link at once.
9
+ * - Its own manager and lease (OFFICE_SHARE_TUNNEL_DIR): never the fleet's one tunnel lane (/web, /login) nor the
10
+ * public link's preview tunnel. A tunnel that goes away unexpectedly ends every share (their address was its host).
11
+ */
12
+ import { OfficeShares, createOfficeShareGateway, type OfficeShare, type OfficeShareSource } from "./office-share.js";
13
+ import { type PublicLinkFailure } from "./public-link-progress.js";
14
+ import { type ManagedTunnel } from "./tunnel/manager.js";
15
+ import type { TunnelProvider } from "./tunnel/types.js";
16
+ /** Where the share tunnel keeps its own lease (never the fleet's `tunnel.lease`). */
17
+ export declare const OFFICE_SHARE_TUNNEL_DIR = "office-share-tunnel";
18
+ /** How often open shares are checked against who may still have them. */
19
+ export declare const SWEEP_MS = 30000;
20
+ export type OfficeShareRefusal = "disabled" | "office" | "duration" | "too_many" | "tunnel";
21
+ export type OfficeShareMade = {
22
+ ok: true;
23
+ share: OfficeShare;
24
+ url: string;
25
+ } | {
26
+ ok: false;
27
+ error: OfficeShareRefusal;
28
+ reason?: PublicLinkFailure | "exited";
29
+ };
30
+ export interface OfficeShareServiceDeps {
31
+ source: OfficeShareSource;
32
+ manager: Pick<ManagedTunnel, "start" | "stop">;
33
+ /** cloudflared, installed (pinned) if need be. */
34
+ ensure(signal: AbortSignal): Promise<{
35
+ path: string;
36
+ }>;
37
+ provider(binary: string): TunnelProvider;
38
+ /** `web.office_share` as it is now. */
39
+ config(): {
40
+ enabled?: boolean;
41
+ max_hours?: number;
42
+ } | undefined;
43
+ /** A stored office by id. */
44
+ officeExists(id: string): boolean;
45
+ /** Whether a share's owner may still have it (a fleet admin of this fleet). */
46
+ ownerCurrent(owner: string): boolean;
47
+ /** Every change to the open shares (Settings' card, General's notices are the caller's). */
48
+ changed?(shares: OfficeShare[]): void;
49
+ /** `detail`: fit for daemon.log — never a token or a URL. */
50
+ log?(event: string, detail?: string): void;
51
+ createGateway?: typeof createOfficeShareGateway;
52
+ shares?: OfficeShares;
53
+ }
54
+ export declare class OfficeShareService {
55
+ private readonly deps;
56
+ readonly shares: OfficeShares;
57
+ private gateway;
58
+ private origin;
59
+ private starting;
60
+ private stopping;
61
+ private abort;
62
+ private unsubscribe;
63
+ private readonly limiter;
64
+ /** #2662: the shares' pack pictures, each share's own minute — kept here so an ended share's key goes with it. */
65
+ private readonly pictureLimiter;
66
+ constructor(deps: OfficeShareServiceDeps);
67
+ enabled(): boolean;
68
+ list(): OfficeShare[];
69
+ /**
70
+ * A new share and its URL, once the tunnel is up. `minutes` 15–max_hours×60 (60 if not given); `office` ALL_OFFICES
71
+ * or a stored office's id. A tunnel that cannot start ends the share at once and says why.
72
+ */
73
+ create(opts: {
74
+ office: string;
75
+ minutes?: number;
76
+ text?: boolean;
77
+ owner: string;
78
+ }): Promise<OfficeShareMade>;
79
+ revoke(id: string): number;
80
+ /** Shares no longer allowed: the feature off (all), an owner no longer an admin, an office deleted. */
81
+ sweep(): number;
82
+ /** The fleet is stopping: every share ends and the tunnel goes. */
83
+ close(): Promise<void>;
84
+ private onChanged;
85
+ private known;
86
+ private sweeper;
87
+ /** The tunnel, up or coming up (one start at a time; never retried here). */
88
+ private up;
89
+ private start;
90
+ private down;
91
+ }
@@ -0,0 +1,176 @@
1
+ /**
2
+ * #2636 part 3: Office share links, running — the shares (office-share.ts OfficeShares), their gateway, and the quick
3
+ * tunnel they share. Design: #2636, confirmed with the leader's two additions (2026-10-25):
4
+ *
5
+ * - The tunnel starts with the first share and stops when the last one ends (expired, revoked, its owner no longer an
6
+ * admin, the feature turned off). trycloudflare.com limits new quick tunnels: a start it refuses (429) fails that one
7
+ * share with "try again later" — nothing retries on its own. A share is only handed out once the tunnel is up.
8
+ * - No step beyond the admin check (decision a94a1bab): whoever may make one gets the link at once.
9
+ * - Its own manager and lease (OFFICE_SHARE_TUNNEL_DIR): never the fleet's one tunnel lane (/web, /login) nor the
10
+ * public link's preview tunnel. A tunnel that goes away unexpectedly ends every share (their address was its host).
11
+ */
12
+ import { ALL_OFFICES, OfficeShareLimiter, OfficeShares, createOfficeShareGateway, shareMaxMinutes } from "./office-share.js";
13
+ import { OFFICE_SHARE_PAGE, OFFICE_SHARE_PAGE_CSP, officeShareStatic } from "./office-share-page.js";
14
+ import { failureOf } from "./public-link-progress.js";
15
+ import { newTunnelSid } from "./tunnel/manager.js";
16
+ /** Where the share tunnel keeps its own lease (never the fleet's `tunnel.lease`). */
17
+ export const OFFICE_SHARE_TUNNEL_DIR = "office-share-tunnel";
18
+ const QUICK_TUNNEL_HOST = /^[a-z0-9-]+\.trycloudflare\.com$/;
19
+ /** The lease's own end: none — the tunnel ends with its last share, not on a clock. */
20
+ const NO_EXPIRY_WALL = Number.MAX_SAFE_INTEGER;
21
+ /** How often open shares are checked against who may still have them. */
22
+ export const SWEEP_MS = 30_000;
23
+ export class OfficeShareService {
24
+ deps;
25
+ shares;
26
+ gateway = null;
27
+ origin = null;
28
+ starting = null;
29
+ stopping = null;
30
+ abort = null;
31
+ unsubscribe;
32
+ limiter = new OfficeShareLimiter();
33
+ /** #2662: the shares' pack pictures, each share's own minute — kept here so an ended share's key goes with it. */
34
+ pictureLimiter = new OfficeShareLimiter();
35
+ constructor(deps) {
36
+ this.deps = deps;
37
+ this.shares = deps.shares ?? new OfficeShares({ changed: list => this.onChanged(list) });
38
+ }
39
+ enabled() { return this.deps.config()?.enabled !== false; }
40
+ list() { return this.shares.list(); }
41
+ /**
42
+ * A new share and its URL, once the tunnel is up. `minutes` 15–max_hours×60 (60 if not given); `office` ALL_OFFICES
43
+ * or a stored office's id. A tunnel that cannot start ends the share at once and says why.
44
+ */
45
+ async create(opts) {
46
+ if (!this.enabled())
47
+ return { ok: false, error: "disabled" };
48
+ const made = this.shares.create({ ...opts, maxMinutes: shareMaxMinutes(this.deps.config()?.max_hours), exists: id => this.deps.officeExists(id) });
49
+ if (!made.ok)
50
+ return { ok: false, error: made.error };
51
+ const up = await this.up();
52
+ if (!up.ok) {
53
+ this.shares.revoke(made.share.id);
54
+ return { ok: false, error: "tunnel", reason: up.reason };
55
+ }
56
+ // Ended while the tunnel came up (revoked, or the feature turned off meanwhile): not handed out.
57
+ if (!this.shares.find(made.token))
58
+ return { ok: false, error: "tunnel", reason: "closed" };
59
+ return { ok: true, share: made.share, url: `${up.origin}/o/${made.token}` };
60
+ }
61
+ revoke(id) { return this.shares.revoke(id); }
62
+ /** Shares no longer allowed: the feature off (all), an owner no longer an admin, an office deleted. */
63
+ sweep() {
64
+ if (!this.enabled())
65
+ return this.shares.revoke("all");
66
+ return this.shares.endWhere(s => !this.deps.ownerCurrent(s.owner) || (s.office !== ALL_OFFICES && !this.deps.officeExists(s.office)));
67
+ }
68
+ /** The fleet is stopping: every share ends and the tunnel goes. */
69
+ async close() {
70
+ this.shares.revoke("all");
71
+ await this.down("fleet stopping");
72
+ }
73
+ onChanged(list) {
74
+ const open = new Set(list.map(s => s.id));
75
+ for (const id of this.known)
76
+ if (!open.has(id)) {
77
+ this.limiter.forget(id);
78
+ this.pictureLimiter.forget(id);
79
+ }
80
+ this.known = open;
81
+ // While any is open, who may still have it is asked again every SWEEP_MS (an admin removed, the feature turned
82
+ // off, an office deleted end theirs without anyone looking).
83
+ if (list.length && !this.sweeper) {
84
+ this.sweeper = setInterval(() => this.sweep(), SWEEP_MS);
85
+ this.sweeper.unref?.();
86
+ }
87
+ if (!list.length && this.sweeper) {
88
+ clearInterval(this.sweeper);
89
+ this.sweeper = null;
90
+ }
91
+ if (!list.length)
92
+ void this.down("no shares");
93
+ try {
94
+ this.deps.changed?.(list);
95
+ }
96
+ catch { /* a listener never keeps a share or the tunnel */ }
97
+ }
98
+ known = new Set();
99
+ sweeper = null;
100
+ /** The tunnel, up or coming up (one start at a time; never retried here). */
101
+ up() {
102
+ if (this.origin)
103
+ return Promise.resolve({ ok: true, origin: this.origin });
104
+ return this.starting ??= this.start().finally(() => { this.starting = null; });
105
+ }
106
+ async start() {
107
+ await this.stopping?.catch(() => { });
108
+ const abort = this.abort = new AbortController();
109
+ const gateway = (this.deps.createGateway ?? createOfficeShareGateway)({
110
+ shares: this.shares, source: this.deps.source, limiter: this.limiter, pictureLimiter: this.pictureLimiter, statics: officeShareStatic,
111
+ page: () => ({ body: OFFICE_SHARE_PAGE, csp: OFFICE_SHARE_PAGE_CSP }),
112
+ });
113
+ this.gateway = gateway;
114
+ const fail = (reason, detail) => {
115
+ this.deps.log?.(`tunnel ${reason}`, detail);
116
+ if (this.gateway === gateway) {
117
+ gateway.close();
118
+ this.gateway = null;
119
+ }
120
+ void this.deps.manager.stop(`start failed: ${reason}`).catch(() => { });
121
+ return { ok: false, reason };
122
+ };
123
+ try {
124
+ const binary = await this.deps.ensure(abort.signal);
125
+ if (abort.signal.aborted)
126
+ return fail("closed");
127
+ const origin = await gateway.listen();
128
+ if (abort.signal.aborted)
129
+ return fail("closed");
130
+ const result = await this.deps.manager.start(this.deps.provider(binary.path), {
131
+ sid: newTunnelSid(), origin, pagePath: "/ready", readinessMarker: gateway.readinessMarker, expiresAt: NO_EXPIRY_WALL,
132
+ signal: abort.signal, onCandidateHost: host => { if (!abort.signal.aborted)
133
+ gateway.setHost(host); },
134
+ });
135
+ if (!result.ok)
136
+ return fail(failureOf(result.errorKind), result.message);
137
+ if (abort.signal.aborted)
138
+ return fail("closed");
139
+ const published = new URL(result.handle.pageUrl);
140
+ if (published.protocol !== "https:" || published.pathname !== "/ready" || !QUICK_TUNNEL_HOST.test(published.host))
141
+ return fail("bad-address");
142
+ gateway.setHost(published.host);
143
+ this.origin = published.origin;
144
+ // Gone by itself: every share's address was this host — they end, and the next share starts a new tunnel.
145
+ this.unsubscribe = result.handle.onUnexpectedExit(() => {
146
+ this.deps.log?.("tunnel exited");
147
+ this.origin = null;
148
+ this.shares.revoke("all");
149
+ });
150
+ this.deps.log?.("tunnel ready");
151
+ return { ok: true, origin: published.origin };
152
+ }
153
+ catch (err) {
154
+ return fail(abort.signal.aborted ? "closed" : "unknown", err?.message);
155
+ }
156
+ }
157
+ down(reason) {
158
+ if (!this.origin && !this.starting && !this.gateway)
159
+ return this.stopping ?? Promise.resolve();
160
+ this.origin = null;
161
+ this.abort?.abort();
162
+ this.abort = null;
163
+ this.unsubscribe?.();
164
+ this.unsubscribe = undefined;
165
+ this.gateway?.setHost(null);
166
+ this.gateway?.close();
167
+ this.gateway = null;
168
+ const stopping = this.stopping = (async () => {
169
+ await this.starting?.catch(() => { });
170
+ return this.deps.manager.stop(reason);
171
+ })().catch(() => { }).finally(() => { if (this.stopping === stopping)
172
+ this.stopping = null; });
173
+ return stopping;
174
+ }
175
+ }
176
+ //# sourceMappingURL=office-share-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"office-share-service.js","sourceRoot":"","sources":["../src/office-share-service.ts"],"names":[],"mappings":"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"}