@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,38 +0,0 @@
|
|
|
1
|
-
import type { CommandDefinition } from '../../program/index'
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
fetchOidcMetadata,
|
|
5
|
-
readIdpConfigOrBuiltin,
|
|
6
|
-
upsertIdpConfig,
|
|
7
|
-
workosAuthKitMetadata,
|
|
8
|
-
} from '../../lib/idp'
|
|
9
|
-
import { log } from '../../lib/log'
|
|
10
|
-
import { isMachine, output, RAW_OUTPUT_OPTIONS } from '../../lib/output'
|
|
11
|
-
|
|
12
|
-
export default {
|
|
13
|
-
name: 'refresh',
|
|
14
|
-
description: 'Refresh discovery metadata for an identity provider',
|
|
15
|
-
arguments: [{ name: 'name', description: 'Local IdP registry name' }],
|
|
16
|
-
options: [...RAW_OUTPUT_OPTIONS],
|
|
17
|
-
action: async (name: string, opts: { raw?: boolean; json?: boolean }) => {
|
|
18
|
-
const existing = await readIdpConfigOrBuiltin(name)
|
|
19
|
-
const metadata =
|
|
20
|
-
existing.client.token_response === 'workos-authkit'
|
|
21
|
-
? workosAuthKitMetadata(existing.entry.issuer)
|
|
22
|
-
: await fetchOidcMetadata(existing.entry.issuer)
|
|
23
|
-
const idp = await upsertIdpConfig({
|
|
24
|
-
name,
|
|
25
|
-
metadata,
|
|
26
|
-
client: existing.client,
|
|
27
|
-
builtIn: existing.entry.builtIn,
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
if (isMachine(opts)) {
|
|
31
|
-
output(idp, opts)
|
|
32
|
-
return
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
log.success(`IdP "${name}" discovery metadata refreshed`)
|
|
36
|
-
log.dim(` issuer: ${idp.metadata.issuer}`)
|
|
37
|
-
},
|
|
38
|
-
} satisfies CommandDefinition
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import type { CommandDefinition } from '../../program/index'
|
|
2
|
-
|
|
3
|
-
import { readIdentities } from '../../identity/index'
|
|
4
|
-
import { removeIdpConfig } from '../../lib/idp'
|
|
5
|
-
import { log } from '../../lib/log'
|
|
6
|
-
import { output, RAW_OUTPUT_OPTIONS } from '../../lib/output'
|
|
7
|
-
|
|
8
|
-
export default {
|
|
9
|
-
name: 'remove',
|
|
10
|
-
aliases: ['rm'],
|
|
11
|
-
description: 'Remove an identity provider',
|
|
12
|
-
arguments: [{ name: 'name', description: 'Local IdP registry name' }],
|
|
13
|
-
options: [
|
|
14
|
-
{ flags: '--force', description: 'Remove even when IdP-backed identities exist' },
|
|
15
|
-
...RAW_OUTPUT_OPTIONS,
|
|
16
|
-
],
|
|
17
|
-
action: async (name: string, opts: { force?: boolean; raw?: boolean; json?: boolean }) => {
|
|
18
|
-
const store = await readIdentities()
|
|
19
|
-
const dependents = Object.entries(store.identities)
|
|
20
|
-
.filter(([, identity]) => identity.source === 'idp' && identity.idp === name)
|
|
21
|
-
.map(([identityName]) => identityName)
|
|
22
|
-
|
|
23
|
-
if (dependents.length > 0 && !opts.force) {
|
|
24
|
-
throw new Error(
|
|
25
|
-
`IdP "${name}" is used by identities: ${dependents.join(', ')}. Re-run with --force or delete those identities first.`,
|
|
26
|
-
)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
await removeIdpConfig(name)
|
|
30
|
-
if (opts.raw || opts.json) {
|
|
31
|
-
output({ removed: name, dependentIdentities: dependents }, opts)
|
|
32
|
-
return
|
|
33
|
-
}
|
|
34
|
-
log.success(`IdP "${name}" removed`)
|
|
35
|
-
},
|
|
36
|
-
} satisfies CommandDefinition
|
package/src/commands/idp/show.ts
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { CommandDefinition } from '../../program/index'
|
|
2
|
-
|
|
3
|
-
import { readIdpConfigOrBuiltin } from '../../lib/idp'
|
|
4
|
-
import { output, RAW_OUTPUT_OPTIONS } from '../../lib/output'
|
|
5
|
-
|
|
6
|
-
export default {
|
|
7
|
-
name: 'show',
|
|
8
|
-
description: 'Show an identity provider configuration',
|
|
9
|
-
arguments: [{ name: 'name', description: 'Local IdP registry name' }],
|
|
10
|
-
options: [
|
|
11
|
-
{ flags: '--format <type>', description: 'Output format', choices: ['yaml', 'json'] },
|
|
12
|
-
...RAW_OUTPUT_OPTIONS,
|
|
13
|
-
],
|
|
14
|
-
action: async (
|
|
15
|
-
name: string,
|
|
16
|
-
opts: { raw?: boolean; json?: boolean; format?: 'yaml' | 'json' },
|
|
17
|
-
) => {
|
|
18
|
-
const idp = await readIdpConfigOrBuiltin(name)
|
|
19
|
-
output(
|
|
20
|
-
{
|
|
21
|
-
name: idp.name,
|
|
22
|
-
entry: idp.entry,
|
|
23
|
-
metadata: idp.metadata,
|
|
24
|
-
client: idp.client,
|
|
25
|
-
},
|
|
26
|
-
opts,
|
|
27
|
-
)
|
|
28
|
-
},
|
|
29
|
-
} satisfies CommandDefinition
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk'
|
|
2
|
-
|
|
3
|
-
import type { CommandDefinition } from '../../program/index'
|
|
4
|
-
|
|
5
|
-
import { listOwnedInstances } from '../../lib/admin-instance'
|
|
6
|
-
import { findOwnedInstance } from '../../lib/admin-instance'
|
|
7
|
-
import { getActive, normalizeInstanceKernelUrl } from '../../lib/instance'
|
|
8
|
-
import { log } from '../../lib/log'
|
|
9
|
-
import { RAW_OUTPUT_OPTIONS, isMachine, output, type RawOutputOpts } from '../../lib/output'
|
|
10
|
-
|
|
11
|
-
export default {
|
|
12
|
-
name: 'active',
|
|
13
|
-
description: 'Show the currently active instance',
|
|
14
|
-
options: [...RAW_OUTPUT_OPTIONS],
|
|
15
|
-
action: async (opts: RawOutputOpts) => {
|
|
16
|
-
try {
|
|
17
|
-
const isRaw = isMachine(opts)
|
|
18
|
-
const active = await resolveActiveForDisplay()
|
|
19
|
-
const { name } = active
|
|
20
|
-
const url = active.url ?? null
|
|
21
|
-
const createdAt = active.createdAt ?? null
|
|
22
|
-
const issuer = active.issuer ?? null
|
|
23
|
-
const defaultIdentity = active.defaultIdentity ?? null
|
|
24
|
-
const caFile = active.caFile ?? null
|
|
25
|
-
|
|
26
|
-
if (isRaw) {
|
|
27
|
-
output({ name, url, issuer, defaultIdentity, caFile, createdAt }, opts)
|
|
28
|
-
return
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
console.log(`${chalk.bold(name)} (${url ?? 'local'})`)
|
|
32
|
-
if (issuer && issuer !== url) log.dim(` issuer: ${issuer}`)
|
|
33
|
-
if (defaultIdentity) log.dim(` identity: ${defaultIdentity}`)
|
|
34
|
-
if (caFile) log.dim(` ca: ${caFile}`)
|
|
35
|
-
} catch (e) {
|
|
36
|
-
log.error(e instanceof Error ? e.message : String(e))
|
|
37
|
-
process.exit(1)
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
} satisfies CommandDefinition
|
|
41
|
-
|
|
42
|
-
async function resolveActiveForDisplay(): Promise<{
|
|
43
|
-
name: string
|
|
44
|
-
url?: string
|
|
45
|
-
issuer?: string
|
|
46
|
-
defaultIdentity?: string
|
|
47
|
-
caFile?: string
|
|
48
|
-
createdAt?: string
|
|
49
|
-
}> {
|
|
50
|
-
const active = await getActive()
|
|
51
|
-
if (active.url) {
|
|
52
|
-
return {
|
|
53
|
-
name: active.name,
|
|
54
|
-
url: active.url,
|
|
55
|
-
issuer: active.issuer,
|
|
56
|
-
defaultIdentity: active.defaultIdentity,
|
|
57
|
-
caFile: active.caFile,
|
|
58
|
-
createdAt: active.createdAt,
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
try {
|
|
63
|
-
const managed = findOwnedInstance(await listOwnedInstances({}), active.name)
|
|
64
|
-
if (!managed) return { name: active.name }
|
|
65
|
-
return {
|
|
66
|
-
name: managed.slug,
|
|
67
|
-
url: normalizeInstanceKernelUrl(managed.url),
|
|
68
|
-
createdAt: managed.createdAt,
|
|
69
|
-
}
|
|
70
|
-
} catch {
|
|
71
|
-
return { name: active.name }
|
|
72
|
-
}
|
|
73
|
-
}
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import type { CommandDefinition } from '../../program/index'
|
|
2
|
-
|
|
3
|
-
import { fetchWithCaFile } from '../../lib/ca-fetch'
|
|
4
|
-
import {
|
|
5
|
-
findBookmarkTrustConflicts,
|
|
6
|
-
normalizeInstanceKernelUrl,
|
|
7
|
-
readInstances,
|
|
8
|
-
setActive,
|
|
9
|
-
upsertInstance,
|
|
10
|
-
} from '../../lib/instance'
|
|
11
|
-
import { fatal, log } from '../../lib/log'
|
|
12
|
-
import { checkIssuerReachability } from '../../lib/meta'
|
|
13
|
-
|
|
14
|
-
export default {
|
|
15
|
-
name: 'bookmark',
|
|
16
|
-
description: 'Register a reference to an existing remote instance',
|
|
17
|
-
arguments: [{ name: 'name', description: 'Bookmark name (free, required)', required: true }],
|
|
18
|
-
options: [
|
|
19
|
-
{ flags: '--url <url>', description: 'URL of the remote instance (required)' },
|
|
20
|
-
{ flags: '--issuer <url>', description: 'Kernel issuer/audience if different from URL' },
|
|
21
|
-
{
|
|
22
|
-
flags: '--domain-issuer <url>',
|
|
23
|
-
description: 'Product Domain issuer for standard token exchange',
|
|
24
|
-
},
|
|
25
|
-
{ flags: '--ca <path>', description: 'CA certificate file to trust for this bookmark' },
|
|
26
|
-
{
|
|
27
|
-
flags: '--as <identity>',
|
|
28
|
-
description: 'Default identity for this bookmark',
|
|
29
|
-
},
|
|
30
|
-
{ flags: '--use', description: 'Set as active instance after bookmarking' },
|
|
31
|
-
{ flags: '--skip-probe', description: 'Skip the OIDC + JWKS liveness probe (still recorded)' },
|
|
32
|
-
],
|
|
33
|
-
action: async (
|
|
34
|
-
name: string,
|
|
35
|
-
opts: {
|
|
36
|
-
url?: string
|
|
37
|
-
issuer?: string
|
|
38
|
-
domainIssuer?: string
|
|
39
|
-
ca?: string
|
|
40
|
-
as?: string
|
|
41
|
-
use?: boolean
|
|
42
|
-
skipProbe?: boolean
|
|
43
|
-
},
|
|
44
|
-
) => {
|
|
45
|
-
try {
|
|
46
|
-
if (!opts.url) fatal(new Error('Missing required flag: --url <url>'))
|
|
47
|
-
const url = normalizeInstanceKernelUrl(opts.url)
|
|
48
|
-
const store = await readInstances()
|
|
49
|
-
const expectedIssuer = opts.issuer
|
|
50
|
-
? normalizeInstanceKernelUrl(opts.issuer)
|
|
51
|
-
: store.instances[name]?.issuer
|
|
52
|
-
const effectiveCa = opts.ca ?? store.instances[name]?.caFile
|
|
53
|
-
const trustConflicts = findBookmarkTrustConflicts(store, name, url, effectiveCa)
|
|
54
|
-
if (trustConflicts.length > 0) {
|
|
55
|
-
log.warn(
|
|
56
|
-
`TLS trust differs for the same Kernel URL ${url}: ` +
|
|
57
|
-
`"${name}" uses ${describeCa(effectiveCa)}, while ${trustConflicts
|
|
58
|
-
.map((conflict) => `"${conflict.name}" uses ${describeCa(conflict.caFile)}`)
|
|
59
|
-
.join(', ')}. Remove or update stale bookmarks to avoid certificate surprises.`,
|
|
60
|
-
)
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (!opts.skipProbe) {
|
|
64
|
-
try {
|
|
65
|
-
const { issuer, keys } = await checkIssuerReachability(
|
|
66
|
-
url,
|
|
67
|
-
expectedIssuer,
|
|
68
|
-
effectiveCa ? fetchWithCaFile(effectiveCa) : undefined,
|
|
69
|
-
)
|
|
70
|
-
log.dim(` iss=${issuer} keys=${keys.length}`)
|
|
71
|
-
} catch (e) {
|
|
72
|
-
log.dim(' (re-run with --skip-probe to bookmark anyway.)')
|
|
73
|
-
fatal(e)
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
const { entry, created } = await upsertInstance(name, {
|
|
78
|
-
url,
|
|
79
|
-
issuer: expectedIssuer,
|
|
80
|
-
domainIssuer: opts.domainIssuer,
|
|
81
|
-
caFile: opts.ca,
|
|
82
|
-
name,
|
|
83
|
-
kind: 'bookmark',
|
|
84
|
-
mode: 'remote',
|
|
85
|
-
defaultIdentity: opts.as,
|
|
86
|
-
})
|
|
87
|
-
log.success(`${created ? 'Bookmarked' : 'Updated bookmark'} "${name}" → ${entry.url}`)
|
|
88
|
-
if (opts.as) log.dim(` default identity: ${opts.as}`)
|
|
89
|
-
if (opts.use) {
|
|
90
|
-
await setActive(name)
|
|
91
|
-
log.success(`Active instance: ${name}`)
|
|
92
|
-
}
|
|
93
|
-
} catch (e) {
|
|
94
|
-
fatal(e)
|
|
95
|
-
}
|
|
96
|
-
},
|
|
97
|
-
} satisfies CommandDefinition
|
|
98
|
-
|
|
99
|
-
function describeCa(caFile: string | null | undefined): string {
|
|
100
|
-
return caFile ? `CA ${caFile}` : 'the system trust store'
|
|
101
|
-
}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import type { CommandDefinition } from '../../program/index'
|
|
2
|
-
|
|
3
|
-
import { formatKernelError } from '../../connection/errors'
|
|
4
|
-
import { ADMIN_TARGET_OPTIONS } from '../../lib/admin-target'
|
|
5
|
-
import { isMachine, output } from '../../lib/output'
|
|
6
|
-
import { promptText } from '../../lib/prompt'
|
|
7
|
-
import { provisionInstance, type ProvisionOpts } from '../../lib/provision-instance'
|
|
8
|
-
import { validateSlug } from '../../lib/validation'
|
|
9
|
-
|
|
10
|
-
/** inquirer `validate` for a slug: true when valid, else the human message. */
|
|
11
|
-
function slugError(value: string): true | string {
|
|
12
|
-
try {
|
|
13
|
-
validateSlug(value)
|
|
14
|
-
return true
|
|
15
|
-
} catch (e) {
|
|
16
|
-
return e instanceof Error ? e.message : 'Invalid slug'
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export default {
|
|
21
|
-
name: 'create',
|
|
22
|
-
description: 'Provision an instance through the Admin control plane',
|
|
23
|
-
afterHelpText: `
|
|
24
|
-
Behavior:
|
|
25
|
-
Requests a new Instance from the configured Admin Domain. The caller must be
|
|
26
|
-
logged in with WorkOS. Admin owns infrastructure placement. The new instance
|
|
27
|
-
becomes the active instance.
|
|
28
|
-
|
|
29
|
-
Run with no slug in a terminal and it prompts for one (validated live). With
|
|
30
|
-
no TTY — or --ci / --no-prompt — the slug argument is required up front, so
|
|
31
|
-
piped / CI / agent runs fail fast instead of waiting on input.
|
|
32
|
-
|
|
33
|
-
Examples:
|
|
34
|
-
$ astrale auth login
|
|
35
|
-
$ astrale instance create demo
|
|
36
|
-
`,
|
|
37
|
-
arguments: [{ name: 'id', description: 'Instance slug', required: false }],
|
|
38
|
-
options: [...ADMIN_TARGET_OPTIONS],
|
|
39
|
-
action: async (id: string | undefined, opts: ProvisionOpts) => {
|
|
40
|
-
try {
|
|
41
|
-
// Interactive (TTY only): prompt for the slug when omitted, with live
|
|
42
|
-
// validation. No TTY / --ci / --no-prompt / CI → the slug arg is required
|
|
43
|
-
// (fail fast, never hang a piped / agent / LLM run).
|
|
44
|
-
const interactive = !!process.stdin.isTTY && !(opts.ci || opts.noPrompt || process.env.CI)
|
|
45
|
-
if (!id && interactive) id = await promptText('Instance slug', { validate: slugError })
|
|
46
|
-
if (!id) {
|
|
47
|
-
throw new Error('`instance create` needs a slug, e.g. `astrale instance create demo`.')
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const { created } = await provisionInstance(id, opts)
|
|
51
|
-
|
|
52
|
-
if (isMachine(opts)) {
|
|
53
|
-
output(created, opts)
|
|
54
|
-
return
|
|
55
|
-
}
|
|
56
|
-
} catch (e) {
|
|
57
|
-
await formatKernelError(e, isMachine(opts), undefined, opts.debug)
|
|
58
|
-
process.exit(1)
|
|
59
|
-
}
|
|
60
|
-
},
|
|
61
|
-
} satisfies CommandDefinition
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import type { KernelCommandOpts } from '../../connection'
|
|
2
|
-
import type { CommandDefinition } from '../../program/index'
|
|
3
|
-
|
|
4
|
-
import { AdminInstanceNotFoundError } from '../../admin/instance'
|
|
5
|
-
import { formatKernelError } from '../../connection/errors'
|
|
6
|
-
import { deleteOwnedInstance } from '../../lib/admin-instance'
|
|
7
|
-
import { ADMIN_TARGET_OPTIONS, type AdminTargetCommandOpts } from '../../lib/admin-target'
|
|
8
|
-
import { clearActive, readInstances, removeInstance, resolveInstanceKey } from '../../lib/instance'
|
|
9
|
-
import { log, withSpinner } from '../../lib/log'
|
|
10
|
-
import { isMachine, output } from '../../lib/output'
|
|
11
|
-
|
|
12
|
-
type DeleteOpts = KernelCommandOpts &
|
|
13
|
-
AdminTargetCommandOpts & {
|
|
14
|
-
keepBookmark?: boolean
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export default {
|
|
18
|
-
name: 'delete',
|
|
19
|
-
description: 'Delete an admin-managed instance through the admin kernel',
|
|
20
|
-
afterHelpText: `
|
|
21
|
-
Behavior:
|
|
22
|
-
Calls Instance.delete on the configured admin kernel: best-effort decommission
|
|
23
|
-
of the instance's route and tenant reservation, then removes the Instance
|
|
24
|
-
projection. A same-name local bookmark is removed after the delete succeeds
|
|
25
|
-
unless --keep-bookmark is passed.
|
|
26
|
-
`,
|
|
27
|
-
arguments: [{ name: 'id', description: 'Instance slug', required: true }],
|
|
28
|
-
options: [
|
|
29
|
-
...ADMIN_TARGET_OPTIONS,
|
|
30
|
-
{ flags: '--keep-bookmark', description: 'Do not remove a same-name local bookmark' },
|
|
31
|
-
],
|
|
32
|
-
action: async (id: string, opts: DeleteOpts) => {
|
|
33
|
-
// Teardown walks services + deprovisions — same saga-sized budget as create.
|
|
34
|
-
opts = { ...opts, timeout: opts.timeout ?? '240000' }
|
|
35
|
-
try {
|
|
36
|
-
const result = await withSpinner(
|
|
37
|
-
`Deleting instance ${id}`,
|
|
38
|
-
!isMachine(opts),
|
|
39
|
-
() => deleteOwnedInstance(opts, id),
|
|
40
|
-
{ success: (deleted) => `Deleted instance: ${deleted.slug}` },
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
if (!opts.keepBookmark) {
|
|
44
|
-
const store = await readInstances()
|
|
45
|
-
const key = resolveInstanceKey(store, id)
|
|
46
|
-
if (key) await removeInstance(key)
|
|
47
|
-
}
|
|
48
|
-
await clearActive(id)
|
|
49
|
-
|
|
50
|
-
if (isMachine(opts)) {
|
|
51
|
-
output(result, opts)
|
|
52
|
-
return
|
|
53
|
-
}
|
|
54
|
-
} catch (e) {
|
|
55
|
-
// Bookmark-only id → no admin Instance → kernel NOT_FOUND. Point to
|
|
56
|
-
// `forget` (local drop) instead of surfacing the raw path error.
|
|
57
|
-
if (
|
|
58
|
-
e instanceof AdminInstanceNotFoundError &&
|
|
59
|
-
resolveInstanceKey(await readInstances(), id)
|
|
60
|
-
) {
|
|
61
|
-
log.error(`No admin-managed instance "${id}".`)
|
|
62
|
-
log.dim(` hint: it's a local bookmark — drop it with: astrale instance forget ${id}`)
|
|
63
|
-
process.exit(1)
|
|
64
|
-
}
|
|
65
|
-
await formatKernelError(e, isMachine(opts), undefined, opts.debug)
|
|
66
|
-
process.exit(1)
|
|
67
|
-
}
|
|
68
|
-
},
|
|
69
|
-
} satisfies CommandDefinition
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { CommandDefinition } from '../../program/index'
|
|
2
|
-
|
|
3
|
-
import { readInstances, removeInstance, resolveInstanceKey } from '../../lib/instance'
|
|
4
|
-
import { fatal, log } from '../../lib/log'
|
|
5
|
-
|
|
6
|
-
export default {
|
|
7
|
-
name: 'forget',
|
|
8
|
-
description: 'Drop a bookmark reference (never destructive kernel-side)',
|
|
9
|
-
afterHelpText: `
|
|
10
|
-
Behavior:
|
|
11
|
-
Drops a bookmark reference only — never touches the remote kernel.
|
|
12
|
-
To destructively remove an admin-managed instance use \`astrale instance delete\`.
|
|
13
|
-
`,
|
|
14
|
-
arguments: [{ name: 'name', description: 'Bookmark name (slug or name)', required: true }],
|
|
15
|
-
action: async (name: string) => {
|
|
16
|
-
try {
|
|
17
|
-
const store = await readInstances()
|
|
18
|
-
const key = resolveInstanceKey(store, name)
|
|
19
|
-
if (!key) fatal(new Error(`Instance "${name}" not found`))
|
|
20
|
-
await removeInstance(key!)
|
|
21
|
-
log.success(`Forgot bookmark "${name}" (no kernel-side change)`)
|
|
22
|
-
} catch (e) {
|
|
23
|
-
fatal(e)
|
|
24
|
-
}
|
|
25
|
-
},
|
|
26
|
-
} satisfies CommandDefinition
|
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk'
|
|
2
|
-
|
|
3
|
-
import type { KernelCommandOpts } from '../../connection'
|
|
4
|
-
import type { Column } from '../../lib/output'
|
|
5
|
-
import type { CommandDefinition } from '../../program/index'
|
|
6
|
-
|
|
7
|
-
import { AstraleError } from '../../errors'
|
|
8
|
-
import { listOwnedInstances } from '../../lib/admin-instance'
|
|
9
|
-
import {
|
|
10
|
-
formatInstanceState,
|
|
11
|
-
type InstanceInfo,
|
|
12
|
-
type OwnedInstanceInfo,
|
|
13
|
-
} from '../../lib/admin-instance'
|
|
14
|
-
import { ADMIN_TARGET_OPTIONS, type AdminTargetCommandOpts } from '../../lib/admin-target'
|
|
15
|
-
import { normalizeInstanceKernelUrl, readInstances } from '../../lib/instance'
|
|
16
|
-
import { fatal, log, withSpinner } from '../../lib/log'
|
|
17
|
-
import { isMachine, output, type RawOutputOpts } from '../../lib/output'
|
|
18
|
-
import { renderTable } from '../../lib/table'
|
|
19
|
-
|
|
20
|
-
type ListOpts = KernelCommandOpts &
|
|
21
|
-
AdminTargetCommandOpts &
|
|
22
|
-
RawOutputOpts & {
|
|
23
|
-
bookmarked?: boolean
|
|
24
|
-
adminOnly?: boolean
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export type Bookmark = {
|
|
28
|
-
name: string
|
|
29
|
-
url: string | null
|
|
30
|
-
issuer: string | null
|
|
31
|
-
active: boolean
|
|
32
|
-
defaultIdentity: string | null
|
|
33
|
-
caFile: string | null
|
|
34
|
-
createdAt: string | null
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const COLUMNS: Column[] = [
|
|
38
|
-
{ key: 'name', header: 'NAME', color: chalk.bold },
|
|
39
|
-
{ key: 'kind', header: 'KIND', color: chalk.dim },
|
|
40
|
-
{ key: 'url', header: 'URL', color: chalk.dim },
|
|
41
|
-
{ key: 'extra', header: '', color: chalk.dim },
|
|
42
|
-
]
|
|
43
|
-
|
|
44
|
-
export default {
|
|
45
|
-
name: 'list',
|
|
46
|
-
description: 'List admin-managed instances and local bookmarks',
|
|
47
|
-
options: [
|
|
48
|
-
...ADMIN_TARGET_OPTIONS,
|
|
49
|
-
{ flags: '--bookmarked', description: 'Only show locally bookmarked kernel connections' },
|
|
50
|
-
{ flags: '--admin-only', description: 'Only show instances returned by the admin kernel' },
|
|
51
|
-
],
|
|
52
|
-
action: async (opts: ListOpts) => {
|
|
53
|
-
try {
|
|
54
|
-
const store = await readInstances()
|
|
55
|
-
const bookmarks: Bookmark[] = Object.entries(store.instances).map(([name, entry]) => ({
|
|
56
|
-
name,
|
|
57
|
-
url: entry.url ?? null,
|
|
58
|
-
issuer: entry.issuer ?? null,
|
|
59
|
-
active: name === store.active,
|
|
60
|
-
defaultIdentity: entry.defaultIdentity ?? null,
|
|
61
|
-
caFile: entry.caFile ?? null,
|
|
62
|
-
createdAt: entry.createdAt ?? null,
|
|
63
|
-
}))
|
|
64
|
-
|
|
65
|
-
let managed: OwnedInstanceInfo[] = []
|
|
66
|
-
if (!opts.bookmarked) {
|
|
67
|
-
try {
|
|
68
|
-
managed = await withSpinner('Fetching instances', !isMachine(opts), () =>
|
|
69
|
-
listOwnedInstances(opts),
|
|
70
|
-
)
|
|
71
|
-
} catch (error) {
|
|
72
|
-
throw adminInventoryUnavailable(error)
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (isMachine(opts)) {
|
|
76
|
-
output(
|
|
77
|
-
{
|
|
78
|
-
active: store.active || null,
|
|
79
|
-
...(opts.adminOnly ? {} : { bookmarks }),
|
|
80
|
-
...(opts.bookmarked ? {} : { instances: managed }),
|
|
81
|
-
},
|
|
82
|
-
opts,
|
|
83
|
-
)
|
|
84
|
-
return
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const rows = buildInstanceRows(managed, bookmarks, {
|
|
88
|
-
managed: !opts.bookmarked,
|
|
89
|
-
bookmarks: !opts.adminOnly,
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
if (rows.length === 0) {
|
|
93
|
-
log.dim(' No instances. Run: astrale instance bookmark <name> --url <url>')
|
|
94
|
-
return
|
|
95
|
-
}
|
|
96
|
-
process.stdout.write(renderTable(rows, { columns: COLUMNS }) + '\n')
|
|
97
|
-
} catch (e) {
|
|
98
|
-
fatal(e, opts)
|
|
99
|
-
}
|
|
100
|
-
},
|
|
101
|
-
} satisfies CommandDefinition
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* One row per instance. A bookmark that points at a managed instance (same
|
|
105
|
-
* name and same kernel URL) merges into the managed row — carrying the active
|
|
106
|
-
* marker — instead of listing the instance twice.
|
|
107
|
-
*/
|
|
108
|
-
export function buildInstanceRows(
|
|
109
|
-
managed: InstanceInfo[],
|
|
110
|
-
bookmarks: Bookmark[],
|
|
111
|
-
show: { managed: boolean; bookmarks: boolean },
|
|
112
|
-
): Array<Record<string, string>> {
|
|
113
|
-
const rows: Array<Record<string, string>> = []
|
|
114
|
-
const merged = new Set<string>()
|
|
115
|
-
|
|
116
|
-
const bookmarkByName = new Map<string, Bookmark & { url: string }>()
|
|
117
|
-
if (show.managed && show.bookmarks) {
|
|
118
|
-
for (const bookmark of bookmarks) {
|
|
119
|
-
if (bookmark.url === null) continue
|
|
120
|
-
bookmarkByName.set(bookmark.name, {
|
|
121
|
-
...bookmark,
|
|
122
|
-
url: normalizeInstanceKernelUrl(bookmark.url),
|
|
123
|
-
})
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
if (show.managed) {
|
|
128
|
-
for (const item of managed) {
|
|
129
|
-
const candidate = item.url ? bookmarkByName.get(item.slug) : undefined
|
|
130
|
-
const twin =
|
|
131
|
-
candidate && item.url && candidate.url === normalizeInstanceKernelUrl(item.url)
|
|
132
|
-
? candidate
|
|
133
|
-
: undefined
|
|
134
|
-
if (twin) merged.add(item.slug)
|
|
135
|
-
rows.push({
|
|
136
|
-
name: twin?.active ? `${item.slug} ${chalk.green('*')}` : item.slug,
|
|
137
|
-
kind: 'managed',
|
|
138
|
-
url: item.url ?? '',
|
|
139
|
-
extra: [formatInstanceState(item), twin ? formatBookmarkConnection(twin) : '']
|
|
140
|
-
.filter(Boolean)
|
|
141
|
-
.join(' · '),
|
|
142
|
-
})
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
if (show.bookmarks) {
|
|
147
|
-
for (const item of bookmarks) {
|
|
148
|
-
if (merged.has(item.name)) continue
|
|
149
|
-
rows.push({
|
|
150
|
-
name: item.active ? `${item.name} ${chalk.green('*')}` : item.name,
|
|
151
|
-
kind: 'bookmark',
|
|
152
|
-
url: String(item.url ?? ''),
|
|
153
|
-
extra: formatBookmarkConnection(item),
|
|
154
|
-
})
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
return rows
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
function formatBookmarkConnection(bookmark: Bookmark): string {
|
|
162
|
-
return [
|
|
163
|
-
bookmark.issuer && bookmark.issuer !== bookmark.url ? `issuer=${bookmark.issuer}` : '',
|
|
164
|
-
bookmark.caFile ? `ca=${bookmark.caFile}` : '',
|
|
165
|
-
bookmark.defaultIdentity ? `identity=${bookmark.defaultIdentity}` : '',
|
|
166
|
-
]
|
|
167
|
-
.filter(Boolean)
|
|
168
|
-
.join(' · ')
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const ADMIN_INVENTORY_CODES = new Set([
|
|
172
|
-
'TOKEN_EXCHANGE_SOURCE_INVALID',
|
|
173
|
-
'TOKEN_EXCHANGE_SOURCE_EXPIRED',
|
|
174
|
-
'TOKEN_EXCHANGE_UNSUPPORTED',
|
|
175
|
-
'TOKEN_EXCHANGE_DISCOVERY_FAILED',
|
|
176
|
-
'TOKEN_EXCHANGE_PROTOCOL_ERROR',
|
|
177
|
-
'TOKEN_EXCHANGE_INSECURE',
|
|
178
|
-
'ADMIN_DOMAIN_ISSUER_MISSING',
|
|
179
|
-
])
|
|
180
|
-
|
|
181
|
-
/** Admin-managed inventory is not available without a deployed Admin Domain + IdP identity. */
|
|
182
|
-
export function adminInventoryUnavailable(cause: unknown): AstraleError {
|
|
183
|
-
const code = cause instanceof AstraleError ? cause.code : undefined
|
|
184
|
-
if (code !== undefined && ADMIN_INVENTORY_CODES.has(code)) {
|
|
185
|
-
return new AstraleError(
|
|
186
|
-
'ADMIN_INVENTORY_UNAVAILABLE',
|
|
187
|
-
'Managed instance listing needs the Admin Domain and an IdP-backed identity. Admin is not deployed in this environment.',
|
|
188
|
-
'Use `astrale instance list --bookmarked` for local kernel bookmarks. Key-backed identities cannot mint an Admin Domain token.',
|
|
189
|
-
)
|
|
190
|
-
}
|
|
191
|
-
if (cause instanceof AstraleError) return cause
|
|
192
|
-
return new AstraleError(
|
|
193
|
-
'ADMIN_INVENTORY_UNAVAILABLE',
|
|
194
|
-
cause instanceof Error ? cause.message : String(cause),
|
|
195
|
-
'Use `astrale instance list --bookmarked` for local kernel bookmarks.',
|
|
196
|
-
)
|
|
197
|
-
}
|