@aeolus-fleet/core 0.26.1 → 0.27.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/adapters/http/request-credentials.d.ts +2 -9
- package/dist/adapters/http/request-credentials.js +8 -1
- package/dist/adapters/http/request-credentials.js.map +1 -1
- package/dist/adapters/http/server.js +2 -1
- package/dist/adapters/http/server.js.map +1 -1
- package/dist/adapters/mcp/mcp-endpoint.js +11 -1
- package/dist/adapters/mcp/mcp-endpoint.js.map +1 -1
- package/dist/adapters/prisma/generated/browser.d.ts +14 -0
- package/dist/adapters/prisma/generated/client.d.ts +14 -0
- package/dist/adapters/prisma/generated/commonInputTypes.d.ts +30 -0
- package/dist/adapters/prisma/generated/enums.d.ts +10 -0
- package/dist/adapters/prisma/generated/enums.js +10 -1
- package/dist/adapters/prisma/generated/enums.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/class.d.ts +22 -0
- package/dist/adapters/prisma/generated/internal/class.js +4 -4
- package/dist/adapters/prisma/generated/internal/class.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.d.ts +186 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js +27 -2
- package/dist/adapters/prisma/generated/internal/prismaNamespace.js.map +1 -1
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.d.ts +27 -0
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js +27 -2
- package/dist/adapters/prisma/generated/internal/prismaNamespaceBrowser.js.map +1 -1
- package/dist/adapters/prisma/generated/models/Delivery.d.ts +71 -1
- package/dist/adapters/prisma/generated/models/Fleet.d.ts +558 -0
- package/dist/adapters/prisma/generated/models/Lease.d.ts +172 -1
- package/dist/adapters/prisma/generated/models/NetworkSettings.d.ts +185 -21
- package/dist/adapters/prisma/generated/models/PluginConnection.d.ts +1180 -0
- package/dist/adapters/prisma/generated/models/PluginConnection.js +2 -0
- package/dist/adapters/prisma/generated/models/PluginConnection.js.map +1 -0
- package/dist/adapters/prisma/generated/models/ReachRefusal.d.ts +71 -1
- package/dist/adapters/prisma/generated/models/ScopeNamespace.d.ts +1220 -0
- package/dist/adapters/prisma/generated/models/ScopeNamespace.js +2 -0
- package/dist/adapters/prisma/generated/models/ScopeNamespace.js.map +1 -0
- package/dist/adapters/prisma/generated/models/Ship.d.ts +1269 -51
- package/dist/adapters/prisma/generated/models.d.ts +2 -0
- package/dist/adapters/prisma/health.js +27 -7
- package/dist/adapters/prisma/health.js.map +1 -1
- package/dist/adapters/prisma/history.js +18 -72
- package/dist/adapters/prisma/history.js.map +1 -1
- package/dist/adapters/prisma/messaging.js +31 -35
- package/dist/adapters/prisma/messaging.js.map +1 -1
- package/dist/adapters/prisma/network.js +45 -15
- package/dist/adapters/prisma/network.js.map +1 -1
- package/dist/adapters/prisma/overdue.js +4 -3
- package/dist/adapters/prisma/overdue.js.map +1 -1
- package/dist/adapters/prisma/plugin-connections.d.ts +4 -0
- package/dist/adapters/prisma/plugin-connections.js +20 -0
- package/dist/adapters/prisma/plugin-connections.js.map +1 -0
- package/dist/adapters/prisma/registry.js +68 -13
- package/dist/adapters/prisma/registry.js.map +1 -1
- package/dist/adapters/prisma/rows.d.ts +3 -0
- package/dist/adapters/prisma/rows.js +22 -7
- package/dist/adapters/prisma/rows.js.map +1 -1
- package/dist/adapters/prisma/scope-namespaces.d.ts +4 -0
- package/dist/adapters/prisma/scope-namespaces.js +39 -0
- package/dist/adapters/prisma/scope-namespaces.js.map +1 -0
- package/dist/adapters/prisma/unit-of-work.d.ts +3 -1
- package/dist/adapters/prisma/unit-of-work.js +4 -0
- package/dist/adapters/prisma/unit-of-work.js.map +1 -1
- package/dist/adapters/rest/rest-api.js +2 -2
- package/dist/adapters/rest/rest-api.js.map +1 -1
- package/dist/adapters/trpc/console.d.ts +1 -1
- package/dist/adapters/trpc/console.js +6 -4
- package/dist/adapters/trpc/console.js.map +1 -1
- package/dist/adapters/trpc/context.d.ts +28 -4
- package/dist/adapters/trpc/fleet.d.ts +243 -90
- package/dist/adapters/trpc/fleet.js +146 -57
- package/dist/adapters/trpc/fleet.js.map +1 -1
- package/dist/adapters/trpc/router.d.ts +366 -86
- package/dist/adapters/trpc/ship-contract.js +5 -0
- package/dist/adapters/trpc/ship-contract.js.map +1 -1
- package/dist/adapters/trpc/ship-protocol.js +7 -5
- package/dist/adapters/trpc/ship-protocol.js.map +1 -1
- package/dist/adapters/trpc/ship.d.ts +156 -3
- package/dist/adapters/trpc/ship.js +89 -8
- package/dist/adapters/trpc/ship.js.map +1 -1
- package/dist/adapters/trpc/trpc.d.ts +13 -9
- package/dist/adapters/trpc/trpc.js +90 -26
- package/dist/adapters/trpc/trpc.js.map +1 -1
- package/dist/domain/messaging/check-inbox.d.ts +5 -5
- package/dist/domain/messaging/check-inbox.js +9 -7
- package/dist/domain/messaging/check-inbox.js.map +1 -1
- package/dist/domain/messaging/delivery.d.ts +8 -2
- package/dist/domain/messaging/delivery.js +14 -9
- package/dist/domain/messaging/delivery.js.map +1 -1
- package/dist/domain/messaging/dismiss-delivery.d.ts +9 -4
- package/dist/domain/messaging/dismiss-delivery.js +26 -19
- package/dist/domain/messaging/dismiss-delivery.js.map +1 -1
- package/dist/domain/messaging/hand-over-delivery.d.ts +1 -0
- package/dist/domain/messaging/hand-over-delivery.js +1 -0
- package/dist/domain/messaging/hand-over-delivery.js.map +1 -1
- package/dist/domain/messaging/message.d.ts +11 -5
- package/dist/domain/messaging/message.js +11 -4
- package/dist/domain/messaging/message.js.map +1 -1
- package/dist/domain/messaging/overdue.d.ts +2 -0
- package/dist/domain/messaging/overdue.js +3 -0
- package/dist/domain/messaging/overdue.js.map +1 -1
- package/dist/domain/messaging/ping-ship.d.ts +3 -3
- package/dist/domain/messaging/ping-ship.js +6 -2
- package/dist/domain/messaging/ping-ship.js.map +1 -1
- package/dist/domain/messaging/ports.d.ts +11 -3
- package/dist/domain/messaging/push-receive-deliveries.d.ts +4 -1
- package/dist/domain/messaging/push-receive-deliveries.js +5 -3
- package/dist/domain/messaging/push-receive-deliveries.js.map +1 -1
- package/dist/domain/messaging/receive-deliveries.d.ts +23 -0
- package/dist/domain/messaging/receive-deliveries.js +6 -3
- package/dist/domain/messaging/receive-deliveries.js.map +1 -1
- package/dist/domain/messaging/receive-reply.d.ts +32 -0
- package/dist/domain/messaging/receive-reply.js +25 -0
- package/dist/domain/messaging/receive-reply.js.map +1 -0
- package/dist/domain/messaging/resend-delivery.d.ts +5 -2
- package/dist/domain/messaging/resend-delivery.js +8 -4
- package/dist/domain/messaging/resend-delivery.js.map +1 -1
- package/dist/domain/messaging/send-message.d.ts +9 -2
- package/dist/domain/messaging/send-message.js +12 -2
- package/dist/domain/messaging/send-message.js.map +1 -1
- package/dist/domain/messaging/send-request.d.ts +3 -1
- package/dist/domain/messaging/send-request.js +4 -2
- package/dist/domain/messaging/send-request.js.map +1 -1
- package/dist/domain/registry/assign-label.d.ts +2 -1
- package/dist/domain/registry/assign-label.js +3 -2
- package/dist/domain/registry/assign-label.js.map +1 -1
- package/dist/domain/registry/check-reach.d.ts +69 -6
- package/dist/domain/registry/check-reach.js +109 -12
- package/dist/domain/registry/check-reach.js.map +1 -1
- package/dist/domain/registry/commission-ship.d.ts +21 -8
- package/dist/domain/registry/commission-ship.js +55 -10
- package/dist/domain/registry/commission-ship.js.map +1 -1
- package/dist/domain/registry/connect-plugin.d.ts +30 -0
- package/dist/domain/registry/connect-plugin.js +35 -0
- package/dist/domain/registry/connect-plugin.js.map +1 -0
- package/dist/domain/registry/crew-request.d.ts +1 -1
- package/dist/domain/registry/declare-scopes.d.ts +38 -0
- package/dist/domain/registry/declare-scopes.js +34 -0
- package/dist/domain/registry/declare-scopes.js.map +1 -0
- package/dist/domain/registry/declared-network-rules.d.ts +2 -1
- package/dist/domain/registry/declared-network-rules.js +11 -5
- package/dist/domain/registry/declared-network-rules.js.map +1 -1
- package/dist/domain/registry/discover.d.ts +29 -0
- package/dist/domain/registry/discover.js +54 -0
- package/dist/domain/registry/discover.js.map +1 -0
- package/dist/domain/registry/explain-reach.d.ts +13 -12
- package/dist/domain/registry/explain-reach.js +35 -12
- package/dist/domain/registry/explain-reach.js.map +1 -1
- package/dist/domain/registry/get-ship.d.ts +11 -3
- package/dist/domain/registry/get-ship.js +8 -2
- package/dist/domain/registry/get-ship.js.map +1 -1
- package/dist/domain/registry/get-starting-prompt.d.ts +18 -2
- package/dist/domain/registry/get-starting-prompt.js +7 -7
- package/dist/domain/registry/get-starting-prompt.js.map +1 -1
- package/dist/domain/registry/grant-scopes.d.ts +34 -0
- package/dist/domain/registry/grant-scopes.js +35 -0
- package/dist/domain/registry/grant-scopes.js.map +1 -0
- package/dist/domain/registry/label.d.ts +12 -7
- package/dist/domain/registry/label.js +21 -4
- package/dist/domain/registry/label.js.map +1 -1
- package/dist/domain/registry/leases.d.ts +6 -3
- package/dist/domain/registry/leases.js +7 -5
- package/dist/domain/registry/leases.js.map +1 -1
- package/dist/domain/registry/list-fleet.d.ts +19 -6
- package/dist/domain/registry/list-fleet.js +18 -3
- package/dist/domain/registry/list-fleet.js.map +1 -1
- package/dist/domain/registry/list-scopes.d.ts +24 -0
- package/dist/domain/registry/list-scopes.js +22 -0
- package/dist/domain/registry/list-scopes.js.map +1 -0
- package/dist/domain/registry/managed-or-assigned.d.ts +25 -0
- package/dist/domain/registry/managed-or-assigned.js +23 -0
- package/dist/domain/registry/managed-or-assigned.js.map +1 -0
- package/dist/domain/registry/named-namespaces.d.ts +19 -0
- package/dist/domain/registry/named-namespaces.js +19 -0
- package/dist/domain/registry/named-namespaces.js.map +1 -0
- package/dist/domain/registry/network-settings.d.ts +95 -24
- package/dist/domain/registry/network-settings.js +146 -46
- package/dist/domain/registry/network-settings.js.map +1 -1
- package/dist/domain/registry/plugin-connection.d.ts +48 -0
- package/dist/domain/registry/plugin-connection.js +35 -0
- package/dist/domain/registry/plugin-connection.js.map +1 -0
- package/dist/domain/registry/ports.d.ts +75 -1
- package/dist/domain/registry/public.d.ts +3 -2
- package/dist/domain/registry/public.js +3 -2
- package/dist/domain/registry/public.js.map +1 -1
- package/dist/domain/registry/reach-refusal.d.ts +12 -4
- package/dist/domain/registry/read-assigned-crew-requests.d.ts +12 -3
- package/dist/domain/registry/read-assigned-crew-requests.js +8 -8
- package/dist/domain/registry/read-assigned-crew-requests.js.map +1 -1
- package/dist/domain/registry/read-built-in-rules.d.ts +20 -0
- package/dist/domain/registry/read-built-in-rules.js +24 -0
- package/dist/domain/registry/read-built-in-rules.js.map +1 -0
- package/dist/domain/registry/read-clear-requests.d.ts +5 -3
- package/dist/domain/registry/read-clear-requests.js +7 -5
- package/dist/domain/registry/read-clear-requests.js.map +1 -1
- package/dist/domain/registry/read-network-plugin.d.ts +23 -0
- package/dist/domain/registry/read-network-plugin.js +15 -0
- package/dist/domain/registry/read-network-plugin.js.map +1 -0
- package/dist/domain/registry/read-on-behalf.d.ts +20 -0
- package/dist/domain/registry/read-on-behalf.js +31 -0
- package/dist/domain/registry/read-on-behalf.js.map +1 -0
- package/dist/domain/registry/read-reach.d.ts +64 -0
- package/dist/domain/registry/read-reach.js +83 -0
- package/dist/domain/registry/read-reach.js.map +1 -0
- package/dist/domain/registry/recrew-ship.d.ts +3 -2
- package/dist/domain/registry/recrew-ship.js +8 -1
- package/dist/domain/registry/recrew-ship.js.map +1 -1
- package/dist/domain/registry/release-ship.d.ts +10 -5
- package/dist/domain/registry/release-ship.js +11 -8
- package/dist/domain/registry/release-ship.js.map +1 -1
- package/dist/domain/registry/remove-crew-request.d.ts +4 -3
- package/dist/domain/registry/remove-crew-request.js +6 -1
- package/dist/domain/registry/remove-crew-request.js.map +1 -1
- package/dist/domain/registry/rename-ship.d.ts +7 -5
- package/dist/domain/registry/rename-ship.js +9 -3
- package/dist/domain/registry/rename-ship.js.map +1 -1
- package/dist/domain/registry/request-crew.d.ts +5 -4
- package/dist/domain/registry/request-crew.js +6 -1
- package/dist/domain/registry/request-crew.js.map +1 -1
- package/dist/domain/registry/request-worktree-clear.d.ts +3 -2
- package/dist/domain/registry/request-worktree-clear.js +6 -1
- package/dist/domain/registry/request-worktree-clear.js.map +1 -1
- package/dist/domain/registry/retire-ship.d.ts +17 -7
- package/dist/domain/registry/retire-ship.js +48 -5
- package/dist/domain/registry/retire-ship.js.map +1 -1
- package/dist/domain/registry/scope-grant.d.ts +53 -0
- package/dist/domain/registry/scope-grant.js +74 -0
- package/dist/domain/registry/scope-grant.js.map +1 -0
- package/dist/domain/registry/scope-namespace.d.ts +68 -0
- package/dist/domain/registry/scope-namespace.js +82 -0
- package/dist/domain/registry/scope-namespace.js.map +1 -0
- package/dist/domain/registry/set-built-in-rule.d.ts +28 -0
- package/dist/domain/registry/set-built-in-rule.js +33 -0
- package/dist/domain/registry/set-built-in-rule.js.map +1 -0
- package/dist/domain/registry/set-network-rules.d.ts +3 -3
- package/dist/domain/registry/set-network-rules.js +2 -2
- package/dist/domain/registry/set-owner.d.ts +30 -0
- package/dist/domain/registry/set-owner.js +37 -0
- package/dist/domain/registry/set-owner.js.map +1 -0
- package/dist/domain/registry/set-statement.d.ts +27 -0
- package/dist/domain/registry/set-statement.js +28 -0
- package/dist/domain/registry/set-statement.js.map +1 -0
- package/dist/domain/registry/ship.d.ts +74 -10
- package/dist/domain/registry/ship.js +128 -10
- package/dist/domain/registry/ship.js.map +1 -1
- package/dist/domain/registry/statement.d.ts +32 -0
- package/dist/domain/registry/statement.js +39 -0
- package/dist/domain/registry/statement.js.map +1 -0
- package/dist/domain/registry/unassign-label.js +1 -1
- package/dist/domain/registry/unassign-label.js.map +1 -1
- package/dist/domain/registry/whoami.d.ts +5 -1
- package/dist/domain/registry/whoami.js +7 -4
- package/dist/domain/registry/whoami.js.map +1 -1
- package/dist/domain/shared/caller.d.ts +5 -2
- package/dist/domain/shared/caller.js.map +1 -1
- package/dist/domain/shared/delivery-way.d.ts +9 -5
- package/dist/domain/shared/delivery-way.js +17 -5
- package/dist/domain/shared/delivery-way.js.map +1 -1
- package/dist/domain/shared/errors.d.ts +1 -1
- package/dist/domain/shared/errors.js.map +1 -1
- package/dist/domain/shared/events-read.d.ts +16 -0
- package/dist/domain/shared/events-read.js +15 -0
- package/dist/domain/shared/events-read.js.map +1 -0
- package/dist/domain/shared/follow-fleet.d.ts +8 -2
- package/dist/domain/shared/follow-fleet.js +14 -4
- package/dist/domain/shared/follow-fleet.js.map +1 -1
- package/dist/domain/shared/health.d.ts +11 -2
- package/dist/domain/shared/health.js +11 -3
- package/dist/domain/shared/health.js.map +1 -1
- package/dist/domain/shared/history.d.ts +11 -42
- package/dist/domain/shared/history.js +9 -0
- package/dist/domain/shared/history.js.map +1 -1
- package/dist/domain/shared/read-fleet-events.d.ts +8 -2
- package/dist/domain/shared/read-fleet-events.js +10 -4
- package/dist/domain/shared/read-fleet-events.js.map +1 -1
- package/dist/domain/shared/read-health.d.ts +5 -1
- package/dist/domain/shared/read-health.js +13 -2
- package/dist/domain/shared/read-health.js.map +1 -1
- package/dist/domain/shared/read-inbox.d.ts +6 -3
- package/dist/domain/shared/read-inbox.js +14 -4
- package/dist/domain/shared/read-inbox.js.map +1 -1
- package/dist/domain/shared/read-message.d.ts +6 -2
- package/dist/domain/shared/read-message.js +6 -2
- package/dist/domain/shared/read-message.js.map +1 -1
- package/dist/domain/shared/read-needs-attention.d.ts +4 -1
- package/dist/domain/shared/read-needs-attention.js +8 -3
- package/dist/domain/shared/read-needs-attention.js.map +1 -1
- package/dist/domain/shared/read-sent-message.d.ts +31 -0
- package/dist/domain/shared/read-sent-message.js +28 -0
- package/dist/domain/shared/read-sent-message.js.map +1 -0
- package/dist/domain/shared/read-ship-messages.d.ts +6 -2
- package/dist/domain/shared/read-ship-messages.js +7 -2
- package/dist/domain/shared/read-ship-messages.js.map +1 -1
- package/dist/domain/shared/read-ship-timeline.d.ts +5 -2
- package/dist/domain/shared/read-ship-timeline.js +11 -6
- package/dist/domain/shared/read-ship-timeline.js.map +1 -1
- package/dist/domain/shared/read-ship-way.d.ts +11 -4
- package/dist/domain/shared/read-ship-way.js +9 -2
- package/dist/domain/shared/read-ship-way.js.map +1 -1
- package/dist/domain/shared/stuck.d.ts +10 -1
- package/dist/domain/shared/stuck.js +5 -3
- package/dist/domain/shared/stuck.js.map +1 -1
- package/dist/testing/container-images.d.ts +14 -0
- package/dist/testing/container-images.js +18 -0
- package/dist/testing/container-images.js.map +1 -0
- package/dist/testing/database.d.ts +14 -0
- package/dist/testing/database.js +48 -0
- package/dist/testing/database.js.map +1 -0
- package/dist/testing/fleet.d.ts +13 -0
- package/dist/testing/fleet.js +17 -0
- package/dist/testing/fleet.js.map +1 -0
- package/dist/testing/index.d.ts +12 -0
- package/dist/testing/index.js +12 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/keys.d.ts +1 -0
- package/dist/testing/keys.js +7 -0
- package/dist/testing/keys.js.map +1 -0
- package/dist/testing/migrate-lock.d.ts +12 -0
- package/dist/testing/migrate-lock.js +51 -0
- package/dist/testing/migrate-lock.js.map +1 -0
- package/dist/testing/migrated-template.d.ts +12 -0
- package/dist/testing/migrated-template.js +29 -0
- package/dist/testing/migrated-template.js.map +1 -0
- package/dist/testing/postgres-container.d.ts +16 -0
- package/dist/testing/postgres-container.js +30 -0
- package/dist/testing/postgres-container.js.map +1 -0
- package/dist/testing/postgres-global-setup.d.ts +15 -0
- package/dist/testing/postgres-global-setup.js +20 -0
- package/dist/testing/postgres-global-setup.js.map +1 -0
- package/dist/testing/prisma-cli.d.ts +5 -0
- package/dist/testing/prisma-cli.js +15 -0
- package/dist/testing/prisma-cli.js.map +1 -0
- package/dist/testing/result.d.ts +5 -0
- package/dist/testing/result.js +15 -0
- package/dist/testing/result.js.map +1 -0
- package/dist/wiring.d.ts +26 -4
- package/dist/wiring.js +51 -18
- package/dist/wiring.js.map +1 -1
- package/package.json +28 -2
- package/src/adapters/prisma/migrations/20261018100000_force_scope/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261018110000_forced_delivery/migration.sql +4 -0
- package/src/adapters/prisma/migrations/20261018120000_person_and_app_ships/migration.sql +3 -0
- package/src/adapters/prisma/migrations/20261018130000_owners/migration.sql +14 -0
- package/src/adapters/prisma/migrations/20261018140000_owners_on_reach_refusals/migration.sql +14 -0
- package/src/adapters/prisma/migrations/20261018150000_network_verbs/migration.sql +9 -0
- package/src/adapters/prisma/migrations/20261018160000_built_in_rules/migration.sql +13 -0
- package/src/adapters/prisma/migrations/20261018170000_network_rules_a_list/migration.sql +5 -0
- package/src/adapters/prisma/migrations/20261018180000_verb_on_reach_refusals/migration.sql +4 -0
- package/src/adapters/prisma/migrations/20261018200000_lease_statements/migration.sql +3 -0
- package/src/adapters/prisma/migrations/20261018210000_declare_and_grant_scopes/migration.sql +8 -0
- package/src/adapters/prisma/migrations/20261018220000_plugin_scopes/migration.sql +14 -0
- package/src/adapters/prisma/migrations/20261018230000_scope_namespaces/migration.sql +20 -0
- package/src/adapters/prisma/migrations/20261018240000_trierarch_plugin_crew_run/migration.sql +44 -0
- package/src/adapters/prisma/migrations/20261018250000_scope_catalogue/migration.sql +67 -0
- package/src/adapters/prisma/migrations/20261019090000_reach_refusal_asked_by/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261019100000_on_behalf_scope/migration.sql +61 -0
- package/src/adapters/prisma/migrations/20261019110000_events_fleet_id_occurred_at/migration.sql +2 -0
- package/src/adapters/prisma/migrations/20261019130000_plugin_connections/migration.sql +54 -0
- package/src/adapters/prisma/migrations/20261019150000_network_plugin_registered_at/migration.sql +23 -0
- package/src/adapters/prisma/migrations/20261019160000_lease_waker/migration.sql +4 -0
- package/src/adapters/prisma/schema.prisma +81 -7
- package/dist/domain/shared/read-no-ship-can-take.d.ts +0 -13
- package/dist/domain/shared/read-no-ship-can-take.js +0 -12
- package/dist/domain/shared/read-no-ship-can-take.js.map +0 -1
- package/dist/domain/shared/read-overdue.d.ts +0 -13
- package/dist/domain/shared/read-overdue.js +0 -12
- package/dist/domain/shared/read-overdue.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type IdGenerator, type MessageId } from '@aeolus-fleet/common';
|
|
2
2
|
import { type CheckReachTx, type NotReachable, type ResolveSelectorTx, type UnresolvableSelector } from '../registry/public.js';
|
|
3
|
-
import type
|
|
3
|
+
import { type Caller } from '../shared/caller.js';
|
|
4
4
|
import type { Clock } from '../shared/clock.js';
|
|
5
5
|
import { type DomainError } from '../shared/errors.js';
|
|
6
6
|
import { type EventLog } from '../shared/events.js';
|
|
@@ -28,12 +28,14 @@ export interface MessageToSend {
|
|
|
28
28
|
idempotencyKey: string;
|
|
29
29
|
/** The id of the message, in the same fleet, this one replies to. */
|
|
30
30
|
inReplyTo?: MessageId;
|
|
31
|
+
/** A forced send: act now (decision 0040). It needs messages:force, and its delivery comes first. */
|
|
32
|
+
isForced?: boolean;
|
|
31
33
|
}
|
|
32
34
|
export interface MessageSent {
|
|
33
35
|
/** The message's id: the original one when the sender used the idempotency key before. */
|
|
34
36
|
messageId: MessageId;
|
|
35
37
|
}
|
|
36
|
-
export type SendMessageRefusal = DomainError<'PAYLOAD_TOO_LARGE' | 'INVALID_CONTENT_TYPE' | 'INVALID_IDEMPOTENCY_KEY' | 'RESERVED_CONTENT_TYPE'> | RepeatRefusal | UnresolvableSelector | AcceptRefusal | NotReachable | DomainError<'MESSAGE_LIMIT_REACHED'>;
|
|
38
|
+
export type SendMessageRefusal = DomainError<'PAYLOAD_TOO_LARGE' | 'INVALID_CONTENT_TYPE' | 'INVALID_IDEMPOTENCY_KEY' | 'RESERVED_CONTENT_TYPE' | 'FORCE_NOT_ALLOWED'> | RepeatRefusal | UnresolvableSelector | AcceptRefusal | NotReachable | DomainError<'MESSAGE_LIMIT_REACHED'>;
|
|
37
39
|
export type SendMessage = (caller: Caller, input: MessageToSend) => Promise<Result<MessageSent, SendMessageRefusal>>;
|
|
38
40
|
/**
|
|
39
41
|
* Use case: the calling ship sends a message (`send`). The sender is always
|
|
@@ -61,6 +63,10 @@ export type SendMessage = (caller: Caller, input: MessageToSend) => Promise<Resu
|
|
|
61
63
|
* its unit of work commits only the refusal's record, and the sender gets a
|
|
62
64
|
* refusal without reasons. argo, and an answer to the sender of a message the
|
|
63
65
|
* ship received, always go through.
|
|
66
|
+
*
|
|
67
|
+
* A forced send (decision 0040) needs messages:force, checked before the unit
|
|
68
|
+
* of work starts, so a refusal stores nothing; it rides send reach as any
|
|
69
|
+
* send. Its delivery records that it was forced and comes first.
|
|
64
70
|
*/
|
|
65
71
|
export declare function createSendMessage(deps: {
|
|
66
72
|
uow: UnitOfWork<SendMessageTx>;
|
|
@@ -76,6 +82,7 @@ export interface CheckedSend {
|
|
|
76
82
|
model: string | undefined;
|
|
77
83
|
idempotencyKey: string;
|
|
78
84
|
inReplyTo: MessageId | undefined;
|
|
85
|
+
isForced: boolean;
|
|
79
86
|
requestHash: string;
|
|
80
87
|
}
|
|
81
88
|
/**
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { isPingContentType, PING_CONTENT_TYPE } from '@aeolus-fleet/common';
|
|
2
2
|
import { checkReach, resolveSelector } from '../registry/public.js';
|
|
3
|
+
import { hasScope } from '../shared/caller.js';
|
|
3
4
|
import { refuse } from '../shared/errors.js';
|
|
4
5
|
import { recordEvent } from '../shared/events.js';
|
|
5
6
|
import { err, ok } from '../shared/result.js';
|
|
@@ -36,12 +37,19 @@ import { sendRequestText } from './send-request.js';
|
|
|
36
37
|
* its unit of work commits only the refusal's record, and the sender gets a
|
|
37
38
|
* refusal without reasons. argo, and an answer to the sender of a message the
|
|
38
39
|
* ship received, always go through.
|
|
40
|
+
*
|
|
41
|
+
* A forced send (decision 0040) needs messages:force, checked before the unit
|
|
42
|
+
* of work starts, so a refusal stores nothing; it rides send reach as any
|
|
43
|
+
* send. Its delivery records that it was forced and comes first.
|
|
39
44
|
*/
|
|
40
45
|
export function createSendMessage(deps) {
|
|
41
46
|
return async (caller, input) => {
|
|
42
47
|
if (input.contentType !== undefined && isPingContentType(input.contentType)) {
|
|
43
48
|
return refuse('RESERVED_CONTENT_TYPE', `${PING_CONTENT_TYPE} is reserved for pings: ping a ship from the console`);
|
|
44
49
|
}
|
|
50
|
+
if (input.isForced === true && !hasScope(caller, 'messages:force')) {
|
|
51
|
+
return refuse('FORCE_NOT_ALLOWED', 'A forced send needs the messages:force scope');
|
|
52
|
+
}
|
|
45
53
|
const request = checkedSend(input, deps.hasher);
|
|
46
54
|
if (!request.isOk) {
|
|
47
55
|
return request;
|
|
@@ -76,8 +84,9 @@ export function checkedSend(input, hasher) {
|
|
|
76
84
|
return key;
|
|
77
85
|
}
|
|
78
86
|
const { selector, inReplyTo } = input;
|
|
79
|
-
const
|
|
80
|
-
|
|
87
|
+
const isForced = input.isForced === true;
|
|
88
|
+
const requestHash = hasher.hash(sendRequestText({ selector, payload: text.value, contentType: mediaType.value, inReplyTo, isForced }));
|
|
89
|
+
return ok({ selector, payload: text.value, contentType: mediaType.value, model: input.model, idempotencyKey: key.value, inReplyTo, isForced, requestHash });
|
|
81
90
|
}
|
|
82
91
|
/** Sends a checked request inside the caller's unit of work, as {@link createSendMessage} describes. */
|
|
83
92
|
export async function sendWithin(deps, send) {
|
|
@@ -124,6 +133,7 @@ export async function sendWithin(deps, send) {
|
|
|
124
133
|
idempotencyKey: send.request.idempotencyKey,
|
|
125
134
|
requestHash,
|
|
126
135
|
inReplyTo,
|
|
136
|
+
isForced: send.request.isForced,
|
|
127
137
|
at,
|
|
128
138
|
});
|
|
129
139
|
if (!accepted.isOk) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../../src/domain/messaging/send-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAoC,MAAM,sBAAsB,CAAC;AAE9G,OAAO,EAAE,UAAU,EAAE,eAAe,EAA2F,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"send-message.js","sourceRoot":"","sources":["../../../src/domain/messaging/send-message.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,11 +6,13 @@ export interface SendRequest {
|
|
|
6
6
|
payload: string;
|
|
7
7
|
contentType: string;
|
|
8
8
|
inReplyTo: MessageId | undefined;
|
|
9
|
+
isForced: boolean;
|
|
9
10
|
}
|
|
10
11
|
/**
|
|
11
12
|
* The request as one text, the same for the same request whatever order its
|
|
12
13
|
* fields came in: the selector as sent (one ship by id and by name are two
|
|
13
|
-
* requests), the payload, the content type
|
|
14
|
+
* requests), the payload, the content type, the message it replies to and,
|
|
15
|
+
* only when forced, the force, so a plain send keeps the text it always had.
|
|
14
16
|
* Its hash is kept with the message to tell a repeat from a reused key.
|
|
15
17
|
*/
|
|
16
18
|
export declare function sendRequestText(request: SendRequest): string;
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The request as one text, the same for the same request whatever order its
|
|
3
3
|
* fields came in: the selector as sent (one ship by id and by name are two
|
|
4
|
-
* requests), the payload, the content type
|
|
4
|
+
* requests), the payload, the content type, the message it replies to and,
|
|
5
|
+
* only when forced, the force, so a plain send keeps the text it always had.
|
|
5
6
|
* Its hash is kept with the message to tell a repeat from a reused key.
|
|
6
7
|
*/
|
|
7
8
|
export function sendRequestText(request) {
|
|
8
|
-
|
|
9
|
+
const fields = [selectorFields(request.selector), request.payload, request.contentType, request.inReplyTo ?? null];
|
|
10
|
+
return JSON.stringify(request.isForced ? [...fields, 'forced'] : fields);
|
|
9
11
|
}
|
|
10
12
|
function selectorFields(selector) {
|
|
11
13
|
switch (selector.kind) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-request.js","sourceRoot":"","sources":["../../../src/domain/messaging/send-request.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"send-request.js","sourceRoot":"","sources":["../../../src/domain/messaging/send-request.ts"],"names":[],"mappings":"AAaA;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,OAAoB;IAClD,MAAM,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;IACnH,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,cAAc,CAAC,QAAkB;IACxC,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,MAAM;YACT,OAAO,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClG,KAAK,MAAM;YACT,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
|
|
@@ -18,7 +18,8 @@ export type AssignLabel = (caller: Caller, input: {
|
|
|
18
18
|
valueId: LabelValueId;
|
|
19
19
|
}) => Promise<Result<undefined, AssignLabelFailure>>;
|
|
20
20
|
/**
|
|
21
|
-
* Use case: a label's owner gives a ship one of its values, by the value's id (decision 0031)
|
|
21
|
+
* Use case: a label's owner gives a ship one of its values, by the value's id (decision 0031):
|
|
22
|
+
* its own ship or one it commissioned, argo any (decision 0046).
|
|
22
23
|
* Its scope (labels:assign) is checked before this runs. In one unit of
|
|
23
24
|
* work, locking the ship first, as a retire does, so two assignments to one
|
|
24
25
|
* ship take turns at its label limit and a retired ship gets none; then
|
|
@@ -3,7 +3,8 @@ import { recordEvent, shipActor } from '../shared/events.js';
|
|
|
3
3
|
import { ok } from '../shared/result.js';
|
|
4
4
|
import { assignLabel } from './label.js';
|
|
5
5
|
/**
|
|
6
|
-
* Use case: a label's owner gives a ship one of its values, by the value's id (decision 0031)
|
|
6
|
+
* Use case: a label's owner gives a ship one of its values, by the value's id (decision 0031):
|
|
7
|
+
* its own ship or one it commissioned, argo any (decision 0046).
|
|
7
8
|
* Its scope (labels:assign) is checked before this runs. In one unit of
|
|
8
9
|
* work, locking the ship first, as a retire does, so two assignments to one
|
|
9
10
|
* ship take turns at its label limit and a retired ship gets none; then
|
|
@@ -23,7 +24,7 @@ export function createAssignLabel(deps) {
|
|
|
23
24
|
return refuse('LABEL_VALUE_NOT_FOUND', `The fleet has no label value ${input.valueId}`);
|
|
24
25
|
}
|
|
25
26
|
const owner = await tx.ships.find(fleetId, label.ownerShipId);
|
|
26
|
-
const assigned = assignLabel({ label, ownerName: owner?.name ?? label.ownerShipId, ship, carried: await tx.labels.carriedBy(fleetId, ship.id) }, { callerShipId: caller.shipId, valueId: input.valueId, at: deps.clock.now(), actor: shipActor(caller.shipId) });
|
|
27
|
+
const assigned = assignLabel({ label, ownerName: owner?.name ?? label.ownerShipId, ship, carried: await tx.labels.carriedBy(fleetId, ship.id) }, { callerShipId: caller.shipId, callerKind: caller.kind, valueId: input.valueId, at: deps.clock.now(), actor: shipActor(caller.shipId) });
|
|
27
28
|
if (!assigned.isOk) {
|
|
28
29
|
return assigned;
|
|
29
30
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assign-label.js","sourceRoot":"","sources":["../../../src/domain/registry/assign-label.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,WAAW,EAA2B,MAAM,YAAY,CAAC;AAalE
|
|
1
|
+
{"version":3,"file":"assign-label.js","sourceRoot":"","sources":["../../../src/domain/registry/assign-label.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAiB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EAAE,WAAW,EAA2B,MAAM,YAAY,CAAC;AAalE;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAwE;IACxG,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CACvB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAkD,EAAE;QACxE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,MAAM,CAAC,gBAAgB,EAAE,QAAQ,KAAK,CAAC,MAAM,iBAAiB,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QAC1E,sFAAsF;QACtF,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/D,OAAO,MAAM,CAAC,uBAAuB,EAAE,gCAAgC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAC9D,MAAM,QAAQ,GAAG,WAAW,CAC1B,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,EAClH,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CACxI,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnB,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,IAAI,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YAC9B,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1C,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import type { FleetId, IdGenerator, ShipId } from '@aeolus-fleet/common';
|
|
2
2
|
import { type DomainError } from '../shared/errors.js';
|
|
3
3
|
import { type Result } from '../shared/result.js';
|
|
4
|
+
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
4
5
|
import type { Recipient } from '../shared/selector.js';
|
|
5
6
|
import type { CarriedLabel } from './label.js';
|
|
6
7
|
import { type NetworkSettings, type ReachingShip, type RulesInForce } from './network-settings.js';
|
|
7
|
-
import type { LabelRepository, LeaseRepository, NetworkSettingsRepository, ReachRefusalRepository, ShipRepository } from './ports.js';
|
|
8
|
+
import type { LabelRepository, LeaseRepository, NetworkSettingsRepository, PluginConnectionRepository, ReachRefusalRepository, ShipRepository } from './ports.js';
|
|
8
9
|
import type { Ship } from './ship.js';
|
|
9
10
|
/** The ports a send's reach check reads and writes, inside the send's unit of work. */
|
|
10
11
|
export interface CheckReachTx {
|
|
11
12
|
networkSettings: Pick<NetworkSettingsRepository, 'findForShare'>;
|
|
12
13
|
ships: Pick<ShipRepository, 'find' | 'listActiveOfType'>;
|
|
14
|
+
pluginConnections: Pick<PluginConnectionRepository, 'find'>;
|
|
13
15
|
labels: Pick<LabelRepository, 'carriedBy' | 'find'>;
|
|
14
16
|
reachRefusals: ReachRefusalRepository;
|
|
15
17
|
leases: Pick<LeaseRepository, 'findLastSeen'>;
|
|
@@ -28,8 +30,9 @@ export interface Reach {
|
|
|
28
30
|
* that comes after it is checked against the new version.
|
|
29
31
|
*
|
|
30
32
|
* For a type, the ships of it the sender may reach now are the ones that may
|
|
31
|
-
* claim the delivery, fixed here; none of them refuses the send. With
|
|
32
|
-
*
|
|
33
|
+
* claim the delivery, fixed here; none of them refuses the send. With open
|
|
34
|
+
* on for send, or from argo, who reaches every ship, any ship of the type
|
|
35
|
+
* may.
|
|
33
36
|
*
|
|
34
37
|
* A refusal is recorded here, in the send's unit of work, with the ships and
|
|
35
38
|
* the label values they carry now and the settings version: the send stores
|
|
@@ -49,6 +52,55 @@ export declare function checkReach(deps: {
|
|
|
49
52
|
isAnswerToSender: boolean;
|
|
50
53
|
at: Date;
|
|
51
54
|
}): Promise<Result<Reach, NotReachable>>;
|
|
55
|
+
/** The ports a read's reach check reads and writes, inside the read's unit of work. */
|
|
56
|
+
export type CheckReadTx = Omit<CheckReachTx, 'ships'> & {
|
|
57
|
+
ships: Pick<ShipRepository, 'find'>;
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* Whether the read rules let the reader read one ship now, for a read that
|
|
61
|
+
* a ship outside read reach refuses rather than filters (decision 0034). A
|
|
62
|
+
* ship always reads itself. A refusal is recorded here, in the read's unit of
|
|
63
|
+
* work, as a send's is, with the verb read: its caller commits only the record.
|
|
64
|
+
*/
|
|
65
|
+
export declare function checkRead(deps: {
|
|
66
|
+
tx: CheckReadTx;
|
|
67
|
+
ids: IdGenerator;
|
|
68
|
+
}, read: {
|
|
69
|
+
fleetId: FleetId;
|
|
70
|
+
readerShipId: ShipId;
|
|
71
|
+
askedBy: ShipId | null;
|
|
72
|
+
shipId: ShipId;
|
|
73
|
+
at: Date;
|
|
74
|
+
}): Promise<Result<undefined, NotReachable>>;
|
|
75
|
+
/** The ports a manage call's reach check reads and writes, inside the call's unit of work. */
|
|
76
|
+
export type CheckManageTx = CheckReadTx;
|
|
77
|
+
/**
|
|
78
|
+
* Whether the manage rules let the manager manage the ship now (decision
|
|
79
|
+
* 0034): every fleet:manage call is checked on its target ship, argo
|
|
80
|
+
* reaching every ship and an owner's ship the ships it owns. A refusal is
|
|
81
|
+
* recorded here, in the call's unit of work, with the verb manage: its caller
|
|
82
|
+
* commits only the record. A call that already holds the fleet's network
|
|
83
|
+
* settings for update hands them in, so the check takes no second lock on
|
|
84
|
+
* them.
|
|
85
|
+
*/
|
|
86
|
+
export declare function checkManage(deps: {
|
|
87
|
+
tx: CheckManageTx;
|
|
88
|
+
ids: IdGenerator;
|
|
89
|
+
}, manage: {
|
|
90
|
+
fleetId: FleetId;
|
|
91
|
+
managerShipId: ShipId;
|
|
92
|
+
shipId: ShipId;
|
|
93
|
+
at: Date;
|
|
94
|
+
settings?: NetworkSettings;
|
|
95
|
+
}): Promise<Result<undefined, NotReachable>>;
|
|
96
|
+
/**
|
|
97
|
+
* Runs a call in one unit of work that commits the record of a reach
|
|
98
|
+
* refusal: refused by the network rules, the call stores nothing but that
|
|
99
|
+
* record and answers the refusal; any other refusal rolls everything back.
|
|
100
|
+
*/
|
|
101
|
+
export declare function keepingReachRefusal<Tx, T, E extends {
|
|
102
|
+
kind: string;
|
|
103
|
+
}>(uow: UnitOfWork<Tx>, work: (tx: Tx) => Promise<Result<T, E | NotReachable>>): Promise<Result<T, E | NotReachable>>;
|
|
52
104
|
/** The rules in force at the send: the plugin's crew last seen, read without a lock, says whether it responds. */
|
|
53
105
|
export declare function rulesInForceAt(tx: Pick<CheckReachTx, 'leases'>, at: {
|
|
54
106
|
settings: NetworkSettings;
|
|
@@ -57,7 +109,18 @@ export declare function rulesInForceAt(tx: Pick<CheckReachTx, 'leases'>, at: {
|
|
|
57
109
|
export interface ShipAsItIs {
|
|
58
110
|
ship: Ship;
|
|
59
111
|
labels: CarriedLabel[];
|
|
112
|
+
/** Its owner's ship by id and name, none for argo and the viewer (decision 0045). */
|
|
113
|
+
owner: {
|
|
114
|
+
id: ShipId;
|
|
115
|
+
name: string;
|
|
116
|
+
} | null;
|
|
117
|
+
/** Whether argo connected it as a plugin (decision 0034). */
|
|
118
|
+
isConnectedPlugin: boolean;
|
|
60
119
|
}
|
|
61
|
-
/** The ship with the label values it carries now, by key then value, with their texts. */
|
|
62
|
-
export declare function shipAsItIs(tx:
|
|
63
|
-
|
|
120
|
+
/** The ship with the label values it carries now, by key then value, with their texts, and its owner. */
|
|
121
|
+
export declare function shipAsItIs(tx: {
|
|
122
|
+
labels: CheckReachTx['labels'];
|
|
123
|
+
ships: Pick<ShipRepository, 'find'>;
|
|
124
|
+
pluginConnections: CheckReachTx['pluginConnections'];
|
|
125
|
+
}, ship: Ship): Promise<ShipAsItIs>;
|
|
126
|
+
export declare function reaching({ ship, labels, isConnectedPlugin }: ShipAsItIs): ReachingShip;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { refuse } from '../shared/errors.js';
|
|
2
|
-
import { ok } from '../shared/result.js';
|
|
2
|
+
import { err, ok } from '../shared/result.js';
|
|
3
3
|
import { allowsReach, isNetworkPluginResponding, rulesInForce } from './network-settings.js';
|
|
4
4
|
/**
|
|
5
5
|
* Whether the fleet's network rules let the sender reach the recipient a
|
|
@@ -9,8 +9,9 @@ import { allowsReach, isNetworkPluginResponding, rulesInForce } from './network-
|
|
|
9
9
|
* that comes after it is checked against the new version.
|
|
10
10
|
*
|
|
11
11
|
* For a type, the ships of it the sender may reach now are the ones that may
|
|
12
|
-
* claim the delivery, fixed here; none of them refuses the send. With
|
|
13
|
-
*
|
|
12
|
+
* claim the delivery, fixed here; none of them refuses the send. With open
|
|
13
|
+
* on for send, or from argo, who reaches every ship, any ship of the type
|
|
14
|
+
* may.
|
|
14
15
|
*
|
|
15
16
|
* A refusal is recorded here, in the send's unit of work, with the ships and
|
|
16
17
|
* the label values they carry now and the settings version: the send stores
|
|
@@ -26,12 +27,12 @@ export async function checkReach(deps, send) {
|
|
|
26
27
|
const settings = await tx.networkSettings.findForShare(fleetId);
|
|
27
28
|
const inForce = await rulesInForceAt(tx, { settings, now: send.at });
|
|
28
29
|
const senderShip = await tx.ships.find(fleetId, send.senderShipId);
|
|
29
|
-
if (inForce.
|
|
30
|
+
if (inForce.builtIns.open.send || !senderShip || senderShip.kind === 'operator') {
|
|
30
31
|
return ok({});
|
|
31
32
|
}
|
|
32
33
|
const sender = await shipAsItIs(tx, senderShip);
|
|
33
|
-
const allows = (to) => allowsReach(inForce, { sender: reaching(sender), recipient: reaching(to), isAnswerToSender: send.isAnswerToSender });
|
|
34
|
-
const refusal = { fleetId, at: send.at, sender: refused(sender), settingsVersion: settings.version, whilePluginUnavailable: inForce.whilePluginUnavailable };
|
|
34
|
+
const allows = (to) => allowsReach(inForce, { verb: 'send', sender: reaching(sender), recipient: reaching(to), isAnswerToSender: send.isAnswerToSender });
|
|
35
|
+
const refusal = { fleetId, at: send.at, sender: refused(sender), askedBy: null, verb: 'send', settingsVersion: settings.version, whilePluginUnavailable: inForce.whilePluginUnavailable };
|
|
35
36
|
if (recipient.kind === 'type') {
|
|
36
37
|
const ships = [];
|
|
37
38
|
for (const ship of await tx.ships.listActiveOfType(fleetId, recipient.type)) {
|
|
@@ -57,6 +58,100 @@ export async function checkReach(deps, send) {
|
|
|
57
58
|
return refuse('NOT_REACHABLE', NOT_REACHABLE_MESSAGE);
|
|
58
59
|
}
|
|
59
60
|
const NOT_REACHABLE_MESSAGE = 'The network rules do not allow this send';
|
|
61
|
+
/**
|
|
62
|
+
* Whether the read rules let the reader read one ship now, for a read that
|
|
63
|
+
* a ship outside read reach refuses rather than filters (decision 0034). A
|
|
64
|
+
* ship always reads itself. A refusal is recorded here, in the read's unit of
|
|
65
|
+
* work, as a send's is, with the verb read: its caller commits only the record.
|
|
66
|
+
*/
|
|
67
|
+
export async function checkRead(deps, read) {
|
|
68
|
+
const { tx, ids } = deps;
|
|
69
|
+
const { fleetId, at } = read;
|
|
70
|
+
const settings = await tx.networkSettings.findForShare(fleetId);
|
|
71
|
+
const inForce = await rulesInForceAt(tx, { settings, now: at });
|
|
72
|
+
const readerShip = await tx.ships.find(fleetId, read.readerShipId);
|
|
73
|
+
const readShip = await tx.ships.find(fleetId, read.shipId);
|
|
74
|
+
if (!readerShip || !readShip || readerShip.id === readShip.id) {
|
|
75
|
+
return ok(undefined);
|
|
76
|
+
}
|
|
77
|
+
const reader = await shipAsItIs(tx, readerShip);
|
|
78
|
+
const ship = await shipAsItIs(tx, readShip);
|
|
79
|
+
if (allowsReach(inForce, { verb: 'read', sender: reaching(reader), recipient: reaching(ship), isAnswerToSender: false })) {
|
|
80
|
+
return ok(undefined);
|
|
81
|
+
}
|
|
82
|
+
const askedBy = read.askedBy === null ? undefined : await tx.ships.find(fleetId, read.askedBy);
|
|
83
|
+
await tx.reachRefusals.record({
|
|
84
|
+
fleetId,
|
|
85
|
+
id: ids('reachRefusal'),
|
|
86
|
+
at,
|
|
87
|
+
sender: refused(reader),
|
|
88
|
+
askedBy: askedBy ? refused(await shipAsItIs(tx, askedBy)) : null,
|
|
89
|
+
recipient: { kind: 'ship', ship: refused(ship) },
|
|
90
|
+
verb: 'read',
|
|
91
|
+
settingsVersion: settings.version,
|
|
92
|
+
whilePluginUnavailable: inForce.whilePluginUnavailable,
|
|
93
|
+
});
|
|
94
|
+
return refuse('NOT_REACHABLE', 'The network rules do not allow this read');
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Whether the manage rules let the manager manage the ship now (decision
|
|
98
|
+
* 0034): every fleet:manage call is checked on its target ship, argo
|
|
99
|
+
* reaching every ship and an owner's ship the ships it owns. A refusal is
|
|
100
|
+
* recorded here, in the call's unit of work, with the verb manage: its caller
|
|
101
|
+
* commits only the record. A call that already holds the fleet's network
|
|
102
|
+
* settings for update hands them in, so the check takes no second lock on
|
|
103
|
+
* them.
|
|
104
|
+
*/
|
|
105
|
+
export async function checkManage(deps, manage) {
|
|
106
|
+
const { tx, ids } = deps;
|
|
107
|
+
const { fleetId, at } = manage;
|
|
108
|
+
const settings = manage.settings ?? (await tx.networkSettings.findForShare(fleetId));
|
|
109
|
+
const inForce = await rulesInForceAt(tx, { settings, now: at });
|
|
110
|
+
const managerShip = await tx.ships.find(fleetId, manage.managerShipId);
|
|
111
|
+
const managedShip = await tx.ships.find(fleetId, manage.shipId);
|
|
112
|
+
if (!managerShip || !managedShip) {
|
|
113
|
+
return ok(undefined);
|
|
114
|
+
}
|
|
115
|
+
const manager = await shipAsItIs(tx, managerShip);
|
|
116
|
+
const ship = await shipAsItIs(tx, managedShip);
|
|
117
|
+
if (allowsReach(inForce, { verb: 'manage', sender: reaching(manager), recipient: reaching(ship), isAnswerToSender: false })) {
|
|
118
|
+
return ok(undefined);
|
|
119
|
+
}
|
|
120
|
+
await tx.reachRefusals.record({
|
|
121
|
+
fleetId,
|
|
122
|
+
id: ids('reachRefusal'),
|
|
123
|
+
at,
|
|
124
|
+
sender: refused(manager),
|
|
125
|
+
askedBy: null,
|
|
126
|
+
recipient: { kind: 'ship', ship: refused(ship) },
|
|
127
|
+
verb: 'manage',
|
|
128
|
+
settingsVersion: settings.version,
|
|
129
|
+
whilePluginUnavailable: inForce.whilePluginUnavailable,
|
|
130
|
+
});
|
|
131
|
+
return refuse('NOT_REACHABLE', 'The network rules do not allow this manage');
|
|
132
|
+
}
|
|
133
|
+
/** Whether a refusal is the reach check's: its record commits, though the call is refused. */
|
|
134
|
+
function isNotReachable(error) {
|
|
135
|
+
return error.kind === 'NOT_REACHABLE';
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Runs a call in one unit of work that commits the record of a reach
|
|
139
|
+
* refusal: refused by the network rules, the call stores nothing but that
|
|
140
|
+
* record and answers the refusal; any other refusal rolls everything back.
|
|
141
|
+
*/
|
|
142
|
+
export async function keepingReachRefusal(uow, work) {
|
|
143
|
+
const outcome = await uow.run(async (tx) => {
|
|
144
|
+
const done = await work(tx);
|
|
145
|
+
if (done.isOk) {
|
|
146
|
+
return ok({ done: done.value });
|
|
147
|
+
}
|
|
148
|
+
return isNotReachable(done.error) ? ok({ prevented: done.error }) : err(done.error);
|
|
149
|
+
});
|
|
150
|
+
if (!outcome.isOk) {
|
|
151
|
+
return outcome;
|
|
152
|
+
}
|
|
153
|
+
return 'prevented' in outcome.value ? err(outcome.value.prevented) : ok(outcome.value.done);
|
|
154
|
+
}
|
|
60
155
|
/** The rules in force at the send: the plugin's crew last seen, read without a lock, says whether it responds. */
|
|
61
156
|
export async function rulesInForceAt(tx, at) {
|
|
62
157
|
const { settings, now } = at;
|
|
@@ -67,7 +162,7 @@ export async function rulesInForceAt(tx, at) {
|
|
|
67
162
|
const lastSeenAt = await tx.leases.findLastSeen(settings.fleetId, plugin.shipId);
|
|
68
163
|
return rulesInForce(settings, isNetworkPluginResponding(plugin, { lastSeenAt, now }));
|
|
69
164
|
}
|
|
70
|
-
/** The ship with the label values it carries now, by key then value, with their texts. */
|
|
165
|
+
/** The ship with the label values it carries now, by key then value, with their texts, and its owner. */
|
|
71
166
|
export async function shipAsItIs(tx, ship) {
|
|
72
167
|
const labels = [];
|
|
73
168
|
for (const carried of await tx.labels.carriedBy(ship.fleetId, ship.id)) {
|
|
@@ -78,12 +173,14 @@ export async function shipAsItIs(tx, ship) {
|
|
|
78
173
|
}
|
|
79
174
|
}
|
|
80
175
|
labels.sort((first, second) => first.key.localeCompare(second.key) || first.value.localeCompare(second.value));
|
|
81
|
-
|
|
176
|
+
const owner = ship.owner === null ? undefined : await tx.ships.find(ship.fleetId, ship.owner);
|
|
177
|
+
const isConnectedPlugin = (await tx.pluginConnections.find(ship.fleetId, ship.id)) !== undefined;
|
|
178
|
+
return { ship, labels, owner: owner ? { id: owner.id, name: owner.name } : null, isConnectedPlugin };
|
|
82
179
|
}
|
|
83
|
-
export function reaching({ ship, labels }) {
|
|
84
|
-
return { kind: ship.kind, labels: labels.map(({ labelId, valueId }) => ({ labelId, valueId })) };
|
|
180
|
+
export function reaching({ ship, labels, isConnectedPlugin }) {
|
|
181
|
+
return { id: ship.id, owner: ship.owner, kind: ship.kind, isConnectedPlugin, labels: labels.map(({ labelId, valueId }) => ({ labelId, valueId })) };
|
|
85
182
|
}
|
|
86
|
-
function refused({ ship, labels }) {
|
|
87
|
-
return { id: ship.id, name: ship.name, labels };
|
|
183
|
+
function refused({ ship, labels, owner }) {
|
|
184
|
+
return { id: ship.id, name: ship.name, labels, owner };
|
|
88
185
|
}
|
|
89
186
|
//# sourceMappingURL=check-reach.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-reach.js","sourceRoot":"","sources":["../../../src/domain/registry/check-reach.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAoB,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,EAAE,EAAe,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"check-reach.js","sourceRoot":"","sources":["../../../src/domain/registry/check-reach.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { CommissionedShipKind, IdGenerator, ShipId } from '@aeolus-fleet/common';
|
|
2
2
|
import type { SecretTools } from '../identity/public.js';
|
|
3
3
|
import type { Caller } from '../shared/caller.js';
|
|
4
4
|
import type { Clock } from '../shared/clock.js';
|
|
@@ -6,17 +6,24 @@ import { type DomainError } from '../shared/errors.js';
|
|
|
6
6
|
import { type Result } from '../shared/result.js';
|
|
7
7
|
import type { UnitOfWork } from '../shared/unit-of-work.js';
|
|
8
8
|
import { type AppliedLimitsTx } from './applied-limits.js';
|
|
9
|
+
import { type NamedNamespacesTx } from './named-namespaces.js';
|
|
9
10
|
import type { ShipRepository } from './ports.js';
|
|
10
11
|
import { type CommissionRefusal } from './ship.js';
|
|
11
12
|
import { type StartingPromptTx } from './starting-prompt.js';
|
|
12
|
-
export interface CommissionShipTx extends StartingPromptTx, AppliedLimitsTx {
|
|
13
|
+
export interface CommissionShipTx extends StartingPromptTx, AppliedLimitsTx, NamedNamespacesTx {
|
|
13
14
|
ships: ShipRepository;
|
|
14
15
|
}
|
|
15
16
|
export interface CommissionShipInput {
|
|
16
17
|
name: string;
|
|
17
18
|
type: string;
|
|
19
|
+
/** An agent when left out; only argo commissions a person or app ship (decision 0044). */
|
|
20
|
+
kind?: CommissionedShipKind;
|
|
18
21
|
note?: string;
|
|
19
|
-
|
|
22
|
+
scopes?: readonly string[];
|
|
23
|
+
/** The ship that asked the caller, a plugin's ship holding fleet:on-behalf, for this one: the new ship gets its owner (decision 0045). */
|
|
24
|
+
ownerOf?: ShipId;
|
|
25
|
+
/** The owner argo picked for an app ship that a ship holding fleet:on-behalf, the gateway, commissions (decision 0045). */
|
|
26
|
+
owner?: ShipId;
|
|
20
27
|
/** The caller's own key for this commission, so a retry never commissions twice. */
|
|
21
28
|
idempotencyKey: string;
|
|
22
29
|
}
|
|
@@ -34,14 +41,20 @@ export interface CommissionedShip {
|
|
|
34
41
|
isClaimed: boolean;
|
|
35
42
|
} | null;
|
|
36
43
|
}
|
|
37
|
-
export type CommissionShipRefusal = CommissionRefusal | DomainError<'INVALID_IDEMPOTENCY_KEY' | 'IDEMPOTENCY_KEY_REUSED' | 'SHIP_LIMIT_REACHED'>;
|
|
44
|
+
export type CommissionShipRefusal = CommissionRefusal | DomainError<'INVALID_IDEMPOTENCY_KEY' | 'IDEMPOTENCY_KEY_REUSED' | 'SHIP_LIMIT_REACHED' | 'SHIP_NOT_FOUND'>;
|
|
38
45
|
export type CommissionShip = (caller: Caller, input: CommissionShipInput) => Promise<Result<CommissionedShip, CommissionShipRefusal>>;
|
|
39
46
|
/**
|
|
40
|
-
* Use case: the caller commissions
|
|
47
|
+
* Use case: the caller commissions a ship in its own fleet, an agent unless
|
|
48
|
+
* it states another kind (only argo commissions a person ship; an app ship
|
|
49
|
+
* also a caller holding fleet:on-behalf, the gateway). The ship
|
|
41
50
|
* awaits crew and gets its first starting prompt, all in one transaction. The
|
|
42
|
-
* caller's scope (fleet:
|
|
43
|
-
* the agent scopes and
|
|
44
|
-
*
|
|
51
|
+
* caller's scope (fleet:commission) is checked before this runs. The ship gets
|
|
52
|
+
* the agent scopes and the scopes asked for, each one the caller's ship may
|
|
53
|
+
* grant, read from the server (decision 0046); each plugin namespace they
|
|
54
|
+
* name is locked after the name. Its owner is the caller's owner; a caller
|
|
55
|
+
* holding fleet:on-behalf may name the ship that asked it instead, whose owner
|
|
56
|
+
* it gets, or for an app ship the owner argo picked (decision 0045). The
|
|
57
|
+
* caller's idempotency key makes
|
|
45
58
|
* a retry safe: the same key with the same request answers the ship it
|
|
46
59
|
* commissioned, with no secret, and changes nothing; the same key with another
|
|
47
60
|
* request is refused.
|