@songsid/agend 2.3.5-alpha.5 → 2.3.5-beta.1
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 +0 -2
- package/README.zh-TW.md +0 -2
- package/THIRD_PARTY_NOTICES.md +0 -68
- package/dist/agent-endpoint.d.ts +1 -5
- package/dist/agent-endpoint.js +2 -12
- package/dist/agent-endpoint.js.map +1 -1
- package/dist/agent-file-read.js +1 -1
- package/dist/agent-file-read.js.map +1 -1
- package/dist/auth-api.d.ts +0 -48
- package/dist/auth-api.js +4 -250
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/session-authorizations.d.ts +2 -0
- package/dist/authority/session-authorizations.js +7 -1
- package/dist/authority/session-authorizations.js.map +1 -1
- package/dist/authority/web-authority.d.ts +2 -12
- package/dist/authority/web-authority.js +4 -25
- package/dist/authority/web-authority.js.map +1 -1
- package/dist/backend/claude-code.d.ts +12 -15
- package/dist/backend/claude-code.js +133 -152
- package/dist/backend/claude-code.js.map +1 -1
- package/dist/backend/codex-footer-hints.d.ts +0 -3
- package/dist/backend/codex-footer-hints.js +0 -14
- package/dist/backend/codex-footer-hints.js.map +1 -1
- package/dist/backend/codex-package.d.ts +2 -5
- package/dist/backend/codex-package.js +5 -1
- package/dist/backend/codex-package.js.map +1 -1
- package/dist/backend/codex-quota-history.js +19 -4
- package/dist/backend/codex-quota-history.js.map +1 -1
- package/dist/backend/codex.d.ts +115 -142
- package/dist/backend/codex.js +1094 -1187
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok.d.ts +0 -2
- package/dist/backend/grok.js +0 -22
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/types.d.ts +2 -7
- package/dist/backend/types.js.map +1 -1
- package/dist/bundled-tmux-guard.d.ts +21 -0
- package/dist/bundled-tmux-guard.js +96 -0
- package/dist/bundled-tmux-guard.js.map +1 -0
- package/dist/channel/ipc-bridge.d.ts +0 -2
- package/dist/channel/mcp-tools.js +2 -2
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/classic-channel-manager.d.ts +2 -0
- package/dist/classic-channel-manager.js +5 -1
- package/dist/classic-channel-manager.js.map +1 -1
- package/dist/cli.js +30 -127
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +13 -74
- package/dist/config-validator.js.map +1 -1
- package/dist/config.js +3 -17
- package/dist/config.js.map +1 -1
- package/dist/daemon.d.ts +5 -72
- package/dist/daemon.js +275 -869
- package/dist/daemon.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +3 -15
- package/dist/delivery-consumed-watch.js +1 -23
- package/dist/delivery-consumed-watch.js.map +1 -1
- package/dist/delivery-outbox.d.ts +0 -5
- package/dist/delivery-outbox.js +4 -32
- package/dist/delivery-outbox.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +42 -2
- package/dist/delivery-reconciliation.js +164 -2
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/doctor.js +9 -20
- package/dist/doctor.js.map +1 -1
- package/dist/fleet-context.d.ts +2 -2
- package/dist/fleet-level-config.d.ts +1 -1
- package/dist/fleet-level-config.js +0 -2
- package/dist/fleet-level-config.js.map +1 -1
- package/dist/fleet-manager.d.ts +9 -498
- package/dist/fleet-manager.js +202 -2849
- package/dist/fleet-manager.js.map +1 -1
- package/dist/general-instance.d.ts +0 -7
- package/dist/general-instance.js +3 -20
- package/dist/general-instance.js.map +1 -1
- package/dist/general-knowledge/skills/concepts/SKILL.md +18 -50
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +2 -5
- package/dist/general-knowledge/skills/fleet-health/SKILL.md +2 -2
- package/dist/general-knowledge/skills/session-management/SKILL.md +1 -1
- package/dist/general-knowledge/skills/tui-effort/SKILL.md +10 -10
- package/dist/general-knowledge/skills/web-dashboard/SKILL.md +13 -23
- package/dist/instance-config-impact.js +4 -8
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +3 -22
- package/dist/instance-lifecycle.js +176 -393
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instructions.d.ts +0 -2
- package/dist/instructions.js +0 -6
- package/dist/instructions.js.map +1 -1
- package/dist/locale.js +2 -147
- package/dist/locale.js.map +1 -1
- package/dist/login-flows.d.ts +7 -8
- package/dist/login-flows.js +1 -24
- package/dist/login-flows.js.map +1 -1
- package/dist/ls-rows.js +4 -3
- package/dist/ls-rows.js.map +1 -1
- package/dist/muse-usage-relay.d.ts +2 -0
- package/dist/muse-usage-relay.js +5 -3
- package/dist/muse-usage-relay.js.map +1 -1
- package/dist/needs-you-hub.d.ts +0 -5
- package/dist/needs-you-hub.js +2 -18
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +2 -45
- package/dist/needs-you.js +2 -26
- package/dist/needs-you.js.map +1 -1
- package/dist/office-share-page.js +3 -3
- package/dist/office-share-page.js.map +1 -1
- package/dist/office-share.d.ts +0 -11
- package/dist/office-share.js +0 -14
- package/dist/office-share.js.map +1 -1
- package/dist/outbound-handlers.d.ts +2 -30
- package/dist/outbound-handlers.js +4 -109
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +1 -71
- package/dist/outbound-schemas.js +14 -36
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/pane-quota-history.d.ts +0 -2
- package/dist/pane-quota-history.js +0 -20
- package/dist/pane-quota-history.js.map +1 -1
- package/dist/pause-marker.d.ts +1 -1
- package/dist/pause-marker.js +1 -1
- package/dist/pause-marker.js.map +1 -1
- package/dist/public-web-gateway.js +0 -16
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/public-web-link.d.ts +0 -11
- package/dist/public-web-link.js +0 -13
- package/dist/public-web-link.js.map +1 -1
- package/dist/quickstart-api.js +5 -9
- package/dist/quickstart-api.js.map +1 -1
- package/dist/quickstart.d.ts +0 -6
- package/dist/quickstart.js +6 -44
- package/dist/quickstart.js.map +1 -1
- package/dist/quota-notice-config.d.ts +22 -0
- package/dist/quota-notice-config.js +41 -0
- package/dist/quota-notice-config.js.map +1 -0
- package/dist/scheduler/task-board-text.js +1 -1
- package/dist/scheduler/task-board-text.js.map +1 -1
- package/dist/scheduler/task-board.d.ts +0 -4
- package/dist/scheduler/task-board.js +3 -9
- package/dist/scheduler/task-board.js.map +1 -1
- package/dist/service-installer.d.ts +2 -7
- package/dist/service-installer.js +10 -13
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.d.ts +0 -12
- package/dist/settings-api.js +7 -487
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.d.ts +0 -7
- package/dist/settings-baseline.js +1 -3
- package/dist/settings-baseline.js.map +1 -1
- package/dist/settings-change.js +7 -35
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-confirmation.d.ts +1 -16
- package/dist/settings-confirmation.js +9 -47
- package/dist/settings-confirmation.js.map +1 -1
- package/dist/settings-effect.d.ts +0 -17
- package/dist/settings-effect.js +1 -155
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +0 -4
- package/dist/settings-http-confirmation.js +3 -43
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/settings-instance-patch.js +1 -1
- package/dist/settings-instance-patch.js.map +1 -1
- package/dist/settings-request-capability.d.ts +0 -2
- package/dist/settings-request-capability.js +0 -4
- package/dist/settings-request-capability.js.map +1 -1
- package/dist/settings-transaction.d.ts +0 -4
- package/dist/settings-transaction.js +0 -9
- package/dist/settings-transaction.js.map +1 -1
- package/dist/setup-form.js +3 -6
- package/dist/setup-form.js.map +1 -1
- package/dist/setup-i18n.js +0 -3
- package/dist/setup-i18n.js.map +1 -1
- package/dist/setup-wizard.js +2 -6
- package/dist/setup-wizard.js.map +1 -1
- package/dist/task-board-tool.d.ts +1 -2
- package/dist/task-board-tool.js +6 -62
- package/dist/task-board-tool.js.map +1 -1
- package/dist/tmux-control.d.ts +1 -2
- package/dist/tmux-control.js +4 -4
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-exec-helper.js +1 -32
- package/dist/tmux-exec-helper.js.map +1 -1
- package/dist/tmux-manager.d.ts +2 -3
- package/dist/tmux-manager.js +36 -45
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.js +3 -4
- package/dist/tmux-read.js.map +1 -1
- package/dist/tool-permissions.js +1 -2
- package/dist/tool-permissions.js.map +1 -1
- package/dist/topic-commands.js +5 -9
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-delta-reader.d.ts +1 -1
- package/dist/transcript-delta-reader.js +1 -1
- package/dist/transcript-delta-reader.js.map +1 -1
- package/dist/transcript-monitor.d.ts +0 -3
- package/dist/transcript-monitor.js +51 -27
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-sources.d.ts +0 -5
- package/dist/transcript-sources.js +79 -8
- package/dist/transcript-sources.js.map +1 -1
- package/dist/types.d.ts +3 -29
- package/dist/ui/app.html +8 -1
- package/dist/ui/backend-signin.js +21 -39
- package/dist/ui/chat-ambient.js +1 -1
- package/dist/ui/chat-md-strings.js +9 -3
- package/dist/ui/chat-render.js +670 -3
- package/dist/ui/chat-store.js +3 -14
- package/dist/ui/chat-strings.js +285 -3
- package/dist/ui/chat-thread.js +969 -3
- package/dist/ui/chat-time.js +80 -3
- package/dist/ui/chat-tour.js +1 -1
- package/dist/ui/fleet-office-pack.d.ts +0 -9
- package/dist/ui/fleet-office-pack.js +4 -76
- package/dist/ui/fleet-office-skin.js +5 -23
- package/dist/ui/fleet-office-store.js +0 -5
- package/dist/ui/fleet-office.js +6 -173
- package/dist/ui/fleet-task-card.js +4 -8
- package/dist/ui/fleet-task-common.js +2 -2
- package/dist/ui/fleet-tasks.js +39 -125
- package/dist/ui/html-attachment.js +40 -3
- package/dist/ui/office-share-page.js +2 -4
- package/dist/ui/panel-chat.js +75 -90
- package/dist/ui/panel-details.js +2 -3
- package/dist/ui/panel-fleet.js +18 -105
- package/dist/ui/panel-log.js +2 -2
- package/dist/ui/panel-needs.js +4 -162
- package/dist/ui/panel-notices.js +4 -3
- package/dist/ui/panel-settings.js +202 -281
- package/dist/ui/preview-pages.js +1 -1
- package/dist/ui/preview-panel.js +13 -21
- package/dist/ui/preview-versions.js +1 -1
- package/dist/ui/preview.js +476 -3
- package/dist/ui/search-dialog.js +3 -4
- package/dist/ui/settings-appearance.js +23 -122
- package/dist/ui/settings-catalog.js +10 -37
- package/dist/ui/settings-confirm.js +1 -3
- package/dist/ui/settings-dialogs.js +20 -48
- package/dist/ui/settings-guests.js +14 -27
- package/dist/ui/settings-model.js +1 -10
- package/dist/ui/settings-quota-notice.js +100 -0
- package/dist/ui/settings-registry.js +5 -15
- package/dist/ui/settings-strings.js +32 -105
- package/dist/ui/settings-web-authority.js +13 -18
- package/dist/ui/shared/app-i18n.js +2 -2
- package/dist/ui/shared/app-route.js +3 -12
- package/dist/ui/shared/app-session.js +2 -6
- package/dist/ui/shared/app-shell.js +26 -87
- package/dist/ui/shared/app-store.js +2 -3
- package/dist/ui/shared/app-stream.js +1 -3
- package/dist/ui/shared/app.css +5 -1368
- package/dist/ui/shared/app.js +5 -17
- package/dist/ui/shared/header-tools.js +9 -9
- package/dist/ui/shared/instance-nav.js +7 -34
- package/dist/ui/shared/instance-switch.js +3 -4
- package/dist/ui/shared/loading.css +37 -0
- package/dist/ui/shared/signin.js +6 -211
- package/dist/ui/shared/tokens.css +0 -1
- package/dist/ui/shared/ui-dialog.js +2 -2
- package/dist/ui/shared/ui-menu.js +10 -30
- package/dist/ui/shared/ui-states.js +14 -3
- package/dist/ui/shared/vendor/vendor.json +2 -19
- package/dist/ui/shared/view-strings.js +0 -8
- package/dist/ui/signin.html +5 -23
- package/dist/unattended-install.js +1 -2
- package/dist/unattended-install.js.map +1 -1
- package/dist/usage/providers.d.ts +5 -0
- package/dist/usage/providers.js +6 -2
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/quota-notices.d.ts +38 -0
- package/dist/usage/quota-notices.js +160 -0
- package/dist/usage/quota-notices.js.map +1 -0
- package/dist/usage/usage-api.d.ts +1 -0
- package/dist/usage/usage-api.js +16 -0
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/view-api.js +7 -5
- package/dist/view-api.js.map +1 -1
- package/dist/web-api.d.ts +2 -80
- package/dist/web-api.js +10 -513
- package/dist/web-api.js.map +1 -1
- package/dist/web-backend-login.d.ts +1 -23
- package/dist/web-backend-login.js +17 -11
- package/dist/web-backend-login.js.map +1 -1
- package/dist/web-chat-history.d.ts +2 -19
- package/dist/web-chat-history.js +3 -72
- package/dist/web-chat-history.js.map +1 -1
- package/dist/web-office-skins.d.ts +0 -9
- package/dist/web-office-skins.js +1 -16
- package/dist/web-office-skins.js.map +1 -1
- package/dist/web-only-fleet.d.ts +0 -20
- package/dist/web-only-fleet.js +0 -21
- package/dist/web-only-fleet.js.map +1 -1
- package/dist/web-session.d.ts +0 -42
- package/dist/web-session.js +0 -9
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +1 -3
- package/dist/web-settings-patch.js +1 -4
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-shell-routes.d.ts +1 -10
- package/dist/web-shell-routes.js +2 -14
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-terminal.d.ts +30 -4
- package/dist/web-terminal.js +6 -9
- package/dist/web-terminal.js.map +1 -1
- package/dist/yaml-shared-nodes.js +3 -8
- package/dist/yaml-shared-nodes.js.map +1 -1
- package/launcher/agend-install.cjs +1 -8
- package/launcher/postinstall.cjs +2 -27
- package/package.json +3 -10
- package/templates/launchd.plist.ejs +1 -3
- package/dist/accounts-view.d.ts +0 -97
- package/dist/accounts-view.js +0 -116
- package/dist/accounts-view.js.map +0 -1
- package/dist/agent-runtime-api.d.ts +0 -4
- package/dist/agent-runtime-api.js +0 -59
- package/dist/agent-runtime-api.js.map +0 -1
- package/dist/agent-runtime-change.d.ts +0 -76
- package/dist/agent-runtime-change.js +0 -114
- package/dist/agent-runtime-change.js.map +0 -1
- package/dist/agent-workspace.d.ts +0 -93
- package/dist/agent-workspace.js +0 -353
- package/dist/agent-workspace.js.map +0 -1
- package/dist/backend/grok-model-cache.d.ts +0 -7
- package/dist/backend/grok-model-cache.js +0 -65
- package/dist/backend/grok-model-cache.js.map +0 -1
- package/dist/backend/native-pane.d.ts +0 -11
- package/dist/backend/native-pane.js +0 -59
- package/dist/backend/native-pane.js.map +0 -1
- package/dist/build-provenance-cli.d.ts +0 -3
- package/dist/build-provenance-cli.js +0 -11
- package/dist/build-provenance-cli.js.map +0 -1
- package/dist/build-provenance.d.ts +0 -20
- package/dist/build-provenance.js +0 -67
- package/dist/build-provenance.js.map +0 -1
- package/dist/build-provenance.json +0 -1
- package/dist/claude-auth-status.d.ts +0 -48
- package/dist/claude-auth-status.js +0 -149
- package/dist/claude-auth-status.js.map +0 -1
- package/dist/fleet-windows-runtime.d.ts +0 -98
- package/dist/fleet-windows-runtime.js +0 -467
- package/dist/fleet-windows-runtime.js.map +0 -1
- package/dist/general-binding.d.ts +0 -85
- package/dist/general-binding.js +0 -298
- package/dist/general-binding.js.map +0 -1
- package/dist/general-host-owner.d.ts +0 -8
- package/dist/general-host-owner.js +0 -26
- package/dist/general-host-owner.js.map +0 -1
- package/dist/general-role.d.ts +0 -5
- package/dist/general-role.js +0 -27
- package/dist/general-role.js.map +0 -1
- package/dist/hub/admission.d.ts +0 -28
- package/dist/hub/admission.js +0 -62
- package/dist/hub/admission.js.map +0 -1
- package/dist/hub/attachments/limits.d.ts +0 -20
- package/dist/hub/attachments/limits.js +0 -48
- package/dist/hub/attachments/limits.js.map +0 -1
- package/dist/hub/attachments/store.d.ts +0 -116
- package/dist/hub/attachments/store.js +0 -246
- package/dist/hub/attachments/store.js.map +0 -1
- package/dist/hub/audit/index.d.ts +0 -62
- package/dist/hub/audit/index.js +0 -344
- package/dist/hub/audit/index.js.map +0 -1
- package/dist/hub/browser-certificate.d.ts +0 -38
- package/dist/hub/browser-certificate.js +0 -247
- package/dist/hub/browser-certificate.js.map +0 -1
- package/dist/hub/buttons-model.d.ts +0 -9
- package/dist/hub/buttons-model.js +0 -42
- package/dist/hub/buttons-model.js.map +0 -1
- package/dist/hub/buttons.d.ts +0 -54
- package/dist/hub/buttons.js +0 -346
- package/dist/hub/buttons.js.map +0 -1
- package/dist/hub/catalog.d.ts +0 -74
- package/dist/hub/catalog.js +0 -195
- package/dist/hub/catalog.js.map +0 -1
- package/dist/hub/client.d.ts +0 -69
- package/dist/hub/client.js +0 -300
- package/dist/hub/client.js.map +0 -1
- package/dist/hub/compose/member.d.ts +0 -139
- package/dist/hub/compose/member.js +0 -450
- package/dist/hub/compose/member.js.map +0 -1
- package/dist/hub/compose/server.d.ts +0 -77
- package/dist/hub/compose/server.js +0 -349
- package/dist/hub/compose/server.js.map +0 -1
- package/dist/hub/compose/views.d.ts +0 -12
- package/dist/hub/compose/views.js +0 -4
- package/dist/hub/compose/views.js.map +0 -1
- package/dist/hub/db.d.ts +0 -56
- package/dist/hub/db.js +0 -188
- package/dist/hub/db.js.map +0 -1
- package/dist/hub/directory/config.d.ts +0 -39
- package/dist/hub/directory/config.js +0 -108
- package/dist/hub/directory/config.js.map +0 -1
- package/dist/hub/directory/directory.d.ts +0 -18
- package/dist/hub/directory/directory.js +0 -320
- package/dist/hub/directory/directory.js.map +0 -1
- package/dist/hub/directory/index.d.ts +0 -7
- package/dist/hub/directory/index.js +0 -4
- package/dist/hub/directory/index.js.map +0 -1
- package/dist/hub/directory/profiles.d.ts +0 -41
- package/dist/hub/directory/profiles.js +0 -90
- package/dist/hub/directory/profiles.js.map +0 -1
- package/dist/hub/directory/types.d.ts +0 -71
- package/dist/hub/directory/types.js +0 -14
- package/dist/hub/directory/types.js.map +0 -1
- package/dist/hub/execution/cli-provider.d.ts +0 -23
- package/dist/hub/execution/cli-provider.js +0 -341
- package/dist/hub/execution/cli-provider.js.map +0 -1
- package/dist/hub/execution/index.d.ts +0 -13
- package/dist/hub/execution/index.js +0 -8
- package/dist/hub/execution/index.js.map +0 -1
- package/dist/hub/execution/model-broker.d.ts +0 -24
- package/dist/hub/execution/model-broker.js +0 -208
- package/dist/hub/execution/model-broker.js.map +0 -1
- package/dist/hub/execution/provider-setup.d.ts +0 -11
- package/dist/hub/execution/provider-setup.js +0 -21
- package/dist/hub/execution/provider-setup.js.map +0 -1
- package/dist/hub/execution/sandbox-runner.d.ts +0 -1
- package/dist/hub/execution/sandbox-runner.js +0 -221
- package/dist/hub/execution/sandbox-runner.js.map +0 -1
- package/dist/hub/execution/service.d.ts +0 -136
- package/dist/hub/execution/service.js +0 -459
- package/dist/hub/execution/service.js.map +0 -1
- package/dist/hub/execution/store.d.ts +0 -61
- package/dist/hub/execution/store.js +0 -182
- package/dist/hub/execution/store.js.map +0 -1
- package/dist/hub/execution/views.d.ts +0 -20
- package/dist/hub/execution/views.js +0 -48
- package/dist/hub/execution/views.js.map +0 -1
- package/dist/hub/http/compose.d.ts +0 -20
- package/dist/hub/http/compose.js +0 -518
- package/dist/hub/http/compose.js.map +0 -1
- package/dist/hub/http/core.d.ts +0 -49
- package/dist/hub/http/core.js +0 -124
- package/dist/hub/http/core.js.map +0 -1
- package/dist/hub/http/deps.d.ts +0 -61
- package/dist/hub/http/deps.js +0 -2
- package/dist/hub/http/deps.js.map +0 -1
- package/dist/hub/http/schema.d.ts +0 -14
- package/dist/hub/http/schema.js +0 -80
- package/dist/hub/http/schema.js.map +0 -1
- package/dist/hub/identity.d.ts +0 -32
- package/dist/hub/identity.js +0 -80
- package/dist/hub/identity.js.map +0 -1
- package/dist/hub/init/browser-certificate.d.ts +0 -9
- package/dist/hub/init/browser-certificate.js +0 -78
- package/dist/hub/init/browser-certificate.js.map +0 -1
- package/dist/hub/init/browser-tls.d.ts +0 -18
- package/dist/hub/init/browser-tls.js +0 -62
- package/dist/hub/init/browser-tls.js.map +0 -1
- package/dist/hub/init/cli.d.ts +0 -3
- package/dist/hub/init/cli.js +0 -83
- package/dist/hub/init/cli.js.map +0 -1
- package/dist/hub/init/directory-certificate.d.ts +0 -24
- package/dist/hub/init/directory-certificate.js +0 -222
- package/dist/hub/init/directory-certificate.js.map +0 -1
- package/dist/hub/init/existing-fleet.d.ts +0 -6
- package/dist/hub/init/existing-fleet.js +0 -58
- package/dist/hub/init/existing-fleet.js.map +0 -1
- package/dist/hub/init/handoff.d.ts +0 -8
- package/dist/hub/init/handoff.js +0 -36
- package/dist/hub/init/handoff.js.map +0 -1
- package/dist/hub/init/identity.d.ts +0 -5
- package/dist/hub/init/identity.js +0 -24
- package/dist/hub/init/identity.js.map +0 -1
- package/dist/hub/init/initializer.d.ts +0 -24
- package/dist/hub/init/initializer.js +0 -385
- package/dist/hub/init/initializer.js.map +0 -1
- package/dist/hub/init/inventory.d.ts +0 -17
- package/dist/hub/init/inventory.js +0 -33
- package/dist/hub/init/inventory.js.map +0 -1
- package/dist/hub/init/layout.d.ts +0 -32
- package/dist/hub/init/layout.js +0 -53
- package/dist/hub/init/layout.js.map +0 -1
- package/dist/hub/init/network.d.ts +0 -18
- package/dist/hub/init/network.js +0 -104
- package/dist/hub/init/network.js.map +0 -1
- package/dist/hub/init/plan-digest.d.ts +0 -5
- package/dist/hub/init/plan-digest.js +0 -47
- package/dist/hub/init/plan-digest.js.map +0 -1
- package/dist/hub/init/prompt.d.ts +0 -26
- package/dist/hub/init/prompt.js +0 -110
- package/dist/hub/init/prompt.js.map +0 -1
- package/dist/hub/init/secret-file.d.ts +0 -1
- package/dist/hub/init/secret-file.js +0 -59
- package/dist/hub/init/secret-file.js.map +0 -1
- package/dist/hub/init/text.d.ts +0 -127
- package/dist/hub/init/text.js +0 -247
- package/dist/hub/init/text.js.map +0 -1
- package/dist/hub/init/types.d.ts +0 -114
- package/dist/hub/init/types.js +0 -9
- package/dist/hub/init/types.js.map +0 -1
- package/dist/hub/init/wizard.d.ts +0 -34
- package/dist/hub/init/wizard.js +0 -554
- package/dist/hub/init/wizard.js.map +0 -1
- package/dist/hub/initialization.d.ts +0 -23
- package/dist/hub/initialization.js +0 -28
- package/dist/hub/initialization.js.map +0 -1
- package/dist/hub/member/agent-mode.d.ts +0 -6
- package/dist/hub/member/agent-mode.js +0 -23
- package/dist/hub/member/agent-mode.js.map +0 -1
- package/dist/hub/member/attachments.d.ts +0 -29
- package/dist/hub/member/attachments.js +0 -107
- package/dist/hub/member/attachments.js.map +0 -1
- package/dist/hub/member/exposure-api.d.ts +0 -87
- package/dist/hub/member/exposure-api.js +0 -64
- package/dist/hub/member/exposure-api.js.map +0 -1
- package/dist/hub/member/exposures.d.ts +0 -123
- package/dist/hub/member/exposures.js +0 -282
- package/dist/hub/member/exposures.js.map +0 -1
- package/dist/hub/member/pairing-api.d.ts +0 -85
- package/dist/hub/member/pairing-api.js +0 -385
- package/dist/hub/member/pairing-api.js.map +0 -1
- package/dist/hub/member/quota.d.ts +0 -20
- package/dist/hub/member/quota.js +0 -98
- package/dist/hub/member/quota.js.map +0 -1
- package/dist/hub/member-journal.d.ts +0 -104
- package/dist/hub/member-journal.js +0 -336
- package/dist/hub/member-journal.js.map +0 -1
- package/dist/hub/member-reconciliation.d.ts +0 -14
- package/dist/hub/member-reconciliation.js +0 -97
- package/dist/hub/member-reconciliation.js.map +0 -1
- package/dist/hub/mount.d.ts +0 -39
- package/dist/hub/mount.js +0 -123
- package/dist/hub/mount.js.map +0 -1
- package/dist/hub/pairing-client.d.ts +0 -17
- package/dist/hub/pairing-client.js +0 -108
- package/dist/hub/pairing-client.js.map +0 -1
- package/dist/hub/pairing.d.ts +0 -65
- package/dist/hub/pairing.js +0 -211
- package/dist/hub/pairing.js.map +0 -1
- package/dist/hub/policy.d.ts +0 -63
- package/dist/hub/policy.js +0 -147
- package/dist/hub/policy.js.map +0 -1
- package/dist/hub/preview.d.ts +0 -32
- package/dist/hub/preview.js +0 -64
- package/dist/hub/preview.js.map +0 -1
- package/dist/hub/private-files.d.ts +0 -5
- package/dist/hub/private-files.js +0 -44
- package/dist/hub/private-files.js.map +0 -1
- package/dist/hub/profile.d.ts +0 -59
- package/dist/hub/profile.js +0 -73
- package/dist/hub/profile.js.map +0 -1
- package/dist/hub/protocol.d.ts +0 -779
- package/dist/hub/protocol.js +0 -93
- package/dist/hub/protocol.js.map +0 -1
- package/dist/hub/quota.d.ts +0 -24
- package/dist/hub/quota.js +0 -112
- package/dist/hub/quota.js.map +0 -1
- package/dist/hub/representative.d.ts +0 -141
- package/dist/hub/representative.js +0 -528
- package/dist/hub/representative.js.map +0 -1
- package/dist/hub/retention.d.ts +0 -17
- package/dist/hub/retention.js +0 -45
- package/dist/hub/retention.js.map +0 -1
- package/dist/hub/rooms.d.ts +0 -120
- package/dist/hub/rooms.js +0 -535
- package/dist/hub/rooms.js.map +0 -1
- package/dist/hub/runtime.d.ts +0 -106
- package/dist/hub/runtime.js +0 -298
- package/dist/hub/runtime.js.map +0 -1
- package/dist/hub/server.d.ts +0 -56
- package/dist/hub/server.js +0 -202
- package/dist/hub/server.js.map +0 -1
- package/dist/hub/service-start.d.ts +0 -17
- package/dist/hub/service-start.js +0 -109
- package/dist/hub/service-start.js.map +0 -1
- package/dist/hub/sessions.d.ts +0 -53
- package/dist/hub/sessions.js +0 -196
- package/dist/hub/sessions.js.map +0 -1
- package/dist/hub/socket.d.ts +0 -24
- package/dist/hub/socket.js +0 -79
- package/dist/hub/socket.js.map +0 -1
- package/dist/hub/store.d.ts +0 -77
- package/dist/hub/store.js +0 -88
- package/dist/hub/store.js.map +0 -1
- package/dist/hub/tls.d.ts +0 -31
- package/dist/hub/tls.js +0 -135
- package/dist/hub/tls.js.map +0 -1
- package/dist/hub/types.d.ts +0 -401
- package/dist/hub/types.js +0 -2
- package/dist/hub/types.js.map +0 -1
- package/dist/hub/validation.d.ts +0 -33
- package/dist/hub/validation.js +0 -136
- package/dist/hub/validation.js.map +0 -1
- package/dist/hub/version-floor.d.ts +0 -10
- package/dist/hub/version-floor.js +0 -45
- package/dist/hub/version-floor.js.map +0 -1
- package/dist/hub-browser-certificate-policy.d.ts +0 -31
- package/dist/hub-browser-certificate-policy.js +0 -25
- package/dist/hub-browser-certificate-policy.js.map +0 -1
- package/dist/hub-membership-settings.d.ts +0 -6
- package/dist/hub-membership-settings.js +0 -21
- package/dist/hub-membership-settings.js.map +0 -1
- package/dist/hub-mode.d.ts +0 -15
- package/dist/hub-mode.js +0 -17
- package/dist/hub-mode.js.map +0 -1
- package/dist/hub-pairing-summary.d.ts +0 -48
- package/dist/hub-pairing-summary.js +0 -36
- package/dist/hub-pairing-summary.js.map +0 -1
- package/dist/hub-report-target.d.ts +0 -32
- package/dist/hub-report-target.js +0 -33
- package/dist/hub-report-target.js.map +0 -1
- package/dist/hub-retention-policy.d.ts +0 -14
- package/dist/hub-retention-policy.js +0 -15
- package/dist/hub-retention-policy.js.map +0 -1
- package/dist/launchd-service-domain.d.ts +0 -5
- package/dist/launchd-service-domain.js +0 -21
- package/dist/launchd-service-domain.js.map +0 -1
- package/dist/local-pane-endpoint.d.ts +0 -46
- package/dist/local-pane-endpoint.js +0 -189
- package/dist/local-pane-endpoint.js.map +0 -1
- package/dist/local-pane-launcher.d.ts +0 -2
- package/dist/local-pane-launcher.js +0 -38
- package/dist/local-pane-launcher.js.map +0 -1
- package/dist/local-pane-stage.ps1 +0 -101
- package/dist/model-catalog-defaults.d.ts +0 -14
- package/dist/model-catalog-defaults.js +0 -20
- package/dist/model-catalog-defaults.js.map +0 -1
- package/dist/native-agent-admission.d.ts +0 -7
- package/dist/native-agent-admission.js +0 -26
- package/dist/native-agent-admission.js.map +0 -1
- package/dist/native-daemon-client.d.ts +0 -13
- package/dist/native-daemon-client.js +0 -28
- package/dist/native-daemon-client.js.map +0 -1
- package/dist/native-instance-api.d.ts +0 -13
- package/dist/native-instance-api.js +0 -217
- package/dist/native-instance-api.js.map +0 -1
- package/dist/native-instance-input.d.ts +0 -87
- package/dist/native-instance-input.js +0 -59
- package/dist/native-instance-input.js.map +0 -1
- package/dist/native-instance-registry.d.ts +0 -38
- package/dist/native-instance-registry.js +0 -129
- package/dist/native-instance-registry.js.map +0 -1
- package/dist/native-mcp.d.ts +0 -43
- package/dist/native-mcp.js +0 -291
- package/dist/native-mcp.js.map +0 -1
- package/dist/native-model-catalog.d.ts +0 -5
- package/dist/native-model-catalog.js +0 -76
- package/dist/native-model-catalog.js.map +0 -1
- package/dist/native-pane-crash-budget.d.ts +0 -20
- package/dist/native-pane-crash-budget.js +0 -60
- package/dist/native-pane-crash-budget.js.map +0 -1
- package/dist/native-pane-create.d.ts +0 -26
- package/dist/native-pane-create.js +0 -53
- package/dist/native-pane-create.js.map +0 -1
- package/dist/native-pane-lifecycle.d.ts +0 -73
- package/dist/native-pane-lifecycle.js +0 -239
- package/dist/native-pane-lifecycle.js.map +0 -1
- package/dist/native-pane-manager.d.ts +0 -59
- package/dist/native-pane-manager.js +0 -592
- package/dist/native-pane-manager.js.map +0 -1
- package/dist/native-pane-output-log.d.ts +0 -15
- package/dist/native-pane-output-log.js +0 -108
- package/dist/native-pane-output-log.js.map +0 -1
- package/dist/native-pane-reconciliation.d.ts +0 -4
- package/dist/native-pane-reconciliation.js +0 -40
- package/dist/native-pane-reconciliation.js.map +0 -1
- package/dist/native-pane-recovery.d.ts +0 -12
- package/dist/native-pane-recovery.js +0 -10
- package/dist/native-pane-recovery.js.map +0 -1
- package/dist/native-pane-tools.d.ts +0 -2
- package/dist/native-pane-tools.js +0 -14
- package/dist/native-pane-tools.js.map +0 -1
- package/dist/office-talk.d.ts +0 -26
- package/dist/office-talk.js +0 -50
- package/dist/office-talk.js.map +0 -1
- package/dist/pane-port.d.ts +0 -118
- package/dist/pane-port.js +0 -2
- package/dist/pane-port.js.map +0 -1
- package/dist/runtime-api.d.ts +0 -10
- package/dist/runtime-api.js +0 -189
- package/dist/runtime-api.js.map +0 -1
- package/dist/runtime-assets/@xterm/addon-serialize/LICENSE +0 -21
- package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.js +0 -2
- package/dist/runtime-assets/@xterm/addon-serialize/lib/addon-serialize.mjs +0 -19
- package/dist/runtime-assets/@xterm/addon-serialize/package.json +0 -29
- package/dist/runtime-assets/@xterm/headless/LICENSE +0 -21
- package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.js +0 -2
- package/dist/runtime-assets/@xterm/headless/lib-headless/xterm-headless.mjs +0 -46
- package/dist/runtime-assets/@xterm/headless/package.json +0 -29
- package/dist/runtime-assets/node-pty/CONPTY-LICENSE +0 -21
- package/dist/runtime-assets/node-pty/CONPTY-NOTICE.md +0 -503
- package/dist/runtime-assets/node-pty/LICENSE +0 -69
- package/dist/runtime-assets/node-pty/lib/conpty_console_list_agent.js +0 -16
- package/dist/runtime-assets/node-pty/lib/eventEmitter2.js +0 -47
- package/dist/runtime-assets/node-pty/lib/index.js +0 -52
- package/dist/runtime-assets/node-pty/lib/interfaces.js +0 -7
- package/dist/runtime-assets/node-pty/lib/shared/conout.js +0 -11
- package/dist/runtime-assets/node-pty/lib/terminal.js +0 -190
- package/dist/runtime-assets/node-pty/lib/types.js +0 -7
- package/dist/runtime-assets/node-pty/lib/unixTerminal.js +0 -346
- package/dist/runtime-assets/node-pty/lib/utils.js +0 -39
- package/dist/runtime-assets/node-pty/lib/windowsConoutConnection.js +0 -125
- package/dist/runtime-assets/node-pty/lib/windowsPtyAgent.js +0 -320
- package/dist/runtime-assets/node-pty/lib/windowsTerminal.js +0 -199
- package/dist/runtime-assets/node-pty/lib/worker/conoutSocketWorker.js +0 -22
- package/dist/runtime-assets/node-pty/package.json +0 -64
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty.node +0 -0
- package/dist/runtime-assets/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/dist/runtime-build-info.d.ts +0 -9
- package/dist/runtime-build-info.js +0 -59
- package/dist/runtime-build-info.js.map +0 -1
- package/dist/runtime-bundle.d.ts +0 -22
- package/dist/runtime-bundle.js +0 -158
- package/dist/runtime-bundle.js.map +0 -1
- package/dist/runtime-cli.d.ts +0 -14
- package/dist/runtime-cli.js +0 -271
- package/dist/runtime-cli.js.map +0 -1
- package/dist/runtime-client-store.d.ts +0 -75
- package/dist/runtime-client-store.js +0 -372
- package/dist/runtime-client-store.js.map +0 -1
- package/dist/runtime-client.d.ts +0 -174
- package/dist/runtime-client.js +0 -1010
- package/dist/runtime-client.js.map +0 -1
- package/dist/runtime-connection.d.ts +0 -22
- package/dist/runtime-connection.js +0 -93
- package/dist/runtime-connection.js.map +0 -1
- package/dist/runtime-coordinator.d.ts +0 -98
- package/dist/runtime-coordinator.js +0 -1089
- package/dist/runtime-coordinator.js.map +0 -1
- package/dist/runtime-credential-profiles.d.ts +0 -78
- package/dist/runtime-credential-profiles.js +0 -280
- package/dist/runtime-credential-profiles.js.map +0 -1
- package/dist/runtime-general-protocol.d.ts +0 -22
- package/dist/runtime-general-protocol.js +0 -57
- package/dist/runtime-general-protocol.js.map +0 -1
- package/dist/runtime-general-workspace.d.ts +0 -17
- package/dist/runtime-general-workspace.js +0 -213
- package/dist/runtime-general-workspace.js.map +0 -1
- package/dist/runtime-install.d.ts +0 -50
- package/dist/runtime-install.js +0 -186
- package/dist/runtime-install.js.map +0 -1
- package/dist/runtime-pane-assets.d.ts +0 -17
- package/dist/runtime-pane-assets.js +0 -23
- package/dist/runtime-pane-assets.js.map +0 -1
- package/dist/runtime-pane-boot.d.ts +0 -9
- package/dist/runtime-pane-boot.js +0 -47
- package/dist/runtime-pane-boot.js.map +0 -1
- package/dist/runtime-pane-codex-index.d.ts +0 -10
- package/dist/runtime-pane-codex-index.js +0 -151
- package/dist/runtime-pane-codex-index.js.map +0 -1
- package/dist/runtime-pane-config.d.ts +0 -16
- package/dist/runtime-pane-config.js +0 -54
- package/dist/runtime-pane-config.js.map +0 -1
- package/dist/runtime-pane-host.d.ts +0 -63
- package/dist/runtime-pane-host.js +0 -467
- package/dist/runtime-pane-host.js.map +0 -1
- package/dist/runtime-pane-job-owner.d.ts +0 -1
- package/dist/runtime-pane-job-owner.js +0 -29
- package/dist/runtime-pane-job-owner.js.map +0 -1
- package/dist/runtime-pane-job.ps1 +0 -116
- package/dist/runtime-pane-link.d.ts +0 -47
- package/dist/runtime-pane-link.js +0 -337
- package/dist/runtime-pane-link.js.map +0 -1
- package/dist/runtime-pane-mcp-protocol.d.ts +0 -32
- package/dist/runtime-pane-mcp-protocol.js +0 -39
- package/dist/runtime-pane-mcp-protocol.js.map +0 -1
- package/dist/runtime-pane-mcp-relay.d.ts +0 -18
- package/dist/runtime-pane-mcp-relay.js +0 -80
- package/dist/runtime-pane-mcp-relay.js.map +0 -1
- package/dist/runtime-pane-mcp.d.ts +0 -55
- package/dist/runtime-pane-mcp.js +0 -153
- package/dist/runtime-pane-mcp.js.map +0 -1
- package/dist/runtime-pane-native.d.ts +0 -75
- package/dist/runtime-pane-native.js +0 -114
- package/dist/runtime-pane-native.js.map +0 -1
- package/dist/runtime-pane-output.d.ts +0 -19
- package/dist/runtime-pane-output.js +0 -53
- package/dist/runtime-pane-output.js.map +0 -1
- package/dist/runtime-pane-port.d.ts +0 -144
- package/dist/runtime-pane-port.js +0 -574
- package/dist/runtime-pane-port.js.map +0 -1
- package/dist/runtime-pane-private.d.ts +0 -14
- package/dist/runtime-pane-private.js +0 -51
- package/dist/runtime-pane-private.js.map +0 -1
- package/dist/runtime-pane-private.ps1 +0 -14
- package/dist/runtime-pane-process.d.ts +0 -4
- package/dist/runtime-pane-process.js +0 -117
- package/dist/runtime-pane-process.js.map +0 -1
- package/dist/runtime-pane-protocol.d.ts +0 -182
- package/dist/runtime-pane-protocol.js +0 -217
- package/dist/runtime-pane-protocol.js.map +0 -1
- package/dist/runtime-pane-quota-history.d.ts +0 -6
- package/dist/runtime-pane-quota-history.js +0 -44
- package/dist/runtime-pane-quota-history.js.map +0 -1
- package/dist/runtime-pane-screen.d.ts +0 -19
- package/dist/runtime-pane-screen.js +0 -76
- package/dist/runtime-pane-screen.js.map +0 -1
- package/dist/runtime-pane-service.d.ts +0 -16
- package/dist/runtime-pane-service.js +0 -256
- package/dist/runtime-pane-service.js.map +0 -1
- package/dist/runtime-pane-stdio-protocol.d.ts +0 -54
- package/dist/runtime-pane-stdio-protocol.js +0 -94
- package/dist/runtime-pane-stdio-protocol.js.map +0 -1
- package/dist/runtime-pane-stdio.d.ts +0 -3
- package/dist/runtime-pane-stdio.js +0 -123
- package/dist/runtime-pane-stdio.js.map +0 -1
- package/dist/runtime-pane-store.d.ts +0 -33
- package/dist/runtime-pane-store.js +0 -164
- package/dist/runtime-pane-store.js.map +0 -1
- package/dist/runtime-pane-transcript-protocol.d.ts +0 -43
- package/dist/runtime-pane-transcript-protocol.js +0 -58
- package/dist/runtime-pane-transcript-protocol.js.map +0 -1
- package/dist/runtime-pane-transcript.d.ts +0 -50
- package/dist/runtime-pane-transcript.js +0 -666
- package/dist/runtime-pane-transcript.js.map +0 -1
- package/dist/runtime-pane-worker.d.ts +0 -1
- package/dist/runtime-pane-worker.js +0 -167
- package/dist/runtime-pane-worker.js.map +0 -1
- package/dist/runtime-protocol.d.ts +0 -177
- package/dist/runtime-protocol.js +0 -49
- package/dist/runtime-protocol.js.map +0 -1
- package/dist/runtime-switches.d.ts +0 -79
- package/dist/runtime-switches.js +0 -90
- package/dist/runtime-switches.js.map +0 -1
- package/dist/runtime-transcript-delta-reader.d.ts +0 -23
- package/dist/runtime-transcript-delta-reader.js +0 -74
- package/dist/runtime-transcript-delta-reader.js.map +0 -1
- package/dist/runtime-transcript-source.d.ts +0 -36
- package/dist/runtime-transcript-source.js +0 -189
- package/dist/runtime-transcript-source.js.map +0 -1
- package/dist/runtime-update-activity.d.ts +0 -21
- package/dist/runtime-update-activity.js +0 -51
- package/dist/runtime-update-activity.js.map +0 -1
- package/dist/runtime-update-artifact.d.ts +0 -31
- package/dist/runtime-update-artifact.js +0 -252
- package/dist/runtime-update-artifact.js.map +0 -1
- package/dist/runtime-update-install.d.ts +0 -31
- package/dist/runtime-update-install.js +0 -205
- package/dist/runtime-update-install.js.map +0 -1
- package/dist/runtime-update-journal.d.ts +0 -44
- package/dist/runtime-update-journal.js +0 -121
- package/dist/runtime-update-journal.js.map +0 -1
- package/dist/runtime-update-lock.d.ts +0 -48
- package/dist/runtime-update-lock.js +0 -217
- package/dist/runtime-update-lock.js.map +0 -1
- package/dist/runtime-update-owners.d.ts +0 -29
- package/dist/runtime-update-owners.js +0 -240
- package/dist/runtime-update-owners.js.map +0 -1
- package/dist/runtime-update-protocol.d.ts +0 -15
- package/dist/runtime-update-protocol.js +0 -13
- package/dist/runtime-update-protocol.js.map +0 -1
- package/dist/runtime-windows-bridge.d.ts +0 -42
- package/dist/runtime-windows-bridge.js +0 -167
- package/dist/runtime-windows-bridge.js.map +0 -1
- package/dist/service-drain.d.ts +0 -19
- package/dist/service-drain.js +0 -64
- package/dist/service-drain.js.map +0 -1
- package/dist/settings-route-lifetime.d.ts +0 -14
- package/dist/settings-route-lifetime.js +0 -48
- package/dist/settings-route-lifetime.js.map +0 -1
- package/dist/tmux-binary.d.ts +0 -59
- package/dist/tmux-binary.js +0 -200
- package/dist/tmux-binary.js.map +0 -1
- package/dist/tmux-pane-host.d.ts +0 -26
- package/dist/tmux-pane-host.js +0 -25
- package/dist/tmux-pane-host.js.map +0 -1
- package/dist/transcript-needles.d.ts +0 -42
- package/dist/transcript-needles.js +0 -166
- package/dist/transcript-needles.js.map +0 -1
- package/dist/transcript-records.d.ts +0 -21
- package/dist/transcript-records.js +0 -141
- package/dist/transcript-records.js.map +0 -1
- package/dist/ui/account-identity.js +0 -27
- package/dist/ui/accounts-view.js +0 -214
- package/dist/ui/agent-proposals.js +0 -90
- package/dist/ui/agent-runtime-settings.js +0 -68
- package/dist/ui/agent-runtime.js +0 -124
- package/dist/ui/cli-picker.js +0 -42
- package/dist/ui/credential-profile-select.js +0 -54
- package/dist/ui/fleet-office-dialogue.d.ts +0 -30
- package/dist/ui/fleet-office-dialogue.js +0 -382
- package/dist/ui/fleet-task-menu.js +0 -188
- package/dist/ui/fleet-task-stats.js +0 -124
- package/dist/ui/fleet-task-view.js +0 -340
- package/dist/ui/general-location.js +0 -71
- package/dist/ui/hub-agent-copy.js +0 -23
- package/dist/ui/hub-button-actions.js +0 -65
- package/dist/ui/hub-chat-store.js +0 -158
- package/dist/ui/hub-chat-strings.js +0 -77
- package/dist/ui/hub-client.js +0 -329
- package/dist/ui/hub-owner-strings.js +0 -51
- package/dist/ui/hub-provider-guidance.js +0 -31
- package/dist/ui/hub-quota.js +0 -85
- package/dist/ui/hub-strings.js +0 -162
- package/dist/ui/hub-switcher.js +0 -27
- package/dist/ui/native-instance-settings.js +0 -44
- package/dist/ui/native-pane-recovery.js +0 -45
- package/dist/ui/panel-hub.js +0 -619
- package/dist/ui/panel-runtimes.js +0 -425
- package/dist/ui/panel-windows-agent.js +0 -86
- package/dist/ui/panel-windows-cli.js +0 -189
- package/dist/ui/provider-marks.js +0 -83
- package/dist/ui/runtime-catalog.js +0 -55
- package/dist/ui/runtime-commands.d.ts +0 -4
- package/dist/ui/runtime-commands.js +0 -59
- package/dist/ui/settings-access-strings.js +0 -42
- package/dist/ui/settings-agent-filters.js +0 -94
- package/dist/ui/settings-build-version.js +0 -35
- package/dist/ui/settings-devices.js +0 -253
- package/dist/ui/settings-hub-browser-certificate.js +0 -74
- package/dist/ui/settings-hub-membership.js +0 -72
- package/dist/ui/settings-hub-retention.js +0 -52
- package/dist/ui/settings-hub.js +0 -196
- package/dist/ui/settings-layout.js +0 -242
- package/dist/ui/settings-outside.js +0 -242
- package/dist/ui/settings-shared-strings.js +0 -143
- package/dist/ui/settings-shared.js +0 -345
- package/dist/ui/settings-shortcuts.js +0 -65
- package/dist/ui/shared/accounts.css +0 -15
- package/dist/ui/shared/chat-composer.js +0 -68
- package/dist/ui/shared/chat-md-strings.js +0 -9
- package/dist/ui/shared/chat-render.js +0 -682
- package/dist/ui/shared/chat-strings.js +0 -333
- package/dist/ui/shared/chat-thread.js +0 -969
- package/dist/ui/shared/chat-time.js +0 -80
- package/dist/ui/shared/html-attachment.js +0 -42
- package/dist/ui/shared/hub-chat.css +0 -85
- package/dist/ui/shared/hub-owner.css +0 -33
- package/dist/ui/shared/hub-quota.css +0 -8
- package/dist/ui/shared/hub.css +0 -71
- package/dist/ui/shared/machine-name.js +0 -13
- package/dist/ui/shared/page-head.js +0 -8
- package/dist/ui/shared/preview.js +0 -476
- package/dist/ui/shared/qrcode.module.js +0 -2237
- package/dist/ui/shared/runtime-install.css +0 -26
- package/dist/ui/shared/settings-width.js +0 -31
- package/dist/ui/shared/side-rail.js +0 -15
- package/dist/ui/shared/task-board.css +0 -95
- package/dist/ui/shared/vendor/qrcode-generator.LICENSE +0 -27
- package/dist/ui/shared/workspace.css +0 -20
- package/dist/ui/windows-agents-nav.js +0 -2
- package/dist/ui/windows-cli-catalog.js +0 -108
- package/dist/ui/workspace-panel.js +0 -189
- package/dist/ui/workspace-strings.js +0 -35
- package/dist/web-device-login.d.ts +0 -153
- package/dist/web-device-login.js +0 -278
- package/dist/web-device-login.js.map +0 -1
- package/dist/web-remote-access.d.ts +0 -152
- package/dist/web-remote-access.js +0 -368
- package/dist/web-remote-access.js.map +0 -1
- package/dist/windows-agents.d.ts +0 -127
- package/dist/windows-agents.js +0 -491
- package/dist/windows-agents.js.map +0 -1
- package/dist/windows-cli-api.d.ts +0 -34
- package/dist/windows-cli-api.js +0 -185
- package/dist/windows-cli-api.js.map +0 -1
- package/dist/windows-cli-providers.d.ts +0 -106
- package/dist/windows-cli-providers.js +0 -424
- package/dist/windows-cli-providers.js.map +0 -1
- package/dist/windows-cli-worker.d.ts +0 -83
- package/dist/windows-cli-worker.js +0 -570
- package/dist/windows-cli-worker.js.map +0 -1
- package/dist/windows-cli.d.ts +0 -126
- package/dist/windows-cli.js +0 -416
- package/dist/windows-cli.js.map +0 -1
- package/dist/windows-native-mcp.d.ts +0 -19
- package/dist/windows-native-mcp.js +0 -143
- package/dist/windows-native-mcp.js.map +0 -1
- package/dist/windows-pane-mcp.d.ts +0 -26
- package/dist/windows-pane-mcp.js +0 -187
- package/dist/windows-pane-mcp.js.map +0 -1
- package/launcher/launchd-session-type.cjs +0 -14
- package/launcher/tmux-bundle.cjs +0 -247
- package/templates/runtime-assets/conpty-LICENSE +0 -21
- package/templates/runtime-assets/conpty-NOTICE.md +0 -503
- package/templates/runtime-assets/local-pane-stage.ps1 +0 -101
- package/templates/runtime-assets/runtime-pane-job.ps1 +0 -116
- package/templates/runtime-assets/runtime-pane-private.ps1 +0 -14
- package/templates/runtime-assets/xterm-LICENSE +0 -21
- package/templates/runtime-install/install.ps1 +0 -270
|
@@ -1,153 +0,0 @@
|
|
|
1
|
-
export declare const DEVICE_LOGIN_TTL_MS: number;
|
|
2
|
-
export declare const MAX_PENDING_DEVICE_LOGINS = 8;
|
|
3
|
-
export declare const MAX_PENDING_PER_PEER = 2;
|
|
4
|
-
/** Requests one address, and the whole fleet, may ask for per DEVICE_LOGIN_CREATE_WINDOW_MS. */
|
|
5
|
-
export declare const DEVICE_LOGIN_CREATE_WINDOW_MS: number;
|
|
6
|
-
export declare const DEVICE_LOGIN_CREATES_PER_PEER = 6;
|
|
7
|
-
export declare const DEVICE_LOGIN_CREATES_GLOBAL = 20;
|
|
8
|
-
/**
|
|
9
|
-
* The approving side's breaker: this many wrong codes in the window pause it. Shorter than a request's life on purpose
|
|
10
|
-
* (a pause that outlasted it would end every request waiting): ten tries per two minutes is still hopeless against a
|
|
11
|
-
* 40-bit code among at most eight, and the person approving is already an owner-verified session.
|
|
12
|
-
*/
|
|
13
|
-
export declare const DEVICE_APPROVE_WINDOW_MS: number;
|
|
14
|
-
export declare const DEVICE_APPROVE_THRESHOLD = 10;
|
|
15
|
-
export declare const DEVICE_APPROVE_PAUSE_MS: number;
|
|
16
|
-
/** Where a request came from, for the approver: this computer, or somewhere on the network (LAN, tailnet). */
|
|
17
|
-
export type DeviceLoginPeer = "host" | "network";
|
|
18
|
-
export type DeviceLoginState = "pending" | "approved" | "denied";
|
|
19
|
-
/** What the approving device may see of a request. */
|
|
20
|
-
export interface DeviceLoginView {
|
|
21
|
-
/** As typed: `ABCD-EFGH`. */
|
|
22
|
-
readonly code: string;
|
|
23
|
-
readonly label: string;
|
|
24
|
-
readonly peer: DeviceLoginPeer;
|
|
25
|
-
readonly address: string;
|
|
26
|
-
readonly expiresAt: number;
|
|
27
|
-
readonly state: DeviceLoginState;
|
|
28
|
-
}
|
|
29
|
-
export type DeviceLoginCreate = {
|
|
30
|
-
readonly kind: "ok";
|
|
31
|
-
readonly requestId: string;
|
|
32
|
-
readonly code: string;
|
|
33
|
-
readonly expiresAt: number;
|
|
34
|
-
}
|
|
35
|
-
/** Too many asked for from this address, or the fleet over. */
|
|
36
|
-
| {
|
|
37
|
-
readonly kind: "limited";
|
|
38
|
-
readonly retryAfterMs: number;
|
|
39
|
-
}
|
|
40
|
-
/** The room is full (or this address already has its share waiting). */
|
|
41
|
-
| {
|
|
42
|
-
readonly kind: "full";
|
|
43
|
-
};
|
|
44
|
-
export type DeviceLoginPoll = {
|
|
45
|
-
readonly kind: "pending";
|
|
46
|
-
readonly expiresAt: number;
|
|
47
|
-
}
|
|
48
|
-
/** Approved, and now spent: the caller makes the session. Never returned twice for one request. */
|
|
49
|
-
| {
|
|
50
|
-
readonly kind: "claimed";
|
|
51
|
-
readonly label: string;
|
|
52
|
-
readonly approvedBy: string;
|
|
53
|
-
} | {
|
|
54
|
-
readonly kind: "denied";
|
|
55
|
-
}
|
|
56
|
-
/** Expired, spent, withdrawn, made under another token, or never made: deliberately indistinguishable. */
|
|
57
|
-
| {
|
|
58
|
-
readonly kind: "expired";
|
|
59
|
-
};
|
|
60
|
-
export type DeviceLoginMatch = {
|
|
61
|
-
readonly kind: "ok";
|
|
62
|
-
readonly view: DeviceLoginView;
|
|
63
|
-
}
|
|
64
|
-
/** Wrong, expired, or none waiting: deliberately indistinguishable. */
|
|
65
|
-
| {
|
|
66
|
-
readonly kind: "invalid";
|
|
67
|
-
} | {
|
|
68
|
-
readonly kind: "paused";
|
|
69
|
-
readonly retryAfterMs: number;
|
|
70
|
-
};
|
|
71
|
-
export type DeviceLoginDecision = {
|
|
72
|
-
readonly kind: "ok";
|
|
73
|
-
readonly view: DeviceLoginView;
|
|
74
|
-
} | {
|
|
75
|
-
readonly kind: "invalid";
|
|
76
|
-
} | {
|
|
77
|
-
readonly kind: "paused";
|
|
78
|
-
readonly retryAfterMs: number;
|
|
79
|
-
}
|
|
80
|
-
/** The code was already approved or denied (and not yet taken up): what it is now. */
|
|
81
|
-
| {
|
|
82
|
-
readonly kind: "decided";
|
|
83
|
-
readonly state: DeviceLoginState;
|
|
84
|
-
};
|
|
85
|
-
export interface DeviceLoginRequestsOptions {
|
|
86
|
-
readonly now?: () => number;
|
|
87
|
-
/** For tests that need a known code. */
|
|
88
|
-
readonly generate?: () => string;
|
|
89
|
-
readonly onEvent?: (event: "created" | "approved" | "denied" | "claimed" | "breaker-open") => void;
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* The key the per-address limits count by. An IPv4 address (also one an IPv6 socket reports as `::ffff:a.b.c.d`) is its
|
|
93
|
-
* own key. An IPv6 address counts by its /64: a single network hands one machine a whole /64, so keying by the full
|
|
94
|
-
* address would give one host as many allowances as it has addresses. Whatever is not an IP address (`unknown`) is its
|
|
95
|
-
* own key. Never read from a header: only the socket's peer.
|
|
96
|
-
*/
|
|
97
|
-
export declare function peerKeyOf(address: string): string;
|
|
98
|
-
export declare class DeviceLoginRequests {
|
|
99
|
-
private readonly entries;
|
|
100
|
-
private readonly createdByPeer;
|
|
101
|
-
private created;
|
|
102
|
-
private approveFailures;
|
|
103
|
-
private approvePausedUntil;
|
|
104
|
-
private readonly now;
|
|
105
|
-
private readonly generate;
|
|
106
|
-
private readonly onEvent;
|
|
107
|
-
constructor(opts?: DeviceLoginRequestsOptions);
|
|
108
|
-
/** How many requests are waiting (or approved and not yet taken up) — for tests and status lines. */
|
|
109
|
-
get size(): number;
|
|
110
|
-
/** How many addresses the creation rate limit is holding stamps for (for tests: it must not grow without bound). */
|
|
111
|
-
get rateTableSize(): number;
|
|
112
|
-
/**
|
|
113
|
-
* A new request. `replaces` is the request id the same browser held (its cookie): it is withdrawn first, so "get a
|
|
114
|
-
* new code" never counts against the room — but it does count against the rate. `label`, `peer` and `address` are
|
|
115
|
-
* the server's own reading of the request (never body input); they are what the approver is shown.
|
|
116
|
-
*/
|
|
117
|
-
create(input: {
|
|
118
|
-
epoch: string;
|
|
119
|
-
peerKey: string;
|
|
120
|
-
label: string;
|
|
121
|
-
peer: DeviceLoginPeer;
|
|
122
|
-
address: string;
|
|
123
|
-
replaces?: string;
|
|
124
|
-
}): DeviceLoginCreate;
|
|
125
|
-
/**
|
|
126
|
-
* The new browser asks where its request stands. An approved one is spent by this very call (`claimed`): the caller
|
|
127
|
-
* then makes the session, and a second poll with the same id finds nothing. A denied one is told once and forgotten.
|
|
128
|
-
* An unknown, malformed, expired or other-token id is `expired` — the answer never says which.
|
|
129
|
-
*/
|
|
130
|
-
poll(requestId: string | undefined, currentEpoch: string): DeviceLoginPoll;
|
|
131
|
-
/** The browser leaves the page (or asks again): its request is withdrawn. Whatever the id, nothing is said. */
|
|
132
|
-
cancel(requestId: string | undefined): void;
|
|
133
|
-
/** The approving side types a code: the request it names, for the confirm screen. A wrong code counts. */
|
|
134
|
-
lookup(input: string, currentEpoch: string): DeviceLoginMatch;
|
|
135
|
-
/**
|
|
136
|
-
* Approve or deny the request this code names. Only a pending one changes: one already decided says what it is now,
|
|
137
|
-
* so a second tap approves nothing twice. `by` is the approving session's handle (logged, never shown to the device).
|
|
138
|
-
*/
|
|
139
|
-
decide(input: string, decision: "approved" | "denied", by: string, currentEpoch: string): DeviceLoginDecision;
|
|
140
|
-
/** `/dashboard revoke`: every request is withdrawn. */
|
|
141
|
-
revokeAll(): void;
|
|
142
|
-
/** How long the approving side stays paused by its breaker (0 when it is closed). */
|
|
143
|
-
approvePausedForMs(): number;
|
|
144
|
-
private codeTaken;
|
|
145
|
-
private match;
|
|
146
|
-
private prune;
|
|
147
|
-
}
|
|
148
|
-
export declare const DEVICE_LOGIN_COOKIE = "agend_device_login";
|
|
149
|
-
export declare const DEVICE_LOGIN_PATH = "/auth/device-login";
|
|
150
|
-
export declare function buildDeviceLoginCookie(requestId: string, secure: boolean, webToken: string, maxAgeSeconds: number): string;
|
|
151
|
-
export declare function clearDeviceLoginCookie(secure: boolean, webToken: string): string;
|
|
152
|
-
/** The request id this browser holds, if the cookie header carries a well-formed one. */
|
|
153
|
-
export declare function readDeviceLoginCookie(cookieHeader: string | undefined, webToken: string): string | undefined;
|
package/dist/web-device-login.js
DELETED
|
@@ -1,278 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Device-code sign-in (Refs #3061, P2a): a new browser shows an 8-character code; a device that is already signed in AND
|
|
3
|
-
* is this fleet's verified owner types that code under Settings → Access & security → Add device and approves it; the
|
|
4
|
-
* new browser then signs itself in.
|
|
5
|
-
*
|
|
6
|
-
* What is kept here is only the requests — never a credential. Approval moves a request from `pending` to `approved`
|
|
7
|
-
* and nothing else: no cookie, session id or token passes from the approving device to the new one. The new browser
|
|
8
|
-
* mints its own session in its own request (auth-api `POST /auth/device-login/poll`), by presenting the request id it
|
|
9
|
-
* was given when it asked. That id is 256 random bits, is never shown to the approver, and travels only in an HttpOnly
|
|
10
|
-
* cookie scoped to /auth/device-login.
|
|
11
|
-
*
|
|
12
|
-
* The rules, each of them a property worth testing on its own:
|
|
13
|
-
* - **Short-lived and single-use.** A request lives five minutes from when it was asked for — approving does not extend
|
|
14
|
-
* it — and the poll that claims an approved request spends it. A second claim, a second approval of the same code and
|
|
15
|
-
* a code that has expired are all refused.
|
|
16
|
-
* - **Rotating the web token withdraws every request** (each carries the token epoch it was made under), as it does an
|
|
17
|
-
* unused login code. So does `/dashboard revoke` (`revokeAll`).
|
|
18
|
-
* - **Bounded.** At most MAX_PENDING_DEVICE_LOGINS requests at once, MAX_PENDING_PER_PEER per address, and a limit on
|
|
19
|
-
* how many one address — and the fleet — may ask for in a window, so a stranger on the network cannot fill the room
|
|
20
|
-
* or run the fleet out of memory. A full room refuses new requests; it never evicts a waiting person's.
|
|
21
|
-
* - **A breaker on the approving side.** Typing a code that matches no request is a wrong try; enough of them pause every
|
|
22
|
-
* lookup and decision, correct codes included. With no request waiting there is nothing to guess: it counts against
|
|
23
|
-
* nothing (as for login codes). The approving side is already an owner-verified session, so this guards against a
|
|
24
|
-
* mistake, a stolen owner session guessing at someone else's code, and a phishing line "read me the code".
|
|
25
|
-
* - **The approver learns only what it needs to decide:** the device's label, whether it asked from this computer or the
|
|
26
|
-
* network, its address, and the time left. Never the request id.
|
|
27
|
-
*
|
|
28
|
-
* Deliberately knows nothing of HTTP, sessions or who the approver is: the caller has already decided that.
|
|
29
|
-
* In memory only — a restart drops every request, as it does an unused login code.
|
|
30
|
-
*/
|
|
31
|
-
import { createHash, randomBytes } from "node:crypto";
|
|
32
|
-
import { isIPv4, isIPv6 } from "node:net";
|
|
33
|
-
import { constantTimeMatches, formatOneTimeCode, generateOneTimeCode, normalizeOneTimeCode } from "./auth/one-time-code.js";
|
|
34
|
-
import { fleetCookieName } from "./web-cookie-names.js";
|
|
35
|
-
export const DEVICE_LOGIN_TTL_MS = 5 * 60 * 1000;
|
|
36
|
-
export const MAX_PENDING_DEVICE_LOGINS = 8;
|
|
37
|
-
export const MAX_PENDING_PER_PEER = 2;
|
|
38
|
-
/** Requests one address, and the whole fleet, may ask for per DEVICE_LOGIN_CREATE_WINDOW_MS. */
|
|
39
|
-
export const DEVICE_LOGIN_CREATE_WINDOW_MS = 10 * 60 * 1000;
|
|
40
|
-
export const DEVICE_LOGIN_CREATES_PER_PEER = 6;
|
|
41
|
-
export const DEVICE_LOGIN_CREATES_GLOBAL = 20;
|
|
42
|
-
/**
|
|
43
|
-
* The approving side's breaker: this many wrong codes in the window pause it. Shorter than a request's life on purpose
|
|
44
|
-
* (a pause that outlasted it would end every request waiting): ten tries per two minutes is still hopeless against a
|
|
45
|
-
* 40-bit code among at most eight, and the person approving is already an owner-verified session.
|
|
46
|
-
*/
|
|
47
|
-
export const DEVICE_APPROVE_WINDOW_MS = 15 * 60 * 1000;
|
|
48
|
-
export const DEVICE_APPROVE_THRESHOLD = 10;
|
|
49
|
-
export const DEVICE_APPROVE_PAUSE_MS = 2 * 60 * 1000;
|
|
50
|
-
/** Compared against when nothing waits, so "no request" costs what "wrong code" costs. */
|
|
51
|
-
const NO_REQUEST_PLACEHOLDER = "AAAAAAAA";
|
|
52
|
-
/**
|
|
53
|
-
* The key the per-address limits count by. An IPv4 address (also one an IPv6 socket reports as `::ffff:a.b.c.d`) is its
|
|
54
|
-
* own key. An IPv6 address counts by its /64: a single network hands one machine a whole /64, so keying by the full
|
|
55
|
-
* address would give one host as many allowances as it has addresses. Whatever is not an IP address (`unknown`) is its
|
|
56
|
-
* own key. Never read from a header: only the socket's peer.
|
|
57
|
-
*/
|
|
58
|
-
export function peerKeyOf(address) {
|
|
59
|
-
const a = address.replace(/%.*$/, "").toLowerCase(); // a zone id (fe80::1%eth0) is not part of the address
|
|
60
|
-
const dotted = /^::ffff:(\d{1,3}(?:\.\d{1,3}){3})$/.exec(a);
|
|
61
|
-
if (dotted)
|
|
62
|
-
return dotted[1];
|
|
63
|
-
const hex = /^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/.exec(a);
|
|
64
|
-
if (hex) {
|
|
65
|
-
const hi = parseInt(hex[1], 16), lo = parseInt(hex[2], 16);
|
|
66
|
-
return `${hi >> 8}.${hi & 255}.${lo >> 8}.${lo & 255}`;
|
|
67
|
-
}
|
|
68
|
-
if (isIPv4(a) || !isIPv6(a))
|
|
69
|
-
return a;
|
|
70
|
-
const halves = a.split("::");
|
|
71
|
-
const groups = (part) => (part ? part.split(":").flatMap(g => {
|
|
72
|
-
if (!g.includes("."))
|
|
73
|
-
return [g];
|
|
74
|
-
const [b0, b1, b2, b3] = g.split(".").map(Number); // an embedded IPv4 is two groups
|
|
75
|
-
return [((b0 << 8) | b1).toString(16), ((b2 << 8) | b3).toString(16)];
|
|
76
|
-
}) : []);
|
|
77
|
-
const head = groups(halves[0]), tail = halves.length > 1 ? groups(halves[1]) : [];
|
|
78
|
-
const all = halves.length > 1 ? [...head, ...Array(Math.max(0, 8 - head.length - tail.length)).fill("0"), ...tail] : head;
|
|
79
|
-
return `${all.slice(0, 4).map(g => parseInt(g || "0", 16).toString(16)).join(":")}::/64`;
|
|
80
|
-
}
|
|
81
|
-
/** The key a request id is kept under: its hash, so the map never holds what the new browser presents. */
|
|
82
|
-
function keyOf(requestId) {
|
|
83
|
-
return createHash("sha256").update(`agend-device-login-v1:${requestId}`).digest("hex");
|
|
84
|
-
}
|
|
85
|
-
const REQUEST_ID = /^[0-9a-f]{64}$/;
|
|
86
|
-
export class DeviceLoginRequests {
|
|
87
|
-
entries = new Map();
|
|
88
|
-
createdByPeer = new Map();
|
|
89
|
-
created = [];
|
|
90
|
-
approveFailures = [];
|
|
91
|
-
approvePausedUntil = 0;
|
|
92
|
-
now;
|
|
93
|
-
generate;
|
|
94
|
-
onEvent;
|
|
95
|
-
constructor(opts = {}) {
|
|
96
|
-
this.now = opts.now ?? (() => Date.now());
|
|
97
|
-
this.generate = opts.generate ?? generateOneTimeCode;
|
|
98
|
-
this.onEvent = opts.onEvent ?? (() => { });
|
|
99
|
-
}
|
|
100
|
-
/** How many requests are waiting (or approved and not yet taken up) — for tests and status lines. */
|
|
101
|
-
get size() { this.prune(); return this.entries.size; }
|
|
102
|
-
/** How many addresses the creation rate limit is holding stamps for (for tests: it must not grow without bound). */
|
|
103
|
-
get rateTableSize() { return this.createdByPeer.size; }
|
|
104
|
-
/**
|
|
105
|
-
* A new request. `replaces` is the request id the same browser held (its cookie): it is withdrawn first, so "get a
|
|
106
|
-
* new code" never counts against the room — but it does count against the rate. `label`, `peer` and `address` are
|
|
107
|
-
* the server's own reading of the request (never body input); they are what the approver is shown.
|
|
108
|
-
*/
|
|
109
|
-
create(input) {
|
|
110
|
-
const now = this.now();
|
|
111
|
-
this.prune();
|
|
112
|
-
if (input.replaces && REQUEST_ID.test(input.replaces))
|
|
113
|
-
this.entries.delete(keyOf(input.replaces));
|
|
114
|
-
const cutoff = now - DEVICE_LOGIN_CREATE_WINDOW_MS;
|
|
115
|
-
this.created = this.created.filter(t => t > cutoff);
|
|
116
|
-
// The whole per-address table, not just this address: one whose every stamp is out of the window is forgotten, so
|
|
117
|
-
// addresses seen once never pile up (the table holds at most what the window admitted — DEVICE_LOGIN_CREATES_GLOBAL).
|
|
118
|
-
for (const [key, stamps] of this.createdByPeer) {
|
|
119
|
-
const live = stamps.filter(t => t > cutoff);
|
|
120
|
-
if (live.length)
|
|
121
|
-
this.createdByPeer.set(key, live);
|
|
122
|
-
else
|
|
123
|
-
this.createdByPeer.delete(key);
|
|
124
|
-
}
|
|
125
|
-
const mine = this.createdByPeer.get(input.peerKey) ?? [];
|
|
126
|
-
if (mine.length >= DEVICE_LOGIN_CREATES_PER_PEER)
|
|
127
|
-
return { kind: "limited", retryAfterMs: Math.max(1000, mine[0] + DEVICE_LOGIN_CREATE_WINDOW_MS - now) };
|
|
128
|
-
if (this.created.length >= DEVICE_LOGIN_CREATES_GLOBAL)
|
|
129
|
-
return { kind: "limited", retryAfterMs: Math.max(1000, this.created[0] + DEVICE_LOGIN_CREATE_WINDOW_MS - now) };
|
|
130
|
-
let waitingHere = 0;
|
|
131
|
-
for (const e of this.entries.values())
|
|
132
|
-
if (e.peerKey === input.peerKey)
|
|
133
|
-
waitingHere++;
|
|
134
|
-
if (this.entries.size >= MAX_PENDING_DEVICE_LOGINS || waitingHere >= MAX_PENDING_PER_PEER)
|
|
135
|
-
return { kind: "full" };
|
|
136
|
-
// A code no other waiting request has (the room is eight; a clash is a one-in-a-trillion retry).
|
|
137
|
-
let code = this.generate();
|
|
138
|
-
for (let n = 0; n < 16 && this.codeTaken(code); n++)
|
|
139
|
-
code = this.generate();
|
|
140
|
-
if (this.codeTaken(code))
|
|
141
|
-
return { kind: "full" };
|
|
142
|
-
const requestId = randomBytes(32).toString("hex");
|
|
143
|
-
const expiresAt = now + DEVICE_LOGIN_TTL_MS;
|
|
144
|
-
this.entries.set(keyOf(requestId), { code, label: input.label, peer: input.peer, address: input.address, peerKey: input.peerKey,
|
|
145
|
-
epoch: input.epoch, createdAt: now, expiresAt, state: "pending" });
|
|
146
|
-
this.created.push(now);
|
|
147
|
-
this.createdByPeer.set(input.peerKey, [...mine, now]);
|
|
148
|
-
this.onEvent("created");
|
|
149
|
-
return { kind: "ok", requestId, code: formatOneTimeCode(code), expiresAt };
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* The new browser asks where its request stands. An approved one is spent by this very call (`claimed`): the caller
|
|
153
|
-
* then makes the session, and a second poll with the same id finds nothing. A denied one is told once and forgotten.
|
|
154
|
-
* An unknown, malformed, expired or other-token id is `expired` — the answer never says which.
|
|
155
|
-
*/
|
|
156
|
-
poll(requestId, currentEpoch) {
|
|
157
|
-
if (!requestId || !REQUEST_ID.test(requestId))
|
|
158
|
-
return { kind: "expired" };
|
|
159
|
-
this.prune();
|
|
160
|
-
const key = keyOf(requestId), e = this.entries.get(key);
|
|
161
|
-
if (!e)
|
|
162
|
-
return { kind: "expired" };
|
|
163
|
-
if (e.epoch !== currentEpoch) {
|
|
164
|
-
this.entries.delete(key);
|
|
165
|
-
return { kind: "expired" };
|
|
166
|
-
}
|
|
167
|
-
if (e.state === "pending")
|
|
168
|
-
return { kind: "pending", expiresAt: e.expiresAt };
|
|
169
|
-
this.entries.delete(key);
|
|
170
|
-
if (e.state === "denied")
|
|
171
|
-
return { kind: "denied" };
|
|
172
|
-
this.onEvent("claimed");
|
|
173
|
-
return { kind: "claimed", label: e.label, approvedBy: e.decidedBy ?? "" };
|
|
174
|
-
}
|
|
175
|
-
/** The browser leaves the page (or asks again): its request is withdrawn. Whatever the id, nothing is said. */
|
|
176
|
-
cancel(requestId) {
|
|
177
|
-
if (requestId && REQUEST_ID.test(requestId))
|
|
178
|
-
this.entries.delete(keyOf(requestId));
|
|
179
|
-
}
|
|
180
|
-
/** The approving side types a code: the request it names, for the confirm screen. A wrong code counts. */
|
|
181
|
-
lookup(input, currentEpoch) {
|
|
182
|
-
const m = this.match(input, currentEpoch);
|
|
183
|
-
return m.kind === "found" ? { kind: "ok", view: viewOf(m.entry) } : m;
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Approve or deny the request this code names. Only a pending one changes: one already decided says what it is now,
|
|
187
|
-
* so a second tap approves nothing twice. `by` is the approving session's handle (logged, never shown to the device).
|
|
188
|
-
*/
|
|
189
|
-
decide(input, decision, by, currentEpoch) {
|
|
190
|
-
const m = this.match(input, currentEpoch);
|
|
191
|
-
if (m.kind !== "found")
|
|
192
|
-
return m;
|
|
193
|
-
const e = m.entry;
|
|
194
|
-
if (e.state !== "pending")
|
|
195
|
-
return { kind: "decided", state: e.state };
|
|
196
|
-
e.state = decision;
|
|
197
|
-
e.decidedBy = by;
|
|
198
|
-
this.onEvent(decision === "approved" ? "approved" : "denied");
|
|
199
|
-
return { kind: "ok", view: viewOf(e) };
|
|
200
|
-
}
|
|
201
|
-
/** `/dashboard revoke`: every request is withdrawn. */
|
|
202
|
-
revokeAll() { this.entries.clear(); }
|
|
203
|
-
/** How long the approving side stays paused by its breaker (0 when it is closed). */
|
|
204
|
-
approvePausedForMs() { return Math.max(0, this.approvePausedUntil - this.now()); }
|
|
205
|
-
codeTaken(code) {
|
|
206
|
-
for (const e of this.entries.values())
|
|
207
|
-
if (e.code === code)
|
|
208
|
-
return true;
|
|
209
|
-
return false;
|
|
210
|
-
}
|
|
211
|
-
match(input, currentEpoch) {
|
|
212
|
-
const now = this.now();
|
|
213
|
-
if (now < this.approvePausedUntil)
|
|
214
|
-
return { kind: "paused", retryAfterMs: this.approvePausedUntil - now };
|
|
215
|
-
const provided = normalizeOneTimeCode(input);
|
|
216
|
-
// Nothing typed is not a guess; it costs nothing.
|
|
217
|
-
if (!provided)
|
|
218
|
-
return { kind: "invalid" };
|
|
219
|
-
this.prune();
|
|
220
|
-
for (const [key, e] of this.entries)
|
|
221
|
-
if (e.epoch !== currentEpoch)
|
|
222
|
-
this.entries.delete(key); // the token was rotated
|
|
223
|
-
if (!this.entries.size) {
|
|
224
|
-
constantTimeMatches(provided, NO_REQUEST_PLACEHOLDER);
|
|
225
|
-
return { kind: "invalid" };
|
|
226
|
-
}
|
|
227
|
-
// Every waiting code is compared, in constant time each: where the match is does not show in the time taken.
|
|
228
|
-
let hit = null;
|
|
229
|
-
for (const e of this.entries.values())
|
|
230
|
-
if (constantTimeMatches(provided, e.code))
|
|
231
|
-
hit = e;
|
|
232
|
-
if (hit)
|
|
233
|
-
return { kind: "found", entry: hit };
|
|
234
|
-
this.approveFailures = this.approveFailures.filter(t => t > now - DEVICE_APPROVE_WINDOW_MS);
|
|
235
|
-
this.approveFailures.push(now);
|
|
236
|
-
if (this.approveFailures.length >= DEVICE_APPROVE_THRESHOLD) {
|
|
237
|
-
this.approvePausedUntil = now + DEVICE_APPROVE_PAUSE_MS;
|
|
238
|
-
this.approveFailures = [];
|
|
239
|
-
this.onEvent("breaker-open");
|
|
240
|
-
}
|
|
241
|
-
return { kind: "invalid" };
|
|
242
|
-
}
|
|
243
|
-
prune() {
|
|
244
|
-
const now = this.now();
|
|
245
|
-
for (const [key, e] of this.entries)
|
|
246
|
-
if (now >= e.expiresAt)
|
|
247
|
-
this.entries.delete(key);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
function viewOf(e) {
|
|
251
|
-
return { code: formatOneTimeCode(e.code), label: e.label, peer: e.peer, address: e.address, expiresAt: e.expiresAt, state: e.state };
|
|
252
|
-
}
|
|
253
|
-
// ── The new browser's one cookie: the request id, HttpOnly, and sent only to /auth/device-login ──
|
|
254
|
-
export const DEVICE_LOGIN_COOKIE = "agend_device_login";
|
|
255
|
-
export const DEVICE_LOGIN_PATH = "/auth/device-login";
|
|
256
|
-
export function buildDeviceLoginCookie(requestId, secure, webToken, maxAgeSeconds) {
|
|
257
|
-
return [`${fleetCookieName(DEVICE_LOGIN_COOKIE, webToken)}=${requestId}`, `Path=${DEVICE_LOGIN_PATH}`, "HttpOnly", "SameSite=Strict",
|
|
258
|
-
`Max-Age=${Math.max(0, Math.floor(maxAgeSeconds))}`, ...(secure ? ["Secure"] : [])].join("; ");
|
|
259
|
-
}
|
|
260
|
-
export function clearDeviceLoginCookie(secure, webToken) {
|
|
261
|
-
return buildDeviceLoginCookie("", secure, webToken, 0);
|
|
262
|
-
}
|
|
263
|
-
/** The request id this browser holds, if the cookie header carries a well-formed one. */
|
|
264
|
-
export function readDeviceLoginCookie(cookieHeader, webToken) {
|
|
265
|
-
if (!cookieHeader)
|
|
266
|
-
return undefined;
|
|
267
|
-
const name = fleetCookieName(DEVICE_LOGIN_COOKIE, webToken);
|
|
268
|
-
for (const part of cookieHeader.split(";")) {
|
|
269
|
-
const at = part.indexOf("=");
|
|
270
|
-
if (at < 0 || part.slice(0, at).trim() !== name)
|
|
271
|
-
continue;
|
|
272
|
-
const value = part.slice(at + 1).trim();
|
|
273
|
-
if (REQUEST_ID.test(value))
|
|
274
|
-
return value;
|
|
275
|
-
}
|
|
276
|
-
return undefined;
|
|
277
|
-
}
|
|
278
|
-
//# sourceMappingURL=web-device-login.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"web-device-login.js","sourceRoot":"","sources":["../src/web-device-login.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import type { LoginCodeOwner } from "./web-login.js";
|
|
2
|
-
export declare const WEB_REMOTE_ACCESS_FILE = "web-remote-access.json";
|
|
3
|
-
/** RFC 6238 as every common authenticator app shows it: SHA-1, 6 digits, 30-second steps. */
|
|
4
|
-
export declare const TOTP_STEP_SECONDS = 30;
|
|
5
|
-
export declare const TOTP_DIGITS = 6;
|
|
6
|
-
/**
|
|
7
|
-
* Steps accepted around now: one either side (#3008 C, the leader: this host is WSL2, whose clock drifts behind after
|
|
8
|
-
* Windows sleeps — accepting only the current and previous code would refuse the phone's newest one).
|
|
9
|
-
*/
|
|
10
|
-
export declare const TOTP_PAST_STEPS = 1;
|
|
11
|
-
export declare const TOTP_FUTURE_STEPS = 1;
|
|
12
|
-
/** Diagnosis only (#3008 C): a wrong code is also compared this many steps out, to log how far this clock is off. */
|
|
13
|
-
export declare const TOTP_SKEW_PROBE_STEPS = 2;
|
|
14
|
-
/** 5 wrong codes → a wait. */
|
|
15
|
-
export declare const TOTP_WRONG_LIMIT = 5;
|
|
16
|
-
/** The first wait; #3008 C(b): each further one doubles, up to TOTP_PAUSE_MAX_MS. A correct code resets it. */
|
|
17
|
-
export declare const TOTP_PAUSE_MS: number;
|
|
18
|
-
export declare const TOTP_PAUSE_MAX_MS: number;
|
|
19
|
-
/** #3008 review (Prism P2 1): a state that could not be saved is written again this often until it is. */
|
|
20
|
-
export declare const OUTSIDE_SAVE_RETRY_MS = 30000;
|
|
21
|
-
/** How long a secret being set up waits for its first code. */
|
|
22
|
-
export declare const TOTP_ENROLL_TTL_MS: number;
|
|
23
|
-
export declare function base32Encode(bytes: Uint8Array): string;
|
|
24
|
-
export declare function base32Decode(text: string): Buffer | null;
|
|
25
|
-
/** RFC 4226 HOTP: the code for one counter, as `digits` decimal digits (left-padded). */
|
|
26
|
-
export declare function hotp(secret: Uint8Array, counter: number, digits?: number): string;
|
|
27
|
-
/** The RFC 6238 time step a wall-clock moment falls in. */
|
|
28
|
-
export declare function totpStep(nowMs: number): number;
|
|
29
|
-
/**
|
|
30
|
-
* The step `code` is valid for — the current one or one within the accepted window, newer than `after` — or null. Six
|
|
31
|
-
* digits only (spaces ignored); compared in constant time.
|
|
32
|
-
*/
|
|
33
|
-
export declare function matchTotp(secret: Uint8Array, code: string, nowMs: number, after: number): number | null;
|
|
34
|
-
/**
|
|
35
|
-
* Diagnosis only, never acceptance: for a code that did not match, the step offset (beyond the accepted window, at most
|
|
36
|
-
* TOTP_SKEW_PROBE_STEPS out) it would have matched — positive: the phone is ahead of this computer's clock. Else null.
|
|
37
|
-
*/
|
|
38
|
-
export declare function totpSkew(secret: Uint8Array, code: string, nowMs: number): number | null;
|
|
39
|
-
/** The `otpauth://` URI an authenticator app reads from the QR code (or the key typed in by hand). */
|
|
40
|
-
export declare function otpauthUri(secretBase32: string, account: string): string;
|
|
41
|
-
/** How many sessions from outside one generation remembers (each is a sign-in with a code; older ones read as revoked). */
|
|
42
|
-
export declare const OUTSIDE_HANDLES_MAX = 64;
|
|
43
|
-
export type TotpVerdict = {
|
|
44
|
-
kind: "ok";
|
|
45
|
-
}
|
|
46
|
-
/** `skewSteps`: the code would have matched that many steps out — this computer's clock is likely off (logged). */
|
|
47
|
-
| {
|
|
48
|
-
kind: "wrong";
|
|
49
|
-
paused: false;
|
|
50
|
-
skewSteps: number | null;
|
|
51
|
-
}
|
|
52
|
-
/** This wrong code started a wait (a Notice says so): the `wrong` codes that led to it. */
|
|
53
|
-
| {
|
|
54
|
-
kind: "wrong";
|
|
55
|
-
paused: true;
|
|
56
|
-
retryAfterMs: number;
|
|
57
|
-
wrong: number;
|
|
58
|
-
skewSteps: number | null;
|
|
59
|
-
} | {
|
|
60
|
-
kind: "paused";
|
|
61
|
-
retryAfterMs: number;
|
|
62
|
-
} | {
|
|
63
|
-
kind: "not_enrolled";
|
|
64
|
-
}
|
|
65
|
-
/** Right, but the step it used could not be saved: refused (else a restart would let it be used again). */
|
|
66
|
-
| {
|
|
67
|
-
kind: "unavailable";
|
|
68
|
-
};
|
|
69
|
-
export interface RemoteAccessStatus {
|
|
70
|
-
enrolled: boolean;
|
|
71
|
-
enrolledAt: number | null;
|
|
72
|
-
outside: boolean;
|
|
73
|
-
/** A wait in force now (ms left), else 0. */
|
|
74
|
-
pausedForMs: number;
|
|
75
|
-
}
|
|
76
|
-
export declare class WebRemoteAccess {
|
|
77
|
-
private readonly path;
|
|
78
|
-
private readonly log;
|
|
79
|
-
private readonly now;
|
|
80
|
-
private readonly monotonic;
|
|
81
|
-
private state;
|
|
82
|
-
private pending;
|
|
83
|
-
private warned;
|
|
84
|
-
/** The state in memory is not on disk yet (a write failed): written again, by the next change or the retry timer. */
|
|
85
|
-
private dirty;
|
|
86
|
-
private retry;
|
|
87
|
-
constructor(path: string, log: {
|
|
88
|
-
warn(obj: object, msg?: string): void;
|
|
89
|
-
}, now?: () => number, monotonic?: () => number);
|
|
90
|
-
status(): RemoteAccessStatus;
|
|
91
|
-
get enrolled(): boolean;
|
|
92
|
-
/** The sessions authorized from outside since the last revocation (their receipts hold). */
|
|
93
|
-
get admitted(): ReadonlySet<string>;
|
|
94
|
-
/**
|
|
95
|
-
* A session just signed in from outside: its handle is saved as admitted before it is authorized. False: not saved —
|
|
96
|
-
* the sign-in must not go on (a restart would not know it, and the next revocation could not be proven to end it).
|
|
97
|
-
*/
|
|
98
|
-
admit(handle: string): boolean;
|
|
99
|
-
/** Undo a change whose write failed, keeping whatever was already owed to the disk before it (#3015 review r3, P2 1). */
|
|
100
|
-
private restore;
|
|
101
|
-
get outside(): boolean;
|
|
102
|
-
/**
|
|
103
|
-
* A new secret for the session `handle` to set up (it replaces nothing until confirmEnrollment). Returned once: the
|
|
104
|
-
* caller shows it to that session and forgets it.
|
|
105
|
-
*/
|
|
106
|
-
beginEnrollment(handle: string, account: string): {
|
|
107
|
-
secret: string;
|
|
108
|
-
uri: string;
|
|
109
|
-
expiresInMs: number;
|
|
110
|
-
};
|
|
111
|
-
/**
|
|
112
|
-
* The first code from the app being set up, by the session that began it. "ok": it is now the one (a previous one is
|
|
113
|
-
* replaced; the limiter starts afresh). The caller then ends the sessions signed in with the old one.
|
|
114
|
-
*/
|
|
115
|
-
confirmEnrollment(handle: string, code: string): "ok" | "wrong" | "expired" | "unsaved";
|
|
116
|
-
/**
|
|
117
|
-
* Forget the app; the outside switch goes off with it, and what was authorized from outside ends (handles). In force in
|
|
118
|
-
* memory at once; false: not saved yet (retried — a restart before that would read the old file).
|
|
119
|
-
*/
|
|
120
|
-
remove(): boolean;
|
|
121
|
-
/**
|
|
122
|
-
* The switch. On only with an app set up. Off ends what was authorized from outside (handles). "unsaved": in force in
|
|
123
|
-
* memory, not on disk yet (retried; asking again writes it again).
|
|
124
|
-
*/
|
|
125
|
-
setOutside(on: boolean): "ok" | "not_enrolled" | "unsaved";
|
|
126
|
-
/** A code typed at sign-in from outside. Each step is accepted once; wrong codes count toward a wait. */
|
|
127
|
-
verify(code: string): TotpVerdict;
|
|
128
|
-
/**
|
|
129
|
-
* Saved: true. Not saved: false (warned once until it works again) — memory keeps the new state, and it is written
|
|
130
|
-
* again by the next change or every OUTSIDE_SAVE_RETRY_MS until it is (#3008 review, Prism P2 1).
|
|
131
|
-
*/
|
|
132
|
-
private flush;
|
|
133
|
-
/** Whether the state in memory is still waiting to be saved. */
|
|
134
|
-
get unsaved(): boolean;
|
|
135
|
-
/** Fleet stop: one last write of an unsaved state, then no timer left. */
|
|
136
|
-
close(): void;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* #3008: whose the outside link is — this computer's admin, not a chat account. Never matches a chat owner (those carry
|
|
140
|
-
* a live adapter binding); FleetManager.publicOwnerCurrent permits it only while the switch is on, on a web-only fleet.
|
|
141
|
-
*/
|
|
142
|
-
export declare const OUTSIDE_LINK_OWNER: LoginCodeOwner;
|
|
143
|
-
export declare function isOutsideLinkOwner(owner: LoginCodeOwner): boolean;
|
|
144
|
-
/** #3008 B: a dropped link is reopened twice at most — after 30 s, then 2 minutes. */
|
|
145
|
-
export declare const OUTSIDE_LINK_RETRY_MS: readonly number[];
|
|
146
|
-
/** Closes the switch itself made (or the fleet stopping, or its own failed start): nothing to reopen or announce. */
|
|
147
|
-
export declare const OUTSIDE_OWN_CLOSES: ReadonlySet<string>;
|
|
148
|
-
export declare function outsideTimer(fn: () => void, ms: number): {
|
|
149
|
-
cancel(): void;
|
|
150
|
-
};
|
|
151
|
-
/** A wait as words: "15 minutes" / 「15 分鐘」, "2 hours" / 「2 小時」 (whole minutes under an hour, else whole hours, rounded up). */
|
|
152
|
-
export declare function outsideDuration(ms: number): string;
|