@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
package/src/program/build.ts
DELETED
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import { Command, Option } from 'commander'
|
|
2
|
-
|
|
3
|
-
import pkg from '../../package.json' with { type: 'json' }
|
|
4
|
-
import { withKernelOptions } from './options'
|
|
5
|
-
import { registerCommand, registerGroup } from './registry'
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Build the fully-wired Commander program (every command + group registered)
|
|
9
|
-
* WITHOUT parsing argv. `bin/astrale.ts` is a thin shim that calls this and
|
|
10
|
-
* `.parse()`; tests import it to walk the command tree (the `--help` surface
|
|
11
|
-
* is asserted to be the source of truth it claims to be — see
|
|
12
|
-
* `program/__tests__/program.test.ts`).
|
|
13
|
-
*/
|
|
14
|
-
export async function buildProgram(): Promise<Command> {
|
|
15
|
-
const program = new Command()
|
|
16
|
-
|
|
17
|
-
program
|
|
18
|
-
.name('astrale')
|
|
19
|
-
.description('Astrale CLI — connect to existing Astrale kernels')
|
|
20
|
-
// Single source of truth = package.json (bumped by release-please together
|
|
21
|
-
// with .release-please-manifest.json). Never hand-write a version literal.
|
|
22
|
-
.version(pkg.version, '-V, --cli-version', 'output the CLI version (root alias: --version)')
|
|
23
|
-
.showSuggestionAfterError(true)
|
|
24
|
-
.addOption(new Option('--ci', 'Machine mode: no prompts, structured errors on stderr'))
|
|
25
|
-
.addOption(new Option('--no-prompt', 'Disable interactive prompts'))
|
|
26
|
-
.action(async () => {
|
|
27
|
-
// Bare `astrale` in an interactive terminal with nothing connected yet →
|
|
28
|
-
// launch the guided setup. Otherwise (configured, piped, or CI) show help.
|
|
29
|
-
if (process.stdin.isTTY && process.stdout.isTTY) {
|
|
30
|
-
const { shouldAutostartSetup } = await import('../setup/engine')
|
|
31
|
-
if (await shouldAutostartSetup()) {
|
|
32
|
-
await (await import('../commands/setup')).default.action(undefined, {})
|
|
33
|
-
return
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
program.help()
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
// Verbatim alias of `identity whoami` — defer to the command-definition
|
|
40
|
-
// module so options stay in sync.
|
|
41
|
-
const whoamiMod = await import('../commands/identity/whoami')
|
|
42
|
-
registerCommand(program, {
|
|
43
|
-
name: 'whoami',
|
|
44
|
-
description: 'Show the current default identity (alias for identity whoami)',
|
|
45
|
-
options: whoamiMod.default.options,
|
|
46
|
-
action: whoamiMod.default.action,
|
|
47
|
-
})
|
|
48
|
-
registerCommand(program, (await import('../commands/setup')).default)
|
|
49
|
-
registerCommand(program, (await import('../commands/use')).default)
|
|
50
|
-
registerCommand(program, (await import('../commands/update')).default)
|
|
51
|
-
|
|
52
|
-
// ── Graph / kernel ─────────────────────────────────────────────
|
|
53
|
-
registerCommand(program, withKernelOptions((await import('../commands/call')).default))
|
|
54
|
-
registerCommand(program, withKernelOptions((await import('../commands/token')).default))
|
|
55
|
-
registerCommand(program, withKernelOptions((await import('../commands/get')).default))
|
|
56
|
-
registerCommand(program, withKernelOptions((await import('../commands/mutate')).default))
|
|
57
|
-
registerCommand(program, withKernelOptions((await import('../commands/query')).default))
|
|
58
|
-
registerCommand(program, withKernelOptions((await import('../commands/introspect')).default))
|
|
59
|
-
registerCommand(program, withKernelOptions((await import('../commands/logs')).default))
|
|
60
|
-
registerCommand(program, withKernelOptions((await import('../commands/view')).default))
|
|
61
|
-
registerCommand(program, (await import('../commands/status')).default)
|
|
62
|
-
registerCommand(program, (await import('../commands/browser')).default)
|
|
63
|
-
registerCommand(program, (await import('../commands/view-serve')).default)
|
|
64
|
-
registerCommand(program, (await import('../commands/studio')).default)
|
|
65
|
-
|
|
66
|
-
registerGroup(program, {
|
|
67
|
-
name: 'ui',
|
|
68
|
-
description: 'Initialize and install Astrale UI in local applications',
|
|
69
|
-
commands: [
|
|
70
|
-
(await import('../commands/ui/init')).default,
|
|
71
|
-
(await import('../commands/ui/list')).default,
|
|
72
|
-
(await import('../commands/ui/add')).default,
|
|
73
|
-
(await import('../commands/ui/doctor')).default,
|
|
74
|
-
],
|
|
75
|
-
subgroups: [
|
|
76
|
-
{
|
|
77
|
-
name: 'preset',
|
|
78
|
-
description: 'List and apply qualified Astrale UI presets',
|
|
79
|
-
commands: [
|
|
80
|
-
(await import('../commands/ui/preset-list')).default,
|
|
81
|
-
(await import('../commands/ui/preset-apply')).default,
|
|
82
|
-
],
|
|
83
|
-
},
|
|
84
|
-
],
|
|
85
|
-
})
|
|
86
|
-
|
|
87
|
-
registerGroup(program, {
|
|
88
|
-
name: 'instance',
|
|
89
|
-
description: 'Manage admin-provisioned instances and local bookmarks',
|
|
90
|
-
commands: [
|
|
91
|
-
withKernelOptions((await import('../commands/instance/list')).default),
|
|
92
|
-
(await import('../commands/instance/bookmark')).default,
|
|
93
|
-
(await import('../commands/instance/forget')).default,
|
|
94
|
-
withKernelOptions((await import('../commands/instance/create')).default),
|
|
95
|
-
withKernelOptions((await import('../commands/instance/delete')).default),
|
|
96
|
-
withKernelOptions((await import('../commands/instance/status')).default),
|
|
97
|
-
(await import('../commands/instance/active')).default,
|
|
98
|
-
(await import('../commands/instance/use')).default,
|
|
99
|
-
],
|
|
100
|
-
})
|
|
101
|
-
|
|
102
|
-
registerGroup(program, {
|
|
103
|
-
name: 'domain',
|
|
104
|
-
description: 'List, publish, install, and uninstall domains',
|
|
105
|
-
commands: [
|
|
106
|
-
withKernelOptions((await import('../commands/domain/list')).default),
|
|
107
|
-
withKernelOptions((await import('../commands/domain/publish')).default),
|
|
108
|
-
withKernelOptions((await import('../commands/domain/install')).default),
|
|
109
|
-
withKernelOptions((await import('../commands/domain/uninstall')).default),
|
|
110
|
-
],
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
registerGroup(program, {
|
|
114
|
-
name: 'admin',
|
|
115
|
-
description: 'Configure the admin kernel',
|
|
116
|
-
commands: [
|
|
117
|
-
(await import('../commands/admin/status')).default,
|
|
118
|
-
(await import('../commands/admin/use')).default,
|
|
119
|
-
],
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
registerGroup(program, {
|
|
123
|
-
name: 'identity',
|
|
124
|
-
description: 'Manage CLI identities & delegation keypairs',
|
|
125
|
-
commands: [
|
|
126
|
-
(await import('../commands/identity/create')).default,
|
|
127
|
-
withKernelOptions((await import('../commands/identity/register')).default),
|
|
128
|
-
(await import('../commands/identity/list')).default,
|
|
129
|
-
(await import('../commands/identity/use')).default,
|
|
130
|
-
(await import('../commands/identity/whoami')).default,
|
|
131
|
-
(await import('../commands/identity/delete')).default,
|
|
132
|
-
(await import('../commands/identity/sync')).default,
|
|
133
|
-
(await import('../commands/identity/unsync')).default,
|
|
134
|
-
(await import('../commands/identity/export')).default,
|
|
135
|
-
(await import('../commands/identity/import')).default,
|
|
136
|
-
],
|
|
137
|
-
})
|
|
138
|
-
|
|
139
|
-
registerGroup(program, {
|
|
140
|
-
name: 'auth',
|
|
141
|
-
description: 'Authenticate with configured identity providers',
|
|
142
|
-
commands: [
|
|
143
|
-
(await import('../commands/auth/login')).default,
|
|
144
|
-
(await import('../commands/auth/token')).default,
|
|
145
|
-
(await import('../commands/auth/logout')).default,
|
|
146
|
-
(await import('../commands/auth/status')).default,
|
|
147
|
-
],
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
registerGroup(program, {
|
|
151
|
-
name: 'session',
|
|
152
|
-
description: 'Locally recorded work sessions: list and DX-analyze them',
|
|
153
|
-
commands: [
|
|
154
|
-
(await import('../commands/session/list')).default,
|
|
155
|
-
(await import('../commands/session/analyze')).default,
|
|
156
|
-
],
|
|
157
|
-
})
|
|
158
|
-
|
|
159
|
-
registerGroup(program, {
|
|
160
|
-
name: 'idp',
|
|
161
|
-
description: 'Manage OpenID Connect identity providers',
|
|
162
|
-
commands: [
|
|
163
|
-
(await import('../commands/idp/add')).default,
|
|
164
|
-
(await import('../commands/idp/list')).default,
|
|
165
|
-
(await import('../commands/idp/show')).default,
|
|
166
|
-
(await import('../commands/idp/refresh')).default,
|
|
167
|
-
(await import('../commands/idp/remove')).default,
|
|
168
|
-
],
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
program.addHelpText(
|
|
172
|
-
'after',
|
|
173
|
-
`
|
|
174
|
-
Command groups:
|
|
175
|
-
Getting started setup (sign in, pick an instance, equip your workspace)
|
|
176
|
-
Kernel get, mutate, call, query, introspect, logs, view, token
|
|
177
|
-
Management admin, instance, domain, identity, auth, idp, update
|
|
178
|
-
Application ui (initialize, inspect, and install Astrale UI source)
|
|
179
|
-
Agent browser (drive the GUI via agent-browser)
|
|
180
|
-
Studio studio (launch the local Domain Studio GUI for a workspace)
|
|
181
|
-
|
|
182
|
-
Path syntax:
|
|
183
|
-
/:origin Domain root
|
|
184
|
-
/:origin:class.Name Class node
|
|
185
|
-
/:origin:class.Name:method Static callable
|
|
186
|
-
<nodePath>::method Instance method dispatch — double colon ::
|
|
187
|
-
@nodeId Reference a node by its UID
|
|
188
|
-
@nodeId::method Instance method on a node by UID
|
|
189
|
-
|
|
190
|
-
Examples:
|
|
191
|
-
$ astrale studio
|
|
192
|
-
$ astrale admin status
|
|
193
|
-
$ astrale update --check
|
|
194
|
-
$ astrale instance bookmark staging --url https://kernel.example.com
|
|
195
|
-
$ astrale instance create my-app
|
|
196
|
-
$ astrale instance status staging
|
|
197
|
-
$ astrale token --audience shell.astrale.ai
|
|
198
|
-
$ astrale query /:notes.example.dev:class.Note --limit 50
|
|
199
|
-
$ astrale introspect /:kernel.astrale.ai:class.Identity:whois
|
|
200
|
-
$ astrale query --file query.v6.json --cursor "$CURSOR"
|
|
201
|
-
`,
|
|
202
|
-
)
|
|
203
|
-
|
|
204
|
-
return program
|
|
205
|
-
}
|
package/src/program/command.ts
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
export interface CommandArgument {
|
|
2
|
-
readonly name: string
|
|
3
|
-
readonly description: string
|
|
4
|
-
readonly required?: boolean
|
|
5
|
-
readonly variadic?: boolean
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export interface CommandOption {
|
|
9
|
-
readonly flags: string
|
|
10
|
-
readonly description: string
|
|
11
|
-
readonly default?: string
|
|
12
|
-
readonly choices?: string[]
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface CommandDefinition {
|
|
16
|
-
readonly name: string
|
|
17
|
-
readonly description: string
|
|
18
|
-
/** One-line summary shown in the parent's command list (Commander `.summary()`). */
|
|
19
|
-
readonly summary?: string
|
|
20
|
-
/** Hide from help listings (internal entries, e.g. `__view-serve`). */
|
|
21
|
-
readonly hidden?: boolean
|
|
22
|
-
readonly aliases?: string[]
|
|
23
|
-
readonly arguments?: CommandArgument[]
|
|
24
|
-
readonly options?: CommandOption[]
|
|
25
|
-
/**
|
|
26
|
-
* Free-form prose appended to `<cmd> --help` (Commander `addHelpText('after')`).
|
|
27
|
-
* Use for command-local behavior the flag list cannot express + canonical
|
|
28
|
-
* examples. Pre-wrap lines to ~78 cols — Commander prints it verbatim.
|
|
29
|
-
*/
|
|
30
|
-
readonly afterHelpText?: string
|
|
31
|
-
/** Opaque Commander callback; each command module owns its concrete argument tuple. */
|
|
32
|
-
readonly action: (...args: never[]) => Promise<void>
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
export interface CommandGroup {
|
|
36
|
-
readonly name: string
|
|
37
|
-
readonly description: string
|
|
38
|
-
/** One-line summary shown in the program's command list (Commander `.summary()`). */
|
|
39
|
-
readonly summary?: string
|
|
40
|
-
readonly commands: CommandDefinition[]
|
|
41
|
-
/** Nested subgroups (one extra level of `astrale foo bar baz` nesting). */
|
|
42
|
-
readonly subgroups?: CommandGroup[]
|
|
43
|
-
}
|
package/src/program/index.ts
DELETED
package/src/program/options.ts
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import type { CommandDefinition, CommandOption } from './command'
|
|
2
|
-
|
|
3
|
-
import { RAW_OUTPUT_OPTIONS } from '../lib/output'
|
|
4
|
-
|
|
5
|
-
const KERNEL_PASSTHROUGH_OPTIONS: readonly CommandOption[] = Object.freeze([
|
|
6
|
-
{
|
|
7
|
-
flags: '--url <url>',
|
|
8
|
-
description: 'Target a kernel URL directly (overrides instance resolution)',
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
flags: '-i, --instance <name>',
|
|
12
|
-
description: 'Target a specific instance (overrides active)',
|
|
13
|
-
},
|
|
14
|
-
{ flags: '--timeout <ms>', description: 'Request timeout in ms (default: 30000)' },
|
|
15
|
-
{ flags: '--as <identity>', description: 'Call as a specific identity' },
|
|
16
|
-
{ flags: '--creds <token>', description: 'Use a pre-signed credential (e.g. delegation token)' },
|
|
17
|
-
{
|
|
18
|
-
flags: '--anonymous',
|
|
19
|
-
description:
|
|
20
|
-
'Send no credential (cannot be combined with --as or --creds; --as and --creds are mutually exclusive)',
|
|
21
|
-
},
|
|
22
|
-
{ flags: '--debug', description: 'Print full error diagnostics on failure' },
|
|
23
|
-
])
|
|
24
|
-
|
|
25
|
-
const KERNEL_OPTIONS: readonly CommandOption[] = Object.freeze([
|
|
26
|
-
{
|
|
27
|
-
flags: '--format <type>',
|
|
28
|
-
description: 'Output format (default: yaml in TTY, json when piped)',
|
|
29
|
-
choices: ['yaml', 'json'],
|
|
30
|
-
},
|
|
31
|
-
...RAW_OUTPUT_OPTIONS,
|
|
32
|
-
...KERNEL_PASSTHROUGH_OPTIONS,
|
|
33
|
-
])
|
|
34
|
-
|
|
35
|
-
/** Attach the single canonical option set to one Kernel-touching command. */
|
|
36
|
-
export function withKernelOptions(definition: CommandDefinition): CommandDefinition {
|
|
37
|
-
return {
|
|
38
|
-
...definition,
|
|
39
|
-
options: [...(definition.options ?? []), ...KERNEL_OPTIONS],
|
|
40
|
-
}
|
|
41
|
-
}
|
package/src/program/registry.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { type Command, Option } from 'commander'
|
|
2
|
-
|
|
3
|
-
import type { CommandDefinition, CommandGroup } from './command'
|
|
4
|
-
|
|
5
|
-
type CommanderAction = Parameters<Command['action']>[0]
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Register a single command on a Commander program or subcommand.
|
|
9
|
-
*/
|
|
10
|
-
export function registerCommand(parent: Command, def: CommandDefinition): void {
|
|
11
|
-
const cmd = parent.command(def.name, { hidden: def.hidden ?? false }).description(def.description)
|
|
12
|
-
|
|
13
|
-
if (def.summary) cmd.summary(def.summary)
|
|
14
|
-
|
|
15
|
-
if (def.aliases) {
|
|
16
|
-
for (const alias of def.aliases) cmd.alias(alias)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
if (def.arguments) {
|
|
20
|
-
for (const arg of def.arguments) {
|
|
21
|
-
const name = arg.variadic ? `${arg.name}...` : arg.name
|
|
22
|
-
const bracket = arg.required !== false ? `<${name}>` : `[${name}]`
|
|
23
|
-
cmd.argument(bracket, arg.description)
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
if (def.options) {
|
|
28
|
-
for (const opt of def.options) {
|
|
29
|
-
if (opt.choices) {
|
|
30
|
-
const o = new Option(opt.flags, opt.description)
|
|
31
|
-
o.choices(opt.choices)
|
|
32
|
-
if (opt.default !== undefined) o.default(opt.default)
|
|
33
|
-
cmd.addOption(o)
|
|
34
|
-
} else if (opt.default !== undefined) {
|
|
35
|
-
cmd.option(opt.flags, opt.description, opt.default)
|
|
36
|
-
} else {
|
|
37
|
-
cmd.option(opt.flags, opt.description)
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// CommandDefinition keeps each callback tuple opaque; Commander materializes
|
|
43
|
-
// that tuple only after this definition has registered its arguments/options.
|
|
44
|
-
cmd.action(def.action as CommanderAction)
|
|
45
|
-
|
|
46
|
-
if (def.afterHelpText) cmd.addHelpText('after', def.afterHelpText)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Register a command group (subcommand with nested commands). Supports
|
|
51
|
-
* one level of nested subgroups via `group.subgroups`.
|
|
52
|
-
*/
|
|
53
|
-
export function registerGroup(parent: Command, group: CommandGroup): void {
|
|
54
|
-
const sub = parent.command(group.name).description(group.description)
|
|
55
|
-
if (group.summary) sub.summary(group.summary)
|
|
56
|
-
for (const def of group.commands) {
|
|
57
|
-
registerCommand(sub, def)
|
|
58
|
-
}
|
|
59
|
-
if (group.subgroups) {
|
|
60
|
-
for (const nested of group.subgroups) {
|
|
61
|
-
registerGroup(sub, nested)
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
@@ -1,256 +0,0 @@
|
|
|
1
|
-
import { describe, expect, mock, test } from 'bun:test'
|
|
2
|
-
|
|
3
|
-
import type { OwnedInstanceInfo } from '../../lib/admin-instance'
|
|
4
|
-
import type { SetupContext } from '../types'
|
|
5
|
-
|
|
6
|
-
import { AstraleError } from '../../errors'
|
|
7
|
-
import {
|
|
8
|
-
adoptOwnedInstance,
|
|
9
|
-
ensureOwnedInstance,
|
|
10
|
-
type InstanceSetupDependencies,
|
|
11
|
-
} from '../steps/instance'
|
|
12
|
-
|
|
13
|
-
const ctx: SetupContext = {
|
|
14
|
-
interactive: true,
|
|
15
|
-
machine: true,
|
|
16
|
-
opts: {},
|
|
17
|
-
slug: 'new-instance',
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
function instance(slug: string, state: OwnedInstanceInfo['state'] = 'ready'): OwnedInstanceInfo {
|
|
21
|
-
return {
|
|
22
|
-
id: `${slug}-id`,
|
|
23
|
-
slug,
|
|
24
|
-
url: `https://${slug}.eu.astrale.ai`,
|
|
25
|
-
state,
|
|
26
|
-
organizationId: `org_${slug}`,
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function inventory(instances: OwnedInstanceInfo[], identity?: string) {
|
|
31
|
-
return { instances, ...(identity ? { identity } : {}) }
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
function dependencies(
|
|
35
|
-
overrides: Partial<InstanceSetupDependencies> = {},
|
|
36
|
-
): InstanceSetupDependencies {
|
|
37
|
-
return {
|
|
38
|
-
fetchOwned: mock(async () => inventory([])),
|
|
39
|
-
adopt: mock(async () => {}),
|
|
40
|
-
selectReady: mock(async (instances) => instances[0] ?? null),
|
|
41
|
-
confirmCreate: mock(async () => true),
|
|
42
|
-
promptSlug: mock(async () => 'new-instance'),
|
|
43
|
-
provision: mock(async (slug) => ({
|
|
44
|
-
created: { url: `https://${slug}.eu.astrale.ai`, organizationId: `org_${slug}` },
|
|
45
|
-
slug,
|
|
46
|
-
})),
|
|
47
|
-
...overrides,
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
describe('setup owned-instance reconciliation', () => {
|
|
52
|
-
test('silently adopts the sole owned ready instance', async () => {
|
|
53
|
-
const ready = instance('only')
|
|
54
|
-
const failed = instance('old-attempt', 'failed')
|
|
55
|
-
const deps = dependencies({
|
|
56
|
-
fetchOwned: mock(async () => inventory([failed, ready], 'manager')),
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
await expect(ensureOwnedInstance(ctx, deps)).resolves.toBe('fixed')
|
|
60
|
-
|
|
61
|
-
expect(deps.adopt).toHaveBeenCalledTimes(1)
|
|
62
|
-
expect(deps.adopt).toHaveBeenCalledWith(ready, 'manager')
|
|
63
|
-
expect(deps.selectReady).not.toHaveBeenCalled()
|
|
64
|
-
expect(deps.confirmCreate).not.toHaveBeenCalled()
|
|
65
|
-
expect(deps.provision).not.toHaveBeenCalled()
|
|
66
|
-
})
|
|
67
|
-
|
|
68
|
-
test('asks the user to pick when several owned instances are ready', async () => {
|
|
69
|
-
const first = instance('first')
|
|
70
|
-
const second = instance('second')
|
|
71
|
-
const pending = instance('pending', 'provisioning')
|
|
72
|
-
const deps = dependencies({
|
|
73
|
-
fetchOwned: mock(async () => inventory([first, pending, second], 'manager')),
|
|
74
|
-
selectReady: mock(async (instances) => instances[1] ?? null),
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
await expect(ensureOwnedInstance(ctx, deps)).resolves.toBe('fixed')
|
|
78
|
-
|
|
79
|
-
expect(deps.selectReady).toHaveBeenCalledWith([first, second])
|
|
80
|
-
expect(deps.adopt).toHaveBeenCalledWith(second, 'manager')
|
|
81
|
-
expect(deps.confirmCreate).not.toHaveBeenCalled()
|
|
82
|
-
expect(deps.provision).not.toHaveBeenCalled()
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
test('leaves setup skipped when the ready-instance picker is cancelled', async () => {
|
|
86
|
-
const first = instance('first')
|
|
87
|
-
const second = instance('second')
|
|
88
|
-
const deps = dependencies({
|
|
89
|
-
fetchOwned: mock(async () => inventory([first, second])),
|
|
90
|
-
selectReady: mock(async () => null),
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
await expect(ensureOwnedInstance(ctx, deps)).resolves.toBe('skipped')
|
|
94
|
-
|
|
95
|
-
expect(deps.selectReady).toHaveBeenCalledWith([first, second])
|
|
96
|
-
expect(deps.adopt).not.toHaveBeenCalled()
|
|
97
|
-
expect(deps.confirmCreate).not.toHaveBeenCalled()
|
|
98
|
-
expect(deps.provision).not.toHaveBeenCalled()
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
test('offers first-instance creation only after a confirmed empty owner list', async () => {
|
|
102
|
-
const deps = dependencies()
|
|
103
|
-
const original = console.log
|
|
104
|
-
console.log = mock(() => {})
|
|
105
|
-
|
|
106
|
-
try {
|
|
107
|
-
await expect(ensureOwnedInstance(ctx, deps)).resolves.toBe('fixed')
|
|
108
|
-
} finally {
|
|
109
|
-
console.log = original
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
expect(deps.confirmCreate).toHaveBeenCalledTimes(1)
|
|
113
|
-
expect(deps.promptSlug).toHaveBeenCalledTimes(1)
|
|
114
|
-
expect(deps.provision).toHaveBeenCalledWith('new-instance')
|
|
115
|
-
expect(deps.adopt).not.toHaveBeenCalled()
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
test('does not provision when first-instance creation is declined', async () => {
|
|
119
|
-
const deps = dependencies({ confirmCreate: mock(async () => false) })
|
|
120
|
-
|
|
121
|
-
await expect(ensureOwnedInstance(ctx, deps)).resolves.toBe('skipped')
|
|
122
|
-
|
|
123
|
-
expect(deps.confirmCreate).toHaveBeenCalledTimes(1)
|
|
124
|
-
expect(deps.promptSlug).not.toHaveBeenCalled()
|
|
125
|
-
expect(deps.provision).not.toHaveBeenCalled()
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
test('does not provision when the slug prompt is cancelled', async () => {
|
|
129
|
-
const deps = dependencies({ promptSlug: mock(async () => undefined) })
|
|
130
|
-
|
|
131
|
-
await expect(ensureOwnedInstance(ctx, deps)).resolves.toBe('skipped')
|
|
132
|
-
|
|
133
|
-
expect(deps.confirmCreate).toHaveBeenCalledTimes(1)
|
|
134
|
-
expect(deps.promptSlug).toHaveBeenCalledTimes(1)
|
|
135
|
-
expect(deps.provision).not.toHaveBeenCalled()
|
|
136
|
-
})
|
|
137
|
-
|
|
138
|
-
test('does not report setup fixed when provisioning could not select the instance', async () => {
|
|
139
|
-
const deps = dependencies({
|
|
140
|
-
provision: mock(async (slug) => ({
|
|
141
|
-
created: { url: `https://${slug}.eu.astrale.ai`, organizationId: `org_${slug}` },
|
|
142
|
-
slug,
|
|
143
|
-
selectionError: new Error('instances.json is read-only'),
|
|
144
|
-
})),
|
|
145
|
-
})
|
|
146
|
-
const logged: string[] = []
|
|
147
|
-
const original = console.log
|
|
148
|
-
console.log = mock((...args: unknown[]) => {
|
|
149
|
-
logged.push(args.map(String).join(' '))
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
let caught: unknown
|
|
153
|
-
try {
|
|
154
|
-
await ensureOwnedInstance(ctx, deps)
|
|
155
|
-
} catch (error) {
|
|
156
|
-
caught = error
|
|
157
|
-
} finally {
|
|
158
|
-
console.log = original
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
expect(caught).toBeInstanceOf(AstraleError)
|
|
162
|
-
expect((caught as AstraleError).code).toBe('INSTANCE_SELECTION_FAILED')
|
|
163
|
-
expect((caught as AstraleError).message).toContain('instances.json is read-only')
|
|
164
|
-
expect((caught as AstraleError).hint).toContain('astrale instance use new-instance')
|
|
165
|
-
expect(logged.join('\n')).not.toContain('https://new-instance.eu.astrale.ai')
|
|
166
|
-
})
|
|
167
|
-
|
|
168
|
-
test('does not create a duplicate while an owned instance is provisioning or failed', async () => {
|
|
169
|
-
const provisioning = {
|
|
170
|
-
...instance('pending', 'provisioning'),
|
|
171
|
-
phase: 'installing:default-domains',
|
|
172
|
-
}
|
|
173
|
-
const failed = { ...instance('broken', 'failed'), error: 'postInstall failed' }
|
|
174
|
-
const deps = dependencies({
|
|
175
|
-
fetchOwned: mock(async () => inventory([provisioning, failed])),
|
|
176
|
-
})
|
|
177
|
-
const logged: string[] = []
|
|
178
|
-
const original = console.log
|
|
179
|
-
console.log = mock((...args: unknown[]) => {
|
|
180
|
-
logged.push(args.map(String).join(' '))
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
try {
|
|
184
|
-
await expect(ensureOwnedInstance(ctx, deps)).resolves.toBe('skipped')
|
|
185
|
-
} finally {
|
|
186
|
-
console.log = original
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
expect(deps.selectReady).not.toHaveBeenCalled()
|
|
190
|
-
expect(deps.confirmCreate).not.toHaveBeenCalled()
|
|
191
|
-
expect(deps.promptSlug).not.toHaveBeenCalled()
|
|
192
|
-
expect(deps.provision).not.toHaveBeenCalled()
|
|
193
|
-
expect(logged.join('\n')).toContain('pending: provisioning (installing:default-domains)')
|
|
194
|
-
expect(logged.join('\n')).toContain('broken: failed')
|
|
195
|
-
expect(logged.join('\n')).toContain('postInstall failed')
|
|
196
|
-
expect(logged.join('\n')).toContain('astrale instance status')
|
|
197
|
-
})
|
|
198
|
-
|
|
199
|
-
test('does not treat owner-discovery failure as an empty account', async () => {
|
|
200
|
-
const deps = dependencies({
|
|
201
|
-
fetchOwned: mock(async () => {
|
|
202
|
-
throw new Error('admin unavailable')
|
|
203
|
-
}),
|
|
204
|
-
})
|
|
205
|
-
|
|
206
|
-
let caught: unknown
|
|
207
|
-
try {
|
|
208
|
-
await ensureOwnedInstance(ctx, deps)
|
|
209
|
-
} catch (error) {
|
|
210
|
-
caught = error
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
expect(caught).toBeInstanceOf(AstraleError)
|
|
214
|
-
expect((caught as AstraleError).code).toBe('INSTANCE_DISCOVERY_FAILED')
|
|
215
|
-
expect((caught as AstraleError).hint).toContain('No instance was created')
|
|
216
|
-
expect(deps.confirmCreate).not.toHaveBeenCalled()
|
|
217
|
-
expect(deps.provision).not.toHaveBeenCalled()
|
|
218
|
-
})
|
|
219
|
-
})
|
|
220
|
-
|
|
221
|
-
describe('owned-instance adoption', () => {
|
|
222
|
-
test('persists the owner organization before activating the bookmark', async () => {
|
|
223
|
-
const owned = instance('existing')
|
|
224
|
-
const calls: unknown[][] = []
|
|
225
|
-
const original = console.log
|
|
226
|
-
console.log = mock(() => {})
|
|
227
|
-
|
|
228
|
-
try {
|
|
229
|
-
await adoptOwnedInstance(owned, 'manager', {
|
|
230
|
-
upsert: mock(async (...args) => {
|
|
231
|
-
calls.push(['upsert', ...args])
|
|
232
|
-
return { entry: {} }
|
|
233
|
-
}),
|
|
234
|
-
activate: mock(async (...args) => {
|
|
235
|
-
calls.push(['activate', ...args])
|
|
236
|
-
}),
|
|
237
|
-
})
|
|
238
|
-
} finally {
|
|
239
|
-
console.log = original
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
expect(calls).toEqual([
|
|
243
|
-
[
|
|
244
|
-
'upsert',
|
|
245
|
-
{
|
|
246
|
-
key: 'existing',
|
|
247
|
-
slug: 'existing',
|
|
248
|
-
url: 'https://existing.eu.astrale.ai',
|
|
249
|
-
organizationId: 'org_existing',
|
|
250
|
-
defaultIdentity: 'manager',
|
|
251
|
-
},
|
|
252
|
-
],
|
|
253
|
-
['activate', 'existing'],
|
|
254
|
-
])
|
|
255
|
-
})
|
|
256
|
-
})
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from 'bun:test'
|
|
2
|
-
|
|
3
|
-
import { guiOrigin, slugError, urlError } from '../util'
|
|
4
|
-
|
|
5
|
-
describe('guiOrigin — the clickable instance URL', () => {
|
|
6
|
-
test('strips the /api path bookmarks carry', () => {
|
|
7
|
-
expect(guiOrigin('https://my-app.eu.astrale.ai/api')).toBe('https://my-app.eu.astrale.ai')
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
test('leaves a bare origin untouched', () => {
|
|
11
|
-
expect(guiOrigin('https://my-app.eu.astrale.ai')).toBe('https://my-app.eu.astrale.ai')
|
|
12
|
-
})
|
|
13
|
-
|
|
14
|
-
test('returns the input verbatim when it is not a URL', () => {
|
|
15
|
-
expect(guiOrigin('not a url')).toBe('not a url')
|
|
16
|
-
})
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
describe('inquirer validators', () => {
|
|
20
|
-
test('slugError accepts a DNS-label slug and rejects junk', () => {
|
|
21
|
-
expect(slugError('my-app')).toBe(true)
|
|
22
|
-
expect(typeof slugError('Not A Slug')).toBe('string')
|
|
23
|
-
})
|
|
24
|
-
|
|
25
|
-
test('urlError accepts http(s) and rejects junk', () => {
|
|
26
|
-
expect(urlError('https://admin.eu.astrale.ai/api')).toBe(true)
|
|
27
|
-
expect(typeof urlError('ftp://nope')).toBe('string')
|
|
28
|
-
})
|
|
29
|
-
})
|