@astrale-os/cli 1.0.0-beta.32 → 1.0.0-beta.43
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/CHANGELOG.md +928 -0
- package/README.md +53 -43
- package/THIRD-PARTY-NOTICES.md +37 -1
- package/dist/astrale.js +349631 -83669
- package/dist/public/connect-core.js +16 -47
- package/dist/public/keys/index.js +1 -1
- package/dist/types/admin/contract.d.ts +11 -0
- package/dist/types/admin/graph/index.d.ts +1 -0
- package/dist/types/admin/graph/nodes.d.ts +12 -0
- package/dist/types/admin/instance/client.d.ts +2 -0
- package/dist/types/connection/lifetime.d.ts +1 -1
- package/dist/types/errors.d.ts +3 -0
- package/dist/types/lib/proc.d.ts +1 -0
- package/dist/types/lib/update.d.ts +15 -7
- package/package.json +8 -6
- package/studio/client/dist/assets/index-5C1uT6ML.css +2 -0
- package/studio/client/dist/assets/index-C4kNlvwF.js +80 -0
- package/studio/client/dist/assets/schema-studio-BR9d0faB.js +8 -0
- package/studio/client/dist/index.html +13 -2
- package/studio/package.json +2 -1
- package/studio/server/agent/ask.test.ts +7 -1
- package/studio/server/agent/bridge/grant.ts +15 -3
- package/studio/server/agent/prompts/system.test.ts +5 -0
- package/studio/server/agent/prompts/system.ts +19 -4
- package/studio/server/agent/routes.test.ts +39 -1
- package/studio/server/agent/routes.ts +3 -0
- package/studio/server/agent/run/coordinator.test.ts +7 -1
- package/studio/server/agent/run/preparation.ts +1 -0
- package/studio/server/agent/run/transcript.test.ts +47 -2
- package/studio/server/agent/run/transcript.ts +32 -3
- package/studio/server/api/documents.test.ts +31 -0
- package/studio/server/api/documents.ts +35 -1
- package/studio/server/api-agent-loadout.test.ts +7 -1
- package/studio/server/api.test.ts +7 -1
- package/studio/server/cache.ts +4 -4
- package/studio/server/detect.ts +9 -12
- package/studio/server/domain.test.ts +83 -3
- package/studio/server/domain.ts +205 -27
- package/studio/server/handoff/service.ts +1 -1
- package/studio/server/index.ts +5 -8
- package/studio/server/introspect/extractor.ts +111 -17
- package/studio/server/introspect/overlay-tsmorph.test.ts +9 -9
- package/studio/server/introspect/overlay.ts +1 -1
- package/studio/server/introspect/runtime.ts +9 -1
- package/studio/server/introspect/source-overlay/spans.ts +2 -5
- package/studio/server/lifecycle.ts +1 -1
- package/studio/server/state/baseline.test.ts +14 -0
- package/studio/server/state/baseline.ts +16 -2
- package/studio/server/watch.test.ts +2 -1
- package/studio/server/watch.ts +5 -2
- package/studio/server/workspace/create.ts +9 -8
- package/studio/server/workspace-state.ts +4 -6
- package/studio/server/workspace-watch.ts +33 -22
- package/studio/shared/contracts/agent.ts +3 -0
- package/viewer/dist/main.js +12 -12
- package/src/__tests__/fixtures/publication.ts +0 -20
- package/src/admin/.spec/api.d.ts +0 -3
- package/src/admin/.spec/architecture.md +0 -22
- package/src/admin/.spec/icon.svg +0 -3
- package/src/admin/.spec/layout.ts +0 -6
- package/src/admin/__tests__/fixture.ts +0 -25
- package/src/admin/catalog/.spec/api.d.ts +0 -63
- package/src/admin/catalog/.spec/architecture.md +0 -7
- package/src/admin/catalog/.spec/icon.svg +0 -3
- package/src/admin/catalog/.spec/layout.ts +0 -6
- package/src/admin/catalog/__tests__/client.test.ts +0 -245
- package/src/admin/catalog/client.ts +0 -195
- package/src/admin/catalog/index.ts +0 -13
- package/src/admin/catalog/model.ts +0 -41
- package/src/admin/catalog/tsconfig.json +0 -8
- package/src/admin/contract.ts +0 -47
- package/src/admin/graph/.spec/api.d.ts +0 -22
- package/src/admin/graph/.spec/architecture.md +0 -5
- package/src/admin/graph/.spec/icon.svg +0 -3
- package/src/admin/graph/.spec/layout.ts +0 -3
- package/src/admin/graph/index.ts +0 -6
- package/src/admin/graph/nodes.ts +0 -56
- package/src/admin/index.ts +0 -2
- package/src/admin/instance/.spec/api.d.ts +0 -62
- package/src/admin/instance/.spec/architecture.md +0 -10
- package/src/admin/instance/.spec/icon.svg +0 -3
- package/src/admin/instance/.spec/layout.ts +0 -6
- package/src/admin/instance/__tests__/client.test.ts +0 -273
- package/src/admin/instance/client.ts +0 -191
- package/src/admin/instance/index.ts +0 -15
- package/src/admin/instance/model.ts +0 -59
- package/src/admin/instance/tsconfig.json +0 -8
- package/src/commands/__tests__/admin-instance.test.ts +0 -91
- package/src/commands/__tests__/auth-login.test.ts +0 -231
- package/src/commands/__tests__/auth-token.test.ts +0 -223
- package/src/commands/__tests__/call-describe.test.ts +0 -80
- package/src/commands/__tests__/call.test.ts +0 -63
- package/src/commands/__tests__/domain-install-operation.test.ts +0 -145
- package/src/commands/__tests__/domain-install-owned.test.ts +0 -191
- package/src/commands/__tests__/domain-list.test.ts +0 -133
- package/src/commands/__tests__/domain-uninstall.test.ts +0 -53
- package/src/commands/__tests__/install-direct.test.ts +0 -128
- package/src/commands/__tests__/install-identity-override.test.ts +0 -76
- package/src/commands/__tests__/instance-bookmark.test.ts +0 -166
- package/src/commands/__tests__/instance-list-admin.test.ts +0 -26
- package/src/commands/__tests__/instance-list-rows.test.ts +0 -64
- package/src/commands/__tests__/instance-status.test.ts +0 -139
- package/src/commands/__tests__/instance-use.test.ts +0 -67
- package/src/commands/__tests__/introspect-parse.test.ts +0 -100
- package/src/commands/__tests__/logs.test.ts +0 -345
- package/src/commands/__tests__/read-commands.test.ts +0 -377
- package/src/commands/__tests__/setup-plan.test.ts +0 -61
- package/src/commands/__tests__/studio-descriptor.test.ts +0 -22
- package/src/commands/__tests__/token-ttl.test.ts +0 -66
- package/src/commands/__tests__/update.test.ts +0 -95
- package/src/commands/__tests__/view-build.test.ts +0 -58
- package/src/commands/__tests__/view.test.ts +0 -197
- package/src/commands/admin/status.ts +0 -61
- package/src/commands/admin/use.ts +0 -100
- package/src/commands/auth/login.ts +0 -82
- package/src/commands/auth/logout.ts +0 -53
- package/src/commands/auth/status.ts +0 -86
- package/src/commands/auth/token.ts +0 -174
- package/src/commands/browser.ts +0 -236
- package/src/commands/call-describe.ts +0 -123
- package/src/commands/call.ts +0 -230
- package/src/commands/domain/install.ts +0 -575
- package/src/commands/domain/list.ts +0 -155
- package/src/commands/domain/publish.ts +0 -136
- package/src/commands/domain/uninstall.ts +0 -128
- package/src/commands/get.ts +0 -69
- package/src/commands/identity/__tests__/register.test.ts +0 -93
- package/src/commands/identity/create.ts +0 -35
- package/src/commands/identity/delete.ts +0 -24
- package/src/commands/identity/export.ts +0 -46
- package/src/commands/identity/import.ts +0 -61
- package/src/commands/identity/list.ts +0 -56
- package/src/commands/identity/register.ts +0 -195
- package/src/commands/identity/sync.ts +0 -38
- package/src/commands/identity/unsync.ts +0 -34
- package/src/commands/identity/use.ts +0 -24
- package/src/commands/identity/whoami.ts +0 -34
- package/src/commands/idp/add.ts +0 -150
- package/src/commands/idp/list.ts +0 -57
- package/src/commands/idp/refresh.ts +0 -38
- package/src/commands/idp/remove.ts +0 -36
- package/src/commands/idp/show.ts +0 -29
- package/src/commands/instance/active.ts +0 -73
- package/src/commands/instance/bookmark.ts +0 -101
- package/src/commands/instance/create.ts +0 -61
- package/src/commands/instance/delete.ts +0 -69
- package/src/commands/instance/forget.ts +0 -26
- package/src/commands/instance/list.ts +0 -197
- package/src/commands/instance/status.ts +0 -92
- package/src/commands/instance/use.ts +0 -263
- package/src/commands/introspect.ts +0 -129
- package/src/commands/logs.ts +0 -371
- package/src/commands/mutate.ts +0 -122
- package/src/commands/query.ts +0 -142
- package/src/commands/session/analyze.ts +0 -72
- package/src/commands/session/list.ts +0 -36
- package/src/commands/setup.ts +0 -54
- package/src/commands/status.ts +0 -60
- package/src/commands/studio.ts +0 -434
- package/src/commands/token.ts +0 -121
- package/src/commands/ui/__tests__/commands.test.ts +0 -152
- package/src/commands/ui/add.ts +0 -51
- package/src/commands/ui/doctor.ts +0 -21
- package/src/commands/ui/init.ts +0 -38
- package/src/commands/ui/list.ts +0 -26
- package/src/commands/ui/preset-apply.ts +0 -19
- package/src/commands/ui/preset-list.ts +0 -12
- package/src/commands/ui/shared.ts +0 -25
- package/src/commands/update.ts +0 -356
- package/src/commands/use.ts +0 -86
- package/src/commands/view-serve.ts +0 -26
- package/src/commands/view.ts +0 -658
- package/src/connect-core.test.ts +0 -38
- package/src/connect-core.ts +0 -42
- package/src/connection/.spec/api.d.ts +0 -110
- package/src/connection/.spec/architecture.md +0 -58
- package/src/connection/.spec/capabilities/connection.ts +0 -13
- package/src/connection/.spec/examples/call.ts +0 -7
- package/src/connection/.spec/flows/command.ts +0 -20
- package/src/connection/.spec/flows/session.ts +0 -62
- package/src/connection/.spec/laws/connection.ts +0 -213
- package/src/connection/.spec/layout.ts +0 -22
- package/src/connection/__tests__/auth.test.ts +0 -129
- package/src/connection/__tests__/ca-fetch.test.ts +0 -60
- package/src/connection/__tests__/call.test.ts +0 -17
- package/src/connection/__tests__/credential.test.ts +0 -254
- package/src/connection/__tests__/errors.test.ts +0 -577
- package/src/connection/__tests__/exchange.test.ts +0 -404
- package/src/connection/__tests__/failure-fixtures.ts +0 -39
- package/src/connection/__tests__/failure-safety.test.ts +0 -75
- package/src/connection/__tests__/fixtures/localhost-cert.pem +0 -19
- package/src/connection/__tests__/fixtures/localhost-key.base64 +0 -1
- package/src/connection/__tests__/managed.test.ts +0 -39
- package/src/connection/__tests__/reasons.test.ts +0 -78
- package/src/connection/__tests__/self.test.ts +0 -71
- package/src/connection/__tests__/session.test.ts +0 -144
- package/src/connection/__tests__/target.test.ts +0 -95
- package/src/connection/auth.ts +0 -265
- package/src/connection/call.ts +0 -7
- package/src/connection/command.ts +0 -67
- package/src/connection/credential.ts +0 -138
- package/src/connection/errors.ts +0 -1
- package/src/connection/exchange.ts +0 -394
- package/src/connection/failure/classify.ts +0 -110
- package/src/connection/failure/index.ts +0 -18
- package/src/connection/failure/model.ts +0 -28
- package/src/connection/failure/render.ts +0 -116
- package/src/connection/index.ts +0 -8
- package/src/connection/lifetime.ts +0 -25
- package/src/connection/reasons.ts +0 -209
- package/src/connection/self.ts +0 -138
- package/src/connection/session.ts +0 -203
- package/src/connection/target.ts +0 -112
- package/src/connection/tsconfig.json +0 -6
- package/src/errors.ts +0 -66
- package/src/graph/.spec/api.d.ts +0 -41
- package/src/graph/.spec/laws/documents.ts +0 -24
- package/src/graph/.spec/laws/projection.ts +0 -13
- package/src/graph/.spec/layout.ts +0 -14
- package/src/graph/__tests__/mutation.test.ts +0 -51
- package/src/graph/__tests__/projection.test.ts +0 -22
- package/src/graph/__tests__/query.test.ts +0 -180
- package/src/graph/class.ts +0 -30
- package/src/graph/index.ts +0 -4
- package/src/graph/mutation.ts +0 -46
- package/src/graph/projection.ts +0 -21
- package/src/graph/query.ts +0 -95
- package/src/graph/tsconfig.json +0 -6
- package/src/identity/.history/ard/bootstrap-root-transfer.md +0 -57
- package/src/identity/.history/ard/domain-mediated-registration.md +0 -36
- package/src/identity/.spec/api.d.ts +0 -124
- package/src/identity/.spec/architecture.md +0 -33
- package/src/identity/.spec/capabilities/identity.ts +0 -7
- package/src/identity/.spec/flows/bootstrap-root.ts +0 -79
- package/src/identity/.spec/flows/domain-mediated-registration.ts +0 -51
- package/src/identity/.spec/flows/import.ts +0 -29
- package/src/identity/.spec/laws/identity.ts +0 -56
- package/src/identity/.spec/layout.ts +0 -13
- package/src/identity/__tests__/fixtures/registry-journey.ts +0 -65
- package/src/identity/__tests__/registration.test.ts +0 -64
- package/src/identity/__tests__/registry.test.ts +0 -74
- package/src/identity/__tests__/transfer.test.ts +0 -198
- package/src/identity/index.ts +0 -23
- package/src/identity/registration.ts +0 -72
- package/src/identity/registry.ts +0 -181
- package/src/identity/transfer.ts +0 -187
- package/src/identity/tsconfig.json +0 -6
- package/src/index.ts +0 -1
- package/src/keys/.spec/api.d.ts +0 -74
- package/src/keys/.spec/architecture.md +0 -13
- package/src/keys/.spec/laws/keys.ts +0 -43
- package/src/keys/.spec/layout.ts +0 -6
- package/src/keys/__tests__/algorithm.test.ts +0 -39
- package/src/keys/__tests__/keys.test.ts +0 -172
- package/src/keys/algorithm.ts +0 -33
- package/src/keys/credential.ts +0 -113
- package/src/keys/index.ts +0 -14
- package/src/keys/pair.ts +0 -219
- package/src/keys/tsconfig.json +0 -6
- package/src/lib/__tests__/admin-target.test.ts +0 -184
- package/src/lib/__tests__/binary.test.ts +0 -70
- package/src/lib/__tests__/browser-retention.test.ts +0 -212
- package/src/lib/__tests__/command-dx.test.ts +0 -102
- package/src/lib/__tests__/concurrency.test.ts +0 -62
- package/src/lib/__tests__/config.test.ts +0 -81
- package/src/lib/__tests__/design.test.ts +0 -99
- package/src/lib/__tests__/domain-publication.test.ts +0 -138
- package/src/lib/__tests__/format.test.ts +0 -22
- package/src/lib/__tests__/idp-session.driver.ts +0 -60
- package/src/lib/__tests__/idp-session.test.ts +0 -404
- package/src/lib/__tests__/idp.test.ts +0 -415
- package/src/lib/__tests__/instance-candidates.test.ts +0 -146
- package/src/lib/__tests__/instance-target.test.ts +0 -213
- package/src/lib/__tests__/instance.test.ts +0 -192
- package/src/lib/__tests__/local-status.test.ts +0 -202
- package/src/lib/__tests__/log-errors.test.ts +0 -64
- package/src/lib/__tests__/log.test.ts +0 -31
- package/src/lib/__tests__/meta.test.ts +0 -55
- package/src/lib/__tests__/output.test.ts +0 -162
- package/src/lib/__tests__/panel.test.ts +0 -40
- package/src/lib/__tests__/port.test.ts +0 -44
- package/src/lib/__tests__/prompt.test.ts +0 -25
- package/src/lib/__tests__/sdk-deps.test.ts +0 -68
- package/src/lib/__tests__/self.test.ts +0 -50
- package/src/lib/__tests__/skills.test.ts +0 -834
- package/src/lib/__tests__/studio-server-deps.test.ts +0 -111
- package/src/lib/__tests__/table.test.ts +0 -53
- package/src/lib/__tests__/update.test.ts +0 -511
- package/src/lib/__tests__/use-target.test.ts +0 -56
- package/src/lib/__tests__/validation.test.ts +0 -34
- package/src/lib/__tests__/view-assets.test.ts +0 -171
- package/src/lib/__tests__/view-external-open-intent.test.ts +0 -150
- package/src/lib/__tests__/view-external-open-origins.test.ts +0 -27
- package/src/lib/__tests__/view-open-intent.test.ts +0 -280
- package/src/lib/__tests__/view-port-allocation.test.ts +0 -82
- package/src/lib/__tests__/view-server.test.ts +0 -91
- package/src/lib/__tests__/view-session.test.ts +0 -100
- package/src/lib/__tests__/view-snapshot.test.ts +0 -77
- package/src/lib/admin-domain.ts +0 -43
- package/src/lib/admin-instance.ts +0 -56
- package/src/lib/admin-target.ts +0 -290
- package/src/lib/binary.ts +0 -127
- package/src/lib/browser-retention.ts +0 -210
- package/src/lib/browser.ts +0 -150
- package/src/lib/ca-fetch.ts +0 -133
- package/src/lib/command-dx.ts +0 -191
- package/src/lib/concurrency.ts +0 -31
- package/src/lib/config.ts +0 -57
- package/src/lib/credential-lifetime.ts +0 -24
- package/src/lib/domain-publication.ts +0 -104
- package/src/lib/failure-debug.ts +0 -26
- package/src/lib/format.ts +0 -4
- package/src/lib/idp-session.ts +0 -156
- package/src/lib/idp.ts +0 -926
- package/src/lib/instance-candidates.ts +0 -49
- package/src/lib/instance-target.ts +0 -197
- package/src/lib/instance.ts +0 -468
- package/src/lib/invocation.ts +0 -11
- package/src/lib/local-status.ts +0 -152
- package/src/lib/log.ts +0 -143
- package/src/lib/login-flow.ts +0 -201
- package/src/lib/meta.ts +0 -90
- package/src/lib/output.ts +0 -238
- package/src/lib/panel.ts +0 -61
- package/src/lib/port.ts +0 -41
- package/src/lib/proc.ts +0 -87
- package/src/lib/prompt.ts +0 -136
- package/src/lib/provision-instance.ts +0 -139
- package/src/lib/sdk-deps.ts +0 -104
- package/src/lib/self.ts +0 -22
- package/src/lib/skills/lock.ts +0 -117
- package/src/lib/skills/sync.ts +0 -878
- package/src/lib/skills.ts +0 -120
- package/src/lib/table.ts +0 -62
- package/src/lib/update.ts +0 -568
- package/src/lib/use-target.ts +0 -24
- package/src/lib/validation.ts +0 -59
- package/src/lib/view/assets.ts +0 -87
- package/src/lib/view/external-open-intent.ts +0 -41
- package/src/lib/view/external-open-origins.ts +0 -37
- package/src/lib/view/host-capabilities.ts +0 -17
- package/src/lib/view/open-intent.ts +0 -67
- package/src/lib/view/port-allocation.ts +0 -19
- package/src/lib/view/resolve.ts +0 -111
- package/src/lib/view/server.ts +0 -259
- package/src/lib/view/session.ts +0 -154
- package/src/lib/view/snapshot.ts +0 -101
- package/src/paths/.spec/api.d.ts +0 -13
- package/src/paths/.spec/architecture.md +0 -5
- package/src/paths/.spec/layout.ts +0 -3
- package/src/paths/index.ts +0 -13
- package/src/program/.spec/api.d.ts +0 -43
- package/src/program/.spec/architecture.md +0 -18
- package/src/program/.spec/laws/program.ts +0 -29
- package/src/program/.spec/layout.ts +0 -14
- package/src/program/__tests__/program.test.ts +0 -556
- package/src/program/argv.ts +0 -14
- package/src/program/build.ts +0 -205
- package/src/program/command.ts +0 -43
- package/src/program/index.ts +0 -3
- package/src/program/options.ts +0 -41
- package/src/program/registry.ts +0 -64
- package/src/program/tsconfig.json +0 -6
- package/src/setup/__tests__/instance-step.test.ts +0 -256
- package/src/setup/__tests__/util.test.ts +0 -29
- package/src/setup/engine.ts +0 -83
- package/src/setup/render.ts +0 -107
- package/src/setup/steps/admin.ts +0 -93
- package/src/setup/steps/agent-browser.ts +0 -81
- package/src/setup/steps/auth.ts +0 -54
- package/src/setup/steps/domain.ts +0 -68
- package/src/setup/steps/index.ts +0 -18
- package/src/setup/steps/instance.ts +0 -206
- package/src/setup/steps/skills-bridge.ts +0 -70
- package/src/setup/steps/skills.ts +0 -61
- package/src/setup/types.ts +0 -61
- package/src/setup/util.ts +0 -34
- package/src/state/.spec/api.d.ts +0 -152
- package/src/state/.spec/architecture.md +0 -45
- package/src/state/.spec/capabilities/state.ts +0 -7
- package/src/state/.spec/flows/identity-update.ts +0 -22
- package/src/state/.spec/laws/state.ts +0 -73
- package/src/state/.spec/layout.ts +0 -15
- package/src/state/__tests__/exchange-credentials.test.ts +0 -341
- package/src/state/__tests__/files.test.ts +0 -136
- package/src/state/__tests__/fixtures/identity-transition.ts +0 -37
- package/src/state/__tests__/fixtures/session-route-process.ts +0 -93
- package/src/state/__tests__/identities.test.ts +0 -142
- package/src/state/__tests__/paths.test.ts +0 -28
- package/src/state/__tests__/session-routes.test.ts +0 -138
- package/src/state/exchange-credentials.ts +0 -250
- package/src/state/files.ts +0 -170
- package/src/state/identities.ts +0 -229
- package/src/state/index.ts +0 -31
- package/src/state/paths.ts +0 -64
- package/src/state/session-routes.ts +0 -34
- package/src/state/tsconfig.json +0 -6
- package/src/telemetry/__tests__/analyze-log.test.ts +0 -38
- package/src/telemetry/__tests__/gate.test.ts +0 -63
- package/src/telemetry/__tests__/recorder.test.ts +0 -111
- package/src/telemetry/__tests__/redact.test.ts +0 -79
- package/src/telemetry/__tests__/retention.test.ts +0 -267
- package/src/telemetry/__tests__/session.test.ts +0 -166
- package/src/telemetry/__tests__/settings.test.ts +0 -102
- package/src/telemetry/__tests__/store-scan.test.ts +0 -128
- package/src/telemetry/__tests__/trigger.test.ts +0 -78
- package/src/telemetry/adapters/__tests__/claude-code.test.ts +0 -89
- package/src/telemetry/adapters/__tests__/codex.test.ts +0 -138
- package/src/telemetry/adapters/__tests__/index.test.ts +0 -88
- package/src/telemetry/adapters/claude-code.ts +0 -90
- package/src/telemetry/adapters/codex.ts +0 -160
- package/src/telemetry/adapters/index.ts +0 -45
- package/src/telemetry/adapters/types.ts +0 -21
- package/src/telemetry/analyze.ts +0 -249
- package/src/telemetry/gate.ts +0 -79
- package/src/telemetry/recorder.ts +0 -68
- package/src/telemetry/redact.ts +0 -53
- package/src/telemetry/retention.ts +0 -176
- package/src/telemetry/session.ts +0 -94
- package/src/telemetry/settings.ts +0 -79
- package/src/telemetry/store.ts +0 -174
- package/src/telemetry/trigger.ts +0 -107
- package/src/telemetry/types.ts +0 -64
- package/src/test-utils.ts +0 -18
- package/src/ui/.spec/api.d.ts +0 -14
- package/src/ui/.spec/architecture.md +0 -14
- package/src/ui/.spec/laws.ts +0 -50
- package/src/ui/.spec/layout.ts +0 -16
- package/src/ui/__tests__/ui.test.ts +0 -1742
- package/src/ui/index.ts +0 -13
- package/src/ui/lock.ts +0 -89
- package/src/ui/model.ts +0 -83
- package/src/ui/operations.ts +0 -1044
- package/src/ui/project.ts +0 -333
- package/src/ui/release.ts +0 -398
- package/src/ui/runner.ts +0 -18
- package/studio/client/dist/assets/index-BFVFs_8x.js +0 -81
- package/studio/client/dist/assets/index-DuB9iUdu.css +0 -2
- package/studio/client/dist/assets/schema-studio-DH6oEWME.js +0 -8
- package/studio/tsconfig.json +0 -24
- package/viewer/tsconfig.json +0 -13
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { schema } from '@astrale-os/sdk/schema'
|
|
2
|
-
|
|
3
|
-
import { defineApplication } from '@astrale-os/sdk/application'
|
|
4
|
-
import { compile } from '@astrale-os/sdk/deployment/build'
|
|
5
|
-
import { addressing, assemble } from '@astrale-os/sdk/deployment/release'
|
|
6
|
-
import { defineRuntime } from '@astrale-os/sdk/runtime'
|
|
7
|
-
|
|
8
|
-
/** Build a canonical empty-runtime Release for cross-boundary CLI tests. */
|
|
9
|
-
export function releaseFor<const Schema extends schema.DomainSchema>(
|
|
10
|
-
source: Schema,
|
|
11
|
-
issuer: string,
|
|
12
|
-
) {
|
|
13
|
-
const runtime = defineRuntime<Schema>()({
|
|
14
|
-
integrations: {},
|
|
15
|
-
initialize: () => ({ providers: {} }),
|
|
16
|
-
actions: [],
|
|
17
|
-
workflows: [],
|
|
18
|
-
})
|
|
19
|
-
return assemble(compile(defineApplication({ schema: source, runtime })), addressing(issuer))
|
|
20
|
-
}
|
package/src/admin/.spec/api.d.ts
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# CLI Admin adapters
|
|
2
|
-
|
|
3
|
-
This private aggregate translates the frozen CLI command journey into the stable public
|
|
4
|
-
`admin.astrale.ai` contract. Routine commands use canonical Admin Class, Property, Core receiver,
|
|
5
|
-
and Method paths through Kernel Client. They do not download, inspect, bind, or rebuild the Admin
|
|
6
|
-
schema. Strict local decoders admit every untrusted Admin result. The adapter does not import Admin
|
|
7
|
-
implementation code, call Host directly, or persist remote graph truth.
|
|
8
|
-
|
|
9
|
-
`instance` owns create/list/status/delete/install projection and explicitly excludes the reserved
|
|
10
|
-
Admin Host from consumer placement. `catalog` owns Domain inventory, publication, and default-set
|
|
11
|
-
configuration. `graph` is their bounded cursor helper and is not re-exported by the aggregate.
|
|
12
|
-
|
|
13
|
-
Commander grammar, help text, output shapes, bookmark behavior, and current interactive host
|
|
14
|
-
selection remain owned by the existing command surface; these adapters change only its remote
|
|
15
|
-
semantic owner.
|
|
16
|
-
|
|
17
|
-
## Performance contract
|
|
18
|
-
|
|
19
|
-
`instance list` performs one Admin method call after connection setup and no schema-discovery call.
|
|
20
|
-
Against the production beta Admin endpoint, the complete command must finish in less than 1 second
|
|
21
|
-
with a warm route/cache and less than 2 seconds from a cold CLI process. Unit tests prove the
|
|
22
|
-
single-call/no-reflection shape; retained live evidence proves the wall-clock bounds.
|
package/src/admin/.spec/icon.svg
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import type { Call } from '@astrale-os/sdk/client'
|
|
2
|
-
import type { ClientSession } from '@astrale-os/sdk/client/session'
|
|
3
|
-
|
|
4
|
-
import { mock } from 'bun:test'
|
|
5
|
-
|
|
6
|
-
export function adminSession(implementation?: (target: string, input: unknown) => unknown): {
|
|
7
|
-
readonly call: ReturnType<typeof mock>
|
|
8
|
-
readonly reflection: ReturnType<typeof mock>
|
|
9
|
-
readonly session: ClientSession
|
|
10
|
-
} {
|
|
11
|
-
const call = mock(async (request: Call) =>
|
|
12
|
-
implementation?.(String(request.target), request.input),
|
|
13
|
-
)
|
|
14
|
-
const reflection = mock(() => {
|
|
15
|
-
throw new Error('Routine Admin commands must not perform schema discovery or reflection.')
|
|
16
|
-
})
|
|
17
|
-
const session = {
|
|
18
|
-
call,
|
|
19
|
-
installation: reflection,
|
|
20
|
-
snapshot: reflection,
|
|
21
|
-
bind: reflection,
|
|
22
|
-
invoke: reflection,
|
|
23
|
-
} as unknown as ClientSession
|
|
24
|
-
return { call, reflection, session }
|
|
25
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import type { ClientSession } from '@astrale-os/sdk/client/session'
|
|
2
|
-
|
|
3
|
-
import type { AdminGraphApi } from '../../graph/.spec/api.js'
|
|
4
|
-
|
|
5
|
-
export interface DomainInfo {
|
|
6
|
-
readonly id: string
|
|
7
|
-
readonly origin: string
|
|
8
|
-
readonly name: string
|
|
9
|
-
readonly url?: string
|
|
10
|
-
readonly description?: string
|
|
11
|
-
readonly installByDefault?: boolean
|
|
12
|
-
readonly createdAt: string
|
|
13
|
-
readonly updatedAt: string
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface PublishDomainInput {
|
|
17
|
-
readonly origin: string
|
|
18
|
-
readonly name: string
|
|
19
|
-
readonly url: string
|
|
20
|
-
readonly description?: string
|
|
21
|
-
readonly installByDefault?: boolean
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface PublishDomainResult {
|
|
25
|
-
readonly entry: DomainInfo
|
|
26
|
-
readonly changed: boolean
|
|
27
|
-
readonly isNew: boolean
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export interface InstallDomainResult {
|
|
31
|
-
readonly name: string
|
|
32
|
-
readonly origin: string
|
|
33
|
-
readonly instanceId: string
|
|
34
|
-
readonly url: string
|
|
35
|
-
readonly ok: boolean
|
|
36
|
-
readonly error?: string | null
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface AdminCatalogContext {
|
|
40
|
-
readonly session: ClientSession
|
|
41
|
-
readonly graph: AdminGraphApi
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export interface AdminCatalogApi {
|
|
45
|
-
list(): Promise<DomainInfo[]>
|
|
46
|
-
require(identifier: string): Promise<DomainInfo>
|
|
47
|
-
publish(input: PublishDomainInput): Promise<PublishDomainResult>
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export class AdminDomainNotFoundError extends Error {
|
|
51
|
-
constructor(identifier: string)
|
|
52
|
-
readonly name: 'NotFoundError'
|
|
53
|
-
readonly identifier: string
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export interface AdminCatalogDependencies {
|
|
57
|
-
readonly operationId?: (kind: 'publish' | 'configure-default') => string
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export function connectAdminCatalog(
|
|
61
|
-
context: AdminCatalogContext,
|
|
62
|
-
dependencies?: AdminCatalogDependencies,
|
|
63
|
-
): Promise<AdminCatalogApi>
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
# CLI Admin catalog adapter
|
|
2
|
-
|
|
3
|
-
The adapter reads policy-visible `Domain` Nodes through bounded Graph pages using stable Class and
|
|
4
|
-
Property keys, and derives default membership from the stable Fleet relation. It performs no schema
|
|
5
|
-
discovery or reflection. Publication invokes `Fleet.publishDomain`; a requested default change is a
|
|
6
|
-
separate explicit `Domain.configureDefault` call. Unchanged publication input is a no-op, and an
|
|
7
|
-
omitted description preserves the current value.
|
|
@@ -1,245 +0,0 @@
|
|
|
1
|
-
import type { Node } from '@astrale-os/sdk/graph/node'
|
|
2
|
-
import type { QueryAST } from '@astrale-os/sdk/query'
|
|
3
|
-
|
|
4
|
-
import { NodeId } from '@astrale-os/sdk/graph/node'
|
|
5
|
-
import { normalizeProperties } from '@astrale-os/sdk/graph/properties'
|
|
6
|
-
import { PropertyKey } from '@astrale-os/sdk/schema'
|
|
7
|
-
import { describe, expect, mock, test } from 'bun:test'
|
|
8
|
-
|
|
9
|
-
import type { AdminGraphApi } from '../../graph'
|
|
10
|
-
|
|
11
|
-
import { adminSession } from '../../__tests__/fixture'
|
|
12
|
-
import { connectAdminCatalog } from '../client'
|
|
13
|
-
|
|
14
|
-
const domainProperties = Object.freeze({
|
|
15
|
-
origin: PropertyKey('admin.astrale.ai:class.Domain.property.origin'),
|
|
16
|
-
name: PropertyKey('kernel.astrale.ai:class.Named.property.name'),
|
|
17
|
-
discoveryUrl: PropertyKey('admin.astrale.ai:class.Domain.property.discoveryUrl'),
|
|
18
|
-
description: PropertyKey('kernel.astrale.ai:class.Descriptable.property.description'),
|
|
19
|
-
createdAt: PropertyKey('kernel.astrale.ai:class.Timestamped.property.createdAt'),
|
|
20
|
-
updatedAt: PropertyKey('kernel.astrale.ai:class.Timestamped.property.updatedAt'),
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
function domainNode(id: string, origin: string): Node {
|
|
24
|
-
return {
|
|
25
|
-
id: NodeId(id),
|
|
26
|
-
class: 'admin.astrale.ai:Domain' as Node['class'],
|
|
27
|
-
props: normalizeProperties({
|
|
28
|
-
[domainProperties.origin]: origin,
|
|
29
|
-
[domainProperties.name]: origin.split('.')[0]!,
|
|
30
|
-
[domainProperties.discoveryUrl]: `https://${origin}`,
|
|
31
|
-
[domainProperties.description]: `${origin} description`,
|
|
32
|
-
[domainProperties.createdAt]: '2026-08-12T00:00:00.000Z',
|
|
33
|
-
[domainProperties.updatedAt]: '2026-08-12T00:00:00.000Z',
|
|
34
|
-
}),
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function fixture(input: {
|
|
39
|
-
domains?: readonly Node[]
|
|
40
|
-
defaults?: readonly Node[]
|
|
41
|
-
invoke?: (target: string, value: unknown) => unknown
|
|
42
|
-
}) {
|
|
43
|
-
const calls: Array<{
|
|
44
|
-
target: string
|
|
45
|
-
value: unknown
|
|
46
|
-
}> = []
|
|
47
|
-
const remote = adminSession((target, value) => {
|
|
48
|
-
calls.push({ target, value })
|
|
49
|
-
return input.invoke?.(target, value)
|
|
50
|
-
})
|
|
51
|
-
const query = mock(async (_ast: QueryAST) => ({
|
|
52
|
-
result: {
|
|
53
|
-
kind: 'nodes' as const,
|
|
54
|
-
nodes: (input.domains ?? []).map((value) => ({ kind: 'value' as const, value })),
|
|
55
|
-
},
|
|
56
|
-
page: {},
|
|
57
|
-
}))
|
|
58
|
-
const defaultNodes = input.defaults ?? []
|
|
59
|
-
const neighbors = mock(
|
|
60
|
-
async (
|
|
61
|
-
_source: Parameters<AdminGraphApi['neighbors']>[0],
|
|
62
|
-
_via: Parameters<AdminGraphApi['neighbors']>[1],
|
|
63
|
-
_options: Parameters<AdminGraphApi['neighbors']>[2],
|
|
64
|
-
) => ({
|
|
65
|
-
nodes: defaultNodes,
|
|
66
|
-
first: defaultNodes[0] ?? null,
|
|
67
|
-
graph: { nodes: defaultNodes, edges: [] },
|
|
68
|
-
cursor: null,
|
|
69
|
-
collect: async () => ({ nodes: defaultNodes, cursor: null }),
|
|
70
|
-
}),
|
|
71
|
-
)
|
|
72
|
-
const graph = { query, neighbors } as unknown as AdminGraphApi
|
|
73
|
-
return {
|
|
74
|
-
call: remote.call,
|
|
75
|
-
reflection: remote.reflection,
|
|
76
|
-
query,
|
|
77
|
-
neighbors,
|
|
78
|
-
calls,
|
|
79
|
-
connect: () =>
|
|
80
|
-
connectAdminCatalog(
|
|
81
|
-
{ session: remote.session, graph },
|
|
82
|
-
{
|
|
83
|
-
operationId: (kind) => `cli.domain.${kind}:test`,
|
|
84
|
-
},
|
|
85
|
-
),
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
function summary(origin: string) {
|
|
90
|
-
return {
|
|
91
|
-
id: '@crm-domain',
|
|
92
|
-
origin,
|
|
93
|
-
name: 'crm',
|
|
94
|
-
discoveryUrl: `https://${origin}`,
|
|
95
|
-
createdAt: '2026-08-12T00:00:00.000Z',
|
|
96
|
-
updatedAt: '2026-08-12T00:00:00.000Z',
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
describe('V2 Admin Domain catalog adapter', () => {
|
|
101
|
-
test('lists Domain nodes through GraphApi and joins the Fleet default relation', async () => {
|
|
102
|
-
const crm = domainNode('crm-domain', 'crm.acme.dev')
|
|
103
|
-
const notes = domainNode('notes-domain', 'notes.acme.dev')
|
|
104
|
-
const contract = fixture({ domains: [crm, notes], defaults: [crm] })
|
|
105
|
-
const api = await contract.connect()
|
|
106
|
-
|
|
107
|
-
await expect(api.list()).resolves.toEqual([
|
|
108
|
-
{
|
|
109
|
-
id: '@crm-domain',
|
|
110
|
-
origin: 'crm.acme.dev',
|
|
111
|
-
name: 'crm',
|
|
112
|
-
url: 'https://crm.acme.dev',
|
|
113
|
-
description: 'crm.acme.dev description',
|
|
114
|
-
installByDefault: true,
|
|
115
|
-
createdAt: '2026-08-12T00:00:00.000Z',
|
|
116
|
-
updatedAt: '2026-08-12T00:00:00.000Z',
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
id: '@notes-domain',
|
|
120
|
-
origin: 'notes.acme.dev',
|
|
121
|
-
name: 'notes',
|
|
122
|
-
url: 'https://notes.acme.dev',
|
|
123
|
-
description: 'notes.acme.dev description',
|
|
124
|
-
createdAt: '2026-08-12T00:00:00.000Z',
|
|
125
|
-
updatedAt: '2026-08-12T00:00:00.000Z',
|
|
126
|
-
},
|
|
127
|
-
])
|
|
128
|
-
expect(contract.query).toHaveBeenCalledWith(
|
|
129
|
-
{
|
|
130
|
-
format: 'astrale.graph.query',
|
|
131
|
-
version: 'v6',
|
|
132
|
-
source: {
|
|
133
|
-
kind: 'node',
|
|
134
|
-
terms: [
|
|
135
|
-
{
|
|
136
|
-
kind: 'class',
|
|
137
|
-
class: { origin: 'admin.astrale.ai', kind: 'class', name: 'Domain' },
|
|
138
|
-
},
|
|
139
|
-
],
|
|
140
|
-
binding: 'n0',
|
|
141
|
-
},
|
|
142
|
-
steps: [],
|
|
143
|
-
select: { kind: 'nodes', binding: 'n0', projection: { kind: 'value' } },
|
|
144
|
-
},
|
|
145
|
-
{ page: { size: 256 } },
|
|
146
|
-
)
|
|
147
|
-
const [source, edge, options] = contract.neighbors.mock.calls[0]!
|
|
148
|
-
expect(String(source)).toBe('/:admin.astrale.ai:core.fleet')
|
|
149
|
-
expect(edge).toEqual({
|
|
150
|
-
origin: 'admin.astrale.ai',
|
|
151
|
-
kind: 'class',
|
|
152
|
-
name: 'fleet_installs_domain_by_default',
|
|
153
|
-
})
|
|
154
|
-
expect(options).toEqual({ direction: 'outgoing', page: { size: 256 } })
|
|
155
|
-
})
|
|
156
|
-
|
|
157
|
-
test('publishes through Fleet then configures the Domain default explicitly', async () => {
|
|
158
|
-
const contract = fixture({ invoke: () => summary('crm.acme.dev') })
|
|
159
|
-
const api = await contract.connect()
|
|
160
|
-
|
|
161
|
-
await expect(
|
|
162
|
-
api.publish({
|
|
163
|
-
origin: 'crm.acme.dev',
|
|
164
|
-
name: 'crm',
|
|
165
|
-
url: 'https://crm.acme.dev',
|
|
166
|
-
installByDefault: true,
|
|
167
|
-
}),
|
|
168
|
-
).resolves.toMatchObject({ changed: true, isNew: true, entry: { installByDefault: true } })
|
|
169
|
-
expect(contract.calls).toEqual([
|
|
170
|
-
{
|
|
171
|
-
target: '/:admin.astrale.ai:core.fleet::publishDomain',
|
|
172
|
-
value: {
|
|
173
|
-
operationId: 'cli.domain.publish:test',
|
|
174
|
-
origin: 'crm.acme.dev',
|
|
175
|
-
name: 'crm',
|
|
176
|
-
discoveryUrl: 'https://crm.acme.dev',
|
|
177
|
-
},
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
target: '@crm-domain::configureDefault',
|
|
181
|
-
value: {
|
|
182
|
-
operationId: 'cli.domain.configure-default:test',
|
|
183
|
-
enabled: true,
|
|
184
|
-
},
|
|
185
|
-
},
|
|
186
|
-
])
|
|
187
|
-
})
|
|
188
|
-
|
|
189
|
-
test('does not invoke a receiver when the catalog record is already current', async () => {
|
|
190
|
-
const crm = domainNode('crm-domain', 'crm.acme.dev')
|
|
191
|
-
const contract = fixture({ domains: [crm] })
|
|
192
|
-
const api = await contract.connect()
|
|
193
|
-
|
|
194
|
-
await expect(
|
|
195
|
-
api.publish({ origin: 'crm.acme.dev', name: 'crm', url: 'https://crm.acme.dev' }),
|
|
196
|
-
).resolves.toMatchObject({ changed: false, isNew: false })
|
|
197
|
-
expect(contract.call).not.toHaveBeenCalled()
|
|
198
|
-
expect(contract.reflection).not.toHaveBeenCalled()
|
|
199
|
-
})
|
|
200
|
-
|
|
201
|
-
test('connects without schema discovery or graph I/O', async () => {
|
|
202
|
-
const contract = fixture({})
|
|
203
|
-
|
|
204
|
-
await contract.connect()
|
|
205
|
-
|
|
206
|
-
expect(contract.call).not.toHaveBeenCalled()
|
|
207
|
-
expect(contract.reflection).not.toHaveBeenCalled()
|
|
208
|
-
expect(contract.query).not.toHaveBeenCalled()
|
|
209
|
-
expect(contract.neighbors).not.toHaveBeenCalled()
|
|
210
|
-
})
|
|
211
|
-
|
|
212
|
-
test('rejects malformed graph records and publication summaries', async () => {
|
|
213
|
-
const invalidNode = {
|
|
214
|
-
id: NodeId('invalid-domain'),
|
|
215
|
-
class: 'admin.astrale.ai:Domain' as Node['class'],
|
|
216
|
-
props: normalizeProperties({
|
|
217
|
-
[domainProperties.origin]: 'invalid.example.dev',
|
|
218
|
-
[domainProperties.name]: 'invalid',
|
|
219
|
-
[domainProperties.discoveryUrl]: 'https://invalid.example.dev',
|
|
220
|
-
[domainProperties.createdAt]: '2026-08-12T00:00:00.000Z',
|
|
221
|
-
}),
|
|
222
|
-
}
|
|
223
|
-
await expect((await fixture({ domains: [invalidNode] }).connect()).list()).rejects.toThrow(
|
|
224
|
-
'Admin Domain.updatedAt is invalid.',
|
|
225
|
-
)
|
|
226
|
-
|
|
227
|
-
const malformed = fixture({ invoke: () => ({ id: '@domain-only' }) })
|
|
228
|
-
await expect(
|
|
229
|
-
(await malformed.connect()).publish({
|
|
230
|
-
origin: 'crm.acme.dev',
|
|
231
|
-
name: 'crm',
|
|
232
|
-
url: 'https://crm.acme.dev',
|
|
233
|
-
}),
|
|
234
|
-
).rejects.toThrow('Admin Domain origin is invalid.')
|
|
235
|
-
|
|
236
|
-
const malformedPath = fixture({ invoke: () => ({ ...summary('crm.acme.dev'), id: 'bad' }) })
|
|
237
|
-
await expect(
|
|
238
|
-
(await malformedPath.connect()).publish({
|
|
239
|
-
origin: 'crm.acme.dev',
|
|
240
|
-
name: 'crm',
|
|
241
|
-
url: 'https://crm.acme.dev',
|
|
242
|
-
}),
|
|
243
|
-
).rejects.toThrow('Admin Domain id is invalid.')
|
|
244
|
-
})
|
|
245
|
-
})
|
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
import type { ClientSession } from '@astrale-os/sdk/client/session'
|
|
2
|
-
import type { Node } from '@astrale-os/sdk/graph/node'
|
|
3
|
-
|
|
4
|
-
import { Path } from '@astrale-os/sdk/graph/path'
|
|
5
|
-
import { Query } from '@astrale-os/sdk/query'
|
|
6
|
-
|
|
7
|
-
import { AdminContract, callAdminMethod } from '../contract'
|
|
8
|
-
import { readAllNodes, type AdminGraphApi } from '../graph'
|
|
9
|
-
import {
|
|
10
|
-
AdminDomainNotFoundError,
|
|
11
|
-
type DomainInfo,
|
|
12
|
-
type PublishDomainInput,
|
|
13
|
-
type PublishDomainResult,
|
|
14
|
-
} from './model'
|
|
15
|
-
|
|
16
|
-
const PAGE_SIZE = 256
|
|
17
|
-
const MAXIMUM_DOMAINS = 10_000
|
|
18
|
-
const MAXIMUM_PAGES = Math.ceil(MAXIMUM_DOMAINS / PAGE_SIZE) + 1
|
|
19
|
-
|
|
20
|
-
export interface AdminCatalogContext {
|
|
21
|
-
readonly session: ClientSession
|
|
22
|
-
readonly graph: AdminGraphApi
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface AdminCatalogApi {
|
|
26
|
-
list(): Promise<DomainInfo[]>
|
|
27
|
-
require(identifier: string): Promise<DomainInfo>
|
|
28
|
-
publish(input: PublishDomainInput): Promise<PublishDomainResult>
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface AdminCatalogDependencies {
|
|
32
|
-
readonly operationId?: (kind: 'publish' | 'configure-default') => string
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** Connect the Domain catalog journey without schema discovery or reflection. */
|
|
36
|
-
export async function connectAdminCatalog(
|
|
37
|
-
context: AdminCatalogContext,
|
|
38
|
-
dependencies: AdminCatalogDependencies = {},
|
|
39
|
-
): Promise<AdminCatalogApi> {
|
|
40
|
-
const operationId = dependencies.operationId ?? defaultOperationId
|
|
41
|
-
|
|
42
|
-
const list = async (): Promise<DomainInfo[]> => {
|
|
43
|
-
const [nodes, defaultsPage] = await Promise.all([
|
|
44
|
-
readAllNodes(
|
|
45
|
-
context.graph,
|
|
46
|
-
Query.from({ nodes: [AdminContract.classes.Domain] }).select({
|
|
47
|
-
kind: 'nodes',
|
|
48
|
-
projection: { kind: 'value' },
|
|
49
|
-
}),
|
|
50
|
-
{
|
|
51
|
-
label: 'Admin Domain catalog',
|
|
52
|
-
maximum: MAXIMUM_DOMAINS,
|
|
53
|
-
maximumPages: MAXIMUM_PAGES,
|
|
54
|
-
},
|
|
55
|
-
),
|
|
56
|
-
context.graph.neighbors(
|
|
57
|
-
AdminContract.fleet,
|
|
58
|
-
AdminContract.edges.fleetInstallsDomainByDefault,
|
|
59
|
-
{
|
|
60
|
-
direction: 'outgoing',
|
|
61
|
-
page: { size: PAGE_SIZE },
|
|
62
|
-
},
|
|
63
|
-
),
|
|
64
|
-
])
|
|
65
|
-
const defaults = await defaultsPage.collect({ maximumPages: MAXIMUM_PAGES })
|
|
66
|
-
if (defaults.cursor !== null)
|
|
67
|
-
throw new TypeError('Admin default Domain catalog exceeded its bound.')
|
|
68
|
-
const defaultIds = new Set(defaults.nodes.map((node) => String(node.id)))
|
|
69
|
-
return nodes.map((node) => domainFromNode(node, defaultIds.has(String(node.id))))
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const requireDomain = async (identifier: string): Promise<DomainInfo> => {
|
|
73
|
-
const found = (await list()).find(
|
|
74
|
-
(domain) =>
|
|
75
|
-
domain.origin === identifier ||
|
|
76
|
-
domain.url === identifier ||
|
|
77
|
-
domain.id === identifier ||
|
|
78
|
-
(domain.id.startsWith('@') && domain.id.slice(1) === identifier),
|
|
79
|
-
)
|
|
80
|
-
if (found === undefined) throw new AdminDomainNotFoundError(identifier)
|
|
81
|
-
return found
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
return Object.freeze({
|
|
85
|
-
list,
|
|
86
|
-
require: requireDomain,
|
|
87
|
-
async publish(input: PublishDomainInput): Promise<PublishDomainResult> {
|
|
88
|
-
const existing = (await list()).find((domain) => domain.origin === input.origin)
|
|
89
|
-
const description = input.description ?? existing?.description
|
|
90
|
-
const registryChanged =
|
|
91
|
-
existing === undefined ||
|
|
92
|
-
existing.name !== input.name ||
|
|
93
|
-
existing.url !== input.url ||
|
|
94
|
-
existing.description !== description
|
|
95
|
-
let entry = existing
|
|
96
|
-
if (registryChanged) {
|
|
97
|
-
entry = domainFromSummary(
|
|
98
|
-
await callAdminMethod(context.session, AdminContract.fleet, 'publishDomain', {
|
|
99
|
-
operationId: operationId('publish'),
|
|
100
|
-
origin: input.origin,
|
|
101
|
-
name: input.name,
|
|
102
|
-
discoveryUrl: input.url,
|
|
103
|
-
...(description === undefined ? {} : { description }),
|
|
104
|
-
}),
|
|
105
|
-
existing?.installByDefault === true,
|
|
106
|
-
)
|
|
107
|
-
}
|
|
108
|
-
if (entry === undefined) throw new TypeError('Admin Domain publication returned no entry.')
|
|
109
|
-
|
|
110
|
-
const defaultChanged =
|
|
111
|
-
input.installByDefault !== undefined &&
|
|
112
|
-
(entry.installByDefault ?? false) !== input.installByDefault
|
|
113
|
-
if (defaultChanged) {
|
|
114
|
-
entry = domainFromSummary(
|
|
115
|
-
await callAdminMethod(context.session, Path.parse(entry.id), 'configureDefault', {
|
|
116
|
-
operationId: operationId('configure-default'),
|
|
117
|
-
enabled: input.installByDefault,
|
|
118
|
-
}),
|
|
119
|
-
input.installByDefault === true,
|
|
120
|
-
)
|
|
121
|
-
}
|
|
122
|
-
return Object.freeze({
|
|
123
|
-
entry,
|
|
124
|
-
changed: registryChanged || defaultChanged,
|
|
125
|
-
isNew: existing === undefined,
|
|
126
|
-
})
|
|
127
|
-
},
|
|
128
|
-
})
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
function domainFromNode(node: Node, installByDefault: boolean): DomainInfo {
|
|
132
|
-
return Object.freeze({
|
|
133
|
-
id: Path.id(node.id).raw,
|
|
134
|
-
origin: requiredProperty(node, 'origin'),
|
|
135
|
-
name: requiredProperty(node, 'name'),
|
|
136
|
-
url: requiredProperty(node, 'discoveryUrl'),
|
|
137
|
-
...optionalProperty(node, 'description'),
|
|
138
|
-
...(installByDefault ? { installByDefault: true } : {}),
|
|
139
|
-
createdAt: requiredProperty(node, 'createdAt'),
|
|
140
|
-
updatedAt: requiredProperty(node, 'updatedAt'),
|
|
141
|
-
})
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
function domainFromSummary(input: unknown, installByDefault: boolean): DomainInfo {
|
|
145
|
-
const value = record(input, 'Admin Domain summary')
|
|
146
|
-
return Object.freeze({
|
|
147
|
-
id: requiredNodePath(value.id, 'Admin Domain id'),
|
|
148
|
-
origin: requiredString(value.origin, 'Admin Domain origin'),
|
|
149
|
-
name: requiredString(value.name, 'Admin Domain name'),
|
|
150
|
-
url: requiredString(value.discoveryUrl, 'Admin Domain discovery URL'),
|
|
151
|
-
...(value.description === undefined
|
|
152
|
-
? {}
|
|
153
|
-
: { description: requiredString(value.description, 'Admin Domain description') }),
|
|
154
|
-
...(installByDefault ? { installByDefault: true } : {}),
|
|
155
|
-
createdAt: requiredString(value.createdAt, 'Admin Domain creation time'),
|
|
156
|
-
updatedAt: requiredString(value.updatedAt, 'Admin Domain update time'),
|
|
157
|
-
})
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function requiredProperty(node: Node, name: keyof typeof AdminContract.properties.domain): string {
|
|
161
|
-
return requiredString(node.props[AdminContract.properties.domain[name]], `Admin Domain.${name}`)
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
function optionalProperty(
|
|
165
|
-
node: Node,
|
|
166
|
-
name: keyof typeof AdminContract.properties.domain,
|
|
167
|
-
): Readonly<Record<string, string>> {
|
|
168
|
-
const value = node.props[AdminContract.properties.domain[name]]
|
|
169
|
-
return value === undefined ? {} : { [name]: requiredString(value, `Admin Domain.${name}`) }
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
function requiredString(input: unknown, label: string): string {
|
|
173
|
-
if (typeof input !== 'string' || input.length === 0) throw new TypeError(`${label} is invalid.`)
|
|
174
|
-
return input
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
function requiredNodePath(input: unknown, label: string): string {
|
|
178
|
-
const value = requiredString(input, label)
|
|
179
|
-
try {
|
|
180
|
-
return Path.parse(value).raw
|
|
181
|
-
} catch {
|
|
182
|
-
throw new TypeError(`${label} is invalid.`)
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
function record(input: unknown, label: string): Readonly<Record<string, unknown>> {
|
|
187
|
-
if (typeof input !== 'object' || input === null || Array.isArray(input)) {
|
|
188
|
-
throw new TypeError(`${label} is invalid.`)
|
|
189
|
-
}
|
|
190
|
-
return input as Readonly<Record<string, unknown>>
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
function defaultOperationId(kind: 'publish' | 'configure-default'): string {
|
|
194
|
-
return `cli.domain.${kind}:${globalThis.crypto.randomUUID()}`
|
|
195
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
connectAdminCatalog,
|
|
3
|
-
type AdminCatalogApi,
|
|
4
|
-
type AdminCatalogContext,
|
|
5
|
-
type AdminCatalogDependencies,
|
|
6
|
-
} from './client'
|
|
7
|
-
export {
|
|
8
|
-
AdminDomainNotFoundError,
|
|
9
|
-
type DomainInfo,
|
|
10
|
-
type InstallDomainResult,
|
|
11
|
-
type PublishDomainInput,
|
|
12
|
-
type PublishDomainResult,
|
|
13
|
-
} from './model'
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
/** CLI-stable projection of one Admin Domain catalog record. */
|
|
2
|
-
export interface DomainInfo {
|
|
3
|
-
readonly id: string
|
|
4
|
-
readonly origin: string
|
|
5
|
-
readonly name: string
|
|
6
|
-
readonly url?: string
|
|
7
|
-
readonly description?: string
|
|
8
|
-
readonly installByDefault?: boolean
|
|
9
|
-
readonly createdAt: string
|
|
10
|
-
readonly updatedAt: string
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface PublishDomainInput {
|
|
14
|
-
readonly origin: string
|
|
15
|
-
readonly name: string
|
|
16
|
-
readonly url: string
|
|
17
|
-
readonly description?: string
|
|
18
|
-
readonly installByDefault?: boolean
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export interface PublishDomainResult {
|
|
22
|
-
readonly entry: DomainInfo
|
|
23
|
-
readonly changed: boolean
|
|
24
|
-
readonly isNew: boolean
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface InstallDomainResult {
|
|
28
|
-
readonly name: string
|
|
29
|
-
readonly origin: string
|
|
30
|
-
readonly instanceId: string
|
|
31
|
-
readonly url: string
|
|
32
|
-
readonly ok: boolean
|
|
33
|
-
readonly error?: string | null
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export class AdminDomainNotFoundError extends AstraleError {
|
|
37
|
-
constructor(readonly identifier: string) {
|
|
38
|
-
super('DOMAIN_NOT_FOUND', `No visible Admin Domain matches ${JSON.stringify(identifier)}.`)
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
import { AstraleError } from '../../errors'
|