@songsid/agend 2.3.5-alpha.4 → 2.3.5-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.md +52 -0
- package/dist/accounts-view.d.ts +97 -0
- package/dist/accounts-view.js +116 -0
- package/dist/accounts-view.js.map +1 -0
- package/dist/agent-cli-instructions.md +1 -1
- package/dist/agent-credentials.d.ts +24 -0
- package/dist/agent-credentials.js +66 -0
- package/dist/agent-credentials.js.map +1 -0
- package/dist/agent-endpoint.d.ts +3 -1
- package/dist/agent-endpoint.js +13 -0
- 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/agent-runtime-change.d.ts +3 -1
- package/dist/agent-runtime-change.js +15 -3
- package/dist/agent-runtime-change.js.map +1 -1
- package/dist/agent-workspace.d.ts +93 -0
- package/dist/agent-workspace.js +353 -0
- package/dist/agent-workspace.js.map +1 -0
- package/dist/auth-api.d.ts +27 -0
- package/dist/auth-api.js +164 -3
- package/dist/auth-api.js.map +1 -1
- package/dist/authority/session-authorizations.d.ts +28 -4
- package/dist/authority/session-authorizations.js +63 -17
- package/dist/authority/session-authorizations.js.map +1 -1
- package/dist/backend/antigravity.js +3 -1
- package/dist/backend/antigravity.js.map +1 -1
- package/dist/backend/codex-footer-hints.d.ts +3 -0
- package/dist/backend/codex-footer-hints.js +14 -0
- package/dist/backend/codex-footer-hints.js.map +1 -1
- package/dist/backend/codex-metadata.d.ts +14 -0
- package/dist/backend/codex-metadata.js +45 -0
- package/dist/backend/codex-metadata.js.map +1 -1
- package/dist/backend/codex-quota-history.d.ts +7 -0
- package/dist/backend/codex-quota-history.js +57 -0
- package/dist/backend/codex-quota-history.js.map +1 -0
- package/dist/backend/codex-session-lookup.d.ts +6 -0
- package/dist/backend/codex-session-lookup.js +1 -1
- package/dist/backend/codex-session-lookup.js.map +1 -1
- package/dist/backend/codex-speed.d.ts +14 -0
- package/dist/backend/codex-speed.js +35 -0
- package/dist/backend/codex-speed.js.map +1 -0
- package/dist/backend/codex.d.ts +7 -0
- package/dist/backend/codex.js +78 -15
- package/dist/backend/codex.js.map +1 -1
- package/dist/backend/grok-weekly-reset.d.ts +24 -0
- package/dist/backend/grok-weekly-reset.js +95 -0
- package/dist/backend/grok-weekly-reset.js.map +1 -0
- package/dist/backend/grok.d.ts +30 -1
- package/dist/backend/grok.js +301 -54
- package/dist/backend/grok.js.map +1 -1
- package/dist/backend/kiro.d.ts +3 -0
- package/dist/backend/kiro.js +50 -2
- package/dist/backend/kiro.js.map +1 -1
- package/dist/backend/muse.js +5 -3
- package/dist/backend/muse.js.map +1 -1
- package/dist/backend/native-pane.d.ts +3 -1
- package/dist/backend/native-pane.js +2 -2
- package/dist/backend/native-pane.js.map +1 -1
- package/dist/backend/types.d.ts +13 -1
- package/dist/backend/types.js +3 -0
- package/dist/backend/types.js.map +1 -1
- package/dist/build-provenance-cli.d.ts +3 -0
- package/dist/build-provenance-cli.js +11 -0
- package/dist/build-provenance-cli.js.map +1 -0
- package/dist/build-provenance.d.ts +20 -0
- package/dist/build-provenance.js +67 -0
- package/dist/build-provenance.js.map +1 -0
- package/dist/build-provenance.json +1 -0
- package/dist/cache-ledger.d.ts +95 -0
- package/dist/cache-ledger.js +276 -4
- package/dist/cache-ledger.js.map +1 -1
- package/dist/cache-service.d.ts +5 -0
- package/dist/cache-service.js +16 -4
- package/dist/cache-service.js.map +1 -1
- package/dist/channel/adapters/discord.js +11 -3
- package/dist/channel/adapters/discord.js.map +1 -1
- package/dist/channel/adapters/telegram.d.ts +51 -0
- package/dist/channel/adapters/telegram.js +235 -17
- package/dist/channel/adapters/telegram.js.map +1 -1
- package/dist/channel/mcp-tools.js +3 -3
- package/dist/channel/mcp-tools.js.map +1 -1
- package/dist/channel/types.d.ts +2 -0
- package/dist/claude-auth-status.d.ts +48 -0
- package/dist/claude-auth-status.js +149 -0
- package/dist/claude-auth-status.js.map +1 -0
- package/dist/cli.js +138 -37
- package/dist/cli.js.map +1 -1
- package/dist/config-validator.js +21 -1
- package/dist/config-validator.js.map +1 -1
- package/dist/cross-instance-notice.d.ts +10 -0
- package/dist/cross-instance-notice.js +67 -5
- package/dist/cross-instance-notice.js.map +1 -1
- package/dist/daemon.d.ts +70 -1
- package/dist/daemon.js +547 -25
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard-permissions.d.ts +8 -0
- package/dist/dashboard-permissions.js +16 -0
- package/dist/dashboard-permissions.js.map +1 -1
- package/dist/delivery-consumed-watch.d.ts +23 -1
- package/dist/delivery-consumed-watch.js +30 -3
- package/dist/delivery-consumed-watch.js.map +1 -1
- package/dist/delivery-reconciliation.d.ts +1 -1
- package/dist/delivery-reconciliation.js +1 -1
- package/dist/delivery-reconciliation.js.map +1 -1
- package/dist/doctor.js +20 -9
- package/dist/doctor.js.map +1 -1
- package/dist/export-import.d.ts +7 -0
- package/dist/export-import.js +44 -10
- package/dist/export-import.js.map +1 -1
- package/dist/fleet-context.d.ts +2 -0
- package/dist/fleet-manager.d.ts +359 -7
- package/dist/fleet-manager.js +1365 -90
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-windows-runtime.d.ts +2 -1
- package/dist/fleet-windows-runtime.js +25 -7
- package/dist/fleet-windows-runtime.js.map +1 -1
- package/dist/general-knowledge/skills/concepts/SKILL.md +425 -0
- package/dist/general-knowledge/skills/credential-profiles/SKILL.md +5 -2
- package/dist/general-knowledge/skills/cross-instance-messaging/SKILL.md +1 -0
- package/dist/general-knowledge/skills/fleet-health/SKILL.md +2 -2
- package/dist/general-knowledge/skills/instance-lifecycle/SKILL.md +3 -1
- package/dist/general-knowledge/skills/kiro-engine-migration/SKILL.md +41 -4
- 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 +31 -15
- package/dist/general-knowledge/skills/worker-collaboration/SKILL.md +1 -1
- package/dist/general-role.d.ts +1 -1
- package/dist/general-role.js +1 -0
- package/dist/general-role.js.map +1 -1
- package/dist/hub/admission.d.ts +28 -0
- package/dist/hub/admission.js +62 -0
- package/dist/hub/admission.js.map +1 -0
- package/dist/hub/attachments/limits.d.ts +20 -0
- package/dist/hub/attachments/limits.js +48 -0
- package/dist/hub/attachments/limits.js.map +1 -0
- package/dist/hub/attachments/store.d.ts +116 -0
- package/dist/hub/attachments/store.js +246 -0
- package/dist/hub/attachments/store.js.map +1 -0
- package/dist/hub/audit/index.d.ts +62 -0
- package/dist/hub/audit/index.js +344 -0
- package/dist/hub/audit/index.js.map +1 -0
- package/dist/hub/browser-certificate.d.ts +38 -0
- package/dist/hub/browser-certificate.js +247 -0
- package/dist/hub/browser-certificate.js.map +1 -0
- package/dist/hub/buttons-model.d.ts +9 -0
- package/dist/hub/buttons-model.js +42 -0
- package/dist/hub/buttons-model.js.map +1 -0
- package/dist/hub/buttons.d.ts +54 -0
- package/dist/hub/buttons.js +346 -0
- package/dist/hub/buttons.js.map +1 -0
- package/dist/hub/catalog.d.ts +74 -0
- package/dist/hub/catalog.js +195 -0
- package/dist/hub/catalog.js.map +1 -0
- package/dist/hub/client.d.ts +69 -0
- package/dist/hub/client.js +300 -0
- package/dist/hub/client.js.map +1 -0
- package/dist/hub/compose/member.d.ts +139 -0
- package/dist/hub/compose/member.js +450 -0
- package/dist/hub/compose/member.js.map +1 -0
- package/dist/hub/compose/server.d.ts +77 -0
- package/dist/hub/compose/server.js +349 -0
- package/dist/hub/compose/server.js.map +1 -0
- package/dist/hub/compose/views.d.ts +12 -0
- package/dist/hub/compose/views.js +4 -0
- package/dist/hub/compose/views.js.map +1 -0
- package/dist/hub/db.d.ts +56 -0
- package/dist/hub/db.js +188 -0
- package/dist/hub/db.js.map +1 -0
- package/dist/hub/directory/config.d.ts +39 -0
- package/dist/hub/directory/config.js +108 -0
- package/dist/hub/directory/config.js.map +1 -0
- package/dist/hub/directory/directory.d.ts +18 -0
- package/dist/hub/directory/directory.js +320 -0
- package/dist/hub/directory/directory.js.map +1 -0
- package/dist/hub/directory/index.d.ts +7 -0
- package/dist/hub/directory/index.js +4 -0
- package/dist/hub/directory/index.js.map +1 -0
- package/dist/hub/directory/profiles.d.ts +41 -0
- package/dist/hub/directory/profiles.js +90 -0
- package/dist/hub/directory/profiles.js.map +1 -0
- package/dist/hub/directory/types.d.ts +71 -0
- package/dist/hub/directory/types.js +14 -0
- package/dist/hub/directory/types.js.map +1 -0
- package/dist/hub/execution/cli-provider.d.ts +23 -0
- package/dist/hub/execution/cli-provider.js +341 -0
- package/dist/hub/execution/cli-provider.js.map +1 -0
- package/dist/hub/execution/index.d.ts +13 -0
- package/dist/hub/execution/index.js +8 -0
- package/dist/hub/execution/index.js.map +1 -0
- package/dist/hub/execution/model-broker.d.ts +24 -0
- package/dist/hub/execution/model-broker.js +208 -0
- package/dist/hub/execution/model-broker.js.map +1 -0
- package/dist/hub/execution/provider-setup.d.ts +11 -0
- package/dist/hub/execution/provider-setup.js +21 -0
- package/dist/hub/execution/provider-setup.js.map +1 -0
- package/dist/hub/execution/sandbox-runner.d.ts +1 -0
- package/dist/hub/execution/sandbox-runner.js +221 -0
- package/dist/hub/execution/sandbox-runner.js.map +1 -0
- package/dist/hub/execution/service.d.ts +136 -0
- package/dist/hub/execution/service.js +459 -0
- package/dist/hub/execution/service.js.map +1 -0
- package/dist/hub/execution/store.d.ts +61 -0
- package/dist/hub/execution/store.js +182 -0
- package/dist/hub/execution/store.js.map +1 -0
- package/dist/hub/execution/views.d.ts +20 -0
- package/dist/hub/execution/views.js +48 -0
- package/dist/hub/execution/views.js.map +1 -0
- package/dist/hub/http/compose.d.ts +20 -0
- package/dist/hub/http/compose.js +518 -0
- package/dist/hub/http/compose.js.map +1 -0
- package/dist/hub/http/core.d.ts +49 -0
- package/dist/hub/http/core.js +124 -0
- package/dist/hub/http/core.js.map +1 -0
- package/dist/hub/http/deps.d.ts +61 -0
- package/dist/hub/http/deps.js +2 -0
- package/dist/hub/http/deps.js.map +1 -0
- package/dist/hub/http/schema.d.ts +14 -0
- package/dist/hub/http/schema.js +80 -0
- package/dist/hub/http/schema.js.map +1 -0
- package/dist/hub/identity.d.ts +32 -0
- package/dist/hub/identity.js +80 -0
- package/dist/hub/identity.js.map +1 -0
- package/dist/hub/init/browser-certificate.d.ts +9 -0
- package/dist/hub/init/browser-certificate.js +78 -0
- package/dist/hub/init/browser-certificate.js.map +1 -0
- package/dist/hub/init/browser-tls.d.ts +18 -0
- package/dist/hub/init/browser-tls.js +62 -0
- package/dist/hub/init/browser-tls.js.map +1 -0
- package/dist/hub/init/cli.d.ts +3 -0
- package/dist/hub/init/cli.js +83 -0
- package/dist/hub/init/cli.js.map +1 -0
- package/dist/hub/init/directory-certificate.d.ts +24 -0
- package/dist/hub/init/directory-certificate.js +222 -0
- package/dist/hub/init/directory-certificate.js.map +1 -0
- package/dist/hub/init/existing-fleet.d.ts +6 -0
- package/dist/hub/init/existing-fleet.js +58 -0
- package/dist/hub/init/existing-fleet.js.map +1 -0
- package/dist/hub/init/handoff.d.ts +8 -0
- package/dist/hub/init/handoff.js +36 -0
- package/dist/hub/init/handoff.js.map +1 -0
- package/dist/hub/init/identity.d.ts +5 -0
- package/dist/hub/init/identity.js +24 -0
- package/dist/hub/init/identity.js.map +1 -0
- package/dist/hub/init/initializer.d.ts +24 -0
- package/dist/hub/init/initializer.js +385 -0
- package/dist/hub/init/initializer.js.map +1 -0
- package/dist/hub/init/inventory.d.ts +17 -0
- package/dist/hub/init/inventory.js +33 -0
- package/dist/hub/init/inventory.js.map +1 -0
- package/dist/hub/init/layout.d.ts +32 -0
- package/dist/hub/init/layout.js +53 -0
- package/dist/hub/init/layout.js.map +1 -0
- package/dist/hub/init/network.d.ts +18 -0
- package/dist/hub/init/network.js +104 -0
- package/dist/hub/init/network.js.map +1 -0
- package/dist/hub/init/plan-digest.d.ts +5 -0
- package/dist/hub/init/plan-digest.js +47 -0
- package/dist/hub/init/plan-digest.js.map +1 -0
- package/dist/hub/init/prompt.d.ts +26 -0
- package/dist/hub/init/prompt.js +110 -0
- package/dist/hub/init/prompt.js.map +1 -0
- package/dist/hub/init/secret-file.d.ts +1 -0
- package/dist/hub/init/secret-file.js +59 -0
- package/dist/hub/init/secret-file.js.map +1 -0
- package/dist/hub/init/text.d.ts +127 -0
- package/dist/hub/init/text.js +247 -0
- package/dist/hub/init/text.js.map +1 -0
- package/dist/hub/init/types.d.ts +114 -0
- package/dist/hub/init/types.js +9 -0
- package/dist/hub/init/types.js.map +1 -0
- package/dist/hub/init/wizard.d.ts +34 -0
- package/dist/hub/init/wizard.js +554 -0
- package/dist/hub/init/wizard.js.map +1 -0
- package/dist/hub/initialization.d.ts +23 -0
- package/dist/hub/initialization.js +28 -0
- package/dist/hub/initialization.js.map +1 -0
- package/dist/hub/member/agent-mode.d.ts +6 -0
- package/dist/hub/member/agent-mode.js +23 -0
- package/dist/hub/member/agent-mode.js.map +1 -0
- package/dist/hub/member/attachments.d.ts +29 -0
- package/dist/hub/member/attachments.js +107 -0
- package/dist/hub/member/attachments.js.map +1 -0
- package/dist/hub/member/exposure-api.d.ts +87 -0
- package/dist/hub/member/exposure-api.js +64 -0
- package/dist/hub/member/exposure-api.js.map +1 -0
- package/dist/hub/member/exposures.d.ts +123 -0
- package/dist/hub/member/exposures.js +282 -0
- package/dist/hub/member/exposures.js.map +1 -0
- package/dist/hub/member/pairing-api.d.ts +85 -0
- package/dist/hub/member/pairing-api.js +385 -0
- package/dist/hub/member/pairing-api.js.map +1 -0
- package/dist/hub/member/quota.d.ts +20 -0
- package/dist/hub/member/quota.js +98 -0
- package/dist/hub/member/quota.js.map +1 -0
- package/dist/hub/member-journal.d.ts +104 -0
- package/dist/hub/member-journal.js +336 -0
- package/dist/hub/member-journal.js.map +1 -0
- package/dist/hub/member-reconciliation.d.ts +14 -0
- package/dist/hub/member-reconciliation.js +97 -0
- package/dist/hub/member-reconciliation.js.map +1 -0
- package/dist/hub/mount.d.ts +39 -0
- package/dist/hub/mount.js +123 -0
- package/dist/hub/mount.js.map +1 -0
- package/dist/hub/pairing-client.d.ts +17 -0
- package/dist/hub/pairing-client.js +108 -0
- package/dist/hub/pairing-client.js.map +1 -0
- package/dist/hub/pairing.d.ts +65 -0
- package/dist/hub/pairing.js +211 -0
- package/dist/hub/pairing.js.map +1 -0
- package/dist/hub/policy.d.ts +63 -0
- package/dist/hub/policy.js +147 -0
- package/dist/hub/policy.js.map +1 -0
- package/dist/hub/preview.d.ts +32 -0
- package/dist/hub/preview.js +64 -0
- package/dist/hub/preview.js.map +1 -0
- package/dist/hub/private-files.d.ts +5 -0
- package/dist/hub/private-files.js +44 -0
- package/dist/hub/private-files.js.map +1 -0
- package/dist/hub/profile.d.ts +59 -0
- package/dist/hub/profile.js +73 -0
- package/dist/hub/profile.js.map +1 -0
- package/dist/hub/protocol.d.ts +779 -0
- package/dist/hub/protocol.js +93 -0
- package/dist/hub/protocol.js.map +1 -0
- package/dist/hub/quota.d.ts +24 -0
- package/dist/hub/quota.js +112 -0
- package/dist/hub/quota.js.map +1 -0
- package/dist/hub/representative.d.ts +141 -0
- package/dist/hub/representative.js +528 -0
- package/dist/hub/representative.js.map +1 -0
- package/dist/hub/retention.d.ts +17 -0
- package/dist/hub/retention.js +45 -0
- package/dist/hub/retention.js.map +1 -0
- package/dist/hub/rooms.d.ts +120 -0
- package/dist/hub/rooms.js +535 -0
- package/dist/hub/rooms.js.map +1 -0
- package/dist/hub/runtime.d.ts +106 -0
- package/dist/hub/runtime.js +298 -0
- package/dist/hub/runtime.js.map +1 -0
- package/dist/hub/server.d.ts +56 -0
- package/dist/hub/server.js +202 -0
- package/dist/hub/server.js.map +1 -0
- package/dist/hub/service-start.d.ts +17 -0
- package/dist/hub/service-start.js +109 -0
- package/dist/hub/service-start.js.map +1 -0
- package/dist/hub/sessions.d.ts +53 -0
- package/dist/hub/sessions.js +196 -0
- package/dist/hub/sessions.js.map +1 -0
- package/dist/hub/socket.d.ts +24 -0
- package/dist/hub/socket.js +79 -0
- package/dist/hub/socket.js.map +1 -0
- package/dist/hub/store.d.ts +77 -0
- package/dist/hub/store.js +88 -0
- package/dist/hub/store.js.map +1 -0
- package/dist/hub/tls.d.ts +31 -0
- package/dist/hub/tls.js +135 -0
- package/dist/hub/tls.js.map +1 -0
- package/dist/hub/types.d.ts +401 -0
- package/dist/hub/types.js +2 -0
- package/dist/hub/types.js.map +1 -0
- package/dist/hub/validation.d.ts +33 -0
- package/dist/hub/validation.js +136 -0
- package/dist/hub/validation.js.map +1 -0
- package/dist/hub/version-floor.d.ts +10 -0
- package/dist/hub/version-floor.js +45 -0
- package/dist/hub/version-floor.js.map +1 -0
- package/dist/hub-browser-certificate-policy.d.ts +31 -0
- package/dist/hub-browser-certificate-policy.js +25 -0
- package/dist/hub-browser-certificate-policy.js.map +1 -0
- package/dist/hub-membership-settings.d.ts +6 -0
- package/dist/hub-membership-settings.js +21 -0
- package/dist/hub-membership-settings.js.map +1 -0
- package/dist/hub-mode.d.ts +15 -0
- package/dist/hub-mode.js +17 -0
- package/dist/hub-mode.js.map +1 -0
- package/dist/hub-pairing-summary.d.ts +48 -0
- package/dist/hub-pairing-summary.js +36 -0
- package/dist/hub-pairing-summary.js.map +1 -0
- package/dist/hub-report-target.d.ts +32 -0
- package/dist/hub-report-target.js +33 -0
- package/dist/hub-report-target.js.map +1 -0
- package/dist/hub-retention-policy.d.ts +14 -0
- package/dist/hub-retention-policy.js +15 -0
- package/dist/hub-retention-policy.js.map +1 -0
- package/dist/instance-config-impact.js +3 -0
- package/dist/instance-config-impact.js.map +1 -1
- package/dist/instance-lifecycle.d.ts +17 -2
- package/dist/instance-lifecycle.js +58 -8
- package/dist/instance-lifecycle.js.map +1 -1
- package/dist/instance-topic-delete.d.ts +77 -0
- package/dist/instance-topic-delete.js +123 -0
- package/dist/instance-topic-delete.js.map +1 -0
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.js +1 -1
- package/dist/instructions.js.map +1 -1
- package/dist/kiro-engine-status.d.ts +11 -0
- package/dist/kiro-engine-status.js +6 -0
- package/dist/kiro-engine-status.js.map +1 -1
- package/dist/launchd-service-domain.d.ts +5 -0
- package/dist/launchd-service-domain.js +21 -0
- package/dist/launchd-service-domain.js.map +1 -0
- package/dist/locale.js +125 -3
- package/dist/locale.js.map +1 -1
- package/dist/log-service.d.ts +28 -0
- package/dist/log-service.js +29 -0
- package/dist/log-service.js.map +1 -1
- package/dist/log-steps.d.ts +4 -3
- package/dist/log-steps.js +32 -7
- package/dist/log-steps.js.map +1 -1
- package/dist/logger.d.ts +16 -2
- package/dist/logger.js +346 -66
- package/dist/logger.js.map +1 -1
- package/dist/login-flows.d.ts +15 -7
- package/dist/login-flows.js +29 -3
- package/dist/login-flows.js.map +1 -1
- package/dist/login-manager.js +25 -4
- package/dist/login-manager.js.map +1 -1
- package/dist/ls-rows.js +3 -4
- package/dist/ls-rows.js.map +1 -1
- package/dist/missed-offline.d.ts +25 -0
- package/dist/missed-offline.js +79 -0
- package/dist/missed-offline.js.map +1 -0
- package/dist/native-instance-api.d.ts +0 -1
- package/dist/native-instance-api.js +15 -3
- package/dist/native-instance-api.js.map +1 -1
- package/dist/native-instance-input.d.ts +3 -0
- package/dist/native-instance-input.js +6 -1
- package/dist/native-instance-input.js.map +1 -1
- package/dist/native-instance-registry.d.ts +6 -0
- package/dist/native-instance-registry.js +24 -0
- package/dist/native-instance-registry.js.map +1 -1
- package/dist/native-mcp.d.ts +3 -0
- package/dist/native-mcp.js +15 -2
- package/dist/native-mcp.js.map +1 -1
- package/dist/native-pane-lifecycle.d.ts +8 -0
- package/dist/native-pane-lifecycle.js +13 -4
- package/dist/native-pane-lifecycle.js.map +1 -1
- package/dist/native-pane-manager.js +17 -9
- package/dist/native-pane-manager.js.map +1 -1
- package/dist/needs-you-hub.d.ts +9 -1
- package/dist/needs-you-hub.js +46 -8
- package/dist/needs-you-hub.js.map +1 -1
- package/dist/needs-you.d.ts +47 -2
- package/dist/needs-you.js +31 -3
- package/dist/needs-you.js.map +1 -1
- package/dist/office-share-page.js +2 -2
- package/dist/office-share-page.js.map +1 -1
- package/dist/office-share.d.ts +11 -0
- package/dist/office-share.js +14 -0
- package/dist/office-share.js.map +1 -1
- package/dist/office-talk.d.ts +26 -0
- package/dist/office-talk.js +50 -0
- package/dist/office-talk.js.map +1 -0
- package/dist/outbound-handlers.d.ts +14 -0
- package/dist/outbound-handlers.js +49 -6
- package/dist/outbound-handlers.js.map +1 -1
- package/dist/outbound-schemas.d.ts +33 -1
- package/dist/outbound-schemas.js +29 -16
- package/dist/outbound-schemas.js.map +1 -1
- package/dist/pane-quota-history.d.ts +9 -0
- package/dist/pane-quota-history.js +67 -0
- package/dist/pane-quota-history.js.map +1 -0
- 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/platform-general.d.ts +46 -0
- package/dist/platform-general.js +91 -0
- package/dist/platform-general.js.map +1 -0
- package/dist/public-web-gateway.js +7 -0
- package/dist/public-web-gateway.js.map +1 -1
- package/dist/queued-handoffs.d.ts +33 -0
- package/dist/queued-handoffs.js +75 -0
- package/dist/queued-handoffs.js.map +1 -0
- package/dist/quickstart.d.ts +13 -0
- package/dist/quickstart.js +81 -5
- package/dist/quickstart.js.map +1 -1
- package/dist/quota-notice.d.ts +7 -0
- package/dist/quota-notice.js +40 -0
- package/dist/quota-notice.js.map +1 -1
- package/dist/reply-buttons-controller.js +10 -6
- package/dist/reply-buttons-controller.js.map +1 -1
- package/dist/reply-polls.d.ts +2 -2
- package/dist/reply-polls.js +3 -3
- package/dist/reply-polls.js.map +1 -1
- package/dist/runtime-api.d.ts +2 -0
- package/dist/runtime-api.js +25 -7
- package/dist/runtime-api.js.map +1 -1
- package/dist/runtime-build-info.js +5 -3
- package/dist/runtime-build-info.js.map +1 -1
- package/dist/runtime-bundle.d.ts +3 -0
- package/dist/runtime-bundle.js +3 -1
- package/dist/runtime-bundle.js.map +1 -1
- package/dist/runtime-cli.d.ts +8 -1
- package/dist/runtime-cli.js +127 -8
- package/dist/runtime-cli.js.map +1 -1
- package/dist/runtime-client-store.d.ts +7 -0
- package/dist/runtime-client-store.js +30 -2
- package/dist/runtime-client-store.js.map +1 -1
- package/dist/runtime-client.d.ts +63 -1
- package/dist/runtime-client.js +295 -21
- package/dist/runtime-client.js.map +1 -1
- package/dist/runtime-coordinator.d.ts +7 -0
- package/dist/runtime-coordinator.js +213 -35
- package/dist/runtime-coordinator.js.map +1 -1
- package/dist/runtime-credential-profiles.d.ts +78 -0
- package/dist/runtime-credential-profiles.js +280 -0
- package/dist/runtime-credential-profiles.js.map +1 -0
- package/dist/runtime-install.d.ts +50 -0
- package/dist/runtime-install.js +186 -0
- package/dist/runtime-install.js.map +1 -0
- package/dist/runtime-pane-assets.d.ts +1 -1
- package/dist/runtime-pane-assets.js +1 -1
- package/dist/runtime-pane-assets.js.map +1 -1
- package/dist/runtime-pane-codex-index.d.ts +10 -1
- package/dist/runtime-pane-codex-index.js +131 -27
- package/dist/runtime-pane-codex-index.js.map +1 -1
- package/dist/runtime-pane-host.d.ts +19 -0
- package/dist/runtime-pane-host.js +50 -7
- package/dist/runtime-pane-host.js.map +1 -1
- package/dist/runtime-pane-link.d.ts +7 -0
- package/dist/runtime-pane-link.js +93 -2
- package/dist/runtime-pane-link.js.map +1 -1
- package/dist/runtime-pane-mcp-relay.d.ts +1 -0
- package/dist/runtime-pane-mcp-relay.js +10 -0
- package/dist/runtime-pane-mcp-relay.js.map +1 -1
- package/dist/runtime-pane-mcp.d.ts +4 -0
- package/dist/runtime-pane-mcp.js +6 -3
- package/dist/runtime-pane-mcp.js.map +1 -1
- package/dist/runtime-pane-native.d.ts +32 -2
- package/dist/runtime-pane-native.js +55 -6
- package/dist/runtime-pane-native.js.map +1 -1
- package/dist/runtime-pane-port.d.ts +5 -0
- package/dist/runtime-pane-port.js +17 -1
- package/dist/runtime-pane-port.js.map +1 -1
- package/dist/runtime-pane-process.d.ts +1 -1
- package/dist/runtime-pane-process.js +11 -2
- package/dist/runtime-pane-process.js.map +1 -1
- package/dist/runtime-pane-protocol.d.ts +11 -1
- package/dist/runtime-pane-protocol.js +27 -5
- package/dist/runtime-pane-protocol.js.map +1 -1
- package/dist/runtime-pane-quota-history.d.ts +6 -0
- package/dist/runtime-pane-quota-history.js +44 -0
- package/dist/runtime-pane-quota-history.js.map +1 -0
- package/dist/runtime-pane-service.d.ts +5 -0
- package/dist/runtime-pane-service.js +47 -12
- package/dist/runtime-pane-service.js.map +1 -1
- package/dist/runtime-pane-transcript.d.ts +5 -0
- package/dist/runtime-pane-transcript.js +66 -5
- package/dist/runtime-pane-transcript.js.map +1 -1
- package/dist/runtime-pane-worker.js +19 -6
- package/dist/runtime-pane-worker.js.map +1 -1
- package/dist/runtime-protocol.d.ts +17 -2
- package/dist/runtime-protocol.js +12 -0
- package/dist/runtime-protocol.js.map +1 -1
- package/dist/runtime-update-activity.d.ts +21 -0
- package/dist/runtime-update-activity.js +51 -0
- package/dist/runtime-update-activity.js.map +1 -0
- package/dist/runtime-update-artifact.d.ts +31 -0
- package/dist/runtime-update-artifact.js +252 -0
- package/dist/runtime-update-artifact.js.map +1 -0
- package/dist/runtime-update-install.d.ts +31 -0
- package/dist/runtime-update-install.js +205 -0
- package/dist/runtime-update-install.js.map +1 -0
- package/dist/runtime-update-journal.d.ts +44 -0
- package/dist/runtime-update-journal.js +121 -0
- package/dist/runtime-update-journal.js.map +1 -0
- package/dist/runtime-update-lock.d.ts +48 -0
- package/dist/runtime-update-lock.js +217 -0
- package/dist/runtime-update-lock.js.map +1 -0
- package/dist/runtime-update-owners.d.ts +29 -0
- package/dist/runtime-update-owners.js +240 -0
- package/dist/runtime-update-owners.js.map +1 -0
- package/dist/runtime-update-protocol.d.ts +15 -0
- package/dist/runtime-update-protocol.js +13 -0
- package/dist/runtime-update-protocol.js.map +1 -0
- package/dist/runtime-windows-bridge.d.ts +2 -1
- package/dist/runtime-windows-bridge.js +11 -1
- package/dist/runtime-windows-bridge.js.map +1 -1
- package/dist/scheduler/db.d.ts +2 -1
- package/dist/scheduler/db.js +23 -9
- package/dist/scheduler/db.js.map +1 -1
- 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 +13 -0
- package/dist/scheduler/task-board.js +28 -3
- package/dist/scheduler/task-board.js.map +1 -1
- package/dist/service-drain.d.ts +19 -0
- package/dist/service-drain.js +64 -0
- package/dist/service-drain.js.map +1 -0
- package/dist/service-installer.d.ts +7 -2
- package/dist/service-installer.js +13 -10
- package/dist/service-installer.js.map +1 -1
- package/dist/settings-api.d.ts +20 -0
- package/dist/settings-api.js +414 -4
- package/dist/settings-api.js.map +1 -1
- package/dist/settings-baseline.d.ts +6 -0
- package/dist/settings-baseline.js +3 -1
- package/dist/settings-baseline.js.map +1 -1
- package/dist/settings-change.js +29 -6
- package/dist/settings-change.js.map +1 -1
- package/dist/settings-effect.d.ts +13 -0
- package/dist/settings-effect.js +97 -0
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.js +13 -1
- package/dist/settings-http-confirmation.js.map +1 -1
- package/dist/settings-instance-patch.js +27 -0
- package/dist/settings-instance-patch.js.map +1 -1
- package/dist/setup-wizard.js +6 -2
- package/dist/setup-wizard.js.map +1 -1
- package/dist/task-board-tool.d.ts +13 -1
- package/dist/task-board-tool.js +104 -4
- package/dist/task-board-tool.js.map +1 -1
- package/dist/task-board-waker.d.ts +6 -0
- package/dist/task-board-waker.js +4 -0
- package/dist/task-board-waker.js.map +1 -1
- package/dist/tmux-binary.d.ts +59 -0
- package/dist/tmux-binary.js +200 -0
- package/dist/tmux-binary.js.map +1 -0
- package/dist/tmux-control.js +4 -4
- package/dist/tmux-control.js.map +1 -1
- package/dist/tmux-exec-helper.js +32 -1
- package/dist/tmux-exec-helper.js.map +1 -1
- package/dist/tmux-manager.d.ts +1 -1
- package/dist/tmux-manager.js +45 -36
- package/dist/tmux-manager.js.map +1 -1
- package/dist/tmux-read.js +4 -3
- package/dist/tmux-read.js.map +1 -1
- package/dist/tool-permissions.d.ts +5 -2
- package/dist/tool-permissions.js +6 -5
- package/dist/tool-permissions.js.map +1 -1
- package/dist/tool-progress.d.ts +2 -0
- package/dist/tool-progress.js +19 -3
- package/dist/tool-progress.js.map +1 -1
- package/dist/topic-commands.js +10 -5
- package/dist/topic-commands.js.map +1 -1
- package/dist/transcript-monitor.d.ts +20 -0
- package/dist/transcript-monitor.js +47 -3
- package/dist/transcript-monitor.js.map +1 -1
- package/dist/transcript-needles.d.ts +7 -0
- package/dist/transcript-needles.js +9 -1
- package/dist/transcript-needles.js.map +1 -1
- package/dist/transcript-records.d.ts +1 -1
- package/dist/transcript-records.js +2 -1
- package/dist/transcript-records.js.map +1 -1
- package/dist/types.d.ts +6 -0
- package/dist/ui/account-identity.js +27 -0
- package/dist/ui/accounts-view.js +214 -0
- package/dist/ui/agent-runtime-settings.js +9 -8
- package/dist/ui/backend-signin.js +4 -1
- package/dist/ui/chat-ambient.js +1 -1
- package/dist/ui/chat-md-strings.js +3 -0
- package/dist/ui/chat-render.js +3 -670
- package/dist/ui/chat-store.js +1 -1
- package/dist/ui/chat-strings.js +3 -333
- package/dist/ui/chat-thread.js +3 -919
- package/dist/ui/chat-time.js +3 -80
- package/dist/ui/chat-tour.js +1 -1
- package/dist/ui/credential-profile-select.js +54 -0
- package/dist/ui/fleet-office-dialogue.d.ts +30 -0
- package/dist/ui/fleet-office-dialogue.js +382 -0
- package/dist/ui/fleet-office-pack.d.ts +9 -0
- package/dist/ui/fleet-office-pack.js +76 -4
- package/dist/ui/fleet-office-skin.js +23 -5
- package/dist/ui/fleet-office-store.js +5 -0
- package/dist/ui/fleet-office.js +173 -6
- package/dist/ui/fleet-task-card.js +10 -6
- package/dist/ui/fleet-task-common.js +12 -2
- package/dist/ui/fleet-task-menu.js +188 -0
- package/dist/ui/fleet-task-stats.js +124 -0
- package/dist/ui/fleet-task-view.js +340 -0
- package/dist/ui/fleet-tasks.js +131 -43
- package/dist/ui/fleet-usage.js +90 -27
- package/dist/ui/html-attachment.js +3 -40
- package/dist/ui/hub-agent-copy.js +23 -0
- package/dist/ui/hub-button-actions.js +65 -0
- package/dist/ui/hub-chat-store.js +158 -0
- package/dist/ui/hub-chat-strings.js +77 -0
- package/dist/ui/hub-client.js +329 -0
- package/dist/ui/hub-owner-strings.js +51 -0
- package/dist/ui/hub-provider-guidance.js +31 -0
- package/dist/ui/hub-quota.js +85 -0
- package/dist/ui/hub-strings.js +162 -0
- package/dist/ui/hub-switcher.js +27 -0
- package/dist/ui/native-pane-recovery.js +1 -1
- package/dist/ui/office-share-page.js +4 -2
- package/dist/ui/panel-chat.js +34 -48
- package/dist/ui/panel-details.js +1 -1
- package/dist/ui/panel-fleet.js +78 -10
- package/dist/ui/panel-hub.js +619 -0
- package/dist/ui/panel-log.js +2 -2
- package/dist/ui/panel-needs.js +24 -8
- package/dist/ui/panel-runtimes.js +114 -23
- package/dist/ui/panel-settings.js +69 -80
- package/dist/ui/panel-windows-cli.js +12 -2
- package/dist/ui/preview-pages.js +1 -1
- package/dist/ui/preview-panel.js +92 -6
- package/dist/ui/preview-versions.js +1 -1
- package/dist/ui/preview.js +3 -476
- package/dist/ui/runtime-commands.d.ts +4 -0
- package/dist/ui/runtime-commands.js +59 -0
- package/dist/ui/search-dialog.js +2 -0
- package/dist/ui/settings-access-strings.js +42 -0
- package/dist/ui/settings-build-version.js +35 -0
- package/dist/ui/settings-codex-copy.js +19 -0
- package/dist/ui/settings-devices.js +253 -0
- package/dist/ui/settings-dialogs.js +28 -7
- package/dist/ui/settings-hub-browser-certificate.js +74 -0
- package/dist/ui/settings-hub-membership.js +72 -0
- package/dist/ui/settings-hub-retention.js +52 -0
- package/dist/ui/settings-hub.js +196 -0
- package/dist/ui/settings-layout.js +8 -11
- package/dist/ui/settings-model.js +16 -2
- package/dist/ui/settings-outside.js +104 -38
- package/dist/ui/settings-registry.js +4 -1
- package/dist/ui/settings-shared-strings.js +143 -0
- package/dist/ui/settings-shared.js +345 -0
- package/dist/ui/settings-strings.js +10 -46
- package/dist/ui/settings-web-authority.js +5 -2
- package/dist/ui/shared/accounts.css +15 -0
- package/dist/ui/shared/app-i18n.js +2 -2
- package/dist/ui/shared/app-needs.js +1 -1
- package/dist/ui/shared/app-route.js +6 -1
- package/dist/ui/shared/app-session.js +6 -2
- package/dist/ui/shared/app-shell.js +64 -8
- package/dist/ui/shared/app.css +121 -30
- package/dist/ui/shared/app.js +12 -3
- package/dist/ui/shared/chat-composer.js +68 -0
- package/dist/ui/shared/chat-md-strings.js +9 -0
- package/dist/ui/shared/chat-render.js +682 -0
- package/dist/ui/shared/chat-strings.js +333 -0
- package/dist/ui/shared/chat-thread.js +969 -0
- package/dist/ui/shared/chat-time.js +80 -0
- package/dist/ui/shared/header-tools.js +3 -5
- package/dist/ui/shared/html-attachment.js +42 -0
- package/dist/ui/shared/hub-chat.css +85 -0
- package/dist/ui/shared/hub-owner.css +33 -0
- package/dist/ui/shared/hub-quota.css +8 -0
- package/dist/ui/shared/hub.css +71 -0
- package/dist/ui/shared/page-head.js +8 -0
- package/dist/ui/shared/panel-view.js +77 -4
- package/dist/ui/shared/preview.js +476 -0
- package/dist/ui/shared/runtime-install.css +26 -0
- package/dist/ui/shared/side-rail.js +15 -0
- package/dist/ui/shared/signin.js +172 -0
- package/dist/ui/shared/task-board.css +95 -0
- package/dist/ui/shared/usage-dialog.js +18 -1
- package/dist/ui/shared/view-history.css +17 -0
- package/dist/ui/shared/view-history.js +438 -0
- package/dist/ui/shared/view-strings.js +16 -0
- package/dist/ui/shared/workspace.css +20 -0
- package/dist/ui/signin.html +21 -0
- package/dist/ui/workspace-panel.js +189 -0
- package/dist/ui/workspace-strings.js +35 -0
- package/dist/unattended-install.d.ts +11 -2
- package/dist/unattended-install.js +41 -6
- package/dist/unattended-install.js.map +1 -1
- package/dist/usage/capacity.d.ts +69 -0
- package/dist/usage/capacity.js +119 -0
- package/dist/usage/capacity.js.map +1 -0
- package/dist/usage/i18n-keys.d.ts +1 -1
- package/dist/usage/i18n-keys.js +3 -0
- package/dist/usage/i18n-keys.js.map +1 -1
- package/dist/usage/profile-timeline.d.ts +16 -0
- package/dist/usage/profile-timeline.js +58 -0
- package/dist/usage/profile-timeline.js.map +1 -0
- package/dist/usage/providers.js +2 -1
- package/dist/usage/providers.js.map +1 -1
- package/dist/usage/quota-history.d.ts +43 -0
- package/dist/usage/quota-history.js +168 -0
- package/dist/usage/quota-history.js.map +1 -0
- package/dist/usage/usage-api.d.ts +31 -0
- package/dist/usage/usage-api.js +80 -1
- package/dist/usage/usage-api.js.map +1 -1
- package/dist/usage-report.d.ts +25 -1
- package/dist/usage-report.js +55 -4
- package/dist/usage-report.js.map +1 -1
- package/dist/usage-rollup.d.ts +6 -1
- package/dist/usage-rollup.js +16 -4
- package/dist/usage-rollup.js.map +1 -1
- package/dist/view-api.d.ts +16 -0
- package/dist/view-api.js +105 -23
- package/dist/view-api.js.map +1 -1
- package/dist/view-history.d.ts +84 -0
- package/dist/view-history.js +116 -0
- package/dist/view-history.js.map +1 -0
- package/dist/web-api.d.ts +48 -2
- package/dist/web-api.js +276 -8
- package/dist/web-api.js.map +1 -1
- package/dist/web-backend-login.d.ts +23 -1
- package/dist/web-backend-login.js +11 -17
- package/dist/web-backend-login.js.map +1 -1
- package/dist/web-device-login.d.ts +153 -0
- package/dist/web-device-login.js +278 -0
- package/dist/web-device-login.js.map +1 -0
- package/dist/web-office-skins.d.ts +9 -0
- package/dist/web-office-skins.js +16 -1
- package/dist/web-office-skins.js.map +1 -1
- package/dist/web-session-authorization.d.ts +13 -2
- package/dist/web-session-authorization.js +10 -3
- package/dist/web-session-authorization.js.map +1 -1
- package/dist/web-session.d.ts +35 -0
- package/dist/web-session.js +7 -0
- package/dist/web-session.js.map +1 -1
- package/dist/web-settings-patch.d.ts +3 -1
- package/dist/web-settings-patch.js +4 -1
- package/dist/web-settings-patch.js.map +1 -1
- package/dist/web-shell-routes.d.ts +6 -0
- package/dist/web-shell-routes.js +7 -0
- package/dist/web-shell-routes.js.map +1 -1
- package/dist/web-terminal.d.ts +4 -30
- package/dist/web-terminal.js +9 -6
- package/dist/web-terminal.js.map +1 -1
- package/dist/windows-agents.d.ts +1 -0
- package/dist/windows-agents.js +1 -0
- package/dist/windows-agents.js.map +1 -1
- package/dist/windows-cli-api.d.ts +12 -1
- package/dist/windows-cli-api.js +27 -1
- package/dist/windows-cli-api.js.map +1 -1
- package/dist/windows-cli-providers.d.ts +0 -9
- package/dist/windows-cli-providers.js +4 -9
- package/dist/windows-cli-providers.js.map +1 -1
- package/dist/windows-cli-worker.d.ts +24 -0
- package/dist/windows-cli-worker.js +96 -5
- package/dist/windows-cli-worker.js.map +1 -1
- package/dist/windows-cli.d.ts +10 -0
- package/dist/windows-cli.js +10 -1
- package/dist/windows-cli.js.map +1 -1
- package/dist/yaml-shared-nodes.js +8 -3
- package/dist/yaml-shared-nodes.js.map +1 -1
- package/launcher/agend-install.cjs +8 -1
- package/launcher/launchd-session-type.cjs +14 -0
- package/launcher/postinstall.cjs +27 -2
- package/launcher/private-home.cjs +1 -1
- package/launcher/tmux-bundle.cjs +247 -0
- package/package.json +3 -2
- package/templates/launchd.plist.ejs +3 -1
- package/templates/runtime-install/install.ps1 +270 -0
package/dist/hub/db.js
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S5b (S-51; docs/design/hub-composition.md §3–§4): the Hub's private databases. Opening with private modes from the
|
|
3
|
+
* first byte, the per-slice migration registry, the "created together" set check, the Hub-instance binding, and the
|
|
4
|
+
* unit of work (HubUnitOfWork) with `hubTxDatabase` for slices that run their own statements inside it.
|
|
5
|
+
* Nothing here runs on import; only composition calls it, and only while a Hub switch is on.
|
|
6
|
+
*/
|
|
7
|
+
import Database from "better-sqlite3";
|
|
8
|
+
import { randomUUID } from "node:crypto";
|
|
9
|
+
import { closeSync, existsSync, lstatSync, openSync } from "node:fs";
|
|
10
|
+
import { dirname, join } from "node:path";
|
|
11
|
+
import { ensurePrivateDirectory, privatePath } from "./private-files.js";
|
|
12
|
+
/** Composition's closed set of hold reasons (hub-composition.md §2). Each has fleet text (locale "hub.hold.<code>"). */
|
|
13
|
+
export const HUB_HOLD_CODES = [
|
|
14
|
+
"hub-incomplete",
|
|
15
|
+
"hub-unsealed",
|
|
16
|
+
"hub-state-newer",
|
|
17
|
+
"hub-state-mismatch",
|
|
18
|
+
"hub-storage",
|
|
19
|
+
"hub-directory-secret",
|
|
20
|
+
"hub-member-pairing",
|
|
21
|
+
"hub-provider-unavailable",
|
|
22
|
+
"service-unavailable",
|
|
23
|
+
];
|
|
24
|
+
export class HubStateError extends Error {
|
|
25
|
+
code;
|
|
26
|
+
constructor(code, message) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.code = code;
|
|
29
|
+
this.name = "HubStateError";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** "new" when no member of the set exists, "complete" when all do; anything else is hub-state-mismatch. */
|
|
33
|
+
export function inspectStateSet(home, set) {
|
|
34
|
+
const members = [set.database, ...set.floors, ...set.keys];
|
|
35
|
+
const present = members.filter((rel) => {
|
|
36
|
+
try {
|
|
37
|
+
lstatSync(join(home, rel));
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
if (present.length === 0)
|
|
45
|
+
return "new";
|
|
46
|
+
if (present.length === members.length)
|
|
47
|
+
return "complete";
|
|
48
|
+
const missing = members.filter((m) => !present.includes(m));
|
|
49
|
+
throw new HubStateError("hub-state-mismatch", `Hub state is partial (missing: ${missing.join(", ")}); nothing is recreated`);
|
|
50
|
+
}
|
|
51
|
+
const COMPONENT = /^[a-z0-9][a-z0-9-]{0,63}$/;
|
|
52
|
+
/**
|
|
53
|
+
* Transaction callbacks are synchronous. A thenable result is refused (inside the transaction, so it rolls back), and
|
|
54
|
+
* its eventual settlement is observed so a late rejection is never an unhandled rejection.
|
|
55
|
+
*/
|
|
56
|
+
function requireSynchronous(result, what) {
|
|
57
|
+
if (result && (typeof result === "object" || typeof result === "function") && typeof result.then === "function") {
|
|
58
|
+
try {
|
|
59
|
+
result.then(undefined, () => undefined);
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
/* a hostile thenable: refused below either way */
|
|
63
|
+
}
|
|
64
|
+
throw new Error(`Hub ${what} must be synchronous: no awaits inside it`);
|
|
65
|
+
}
|
|
66
|
+
return result;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Open (or, with `create`, first create) a private SQLite database at `rel` under `home`. The file is created 0600
|
|
70
|
+
* before SQLite touches it; its directory is a private, owned, non-symlink chain (S1's privatePath). WAL/SHM files are
|
|
71
|
+
* checked to be private after the journal mode is set.
|
|
72
|
+
*/
|
|
73
|
+
export function openHubDatabase(home, rel, options) {
|
|
74
|
+
let db;
|
|
75
|
+
try {
|
|
76
|
+
ensurePrivateDirectory(home, dirname(rel).replaceAll("\\", "/"));
|
|
77
|
+
const path = join(home, rel);
|
|
78
|
+
if (options.create) {
|
|
79
|
+
closeSync(openSync(path, "wx", 0o600));
|
|
80
|
+
}
|
|
81
|
+
else if (!existsSync(path)) {
|
|
82
|
+
throw new HubStateError("hub-state-mismatch", "the Hub database is missing");
|
|
83
|
+
}
|
|
84
|
+
privatePath(home, rel);
|
|
85
|
+
db = new Database(path, { fileMustExist: true });
|
|
86
|
+
db.pragma("journal_mode = WAL");
|
|
87
|
+
db.pragma("foreign_keys = ON");
|
|
88
|
+
db.pragma("busy_timeout = 5000");
|
|
89
|
+
db.pragma("secure_delete = ON");
|
|
90
|
+
db.pragma("synchronous = FULL");
|
|
91
|
+
for (const suffix of ["-wal", "-shm"]) {
|
|
92
|
+
if (existsSync(path + suffix))
|
|
93
|
+
privatePath(home, rel + suffix);
|
|
94
|
+
}
|
|
95
|
+
return db;
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
db?.close();
|
|
99
|
+
if (err instanceof HubStateError)
|
|
100
|
+
throw err;
|
|
101
|
+
throw new HubStateError("hub-storage", `the Hub database could not be opened privately: ${err.message}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Apply every slice's migrations in one immediate transaction. A component stored with a higher version than this
|
|
106
|
+
* build knows, or a component this build does not know at all, means a newer build wrote the database: refuse.
|
|
107
|
+
*/
|
|
108
|
+
export function applyHubMigrations(db, migrations) {
|
|
109
|
+
const seen = new Set();
|
|
110
|
+
for (const m of migrations) {
|
|
111
|
+
if (!COMPONENT.test(m.component) || !Number.isSafeInteger(m.version) || m.version < 1 || typeof m.up !== "function") {
|
|
112
|
+
throw new HubStateError("hub-storage", `invalid Hub migration ${String(m.component)}`);
|
|
113
|
+
}
|
|
114
|
+
if (seen.has(m.component))
|
|
115
|
+
throw new HubStateError("hub-storage", `duplicate Hub migration ${m.component}`);
|
|
116
|
+
seen.add(m.component);
|
|
117
|
+
}
|
|
118
|
+
db.transaction(() => {
|
|
119
|
+
db.exec("CREATE TABLE IF NOT EXISTS hub_schema (component TEXT PRIMARY KEY, version INTEGER NOT NULL)");
|
|
120
|
+
const stored = new Map(db.prepare("SELECT component, version FROM hub_schema").all().map((r) => [r.component, r.version]));
|
|
121
|
+
for (const [component, version] of stored) {
|
|
122
|
+
if (!seen.has(component))
|
|
123
|
+
throw new HubStateError("hub-state-newer", `the Hub database has "${component}" (v${version}), which this version does not know`);
|
|
124
|
+
}
|
|
125
|
+
for (const m of migrations) {
|
|
126
|
+
const current = stored.get(m.component);
|
|
127
|
+
if (current !== undefined && current > m.version) {
|
|
128
|
+
throw new HubStateError("hub-state-newer", `the Hub database has ${m.component} v${current}; this version knows v${m.version}`);
|
|
129
|
+
}
|
|
130
|
+
if (current === m.version)
|
|
131
|
+
continue;
|
|
132
|
+
requireSynchronous(m.up(db), `migration ${m.component}`);
|
|
133
|
+
db.prepare("INSERT INTO hub_schema(component, version) VALUES(?, ?) ON CONFLICT(component) DO UPDATE SET version = excluded.version").run(m.component, m.version);
|
|
134
|
+
}
|
|
135
|
+
}).immediate();
|
|
136
|
+
}
|
|
137
|
+
/** The database's Hub (or member's Hub) id: written once at creation, compared on every open. */
|
|
138
|
+
export const HUB_INSTANCE_MIGRATION = Object.freeze({
|
|
139
|
+
component: "s5-instance",
|
|
140
|
+
version: 1,
|
|
141
|
+
up(db) {
|
|
142
|
+
db.exec("CREATE TABLE IF NOT EXISTS hub_instance (singleton INTEGER PRIMARY KEY CHECK(singleton = 1), hub_id TEXT NOT NULL, created_at INTEGER NOT NULL)");
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
export function bindHubInstance(db, hubId, mode, now) {
|
|
146
|
+
const row = db.prepare("SELECT hub_id FROM hub_instance WHERE singleton = 1").get();
|
|
147
|
+
if (mode === "new") {
|
|
148
|
+
if (row)
|
|
149
|
+
throw new HubStateError("hub-state-mismatch", "a new Hub database already has an owner");
|
|
150
|
+
db.prepare("INSERT INTO hub_instance(singleton, hub_id, created_at) VALUES(1, ?, ?)").run(hubId, now);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
if (!row)
|
|
154
|
+
throw new HubStateError("hub-state-mismatch", "the Hub database does not say which Hub it belongs to");
|
|
155
|
+
if (row.hub_id !== hubId)
|
|
156
|
+
throw new HubStateError("hub-state-mismatch", "the Hub database belongs to another Hub");
|
|
157
|
+
}
|
|
158
|
+
/** Live transactions: a token maps to its database only while its `atomic` callback runs. */
|
|
159
|
+
const liveTx = new WeakMap();
|
|
160
|
+
/**
|
|
161
|
+
* The database behind a live transaction, for a slice's own statements (S3's repositories). Throws once the
|
|
162
|
+
* transaction has committed or rolled back, so a leaked handle cannot write outside a transaction.
|
|
163
|
+
*/
|
|
164
|
+
export function hubTxDatabase(tx) {
|
|
165
|
+
const db = liveTx.get(tx);
|
|
166
|
+
if (!db || !db.inTransaction)
|
|
167
|
+
throw new Error("Hub transaction is not active");
|
|
168
|
+
return db;
|
|
169
|
+
}
|
|
170
|
+
/** HubUnitOfWork over one database: immediate transactions; nested calls are savepoints; async work is refused. */
|
|
171
|
+
export function createHubUnitOfWork(db) {
|
|
172
|
+
return {
|
|
173
|
+
atomic(work) {
|
|
174
|
+
const run = db.transaction(() => {
|
|
175
|
+
const tx = Object.freeze({ id: randomUUID() });
|
|
176
|
+
liveTx.set(tx, db);
|
|
177
|
+
try {
|
|
178
|
+
return requireSynchronous(work(tx), "transaction (atomic)");
|
|
179
|
+
}
|
|
180
|
+
finally {
|
|
181
|
+
liveTx.delete(tx);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
return db.inTransaction ? run() : run.immediate();
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/hub/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type DirectoryProfile = "ad" | "openldap";
|
|
2
|
+
export interface HubDirectoryConfig {
|
|
3
|
+
/** A short, stable name for this directory; it is the first half of every person key. */
|
|
4
|
+
realm: string;
|
|
5
|
+
/** ldaps://host[:port]. Nothing else: ldap:// (even with StartTLS) is refused. */
|
|
6
|
+
url: string;
|
|
7
|
+
/** PEM text of the CA(s) that issued the directory's certificate. Omitted: Node's built-in roots. */
|
|
8
|
+
caPem?: string;
|
|
9
|
+
/** Where people are searched for. */
|
|
10
|
+
baseDn: string;
|
|
11
|
+
/** The read-only service account the Hub searches with. Its password is passed separately as a secret. */
|
|
12
|
+
bindDn: string;
|
|
13
|
+
/** A reference to the service account's password in the Hub's secret store; resolved by the caller (S5), never here. */
|
|
14
|
+
bindPasswordRef?: string;
|
|
15
|
+
profile: DirectoryProfile;
|
|
16
|
+
/** Defaults per profile: sAMAccountName (ad), uid (openldap). */
|
|
17
|
+
loginAttribute?: string;
|
|
18
|
+
/** An extra RFC 4515 filter ANDed with the login match, e.g. "(objectClass=person)". */
|
|
19
|
+
userFilter?: string;
|
|
20
|
+
/** Per-operation and connect timeout, 500–30000 ms (default 5000). */
|
|
21
|
+
timeoutMs?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface ResolvedDirectoryConfig {
|
|
24
|
+
readonly realm: string;
|
|
25
|
+
readonly host: string;
|
|
26
|
+
readonly port: number;
|
|
27
|
+
readonly url: string;
|
|
28
|
+
readonly caPem?: string;
|
|
29
|
+
readonly baseDn: string;
|
|
30
|
+
readonly bindDn: string;
|
|
31
|
+
readonly profile: DirectoryProfile;
|
|
32
|
+
readonly loginAttribute: string;
|
|
33
|
+
readonly userFilter: string;
|
|
34
|
+
readonly timeoutMs: number;
|
|
35
|
+
}
|
|
36
|
+
export declare class HubDirectoryConfigError extends Error {
|
|
37
|
+
constructor(message: string);
|
|
38
|
+
}
|
|
39
|
+
export declare function resolveDirectoryConfig(input: unknown): ResolvedDirectoryConfig;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hub directory configuration (`hub.directory`), validated before any connection is made. The checks are the security
|
|
3
|
+
* contract of S-43: credentials only ever travel over verified LDAPS (decision 7e5b8a8f: LDAPS only, so ldap:// and
|
|
4
|
+
* StartTLS are refused), there is no switch to turn certificate verification off, and unknown keys are refused so one
|
|
5
|
+
* cannot be smuggled in.
|
|
6
|
+
*/
|
|
7
|
+
import { isIP } from "node:net";
|
|
8
|
+
export class HubDirectoryConfigError extends Error {
|
|
9
|
+
constructor(message) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.name = "HubDirectoryConfigError";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const KNOWN_KEYS = new Set(["realm", "url", "caPem", "bindPasswordRef", "baseDn", "bindDn", "profile", "loginAttribute", "userFilter", "timeoutMs"]);
|
|
15
|
+
// A stable configured id (never a display name), no slash: it is the first half of "<realm>/<objectId>".
|
|
16
|
+
const REALM = /^[a-z][a-z0-9_-]{0,63}$/;
|
|
17
|
+
const ATTRIBUTE = /^[A-Za-z][A-Za-z0-9-]{0,63}$/;
|
|
18
|
+
// Printable, no NUL/newlines; a DN is checked for shape only, the directory judges the rest.
|
|
19
|
+
const DN = /^[^\u0000-\u001f\u007f]{1,1024}$/;
|
|
20
|
+
const DEFAULT_FILTER = {
|
|
21
|
+
ad: "(&(objectClass=person)(!(objectClass=computer)))",
|
|
22
|
+
openldap: "(objectClass=person)",
|
|
23
|
+
};
|
|
24
|
+
const DEFAULT_LOGIN = { ad: "sAMAccountName", openldap: "uid" };
|
|
25
|
+
function fail(message) {
|
|
26
|
+
throw new HubDirectoryConfigError(message);
|
|
27
|
+
}
|
|
28
|
+
export function resolveDirectoryConfig(input) {
|
|
29
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
30
|
+
fail("hub directory: the configuration must be an object");
|
|
31
|
+
const raw = input;
|
|
32
|
+
for (const key of Object.keys(raw)) {
|
|
33
|
+
if (!KNOWN_KEYS.has(key))
|
|
34
|
+
fail(`hub directory: unknown setting "${key}" (certificate verification cannot be turned off)`);
|
|
35
|
+
}
|
|
36
|
+
const str = (key, required) => {
|
|
37
|
+
const v = raw[key];
|
|
38
|
+
if (v === undefined && !required)
|
|
39
|
+
return undefined;
|
|
40
|
+
if (typeof v !== "string" || v.length === 0)
|
|
41
|
+
fail(`hub directory: "${key}" must be a non-empty string`);
|
|
42
|
+
return v;
|
|
43
|
+
};
|
|
44
|
+
const realm = str("realm", true);
|
|
45
|
+
if (!REALM.test(realm))
|
|
46
|
+
fail('hub directory: "realm" must be a lowercase id: a letter, then letters, digits, "_" or "-" (64 at most)');
|
|
47
|
+
const profile = str("profile", true);
|
|
48
|
+
if (profile !== "ad" && profile !== "openldap")
|
|
49
|
+
fail('hub directory: "profile" must be "ad" or "openldap"');
|
|
50
|
+
const urlText = str("url", true);
|
|
51
|
+
let url;
|
|
52
|
+
try {
|
|
53
|
+
url = new URL(urlText);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
fail('hub directory: "url" is not a URL');
|
|
57
|
+
}
|
|
58
|
+
if (url.username || url.password)
|
|
59
|
+
fail('hub directory: "url" must not carry credentials');
|
|
60
|
+
if ((url.pathname && url.pathname !== "/") || url.search || url.hash)
|
|
61
|
+
fail('hub directory: "url" must be scheme://host[:port] only');
|
|
62
|
+
const host = url.hostname.replace(/^\[(.*)\]$/, "$1");
|
|
63
|
+
if (!host)
|
|
64
|
+
fail('hub directory: "url" has no host');
|
|
65
|
+
// LDAPS only (decision 7e5b8a8f). ldap:// is plaintext until upgraded, and StartTLS is not offered as a mode in P1.
|
|
66
|
+
if (url.protocol === "ldap:")
|
|
67
|
+
fail("hub directory: ldap:// is plaintext and is not supported; use ldaps://");
|
|
68
|
+
if (url.protocol !== "ldaps:")
|
|
69
|
+
fail('hub directory: "url" must start with ldaps://');
|
|
70
|
+
const port = url.port ? Number(url.port) : 636;
|
|
71
|
+
const caPem = str("caPem", false);
|
|
72
|
+
if (caPem !== undefined && !/-----BEGIN CERTIFICATE-----/.test(caPem))
|
|
73
|
+
fail('hub directory: "caPem" must hold PEM certificate text');
|
|
74
|
+
if (raw.bindPasswordRef !== undefined)
|
|
75
|
+
str("bindPasswordRef", false);
|
|
76
|
+
const baseDn = str("baseDn", true);
|
|
77
|
+
const bindDn = str("bindDn", true);
|
|
78
|
+
if (!DN.test(baseDn))
|
|
79
|
+
fail('hub directory: "baseDn" has control characters or is too long');
|
|
80
|
+
if (!DN.test(bindDn))
|
|
81
|
+
fail('hub directory: "bindDn" has control characters or is too long');
|
|
82
|
+
const loginAttribute = str("loginAttribute", false) ?? DEFAULT_LOGIN[profile];
|
|
83
|
+
if (!ATTRIBUTE.test(loginAttribute))
|
|
84
|
+
fail('hub directory: "loginAttribute" must be an attribute name');
|
|
85
|
+
const extra = str("userFilter", false);
|
|
86
|
+
if (extra !== undefined && !/^\(.*\)$/s.test(extra))
|
|
87
|
+
fail('hub directory: "userFilter" must be a parenthesised LDAP filter');
|
|
88
|
+
const userFilter = extra ?? DEFAULT_FILTER[profile];
|
|
89
|
+
const timeoutRaw = raw.timeoutMs;
|
|
90
|
+
if (timeoutRaw !== undefined && (typeof timeoutRaw !== "number" || !Number.isInteger(timeoutRaw) || timeoutRaw < 500 || timeoutRaw > 30_000)) {
|
|
91
|
+
fail('hub directory: "timeoutMs" must be a whole number from 500 to 30000');
|
|
92
|
+
}
|
|
93
|
+
const timeoutMs = timeoutRaw ?? 5000;
|
|
94
|
+
return Object.freeze({
|
|
95
|
+
realm,
|
|
96
|
+
host,
|
|
97
|
+
port,
|
|
98
|
+
url: `ldaps://${isIP(host) === 6 ? `[${host}]` : host}:${port}`,
|
|
99
|
+
...(caPem !== undefined ? { caPem } : {}),
|
|
100
|
+
baseDn,
|
|
101
|
+
bindDn,
|
|
102
|
+
profile,
|
|
103
|
+
loginAttribute,
|
|
104
|
+
userFilter,
|
|
105
|
+
timeoutMs,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/hub/directory/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { HubDirectory } from "./types.js";
|
|
2
|
+
export interface HubDirectorySecrets {
|
|
3
|
+
/** The service account's password (resolved by the caller from the Hub's secret store). */
|
|
4
|
+
readonly bindPassword: string;
|
|
5
|
+
}
|
|
6
|
+
export interface HubDirectoryDiagnostic {
|
|
7
|
+
readonly op: "sign-in" | "eligibility" | "initialization-lookup";
|
|
8
|
+
readonly outcome: string;
|
|
9
|
+
/** The underlying error's message, for the technical log. Never contains a password. */
|
|
10
|
+
readonly error?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface HubDirectoryOptions {
|
|
13
|
+
/** Called once per refused or failed operation. */
|
|
14
|
+
readonly onDiagnostic?: (event: HubDirectoryDiagnostic) => void;
|
|
15
|
+
/** Test seam for expiry checks. */
|
|
16
|
+
readonly now?: () => number;
|
|
17
|
+
}
|
|
18
|
+
export declare function createHubDirectory(config: unknown, secrets: HubDirectorySecrets, options?: HubDirectoryOptions): HubDirectory;
|