@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,440 @@
1
+ /**
2
+ * #1629 r4 §3: where each person's owner CSS lives. Per person (their web-prefs key, web-profile.ts webPersonKey), in
3
+ * `<dataDir>/web-owner-css/<hash of the key>/`:
4
+ * <sha>.css each kept version, as uploaded (served only after checkOwnerCss + serializeOwnerCss, every time)
5
+ * assets/<id>.<ext> the pictures and fonts its CSS names as url("asset:<id>") — metadata stripped, id = sha of the kept bytes
6
+ * index.json { versions: [{ sha, at }] newest first, at most 5; assets: [{ id, kind, bytes }]; pending? }
7
+ * Which version is in force is the person's `css.active` (web-prefs.ts), so every device of theirs follows.
8
+ * Keep-or-revert: a saved version is in force on trial (`pending`) until the person keeps it. Unkept by its deadline,
9
+ * it is reverted here, at the next read — a closed tab, or CSS that hid the question, reverts too.
10
+ * Nothing here is reachable from an agent: no tool, CLI command or agent route names it.
11
+ */
12
+ import { createHash, randomBytes } from "node:crypto";
13
+ import { mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
14
+ import { join } from "node:path";
15
+ import { atomicWriteFileSync } from "./atomic-write.js";
16
+ import { MEDIA_EXT, MEDIA_MIME, sniffMedia, stripMetadata } from "./web-image-meta.js";
17
+ import { checkOwnerCss, OWNER_CSS_ASSET_ID, ownerCssAssetRefs, serializeOwnerCss } from "./web-owner-css.js";
18
+ export const OWNER_CSS_VERSIONS = 5;
19
+ /** How long a saved version waits to be kept (the page asks for 15 s; the host allows a little more for the round trip). */
20
+ export const OWNER_CSS_KEEP_MS = 20_000;
21
+ /**
22
+ * #2198: a version an agent saved (General, set_web_settings) waits this long for a person's page to show it. The keep
23
+ * window above is a dead-man switch for CSS that hides its own Keep button: it starts when a page shows the trial, not
24
+ * when the agent saves it — an agent's save reaches the person only when they open the dashboard, and their "keep it"
25
+ * comes back through a chat round trip (~40 s). Never shown by then, it goes back without having been on any screen.
26
+ */
27
+ export const OWNER_CSS_AGENT_WAIT_MS = 10 * 60_000;
28
+ export const OWNER_CSS_MAX_ASSETS = 16;
29
+ export const OWNER_CSS_MAX_ASSET_BYTES = 1024 * 1024; // all of a person's assets together
30
+ const ASSET_KINDS = new Set(["png", "webp", "jpeg", "gif", "woff2"]);
31
+ const SHA = /^[0-9a-f]{32}$/;
32
+ const hash32 = (data) => createHash("sha256").update(data).digest("hex").slice(0, 32);
33
+ /** Bytes to a file, whole or not at all (a temp file renamed over it), 0600. */
34
+ function writeBytesAtomic(path, bytes) {
35
+ const tmp = `${path}.${process.pid}.${Date.now()}.tmp`;
36
+ try {
37
+ writeFileSync(tmp, bytes, { mode: 0o600 });
38
+ renameSync(tmp, path);
39
+ }
40
+ catch (err) {
41
+ try {
42
+ unlinkSync(tmp);
43
+ }
44
+ catch { /* none */ }
45
+ throw err;
46
+ }
47
+ }
48
+ export class OwnerCssStore {
49
+ dataDir;
50
+ pointer;
51
+ now;
52
+ constructor(dataDir, pointer, now = () => Date.now()) {
53
+ this.dataDir = dataDir;
54
+ this.pointer = pointer;
55
+ this.now = now;
56
+ }
57
+ dir(person) { return join(this.dataDir, "web-owner-css", hash32(`person\0${person}`)); }
58
+ readIndex(person, evidence) {
59
+ if (evidence)
60
+ evidence.known = false;
61
+ try {
62
+ const raw = JSON.parse(readFileSync(join(this.dir(person), "index.json"), "utf8"));
63
+ const versions = Array.isArray(raw.versions) ? raw.versions.filter(v => v && SHA.test(String(v.sha)) && Number.isFinite(v.at)) : [];
64
+ const assets = Array.isArray(raw.assets) ? raw.assets.filter(a => a && SHA.test(String(a.id)) && ASSET_KINDS.has(a.kind) && Number.isSafeInteger(a.bytes)) : [];
65
+ const p = raw.pending;
66
+ const pending = p && SHA.test(String(p.id)) && SHA.test(String(p.sha)) && (p.previous === null || SHA.test(String(p.previous))) && Number.isFinite(p.at) && Number.isFinite(p.until)
67
+ ? { id: p.id, sha: p.sha, previous: p.previous, at: p.at, until: p.until, ...(p.by === "agent" ? { by: "agent" } : {}), ...(p.shown === true ? { shown: true } : {}) } : undefined;
68
+ const l = raw.last;
69
+ const last = l && SHA.test(String(l.id)) && SHA.test(String(l.sha)) && Number.isFinite(l.at) && (l.how === "keep" || l.how === "revert" || l.how === "expire") ? { id: l.id, sha: l.sha, at: l.at, how: l.how, shown: l.shown === true } : undefined;
70
+ if (evidence)
71
+ evidence.known = Array.isArray(raw.versions) && Array.isArray(raw.assets)
72
+ && versions.length === raw.versions.length && versions.every(v => typeof v.sha === "string")
73
+ && assets.length === raw.assets.length && assets.every(a => typeof a.id === "string" && a.bytes >= 0)
74
+ && (raw.pending === undefined || !!pending && typeof pending.id === "string" && typeof pending.sha === "string"
75
+ && (pending.previous === null || typeof pending.previous === "string"));
76
+ return { versions, assets, ...(pending ? { pending } : {}), ...(last ? { last } : {}) };
77
+ }
78
+ catch (err) {
79
+ if (evidence)
80
+ evidence.known = err?.code === "ENOENT";
81
+ return { versions: [], assets: [] };
82
+ }
83
+ }
84
+ writeIndex(person, index) {
85
+ mkdirSync(this.dir(person), { recursive: true, mode: 0o700 });
86
+ atomicWriteFileSync(join(this.dir(person), "index.json"), JSON.stringify(index, null, 2) + "\n", { mode: 0o600 });
87
+ }
88
+ readText(person, sha) {
89
+ if (!SHA.test(sha))
90
+ return null;
91
+ try {
92
+ return readFileSync(join(this.dir(person), `${sha}.css`), "utf8");
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ }
98
+ assetIds(index) { return new Set(index.assets.map(a => a.id)); }
99
+ /**
100
+ * A trial nobody kept by its deadline is reverted now: the version before it is put back. A clock that went back
101
+ * past the save counts as expired too (the deadline cannot be trusted).
102
+ */
103
+ settle(person) {
104
+ const index = this.readIndex(person);
105
+ const p = index.pending;
106
+ if (!p)
107
+ return;
108
+ const now = this.now();
109
+ if (now <= p.until && now >= p.at)
110
+ return;
111
+ this.endTrial(person, index, "expire");
112
+ }
113
+ /**
114
+ * End the trial in `index`: "keep" leaves its version in force; "revert" puts back the one before it (if that one is
115
+ * still kept, else none). Either way `css.trial` is cleared in the same write, so every device hears of it.
116
+ */
117
+ endTrial(person, index, how) {
118
+ const p = index.pending;
119
+ if (!p)
120
+ return false;
121
+ const change = { trial: null };
122
+ if (how !== "keep" && this.pointer.ownerCssActive(person) === p.sha) {
123
+ change.active = p.previous && index.versions.some(v => v.sha === p.previous) ? p.previous : null;
124
+ }
125
+ if (!this.pointer.setOwnerCss(person, change).ok)
126
+ return false; // the pointer cannot be written: try at the next read
127
+ const { pending: _done, ...rest } = index;
128
+ void _done;
129
+ // Shown: a person's own trial always was (their page saved it); an agent's once a page said so.
130
+ this.writeIndex(person, { ...rest, last: { id: p.id, sha: p.sha, at: this.now(), how, shown: p.by !== "agent" || p.shown === true } });
131
+ return true;
132
+ }
133
+ /**
134
+ * r4-5: everything a mod import may change for this person, to put back exactly if the import fails later: the index
135
+ * (versions, assets, a trial), both pointers, and the text of every kept version (a save may drop the oldest's file).
136
+ */
137
+ snapshot(person) {
138
+ const index = this.readIndex(person);
139
+ const texts = new Map();
140
+ for (const v of index.versions) {
141
+ const t = this.readText(person, v.sha);
142
+ if (t !== null)
143
+ texts.set(v.sha, t);
144
+ }
145
+ return { index: JSON.parse(JSON.stringify(index)), active: this.pointer.ownerCssActive(person), trial: this.pointer.ownerCssTrial?.(person) ?? null, texts };
146
+ }
147
+ /** Put a snapshot back: texts, index, pointers; versions and assets added since are removed. */
148
+ restoreSnapshot(person, snap) {
149
+ const now = this.readIndex(person);
150
+ try {
151
+ for (const [sha, text] of snap.texts)
152
+ if (this.readText(person, sha) !== text) {
153
+ mkdirSync(this.dir(person), { recursive: true, mode: 0o700 });
154
+ atomicWriteFileSync(join(this.dir(person), `${sha}.css`), text, { mode: 0o600 });
155
+ }
156
+ this.writeIndex(person, snap.index);
157
+ }
158
+ catch (err) {
159
+ return { ok: false, status: 503, error: "owner_css_restore_failed", detail: err.message };
160
+ }
161
+ const set = this.pointer.setOwnerCss(person, { active: snap.active, trial: snap.trial });
162
+ if (!set.ok)
163
+ return set;
164
+ for (const v of now.versions)
165
+ if (!snap.texts.has(v.sha)) {
166
+ try {
167
+ unlinkSync(join(this.dir(person), `${v.sha}.css`));
168
+ }
169
+ catch { /* none */ }
170
+ }
171
+ const kept = new Set(snap.index.assets.map(a => a.id));
172
+ for (const a of now.assets)
173
+ if (!kept.has(a.id)) {
174
+ try {
175
+ unlinkSync(join(this.dir(person), "assets", `${a.id}.${MEDIA_EXT[a.kind]}`));
176
+ }
177
+ catch { /* none */ }
178
+ }
179
+ return { ok: true };
180
+ }
181
+ /** The version in force (a kept one), or null — what the page links at load. */
182
+ active(person) {
183
+ this.settle(person);
184
+ const active = this.pointer.ownerCssActive(person);
185
+ return active && this.readIndex(person).versions.some(v => v.sha === active) ? active : null;
186
+ }
187
+ /** Positive CSS evidence for the page; no identity fallback or change to legacy CSS save/serve behavior. */
188
+ effectState(person) {
189
+ try {
190
+ this.settle(person);
191
+ const selection = this.pointer.ownerCssSelection?.(person);
192
+ if (!selection?.known)
193
+ return "unknown";
194
+ const evidence = { known: false }, index = this.readIndex(person, evidence);
195
+ if (!evidence.known)
196
+ return "unknown";
197
+ if (selection.active === null)
198
+ return "off";
199
+ return index.versions.some(v => v.sha === selection.active) && this.served(person, selection.active) !== null ? "on" : "unknown";
200
+ }
201
+ catch {
202
+ return "unknown";
203
+ }
204
+ }
205
+ state(person) {
206
+ this.settle(person);
207
+ const index = this.readIndex(person);
208
+ const active = this.pointer.ownerCssActive(person);
209
+ const kept = active && index.versions.some(v => v.sha === active) ? active : null;
210
+ const p = index.pending, waiting = !!p && p.by === "agent" && !p.shown;
211
+ return {
212
+ effectState: this.effectState(person),
213
+ active: kept,
214
+ // #2198: an agent's trial no page has shown yet waits (`waiting`): the page that shows it says so (shown()).
215
+ pending: p && p.sha === kept
216
+ ? { id: p.id, sha: p.sha, previous: p.previous, remaining_ms: Math.max(0, Math.min(waiting ? OWNER_CSS_AGENT_WAIT_MS : OWNER_CSS_KEEP_MS, p.until - this.now())), ...(waiting ? { waiting: true } : {}) }
217
+ : null,
218
+ text: kept ? this.readText(person, kept) : null,
219
+ versions: index.versions.map(v => ({ ...v, bytes: Buffer.byteLength(this.readText(person, v.sha) ?? "", "utf8") })),
220
+ assets: index.assets,
221
+ limits: { maxBytes: 64 * 1024, maxAssets: OWNER_CSS_MAX_ASSETS, maxAssetBytes: OWNER_CSS_MAX_ASSET_BYTES, versions: OWNER_CSS_VERSIONS },
222
+ };
223
+ }
224
+ /**
225
+ * Check, store and select a new version — on trial until kept (keep()). `previous`: the version in force before,
226
+ * which an unkept trial goes back to.
227
+ */
228
+ save(person, text, opts = {}) {
229
+ if (typeof text !== "string")
230
+ return { ok: false, status: 400, error: "css: text" };
231
+ const index = this.readIndex(person);
232
+ const checked = checkOwnerCss(text, this.assetIds(index));
233
+ if (!checked.ok)
234
+ return { ok: false, status: checked.error.problem === "too_large" ? 413 : 400, error: checked.error.problem, ...(checked.error.detail ? { detail: checked.error.detail } : {}) };
235
+ try {
236
+ serializeOwnerCss(checked.tokens);
237
+ }
238
+ catch {
239
+ return { ok: false, status: 400, error: "unserialisable" };
240
+ }
241
+ const sha = hash32(text);
242
+ const before = this.state(person);
243
+ // A trial on top of a trial goes back to what was in force before the first: never to an unkept version.
244
+ const previous = before.pending ? (this.readIndex(person).pending?.previous ?? null) : before.active;
245
+ mkdirSync(this.dir(person), { recursive: true, mode: 0o700 });
246
+ atomicWriteFileSync(join(this.dir(person), `${sha}.css`), text, { mode: 0o600 });
247
+ const versions = [{ sha, at: this.now() }, ...index.versions.filter(v => v.sha !== sha)];
248
+ // The version a trial would go back to is never dropped, even past five.
249
+ const keepList = versions.slice(0, OWNER_CSS_VERSIONS);
250
+ if (previous && !keepList.some(v => v.sha === previous)) {
251
+ const p = versions.find(v => v.sha === previous);
252
+ if (p)
253
+ keepList.push(p);
254
+ }
255
+ const dropped = versions.filter(v => !keepList.includes(v));
256
+ const at = this.now();
257
+ const trial = randomBytes(16).toString("hex");
258
+ // #2198: an agent's save waits for a page to show it (OWNER_CSS_AGENT_WAIT_MS); a person's, on their page, is shown.
259
+ const pending = opts.by === "agent" ? { id: trial, sha, previous, at, until: at + OWNER_CSS_AGENT_WAIT_MS, by: "agent" } : { id: trial, sha, previous, at, until: at + OWNER_CSS_KEEP_MS };
260
+ this.writeIndex(person, { ...index, versions: keepList, pending });
261
+ const set = this.pointer.setOwnerCss(person, { active: sha, trial });
262
+ if (!set.ok)
263
+ return set;
264
+ for (const v of dropped) {
265
+ try {
266
+ unlinkSync(join(this.dir(person), `${v.sha}.css`));
267
+ }
268
+ catch { /* already gone */ }
269
+ }
270
+ return { ok: true, sha, previous, trial };
271
+ }
272
+ /** The trial `id` names, while it still is the one on trial and in force; else null. */
273
+ trialOf(person, id) {
274
+ if (typeof id !== "string" || !SHA.test(id))
275
+ return null;
276
+ this.settle(person);
277
+ const index = this.readIndex(person);
278
+ return index.pending && index.pending.id === id && this.pointer.ownerCssActive(person) === index.pending.sha ? index : null;
279
+ }
280
+ /**
281
+ * #2198: a page is showing this trial (its stylesheet loaded on screen). An agent's waiting trial starts its keep window
282
+ * now — the dead-man switch, from when a person can see it. Already shown, or a person's own trial: as it is.
283
+ */
284
+ shown(person, trial) {
285
+ if (typeof trial !== "string" || !SHA.test(trial))
286
+ return { ok: false, status: 400, error: "trial" };
287
+ const index = this.trialOf(person, trial);
288
+ if (!index)
289
+ return { ok: false, status: 409, error: "not_on_trial" };
290
+ const p = index.pending;
291
+ if (p.by !== "agent" || p.shown)
292
+ return { ok: true, remaining_ms: Math.max(0, Math.min(OWNER_CSS_KEEP_MS, p.until - this.now())), started: false };
293
+ const now = this.now();
294
+ this.writeIndex(person, { ...index, pending: { ...p, shown: true, until: now + OWNER_CSS_KEEP_MS } });
295
+ return { ok: true, remaining_ms: OWNER_CSS_KEEP_MS, started: true };
296
+ }
297
+ /**
298
+ * #2198: an agent's "keep" (the person said so in chat). The trial still on: kept. The one that just went back by
299
+ * itself — the most recent trial, expired within OWNER_CSS_AGENT_WAIT_MS, its version still saved — is put back in
300
+ * force, as `use` of it — if a page had shown it. One reverted on purpose (Revert), one no screen ever showed, or
301
+ * anything else: not_on_trial (an earlier version is `use`).
302
+ */
303
+ keepForAgent(person) {
304
+ this.settle(person);
305
+ const index = this.readIndex(person);
306
+ if (index.pending) {
307
+ const kept = this.keep(person, index.pending.id);
308
+ return kept.ok ? { ok: true, active: kept.active, restored: false } : kept;
309
+ }
310
+ const last = index.last, now = this.now();
311
+ // Never shown (it expired waiting): nobody saw it — it is not put in force without its keep window.
312
+ if (last && last.how === "expire" && last.shown && now >= last.at && now - last.at <= OWNER_CSS_AGENT_WAIT_MS && index.versions.some(v => v.sha === last.sha)) {
313
+ const r = this.restore(person, last.sha);
314
+ if (!r.ok)
315
+ return r;
316
+ this.writeIndex(person, { ...this.readIndex(person), last: { ...last, how: "keep" } });
317
+ return { ok: true, active: last.sha, restored: true };
318
+ }
319
+ return { ok: false, status: 409, error: "not_on_trial" };
320
+ }
321
+ /** Keep this trial (the person answered "Keep"). Too late, or another trial (even of the same text): 409. */
322
+ keep(person, trial) {
323
+ if (typeof trial !== "string" || !SHA.test(trial))
324
+ return { ok: false, status: 400, error: "trial" };
325
+ const index = this.trialOf(person, trial);
326
+ if (!index)
327
+ return { ok: false, status: 409, error: "not_on_trial" };
328
+ if (!this.endTrial(person, index, "keep"))
329
+ return { ok: false, status: 503, error: "prefs_unwritable" };
330
+ return { ok: true, active: index.pending.sha };
331
+ }
332
+ /**
333
+ * Revert exactly this trial — the page's Revert, or its timer. Only while it still is the trial: one kept, reverted
334
+ * or replaced meanwhile (a new trial of the same text included), on any device, is left alone (409).
335
+ */
336
+ revertTrial(person, trial) {
337
+ if (typeof trial !== "string" || !SHA.test(trial))
338
+ return { ok: false, status: 400, error: "trial" };
339
+ const index = this.trialOf(person, trial);
340
+ if (!index)
341
+ return { ok: false, status: 409, error: "not_on_trial" };
342
+ if (!this.endTrial(person, index, "revert"))
343
+ return { ok: false, status: 503, error: "prefs_unwritable" };
344
+ return { ok: true, active: this.pointer.ownerCssActive(person) };
345
+ }
346
+ /** Put a kept version back in force, or (null) none: their screens go stock. Ends any trial. */
347
+ restore(person, sha) {
348
+ if (sha !== null && (typeof sha !== "string" || !SHA.test(sha)))
349
+ return { ok: false, status: 400, error: "sha" };
350
+ const index = this.readIndex(person);
351
+ if (sha !== null && !index.versions.some(v => v.sha === sha))
352
+ return { ok: false, status: 404, error: "no_such_version" };
353
+ const set = this.pointer.setOwnerCss(person, { active: sha, trial: null });
354
+ if (!set.ok)
355
+ return set;
356
+ if (index.pending) {
357
+ const { pending: _done, ...rest } = index;
358
+ void _done;
359
+ this.writeIndex(person, rest);
360
+ }
361
+ return { ok: true, active: sha };
362
+ }
363
+ /** A picture or font for this person's CSS: png, webp, jpeg, gif or woff2; metadata stripped; ≤ 16 files, ≤ 1 MiB together. */
364
+ addAsset(person, bytes) {
365
+ const kind = sniffMedia(bytes);
366
+ if (!kind || !ASSET_KINDS.has(kind))
367
+ return { ok: false, status: 400, error: "asset_type", detail: "png, webp, jpeg, gif or woff2" };
368
+ const kept = stripMetadata(bytes, kind);
369
+ if (!kept)
370
+ return { ok: false, status: 400, error: "asset_unreadable" };
371
+ const id = hash32(kept);
372
+ const index = this.readIndex(person);
373
+ const existing = index.assets.find(a => a.id === id);
374
+ if (existing)
375
+ return { ok: true, ...existing };
376
+ if (index.assets.length >= OWNER_CSS_MAX_ASSETS)
377
+ return { ok: false, status: 409, error: "asset_quota", detail: `at most ${OWNER_CSS_MAX_ASSETS} files` };
378
+ if (index.assets.reduce((n, a) => n + a.bytes, 0) + kept.length > OWNER_CSS_MAX_ASSET_BYTES)
379
+ return { ok: false, status: 413, error: "asset_quota", detail: "at most 1 MiB together" };
380
+ mkdirSync(join(this.dir(person), "assets"), { recursive: true, mode: 0o700 });
381
+ writeBytesAtomic(join(this.dir(person), "assets", `${id}.${MEDIA_EXT[kind]}`), kept);
382
+ const entry = { id, kind, bytes: kept.length };
383
+ this.writeIndex(person, { ...index, assets: [...index.assets, entry] });
384
+ return { ok: true, ...entry };
385
+ }
386
+ /** Remove an asset no kept version names (a kept version must always restore whole). */
387
+ removeAsset(person, id) {
388
+ const index = this.readIndex(person);
389
+ const entry = index.assets.find(a => a.id === id);
390
+ if (!entry)
391
+ return { ok: false, status: 404, error: "no_such_asset" };
392
+ // What a kept version names, read from its decoded tokens: url("\\61sset:<id>") names the asset as well.
393
+ const names = (text) => {
394
+ if (text === null)
395
+ return false;
396
+ const checked = checkOwnerCss(text, this.assetIds(index));
397
+ return checked.ok && ownerCssAssetRefs(checked.tokens).has(id);
398
+ };
399
+ if (index.versions.some(v => names(this.readText(person, v.sha))))
400
+ return { ok: false, status: 409, error: "asset_in_use" };
401
+ try {
402
+ unlinkSync(join(this.dir(person), "assets", `${id}.${MEDIA_EXT[entry.kind]}`));
403
+ }
404
+ catch { /* already gone */ }
405
+ this.writeIndex(person, { ...index, assets: index.assets.filter(a => a.id !== id) });
406
+ return { ok: true, removed: id };
407
+ }
408
+ /** The text to serve for one of this person's kept versions: checked again and re-serialised. null: none, or it fails. */
409
+ served(person, sha) {
410
+ const index = this.readIndex(person);
411
+ if (!index.versions.some(v => v.sha === sha))
412
+ return null;
413
+ const text = this.readText(person, sha);
414
+ if (text === null)
415
+ return null;
416
+ const checked = checkOwnerCss(text, this.assetIds(index));
417
+ if (!checked.ok)
418
+ return null;
419
+ try {
420
+ return serializeOwnerCss(checked.tokens);
421
+ }
422
+ catch {
423
+ return null;
424
+ }
425
+ }
426
+ asset(person, id) {
427
+ if (!OWNER_CSS_ASSET_ID.test(id))
428
+ return null;
429
+ const entry = this.readIndex(person).assets.find(a => a.id === id);
430
+ if (!entry)
431
+ return null;
432
+ try {
433
+ return { bytes: readFileSync(join(this.dir(person), "assets", `${id}.${MEDIA_EXT[entry.kind]}`)), mime: MEDIA_MIME[entry.kind] };
434
+ }
435
+ catch {
436
+ return null;
437
+ }
438
+ }
439
+ }
440
+ //# sourceMappingURL=web-owner-css-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web-owner-css-store.js","sourceRoot":"","sources":["../src/web-owner-css-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * #1629 r4 §3: owner CSS — one raw CSS text per human, for that human's own screens. This module is its gate:
3
+ * a CSS Syntax Level 3 tokenizer (no dependency), the rules a stored text must pass, and the serialiser the route
4
+ * serves from. The server re-serialises from tokens, so the bytes served are never the bytes uploaded; the CSP
5
+ * (`style-src 'self'`, `img-src 'self' data: blob:`, `font-src 'self' data:`) is the first wall, this the second
6
+ * and the one that says why at save time.
7
+ *
8
+ * Refused: `@import` / `@namespace` / `@charset`; any `url(…)` or `src(…)` except `url("asset:<id>")` (or the
9
+ * unquoted `url(asset:<id>)`) naming an asset stored with this CSS; `image-set`, `-webkit-image-set`, `cross-fade`,
10
+ * `element`, `-moz-element`, `paint`, `expression`; the properties `behavior` and `-moz-binding`; `javascript:` and
11
+ * `vbscript:` anywhere. Escapes are decoded before any check (`\75 rl(` is `url(`).
12
+ */
13
+ export declare const OWNER_CSS_MAX_BYTES: number;
14
+ export declare const OWNER_CSS_ASSET_ID: RegExp;
15
+ /** What an `asset:` reference becomes when served. */
16
+ export declare const ownerCssAssetUrl: (id: string) => string;
17
+ export type CssTokenType = "ident" | "function" | "at" | "hash" | "string" | "bad-string" | "url" | "bad-url" | "delim" | "number" | "percentage" | "dimension" | "ws" | "cdo" | "cdc" | ":" | ";" | "," | "[" | "]" | "(" | ")" | "{" | "}";
18
+ export interface CssToken {
19
+ type: CssTokenType;
20
+ /** Decoded: an ident/function/at/hash name, a string's or url's contents, a delim's character, a number's text. */
21
+ value: string;
22
+ /** dimension: its unit, decoded. */
23
+ unit?: string;
24
+ /** hash: "id" when its name would start an identifier (Syntax §4.3.1) — what makes it an ID selector. */
25
+ hashType?: "id" | "unrestricted";
26
+ /** ws: whether it held a newline (kept so the served text keeps its lines). */
27
+ newline?: boolean;
28
+ }
29
+ /** CSS Syntax Level 3 §4 tokenizer. Comments are consumed (they are not tokens). */
30
+ export declare function tokenizeCss(text: string): CssToken[];
31
+ export interface OwnerCssProblem {
32
+ problem: string;
33
+ detail?: string;
34
+ }
35
+ /**
36
+ * The checks (§3). `assets`: the ids stored with this CSS. Returns the tokens to serve from, or the first problem.
37
+ * Run before storing and again before serving.
38
+ */
39
+ export declare function checkOwnerCss(text: string, assets: ReadonlySet<string>): {
40
+ ok: true;
41
+ tokens: CssToken[];
42
+ } | {
43
+ ok: false;
44
+ error: OwnerCssProblem;
45
+ };
46
+ /** The asset ids a checked text names (decoded: url("\\61sset:<id>") counts as asset:<id>). */
47
+ export declare function ownerCssAssetRefs(tokens: readonly CssToken[]): Set<string>;
48
+ /**
49
+ * The served text: re-serialised from the checked tokens, `asset:<id>` rewritten to `/ui/owner-css/asset/<id>`.
50
+ * Throws if the result does not tokenize back to the same tokens (it never should; the route then serves nothing).
51
+ */
52
+ export declare function serializeOwnerCss(tokens: readonly CssToken[]): string;
53
+ /**
54
+ * #1629: the generic serialiser (effects reuse it, B2): canonical text for these tokens, exactly as given (no asset
55
+ * rewriting), with a comment between pairs that would merge. Throws if the text does not tokenize back to the same
56
+ * tokens (type, value, unit, hash type; whitespace as whitespace).
57
+ */
58
+ export declare function serializeCssTokens(tokens: readonly CssToken[]): string;