@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/ca-fetch.ts
DELETED
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import type { IncomingHttpHeaders, request as httpRequest } from 'node:http'
|
|
2
|
-
|
|
3
|
-
import { Buffer } from 'node:buffer'
|
|
4
|
-
import { readFileSync } from 'node:fs'
|
|
5
|
-
import { request as httpsRequest } from 'node:https'
|
|
6
|
-
import { rootCertificates } from 'node:tls'
|
|
7
|
-
|
|
8
|
-
/** Create a Fetch capability whose HTTPS requests trust one CLI-selected CA file. */
|
|
9
|
-
export function fetchWithCaFile(
|
|
10
|
-
caFile: string,
|
|
11
|
-
fallback: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response> = globalThis.fetch,
|
|
12
|
-
): (input: RequestInfo | URL, init?: RequestInit) => Promise<Response> {
|
|
13
|
-
const ca = readFileSync(caFile)
|
|
14
|
-
const fallbackFetch = fallback.bind(globalThis)
|
|
15
|
-
|
|
16
|
-
return async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
|
|
17
|
-
const url = requestUrl(input)
|
|
18
|
-
if (url.protocol !== 'https:') return fallbackFetch(input, init)
|
|
19
|
-
return fetchWithNode(url, init, ca)
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function requestUrl(input: RequestInfo | URL): URL {
|
|
24
|
-
if (input instanceof URL) return input
|
|
25
|
-
if (typeof input === 'string') return new URL(input)
|
|
26
|
-
return new URL(input.url)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function fetchWithNode(url: URL, init: RequestInit | undefined, ca: Buffer): Promise<Response> {
|
|
30
|
-
return new Promise((resolve, reject) => {
|
|
31
|
-
const request = httpsRequest(
|
|
32
|
-
url,
|
|
33
|
-
{
|
|
34
|
-
method: init?.method ?? 'GET',
|
|
35
|
-
headers: headersInitToRecord(init?.headers),
|
|
36
|
-
// `ca` replaces Node's default trust set. Retain public roots because one
|
|
37
|
-
// Client Session may reach both a private Kernel and a public Domain issuer.
|
|
38
|
-
ca: [...rootCertificates, ca],
|
|
39
|
-
},
|
|
40
|
-
(response) => {
|
|
41
|
-
const chunks: Buffer[] = []
|
|
42
|
-
response.on('data', (chunk) =>
|
|
43
|
-
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)),
|
|
44
|
-
)
|
|
45
|
-
response.on('end', () => {
|
|
46
|
-
const status = response.statusCode ?? 0
|
|
47
|
-
const body =
|
|
48
|
-
status === 204 || status === 205 || status === 304 ? null : Buffer.concat(chunks)
|
|
49
|
-
const result = new Response(body, {
|
|
50
|
-
status,
|
|
51
|
-
statusText: response.statusMessage,
|
|
52
|
-
headers: responseHeaders(response.headers),
|
|
53
|
-
})
|
|
54
|
-
// Synthetic Responses have no URL list. This transport does not follow
|
|
55
|
-
// redirects, so the exact request URL is also the final response URL.
|
|
56
|
-
Object.defineProperty(result, 'url', { value: url.toString() })
|
|
57
|
-
resolve(result)
|
|
58
|
-
})
|
|
59
|
-
},
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
request.on('error', reject)
|
|
63
|
-
if (init?.signal) {
|
|
64
|
-
if (init.signal.aborted) {
|
|
65
|
-
request.destroy(abortError(init.signal.reason))
|
|
66
|
-
} else {
|
|
67
|
-
init.signal.addEventListener(
|
|
68
|
-
'abort',
|
|
69
|
-
() => request.destroy(abortError(init.signal?.reason)),
|
|
70
|
-
{
|
|
71
|
-
once: true,
|
|
72
|
-
},
|
|
73
|
-
)
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
writeBody(request, init?.body)
|
|
78
|
-
.then(() => request.end())
|
|
79
|
-
.catch((error) => request.destroy(error))
|
|
80
|
-
})
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function abortError(reason: unknown): Error {
|
|
84
|
-
return reason instanceof Error
|
|
85
|
-
? reason
|
|
86
|
-
: new DOMException('The operation was aborted.', 'AbortError')
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
async function writeBody(
|
|
90
|
-
request: ReturnType<typeof httpRequest>,
|
|
91
|
-
body: BodyInit | null | undefined,
|
|
92
|
-
): Promise<void> {
|
|
93
|
-
if (body === undefined || body === null) return
|
|
94
|
-
if (typeof body === 'string' || body instanceof Uint8Array) {
|
|
95
|
-
request.write(body)
|
|
96
|
-
return
|
|
97
|
-
}
|
|
98
|
-
if (body instanceof ArrayBuffer) {
|
|
99
|
-
request.write(Buffer.from(body))
|
|
100
|
-
return
|
|
101
|
-
}
|
|
102
|
-
if (body instanceof Blob) {
|
|
103
|
-
request.write(Buffer.from(await body.arrayBuffer()))
|
|
104
|
-
return
|
|
105
|
-
}
|
|
106
|
-
throw new Error('Unsupported request body type for CA-backed fetch')
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
function headersInitToRecord(headers: HeadersInit | undefined): Record<string, string> {
|
|
110
|
-
if (!headers) return {}
|
|
111
|
-
if (headers instanceof Headers) {
|
|
112
|
-
const out: Record<string, string> = {}
|
|
113
|
-
headers.forEach((value, key) => {
|
|
114
|
-
out[key] = value
|
|
115
|
-
})
|
|
116
|
-
return out
|
|
117
|
-
}
|
|
118
|
-
if (Array.isArray(headers)) return Object.fromEntries(headers)
|
|
119
|
-
return Object.fromEntries(Object.entries(headers).map(([key, value]) => [key, String(value)]))
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
function responseHeaders(headers: IncomingHttpHeaders): Headers {
|
|
123
|
-
const out = new Headers()
|
|
124
|
-
for (const [key, value] of Object.entries(headers)) {
|
|
125
|
-
if (value === undefined) continue
|
|
126
|
-
if (Array.isArray(value)) {
|
|
127
|
-
for (const entry of value) out.append(key, entry)
|
|
128
|
-
} else {
|
|
129
|
-
out.set(key, value)
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
return out
|
|
133
|
-
}
|
package/src/lib/command-dx.ts
DELETED
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import type { Command, CommanderError } from 'commander'
|
|
2
|
-
|
|
3
|
-
import chalk from 'chalk'
|
|
4
|
-
|
|
5
|
-
export type CommandCatalogEntry = {
|
|
6
|
-
path: string[]
|
|
7
|
-
usage: string
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export function collectCommandCatalog(program: Command): CommandCatalogEntry[] {
|
|
11
|
-
const out: CommandCatalogEntry[] = []
|
|
12
|
-
|
|
13
|
-
function walk(command: Command, path: string[]): void {
|
|
14
|
-
for (const child of command.commands) {
|
|
15
|
-
const childPath = [...path, child.name()]
|
|
16
|
-
if (child.commands.length === 0) {
|
|
17
|
-
out.push({ path: childPath, usage: usageFor(childPath, child) })
|
|
18
|
-
}
|
|
19
|
-
walk(child, childPath)
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
walk(program, [])
|
|
24
|
-
return out
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function renderCommanderError(
|
|
28
|
-
program: Command,
|
|
29
|
-
error: CommanderError,
|
|
30
|
-
argv = process.argv.slice(2),
|
|
31
|
-
machine = argv.some((token) => token === '--ci' || token === '--json' || token === '--raw') ||
|
|
32
|
-
!(process.stdout.isTTY ?? false),
|
|
33
|
-
): string {
|
|
34
|
-
const tokens = stripOptions(argv)
|
|
35
|
-
const catalog = collectCommandCatalog(program)
|
|
36
|
-
const matched = matchRegisteredPrefix(program, tokens)
|
|
37
|
-
|
|
38
|
-
if (matched.path.length === 0 && tokens.length > 0) {
|
|
39
|
-
return maybeMachine(renderUnknownCommand(tokens, catalog), machine)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (error.code === 'commander.missingArgument') {
|
|
43
|
-
const usage = usageFor(matched.path, matched.command)
|
|
44
|
-
return maybeMachine(
|
|
45
|
-
[
|
|
46
|
-
`Missing required argument for ${chalk.bold(`astrale ${matched.path.join(' ')}`)}`,
|
|
47
|
-
'',
|
|
48
|
-
'Usage:',
|
|
49
|
-
` astrale ${usage}`,
|
|
50
|
-
].join('\n'),
|
|
51
|
-
machine,
|
|
52
|
-
)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
if (error.code === 'commander.excessArguments') {
|
|
56
|
-
const usage = usageFor(matched.path, matched.command)
|
|
57
|
-
const extra = tokens.slice(matched.path.length).join(' ')
|
|
58
|
-
return maybeMachine(
|
|
59
|
-
[
|
|
60
|
-
`Unexpected argument${extra.includes(' ') ? 's' : ''} for ${chalk.bold(
|
|
61
|
-
`astrale ${matched.path.join(' ')}`,
|
|
62
|
-
)}${extra ? `: ${extra}` : ''}`,
|
|
63
|
-
'',
|
|
64
|
-
'Usage:',
|
|
65
|
-
` astrale ${usage}`,
|
|
66
|
-
].join('\n'),
|
|
67
|
-
machine,
|
|
68
|
-
)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const suggestions = nearestCommands(tokens.join(' '), catalog)
|
|
72
|
-
return maybeMachine(
|
|
73
|
-
[
|
|
74
|
-
error.message,
|
|
75
|
-
...(suggestions.length > 0
|
|
76
|
-
? ['', 'Did you mean:', ...suggestions.map((s) => ` astrale ${s}`)]
|
|
77
|
-
: []),
|
|
78
|
-
].join('\n'),
|
|
79
|
-
machine,
|
|
80
|
-
)
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const RETIRED_COMMANDS: Record<string, string> = {
|
|
84
|
-
ls: 'astrale query <source> --edge <class>',
|
|
85
|
-
describe: 'astrale get <target>',
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
function renderUnknownCommand(tokens: string[], catalog: CommandCatalogEntry[]): string {
|
|
89
|
-
const command = tokens.join(' ')
|
|
90
|
-
const first = tokens[0]
|
|
91
|
-
const retired = first === undefined ? undefined : RETIRED_COMMANDS[first]
|
|
92
|
-
if (retired !== undefined) {
|
|
93
|
-
return [
|
|
94
|
-
`Unknown command: ${chalk.bold(`astrale ${command}`)}`,
|
|
95
|
-
'',
|
|
96
|
-
`\`astrale ${first}\` was removed. Use ${chalk.bold(retired)} instead.`,
|
|
97
|
-
].join('\n')
|
|
98
|
-
}
|
|
99
|
-
const namespaceMatches = catalog.filter((entry) => entry.path.at(-1) === first)
|
|
100
|
-
if (namespaceMatches.length > 0) {
|
|
101
|
-
return [
|
|
102
|
-
`Unknown command: ${chalk.bold(`astrale ${command}`)}`,
|
|
103
|
-
'',
|
|
104
|
-
`"${first}" is available under:`,
|
|
105
|
-
...namespaceMatches.map((entry) => ` astrale ${entry.usage}`),
|
|
106
|
-
].join('\n')
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
const suggestions = nearestCommands(command, catalog)
|
|
110
|
-
return [
|
|
111
|
-
`Unknown command: ${chalk.bold(`astrale ${command}`)}`,
|
|
112
|
-
...(suggestions.length > 0
|
|
113
|
-
? ['', 'Did you mean:', ...suggestions.map((s) => ` astrale ${s}`)]
|
|
114
|
-
: []),
|
|
115
|
-
].join('\n')
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
function matchRegisteredPrefix(
|
|
119
|
-
program: Command,
|
|
120
|
-
tokens: string[],
|
|
121
|
-
): { command: Command; path: string[] } {
|
|
122
|
-
let current = program
|
|
123
|
-
const path: string[] = []
|
|
124
|
-
for (const token of tokens) {
|
|
125
|
-
const next = current.commands.find(
|
|
126
|
-
(cmd) => cmd.name() === token || cmd.aliases().includes(token),
|
|
127
|
-
)
|
|
128
|
-
if (!next) break
|
|
129
|
-
current = next
|
|
130
|
-
path.push(current.name())
|
|
131
|
-
}
|
|
132
|
-
return { command: current, path }
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
function usageFor(path: string[], command: Command): string {
|
|
136
|
-
const suffix = command
|
|
137
|
-
.usage()
|
|
138
|
-
.replace(/\[options\]\s*/g, '')
|
|
139
|
-
.replace(/\s+/g, ' ')
|
|
140
|
-
.trim()
|
|
141
|
-
return [path.join(' '), suffix].filter(Boolean).join(' ')
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
const ANSI_RE = new RegExp(String.fromCharCode(27) + '\\[[0-9;]*m', 'g')
|
|
145
|
-
|
|
146
|
-
function maybeMachine(text: string, machine: boolean): string {
|
|
147
|
-
if (!machine) return text
|
|
148
|
-
const plain = text.replace(ANSI_RE, '')
|
|
149
|
-
const first = plain.split('\n').find((line) => line.trim().length > 0) ?? plain
|
|
150
|
-
return JSON.stringify({ error: 'USAGE_ERROR', message: first, detail: plain })
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
function stripOptions(argv: string[]): string[] {
|
|
154
|
-
const out: string[] = []
|
|
155
|
-
for (const token of argv) {
|
|
156
|
-
if (token === '--') break
|
|
157
|
-
if (token.startsWith('-')) continue
|
|
158
|
-
out.push(token)
|
|
159
|
-
}
|
|
160
|
-
return out
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
function nearestCommands(input: string, catalog: CommandCatalogEntry[]): string[] {
|
|
164
|
-
if (!input) return []
|
|
165
|
-
return catalog
|
|
166
|
-
.map((entry) => ({ usage: entry.usage, score: similarity(input, entry.path.join(' ')) }))
|
|
167
|
-
.filter((entry) => entry.score >= 0.45)
|
|
168
|
-
.sort((a, b) => b.score - a.score || a.usage.localeCompare(b.usage))
|
|
169
|
-
.slice(0, 3)
|
|
170
|
-
.map((entry) => entry.usage)
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
function similarity(a: string, b: string): number {
|
|
174
|
-
const max = Math.max(a.length, b.length)
|
|
175
|
-
if (max === 0) return 1
|
|
176
|
-
return 1 - levenshtein(a, b) / max
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
function levenshtein(a: string, b: string): number {
|
|
180
|
-
const prev = Array.from({ length: b.length + 1 }, (_, i) => i)
|
|
181
|
-
const curr = Array.from({ length: b.length + 1 }, () => 0)
|
|
182
|
-
for (let i = 1; i <= a.length; i += 1) {
|
|
183
|
-
curr[0] = i
|
|
184
|
-
for (let j = 1; j <= b.length; j += 1) {
|
|
185
|
-
const cost = a[i - 1] === b[j - 1] ? 0 : 1
|
|
186
|
-
curr[j] = Math.min(curr[j - 1] + 1, prev[j] + 1, prev[j - 1] + cost)
|
|
187
|
-
}
|
|
188
|
-
prev.splice(0, prev.length, ...curr)
|
|
189
|
-
}
|
|
190
|
-
return prev[b.length] ?? 0
|
|
191
|
-
}
|
package/src/lib/concurrency.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Minimal bounded-concurrency map. No external dependency (the repo
|
|
3
|
-
* hand-rolls with `Promise.all`); a tiny worker pool is enough for the
|
|
4
|
-
* `domain dev up` fan-out.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Run `fn` over `items` with at most `limit` in flight at once. Results
|
|
9
|
-
* are returned in input order regardless of completion order. The first
|
|
10
|
-
* rejection rejects the returned promise (in-flight work still settles).
|
|
11
|
-
*/
|
|
12
|
-
export async function mapBounded<T, R>(
|
|
13
|
-
items: readonly T[],
|
|
14
|
-
limit: number,
|
|
15
|
-
fn: (item: T, index: number) => Promise<R>,
|
|
16
|
-
): Promise<R[]> {
|
|
17
|
-
const results: R[] = []
|
|
18
|
-
const bound = Math.max(1, Math.min(limit, items.length))
|
|
19
|
-
let next = 0
|
|
20
|
-
|
|
21
|
-
async function worker(): Promise<void> {
|
|
22
|
-
while (true) {
|
|
23
|
-
const i = next++
|
|
24
|
-
if (i >= items.length) return
|
|
25
|
-
results[i] = await fn(items[i] as T, i)
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
await Promise.all(Array.from({ length: bound }, () => worker()))
|
|
30
|
-
return results
|
|
31
|
-
}
|
package/src/lib/config.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { readFile, writeFile, mkdir } from 'node:fs/promises'
|
|
2
|
-
import { dirname } from 'node:path'
|
|
3
|
-
import { z } from 'zod'
|
|
4
|
-
|
|
5
|
-
import { CONFIG_PATH } from '../state/index'
|
|
6
|
-
import { AdminTargetConfigSchema, DEFAULT_ADMIN_TARGET_CONFIG } from './admin-target'
|
|
7
|
-
import { log } from './log'
|
|
8
|
-
|
|
9
|
-
export const AstraleConfigSchema = z.object({
|
|
10
|
-
issuer: z.string().url().default('https://unregistered.invalid'),
|
|
11
|
-
admin: AdminTargetConfigSchema.default(DEFAULT_ADMIN_TARGET_CONFIG),
|
|
12
|
-
telemetry: z.object({ enabled: z.boolean().default(true) }).default({ enabled: true }),
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
export type AstraleConfig = z.infer<typeof AstraleConfigSchema>
|
|
16
|
-
|
|
17
|
-
export const DEFAULT_CONFIG: AstraleConfig = AstraleConfigSchema.parse({})
|
|
18
|
-
|
|
19
|
-
export async function readConfig(): Promise<AstraleConfig> {
|
|
20
|
-
try {
|
|
21
|
-
const raw = await readFile(CONFIG_PATH, 'utf-8')
|
|
22
|
-
return AstraleConfigSchema.parse(JSON.parse(raw))
|
|
23
|
-
} catch (e) {
|
|
24
|
-
// A present-but-broken config (invalid JSON or failed validation) should
|
|
25
|
-
// surface; a missing file (readFile ENOENT) stays silent — that's the
|
|
26
|
-
// normal first-run case and defaults are expected.
|
|
27
|
-
if (e instanceof z.ZodError || e instanceof SyntaxError) {
|
|
28
|
-
log.warn(`Invalid config at ${CONFIG_PATH} — using defaults`)
|
|
29
|
-
}
|
|
30
|
-
return DEFAULT_CONFIG
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
export async function writeConfig(config: AstraleConfig): Promise<void> {
|
|
35
|
-
await mkdir(dirname(CONFIG_PATH), { recursive: true })
|
|
36
|
-
await writeFile(CONFIG_PATH, JSON.stringify(config, null, 2) + '\n')
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export async function configExists(): Promise<boolean> {
|
|
40
|
-
try {
|
|
41
|
-
await readFile(CONFIG_PATH)
|
|
42
|
-
return true
|
|
43
|
-
} catch {
|
|
44
|
-
return false
|
|
45
|
-
}
|
|
46
|
-
}
|
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
import { publication } from '@astrale-os/sdk/publication'
|
|
2
|
-
|
|
3
|
-
const MAXIMUM_PUBLICATION_BYTES = 1024 * 1024
|
|
4
|
-
type FetchLike = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>
|
|
5
|
-
|
|
6
|
-
/** Fetch and admit one canonical Domain Publication without following its bundle. */
|
|
7
|
-
export async function fetchDomainPublication(
|
|
8
|
-
input: string,
|
|
9
|
-
signal?: AbortSignal,
|
|
10
|
-
fetchImpl: FetchLike = globalThis.fetch,
|
|
11
|
-
): Promise<publication.Publication> {
|
|
12
|
-
const url = domainPublicationUrl(input)
|
|
13
|
-
const response = await fetchImpl(url, {
|
|
14
|
-
redirect: 'error',
|
|
15
|
-
...(signal === undefined ? {} : { signal }),
|
|
16
|
-
})
|
|
17
|
-
if (!response.ok) {
|
|
18
|
-
await cancel(response.body)
|
|
19
|
-
throw new Error(`GET ${url.href} → ${response.status}`)
|
|
20
|
-
}
|
|
21
|
-
const bytes = await readBounded(response, url)
|
|
22
|
-
try {
|
|
23
|
-
const source = new TextDecoder('utf-8', { fatal: true }).decode(bytes)
|
|
24
|
-
return publication.accept(JSON.parse(source) as unknown)
|
|
25
|
-
} catch (cause) {
|
|
26
|
-
throw new Error(`GET ${url.href} returned an invalid Domain Publication`, { cause })
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async function readBounded(response: Response, url: URL): Promise<Uint8Array> {
|
|
31
|
-
const declared = response.headers.get('content-length')
|
|
32
|
-
if (
|
|
33
|
-
declared !== null &&
|
|
34
|
-
(!/^\d+$/u.test(declared) ||
|
|
35
|
-
!Number.isSafeInteger(Number(declared)) ||
|
|
36
|
-
Number(declared) > MAXIMUM_PUBLICATION_BYTES)
|
|
37
|
-
) {
|
|
38
|
-
await cancel(response.body)
|
|
39
|
-
throw sizeError(url)
|
|
40
|
-
}
|
|
41
|
-
if (response.body === null) return new Uint8Array()
|
|
42
|
-
|
|
43
|
-
const reader = response.body.getReader()
|
|
44
|
-
const chunks: Uint8Array[] = []
|
|
45
|
-
let size = 0
|
|
46
|
-
let complete = false
|
|
47
|
-
try {
|
|
48
|
-
for (;;) {
|
|
49
|
-
const next = await reader.read()
|
|
50
|
-
if (next.done) {
|
|
51
|
-
complete = true
|
|
52
|
-
break
|
|
53
|
-
}
|
|
54
|
-
if (next.value.byteLength === 0) continue
|
|
55
|
-
if (next.value.byteLength > MAXIMUM_PUBLICATION_BYTES - size) {
|
|
56
|
-
throw sizeError(url)
|
|
57
|
-
}
|
|
58
|
-
chunks.push(next.value)
|
|
59
|
-
size += next.value.byteLength
|
|
60
|
-
}
|
|
61
|
-
} finally {
|
|
62
|
-
if (!complete) await reader.cancel().catch(() => undefined)
|
|
63
|
-
reader.releaseLock()
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const bytes = new Uint8Array(size)
|
|
67
|
-
let offset = 0
|
|
68
|
-
for (const chunk of chunks) {
|
|
69
|
-
bytes.set(chunk, offset)
|
|
70
|
-
offset += chunk.byteLength
|
|
71
|
-
}
|
|
72
|
-
return bytes
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function sizeError(url: URL): Error {
|
|
76
|
-
return new Error(`GET ${url.href} exceeded ${MAXIMUM_PUBLICATION_BYTES} bytes`)
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
async function cancel(body: ReadableStream<Uint8Array> | null): Promise<void> {
|
|
80
|
-
if (body !== null) await body.cancel().catch(() => undefined)
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/** Canonical discovery document for a Domain origin or exact Publication URL. */
|
|
84
|
-
export function domainPublicationUrl(input: string): URL {
|
|
85
|
-
let url: URL
|
|
86
|
-
try {
|
|
87
|
-
url = new URL(input)
|
|
88
|
-
} catch {
|
|
89
|
-
throw new TypeError(`Domain deployment URL is invalid: ${input}`)
|
|
90
|
-
}
|
|
91
|
-
if (
|
|
92
|
-
!['http:', 'https:'].includes(url.protocol) ||
|
|
93
|
-
url.username !== '' ||
|
|
94
|
-
url.password !== '' ||
|
|
95
|
-
url.search !== '' ||
|
|
96
|
-
url.hash !== '' ||
|
|
97
|
-
!['', '/', publication.PATH].includes(url.pathname)
|
|
98
|
-
) {
|
|
99
|
-
throw new TypeError(
|
|
100
|
-
`Domain deployment URL must be an HTTP(S) origin or canonical Publication URL: ${input}`,
|
|
101
|
-
)
|
|
102
|
-
}
|
|
103
|
-
return new URL(publication.PATH, url.origin)
|
|
104
|
-
}
|
package/src/lib/failure-debug.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk'
|
|
2
|
-
|
|
3
|
-
const MAXIMUM_DEBUG_FAILURES = 32
|
|
4
|
-
|
|
5
|
-
export function printFailureDebug(error: unknown, url: string): void {
|
|
6
|
-
process.stderr.write(`\n${chalk.dim('── debug ─────────────────')}\n`)
|
|
7
|
-
if (url) process.stderr.write(`${chalk.dim(`url: ${url}`)}\n`)
|
|
8
|
-
const seen = new Set<unknown>()
|
|
9
|
-
const pending: Array<{ value: unknown; relation: string }> = [{ value: error, relation: 'error' }]
|
|
10
|
-
while (pending.length > 0 && seen.size < MAXIMUM_DEBUG_FAILURES) {
|
|
11
|
-
const { value, relation } = pending.shift()!
|
|
12
|
-
if (seen.has(value)) continue
|
|
13
|
-
seen.add(value)
|
|
14
|
-
if (!(value instanceof Error)) {
|
|
15
|
-
process.stderr.write(`${chalk.dim(`${relation}: ${String(value)}`)}\n`)
|
|
16
|
-
continue
|
|
17
|
-
}
|
|
18
|
-
process.stderr.write(
|
|
19
|
-
`${chalk.dim(`${relation}: ${value.constructor.name}: ${value.message}`)}\n`,
|
|
20
|
-
)
|
|
21
|
-
if (value.stack) process.stderr.write(`${chalk.dim(value.stack)}\n`)
|
|
22
|
-
if (value.cause !== undefined) pending.push({ value: value.cause, relation: 'caused by' })
|
|
23
|
-
if (value instanceof AggregateError)
|
|
24
|
-
for (const child of value.errors) pending.push({ value: child, relation: 'aggregate' })
|
|
25
|
-
}
|
|
26
|
-
}
|
package/src/lib/format.ts
DELETED
package/src/lib/idp-session.ts
DELETED
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { withFileLock } from '../state/index'
|
|
2
|
-
import {
|
|
3
|
-
accessTokenForAudience,
|
|
4
|
-
classifyRefreshFailure,
|
|
5
|
-
idpSessionPath,
|
|
6
|
-
OAuthTokenError,
|
|
7
|
-
readIdpSession,
|
|
8
|
-
refreshSession,
|
|
9
|
-
type IdpSession,
|
|
10
|
-
} from './idp'
|
|
11
|
-
import { orgIdForAudience } from './instance'
|
|
12
|
-
import { fetchOrgHint } from './meta'
|
|
13
|
-
|
|
14
|
-
/** No cached session file exists for the identity — only a login creates one. */
|
|
15
|
-
export class IdpSessionMissingError extends Error {
|
|
16
|
-
readonly identityName: string
|
|
17
|
-
|
|
18
|
-
constructor(identityName: string) {
|
|
19
|
-
super(`No cached IdP session for "${identityName}"`)
|
|
20
|
-
this.name = 'IdpSessionMissingError'
|
|
21
|
-
this.identityName = identityName
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
/** The session needs a refresh but never received a refresh token. */
|
|
26
|
-
export class IdpSessionNoRefreshTokenError extends Error {
|
|
27
|
-
readonly identityName: string
|
|
28
|
-
|
|
29
|
-
constructor(identityName: string) {
|
|
30
|
-
super(`IdP session for "${identityName}" has no refresh token`)
|
|
31
|
-
this.name = 'IdpSessionNoRefreshTokenError'
|
|
32
|
-
this.identityName = identityName
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export type EnsureFreshSessionOptions = {
|
|
37
|
-
audience?: string
|
|
38
|
-
organizationId?: string
|
|
39
|
-
/**
|
|
40
|
-
* Org-hint resolver, consulted only when a refresh actually happens.
|
|
41
|
-
* Defaults to `fetchOrgHint`; injectable for tests.
|
|
42
|
-
*/
|
|
43
|
-
resolveOrganizationId?: (audience: string) => Promise<string | undefined>
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export function idpSessionLockPath(identityName: string): string {
|
|
47
|
-
// Lives next to the session file; listIdpSessions only picks up *.json.
|
|
48
|
-
return `${idpSessionPath(identityName)}.lock`
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Return a session holding a fresh access token for `audience`, refreshing it
|
|
53
|
-
* if needed. This is the ONLY correct way to refresh: WorkOS refresh tokens
|
|
54
|
-
* are single-use, so two processes refreshing concurrently burn the same
|
|
55
|
-
* token — the loser's `invalid_grant` can revoke the whole upstream session.
|
|
56
|
-
* All refreshes therefore serialize on a per-identity file lock, and waiters
|
|
57
|
-
* re-read the rotated session instead of re-exchanging.
|
|
58
|
-
*
|
|
59
|
-
* `IdpAudienceMismatchError` propagates verbatim (the session is healthy; the
|
|
60
|
-
* IdP just won't mint that audience).
|
|
61
|
-
*/
|
|
62
|
-
export async function ensureFreshSession(
|
|
63
|
-
identityName: string,
|
|
64
|
-
opts: EnsureFreshSessionOptions = {},
|
|
65
|
-
): Promise<IdpSession> {
|
|
66
|
-
const session = await readIdpSession(identityName)
|
|
67
|
-
if (!session) throw new IdpSessionMissingError(identityName)
|
|
68
|
-
if (accessTokenForAudience(session, opts.audience)) return session
|
|
69
|
-
if (!session.refresh_token) throw new IdpSessionNoRefreshTokenError(identityName)
|
|
70
|
-
|
|
71
|
-
return withFileLock(idpSessionLockPath(identityName), async () => {
|
|
72
|
-
// Re-read under the lock: a process that held the lock before us may have
|
|
73
|
-
// already rotated the session — using its result is the whole point.
|
|
74
|
-
const current = await readIdpSession(identityName)
|
|
75
|
-
if (!current) throw new IdpSessionMissingError(identityName)
|
|
76
|
-
if (accessTokenForAudience(current, opts.audience)) return current
|
|
77
|
-
|
|
78
|
-
// Org resolution order: explicit > bookmarked-at-create > router lookup.
|
|
79
|
-
const bookmarkOrg =
|
|
80
|
-
opts.organizationId ?? (opts.audience ? await orgIdForAudience(opts.audience) : undefined)
|
|
81
|
-
const organizationId =
|
|
82
|
-
bookmarkOrg ??
|
|
83
|
-
(opts.audience
|
|
84
|
-
? await (opts.resolveOrganizationId ?? fetchOrgHint)(opts.audience)
|
|
85
|
-
: undefined)
|
|
86
|
-
try {
|
|
87
|
-
return await refreshSession(identityName, current, {
|
|
88
|
-
audience: opts.audience,
|
|
89
|
-
organizationId,
|
|
90
|
-
})
|
|
91
|
-
} catch (e) {
|
|
92
|
-
// A bookmarked org can go stale (instance deleted/recreated elsewhere).
|
|
93
|
-
// On an org rejection, retry once with the router's view and let the
|
|
94
|
-
// bookmark heal on the next `instance create`.
|
|
95
|
-
if (
|
|
96
|
-
bookmarkOrg &&
|
|
97
|
-
!opts.organizationId &&
|
|
98
|
-
opts.audience &&
|
|
99
|
-
classifyRefreshFailure(e) === 'org-rejected'
|
|
100
|
-
) {
|
|
101
|
-
const routerOrg = await (opts.resolveOrganizationId ?? fetchOrgHint)(opts.audience)
|
|
102
|
-
if (routerOrg && routerOrg !== bookmarkOrg) {
|
|
103
|
-
return await refreshSession(identityName, current, {
|
|
104
|
-
audience: opts.audience,
|
|
105
|
-
organizationId: routerOrg,
|
|
106
|
-
})
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
const rescued = await rescueAfterInvalidGrant(identityName, current, opts.audience, e)
|
|
110
|
-
if (rescued) return rescued
|
|
111
|
-
throw e
|
|
112
|
-
}
|
|
113
|
-
})
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* Last-resort race recovery: an `invalid_grant` ("refresh token already
|
|
118
|
-
* exchanged") can mean a non-locking process — an older CLI build, or a
|
|
119
|
-
* stale-lock takeover window — won the exchange and saved the rotated
|
|
120
|
-
* session. If the file changed since we read it and now serves the audience,
|
|
121
|
-
* use it instead of declaring the session dead.
|
|
122
|
-
*/
|
|
123
|
-
async function rescueAfterInvalidGrant(
|
|
124
|
-
identityName: string,
|
|
125
|
-
seen: IdpSession,
|
|
126
|
-
audience: string | undefined,
|
|
127
|
-
error: unknown,
|
|
128
|
-
): Promise<IdpSession | undefined> {
|
|
129
|
-
if (!(error instanceof OAuthTokenError) || error.code !== 'invalid_grant') return undefined
|
|
130
|
-
const latest = await readIdpSession(identityName).catch(() => null)
|
|
131
|
-
if (!latest || latest.updatedAt === seen.updatedAt) return undefined
|
|
132
|
-
if (!accessTokenForAudience(latest, audience)) return undefined
|
|
133
|
-
return latest
|
|
134
|
-
}
|