@songsid/agend 2.3.5-alpha.3 → 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-api.d.ts +4 -0
- package/dist/agent-runtime-api.js +59 -0
- package/dist/agent-runtime-api.js.map +1 -0
- package/dist/agent-runtime-change.d.ts +76 -0
- package/dist/agent-runtime-change.js +114 -0
- package/dist/agent-runtime-change.js.map +1 -0
- 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 +168 -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 +7 -0
- package/dist/backend/codex-footer-hints.js +41 -0
- package/dist/backend/codex-footer-hints.js.map +1 -0
- 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 +85 -24
- 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 +362 -7
- package/dist/fleet-manager.js +1522 -91
- package/dist/fleet-manager.js.map +1 -1
- package/dist/fleet-windows-runtime.d.ts +8 -2
- package/dist/fleet-windows-runtime.js +93 -6
- 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 +3 -3
- 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/public-web-link.d.ts +6 -0
- package/dist/public-web-link.js +9 -0
- package/dist/public-web-link.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 +106 -13
- package/dist/runtime-api.js.map +1 -1
- package/dist/runtime-build-info.d.ts +9 -0
- package/dist/runtime-build-info.js +59 -0
- package/dist/runtime-build-info.js.map +1 -0
- package/dist/runtime-bundle.d.ts +6 -1
- package/dist/runtime-bundle.js +17 -9
- package/dist/runtime-bundle.js.map +1 -1
- package/dist/runtime-cli.d.ts +13 -1
- package/dist/runtime-cli.js +173 -19
- package/dist/runtime-cli.js.map +1 -1
- package/dist/runtime-client-store.d.ts +27 -1
- package/dist/runtime-client-store.js +86 -6
- package/dist/runtime-client-store.js.map +1 -1
- package/dist/runtime-client.d.ts +74 -0
- package/dist/runtime-client.js +336 -26
- package/dist/runtime-client.js.map +1 -1
- package/dist/runtime-connection.d.ts +22 -0
- package/dist/runtime-connection.js +93 -0
- package/dist/runtime-connection.js.map +1 -0
- package/dist/runtime-coordinator.d.ts +16 -0
- package/dist/runtime-coordinator.js +287 -62
- 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-boot.d.ts +7 -0
- package/dist/runtime-pane-boot.js +23 -0
- package/dist/runtime-pane-boot.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 +30 -2
- package/dist/runtime-protocol.js +30 -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 +98 -1
- package/dist/settings-effect.js.map +1 -1
- package/dist/settings-http-confirmation.d.ts +3 -0
- package/dist/settings-http-confirmation.js +28 -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 +68 -0
- package/dist/ui/agent-runtime.js +20 -2
- package/dist/ui/backend-signin.js +39 -21
- 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-instance-settings.js +5 -8
- package/dist/ui/native-pane-recovery.js +1 -1
- package/dist/ui/office-share-page.js +4 -2
- package/dist/ui/panel-chat.js +36 -49
- package/dist/ui/panel-details.js +1 -1
- package/dist/ui/panel-fleet.js +82 -12
- 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 +239 -45
- package/dist/ui/panel-settings.js +266 -192
- package/dist/ui/panel-windows-cli.js +88 -42
- 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-agent-filters.js +94 -0
- package/dist/ui/settings-appearance.js +122 -23
- 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 +33 -12
- package/dist/ui/settings-guests.js +25 -11
- 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 +242 -0
- package/dist/ui/settings-model.js +24 -2
- package/dist/ui/settings-outside.js +104 -38
- package/dist/ui/settings-registry.js +9 -4
- package/dist/ui/settings-shared-strings.js +143 -0
- package/dist/ui/settings-shared.js +345 -0
- package/dist/ui/settings-shortcuts.js +65 -0
- package/dist/ui/settings-strings.js +89 -32
- package/dist/ui/settings-web-authority.js +17 -11
- 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 +81 -15
- package/dist/ui/shared/app.css +1114 -13
- 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/instance-nav.js +3 -2
- package/dist/ui/shared/machine-name.js +13 -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/settings-width.js +31 -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/tokens.css +1 -0
- package/dist/ui/shared/ui-dialog.js +2 -2
- package/dist/ui/shared/ui-menu.js +3 -3
- 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/windows-cli-catalog.js +41 -12
- 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 +49 -2
- package/dist/web-api.js +279 -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 +4 -1
- package/dist/windows-agents.js +14 -10
- package/dist/windows-agents.js.map +1 -1
- package/dist/windows-cli-api.d.ts +12 -1
- package/dist/windows-cli-api.js +29 -2
- 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 +25 -0
- package/dist/windows-cli-worker.js +98 -7
- package/dist/windows-cli-worker.js.map +1 -1
- package/dist/windows-cli.d.ts +11 -0
- package/dist/windows-cli.js +17 -3
- 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
|
@@ -0,0 +1,528 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hub P1 representative agent (docs/design/hub-representative-agent.md): the member's only execution path. An admitted
|
|
3
|
+
* Hub question goes to the existing fleet agent the owner published, through ordinary cross-instance delivery; the
|
|
4
|
+
* agent answers with report_result on the Hub-issued correlation id. No sandbox, provider, view or per-asker session.
|
|
5
|
+
*
|
|
6
|
+
* The adapter is S1's journal outbox (the source row is written in the journal's own admission transaction) and the
|
|
7
|
+
* driver after it: begin lease + input intent immediately before the IPC hand-off (FleetManager's beforeInput), delivery
|
|
8
|
+
* evidence, the frozen answer under the exact release lease, and the receipts/answer frames back over the member link.
|
|
9
|
+
* Never a resend: an interrupted or uncertain hand-off holds in Needs-you.
|
|
10
|
+
*/
|
|
11
|
+
import { randomUUID } from "node:crypto";
|
|
12
|
+
import { canonicalArguments, messageContentDigest, personKeyString } from "./identity.js";
|
|
13
|
+
import { HubFileRefusal } from "./member/attachments.js";
|
|
14
|
+
import { questionContextDigest } from "./member-journal.js";
|
|
15
|
+
import { answerSchema, questionSchema } from "./protocol.js";
|
|
16
|
+
import { buttonsDigest, prepareHubAnswerButtons } from "./buttons-model.js";
|
|
17
|
+
import { HubProtocolError, plain, validated } from "./validation.js";
|
|
18
|
+
/** The S3 agent tuple (one copy, S3c's): routing, readiness and the store can never disagree. */
|
|
19
|
+
export { HUB_AGENT_MODE as HUB_AGENT_PROVIDER, agentPolicyDigest, isAgentDescriptor as isAgentTuple } from "./member/agent-mode.js";
|
|
20
|
+
import { isAgentDescriptor as isAgentTuple } from "./member/agent-mode.js";
|
|
21
|
+
/** The reserved report_result target for Hub answers. Only a live Hub-issued correlation id from its agent matches. */
|
|
22
|
+
export { HUB_REPORT_TARGET } from "../hub-report-target.js";
|
|
23
|
+
import { HUB_REPORT_TARGET } from "../hub-report-target.js";
|
|
24
|
+
export const HUB_ANSWER_MAX = 128 * 1024;
|
|
25
|
+
const HELD_MAX = 256;
|
|
26
|
+
class HubButtonRefusal extends Error {
|
|
27
|
+
}
|
|
28
|
+
export function migrateHubRepresentative(db) {
|
|
29
|
+
db.exec(`CREATE TABLE IF NOT EXISTS hub_representative_questions(
|
|
30
|
+
source TEXT PRIMARY KEY, id TEXT NOT NULL UNIQUE, message_id TEXT NOT NULL UNIQUE, digest TEXT NOT NULL,
|
|
31
|
+
exposure_id TEXT NOT NULL, revision INTEGER NOT NULL, consent_id TEXT NOT NULL, agent TEXT NOT NULL, token TEXT NOT NULL,
|
|
32
|
+
state TEXT NOT NULL, cid TEXT UNIQUE, answer TEXT, reason TEXT, at INTEGER NOT NULL);
|
|
33
|
+
CREATE TABLE IF NOT EXISTS hub_representative_consents(consent_id TEXT PRIMARY KEY, agent TEXT NOT NULL, token TEXT NOT NULL);`);
|
|
34
|
+
}
|
|
35
|
+
export const HUB_REPRESENTATIVE_MIGRATION = Object.freeze({ component: "s5-representative", version: 1, up: migrateHubRepresentative });
|
|
36
|
+
const LIVE = ["queued", "dispatching", "input", "delivered", "answering"];
|
|
37
|
+
/** A saved answer whose transmission or acknowledgement failed is held too (visible), never resent. */
|
|
38
|
+
const HOLDABLE = [...LIVE, "answered"];
|
|
39
|
+
export class HubRepresentativeExecution {
|
|
40
|
+
options;
|
|
41
|
+
closed = false;
|
|
42
|
+
recovered = false;
|
|
43
|
+
running = new Set();
|
|
44
|
+
receiptsTail = Promise.resolve();
|
|
45
|
+
constructor(options) {
|
|
46
|
+
this.options = options;
|
|
47
|
+
}
|
|
48
|
+
now() { return this.options.now?.() ?? Date.now(); }
|
|
49
|
+
row(where, value) {
|
|
50
|
+
return this.options.db.prepare(`SELECT * FROM hub_representative_questions WHERE ${where}=?`).get(value) ?? null;
|
|
51
|
+
}
|
|
52
|
+
setState(row, state, from, extra = {}) {
|
|
53
|
+
const db = this.options.db;
|
|
54
|
+
const result = db.prepare(`UPDATE hub_representative_questions SET state=?, at=?${extra.reason !== undefined ? ", reason=@reason" : ""}${extra.cid !== undefined ? ", cid=@cid" : ""}${extra.answer !== undefined ? ", answer=@answer" : ""}
|
|
55
|
+
WHERE id=@id AND state IN (${from.map(s => `'${s}'`).join(",")})`)
|
|
56
|
+
.run(state, this.now(), { id: row.id, ...(extra.reason !== undefined ? { reason: extra.reason } : {}), ...(extra.cid !== undefined ? { cid: extra.cid } : {}), ...(extra.answer !== undefined ? { answer: extra.answer } : {}) });
|
|
57
|
+
if (result.changes !== 1)
|
|
58
|
+
return false;
|
|
59
|
+
row.state = state;
|
|
60
|
+
if (extra.cid !== undefined)
|
|
61
|
+
row.cid = extra.cid;
|
|
62
|
+
if (extra.reason !== undefined)
|
|
63
|
+
row.reason = extra.reason;
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
/** The exposure, consent and agent lifecycle the question was admitted under — all still exactly current. */
|
|
67
|
+
currentFor(row) {
|
|
68
|
+
if (this.closed)
|
|
69
|
+
return false;
|
|
70
|
+
const b = this.options.binding();
|
|
71
|
+
if (!b.current())
|
|
72
|
+
return false;
|
|
73
|
+
const local = this.options.localExposure(row.exposure_id);
|
|
74
|
+
if (!local || local.exposure.state !== "published" || local.exposure.revision !== row.revision || local.consentId !== row.consent_id
|
|
75
|
+
|| local.agent !== row.agent || !isAgentTuple(local) || local.exposure.fleetId !== b.fleetId || personKeyString(local.exposure.owner) !== personKeyString(b.owner))
|
|
76
|
+
return false;
|
|
77
|
+
return this.consentToken(row.consent_id) === row.token && this.options.agentToken(row.agent) === row.token;
|
|
78
|
+
}
|
|
79
|
+
consentToken(consentId) {
|
|
80
|
+
return this.options.db.prepare("SELECT token FROM hub_representative_consents WHERE consent_id=?").get(consentId)?.token ?? null;
|
|
81
|
+
}
|
|
82
|
+
fenceOf(row) {
|
|
83
|
+
const b = this.options.binding();
|
|
84
|
+
return { current: () => b.current() && this.currentFor(row), linkEpoch: b.linkEpoch, revocationVersion: b.revocationVersion };
|
|
85
|
+
}
|
|
86
|
+
/** Readiness for a published mapping: the agent tuple, this owner/fleet, the agent deliverable now. */
|
|
87
|
+
readiness(exposureId, expectedRevision) {
|
|
88
|
+
const local = this.options.localExposure(exposureId);
|
|
89
|
+
if (!local || local.exposure.state !== "published" || local.exposure.revision !== expectedRevision)
|
|
90
|
+
return { ok: false, reasonCode: "stale" };
|
|
91
|
+
return this.ready(local);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Capability check for a candidate. S3c asks it again inside the atomic publish transaction: there (only), the agent's
|
|
95
|
+
* current lifecycle token is recorded against the candidate's consent id, so a later replacement, retarget or mode
|
|
96
|
+
* change no longer matches it and needs an explicit republish.
|
|
97
|
+
*/
|
|
98
|
+
readinessCandidate(candidate) {
|
|
99
|
+
if (candidate.exposure.state !== "withdrawn")
|
|
100
|
+
return { ok: false, reasonCode: "policy-unavailable" };
|
|
101
|
+
const ready = this.ready(candidate);
|
|
102
|
+
if (ready.ok && this.options.db.inTransaction) {
|
|
103
|
+
this.options.db.prepare("INSERT INTO hub_representative_consents VALUES(?,?,?) ON CONFLICT(consent_id) DO UPDATE SET agent=excluded.agent, token=excluded.token")
|
|
104
|
+
.run(candidate.consentId, candidate.agent, this.options.agentToken(candidate.agent));
|
|
105
|
+
}
|
|
106
|
+
return ready;
|
|
107
|
+
}
|
|
108
|
+
ready(local) {
|
|
109
|
+
if (!isAgentTuple(local))
|
|
110
|
+
return { ok: false, reasonCode: "policy-unavailable" };
|
|
111
|
+
const b = this.options.binding();
|
|
112
|
+
if (local.exposure.fleetId !== b.fleetId || personKeyString(local.exposure.owner) !== personKeyString(b.owner))
|
|
113
|
+
return { ok: false, reasonCode: "stale" };
|
|
114
|
+
if (this.options.agentToken(local.agent) === null)
|
|
115
|
+
return { ok: false, reasonCode: "provider-unavailable" };
|
|
116
|
+
return { ok: true, policyDigest: local.exposure.policyDigest, exposureRevision: local.exposure.revision };
|
|
117
|
+
}
|
|
118
|
+
/** No provider exists in P1: nothing to explain. */
|
|
119
|
+
providerReason() { return null; }
|
|
120
|
+
/** S1's journal outbox: the unique source row, in the journal's own admission transaction. */
|
|
121
|
+
restrictedOutbox() {
|
|
122
|
+
const db = this.options.db;
|
|
123
|
+
const checkSource = (q, source) => {
|
|
124
|
+
if (source !== `hub:${q.identity.issuer}:${q.identity.messageId}`)
|
|
125
|
+
throw new HubProtocolError("denied");
|
|
126
|
+
};
|
|
127
|
+
return {
|
|
128
|
+
insert: (tx, question, source) => {
|
|
129
|
+
if (this.closed || !this.recovered)
|
|
130
|
+
throw new HubProtocolError("unavailable");
|
|
131
|
+
if (tx !== db || !db.inTransaction)
|
|
132
|
+
throw new HubProtocolError("denied");
|
|
133
|
+
const q = validated(questionSchema, question);
|
|
134
|
+
checkSource(q, source);
|
|
135
|
+
const local = this.options.localExposure(q.identity.exposureId);
|
|
136
|
+
if (!local || local.exposure.state !== "published" || local.exposure.revision !== q.identity.exposureRevision || !isAgentTuple(local))
|
|
137
|
+
throw new HubProtocolError("denied");
|
|
138
|
+
const token = this.options.agentToken(local.agent);
|
|
139
|
+
if (token === null || this.consentToken(local.consentId) !== token)
|
|
140
|
+
throw new HubProtocolError("denied");
|
|
141
|
+
if (db.prepare("SELECT COUNT(*) AS n FROM hub_representative_questions WHERE state IN ('queued','dispatching','input','delivered','answering')").get().n >= 4096) {
|
|
142
|
+
throw new HubProtocolError("backpressure");
|
|
143
|
+
}
|
|
144
|
+
const id = randomUUID();
|
|
145
|
+
db.prepare("INSERT INTO hub_representative_questions(source,id,message_id,digest,exposure_id,revision,consent_id,agent,token,state,at) VALUES(?,?,?,?,?,?,?,?,?,'queued',?)")
|
|
146
|
+
.run(source, id, q.identity.messageId, questionContextDigest(q), local.exposure.id, local.exposure.revision, local.consentId, local.agent, token, this.now());
|
|
147
|
+
this.options.audit({ action: "representative.queued", result: "completed", messageId: q.identity.messageId, exposureId: local.exposure.id }, db);
|
|
148
|
+
// Delivery starts only after the admission transaction commits (a rolled-back insert leaves no row to find).
|
|
149
|
+
setImmediate(() => this.pump());
|
|
150
|
+
return id;
|
|
151
|
+
},
|
|
152
|
+
lookup: (tx, question, source) => {
|
|
153
|
+
if (tx !== db)
|
|
154
|
+
throw new HubProtocolError("denied");
|
|
155
|
+
checkSource(question, source);
|
|
156
|
+
const row = this.row("source", source);
|
|
157
|
+
if (row && row.digest !== questionContextDigest(question))
|
|
158
|
+
throw new HubProtocolError("conflict");
|
|
159
|
+
return row?.id ?? null;
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Startup. The journal's own recovery runs first (queued + input intent → uncertain). Then a row that was dispatching
|
|
165
|
+
* goes back to the queue ONLY if the journal still has it queued with no input intent (a crash between the intent and
|
|
166
|
+
* the representative's own transition is uncertain and held, never a fresh queue item); anything past it is held.
|
|
167
|
+
*/
|
|
168
|
+
recover() {
|
|
169
|
+
if (this.recovered)
|
|
170
|
+
throw new HubProtocolError("conflict");
|
|
171
|
+
const db = this.options.db;
|
|
172
|
+
this.options.journal.recoverInterruptedInputs();
|
|
173
|
+
for (const row of db.prepare("SELECT * FROM hub_representative_questions WHERE state IN ('dispatching','input','delivered','answering','answered')").all()) {
|
|
174
|
+
let untouched = false;
|
|
175
|
+
if (row.state === "dispatching") {
|
|
176
|
+
try {
|
|
177
|
+
this.question(row);
|
|
178
|
+
untouched = true;
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
untouched = false;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (untouched)
|
|
185
|
+
db.prepare("UPDATE hub_representative_questions SET state='queued', cid=NULL WHERE id=? AND state='dispatching'").run(row.id);
|
|
186
|
+
else
|
|
187
|
+
this.hold(row, "uncertain");
|
|
188
|
+
}
|
|
189
|
+
this.recovered = true;
|
|
190
|
+
this.options.attentionChanged();
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Deliver queued questions the link can authorize now (after commits, on each completed handshake, and again as each
|
|
194
|
+
* dispatch settles, so a backlog larger than one page keeps draining). Input-bearing work is never picked up again.
|
|
195
|
+
*/
|
|
196
|
+
pump() {
|
|
197
|
+
if (this.closed || !this.recovered || !this.options.link())
|
|
198
|
+
return;
|
|
199
|
+
let rows;
|
|
200
|
+
try {
|
|
201
|
+
rows = this.options.db.prepare("SELECT * FROM hub_representative_questions WHERE state='queued' ORDER BY at LIMIT 64").all();
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
this.options.log("warn", "Hub question queue could not be read", { err: String(err) });
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
for (const row of rows) {
|
|
208
|
+
if (this.running.has(row.id))
|
|
209
|
+
continue;
|
|
210
|
+
this.running.add(row.id);
|
|
211
|
+
void this.dispatch(row).catch((err) => {
|
|
212
|
+
this.options.log("warn", "Hub question delivery failed", { messageId: row.message_id, err: String(err) });
|
|
213
|
+
this.uncertain(row, err);
|
|
214
|
+
}).finally(() => {
|
|
215
|
+
this.running.delete(row.id);
|
|
216
|
+
if (!this.closed)
|
|
217
|
+
setImmediate(() => this.pump());
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
/** The row's current state from the database (another path — fence, report — may have moved it). */
|
|
222
|
+
refresh(row) {
|
|
223
|
+
const now = this.row("id", row.id);
|
|
224
|
+
row.state = now?.state ?? "held";
|
|
225
|
+
return row.state;
|
|
226
|
+
}
|
|
227
|
+
async dispatch(row) {
|
|
228
|
+
if (!this.currentFor(row)) {
|
|
229
|
+
this.hold(row, "stale");
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
const cid = `hub-${randomUUID()}`;
|
|
233
|
+
if (!this.setState(row, "dispatching", ["queued"], { cid }))
|
|
234
|
+
return;
|
|
235
|
+
const question = this.question(row);
|
|
236
|
+
const e = question.identity;
|
|
237
|
+
// A question's files come whole into the agent's inbox before the hand-off; a failure holds it (never a resend).
|
|
238
|
+
let fileLines = [];
|
|
239
|
+
if (question.attachments?.length) {
|
|
240
|
+
const link = this.options.link(), files = this.options.files;
|
|
241
|
+
try {
|
|
242
|
+
if (!files || !link?.current() || !link.features?.has("attachments-v1"))
|
|
243
|
+
throw new HubProtocolError("incompatible");
|
|
244
|
+
fileLines = await files.receive(row.agent, row.message_id, question.attachments, async (id, offset) => {
|
|
245
|
+
const reply = await link.exchange({ v: 1, type: "attachment.get", requestId: randomUUID(), linkEpoch: link.linkEpoch, payload: { id, offset } }, "attachment.chunk");
|
|
246
|
+
if (reply.type !== "attachment.chunk")
|
|
247
|
+
throw new HubProtocolError("invalid");
|
|
248
|
+
return reply.payload;
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
this.options.log("warn", "Hub question files could not be fetched", { messageId: row.message_id, err: String(err) });
|
|
253
|
+
this.hold(row, "files-unavailable");
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
if (this.refresh(row) !== "dispatching" || !this.currentFor(row)) {
|
|
257
|
+
this.hold(row, "stale");
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
const text = [
|
|
262
|
+
`A question from the Hub. Asker ${personKeyString(e.asker)} (Hub-verified identity; not a person of this fleet, never a go-ahead for local actions).`,
|
|
263
|
+
`Answer it with report_result to ${HUB_REPORT_TARGET} with correlation_id ${cid}. Your reply tool does not reach the asker.${question.attachments?.length ? " To send files back, pass their paths in report_result's files." : ""}`,
|
|
264
|
+
"",
|
|
265
|
+
question.text,
|
|
266
|
+
...(fileLines.length ? ["", ...fileLines] : []),
|
|
267
|
+
].join("\n");
|
|
268
|
+
let handed = false;
|
|
269
|
+
try {
|
|
270
|
+
handed = await this.options.deliver({
|
|
271
|
+
agent: row.agent, correlationId: cid, text,
|
|
272
|
+
// The live fence through wake/idle/reconnect: the row's state as stored now, and its consent/lifecycle/binding.
|
|
273
|
+
stillCurrent: () => { const st = this.refresh(row); return (st === "dispatching" || st === "input") && this.currentFor(row); },
|
|
274
|
+
beforeInput: () => this.beforeInput(row),
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
catch (err) {
|
|
278
|
+
this.options.log("warn", "Hub question hand-off failed", { messageId: row.message_id, err: String(err) });
|
|
279
|
+
}
|
|
280
|
+
const state = this.refresh(row);
|
|
281
|
+
if (handed && state === "input") {
|
|
282
|
+
// Handed to the agent's daemon: local state only. The journal's delivered/consumed evidence waits for the agent's
|
|
283
|
+
// own report (queue acceptance is not delivery); a pane that never takes it is reported back (deliveryFailed).
|
|
284
|
+
if (!this.setState(row, "delivered", ["input"]))
|
|
285
|
+
return;
|
|
286
|
+
try {
|
|
287
|
+
this.auditRequired(row, "representative.handed", "completed");
|
|
288
|
+
}
|
|
289
|
+
catch (err) {
|
|
290
|
+
this.uncertain(row, err);
|
|
291
|
+
}
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
if (handed)
|
|
295
|
+
return; // already answering (the report overtook the hand-off result)
|
|
296
|
+
if (state === "input")
|
|
297
|
+
this.uncertain(row, new Error("the hand-off after the input intent did not complete"));
|
|
298
|
+
else if (state === "dispatching")
|
|
299
|
+
this.hold(row, "unavailable");
|
|
300
|
+
}
|
|
301
|
+
/** The fleet's last step before input (at the connected hand-off): consent and lifecycle again, the begin lease, spent at once. */
|
|
302
|
+
async beforeInput(row) {
|
|
303
|
+
try {
|
|
304
|
+
if (this.refresh(row) !== "dispatching" || !this.currentFor(row)) {
|
|
305
|
+
this.hold(row, "stale");
|
|
306
|
+
return false;
|
|
307
|
+
}
|
|
308
|
+
const request = { messageId: row.message_id, operationId: randomUUID(), exposureRevision: row.revision, phase: "begin" };
|
|
309
|
+
const lease = await this.options.authorize(request);
|
|
310
|
+
if (this.refresh(row) !== "dispatching" || !this.currentFor(row)) {
|
|
311
|
+
this.hold(row, "stale");
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
this.options.journal.markInputIntent(row.message_id, request, lease, this.fenceOf(row));
|
|
315
|
+
if (!this.setState(row, "input", ["dispatching"]))
|
|
316
|
+
throw new HubProtocolError("uncertain");
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
catch (err) {
|
|
320
|
+
// After the intent was written, a failed transition is uncertain (never re-queued); before it, a plain hold.
|
|
321
|
+
let intent = false;
|
|
322
|
+
try {
|
|
323
|
+
this.question(row);
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
intent = true;
|
|
327
|
+
}
|
|
328
|
+
if (intent)
|
|
329
|
+
this.uncertain(row, err);
|
|
330
|
+
else
|
|
331
|
+
this.hold(row, "unavailable");
|
|
332
|
+
this.options.log("warn", "Hub question held before input", { messageId: row.message_id, err: String(err) });
|
|
333
|
+
return false;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* The outbound hook: a report_result to HUB_REPORT_TARGET. Returns null when the correlation id is not a live Hub id
|
|
338
|
+
* issued to this caller (the call then takes its ordinary route); otherwise consumes it once and releases the answer.
|
|
339
|
+
* callerCurrent: the reporting daemon generation is still the agent's current one (asked again before every release step).
|
|
340
|
+
*/
|
|
341
|
+
report(input) {
|
|
342
|
+
if (this.closed || !input.correlationId.startsWith("hub-"))
|
|
343
|
+
return null;
|
|
344
|
+
const row = this.row("cid", input.correlationId);
|
|
345
|
+
if (!row || row.agent !== input.caller)
|
|
346
|
+
return null;
|
|
347
|
+
const was = row.state;
|
|
348
|
+
// Consume once, synchronously: a second report on the same id finds it no longer live.
|
|
349
|
+
if (!this.setState(row, "answering", ["input", "delivered"]))
|
|
350
|
+
return null;
|
|
351
|
+
return this.release(row, was, input.text, input.callerCurrent ?? (() => true), input.extras ?? {});
|
|
352
|
+
}
|
|
353
|
+
async release(row, was, raw, callerCurrent, extras) {
|
|
354
|
+
let saved = false, evidenced = false, disclosed = false;
|
|
355
|
+
const live = () => {
|
|
356
|
+
if (!callerCurrent() || this.refresh(row) !== (saved ? "answered" : "answering") || !this.currentFor(row))
|
|
357
|
+
throw new HubProtocolError("stale");
|
|
358
|
+
};
|
|
359
|
+
try {
|
|
360
|
+
const text = validated(plain(HUB_ANSWER_MAX), raw);
|
|
361
|
+
if (!text.trim())
|
|
362
|
+
throw new HubProtocolError("invalid");
|
|
363
|
+
live();
|
|
364
|
+
// Snapshot choices before any file or authorization await. They are part of the exact released answer.
|
|
365
|
+
const buttons = prepareHubAnswerButtons(extras.buttons, extras.poll);
|
|
366
|
+
const buttonLink = buttons ? this.options.link() : null;
|
|
367
|
+
if (buttons && (!buttonLink?.current() || !buttonLink.features?.has("buttons-v1")))
|
|
368
|
+
throw new HubButtonRefusal();
|
|
369
|
+
// The agent's files (D): copied under the reply tool's rule, then pushed to the Hub before the answer names them.
|
|
370
|
+
let attachments;
|
|
371
|
+
if (extras.files?.length) {
|
|
372
|
+
const link = this.options.link(), files = this.options.files;
|
|
373
|
+
if (!files || !link?.current() || !link.features?.has("attachments-v1"))
|
|
374
|
+
throw new HubFileRefusal("this Hub can't receive files yet; answer with text only");
|
|
375
|
+
const prepared = await files.prepare(row.agent, extras.files);
|
|
376
|
+
live();
|
|
377
|
+
for (const file of prepared)
|
|
378
|
+
await files.send(file, async (chunk) => {
|
|
379
|
+
const ack = await link.exchange({ v: 1, type: "attachment.put", requestId: randomUUID(), linkEpoch: link.linkEpoch, payload: chunk }, "attachment.ack");
|
|
380
|
+
if (ack.type !== "attachment.ack" || ack.payload.id !== chunk.id || ack.payload.offset !== chunk.offset)
|
|
381
|
+
throw new HubProtocolError("uncertain");
|
|
382
|
+
});
|
|
383
|
+
attachments = prepared.map(f => f.ref);
|
|
384
|
+
live();
|
|
385
|
+
}
|
|
386
|
+
if (buttons && (!buttonLink?.current() || this.options.link() !== buttonLink || !buttonLink.features?.has("buttons-v1")))
|
|
387
|
+
throw new HubProtocolError("stale");
|
|
388
|
+
evidenced = true;
|
|
389
|
+
const journal = this.options.journal;
|
|
390
|
+
// The agent's own report is the evidence that the question reached it and was taken up.
|
|
391
|
+
journal.recordEvidence(row.message_id, "delivered");
|
|
392
|
+
journal.recordEvidence(row.message_id, "consumed");
|
|
393
|
+
// F: buttons/poll join here (their payload field and buttonsDigest into messageContentDigest).
|
|
394
|
+
// Freeze the answer's id, bytes and digest before asking for the release lease for exactly them.
|
|
395
|
+
const answerId = randomUUID(), contentDigest = messageContentDigest("answer", text, { attachments, buttonsDigest: buttonsDigest(buttons) });
|
|
396
|
+
this.options.db.prepare("UPDATE hub_representative_questions SET answer=? WHERE id=?").run(JSON.stringify({ answerId, contentDigest }), row.id);
|
|
397
|
+
live();
|
|
398
|
+
const request = { messageId: row.message_id, operationId: randomUUID(), exposureRevision: row.revision, phase: "release-answer", answer: { answerId, contentDigest } };
|
|
399
|
+
const releaseLease = await this.options.authorize(request);
|
|
400
|
+
live();
|
|
401
|
+
if (buttons && (!buttonLink?.current() || this.options.link() !== buttonLink || !buttonLink.features?.has("buttons-v1")))
|
|
402
|
+
throw new HubProtocolError("stale");
|
|
403
|
+
const answer = validated(answerSchema, { messageId: row.message_id, answerId, text, contentDigest, releaseLease,
|
|
404
|
+
...(attachments?.length ? { attachments } : {}), ...(buttons ? { buttons } : {}) });
|
|
405
|
+
// Required audit BEFORE anything is saved or disclosed: its failure stops the release (held, nothing sent).
|
|
406
|
+
this.auditRequired(row, "representative.release", "completed");
|
|
407
|
+
journal.saveAnswer(answer, request, this.fenceOf(row));
|
|
408
|
+
saved = true;
|
|
409
|
+
if (!this.setState(row, "answered", ["answering"]))
|
|
410
|
+
throw new HubProtocolError("stale");
|
|
411
|
+
live();
|
|
412
|
+
const link = this.options.link();
|
|
413
|
+
if (!link || !link.current())
|
|
414
|
+
throw new HubProtocolError("unavailable");
|
|
415
|
+
disclosed = true;
|
|
416
|
+
const reply = await link.exchange({ v: 1, type: "answer", requestId: randomUUID(), linkEpoch: link.linkEpoch, payload: answer }, "receipt");
|
|
417
|
+
if (reply.type !== "receipt" || reply.payload.messageId !== row.message_id || reply.payload.stage !== "answered")
|
|
418
|
+
throw new HubProtocolError("uncertain");
|
|
419
|
+
// The answered state and its audit commit together; a failure leaves a visible hold, never a silent success.
|
|
420
|
+
this.options.db.transaction(() => {
|
|
421
|
+
if (!this.setState(row, "released", ["answered"]))
|
|
422
|
+
throw new HubProtocolError("stale");
|
|
423
|
+
this.options.audit({ action: "representative.answered", result: "completed", messageId: row.message_id, exposureId: row.exposure_id }, this.options.db);
|
|
424
|
+
}).immediate();
|
|
425
|
+
this.pushReceipts();
|
|
426
|
+
return { ok: true, message: "Delivered to the Hub asker." };
|
|
427
|
+
}
|
|
428
|
+
catch (err) {
|
|
429
|
+
const code = err instanceof HubProtocolError ? err.code : "uncertain";
|
|
430
|
+
if (!saved && !evidenced && err instanceof HubButtonRefusal) {
|
|
431
|
+
this.setState(row, was === "input" ? "delivered" : was, ["answering"]);
|
|
432
|
+
return { ok: false, message: "Not sent: this Hub can't send buttons yet. Report text only with the same correlation_id." };
|
|
433
|
+
}
|
|
434
|
+
if (!saved && !evidenced && err instanceof HubFileRefusal) {
|
|
435
|
+
// A file the agent can fix (a state-dir path, a refused type, too large): the question stays open on the same id.
|
|
436
|
+
this.setState(row, was === "input" ? "delivered" : was, ["answering"]);
|
|
437
|
+
return { ok: false, message: `Not sent: ${err.message}. Report again with the same correlation_id.` };
|
|
438
|
+
}
|
|
439
|
+
if (!saved && code === "invalid" && !evidenced) {
|
|
440
|
+
// A malformed report (empty or oversized) is the agent's to fix: the question stays open on the same id.
|
|
441
|
+
this.setState(row, was === "input" ? "delivered" : was, ["answering"]);
|
|
442
|
+
return { ok: false, message: `Not sent: the answer must be 1 to ${HUB_ANSWER_MAX} bytes of plain text. Report again with the same correlation_id.` };
|
|
443
|
+
}
|
|
444
|
+
this.uncertain(row, err);
|
|
445
|
+
return { ok: false, message: disclosed
|
|
446
|
+
? "Sent to the Hub, but its acknowledgement is uncertain; it is not sent again. The owner sees it in Needs you."
|
|
447
|
+
: "Not delivered to the Hub asker: the question is no longer open (withdrawn, revoked, replaced, or the Hub is unreachable). The owner sees it in Needs you." };
|
|
448
|
+
}
|
|
449
|
+
finally {
|
|
450
|
+
this.options.attentionChanged();
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
/** Local evidence to the Hub, in order, each ACK recorded. A failure waits for the next handshake (it sends the rest). */
|
|
454
|
+
pushReceipts() {
|
|
455
|
+
this.receiptsTail = this.receiptsTail.then(async () => {
|
|
456
|
+
const link = this.options.link();
|
|
457
|
+
if (!link || !link.current())
|
|
458
|
+
return;
|
|
459
|
+
for (;;) {
|
|
460
|
+
const page = this.options.journal.unackedReceipts({});
|
|
461
|
+
if (!page.receipts.length)
|
|
462
|
+
return;
|
|
463
|
+
for (const receipt of page.receipts) {
|
|
464
|
+
const reply = await link.exchange({ v: 1, type: "receipt", requestId: randomUUID(), linkEpoch: link.linkEpoch, payload: receipt }, "receipt");
|
|
465
|
+
if (reply.type !== "receipt" || canonicalArguments(reply.payload) !== canonicalArguments(receipt))
|
|
466
|
+
throw new HubProtocolError("conflict");
|
|
467
|
+
this.options.journal.acknowledge(receipt);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
}).catch((err) => this.options.log("info", "Hub receipts wait for the next handshake", { err: String(err) }));
|
|
471
|
+
}
|
|
472
|
+
question(row) {
|
|
473
|
+
// The journal's encrypted copy is the only question text this side keeps (readable only while queued, before input).
|
|
474
|
+
const question = this.options.journal.queuedQuestion(row.message_id);
|
|
475
|
+
if (questionContextDigest(question) !== row.digest)
|
|
476
|
+
throw new HubProtocolError("uncertain");
|
|
477
|
+
return question;
|
|
478
|
+
}
|
|
479
|
+
/** A required audit record (its own transaction): a failure throws to the caller. */
|
|
480
|
+
auditRequired(row, action, result, reasonCode) {
|
|
481
|
+
this.options.db.transaction(() => this.options.audit({ action, result, messageId: row.message_id, exposureId: row.exposure_id, ...(reasonCode ? { reasonCode } : {}) }, this.options.db)).immediate();
|
|
482
|
+
}
|
|
483
|
+
/** A hold always lands (state first); its audit record is attempted and a failure is logged. */
|
|
484
|
+
hold(row, reason) {
|
|
485
|
+
if (!this.setState(row, "held", HOLDABLE, { reason }))
|
|
486
|
+
return;
|
|
487
|
+
try {
|
|
488
|
+
this.auditRequired(row, "representative.held", "held", reason);
|
|
489
|
+
}
|
|
490
|
+
catch (err) {
|
|
491
|
+
this.options.log("warn", "Hub audit append failed", { action: "representative.held", err: String(err) });
|
|
492
|
+
}
|
|
493
|
+
this.options.attentionChanged();
|
|
494
|
+
}
|
|
495
|
+
uncertain(row, err) {
|
|
496
|
+
this.options.log("warn", "Hub question uncertain", { messageId: row.message_id, err: String(err) });
|
|
497
|
+
// The journal can mark uncertain only before an answer was saved; a saved-but-unacknowledged answer stays answered there.
|
|
498
|
+
try {
|
|
499
|
+
if (["dispatching", "input", "delivered", "answering"].includes(this.refresh(row)))
|
|
500
|
+
this.options.journal.recordEvidence(row.message_id, "uncertain");
|
|
501
|
+
}
|
|
502
|
+
catch { /* already past the stages the journal can mark uncertain */ }
|
|
503
|
+
this.hold(row, "uncertain");
|
|
504
|
+
this.pushReceipts();
|
|
505
|
+
}
|
|
506
|
+
/** The agent's daemon could not get the question into its pane after accepting it: uncertain, never resent. */
|
|
507
|
+
deliveryFailed(correlationId, agent) {
|
|
508
|
+
const row = correlationId.startsWith("hub-") ? this.row("cid", correlationId) : null;
|
|
509
|
+
if (!row || row.agent !== agent || !["input", "delivered"].includes(row.state))
|
|
510
|
+
return;
|
|
511
|
+
this.uncertain(row, new Error("the agent's pane did not take the question"));
|
|
512
|
+
}
|
|
513
|
+
/** Off / withdraw / revoke / link replacement for one message: its correlation id stops being live at once. */
|
|
514
|
+
fence(messageId, reasonCode = "revoked") {
|
|
515
|
+
const row = this.row("message_id", messageId);
|
|
516
|
+
if (row)
|
|
517
|
+
this.hold(row, reasonCode);
|
|
518
|
+
}
|
|
519
|
+
attentionItems() {
|
|
520
|
+
const rows = this.options.db.prepare(`SELECT * FROM hub_representative_questions WHERE state='held' ORDER BY at DESC LIMIT ${HELD_MAX}`).all();
|
|
521
|
+
return rows.map(r => ({ id: `hold:${r.id}`, kind: "hold", agent: r.agent, messageId: r.message_id, exposureId: r.exposure_id, since: r.at }));
|
|
522
|
+
}
|
|
523
|
+
async close() {
|
|
524
|
+
this.closed = true;
|
|
525
|
+
await this.receiptsTail;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
//# sourceMappingURL=representative.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"representative.js","sourceRoot":"","sources":["../../src/hub/representative.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Owner Settings policy in the private Hub DB. The sealed config supplies the initial values only. */
|
|
2
|
+
import type Database from "better-sqlite3";
|
|
3
|
+
import { type HubRetentionPolicy, type HubRetentionView } from "../hub-retention-policy.js";
|
|
4
|
+
import type { HubMigration } from "./db.js";
|
|
5
|
+
import type { HubAuditStore } from "./audit/index.js";
|
|
6
|
+
export interface HubRetentionControl {
|
|
7
|
+
read(): HubRetentionView;
|
|
8
|
+
update(input: unknown, current: () => boolean): HubRetentionView;
|
|
9
|
+
}
|
|
10
|
+
export declare function retentionMigration(hubId: string, initial: HubRetentionPolicy): HubMigration;
|
|
11
|
+
export declare function createHubRetentionControl(options: {
|
|
12
|
+
db: Database.Database;
|
|
13
|
+
hubId: string;
|
|
14
|
+
audit: Pick<HubAuditStore, "appendInTransaction">;
|
|
15
|
+
current(): boolean;
|
|
16
|
+
now(): number;
|
|
17
|
+
}): HubRetentionControl;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { parseHubRetention } from "../hub-retention-policy.js";
|
|
3
|
+
export function retentionMigration(hubId, initial) {
|
|
4
|
+
const policy = parseHubRetention({ ...initial, revision: 1 });
|
|
5
|
+
return { component: "s5-retention", version: 1, up(db) {
|
|
6
|
+
db.exec(`CREATE TABLE hub_retention(singleton INTEGER PRIMARY KEY CHECK(singleton=1), hub_id TEXT NOT NULL,
|
|
7
|
+
content_days INTEGER NOT NULL CHECK(content_days BETWEEN 1 AND 3650),
|
|
8
|
+
event_days INTEGER NOT NULL CHECK(event_days BETWEEN 1 AND 3650), revision INTEGER NOT NULL CHECK(revision>=1));`);
|
|
9
|
+
db.prepare("INSERT INTO hub_retention VALUES(1, ?, ?, ?, 1)").run(hubId, policy.contentDays, policy.eventDays);
|
|
10
|
+
} };
|
|
11
|
+
}
|
|
12
|
+
export function createHubRetentionControl(options) {
|
|
13
|
+
const { db } = options;
|
|
14
|
+
const assert = (current = () => true) => { if (!options.current() || !current())
|
|
15
|
+
throw Error("unavailable"); };
|
|
16
|
+
const read = () => {
|
|
17
|
+
assert();
|
|
18
|
+
const row = db.prepare("SELECT hub_id, content_days, event_days, revision FROM hub_retention WHERE singleton=1").get();
|
|
19
|
+
if (!row || row.hub_id !== options.hubId)
|
|
20
|
+
throw Error("retention_unavailable");
|
|
21
|
+
return parseHubRetention({ contentDays: row.content_days, eventDays: row.event_days, revision: row.revision });
|
|
22
|
+
};
|
|
23
|
+
read(); // Missing/corrupt state never resets to a longer initial retention.
|
|
24
|
+
return { read, update(input, current) {
|
|
25
|
+
const next = parseHubRetention(input);
|
|
26
|
+
return db.transaction(() => {
|
|
27
|
+
assert(current);
|
|
28
|
+
const before = read();
|
|
29
|
+
if (before.revision !== next.revision || before.revision >= Number.MAX_SAFE_INTEGER)
|
|
30
|
+
throw Error("conflict");
|
|
31
|
+
if (before.contentDays === next.contentDays && before.eventDays === next.eventDays)
|
|
32
|
+
return before;
|
|
33
|
+
const revision = before.revision + 1;
|
|
34
|
+
const result = options.audit.appendInTransaction({ id: randomUUID(), sequence: revision, at: options.now(), requestId: randomUUID(),
|
|
35
|
+
actor: { kind: "local-host" }, action: "retention.changed", result: "completed", policyVersion: revision,
|
|
36
|
+
reasonCode: `content-${next.contentDays}-events-${next.eventDays}` }, db);
|
|
37
|
+
if (result && typeof result.then === "function")
|
|
38
|
+
throw Error("retention_audit_unavailable");
|
|
39
|
+
assert(current);
|
|
40
|
+
db.prepare("UPDATE hub_retention SET content_days=?, event_days=?, revision=? WHERE singleton=1").run(next.contentDays, next.eventDays, revision);
|
|
41
|
+
return { contentDays: next.contentDays, eventDays: next.eventDays, revision };
|
|
42
|
+
}).immediate();
|
|
43
|
+
} };
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=retention.js.map
|