@astrale-os/cli 1.0.0-beta.9 → 1.0.0-npm-deprecated.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -166
- package/package.json +10 -102
- package/.check-workspace.cjs +0 -40
- package/LICENSE +0 -202
- package/THIRD-PARTY-NOTICES.md +0 -27
- package/dist/astrale.js +0 -93344
- package/dist/public/connect-core.js +0 -29187
- package/dist/public/keys/index.js +0 -5651
- package/dist/public/paths/index.js +0 -4282
- package/dist/types/admin/binding.d.ts +0 -19
- package/dist/types/admin/instance/client.d.ts +0 -22
- package/dist/types/admin/instance/index.d.ts +0 -2
- package/dist/types/admin/instance/model.d.ts +0 -33
- package/dist/types/connect-core.d.ts +0 -22
- package/dist/types/connection/auth.d.ts +0 -39
- package/dist/types/connection/call.d.ts +0 -3
- package/dist/types/connection/command.d.ts +0 -27
- package/dist/types/connection/credential.d.ts +0 -14
- package/dist/types/connection/errors.d.ts +0 -1
- package/dist/types/connection/exchange.d.ts +0 -9
- package/dist/types/connection/failure/classify.d.ts +0 -2
- package/dist/types/connection/failure/index.d.ts +0 -5
- package/dist/types/connection/failure/model.d.ts +0 -25
- package/dist/types/connection/failure/render.d.ts +0 -3
- package/dist/types/connection/index.d.ts +0 -8
- package/dist/types/connection/reasons.d.ts +0 -37
- package/dist/types/connection/self.d.ts +0 -37
- package/dist/types/connection/session.d.ts +0 -31
- package/dist/types/connection/target.d.ts +0 -38
- package/dist/types/errors.d.ts +0 -23
- package/dist/types/identity/registry.d.ts +0 -25
- package/dist/types/keys/algorithm.d.ts +0 -6
- package/dist/types/keys/credential.d.ts +0 -21
- package/dist/types/keys/index.d.ts +0 -4
- package/dist/types/keys/pair.d.ts +0 -34
- package/dist/types/lib/admin-instance.d.ts +0 -17
- package/dist/types/lib/admin-target.d.ts +0 -78
- package/dist/types/lib/ca-fetch.d.ts +0 -2
- package/dist/types/lib/config.d.ts +0 -71
- package/dist/types/lib/failure-debug.d.ts +0 -1
- package/dist/types/lib/format.d.ts +0 -1
- package/dist/types/lib/idp-session.d.ts +0 -33
- package/dist/types/lib/idp.d.ts +0 -404
- package/dist/types/lib/instance-target.d.ts +0 -38
- package/dist/types/lib/instance.d.ts +0 -202
- package/dist/types/lib/invocation.d.ts +0 -3
- package/dist/types/lib/log.d.ts +0 -33
- package/dist/types/lib/login-flow.d.ts +0 -49
- package/dist/types/lib/meta.d.ts +0 -36
- package/dist/types/lib/output.d.ts +0 -87
- package/dist/types/lib/proc.d.ts +0 -43
- package/dist/types/lib/self.d.ts +0 -9
- package/dist/types/lib/table.d.ts +0 -18
- package/dist/types/lib/update.d.ts +0 -131
- package/dist/types/lib/validation.d.ts +0 -11
- package/dist/types/paths/index.d.ts +0 -2
- package/dist/types/state/exchange-credentials.d.ts +0 -25
- package/dist/types/state/files.d.ts +0 -9
- package/dist/types/state/identities.d.ts +0 -42
- package/dist/types/state/index.d.ts +0 -8
- package/dist/types/state/paths.d.ts +0 -32
- package/src/__tests__/fixtures/publication.ts +0 -20
- package/src/admin/.spec/api.d.ts +0 -3
- package/src/admin/.spec/architecture.md +0 -15
- package/src/admin/.spec/icon.svg +0 -3
- package/src/admin/.spec/layout.ts +0 -6
- package/src/admin/__tests__/binding.test.ts +0 -31
- package/src/admin/__tests__/fixture.ts +0 -101
- package/src/admin/binding.ts +0 -98
- package/src/admin/catalog/.spec/api.d.ts +0 -65
- package/src/admin/catalog/.spec/architecture.md +0 -6
- package/src/admin/catalog/.spec/icon.svg +0 -3
- package/src/admin/catalog/.spec/layout.ts +0 -6
- package/src/admin/catalog/__tests__/client.test.ts +0 -142
- package/src/admin/catalog/client.ts +0 -218
- package/src/admin/catalog/index.ts +0 -13
- package/src/admin/catalog/model.ts +0 -41
- package/src/admin/catalog/tsconfig.json +0 -8
- package/src/admin/graph/.spec/api.d.ts +0 -22
- package/src/admin/graph/.spec/architecture.md +0 -5
- package/src/admin/graph/.spec/icon.svg +0 -3
- package/src/admin/graph/.spec/layout.ts +0 -3
- package/src/admin/graph/index.ts +0 -6
- package/src/admin/graph/nodes.ts +0 -56
- package/src/admin/index.ts +0 -2
- package/src/admin/instance/.spec/api.d.ts +0 -66
- package/src/admin/instance/.spec/architecture.md +0 -10
- package/src/admin/instance/.spec/icon.svg +0 -3
- package/src/admin/instance/.spec/layout.ts +0 -6
- package/src/admin/instance/__tests__/client.test.ts +0 -166
- package/src/admin/instance/client.ts +0 -196
- package/src/admin/instance/index.ts +0 -15
- package/src/admin/instance/model.ts +0 -56
- 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 -29
- package/src/commands/__tests__/domain-install-operation.test.ts +0 -126
- package/src/commands/__tests__/domain-install-owned.test.ts +0 -191
- package/src/commands/__tests__/domain-list.test.ts +0 -133
- package/src/commands/__tests__/domain-uninstall.test.ts +0 -53
- package/src/commands/__tests__/install-direct.test.ts +0 -21
- package/src/commands/__tests__/install-identity-override.test.ts +0 -76
- package/src/commands/__tests__/instance-bookmark.test.ts +0 -166
- package/src/commands/__tests__/instance-list-admin.test.ts +0 -26
- package/src/commands/__tests__/instance-list-rows.test.ts +0 -64
- package/src/commands/__tests__/instance-use.test.ts +0 -67
- package/src/commands/__tests__/introspect-parse.test.ts +0 -21
- package/src/commands/__tests__/logs.test.ts +0 -97
- package/src/commands/__tests__/read-commands.test.ts +0 -294
- package/src/commands/__tests__/setup-plan.test.ts +0 -61
- package/src/commands/__tests__/studio-descriptor.test.ts +0 -22
- package/src/commands/__tests__/token-ttl.test.ts +0 -21
- package/src/commands/__tests__/update.test.ts +0 -95
- package/src/commands/__tests__/view-build.test.ts +0 -58
- package/src/commands/__tests__/view.test.ts +0 -149
- package/src/commands/admin/status.ts +0 -61
- package/src/commands/admin/use.ts +0 -100
- package/src/commands/auth/login.ts +0 -82
- package/src/commands/auth/logout.ts +0 -52
- package/src/commands/auth/status.ts +0 -86
- package/src/commands/auth/token.ts +0 -174
- package/src/commands/browser.ts +0 -207
- package/src/commands/call-describe.ts +0 -123
- package/src/commands/call.ts +0 -205
- package/src/commands/domain/install.ts +0 -548
- package/src/commands/domain/list.ts +0 -155
- package/src/commands/domain/publish.ts +0 -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 -196
- package/src/commands/identity/sync.ts +0 -38
- package/src/commands/identity/unsync.ts +0 -34
- package/src/commands/identity/use.ts +0 -24
- package/src/commands/identity/whoami.ts +0 -34
- package/src/commands/idp/add.ts +0 -150
- package/src/commands/idp/list.ts +0 -57
- package/src/commands/idp/refresh.ts +0 -38
- package/src/commands/idp/remove.ts +0 -36
- package/src/commands/idp/show.ts +0 -29
- package/src/commands/instance/active.ts +0 -73
- package/src/commands/instance/bookmark.ts +0 -101
- package/src/commands/instance/create.ts +0 -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 -38
- package/src/commands/instance/use.ts +0 -263
- package/src/commands/introspect.ts +0 -110
- package/src/commands/logs.ts +0 -283
- package/src/commands/mutate.ts +0 -122
- package/src/commands/query.ts +0 -136
- package/src/commands/session/analyze.ts +0 -50
- package/src/commands/session/list.ts +0 -36
- package/src/commands/setup.ts +0 -54
- package/src/commands/status.ts +0 -60
- package/src/commands/studio.ts +0 -434
- package/src/commands/token.ts +0 -107
- package/src/commands/update.ts +0 -334
- package/src/commands/use.ts +0 -86
- package/src/commands/view-serve.ts +0 -26
- package/src/commands/view.ts +0 -614
- package/src/connect-core.test.ts +0 -38
- package/src/connect-core.ts +0 -42
- package/src/connection/.spec/api.d.ts +0 -110
- package/src/connection/.spec/architecture.md +0 -47
- package/src/connection/.spec/capabilities/connection.ts +0 -13
- package/src/connection/.spec/examples/call.ts +0 -7
- package/src/connection/.spec/flows/command.ts +0 -20
- package/src/connection/.spec/flows/session.ts +0 -61
- package/src/connection/.spec/laws/connection.ts +0 -205
- package/src/connection/.spec/layout.ts +0 -21
- package/src/connection/__tests__/auth.test.ts +0 -128
- package/src/connection/__tests__/ca-fetch.test.ts +0 -60
- package/src/connection/__tests__/call.test.ts +0 -17
- package/src/connection/__tests__/credential.test.ts +0 -138
- package/src/connection/__tests__/errors.test.ts +0 -577
- package/src/connection/__tests__/exchange.test.ts +0 -295
- package/src/connection/__tests__/failure-fixtures.ts +0 -39
- package/src/connection/__tests__/failure-safety.test.ts +0 -75
- package/src/connection/__tests__/fixtures/localhost-cert.pem +0 -19
- package/src/connection/__tests__/fixtures/localhost-key.base64 +0 -1
- package/src/connection/__tests__/managed.test.ts +0 -39
- package/src/connection/__tests__/reasons.test.ts +0 -78
- package/src/connection/__tests__/self.test.ts +0 -71
- package/src/connection/__tests__/session.test.ts +0 -140
- package/src/connection/__tests__/target.test.ts +0 -94
- package/src/connection/auth.ts +0 -249
- package/src/connection/call.ts +0 -7
- package/src/connection/command.ts +0 -67
- package/src/connection/credential.ts +0 -117
- package/src/connection/errors.ts +0 -1
- package/src/connection/exchange.ts +0 -311
- package/src/connection/failure/classify.ts +0 -110
- package/src/connection/failure/index.ts +0 -18
- package/src/connection/failure/model.ts +0 -28
- package/src/connection/failure/render.ts +0 -116
- package/src/connection/index.ts +0 -8
- package/src/connection/reasons.ts +0 -209
- package/src/connection/self.ts +0 -138
- package/src/connection/session.ts +0 -196
- package/src/connection/target.ts +0 -112
- package/src/connection/tsconfig.json +0 -6
- package/src/errors.ts +0 -66
- package/src/graph/.spec/api.d.ts +0 -41
- package/src/graph/.spec/laws/documents.ts +0 -24
- package/src/graph/.spec/laws/projection.ts +0 -13
- package/src/graph/.spec/layout.ts +0 -14
- package/src/graph/__tests__/mutation.test.ts +0 -51
- package/src/graph/__tests__/projection.test.ts +0 -22
- package/src/graph/__tests__/query.test.ts +0 -173
- package/src/graph/class.ts +0 -30
- package/src/graph/index.ts +0 -4
- package/src/graph/mutation.ts +0 -46
- package/src/graph/projection.ts +0 -21
- package/src/graph/query.ts +0 -97
- package/src/graph/tsconfig.json +0 -6
- package/src/identity/.history/ard/bootstrap-root-transfer.md +0 -57
- package/src/identity/.history/ard/domain-mediated-registration.md +0 -36
- package/src/identity/.spec/api.d.ts +0 -124
- package/src/identity/.spec/architecture.md +0 -33
- package/src/identity/.spec/capabilities/identity.ts +0 -7
- package/src/identity/.spec/flows/bootstrap-root.ts +0 -79
- package/src/identity/.spec/flows/domain-mediated-registration.ts +0 -51
- package/src/identity/.spec/flows/import.ts +0 -29
- package/src/identity/.spec/laws/identity.ts +0 -56
- package/src/identity/.spec/layout.ts +0 -13
- package/src/identity/.spec/schemas/identity-export-v1.schema.json +0 -25
- package/src/identity/__tests__/fixtures/registry-journey.ts +0 -53
- package/src/identity/__tests__/registration.test.ts +0 -64
- package/src/identity/__tests__/registry.test.ts +0 -70
- package/src/identity/__tests__/transfer.test.ts +0 -198
- package/src/identity/index.ts +0 -23
- package/src/identity/registration.ts +0 -72
- package/src/identity/registry.ts +0 -179
- package/src/identity/transfer.ts +0 -187
- package/src/identity/tsconfig.json +0 -6
- package/src/index.ts +0 -1
- package/src/keys/.spec/api.d.ts +0 -74
- package/src/keys/.spec/architecture.md +0 -13
- package/src/keys/.spec/laws/keys.ts +0 -43
- package/src/keys/.spec/layout.ts +0 -6
- package/src/keys/__tests__/algorithm.test.ts +0 -39
- package/src/keys/__tests__/keys.test.ts +0 -168
- package/src/keys/algorithm.ts +0 -33
- package/src/keys/credential.ts +0 -112
- package/src/keys/index.ts +0 -14
- package/src/keys/pair.ts +0 -219
- package/src/keys/tsconfig.json +0 -6
- package/src/lib/__tests__/admin-target.test.ts +0 -184
- package/src/lib/__tests__/binary.test.ts +0 -55
- package/src/lib/__tests__/command-dx.test.ts +0 -102
- package/src/lib/__tests__/concurrency.test.ts +0 -62
- package/src/lib/__tests__/config.test.ts +0 -54
- package/src/lib/__tests__/design.test.ts +0 -99
- package/src/lib/__tests__/domain-publication.test.ts +0 -138
- package/src/lib/__tests__/format.test.ts +0 -22
- package/src/lib/__tests__/idp-session.driver.ts +0 -53
- package/src/lib/__tests__/idp-session.test.ts +0 -379
- package/src/lib/__tests__/idp.test.ts +0 -415
- package/src/lib/__tests__/instance-candidates.test.ts +0 -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__/studio-server-deps.test.ts +0 -111
- package/src/lib/__tests__/table.test.ts +0 -53
- package/src/lib/__tests__/update.test.ts +0 -351
- package/src/lib/__tests__/use-target.test.ts +0 -56
- package/src/lib/__tests__/validation.test.ts +0 -34
- package/src/lib/__tests__/view-assets.test.ts +0 -146
- package/src/lib/__tests__/view-open-intent.test.ts +0 -280
- package/src/lib/__tests__/view-port-allocation.test.ts +0 -82
- package/src/lib/__tests__/view-server.test.ts +0 -68
- package/src/lib/__tests__/view-session.test.ts +0 -99
- package/src/lib/__tests__/view-snapshot.test.ts +0 -77
- package/src/lib/admin-domain.ts +0 -43
- package/src/lib/admin-instance.ts +0 -56
- package/src/lib/admin-target.ts +0 -290
- package/src/lib/binary.ts +0 -110
- package/src/lib/browser.ts +0 -150
- package/src/lib/ca-fetch.ts +0 -133
- package/src/lib/command-dx.ts +0 -191
- package/src/lib/concurrency.ts +0 -31
- package/src/lib/config.ts +0 -46
- 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 -134
- package/src/lib/idp.ts +0 -906
- package/src/lib/instance-candidates.ts +0 -49
- package/src/lib/instance-target.ts +0 -197
- package/src/lib/instance.ts +0 -467
- package/src/lib/invocation.ts +0 -11
- package/src/lib/local-status.ts +0 -152
- package/src/lib/log.ts +0 -143
- package/src/lib/login-flow.ts +0 -201
- package/src/lib/meta.ts +0 -90
- package/src/lib/output.ts +0 -238
- package/src/lib/panel.ts +0 -61
- package/src/lib/port.ts +0 -41
- package/src/lib/proc.ts +0 -82
- package/src/lib/prompt.ts +0 -136
- package/src/lib/provision-instance.ts +0 -139
- package/src/lib/sdk-deps.ts +0 -104
- package/src/lib/self.ts +0 -22
- package/src/lib/skills.ts +0 -171
- package/src/lib/table.ts +0 -62
- package/src/lib/update.ts +0 -409
- package/src/lib/use-target.ts +0 -24
- package/src/lib/validation.ts +0 -59
- package/src/lib/view/assets.ts +0 -78
- package/src/lib/view/open-intent.ts +0 -67
- package/src/lib/view/port-allocation.ts +0 -19
- package/src/lib/view/resolve.ts +0 -111
- package/src/lib/view/server.ts +0 -244
- package/src/lib/view/session.ts +0 -152
- package/src/lib/view/snapshot.ts +0 -101
- package/src/paths/.spec/api.d.ts +0 -13
- package/src/paths/.spec/architecture.md +0 -5
- package/src/paths/.spec/layout.ts +0 -3
- package/src/paths/index.ts +0 -13
- package/src/program/.spec/api.d.ts +0 -42
- package/src/program/.spec/architecture.md +0 -18
- package/src/program/.spec/laws/program.ts +0 -29
- package/src/program/.spec/layout.ts +0 -14
- package/src/program/__tests__/program.test.ts +0 -378
- package/src/program/build.ts +0 -183
- package/src/program/command.ts +0 -42
- package/src/program/index.ts +0 -2
- package/src/program/options.ts +0 -41
- package/src/program/registry.ts +0 -63
- package/src/program/tsconfig.json +0 -6
- package/src/setup/__tests__/instance-step.test.ts +0 -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 -59
- package/src/setup/types.ts +0 -61
- package/src/setup/util.ts +0 -34
- package/src/state/.spec/api.d.ts +0 -133
- package/src/state/.spec/architecture.md +0 -31
- package/src/state/.spec/capabilities/state.ts +0 -7
- package/src/state/.spec/flows/identity-update.ts +0 -22
- package/src/state/.spec/laws/state.ts +0 -73
- package/src/state/.spec/layout.ts +0 -14
- package/src/state/__tests__/exchange-credentials.test.ts +0 -188
- package/src/state/__tests__/files.test.ts +0 -113
- package/src/state/__tests__/fixtures/identity-transition.ts +0 -37
- package/src/state/__tests__/identities.test.ts +0 -142
- package/src/state/__tests__/paths.test.ts +0 -27
- package/src/state/exchange-credentials.ts +0 -219
- package/src/state/files.ts +0 -129
- package/src/state/identities.ts +0 -229
- package/src/state/index.ts +0 -29
- package/src/state/paths.ts +0 -61
- package/src/state/tsconfig.json +0 -6
- package/src/telemetry/__tests__/gate.test.ts +0 -63
- package/src/telemetry/__tests__/recorder.test.ts +0 -110
- package/src/telemetry/__tests__/redact.test.ts +0 -79
- package/src/telemetry/__tests__/session.test.ts +0 -166
- package/src/telemetry/__tests__/trigger.test.ts +0 -49
- package/src/telemetry/adapters/__tests__/claude-code.test.ts +0 -89
- package/src/telemetry/adapters/__tests__/codex.test.ts +0 -138
- package/src/telemetry/adapters/__tests__/index.test.ts +0 -88
- package/src/telemetry/adapters/claude-code.ts +0 -90
- package/src/telemetry/adapters/codex.ts +0 -160
- package/src/telemetry/adapters/index.ts +0 -45
- package/src/telemetry/adapters/types.ts +0 -21
- package/src/telemetry/analyze.ts +0 -227
- package/src/telemetry/gate.ts +0 -79
- package/src/telemetry/recorder.ts +0 -57
- package/src/telemetry/redact.ts +0 -53
- package/src/telemetry/session.ts +0 -88
- package/src/telemetry/settings.ts +0 -26
- package/src/telemetry/store.ts +0 -91
- package/src/telemetry/trigger.ts +0 -119
- package/src/telemetry/types.ts +0 -64
- package/src/test-utils.ts +0 -18
- package/studio/client/dist/assets/elk-api-ByzoDZWH.js +0 -1
- package/studio/client/dist/assets/elk-worker.min-C9JGDOE-.js +0 -6312
- package/studio/client/dist/assets/index-B0RCgUOT.js +0 -8
- package/studio/client/dist/assets/index-BiGR8Oo9.css +0 -1
- package/studio/client/dist/assets/index-ChOr3yP0.css +0 -1
- package/studio/client/dist/assets/index-N8J8EKlB.js +0 -81
- package/studio/client/dist/index.html +0 -13
- package/studio/package.json +0 -65
- package/studio/server/agent/ask.test.ts +0 -74
- package/studio/server/agent/ask.ts +0 -71
- package/studio/server/agent/bridge/client.test.ts +0 -49
- package/studio/server/agent/bridge/client.ts +0 -37
- package/studio/server/agent/bridge/grant.test.ts +0 -62
- package/studio/server/agent/bridge/grant.ts +0 -84
- package/studio/server/agent/bridge/routes.test.ts +0 -151
- package/studio/server/agent/bridge/routes.ts +0 -148
- package/studio/server/agent/bridge/stdio.ts +0 -195
- package/studio/server/agent/conversation.test.ts +0 -89
- package/studio/server/agent/conversation.ts +0 -158
- package/studio/server/agent/harness/adapter.ts +0 -171
- package/studio/server/agent/harness/claude/adapter.test.ts +0 -348
- package/studio/server/agent/harness/claude/adapter.ts +0 -71
- package/studio/server/agent/harness/claude/ask.ts +0 -114
- package/studio/server/agent/harness/claude/capabilities.ts +0 -27
- package/studio/server/agent/harness/claude/command.ts +0 -63
- package/studio/server/agent/harness/claude/events.ts +0 -215
- package/studio/server/agent/harness/claude/loadout.ts +0 -132
- package/studio/server/agent/harness/claude/mcp.test.ts +0 -36
- package/studio/server/agent/harness/claude/mcp.ts +0 -41
- package/studio/server/agent/harness/claude/skills.ts +0 -43
- package/studio/server/agent/harness/codex/adapter.test.ts +0 -269
- package/studio/server/agent/harness/codex/adapter.ts +0 -116
- package/studio/server/agent/harness/codex/ask.test.ts +0 -176
- package/studio/server/agent/harness/codex/ask.ts +0 -181
- package/studio/server/agent/harness/codex/command.test.ts +0 -69
- package/studio/server/agent/harness/codex/command.ts +0 -43
- package/studio/server/agent/harness/codex/events.test.ts +0 -94
- package/studio/server/agent/harness/codex/events.ts +0 -132
- package/studio/server/agent/harness/codex/exec.ts +0 -113
- package/studio/server/agent/harness/codex/loadout.ts +0 -60
- package/studio/server/agent/harness/codex/mcp.test.ts +0 -32
- package/studio/server/agent/harness/codex/mcp.ts +0 -27
- package/studio/server/agent/harness/codex/models.test.ts +0 -167
- package/studio/server/agent/harness/codex/models.ts +0 -211
- package/studio/server/agent/harness/codex/skills.ts +0 -33
- package/studio/server/agent/harness/gateway/config.test.ts +0 -98
- package/studio/server/agent/harness/gateway/config.ts +0 -214
- package/studio/server/agent/harness/gateway/token.test.ts +0 -133
- package/studio/server/agent/harness/gateway/token.ts +0 -166
- package/studio/server/agent/harness/mock/adapter.ts +0 -190
- package/studio/server/agent/harness/mock/domain-edit.ts +0 -41
- package/studio/server/agent/harness/process.test.ts +0 -46
- package/studio/server/agent/harness/process.ts +0 -104
- package/studio/server/agent/harness/registry.ts +0 -37
- package/studio/server/agent/harness/selection.test.ts +0 -75
- package/studio/server/agent/harness/selection.ts +0 -85
- package/studio/server/agent/harness/skills.test.ts +0 -95
- package/studio/server/agent/harness/skills.ts +0 -100
- package/studio/server/agent/layout.test.ts +0 -95
- package/studio/server/agent/notify.ts +0 -12
- package/studio/server/agent/prompts/anchors.test.ts +0 -70
- package/studio/server/agent/prompts/anchors.ts +0 -153
- package/studio/server/agent/prompts/ask.ts +0 -34
- package/studio/server/agent/prompts/system.test.ts +0 -13
- package/studio/server/agent/prompts/system.ts +0 -99
- package/studio/server/agent/prompts/turn.ts +0 -66
- package/studio/server/agent/routes.test.ts +0 -176
- package/studio/server/agent/routes.ts +0 -214
- package/studio/server/agent/run/completion.ts +0 -193
- package/studio/server/agent/run/coordinator.test.ts +0 -337
- package/studio/server/agent/run/coordinator.ts +0 -104
- package/studio/server/agent/run/live-state.ts +0 -73
- package/studio/server/agent/run/preparation.ts +0 -163
- package/studio/server/agent/run/transcript.test.ts +0 -81
- package/studio/server/agent/run/transcript.ts +0 -196
- package/studio/server/agent/run/usage.test.ts +0 -70
- package/studio/server/agent/run/usage.ts +0 -62
- package/studio/server/agent/stream.ts +0 -37
- package/studio/server/agent/telemetry.ts +0 -13
- package/studio/server/api/canvas.ts +0 -43
- package/studio/server/api/comments.ts +0 -85
- package/studio/server/api/context.ts +0 -61
- package/studio/server/api/deployment.ts +0 -39
- package/studio/server/api/documents.ts +0 -55
- package/studio/server/api/domain.ts +0 -59
- package/studio/server/api/http.ts +0 -45
- package/studio/server/api/project.ts +0 -57
- package/studio/server/api/schema.ts +0 -12
- package/studio/server/api/views.ts +0 -57
- package/studio/server/api/workspace.ts +0 -60
- package/studio/server/api-agent-loadout.test.ts +0 -69
- package/studio/server/api.test.ts +0 -147
- package/studio/server/api.ts +0 -34
- package/studio/server/cache.test.ts +0 -122
- package/studio/server/cache.ts +0 -303
- package/studio/server/cli-consumers.test.ts +0 -494
- package/studio/server/cli.test.ts +0 -88
- package/studio/server/cli.ts +0 -240
- package/studio/server/client-package.test.ts +0 -147
- package/studio/server/client-package.ts +0 -266
- package/studio/server/detect.ts +0 -81
- package/studio/server/domain.test.ts +0 -77
- package/studio/server/domain.ts +0 -124
- package/studio/server/environment/dotenv-preview.test.ts +0 -39
- package/studio/server/environment/dotenv-preview.ts +0 -27
- package/studio/server/environment/files.test.ts +0 -53
- package/studio/server/environment/files.ts +0 -120
- package/studio/server/handoff/copy.ts +0 -171
- package/studio/server/handoff/service.test.ts +0 -22
- package/studio/server/handoff/service.ts +0 -62
- package/studio/server/index.ts +0 -148
- package/studio/server/instances/active.ts +0 -72
- package/studio/server/instances/deploy-record.test.ts +0 -31
- package/studio/server/instances/deploy-record.ts +0 -37
- package/studio/server/instances/deploy.ts +0 -56
- package/studio/server/instances/probe.test.ts +0 -67
- package/studio/server/instances/probe.ts +0 -67
- package/studio/server/instances/status.test.ts +0 -12
- package/studio/server/instances/status.ts +0 -49
- package/studio/server/introspect/anatomy/client-tree.ts +0 -57
- package/studio/server/introspect/anatomy/env-fields.ts +0 -66
- package/studio/server/introspect/anatomy/schema-definition.ts +0 -53
- package/studio/server/introspect/anatomy/source.ts +0 -181
- package/studio/server/introspect/anatomy/views/routes.ts +0 -114
- package/studio/server/introspect/anatomy/views.ts +0 -53
- package/studio/server/introspect/anatomy-extras.test.ts +0 -265
- package/studio/server/introspect/anatomy-extras.ts +0 -10
- package/studio/server/introspect/anatomy.test.ts +0 -41
- package/studio/server/introspect/anatomy.ts +0 -147
- package/studio/server/introspect/bundle.ts +0 -69
- package/studio/server/introspect/canonical-schema.test.ts +0 -179
- package/studio/server/introspect/canonical-schema.ts +0 -583
- package/studio/server/introspect/config-preview.test.ts +0 -32
- package/studio/server/introspect/config-preview.ts +0 -119
- package/studio/server/introspect/core-extractor.ts +0 -30
- package/studio/server/introspect/core.ts +0 -45
- package/studio/server/introspect/diff.test.ts +0 -124
- package/studio/server/introspect/diff.ts +0 -316
- package/studio/server/introspect/extractor.ts +0 -41
- package/studio/server/introspect/hash.ts +0 -24
- package/studio/server/introspect/overlay-tsmorph.test.ts +0 -146
- package/studio/server/introspect/overlay-tsmorph.ts +0 -9
- package/studio/server/introspect/overlay.test.ts +0 -44
- package/studio/server/introspect/overlay.ts +0 -40
- package/studio/server/introspect/revision.test.ts +0 -54
- package/studio/server/introspect/revision.ts +0 -49
- package/studio/server/introspect/runtime.test.ts +0 -157
- package/studio/server/introspect/runtime.ts +0 -140
- package/studio/server/introspect/schema-ir-json.test.ts +0 -70
- package/studio/server/introspect/schema-ir-json.ts +0 -151
- package/studio/server/introspect/schema-refs.test.ts +0 -55
- package/studio/server/introspect/schema-refs.ts +0 -32
- package/studio/server/introspect/source-overlay/annotations.ts +0 -14
- package/studio/server/introspect/source-overlay/handlers.ts +0 -161
- package/studio/server/introspect/source-overlay/kernel-calls.ts +0 -46
- package/studio/server/introspect/source-overlay/project.ts +0 -248
- package/studio/server/introspect/source-overlay/spans.ts +0 -330
- package/studio/server/json.ts +0 -46
- package/studio/server/lifecycle.ts +0 -42
- package/studio/server/sse.test.ts +0 -26
- package/studio/server/sse.ts +0 -60
- package/studio/server/state/baseline.test.ts +0 -267
- package/studio/server/state/baseline.ts +0 -354
- package/studio/server/state/comments.test.ts +0 -94
- package/studio/server/state/comments.ts +0 -484
- package/studio/server/state/context.ts +0 -199
- package/studio/server/state/documents.ts +0 -111
- package/studio/server/state/integrations.ts +0 -81
- package/studio/server/state/layout.test.ts +0 -34
- package/studio/server/state/layout.ts +0 -82
- package/studio/server/state/settings.test.ts +0 -78
- package/studio/server/state/settings.ts +0 -73
- package/studio/server/state/store.test.ts +0 -122
- package/studio/server/state/store.ts +0 -146
- package/studio/server/state/visibility.ts +0 -48
- package/studio/server/views/model.test.ts +0 -57
- package/studio/server/views/model.ts +0 -66
- package/studio/server/views/runtime.ts +0 -40
- package/studio/server/views/selection-repository.test.ts +0 -31
- package/studio/server/views/selection-repository.ts +0 -60
- package/studio/server/views/session.test.ts +0 -73
- package/studio/server/views/session.ts +0 -166
- package/studio/server/views/target.test.ts +0 -78
- package/studio/server/views/target.ts +0 -222
- package/studio/server/watch.test.ts +0 -36
- package/studio/server/watch.ts +0 -93
- package/studio/server/workspace/catalog.test.ts +0 -17
- package/studio/server/workspace/catalog.ts +0 -43
- package/studio/server/workspace/create.test.ts +0 -37
- package/studio/server/workspace/create.ts +0 -162
- package/studio/server/workspace/git.ts +0 -75
- package/studio/server/workspace/updates.ts +0 -83
- package/studio/server/workspace-state.ts +0 -26
- package/studio/server/workspace-watch.ts +0 -106
- package/studio/shared/agent-effort.test.ts +0 -12
- package/studio/shared/agent-effort.ts +0 -15
- package/studio/shared/agent-models.test.ts +0 -9
- package/studio/shared/agent-models.ts +0 -14
- package/studio/shared/contracts/README.md +0 -16
- package/studio/shared/contracts/agent.ts +0 -270
- package/studio/shared/contracts/runtime.ts +0 -50
- package/studio/shared/contracts/schema.ts +0 -393
- package/studio/shared/contracts/surface.test.ts +0 -317
- package/studio/shared/contracts/workspace.ts +0 -265
- package/studio/shared/layout.test.ts +0 -116
- package/studio/shared/schema/identity.test.ts +0 -34
- package/studio/shared/schema/identity.ts +0 -68
- package/studio/shared/settings-values.test.ts +0 -18
- package/studio/shared/settings-values.ts +0 -20
- package/studio/shared/types.ts +0 -14
- package/studio/tsconfig.json +0 -23
- package/tsconfig.json +0 -14
- package/viewer/dist/index.html +0 -93
- package/viewer/dist/main.js +0 -76
- package/viewer/tsconfig.json +0 -13
package/src/lib/update.ts
DELETED
|
@@ -1,409 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto'
|
|
2
|
-
import {
|
|
3
|
-
chmod,
|
|
4
|
-
copyFile,
|
|
5
|
-
mkdir,
|
|
6
|
-
mkdtemp,
|
|
7
|
-
readFile,
|
|
8
|
-
realpath,
|
|
9
|
-
rename,
|
|
10
|
-
rm,
|
|
11
|
-
writeFile,
|
|
12
|
-
} from 'node:fs/promises'
|
|
13
|
-
import { tmpdir } from 'node:os'
|
|
14
|
-
import { dirname, join } from 'node:path'
|
|
15
|
-
import { z } from 'zod'
|
|
16
|
-
|
|
17
|
-
import { AstraleError } from '../errors'
|
|
18
|
-
import { INSTALL_PATH } from '../state/index'
|
|
19
|
-
import { run } from './proc'
|
|
20
|
-
|
|
21
|
-
const DEFAULT_REPO = 'astrale-os/cli'
|
|
22
|
-
export const DEFAULT_UPDATE_CHANNEL = 'beta'
|
|
23
|
-
|
|
24
|
-
export const InstallMetadataSchema = z.object({
|
|
25
|
-
method: z.literal('script'),
|
|
26
|
-
channel: z.string().min(1).default(DEFAULT_UPDATE_CHANNEL),
|
|
27
|
-
version: z.string().min(1).optional(),
|
|
28
|
-
repo: z.string().min(1).default(DEFAULT_REPO),
|
|
29
|
-
bin: z.string().min(1),
|
|
30
|
-
installedAt: z.string().optional(),
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
export type InstallMetadata = z.infer<typeof InstallMetadataSchema>
|
|
34
|
-
|
|
35
|
-
const ManifestAssetSchema = z.object({
|
|
36
|
-
name: z.string().min(1),
|
|
37
|
-
sha256: z
|
|
38
|
-
.string()
|
|
39
|
-
.regex(/^[a-fA-F0-9]{64}$/)
|
|
40
|
-
.optional(),
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
export const UpdateManifestSchema = z.object({
|
|
44
|
-
version: z.string().min(1),
|
|
45
|
-
binaryVersion: z.string().min(1).optional(),
|
|
46
|
-
channel: z.string().min(1),
|
|
47
|
-
repo: z.string().min(1).optional(),
|
|
48
|
-
assets: z.record(
|
|
49
|
-
z.string(),
|
|
50
|
-
z.union([
|
|
51
|
-
ManifestAssetSchema,
|
|
52
|
-
z
|
|
53
|
-
.string()
|
|
54
|
-
.min(1)
|
|
55
|
-
.transform((name) => ({ name })),
|
|
56
|
-
]),
|
|
57
|
-
),
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
export type UpdateManifest = z.infer<typeof UpdateManifestSchema>
|
|
61
|
-
|
|
62
|
-
export type Platform = {
|
|
63
|
-
os: 'darwin' | 'linux'
|
|
64
|
-
arch: 'arm64' | 'x64'
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
export type UpdateRequest = {
|
|
68
|
-
check?: boolean
|
|
69
|
-
channel?: string
|
|
70
|
-
version?: string
|
|
71
|
-
currentVersion: string
|
|
72
|
-
platform?: Platform
|
|
73
|
-
installPath?: string
|
|
74
|
-
execution?: UpdateExecution
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
export type UpdateExecution =
|
|
78
|
-
| { kind: 'standalone'; executable: string }
|
|
79
|
-
| { kind: 'package-managed'; executable: string }
|
|
80
|
-
|
|
81
|
-
const admittedScriptInstall = Symbol('admittedScriptInstall')
|
|
82
|
-
export type AdmittedScriptInstall = Readonly<{
|
|
83
|
-
metadata: InstallMetadata
|
|
84
|
-
executable: string
|
|
85
|
-
[admittedScriptInstall]: true
|
|
86
|
-
}>
|
|
87
|
-
|
|
88
|
-
export type UpdateResult =
|
|
89
|
-
| {
|
|
90
|
-
status: 'managed'
|
|
91
|
-
currentVersion: string
|
|
92
|
-
executable: string
|
|
93
|
-
}
|
|
94
|
-
| {
|
|
95
|
-
status: 'up-to-date'
|
|
96
|
-
currentVersion: string
|
|
97
|
-
latestVersion: string
|
|
98
|
-
channel: string
|
|
99
|
-
}
|
|
100
|
-
| {
|
|
101
|
-
status: 'available'
|
|
102
|
-
currentVersion: string
|
|
103
|
-
latestVersion: string
|
|
104
|
-
channel: string
|
|
105
|
-
}
|
|
106
|
-
| {
|
|
107
|
-
status: 'updated'
|
|
108
|
-
previousVersion: string
|
|
109
|
-
currentVersion: string
|
|
110
|
-
channel: string
|
|
111
|
-
bin: string
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
export function detectPlatform(): Platform {
|
|
115
|
-
const os = process.platform
|
|
116
|
-
const arch = process.arch
|
|
117
|
-
if (os !== 'darwin' && os !== 'linux') {
|
|
118
|
-
throw new AstraleError(
|
|
119
|
-
'UNSUPPORTED_PLATFORM',
|
|
120
|
-
`Unsupported OS "${os}" — Astrale update supports macOS and Linux.`,
|
|
121
|
-
)
|
|
122
|
-
}
|
|
123
|
-
if (arch !== 'arm64' && arch !== 'x64') {
|
|
124
|
-
throw new AstraleError(
|
|
125
|
-
'UNSUPPORTED_PLATFORM',
|
|
126
|
-
`Unsupported CPU architecture "${arch}" — Astrale update supports arm64 and x64.`,
|
|
127
|
-
)
|
|
128
|
-
}
|
|
129
|
-
return { os, arch }
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
export function platformKey(platform: Platform): string {
|
|
133
|
-
return `${platform.os}-${platform.arch}`
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
export function classifyUpdateExecution(input: {
|
|
137
|
-
bunVersion?: string
|
|
138
|
-
executable: string
|
|
139
|
-
entry?: string
|
|
140
|
-
}): UpdateExecution {
|
|
141
|
-
return input.bunVersion && input.entry?.startsWith('/$bunfs/')
|
|
142
|
-
? { kind: 'standalone', executable: input.executable }
|
|
143
|
-
: { kind: 'package-managed', executable: input.executable }
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
export function detectUpdateExecution(): UpdateExecution {
|
|
147
|
-
return classifyUpdateExecution({
|
|
148
|
-
bunVersion: (process.versions as { bun?: string }).bun,
|
|
149
|
-
executable: process.execPath,
|
|
150
|
-
entry: process.argv[1],
|
|
151
|
-
})
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export function packageManagedUpdateError(executable: string): AstraleError {
|
|
155
|
-
return new AstraleError(
|
|
156
|
-
'UPDATE_PACKAGE_MANAGED',
|
|
157
|
-
'This Astrale build is managed by your package manager.',
|
|
158
|
-
`Active binary: ${executable}. Update it with npm, pnpm, or bun; or put the official script installation first on PATH.`,
|
|
159
|
-
)
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export async function readInstallMetadata(path = INSTALL_PATH): Promise<InstallMetadata> {
|
|
163
|
-
let raw: string
|
|
164
|
-
try {
|
|
165
|
-
raw = await readFile(path, 'utf8')
|
|
166
|
-
} catch (error) {
|
|
167
|
-
if (!isMissingFile(error)) throw error
|
|
168
|
-
throw new AstraleError(
|
|
169
|
-
'UPDATE_NOT_SCRIPT_INSTALLED',
|
|
170
|
-
'Astrale was not installed by the official install script.',
|
|
171
|
-
'Reinstall with: curl -fsSL https://raw.githubusercontent.com/astrale-os/cli/main/install.sh | sh',
|
|
172
|
-
)
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
let decoded: unknown
|
|
176
|
-
try {
|
|
177
|
-
decoded = JSON.parse(raw)
|
|
178
|
-
} catch {
|
|
179
|
-
throw badInstallMetadata(path)
|
|
180
|
-
}
|
|
181
|
-
const parsed = InstallMetadataSchema.safeParse(decoded)
|
|
182
|
-
if (!parsed.success) {
|
|
183
|
-
throw badInstallMetadata(path)
|
|
184
|
-
}
|
|
185
|
-
return parsed.data
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
function isMissingFile(error: unknown): error is NodeJS.ErrnoException {
|
|
189
|
-
return error instanceof Error && 'code' in error && error.code === 'ENOENT'
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
function badInstallMetadata(path: string): AstraleError {
|
|
193
|
-
return new AstraleError(
|
|
194
|
-
'UPDATE_BAD_INSTALL_METADATA',
|
|
195
|
-
`Invalid install metadata at ${path}.`,
|
|
196
|
-
'Reinstall with: curl -fsSL https://raw.githubusercontent.com/astrale-os/cli/main/install.sh | sh',
|
|
197
|
-
)
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
export async function admitScriptInstall(
|
|
201
|
-
meta: InstallMetadata,
|
|
202
|
-
execution: Extract<UpdateExecution, { kind: 'standalone' }>,
|
|
203
|
-
): Promise<AdmittedScriptInstall> {
|
|
204
|
-
const [running, recorded] = await Promise.all([
|
|
205
|
-
realpathIfExists(execution.executable),
|
|
206
|
-
realpathIfExists(meta.bin),
|
|
207
|
-
])
|
|
208
|
-
if (running === undefined || recorded === undefined || running !== recorded) {
|
|
209
|
-
throw new AstraleError(
|
|
210
|
-
'UPDATE_INSTALL_MISMATCH',
|
|
211
|
-
'The running Astrale binary does not own the recorded script installation.',
|
|
212
|
-
`Running binary: ${execution.executable}; recorded binary: ${meta.bin}. Refusing to replace a different installation.`,
|
|
213
|
-
)
|
|
214
|
-
}
|
|
215
|
-
return Object.freeze({
|
|
216
|
-
metadata: meta,
|
|
217
|
-
executable: running,
|
|
218
|
-
[admittedScriptInstall]: true as const,
|
|
219
|
-
})
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
async function realpathIfExists(path: string): Promise<string | undefined> {
|
|
223
|
-
try {
|
|
224
|
-
return await realpath(path)
|
|
225
|
-
} catch (error) {
|
|
226
|
-
if (isMissingFile(error)) return undefined
|
|
227
|
-
throw error
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
export async function writeInstallMetadata(
|
|
232
|
-
meta: InstallMetadata,
|
|
233
|
-
path = INSTALL_PATH,
|
|
234
|
-
): Promise<void> {
|
|
235
|
-
await mkdir(dirname(path), { recursive: true })
|
|
236
|
-
await writeFile(path, JSON.stringify(meta, null, 2) + '\n')
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
export function releaseBase(
|
|
240
|
-
meta: InstallMetadata,
|
|
241
|
-
req: Pick<UpdateRequest, 'channel' | 'version'>,
|
|
242
|
-
): string {
|
|
243
|
-
if (process.env.ASTRALE_UPDATE_BASE) return process.env.ASTRALE_UPDATE_BASE.replace(/\/+$/, '')
|
|
244
|
-
const repo = meta.repo || DEFAULT_REPO
|
|
245
|
-
if (req.version) {
|
|
246
|
-
const version = req.version.replace(/^cli\/v/, '').replace(/^v/, '')
|
|
247
|
-
return `https://github.com/${repo}/releases/download/cli/v${version}`
|
|
248
|
-
}
|
|
249
|
-
return `https://github.com/${repo}/releases/download/${req.channel ?? meta.channel ?? DEFAULT_UPDATE_CHANNEL}`
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
export async function fetchManifest(base: string): Promise<UpdateManifest> {
|
|
253
|
-
const raw = await readUrlText(`${base}/manifest.json`)
|
|
254
|
-
return UpdateManifestSchema.parse(JSON.parse(raw))
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
export function shouldUpdate(currentVersion: string, manifestVersion: string): boolean {
|
|
258
|
-
return currentVersion !== manifestVersion
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
export async function updateAstrale(req: UpdateRequest): Promise<UpdateResult> {
|
|
262
|
-
const execution = req.execution ?? detectUpdateExecution()
|
|
263
|
-
if (execution.kind === 'package-managed') {
|
|
264
|
-
return {
|
|
265
|
-
status: 'managed',
|
|
266
|
-
currentVersion: req.currentVersion,
|
|
267
|
-
executable: execution.executable,
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
const install = await admitScriptInstall(await readInstallMetadata(req.installPath), execution)
|
|
272
|
-
const meta = install.metadata
|
|
273
|
-
const currentVersion = meta.version ?? req.currentVersion
|
|
274
|
-
const channel = req.channel ?? meta.channel ?? DEFAULT_UPDATE_CHANNEL
|
|
275
|
-
const platform = req.platform ?? detectPlatform()
|
|
276
|
-
const key = platformKey(platform)
|
|
277
|
-
const base = releaseBase(meta, { channel, version: req.version })
|
|
278
|
-
const manifest = await fetchManifest(base)
|
|
279
|
-
const asset = manifest.assets[key]
|
|
280
|
-
if (!asset) {
|
|
281
|
-
throw new AstraleError(
|
|
282
|
-
'UPDATE_ASSET_NOT_FOUND',
|
|
283
|
-
`No Astrale CLI release asset for ${key}.`,
|
|
284
|
-
`Available platforms: ${Object.keys(manifest.assets).join(', ')}`,
|
|
285
|
-
)
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
if (!shouldUpdate(currentVersion, manifest.version)) {
|
|
289
|
-
return {
|
|
290
|
-
status: 'up-to-date',
|
|
291
|
-
currentVersion,
|
|
292
|
-
latestVersion: manifest.version,
|
|
293
|
-
channel: manifest.channel,
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
if (req.check) {
|
|
298
|
-
return {
|
|
299
|
-
status: 'available',
|
|
300
|
-
currentVersion,
|
|
301
|
-
latestVersion: manifest.version,
|
|
302
|
-
channel: manifest.channel,
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
const tmp = await mkdtemp(join(tmpdir(), 'astrale-update-'))
|
|
307
|
-
try {
|
|
308
|
-
const archive = join(tmp, asset.name)
|
|
309
|
-
await downloadToFile(`${base}/${asset.name}`, archive)
|
|
310
|
-
const manifestChecksum = 'sha256' in asset ? asset.sha256 : undefined
|
|
311
|
-
const expected = manifestChecksum ?? (await fetchChecksum(base, asset.name))
|
|
312
|
-
const actual = await sha256File(archive)
|
|
313
|
-
if (actual !== expected.toLowerCase()) {
|
|
314
|
-
throw new AstraleError(
|
|
315
|
-
'UPDATE_CHECKSUM_MISMATCH',
|
|
316
|
-
`Checksum mismatch for ${asset.name}.`,
|
|
317
|
-
`Expected ${expected}; got ${actual}.`,
|
|
318
|
-
)
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
await extractTarGz(archive, tmp)
|
|
322
|
-
const nextBin = join(tmp, 'astrale')
|
|
323
|
-
await chmod(nextBin, 0o755)
|
|
324
|
-
await smokeVersion(nextBin, manifest.binaryVersion ?? manifest.version)
|
|
325
|
-
|
|
326
|
-
const previous = `${meta.bin}.previous`
|
|
327
|
-
const staged = `${meta.bin}.next`
|
|
328
|
-
await copyFile(meta.bin, previous).catch(() => undefined)
|
|
329
|
-
await copyFile(nextBin, staged)
|
|
330
|
-
await chmod(staged, 0o755)
|
|
331
|
-
await rename(staged, meta.bin)
|
|
332
|
-
|
|
333
|
-
await writeInstallMetadata(
|
|
334
|
-
{
|
|
335
|
-
...meta,
|
|
336
|
-
channel: manifest.channel,
|
|
337
|
-
version: manifest.version,
|
|
338
|
-
installedAt: new Date().toISOString(),
|
|
339
|
-
},
|
|
340
|
-
req.installPath,
|
|
341
|
-
)
|
|
342
|
-
|
|
343
|
-
return {
|
|
344
|
-
status: 'updated',
|
|
345
|
-
previousVersion: currentVersion,
|
|
346
|
-
currentVersion: manifest.version,
|
|
347
|
-
channel: manifest.channel,
|
|
348
|
-
bin: meta.bin,
|
|
349
|
-
}
|
|
350
|
-
} finally {
|
|
351
|
-
await rm(tmp, { recursive: true, force: true })
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
async function readUrlText(url: string): Promise<string> {
|
|
356
|
-
if (url.startsWith('file://')) {
|
|
357
|
-
return readFile(new URL(url), 'utf8')
|
|
358
|
-
}
|
|
359
|
-
const res = await fetch(url)
|
|
360
|
-
if (!res.ok) throw new Error(`GET ${url} failed: HTTP ${res.status}`)
|
|
361
|
-
return res.text()
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
async function downloadToFile(url: string, path: string): Promise<void> {
|
|
365
|
-
if (url.startsWith('file://')) {
|
|
366
|
-
await copyFile(new URL(url), path)
|
|
367
|
-
return
|
|
368
|
-
}
|
|
369
|
-
const res = await fetch(url)
|
|
370
|
-
if (!res.ok) throw new Error(`GET ${url} failed: HTTP ${res.status}`)
|
|
371
|
-
const bytes = new Uint8Array(await res.arrayBuffer())
|
|
372
|
-
await writeFile(path, bytes)
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
async function fetchChecksum(base: string, assetName: string): Promise<string> {
|
|
376
|
-
const raw = await readUrlText(`${base}/sha256sums.txt`)
|
|
377
|
-
for (const line of raw.split(/\r?\n/)) {
|
|
378
|
-
const [sha, file] = line.trim().split(/\s+/, 2)
|
|
379
|
-
if (!sha || !file) continue
|
|
380
|
-
if (file.replace(/^\*/, '') === assetName && /^[a-fA-F0-9]{64}$/.test(sha)) return sha
|
|
381
|
-
}
|
|
382
|
-
throw new AstraleError(
|
|
383
|
-
'UPDATE_CHECKSUM_NOT_FOUND',
|
|
384
|
-
`Checksum entry not found for ${assetName}.`,
|
|
385
|
-
`Release base: ${base}`,
|
|
386
|
-
)
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
async function sha256File(path: string): Promise<string> {
|
|
390
|
-
const hash = createHash('sha256')
|
|
391
|
-
hash.update(await readFile(path))
|
|
392
|
-
return hash.digest('hex')
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
async function extractTarGz(archive: string, cwd: string): Promise<void> {
|
|
396
|
-
const { code, stderr } = await run('tar', ['-xzf', archive, '-C', cwd])
|
|
397
|
-
if (code !== 0) {
|
|
398
|
-
throw new Error(`Could not extract update archive: ${stderr.trim()}`)
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
async function smokeVersion(bin: string, expectedVersion: string): Promise<void> {
|
|
403
|
-
const { code, stdout, stderr } = await run(bin, ['--version'])
|
|
404
|
-
if (code !== 0) throw new Error(`Updated binary failed --version: ${stderr.trim()}`)
|
|
405
|
-
const actual = stdout.trim()
|
|
406
|
-
if (actual !== expectedVersion) {
|
|
407
|
-
throw new Error(`Updated binary reported version ${actual}, expected ${expectedVersion}`)
|
|
408
|
-
}
|
|
409
|
-
}
|
package/src/lib/use-target.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { IdentityStore } from '../identity/index'
|
|
2
|
-
import type { InstanceStore } from './instance'
|
|
3
|
-
|
|
4
|
-
import { resolveInstanceKey } from './instance'
|
|
5
|
-
|
|
6
|
-
export type UseTarget =
|
|
7
|
-
| { kind: 'identity'; name: string }
|
|
8
|
-
| { kind: 'instance'; name: string }
|
|
9
|
-
| { kind: 'ambiguous'; name: string }
|
|
10
|
-
| { kind: 'missing'; name: string }
|
|
11
|
-
|
|
12
|
-
export function resolveUseTarget(
|
|
13
|
-
name: string,
|
|
14
|
-
instances: InstanceStore,
|
|
15
|
-
identities: IdentityStore,
|
|
16
|
-
): UseTarget {
|
|
17
|
-
const identityExists = !!identities.identities[name]
|
|
18
|
-
const instanceKey = resolveInstanceKey(instances, name)
|
|
19
|
-
|
|
20
|
-
if (identityExists && instanceKey) return { kind: 'ambiguous', name }
|
|
21
|
-
if (identityExists) return { kind: 'identity', name }
|
|
22
|
-
if (instanceKey) return { kind: 'instance', name: instanceKey }
|
|
23
|
-
return { kind: 'missing', name }
|
|
24
|
-
}
|
package/src/lib/validation.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { isDnsLabel } from '@astrale-os/sdk/value'
|
|
2
|
-
import { z } from 'zod'
|
|
3
|
-
|
|
4
|
-
import { ReservedSlugError } from '../errors'
|
|
5
|
-
|
|
6
|
-
// Shared validators + schema fragments used by both instance and identity
|
|
7
|
-
// registries — kept in a leaf module to avoid circular imports.
|
|
8
|
-
|
|
9
|
-
const NAME_RE = /^[a-zA-Z0-9_.-]+$/
|
|
10
|
-
// `host` is the reserved slug of the host/manager kernel (SPEC §5.2); `manager` is the legacy name.
|
|
11
|
-
const RESERVED_SLUGS = new Set(['manager', 'host'])
|
|
12
|
-
|
|
13
|
-
export { RESERVED_SLUGS }
|
|
14
|
-
|
|
15
|
-
export function validateName(name: string, entity: string): void {
|
|
16
|
-
if (!name || !NAME_RE.test(name)) {
|
|
17
|
-
throw new Error(
|
|
18
|
-
`Invalid ${entity.toLowerCase()} name "${name}" — must be non-empty and contain only letters, digits, hyphens, underscores, and dots`,
|
|
19
|
-
)
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export function validateSlug(slug: string): void {
|
|
24
|
-
// Canonical Core DNS-label rule: a slug becomes a
|
|
25
|
-
// hostname label, so reject anything not DNS-safe (§4.7).
|
|
26
|
-
if (!slug || !isDnsLabel(slug)) {
|
|
27
|
-
throw new Error(
|
|
28
|
-
`Invalid slug "${slug}" — must be a lowercase DNS label [a-z0-9-], ≤63 chars, no leading/trailing hyphen (§4.7)`,
|
|
29
|
-
)
|
|
30
|
-
}
|
|
31
|
-
if (RESERVED_SLUGS.has(slug)) {
|
|
32
|
-
throw new ReservedSlugError(slug)
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function validateUrl(url: string): void {
|
|
37
|
-
try {
|
|
38
|
-
const parsed = new URL(url)
|
|
39
|
-
if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
|
|
40
|
-
throw new Error('not http(s)')
|
|
41
|
-
}
|
|
42
|
-
} catch {
|
|
43
|
-
throw new Error(`Invalid URL "${url}" — expected a valid http:// or https:// URL`)
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
/** Non-throwing predicate form of `validateUrl`. */
|
|
48
|
-
export function isHttpUrl(url: string): boolean {
|
|
49
|
-
try {
|
|
50
|
-
validateUrl(url)
|
|
51
|
-
return true
|
|
52
|
-
} catch {
|
|
53
|
-
return false
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** `local` = only this machine. `remote` = mirrored via astrale cloud (§2.7). */
|
|
58
|
-
export const RegistryModeSchema = z.enum(['local', 'remote'])
|
|
59
|
-
export type RegistryMode = z.infer<typeof RegistryModeSchema>
|
package/src/lib/view/assets.ts
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { existsSync, statSync } from 'node:fs'
|
|
2
|
-
import { copyFile } from 'node:fs/promises'
|
|
3
|
-
import { dirname, join } from 'node:path'
|
|
4
|
-
import { fileURLToPath } from 'node:url'
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* The prebuilt host-page bundle, shipped next to the CLI module
|
|
8
|
-
* (`<pkg>/viewer/dist`). The module URL is authoritative because npm global
|
|
9
|
-
* installs expose the CLI through a bin symlink outside the package root.
|
|
10
|
-
*/
|
|
11
|
-
export function viewerDistDir(moduleUrl = import.meta.url, entry = process.argv[1] ?? '.'): string {
|
|
12
|
-
const override = process.env.ASTRALE_VIEWER_DIR
|
|
13
|
-
if (override) return override
|
|
14
|
-
|
|
15
|
-
const moduleDirectory = dirname(fileURLToPath(moduleUrl))
|
|
16
|
-
const published = join(moduleDirectory, '..', 'viewer', 'dist')
|
|
17
|
-
const source = join(moduleDirectory, '..', '..', '..', 'viewer', 'dist')
|
|
18
|
-
const legacy = join(dirname(entry), '..', 'viewer', 'dist')
|
|
19
|
-
const complete = [published, source, legacy].find(hasViewerBundle)
|
|
20
|
-
if (complete) return complete
|
|
21
|
-
|
|
22
|
-
// A source checkout may intentionally omit generated dist assets. Keep the
|
|
23
|
-
// source-derived destination so ensureViewerAssets can build it on demand.
|
|
24
|
-
if (hasViewerSource(join(source, '..'))) return source
|
|
25
|
-
|
|
26
|
-
// Published installs cannot rebuild: preserve the package-relative path in
|
|
27
|
-
// the diagnostic instead of pointing at the npm prefix beside the bin link.
|
|
28
|
-
return published
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** Ensure the host bundle exists; on a dev checkout, build it with Bun. */
|
|
32
|
-
export async function ensureViewerAssets(
|
|
33
|
-
moduleUrl = import.meta.url,
|
|
34
|
-
entry = process.argv[1] ?? '.',
|
|
35
|
-
): Promise<string> {
|
|
36
|
-
const dist = viewerDistDir(moduleUrl, entry)
|
|
37
|
-
const srcDir = join(dist, '..')
|
|
38
|
-
if (hasViewerBundle(dist) && !viewerSourceIsNewer(srcDir, dist)) return dist
|
|
39
|
-
const bun = (
|
|
40
|
-
globalThis as { Bun?: { build: (o: object) => Promise<{ success: boolean; logs: unknown[] }> } }
|
|
41
|
-
).Bun
|
|
42
|
-
if (bun && hasViewerSource(srcDir)) {
|
|
43
|
-
const result = await bun.build({
|
|
44
|
-
entrypoints: [join(srcDir, 'main.ts')],
|
|
45
|
-
outdir: dist,
|
|
46
|
-
target: 'browser',
|
|
47
|
-
minify: false,
|
|
48
|
-
})
|
|
49
|
-
if (!result.success) throw new Error(`viewer build failed: ${result.logs.join('\n')}`)
|
|
50
|
-
await copyFile(join(srcDir, 'index.html'), join(dist, 'index.html'))
|
|
51
|
-
return dist
|
|
52
|
-
}
|
|
53
|
-
throw new Error(
|
|
54
|
-
`viewer bundle missing at ${dist} — reinstall the CLI (or run \`bun scripts/build.ts\` in a dev checkout)`,
|
|
55
|
-
)
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function hasViewerBundle(directory: string): boolean {
|
|
59
|
-
return existsSync(join(directory, 'main.js')) && existsSync(join(directory, 'index.html'))
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
function hasViewerSource(directory: string): boolean {
|
|
63
|
-
return existsSync(join(directory, 'main.ts')) && existsSync(join(directory, 'index.html'))
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
function viewerSourceIsNewer(source: string, dist: string): boolean {
|
|
67
|
-
if (!hasViewerSource(source)) return false
|
|
68
|
-
if (!hasViewerBundle(dist)) return true
|
|
69
|
-
const newestSource = Math.max(
|
|
70
|
-
statSync(join(source, 'main.ts')).mtimeMs,
|
|
71
|
-
statSync(join(source, 'index.html')).mtimeMs,
|
|
72
|
-
)
|
|
73
|
-
const oldestOutput = Math.min(
|
|
74
|
-
statSync(join(dist, 'main.js')).mtimeMs,
|
|
75
|
-
statSync(join(dist, 'index.html')).mtimeMs,
|
|
76
|
-
)
|
|
77
|
-
return newestSource > oldestOutput
|
|
78
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import type { IntentMessage, MountedWindow, ResolvedView, Shell } from '@astrale-os/shell'
|
|
2
|
-
|
|
3
|
-
export interface OpenIntentHost {
|
|
4
|
-
current(): MountedWindow | null
|
|
5
|
-
setCurrent(window: MountedWindow): void
|
|
6
|
-
mount(view: ResolvedView): Promise<MountedWindow>
|
|
7
|
-
opened(view: ResolvedView): void
|
|
8
|
-
failed(error: unknown): void
|
|
9
|
-
reply(message: IntentMessage<'open'>, windowId: string): void
|
|
10
|
-
reject(message: IntentMessage<'open'>, error: unknown): void
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/** Register the root host's serialized node-to-View navigation handler. */
|
|
14
|
-
export function installOpenIntentHandler(shell: Shell, host: OpenIntentHost): () => void {
|
|
15
|
-
let queue = Promise.resolve()
|
|
16
|
-
return shell.onIntent('open', (message) => {
|
|
17
|
-
const run = queue.then(() => handleOpenIntent(shell, host, message))
|
|
18
|
-
queue = run.catch(() => {})
|
|
19
|
-
return run
|
|
20
|
-
})
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export async function handleOpenIntent(
|
|
24
|
-
shell: Pick<Shell, 'views'>,
|
|
25
|
-
host: OpenIntentHost,
|
|
26
|
-
message: IntentMessage<'open'>,
|
|
27
|
-
): Promise<void> {
|
|
28
|
-
const { nodeId, viewId } = message.envelope.payload
|
|
29
|
-
try {
|
|
30
|
-
const selected = selectResolvedView(await shell.views.resolve(nodeId), viewId)
|
|
31
|
-
const previous = host.current()
|
|
32
|
-
const next = await host.mount(selected)
|
|
33
|
-
|
|
34
|
-
host.setCurrent(next)
|
|
35
|
-
host.opened(selected)
|
|
36
|
-
// A correlated requester is normally `previous`; answer while its channel
|
|
37
|
-
// still exists, then retire the old mount.
|
|
38
|
-
host.reply(message, next.windowId)
|
|
39
|
-
|
|
40
|
-
if (previous && previous.windowId !== next.windowId) {
|
|
41
|
-
try {
|
|
42
|
-
const closed = await previous.close({ force: true })
|
|
43
|
-
if (closed.kind === 'refused') {
|
|
44
|
-
host.failed(new Error(closed.reason ?? `Window ${previous.windowId} refused to close`))
|
|
45
|
-
}
|
|
46
|
-
} catch (error) {
|
|
47
|
-
host.failed(error)
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
} catch (error) {
|
|
51
|
-
host.reject(message, error)
|
|
52
|
-
host.failed(error)
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export function selectResolvedView(
|
|
57
|
-
views: readonly ResolvedView[],
|
|
58
|
-
viewId: string | undefined,
|
|
59
|
-
): ResolvedView {
|
|
60
|
-
const selected = viewId
|
|
61
|
-
? views.find((view) => view.route.key === viewId || `/:${view.route.key}` === viewId)
|
|
62
|
-
: views[0]
|
|
63
|
-
if (selected) return selected
|
|
64
|
-
throw new Error(
|
|
65
|
-
viewId ? `View ${viewId} does not resolve for this node` : 'No view resolves for this node',
|
|
66
|
-
)
|
|
67
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { join } from 'node:path'
|
|
2
|
-
|
|
3
|
-
import { withFileLock } from '../../state/index'
|
|
4
|
-
import { VIEW_DIR } from './session'
|
|
5
|
-
|
|
6
|
-
const VIEW_PORT_LOCK = join(VIEW_DIR, 'ports.lock')
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Keep the free-port probe and detached server startup in one cross-process
|
|
10
|
-
* critical section. A probe alone is only advisory: without this lock, two
|
|
11
|
-
* concurrent `astrale view` processes can both observe 4419 as free before
|
|
12
|
-
* either child binds it.
|
|
13
|
-
*/
|
|
14
|
-
export function withViewPortAllocationLock<T>(
|
|
15
|
-
fn: () => Promise<T>,
|
|
16
|
-
lockPath = VIEW_PORT_LOCK,
|
|
17
|
-
): Promise<T> {
|
|
18
|
-
return withFileLock(lockPath, fn)
|
|
19
|
-
}
|