@songsid/agend 2.2.0 → 2.2.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 (447) hide show
  1. package/dist/agent-cli-instructions.md +5 -2
  2. package/dist/agent-cli.js +284 -2
  3. package/dist/agent-cli.js.map +1 -1
  4. package/dist/agent-endpoint.d.ts +2 -0
  5. package/dist/agent-endpoint.js +29 -0
  6. package/dist/agent-endpoint.js.map +1 -1
  7. package/dist/agent-file-read.d.ts +38 -0
  8. package/dist/agent-file-read.js +317 -0
  9. package/dist/agent-file-read.js.map +1 -0
  10. package/dist/agent-whats-new.d.ts +11 -0
  11. package/dist/agent-whats-new.js +34 -2
  12. package/dist/agent-whats-new.js.map +1 -1
  13. package/dist/atomic-write.js +9 -1
  14. package/dist/atomic-write.js.map +1 -1
  15. package/dist/auth-api.d.ts +30 -1
  16. package/dist/auth-api.js +61 -12
  17. package/dist/auth-api.js.map +1 -1
  18. package/dist/authority/authority-state.d.ts +38 -0
  19. package/dist/authority/authority-state.js +114 -0
  20. package/dist/authority/authority-state.js.map +1 -0
  21. package/dist/authority/session-authorizations.d.ts +43 -0
  22. package/dist/authority/session-authorizations.js +102 -0
  23. package/dist/authority/session-authorizations.js.map +1 -0
  24. package/dist/authority/web-authority.d.ts +120 -0
  25. package/dist/authority/web-authority.js +157 -0
  26. package/dist/authority/web-authority.js.map +1 -0
  27. package/dist/backend/antigravity.js +3 -3
  28. package/dist/backend/antigravity.js.map +1 -1
  29. package/dist/backend/claude-code.d.ts +2 -2
  30. package/dist/backend/claude-code.js +10 -5
  31. package/dist/backend/claude-code.js.map +1 -1
  32. package/dist/backend/launch-effort.js +1 -1
  33. package/dist/backend/launch-effort.js.map +1 -1
  34. package/dist/backend/muse.js +10 -2
  35. package/dist/backend/muse.js.map +1 -1
  36. package/dist/backend/types.d.ts +14 -0
  37. package/dist/backend/types.js +25 -0
  38. package/dist/backend/types.js.map +1 -1
  39. package/dist/backend-availability.d.ts +120 -0
  40. package/dist/backend-availability.js +396 -0
  41. package/dist/backend-availability.js.map +1 -0
  42. package/dist/backend-command.d.ts +21 -3
  43. package/dist/backend-command.js +23 -4
  44. package/dist/backend-command.js.map +1 -1
  45. package/dist/bundled-skills.d.ts +14 -0
  46. package/dist/bundled-skills.js +29 -0
  47. package/dist/bundled-skills.js.map +1 -0
  48. package/dist/cache-analysis.d.ts +47 -1
  49. package/dist/cache-analysis.js +68 -8
  50. package/dist/cache-analysis.js.map +1 -1
  51. package/dist/cache-ledger.d.ts +16 -3
  52. package/dist/cache-ledger.js +33 -13
  53. package/dist/cache-ledger.js.map +1 -1
  54. package/dist/cache-report-tool.d.ts +17 -0
  55. package/dist/cache-report-tool.js +40 -0
  56. package/dist/cache-report-tool.js.map +1 -0
  57. package/dist/cache-service.d.ts +70 -3
  58. package/dist/cache-service.js +178 -17
  59. package/dist/cache-service.js.map +1 -1
  60. package/dist/channel/adapters/discord-client-retirement.d.ts +5 -0
  61. package/dist/channel/adapters/discord-client-retirement.js +57 -0
  62. package/dist/channel/adapters/discord-client-retirement.js.map +1 -0
  63. package/dist/channel/adapters/discord.d.ts +11 -0
  64. package/dist/channel/adapters/discord.js +66 -6
  65. package/dist/channel/adapters/discord.js.map +1 -1
  66. package/dist/channel/adapters/telegram.d.ts +8 -1
  67. package/dist/channel/adapters/telegram.js +74 -4
  68. package/dist/channel/adapters/telegram.js.map +1 -1
  69. package/dist/channel/mcp-tools.js +48 -2
  70. package/dist/channel/mcp-tools.js.map +1 -1
  71. package/dist/channel/types.d.ts +21 -0
  72. package/dist/classic-channel-manager.d.ts +10 -5
  73. package/dist/classic-channel-manager.js +12 -9
  74. package/dist/classic-channel-manager.js.map +1 -1
  75. package/dist/cli.js +142 -110
  76. package/dist/cli.js.map +1 -1
  77. package/dist/config-validator.js +119 -4
  78. package/dist/config-validator.js.map +1 -1
  79. package/dist/daemon.d.ts +10 -0
  80. package/dist/daemon.js +327 -31
  81. package/dist/daemon.js.map +1 -1
  82. package/dist/decision-list.d.ts +25 -0
  83. package/dist/decision-list.js +30 -0
  84. package/dist/decision-list.js.map +1 -0
  85. package/dist/delivery-outbox.d.ts +10 -0
  86. package/dist/delivery-outbox.js +12 -1
  87. package/dist/delivery-outbox.js.map +1 -1
  88. package/dist/fleet-context.d.ts +15 -0
  89. package/dist/fleet-manager.d.ts +514 -12
  90. package/dist/fleet-manager.js +1885 -163
  91. package/dist/fleet-manager.js.map +1 -1
  92. package/dist/fleet-process-handlers.d.ts +18 -0
  93. package/dist/fleet-process-handlers.js +69 -0
  94. package/dist/fleet-process-handlers.js.map +1 -0
  95. package/dist/fleet-traffic.d.ts +74 -0
  96. package/dist/fleet-traffic.js +196 -0
  97. package/dist/fleet-traffic.js.map +1 -0
  98. package/dist/general-knowledge/skills/credential-profiles/SKILL.md +20 -5
  99. package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +6 -1
  100. package/dist/general-knowledge/skills/multi-channel/SKILL.md +3 -2
  101. package/dist/general-knowledge/skills/persona-emoji/SKILL.md +1 -1
  102. package/dist/general-knowledge/skills/web-appearance/SKILL.md +492 -0
  103. package/dist/general-knowledge/skills/web-dashboard/SKILL.md +482 -0
  104. package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
  105. package/dist/human-delivery-receipts.d.ts +24 -1
  106. package/dist/human-delivery-receipts.js +64 -11
  107. package/dist/human-delivery-receipts.js.map +1 -1
  108. package/dist/instance-avatar.js +3 -0
  109. package/dist/instance-avatar.js.map +1 -1
  110. package/dist/instance-config-impact.js +6 -1
  111. package/dist/instance-config-impact.js.map +1 -1
  112. package/dist/instance-lifecycle.d.ts +2 -0
  113. package/dist/instance-lifecycle.js +20 -10
  114. package/dist/instance-lifecycle.js.map +1 -1
  115. package/dist/instance-names.d.ts +4 -0
  116. package/dist/instance-names.js +12 -0
  117. package/dist/instance-names.js.map +1 -0
  118. package/dist/instructions.d.ts +12 -1
  119. package/dist/instructions.js +13 -2
  120. package/dist/instructions.js.map +1 -1
  121. package/dist/locale.js +100 -8
  122. package/dist/locale.js.map +1 -1
  123. package/dist/ls-attach-resolve.d.ts +95 -0
  124. package/dist/ls-attach-resolve.js +174 -0
  125. package/dist/ls-attach-resolve.js.map +1 -0
  126. package/dist/memory-hogs.d.ts +27 -0
  127. package/dist/memory-hogs.js +124 -0
  128. package/dist/memory-hogs.js.map +1 -0
  129. package/dist/needs-you-hub.d.ts +4 -0
  130. package/dist/needs-you-hub.js +31 -6
  131. package/dist/needs-you-hub.js.map +1 -1
  132. package/dist/needs-you.d.ts +1 -13
  133. package/dist/needs-you.js +3 -37
  134. package/dist/needs-you.js.map +1 -1
  135. package/dist/outbound-handlers.d.ts +15 -0
  136. package/dist/outbound-handlers.js +152 -11
  137. package/dist/outbound-handlers.js.map +1 -1
  138. package/dist/outbound-schemas.d.ts +228 -4
  139. package/dist/outbound-schemas.js +147 -1
  140. package/dist/outbound-schemas.js.map +1 -1
  141. package/dist/public-web-gateway.js +21 -1
  142. package/dist/public-web-gateway.js.map +1 -1
  143. package/dist/public-web-link.d.ts +9 -0
  144. package/dist/public-web-link.js +8 -0
  145. package/dist/public-web-link.js.map +1 -1
  146. package/dist/quickstart-api.d.ts +10 -1
  147. package/dist/quickstart-api.js +12 -4
  148. package/dist/quickstart-api.js.map +1 -1
  149. package/dist/reply-buttons-controller.d.ts +4 -0
  150. package/dist/reply-buttons-controller.js +2 -2
  151. package/dist/reply-buttons-controller.js.map +1 -1
  152. package/dist/repo-worktree-guard.d.ts +36 -0
  153. package/dist/repo-worktree-guard.js +143 -0
  154. package/dist/repo-worktree-guard.js.map +1 -0
  155. package/dist/restart-progress.d.ts +65 -1
  156. package/dist/restart-progress.js +236 -10
  157. package/dist/restart-progress.js.map +1 -1
  158. package/dist/rollout-index.d.ts +5 -0
  159. package/dist/rollout-index.js +26 -5
  160. package/dist/rollout-index.js.map +1 -1
  161. package/dist/scheduler/scheduler.d.ts +70 -1
  162. package/dist/scheduler/scheduler.js +256 -17
  163. package/dist/scheduler/scheduler.js.map +1 -1
  164. package/dist/service-installer.d.ts +2 -1
  165. package/dist/service-installer.js +18 -3
  166. package/dist/service-installer.js.map +1 -1
  167. package/dist/settings-api.d.ts +23 -0
  168. package/dist/settings-api.js +233 -2
  169. package/dist/settings-api.js.map +1 -1
  170. package/dist/settings-change.js +112 -0
  171. package/dist/settings-change.js.map +1 -1
  172. package/dist/settings-effect.js +32 -2
  173. package/dist/settings-effect.js.map +1 -1
  174. package/dist/settings-http-confirmation.js +5 -0
  175. package/dist/settings-http-confirmation.js.map +1 -1
  176. package/dist/tmux-manager.d.ts +5 -0
  177. package/dist/tmux-manager.js +16 -0
  178. package/dist/tmux-manager.js.map +1 -1
  179. package/dist/tool-permissions.d.ts +4 -6
  180. package/dist/tool-permissions.js +100 -2
  181. package/dist/tool-permissions.js.map +1 -1
  182. package/dist/topic-commands.d.ts +17 -7
  183. package/dist/topic-commands.js +39 -21
  184. package/dist/topic-commands.js.map +1 -1
  185. package/dist/topic-link.d.ts +128 -0
  186. package/dist/topic-link.js +269 -0
  187. package/dist/topic-link.js.map +1 -0
  188. package/dist/types.d.ts +61 -1
  189. package/dist/ui/app-effects.js +245 -0
  190. package/dist/ui/chat-ambient.js +307 -0
  191. package/dist/ui/chat-effect-posters.js +42 -0
  192. package/dist/ui/chat-effects.js +160 -0
  193. package/dist/ui/chat-live-replies.js +58 -0
  194. package/dist/ui/chat-render.js +25 -7
  195. package/dist/ui/chat-store.js +41 -13
  196. package/dist/ui/chat-strings.js +86 -2
  197. package/dist/ui/chat-thread.js +204 -37
  198. package/dist/ui/chat-tour.js +1 -1
  199. package/dist/ui/effect-trial-controller.js +124 -0
  200. package/dist/ui/effect-trial-offer.js +31 -0
  201. package/dist/ui/effect-trial-panel.js +40 -0
  202. package/dist/ui/fleet-cache.js +23 -1
  203. package/dist/ui/fleet-canvas-layout.js +111 -0
  204. package/dist/ui/fleet-canvas.js +525 -0
  205. package/dist/ui/fleet-org.js +27 -12
  206. package/dist/ui/fleet-traffic.js +343 -0
  207. package/dist/ui/fleet-usage.js +401 -0
  208. package/dist/ui/image-lightbox.js +1 -1
  209. package/dist/ui/panel-chat.js +252 -58
  210. package/dist/ui/panel-details.js +20 -6
  211. package/dist/ui/panel-fleet.js +45 -19
  212. package/dist/ui/panel-log.js +6 -6
  213. package/dist/ui/panel-needs.js +3 -3
  214. package/dist/ui/panel-settings.js +58 -13
  215. package/dist/ui/preview-panel.js +25 -9
  216. package/dist/ui/preview.js +3 -2
  217. package/dist/ui/settings-appearance.js +349 -0
  218. package/dist/ui/settings-catalog.js +92 -0
  219. package/dist/ui/settings-dialogs.js +40 -12
  220. package/dist/ui/settings-effects.js +202 -0
  221. package/dist/ui/settings-guests.js +117 -0
  222. package/dist/ui/settings-learn.js +25 -0
  223. package/dist/ui/settings-model.js +15 -6
  224. package/dist/ui/settings-mods.js +271 -0
  225. package/dist/ui/settings-owner-effects.js +80 -0
  226. package/dist/ui/settings-strings.js +335 -10
  227. package/dist/ui/settings-web-authority.js +91 -0
  228. package/dist/ui/shared/agend-auth.js +28 -4
  229. package/dist/ui/shared/agent-widget.js +248 -0
  230. package/dist/ui/shared/app-i18n.js +6 -2
  231. package/dist/ui/shared/app-prefs.js +34 -13
  232. package/dist/ui/shared/app-route.js +42 -2
  233. package/dist/ui/shared/app-session.js +3 -1
  234. package/dist/ui/shared/app-shell.js +119 -41
  235. package/dist/ui/shared/app-store.js +28 -1
  236. package/dist/ui/shared/app-stream.js +14 -7
  237. package/dist/ui/shared/app-themes.js +206 -0
  238. package/dist/ui/shared/app.css +566 -5
  239. package/dist/ui/shared/app.js +23 -10
  240. package/dist/ui/shared/card-strings.js +32 -0
  241. package/dist/ui/shared/effect-app-runtime.js +297 -0
  242. package/dist/ui/shared/effect-baseline.js +64 -0
  243. package/dist/ui/shared/effect-chat-runtime.js +167 -0
  244. package/dist/ui/shared/effect-cursor.js +125 -0
  245. package/dist/ui/shared/effect-frame.js +146 -0
  246. package/dist/ui/shared/effect-geometry.js +137 -0
  247. package/dist/ui/shared/effect-host-style.js +10 -0
  248. package/dist/ui/shared/effect-owner-regions.js +74 -0
  249. package/dist/ui/shared/effect-owner-source.js +122 -0
  250. package/dist/ui/shared/effect-policy.js +151 -0
  251. package/dist/ui/shared/effect-poster-reader.js +98 -0
  252. package/dist/ui/shared/effect-posters.js +117 -0
  253. package/dist/ui/shared/effect-profiler.js +184 -0
  254. package/dist/ui/shared/effect-profiles.js +65 -0
  255. package/dist/ui/shared/effect-registry.js +543 -0
  256. package/dist/ui/shared/effect-runtime-loader.js +234 -0
  257. package/dist/ui/shared/effect-safety.js +153 -0
  258. package/dist/ui/shared/effect-stock-snapshot.js +43 -0
  259. package/dist/ui/shared/effect-stock-trust.js +217 -0
  260. package/dist/ui/shared/effect-trial-shadow.js +62 -0
  261. package/dist/ui/shared/effect-trial-source.js +103 -0
  262. package/dist/ui/shared/effect-trial-stage.js +170 -0
  263. package/dist/ui/shared/effect-trial.css +40 -0
  264. package/dist/ui/shared/fx-motion.js +67 -0
  265. package/dist/ui/shared/header-tools.js +1 -1
  266. package/dist/ui/shared/identity-card.js +273 -0
  267. package/dist/ui/shared/identity-color.js +261 -0
  268. package/dist/ui/shared/instance-nav.js +215 -41
  269. package/dist/ui/shared/owner-css.js +250 -0
  270. package/dist/ui/shared/owner-effect-prefs.js +117 -0
  271. package/dist/ui/shared/panel-view.js +103 -10
  272. package/dist/ui/shared/signin.js +2 -0
  273. package/dist/ui/shared/tokens.css +9 -3
  274. package/dist/ui/shared/ui-dialog.js +1 -1
  275. package/dist/ui/shared/ui-icons.js +3 -0
  276. package/dist/ui/shared/ui-menu.js +1 -1
  277. package/dist/ui/shared/ui-toast.js +1 -1
  278. package/dist/ui/shared/usage-dialog.js +22 -2
  279. package/dist/ui/shared/view-strings.js +98 -2
  280. package/dist/ui/shared/web-authorize.js +151 -0
  281. package/dist/ui/signin.html +1 -0
  282. package/dist/ui/web-terminal/terminal.css +4 -4
  283. package/dist/usage/providers.d.ts +28 -0
  284. package/dist/usage/providers.js +126 -36
  285. package/dist/usage/providers.js.map +1 -1
  286. package/dist/usage-report.d.ts +158 -0
  287. package/dist/usage-report.js +226 -0
  288. package/dist/usage-report.js.map +1 -0
  289. package/dist/usage-rollup.d.ts +51 -0
  290. package/dist/usage-rollup.js +168 -0
  291. package/dist/usage-rollup.js.map +1 -0
  292. package/dist/view-api.d.ts +68 -0
  293. package/dist/view-api.js +249 -8
  294. package/dist/view-api.js.map +1 -1
  295. package/dist/web-ambient.d.ts +72 -0
  296. package/dist/web-ambient.js +161 -0
  297. package/dist/web-ambient.js.map +1 -0
  298. package/dist/web-api.d.ts +117 -7
  299. package/dist/web-api.js +1283 -70
  300. package/dist/web-api.js.map +1 -1
  301. package/dist/web-appearance-limits.d.ts +82 -0
  302. package/dist/web-appearance-limits.js +83 -0
  303. package/dist/web-appearance-limits.js.map +1 -0
  304. package/dist/web-appearance-policy.d.ts +64 -0
  305. package/dist/web-appearance-policy.js +87 -0
  306. package/dist/web-appearance-policy.js.map +1 -0
  307. package/dist/web-appearance-tools.d.ts +53 -0
  308. package/dist/web-appearance-tools.js +124 -0
  309. package/dist/web-appearance-tools.js.map +1 -0
  310. package/dist/web-appearance-view.d.ts +124 -0
  311. package/dist/web-appearance-view.js +278 -0
  312. package/dist/web-appearance-view.js.map +1 -0
  313. package/dist/web-appearance.d.ts +93 -0
  314. package/dist/web-appearance.js +373 -0
  315. package/dist/web-appearance.js.map +1 -0
  316. package/dist/web-asset-parts.d.ts +93 -0
  317. package/dist/web-asset-parts.js +133 -0
  318. package/dist/web-asset-parts.js.map +1 -0
  319. package/dist/web-auth.js +20 -2
  320. package/dist/web-auth.js.map +1 -1
  321. package/dist/web-card.d.ts +110 -0
  322. package/dist/web-card.js +266 -0
  323. package/dist/web-card.js.map +1 -0
  324. package/dist/web-channel-echo.d.ts +7 -1
  325. package/dist/web-channel-echo.js +6 -2
  326. package/dist/web-channel-echo.js.map +1 -1
  327. package/dist/web-chat-history.d.ts +63 -0
  328. package/dist/web-chat-history.js +109 -6
  329. package/dist/web-chat-history.js.map +1 -1
  330. package/dist/web-commands.d.ts +1 -0
  331. package/dist/web-effect-bootstrap.d.ts +12 -0
  332. package/dist/web-effect-bootstrap.js +49 -0
  333. package/dist/web-effect-bootstrap.js.map +1 -0
  334. package/dist/web-effect-bundle.d.ts +28 -0
  335. package/dist/web-effect-bundle.js +171 -0
  336. package/dist/web-effect-bundle.js.map +1 -0
  337. package/dist/web-effect-canonical.d.ts +8 -0
  338. package/dist/web-effect-canonical.js +27 -0
  339. package/dist/web-effect-canonical.js.map +1 -0
  340. package/dist/web-effect-library.d.ts +114 -0
  341. package/dist/web-effect-library.js +530 -0
  342. package/dist/web-effect-library.js.map +1 -0
  343. package/dist/web-effect-playback.d.ts +30 -0
  344. package/dist/web-effect-playback.js +71 -0
  345. package/dist/web-effect-playback.js.map +1 -0
  346. package/dist/web-effect-poster.d.ts +8 -0
  347. package/dist/web-effect-poster.js +52 -0
  348. package/dist/web-effect-poster.js.map +1 -0
  349. package/dist/web-effect-profiles.d.ts +118 -0
  350. package/dist/web-effect-profiles.js +180 -0
  351. package/dist/web-effect-profiles.js.map +1 -0
  352. package/dist/web-effect-service.d.ts +93 -0
  353. package/dist/web-effect-service.js +335 -0
  354. package/dist/web-effect-service.js.map +1 -0
  355. package/dist/web-effect-tools.d.ts +48 -0
  356. package/dist/web-effect-tools.js +129 -0
  357. package/dist/web-effect-tools.js.map +1 -0
  358. package/dist/web-effect-trials.d.ts +86 -0
  359. package/dist/web-effect-trials.js +204 -0
  360. package/dist/web-effect-trials.js.map +1 -0
  361. package/dist/web-effect-upload.d.ts +27 -0
  362. package/dist/web-effect-upload.js +185 -0
  363. package/dist/web-effect-upload.js.map +1 -0
  364. package/dist/web-effect-worker.d.ts +8 -0
  365. package/dist/web-effect-worker.js +170 -0
  366. package/dist/web-effect-worker.js.map +1 -0
  367. package/dist/web-effect.d.ts +103 -0
  368. package/dist/web-effect.js +153 -0
  369. package/dist/web-effect.js.map +1 -0
  370. package/dist/web-guest-access.d.ts +125 -0
  371. package/dist/web-guest-access.js +234 -0
  372. package/dist/web-guest-access.js.map +1 -0
  373. package/dist/web-guest-rooms.d.ts +82 -0
  374. package/dist/web-guest-rooms.js +135 -0
  375. package/dist/web-guest-rooms.js.map +1 -0
  376. package/dist/web-identity-color.d.ts +87 -0
  377. package/dist/web-identity-color.js +209 -0
  378. package/dist/web-identity-color.js.map +1 -0
  379. package/dist/web-identity-palette.d.ts +113 -0
  380. package/dist/web-identity-palette.js +84 -0
  381. package/dist/web-identity-palette.js.map +1 -0
  382. package/dist/web-image-meta.d.ts +38 -0
  383. package/dist/web-image-meta.js +262 -0
  384. package/dist/web-image-meta.js.map +1 -0
  385. package/dist/web-login.d.ts +47 -0
  386. package/dist/web-login.js +115 -0
  387. package/dist/web-login.js.map +1 -1
  388. package/dist/web-mod-agent.d.ts +50 -0
  389. package/dist/web-mod-agent.js +207 -0
  390. package/dist/web-mod-agent.js.map +1 -0
  391. package/dist/web-mod-bundle.d.ts +157 -0
  392. package/dist/web-mod-bundle.js +529 -0
  393. package/dist/web-mod-bundle.js.map +1 -0
  394. package/dist/web-mod-export.d.ts +68 -0
  395. package/dist/web-mod-export.js +100 -0
  396. package/dist/web-mod-export.js.map +1 -0
  397. package/dist/web-mod-store.d.ts +289 -0
  398. package/dist/web-mod-store.js +638 -0
  399. package/dist/web-mod-store.js.map +1 -0
  400. package/dist/web-org.d.ts +3 -3
  401. package/dist/web-org.js +11 -17
  402. package/dist/web-org.js.map +1 -1
  403. package/dist/web-owner-css-store.d.ts +222 -0
  404. package/dist/web-owner-css-store.js +440 -0
  405. package/dist/web-owner-css-store.js.map +1 -0
  406. package/dist/web-owner-css.d.ts +58 -0
  407. package/dist/web-owner-css.js +552 -0
  408. package/dist/web-owner-css.js.map +1 -0
  409. package/dist/web-prefs.d.ts +62 -0
  410. package/dist/web-prefs.js +232 -36
  411. package/dist/web-prefs.js.map +1 -1
  412. package/dist/web-preview.d.ts +15 -3
  413. package/dist/web-preview.js +28 -9
  414. package/dist/web-preview.js.map +1 -1
  415. package/dist/web-returning-device.d.ts +41 -0
  416. package/dist/web-returning-device.js +57 -5
  417. package/dist/web-returning-device.js.map +1 -1
  418. package/dist/web-session-authorization.d.ts +132 -0
  419. package/dist/web-session-authorization.js +193 -0
  420. package/dist/web-session-authorization.js.map +1 -0
  421. package/dist/web-session.d.ts +70 -10
  422. package/dist/web-session.js +137 -22
  423. package/dist/web-session.js.map +1 -1
  424. package/dist/web-settings-patch.d.ts +67 -2
  425. package/dist/web-settings-patch.js +196 -1
  426. package/dist/web-settings-patch.js.map +1 -1
  427. package/dist/web-settings-tools.d.ts +89 -0
  428. package/dist/web-settings-tools.js +273 -0
  429. package/dist/web-settings-tools.js.map +1 -0
  430. package/dist/web-shell-routes.d.ts +2 -2
  431. package/dist/web-shell-routes.js +2 -2
  432. package/dist/web-shell-routes.js.map +1 -1
  433. package/dist/web-theme-store.d.ts +257 -0
  434. package/dist/web-theme-store.js +627 -0
  435. package/dist/web-theme-store.js.map +1 -0
  436. package/dist/web-theme.d.ts +123 -0
  437. package/dist/web-theme.js +416 -0
  438. package/dist/web-theme.js.map +1 -0
  439. package/dist/web-upload.d.ts +13 -0
  440. package/dist/web-upload.js +39 -3
  441. package/dist/web-upload.js.map +1 -1
  442. package/dist/web-widget.d.ts +72 -0
  443. package/dist/web-widget.js +245 -0
  444. package/dist/web-widget.js.map +1 -0
  445. package/dist/workflow-templates/default.md +1 -1
  446. package/package.json +1 -1
  447. package/templates/systemd.service.ejs +8 -0
