@astrale-os/cli 1.0.0-beta.32 → 1.0.0-beta.43
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +928 -0
- package/README.md +53 -43
- package/THIRD-PARTY-NOTICES.md +37 -1
- package/dist/astrale.js +349631 -83669
- package/dist/public/connect-core.js +16 -47
- package/dist/public/keys/index.js +1 -1
- package/dist/types/admin/contract.d.ts +11 -0
- package/dist/types/admin/graph/index.d.ts +1 -0
- package/dist/types/admin/graph/nodes.d.ts +12 -0
- package/dist/types/admin/instance/client.d.ts +2 -0
- package/dist/types/connection/lifetime.d.ts +1 -1
- package/dist/types/errors.d.ts +3 -0
- package/dist/types/lib/proc.d.ts +1 -0
- package/dist/types/lib/update.d.ts +15 -7
- package/package.json +8 -6
- package/studio/client/dist/assets/index-5C1uT6ML.css +2 -0
- package/studio/client/dist/assets/index-C4kNlvwF.js +80 -0
- package/studio/client/dist/assets/schema-studio-BR9d0faB.js +8 -0
- package/studio/client/dist/index.html +13 -2
- package/studio/package.json +2 -1
- package/studio/server/agent/ask.test.ts +7 -1
- package/studio/server/agent/bridge/grant.ts +15 -3
- package/studio/server/agent/prompts/system.test.ts +5 -0
- package/studio/server/agent/prompts/system.ts +19 -4
- package/studio/server/agent/routes.test.ts +39 -1
- package/studio/server/agent/routes.ts +3 -0
- package/studio/server/agent/run/coordinator.test.ts +7 -1
- package/studio/server/agent/run/preparation.ts +1 -0
- package/studio/server/agent/run/transcript.test.ts +47 -2
- package/studio/server/agent/run/transcript.ts +32 -3
- package/studio/server/api/documents.test.ts +31 -0
- package/studio/server/api/documents.ts +35 -1
- package/studio/server/api-agent-loadout.test.ts +7 -1
- package/studio/server/api.test.ts +7 -1
- package/studio/server/cache.ts +4 -4
- package/studio/server/detect.ts +9 -12
- package/studio/server/domain.test.ts +83 -3
- package/studio/server/domain.ts +205 -27
- package/studio/server/handoff/service.ts +1 -1
- package/studio/server/index.ts +5 -8
- package/studio/server/introspect/extractor.ts +111 -17
- package/studio/server/introspect/overlay-tsmorph.test.ts +9 -9
- package/studio/server/introspect/overlay.ts +1 -1
- package/studio/server/introspect/runtime.ts +9 -1
- package/studio/server/introspect/source-overlay/spans.ts +2 -5
- package/studio/server/lifecycle.ts +1 -1
- package/studio/server/state/baseline.test.ts +14 -0
- package/studio/server/state/baseline.ts +16 -2
- package/studio/server/watch.test.ts +2 -1
- package/studio/server/watch.ts +5 -2
- package/studio/server/workspace/create.ts +9 -8
- package/studio/server/workspace-state.ts +4 -6
- package/studio/server/workspace-watch.ts +33 -22
- package/studio/shared/contracts/agent.ts +3 -0
- package/viewer/dist/main.js +12 -12
- package/src/__tests__/fixtures/publication.ts +0 -20
- package/src/admin/.spec/api.d.ts +0 -3
- package/src/admin/.spec/architecture.md +0 -22
- package/src/admin/.spec/icon.svg +0 -3
- package/src/admin/.spec/layout.ts +0 -6
- package/src/admin/__tests__/fixture.ts +0 -25
- package/src/admin/catalog/.spec/api.d.ts +0 -63
- package/src/admin/catalog/.spec/architecture.md +0 -7
- package/src/admin/catalog/.spec/icon.svg +0 -3
- package/src/admin/catalog/.spec/layout.ts +0 -6
- package/src/admin/catalog/__tests__/client.test.ts +0 -245
- package/src/admin/catalog/client.ts +0 -195
- package/src/admin/catalog/index.ts +0 -13
- package/src/admin/catalog/model.ts +0 -41
- package/src/admin/catalog/tsconfig.json +0 -8
- package/src/admin/contract.ts +0 -47
- package/src/admin/graph/.spec/api.d.ts +0 -22
- package/src/admin/graph/.spec/architecture.md +0 -5
- package/src/admin/graph/.spec/icon.svg +0 -3
- package/src/admin/graph/.spec/layout.ts +0 -3
- package/src/admin/graph/index.ts +0 -6
- package/src/admin/graph/nodes.ts +0 -56
- package/src/admin/index.ts +0 -2
- package/src/admin/instance/.spec/api.d.ts +0 -62
- package/src/admin/instance/.spec/architecture.md +0 -10
- package/src/admin/instance/.spec/icon.svg +0 -3
- package/src/admin/instance/.spec/layout.ts +0 -6
- package/src/admin/instance/__tests__/client.test.ts +0 -273
- package/src/admin/instance/client.ts +0 -191
- package/src/admin/instance/index.ts +0 -15
- package/src/admin/instance/model.ts +0 -59
- package/src/admin/instance/tsconfig.json +0 -8
- package/src/commands/__tests__/admin-instance.test.ts +0 -91
- package/src/commands/__tests__/auth-login.test.ts +0 -231
- package/src/commands/__tests__/auth-token.test.ts +0 -223
- package/src/commands/__tests__/call-describe.test.ts +0 -80
- package/src/commands/__tests__/call.test.ts +0 -63
- package/src/commands/__tests__/domain-install-operation.test.ts +0 -145
- package/src/commands/__tests__/domain-install-owned.test.ts +0 -191
- package/src/commands/__tests__/domain-list.test.ts +0 -133
- package/src/commands/__tests__/domain-uninstall.test.ts +0 -53
- package/src/commands/__tests__/install-direct.test.ts +0 -128
- package/src/commands/__tests__/install-identity-override.test.ts +0 -76
- package/src/commands/__tests__/instance-bookmark.test.ts +0 -166
- package/src/commands/__tests__/instance-list-admin.test.ts +0 -26
- package/src/commands/__tests__/instance-list-rows.test.ts +0 -64
- package/src/commands/__tests__/instance-status.test.ts +0 -139
- package/src/commands/__tests__/instance-use.test.ts +0 -67
- package/src/commands/__tests__/introspect-parse.test.ts +0 -100
- package/src/commands/__tests__/logs.test.ts +0 -345
- package/src/commands/__tests__/read-commands.test.ts +0 -377
- package/src/commands/__tests__/setup-plan.test.ts +0 -61
- package/src/commands/__tests__/studio-descriptor.test.ts +0 -22
- package/src/commands/__tests__/token-ttl.test.ts +0 -66
- package/src/commands/__tests__/update.test.ts +0 -95
- package/src/commands/__tests__/view-build.test.ts +0 -58
- package/src/commands/__tests__/view.test.ts +0 -197
- package/src/commands/admin/status.ts +0 -61
- package/src/commands/admin/use.ts +0 -100
- package/src/commands/auth/login.ts +0 -82
- package/src/commands/auth/logout.ts +0 -53
- package/src/commands/auth/status.ts +0 -86
- package/src/commands/auth/token.ts +0 -174
- package/src/commands/browser.ts +0 -236
- package/src/commands/call-describe.ts +0 -123
- package/src/commands/call.ts +0 -230
- package/src/commands/domain/install.ts +0 -575
- package/src/commands/domain/list.ts +0 -155
- package/src/commands/domain/publish.ts +0 -136
- package/src/commands/domain/uninstall.ts +0 -128
- package/src/commands/get.ts +0 -69
- package/src/commands/identity/__tests__/register.test.ts +0 -93
- package/src/commands/identity/create.ts +0 -35
- package/src/commands/identity/delete.ts +0 -24
- package/src/commands/identity/export.ts +0 -46
- package/src/commands/identity/import.ts +0 -61
- package/src/commands/identity/list.ts +0 -56
- package/src/commands/identity/register.ts +0 -195
- package/src/commands/identity/sync.ts +0 -38
- package/src/commands/identity/unsync.ts +0 -34
- package/src/commands/identity/use.ts +0 -24
- package/src/commands/identity/whoami.ts +0 -34
- package/src/commands/idp/add.ts +0 -150
- package/src/commands/idp/list.ts +0 -57
- package/src/commands/idp/refresh.ts +0 -38
- package/src/commands/idp/remove.ts +0 -36
- package/src/commands/idp/show.ts +0 -29
- package/src/commands/instance/active.ts +0 -73
- package/src/commands/instance/bookmark.ts +0 -101
- package/src/commands/instance/create.ts +0 -61
- package/src/commands/instance/delete.ts +0 -69
- package/src/commands/instance/forget.ts +0 -26
- package/src/commands/instance/list.ts +0 -197
- package/src/commands/instance/status.ts +0 -92
- package/src/commands/instance/use.ts +0 -263
- package/src/commands/introspect.ts +0 -129
- package/src/commands/logs.ts +0 -371
- package/src/commands/mutate.ts +0 -122
- package/src/commands/query.ts +0 -142
- package/src/commands/session/analyze.ts +0 -72
- package/src/commands/session/list.ts +0 -36
- package/src/commands/setup.ts +0 -54
- package/src/commands/status.ts +0 -60
- package/src/commands/studio.ts +0 -434
- package/src/commands/token.ts +0 -121
- package/src/commands/ui/__tests__/commands.test.ts +0 -152
- package/src/commands/ui/add.ts +0 -51
- package/src/commands/ui/doctor.ts +0 -21
- package/src/commands/ui/init.ts +0 -38
- package/src/commands/ui/list.ts +0 -26
- package/src/commands/ui/preset-apply.ts +0 -19
- package/src/commands/ui/preset-list.ts +0 -12
- package/src/commands/ui/shared.ts +0 -25
- package/src/commands/update.ts +0 -356
- package/src/commands/use.ts +0 -86
- package/src/commands/view-serve.ts +0 -26
- package/src/commands/view.ts +0 -658
- package/src/connect-core.test.ts +0 -38
- package/src/connect-core.ts +0 -42
- package/src/connection/.spec/api.d.ts +0 -110
- package/src/connection/.spec/architecture.md +0 -58
- package/src/connection/.spec/capabilities/connection.ts +0 -13
- package/src/connection/.spec/examples/call.ts +0 -7
- package/src/connection/.spec/flows/command.ts +0 -20
- package/src/connection/.spec/flows/session.ts +0 -62
- package/src/connection/.spec/laws/connection.ts +0 -213
- package/src/connection/.spec/layout.ts +0 -22
- package/src/connection/__tests__/auth.test.ts +0 -129
- package/src/connection/__tests__/ca-fetch.test.ts +0 -60
- package/src/connection/__tests__/call.test.ts +0 -17
- package/src/connection/__tests__/credential.test.ts +0 -254
- package/src/connection/__tests__/errors.test.ts +0 -577
- package/src/connection/__tests__/exchange.test.ts +0 -404
- package/src/connection/__tests__/failure-fixtures.ts +0 -39
- package/src/connection/__tests__/failure-safety.test.ts +0 -75
- package/src/connection/__tests__/fixtures/localhost-cert.pem +0 -19
- package/src/connection/__tests__/fixtures/localhost-key.base64 +0 -1
- package/src/connection/__tests__/managed.test.ts +0 -39
- package/src/connection/__tests__/reasons.test.ts +0 -78
- package/src/connection/__tests__/self.test.ts +0 -71
- package/src/connection/__tests__/session.test.ts +0 -144
- package/src/connection/__tests__/target.test.ts +0 -95
- package/src/connection/auth.ts +0 -265
- package/src/connection/call.ts +0 -7
- package/src/connection/command.ts +0 -67
- package/src/connection/credential.ts +0 -138
- package/src/connection/errors.ts +0 -1
- package/src/connection/exchange.ts +0 -394
- package/src/connection/failure/classify.ts +0 -110
- package/src/connection/failure/index.ts +0 -18
- package/src/connection/failure/model.ts +0 -28
- package/src/connection/failure/render.ts +0 -116
- package/src/connection/index.ts +0 -8
- package/src/connection/lifetime.ts +0 -25
- package/src/connection/reasons.ts +0 -209
- package/src/connection/self.ts +0 -138
- package/src/connection/session.ts +0 -203
- package/src/connection/target.ts +0 -112
- package/src/connection/tsconfig.json +0 -6
- package/src/errors.ts +0 -66
- package/src/graph/.spec/api.d.ts +0 -41
- package/src/graph/.spec/laws/documents.ts +0 -24
- package/src/graph/.spec/laws/projection.ts +0 -13
- package/src/graph/.spec/layout.ts +0 -14
- package/src/graph/__tests__/mutation.test.ts +0 -51
- package/src/graph/__tests__/projection.test.ts +0 -22
- package/src/graph/__tests__/query.test.ts +0 -180
- package/src/graph/class.ts +0 -30
- package/src/graph/index.ts +0 -4
- package/src/graph/mutation.ts +0 -46
- package/src/graph/projection.ts +0 -21
- package/src/graph/query.ts +0 -95
- package/src/graph/tsconfig.json +0 -6
- package/src/identity/.history/ard/bootstrap-root-transfer.md +0 -57
- package/src/identity/.history/ard/domain-mediated-registration.md +0 -36
- package/src/identity/.spec/api.d.ts +0 -124
- package/src/identity/.spec/architecture.md +0 -33
- package/src/identity/.spec/capabilities/identity.ts +0 -7
- package/src/identity/.spec/flows/bootstrap-root.ts +0 -79
- package/src/identity/.spec/flows/domain-mediated-registration.ts +0 -51
- package/src/identity/.spec/flows/import.ts +0 -29
- package/src/identity/.spec/laws/identity.ts +0 -56
- package/src/identity/.spec/layout.ts +0 -13
- package/src/identity/__tests__/fixtures/registry-journey.ts +0 -65
- package/src/identity/__tests__/registration.test.ts +0 -64
- package/src/identity/__tests__/registry.test.ts +0 -74
- package/src/identity/__tests__/transfer.test.ts +0 -198
- package/src/identity/index.ts +0 -23
- package/src/identity/registration.ts +0 -72
- package/src/identity/registry.ts +0 -181
- package/src/identity/transfer.ts +0 -187
- package/src/identity/tsconfig.json +0 -6
- package/src/index.ts +0 -1
- package/src/keys/.spec/api.d.ts +0 -74
- package/src/keys/.spec/architecture.md +0 -13
- package/src/keys/.spec/laws/keys.ts +0 -43
- package/src/keys/.spec/layout.ts +0 -6
- package/src/keys/__tests__/algorithm.test.ts +0 -39
- package/src/keys/__tests__/keys.test.ts +0 -172
- package/src/keys/algorithm.ts +0 -33
- package/src/keys/credential.ts +0 -113
- package/src/keys/index.ts +0 -14
- package/src/keys/pair.ts +0 -219
- package/src/keys/tsconfig.json +0 -6
- package/src/lib/__tests__/admin-target.test.ts +0 -184
- package/src/lib/__tests__/binary.test.ts +0 -70
- package/src/lib/__tests__/browser-retention.test.ts +0 -212
- package/src/lib/__tests__/command-dx.test.ts +0 -102
- package/src/lib/__tests__/concurrency.test.ts +0 -62
- package/src/lib/__tests__/config.test.ts +0 -81
- package/src/lib/__tests__/design.test.ts +0 -99
- package/src/lib/__tests__/domain-publication.test.ts +0 -138
- package/src/lib/__tests__/format.test.ts +0 -22
- package/src/lib/__tests__/idp-session.driver.ts +0 -60
- package/src/lib/__tests__/idp-session.test.ts +0 -404
- package/src/lib/__tests__/idp.test.ts +0 -415
- package/src/lib/__tests__/instance-candidates.test.ts +0 -146
- package/src/lib/__tests__/instance-target.test.ts +0 -213
- package/src/lib/__tests__/instance.test.ts +0 -192
- package/src/lib/__tests__/local-status.test.ts +0 -202
- package/src/lib/__tests__/log-errors.test.ts +0 -64
- package/src/lib/__tests__/log.test.ts +0 -31
- package/src/lib/__tests__/meta.test.ts +0 -55
- package/src/lib/__tests__/output.test.ts +0 -162
- package/src/lib/__tests__/panel.test.ts +0 -40
- package/src/lib/__tests__/port.test.ts +0 -44
- package/src/lib/__tests__/prompt.test.ts +0 -25
- package/src/lib/__tests__/sdk-deps.test.ts +0 -68
- package/src/lib/__tests__/self.test.ts +0 -50
- package/src/lib/__tests__/skills.test.ts +0 -834
- package/src/lib/__tests__/studio-server-deps.test.ts +0 -111
- package/src/lib/__tests__/table.test.ts +0 -53
- package/src/lib/__tests__/update.test.ts +0 -511
- package/src/lib/__tests__/use-target.test.ts +0 -56
- package/src/lib/__tests__/validation.test.ts +0 -34
- package/src/lib/__tests__/view-assets.test.ts +0 -171
- package/src/lib/__tests__/view-external-open-intent.test.ts +0 -150
- package/src/lib/__tests__/view-external-open-origins.test.ts +0 -27
- package/src/lib/__tests__/view-open-intent.test.ts +0 -280
- package/src/lib/__tests__/view-port-allocation.test.ts +0 -82
- package/src/lib/__tests__/view-server.test.ts +0 -91
- package/src/lib/__tests__/view-session.test.ts +0 -100
- package/src/lib/__tests__/view-snapshot.test.ts +0 -77
- package/src/lib/admin-domain.ts +0 -43
- package/src/lib/admin-instance.ts +0 -56
- package/src/lib/admin-target.ts +0 -290
- package/src/lib/binary.ts +0 -127
- package/src/lib/browser-retention.ts +0 -210
- package/src/lib/browser.ts +0 -150
- package/src/lib/ca-fetch.ts +0 -133
- package/src/lib/command-dx.ts +0 -191
- package/src/lib/concurrency.ts +0 -31
- package/src/lib/config.ts +0 -57
- package/src/lib/credential-lifetime.ts +0 -24
- package/src/lib/domain-publication.ts +0 -104
- package/src/lib/failure-debug.ts +0 -26
- package/src/lib/format.ts +0 -4
- package/src/lib/idp-session.ts +0 -156
- package/src/lib/idp.ts +0 -926
- package/src/lib/instance-candidates.ts +0 -49
- package/src/lib/instance-target.ts +0 -197
- package/src/lib/instance.ts +0 -468
- package/src/lib/invocation.ts +0 -11
- package/src/lib/local-status.ts +0 -152
- package/src/lib/log.ts +0 -143
- package/src/lib/login-flow.ts +0 -201
- package/src/lib/meta.ts +0 -90
- package/src/lib/output.ts +0 -238
- package/src/lib/panel.ts +0 -61
- package/src/lib/port.ts +0 -41
- package/src/lib/proc.ts +0 -87
- package/src/lib/prompt.ts +0 -136
- package/src/lib/provision-instance.ts +0 -139
- package/src/lib/sdk-deps.ts +0 -104
- package/src/lib/self.ts +0 -22
- package/src/lib/skills/lock.ts +0 -117
- package/src/lib/skills/sync.ts +0 -878
- package/src/lib/skills.ts +0 -120
- package/src/lib/table.ts +0 -62
- package/src/lib/update.ts +0 -568
- package/src/lib/use-target.ts +0 -24
- package/src/lib/validation.ts +0 -59
- package/src/lib/view/assets.ts +0 -87
- package/src/lib/view/external-open-intent.ts +0 -41
- package/src/lib/view/external-open-origins.ts +0 -37
- package/src/lib/view/host-capabilities.ts +0 -17
- package/src/lib/view/open-intent.ts +0 -67
- package/src/lib/view/port-allocation.ts +0 -19
- package/src/lib/view/resolve.ts +0 -111
- package/src/lib/view/server.ts +0 -259
- package/src/lib/view/session.ts +0 -154
- package/src/lib/view/snapshot.ts +0 -101
- package/src/paths/.spec/api.d.ts +0 -13
- package/src/paths/.spec/architecture.md +0 -5
- package/src/paths/.spec/layout.ts +0 -3
- package/src/paths/index.ts +0 -13
- package/src/program/.spec/api.d.ts +0 -43
- package/src/program/.spec/architecture.md +0 -18
- package/src/program/.spec/laws/program.ts +0 -29
- package/src/program/.spec/layout.ts +0 -14
- package/src/program/__tests__/program.test.ts +0 -556
- package/src/program/argv.ts +0 -14
- package/src/program/build.ts +0 -205
- package/src/program/command.ts +0 -43
- package/src/program/index.ts +0 -3
- package/src/program/options.ts +0 -41
- package/src/program/registry.ts +0 -64
- package/src/program/tsconfig.json +0 -6
- package/src/setup/__tests__/instance-step.test.ts +0 -256
- package/src/setup/__tests__/util.test.ts +0 -29
- package/src/setup/engine.ts +0 -83
- package/src/setup/render.ts +0 -107
- package/src/setup/steps/admin.ts +0 -93
- package/src/setup/steps/agent-browser.ts +0 -81
- package/src/setup/steps/auth.ts +0 -54
- package/src/setup/steps/domain.ts +0 -68
- package/src/setup/steps/index.ts +0 -18
- package/src/setup/steps/instance.ts +0 -206
- package/src/setup/steps/skills-bridge.ts +0 -70
- package/src/setup/steps/skills.ts +0 -61
- package/src/setup/types.ts +0 -61
- package/src/setup/util.ts +0 -34
- package/src/state/.spec/api.d.ts +0 -152
- package/src/state/.spec/architecture.md +0 -45
- package/src/state/.spec/capabilities/state.ts +0 -7
- package/src/state/.spec/flows/identity-update.ts +0 -22
- package/src/state/.spec/laws/state.ts +0 -73
- package/src/state/.spec/layout.ts +0 -15
- package/src/state/__tests__/exchange-credentials.test.ts +0 -341
- package/src/state/__tests__/files.test.ts +0 -136
- package/src/state/__tests__/fixtures/identity-transition.ts +0 -37
- package/src/state/__tests__/fixtures/session-route-process.ts +0 -93
- package/src/state/__tests__/identities.test.ts +0 -142
- package/src/state/__tests__/paths.test.ts +0 -28
- package/src/state/__tests__/session-routes.test.ts +0 -138
- package/src/state/exchange-credentials.ts +0 -250
- package/src/state/files.ts +0 -170
- package/src/state/identities.ts +0 -229
- package/src/state/index.ts +0 -31
- package/src/state/paths.ts +0 -64
- package/src/state/session-routes.ts +0 -34
- package/src/state/tsconfig.json +0 -6
- package/src/telemetry/__tests__/analyze-log.test.ts +0 -38
- package/src/telemetry/__tests__/gate.test.ts +0 -63
- package/src/telemetry/__tests__/recorder.test.ts +0 -111
- package/src/telemetry/__tests__/redact.test.ts +0 -79
- package/src/telemetry/__tests__/retention.test.ts +0 -267
- package/src/telemetry/__tests__/session.test.ts +0 -166
- package/src/telemetry/__tests__/settings.test.ts +0 -102
- package/src/telemetry/__tests__/store-scan.test.ts +0 -128
- package/src/telemetry/__tests__/trigger.test.ts +0 -78
- package/src/telemetry/adapters/__tests__/claude-code.test.ts +0 -89
- package/src/telemetry/adapters/__tests__/codex.test.ts +0 -138
- package/src/telemetry/adapters/__tests__/index.test.ts +0 -88
- package/src/telemetry/adapters/claude-code.ts +0 -90
- package/src/telemetry/adapters/codex.ts +0 -160
- package/src/telemetry/adapters/index.ts +0 -45
- package/src/telemetry/adapters/types.ts +0 -21
- package/src/telemetry/analyze.ts +0 -249
- package/src/telemetry/gate.ts +0 -79
- package/src/telemetry/recorder.ts +0 -68
- package/src/telemetry/redact.ts +0 -53
- package/src/telemetry/retention.ts +0 -176
- package/src/telemetry/session.ts +0 -94
- package/src/telemetry/settings.ts +0 -79
- package/src/telemetry/store.ts +0 -174
- package/src/telemetry/trigger.ts +0 -107
- package/src/telemetry/types.ts +0 -64
- package/src/test-utils.ts +0 -18
- package/src/ui/.spec/api.d.ts +0 -14
- package/src/ui/.spec/architecture.md +0 -14
- package/src/ui/.spec/laws.ts +0 -50
- package/src/ui/.spec/layout.ts +0 -16
- package/src/ui/__tests__/ui.test.ts +0 -1742
- package/src/ui/index.ts +0 -13
- package/src/ui/lock.ts +0 -89
- package/src/ui/model.ts +0 -83
- package/src/ui/operations.ts +0 -1044
- package/src/ui/project.ts +0 -333
- package/src/ui/release.ts +0 -398
- package/src/ui/runner.ts +0 -18
- package/studio/client/dist/assets/index-BFVFs_8x.js +0 -81
- package/studio/client/dist/assets/index-DuB9iUdu.css +0 -2
- package/studio/client/dist/assets/schema-studio-DH6oEWME.js +0 -8
- package/studio/tsconfig.json +0 -24
- package/viewer/tsconfig.json +0 -13
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk'
|
|
2
|
-
|
|
3
|
-
import type { OperationRecovery } from '../command'
|
|
4
|
-
import type { FailureDiagnostic } from './model'
|
|
5
|
-
|
|
6
|
-
import { log } from '../../lib/log'
|
|
7
|
-
import {
|
|
8
|
-
functionInputIssues,
|
|
9
|
-
queryInputRepair,
|
|
10
|
-
reasonCode,
|
|
11
|
-
schemaDataRemovalHint,
|
|
12
|
-
schemaUpgradeDetails,
|
|
13
|
-
schemaUpgradeHint,
|
|
14
|
-
} from '../reasons'
|
|
15
|
-
|
|
16
|
-
export function renderFailure(
|
|
17
|
-
failure: FailureDiagnostic,
|
|
18
|
-
machine: boolean,
|
|
19
|
-
url: string,
|
|
20
|
-
recovery: OperationRecovery | undefined,
|
|
21
|
-
): void {
|
|
22
|
-
if (failure.kind === 'transport') return renderTransport(failure, machine, url, recovery)
|
|
23
|
-
if (failure.kind === 'response') return renderResponse(failure, machine)
|
|
24
|
-
if (machine)
|
|
25
|
-
return writeRaw({ error: failure.code, message: failure.message, hint: failure.hint })
|
|
26
|
-
log.error(`${chalk.bold(failure.code)}: ${failure.message}`)
|
|
27
|
-
if (failure.hint) log.dim(` ${failure.hint}`)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function renderTransport(
|
|
31
|
-
failure: Extract<FailureDiagnostic, { kind: 'transport' }>,
|
|
32
|
-
machine: boolean,
|
|
33
|
-
url: string,
|
|
34
|
-
recovery: OperationRecovery | undefined,
|
|
35
|
-
): void {
|
|
36
|
-
const invocation = failure.context.kind === 'invocation' ? failure.context : undefined
|
|
37
|
-
if (machine) {
|
|
38
|
-
writeRaw({
|
|
39
|
-
error: failure.code,
|
|
40
|
-
message: failure.message,
|
|
41
|
-
phase: failure.phase,
|
|
42
|
-
transport: failure.context,
|
|
43
|
-
...(url === '' ? {} : { url }),
|
|
44
|
-
...(invocation?.delivery === 'unknown' && recovery !== undefined ? recovery : {}),
|
|
45
|
-
})
|
|
46
|
-
return
|
|
47
|
-
}
|
|
48
|
-
log.error(`${chalk.bold(failure.code)}: ${failure.message}`)
|
|
49
|
-
if (url) log.dim(` target: ${url}`)
|
|
50
|
-
log.dim(` phase: ${failure.phase}`)
|
|
51
|
-
if (failure.phase === 'connect') log.dim(' Check the target and run `astrale status`.')
|
|
52
|
-
else if (failure.phase === 'timeout') log.dim(' Try increasing `--timeout`.')
|
|
53
|
-
else if (invocation?.delivery === 'unknown') renderRecovery(recovery)
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
function renderResponse(
|
|
57
|
-
failure: Extract<FailureDiagnostic, { kind: 'response' }>,
|
|
58
|
-
machine: boolean,
|
|
59
|
-
): void {
|
|
60
|
-
const code = reasonCode(failure.reason)
|
|
61
|
-
const issues = functionInputIssues(failure.reason)
|
|
62
|
-
const removalHint = schemaDataRemovalHint(failure.reason)
|
|
63
|
-
const addressNotPublic = code === 'SCHEMA_DOMAIN_ADDRESS_NOT_PUBLIC'
|
|
64
|
-
const upgrade = schemaUpgradeDetails(failure.reason)
|
|
65
|
-
const message = addressNotPublic
|
|
66
|
-
? 'Expose the Domain through a public HTTPS URL or public tunnel, then retry.'
|
|
67
|
-
: removalHint && !machine
|
|
68
|
-
? 'Existing business data still uses schema definitions being removed.'
|
|
69
|
-
: failure.message
|
|
70
|
-
const hint =
|
|
71
|
-
code === 'FUNCTION_INPUT_INVALID' && (machine || issues.length === 0)
|
|
72
|
-
? 'Use `astrale introspect <path>` to see the callable input.'
|
|
73
|
-
: (removalHint ?? (upgrade ? schemaUpgradeHint(upgrade) : undefined))
|
|
74
|
-
if (machine) {
|
|
75
|
-
writeRaw({
|
|
76
|
-
error: 'RESPONSE_ERROR',
|
|
77
|
-
code: failure.code,
|
|
78
|
-
message,
|
|
79
|
-
...(failure.reason === undefined ? {} : { reason: failure.reason }),
|
|
80
|
-
...(hint === undefined ? {} : { hint }),
|
|
81
|
-
})
|
|
82
|
-
return
|
|
83
|
-
}
|
|
84
|
-
const label = addressNotPublic
|
|
85
|
-
? 'SCHEMA_DOMAIN_ADDRESS_NOT_PUBLIC'
|
|
86
|
-
: removalHint
|
|
87
|
-
? 'DATA_MIGRATION_REQUIRED'
|
|
88
|
-
: `RESPONSE_ERROR(${failure.code})`
|
|
89
|
-
log.error(`${chalk.bold(label)}: ${message}`)
|
|
90
|
-
if (code && !addressNotPublic && !removalHint) log.dim(` reason: ${code}`)
|
|
91
|
-
for (const issue of issues)
|
|
92
|
-
console.log(
|
|
93
|
-
chalk.red(` ${issue.path || '<input>'}: ${issue.message} (${chalk.dim(issue.code)})`),
|
|
94
|
-
)
|
|
95
|
-
const repair = queryInputRepair(failure.reason)
|
|
96
|
-
if (repair?.phase === 'plan') log.dim(` ${repair.path ?? '/'} ${repair.issue}`)
|
|
97
|
-
else if (repair?.phase === 'limit')
|
|
98
|
-
log.dim(` ${repair.path ?? '/'} ${repair.limit} limit ${repair.actual}/${repair.maximum}`)
|
|
99
|
-
else if (repair) log.dim(` ${repair.path} ${repair.phase} input`)
|
|
100
|
-
if (upgrade?.issue === 'issuer-changed') {
|
|
101
|
-
log.dim(` installed issuer: ${upgrade.installedIssuer}`)
|
|
102
|
-
log.dim(` replacement issuer: ${upgrade.replacementIssuer}`)
|
|
103
|
-
}
|
|
104
|
-
if (hint) log.dim(` ${hint}`)
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
function renderRecovery(recovery: OperationRecovery | undefined): void {
|
|
108
|
-
if (!recovery)
|
|
109
|
-
return log.dim(' Delivery is unknown; do not automatically retry a mutating call.')
|
|
110
|
-
log.dim(' Delivery is unknown; retry with the same operation id:')
|
|
111
|
-
log.dim(` operation: ${recovery.operation}`)
|
|
112
|
-
log.dim(` ${recovery.retry}`)
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
const writeRaw = (payload: Record<string, unknown>): void =>
|
|
116
|
-
void process.stderr.write(`${JSON.stringify(payload)}\n`)
|
package/src/connection/index.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export { createPathCall } from './call'
|
|
2
|
-
export { runKernelCommand } from './command'
|
|
3
|
-
export type { KernelCommandOpts, OperationRecovery } from './command'
|
|
4
|
-
export { expandSelfInCall, expandSelfInPath, withSelfHint } from './self'
|
|
5
|
-
export type { SelfExpansionMeta } from './self'
|
|
6
|
-
export { withAdminClientSession, withClientSession, type ConnectionContext } from './session'
|
|
7
|
-
export { registrationKeyForTarget } from './target'
|
|
8
|
-
export type { AdminConnectionOptions, ConnectionOptions, ConnectionTarget } from './target'
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
const MINIMUM_CREDENTIAL_TTL_SECONDS = 60
|
|
2
|
-
const INVOCATION_RECEIPT_MARGIN_SECONDS = 5
|
|
3
|
-
const CACHE_HANDOFF_MARGIN_SECONDS = 5
|
|
4
|
-
const TOKEN_EXCHANGE_SETTLEMENT_MARGIN_SECONDS = 15
|
|
5
|
-
|
|
6
|
-
/** Cover the complete command deadline while preserving the existing short-command floor. */
|
|
7
|
-
export function invocationCredentialTtlSeconds(timeoutMs: number): number {
|
|
8
|
-
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1) {
|
|
9
|
-
throw new TypeError('Invocation credential timeout must be a positive safe integer.')
|
|
10
|
-
}
|
|
11
|
-
return Math.max(
|
|
12
|
-
MINIMUM_CREDENTIAL_TTL_SECONDS,
|
|
13
|
-
Math.ceil(timeoutMs / 1_000) + INVOCATION_RECEIPT_MARGIN_SECONDS,
|
|
14
|
-
)
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/** Leave the final carrier lifetime intact after source delegation and issuer exchange settle. */
|
|
18
|
-
export function exchangeCredentialTtlSeconds(timeoutMs: number): number {
|
|
19
|
-
return invocationCredentialTtlSeconds(timeoutMs) + TOKEN_EXCHANGE_SETTLEMENT_MARGIN_SECONDS
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/** Refresh a cached token before the final Session carrier can cross a second boundary. */
|
|
23
|
-
export function cachedCredentialTtlSeconds(timeoutMs: number): number {
|
|
24
|
-
return invocationCredentialTtlSeconds(timeoutMs) + CACHE_HANDOFF_MARGIN_SECONDS
|
|
25
|
-
}
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
export type FunctionInputIssue = Readonly<{
|
|
2
|
-
code: string
|
|
3
|
-
path?: string
|
|
4
|
-
message: string
|
|
5
|
-
}>
|
|
6
|
-
|
|
7
|
-
export type QueryInputRepair =
|
|
8
|
-
| Readonly<{ phase: 'decode' | 'input'; path: string }>
|
|
9
|
-
| Readonly<{ phase: 'plan'; issue: string; path?: string }>
|
|
10
|
-
| Readonly<{
|
|
11
|
-
phase: 'limit'
|
|
12
|
-
limit: string
|
|
13
|
-
maximum: number
|
|
14
|
-
actual: number
|
|
15
|
-
path?: string
|
|
16
|
-
}>
|
|
17
|
-
|
|
18
|
-
export type SchemaUpgradeDetails =
|
|
19
|
-
| {
|
|
20
|
-
readonly origin?: string
|
|
21
|
-
readonly issue?: undefined
|
|
22
|
-
}
|
|
23
|
-
| {
|
|
24
|
-
readonly origin: string
|
|
25
|
-
readonly issue: 'issuer-changed'
|
|
26
|
-
readonly installedIssuer: string
|
|
27
|
-
readonly replacementIssuer: string
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const JSON_POINTER = /^(?:\/(?:[^~/]|~[01])*)*$/u
|
|
31
|
-
const MAXIMUM_FUNCTION_ISSUES = 32
|
|
32
|
-
const MAXIMUM_FUNCTION_ISSUE_MESSAGE_LENGTH = 512
|
|
33
|
-
|
|
34
|
-
export function reasonCode(reason: unknown): string | undefined {
|
|
35
|
-
if (!record(reason) || typeof reason.code !== 'string') return undefined
|
|
36
|
-
return stableCode(reason.code) ? reason.code : undefined
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/** Admit only bounded caller-safe Function input issues established by the Kernel. */
|
|
40
|
-
export function functionInputIssues(reason: unknown): readonly FunctionInputIssue[] {
|
|
41
|
-
if (!reasonWithCode(reason, 'FUNCTION_INPUT_INVALID')) return Object.freeze([])
|
|
42
|
-
const issues = reason.details.issues
|
|
43
|
-
if (!Array.isArray(issues)) return Object.freeze([])
|
|
44
|
-
return Object.freeze(
|
|
45
|
-
issues.slice(0, MAXIMUM_FUNCTION_ISSUES).flatMap((candidate): FunctionInputIssue[] => {
|
|
46
|
-
if (
|
|
47
|
-
!record(candidate) ||
|
|
48
|
-
typeof candidate.code !== 'string' ||
|
|
49
|
-
!stableCode(candidate.code) ||
|
|
50
|
-
typeof candidate.message !== 'string' ||
|
|
51
|
-
candidate.message.length === 0 ||
|
|
52
|
-
candidate.message.length > MAXIMUM_FUNCTION_ISSUE_MESSAGE_LENGTH ||
|
|
53
|
-
candidate.message.normalize('NFC') !== candidate.message ||
|
|
54
|
-
containsControl(candidate.message) ||
|
|
55
|
-
(candidate.path !== undefined && !coordinate(candidate.path))
|
|
56
|
-
) {
|
|
57
|
-
return []
|
|
58
|
-
}
|
|
59
|
-
return [
|
|
60
|
-
Object.freeze({
|
|
61
|
-
code: candidate.code,
|
|
62
|
-
...(candidate.path === undefined ? {} : { path: candidate.path }),
|
|
63
|
-
message: candidate.message,
|
|
64
|
-
}),
|
|
65
|
-
]
|
|
66
|
-
}),
|
|
67
|
-
)
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/** Admit only public Query-input repair variants; unknown details remain machine-only. */
|
|
71
|
-
export function queryInputRepair(reason: unknown): QueryInputRepair | undefined {
|
|
72
|
-
if (!reasonWithCode(reason, 'QUERY_INPUT_INVALID')) return undefined
|
|
73
|
-
const details = reason.details
|
|
74
|
-
if (details.phase === 'decode' || details.phase === 'input') {
|
|
75
|
-
if (!exact(details, ['phase', 'path']) || !coordinate(details.path)) return undefined
|
|
76
|
-
return Object.freeze({ phase: details.phase, path: details.path })
|
|
77
|
-
}
|
|
78
|
-
if (details.phase === 'plan') {
|
|
79
|
-
const fields = details.path === undefined ? ['phase', 'issue'] : ['phase', 'issue', 'path']
|
|
80
|
-
if (
|
|
81
|
-
!exact(details, fields) ||
|
|
82
|
-
typeof details.issue !== 'string' ||
|
|
83
|
-
!stableCode(details.issue) ||
|
|
84
|
-
(details.path !== undefined && !coordinate(details.path))
|
|
85
|
-
) {
|
|
86
|
-
return undefined
|
|
87
|
-
}
|
|
88
|
-
return Object.freeze({
|
|
89
|
-
phase: 'plan',
|
|
90
|
-
issue: details.issue,
|
|
91
|
-
...(details.path === undefined ? {} : { path: details.path }),
|
|
92
|
-
})
|
|
93
|
-
}
|
|
94
|
-
if (details.phase !== 'limit') return undefined
|
|
95
|
-
const fields =
|
|
96
|
-
details.path === undefined
|
|
97
|
-
? ['phase', 'limit', 'maximum', 'actual']
|
|
98
|
-
: ['phase', 'limit', 'maximum', 'actual', 'path']
|
|
99
|
-
if (
|
|
100
|
-
!exact(details, fields) ||
|
|
101
|
-
typeof details.limit !== 'string' ||
|
|
102
|
-
!Number.isSafeInteger(details.maximum) ||
|
|
103
|
-
(details.maximum as number) < 0 ||
|
|
104
|
-
!Number.isSafeInteger(details.actual) ||
|
|
105
|
-
(details.actual as number) <= (details.maximum as number) ||
|
|
106
|
-
(details.path !== undefined && !coordinate(details.path))
|
|
107
|
-
) {
|
|
108
|
-
return undefined
|
|
109
|
-
}
|
|
110
|
-
return Object.freeze({
|
|
111
|
-
phase: 'limit',
|
|
112
|
-
limit: details.limit,
|
|
113
|
-
maximum: details.maximum as number,
|
|
114
|
-
actual: details.actual as number,
|
|
115
|
-
...(details.path === undefined ? {} : { path: details.path }),
|
|
116
|
-
})
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/** Decode bounded recovery guidance while preserving the admitted reason itself elsewhere. */
|
|
120
|
-
export function schemaUpgradeDetails(reason: unknown): SchemaUpgradeDetails | undefined {
|
|
121
|
-
if (!record(reason) || reason.code !== 'SCHEMA_UPGRADE_INCOMPATIBLE') return undefined
|
|
122
|
-
const details = record(reason.details) ? reason.details : {}
|
|
123
|
-
const origin = typeof details.origin === 'string' ? details.origin : undefined
|
|
124
|
-
if (
|
|
125
|
-
details.issue === 'issuer-changed' &&
|
|
126
|
-
origin !== undefined &&
|
|
127
|
-
typeof details.installedIssuer === 'string' &&
|
|
128
|
-
typeof details.replacementIssuer === 'string'
|
|
129
|
-
) {
|
|
130
|
-
return {
|
|
131
|
-
origin,
|
|
132
|
-
issue: details.issue,
|
|
133
|
-
installedIssuer: details.installedIssuer,
|
|
134
|
-
replacementIssuer: details.replacementIssuer,
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
return origin === undefined ? {} : { origin }
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
export function schemaUpgradeHint(details: SchemaUpgradeDetails): string {
|
|
141
|
-
const target = details.origin ?? '<origin>'
|
|
142
|
-
const explanation =
|
|
143
|
-
details.issue === 'issuer-changed'
|
|
144
|
-
? 'A replacement cannot change an installed Domain issuer.'
|
|
145
|
-
: 'The replacement changes an immutable part of the installed Domain.'
|
|
146
|
-
return (
|
|
147
|
-
`${explanation} If this change is intentional, first run ` +
|
|
148
|
-
`\`astrale domain uninstall ${target}\`, then install it again. ` +
|
|
149
|
-
'The Kernel refuses uninstall while dependents or business data remain; uninstall never deletes business data.'
|
|
150
|
-
)
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
export function schemaDataRemovalHint(reason: unknown): string | undefined {
|
|
154
|
-
if (!reasonWithCode(reason, 'DATA_MIGRATION_REQUIRED')) return undefined
|
|
155
|
-
const requirements = reason.details.requirements
|
|
156
|
-
if (
|
|
157
|
-
!Array.isArray(requirements) ||
|
|
158
|
-
requirements.length === 0 ||
|
|
159
|
-
!requirements.every(
|
|
160
|
-
(item) =>
|
|
161
|
-
record(item) && item.operation === 'remove-facts' && item.reason === 'destructive-change',
|
|
162
|
-
)
|
|
163
|
-
) {
|
|
164
|
-
return undefined
|
|
165
|
-
}
|
|
166
|
-
return 'Delete this data explicitly, then retry. No data was deleted.'
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
function reasonWithCode(
|
|
170
|
-
input: unknown,
|
|
171
|
-
code: string,
|
|
172
|
-
): input is Readonly<{ code: string; details: Readonly<Record<string, unknown>> }> {
|
|
173
|
-
return (
|
|
174
|
-
record(input) &&
|
|
175
|
-
exact(input, ['code', 'details']) &&
|
|
176
|
-
input.code === code &&
|
|
177
|
-
record(input.details)
|
|
178
|
-
)
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
function coordinate(input: unknown): input is string {
|
|
182
|
-
return (
|
|
183
|
-
typeof input === 'string' &&
|
|
184
|
-
input.length <= 1_024 &&
|
|
185
|
-
input.normalize('NFC') === input &&
|
|
186
|
-
JSON_POINTER.test(input)
|
|
187
|
-
)
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
function stableCode(input: string): boolean {
|
|
191
|
-
return /^[A-Z][A-Z0-9_]{0,127}$/u.test(input) && input.normalize('NFC') === input
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
function containsControl(input: string): boolean {
|
|
195
|
-
for (const character of input) {
|
|
196
|
-
const point = character.codePointAt(0)!
|
|
197
|
-
if (point <= 0x1f || point === 0x7f) return true
|
|
198
|
-
}
|
|
199
|
-
return false
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
function record(input: unknown): input is Readonly<Record<string, unknown>> {
|
|
203
|
-
return input !== null && typeof input === 'object' && !Array.isArray(input)
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
function exact(input: Readonly<Record<string, unknown>>, fields: readonly string[]): boolean {
|
|
207
|
-
const actual = Object.keys(input)
|
|
208
|
-
return actual.length === fields.length && actual.every((field) => fields.includes(field))
|
|
209
|
-
}
|
package/src/connection/self.ts
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { NodeUnavailableError } from '@astrale-os/sdk/client'
|
|
2
|
-
|
|
3
|
-
import type { ConnectionContext } from './session'
|
|
4
|
-
|
|
5
|
-
import { AstraleError } from '../errors'
|
|
6
|
-
import { containsSelfRef, expandSelfReferences } from '../lib/self'
|
|
7
|
-
|
|
8
|
-
/** Metadata attached to errors after an authenticated caller-authored @self expansion. */
|
|
9
|
-
export interface SelfExpansionMeta {
|
|
10
|
-
readonly original: string
|
|
11
|
-
readonly expanded: string
|
|
12
|
-
readonly selfId: string
|
|
13
|
-
readonly slug?: string
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Run `action`; if it throws NodeUnavailableError, retain the authenticated
|
|
18
|
-
* expansion for precise diagnostics. The error is re-thrown either way.
|
|
19
|
-
*/
|
|
20
|
-
export async function withSelfHint<T>(
|
|
21
|
-
action: () => Promise<T>,
|
|
22
|
-
meta: SelfExpansionMeta | undefined,
|
|
23
|
-
): Promise<T> {
|
|
24
|
-
if (!meta) return action()
|
|
25
|
-
try {
|
|
26
|
-
return await action()
|
|
27
|
-
} catch (err) {
|
|
28
|
-
if (err instanceof NodeUnavailableError) {
|
|
29
|
-
;(err as Error & { expandedFromSelf?: SelfExpansionMeta }).expandedFromSelf = meta
|
|
30
|
-
}
|
|
31
|
-
throw err
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
type AuthenticatedSelf = {
|
|
36
|
-
readonly id?: unknown
|
|
37
|
-
readonly slug?: string
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export type ResolveSelfIdDependencies = {
|
|
41
|
-
readonly whoami?: (context: ConnectionContext) => Promise<AuthenticatedSelf>
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
/** Resolve @self only from the effective principal authenticated by the selected Kernel. */
|
|
45
|
-
export async function resolveSelfIdAuthenticated(
|
|
46
|
-
context: ConnectionContext,
|
|
47
|
-
dependencies: ResolveSelfIdDependencies = {},
|
|
48
|
-
): Promise<{ readonly id: string; readonly slug?: string }> {
|
|
49
|
-
const resolved = await (dependencies.whoami ?? whoamiSelfId)(context)
|
|
50
|
-
if (typeof resolved.id !== 'string' || resolved.id.trim().length === 0) {
|
|
51
|
-
throw new AstraleError(
|
|
52
|
-
'SELF_RESOLUTION_FAILED',
|
|
53
|
-
'`@self` could not be resolved: authenticated Identity.whoami returned no NodeId.',
|
|
54
|
-
)
|
|
55
|
-
}
|
|
56
|
-
return resolved.slug === undefined
|
|
57
|
-
? { id: resolved.id }
|
|
58
|
-
: { id: resolved.id, slug: resolved.slug }
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
async function whoamiSelfId({ auth, target }: ConnectionContext): Promise<AuthenticatedSelf> {
|
|
62
|
-
return {
|
|
63
|
-
...(await auth.whoami()),
|
|
64
|
-
...(target.slug === undefined ? {} : { slug: target.slug }),
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/** Expand @self in path-like commands and return metadata for NotFound diagnostics. */
|
|
69
|
-
export async function expandSelfInPath(
|
|
70
|
-
path: string,
|
|
71
|
-
context: ConnectionContext,
|
|
72
|
-
): Promise<{ readonly path: string; readonly meta?: SelfExpansionMeta }> {
|
|
73
|
-
const expanded = await expandSelfValues(path, [], context)
|
|
74
|
-
return expanded.meta === undefined
|
|
75
|
-
? { path: expanded.path }
|
|
76
|
-
: { path: expanded.path, meta: expanded.meta }
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/** Expand @self once across one Call path and its CLI-authored string parameters. */
|
|
80
|
-
export async function expandSelfInCall(
|
|
81
|
-
path: string,
|
|
82
|
-
parameters: Readonly<Record<string, unknown>>,
|
|
83
|
-
context: ConnectionContext,
|
|
84
|
-
): Promise<{
|
|
85
|
-
readonly path: string
|
|
86
|
-
readonly parameters: Readonly<Record<string, unknown>>
|
|
87
|
-
readonly meta?: SelfExpansionMeta
|
|
88
|
-
}> {
|
|
89
|
-
const values = Object.values(parameters).filter(
|
|
90
|
-
(value): value is string => typeof value === 'string',
|
|
91
|
-
)
|
|
92
|
-
const expanded = await expandSelfValues(path, values, context)
|
|
93
|
-
if (expanded.parameters === values) {
|
|
94
|
-
return expanded.meta === undefined
|
|
95
|
-
? { path: expanded.path, parameters }
|
|
96
|
-
: { path: expanded.path, parameters, meta: expanded.meta }
|
|
97
|
-
}
|
|
98
|
-
let index = 0
|
|
99
|
-
const entries = Object.entries(parameters).map(([key, value]) => [
|
|
100
|
-
key,
|
|
101
|
-
typeof value === 'string' ? expanded.parameters[index++] : value,
|
|
102
|
-
])
|
|
103
|
-
const resolved = Object.freeze(Object.fromEntries(entries))
|
|
104
|
-
return expanded.meta === undefined
|
|
105
|
-
? { path: expanded.path, parameters: resolved }
|
|
106
|
-
: { path: expanded.path, parameters: resolved, meta: expanded.meta }
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
async function expandSelfValues(
|
|
110
|
-
path: string,
|
|
111
|
-
parameters: readonly string[],
|
|
112
|
-
context: ConnectionContext,
|
|
113
|
-
): Promise<{
|
|
114
|
-
readonly path: string
|
|
115
|
-
readonly parameters: readonly string[]
|
|
116
|
-
readonly meta?: SelfExpansionMeta
|
|
117
|
-
}> {
|
|
118
|
-
if (!containsSelfRef(path) && !parameters.some(containsSelfRef)) {
|
|
119
|
-
return { path, parameters }
|
|
120
|
-
}
|
|
121
|
-
const self = await resolveSelfIdAuthenticated(context)
|
|
122
|
-
const expandedPath = expandSelfReferences(path, self.id)
|
|
123
|
-
const expandedParameters = parameters.map((parameter) => expandSelfReferences(parameter, self.id))
|
|
124
|
-
const changed =
|
|
125
|
-
expandedPath !== path ||
|
|
126
|
-
expandedParameters.some((parameter, index) => parameter !== parameters[index])
|
|
127
|
-
if (!changed) return { path, parameters }
|
|
128
|
-
return {
|
|
129
|
-
path: expandedPath,
|
|
130
|
-
parameters: expandedParameters,
|
|
131
|
-
meta: {
|
|
132
|
-
original: path,
|
|
133
|
-
expanded: expandedPath,
|
|
134
|
-
selfId: self.id,
|
|
135
|
-
...(self.slug === undefined ? {} : { slug: self.slug }),
|
|
136
|
-
},
|
|
137
|
-
}
|
|
138
|
-
}
|