@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,174 +0,0 @@
|
|
|
1
|
-
import type { CommandDefinition } from '../../program/index'
|
|
2
|
-
|
|
3
|
-
import { AstraleError } from '../../errors'
|
|
4
|
-
import { getDefault, getIdentity, readIdentities } from '../../identity/index'
|
|
5
|
-
import { isSessionExpired, readIdpSession, type IdpSession } from '../../lib/idp'
|
|
6
|
-
import { ensureFreshSession } from '../../lib/idp-session'
|
|
7
|
-
import { fatal, log } from '../../lib/log'
|
|
8
|
-
import { output } from '../../lib/output'
|
|
9
|
-
|
|
10
|
-
type AuthTokenType = 'access' | 'id'
|
|
11
|
-
|
|
12
|
-
type AuthTokenOpts = {
|
|
13
|
-
name?: string
|
|
14
|
-
idp?: string
|
|
15
|
-
type?: AuthTokenType
|
|
16
|
-
refresh?: boolean
|
|
17
|
-
raw?: boolean
|
|
18
|
-
json?: boolean
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
type AuthTokenResult = {
|
|
22
|
-
identity: string
|
|
23
|
-
idp: string
|
|
24
|
-
issuer: string
|
|
25
|
-
subject: string
|
|
26
|
-
type: AuthTokenType
|
|
27
|
-
token: string
|
|
28
|
-
token_type?: string
|
|
29
|
-
scope?: string
|
|
30
|
-
expires_at?: string
|
|
31
|
-
expired: boolean
|
|
32
|
-
refreshed: boolean
|
|
33
|
-
updatedAt: string
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export default {
|
|
37
|
-
name: 'token',
|
|
38
|
-
description: 'Print a cached IdP provider token for an IdP-backed identity',
|
|
39
|
-
options: [
|
|
40
|
-
{
|
|
41
|
-
flags: '--name <name>',
|
|
42
|
-
description: 'IdP-backed identity name (defaults to active identity)',
|
|
43
|
-
},
|
|
44
|
-
{ flags: '--idp <name>', description: 'Select the IdP when identity name is omitted' },
|
|
45
|
-
{
|
|
46
|
-
flags: '--type <type>',
|
|
47
|
-
description: 'Token type to print',
|
|
48
|
-
choices: ['access', 'id'],
|
|
49
|
-
default: 'access',
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
flags: '--no-refresh',
|
|
53
|
-
description: 'Do not refresh an expired cached session before printing',
|
|
54
|
-
},
|
|
55
|
-
{ flags: '--raw', description: 'Print only the token string' },
|
|
56
|
-
{ flags: '--json', description: 'Print JSON metadata including the token' },
|
|
57
|
-
],
|
|
58
|
-
afterHelpText: `
|
|
59
|
-
Behavior:
|
|
60
|
-
Defaults to the active IdP-backed identity. If the cached session is expired,
|
|
61
|
-
the CLI refreshes it before printing unless --no-refresh is passed. --raw
|
|
62
|
-
prints only the token string for shell use.
|
|
63
|
-
|
|
64
|
-
Examples:
|
|
65
|
-
$ astrale auth token --raw
|
|
66
|
-
$ astrale auth token --idp workos --raw
|
|
67
|
-
$ astrale auth token --name alice --type id --json
|
|
68
|
-
`,
|
|
69
|
-
action: async (opts: AuthTokenOpts) => {
|
|
70
|
-
let result: AuthTokenResult
|
|
71
|
-
try {
|
|
72
|
-
result = await resolveAuthToken(opts)
|
|
73
|
-
} catch (error) {
|
|
74
|
-
fatal(error, opts)
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
if (opts.raw) {
|
|
78
|
-
process.stdout.write(result.token + '\n')
|
|
79
|
-
return
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (opts.json) {
|
|
83
|
-
output(result, { json: true })
|
|
84
|
-
return
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
log.dim(` (${result.idp} ${result.type}_token for identity "${result.identity}" - secret)`)
|
|
88
|
-
process.stdout.write(result.token + '\n')
|
|
89
|
-
},
|
|
90
|
-
} satisfies CommandDefinition
|
|
91
|
-
|
|
92
|
-
export async function resolveAuthToken(opts: AuthTokenOpts): Promise<AuthTokenResult> {
|
|
93
|
-
const identityName = await resolveIdentityName(opts)
|
|
94
|
-
const session = await readIdpSession(identityName)
|
|
95
|
-
if (!session) {
|
|
96
|
-
throw new Error(
|
|
97
|
-
`No cached IdP session for "${identityName}". Run: astrale auth login --name ${identityName}`,
|
|
98
|
-
)
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
// ensureFreshSession serializes the (single-use) refresh-token exchange
|
|
102
|
-
// across concurrent CLI processes and is a no-op while the token is fresh.
|
|
103
|
-
const resolved = opts.refresh !== false ? await ensureFreshSession(identityName) : session
|
|
104
|
-
const type = opts.type ?? 'access'
|
|
105
|
-
const token = tokenFromSession(resolved, type)
|
|
106
|
-
|
|
107
|
-
return {
|
|
108
|
-
identity: resolved.identity,
|
|
109
|
-
idp: resolved.idp,
|
|
110
|
-
issuer: resolved.issuer,
|
|
111
|
-
subject: resolved.subject,
|
|
112
|
-
type,
|
|
113
|
-
token,
|
|
114
|
-
token_type: resolved.token_type,
|
|
115
|
-
scope: resolved.scope,
|
|
116
|
-
expires_at: resolved.expires_at,
|
|
117
|
-
expired: isSessionExpired(resolved),
|
|
118
|
-
refreshed: resolved.updatedAt !== session.updatedAt,
|
|
119
|
-
updatedAt: resolved.updatedAt,
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
async function resolveIdentityName(opts: AuthTokenOpts): Promise<string> {
|
|
124
|
-
if (opts.name) {
|
|
125
|
-
const identity = await getIdentity(opts.name)
|
|
126
|
-
if ((identity.source ?? 'key') !== 'idp') {
|
|
127
|
-
throw new AstraleError('AUTH_ERROR', `Identity "${opts.name}" is not IdP-backed`)
|
|
128
|
-
}
|
|
129
|
-
if (opts.idp && identity.idp !== opts.idp) {
|
|
130
|
-
throw new AstraleError(
|
|
131
|
-
'AUTH_ERROR',
|
|
132
|
-
`Identity "${opts.name}" is backed by IdP "${identity.idp ?? '?'}", not "${opts.idp}"`,
|
|
133
|
-
)
|
|
134
|
-
}
|
|
135
|
-
return opts.name
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
if (opts.idp) {
|
|
139
|
-
const store = await readIdentities()
|
|
140
|
-
const matches = Object.entries(store.identities)
|
|
141
|
-
.filter(([, identity]) => identity.source === 'idp' && identity.idp === opts.idp)
|
|
142
|
-
.map(([name]) => name)
|
|
143
|
-
|
|
144
|
-
if (matches.length === 0) {
|
|
145
|
-
throw new AstraleError(
|
|
146
|
-
'AUTH_ERROR',
|
|
147
|
-
`No IdP-backed identities found for IdP "${opts.idp}". Run: astrale auth login --idp ${opts.idp}`,
|
|
148
|
-
)
|
|
149
|
-
}
|
|
150
|
-
if (matches.includes(store.default)) return store.default
|
|
151
|
-
if (matches.length === 1) return matches[0]
|
|
152
|
-
throw new AstraleError(
|
|
153
|
-
'AUTH_ERROR',
|
|
154
|
-
`Multiple IdP-backed identities found for IdP "${opts.idp}": ${matches.join(', ')}. Pass --name.`,
|
|
155
|
-
)
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
const identity = await getDefault()
|
|
159
|
-
if ((identity.source ?? 'key') !== 'idp') {
|
|
160
|
-
throw new AstraleError(
|
|
161
|
-
'AUTH_ERROR',
|
|
162
|
-
'Default identity is not IdP-backed. Pass --name or --idp.',
|
|
163
|
-
)
|
|
164
|
-
}
|
|
165
|
-
return identity.name
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
function tokenFromSession(session: IdpSession, type: AuthTokenType): string {
|
|
169
|
-
if (type === 'access') return session.access_token
|
|
170
|
-
if (session.id_token) return session.id_token
|
|
171
|
-
throw new Error(
|
|
172
|
-
`Cached IdP session for "${session.identity}" has no id_token. Use --type access.`,
|
|
173
|
-
)
|
|
174
|
-
}
|
package/src/commands/browser.ts
DELETED
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import chalk from 'chalk'
|
|
2
|
-
import { existsSync } from 'node:fs'
|
|
3
|
-
|
|
4
|
-
import type { CommandDefinition } from '../program/index'
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
ab,
|
|
8
|
-
AGENT_BROWSER_REPO,
|
|
9
|
-
type BrowserSession,
|
|
10
|
-
findAgentBrowser,
|
|
11
|
-
navigateAndCheck,
|
|
12
|
-
pollAuth,
|
|
13
|
-
profileDirFor,
|
|
14
|
-
saveSession,
|
|
15
|
-
} from '../lib/browser'
|
|
16
|
-
import { sweepBrowserProfiles } from '../lib/browser-retention'
|
|
17
|
-
import { readLocalStatus } from '../lib/local-status'
|
|
18
|
-
import { fatal, log } from '../lib/log'
|
|
19
|
-
import { isMachine, output, RAW_OUTPUT_OPTIONS, type RawOutputOpts } from '../lib/output'
|
|
20
|
-
|
|
21
|
-
type BrowserOpts = RawOutputOpts & {
|
|
22
|
-
url?: string
|
|
23
|
-
cdp?: string
|
|
24
|
-
profile?: string
|
|
25
|
-
login?: boolean
|
|
26
|
-
check?: boolean
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Opportunistic profile retention, the same `git gc --auto` shape the session
|
|
31
|
-
* store uses: no daemon, no cron, it just rides on the command that created the
|
|
32
|
-
* mess. Silent when there is nothing to do, and never fatal — losing a sweep is
|
|
33
|
-
* strictly better than losing the browser command.
|
|
34
|
-
*/
|
|
35
|
-
async function reportSweep(machine: boolean): Promise<void> {
|
|
36
|
-
try {
|
|
37
|
-
const swept = await sweepBrowserProfiles()
|
|
38
|
-
if (machine || swept.bytesFreed === 0) return
|
|
39
|
-
const freed = `${(swept.bytesFreed / 1024 / 1024).toFixed(0)} MB`
|
|
40
|
-
const what = [
|
|
41
|
-
swept.removed.length > 0 ? `${swept.removed.length} dormant profile(s) removed` : null,
|
|
42
|
-
swept.purged.length > 0 ? `${swept.purged.length} cache(s) trimmed` : null,
|
|
43
|
-
]
|
|
44
|
-
.filter(Boolean)
|
|
45
|
-
.join(', ')
|
|
46
|
-
log.dim(`retention: ${what} — ${freed} freed`)
|
|
47
|
-
} catch {
|
|
48
|
-
/* retention must never break the browser command */
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
const LOGIN_TIMEOUT_MS = 180_000
|
|
53
|
-
const POLL_INTERVAL_MS = 2500
|
|
54
|
-
|
|
55
|
-
const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms))
|
|
56
|
-
|
|
57
|
-
/** Resolve the GUI origin for the active instance (or an explicit --url). */
|
|
58
|
-
async function resolveGuiOrigin(explicit?: string): Promise<string> {
|
|
59
|
-
let target = explicit
|
|
60
|
-
if (!target) {
|
|
61
|
-
const status = await readLocalStatus()
|
|
62
|
-
target = status.instance?.url ?? undefined
|
|
63
|
-
}
|
|
64
|
-
if (!target) {
|
|
65
|
-
fatal(
|
|
66
|
-
new Error(
|
|
67
|
-
'No target instance. Set one with `astrale instance use <name>`, or pass `--url <gui-url>`.',
|
|
68
|
-
),
|
|
69
|
-
)
|
|
70
|
-
}
|
|
71
|
-
try {
|
|
72
|
-
return new URL(target).origin
|
|
73
|
-
} catch {
|
|
74
|
-
return fatal(new Error(`Invalid instance URL: ${target}`))
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function requireAgentBrowser(machine: boolean, opts: RawOutputOpts): Promise<string> {
|
|
79
|
-
return findAgentBrowser().then((bin) => {
|
|
80
|
-
if (bin) return bin
|
|
81
|
-
if (machine) {
|
|
82
|
-
output({ error: 'agent-browser-not-installed', repo: AGENT_BROWSER_REPO }, opts)
|
|
83
|
-
} else {
|
|
84
|
-
log.error('agent-browser is not installed — it is the engine `astrale browser` drives.')
|
|
85
|
-
log.dim(' Install it:')
|
|
86
|
-
log.dim(' npm install -g agent-browser && agent-browser install')
|
|
87
|
-
log.dim(' Recommended — also install its agent skill so your coding agent knows it:')
|
|
88
|
-
log.dim(` npx skills add ${AGENT_BROWSER_REPO}`)
|
|
89
|
-
}
|
|
90
|
-
process.exit(1)
|
|
91
|
-
})
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
function reportConnected(session: BrowserSession, machine: boolean, opts: RawOutputOpts): void {
|
|
95
|
-
if (machine) {
|
|
96
|
-
output({ connected: true, ...session }, opts)
|
|
97
|
-
return
|
|
98
|
-
}
|
|
99
|
-
const drive = session.profile ? `--profile ${session.profile}` : `--cdp ${session.cdp}`
|
|
100
|
-
log.success(
|
|
101
|
-
`Connected to ${chalk.bold(session.url)}${session.email ? ` as ${session.email}` : ''}`,
|
|
102
|
-
)
|
|
103
|
-
log.dim(` session saved → ~/.astrale/browser.json (reused automatically next time)`)
|
|
104
|
-
console.log('')
|
|
105
|
-
console.log(chalk.bold('Drive it:'))
|
|
106
|
-
console.log(` agent-browser ${drive} snapshot`)
|
|
107
|
-
console.log(` agent-browser ${drive} open ${session.url}`)
|
|
108
|
-
console.log(` agent-browser ${drive} click @e3`)
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export default {
|
|
112
|
-
name: 'browser',
|
|
113
|
-
description: 'Open a reusable, authenticated browser session your agent can drive',
|
|
114
|
-
options: [
|
|
115
|
-
{ flags: '--url <url>', description: 'GUI URL to connect (default: active instance)' },
|
|
116
|
-
{
|
|
117
|
-
flags: '--cdp <endpoint>',
|
|
118
|
-
description: 'Attach to a running Chrome (port or ws URL) instead of a profile',
|
|
119
|
-
},
|
|
120
|
-
{ flags: '--profile <dir>', description: 'Override the persistent profile directory' },
|
|
121
|
-
{ flags: '--login', description: 'Force interactive sign-in even if a session exists' },
|
|
122
|
-
{ flags: '--check', description: 'Report session status only; never open a window' },
|
|
123
|
-
...RAW_OUTPUT_OPTIONS,
|
|
124
|
-
],
|
|
125
|
-
afterHelpText: `
|
|
126
|
-
What it does:
|
|
127
|
-
Wires your coding agent to the live Astrale GUI. It owns the *session* — pins a
|
|
128
|
-
persistent per-instance profile, runs the one-time WorkOS sign-in, and verifies
|
|
129
|
-
auth. Driving the page is agent-browser's job: once connected, your agent runs
|
|
130
|
-
\`agent-browser --profile <dir> snapshot|open|click|eval\` directly.
|
|
131
|
-
|
|
132
|
-
The GUI session is an httpOnly cookie with no token-injection path, so "use my
|
|
133
|
-
session" means driving a browser whose profile holds the cookie. You sign in
|
|
134
|
-
once; the profile keeps it and every later run is silent.
|
|
135
|
-
|
|
136
|
-
Requires agent-browser (https://github.com/${AGENT_BROWSER_REPO}):
|
|
137
|
-
npm install -g agent-browser && agent-browser install
|
|
138
|
-
npx skills add ${AGENT_BROWSER_REPO} # recommended: teaches the agent its commands
|
|
139
|
-
|
|
140
|
-
Examples:
|
|
141
|
-
$ astrale browser # connect the active instance (sign in once)
|
|
142
|
-
$ astrale browser --check # is the saved session still authenticated?
|
|
143
|
-
$ astrale browser --login # force a fresh sign-in
|
|
144
|
-
$ astrale browser --cdp 9222 # attach to a Chrome you already have open
|
|
145
|
-
`,
|
|
146
|
-
action: async (opts: BrowserOpts) => {
|
|
147
|
-
const machine = isMachine(opts)
|
|
148
|
-
const gui = await resolveGuiOrigin(opts.url)
|
|
149
|
-
const host = new URL(gui).host
|
|
150
|
-
await requireAgentBrowser(machine, opts)
|
|
151
|
-
|
|
152
|
-
// Retention runs BEFORE anything launches, so no profile we touch can be in
|
|
153
|
-
// use by a browser this command started. Profiles held by someone else's
|
|
154
|
-
// live browser are skipped by the sweep itself.
|
|
155
|
-
await reportSweep(machine)
|
|
156
|
-
|
|
157
|
-
const usingCdp = !!opts.cdp
|
|
158
|
-
const profile = usingCdp ? null : (opts.profile ?? profileDirFor(host))
|
|
159
|
-
const target = usingCdp ? { cdp: opts.cdp } : { profile: profile! }
|
|
160
|
-
|
|
161
|
-
const persist = async (state: { email?: string }): Promise<BrowserSession> => {
|
|
162
|
-
const session: BrowserSession = {
|
|
163
|
-
url: gui,
|
|
164
|
-
host,
|
|
165
|
-
profile,
|
|
166
|
-
cdp: opts.cdp ?? null,
|
|
167
|
-
email: state.email,
|
|
168
|
-
updatedAt: new Date().toISOString(),
|
|
169
|
-
}
|
|
170
|
-
await saveSession(session)
|
|
171
|
-
return session
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// Attach mode: the external Chrome is the user's — never drive its login.
|
|
175
|
-
if (usingCdp) {
|
|
176
|
-
const state = await navigateAndCheck(gui, target)
|
|
177
|
-
if (!state.authed) {
|
|
178
|
-
if (machine) output({ connected: false, url: gui, host, cdp: opts.cdp }, opts)
|
|
179
|
-
else {
|
|
180
|
-
log.warn(`Attached to Chrome on ${opts.cdp}, but not signed in to ${gui}.`)
|
|
181
|
-
log.dim(' Sign in in that browser window, then re-run `astrale browser --cdp ...`.')
|
|
182
|
-
}
|
|
183
|
-
process.exit(1)
|
|
184
|
-
}
|
|
185
|
-
reportConnected(await persist(state), machine, opts)
|
|
186
|
-
return
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
// Profile mode: silent (headless) reuse check when the profile may already
|
|
190
|
-
// hold a cookie. Skip for a brand-new profile — nothing to reuse, and it
|
|
191
|
-
// avoids a throwaway headless navigation before the sign-in window opens.
|
|
192
|
-
if (!opts.login && profile && existsSync(profile)) {
|
|
193
|
-
const reused = await navigateAndCheck(gui, target)
|
|
194
|
-
if (reused.authed) {
|
|
195
|
-
reportConnected(await persist(reused), machine, opts)
|
|
196
|
-
return
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
// Not authenticated. In check/machine mode we never pop a window.
|
|
201
|
-
if (opts.check || machine) {
|
|
202
|
-
if (machine) output({ connected: false, url: gui, host, profile }, opts)
|
|
203
|
-
else {
|
|
204
|
-
log.warn(`No authenticated session for ${gui}.`)
|
|
205
|
-
log.dim(' Run `astrale browser` (without --check) to sign in.')
|
|
206
|
-
}
|
|
207
|
-
process.exit(1)
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
// Interactive sign-in: open a HEADED window and poll until the router sets
|
|
211
|
-
// the cookie. Every command on this browser must carry `headed:true` —
|
|
212
|
-
// agent-browser defaults to headless, and an unflagged command flips the
|
|
213
|
-
// live window back to headless (closing it mid-login). Proven: a poll
|
|
214
|
-
// `eval` without --headed turns HEADED → HEADLESS on the next call.
|
|
215
|
-
const headedTarget = { ...target, headed: true }
|
|
216
|
-
log.step(`Opening ${chalk.bold(gui)} — sign in with your Astrale account in the window…`)
|
|
217
|
-
await ab(['close'], target) // release any stale browser on this profile
|
|
218
|
-
await ab(['open', gui], headedTarget)
|
|
219
|
-
|
|
220
|
-
const deadline = Date.now() + LOGIN_TIMEOUT_MS
|
|
221
|
-
let state = { authed: false } as { authed: boolean; email?: string }
|
|
222
|
-
while (Date.now() < deadline) {
|
|
223
|
-
await sleep(POLL_INTERVAL_MS)
|
|
224
|
-
state = await pollAuth(headedTarget)
|
|
225
|
-
if (state.authed) break
|
|
226
|
-
}
|
|
227
|
-
if (!state.authed) {
|
|
228
|
-
fatal(
|
|
229
|
-
new Error(
|
|
230
|
-
`Sign-in not detected within ${LOGIN_TIMEOUT_MS / 1000}s. Re-run \`astrale browser\`.`,
|
|
231
|
-
),
|
|
232
|
-
)
|
|
233
|
-
}
|
|
234
|
-
reportConnected(await persist(state), machine, opts)
|
|
235
|
-
},
|
|
236
|
-
} satisfies CommandDefinition
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import type { Path } from '@astrale-os/sdk/graph/path'
|
|
2
|
-
import type { ResolvedFunction, ResolvedMethod } from '@astrale-os/sdk/schema'
|
|
3
|
-
|
|
4
|
-
import { bundle, schema } from '@astrale-os/sdk/schema'
|
|
5
|
-
|
|
6
|
-
import { AstraleError } from '../errors'
|
|
7
|
-
|
|
8
|
-
export interface CallableDescription {
|
|
9
|
-
readonly path: string
|
|
10
|
-
readonly origin: string
|
|
11
|
-
readonly method?: string
|
|
12
|
-
readonly function?: string
|
|
13
|
-
readonly class?: string
|
|
14
|
-
readonly dispatch?: 'static' | 'instance'
|
|
15
|
-
readonly description?: string
|
|
16
|
-
readonly auth?: unknown
|
|
17
|
-
readonly input?: unknown
|
|
18
|
-
readonly output?: unknown
|
|
19
|
-
readonly candidates?: readonly CallableDescription[]
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/** Resolve one callable from an admitted installed Domain bundle. */
|
|
23
|
-
export function describeCallableFromBundle(
|
|
24
|
-
path: Path,
|
|
25
|
-
input: unknown,
|
|
26
|
-
): CallableDescription | undefined {
|
|
27
|
-
if (path.ast.anchor.kind !== 'domain') return undefined
|
|
28
|
-
const origin = path.ast.anchor.origin
|
|
29
|
-
const last = path.ast.steps.at(-1)
|
|
30
|
-
if (last === undefined) return undefined
|
|
31
|
-
const domain = schema.resolve(bundle.accept(input).root)
|
|
32
|
-
if (domain.origin !== origin) return undefined
|
|
33
|
-
|
|
34
|
-
if (last.kind === 'method') {
|
|
35
|
-
const ownerStep = path.ast.steps.at(-2)
|
|
36
|
-
if (ownerStep?.kind === 'projection' && ownerStep.projection.kind === 'class') {
|
|
37
|
-
const owner = domain.classes[ownerStep.projection.name]
|
|
38
|
-
if (owner?.kind !== 'node') return undefined
|
|
39
|
-
const method = namedMethod(
|
|
40
|
-
last.dispatch === 'static' ? owner.static.methods : owner.methods,
|
|
41
|
-
last.name,
|
|
42
|
-
last.dispatch,
|
|
43
|
-
)
|
|
44
|
-
return method === undefined
|
|
45
|
-
? undefined
|
|
46
|
-
: description(path, origin, owner.ref.name, method, last.dispatch)
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const matches = Object.values(domain.classes).flatMap((owner) => {
|
|
50
|
-
if (owner.kind !== 'node') return []
|
|
51
|
-
const method = namedMethod(owner.methods, last.name, last.dispatch)
|
|
52
|
-
return method === undefined
|
|
53
|
-
? []
|
|
54
|
-
: [description(path, origin, owner.ref.name, method, last.dispatch)]
|
|
55
|
-
})
|
|
56
|
-
if (matches.length === 1) return matches[0]
|
|
57
|
-
if (matches.length > 1) {
|
|
58
|
-
return Object.freeze({
|
|
59
|
-
path: path.raw,
|
|
60
|
-
origin,
|
|
61
|
-
method: last.name,
|
|
62
|
-
dispatch: last.dispatch,
|
|
63
|
-
candidates: Object.freeze(matches),
|
|
64
|
-
})
|
|
65
|
-
}
|
|
66
|
-
return undefined
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (last.kind === 'projection' && last.projection.kind === 'function') {
|
|
70
|
-
const callable = domain.functions[last.projection.name]
|
|
71
|
-
if (callable === undefined) return undefined
|
|
72
|
-
return Object.freeze({
|
|
73
|
-
path: path.raw,
|
|
74
|
-
origin,
|
|
75
|
-
function: callable.ref.name,
|
|
76
|
-
...callableFields(callable),
|
|
77
|
-
})
|
|
78
|
-
}
|
|
79
|
-
return undefined
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export function missingCallableDescription(path: string): AstraleError {
|
|
83
|
-
return new AstraleError(
|
|
84
|
-
'CALL_DESCRIBE_UNAVAILABLE',
|
|
85
|
-
`No callable schema is installed for ${path}.`,
|
|
86
|
-
'Use a Domain-rooted Path such as /:kernel.astrale.ai:class.Identity:whois. Method Paths are not Function nodes.',
|
|
87
|
-
)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
function namedMethod(
|
|
91
|
-
methods: Iterable<ResolvedMethod>,
|
|
92
|
-
name: string,
|
|
93
|
-
dispatch: 'static' | 'instance',
|
|
94
|
-
): ResolvedMethod | undefined {
|
|
95
|
-
const expectedStatic = dispatch === 'static'
|
|
96
|
-
return [...methods].find((method) => method.name === name && method.static === expectedStatic)
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
function description(
|
|
100
|
-
path: Path,
|
|
101
|
-
origin: string,
|
|
102
|
-
className: string,
|
|
103
|
-
callable: ResolvedMethod,
|
|
104
|
-
dispatch: 'static' | 'instance',
|
|
105
|
-
): CallableDescription {
|
|
106
|
-
return Object.freeze({
|
|
107
|
-
path: path.raw,
|
|
108
|
-
origin,
|
|
109
|
-
class: className,
|
|
110
|
-
method: callable.name,
|
|
111
|
-
dispatch,
|
|
112
|
-
...callableFields(callable),
|
|
113
|
-
})
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function callableFields(callable: ResolvedFunction | ResolvedMethod): Partial<CallableDescription> {
|
|
117
|
-
return {
|
|
118
|
-
...(callable.description === undefined ? {} : { description: callable.description }),
|
|
119
|
-
auth: callable.auth,
|
|
120
|
-
input: callable.input,
|
|
121
|
-
output: callable.output,
|
|
122
|
-
}
|
|
123
|
-
}
|