@@ -0,0 +1,373 @@
1
+ /**
2
+ * #1629 (first design §4, §6; r2 (a)–(c); r4-4): the agent's own theme tools — get_web_theme, set_web_theme,
3
+ * set_web_theme_asset, reset_web_theme, set_web_widget, remove_web_widget, set_web_ambient, clear_web_ambient (#2117) — and a person's reset, lock, widget removal and ambient. None takes a target: the caller is the
4
+ * instance its IPC connection or agent token belongs to, and only that instance's record is ever read or written.
5
+ *
6
+ * Every agent write: the fleet-wide switch (web.themes.agent_edit), then the person's lock, then the shared limiter's
7
+ * check, then validation and the write, then — only once it is on disk — the limiter's record. A refused, invalid or
8
+ * failed call costs nothing. A person's reset and lock are never limited.
9
+ */
10
+ import { AppearanceLimiter, agentAppearanceEditAllowed } from "./web-appearance-policy.js";
11
+ import { applyThemePatch, THEME_DEFAULTS } from "./web-theme.js";
12
+ import { createHash, randomBytes } from "node:crypto";
13
+ import { slotLimit, THEME_ASSET_SLOTS } from "./web-theme-store.js";
14
+ import { ASSET_PART_BYTES, ASSET_UPLOAD_MAX_BYTES } from "./web-asset-parts.js";
15
+ import { AMBIENT_KINDS, ambientKind, ambientProblems, checkAmbient } from "./web-ambient.js";
16
+ import { AGENT_WIDGET_SLOTS, carryWidgetData, checkWidgetData, checkWidgetSpec, mergeWidgetData, WIDGET_SLOTS } from "./web-widget.js";
17
+ /** An upload in parts with no new part for this long is dropped (monotonic clock). */
18
+ export const ASSET_UPLOAD_IDLE_MS = 60_000;
19
+ export class WebAppearance {
20
+ store;
21
+ webConfig;
22
+ changed;
23
+ clock;
24
+ limiter;
25
+ /** At most one upload in parts per instance (a new part 0 replaces it). */
26
+ uploads = new Map();
27
+ constructor(store, webConfig, changed = () => { }, limiter, clock = () => performance.now()) {
28
+ this.store = store;
29
+ this.webConfig = webConfig;
30
+ this.changed = changed;
31
+ this.clock = clock;
32
+ this.limiter = limiter ?? new AppearanceLimiter();
33
+ }
34
+ /** Why an agent may not write now, or null. */
35
+ refusal(instance, buckets) {
36
+ if (!agentAppearanceEditAllowed(this.webConfig()))
37
+ return { error: "theme_editing_off", message: "Agent theme and effect changes are turned off for this fleet (web.themes.agent_edit: false)." };
38
+ if (!this.store.readable())
39
+ return { error: "themes_unreadable", message: "The fleet's theme file cannot be read; nothing can be changed until it is fixed." };
40
+ if (this.store.get(instance).locked)
41
+ return { error: "locked", message: "Theme and effects are locked by a person." };
42
+ const limit = this.limiter.check(instance, buckets);
43
+ return limit.ok ? null : { ...limit, message: `Too many changes; try again in ${limit.retry_after_s} s.` };
44
+ }
45
+ /** The effect tools share this exact switch/lock/limiter policy; no parallel gate or bucket. */
46
+ authorizeEffect(instance, buckets) { return this.refusal(instance, buckets); }
47
+ /** get_web_theme: the caller's theme and everything an agent needs to write a good one. */
48
+ getTheme(instance) {
49
+ const r = this.store.get(instance);
50
+ return {
51
+ effects: r.placements.effects,
52
+ theme: r.theme, by: r.by, locked: r.locked, agent_edit: agentAppearanceEditAllowed(this.webConfig()),
53
+ defaults: THEME_DEFAULTS,
54
+ assets: r.assets.map(a => ({ id: a.id, slot: a.slot, bytes: a.bytes })),
55
+ widgets: Object.fromEntries(AGENT_WIDGET_SLOTS.flatMap(slot => { const w = r.placements.widgets[slot]; return w ? [[slot, { spec: w.spec, data: w.data, by: w.by }]] : []; })),
56
+ ambient: Object.fromEntries(AMBIENT_KINDS.flatMap(k => { const a = r.placements.ambient[k]; return a ? [[k, { spec: a.spec, by: a.by }]] : []; })),
57
+ limits: { ...this.limiter.remaining(instance), ...this.assetLimits() },
58
+ };
59
+ }
60
+ /** The upload limits in force now (r4.1 Q3 (b): the card's come from web.appearance), so an agent can size its files. */
61
+ assetLimits() {
62
+ const limits = this.store.limits();
63
+ const asset_slots = {};
64
+ for (const slot of THEME_ASSET_SLOTS) {
65
+ const l = slotLimit(slot, limits);
66
+ asset_slots[slot] = { max_width: l.maxWidth, max_height: l.maxHeight, max_bytes: l.maxBytes };
67
+ }
68
+ return { asset_slots, asset_quota: { ...limits.quota } };
69
+ }
70
+ /** set_web_theme { set?, clear? }: all or nothing. `{}` is a no-op (and counts as nothing). */
71
+ setTheme(instance, patch) {
72
+ const isNoop = !!patch && typeof patch === "object" && !Array.isArray(patch) && Object.keys(patch).length === 0;
73
+ if (isNoop)
74
+ return { theme: this.store.get(instance).theme, rev: this.store.rev() };
75
+ const refused = this.refusal(instance, ["change"]);
76
+ if (refused)
77
+ return refused;
78
+ const current = this.store.get(instance);
79
+ const next = applyThemePatch(current.theme, patch, { assets: new Set(current.assets.map(a => a.id)), slotOf: id => current.assets.find(a => a.id === id)?.slot });
80
+ if (!next.ok)
81
+ return { errors: next.errors };
82
+ const w = this.store.setTheme(instance, next.theme, "agent");
83
+ if (!w.ok)
84
+ return { error: w.error, ...(w.detail ? { detail: w.detail } : {}) };
85
+ this.limiter.record(instance, ["change"]);
86
+ this.changed();
87
+ return { theme: w.theme, rev: w.rev };
88
+ }
89
+ /**
90
+ * set_web_theme_asset { slot, data_b64, part? }: the bytes the daemon or the CLI read on the agent's side — whole, or
91
+ * in parts (web-asset-parts.ts). The switch and the lock are asked at the first part and again before the picture is
92
+ * stored; uploads are not counted (the user's decision) — the slot's size limits and the picture quota still apply.
93
+ */
94
+ setAsset(instance, args) {
95
+ if (typeof args.data_b64 !== "string" || !/^[A-Za-z0-9+/]*={0,2}$/.test(args.data_b64))
96
+ return { error: "data", message: "The picture's bytes are missing." };
97
+ if (args.part !== undefined)
98
+ return this.setAssetPart(instance, args.slot, args.data_b64, args.part);
99
+ const refused = this.refusal(instance, []);
100
+ if (refused)
101
+ return refused;
102
+ return this.storeAsset(instance, args.slot, Buffer.from(args.data_b64, "base64"));
103
+ }
104
+ storeAsset(instance, slot, bytes) {
105
+ const w = this.store.addAsset(instance, slot, bytes);
106
+ if (!w.ok)
107
+ return { error: w.error, ...(w.detail ? { detail: w.detail } : {}) };
108
+ return { id: w.id };
109
+ }
110
+ setAssetPart(instance, slot, data, raw) {
111
+ const fail = (error, message) => { this.uploads.delete(instance); return { error, message }; };
112
+ const p = raw;
113
+ if (!p || typeof p !== "object" || Array.isArray(p))
114
+ return fail("part", "part: { index, count, bytes, sha256, upload? }");
115
+ const { index, count, bytes, sha256 } = p;
116
+ if (!Number.isSafeInteger(index) || !Number.isSafeInteger(count) || !Number.isSafeInteger(bytes) || typeof sha256 !== "string" || !/^[0-9a-f]{64}$/.test(sha256))
117
+ return fail("part", "part: { index, count, bytes, sha256, upload? }");
118
+ const chunk = Buffer.from(data, "base64");
119
+ if (chunk.length < 1 || chunk.length > ASSET_PART_BYTES)
120
+ return fail("part", `each part is 1..${ASSET_PART_BYTES} bytes`);
121
+ const now = this.clock();
122
+ // Uploads left idle by any instance go, so at most one picture's parts per active upload stay in memory.
123
+ for (const [name, u] of this.uploads)
124
+ if (now - u.last > ASSET_UPLOAD_IDLE_MS && name !== instance)
125
+ this.uploads.delete(name);
126
+ if (index === 0) {
127
+ const refused = this.refusal(instance, []);
128
+ if (refused) {
129
+ this.uploads.delete(instance);
130
+ return refused;
131
+ }
132
+ if (!THEME_ASSET_SLOTS.includes(slot))
133
+ return fail("slot", THEME_ASSET_SLOTS.join(", "));
134
+ const max = Math.min(ASSET_UPLOAD_MAX_BYTES, slotLimit(slot, this.store.limits()).maxBytes);
135
+ if (bytes < 1 || bytes > max)
136
+ return fail("asset_too_large", `at most ${max / 1024} KiB for ${String(slot)}`);
137
+ if (count !== Math.ceil(bytes / ASSET_PART_BYTES))
138
+ return fail("part", "count does not match bytes");
139
+ this.uploads.set(instance, { id: randomBytes(8).toString("hex"), slot: slot, count: count, next: 0, bytes: bytes, sha256, parts: [], received: 0, last: now });
140
+ }
141
+ const up = this.uploads.get(instance);
142
+ if (!up || (index !== 0 && p.upload !== up.id))
143
+ return fail("upload", "No such upload in progress: start again from part 0.");
144
+ if (now - up.last > ASSET_UPLOAD_IDLE_MS)
145
+ return fail("upload", "The upload waited too long between parts: start again from part 0.");
146
+ if (index !== up.next || count !== up.count || bytes !== up.bytes || sha256 !== up.sha256 || slot !== up.slot)
147
+ return fail("part", `expected part ${up.next} of the same upload`);
148
+ if (up.received + chunk.length > up.bytes)
149
+ return fail("part", "more bytes than declared");
150
+ up.parts.push(chunk);
151
+ up.received += chunk.length;
152
+ up.next += 1;
153
+ up.last = now;
154
+ if (up.next < up.count)
155
+ return { upload: up.id, received: up.received };
156
+ this.uploads.delete(instance);
157
+ const all = Buffer.concat(up.parts);
158
+ if (all.length !== up.bytes || createHash("sha256").update(all).digest("hex") !== up.sha256)
159
+ return { error: "part", message: "The parts do not add up to the declared picture." };
160
+ const refused = this.refusal(instance, []);
161
+ if (refused)
162
+ return refused;
163
+ return this.storeAsset(instance, up.slot, all);
164
+ }
165
+ /** reset_web_theme: the agent can always undo itself (a change for the limit). */
166
+ resetTheme(instance) {
167
+ const refused = this.refusal(instance, ["change"]);
168
+ if (refused)
169
+ return refused;
170
+ const w = this.store.reset(instance, "agent");
171
+ if (!w.ok)
172
+ return { error: w.error };
173
+ this.limiter.record(instance, ["change"]);
174
+ this.changed();
175
+ return { theme: { v: 1 } };
176
+ }
177
+ /** A person's reset (Details, the chat menu): theme, placements and pictures go; the lock stays. Not limited. */
178
+ humanReset(instance) {
179
+ this.uploads.delete(instance);
180
+ const w = this.store.reset(instance, "human");
181
+ if (!w.ok)
182
+ return { error: w.error, status: w.status };
183
+ this.changed();
184
+ return { ok: true, rev: w.rev };
185
+ }
186
+ /** A person's lock (r2 (a)). Not limited. */
187
+ humanLock(instance, locked) {
188
+ const w = this.store.setLocked(instance, locked);
189
+ if (!w.ok)
190
+ return { error: w.error, status: w.status };
191
+ this.changed();
192
+ return { ok: true, locked, rev: w.rev };
193
+ }
194
+ /**
195
+ * set_web_widget { slot, spec?, data? } (r4-4): place a widget in one of its own slots (`spec`, a change), or give
196
+ * the one there new values (`data` alone: merged, null removes a key — its own budget, 10 s apart). A widget a person
197
+ * placed takes the agent's values but is never replaced by it. `sidebar` is the person's: owner_slot.
198
+ */
199
+ setWidget(instance, args) {
200
+ const slot = this.agentSlot(args.slot);
201
+ if (typeof slot !== "string")
202
+ return slot;
203
+ if (args.spec === undefined && args.data === undefined)
204
+ return { error: "args", message: "Give spec (to place a widget) or data (new values for the one placed)." };
205
+ const current = this.store.get(instance).placements.widgets[slot];
206
+ if (args.spec === undefined) {
207
+ const refused = this.refusal(instance, ["data"]);
208
+ if (refused)
209
+ return refused;
210
+ if (!current)
211
+ return { error: "no_widget", message: `Nothing is placed in ${slot}: give a spec first.` };
212
+ const data = mergeWidgetData(current.data, args.data, current.spec);
213
+ if (!data.ok)
214
+ return { errors: data.errors };
215
+ const w = this.store.setWidgetData(instance, slot, data.value, "agent");
216
+ if (!w.ok)
217
+ return { error: w.error, ...(w.detail ? { detail: w.detail } : {}) };
218
+ this.limiter.record(instance, ["data"]);
219
+ this.changed();
220
+ return { slot, widget: { spec: w.widget.spec, data: w.widget.data, by: w.widget.by }, rev: w.rev };
221
+ }
222
+ const refused = this.refusal(instance, ["change"]);
223
+ if (refused)
224
+ return refused;
225
+ if (current?.by === "human")
226
+ return { error: "person_placed", message: `A person placed the widget in ${slot}: you can give it values (data), but not replace or remove it.` };
227
+ const spec = checkWidgetSpec(args.spec, slot);
228
+ if (!spec.ok)
229
+ return { errors: spec.errors };
230
+ const data = args.data === undefined ? { ok: true, value: carryWidgetData(current?.data ?? {}, spec.value) } : checkWidgetData(args.data, spec.value);
231
+ if (!data.ok)
232
+ return { errors: data.errors };
233
+ const w = this.store.setWidget(instance, slot, spec.value, data.value, "agent");
234
+ if (!w.ok)
235
+ return { error: w.error, ...(w.detail ? { detail: w.detail } : {}) };
236
+ this.limiter.record(instance, ["change"]);
237
+ this.changed();
238
+ return { slot, widget: { spec: w.widget.spec, data: w.widget.data, by: w.widget.by }, rev: w.rev };
239
+ }
240
+ /** remove_web_widget { slot? } (r4-4): its own widgets, from one slot or both; a person's placement stays (a change). */
241
+ removeWidget(instance, args) {
242
+ let slots = [...AGENT_WIDGET_SLOTS];
243
+ if (args.slot !== undefined) {
244
+ const slot = this.agentSlot(args.slot);
245
+ if (typeof slot !== "string")
246
+ return slot;
247
+ slots = [slot];
248
+ }
249
+ const refused = this.refusal(instance, ["change"]);
250
+ if (refused)
251
+ return refused;
252
+ const placed = this.store.get(instance).placements.widgets;
253
+ const kept = slots.filter(s => placed[s]?.by === "human");
254
+ if (args.slot !== undefined && kept.length)
255
+ return { error: "person_placed", message: `A person placed the widget in ${kept[0]}; only a person removes it.` };
256
+ const mine = slots.filter(s => placed[s]?.by === "agent");
257
+ if (!mine.length)
258
+ return { removed: [], ...(kept.length ? { kept } : {}) };
259
+ const w = this.store.removeWidgets(instance, mine, "agent");
260
+ if (!w.ok)
261
+ return { error: w.error, ...(w.detail ? { detail: w.detail } : {}) };
262
+ this.limiter.record(instance, ["change"]);
263
+ this.changed();
264
+ return { removed: w.removed, ...(kept.length ? { kept } : {}), rev: w.rev };
265
+ }
266
+ agentSlot(raw) {
267
+ if (raw === "sidebar")
268
+ return { error: "owner_slot", message: "The sidebar is a person's; place your widget in chat_header or details." };
269
+ if (!WIDGET_SLOTS.includes(raw))
270
+ return { error: "slot", message: AGENT_WIDGET_SLOTS.join(" or ") };
271
+ return raw;
272
+ }
273
+ /**
274
+ * set_web_ambient { preset, glyphs, … } (#2117): its own ambient, in the place its preset goes (one looping, one
275
+ * click), placed or replaced (a change). One a person set is never replaced by the agent.
276
+ */
277
+ setAmbient(instance, args) {
278
+ const refused = this.refusal(instance, ["change"]);
279
+ if (refused)
280
+ return refused;
281
+ const r = this.store.get(instance);
282
+ const spec = checkAmbient(args, { glyphAsset: id => r.assets.some(a => a.id === id && a.slot === "glyph") });
283
+ if (!spec.ok)
284
+ return { errors: spec.errors };
285
+ const kind = ambientKind(spec.value.preset);
286
+ if (r.placements.ambient[kind]?.by === "human")
287
+ return { error: "person_placed", message: `A person set the ${kind === "click" ? "click" : "looping"} ambient; only a person changes or clears it.` };
288
+ const w = this.store.setAmbient(instance, spec.value, "agent");
289
+ if (!w.ok)
290
+ return { error: w.error, ...(w.detail ? { detail: w.detail } : {}) };
291
+ this.limiter.record(instance, ["change"]);
292
+ this.changed();
293
+ return { kind: w.kind, ambient: { spec: w.ambient.spec, by: w.ambient.by }, rev: w.rev };
294
+ }
295
+ /** clear_web_ambient { which? } (#2117): its own ambients, one kind or both; a person's stays (a change). */
296
+ clearAmbient(instance, args) {
297
+ let kinds = [...AMBIENT_KINDS];
298
+ if (args.which !== undefined) {
299
+ if (!AMBIENT_KINDS.includes(args.which))
300
+ return { error: "which", message: AMBIENT_KINDS.join(" or ") };
301
+ kinds = [args.which];
302
+ }
303
+ const refused = this.refusal(instance, ["change"]);
304
+ if (refused)
305
+ return refused;
306
+ const placed = this.store.get(instance).placements.ambient;
307
+ const kept = kinds.filter(k => placed[k]?.by === "human");
308
+ if (args.which !== undefined && kept.length)
309
+ return { error: "person_placed", message: `A person set the ${kept[0]} ambient; only a person clears it.` };
310
+ const mine = kinds.filter(k => placed[k]?.by === "agent");
311
+ if (!mine.length)
312
+ return { removed: [], ...(kept.length ? { kept } : {}) };
313
+ const w = this.store.clearAmbient(instance, mine, "agent");
314
+ if (!w.ok)
315
+ return { error: w.error, ...(w.detail ? { detail: w.detail } : {}) };
316
+ this.limiter.record(instance, ["change"]);
317
+ this.changed();
318
+ return { removed: w.removed, ...(kept.length ? { kept } : {}), rev: w.rev };
319
+ }
320
+ /**
321
+ * A person's ambient for an agent (General's set_web_settings, an admin session): a spec sets the place its preset
322
+ * goes, null with `which` clears that one (both without). Not limited; the lock is not needed (it binds agents).
323
+ */
324
+ humanSetAmbient(instance, spec, which) {
325
+ if (spec === null) {
326
+ if (which !== undefined && !AMBIENT_KINDS.includes(which))
327
+ return { error: "which", status: 400, message: AMBIENT_KINDS.join(" or ") };
328
+ const w = this.store.clearAmbient(instance, which === undefined ? AMBIENT_KINDS : [which], "human");
329
+ if (!w.ok)
330
+ return { error: w.error, status: w.status };
331
+ if (w.removed.length)
332
+ this.changed();
333
+ return { ok: true, removed: w.removed, rev: w.rev };
334
+ }
335
+ const r = this.store.get(instance);
336
+ const checked = checkAmbient(spec, { glyphAsset: id => r.assets.some(a => a.id === id && a.slot === "glyph") });
337
+ if (!checked.ok)
338
+ return { error: "ambient", status: 400, message: ambientProblems(checked.errors) };
339
+ const w = this.store.setAmbient(instance, checked.value, "human");
340
+ if (!w.ok)
341
+ return { error: w.error, status: w.status };
342
+ this.changed();
343
+ return { ok: true, kind: w.kind, ambient: { spec: w.ambient.spec, by: w.ambient.by }, rev: w.rev };
344
+ }
345
+ /** A person's removal of an agent's widget (Details, an admin session). Not limited; the lock is not needed. */
346
+ humanRemoveWidget(instance, slot) {
347
+ if (!AGENT_WIDGET_SLOTS.includes(slot))
348
+ return { error: "slot", status: 400 };
349
+ const w = this.store.removeWidgets(instance, [slot], "human");
350
+ if (!w.ok)
351
+ return { error: w.error, status: w.status };
352
+ if (w.removed.length)
353
+ this.changed(); // nothing placed there: nothing written, nothing announced
354
+ return { ok: true, removed: w.removed, rev: w.rev };
355
+ }
356
+ /** An instance was removed: its counters and any upload in progress go. */
357
+ forget(instance) { this.uploads.delete(instance); this.limiter.forget(instance); }
358
+ /** The tool dispatcher both doors share (typed IPC from the daemon, the agent endpoint for agend-agent). */
359
+ handleTool(instance, tool, args) {
360
+ switch (tool) {
361
+ case "get_web_theme": return this.getTheme(instance);
362
+ case "set_web_theme": return this.setTheme(instance, args);
363
+ case "set_web_theme_asset": return this.setAsset(instance, args);
364
+ case "reset_web_theme": return this.resetTheme(instance);
365
+ case "set_web_widget": return this.setWidget(instance, args);
366
+ case "remove_web_widget": return this.removeWidget(instance, args);
367
+ case "set_web_ambient": return this.setAmbient(instance, args);
368
+ case "clear_web_ambient": return this.clearAmbient(instance, args);
369
+ default: return { error: "unknown_tool" };
370
+ }
371
+ }
372
+ }
373
+ //# sourceMappingURL=web-appearance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-appearance.js","sourceRoot":"","sources":["../src/web-appearance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ import { type AgentFileContext } from "./agent-file-read.js";
2
+ /** Every picture slot an agent uploads for (the theme's two, the card's two and an ambient's glyphs, #2117). Here so agend-agent stays small. */
3
+ export declare const THEME_ASSET_SLOTS: readonly ["background", "avatar", "portrait", "banner", "glyph"];
4
+ export type ThemeAssetSlot = typeof THEME_ASSET_SLOTS[number];
5
+ /** Raw bytes per part: base64 of this (480 KiB) plus the envelope fits both the IPC line and the endpoint body. */
6
+ export declare const ASSET_PART_BYTES: number;
7
+ /** The most an upload may declare: the largest card slot's ceiling (web-appearance-limits.ts). */
8
+ export declare const ASSET_UPLOAD_MAX_BYTES: number;
9
+ export interface AssetPart {
10
+ index: number;
11
+ count: number;
12
+ bytes: number;
13
+ sha256: string;
14
+ upload?: string;
15
+ }
16
+ /**
17
+ * Send `bytes` for `slot` through `send` (one tool call each), in parts when it does not fit one. Returns the last
18
+ * answer: { id } on success, or the first error any part got.
19
+ */
20
+ export declare function sendAssetInParts(slot: unknown, bytes: Uint8Array, send: (args: Record<string, unknown>) => Promise<Record<string, unknown>>): Promise<Record<string, unknown>>;
21
+ /** Every file a preview may carry: an SVG per mode, and the pictures it names (web-appearance-view.ts PREVIEW_FILE). */
22
+ export declare const PREVIEW_FILE: RegExp;
23
+ /** The most parts one preview file may come in (its largest picture, a 4 MiB portrait, is 12). */
24
+ export declare const PREVIEW_MAX_PARTS = 64;
25
+ /**
26
+ * #1629 r4 §1: preview_web_appearance's answer on the agent's side (the daemon, agend-agent): its files — an SVG per
27
+ * mode and the pictures they name — whole, or (larger than one message) fetched part by part with
28
+ * `send({ part: { preview, name, index } })`, each checked against the declared bytes and sha256. Returns the files,
29
+ * or the first error. Only the names above are taken.
30
+ */
31
+ export declare function receivePreview(first: Record<string, unknown>, send: (args: Record<string, unknown>) => Promise<Record<string, unknown>>): Promise<{
32
+ files: Array<{
33
+ name: string;
34
+ data: Buffer;
35
+ }>;
36
+ } | {
37
+ error: string;
38
+ message?: string;
39
+ }>;
40
+ /**
41
+ * Files the fleet built for the agent's side (a preview, an exported mod): sent whole, or — when larger than one
42
+ * message — fetched here part by part with `{ part: { <idKey>: id, name, index } }`, each file checked against its
43
+ * declared bytes and sha256. `name`: the only file names accepted (nothing else is ever written).
44
+ */
45
+ export declare function receiveFiles(first: Record<string, unknown>, send: (args: Record<string, unknown>) => Promise<Record<string, unknown>>, opts: {
46
+ name: RegExp;
47
+ idKey: string;
48
+ what: string;
49
+ maxParts?: number;
50
+ }): Promise<{
51
+ files: Array<{
52
+ name: string;
53
+ data: Buffer;
54
+ }>;
55
+ } | {
56
+ error: string;
57
+ message?: string;
58
+ }>;
59
+ /** #1629 r4-5b: the one file name an exported mod is written under (in `.agend/mods/`). */
60
+ export declare const MOD_FILE: RegExp;
61
+ /** An exported mod is at most 8 MiB: 24 parts of 360 KiB. */
62
+ export declare const MOD_MAX_PARTS = 24;
63
+ /** The largest mod the agent's side reads to propose (the fleet checks it again): 8 MiB. */
64
+ export declare const MOD_UPLOAD_MAX_BYTES: number;
65
+ /** Write a received mod into `.agend/mods/` of the working directory (on the agent's side), and say where. */
66
+ export declare function writeModFile(files: Array<{
67
+ name: string;
68
+ data: Buffer;
69
+ }>, opts: AgentFileContext): Promise<{
70
+ path: string;
71
+ bytes: number;
72
+ } | {
73
+ error: string;
74
+ }>;
75
+ /**
76
+ * Write a received preview into `.agend/appearance/` of the working directory (on the agent's side), and say where:
77
+ * the SVG per mode, and the pictures they name (Read those as images).
78
+ */
79
+ export declare function writePreview(files: Array<{
80
+ name: string;
81
+ data: Buffer;
82
+ }>, opts: AgentFileContext): Promise<{
83
+ files: Array<{
84
+ mode: string;
85
+ path: string;
86
+ }>;
87
+ pictures: Array<{
88
+ role: string;
89
+ path: string;
90
+ }>;
91
+ } | {
92
+ error: string;
93
+ }>;
@@ -0,0 +1,133 @@
1
+ /**
2
+ * #1629 r4 §1: a picture larger than one message carries (the fleet IPC's 1 MiB line, the agent endpoint's 512 KiB
3
+ * body) goes up in parts — a card portrait may be 1.5 MiB by default and up to 4 MiB by configuration. Both doors use
4
+ * this: the daemon (set_web_theme_asset, after reading the file on the agent's side) and `agend-agent theme asset`.
5
+ *
6
+ * Protocol (args of set_web_theme_asset, in order, each answered before the next is sent):
7
+ * part 0: { slot, data_b64, part: { index: 0, count, bytes, sha256 } } → { upload: <id> } (or { id } when count is 1)
8
+ * part k: { slot, data_b64, part: { index: k, count, bytes, sha256, upload } }
9
+ * last: → { id } (the asset), or an error
10
+ * The fleet keeps one upload per instance and drops it after a minute without a part (web-appearance.ts).
11
+ */
12
+ import { createHash } from "node:crypto";
13
+ import { writeAgentFile } from "./agent-file-read.js";
14
+ /** Every picture slot an agent uploads for (the theme's two, the card's two and an ambient's glyphs, #2117). Here so agend-agent stays small. */
15
+ export const THEME_ASSET_SLOTS = ["background", "avatar", "portrait", "banner", "glyph"];
16
+ /** Raw bytes per part: base64 of this (480 KiB) plus the envelope fits both the IPC line and the endpoint body. */
17
+ export const ASSET_PART_BYTES = 360 * 1024;
18
+ /** The most an upload may declare: the largest card slot's ceiling (web-appearance-limits.ts). */
19
+ export const ASSET_UPLOAD_MAX_BYTES = 4 * 1024 * 1024;
20
+ /**
21
+ * Send `bytes` for `slot` through `send` (one tool call each), in parts when it does not fit one. Returns the last
22
+ * answer: { id } on success, or the first error any part got.
23
+ */
24
+ export async function sendAssetInParts(slot, bytes, send) {
25
+ if (bytes.length <= ASSET_PART_BYTES)
26
+ return send({ slot, data_b64: Buffer.from(bytes).toString("base64") });
27
+ const count = Math.ceil(bytes.length / ASSET_PART_BYTES);
28
+ const sha256 = createHash("sha256").update(bytes).digest("hex");
29
+ let upload;
30
+ let answer = {};
31
+ for (let index = 0; index < count; index++) {
32
+ const chunk = bytes.subarray(index * ASSET_PART_BYTES, (index + 1) * ASSET_PART_BYTES);
33
+ const part = { index, count, bytes: bytes.length, sha256, ...(upload ? { upload } : {}) };
34
+ answer = await send({ slot, data_b64: Buffer.from(chunk).toString("base64"), part });
35
+ if (typeof answer.error === "string" || Array.isArray(answer.errors))
36
+ return answer;
37
+ if (index === 0) {
38
+ if (typeof answer.upload !== "string")
39
+ return { error: "upload", message: "The fleet did not start the upload." };
40
+ upload = answer.upload;
41
+ }
42
+ }
43
+ return answer;
44
+ }
45
+ /** Every file a preview may carry: an SVG per mode, and the pictures it names (web-appearance-view.ts PREVIEW_FILE). */
46
+ export const PREVIEW_FILE = /^(?:(?:light|dark)\.svg|(?:avatar|portrait|banner|background)\.(?:png|jpg|webp|gif)|glyph[1-4]\.(?:png|webp|gif))$/;
47
+ /** The most parts one preview file may come in (its largest picture, a 4 MiB portrait, is 12). */
48
+ export const PREVIEW_MAX_PARTS = 64;
49
+ /**
50
+ * #1629 r4 §1: preview_web_appearance's answer on the agent's side (the daemon, agend-agent): its files — an SVG per
51
+ * mode and the pictures they name — whole, or (larger than one message) fetched part by part with
52
+ * `send({ part: { preview, name, index } })`, each checked against the declared bytes and sha256. Returns the files,
53
+ * or the first error. Only the names above are taken.
54
+ */
55
+ export async function receivePreview(first, send) {
56
+ return receiveFiles(first, send, { name: PREVIEW_FILE, idKey: "preview", what: "preview" });
57
+ }
58
+ /**
59
+ * Files the fleet built for the agent's side (a preview, an exported mod): sent whole, or — when larger than one
60
+ * message — fetched here part by part with `{ part: { <idKey>: id, name, index } }`, each file checked against its
61
+ * declared bytes and sha256. `name`: the only file names accepted (nothing else is ever written).
62
+ */
63
+ export async function receiveFiles(first, send, opts) {
64
+ const { what } = opts;
65
+ const maxParts = opts.maxParts ?? PREVIEW_MAX_PARTS;
66
+ if (typeof first.error === "string")
67
+ return first;
68
+ const files = Array.isArray(first.files) ? first.files : [];
69
+ if (!files.length || !files.every(f => typeof f.name === "string" && opts.name.test(f.name)) || new Set(files.map(f => f.name)).size !== files.length) {
70
+ return { error: what, message: `The fleet sent no ${what}.` };
71
+ }
72
+ const id = first[opts.idKey];
73
+ if (typeof id !== "string") {
74
+ if (!files.every(f => typeof f.data_b64 === "string"))
75
+ return { error: what, message: `The fleet sent no ${what}.` };
76
+ return { files: files.map(f => ({ name: f.name, data: Buffer.from(f.data_b64, "base64") })) };
77
+ }
78
+ const out = [];
79
+ for (const f of files) {
80
+ const bytes = f.bytes, count = f.parts;
81
+ if (!Number.isSafeInteger(bytes) || !Number.isSafeInteger(count) || count < 1 || count > maxParts || typeof f.sha256 !== "string")
82
+ return { error: what, message: `The fleet sent an unreadable ${what}.` };
83
+ const chunks = [];
84
+ for (let index = 0; index < count; index++) {
85
+ const a = await send({ part: { [opts.idKey]: id, name: f.name, index } });
86
+ if (typeof a.error === "string")
87
+ return a;
88
+ if (typeof a.data_b64 !== "string")
89
+ return { error: what, message: `A part of the ${what} is missing.` };
90
+ chunks.push(Buffer.from(a.data_b64, "base64"));
91
+ }
92
+ const data = Buffer.concat(chunks);
93
+ if (data.length !== bytes || createHash("sha256").update(data).digest("hex") !== f.sha256)
94
+ return { error: what, message: `The ${what}'s parts do not add up.` };
95
+ out.push({ name: f.name, data });
96
+ }
97
+ return { files: out };
98
+ }
99
+ /** #1629 r4-5b: the one file name an exported mod is written under (in `.agend/mods/`). */
100
+ export const MOD_FILE = /^[a-z0-9][a-z0-9-]{0,63}-(0|[1-9]\d{0,5})\.(0|[1-9]\d{0,5})\.(0|[1-9]\d{0,5})\.agendmod\.json$/;
101
+ /** An exported mod is at most 8 MiB: 24 parts of 360 KiB. */
102
+ export const MOD_MAX_PARTS = 24;
103
+ /** The largest mod the agent's side reads to propose (the fleet checks it again): 8 MiB. */
104
+ export const MOD_UPLOAD_MAX_BYTES = 8 * 1024 * 1024;
105
+ /** Write a received mod into `.agend/mods/` of the working directory (on the agent's side), and say where. */
106
+ export async function writeModFile(files, opts) {
107
+ const f = files.length === 1 ? files[0] : null;
108
+ if (!f || !MOD_FILE.test(f.name))
109
+ return { error: ".agend/mods — not one mod file" };
110
+ const w = await writeAgentFile(".agend/mods", f.name, f.data, opts);
111
+ return w.ok ? { path: w.path, bytes: f.data.length } : { error: `.agend/mods/${f.name} — ${w.reason}` };
112
+ }
113
+ /**
114
+ * Write a received preview into `.agend/appearance/` of the working directory (on the agent's side), and say where:
115
+ * the SVG per mode, and the pictures they name (Read those as images).
116
+ */
117
+ export async function writePreview(files, opts) {
118
+ const out = { files: [], pictures: [] };
119
+ for (const f of files) {
120
+ if (!PREVIEW_FILE.test(f.name))
121
+ return { error: `.agend/appearance/${f.name.slice(0, 40)} — not a preview file` };
122
+ const w = await writeAgentFile(".agend/appearance", f.name, f.data, opts);
123
+ if (!w.ok)
124
+ return { error: `.agend/appearance/${f.name} — ${w.reason}` };
125
+ const [base] = f.name.split(".");
126
+ if (f.name.endsWith(".svg"))
127
+ out.files.push({ mode: base, path: w.path });
128
+ else
129
+ out.pictures.push({ role: base, path: w.path });
130
+ }
131
+ return out;
132
+ }
133
+ //# sourceMappingURL=web-asset-parts.js.map