@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,180 +0,0 @@
|
|
|
1
|
-
import { describe, expect, test } from 'bun:test'
|
|
2
|
-
|
|
3
|
-
import { prepareQuery } from '../query'
|
|
4
|
-
|
|
5
|
-
describe('prepareQuery', () => {
|
|
6
|
-
/** @evidence TEST-CLI-GRAPH-AUTHORS-QUERY-V6 */
|
|
7
|
-
test('authors the supported Path and exact-edge subset as canonical Query V6', () => {
|
|
8
|
-
const prepared = prepareQuery({
|
|
9
|
-
sources: ['/:notes.example.dev:class.Note'],
|
|
10
|
-
edge: '/:notes.example.dev:class.references',
|
|
11
|
-
direction: 'incoming',
|
|
12
|
-
limit: '25',
|
|
13
|
-
cursor: 'next-page',
|
|
14
|
-
})
|
|
15
|
-
|
|
16
|
-
expect(JSON.parse(JSON.stringify(prepared))).toEqual({
|
|
17
|
-
ast: {
|
|
18
|
-
format: 'astrale.graph.query',
|
|
19
|
-
version: 'v6',
|
|
20
|
-
source: {
|
|
21
|
-
kind: 'node',
|
|
22
|
-
terms: [{ kind: 'path', path: '/:notes.example.dev:class.Note' }],
|
|
23
|
-
binding: 'n0',
|
|
24
|
-
},
|
|
25
|
-
steps: [
|
|
26
|
-
{
|
|
27
|
-
op: 'expand',
|
|
28
|
-
from: 'n0',
|
|
29
|
-
via: [{ origin: 'notes.example.dev', kind: 'class', name: 'references' }],
|
|
30
|
-
direction: 'incoming',
|
|
31
|
-
bindings: { edge: 'e0', node: 'n1' },
|
|
32
|
-
},
|
|
33
|
-
],
|
|
34
|
-
select: { kind: 'graph', binding: 'n1' },
|
|
35
|
-
},
|
|
36
|
-
page: { size: 25, after: 'next-page' },
|
|
37
|
-
})
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
/** @evidence TEST-CLI-GRAPH-AUTHORS-CLASS-QUERY */
|
|
41
|
-
test('authors an exact Class source without backend query text', () => {
|
|
42
|
-
const prepared = prepareQuery({
|
|
43
|
-
sources: [],
|
|
44
|
-
class: '/:issues.astrale.ai:class.Issue',
|
|
45
|
-
limit: '201',
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
expect(JSON.parse(JSON.stringify(prepared.ast))).toEqual({
|
|
49
|
-
format: 'astrale.graph.query',
|
|
50
|
-
version: 'v6',
|
|
51
|
-
source: {
|
|
52
|
-
kind: 'node',
|
|
53
|
-
terms: [
|
|
54
|
-
{
|
|
55
|
-
kind: 'class',
|
|
56
|
-
class: { origin: 'issues.astrale.ai', kind: 'class', name: 'Issue' },
|
|
57
|
-
},
|
|
58
|
-
],
|
|
59
|
-
binding: 'n0',
|
|
60
|
-
},
|
|
61
|
-
steps: [],
|
|
62
|
-
select: { kind: 'graph', binding: 'n0' },
|
|
63
|
-
})
|
|
64
|
-
expect(prepared.page).toEqual({ size: 201 })
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
test('unions positional Paths and one Class source in authored order', () => {
|
|
68
|
-
const prepared = prepareQuery({
|
|
69
|
-
sources: ['@note'],
|
|
70
|
-
class: '/:issues.astrale.ai:class.Issue',
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
expect(JSON.parse(JSON.stringify(prepared.ast.source))).toEqual({
|
|
74
|
-
kind: 'node',
|
|
75
|
-
terms: [
|
|
76
|
-
{ kind: 'path', path: '@note' },
|
|
77
|
-
{
|
|
78
|
-
kind: 'class',
|
|
79
|
-
class: { origin: 'issues.astrale.ai', kind: 'class', name: 'Issue' },
|
|
80
|
-
},
|
|
81
|
-
],
|
|
82
|
-
binding: 'n0',
|
|
83
|
-
})
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
/** @evidence TEST-CLI-GRAPH-ADMITS-QUERY-V6-ORDERING */
|
|
87
|
-
test('admits one exact Property-ordered Query V6 document', () => {
|
|
88
|
-
const ast = {
|
|
89
|
-
format: 'astrale.graph.query',
|
|
90
|
-
version: 'v6',
|
|
91
|
-
source: {
|
|
92
|
-
kind: 'node',
|
|
93
|
-
terms: [
|
|
94
|
-
{
|
|
95
|
-
kind: 'class',
|
|
96
|
-
class: { origin: 'notes.example.dev', kind: 'class', name: 'Note' },
|
|
97
|
-
},
|
|
98
|
-
],
|
|
99
|
-
binding: 'n0',
|
|
100
|
-
},
|
|
101
|
-
steps: [],
|
|
102
|
-
select: {
|
|
103
|
-
kind: 'graph',
|
|
104
|
-
binding: 'n0',
|
|
105
|
-
order: {
|
|
106
|
-
property: 'notes.example.dev:class.Note.property.sequence',
|
|
107
|
-
direction: 'desc',
|
|
108
|
-
unranked: 'last',
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
const prepared = prepareQuery({ sources: [], ast, limit: '3' })
|
|
114
|
-
expect(JSON.parse(JSON.stringify(prepared.ast))).toEqual(ast)
|
|
115
|
-
expect(prepared.page).toEqual({ size: 3 })
|
|
116
|
-
})
|
|
117
|
-
|
|
118
|
-
/** @evidence TEST-CLI-GRAPH-ADMITS-QUERY-V6-PROJECTIONS */
|
|
119
|
-
test('admits exact Node and Edge projection profiles in Query V6 documents', () => {
|
|
120
|
-
const source = {
|
|
121
|
-
terms: [{ kind: 'path', path: '/:notes.example.dev:class.Note' }],
|
|
122
|
-
binding: 'n0',
|
|
123
|
-
kind: 'node',
|
|
124
|
-
} as const
|
|
125
|
-
const node = {
|
|
126
|
-
format: 'astrale.graph.query',
|
|
127
|
-
version: 'v6',
|
|
128
|
-
source,
|
|
129
|
-
steps: [],
|
|
130
|
-
select: { kind: 'nodes', binding: 'n0', projection: { kind: 'reference' } },
|
|
131
|
-
}
|
|
132
|
-
const edge = {
|
|
133
|
-
format: 'astrale.graph.query',
|
|
134
|
-
version: 'v6',
|
|
135
|
-
source,
|
|
136
|
-
steps: [
|
|
137
|
-
{
|
|
138
|
-
op: 'expand',
|
|
139
|
-
from: 'n0',
|
|
140
|
-
via: [{ origin: 'notes.example.dev', kind: 'class', name: 'references' }],
|
|
141
|
-
direction: 'outgoing',
|
|
142
|
-
bindings: { edge: 'e0', node: 'n1' },
|
|
143
|
-
},
|
|
144
|
-
],
|
|
145
|
-
select: {
|
|
146
|
-
kind: 'edges',
|
|
147
|
-
binding: 'e0',
|
|
148
|
-
projection: { edge: 'value', source: 'reference', target: 'value' },
|
|
149
|
-
},
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
expect(
|
|
153
|
-
JSON.parse(JSON.stringify(prepareQuery({ sources: [], ast: node, limit: '5' }).ast)),
|
|
154
|
-
).toEqual(node)
|
|
155
|
-
expect(
|
|
156
|
-
JSON.parse(JSON.stringify(prepareQuery({ sources: [], ast: edge, limit: '5' }).ast)),
|
|
157
|
-
).toEqual(edge)
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
/** @evidence TEST-CLI-GRAPH-REJECTS-LEGACY-QUERY */
|
|
161
|
-
test('rejects V1 queries and unsupported combinations locally', () => {
|
|
162
|
-
expect(() => prepareQuery({ sources: [], ast: { version: 1, from: ['/'] } })).toThrow()
|
|
163
|
-
expect(() =>
|
|
164
|
-
prepareQuery({ sources: ['/:notes.example.dev:class.Note'], direction: 'incident' }),
|
|
165
|
-
).toThrow('--direction requires --edge')
|
|
166
|
-
expect(() =>
|
|
167
|
-
prepareQuery({ sources: ['/:notes.example.dev:class.Note'], limit: 'all' }),
|
|
168
|
-
).toThrow('--limit must be a positive integer')
|
|
169
|
-
expect(() =>
|
|
170
|
-
prepareQuery({
|
|
171
|
-
sources: [],
|
|
172
|
-
ast: {},
|
|
173
|
-
class: '/:notes.example.dev:class.Note',
|
|
174
|
-
}),
|
|
175
|
-
).toThrow('--ast/--file cannot be combined with sources, --class, --edge, or --direction')
|
|
176
|
-
expect(() => prepareQuery({ sources: [], class: '/:notes.example.dev:view.note' })).toThrow(
|
|
177
|
-
'--class must be one canonical Class Path',
|
|
178
|
-
)
|
|
179
|
-
})
|
|
180
|
-
})
|
package/src/graph/class.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import type { ClassKey as ClassKeyValue, ClassRef } from '@astrale-os/sdk/graph/class'
|
|
2
|
-
|
|
3
|
-
import { ClassKey } from '@astrale-os/sdk/graph/class'
|
|
4
|
-
import { Path } from '@astrale-os/sdk/graph/path'
|
|
5
|
-
|
|
6
|
-
/** Admit one canonical Domain-rooted Class Path into its DSL coordinate. */
|
|
7
|
-
export function classReference(input: string, label: string): ClassRef {
|
|
8
|
-
const path = Path.parse(input)
|
|
9
|
-
const step = path.ast.steps[0]
|
|
10
|
-
if (
|
|
11
|
-
path.ast.anchor.kind !== 'domain' ||
|
|
12
|
-
path.ast.steps.length !== 1 ||
|
|
13
|
-
step?.kind !== 'projection' ||
|
|
14
|
-
step.projection.kind !== 'class'
|
|
15
|
-
) {
|
|
16
|
-
throw new TypeError(`${label} must be one canonical Class Path`)
|
|
17
|
-
}
|
|
18
|
-
return ClassKey.ref(
|
|
19
|
-
ClassKey.of({
|
|
20
|
-
origin: path.ast.anchor.origin,
|
|
21
|
-
kind: 'class',
|
|
22
|
-
name: step.projection.name,
|
|
23
|
-
}),
|
|
24
|
-
)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/** Admit one canonical Domain-rooted Class Path into its exact string identity. */
|
|
28
|
-
export function classKey(input: string, label: string): ClassKeyValue {
|
|
29
|
-
return ClassKey.of(classReference(input, label))
|
|
30
|
-
}
|
package/src/graph/index.ts
DELETED
package/src/graph/mutation.ts
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import type { MutationAST as MutationASTValue, MutationInput } from '@astrale-os/sdk/mutation'
|
|
2
|
-
|
|
3
|
-
import { MutationAST } from '@astrale-os/sdk/mutation'
|
|
4
|
-
|
|
5
|
-
/** Admit the canonical document or Core's exact rich authoring input at the CLI JSON boundary. */
|
|
6
|
-
export function prepareMutation(input: unknown): MutationASTValue {
|
|
7
|
-
if (isLegacyPatchData(input)) {
|
|
8
|
-
throw new TypeError(
|
|
9
|
-
'Legacy PatchData { nodes, edges } is not Mutation V3. Author { preconditions, operations } or a canonical astrale.graph.mutation/v3 document.',
|
|
10
|
-
)
|
|
11
|
-
}
|
|
12
|
-
if (hasEmptyOperations(input)) {
|
|
13
|
-
throw new TypeError('Mutation V3 requires at least one operation')
|
|
14
|
-
}
|
|
15
|
-
if (isCanonicalCandidate(input)) return MutationAST.decode(input)
|
|
16
|
-
return MutationAST.create(input as MutationInput)
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function hasEmptyOperations(input: unknown): boolean {
|
|
20
|
-
return (
|
|
21
|
-
input !== null &&
|
|
22
|
-
typeof input === 'object' &&
|
|
23
|
-
!Array.isArray(input) &&
|
|
24
|
-
Array.isArray((input as { operations?: unknown }).operations) &&
|
|
25
|
-
(input as { operations: unknown[] }).operations.length === 0
|
|
26
|
-
)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function isCanonicalCandidate(input: unknown): boolean {
|
|
30
|
-
return (
|
|
31
|
-
input !== null &&
|
|
32
|
-
typeof input === 'object' &&
|
|
33
|
-
!Array.isArray(input) &&
|
|
34
|
-
(Object.hasOwn(input, 'format') || Object.hasOwn(input, 'version'))
|
|
35
|
-
)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
function isLegacyPatchData(input: unknown): boolean {
|
|
39
|
-
return (
|
|
40
|
-
input !== null &&
|
|
41
|
-
typeof input === 'object' &&
|
|
42
|
-
!Array.isArray(input) &&
|
|
43
|
-
!Object.hasOwn(input, 'operations') &&
|
|
44
|
-
(Object.hasOwn(input, 'nodes') || Object.hasOwn(input, 'edges'))
|
|
45
|
-
)
|
|
46
|
-
}
|
package/src/graph/projection.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/** Strip a fully-qualified Property key to the leaf used by CLI presentation. */
|
|
2
|
-
export function unqualifyProperty(key: string): string {
|
|
3
|
-
const property = key.lastIndexOf('.property.')
|
|
4
|
-
if (property >= 0) return key.slice(property + '.property.'.length)
|
|
5
|
-
const slash = key.lastIndexOf('/')
|
|
6
|
-
return slash >= 0 ? key.slice(slash + 1) : key
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
/** Read an exact key first, then one canonical qualified key with the requested leaf. */
|
|
10
|
-
export function nodeProperty(
|
|
11
|
-
node: { readonly props: Readonly<Record<string, unknown>> } | null | undefined,
|
|
12
|
-
name: string,
|
|
13
|
-
): unknown {
|
|
14
|
-
const props = node?.props
|
|
15
|
-
if (props === undefined) return undefined
|
|
16
|
-
if (Object.hasOwn(props, name)) return props[name]
|
|
17
|
-
for (const [key, value] of Object.entries(props)) {
|
|
18
|
-
if (unqualifyProperty(key) === name) return value
|
|
19
|
-
}
|
|
20
|
-
return undefined
|
|
21
|
-
}
|
package/src/graph/query.ts
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
NodeQueryBuilder,
|
|
3
|
-
QueryAST as QueryASTValue,
|
|
4
|
-
QueryDirection,
|
|
5
|
-
QueryNodeInput,
|
|
6
|
-
} from '@astrale-os/sdk/query'
|
|
7
|
-
|
|
8
|
-
import { Path } from '@astrale-os/sdk/graph/path'
|
|
9
|
-
import { Query, QueryAST } from '@astrale-os/sdk/query'
|
|
10
|
-
|
|
11
|
-
import { classReference } from './class'
|
|
12
|
-
|
|
13
|
-
export interface QueryCommandInput {
|
|
14
|
-
readonly sources: readonly string[]
|
|
15
|
-
readonly class?: string
|
|
16
|
-
readonly ast?: unknown
|
|
17
|
-
readonly edge?: string
|
|
18
|
-
readonly direction?: QueryDirection
|
|
19
|
-
readonly limit?: string
|
|
20
|
-
readonly cursor?: string
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export interface PreparedQuery {
|
|
24
|
-
readonly ast: QueryASTValue
|
|
25
|
-
readonly page: Readonly<{ readonly size: number; readonly after?: string }>
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const DEFAULT_LIMIT = 100
|
|
29
|
-
|
|
30
|
-
/** Admit canonical Query V6 or author the intentionally small Path/Class/one-edge subset. */
|
|
31
|
-
export function prepareQuery(input: QueryCommandInput): PreparedQuery {
|
|
32
|
-
const limit = positiveInteger(input.limit, '--limit', DEFAULT_LIMIT)
|
|
33
|
-
if (input.ast !== undefined) {
|
|
34
|
-
if (
|
|
35
|
-
input.sources.length > 0 ||
|
|
36
|
-
input.class !== undefined ||
|
|
37
|
-
input.edge !== undefined ||
|
|
38
|
-
input.direction !== undefined
|
|
39
|
-
) {
|
|
40
|
-
throw new TypeError(
|
|
41
|
-
'--ast/--file cannot be combined with sources, --class, --edge, or --direction',
|
|
42
|
-
)
|
|
43
|
-
}
|
|
44
|
-
return withPage(QueryAST.decode(input.ast), limit, input.cursor)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
if (input.sources.length === 0 && input.class === undefined) {
|
|
48
|
-
throw new TypeError('query requires a Path source, --class, or a canonical Query V6 document')
|
|
49
|
-
}
|
|
50
|
-
if (input.direction !== undefined && input.edge === undefined) {
|
|
51
|
-
throw new TypeError('--direction requires --edge')
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
const paths = input.sources.map((source) => Path.parse(source))
|
|
55
|
-
const selectedClass =
|
|
56
|
-
input.class === undefined ? undefined : classReference(input.class, '--class')
|
|
57
|
-
const nodes = selectedClass === undefined ? paths : [...paths, selectedClass]
|
|
58
|
-
const query: NodeQueryBuilder<unknown> = Query.from({
|
|
59
|
-
nodes: nodes as [QueryNodeInput, ...QueryNodeInput[]],
|
|
60
|
-
})
|
|
61
|
-
const ast =
|
|
62
|
-
input.edge === undefined
|
|
63
|
-
? query.select({ kind: 'graph', binding: query.node })
|
|
64
|
-
: expanded(query, input.edge, input.direction)
|
|
65
|
-
return withPage(ast, limit, input.cursor)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function expanded(
|
|
69
|
-
query: NodeQueryBuilder<unknown>,
|
|
70
|
-
edge: string,
|
|
71
|
-
direction: QueryDirection | undefined,
|
|
72
|
-
): QueryASTValue {
|
|
73
|
-
const result = query.expand({
|
|
74
|
-
via: [classReference(edge, '--edge')],
|
|
75
|
-
direction: direction ?? 'outgoing',
|
|
76
|
-
})
|
|
77
|
-
return result.select({ kind: 'graph', binding: result.node })
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function positiveInteger(raw: string | undefined, name: string, fallback: number): number {
|
|
81
|
-
if (raw === undefined) return fallback
|
|
82
|
-
if (!/^\d+$/.test(raw)) throw new TypeError(`${name} must be a positive integer`)
|
|
83
|
-
const value = Number.parseInt(raw, 10)
|
|
84
|
-
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
85
|
-
throw new TypeError(`${name} must be a positive integer`)
|
|
86
|
-
}
|
|
87
|
-
return value
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
function withPage(ast: QueryASTValue, size: number, cursor: string | undefined): PreparedQuery {
|
|
91
|
-
return Object.freeze({
|
|
92
|
-
ast,
|
|
93
|
-
page: Object.freeze({ size, ...(cursor === undefined ? {} : { after: cursor }) }),
|
|
94
|
-
})
|
|
95
|
-
}
|
package/src/graph/tsconfig.json
DELETED
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
# Bootstrap root transfer and child authority
|
|
2
|
-
|
|
3
|
-
Status: resolved
|
|
4
|
-
Impact: high
|
|
5
|
-
Selection: identity-export-v1-and-authenticated-management-delegation
|
|
6
|
-
|
|
7
|
-
## Context
|
|
8
|
-
|
|
9
|
-
A production Host creates the manager Kernel's signing material before the CLI has any local state.
|
|
10
|
-
Qualification may mount that generated secret into the operator environment, but it must not
|
|
11
|
-
manufacture the CLI registry or key files. The Host producer and CLI importer previously agreed only
|
|
12
|
-
through coincident TypeScript object shapes. The root-to-child journey was also distributed across
|
|
13
|
-
Host, Runtime, Client, and CLI behavior, leaving room to confuse a manager-signed Management carrier
|
|
14
|
-
with the effective child principal.
|
|
15
|
-
|
|
16
|
-
## Decision
|
|
17
|
-
|
|
18
|
-
https://schemas.astrale.ai/cli/identity-export/1 is the portable JSON Schema for the plaintext
|
|
19
|
-
IdentityExport V1 envelope. CLI Identity owns and publishes that schema. Structural schema admission
|
|
20
|
-
does not prove a keypair: identity import additionally proves that the private and public JWKs form
|
|
21
|
-
one pair before publishing either keys or registry state.
|
|
22
|
-
|
|
23
|
-
The Host secret generator emits one schema-conforming identity.json with mode 0600. The platform
|
|
24
|
-
runner imports it through:
|
|
25
|
-
|
|
26
|
-
astrale identity import <identity.json> --name platform-root
|
|
27
|
-
|
|
28
|
-
The imported root is the manager Kernel principal. It is never provisioned or registered as an
|
|
29
|
-
application identity. The manager bookmark uses the non-reserved alias platform-manager, pins the
|
|
30
|
-
manager issuer, and selects platform-root as its default identity. Manager identity is proved by the
|
|
31
|
-
authenticated public Identity.whoami syscall, not local CLI status.
|
|
32
|
-
|
|
33
|
-
Because this credential is issued by the target Kernel itself, CLI signing carries the imported
|
|
34
|
-
subject as an already-resolved identity Grant. The external-primary `{ identity: self }` form is not
|
|
35
|
-
valid for a self-issued Kernel bearer and cannot be substituted at this boundary.
|
|
36
|
-
|
|
37
|
-
Child creation is the public receiver call
|
|
38
|
-
/:host.astrale.ai:core.manager::createInstance. Once its Operation and Instance status report a
|
|
39
|
-
ready route and issuer, the canonical child credential is minted at the manager:
|
|
40
|
-
|
|
41
|
-
astrale token -i platform-manager --for platform-root --audience <child-issuer> --raw
|
|
42
|
-
|
|
43
|
-
That token is a manager-to-child Management carrier. Its outer JWT subject names the manager
|
|
44
|
-
principal; child Runtime maps it to the child Kernel principal. Child calls therefore keep the token
|
|
45
|
-
as --creds, and @self resolves through the child's authenticated Identity.whoami. The child bookmark
|
|
46
|
-
pins the child issuer and carries no --as platform-root default.
|
|
47
|
-
|
|
48
|
-
## Consequences
|
|
49
|
-
|
|
50
|
-
- Bootstrap crosses one explicit file contract and one supported CLI command; no CLI state file is
|
|
51
|
-
fabricated.
|
|
52
|
-
- Direct manager signing and child Management delegation remain distinct.
|
|
53
|
-
- No consumer may infer the effective principal from an unverified JWT subject or cached
|
|
54
|
-
registration.
|
|
55
|
-
- The portable schema is structural and versioned; cryptographic pair proof remains CLI admission.
|
|
56
|
-
- A future encrypted Host-to-CLI bootstrap format requires a new explicit deployment decision. CLI's
|
|
57
|
-
interactive compact-JWE export remains an operator transfer representation, not Host output.
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# Domain-mediated Identity registration
|
|
2
|
-
|
|
3
|
-
Status: resolved
|
|
4
|
-
Impact: high
|
|
5
|
-
Selection: explicit-authority-owner-callable
|
|
6
|
-
|
|
7
|
-
## Context
|
|
8
|
-
|
|
9
|
-
`identity register` prepares an atomic graph Node and self-proven Identity designation. Submitting
|
|
10
|
-
that request directly to Kernel Auth is correct only when the authenticated caller already holds
|
|
11
|
-
creation authority for the chosen Class. A child Kernel management principal does not thereby own
|
|
12
|
-
an installed application Domain's `Operator` Class, and production correctly denied that attempted
|
|
13
|
-
authority substitution.
|
|
14
|
-
|
|
15
|
-
The CLI must still own local key proof and target-bound registration state. Manufacturing CLI state,
|
|
16
|
-
handing application credentials to the operator, or weakening mutation authorization would cross
|
|
17
|
-
the wrong boundary.
|
|
18
|
-
|
|
19
|
-
## Decision
|
|
20
|
-
|
|
21
|
-
Registration retains direct Auth submission as its default. `--via <callablePath>` selects a second,
|
|
22
|
-
explicit submission boundary: after constructing the exact same Provision request and fingerprint-
|
|
23
|
-
bound self proof, CLI invokes the named Domain callable through the normal Host route. That callable
|
|
24
|
-
owns admission and may exercise its Domain authority to submit the request to Kernel Auth.
|
|
25
|
-
|
|
26
|
-
CLI treats the callable response as untrusted. It admits the prepared binding's issuer, subject, and
|
|
27
|
-
optional created Node ID, then stores only the target-keyed issuer and subject. It never accepts or
|
|
28
|
-
persists application authority, and it never exposes the self proof in argv or output.
|
|
29
|
-
|
|
30
|
-
## Consequences
|
|
31
|
-
|
|
32
|
-
- Kernel mutation non-amplification remains unchanged.
|
|
33
|
-
- A Domain that offers registration must declare and authorize a Provision-shaped callable.
|
|
34
|
-
- The option is explicit because choosing the authority owner is security-significant.
|
|
35
|
-
- Direct registration remains useful for Classes the selected caller genuinely owns.
|
|
36
|
-
- A failed callable or malformed response leaves CLI registration state unchanged.
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import type { ProvisionRequest } from '@astrale-os/sdk/auth'
|
|
2
|
-
import type { Call } from '@astrale-os/sdk/client'
|
|
3
|
-
import type { LocalBinding } from '@astrale-os/sdk/graph'
|
|
4
|
-
import type { JWK } from 'jose'
|
|
5
|
-
|
|
6
|
-
import type {
|
|
7
|
-
Identity,
|
|
8
|
-
IdentityMode,
|
|
9
|
-
IdentityStore,
|
|
10
|
-
IdentityStoreOptions,
|
|
11
|
-
Registration,
|
|
12
|
-
} from '../../state/.spec/api.js'
|
|
13
|
-
|
|
14
|
-
export type { Identity, IdentityStore, Registration } from '../../state/.spec/api.js'
|
|
15
|
-
|
|
16
|
-
/** Filesystem coordinates used only by explicit identity transfer operations. */
|
|
17
|
-
export interface IdentityFileOptions {
|
|
18
|
-
readonly state?: IdentityStoreOptions
|
|
19
|
-
readonly keysDir?: string
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/** Canonical V1 key-identity transfer envelope. */
|
|
23
|
-
export interface IdentityExport {
|
|
24
|
-
readonly version: 1
|
|
25
|
-
readonly subject: string
|
|
26
|
-
readonly mode: IdentityMode
|
|
27
|
-
readonly kid?: string
|
|
28
|
-
readonly issuer?: string
|
|
29
|
-
readonly privateJwk: JWK
|
|
30
|
-
readonly publicJwk: JWK
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface IdentityImportOptions extends IdentityFileOptions {
|
|
34
|
-
readonly name?: string
|
|
35
|
-
readonly issuer?: string
|
|
36
|
-
readonly replace?: boolean
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface IdentityRegistrationResult {
|
|
40
|
-
readonly iss: string
|
|
41
|
-
readonly sub: string
|
|
42
|
-
readonly nodeId?: string
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export interface IdentityProvisionSubmission {
|
|
46
|
-
readonly request: ProvisionRequest
|
|
47
|
-
readonly binding: LocalBinding
|
|
48
|
-
readonly via?: string
|
|
49
|
-
readonly direct: {
|
|
50
|
-
provision(request: ProvisionRequest): Promise<unknown>
|
|
51
|
-
}
|
|
52
|
-
readonly callable: {
|
|
53
|
-
call(call: Call): Promise<unknown>
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** Submit one prepared request either directly or through its explicit Domain authority owner. */
|
|
58
|
-
export function submitIdentityProvision(
|
|
59
|
-
input: IdentityProvisionSubmission,
|
|
60
|
-
): Promise<IdentityRegistrationResult>
|
|
61
|
-
|
|
62
|
-
/** Admit only the exact binding the CLI prepared; remote callables remain untrusted input. */
|
|
63
|
-
export function acceptProvisionedIdentity(
|
|
64
|
-
value: unknown,
|
|
65
|
-
binding: LocalBinding,
|
|
66
|
-
): IdentityRegistrationResult
|
|
67
|
-
|
|
68
|
-
export function readIdentities(): Promise<IdentityStore>
|
|
69
|
-
|
|
70
|
-
export function createIdentity(
|
|
71
|
-
name: string,
|
|
72
|
-
options?: {
|
|
73
|
-
readonly subject?: string
|
|
74
|
-
readonly mode?: IdentityMode
|
|
75
|
-
readonly issuer?: string
|
|
76
|
-
readonly kid?: string
|
|
77
|
-
},
|
|
78
|
-
): Promise<Identity>
|
|
79
|
-
|
|
80
|
-
export function deleteIdentity(name: string): Promise<void>
|
|
81
|
-
export function setDefault(name: string): Promise<void>
|
|
82
|
-
export function getDefault(): Promise<Identity & { readonly name: string }>
|
|
83
|
-
export function getIdentity(name: string): Promise<Identity>
|
|
84
|
-
|
|
85
|
-
export function upsertIdpIdentity(
|
|
86
|
-
name: string,
|
|
87
|
-
options: {
|
|
88
|
-
readonly subject: string
|
|
89
|
-
readonly idp: string
|
|
90
|
-
readonly issuer: string
|
|
91
|
-
readonly audience?: string
|
|
92
|
-
readonly claims?: Readonly<Record<string, unknown>>
|
|
93
|
-
readonly use?: boolean
|
|
94
|
-
},
|
|
95
|
-
): Promise<Identity>
|
|
96
|
-
|
|
97
|
-
export function setRegistration(
|
|
98
|
-
name: string,
|
|
99
|
-
instanceSlug: string,
|
|
100
|
-
registration: Registration,
|
|
101
|
-
): Promise<void>
|
|
102
|
-
|
|
103
|
-
export function setIdentityMode(name: string, mode: IdentityMode): Promise<void>
|
|
104
|
-
|
|
105
|
-
/** Detect the retained compact-JWE representation without decoding it. */
|
|
106
|
-
export function isEncryptedIdentityExport(raw: string): boolean
|
|
107
|
-
|
|
108
|
-
/** Decode legacy plaintext, V1 plaintext, or compact-JWE content into one admitted V1 envelope. */
|
|
109
|
-
export function decodeIdentityExport(raw: string, passphrase?: string): Promise<IdentityExport>
|
|
110
|
-
|
|
111
|
-
/** Encode one admitted envelope as plaintext JSON or compact JWE. */
|
|
112
|
-
export function encodeIdentityExport(envelope: IdentityExport, passphrase?: string): Promise<string>
|
|
113
|
-
|
|
114
|
-
/** Read and prove one key-backed identity's transferable envelope. */
|
|
115
|
-
export function exportIdentity(name: string, options?: IdentityFileOptions): Promise<IdentityExport>
|
|
116
|
-
|
|
117
|
-
/** Import one admitted envelope after checking registry conflicts but before publishing registry state. */
|
|
118
|
-
export function importIdentity(
|
|
119
|
-
envelope: IdentityExport,
|
|
120
|
-
options?: IdentityImportOptions,
|
|
121
|
-
): Promise<Identity>
|
|
122
|
-
|
|
123
|
-
/** Atomically publish one explicit private export file with mode 0600. */
|
|
124
|
-
export function writeIdentityExport(path: string, content: string): Promise<void>
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# CLI identity ownership
|
|
2
|
-
|
|
3
|
-
Identity owns local identity selection and the coordination between the State registry, per-subject
|
|
4
|
-
Keys, and IdP sessions. State owns durable registry decoding and locking; Keys owns JWK admission,
|
|
5
|
-
pair proof, and private files. Commands own prompts and presentation, not persistence mechanics.
|
|
6
|
-
|
|
7
|
-
Identity transfer accepts the retained unversioned plaintext envelope and the current V1 plaintext
|
|
8
|
-
or compact-JWE representation. Admission completes before mutation. Import checks the registry under
|
|
9
|
-
its file lock, persists the admitted keypair, and only then publishes the identity entry. Export
|
|
10
|
-
proves the stored pair and atomically writes one mode-`0600` user-selected file.
|
|
11
|
-
|
|
12
|
-
The canonical plaintext V1 structure is independently published as
|
|
13
|
-
`https://schemas.astrale.ai/cli/identity-export/1`. A production Host may emit that envelope as its
|
|
14
|
-
bootstrap root secret, but CLI Identity remains the format owner and cryptographically proves the
|
|
15
|
-
pair on import. The governing bootstrap flow imports the root as `platform-root`, authenticates it
|
|
16
|
-
directly to the `platform-manager` Kernel, and reaches a child only through a manager-minted
|
|
17
|
-
child-audience Management carrier. The carrier's outer subject is not the child's effective
|
|
18
|
-
principal; authenticated child `Identity.whoami` owns that projection.
|
|
19
|
-
|
|
20
|
-
Identity registration always prepares one self-proven atomic Provision request. Direct registration
|
|
21
|
-
submits it to Kernel Auth only when the selected caller already owns the target Class authority. An
|
|
22
|
-
explicit `--via <callable>` instead sends those exact bytes through the Domain that owns an
|
|
23
|
-
application Identity Class. The Domain callable owns admission and effect authority; CLI admits only
|
|
24
|
-
the prepared binding from the response before persisting its target-bound `(issuer, subject)`.
|
|
25
|
-
|
|
26
|
-
```mermaid
|
|
27
|
-
flowchart LR
|
|
28
|
-
C[identity command] --> D[decode or encode transfer]
|
|
29
|
-
D --> I[Identity orchestration]
|
|
30
|
-
I --> S[State registry lock]
|
|
31
|
-
I --> K[Keys pair proof and files]
|
|
32
|
-
S --> F[identities.json]
|
|
33
|
-
```
|