@songsid/agend 2.1.12 → 2.2.0-alpha.2
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/README.md +4 -2
- package/README.zh-TW.md +4 -2
- package/dist/agent-cli.js +6 -1
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent-endpoint.js +68 -12
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-token-header.d.ts +13 -0
- package/dist/agent-token-header.js +16 -0
- package/dist/agent-token-header.js.map +1 -0
- package/dist/auth/one-time-code.d.ts +19 -0
- package/dist/auth/one-time-code.js +49 -0
- package/dist/auth/one-time-code.js.map +1 -0
- package/dist/auth-api.d.ts +52 -0
- package/dist/auth-api.js +346 -0
- package/dist/auth-api.js.map +1 -0
- package/dist/backend/antigravity.js +4 -3
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/claude-code.d.ts +4 -0
- package/dist/backend/claude-code.js +97 -0
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex.js +59 -30
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok.js +1 -1
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro-agent.d.ts +66 -0
- package/dist/backend/kiro-agent.js +302 -0
- package/dist/backend/kiro-agent.js.map +1 -0
- package/dist/backend/kiro-identity.d.ts +80 -0
- package/dist/backend/kiro-identity.js +537 -0
- package/dist/backend/kiro-identity.js.map +1 -0
- package/dist/backend/kiro-v2-store-worker.d.ts +1 -0
- package/dist/backend/kiro-v2-store-worker.js +87 -0
- package/dist/backend/kiro-v2-store-worker.js.map +1 -0
- package/dist/backend/kiro-v2-store.d.ts +54 -0
- package/dist/backend/kiro-v2-store.js +131 -0
- package/dist/backend/kiro-v2-store.js.map +1 -0
- package/dist/backend/kiro-v3-identity.d.ts +5 -0
- package/dist/backend/kiro-v3-identity.js +22 -0
- package/dist/backend/kiro-v3-identity.js.map +1 -1
- package/dist/backend/kiro.d.ts +90 -7
- package/dist/backend/kiro.js +500 -124
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/muse.js +1 -1
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/types.d.ts +51 -3
- package/dist/backend/types.js.map +1 -1
- package/dist/cache-analysis.d.ts +92 -0
- package/dist/cache-analysis.js +147 -0
- package/dist/cache-analysis.js.map +1 -0
- package/dist/cache-ledger.d.ts +108 -0
- package/dist/cache-ledger.js +230 -0
- package/dist/cache-ledger.js.map +1 -0
- package/dist/cache-prices.d.ts +32 -0
- package/dist/cache-prices.js +73 -0
- package/dist/cache-prices.js.map +1 -0
- package/dist/cache-scan.d.ts +39 -0
- package/dist/cache-scan.js +115 -0
- package/dist/cache-scan.js.map +1 -0
- package/dist/cache-service.d.ts +115 -0
- package/dist/cache-service.js +417 -0
- package/dist/cache-service.js.map +1 -0
- package/dist/channel/adapters/discord.d.ts +1 -0
- package/dist/channel/adapters/discord.js +29 -10
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +1 -0
- package/dist/channel/adapters/telegram.js +13 -1
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/types.d.ts +9 -1
- package/dist/classic-channel-manager.d.ts +18 -10
- package/dist/classic-channel-manager.js +45 -18
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli-entry.d.ts +19 -0
- package/dist/cli-entry.js +36 -0
- package/dist/cli-entry.js.map +1 -0
- package/dist/cli.js +471 -146
- package/dist/cli.js.map +1 -1
- package/dist/command-table.d.ts +5 -3
- package/dist/command-table.js +29 -27
- package/dist/command-table.js.map +1 -1
- package/dist/config-validator.js +46 -0
- package/dist/config-validator.js.map +1 -1
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -1
- package/dist/connection-secrets.d.ts +6 -0
- package/dist/connection-secrets.js +4 -0
- package/dist/connection-secrets.js.map +1 -1
- package/dist/daemon.d.ts +95 -4
- package/dist/daemon.js +748 -111
- package/dist/daemon.js.map +1 -1
- package/dist/darwin-memory.d.ts +6 -1
- package/dist/darwin-memory.js +17 -6
- package/dist/darwin-memory.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +85 -0
- package/dist/delivery-consumed-watch.js +244 -0
- package/dist/delivery-consumed-watch.js.map +1 -0
- package/dist/delivery-outbox.d.ts +61 -0
- package/dist/delivery-outbox.js +120 -2
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +14 -5
- package/dist/delivery-reconciliation.js +27 -4
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/delivery-reconciliation.test.js +35 -1
- package/dist/delivery-reconciliation.test.js.map +1 -1
- package/dist/event-log.d.ts +4 -1
- package/dist/event-log.js +6 -3
- package/dist/event-log.js.map +1 -1
- package/dist/event-loop-watch.d.ts +28 -0
- package/dist/event-loop-watch.js +75 -3
- package/dist/event-loop-watch.js.map +1 -1
- package/dist/fleet-context.d.ts +22 -2
- package/dist/fleet-control-audit.d.ts +5 -0
- package/dist/fleet-control-audit.js +7 -0
- package/dist/fleet-control-audit.js.map +1 -1
- package/dist/fleet-level-config.d.ts +2 -2
- package/dist/fleet-level-config.js +28 -1
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-manager.d.ts +339 -12
- package/dist/fleet-manager.js +2623 -461
- package/dist/fleet-manager.js.map +1 -1
- package/dist/full-restart.js +2 -3
- package/dist/full-restart.js.map +1 -1
- package/dist/general-knowledge/skills/persona-emoji/SKILL.md +3 -1
- package/dist/host-memory.d.ts +4 -0
- package/dist/host-memory.js.map +1 -1
- package/dist/install-lock.d.ts +49 -0
- package/dist/install-lock.js +200 -0
- package/dist/install-lock.js.map +1 -0
- package/dist/instance-config-impact.js +8 -2
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +10 -5
- package/dist/instance-lifecycle.js +162 -53
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/locale.js +164 -16
- package/dist/locale.js.map +1 -1
- package/dist/login-controller.d.ts +2 -0
- package/dist/login-controller.js +17 -5
- package/dist/login-controller.js.map +1 -1
- package/dist/memory-pressure.d.ts +7 -8
- package/dist/memory-pressure.js +76 -15
- package/dist/memory-pressure.js.map +1 -1
- package/dist/monotonic-budget.d.ts +2 -0
- package/dist/monotonic-budget.js +28 -0
- package/dist/monotonic-budget.js.map +1 -0
- package/dist/needs-you-hub.d.ts +114 -0
- package/dist/needs-you-hub.js +370 -0
- package/dist/needs-you-hub.js.map +1 -0
- package/dist/needs-you-live.d.ts +116 -0
- package/dist/needs-you-live.js +228 -0
- package/dist/needs-you-live.js.map +1 -0
- package/dist/needs-you.d.ts +132 -0
- package/dist/needs-you.js +164 -0
- package/dist/needs-you.js.map +1 -0
- package/dist/node-version-guard.d.ts +30 -0
- package/dist/node-version-guard.js +50 -0
- package/dist/node-version-guard.js.map +1 -0
- package/dist/operator-control-paths.d.ts +4 -0
- package/dist/operator-control-paths.js +24 -0
- package/dist/operator-control-paths.js.map +1 -0
- package/dist/outbound-handlers.d.ts +2 -0
- package/dist/outbound-handlers.js +9 -2
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +5 -5
- package/dist/outbound-schemas.js +1 -1
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/package-preimage.d.ts +26 -0
- package/dist/package-preimage.js +96 -0
- package/dist/package-preimage.js.map +1 -0
- package/dist/profile-control.js +4 -20
- package/dist/profile-control.js.map +1 -1
- package/dist/public-web-gateway.d.ts +18 -0
- package/dist/public-web-gateway.js +141 -0
- package/dist/public-web-gateway.js.map +1 -0
- package/dist/public-web-link.d.ts +53 -0
- package/dist/public-web-link.js +175 -0
- package/dist/public-web-link.js.map +1 -0
- package/dist/quickstart-api.d.ts +8 -1
- package/dist/quickstart-api.js +86 -48
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +1 -0
- package/dist/quickstart.js +16 -6
- package/dist/quickstart.js.map +1 -1
- package/dist/restart-guard.d.ts +52 -0
- package/dist/restart-guard.js +109 -0
- package/dist/restart-guard.js.map +1 -0
- package/dist/scheduler/db.d.ts +7 -1
- package/dist/scheduler/db.js +44 -2
- package/dist/scheduler/db.js.map +1 -1
- package/dist/scheduler/index.d.ts +1 -1
- package/dist/scheduler/retry-label.d.ts +11 -0
- package/dist/scheduler/retry-label.js +24 -0
- package/dist/scheduler/retry-label.js.map +1 -0
- package/dist/scheduler/scheduler.d.ts +55 -2
- package/dist/scheduler/scheduler.js +220 -8
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/scheduler/types.d.ts +22 -0
- package/dist/scheduler/types.js.map +1 -1
- package/dist/secret-store.d.ts +5 -0
- package/dist/secret-store.js +20 -0
- package/dist/secret-store.js.map +1 -1
- package/dist/service-activation.d.ts +152 -0
- package/dist/service-activation.js +407 -0
- package/dist/service-activation.js.map +1 -0
- package/dist/service-installer.d.ts +63 -1
- package/dist/service-installer.js +141 -16
- package/dist/service-installer.js.map +1 -1
- package/dist/service-plan.d.ts +65 -0
- package/dist/service-plan.js +108 -0
- package/dist/service-plan.js.map +1 -0
- package/dist/service-restart-selection.d.ts +6 -5
- package/dist/service-restart-selection.js +6 -5
- package/dist/service-restart-selection.js.map +1 -1
- package/dist/settings-api.d.ts +10 -2
- package/dist/settings-api.js +216 -72
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.d.ts +20 -0
- package/dist/settings-baseline.js +104 -0
- package/dist/settings-baseline.js.map +1 -0
- package/dist/settings-change.d.ts +21 -0
- package/dist/settings-change.js +161 -0
- package/dist/settings-change.js.map +1 -0
- package/dist/settings-confirmation.d.ts +105 -0
- package/dist/settings-confirmation.js +232 -0
- package/dist/settings-confirmation.js.map +1 -0
- package/dist/settings-control.d.ts +41 -0
- package/dist/settings-control.js +294 -0
- package/dist/settings-control.js.map +1 -0
- package/dist/settings-effect.d.ts +24 -0
- package/dist/settings-effect.js +169 -0
- package/dist/settings-effect.js.map +1 -0
- package/dist/settings-http-confirmation.d.ts +29 -0
- package/dist/settings-http-confirmation.js +123 -0
- package/dist/settings-http-confirmation.js.map +1 -0
- package/dist/settings-instance-patch.d.ts +4 -0
- package/dist/settings-instance-patch.js +26 -0
- package/dist/settings-instance-patch.js.map +1 -0
- package/dist/settings-request-capability.d.ts +16 -0
- package/dist/settings-request-capability.js +32 -0
- package/dist/settings-request-capability.js.map +1 -0
- package/dist/settings-transaction.d.ts +65 -0
- package/dist/settings-transaction.js +223 -0
- package/dist/settings-transaction.js.map +1 -0
- package/dist/setup-auth.d.ts +10 -18
- package/dist/setup-auth.js +14 -38
- package/dist/setup-auth.js.map +1 -1
- package/dist/setup-form.d.ts +1 -1
- package/dist/setup-form.js +75 -18
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-guide.d.ts +13 -0
- package/dist/setup-guide.js +25 -0
- package/dist/setup-guide.js.map +1 -0
- package/dist/setup-host.d.ts +16 -0
- package/dist/setup-host.js +199 -35
- package/dist/setup-host.js.map +1 -1
- package/dist/setup-wizard.js +5 -1
- package/dist/setup-wizard.js.map +1 -1
- package/dist/slash-authz.d.ts +17 -3
- package/dist/slash-authz.js +5 -0
- package/dist/slash-authz.js.map +1 -1
- package/dist/spawn-gate.js +3 -3
- package/dist/spawn-gate.js.map +1 -1
- package/dist/sqlite-open-errors.d.ts +12 -0
- package/dist/sqlite-open-errors.js +13 -0
- package/dist/sqlite-open-errors.js.map +1 -0
- package/dist/statusline-watcher.d.ts +5 -0
- package/dist/statusline-watcher.js +2 -0
- package/dist/statusline-watcher.js.map +1 -1
- package/dist/steer-capability.d.ts +6 -0
- package/dist/steer-capability.js +8 -0
- package/dist/steer-capability.js.map +1 -1
- package/dist/sync-work-attribution.d.ts +14 -0
- package/dist/sync-work-attribution.js +43 -8
- package/dist/sync-work-attribution.js.map +1 -1
- package/dist/tips.js +10 -5
- package/dist/tips.js.map +1 -1
- package/dist/tmux-control.d.ts +57 -5
- package/dist/tmux-control.js +379 -61
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-manager.d.ts +20 -6
- package/dist/tmux-manager.js +90 -47
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.d.ts +59 -0
- package/dist/tmux-read.js +213 -0
- package/dist/tmux-read.js.map +1 -0
- package/dist/topic-commands.d.ts +21 -10
- package/dist/topic-commands.js +205 -63
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-delta-reader.js +2 -1
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/tunnel/cloudflared-install.d.ts +2 -0
- package/dist/tunnel/cloudflared-install.js +1 -1
- package/dist/tunnel/cloudflared-install.js.map +1 -1
- package/dist/tunnel/purpose-lane.d.ts +14 -0
- package/dist/tunnel/purpose-lane.js +43 -0
- package/dist/tunnel/purpose-lane.js.map +1 -0
- package/dist/turn-reply-guard.d.ts +2 -0
- package/dist/turn-reply-guard.js +10 -1
- package/dist/turn-reply-guard.js.map +1 -1
- package/dist/types.d.ts +33 -0
- package/dist/ui/app.html +18 -0
- package/dist/ui/chat-commands.js +43 -0
- package/dist/ui/chat-render.js +478 -0
- package/dist/ui/chat-store.js +318 -0
- package/dist/ui/chat-strings.js +89 -0
- package/dist/ui/chat-thread.js +246 -0
- package/dist/ui/chat-tour.js +116 -0
- package/dist/ui/fleet-cache.js +168 -0
- package/dist/ui/fleet-org.js +142 -0
- package/dist/ui/panel-chat.js +504 -0
- package/dist/ui/panel-fleet.js +427 -0
- package/dist/ui/panel-needs.js +202 -0
- package/dist/ui/panel-settings.js +754 -0
- package/dist/ui/preview-panel.js +202 -0
- package/dist/ui/preview.js +270 -0
- package/dist/ui/settings-apply.js +239 -0
- package/dist/ui/settings-confirm.js +186 -0
- package/dist/ui/settings-dialogs.js +546 -0
- package/dist/ui/settings-model.js +277 -0
- package/dist/ui/settings-strings.js +654 -0
- package/dist/ui/settings-wizard.js +140 -0
- package/dist/ui/shared/agend-auth.js +93 -0
- package/dist/ui/shared/app-ctx.js +80 -0
- package/dist/ui/shared/app-html.js +9 -0
- package/dist/ui/shared/app-i18n.js +95 -0
- package/dist/ui/shared/app-nav.js +73 -0
- package/dist/ui/shared/app-needs.js +114 -0
- package/dist/ui/shared/app-route.js +73 -0
- package/dist/ui/shared/app-session.js +66 -0
- package/dist/ui/shared/app-shell.js +346 -0
- package/dist/ui/shared/app-store.js +51 -0
- package/dist/ui/shared/app-stream.js +201 -0
- package/dist/ui/shared/app.css +820 -0
- package/dist/ui/shared/app.js +88 -0
- package/dist/ui/shared/fonts/OFL.txt +92 -0
- package/dist/ui/shared/fonts/README.md +21 -0
- package/dist/ui/shared/fonts/inter.woff2 +0 -0
- package/dist/ui/shared/htm.module.js +1 -0
- package/dist/ui/shared/panel-view.js +655 -0
- package/dist/ui/shared/preact-hooks.module.js +2 -0
- package/dist/ui/shared/preact.module.js +2 -0
- package/dist/ui/shared/signin.js +142 -0
- package/dist/ui/shared/theme.js +29 -0
- package/dist/ui/shared/tokens.css +153 -0
- package/dist/ui/shared/ui-confirm.js +43 -0
- package/dist/ui/shared/ui-dialog.js +45 -0
- package/dist/ui/shared/ui-icons.js +63 -0
- package/dist/ui/shared/ui-menu.js +39 -0
- package/dist/ui/shared/ui-states.js +20 -0
- package/dist/ui/shared/ui-toast.js +18 -0
- package/dist/ui/shared/vendor/htm.LICENSE +202 -0
- package/dist/ui/shared/vendor/preact.LICENSE +21 -0
- package/dist/ui/shared/vendor/vendor.json +39 -0
- package/dist/ui/shared/view-strings.js +309 -0
- package/dist/ui/signin.html +52 -0
- package/dist/update-check.d.ts +6 -2
- package/dist/update-check.js +12 -3
- package/dist/update-check.js.map +1 -1
- package/dist/update-dispatch.d.ts +28 -0
- package/dist/update-dispatch.js +73 -0
- package/dist/update-dispatch.js.map +1 -0
- package/dist/update-install.d.ts +129 -0
- package/dist/update-install.js +262 -0
- package/dist/update-install.js.map +1 -0
- package/dist/upgrade-notices.d.ts +17 -0
- package/dist/upgrade-notices.js +93 -0
- package/dist/upgrade-notices.js.map +1 -0
- package/dist/usage/statusline-usage.d.ts +2 -0
- package/dist/usage/statusline-usage.js +14 -10
- package/dist/usage/statusline-usage.js.map +1 -1
- package/dist/view-api.d.ts +6 -1
- package/dist/view-api.js +62 -51
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +85 -14
- package/dist/web-api.js +557 -77
- package/dist/web-api.js.map +1 -1
- package/dist/web-auth.d.ts +71 -27
- package/dist/web-auth.js +169 -69
- package/dist/web-auth.js.map +1 -1
- package/dist/web-body.d.ts +3 -0
- package/dist/web-body.js +55 -0
- package/dist/web-body.js.map +1 -0
- package/dist/web-channel-echo.d.ts +9 -0
- package/dist/web-channel-echo.js +55 -0
- package/dist/web-channel-echo.js.map +1 -0
- package/dist/web-chat-history.d.ts +125 -0
- package/dist/web-chat-history.js +184 -0
- package/dist/web-chat-history.js.map +1 -0
- package/dist/web-commands.d.ts +77 -0
- package/dist/web-commands.js +81 -0
- package/dist/web-commands.js.map +1 -0
- package/dist/web-continuation.d.ts +7 -0
- package/dist/web-continuation.js +22 -0
- package/dist/web-continuation.js.map +1 -0
- package/dist/web-host-guard.d.ts +34 -0
- package/dist/web-host-guard.js +57 -1
- package/dist/web-host-guard.js.map +1 -1
- package/dist/web-login.d.ts +72 -0
- package/dist/web-login.js +132 -0
- package/dist/web-login.js.map +1 -0
- package/dist/web-org.d.ts +55 -0
- package/dist/web-org.js +67 -0
- package/dist/web-org.js.map +1 -0
- package/dist/web-preview.d.ts +77 -0
- package/dist/web-preview.js +240 -0
- package/dist/web-preview.js.map +1 -0
- package/dist/web-request-context.d.ts +10 -0
- package/dist/web-request-context.js +13 -0
- package/dist/web-request-context.js.map +1 -0
- package/dist/web-session.d.ts +167 -0
- package/dist/web-session.js +389 -0
- package/dist/web-session.js.map +1 -0
- package/dist/web-shell-routes.d.ts +59 -0
- package/dist/web-shell-routes.js +96 -0
- package/dist/web-shell-routes.js.map +1 -0
- package/dist/web-upload.d.ts +183 -0
- package/dist/web-upload.js +468 -0
- package/dist/web-upload.js.map +1 -0
- package/dist/website-tips-renderer.d.ts +2 -2
- package/dist/website-tips-renderer.js +3 -3
- package/dist/website-tips-renderer.js.map +1 -1
- package/launcher/agend +110 -0
- package/launcher/agend-agent +110 -0
- package/launcher/agend-agent.cjs +4 -0
- package/launcher/agend.cjs +4 -0
- package/launcher/install-admission.cjs +105 -0
- package/launcher/launch.cjs +64 -0
- package/launcher/postinstall.cjs +114 -0
- package/launcher/run-in-process.cjs +13 -0
- package/launcher/runtime-platform.cjs +86 -0
- package/launcher/runtime-select.cjs +217 -0
- package/package.json +18 -7
- package/scripts/preinstall-guard.cjs +55 -0
- package/templates/launchd.plist.ejs +2 -2
- package/templates/systemd.service.ejs +1 -1
- package/dist/ui/dashboard.html +0 -774
- package/dist/ui/settings.html +0 -2165
- package/dist/ui/view.html +0 -1139
package/dist/web-auth.js
CHANGED
|
@@ -1,20 +1,22 @@
|
|
|
1
|
+
import { gatewayRequestContext, isWebRequestCurrent } from "./web-request-context.js";
|
|
1
2
|
import { chmodSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "node:fs";
|
|
2
|
-
import {
|
|
3
|
+
import { randomBytes, timingSafeEqual } from "node:crypto";
|
|
3
4
|
import { join } from "node:path";
|
|
5
|
+
import { csrfTokenFor, tokenEpoch, } from "./web-session.js";
|
|
4
6
|
export const WEB_TOKEN_INVALID_MESSAGE = "Token expired or invalid — run /dashboard again";
|
|
5
7
|
/** No credential at all. Distinct from "wrong credential" so a browser that
|
|
6
8
|
* silently drops cookies is diagnosable instead of looking like a bad token. */
|
|
7
9
|
export const WEB_SESSION_REQUIRED_MESSAGE = "No session — open the dashboard link again (cookies must be enabled for this site)";
|
|
10
|
+
/** A cookie was sent and the server no longer honours it: expired, signed out, revoked or rotated away. */
|
|
11
|
+
export const WEB_SESSION_EXPIRED_MESSAGE = "Session expired or signed out — sign in again";
|
|
8
12
|
export const WEB_CROSS_SITE_MESSAGE = "Cross-site request rejected";
|
|
9
|
-
/** A URL token is redeemed for a session cookie on a GET; it is never a
|
|
10
|
-
* credential for a write, where it would also survive in history and logs. */
|
|
11
|
-
export const WEB_URL_TOKEN_WRITE_MESSAGE = "URL tokens are only redeemed on GET — send X-Agend-Token for API writes";
|
|
12
13
|
const WEB_TOKEN_PATTERN = /^[0-9a-f]{48}$/i;
|
|
14
|
+
/** Plain over http (loopback); `__Host-` over https, which pins Secure + Path=/ + no Domain in the browser. */
|
|
13
15
|
export const WEB_SESSION_COOKIE = "agend_session";
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export const
|
|
16
|
+
export const WEB_SESSION_COOKIE_SECURE = "__Host-agend_session";
|
|
17
|
+
/** Sent by pages on every write; the value is `csrfTokenFor(sessionId)`, handed out by `GET /auth/session`. */
|
|
18
|
+
export const WEB_CSRF_HEADER = "x-agend-csrf";
|
|
19
|
+
export const WEB_CSRF_MESSAGE = "Write rejected — missing or wrong CSRF token (reload the page)";
|
|
18
20
|
function readValidToken(path) {
|
|
19
21
|
try {
|
|
20
22
|
const token = readFileSync(path, "utf8").trim();
|
|
@@ -100,15 +102,6 @@ export function rotateWebToken(dataDir) {
|
|
|
100
102
|
catch { /* best effort */ }
|
|
101
103
|
return token;
|
|
102
104
|
}
|
|
103
|
-
/**
|
|
104
|
-
* The cookie carries a derivation of the token, never the token itself: a
|
|
105
|
-
* stolen cookie opens the panel but cannot be replayed as `?token=` /
|
|
106
|
-
* `X-Agend-Token` (which also authorize /view writes and the CLI). Rotating
|
|
107
|
-
* `web.token` changes the derivation, so every issued cookie dies with it.
|
|
108
|
-
*/
|
|
109
|
-
export function webSessionCookieValue(token) {
|
|
110
|
-
return createHash("sha256").update(`agend-web-session-v1:${token}`).digest("hex");
|
|
111
|
-
}
|
|
112
105
|
function constantTimeEquals(a, b) {
|
|
113
106
|
const left = Buffer.from(a, "utf8");
|
|
114
107
|
const right = Buffer.from(b, "utf8");
|
|
@@ -149,7 +142,10 @@ function headerValue(req, name) {
|
|
|
149
142
|
* caller, which is the same `X-Agend-Token` path the CLI uses.
|
|
150
143
|
*/
|
|
151
144
|
export function isSameOriginRequest(req) {
|
|
145
|
+
const gateway = gatewayRequestContext(req);
|
|
152
146
|
const origin = headerValue(req, "origin");
|
|
147
|
+
if (gateway)
|
|
148
|
+
return isWebRequestCurrent(req) && (!origin || origin === gateway.expectedOrigin);
|
|
153
149
|
if (!origin)
|
|
154
150
|
return true;
|
|
155
151
|
const host = headerValue(req, "host");
|
|
@@ -168,93 +164,197 @@ export function isSameOriginRequest(req) {
|
|
|
168
164
|
* attribute. The health server is always plain HTTP, so the only signal is the
|
|
169
165
|
* tunnel/proxy in front of it. A forged header can only make us set Secure on a
|
|
170
166
|
* plain-HTTP response, which costs the forger their own cookie and nothing else. */
|
|
171
|
-
function isSecureRequest(req) {
|
|
167
|
+
export function isSecureRequest(req) {
|
|
168
|
+
if (gatewayRequestContext(req))
|
|
169
|
+
return true;
|
|
172
170
|
const proto = headerValue(req, "x-forwarded-proto");
|
|
173
171
|
if (!proto)
|
|
174
172
|
return false;
|
|
175
173
|
return proto.split(",")[0].trim().toLowerCase() === "https";
|
|
176
174
|
}
|
|
177
|
-
|
|
175
|
+
/**
|
|
176
|
+
* The session cookie for a freshly minted session.
|
|
177
|
+
*
|
|
178
|
+
* `Max-Age` is a courtesy so the browser forgets it when the server would; the
|
|
179
|
+
* server enforces the expiry itself and does not rely on the browser doing so.
|
|
180
|
+
*/
|
|
181
|
+
export function buildSessionCookie(sessionId, secure, maxAgeSeconds) {
|
|
178
182
|
const attrs = [
|
|
179
|
-
`${WEB_SESSION_COOKIE}=${
|
|
183
|
+
`${secure ? WEB_SESSION_COOKIE_SECURE : WEB_SESSION_COOKIE}=${sessionId}`,
|
|
180
184
|
"Path=/",
|
|
181
185
|
"HttpOnly",
|
|
182
186
|
// Strict, not Lax: the panel can restart instances, so a cross-site
|
|
183
|
-
// navigation must not arrive already authenticated.
|
|
187
|
+
// navigation must not arrive already authenticated. The sign-in page
|
|
188
|
+
// handles the resulting "landed from a chat link" case.
|
|
184
189
|
"SameSite=Strict",
|
|
185
|
-
`Max-Age=${
|
|
190
|
+
`Max-Age=${Math.max(0, Math.floor(maxAgeSeconds))}`,
|
|
186
191
|
];
|
|
187
192
|
if (secure)
|
|
188
193
|
attrs.push("Secure");
|
|
189
194
|
return attrs.join("; ");
|
|
190
195
|
}
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
return
|
|
196
|
+
/** Expire the cookie under both names: which one was set depends on how the browser reached us. */
|
|
197
|
+
export function buildClearedSessionCookies() {
|
|
198
|
+
return [
|
|
199
|
+
`${WEB_SESSION_COOKIE}=; Path=/; HttpOnly; SameSite=Strict; Max-Age=0`,
|
|
200
|
+
`${WEB_SESSION_COOKIE_SECURE}=; Path=/; HttpOnly; SameSite=Strict; Max-Age=0; Secure`,
|
|
201
|
+
];
|
|
202
|
+
}
|
|
203
|
+
/** The presented session id, or undefined. A `__Host-` cookie wins: it cannot have been planted by a sibling site. */
|
|
204
|
+
export function readSessionCookie(req) {
|
|
205
|
+
const jar = parseCookieHeader(headerValue(req, "cookie") ?? undefined);
|
|
206
|
+
return gatewayRequestContext(req) ? jar.get(WEB_SESSION_COOKIE_SECURE) : jar.get(WEB_SESSION_COOKIE_SECURE) ?? jar.get(WEB_SESSION_COOKIE);
|
|
194
207
|
}
|
|
195
|
-
function hasValidHeaderToken(req, token) {
|
|
208
|
+
export function hasValidHeaderToken(req, token) {
|
|
209
|
+
if (gatewayRequestContext(req))
|
|
210
|
+
return false;
|
|
196
211
|
const provided = headerValue(req, "x-agend-token");
|
|
197
212
|
return !!provided && constantTimeEquals(provided, token);
|
|
198
213
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
* attacker-supplied Host would be an open redirect. */
|
|
202
|
-
function locationWithoutToken(url) {
|
|
203
|
-
const stripped = new URL(url.href);
|
|
204
|
-
stripped.searchParams.delete("token");
|
|
205
|
-
return `${stripped.pathname}${stripped.search}`;
|
|
214
|
+
function isSafeMethod(method) {
|
|
215
|
+
return method === "GET" || method === "HEAD" || method === "OPTIONS";
|
|
206
216
|
}
|
|
207
217
|
/**
|
|
208
|
-
* The
|
|
218
|
+
* The extra checks a write must pass when the only thing authorizing it is a
|
|
219
|
+
* cookie — an ambient credential the browser attaches to whatever page asks.
|
|
209
220
|
*
|
|
210
|
-
*
|
|
211
|
-
*
|
|
212
|
-
*
|
|
213
|
-
*
|
|
221
|
+
* Three independent ones, so that a gap in any single one (a browser without
|
|
222
|
+
* `Sec-Fetch-Site`, a same-site sibling that SameSite cannot tell from us) is
|
|
223
|
+
* not the whole defence:
|
|
224
|
+
* 1. `Origin` must be present and equal to `Host`. Present, unlike the read
|
|
225
|
+
* path: every browser sends it on a same-origin write, and its absence on a
|
|
226
|
+
* cookie-authenticated POST is a request nobody legitimate makes.
|
|
227
|
+
* 2. `Sec-Fetch-Site`, when the browser sends it, must say `same-origin`.
|
|
228
|
+
* 3. `X-Agend-CSRF` must equal the value derived from this session's id. A
|
|
229
|
+
* cross-site page cannot set a custom header without a preflight this server
|
|
230
|
+
* never approves, and cannot read the value.
|
|
231
|
+
*/
|
|
232
|
+
function passesCookieWriteChecks(req, sessionId) {
|
|
233
|
+
if (!headerValue(req, "origin"))
|
|
234
|
+
return false;
|
|
235
|
+
const site = headerValue(req, "sec-fetch-site");
|
|
236
|
+
if (site !== null && site !== "same-origin")
|
|
237
|
+
return false;
|
|
238
|
+
const presented = headerValue(req, WEB_CSRF_HEADER);
|
|
239
|
+
return !!presented && constantTimeEquals(presented, csrfTokenFor(sessionId));
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Session-only authorization, for the endpoints that are *about* the session
|
|
243
|
+
* (who am I, sign out, list devices). A header token is not a session and is not
|
|
244
|
+
* accepted here; everything else — Origin, expiry, rotation, and the write
|
|
245
|
+
* checks for an unsafe method — is the same as for any gated route.
|
|
214
246
|
*/
|
|
215
|
-
export function
|
|
247
|
+
export function authorizeSession(req, token, sessions, opts = {}) {
|
|
248
|
+
if (!token || !isWebRequestCurrent(req))
|
|
249
|
+
return { kind: "reject", status: 401, message: WEB_TOKEN_INVALID_MESSAGE };
|
|
250
|
+
if (!isSameOriginRequest(req))
|
|
251
|
+
return { kind: "reject", status: 403, message: WEB_CROSS_SITE_MESSAGE };
|
|
252
|
+
const cookie = readSessionCookie(req);
|
|
253
|
+
const session = sessions && cookie ? sessions.authenticate(cookie, tokenEpoch(token), { touch: opts.touch !== false, surface: gatewayRequestContext(req)?.surface, exposureId: gatewayRequestContext(req)?.exposureId }) : null;
|
|
254
|
+
if (!session || !cookie) {
|
|
255
|
+
return { kind: "reject", status: 401, message: cookie ? WEB_SESSION_EXPIRED_MESSAGE : WEB_SESSION_REQUIRED_MESSAGE };
|
|
256
|
+
}
|
|
257
|
+
const method = (req.method ?? "GET").toUpperCase();
|
|
258
|
+
if (!isSafeMethod(method) && !passesCookieWriteChecks(req, cookie)) {
|
|
259
|
+
return { kind: "reject", status: 403, message: WEB_CSRF_MESSAGE };
|
|
260
|
+
}
|
|
261
|
+
return { kind: "ok", session, sessionId: cookie };
|
|
262
|
+
}
|
|
263
|
+
function authorize(req, url, token, sessions, opts) {
|
|
216
264
|
// No token on disk means the panel is closed, not open to everyone. Without
|
|
217
265
|
// this, a null token compared against a missing credential authorizes.
|
|
218
|
-
if (!token)
|
|
219
|
-
return { kind: "reject", status: 401, message: WEB_TOKEN_INVALID_MESSAGE };
|
|
266
|
+
if (!token || !isWebRequestCurrent(req))
|
|
267
|
+
return { kind: "reject", status: 401, message: WEB_TOKEN_INVALID_MESSAGE, reason: "closed" };
|
|
220
268
|
if (!isSameOriginRequest(req)) {
|
|
221
|
-
return { kind: "reject", status: 403, message: WEB_CROSS_SITE_MESSAGE };
|
|
269
|
+
return { kind: "reject", status: 403, message: WEB_CROSS_SITE_MESSAGE, reason: "cross-site" };
|
|
222
270
|
}
|
|
223
|
-
|
|
224
|
-
|
|
271
|
+
const method = (req.method ?? "GET").toUpperCase();
|
|
272
|
+
// A header credential is not ambient — a page cannot make the browser add it —
|
|
273
|
+
// so it needs none of the cookie write checks, and is tried first: a request
|
|
274
|
+
// carrying both is the CLI's, not a forged form's.
|
|
225
275
|
if (hasValidHeaderToken(req, token))
|
|
226
|
-
return { kind: "allow" };
|
|
227
|
-
const
|
|
228
|
-
if (
|
|
229
|
-
const
|
|
230
|
-
if (
|
|
231
|
-
|
|
276
|
+
return { kind: "allow", via: "header-token" };
|
|
277
|
+
const cookie = readSessionCookie(req);
|
|
278
|
+
if (sessions && cookie) {
|
|
279
|
+
const session = sessions.authenticate(cookie, tokenEpoch(token), { touch: opts.touch, surface: gatewayRequestContext(req)?.surface, exposureId: gatewayRequestContext(req)?.exposureId });
|
|
280
|
+
if (session) {
|
|
281
|
+
if (!isSafeMethod(method) && !passesCookieWriteChecks(req, cookie)) {
|
|
282
|
+
return { kind: "reject", status: 403, message: WEB_CSRF_MESSAGE, reason: "csrf" };
|
|
283
|
+
}
|
|
284
|
+
return { kind: "allow", via: "session", session };
|
|
232
285
|
}
|
|
233
|
-
return {
|
|
234
|
-
kind: "exchange",
|
|
235
|
-
setCookie: buildSessionCookie(token, isSecureRequest(req)),
|
|
236
|
-
location: locationWithoutToken(url),
|
|
237
|
-
};
|
|
238
286
|
}
|
|
239
|
-
|
|
287
|
+
// A `?token=` in the URL is not a credential (it used to be redeemed for a cookie on a GET). A URL
|
|
288
|
+
// ends up in browser history, chat scrollback, screenshots and request logs; the dashboard now
|
|
289
|
+
// gives a one-time sign-in code instead, and the CLI and scripts send the X-Agend-Token header.
|
|
290
|
+
// A link that still carries one is answered like no credential at all: the sign-in page.
|
|
291
|
+
// A wrong header token is somebody presenting a credential and getting it wrong.
|
|
292
|
+
// A cookie that no longer works is the ordinary end of a session, not that: it is the same
|
|
293
|
+
// "you need to sign in" as no cookie at all, and a browser navigation should be answered
|
|
294
|
+
// with the sign-in page either way.
|
|
295
|
+
if (headerValue(req, "x-agend-token")) {
|
|
296
|
+
return { kind: "reject", status: 401, message: WEB_TOKEN_INVALID_MESSAGE, reason: "invalid" };
|
|
297
|
+
}
|
|
240
298
|
return {
|
|
241
299
|
kind: "reject",
|
|
242
300
|
status: 401,
|
|
243
|
-
message:
|
|
301
|
+
message: cookie ? WEB_SESSION_EXPIRED_MESSAGE : WEB_SESSION_REQUIRED_MESSAGE,
|
|
302
|
+
reason: "no-credential",
|
|
244
303
|
};
|
|
245
304
|
}
|
|
246
|
-
/**
|
|
247
|
-
*
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
305
|
+
/**
|
|
306
|
+
* Requests a page makes on its own timer, with nobody at it. They are authorized in full — session, expiry,
|
|
307
|
+
* revocation, token epoch — but never count as activity, or a tab left open would keep its session alive until the
|
|
308
|
+
* absolute cap and the idle limit would mean nothing (#1251 review; #1373 for /view and the stream).
|
|
309
|
+
*
|
|
310
|
+
* An explicit list of method + path, decided by the server. Never a header or a parameter the client sets: a page
|
|
311
|
+
* that could declare itself passive could also declare itself active.
|
|
312
|
+
*
|
|
313
|
+
* - `GET /ui/poll`: the dashboard's fallback poll, every 5 s while the stream is down.
|
|
314
|
+
* - `GET /ui/events`: the dashboard's live stream. The page opens it after it has loaded, and the browser reopens it
|
|
315
|
+
* on its own whenever it drops; the page load that opened it already counted. (Its heartbeat re-check passes
|
|
316
|
+
* `touch: false` itself.)
|
|
317
|
+
* - `GET /api/pane/<instance>`: `/view`'s terminal, every 0.8 s.
|
|
318
|
+
* - `GET /api/profiles`: `/view`'s roster, every 5 s.
|
|
319
|
+
* - `GET /api/ai-usage`: the usage panel, every minute while it is open.
|
|
320
|
+
*
|
|
321
|
+
* Everything else a session authorizes — a page load, a chat's history, any write — is the person, and slides the
|
|
322
|
+
* idle expiry. Only these matter when a session is required for them: `/view`'s reads and the usage panel are open by
|
|
323
|
+
* default and then touch nothing at all.
|
|
324
|
+
*/
|
|
325
|
+
const PASSIVE_GET_PATHS = new Set(["/ui/poll", "/ui/events", "/api/profiles", "/api/ai-usage"]);
|
|
326
|
+
const PASSIVE_GET_PANE = /^\/api\/pane\/[^/]+$/;
|
|
327
|
+
export function isPassiveWebRead(method, path) {
|
|
328
|
+
if ((method ?? "GET") !== "GET")
|
|
252
329
|
return false;
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
330
|
+
return PASSIVE_GET_PATHS.has(path) || PASSIVE_GET_PANE.test(path) || /^\/api\/settings\/pending(?:\/[0-9a-f]{32})?$/.test(path);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* The single authorization decision for every gated web route.
|
|
334
|
+
*
|
|
335
|
+
* Accepts, in order: an `X-Agend-Token` header (CLI and scripts) and a session
|
|
336
|
+
* cookie (made by signing in with a one-time code). Never a credential in the URL.
|
|
337
|
+
*/
|
|
338
|
+
export function decideWebGate(req, url, token, sessions) {
|
|
339
|
+
return authorize(req, url, token, sessions, { touch: !isPassiveWebRead(req.method, url.pathname) });
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* The decision, for a handler that needs to say *why* it refused (401 vs the 403
|
|
343
|
+
* a cross-site or CSRF failure earns) rather than only whether. A `?token=` in the
|
|
344
|
+
* URL is not a credential here either. Counts as activity exactly when the gate
|
|
345
|
+
* does (`isPassiveWebRead`), unless `touch` says otherwise.
|
|
346
|
+
*/
|
|
347
|
+
export function evaluateWebRequest(req, url, token, sessions, opts = {}) {
|
|
348
|
+
// A handler re-checking a request the gate already let through must not count it as activity when the gate did not.
|
|
349
|
+
return authorize(req, url, token, sessions, { touch: opts.touch ?? !isPassiveWebRead(req.method, url.pathname) });
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Defence in depth for handlers that run behind the gate: the same decision, as a boolean.
|
|
353
|
+
*
|
|
354
|
+
* `touch: false` is for a long-lived stream re-checking itself on a timer, which
|
|
355
|
+
* must be able to notice a revocation without counting as activity.
|
|
356
|
+
*/
|
|
357
|
+
export function isWebRequestAuthorized(req, url, token, sessions, opts = {}) {
|
|
358
|
+
return authorize(req, url, token, sessions, { touch: opts.touch ?? !isPassiveWebRead(req.method, url.pathname) }).kind === "allow";
|
|
259
359
|
}
|
|
260
360
|
//# sourceMappingURL=web-auth.js.map
|
package/dist/web-auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-auth.js","sourceRoot":"","sources":["../src/web-auth.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"web-auth.js","sourceRoot":"","sources":["../src/web-auth.ts"],"names":[],"mappings":"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"}
|
package/dist/web-body.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { cachedSettingsBody, settingsRequestExecution } from "./settings-request-capability.js";
|
|
2
|
+
/** Byte-bounded, abort-aware reader. Socket/request deadlines belong to the listener. */
|
|
3
|
+
export function readBoundedWebBody(req, maxBytes) {
|
|
4
|
+
const cached = cachedSettingsBody(req);
|
|
5
|
+
if (cached) {
|
|
6
|
+
if (cached.length > maxBytes)
|
|
7
|
+
return Promise.reject(new Error("payload too large"));
|
|
8
|
+
try {
|
|
9
|
+
settingsRequestExecution(req)?.assert();
|
|
10
|
+
return Promise.resolve(cached);
|
|
11
|
+
}
|
|
12
|
+
catch (err) {
|
|
13
|
+
return Promise.reject(err);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
const chunks = [];
|
|
18
|
+
let size = 0, settled = false;
|
|
19
|
+
const finish = (error) => {
|
|
20
|
+
if (settled)
|
|
21
|
+
return;
|
|
22
|
+
settled = true;
|
|
23
|
+
req.off("data", data);
|
|
24
|
+
req.off("end", end);
|
|
25
|
+
req.off("error", fail);
|
|
26
|
+
req.off("aborted", aborted);
|
|
27
|
+
req.off("close", closed);
|
|
28
|
+
if (error)
|
|
29
|
+
reject(error);
|
|
30
|
+
else
|
|
31
|
+
resolve(Buffer.concat(chunks));
|
|
32
|
+
};
|
|
33
|
+
const data = (chunk) => {
|
|
34
|
+
const bytes = typeof chunk === "string" ? Buffer.from(chunk, "utf8") : chunk;
|
|
35
|
+
size += bytes.length;
|
|
36
|
+
if (size > maxBytes) {
|
|
37
|
+
finish(new Error("payload too large"));
|
|
38
|
+
req.destroy();
|
|
39
|
+
}
|
|
40
|
+
else
|
|
41
|
+
chunks.push(bytes);
|
|
42
|
+
};
|
|
43
|
+
const end = () => finish();
|
|
44
|
+
const fail = (error) => finish(error);
|
|
45
|
+
const aborted = () => finish(new Error("request aborted"));
|
|
46
|
+
const closed = () => { if (!settled)
|
|
47
|
+
finish(new Error("request closed")); };
|
|
48
|
+
req.on("data", data);
|
|
49
|
+
req.on("end", end);
|
|
50
|
+
req.on("error", fail);
|
|
51
|
+
req.on("aborted", aborted);
|
|
52
|
+
req.on("close", closed);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=web-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-body.js","sourceRoot":"","sources":["../src/web-body.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Shared visible protocol prefix; provenance is the platform's author identity. */
|
|
2
|
+
export declare const WEB_ECHO_PREFIX = "\uD83C\uDF10 web \u00B7 ";
|
|
3
|
+
/** Visible ASCII labels survive compatibility normalisation/format stripping.
|
|
4
|
+
* URLs and email local parts are data, not mention/command tokens.
|
|
5
|
+
*/
|
|
6
|
+
export declare function neutralizeWebEchoText(text: string): string;
|
|
7
|
+
export declare function formatWebChannelEcho(user: string, preview: string, fullTextNote?: string): string;
|
|
8
|
+
/** Before trigger evaluation, independent of flags, send ACKs or recent IDs. */
|
|
9
|
+
export declare function isWebChannelEcho(text: string, authorId: string, fleetBotIds: ReadonlySet<string>): boolean;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/** Shared visible protocol prefix; provenance is the platform's author identity. */
|
|
2
|
+
export const WEB_ECHO_PREFIX = "🌐 web · ";
|
|
3
|
+
function clip(text, length) {
|
|
4
|
+
return text.slice(0, length).replace(/[\uD800-\uDBFF]$/, "");
|
|
5
|
+
}
|
|
6
|
+
function neutralizeTokens(text) {
|
|
7
|
+
return text
|
|
8
|
+
.replace(/<@([!&]?)(\d+)>/g, (_token, kind, id) => `[${kind === "&" ? "role" : "mention"}: ${id}]`)
|
|
9
|
+
.replace(/<#(\d+)>/g, (_token, id) => `[channel: ${id}]`)
|
|
10
|
+
.replace(/(?<![\p{L}\p{N}_/])\/([A-Za-z0-9_]+)(?:@([A-Za-z0-9_]+))?(?![\p{L}\p{N}_/@])/gu, (_token, command, bot) => `[command: ${command}${bot ? ` at ${bot}` : ""}]`)
|
|
11
|
+
.replace(/@([A-Za-z0-9_]+)(?=@)/g, (_token, name) => `[at: ${name}]`)
|
|
12
|
+
.replace(/(?<![\p{L}\p{N}_@.+%\-])@([A-Za-z0-9_]+)(?![A-Za-z0-9_])/gu, (_token, name) => `[at: ${name}]`);
|
|
13
|
+
}
|
|
14
|
+
/** Visible ASCII labels survive compatibility normalisation/format stripping.
|
|
15
|
+
* URLs and email local parts are data, not mention/command tokens.
|
|
16
|
+
*/
|
|
17
|
+
export function neutralizeWebEchoText(text) {
|
|
18
|
+
const normalized = text.normalize("NFKC").replace(/[\p{Cc}\p{Cf}]/gu, char => char === "\n" ? "\n" : char === "\t" ? " " : "");
|
|
19
|
+
const dataTokens = /[A-Za-z][A-Za-z0-9+.-]*:\/\/[^\s<>"'`]+|(?<![\p{L}\p{N}_@])(?:"[^"\r\n]+"|[\p{L}\p{N}._%+\-]+)@[A-Za-z0-9.\-]+\.[A-Za-z]{2,}(?![\p{L}\p{N}_@])/gu;
|
|
20
|
+
let result = "", offset = 0;
|
|
21
|
+
for (const match of normalized.matchAll(dataTokens)) {
|
|
22
|
+
let end = match.index + match[0].length;
|
|
23
|
+
// A Markdown/parenthesised URL ends at its balanced closing delimiter;
|
|
24
|
+
// that delimiter must not hide an adjacent active mention from rewriting.
|
|
25
|
+
if (/^[A-Za-z][A-Za-z0-9+.-]*:\/\//.test(match[0]) && normalized[match.index - 1] === "(") {
|
|
26
|
+
let depth = 1;
|
|
27
|
+
for (let index = match.index; index < end; index++) {
|
|
28
|
+
if (normalized[index] === "(")
|
|
29
|
+
depth++;
|
|
30
|
+
if (normalized[index] === ")" && --depth === 0) {
|
|
31
|
+
end = index;
|
|
32
|
+
break;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
result += neutralizeTokens(normalized.slice(offset, match.index)) + normalized.slice(match.index, end);
|
|
37
|
+
offset = end;
|
|
38
|
+
}
|
|
39
|
+
return result + neutralizeTokens(normalized.slice(offset));
|
|
40
|
+
}
|
|
41
|
+
export function formatWebChannelEcho(user, preview, fullTextNote = "full text in web chat") {
|
|
42
|
+
const label = clip(neutralizeWebEchoText(user).replace(/\s+/g, " "), 80) || "web-user";
|
|
43
|
+
const header = `${WEB_ECHO_PREFIX}${label}: `;
|
|
44
|
+
const body = neutralizeWebEchoText(preview);
|
|
45
|
+
// Labels can expand short input dramatically. Keep one platform message:
|
|
46
|
+
// a later Discord chunk would otherwise lose the provenance prefix.
|
|
47
|
+
const budget = 1800 - header.length;
|
|
48
|
+
const note = ` … (${clip(neutralizeWebEchoText(fullTextNote), 100)})`;
|
|
49
|
+
return header + (body.length > budget ? clip(body, budget - note.length) + note : body);
|
|
50
|
+
}
|
|
51
|
+
/** Before trigger evaluation, independent of flags, send ACKs or recent IDs. */
|
|
52
|
+
export function isWebChannelEcho(text, authorId, fleetBotIds) {
|
|
53
|
+
return fleetBotIds.has(authorId) && text.startsWith(WEB_ECHO_PREFIX);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=web-channel-echo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-channel-echo.js","sourceRoot":"","sources":["../src/web-channel-echo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/** A file shown with a message: an id the dashboard can fetch, never a path. */
|
|
2
|
+
export interface WebChatAttachment {
|
|
3
|
+
id: string;
|
|
4
|
+
kind: "photo" | "document";
|
|
5
|
+
name: string;
|
|
6
|
+
size: number;
|
|
7
|
+
mime: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* How far a message the web user sent has got (web track C3) — the ticks under it. The same lifecycle a
|
|
11
|
+
* Telegram message shows as reactions: waiting behind another message, handed to the agent, taken up by it,
|
|
12
|
+
* or not delivered; and `cancelled` when a Stop dropped it while it was still waiting.
|
|
13
|
+
*/
|
|
14
|
+
export type WebDeliveryState = "queued" | "processing" | "delivered" | "failed" | "cancelled";
|
|
15
|
+
/** The state after `next` arrives at a message in `prev`; `prev` itself when `next` would move it back. */
|
|
16
|
+
export declare function nextDeliveryState(prev: WebDeliveryState | undefined, next: WebDeliveryState): WebDeliveryState | undefined;
|
|
17
|
+
export type WebChatRole = "agent" | "user" | "status";
|
|
18
|
+
export interface WebChatMessage {
|
|
19
|
+
/** Files shown with the message (absent when none). */
|
|
20
|
+
attachments?: WebChatAttachment[];
|
|
21
|
+
/** The fleet process generation the id belongs to. */
|
|
22
|
+
boot: string;
|
|
23
|
+
/** Where a web user's message has got (absent: nothing reported yet, or not the web user's). */
|
|
24
|
+
delivery?: WebDeliveryState;
|
|
25
|
+
id: number;
|
|
26
|
+
instance: string;
|
|
27
|
+
/** The `message_id` the agent was given for a web user's message — what delivery reports name it by. */
|
|
28
|
+
messageId?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Who the server says wrote it (#1306), set by the code path that emitted it — never read from the text or the
|
|
31
|
+
* sender name: `agent` (a delivered reply), `user` (a person, on any surface; the default), `status` (a daemon
|
|
32
|
+
* status line on a web-only fleet). Only `agent` messages may get HTML preview cards.
|
|
33
|
+
*/
|
|
34
|
+
role: WebChatRole;
|
|
35
|
+
sender: string;
|
|
36
|
+
text: string;
|
|
37
|
+
ts: string;
|
|
38
|
+
}
|
|
39
|
+
export interface WebChatHistoryOptions {
|
|
40
|
+
/** Messages kept per instance. */
|
|
41
|
+
perInstance?: number;
|
|
42
|
+
/** Bytes of text kept per instance (UTF-16 length × 2 is close enough for a bound). */
|
|
43
|
+
perInstanceChars?: number;
|
|
44
|
+
/** Most messages one SSE reconnect is sent. */
|
|
45
|
+
replayMax?: number;
|
|
46
|
+
/** The generation id (tests); random otherwise. */
|
|
47
|
+
boot?: string;
|
|
48
|
+
}
|
|
49
|
+
export declare const WEB_CHAT_TEXT_MAX = 16000;
|
|
50
|
+
/**
|
|
51
|
+
* The `message_id` a message from the web chat is delivered under. Unique (two sends in one millisecond used
|
|
52
|
+
* to share `web-<ms>`), and never a platform id: Telegram and Discord ids are digits only.
|
|
53
|
+
*/
|
|
54
|
+
export declare function newWebMessageId(): string;
|
|
55
|
+
/** Whether a delivery report is about a message from the web chat rather than one on a platform. */
|
|
56
|
+
export declare function isWebMessageId(messageId: string): boolean;
|
|
57
|
+
export declare class WebChatHistory {
|
|
58
|
+
private nextId;
|
|
59
|
+
/** This process's generation: ids are only unique within it. */
|
|
60
|
+
readonly boot: string;
|
|
61
|
+
private readonly byInstance;
|
|
62
|
+
private readonly perInstance;
|
|
63
|
+
private readonly perInstanceChars;
|
|
64
|
+
private readonly replayMax;
|
|
65
|
+
constructor(opts?: WebChatHistoryOptions);
|
|
66
|
+
/** The id the next message will get minus one: the newest id handed out so far (0 when none). */
|
|
67
|
+
get lastId(): number;
|
|
68
|
+
/** Record one message; returns it with its id. Text beyond WEB_CHAT_TEXT_MAX is cut. */
|
|
69
|
+
record(msg: {
|
|
70
|
+
instance: string;
|
|
71
|
+
sender: string;
|
|
72
|
+
text: string;
|
|
73
|
+
ts: string;
|
|
74
|
+
attachments?: WebChatAttachment[];
|
|
75
|
+
messageId?: string;
|
|
76
|
+
role?: string;
|
|
77
|
+
}): WebChatMessage;
|
|
78
|
+
/** The most recent `limit` messages of one instance, oldest first. */
|
|
79
|
+
list(instance: string, limit?: number): WebChatMessage[];
|
|
80
|
+
/**
|
|
81
|
+
* Every message newer than `lastId`, across instances, oldest first, at most `replayMax` (the newest ones).
|
|
82
|
+
* Ids are this boot's: a cursor from another boot goes through replayFor(), never straight here.
|
|
83
|
+
*/
|
|
84
|
+
after(lastId: number): WebChatMessage[];
|
|
85
|
+
/**
|
|
86
|
+
* A delivery report for one of this instance's messages. Returns the message when its state changed (so the
|
|
87
|
+
* caller tells the pages), null when there is no such message or the report would move it back.
|
|
88
|
+
*/
|
|
89
|
+
setDelivery(instance: string, messageId: string, state: WebDeliveryState): WebChatMessage | null;
|
|
90
|
+
/**
|
|
91
|
+
* A Stop on this instance: the web user's messages still waiting (nothing reported, or queued) were dropped
|
|
92
|
+
* from the queue. The queue is first in, first out, so nothing older than a message that got further can
|
|
93
|
+
* still be waiting: the walk goes back from the newest and stops there. Returns the messages it changed.
|
|
94
|
+
*/
|
|
95
|
+
/**
|
|
96
|
+
* Where every retained web message got — the ticks — in one list. A delivery report has no cursor of its own and
|
|
97
|
+
* changes a message already sent, so a page that missed one (a dropped stream, a poll) catches up from this:
|
|
98
|
+
* the stream sends it on every (re)connect and each poll carries it (#1253 review). Ticks only move forward on
|
|
99
|
+
* the page, so receiving it twice changes nothing.
|
|
100
|
+
*/
|
|
101
|
+
deliveries(): Array<{
|
|
102
|
+
instance: string;
|
|
103
|
+
messageId: string;
|
|
104
|
+
delivery: WebDeliveryState;
|
|
105
|
+
}>;
|
|
106
|
+
cancelPending(instance: string): WebChatMessage[];
|
|
107
|
+
/** Forget an instance (deleted). */
|
|
108
|
+
forget(instance: string): void;
|
|
109
|
+
/** The SSE cursor for one message: `<boot>-<id>`. */
|
|
110
|
+
cursorOf(m: WebChatMessage): string;
|
|
111
|
+
/**
|
|
112
|
+
* What a reconnecting stream with this `Last-Event-ID` should be sent. A cursor of this boot replays what
|
|
113
|
+
* came after it; a cursor of another boot (the fleet restarted) gets this boot's whole retained backlog,
|
|
114
|
+
* since none of it can have been seen; no cursor, or one that is not ours in shape, gets nothing.
|
|
115
|
+
*/
|
|
116
|
+
replayFor(cursor: {
|
|
117
|
+
boot: string;
|
|
118
|
+
id: number;
|
|
119
|
+
} | null): WebChatMessage[];
|
|
120
|
+
}
|
|
121
|
+
/** `Last-Event-ID` as `<boot>-<id>`, or null when absent or not that shape. */
|
|
122
|
+
export declare function parseLastEventId(header: string | string[] | undefined): {
|
|
123
|
+
boot: string;
|
|
124
|
+
id: number;
|
|
125
|
+
} | null;
|