@astrale-os/cli 1.0.0-beta.8 → 1.0.0-npm-deprecated.0
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 +14 -166
- package/package.json +10 -102
- package/.check-workspace.cjs +0 -40
- package/LICENSE +0 -202
- package/THIRD-PARTY-NOTICES.md +0 -27
- package/dist/astrale.js +0 -93172
- package/dist/public/connect-core.js +0 -29187
- package/dist/public/keys/index.js +0 -5651
- package/dist/public/paths/index.js +0 -4282
- package/dist/types/admin/instance/model.d.ts +0 -39
- package/dist/types/connect-core.d.ts +0 -22
- package/dist/types/connection/auth.d.ts +0 -36
- package/dist/types/errors.d.ts +0 -23
- package/dist/types/identity/registry.d.ts +0 -25
- package/dist/types/keys/algorithm.d.ts +0 -6
- package/dist/types/keys/credential.d.ts +0 -21
- package/dist/types/keys/index.d.ts +0 -4
- package/dist/types/keys/pair.d.ts +0 -34
- package/dist/types/lib/admin-target.d.ts +0 -78
- package/dist/types/lib/ca-fetch.d.ts +0 -2
- package/dist/types/lib/config.d.ts +0 -71
- package/dist/types/lib/failure-debug.d.ts +0 -1
- package/dist/types/lib/format.d.ts +0 -1
- package/dist/types/lib/idp-session.d.ts +0 -33
- package/dist/types/lib/idp.d.ts +0 -404
- package/dist/types/lib/instance-target.d.ts +0 -38
- package/dist/types/lib/instance.d.ts +0 -196
- package/dist/types/lib/invocation.d.ts +0 -3
- package/dist/types/lib/log.d.ts +0 -33
- package/dist/types/lib/login-flow.d.ts +0 -49
- package/dist/types/lib/meta.d.ts +0 -36
- package/dist/types/lib/output.d.ts +0 -87
- package/dist/types/lib/proc.d.ts +0 -43
- package/dist/types/lib/table.d.ts +0 -18
- package/dist/types/lib/update.d.ts +0 -131
- package/dist/types/lib/validation.d.ts +0 -11
- package/dist/types/paths/index.d.ts +0 -2
- package/dist/types/state/exchange-credentials.d.ts +0 -25
- package/dist/types/state/files.d.ts +0 -9
- package/dist/types/state/identities.d.ts +0 -42
- package/dist/types/state/index.d.ts +0 -8
- package/dist/types/state/paths.d.ts +0 -32
- package/src/__tests__/fixtures/publication.ts +0 -20
- package/src/admin/.spec/api.d.ts +0 -3
- package/src/admin/.spec/architecture.md +0 -15
- package/src/admin/.spec/icon.svg +0 -3
- package/src/admin/.spec/layout.ts +0 -6
- package/src/admin/__tests__/binding.test.ts +0 -31
- package/src/admin/__tests__/fixture.ts +0 -101
- package/src/admin/binding.ts +0 -98
- package/src/admin/catalog/.spec/api.d.ts +0 -65
- package/src/admin/catalog/.spec/architecture.md +0 -6
- 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 -142
- package/src/admin/catalog/client.ts +0 -218
- 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/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 -66
- 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 -266
- package/src/admin/instance/client.ts +0 -290
- package/src/admin/instance/index.ts +0 -16
- package/src/admin/instance/model.ts +0 -66
- package/src/admin/instance/tsconfig.json +0 -8
- package/src/commands/__tests__/admin-instance.test.ts +0 -88
- 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 -29
- package/src/commands/__tests__/domain-install-operation.test.ts +0 -126
- 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 -21
- 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-create-hosts.test.ts +0 -29
- 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-use.test.ts +0 -67
- package/src/commands/__tests__/introspect-parse.test.ts +0 -21
- package/src/commands/__tests__/logs.test.ts +0 -97
- package/src/commands/__tests__/read-commands.test.ts +0 -294
- 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 -21
- 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 -149
- 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 -52
- package/src/commands/auth/status.ts +0 -86
- package/src/commands/auth/token.ts +0 -174
- package/src/commands/browser.ts +0 -207
- package/src/commands/call-describe.ts +0 -123
- package/src/commands/call.ts +0 -205
- package/src/commands/domain/install.ts +0 -548
- package/src/commands/domain/list.ts +0 -155
- package/src/commands/domain/publish.ts +0 -133
- 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 -196
- 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 -69
- package/src/commands/instance/delete.ts +0 -68
- package/src/commands/instance/forget.ts +0 -26
- package/src/commands/instance/list.ts +0 -197
- package/src/commands/instance/status.ts +0 -38
- package/src/commands/instance/use.ts +0 -259
- package/src/commands/introspect.ts +0 -110
- package/src/commands/logs.ts +0 -283
- package/src/commands/mutate.ts +0 -122
- package/src/commands/query.ts +0 -136
- package/src/commands/session/analyze.ts +0 -50
- 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 -107
- package/src/commands/update.ts +0 -334
- package/src/commands/use.ts +0 -86
- package/src/commands/view-serve.ts +0 -26
- package/src/commands/view.ts +0 -614
- 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 -47
- 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 -61
- package/src/connection/.spec/laws/connection.ts +0 -205
- package/src/connection/.spec/layout.ts +0 -21
- package/src/connection/__tests__/auth.test.ts +0 -128
- 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 -119
- package/src/connection/__tests__/errors.test.ts +0 -577
- package/src/connection/__tests__/exchange.test.ts +0 -295
- 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 -140
- package/src/connection/__tests__/target.test.ts +0 -93
- package/src/connection/auth.ts +0 -236
- package/src/connection/call.ts +0 -7
- package/src/connection/command.ts +0 -67
- package/src/connection/credential.ts +0 -117
- package/src/connection/errors.ts +0 -1
- package/src/connection/exchange.ts +0 -311
- 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/reasons.ts +0 -209
- package/src/connection/self.ts +0 -138
- package/src/connection/session.ts +0 -185
- 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 -173
- 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 -97
- 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/.spec/schemas/identity-export-v1.schema.json +0 -25
- package/src/identity/__tests__/fixtures/registry-journey.ts +0 -53
- package/src/identity/__tests__/registration.test.ts +0 -64
- package/src/identity/__tests__/registry.test.ts +0 -70
- 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 -179
- 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 -168
- package/src/keys/algorithm.ts +0 -33
- package/src/keys/credential.ts +0 -112
- 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 -55
- 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 -54
- package/src/lib/__tests__/design.test.ts +0 -99
- package/src/lib/__tests__/domain-publication.test.ts +0 -133
- package/src/lib/__tests__/format.test.ts +0 -22
- package/src/lib/__tests__/idp-session.driver.ts +0 -53
- package/src/lib/__tests__/idp-session.test.ts +0 -379
- package/src/lib/__tests__/idp.test.ts +0 -415
- package/src/lib/__tests__/instance-candidates.test.ts +0 -148
- package/src/lib/__tests__/instance-target.test.ts +0 -212
- 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__/studio-server-deps.test.ts +0 -111
- package/src/lib/__tests__/table.test.ts +0 -53
- package/src/lib/__tests__/update.test.ts +0 -351
- 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 -146
- 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 -68
- package/src/lib/__tests__/view-session.test.ts +0 -99
- 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 -50
- package/src/lib/admin-target.ts +0 -290
- package/src/lib/binary.ts +0 -110
- package/src/lib/browser.ts +0 -150
- package/src/lib/ca-fetch.ts +0 -133
- package/src/lib/command-dx.ts +0 -188
- package/src/lib/concurrency.ts +0 -31
- package/src/lib/config.ts +0 -46
- package/src/lib/domain-publication.ts +0 -102
- package/src/lib/failure-debug.ts +0 -26
- package/src/lib/format.ts +0 -4
- package/src/lib/idp-session.ts +0 -134
- package/src/lib/idp.ts +0 -906
- package/src/lib/instance-candidates.ts +0 -49
- package/src/lib/instance-target.ts +0 -197
- package/src/lib/instance.ts +0 -463
- 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 -82
- package/src/lib/prompt.ts +0 -136
- package/src/lib/provision-instance.ts +0 -162
- package/src/lib/sdk-deps.ts +0 -104
- package/src/lib/self.ts +0 -22
- package/src/lib/skills.ts +0 -171
- package/src/lib/table.ts +0 -62
- package/src/lib/update.ts +0 -409
- package/src/lib/use-target.ts +0 -24
- package/src/lib/validation.ts +0 -59
- package/src/lib/view/assets.ts +0 -78
- 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 -244
- package/src/lib/view/session.ts +0 -152
- 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 -42
- 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 -362
- package/src/program/build.ts +0 -183
- package/src/program/command.ts +0 -42
- package/src/program/index.ts +0 -2
- package/src/program/options.ts +0 -41
- package/src/program/registry.ts +0 -63
- package/src/program/tsconfig.json +0 -6
- package/src/setup/__tests__/instance-step.test.ts +0 -239
- 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 -199
- package/src/setup/steps/skills-bridge.ts +0 -70
- package/src/setup/steps/skills.ts +0 -59
- package/src/setup/types.ts +0 -61
- package/src/setup/util.ts +0 -34
- package/src/state/.spec/api.d.ts +0 -133
- package/src/state/.spec/architecture.md +0 -31
- 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 -14
- package/src/state/__tests__/exchange-credentials.test.ts +0 -188
- package/src/state/__tests__/files.test.ts +0 -113
- package/src/state/__tests__/fixtures/identity-transition.ts +0 -37
- package/src/state/__tests__/identities.test.ts +0 -142
- package/src/state/__tests__/paths.test.ts +0 -27
- package/src/state/exchange-credentials.ts +0 -219
- package/src/state/files.ts +0 -129
- package/src/state/identities.ts +0 -229
- package/src/state/index.ts +0 -29
- package/src/state/paths.ts +0 -61
- package/src/state/tsconfig.json +0 -6
- package/src/telemetry/__tests__/gate.test.ts +0 -63
- package/src/telemetry/__tests__/recorder.test.ts +0 -110
- package/src/telemetry/__tests__/redact.test.ts +0 -79
- package/src/telemetry/__tests__/session.test.ts +0 -166
- package/src/telemetry/__tests__/trigger.test.ts +0 -49
- 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 -227
- package/src/telemetry/gate.ts +0 -79
- package/src/telemetry/recorder.ts +0 -57
- package/src/telemetry/redact.ts +0 -53
- package/src/telemetry/session.ts +0 -88
- package/src/telemetry/settings.ts +0 -26
- package/src/telemetry/store.ts +0 -91
- package/src/telemetry/trigger.ts +0 -119
- package/src/telemetry/types.ts +0 -64
- package/src/test-utils.ts +0 -18
- package/studio/client/dist/assets/elk-api-Di4OXGNH.js +0 -1
- package/studio/client/dist/assets/elk-worker.min-C9JGDOE-.js +0 -6312
- package/studio/client/dist/assets/index-BLm6J11H.js +0 -81
- package/studio/client/dist/assets/index-BiGR8Oo9.css +0 -1
- package/studio/client/dist/assets/index-ChOr3yP0.css +0 -1
- package/studio/client/dist/assets/index-DTjvkOUX.js +0 -8
- package/studio/client/dist/index.html +0 -13
- package/studio/package.json +0 -65
- package/studio/server/agent/ask.test.ts +0 -74
- package/studio/server/agent/ask.ts +0 -71
- package/studio/server/agent/bridge/client.test.ts +0 -49
- package/studio/server/agent/bridge/client.ts +0 -37
- package/studio/server/agent/bridge/grant.test.ts +0 -62
- package/studio/server/agent/bridge/grant.ts +0 -84
- package/studio/server/agent/bridge/routes.test.ts +0 -151
- package/studio/server/agent/bridge/routes.ts +0 -148
- package/studio/server/agent/bridge/stdio.ts +0 -195
- package/studio/server/agent/conversation.test.ts +0 -89
- package/studio/server/agent/conversation.ts +0 -158
- package/studio/server/agent/harness/adapter.ts +0 -171
- package/studio/server/agent/harness/claude/adapter.test.ts +0 -348
- package/studio/server/agent/harness/claude/adapter.ts +0 -71
- package/studio/server/agent/harness/claude/ask.ts +0 -114
- package/studio/server/agent/harness/claude/capabilities.ts +0 -27
- package/studio/server/agent/harness/claude/command.ts +0 -63
- package/studio/server/agent/harness/claude/events.ts +0 -215
- package/studio/server/agent/harness/claude/loadout.ts +0 -132
- package/studio/server/agent/harness/claude/mcp.test.ts +0 -36
- package/studio/server/agent/harness/claude/mcp.ts +0 -41
- package/studio/server/agent/harness/claude/skills.ts +0 -43
- package/studio/server/agent/harness/codex/adapter.test.ts +0 -269
- package/studio/server/agent/harness/codex/adapter.ts +0 -116
- package/studio/server/agent/harness/codex/ask.test.ts +0 -176
- package/studio/server/agent/harness/codex/ask.ts +0 -181
- package/studio/server/agent/harness/codex/command.test.ts +0 -69
- package/studio/server/agent/harness/codex/command.ts +0 -43
- package/studio/server/agent/harness/codex/events.test.ts +0 -94
- package/studio/server/agent/harness/codex/events.ts +0 -132
- package/studio/server/agent/harness/codex/exec.ts +0 -113
- package/studio/server/agent/harness/codex/loadout.ts +0 -60
- package/studio/server/agent/harness/codex/mcp.test.ts +0 -32
- package/studio/server/agent/harness/codex/mcp.ts +0 -27
- package/studio/server/agent/harness/codex/models.test.ts +0 -167
- package/studio/server/agent/harness/codex/models.ts +0 -211
- package/studio/server/agent/harness/codex/skills.ts +0 -33
- package/studio/server/agent/harness/gateway/config.test.ts +0 -98
- package/studio/server/agent/harness/gateway/config.ts +0 -214
- package/studio/server/agent/harness/gateway/token.test.ts +0 -133
- package/studio/server/agent/harness/gateway/token.ts +0 -166
- package/studio/server/agent/harness/mock/adapter.ts +0 -190
- package/studio/server/agent/harness/mock/domain-edit.ts +0 -41
- package/studio/server/agent/harness/process.test.ts +0 -46
- package/studio/server/agent/harness/process.ts +0 -104
- package/studio/server/agent/harness/registry.ts +0 -37
- package/studio/server/agent/harness/selection.test.ts +0 -75
- package/studio/server/agent/harness/selection.ts +0 -85
- package/studio/server/agent/harness/skills.test.ts +0 -95
- package/studio/server/agent/harness/skills.ts +0 -100
- package/studio/server/agent/layout.test.ts +0 -95
- package/studio/server/agent/notify.ts +0 -12
- package/studio/server/agent/prompts/anchors.test.ts +0 -70
- package/studio/server/agent/prompts/anchors.ts +0 -153
- package/studio/server/agent/prompts/ask.ts +0 -34
- package/studio/server/agent/prompts/system.test.ts +0 -13
- package/studio/server/agent/prompts/system.ts +0 -99
- package/studio/server/agent/prompts/turn.ts +0 -66
- package/studio/server/agent/routes.test.ts +0 -176
- package/studio/server/agent/routes.ts +0 -214
- package/studio/server/agent/run/completion.ts +0 -193
- package/studio/server/agent/run/coordinator.test.ts +0 -337
- package/studio/server/agent/run/coordinator.ts +0 -104
- package/studio/server/agent/run/live-state.ts +0 -73
- package/studio/server/agent/run/preparation.ts +0 -163
- package/studio/server/agent/run/transcript.test.ts +0 -81
- package/studio/server/agent/run/transcript.ts +0 -196
- package/studio/server/agent/run/usage.test.ts +0 -70
- package/studio/server/agent/run/usage.ts +0 -62
- package/studio/server/agent/stream.ts +0 -37
- package/studio/server/agent/telemetry.ts +0 -13
- package/studio/server/api/canvas.ts +0 -43
- package/studio/server/api/comments.ts +0 -85
- package/studio/server/api/context.ts +0 -61
- package/studio/server/api/deployment.ts +0 -39
- package/studio/server/api/documents.ts +0 -55
- package/studio/server/api/domain.ts +0 -59
- package/studio/server/api/http.ts +0 -45
- package/studio/server/api/project.ts +0 -57
- package/studio/server/api/schema.ts +0 -12
- package/studio/server/api/views.ts +0 -57
- package/studio/server/api/workspace.ts +0 -60
- package/studio/server/api-agent-loadout.test.ts +0 -69
- package/studio/server/api.test.ts +0 -147
- package/studio/server/api.ts +0 -34
- package/studio/server/cache.test.ts +0 -122
- package/studio/server/cache.ts +0 -303
- package/studio/server/cli-consumers.test.ts +0 -494
- package/studio/server/cli.test.ts +0 -88
- package/studio/server/cli.ts +0 -240
- package/studio/server/client-package.test.ts +0 -147
- package/studio/server/client-package.ts +0 -266
- package/studio/server/detect.ts +0 -81
- package/studio/server/domain.test.ts +0 -77
- package/studio/server/domain.ts +0 -124
- package/studio/server/environment/dotenv-preview.test.ts +0 -39
- package/studio/server/environment/dotenv-preview.ts +0 -27
- package/studio/server/environment/files.test.ts +0 -53
- package/studio/server/environment/files.ts +0 -120
- package/studio/server/handoff/copy.ts +0 -171
- package/studio/server/handoff/service.test.ts +0 -22
- package/studio/server/handoff/service.ts +0 -62
- package/studio/server/index.ts +0 -148
- package/studio/server/instances/active.ts +0 -72
- package/studio/server/instances/deploy-record.test.ts +0 -31
- package/studio/server/instances/deploy-record.ts +0 -37
- package/studio/server/instances/deploy.ts +0 -56
- package/studio/server/instances/probe.test.ts +0 -67
- package/studio/server/instances/probe.ts +0 -67
- package/studio/server/instances/status.test.ts +0 -12
- package/studio/server/instances/status.ts +0 -49
- package/studio/server/introspect/anatomy/client-tree.ts +0 -57
- package/studio/server/introspect/anatomy/env-fields.ts +0 -66
- package/studio/server/introspect/anatomy/schema-definition.ts +0 -53
- package/studio/server/introspect/anatomy/source.ts +0 -181
- package/studio/server/introspect/anatomy/views/routes.ts +0 -114
- package/studio/server/introspect/anatomy/views.ts +0 -53
- package/studio/server/introspect/anatomy-extras.test.ts +0 -265
- package/studio/server/introspect/anatomy-extras.ts +0 -10
- package/studio/server/introspect/anatomy.test.ts +0 -41
- package/studio/server/introspect/anatomy.ts +0 -147
- package/studio/server/introspect/bundle.ts +0 -69
- package/studio/server/introspect/canonical-schema.test.ts +0 -179
- package/studio/server/introspect/canonical-schema.ts +0 -583
- package/studio/server/introspect/config-preview.test.ts +0 -32
- package/studio/server/introspect/config-preview.ts +0 -119
- package/studio/server/introspect/core-extractor.ts +0 -30
- package/studio/server/introspect/core.ts +0 -45
- package/studio/server/introspect/diff.test.ts +0 -124
- package/studio/server/introspect/diff.ts +0 -316
- package/studio/server/introspect/extractor.ts +0 -41
- package/studio/server/introspect/hash.ts +0 -24
- package/studio/server/introspect/overlay-tsmorph.test.ts +0 -146
- package/studio/server/introspect/overlay-tsmorph.ts +0 -9
- package/studio/server/introspect/overlay.test.ts +0 -44
- package/studio/server/introspect/overlay.ts +0 -40
- package/studio/server/introspect/revision.test.ts +0 -54
- package/studio/server/introspect/revision.ts +0 -49
- package/studio/server/introspect/runtime.test.ts +0 -157
- package/studio/server/introspect/runtime.ts +0 -140
- package/studio/server/introspect/schema-ir-json.test.ts +0 -70
- package/studio/server/introspect/schema-ir-json.ts +0 -151
- package/studio/server/introspect/schema-refs.test.ts +0 -55
- package/studio/server/introspect/schema-refs.ts +0 -32
- package/studio/server/introspect/source-overlay/annotations.ts +0 -14
- package/studio/server/introspect/source-overlay/handlers.ts +0 -161
- package/studio/server/introspect/source-overlay/kernel-calls.ts +0 -46
- package/studio/server/introspect/source-overlay/project.ts +0 -248
- package/studio/server/introspect/source-overlay/spans.ts +0 -330
- package/studio/server/json.ts +0 -46
- package/studio/server/lifecycle.ts +0 -42
- package/studio/server/sse.test.ts +0 -26
- package/studio/server/sse.ts +0 -60
- package/studio/server/state/baseline.test.ts +0 -267
- package/studio/server/state/baseline.ts +0 -354
- package/studio/server/state/comments.test.ts +0 -94
- package/studio/server/state/comments.ts +0 -484
- package/studio/server/state/context.ts +0 -199
- package/studio/server/state/documents.ts +0 -111
- package/studio/server/state/integrations.ts +0 -81
- package/studio/server/state/layout.test.ts +0 -34
- package/studio/server/state/layout.ts +0 -82
- package/studio/server/state/settings.test.ts +0 -78
- package/studio/server/state/settings.ts +0 -73
- package/studio/server/state/store.test.ts +0 -122
- package/studio/server/state/store.ts +0 -146
- package/studio/server/state/visibility.ts +0 -48
- package/studio/server/views/model.test.ts +0 -57
- package/studio/server/views/model.ts +0 -66
- package/studio/server/views/runtime.ts +0 -40
- package/studio/server/views/selection-repository.test.ts +0 -31
- package/studio/server/views/selection-repository.ts +0 -60
- package/studio/server/views/session.test.ts +0 -73
- package/studio/server/views/session.ts +0 -166
- package/studio/server/views/target.test.ts +0 -78
- package/studio/server/views/target.ts +0 -222
- package/studio/server/watch.test.ts +0 -36
- package/studio/server/watch.ts +0 -93
- package/studio/server/workspace/catalog.test.ts +0 -17
- package/studio/server/workspace/catalog.ts +0 -43
- package/studio/server/workspace/create.test.ts +0 -37
- package/studio/server/workspace/create.ts +0 -162
- package/studio/server/workspace/git.ts +0 -75
- package/studio/server/workspace/updates.ts +0 -83
- package/studio/server/workspace-state.ts +0 -26
- package/studio/server/workspace-watch.ts +0 -106
- package/studio/shared/agent-effort.test.ts +0 -12
- package/studio/shared/agent-effort.ts +0 -15
- package/studio/shared/agent-models.test.ts +0 -9
- package/studio/shared/agent-models.ts +0 -14
- package/studio/shared/contracts/README.md +0 -16
- package/studio/shared/contracts/agent.ts +0 -270
- package/studio/shared/contracts/runtime.ts +0 -50
- package/studio/shared/contracts/schema.ts +0 -393
- package/studio/shared/contracts/surface.test.ts +0 -317
- package/studio/shared/contracts/workspace.ts +0 -265
- package/studio/shared/layout.test.ts +0 -116
- package/studio/shared/schema/identity.test.ts +0 -34
- package/studio/shared/schema/identity.ts +0 -68
- package/studio/shared/settings-values.test.ts +0 -18
- package/studio/shared/settings-values.ts +0 -20
- package/studio/shared/types.ts +0 -14
- package/studio/tsconfig.json +0 -23
- package/tsconfig.json +0 -14
- package/viewer/dist/index.html +0 -93
- package/viewer/dist/main.js +0 -76
- package/viewer/tsconfig.json +0 -13
|
@@ -1,548 +0,0 @@
|
|
|
1
|
-
import { Path } from '@astrale-os/sdk/graph/path'
|
|
2
|
-
import { K } from '@astrale-os/sdk/schema'
|
|
3
|
-
import chalk from 'chalk'
|
|
4
|
-
|
|
5
|
-
import type { KernelCommandOpts } from '../../connection'
|
|
6
|
-
import type { CommandDefinition } from '../../program/index'
|
|
7
|
-
|
|
8
|
-
import { createPathCall, runKernelCommand, withAdminClientSession } from '../../connection'
|
|
9
|
-
import { formatKernelError } from '../../connection/errors'
|
|
10
|
-
import { AstraleError } from '../../errors'
|
|
11
|
-
import {
|
|
12
|
-
installAdminDomainInContext,
|
|
13
|
-
listAdminDomainsInContext,
|
|
14
|
-
type DomainInfo,
|
|
15
|
-
} from '../../lib/admin-domain'
|
|
16
|
-
import { listOwnedInstancesInContext, type OwnedInstanceInfo } from '../../lib/admin-instance'
|
|
17
|
-
import { ADMIN_TARGET_OPTIONS, type AdminTargetCommandOpts } from '../../lib/admin-target'
|
|
18
|
-
import { fetchDomainPublication } from '../../lib/domain-publication'
|
|
19
|
-
import { getActive } from '../../lib/instance'
|
|
20
|
-
import { fatal, log, withSpinner } from '../../lib/log'
|
|
21
|
-
import { isMachine, output } from '../../lib/output'
|
|
22
|
-
import { confirmWithInput, promptText, selectFrom } from '../../lib/prompt'
|
|
23
|
-
import { isHttpUrl } from '../../lib/validation'
|
|
24
|
-
|
|
25
|
-
/** Public Kernel install syscall input for one remote URL. */
|
|
26
|
-
export function directInstallCallInput(url: string, operation: string, token?: string) {
|
|
27
|
-
return Object.freeze({
|
|
28
|
-
operation,
|
|
29
|
-
domains: [
|
|
30
|
-
Object.freeze({
|
|
31
|
-
source: Object.freeze({
|
|
32
|
-
kind: 'remote' as const,
|
|
33
|
-
url,
|
|
34
|
-
...(token === undefined ? {} : { token }),
|
|
35
|
-
}),
|
|
36
|
-
}),
|
|
37
|
-
],
|
|
38
|
-
})
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
type DirectInstallResult = {
|
|
42
|
-
readonly operation: string
|
|
43
|
-
readonly transitions: readonly {
|
|
44
|
-
readonly intent: {
|
|
45
|
-
readonly origin: string
|
|
46
|
-
readonly target?: { readonly schemaRevision?: string } | null
|
|
47
|
-
}
|
|
48
|
-
}[]
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const OPERATION_ID_PATTERN =
|
|
52
|
-
/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/u
|
|
53
|
-
|
|
54
|
-
function acceptOperationId(input: unknown): string {
|
|
55
|
-
if (typeof input !== 'string' || !OPERATION_ID_PATTERN.test(input)) {
|
|
56
|
-
throw new AstraleError(
|
|
57
|
-
'INVALID_FLAG',
|
|
58
|
-
'--operation must be a canonical lowercase UUIDv4.',
|
|
59
|
-
'Omit --operation for a fresh install; use it only with the exact UUID printed for recovery.',
|
|
60
|
-
)
|
|
61
|
-
}
|
|
62
|
-
return input
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
function createOperationId(): string {
|
|
66
|
-
return acceptOperationId(globalThis.crypto.randomUUID())
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
type InstallOpts = KernelCommandOpts &
|
|
70
|
-
AdminTargetCommandOpts & {
|
|
71
|
-
direct?: boolean
|
|
72
|
-
operation?: string
|
|
73
|
-
token?: string
|
|
74
|
-
allowIdentityOverride?: boolean
|
|
75
|
-
// Global flags (program.ts) that force non-interactive.
|
|
76
|
-
ci?: boolean
|
|
77
|
-
noPrompt?: boolean
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export default {
|
|
81
|
-
name: 'install',
|
|
82
|
-
description: 'Install a domain on an instance (via the admin catalog, or --direct from a url)',
|
|
83
|
-
afterHelpText: `
|
|
84
|
-
Behavior:
|
|
85
|
-
Default: installs a PUBLISHED domain through the admin control plane
|
|
86
|
-
(DomainEntry.install). Address it by its catalog \`origin\` (the unique
|
|
87
|
-
registry key) or by its \`url\`; run it bare to pick from the catalog
|
|
88
|
-
interactively. The target instance is the active one, or -i <slug>; it must be
|
|
89
|
-
admin-managed (otherwise the command fails loudly and points you at --direct).
|
|
90
|
-
|
|
91
|
-
--direct: installs a url through the public Kernel install syscall,
|
|
92
|
-
bypassing the admin catalog. Works on any instance you can authenticate to
|
|
93
|
-
(managed, bookmarked, or local), using your own authority. This is the only
|
|
94
|
-
mode that runs the identity-override consent gate: when the domain's declared
|
|
95
|
-
origin differs from its serving host, it requires explicit consent (an
|
|
96
|
-
interactive DANGER prompt, or --allow-identity-override in scripts).
|
|
97
|
-
|
|
98
|
-
A fresh, strong operation id is generated automatically. Use --operation
|
|
99
|
-
only to retry or recover the exact same direct install after an outcome-unknown
|
|
100
|
-
timeout or disconnect.
|
|
101
|
-
|
|
102
|
-
Examples:
|
|
103
|
-
$ astrale domain install crm.acme.dev -i staging # by origin, via admin
|
|
104
|
-
$ astrale domain install https://crm.acme.dev # by url, via admin
|
|
105
|
-
$ astrale domain install # interactive: pick domain + instance
|
|
106
|
-
$ astrale domain install https://crm.workers.dev --direct # straight to the instance kernel
|
|
107
|
-
$ astrale domain install http://localhost:8787 --direct --token "$INSTALL_TOKEN"
|
|
108
|
-
`,
|
|
109
|
-
arguments: [
|
|
110
|
-
{
|
|
111
|
-
name: 'target',
|
|
112
|
-
description: 'Domain origin or url (omit to pick from the catalog interactively)',
|
|
113
|
-
required: false,
|
|
114
|
-
},
|
|
115
|
-
],
|
|
116
|
-
options: [
|
|
117
|
-
...ADMIN_TARGET_OPTIONS,
|
|
118
|
-
{
|
|
119
|
-
flags: '--direct',
|
|
120
|
-
description:
|
|
121
|
-
'Install a url straight onto the instance kernel, bypassing the admin catalog (any instance; runs the identity-override gate)',
|
|
122
|
-
},
|
|
123
|
-
{
|
|
124
|
-
flags: '--token <token>',
|
|
125
|
-
description: 'Bearer token for private domain install endpoints (--direct only)',
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
flags: '--operation <uuid>',
|
|
129
|
-
description: 'Reuse an exact direct-install operation id for explicit retry/recovery',
|
|
130
|
-
},
|
|
131
|
-
{
|
|
132
|
-
flags: '--allow-identity-override',
|
|
133
|
-
description: 'Consent to a domain whose origin differs from its serving host (--direct only)',
|
|
134
|
-
},
|
|
135
|
-
],
|
|
136
|
-
action: async (target: string | undefined, opts: InstallOpts) => {
|
|
137
|
-
if (opts.operation !== undefined && !opts.direct) {
|
|
138
|
-
fatal(
|
|
139
|
-
new AstraleError(
|
|
140
|
-
'INVALID_FLAG',
|
|
141
|
-
'--operation is valid only with --direct.',
|
|
142
|
-
'Ordinary direct installs generate a fresh operation id automatically.',
|
|
143
|
-
),
|
|
144
|
-
opts,
|
|
145
|
-
)
|
|
146
|
-
}
|
|
147
|
-
if (opts.direct) {
|
|
148
|
-
await installDirect(target, opts)
|
|
149
|
-
return
|
|
150
|
-
}
|
|
151
|
-
await installViaAdmin(target, opts)
|
|
152
|
-
},
|
|
153
|
-
} satisfies CommandDefinition
|
|
154
|
-
|
|
155
|
-
// ── Admin path (default) ──────────────────────────────────────────────────────
|
|
156
|
-
|
|
157
|
-
/**
|
|
158
|
-
* Install a published domain through the admin control plane. The domain is
|
|
159
|
-
* addressed by `origin` (catalog key) or `url`; the target instance is the
|
|
160
|
-
* active one or `-i <slug>` and must be admin-managed.
|
|
161
|
-
*
|
|
162
|
-
* `-i` here means the INSTALL TARGET, not the admin target — so it is stripped
|
|
163
|
-
* before resolving the admin client (which would otherwise read `-i`/`--url` as
|
|
164
|
-
* an admin-kernel override). The admin kernel is chosen via --admin/--admin-url
|
|
165
|
-
* or config, exactly like `domain publish`.
|
|
166
|
-
*/
|
|
167
|
-
export async function installViaAdmin(
|
|
168
|
-
target: string | undefined,
|
|
169
|
-
opts: InstallOpts,
|
|
170
|
-
dependencies: Partial<AdminInstallDependencies> = {},
|
|
171
|
-
): Promise<void> {
|
|
172
|
-
const admin = { ...defaultAdminInstallDependencies, ...dependencies }
|
|
173
|
-
const interactive = !!process.stdin.isTTY && !(opts.ci || opts.noPrompt || process.env.CI)
|
|
174
|
-
if (!target && !interactive) {
|
|
175
|
-
fatal(
|
|
176
|
-
new AstraleError(
|
|
177
|
-
'MISSING_ARG',
|
|
178
|
-
'No domain given and no TTY for interactive selection.',
|
|
179
|
-
'Pass an origin or url, e.g. astrale domain install crm.acme.dev — or use --direct <url>.',
|
|
180
|
-
),
|
|
181
|
-
)
|
|
182
|
-
}
|
|
183
|
-
// Strip the install-target selector so the admin client resolves only the
|
|
184
|
-
// admin kernel (via --admin/--admin-url/config), not the instance under `-i`.
|
|
185
|
-
const adminOpts = {
|
|
186
|
-
admin: opts.admin,
|
|
187
|
-
adminUrl: opts.adminUrl,
|
|
188
|
-
timeout: opts.timeout,
|
|
189
|
-
as: opts.as,
|
|
190
|
-
creds: opts.creds,
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
try {
|
|
194
|
-
await withAdminClientSession(adminOpts, async (ctx) => {
|
|
195
|
-
const instances = await admin.listInstances(ctx)
|
|
196
|
-
const slug = await resolveTargetSlug(opts, target, interactive, instances)
|
|
197
|
-
|
|
198
|
-
const match = instances.find((i) => i.slug === slug)
|
|
199
|
-
if (!match) {
|
|
200
|
-
const known = instances.map((i) => i.slug).join(', ') || '(none)'
|
|
201
|
-
throw new AstraleError(
|
|
202
|
-
'INSTANCE_NOT_MANAGED',
|
|
203
|
-
`Instance "${slug}" is not admin-managed (managed: ${known}).`,
|
|
204
|
-
`Install the url directly onto it instead: astrale domain install <url> --direct -i ${slug}`,
|
|
205
|
-
)
|
|
206
|
-
}
|
|
207
|
-
assertInstallTargetReady(match)
|
|
208
|
-
|
|
209
|
-
const domains = await admin.listDomains(ctx)
|
|
210
|
-
const domain = await resolveDomain(domains, target, interactive)
|
|
211
|
-
|
|
212
|
-
const label = domain.origin
|
|
213
|
-
const result = await withSpinner(
|
|
214
|
-
`Installing ${label} on ${match.slug}`,
|
|
215
|
-
!isMachine(opts),
|
|
216
|
-
() => admin.install(ctx, match, domain),
|
|
217
|
-
{ success: (r) => `Installed ${r.origin} on ${match.slug}` },
|
|
218
|
-
)
|
|
219
|
-
|
|
220
|
-
if (isMachine(opts)) {
|
|
221
|
-
output(result, opts)
|
|
222
|
-
return
|
|
223
|
-
}
|
|
224
|
-
// The admin returns install failures as `ok:false` (it never throws past
|
|
225
|
-
// the saga). Surface them loudly rather than printing a quiet success.
|
|
226
|
-
if (!result.ok) {
|
|
227
|
-
throw new AstraleError(
|
|
228
|
-
'INSTALL_FAILED',
|
|
229
|
-
`Install failed on ${match.slug}: ${result.error ?? 'unknown error'}`,
|
|
230
|
-
)
|
|
231
|
-
}
|
|
232
|
-
log.dim(` origin: ${result.origin}`)
|
|
233
|
-
log.dim(` url: ${result.url}`)
|
|
234
|
-
})
|
|
235
|
-
} catch (error) {
|
|
236
|
-
await formatKernelError(error, isMachine(opts), undefined, opts.debug)
|
|
237
|
-
process.exit(1)
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
function assertInstallTargetReady(instance: OwnedInstanceInfo): void {
|
|
242
|
-
if (instance.state === 'ready') return
|
|
243
|
-
const detail = instance.phase && instance.phase !== instance.state ? ` (${instance.phase})` : ''
|
|
244
|
-
throw new AstraleError(
|
|
245
|
-
'INSTANCE_NOT_READY',
|
|
246
|
-
`Instance "${instance.slug}" is ${instance.state}${detail}; domains cannot be installed yet.`,
|
|
247
|
-
instance.error ?? `Run: astrale instance status ${instance.slug}`,
|
|
248
|
-
)
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Classify the positional install target for the admin path: an http(s) URL
|
|
253
|
-
* installs by `url`, anything else is treated as a catalog `origin` (the unique
|
|
254
|
-
* registry key). The admin method accepts either.
|
|
255
|
-
*/
|
|
256
|
-
export function domainRefFromTarget(target: string): { origin?: string; url?: string } {
|
|
257
|
-
return isHttpUrl(target) ? { url: target } : { origin: target }
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/** Resolve the domain to install: the positional `target`, or an interactive pick. */
|
|
261
|
-
async function resolveDomain(
|
|
262
|
-
catalog: readonly DomainInfo[],
|
|
263
|
-
target: string | undefined,
|
|
264
|
-
interactive: boolean,
|
|
265
|
-
): Promise<DomainInfo> {
|
|
266
|
-
if (target) {
|
|
267
|
-
const ref = domainRefFromTarget(target)
|
|
268
|
-
const found = catalog.find((domain) =>
|
|
269
|
-
ref.origin === undefined ? domain.url === ref.url : domain.origin === ref.origin,
|
|
270
|
-
)
|
|
271
|
-
if (found !== undefined) return found
|
|
272
|
-
throw new AstraleError(
|
|
273
|
-
'DOMAIN_NOT_FOUND',
|
|
274
|
-
`No published domain matches "${target}".`,
|
|
275
|
-
'Run `astrale domain list` to see the Admin catalog.',
|
|
276
|
-
)
|
|
277
|
-
}
|
|
278
|
-
if (!interactive) throw new AstraleError('MISSING_ARG', 'No domain given.')
|
|
279
|
-
|
|
280
|
-
const installable = catalog.filter((d) => d.url)
|
|
281
|
-
if (installable.length === 0) {
|
|
282
|
-
throw new AstraleError(
|
|
283
|
-
'EMPTY_CATALOG',
|
|
284
|
-
'No published domains in the admin catalog.',
|
|
285
|
-
'Publish one first: astrale domain publish --origin … --name … --public-url …',
|
|
286
|
-
)
|
|
287
|
-
}
|
|
288
|
-
const origin = await selectFrom(
|
|
289
|
-
'Select a domain to install',
|
|
290
|
-
installable.map((d) => ({
|
|
291
|
-
label: `${d.name} ${chalk.dim(`${d.origin} → ${d.url}`)}`,
|
|
292
|
-
value: d.origin,
|
|
293
|
-
})),
|
|
294
|
-
)
|
|
295
|
-
if (!origin) throw new AstraleError('CANCELLED', 'No domain selected.')
|
|
296
|
-
return catalog.find((domain) => domain.origin === origin)!
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
interface AdminInstallDependencies {
|
|
300
|
-
readonly listInstances: typeof listOwnedInstancesInContext
|
|
301
|
-
readonly listDomains: typeof listAdminDomainsInContext
|
|
302
|
-
readonly install: typeof installAdminDomainInContext
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
const defaultAdminInstallDependencies: AdminInstallDependencies = Object.freeze({
|
|
306
|
-
listInstances: listOwnedInstancesInContext,
|
|
307
|
-
listDomains: listAdminDomainsInContext,
|
|
308
|
-
install: installAdminDomainInContext,
|
|
309
|
-
})
|
|
310
|
-
|
|
311
|
-
/**
|
|
312
|
-
* Resolve the target instance slug: `-i`, else the active instance. When run
|
|
313
|
-
* bare (no positional) in a TTY, prompt for it with the active instance
|
|
314
|
-
* pre-filled (Enter accepts) and validated against the managed list.
|
|
315
|
-
*/
|
|
316
|
-
async function resolveTargetSlug(
|
|
317
|
-
opts: InstallOpts,
|
|
318
|
-
target: string | undefined,
|
|
319
|
-
interactive: boolean,
|
|
320
|
-
instances: OwnedInstanceInfo[],
|
|
321
|
-
): Promise<string> {
|
|
322
|
-
if (opts.instance) return opts.instance
|
|
323
|
-
const active = await activeSlug()
|
|
324
|
-
|
|
325
|
-
if (target === undefined && interactive) {
|
|
326
|
-
const slugs = instances.map((i) => i.slug)
|
|
327
|
-
if (slugs.length > 0) log.dim(` managed instances: ${slugs.join(', ')}`)
|
|
328
|
-
const chosen = await promptText('Instance to install on', {
|
|
329
|
-
default: active && slugs.includes(active) ? active : undefined,
|
|
330
|
-
validate: (v) =>
|
|
331
|
-
slugs.includes(v) ||
|
|
332
|
-
`unknown managed instance "${v}" (one of: ${slugs.join(', ') || 'none'})`,
|
|
333
|
-
})
|
|
334
|
-
if (!chosen) throw new AstraleError('CANCELLED', 'No instance selected.')
|
|
335
|
-
return chosen
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
if (!active) {
|
|
339
|
-
throw new AstraleError(
|
|
340
|
-
'NO_TARGET_INSTANCE',
|
|
341
|
-
'No target instance: none active and no -i <slug> given.',
|
|
342
|
-
'Pass -i <slug>, or select one with astrale instance use <slug>.',
|
|
343
|
-
)
|
|
344
|
-
}
|
|
345
|
-
return active
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
/** The active instance's slug (its admin-side id), or undefined when none. */
|
|
349
|
-
async function activeSlug(): Promise<string | undefined> {
|
|
350
|
-
try {
|
|
351
|
-
const a = await getActive()
|
|
352
|
-
return a.slug ?? a.name
|
|
353
|
-
} catch {
|
|
354
|
-
return undefined
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// ── Direct path (--direct) ────────────────────────────────────────────────────
|
|
359
|
-
|
|
360
|
-
/**
|
|
361
|
-
* Install a url through the public Kernel install syscall,
|
|
362
|
-
* bypassing the admin catalog, with the identity-override
|
|
363
|
-
* consent gate. Works on any instance the caller can authenticate to.
|
|
364
|
-
*/
|
|
365
|
-
interface DirectInstallDependencies {
|
|
366
|
-
readonly acceptOperationId: (input: unknown) => string
|
|
367
|
-
readonly createOperationId: () => string
|
|
368
|
-
readonly runKernelCommand: typeof runKernelCommand
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
const defaultDirectInstallDependencies: DirectInstallDependencies = Object.freeze({
|
|
372
|
-
acceptOperationId,
|
|
373
|
-
createOperationId,
|
|
374
|
-
runKernelCommand,
|
|
375
|
-
})
|
|
376
|
-
|
|
377
|
-
export async function installDirect(
|
|
378
|
-
target: string | undefined,
|
|
379
|
-
opts: InstallOpts,
|
|
380
|
-
dependencies: Partial<DirectInstallDependencies> = {},
|
|
381
|
-
): Promise<void> {
|
|
382
|
-
const direct = { ...defaultDirectInstallDependencies, ...dependencies }
|
|
383
|
-
let host = ''
|
|
384
|
-
let consentedOrigin: string | undefined
|
|
385
|
-
let operation: string
|
|
386
|
-
try {
|
|
387
|
-
if (!target) {
|
|
388
|
-
throw new AstraleError(
|
|
389
|
-
'MISSING_ARG',
|
|
390
|
-
'--direct requires a domain url.',
|
|
391
|
-
'e.g. astrale domain install https://crm.acme.dev --direct',
|
|
392
|
-
)
|
|
393
|
-
}
|
|
394
|
-
host = validateInstallUrl(target)
|
|
395
|
-
operation =
|
|
396
|
-
opts.operation === undefined
|
|
397
|
-
? direct.createOperationId()
|
|
398
|
-
: direct.acceptOperationId(opts.operation)
|
|
399
|
-
consentedOrigin = await ensureIdentityOverrideConsent(
|
|
400
|
-
target,
|
|
401
|
-
host,
|
|
402
|
-
opts.allowIdentityOverride ?? false,
|
|
403
|
-
)
|
|
404
|
-
} catch (e) {
|
|
405
|
-
fatal(e, opts)
|
|
406
|
-
}
|
|
407
|
-
const url = target as string
|
|
408
|
-
const retry = directInstallRetry(url, operation, opts)
|
|
409
|
-
|
|
410
|
-
await direct.runKernelCommand<DirectInstallResult>({
|
|
411
|
-
opts,
|
|
412
|
-
label: `Installing domain from ${url} (operation ${operation})`,
|
|
413
|
-
recovery: { operation, retry },
|
|
414
|
-
fn: async ({ session }) =>
|
|
415
|
-
(await session.call(
|
|
416
|
-
createPathCall(
|
|
417
|
-
Path.project(K.functions.install.ref).raw,
|
|
418
|
-
directInstallCallInput(url, operation, opts.token),
|
|
419
|
-
),
|
|
420
|
-
)) as DirectInstallResult,
|
|
421
|
-
format: (result, fmtOpts, isRaw) => {
|
|
422
|
-
if (isRaw) {
|
|
423
|
-
output(result, fmtOpts)
|
|
424
|
-
return
|
|
425
|
-
}
|
|
426
|
-
const installed = result.transitions[0]?.intent
|
|
427
|
-
if (!installed) throw new Error('Kernel install returned no committed Domain transition.')
|
|
428
|
-
const revision = installed.target?.schemaRevision ?? result.operation
|
|
429
|
-
log.success(`Domain installed: ${installed.origin}@${revision}`)
|
|
430
|
-
log.dim(` operation: ${result.operation}`)
|
|
431
|
-
// Belt-and-braces: the kernel-confirmed origin is authoritative. If it
|
|
432
|
-
// aliases the host and the pre-install gate never consented to THAT
|
|
433
|
-
// origin (lying or unavailable Publication), say so loudly after the fact.
|
|
434
|
-
if (isIdentityOverride(installed.origin, host) && installed.origin !== consentedOrigin) {
|
|
435
|
-
log.warn(
|
|
436
|
-
`Installed origin "${installed.origin}" differs from the serving host "${host}" ` +
|
|
437
|
-
`and was not confirmed before install (the worker Publication was unavailable). ` +
|
|
438
|
-
`Every ${installed.origin}/* call on this instance now routes to ${host}.`,
|
|
439
|
-
)
|
|
440
|
-
}
|
|
441
|
-
},
|
|
442
|
-
})
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
function directInstallRetry(url: string, operation: string, opts: InstallOpts): string {
|
|
446
|
-
const instance = opts.instance === undefined ? '' : ` -i ${opts.instance}`
|
|
447
|
-
return `astrale domain install ${url} --direct --operation ${operation}${instance}`
|
|
448
|
-
}
|
|
449
|
-
|
|
450
|
-
function validateInstallUrl(value: string): string {
|
|
451
|
-
let url: URL
|
|
452
|
-
try {
|
|
453
|
-
url = new URL(value)
|
|
454
|
-
} catch {
|
|
455
|
-
throw new AstraleError(
|
|
456
|
-
'INVALID_DOMAIN_URL',
|
|
457
|
-
`Domain install source must be an http(s) URL, got "${value}".`,
|
|
458
|
-
'Run or deploy the domain service, then install its base URL, for example: astrale domain install https://contract.astrale.ai --direct',
|
|
459
|
-
)
|
|
460
|
-
}
|
|
461
|
-
if (url.protocol !== 'http:' && url.protocol !== 'https:') {
|
|
462
|
-
throw new AstraleError(
|
|
463
|
-
'INVALID_DOMAIN_URL',
|
|
464
|
-
`Domain install URL must use http or https, got "${url.protocol}".`,
|
|
465
|
-
)
|
|
466
|
-
}
|
|
467
|
-
return url.hostname
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
/** An override = the declared origin and the serving host name differ. */
|
|
471
|
-
export function isIdentityOverride(origin: string, host: string): boolean {
|
|
472
|
-
return origin.toLowerCase() !== host.toLowerCase()
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
/**
|
|
476
|
-
* The §5 identity-override gate (spec: CREATE_ASTRALE_DOMAIN_DX). A domain's
|
|
477
|
-
* `origin` is its addressing identity on the instance: every `<origin>/*` call
|
|
478
|
-
* — including other domains' `requires` — routes to the installed URL.
|
|
479
|
-
* Claiming an origin that differs from the serving host is an explicit actAs
|
|
480
|
-
* and needs typed consent (or `--allow-identity-override` in scripts).
|
|
481
|
-
*
|
|
482
|
-
* The pre-install check reads the worker's canonical Publication origin,
|
|
483
|
-
* so it is consent UX, not enforcement — a hostile worker can lie here, and
|
|
484
|
-
* the kernel anchors the cryptographic identity (`iss`) on the real URL
|
|
485
|
-
* regardless. When the Publication is unreachable or invalid, the gate
|
|
486
|
-
* degrades to a warning and the kernel-confirmed origin is re-checked after
|
|
487
|
-
* install (see `format` above).
|
|
488
|
-
*
|
|
489
|
-
* Returns the origin the user consented to (or `undefined` when no override
|
|
490
|
-
* was detected / verifiable pre-install).
|
|
491
|
-
*/
|
|
492
|
-
async function ensureIdentityOverrideConsent(
|
|
493
|
-
url: string,
|
|
494
|
-
host: string,
|
|
495
|
-
allow: boolean,
|
|
496
|
-
): Promise<string | undefined> {
|
|
497
|
-
const origin = await probeDeclaredOrigin(url)
|
|
498
|
-
if (origin === undefined) {
|
|
499
|
-
log.warn(
|
|
500
|
-
`Could not read a declared origin from ` +
|
|
501
|
-
`${new URL('/.well-known/astrale/domain.json', url).href} — ` +
|
|
502
|
-
`skipping the pre-install identity check (the installed origin is verified after install).`,
|
|
503
|
-
)
|
|
504
|
-
return undefined
|
|
505
|
-
}
|
|
506
|
-
if (!isIdentityOverride(origin, host)) return undefined
|
|
507
|
-
|
|
508
|
-
if (allow) {
|
|
509
|
-
log.warn(`Identity override consented via --allow-identity-override: ${origin} ← ${host}`)
|
|
510
|
-
return origin
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
const banner =
|
|
514
|
-
chalk.red.bold('⚠ DANGER — IDENTITY OVERRIDE') +
|
|
515
|
-
'\n' +
|
|
516
|
-
chalk.dim('│') +
|
|
517
|
-
` deployed ${host}\n` +
|
|
518
|
-
chalk.dim('│') +
|
|
519
|
-
` origin ${chalk.bold(origin)} ${chalk.red('(≠)')}\n` +
|
|
520
|
-
chalk.dim('│') +
|
|
521
|
-
'\n' +
|
|
522
|
-
chalk.dim('│') +
|
|
523
|
-
` Every call to ${origin}/* on this instance —\n` +
|
|
524
|
-
chalk.dim('│') +
|
|
525
|
-
` including from other domains — will hit ${host}.\n` +
|
|
526
|
-
chalk.dim('│') +
|
|
527
|
-
` Only proceed if you trust ${host}.`
|
|
528
|
-
const confirmed = await confirmWithInput(banner, origin)
|
|
529
|
-
if (!confirmed) {
|
|
530
|
-
throw new AstraleError(
|
|
531
|
-
'IDENTITY_OVERRIDE_REJECTED',
|
|
532
|
-
`Install aborted: the domain at ${host} declares origin "${origin}" (identity override) and it was not confirmed.`,
|
|
533
|
-
'Re-run interactively and type the origin to confirm, or pass --allow-identity-override in scripts.',
|
|
534
|
-
)
|
|
535
|
-
}
|
|
536
|
-
return origin
|
|
537
|
-
}
|
|
538
|
-
|
|
539
|
-
/** Best-effort read of the worker's origin from its admitted canonical Publication. */
|
|
540
|
-
export async function probeDeclaredOrigin(url: string): Promise<string | undefined> {
|
|
541
|
-
try {
|
|
542
|
-
return (await fetchDomainPublication(url, AbortSignal.timeout(10_000))).origin
|
|
543
|
-
} catch {
|
|
544
|
-
// An unreachable or invalid Publication is not fatal here: the caller warns
|
|
545
|
-
// and the install itself will surface a dead worker with its own error.
|
|
546
|
-
return undefined
|
|
547
|
-
}
|
|
548
|
-
}
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk'
|
|
2
|
-
|
|
3
|
-
import type { KernelCommandOpts } from '../../connection'
|
|
4
|
-
import type { ListProjection, RawOutputOpts } from '../../lib/output'
|
|
5
|
-
import type { CommandDefinition } from '../../program/index'
|
|
6
|
-
|
|
7
|
-
import { listAdminDomains, type DomainInfo } from '../../lib/admin-domain'
|
|
8
|
-
import { ADMIN_TARGET_OPTIONS, type AdminTargetCommandOpts } from '../../lib/admin-target'
|
|
9
|
-
import { fetchDomainPublication } from '../../lib/domain-publication'
|
|
10
|
-
import { fatal, withSpinner } from '../../lib/log'
|
|
11
|
-
import { isMachine, presentList } from '../../lib/output'
|
|
12
|
-
|
|
13
|
-
type ListOpts = KernelCommandOpts &
|
|
14
|
-
AdminTargetCommandOpts &
|
|
15
|
-
RawOutputOpts & {
|
|
16
|
-
check?: boolean
|
|
17
|
-
defaultOnly?: boolean
|
|
18
|
-
quiet?: boolean
|
|
19
|
-
count?: boolean
|
|
20
|
-
long?: boolean
|
|
21
|
-
format?: 'yaml' | 'json'
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** A catalog entry, optionally enriched with a live `--check` probe. */
|
|
25
|
-
export type DomainRow = DomainInfo & {
|
|
26
|
-
reachable?: boolean
|
|
27
|
-
schemaRevision?: string
|
|
28
|
-
checkError?: string | null
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Catalog rows for the human table. `paths` is the published URL (falling back
|
|
33
|
-
* to origin) so `astrale domain list -q | xargs -I{} astrale domain install {}`
|
|
34
|
-
* composes — install takes a URL. The STATUS column is dropped by `renderTable`
|
|
35
|
-
* unless `--check` filled it in.
|
|
36
|
-
*/
|
|
37
|
-
export function domainProjection(items: DomainRow[]): ListProjection {
|
|
38
|
-
return {
|
|
39
|
-
columns: [
|
|
40
|
-
{ key: 'name', header: 'NAME', color: chalk.bold },
|
|
41
|
-
{ key: 'origin', header: 'ORIGIN', color: chalk.cyan },
|
|
42
|
-
{ key: 'url', header: 'URL', color: chalk.dim },
|
|
43
|
-
{ key: 'default', header: 'DEFAULT' },
|
|
44
|
-
{ key: 'status', header: 'STATUS' },
|
|
45
|
-
],
|
|
46
|
-
rows: items.map((d) => ({
|
|
47
|
-
name: d.name,
|
|
48
|
-
origin: d.origin,
|
|
49
|
-
url: d.url ?? chalk.dim('(unpublished)'),
|
|
50
|
-
default: d.installByDefault ? chalk.green('default') : '',
|
|
51
|
-
status: statusCell(d),
|
|
52
|
-
})),
|
|
53
|
-
paths: items.map((d) => d.url ?? d.origin),
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
function statusCell(d: DomainRow): string {
|
|
58
|
-
if (d.reachable === undefined) return ''
|
|
59
|
-
return d.reachable ? chalk.green('● live') : chalk.red(`○ ${d.checkError ?? 'unreachable'}`)
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export default {
|
|
63
|
-
name: 'list',
|
|
64
|
-
description: 'List domains published in the admin catalog (DomainEntry.list)',
|
|
65
|
-
afterHelpText: `
|
|
66
|
-
Behavior:
|
|
67
|
-
Reads the admin catalog — every domain that has been \`publish\`ed
|
|
68
|
-
(origin → published worker URL). Listing only shows what is INSTALLABLE;
|
|
69
|
-
what is actually mounted where lives on each instance's own graph
|
|
70
|
-
(\`astrale query\` against that instance).
|
|
71
|
-
|
|
72
|
-
Default output is a NAME/ORIGIN/URL/DEFAULT table on a TTY, JSON when piped
|
|
73
|
-
or with --json/--raw (agent-friendly — full DomainInfo objects). -q prints
|
|
74
|
-
one install URL per line (pipeable into \`domain install\`); --count prints
|
|
75
|
-
only the number. --default-only keeps the install-by-default entries (what
|
|
76
|
-
every new instance gets via alphaCreate). --check probes each published URL's
|
|
77
|
-
canonical Publication and adds a live/unreachable STATUS column
|
|
78
|
-
(+ reachable/schemaRevision in machine output).
|
|
79
|
-
|
|
80
|
-
The admin kernel is selected like every admin op — the configured default,
|
|
81
|
-
or --admin <bookmark> / --admin-url <url>.
|
|
82
|
-
|
|
83
|
-
Examples:
|
|
84
|
-
$ astrale domain list
|
|
85
|
-
$ astrale domain list --check
|
|
86
|
-
$ astrale domain list --default-only -q
|
|
87
|
-
$ astrale domain list --json | jq -r '.[].url'
|
|
88
|
-
`,
|
|
89
|
-
options: [
|
|
90
|
-
...ADMIN_TARGET_OPTIONS,
|
|
91
|
-
{
|
|
92
|
-
flags: '--check',
|
|
93
|
-
description: "Probe each domain's canonical Publication + schema revision",
|
|
94
|
-
},
|
|
95
|
-
{ flags: '--default-only', description: 'Only show install-by-default domains' },
|
|
96
|
-
{ flags: '-q, --quiet', description: 'One install URL per line (unix-pipeable)' },
|
|
97
|
-
{ flags: '--count', description: 'Print only the number of published domains' },
|
|
98
|
-
{ flags: '-l, --long', description: 'Full catalog records in machine output' },
|
|
99
|
-
],
|
|
100
|
-
action: async (opts: ListOpts) => {
|
|
101
|
-
try {
|
|
102
|
-
const domains = await withSpinner(
|
|
103
|
-
'Fetching domains',
|
|
104
|
-
!isMachine(opts),
|
|
105
|
-
async (): Promise<DomainRow[]> => {
|
|
106
|
-
const list = await listAdminDomains(opts)
|
|
107
|
-
const filtered = opts.defaultOnly ? list.filter((d) => d.installByDefault) : list
|
|
108
|
-
filtered.sort(byDefaultThenName)
|
|
109
|
-
if (!opts.check) return filtered as DomainRow[]
|
|
110
|
-
// Reachability is a direct client-side Publication fetch per entry, in
|
|
111
|
-
// parallel — no admin round-trip, and version-independent of the
|
|
112
|
-
// admin worker (mirrors `domain install`'s probeDeclaredOrigin).
|
|
113
|
-
return Promise.all(filtered.map(probe))
|
|
114
|
-
},
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
presentList(
|
|
118
|
-
domains,
|
|
119
|
-
{ ...opts, quiet: opts.quiet, count: opts.count, long: opts.long },
|
|
120
|
-
domainProjection,
|
|
121
|
-
)
|
|
122
|
-
} catch (e) {
|
|
123
|
-
fatal(e)
|
|
124
|
-
}
|
|
125
|
-
},
|
|
126
|
-
} satisfies CommandDefinition
|
|
127
|
-
|
|
128
|
-
/** Install-by-default first, then alphabetical by origin — a stable display order. */
|
|
129
|
-
export function byDefaultThenName(a: DomainInfo, b: DomainInfo): number {
|
|
130
|
-
if (!!a.installByDefault !== !!b.installByDefault) return a.installByDefault ? -1 : 1
|
|
131
|
-
return a.origin.localeCompare(b.origin)
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Enrich one entry with a reachability probe: fetch the published worker's
|
|
136
|
-
* canonical Publication and read its schema revision. A dead or missing URL is
|
|
137
|
-
* itself a result, not a throw.
|
|
138
|
-
*/
|
|
139
|
-
export async function probe(d: DomainInfo): Promise<DomainRow> {
|
|
140
|
-
if (!d.url) return { ...d, reachable: false, checkError: 'no url published' }
|
|
141
|
-
try {
|
|
142
|
-
const deployed = await fetchDomainPublication(d.url, AbortSignal.timeout(10_000))
|
|
143
|
-
if (deployed.origin !== d.origin) {
|
|
144
|
-
throw new Error(`Domain origin mismatch: deployed=${deployed.origin} expected=${d.origin}`)
|
|
145
|
-
}
|
|
146
|
-
return {
|
|
147
|
-
...d,
|
|
148
|
-
reachable: true,
|
|
149
|
-
schemaRevision: deployed.schema.revision,
|
|
150
|
-
checkError: null,
|
|
151
|
-
}
|
|
152
|
-
} catch (err) {
|
|
153
|
-
return { ...d, reachable: false, checkError: err instanceof Error ? err.message : String(err) }
|
|
154
|
-
}
|
|
155
|
-
}
|