@songsid/agend 2.2.1 → 2.3.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-cli-instructions.md +5 -2
- package/dist/agent-cli.js +284 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.d.ts +2 -0
- package/dist/agent-endpoint.js +29 -0
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.d.ts +38 -0
- package/dist/agent-file-read.js +317 -0
- package/dist/agent-file-read.js.map +1 -0
- package/dist/agent-whats-new.d.ts +11 -0
- package/dist/agent-whats-new.js +29 -2
- package/dist/agent-whats-new.js.map +1 -1
- package/dist/atomic-write.js +9 -1
- package/dist/atomic-write.js.map +1 -1
- package/dist/auth-api.d.ts +30 -1
- package/dist/auth-api.js +61 -12
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/authority-state.d.ts +38 -0
- package/dist/authority/authority-state.js +114 -0
- package/dist/authority/authority-state.js.map +1 -0
- package/dist/authority/session-authorizations.d.ts +43 -0
- package/dist/authority/session-authorizations.js +102 -0
- package/dist/authority/session-authorizations.js.map +1 -0
- package/dist/authority/web-authority.d.ts +120 -0
- package/dist/authority/web-authority.js +157 -0
- package/dist/authority/web-authority.js.map +1 -0
- package/dist/backend/antigravity.js +3 -3
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +2 -2
- package/dist/backend/claude-code.js +10 -5
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/launch-effort.js +1 -1
- package/dist/backend/launch-effort.js.map +1 -1
- package/dist/backend/muse.js +10 -2
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +14 -0
- package/dist/backend/types.js +25 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/backend-availability.d.ts +120 -0
- package/dist/backend-availability.js +396 -0
- package/dist/backend-availability.js.map +1 -0
- package/dist/backend-command.d.ts +21 -3
- package/dist/backend-command.js +23 -4
- package/dist/backend-command.js.map +1 -1
- package/dist/bundled-skills.d.ts +14 -0
- package/dist/bundled-skills.js +29 -0
- package/dist/bundled-skills.js.map +1 -0
- package/dist/cache-analysis.d.ts +47 -1
- package/dist/cache-analysis.js +68 -8
- package/dist/cache-analysis.js.map +1 -1
- package/dist/cache-ledger.d.ts +16 -3
- package/dist/cache-ledger.js +33 -13
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-report-tool.d.ts +17 -0
- package/dist/cache-report-tool.js +40 -0
- package/dist/cache-report-tool.js.map +1 -0
- package/dist/cache-service.d.ts +70 -3
- package/dist/cache-service.js +178 -17
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord.d.ts +9 -0
- package/dist/channel/adapters/discord.js +52 -2
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +8 -1
- package/dist/channel/adapters/telegram.js +74 -4
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-tools.js +48 -2
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/types.d.ts +21 -0
- package/dist/classic-channel-manager.d.ts +10 -5
- package/dist/classic-channel-manager.js +12 -9
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +130 -31
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +119 -4
- package/dist/config-validator.js.map +1 -1
- package/dist/daemon.d.ts +5 -0
- package/dist/daemon.js +273 -22
- package/dist/daemon.js.map +1 -1
- package/dist/decision-list.d.ts +25 -0
- package/dist/decision-list.js +30 -0
- package/dist/decision-list.js.map +1 -0
- package/dist/delivery-outbox.d.ts +10 -0
- package/dist/delivery-outbox.js +12 -1
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/fleet-context.d.ts +15 -0
- package/dist/fleet-manager.d.ts +506 -11
- package/dist/fleet-manager.js +1784 -130
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-traffic.d.ts +74 -0
- package/dist/fleet-traffic.js +196 -0
- package/dist/fleet-traffic.js.map +1 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +20 -5
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +6 -1
- package/dist/general-knowledge/skills/multi-channel/SKILL.md +3 -2
- package/dist/general-knowledge/skills/persona-emoji/SKILL.md +1 -1
- package/dist/general-knowledge/skills/web-appearance/SKILL.md +492 -0
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +476 -0
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/human-delivery-receipts.d.ts +24 -1
- package/dist/human-delivery-receipts.js +64 -11
- package/dist/human-delivery-receipts.js.map +1 -1
- package/dist/instance-avatar.js +3 -0
- package/dist/instance-avatar.js.map +1 -1
- package/dist/instance-config-impact.js +6 -1
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.js +9 -4
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instance-names.d.ts +4 -0
- package/dist/instance-names.js +12 -0
- package/dist/instance-names.js.map +1 -0
- package/dist/instructions.d.ts +12 -1
- package/dist/instructions.js +13 -2
- package/dist/instructions.js.map +1 -1
- package/dist/locale.js +100 -8
- package/dist/locale.js.map +1 -1
- package/dist/ls-attach-resolve.d.ts +95 -0
- package/dist/ls-attach-resolve.js +174 -0
- package/dist/ls-attach-resolve.js.map +1 -0
- package/dist/memory-hogs.d.ts +27 -0
- package/dist/memory-hogs.js +124 -0
- package/dist/memory-hogs.js.map +1 -0
- package/dist/needs-you-hub.d.ts +4 -0
- package/dist/needs-you-hub.js +31 -6
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +1 -13
- package/dist/needs-you.js +3 -37
- package/dist/needs-you.js.map +1 -1
- package/dist/outbound-handlers.d.ts +15 -0
- package/dist/outbound-handlers.js +152 -11
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +228 -4
- package/dist/outbound-schemas.js +147 -1
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/public-web-gateway.js +21 -1
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +9 -0
- package/dist/public-web-link.js +8 -0
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.d.ts +10 -1
- package/dist/quickstart-api.js +12 -4
- package/dist/quickstart-api.js.map +1 -1
- package/dist/reply-buttons-controller.d.ts +4 -0
- package/dist/reply-buttons-controller.js +2 -2
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/repo-worktree-guard.d.ts +36 -0
- package/dist/repo-worktree-guard.js +143 -0
- package/dist/repo-worktree-guard.js.map +1 -0
- package/dist/restart-progress.d.ts +65 -1
- package/dist/restart-progress.js +236 -10
- package/dist/restart-progress.js.map +1 -1
- package/dist/rollout-index.d.ts +5 -0
- package/dist/rollout-index.js +26 -5
- package/dist/rollout-index.js.map +1 -1
- package/dist/scheduler/scheduler.d.ts +70 -1
- package/dist/scheduler/scheduler.js +256 -17
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/service-installer.d.ts +2 -1
- package/dist/service-installer.js +18 -3
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.d.ts +19 -0
- package/dist/settings-api.js +210 -2
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-change.js +112 -0
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.js +32 -2
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +5 -0
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/tmux-manager.d.ts +5 -0
- package/dist/tmux-manager.js +16 -0
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tool-permissions.d.ts +4 -6
- package/dist/tool-permissions.js +100 -2
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.d.ts +17 -7
- package/dist/topic-commands.js +39 -21
- package/dist/topic-commands.js.map +1 -1
- package/dist/topic-link.d.ts +128 -0
- package/dist/topic-link.js +269 -0
- package/dist/topic-link.js.map +1 -0
- package/dist/types.d.ts +61 -1
- package/dist/ui/app-effects.js +233 -0
- package/dist/ui/chat-ambient.js +307 -0
- package/dist/ui/chat-effect-posters.js +42 -0
- package/dist/ui/chat-effects.js +160 -0
- package/dist/ui/chat-live-replies.js +58 -0
- package/dist/ui/chat-render.js +9 -6
- package/dist/ui/chat-store.js +9 -3
- package/dist/ui/chat-strings.js +70 -2
- package/dist/ui/chat-thread.js +191 -37
- package/dist/ui/chat-tour.js +1 -1
- package/dist/ui/effect-trial-controller.js +124 -0
- package/dist/ui/effect-trial-offer.js +31 -0
- package/dist/ui/effect-trial-panel.js +40 -0
- package/dist/ui/fleet-cache.js +23 -1
- package/dist/ui/fleet-canvas-layout.js +111 -0
- package/dist/ui/fleet-canvas.js +525 -0
- package/dist/ui/fleet-org.js +27 -12
- package/dist/ui/fleet-traffic.js +343 -0
- package/dist/ui/fleet-usage.js +401 -0
- package/dist/ui/image-lightbox.js +1 -1
- package/dist/ui/panel-chat.js +203 -57
- package/dist/ui/panel-details.js +20 -6
- package/dist/ui/panel-fleet.js +43 -18
- package/dist/ui/panel-log.js +6 -6
- package/dist/ui/panel-needs.js +3 -3
- package/dist/ui/panel-settings.js +34 -13
- package/dist/ui/preview-panel.js +25 -9
- package/dist/ui/preview.js +3 -2
- package/dist/ui/settings-appearance.js +349 -0
- package/dist/ui/settings-catalog.js +92 -0
- package/dist/ui/settings-dialogs.js +40 -12
- package/dist/ui/settings-effects.js +202 -0
- package/dist/ui/settings-guests.js +117 -0
- package/dist/ui/settings-learn.js +25 -0
- package/dist/ui/settings-model.js +15 -6
- package/dist/ui/settings-mods.js +271 -0
- package/dist/ui/settings-owner-effects.js +80 -0
- package/dist/ui/settings-strings.js +333 -10
- package/dist/ui/settings-web-authority.js +91 -0
- package/dist/ui/shared/agend-auth.js +28 -4
- package/dist/ui/shared/agent-widget.js +248 -0
- package/dist/ui/shared/app-i18n.js +6 -2
- package/dist/ui/shared/app-prefs.js +34 -13
- package/dist/ui/shared/app-route.js +24 -2
- package/dist/ui/shared/app-session.js +3 -1
- package/dist/ui/shared/app-shell.js +102 -23
- package/dist/ui/shared/app-store.js +28 -1
- package/dist/ui/shared/app-stream.js +14 -7
- package/dist/ui/shared/app-themes.js +206 -0
- package/dist/ui/shared/app.css +565 -4
- package/dist/ui/shared/app.js +23 -10
- package/dist/ui/shared/card-strings.js +32 -0
- package/dist/ui/shared/effect-app-runtime.js +297 -0
- package/dist/ui/shared/effect-baseline.js +64 -0
- package/dist/ui/shared/effect-chat-runtime.js +167 -0
- package/dist/ui/shared/effect-cursor.js +125 -0
- package/dist/ui/shared/effect-frame.js +146 -0
- package/dist/ui/shared/effect-geometry.js +137 -0
- package/dist/ui/shared/effect-host-style.js +10 -0
- package/dist/ui/shared/effect-owner-regions.js +74 -0
- package/dist/ui/shared/effect-owner-source.js +115 -0
- package/dist/ui/shared/effect-policy.js +151 -0
- package/dist/ui/shared/effect-poster-reader.js +98 -0
- package/dist/ui/shared/effect-posters.js +117 -0
- package/dist/ui/shared/effect-profiler.js +184 -0
- package/dist/ui/shared/effect-profiles.js +65 -0
- package/dist/ui/shared/effect-registry.js +535 -0
- package/dist/ui/shared/effect-runtime-loader.js +234 -0
- package/dist/ui/shared/effect-safety.js +153 -0
- package/dist/ui/shared/effect-stock-snapshot.js +43 -0
- package/dist/ui/shared/effect-stock-trust.js +217 -0
- package/dist/ui/shared/effect-trial-shadow.js +62 -0
- package/dist/ui/shared/effect-trial-source.js +103 -0
- package/dist/ui/shared/effect-trial-stage.js +170 -0
- package/dist/ui/shared/effect-trial.css +40 -0
- package/dist/ui/shared/fx-motion.js +67 -0
- package/dist/ui/shared/header-tools.js +1 -1
- package/dist/ui/shared/identity-card.js +273 -0
- package/dist/ui/shared/identity-color.js +261 -0
- package/dist/ui/shared/instance-nav.js +215 -41
- package/dist/ui/shared/owner-css.js +221 -0
- package/dist/ui/shared/owner-effect-prefs.js +117 -0
- package/dist/ui/shared/panel-view.js +103 -10
- package/dist/ui/shared/signin.js +2 -0
- package/dist/ui/shared/tokens.css +9 -3
- package/dist/ui/shared/ui-dialog.js +1 -1
- package/dist/ui/shared/ui-icons.js +3 -0
- package/dist/ui/shared/ui-menu.js +1 -1
- package/dist/ui/shared/ui-toast.js +1 -1
- package/dist/ui/shared/usage-dialog.js +22 -2
- package/dist/ui/shared/view-strings.js +98 -2
- package/dist/ui/shared/web-authorize.js +151 -0
- package/dist/ui/signin.html +1 -0
- package/dist/ui/web-terminal/terminal.css +4 -4
- package/dist/usage/providers.d.ts +28 -0
- package/dist/usage/providers.js +126 -36
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage-report.d.ts +158 -0
- package/dist/usage-report.js +226 -0
- package/dist/usage-report.js.map +1 -0
- package/dist/usage-rollup.d.ts +51 -0
- package/dist/usage-rollup.js +168 -0
- package/dist/usage-rollup.js.map +1 -0
- package/dist/view-api.d.ts +68 -0
- package/dist/view-api.js +249 -8
- package/dist/view-api.js.map +1 -1
- package/dist/web-ambient.d.ts +72 -0
- package/dist/web-ambient.js +161 -0
- package/dist/web-ambient.js.map +1 -0
- package/dist/web-api.d.ts +111 -5
- package/dist/web-api.js +1235 -58
- package/dist/web-api.js.map +1 -1
- package/dist/web-appearance-limits.d.ts +82 -0
- package/dist/web-appearance-limits.js +83 -0
- package/dist/web-appearance-limits.js.map +1 -0
- package/dist/web-appearance-policy.d.ts +64 -0
- package/dist/web-appearance-policy.js +87 -0
- package/dist/web-appearance-policy.js.map +1 -0
- package/dist/web-appearance-tools.d.ts +53 -0
- package/dist/web-appearance-tools.js +124 -0
- package/dist/web-appearance-tools.js.map +1 -0
- package/dist/web-appearance-view.d.ts +124 -0
- package/dist/web-appearance-view.js +278 -0
- package/dist/web-appearance-view.js.map +1 -0
- package/dist/web-appearance.d.ts +93 -0
- package/dist/web-appearance.js +373 -0
- package/dist/web-appearance.js.map +1 -0
- package/dist/web-asset-parts.d.ts +93 -0
- package/dist/web-asset-parts.js +133 -0
- package/dist/web-asset-parts.js.map +1 -0
- package/dist/web-auth.js +20 -2
- package/dist/web-auth.js.map +1 -1
- package/dist/web-card.d.ts +110 -0
- package/dist/web-card.js +266 -0
- package/dist/web-card.js.map +1 -0
- package/dist/web-channel-echo.d.ts +7 -1
- package/dist/web-channel-echo.js +6 -2
- package/dist/web-channel-echo.js.map +1 -1
- package/dist/web-chat-history.d.ts +59 -0
- package/dist/web-chat-history.js +102 -4
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-commands.d.ts +1 -0
- package/dist/web-effect-bootstrap.d.ts +12 -0
- package/dist/web-effect-bootstrap.js +49 -0
- package/dist/web-effect-bootstrap.js.map +1 -0
- package/dist/web-effect-bundle.d.ts +28 -0
- package/dist/web-effect-bundle.js +171 -0
- package/dist/web-effect-bundle.js.map +1 -0
- package/dist/web-effect-canonical.d.ts +8 -0
- package/dist/web-effect-canonical.js +27 -0
- package/dist/web-effect-canonical.js.map +1 -0
- package/dist/web-effect-library.d.ts +114 -0
- package/dist/web-effect-library.js +530 -0
- package/dist/web-effect-library.js.map +1 -0
- package/dist/web-effect-playback.d.ts +30 -0
- package/dist/web-effect-playback.js +71 -0
- package/dist/web-effect-playback.js.map +1 -0
- package/dist/web-effect-poster.d.ts +8 -0
- package/dist/web-effect-poster.js +52 -0
- package/dist/web-effect-poster.js.map +1 -0
- package/dist/web-effect-profiles.d.ts +118 -0
- package/dist/web-effect-profiles.js +180 -0
- package/dist/web-effect-profiles.js.map +1 -0
- package/dist/web-effect-service.d.ts +93 -0
- package/dist/web-effect-service.js +335 -0
- package/dist/web-effect-service.js.map +1 -0
- package/dist/web-effect-tools.d.ts +48 -0
- package/dist/web-effect-tools.js +129 -0
- package/dist/web-effect-tools.js.map +1 -0
- package/dist/web-effect-trials.d.ts +86 -0
- package/dist/web-effect-trials.js +204 -0
- package/dist/web-effect-trials.js.map +1 -0
- package/dist/web-effect-upload.d.ts +27 -0
- package/dist/web-effect-upload.js +185 -0
- package/dist/web-effect-upload.js.map +1 -0
- package/dist/web-effect-worker.d.ts +8 -0
- package/dist/web-effect-worker.js +170 -0
- package/dist/web-effect-worker.js.map +1 -0
- package/dist/web-effect.d.ts +103 -0
- package/dist/web-effect.js +153 -0
- package/dist/web-effect.js.map +1 -0
- package/dist/web-guest-access.d.ts +125 -0
- package/dist/web-guest-access.js +234 -0
- package/dist/web-guest-access.js.map +1 -0
- package/dist/web-guest-rooms.d.ts +82 -0
- package/dist/web-guest-rooms.js +135 -0
- package/dist/web-guest-rooms.js.map +1 -0
- package/dist/web-identity-color.d.ts +87 -0
- package/dist/web-identity-color.js +209 -0
- package/dist/web-identity-color.js.map +1 -0
- package/dist/web-identity-palette.d.ts +113 -0
- package/dist/web-identity-palette.js +84 -0
- package/dist/web-identity-palette.js.map +1 -0
- package/dist/web-image-meta.d.ts +25 -0
- package/dist/web-image-meta.js +200 -0
- package/dist/web-image-meta.js.map +1 -0
- package/dist/web-login.d.ts +47 -0
- package/dist/web-login.js +115 -0
- package/dist/web-login.js.map +1 -1
- package/dist/web-mod-agent.d.ts +50 -0
- package/dist/web-mod-agent.js +207 -0
- package/dist/web-mod-agent.js.map +1 -0
- package/dist/web-mod-bundle.d.ts +157 -0
- package/dist/web-mod-bundle.js +529 -0
- package/dist/web-mod-bundle.js.map +1 -0
- package/dist/web-mod-export.d.ts +68 -0
- package/dist/web-mod-export.js +100 -0
- package/dist/web-mod-export.js.map +1 -0
- package/dist/web-mod-store.d.ts +289 -0
- package/dist/web-mod-store.js +638 -0
- package/dist/web-mod-store.js.map +1 -0
- package/dist/web-org.d.ts +3 -3
- package/dist/web-org.js +11 -17
- package/dist/web-org.js.map +1 -1
- package/dist/web-owner-css-store.d.ts +180 -0
- package/dist/web-owner-css-store.js +384 -0
- package/dist/web-owner-css-store.js.map +1 -0
- package/dist/web-owner-css.d.ts +58 -0
- package/dist/web-owner-css.js +552 -0
- package/dist/web-owner-css.js.map +1 -0
- package/dist/web-prefs.d.ts +62 -0
- package/dist/web-prefs.js +232 -36
- package/dist/web-prefs.js.map +1 -1
- package/dist/web-preview.d.ts +15 -3
- package/dist/web-preview.js +28 -9
- package/dist/web-preview.js.map +1 -1
- package/dist/web-returning-device.d.ts +41 -0
- package/dist/web-returning-device.js +57 -5
- package/dist/web-returning-device.js.map +1 -1
- package/dist/web-session-authorization.d.ts +132 -0
- package/dist/web-session-authorization.js +193 -0
- package/dist/web-session-authorization.js.map +1 -0
- package/dist/web-session.d.ts +70 -10
- package/dist/web-session.js +137 -22
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +67 -2
- package/dist/web-settings-patch.js +196 -1
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-settings-tools.d.ts +89 -0
- package/dist/web-settings-tools.js +270 -0
- package/dist/web-settings-tools.js.map +1 -0
- package/dist/web-shell-routes.d.ts +2 -2
- package/dist/web-shell-routes.js +2 -2
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-theme-store.d.ts +257 -0
- package/dist/web-theme-store.js +627 -0
- package/dist/web-theme-store.js.map +1 -0
- package/dist/web-theme.d.ts +123 -0
- package/dist/web-theme.js +416 -0
- package/dist/web-theme.js.map +1 -0
- package/dist/web-widget.d.ts +72 -0
- package/dist/web-widget.js +245 -0
- package/dist/web-widget.js.map +1 -0
- package/dist/workflow-templates/default.md +1 -1
- package/package.json +1 -1
- package/templates/systemd.service.ejs +8 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { WebEffectLibrary } from "./web-effect-library.js";
|
|
2
|
+
import type { CheckedWebEffect } from "./web-effect-bundle.js";
|
|
3
|
+
export declare const EFFECT_TRIAL_TTL_MS: number;
|
|
4
|
+
type Failure = {
|
|
5
|
+
ok: false;
|
|
6
|
+
error: "trial_unavailable" | "trial_busy" | "trial_capacity";
|
|
7
|
+
};
|
|
8
|
+
/** Display metadata only. Neither the id nor this object grants a resource read. */
|
|
9
|
+
export interface EffectTrialOffer {
|
|
10
|
+
readonly v: 1;
|
|
11
|
+
readonly offer: string;
|
|
12
|
+
readonly id: string;
|
|
13
|
+
readonly title: string;
|
|
14
|
+
readonly expiresAt: number;
|
|
15
|
+
}
|
|
16
|
+
/** Independent history/card codec: a card read back from chat history is display metadata, never a grant. */
|
|
17
|
+
export declare function effectTrialOffer(value: unknown): Readonly<EffectTrialOffer> | null;
|
|
18
|
+
/** HOST INPUT ONLY: build afresh from the route's verified session verdict, never from JSON.
|
|
19
|
+
* sessionHash is SessionRecord.idHash, not the cookie; epoch is its handle. Header tokens
|
|
20
|
+
* have no actor. Owner CSS is diagnostic; the host isolates Trial chrome in its own shadow root.
|
|
21
|
+
*/
|
|
22
|
+
export interface EffectTrialActor {
|
|
23
|
+
readonly via: "session";
|
|
24
|
+
readonly surface: "local";
|
|
25
|
+
readonly tier: "admin";
|
|
26
|
+
readonly sessionHash: string;
|
|
27
|
+
readonly epoch: string;
|
|
28
|
+
readonly person: string;
|
|
29
|
+
readonly ownerCss: "off" | "on" | "loading" | "unknown";
|
|
30
|
+
}
|
|
31
|
+
export interface EffectTrialDeps {
|
|
32
|
+
library: WebEffectLibrary;
|
|
33
|
+
known(instance: string): boolean;
|
|
34
|
+
monotonic?: () => number;
|
|
35
|
+
now?: () => number;
|
|
36
|
+
}
|
|
37
|
+
/** One owner per library. Register before publishing the library or doing any collection.
|
|
38
|
+
* No claims, preferences, files, exports or placements are written. Offers retain bytes
|
|
39
|
+
* only; read() always rechecks the origin agent's CURRENT own/shared ACL.
|
|
40
|
+
*/
|
|
41
|
+
export declare class WebEffectTrials {
|
|
42
|
+
private readonly deps;
|
|
43
|
+
private readonly offers;
|
|
44
|
+
private readonly trials;
|
|
45
|
+
private readonly unregister;
|
|
46
|
+
private busy;
|
|
47
|
+
private clockBusy;
|
|
48
|
+
private dead;
|
|
49
|
+
private brokenClock;
|
|
50
|
+
private previous;
|
|
51
|
+
constructor(deps: EffectTrialDeps);
|
|
52
|
+
private clock;
|
|
53
|
+
private references;
|
|
54
|
+
private prune;
|
|
55
|
+
private run;
|
|
56
|
+
private readable;
|
|
57
|
+
/** Agent may OFFER only, using its current own/shared read rights. No appearance write or rate-limit record.
|
|
58
|
+
* A repeat active offer is idempotent, never extends TTL, and needs no second card.
|
|
59
|
+
*/
|
|
60
|
+
offer(instance: string, id: string): {
|
|
61
|
+
ok: true;
|
|
62
|
+
offer: Readonly<EffectTrialOffer>;
|
|
63
|
+
created: boolean;
|
|
64
|
+
} | Failure;
|
|
65
|
+
/** The CSRF-protected POST /ui/effect-trials/start only, after an explicit local-admin click. Never a tool or GET. */
|
|
66
|
+
start(offer: string, instance: string, viewer: unknown): {
|
|
67
|
+
ok: true;
|
|
68
|
+
trial: string;
|
|
69
|
+
offer: Readonly<EffectTrialOffer>;
|
|
70
|
+
remainingMs: number;
|
|
71
|
+
} | Failure;
|
|
72
|
+
/** Each image/code/profile authorization supplies a FRESH verified viewer. Knowing a token is insufficient. */
|
|
73
|
+
read(trial: string, instance: string, viewer: unknown): {
|
|
74
|
+
ok: true;
|
|
75
|
+
id: string;
|
|
76
|
+
instance: string;
|
|
77
|
+
entry: CheckedWebEffect;
|
|
78
|
+
} | Failure;
|
|
79
|
+
/** An authenticated owner can stop even after CSS becomes on/unknown; never stops another session. */
|
|
80
|
+
stop(trial: string, viewer: unknown): {
|
|
81
|
+
ok: true;
|
|
82
|
+
} | Failure;
|
|
83
|
+
/** Call only when this library owner ends. No collection here; the caller owns GC ordering. */
|
|
84
|
+
dispose(): void;
|
|
85
|
+
}
|
|
86
|
+
export {};
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/** #1629: volatile Try authority. An agent's preview_web_effect posts an offer card in its own chat; only an explicit local-admin click (POST /ui/effect-trials/start) plays the clipped sample. */
|
|
2
|
+
import { randomBytes } from "node:crypto";
|
|
3
|
+
import { performance } from "node:perf_hooks";
|
|
4
|
+
import { canonicalText } from "./web-theme.js";
|
|
5
|
+
export const EFFECT_TRIAL_TTL_MS = 10 * 60 * 1000;
|
|
6
|
+
const ID = /^[0-9a-f]{32}$/;
|
|
7
|
+
const EPOCH = /^[0-9a-f]{16}$/;
|
|
8
|
+
const SESSION = /^[0-9a-f]{64}$/;
|
|
9
|
+
const LIMIT = 128;
|
|
10
|
+
const denied = () => ({ ok: false, error: "trial_unavailable" });
|
|
11
|
+
/** Closed own data without invoking getters; output does not retain caller-owned objects. */
|
|
12
|
+
function data(value, keys) {
|
|
13
|
+
try {
|
|
14
|
+
if (!value || typeof value !== "object" || ![Object.prototype, null].includes(Object.getPrototypeOf(value)))
|
|
15
|
+
return null;
|
|
16
|
+
const names = Reflect.ownKeys(value);
|
|
17
|
+
if (names.length !== keys.length || names.some(k => typeof k !== "string" || !keys.includes(k)))
|
|
18
|
+
return null;
|
|
19
|
+
const out = Object.create(null);
|
|
20
|
+
for (const k of keys) {
|
|
21
|
+
const d = Object.getOwnPropertyDescriptor(value, k);
|
|
22
|
+
if (!d || !Object.hasOwn(d, "value") || !d.enumerable)
|
|
23
|
+
return null;
|
|
24
|
+
out[k] = d.value;
|
|
25
|
+
}
|
|
26
|
+
return out;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Independent history/card codec: a card read back from chat history is display metadata, never a grant. */
|
|
33
|
+
export function effectTrialOffer(value) {
|
|
34
|
+
const d = data(value, ["v", "offer", "id", "title", "expiresAt"]);
|
|
35
|
+
if (!d || d.v !== 1 || typeof d.offer !== "string" || !ID.test(d.offer) || typeof d.id !== "string" || !ID.test(d.id)
|
|
36
|
+
|| typeof d.title !== "string" || d.title.length > 400 || canonicalText(d.title, 1, 40) !== d.title
|
|
37
|
+
|| !Number.isSafeInteger(d.expiresAt) || d.expiresAt < 0)
|
|
38
|
+
return null;
|
|
39
|
+
return Object.freeze({ v: 1, offer: d.offer, id: d.id, title: d.title, expiresAt: d.expiresAt });
|
|
40
|
+
}
|
|
41
|
+
function actor(value) {
|
|
42
|
+
const d = data(value, ["via", "surface", "tier", "sessionHash", "epoch", "person", "ownerCss"]);
|
|
43
|
+
if (!d || d.via !== "session" || d.surface !== "local" || d.tier !== "admin"
|
|
44
|
+
|| typeof d.sessionHash !== "string" || !SESSION.test(d.sessionHash)
|
|
45
|
+
|| typeof d.epoch !== "string" || !EPOCH.test(d.epoch)
|
|
46
|
+
|| typeof d.person !== "string" || !d.person.length || d.person.length > 256
|
|
47
|
+
|| !["off", "on", "loading", "unknown"].includes(d.ownerCss))
|
|
48
|
+
return null;
|
|
49
|
+
return Object.freeze({ ...d });
|
|
50
|
+
}
|
|
51
|
+
const sameActor = (a, b) => a.sessionHash === b.sessionHash && a.epoch === b.epoch && a.person === b.person;
|
|
52
|
+
/** One owner per library. Register before publishing the library or doing any collection.
|
|
53
|
+
* No claims, preferences, files, exports or placements are written. Offers retain bytes
|
|
54
|
+
* only; read() always rechecks the origin agent's CURRENT own/shared ACL.
|
|
55
|
+
*/
|
|
56
|
+
export class WebEffectTrials {
|
|
57
|
+
deps;
|
|
58
|
+
offers = new Map();
|
|
59
|
+
trials = new Map();
|
|
60
|
+
unregister;
|
|
61
|
+
busy = false;
|
|
62
|
+
clockBusy = false;
|
|
63
|
+
dead = false;
|
|
64
|
+
brokenClock = false;
|
|
65
|
+
previous = 0;
|
|
66
|
+
constructor(deps) {
|
|
67
|
+
this.deps = deps;
|
|
68
|
+
this.unregister = deps.library.registerReferenceSource("effect-trials", () => this.references());
|
|
69
|
+
}
|
|
70
|
+
clock() {
|
|
71
|
+
if (this.brokenClock || this.clockBusy)
|
|
72
|
+
throw Error("trial_clock");
|
|
73
|
+
this.clockBusy = true;
|
|
74
|
+
try {
|
|
75
|
+
const at = (this.deps.monotonic ?? (() => performance.now()))();
|
|
76
|
+
if (!Number.isFinite(at) || at < this.previous || at < 0 || at > Number.MAX_SAFE_INTEGER - EFFECT_TRIAL_TTL_MS)
|
|
77
|
+
throw Error("trial_clock");
|
|
78
|
+
this.previous = at;
|
|
79
|
+
return at;
|
|
80
|
+
}
|
|
81
|
+
catch (e) {
|
|
82
|
+
this.brokenClock = true;
|
|
83
|
+
throw e;
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
this.clockBusy = false;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
references() {
|
|
90
|
+
// Observational only. Do not prune, call the library or collect while it enumerates.
|
|
91
|
+
const at = this.clock();
|
|
92
|
+
return [...this.offers.values()].filter(o => at < o.until).map(o => ({ id: o.public.id, holder: `trial-offer:${o.public.offer}` }));
|
|
93
|
+
}
|
|
94
|
+
prune(at) {
|
|
95
|
+
for (const [id, o] of this.offers)
|
|
96
|
+
if (at >= o.until)
|
|
97
|
+
this.offers.delete(id);
|
|
98
|
+
for (const [id, t] of this.trials)
|
|
99
|
+
if (this.offers.get(t.offer.public.offer) !== t.offer)
|
|
100
|
+
this.trials.delete(id);
|
|
101
|
+
}
|
|
102
|
+
run(fn) {
|
|
103
|
+
if (this.busy || this.clockBusy)
|
|
104
|
+
return { ok: false, error: "trial_busy" };
|
|
105
|
+
if (this.dead || this.brokenClock)
|
|
106
|
+
return denied();
|
|
107
|
+
this.busy = true;
|
|
108
|
+
try {
|
|
109
|
+
this.prune(this.clock());
|
|
110
|
+
return fn();
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return denied();
|
|
114
|
+
}
|
|
115
|
+
finally {
|
|
116
|
+
this.busy = false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
readable(o) {
|
|
120
|
+
if (!this.deps.known(o.instance) || this.dead)
|
|
121
|
+
return null;
|
|
122
|
+
const r = this.deps.library.read(o.public.id, { kind: "agent", id: o.instance });
|
|
123
|
+
return r.ok && !this.dead && this.clock() < o.until ? r.entry : null;
|
|
124
|
+
}
|
|
125
|
+
/** Agent may OFFER only, using its current own/shared read rights. No appearance write or rate-limit record.
|
|
126
|
+
* A repeat active offer is idempotent, never extends TTL, and needs no second card.
|
|
127
|
+
*/
|
|
128
|
+
offer(instance, id) {
|
|
129
|
+
return this.run(() => {
|
|
130
|
+
if (typeof instance !== "string" || !instance.length || instance.length > 128 || typeof id !== "string" || !ID.test(id) || !this.deps.known(instance) || this.dead)
|
|
131
|
+
return denied();
|
|
132
|
+
const r = this.deps.library.read(id, { kind: "agent", id: instance });
|
|
133
|
+
if (!r.ok || this.dead)
|
|
134
|
+
return denied();
|
|
135
|
+
const at = this.clock();
|
|
136
|
+
this.prune(at);
|
|
137
|
+
const old = [...this.offers.values()].find(o => o.instance === instance);
|
|
138
|
+
if (old?.public.id === id)
|
|
139
|
+
return { ok: true, offer: old.public, created: false };
|
|
140
|
+
if (!old && this.offers.size >= LIMIT)
|
|
141
|
+
return { ok: false, error: "trial_capacity" };
|
|
142
|
+
const wall = (this.deps.now ?? Date.now)();
|
|
143
|
+
if (!Number.isSafeInteger(wall) || wall < 0 || wall > Number.MAX_SAFE_INTEGER - EFFECT_TRIAL_TTL_MS || this.dead)
|
|
144
|
+
return denied();
|
|
145
|
+
const offer = effectTrialOffer({ v: 1, offer: randomBytes(16).toString("hex"), id, title: r.entry.manifest.title, expiresAt: wall + EFFECT_TRIAL_TTL_MS });
|
|
146
|
+
if (!offer || this.offers.has(offer.offer) || this.clock() - at >= EFFECT_TRIAL_TTL_MS || this.dead)
|
|
147
|
+
return denied();
|
|
148
|
+
if (old)
|
|
149
|
+
this.offers.delete(old.public.offer);
|
|
150
|
+
this.prune(this.clock());
|
|
151
|
+
this.offers.set(offer.offer, Object.freeze({ public: offer, instance, until: at + EFFECT_TRIAL_TTL_MS }));
|
|
152
|
+
return { ok: true, offer, created: true };
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
/** The CSRF-protected POST /ui/effect-trials/start only, after an explicit local-admin click. Never a tool or GET. */
|
|
156
|
+
start(offer, instance, viewer) {
|
|
157
|
+
return this.run(() => {
|
|
158
|
+
const a = actor(viewer), o = this.offers.get(offer);
|
|
159
|
+
if (!a || !o || o.instance !== instance || !this.readable(o))
|
|
160
|
+
return denied();
|
|
161
|
+
const old = [...this.trials.values()].find(t => t.actor.sessionHash === a.sessionHash);
|
|
162
|
+
if (!old && this.trials.size >= LIMIT)
|
|
163
|
+
return { ok: false, error: "trial_capacity" };
|
|
164
|
+
const token = randomBytes(16).toString("hex");
|
|
165
|
+
const remainingMs = Math.floor(o.until - this.clock());
|
|
166
|
+
if (this.trials.has(token) || remainingMs <= 0 || this.dead)
|
|
167
|
+
return denied();
|
|
168
|
+
if (old)
|
|
169
|
+
this.trials.delete(old.token);
|
|
170
|
+
this.trials.set(token, Object.freeze({ token, offer: o, actor: a }));
|
|
171
|
+
return { ok: true, trial: token, offer: o.public, remainingMs };
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/** Each image/code/profile authorization supplies a FRESH verified viewer. Knowing a token is insufficient. */
|
|
175
|
+
read(trial, instance, viewer) {
|
|
176
|
+
return this.run(() => {
|
|
177
|
+
const a = actor(viewer), t = this.trials.get(trial);
|
|
178
|
+
if (!a || !t || t.offer.instance !== instance || !sameActor(a, t.actor))
|
|
179
|
+
return denied();
|
|
180
|
+
const entry = this.readable(t.offer);
|
|
181
|
+
return entry ? { ok: true, id: t.offer.public.id, instance: t.offer.instance, entry } : denied();
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
/** An authenticated owner can stop even after CSS becomes on/unknown; never stops another session. */
|
|
185
|
+
stop(trial, viewer) {
|
|
186
|
+
return this.run(() => {
|
|
187
|
+
const a = actor(viewer), t = this.trials.get(trial);
|
|
188
|
+
if (!a || !t || !sameActor(a, t.actor))
|
|
189
|
+
return denied();
|
|
190
|
+
this.trials.delete(trial);
|
|
191
|
+
return { ok: true };
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/** Call only when this library owner ends. No collection here; the caller owns GC ordering. */
|
|
195
|
+
dispose() {
|
|
196
|
+
if (this.dead)
|
|
197
|
+
return;
|
|
198
|
+
this.dead = true;
|
|
199
|
+
this.trials.clear();
|
|
200
|
+
this.offers.clear();
|
|
201
|
+
this.unregister();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=web-effect-trials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-effect-trials.js","sourceRoot":"","sources":["../src/web-effect-trials.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type AgentFileContext } from "./agent-file-read.js";
|
|
2
|
+
export declare const EFFECT_WIRE_LIMIT: number;
|
|
3
|
+
export declare const EFFECT_UPLOAD_MEMORY: number;
|
|
4
|
+
export declare const EFFECT_UPLOAD_IDLE_MS = 60000;
|
|
5
|
+
export type EffectRead = {
|
|
6
|
+
ok: true;
|
|
7
|
+
files: ReadonlyMap<string, Uint8Array>;
|
|
8
|
+
} | {
|
|
9
|
+
ok: false;
|
|
10
|
+
reason: string;
|
|
11
|
+
};
|
|
12
|
+
/** All paths and bounded reads are on the agent's side. A partial/changed directory is revalidated as one CW1 entry. */
|
|
13
|
+
export declare function readAgentEffect(dir: unknown, opts: AgentFileContext): Promise<EffectRead>;
|
|
14
|
+
/** The one transport representation; normalized entries only, no directory path, caller or holder. */
|
|
15
|
+
export declare function encodeEffectFiles(files: ReadonlyMap<string, Uint8Array>): Buffer | null;
|
|
16
|
+
export declare function decodeEffectFiles(bytes: Uint8Array): ReadonlyMap<string, Uint8Array> | null;
|
|
17
|
+
/** Every part fits the existing endpoint/IPC limit; a part is acknowledged before the next is sent. */
|
|
18
|
+
export declare function sendEffectInParts(files: ReadonlyMap<string, Uint8Array>, send: (args: Record<string, unknown>) => Promise<Record<string, unknown>>): Promise<Record<string, unknown>>;
|
|
19
|
+
/** Receiving side: caller identity comes from IPC/session, never the part's fields. No filesystem path is accepted. */
|
|
20
|
+
export declare class EffectUploads {
|
|
21
|
+
private readonly clock;
|
|
22
|
+
private readonly pending;
|
|
23
|
+
private lastClock;
|
|
24
|
+
constructor(clock?: () => number);
|
|
25
|
+
forget(instance: string): void;
|
|
26
|
+
accept(instance: string, args: Record<string, unknown>, complete: (files: ReadonlyMap<string, Uint8Array>) => Record<string, unknown>): Record<string, unknown>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/** #1629 CW1: agent-side directory snapshot and bounded multipart transport. No fleet opens a workspace path. */
|
|
2
|
+
import { lstat, opendir, realpath } from "node:fs/promises";
|
|
3
|
+
import { isAbsolute, join, resolve, sep } from "node:path";
|
|
4
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
5
|
+
import { agentFileScope, readAgentFile } from "./agent-file-read.js";
|
|
6
|
+
import { checkEffectEntry } from "./web-effect-bundle.js";
|
|
7
|
+
import { ASSET_PART_BYTES } from "./web-asset-parts.js";
|
|
8
|
+
// Room for base64-wrapped raw metadata; CW1 still limits normalized entries to one MiB.
|
|
9
|
+
export const EFFECT_WIRE_LIMIT = 12 * 1024 * 1024;
|
|
10
|
+
export const EFFECT_UPLOAD_MEMORY = 64 * 1024 * 1024;
|
|
11
|
+
export const EFFECT_UPLOAD_IDLE_MS = 60_000;
|
|
12
|
+
const ROOT_FILES = new Set(["effect.json", "worker.js", "poster.png", "cursor.png"]);
|
|
13
|
+
const ASSET_NAME = /^[a-z0-9][a-z0-9_-]{0,63}\.(?:png|jpe?g|webp|gif)$/;
|
|
14
|
+
const under = (path, root) => path === root || path.startsWith(root.endsWith(sep) ? root : root + sep);
|
|
15
|
+
/** All paths and bounded reads are on the agent's side. A partial/changed directory is revalidated as one CW1 entry. */
|
|
16
|
+
export async function readAgentEffect(dir, opts) {
|
|
17
|
+
if (typeof dir !== "string" || !dir.trim() || dir.includes("\0") || !opts.workspace)
|
|
18
|
+
return { ok: false, reason: "an effect directory in your working directory" };
|
|
19
|
+
try {
|
|
20
|
+
const named = isAbsolute(dir) ? dir : resolve(opts.workspace, dir), info = await lstat(named);
|
|
21
|
+
if (!info.isDirectory() || info.isSymbolicLink())
|
|
22
|
+
return { ok: false, reason: "not a plain directory" };
|
|
23
|
+
const root = await realpath(named), scope = await agentFileScope(opts), workspace = scope.workspace;
|
|
24
|
+
if (!under(root, workspace) || (scope.stateBlocked(root) || scope.stateBlocked(named)))
|
|
25
|
+
return { ok: false, reason: "outside the workspace or inside AgEnD state" };
|
|
26
|
+
const paths = [];
|
|
27
|
+
const directory = await opendir(root);
|
|
28
|
+
for await (const entry of directory) {
|
|
29
|
+
if (ROOT_FILES.has(entry.name) && entry.isFile())
|
|
30
|
+
paths.push(entry.name);
|
|
31
|
+
else if (entry.name === "assets" && entry.isDirectory()) {
|
|
32
|
+
const assets = await opendir(join(root, "assets"));
|
|
33
|
+
let count = 0;
|
|
34
|
+
for await (const asset of assets) {
|
|
35
|
+
if (++count > 16 || !asset.isFile() || !ASSET_NAME.test(asset.name))
|
|
36
|
+
return { ok: false, reason: "at most sixteen plain raster assets" };
|
|
37
|
+
paths.push("assets/" + asset.name);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else
|
|
41
|
+
return { ok: false, reason: "unsupported effect directory entry" };
|
|
42
|
+
if (paths.length > 20)
|
|
43
|
+
return { ok: false, reason: "too many effect files" };
|
|
44
|
+
}
|
|
45
|
+
const files = new Map();
|
|
46
|
+
let remaining = 8 * 1024 * 1024;
|
|
47
|
+
for (const path of paths.sort()) {
|
|
48
|
+
const read = await readAgentFile(join(root, path), { ...opts, maxBytes: remaining });
|
|
49
|
+
if (!read.ok)
|
|
50
|
+
return read;
|
|
51
|
+
remaining -= read.bytes.length;
|
|
52
|
+
files.set(path, read.bytes);
|
|
53
|
+
}
|
|
54
|
+
// This is preparation only. The receiving fleet validates again before any claim or limiter record.
|
|
55
|
+
const checked = checkEffectEntry(files);
|
|
56
|
+
return checked.ok ? { ok: true, files: checked.files } : { ok: false, reason: "invalid CW1 effect entry" };
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return { ok: false, reason: "cannot read effect directory" };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** The one transport representation; normalized entries only, no directory path, caller or holder. */
|
|
63
|
+
export function encodeEffectFiles(files) {
|
|
64
|
+
const checked = checkEffectEntry(files);
|
|
65
|
+
if (!checked.ok)
|
|
66
|
+
return null;
|
|
67
|
+
const bytes = Buffer.from(JSON.stringify([...checked.files].map(([path, data]) => ({ path, data_b64: Buffer.from(data).toString("base64") }))));
|
|
68
|
+
return bytes.length <= EFFECT_WIRE_LIMIT ? bytes : null;
|
|
69
|
+
}
|
|
70
|
+
export function decodeEffectFiles(bytes) {
|
|
71
|
+
if (bytes.byteLength > EFFECT_WIRE_LIMIT)
|
|
72
|
+
return null;
|
|
73
|
+
try {
|
|
74
|
+
const value = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
|
|
75
|
+
if (!Array.isArray(value) || value.length < 2 || value.length > 20)
|
|
76
|
+
return null;
|
|
77
|
+
const files = new Map();
|
|
78
|
+
let total = 0;
|
|
79
|
+
for (const entry of value) {
|
|
80
|
+
if (!entry || typeof entry !== "object" || Object.keys(entry).sort().join(",") !== "data_b64,path" || typeof entry.path !== "string" || files.has(entry.path) || typeof entry.data_b64 !== "string" || !/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(entry.data_b64))
|
|
81
|
+
return null;
|
|
82
|
+
const data = Buffer.from(entry.data_b64, "base64");
|
|
83
|
+
total += data.length;
|
|
84
|
+
if (total > 8 * 1024 * 1024)
|
|
85
|
+
return null;
|
|
86
|
+
files.set(entry.path, data);
|
|
87
|
+
}
|
|
88
|
+
const checked = checkEffectEntry(files);
|
|
89
|
+
return checked.ok ? checked.files : null;
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Every part fits the existing endpoint/IPC limit; a part is acknowledged before the next is sent. */
|
|
96
|
+
export async function sendEffectInParts(files, send) {
|
|
97
|
+
const all = encodeEffectFiles(files);
|
|
98
|
+
if (!all)
|
|
99
|
+
return { error: "invalid_effect" };
|
|
100
|
+
const sha256 = createHash("sha256").update(all).digest("hex"), count = Math.ceil(all.length / ASSET_PART_BYTES);
|
|
101
|
+
let upload, answer = {};
|
|
102
|
+
for (let index = 0; index < count; index++) {
|
|
103
|
+
answer = await send({ data_b64: all.subarray(index * ASSET_PART_BYTES, (index + 1) * ASSET_PART_BYTES).toString("base64"), part: { index, count, bytes: all.length, sha256, ...(upload ? { upload } : {}) } });
|
|
104
|
+
if (typeof answer.error === "string" || Array.isArray(answer.errors))
|
|
105
|
+
return answer;
|
|
106
|
+
if (index < count - 1) {
|
|
107
|
+
if (typeof answer.upload !== "string")
|
|
108
|
+
return { error: "upload", message: "The fleet did not accept the upload part." };
|
|
109
|
+
upload = answer.upload;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return answer;
|
|
113
|
+
}
|
|
114
|
+
/** Receiving side: caller identity comes from IPC/session, never the part's fields. No filesystem path is accepted. */
|
|
115
|
+
export class EffectUploads {
|
|
116
|
+
clock;
|
|
117
|
+
pending = new Map();
|
|
118
|
+
lastClock = null;
|
|
119
|
+
constructor(clock = () => performance.now()) {
|
|
120
|
+
this.clock = clock;
|
|
121
|
+
}
|
|
122
|
+
forget(instance) { this.pending.delete(instance); }
|
|
123
|
+
accept(instance, args, complete) {
|
|
124
|
+
const fail = (error) => { this.pending.delete(instance); return { error }; };
|
|
125
|
+
let now;
|
|
126
|
+
try {
|
|
127
|
+
now = this.clock();
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
this.pending.clear();
|
|
131
|
+
return { error: "clock_unavailable" };
|
|
132
|
+
}
|
|
133
|
+
if (!Number.isFinite(now) || now < 0 || this.lastClock !== null && now < this.lastClock) {
|
|
134
|
+
this.pending.clear();
|
|
135
|
+
return { error: "clock_unavailable" };
|
|
136
|
+
}
|
|
137
|
+
this.lastClock = now;
|
|
138
|
+
for (const [name, p] of this.pending)
|
|
139
|
+
if (now - p.last >= EFFECT_UPLOAD_IDLE_MS)
|
|
140
|
+
this.pending.delete(name);
|
|
141
|
+
if (!args || typeof args !== "object" || Array.isArray(args))
|
|
142
|
+
return fail("effect_part");
|
|
143
|
+
if (Object.keys(args).sort().join(",") !== "data_b64,part" || typeof args.data_b64 !== "string" || args.data_b64.length > Math.ceil(ASSET_PART_BYTES / 3) * 4 || !/^[A-Za-z0-9+/]*={0,2}$/.test(args.data_b64))
|
|
144
|
+
return fail("effect_part");
|
|
145
|
+
const raw = args.part;
|
|
146
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
147
|
+
return fail("effect_part");
|
|
148
|
+
const p = raw, keys = Object.keys(p).sort().join(",");
|
|
149
|
+
if (keys !== "bytes,count,index,sha256" && keys !== "bytes,count,index,sha256,upload")
|
|
150
|
+
return fail("effect_part");
|
|
151
|
+
if (!Number.isSafeInteger(p.index) || !Number.isSafeInteger(p.count) || !Number.isSafeInteger(p.bytes) || typeof p.sha256 !== "string" || !/^[0-9a-f]{64}$/.test(p.sha256))
|
|
152
|
+
return fail("effect_part");
|
|
153
|
+
const index = p.index, count = p.count, bytes = p.bytes;
|
|
154
|
+
if (bytes < 1 || bytes > EFFECT_WIRE_LIMIT || count !== Math.ceil(bytes / ASSET_PART_BYTES) || index < 0 || index >= count)
|
|
155
|
+
return fail("effect_part");
|
|
156
|
+
const chunk = Buffer.from(args.data_b64, "base64");
|
|
157
|
+
if (chunk.toString("base64") !== args.data_b64 || chunk.length !== (index < count - 1 ? ASSET_PART_BYTES : bytes - index * ASSET_PART_BYTES))
|
|
158
|
+
return fail("effect_part");
|
|
159
|
+
if (index === 0) {
|
|
160
|
+
if (p.upload !== undefined)
|
|
161
|
+
return fail("effect_part");
|
|
162
|
+
if (!this.pending.has(instance) && this.pending.size >= 32)
|
|
163
|
+
return fail("effect_upload_full");
|
|
164
|
+
this.pending.set(instance, { id: randomBytes(16).toString("hex"), count, next: 0, bytes, sha256: p.sha256, received: 0, chunks: [], last: now });
|
|
165
|
+
}
|
|
166
|
+
const up = this.pending.get(instance);
|
|
167
|
+
if (!up || (index !== 0 && p.upload !== up.id) || index !== up.next || bytes !== up.bytes || count !== up.count || p.sha256 !== up.sha256)
|
|
168
|
+
return fail("effect_upload");
|
|
169
|
+
if ([...this.pending.values()].reduce((n, p) => n + p.received, chunk.length) > EFFECT_UPLOAD_MEMORY)
|
|
170
|
+
return fail("effect_upload_full");
|
|
171
|
+
up.chunks.push(chunk);
|
|
172
|
+
up.received += chunk.length;
|
|
173
|
+
up.next++;
|
|
174
|
+
up.last = now;
|
|
175
|
+
if (up.next < up.count)
|
|
176
|
+
return { upload: up.id, received: up.received };
|
|
177
|
+
this.pending.delete(instance);
|
|
178
|
+
const all = Buffer.concat(up.chunks);
|
|
179
|
+
if (all.length !== up.bytes || createHash("sha256").update(all).digest("hex") !== up.sha256)
|
|
180
|
+
return { error: "effect_digest" };
|
|
181
|
+
const files = decodeEffectFiles(all);
|
|
182
|
+
return files ? complete(files) : { error: "invalid_effect" };
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=web-effect-upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-effect-upload.js","sourceRoot":"","sources":["../src/web-effect-upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** #1629: trusted bootstrap sources; uploaded JS runs only in a dedicated Worker, never a DOM realm. */
|
|
2
|
+
export declare const EFFECT_MAX_BYTES: number;
|
|
3
|
+
export declare const EFFECT_MAX_PIXELS: number;
|
|
4
|
+
export declare const EFFECT_SIGNAL_CHECK: string;
|
|
5
|
+
/** The private port never reaches user callbacks, including through poisoned native getters/schedulers. */
|
|
6
|
+
export declare function effectWorkerSource(): string;
|
|
7
|
+
/** No HTML input exists. The document realm contains only this shim and its single canvas. */
|
|
8
|
+
export declare function buildCanvasEffectShim(bootId: string, origins: readonly string[], sameListener?: boolean): string;
|