@astrale-os/cli 1.0.0-beta.8 → 1.0.0-npm-deprecated.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -166
- package/package.json +10 -102
- package/.check-workspace.cjs +0 -40
- package/LICENSE +0 -202
- package/THIRD-PARTY-NOTICES.md +0 -27
- package/dist/astrale.js +0 -93172
- package/dist/public/connect-core.js +0 -29187
- package/dist/public/keys/index.js +0 -5651
- package/dist/public/paths/index.js +0 -4282
- package/dist/types/admin/instance/model.d.ts +0 -39
- package/dist/types/connect-core.d.ts +0 -22
- package/dist/types/connection/auth.d.ts +0 -36
- package/dist/types/errors.d.ts +0 -23
- package/dist/types/identity/registry.d.ts +0 -25
- package/dist/types/keys/algorithm.d.ts +0 -6
- package/dist/types/keys/credential.d.ts +0 -21
- package/dist/types/keys/index.d.ts +0 -4
- package/dist/types/keys/pair.d.ts +0 -34
- package/dist/types/lib/admin-target.d.ts +0 -78
- package/dist/types/lib/ca-fetch.d.ts +0 -2
- package/dist/types/lib/config.d.ts +0 -71
- package/dist/types/lib/failure-debug.d.ts +0 -1
- package/dist/types/lib/format.d.ts +0 -1
- package/dist/types/lib/idp-session.d.ts +0 -33
- package/dist/types/lib/idp.d.ts +0 -404
- package/dist/types/lib/instance-target.d.ts +0 -38
- package/dist/types/lib/instance.d.ts +0 -196
- package/dist/types/lib/invocation.d.ts +0 -3
- package/dist/types/lib/log.d.ts +0 -33
- package/dist/types/lib/login-flow.d.ts +0 -49
- package/dist/types/lib/meta.d.ts +0 -36
- package/dist/types/lib/output.d.ts +0 -87
- package/dist/types/lib/proc.d.ts +0 -43
- package/dist/types/lib/table.d.ts +0 -18
- package/dist/types/lib/update.d.ts +0 -131
- package/dist/types/lib/validation.d.ts +0 -11
- package/dist/types/paths/index.d.ts +0 -2
- package/dist/types/state/exchange-credentials.d.ts +0 -25
- package/dist/types/state/files.d.ts +0 -9
- package/dist/types/state/identities.d.ts +0 -42
- package/dist/types/state/index.d.ts +0 -8
- package/dist/types/state/paths.d.ts +0 -32
- package/src/__tests__/fixtures/publication.ts +0 -20
- package/src/admin/.spec/api.d.ts +0 -3
- package/src/admin/.spec/architecture.md +0 -15
- package/src/admin/.spec/icon.svg +0 -3
- package/src/admin/.spec/layout.ts +0 -6
- package/src/admin/__tests__/binding.test.ts +0 -31
- package/src/admin/__tests__/fixture.ts +0 -101
- package/src/admin/binding.ts +0 -98
- package/src/admin/catalog/.spec/api.d.ts +0 -65
- package/src/admin/catalog/.spec/architecture.md +0 -6
- package/src/admin/catalog/.spec/icon.svg +0 -3
- package/src/admin/catalog/.spec/layout.ts +0 -6
- package/src/admin/catalog/__tests__/client.test.ts +0 -142
- package/src/admin/catalog/client.ts +0 -218
- package/src/admin/catalog/index.ts +0 -13
- package/src/admin/catalog/model.ts +0 -41
- package/src/admin/catalog/tsconfig.json +0 -8
- package/src/admin/graph/.spec/api.d.ts +0 -22
- package/src/admin/graph/.spec/architecture.md +0 -5
- package/src/admin/graph/.spec/icon.svg +0 -3
- package/src/admin/graph/.spec/layout.ts +0 -3
- package/src/admin/graph/index.ts +0 -6
- package/src/admin/graph/nodes.ts +0 -56
- package/src/admin/index.ts +0 -2
- package/src/admin/instance/.spec/api.d.ts +0 -66
- package/src/admin/instance/.spec/architecture.md +0 -10
- package/src/admin/instance/.spec/icon.svg +0 -3
- package/src/admin/instance/.spec/layout.ts +0 -6
- package/src/admin/instance/__tests__/client.test.ts +0 -266
- package/src/admin/instance/client.ts +0 -290
- package/src/admin/instance/index.ts +0 -16
- package/src/admin/instance/model.ts +0 -66
- package/src/admin/instance/tsconfig.json +0 -8
- package/src/commands/__tests__/admin-instance.test.ts +0 -88
- package/src/commands/__tests__/auth-login.test.ts +0 -231
- package/src/commands/__tests__/auth-token.test.ts +0 -223
- package/src/commands/__tests__/call-describe.test.ts +0 -80
- package/src/commands/__tests__/call.test.ts +0 -29
- package/src/commands/__tests__/domain-install-operation.test.ts +0 -126
- package/src/commands/__tests__/domain-install-owned.test.ts +0 -191
- package/src/commands/__tests__/domain-list.test.ts +0 -133
- package/src/commands/__tests__/domain-uninstall.test.ts +0 -53
- package/src/commands/__tests__/install-direct.test.ts +0 -21
- package/src/commands/__tests__/install-identity-override.test.ts +0 -76
- package/src/commands/__tests__/instance-bookmark.test.ts +0 -166
- package/src/commands/__tests__/instance-create-hosts.test.ts +0 -29
- package/src/commands/__tests__/instance-list-admin.test.ts +0 -26
- package/src/commands/__tests__/instance-list-rows.test.ts +0 -64
- package/src/commands/__tests__/instance-use.test.ts +0 -67
- package/src/commands/__tests__/introspect-parse.test.ts +0 -21
- package/src/commands/__tests__/logs.test.ts +0 -97
- package/src/commands/__tests__/read-commands.test.ts +0 -294
- package/src/commands/__tests__/setup-plan.test.ts +0 -61
- package/src/commands/__tests__/studio-descriptor.test.ts +0 -22
- package/src/commands/__tests__/token-ttl.test.ts +0 -21
- package/src/commands/__tests__/update.test.ts +0 -95
- package/src/commands/__tests__/view-build.test.ts +0 -58
- package/src/commands/__tests__/view.test.ts +0 -149
- package/src/commands/admin/status.ts +0 -61
- package/src/commands/admin/use.ts +0 -100
- package/src/commands/auth/login.ts +0 -82
- package/src/commands/auth/logout.ts +0 -52
- package/src/commands/auth/status.ts +0 -86
- package/src/commands/auth/token.ts +0 -174
- package/src/commands/browser.ts +0 -207
- package/src/commands/call-describe.ts +0 -123
- package/src/commands/call.ts +0 -205
- package/src/commands/domain/install.ts +0 -548
- package/src/commands/domain/list.ts +0 -155
- package/src/commands/domain/publish.ts +0 -133
- package/src/commands/domain/uninstall.ts +0 -128
- package/src/commands/get.ts +0 -69
- package/src/commands/identity/__tests__/register.test.ts +0 -93
- package/src/commands/identity/create.ts +0 -35
- package/src/commands/identity/delete.ts +0 -24
- package/src/commands/identity/export.ts +0 -46
- package/src/commands/identity/import.ts +0 -61
- package/src/commands/identity/list.ts +0 -56
- package/src/commands/identity/register.ts +0 -196
- package/src/commands/identity/sync.ts +0 -38
- package/src/commands/identity/unsync.ts +0 -34
- package/src/commands/identity/use.ts +0 -24
- package/src/commands/identity/whoami.ts +0 -34
- package/src/commands/idp/add.ts +0 -150
- package/src/commands/idp/list.ts +0 -57
- package/src/commands/idp/refresh.ts +0 -38
- package/src/commands/idp/remove.ts +0 -36
- package/src/commands/idp/show.ts +0 -29
- package/src/commands/instance/active.ts +0 -73
- package/src/commands/instance/bookmark.ts +0 -101
- package/src/commands/instance/create.ts +0 -69
- package/src/commands/instance/delete.ts +0 -68
- package/src/commands/instance/forget.ts +0 -26
- package/src/commands/instance/list.ts +0 -197
- package/src/commands/instance/status.ts +0 -38
- package/src/commands/instance/use.ts +0 -259
- package/src/commands/introspect.ts +0 -110
- package/src/commands/logs.ts +0 -283
- package/src/commands/mutate.ts +0 -122
- package/src/commands/query.ts +0 -136
- package/src/commands/session/analyze.ts +0 -50
- package/src/commands/session/list.ts +0 -36
- package/src/commands/setup.ts +0 -54
- package/src/commands/status.ts +0 -60
- package/src/commands/studio.ts +0 -434
- package/src/commands/token.ts +0 -107
- package/src/commands/update.ts +0 -334
- package/src/commands/use.ts +0 -86
- package/src/commands/view-serve.ts +0 -26
- package/src/commands/view.ts +0 -614
- package/src/connect-core.test.ts +0 -38
- package/src/connect-core.ts +0 -42
- package/src/connection/.spec/api.d.ts +0 -110
- package/src/connection/.spec/architecture.md +0 -47
- package/src/connection/.spec/capabilities/connection.ts +0 -13
- package/src/connection/.spec/examples/call.ts +0 -7
- package/src/connection/.spec/flows/command.ts +0 -20
- package/src/connection/.spec/flows/session.ts +0 -61
- package/src/connection/.spec/laws/connection.ts +0 -205
- package/src/connection/.spec/layout.ts +0 -21
- package/src/connection/__tests__/auth.test.ts +0 -128
- package/src/connection/__tests__/ca-fetch.test.ts +0 -60
- package/src/connection/__tests__/call.test.ts +0 -17
- package/src/connection/__tests__/credential.test.ts +0 -119
- package/src/connection/__tests__/errors.test.ts +0 -577
- package/src/connection/__tests__/exchange.test.ts +0 -295
- package/src/connection/__tests__/failure-fixtures.ts +0 -39
- package/src/connection/__tests__/failure-safety.test.ts +0 -75
- package/src/connection/__tests__/fixtures/localhost-cert.pem +0 -19
- package/src/connection/__tests__/fixtures/localhost-key.base64 +0 -1
- package/src/connection/__tests__/managed.test.ts +0 -39
- package/src/connection/__tests__/reasons.test.ts +0 -78
- package/src/connection/__tests__/self.test.ts +0 -71
- package/src/connection/__tests__/session.test.ts +0 -140
- package/src/connection/__tests__/target.test.ts +0 -93
- package/src/connection/auth.ts +0 -236
- package/src/connection/call.ts +0 -7
- package/src/connection/command.ts +0 -67
- package/src/connection/credential.ts +0 -117
- package/src/connection/errors.ts +0 -1
- package/src/connection/exchange.ts +0 -311
- package/src/connection/failure/classify.ts +0 -110
- package/src/connection/failure/index.ts +0 -18
- package/src/connection/failure/model.ts +0 -28
- package/src/connection/failure/render.ts +0 -116
- package/src/connection/index.ts +0 -8
- package/src/connection/reasons.ts +0 -209
- package/src/connection/self.ts +0 -138
- package/src/connection/session.ts +0 -185
- package/src/connection/target.ts +0 -112
- package/src/connection/tsconfig.json +0 -6
- package/src/errors.ts +0 -66
- package/src/graph/.spec/api.d.ts +0 -41
- package/src/graph/.spec/laws/documents.ts +0 -24
- package/src/graph/.spec/laws/projection.ts +0 -13
- package/src/graph/.spec/layout.ts +0 -14
- package/src/graph/__tests__/mutation.test.ts +0 -51
- package/src/graph/__tests__/projection.test.ts +0 -22
- package/src/graph/__tests__/query.test.ts +0 -173
- package/src/graph/class.ts +0 -30
- package/src/graph/index.ts +0 -4
- package/src/graph/mutation.ts +0 -46
- package/src/graph/projection.ts +0 -21
- package/src/graph/query.ts +0 -97
- package/src/graph/tsconfig.json +0 -6
- package/src/identity/.history/ard/bootstrap-root-transfer.md +0 -57
- package/src/identity/.history/ard/domain-mediated-registration.md +0 -36
- package/src/identity/.spec/api.d.ts +0 -124
- package/src/identity/.spec/architecture.md +0 -33
- package/src/identity/.spec/capabilities/identity.ts +0 -7
- package/src/identity/.spec/flows/bootstrap-root.ts +0 -79
- package/src/identity/.spec/flows/domain-mediated-registration.ts +0 -51
- package/src/identity/.spec/flows/import.ts +0 -29
- package/src/identity/.spec/laws/identity.ts +0 -56
- package/src/identity/.spec/layout.ts +0 -13
- package/src/identity/.spec/schemas/identity-export-v1.schema.json +0 -25
- package/src/identity/__tests__/fixtures/registry-journey.ts +0 -53
- package/src/identity/__tests__/registration.test.ts +0 -64
- package/src/identity/__tests__/registry.test.ts +0 -70
- package/src/identity/__tests__/transfer.test.ts +0 -198
- package/src/identity/index.ts +0 -23
- package/src/identity/registration.ts +0 -72
- package/src/identity/registry.ts +0 -179
- package/src/identity/transfer.ts +0 -187
- package/src/identity/tsconfig.json +0 -6
- package/src/index.ts +0 -1
- package/src/keys/.spec/api.d.ts +0 -74
- package/src/keys/.spec/architecture.md +0 -13
- package/src/keys/.spec/laws/keys.ts +0 -43
- package/src/keys/.spec/layout.ts +0 -6
- package/src/keys/__tests__/algorithm.test.ts +0 -39
- package/src/keys/__tests__/keys.test.ts +0 -168
- package/src/keys/algorithm.ts +0 -33
- package/src/keys/credential.ts +0 -112
- package/src/keys/index.ts +0 -14
- package/src/keys/pair.ts +0 -219
- package/src/keys/tsconfig.json +0 -6
- package/src/lib/__tests__/admin-target.test.ts +0 -184
- package/src/lib/__tests__/binary.test.ts +0 -55
- package/src/lib/__tests__/command-dx.test.ts +0 -102
- package/src/lib/__tests__/concurrency.test.ts +0 -62
- package/src/lib/__tests__/config.test.ts +0 -54
- package/src/lib/__tests__/design.test.ts +0 -99
- package/src/lib/__tests__/domain-publication.test.ts +0 -133
- package/src/lib/__tests__/format.test.ts +0 -22
- package/src/lib/__tests__/idp-session.driver.ts +0 -53
- package/src/lib/__tests__/idp-session.test.ts +0 -379
- package/src/lib/__tests__/idp.test.ts +0 -415
- package/src/lib/__tests__/instance-candidates.test.ts +0 -148
- package/src/lib/__tests__/instance-target.test.ts +0 -212
- package/src/lib/__tests__/instance.test.ts +0 -192
- package/src/lib/__tests__/local-status.test.ts +0 -202
- package/src/lib/__tests__/log-errors.test.ts +0 -64
- package/src/lib/__tests__/log.test.ts +0 -31
- package/src/lib/__tests__/meta.test.ts +0 -55
- package/src/lib/__tests__/output.test.ts +0 -162
- package/src/lib/__tests__/panel.test.ts +0 -40
- package/src/lib/__tests__/port.test.ts +0 -44
- package/src/lib/__tests__/prompt.test.ts +0 -25
- package/src/lib/__tests__/sdk-deps.test.ts +0 -68
- package/src/lib/__tests__/self.test.ts +0 -50
- package/src/lib/__tests__/studio-server-deps.test.ts +0 -111
- package/src/lib/__tests__/table.test.ts +0 -53
- package/src/lib/__tests__/update.test.ts +0 -351
- package/src/lib/__tests__/use-target.test.ts +0 -56
- package/src/lib/__tests__/validation.test.ts +0 -34
- package/src/lib/__tests__/view-assets.test.ts +0 -146
- package/src/lib/__tests__/view-open-intent.test.ts +0 -280
- package/src/lib/__tests__/view-port-allocation.test.ts +0 -82
- package/src/lib/__tests__/view-server.test.ts +0 -68
- package/src/lib/__tests__/view-session.test.ts +0 -99
- package/src/lib/__tests__/view-snapshot.test.ts +0 -77
- package/src/lib/admin-domain.ts +0 -43
- package/src/lib/admin-instance.ts +0 -50
- package/src/lib/admin-target.ts +0 -290
- package/src/lib/binary.ts +0 -110
- package/src/lib/browser.ts +0 -150
- package/src/lib/ca-fetch.ts +0 -133
- package/src/lib/command-dx.ts +0 -188
- package/src/lib/concurrency.ts +0 -31
- package/src/lib/config.ts +0 -46
- package/src/lib/domain-publication.ts +0 -102
- package/src/lib/failure-debug.ts +0 -26
- package/src/lib/format.ts +0 -4
- package/src/lib/idp-session.ts +0 -134
- package/src/lib/idp.ts +0 -906
- package/src/lib/instance-candidates.ts +0 -49
- package/src/lib/instance-target.ts +0 -197
- package/src/lib/instance.ts +0 -463
- package/src/lib/invocation.ts +0 -11
- package/src/lib/local-status.ts +0 -152
- package/src/lib/log.ts +0 -143
- package/src/lib/login-flow.ts +0 -201
- package/src/lib/meta.ts +0 -90
- package/src/lib/output.ts +0 -238
- package/src/lib/panel.ts +0 -61
- package/src/lib/port.ts +0 -41
- package/src/lib/proc.ts +0 -82
- package/src/lib/prompt.ts +0 -136
- package/src/lib/provision-instance.ts +0 -162
- package/src/lib/sdk-deps.ts +0 -104
- package/src/lib/self.ts +0 -22
- package/src/lib/skills.ts +0 -171
- package/src/lib/table.ts +0 -62
- package/src/lib/update.ts +0 -409
- package/src/lib/use-target.ts +0 -24
- package/src/lib/validation.ts +0 -59
- package/src/lib/view/assets.ts +0 -78
- package/src/lib/view/open-intent.ts +0 -67
- package/src/lib/view/port-allocation.ts +0 -19
- package/src/lib/view/resolve.ts +0 -111
- package/src/lib/view/server.ts +0 -244
- package/src/lib/view/session.ts +0 -152
- package/src/lib/view/snapshot.ts +0 -101
- package/src/paths/.spec/api.d.ts +0 -13
- package/src/paths/.spec/architecture.md +0 -5
- package/src/paths/.spec/layout.ts +0 -3
- package/src/paths/index.ts +0 -13
- package/src/program/.spec/api.d.ts +0 -42
- package/src/program/.spec/architecture.md +0 -18
- package/src/program/.spec/laws/program.ts +0 -29
- package/src/program/.spec/layout.ts +0 -14
- package/src/program/__tests__/program.test.ts +0 -362
- package/src/program/build.ts +0 -183
- package/src/program/command.ts +0 -42
- package/src/program/index.ts +0 -2
- package/src/program/options.ts +0 -41
- package/src/program/registry.ts +0 -63
- package/src/program/tsconfig.json +0 -6
- package/src/setup/__tests__/instance-step.test.ts +0 -239
- 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 -199
- package/src/setup/steps/skills-bridge.ts +0 -70
- package/src/setup/steps/skills.ts +0 -59
- package/src/setup/types.ts +0 -61
- package/src/setup/util.ts +0 -34
- package/src/state/.spec/api.d.ts +0 -133
- package/src/state/.spec/architecture.md +0 -31
- package/src/state/.spec/capabilities/state.ts +0 -7
- package/src/state/.spec/flows/identity-update.ts +0 -22
- package/src/state/.spec/laws/state.ts +0 -73
- package/src/state/.spec/layout.ts +0 -14
- package/src/state/__tests__/exchange-credentials.test.ts +0 -188
- package/src/state/__tests__/files.test.ts +0 -113
- package/src/state/__tests__/fixtures/identity-transition.ts +0 -37
- package/src/state/__tests__/identities.test.ts +0 -142
- package/src/state/__tests__/paths.test.ts +0 -27
- package/src/state/exchange-credentials.ts +0 -219
- package/src/state/files.ts +0 -129
- package/src/state/identities.ts +0 -229
- package/src/state/index.ts +0 -29
- package/src/state/paths.ts +0 -61
- package/src/state/tsconfig.json +0 -6
- package/src/telemetry/__tests__/gate.test.ts +0 -63
- package/src/telemetry/__tests__/recorder.test.ts +0 -110
- package/src/telemetry/__tests__/redact.test.ts +0 -79
- package/src/telemetry/__tests__/session.test.ts +0 -166
- package/src/telemetry/__tests__/trigger.test.ts +0 -49
- package/src/telemetry/adapters/__tests__/claude-code.test.ts +0 -89
- package/src/telemetry/adapters/__tests__/codex.test.ts +0 -138
- package/src/telemetry/adapters/__tests__/index.test.ts +0 -88
- package/src/telemetry/adapters/claude-code.ts +0 -90
- package/src/telemetry/adapters/codex.ts +0 -160
- package/src/telemetry/adapters/index.ts +0 -45
- package/src/telemetry/adapters/types.ts +0 -21
- package/src/telemetry/analyze.ts +0 -227
- package/src/telemetry/gate.ts +0 -79
- package/src/telemetry/recorder.ts +0 -57
- package/src/telemetry/redact.ts +0 -53
- package/src/telemetry/session.ts +0 -88
- package/src/telemetry/settings.ts +0 -26
- package/src/telemetry/store.ts +0 -91
- package/src/telemetry/trigger.ts +0 -119
- package/src/telemetry/types.ts +0 -64
- package/src/test-utils.ts +0 -18
- package/studio/client/dist/assets/elk-api-Di4OXGNH.js +0 -1
- package/studio/client/dist/assets/elk-worker.min-C9JGDOE-.js +0 -6312
- package/studio/client/dist/assets/index-BLm6J11H.js +0 -81
- package/studio/client/dist/assets/index-BiGR8Oo9.css +0 -1
- package/studio/client/dist/assets/index-ChOr3yP0.css +0 -1
- package/studio/client/dist/assets/index-DTjvkOUX.js +0 -8
- package/studio/client/dist/index.html +0 -13
- package/studio/package.json +0 -65
- package/studio/server/agent/ask.test.ts +0 -74
- package/studio/server/agent/ask.ts +0 -71
- package/studio/server/agent/bridge/client.test.ts +0 -49
- package/studio/server/agent/bridge/client.ts +0 -37
- package/studio/server/agent/bridge/grant.test.ts +0 -62
- package/studio/server/agent/bridge/grant.ts +0 -84
- package/studio/server/agent/bridge/routes.test.ts +0 -151
- package/studio/server/agent/bridge/routes.ts +0 -148
- package/studio/server/agent/bridge/stdio.ts +0 -195
- package/studio/server/agent/conversation.test.ts +0 -89
- package/studio/server/agent/conversation.ts +0 -158
- package/studio/server/agent/harness/adapter.ts +0 -171
- package/studio/server/agent/harness/claude/adapter.test.ts +0 -348
- package/studio/server/agent/harness/claude/adapter.ts +0 -71
- package/studio/server/agent/harness/claude/ask.ts +0 -114
- package/studio/server/agent/harness/claude/capabilities.ts +0 -27
- package/studio/server/agent/harness/claude/command.ts +0 -63
- package/studio/server/agent/harness/claude/events.ts +0 -215
- package/studio/server/agent/harness/claude/loadout.ts +0 -132
- package/studio/server/agent/harness/claude/mcp.test.ts +0 -36
- package/studio/server/agent/harness/claude/mcp.ts +0 -41
- package/studio/server/agent/harness/claude/skills.ts +0 -43
- package/studio/server/agent/harness/codex/adapter.test.ts +0 -269
- package/studio/server/agent/harness/codex/adapter.ts +0 -116
- package/studio/server/agent/harness/codex/ask.test.ts +0 -176
- package/studio/server/agent/harness/codex/ask.ts +0 -181
- package/studio/server/agent/harness/codex/command.test.ts +0 -69
- package/studio/server/agent/harness/codex/command.ts +0 -43
- package/studio/server/agent/harness/codex/events.test.ts +0 -94
- package/studio/server/agent/harness/codex/events.ts +0 -132
- package/studio/server/agent/harness/codex/exec.ts +0 -113
- package/studio/server/agent/harness/codex/loadout.ts +0 -60
- package/studio/server/agent/harness/codex/mcp.test.ts +0 -32
- package/studio/server/agent/harness/codex/mcp.ts +0 -27
- package/studio/server/agent/harness/codex/models.test.ts +0 -167
- package/studio/server/agent/harness/codex/models.ts +0 -211
- package/studio/server/agent/harness/codex/skills.ts +0 -33
- package/studio/server/agent/harness/gateway/config.test.ts +0 -98
- package/studio/server/agent/harness/gateway/config.ts +0 -214
- package/studio/server/agent/harness/gateway/token.test.ts +0 -133
- package/studio/server/agent/harness/gateway/token.ts +0 -166
- package/studio/server/agent/harness/mock/adapter.ts +0 -190
- package/studio/server/agent/harness/mock/domain-edit.ts +0 -41
- package/studio/server/agent/harness/process.test.ts +0 -46
- package/studio/server/agent/harness/process.ts +0 -104
- package/studio/server/agent/harness/registry.ts +0 -37
- package/studio/server/agent/harness/selection.test.ts +0 -75
- package/studio/server/agent/harness/selection.ts +0 -85
- package/studio/server/agent/harness/skills.test.ts +0 -95
- package/studio/server/agent/harness/skills.ts +0 -100
- package/studio/server/agent/layout.test.ts +0 -95
- package/studio/server/agent/notify.ts +0 -12
- package/studio/server/agent/prompts/anchors.test.ts +0 -70
- package/studio/server/agent/prompts/anchors.ts +0 -153
- package/studio/server/agent/prompts/ask.ts +0 -34
- package/studio/server/agent/prompts/system.test.ts +0 -13
- package/studio/server/agent/prompts/system.ts +0 -99
- package/studio/server/agent/prompts/turn.ts +0 -66
- package/studio/server/agent/routes.test.ts +0 -176
- package/studio/server/agent/routes.ts +0 -214
- package/studio/server/agent/run/completion.ts +0 -193
- package/studio/server/agent/run/coordinator.test.ts +0 -337
- package/studio/server/agent/run/coordinator.ts +0 -104
- package/studio/server/agent/run/live-state.ts +0 -73
- package/studio/server/agent/run/preparation.ts +0 -163
- package/studio/server/agent/run/transcript.test.ts +0 -81
- package/studio/server/agent/run/transcript.ts +0 -196
- package/studio/server/agent/run/usage.test.ts +0 -70
- package/studio/server/agent/run/usage.ts +0 -62
- package/studio/server/agent/stream.ts +0 -37
- package/studio/server/agent/telemetry.ts +0 -13
- package/studio/server/api/canvas.ts +0 -43
- package/studio/server/api/comments.ts +0 -85
- package/studio/server/api/context.ts +0 -61
- package/studio/server/api/deployment.ts +0 -39
- package/studio/server/api/documents.ts +0 -55
- package/studio/server/api/domain.ts +0 -59
- package/studio/server/api/http.ts +0 -45
- package/studio/server/api/project.ts +0 -57
- package/studio/server/api/schema.ts +0 -12
- package/studio/server/api/views.ts +0 -57
- package/studio/server/api/workspace.ts +0 -60
- package/studio/server/api-agent-loadout.test.ts +0 -69
- package/studio/server/api.test.ts +0 -147
- package/studio/server/api.ts +0 -34
- package/studio/server/cache.test.ts +0 -122
- package/studio/server/cache.ts +0 -303
- package/studio/server/cli-consumers.test.ts +0 -494
- package/studio/server/cli.test.ts +0 -88
- package/studio/server/cli.ts +0 -240
- package/studio/server/client-package.test.ts +0 -147
- package/studio/server/client-package.ts +0 -266
- package/studio/server/detect.ts +0 -81
- package/studio/server/domain.test.ts +0 -77
- package/studio/server/domain.ts +0 -124
- package/studio/server/environment/dotenv-preview.test.ts +0 -39
- package/studio/server/environment/dotenv-preview.ts +0 -27
- package/studio/server/environment/files.test.ts +0 -53
- package/studio/server/environment/files.ts +0 -120
- package/studio/server/handoff/copy.ts +0 -171
- package/studio/server/handoff/service.test.ts +0 -22
- package/studio/server/handoff/service.ts +0 -62
- package/studio/server/index.ts +0 -148
- package/studio/server/instances/active.ts +0 -72
- package/studio/server/instances/deploy-record.test.ts +0 -31
- package/studio/server/instances/deploy-record.ts +0 -37
- package/studio/server/instances/deploy.ts +0 -56
- package/studio/server/instances/probe.test.ts +0 -67
- package/studio/server/instances/probe.ts +0 -67
- package/studio/server/instances/status.test.ts +0 -12
- package/studio/server/instances/status.ts +0 -49
- package/studio/server/introspect/anatomy/client-tree.ts +0 -57
- package/studio/server/introspect/anatomy/env-fields.ts +0 -66
- package/studio/server/introspect/anatomy/schema-definition.ts +0 -53
- package/studio/server/introspect/anatomy/source.ts +0 -181
- package/studio/server/introspect/anatomy/views/routes.ts +0 -114
- package/studio/server/introspect/anatomy/views.ts +0 -53
- package/studio/server/introspect/anatomy-extras.test.ts +0 -265
- package/studio/server/introspect/anatomy-extras.ts +0 -10
- package/studio/server/introspect/anatomy.test.ts +0 -41
- package/studio/server/introspect/anatomy.ts +0 -147
- package/studio/server/introspect/bundle.ts +0 -69
- package/studio/server/introspect/canonical-schema.test.ts +0 -179
- package/studio/server/introspect/canonical-schema.ts +0 -583
- package/studio/server/introspect/config-preview.test.ts +0 -32
- package/studio/server/introspect/config-preview.ts +0 -119
- package/studio/server/introspect/core-extractor.ts +0 -30
- package/studio/server/introspect/core.ts +0 -45
- package/studio/server/introspect/diff.test.ts +0 -124
- package/studio/server/introspect/diff.ts +0 -316
- package/studio/server/introspect/extractor.ts +0 -41
- package/studio/server/introspect/hash.ts +0 -24
- package/studio/server/introspect/overlay-tsmorph.test.ts +0 -146
- package/studio/server/introspect/overlay-tsmorph.ts +0 -9
- package/studio/server/introspect/overlay.test.ts +0 -44
- package/studio/server/introspect/overlay.ts +0 -40
- package/studio/server/introspect/revision.test.ts +0 -54
- package/studio/server/introspect/revision.ts +0 -49
- package/studio/server/introspect/runtime.test.ts +0 -157
- package/studio/server/introspect/runtime.ts +0 -140
- package/studio/server/introspect/schema-ir-json.test.ts +0 -70
- package/studio/server/introspect/schema-ir-json.ts +0 -151
- package/studio/server/introspect/schema-refs.test.ts +0 -55
- package/studio/server/introspect/schema-refs.ts +0 -32
- package/studio/server/introspect/source-overlay/annotations.ts +0 -14
- package/studio/server/introspect/source-overlay/handlers.ts +0 -161
- package/studio/server/introspect/source-overlay/kernel-calls.ts +0 -46
- package/studio/server/introspect/source-overlay/project.ts +0 -248
- package/studio/server/introspect/source-overlay/spans.ts +0 -330
- package/studio/server/json.ts +0 -46
- package/studio/server/lifecycle.ts +0 -42
- package/studio/server/sse.test.ts +0 -26
- package/studio/server/sse.ts +0 -60
- package/studio/server/state/baseline.test.ts +0 -267
- package/studio/server/state/baseline.ts +0 -354
- package/studio/server/state/comments.test.ts +0 -94
- package/studio/server/state/comments.ts +0 -484
- package/studio/server/state/context.ts +0 -199
- package/studio/server/state/documents.ts +0 -111
- package/studio/server/state/integrations.ts +0 -81
- package/studio/server/state/layout.test.ts +0 -34
- package/studio/server/state/layout.ts +0 -82
- package/studio/server/state/settings.test.ts +0 -78
- package/studio/server/state/settings.ts +0 -73
- package/studio/server/state/store.test.ts +0 -122
- package/studio/server/state/store.ts +0 -146
- package/studio/server/state/visibility.ts +0 -48
- package/studio/server/views/model.test.ts +0 -57
- package/studio/server/views/model.ts +0 -66
- package/studio/server/views/runtime.ts +0 -40
- package/studio/server/views/selection-repository.test.ts +0 -31
- package/studio/server/views/selection-repository.ts +0 -60
- package/studio/server/views/session.test.ts +0 -73
- package/studio/server/views/session.ts +0 -166
- package/studio/server/views/target.test.ts +0 -78
- package/studio/server/views/target.ts +0 -222
- package/studio/server/watch.test.ts +0 -36
- package/studio/server/watch.ts +0 -93
- package/studio/server/workspace/catalog.test.ts +0 -17
- package/studio/server/workspace/catalog.ts +0 -43
- package/studio/server/workspace/create.test.ts +0 -37
- package/studio/server/workspace/create.ts +0 -162
- package/studio/server/workspace/git.ts +0 -75
- package/studio/server/workspace/updates.ts +0 -83
- package/studio/server/workspace-state.ts +0 -26
- package/studio/server/workspace-watch.ts +0 -106
- package/studio/shared/agent-effort.test.ts +0 -12
- package/studio/shared/agent-effort.ts +0 -15
- package/studio/shared/agent-models.test.ts +0 -9
- package/studio/shared/agent-models.ts +0 -14
- package/studio/shared/contracts/README.md +0 -16
- package/studio/shared/contracts/agent.ts +0 -270
- package/studio/shared/contracts/runtime.ts +0 -50
- package/studio/shared/contracts/schema.ts +0 -393
- package/studio/shared/contracts/surface.test.ts +0 -317
- package/studio/shared/contracts/workspace.ts +0 -265
- package/studio/shared/layout.test.ts +0 -116
- package/studio/shared/schema/identity.test.ts +0 -34
- package/studio/shared/schema/identity.ts +0 -68
- package/studio/shared/settings-values.test.ts +0 -18
- package/studio/shared/settings-values.ts +0 -20
- package/studio/shared/types.ts +0 -14
- package/studio/tsconfig.json +0 -23
- package/tsconfig.json +0 -14
- package/viewer/dist/index.html +0 -93
- package/viewer/dist/main.js +0 -76
- package/viewer/tsconfig.json +0 -13
package/src/lib/view/resolve.ts
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import type { ResolvedView as SessionResolvedView } from '@astrale-os/sdk/client/session'
|
|
2
|
-
import type { ResolvedView } from '@astrale-os/shell'
|
|
3
|
-
|
|
4
|
-
import { Path } from '@astrale-os/sdk/graph/path'
|
|
5
|
-
|
|
6
|
-
import type { ConnectionContext } from '../../connection'
|
|
7
|
-
|
|
8
|
-
import { AstraleError } from '../../errors'
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* View + target resolution for `astrale view`. Both spec shapes funnel through
|
|
12
|
-
* the kernel's `View:resolve` syscall: a ViewPath resolves to the view node
|
|
13
|
-
* itself (its class implements UI), a target path lists the views attached to
|
|
14
|
-
* it via `view_for`.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
const VIEW_PATH_RE = /^\/:[^\s/:@]+:view\.[a-z][a-z0-9-]*$/
|
|
18
|
-
|
|
19
|
-
export type ViewSpec = { kind: 'view' | 'target'; path: string }
|
|
20
|
-
|
|
21
|
-
export function parseViewSpec(spec: string): ViewSpec {
|
|
22
|
-
if (VIEW_PATH_RE.test(spec)) return { kind: 'view', path: spec }
|
|
23
|
-
if (spec.startsWith('/') || spec.startsWith('@')) return { kind: 'target', path: spec }
|
|
24
|
-
throw new AstraleError(
|
|
25
|
-
'INVALID_ARGUMENT',
|
|
26
|
-
`"${spec}" is neither a ViewPath (/:origin:view.slug) nor a node path (/… or @id)`,
|
|
27
|
-
)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** The owning Domain principal used when an explicit ViewPath has no target override. */
|
|
31
|
-
export function viewOwnerTarget(viewPath: string): string {
|
|
32
|
-
const parsed = Path.parse(viewPath)
|
|
33
|
-
if (parsed.ast.anchor.kind !== 'domain') {
|
|
34
|
-
throw new AstraleError('INVALID_ARGUMENT', `ViewPath has no Domain owner: ${viewPath}`)
|
|
35
|
-
}
|
|
36
|
-
return `/:${parsed.ast.anchor.origin}`
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/** One exact Shell selection plus stable presentation fields for CLI output. */
|
|
40
|
-
export type ViewCandidate = ResolvedView & {
|
|
41
|
-
id: string
|
|
42
|
-
path: string
|
|
43
|
-
url: string
|
|
44
|
-
name?: string
|
|
45
|
-
handshake: 'shell' | 'none'
|
|
46
|
-
origin: 'self' | 'class'
|
|
47
|
-
issuer: string
|
|
48
|
-
etag: string
|
|
49
|
-
revision: string
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
export async function resolveViewCandidates(
|
|
53
|
-
ctx: ConnectionContext,
|
|
54
|
-
nodePath: string,
|
|
55
|
-
): Promise<ViewCandidate[]> {
|
|
56
|
-
const target = Path.parse(nodePath).raw
|
|
57
|
-
const catalog = await ctx.session.viewsFor(target)
|
|
58
|
-
return catalog.views.map((route) => toCandidate(target, route))
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
function toCandidate(target: ResolvedView['target'], route: SessionResolvedView): ViewCandidate {
|
|
62
|
-
const key = String(route.key)
|
|
63
|
-
return Object.freeze({
|
|
64
|
-
target,
|
|
65
|
-
route,
|
|
66
|
-
id: key,
|
|
67
|
-
path: `/:${key}`,
|
|
68
|
-
url: route.href,
|
|
69
|
-
name: key.slice(key.lastIndexOf(':view.') + ':view.'.length),
|
|
70
|
-
handshake: route.handshake,
|
|
71
|
-
origin: route.declaration.target.kind === 'domain' ? 'self' : 'class',
|
|
72
|
-
issuer: route.issuer,
|
|
73
|
-
etag: route.etag,
|
|
74
|
-
revision: route.revision,
|
|
75
|
-
})
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/** Strip presentation aliases before crossing the Shell mount boundary. */
|
|
79
|
-
export function selectedView(candidate: ViewCandidate): ResolvedView {
|
|
80
|
-
return Object.freeze({ target: candidate.target, route: candidate.route })
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/** The slug tail of a candidate: `view.dashboard` → `dashboard`. */
|
|
84
|
-
export function candidateSlug(candidate: ViewCandidate): string {
|
|
85
|
-
return candidate.name ?? candidate.id.slice(candidate.id.lastIndexOf(':view.') + ':view.'.length)
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
export function pickCandidate(
|
|
89
|
-
candidates: ViewCandidate[],
|
|
90
|
-
nodePath: string,
|
|
91
|
-
slug?: string,
|
|
92
|
-
): ViewCandidate | 'ambiguous' {
|
|
93
|
-
if (slug) {
|
|
94
|
-
const match = candidates.find(
|
|
95
|
-
(candidate) =>
|
|
96
|
-
candidate.id === slug || candidate.path === slug || candidateSlug(candidate) === slug,
|
|
97
|
-
)
|
|
98
|
-
if (!match) {
|
|
99
|
-
throw new AstraleError(
|
|
100
|
-
'VIEW_NOT_FOUND',
|
|
101
|
-
`No view "${slug}" on ${nodePath} — available: ${candidates.map(candidateSlug).join(', ') || '(none)'}`,
|
|
102
|
-
)
|
|
103
|
-
}
|
|
104
|
-
return match
|
|
105
|
-
}
|
|
106
|
-
if (candidates.length === 0) {
|
|
107
|
-
throw new AstraleError('VIEW_NOT_FOUND', `No views resolve on ${nodePath}`)
|
|
108
|
-
}
|
|
109
|
-
if (candidates.length === 1) return candidates[0]
|
|
110
|
-
return 'ambiguous'
|
|
111
|
-
}
|
package/src/lib/view/server.ts
DELETED
|
@@ -1,244 +0,0 @@
|
|
|
1
|
-
import type { ReadableStream as WebReadableStream } from 'node:stream/web'
|
|
2
|
-
|
|
3
|
-
import { readFile } from 'node:fs/promises'
|
|
4
|
-
import { createServer, type IncomingMessage, type Server, type ServerResponse } from 'node:http'
|
|
5
|
-
import { join } from 'node:path'
|
|
6
|
-
import { Readable } from 'node:stream'
|
|
7
|
-
|
|
8
|
-
import type { ViewServeConfig } from './session'
|
|
9
|
-
|
|
10
|
-
import { withClientSession } from '../../connection'
|
|
11
|
-
import { fetchWithCaFile } from '../ca-fetch'
|
|
12
|
-
import { viewerDistDir } from './assets'
|
|
13
|
-
import { removeSessionFiles } from './session'
|
|
14
|
-
|
|
15
|
-
export { ensureViewerAssets, viewerDistDir } from './assets'
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* The view-session server: serves the host page, hands it config and fresh
|
|
19
|
-
* credentials, receives its lifecycle reports, and proxies the view's kernel
|
|
20
|
-
* calls (one mechanism for CORS, self-signed local CAs, and keeping the kernel
|
|
21
|
-
* origin out of the page). Everything is nonce-scoped under `/s/<nonce>/`;
|
|
22
|
-
* loopback-only. Exits after `idleMs` without a request — the host page's
|
|
23
|
-
* heartbeat keeps a live session alive.
|
|
24
|
-
*/
|
|
25
|
-
|
|
26
|
-
const TOKEN_REFRESH_MARGIN_MS = 5 * 60_000
|
|
27
|
-
const FALLBACK_TOKEN_TTL_MS = 3600_000
|
|
28
|
-
const IDLE_SWEEP_MS = 60_000
|
|
29
|
-
|
|
30
|
-
export type PageStatus = { state: string; error?: string; at: string }
|
|
31
|
-
|
|
32
|
-
type TokenGrant = { token: string; expiresAt: number; kind: 'minted' }
|
|
33
|
-
|
|
34
|
-
export function startViewServer(config: ViewServeConfig): Server {
|
|
35
|
-
const { session, proxy } = config
|
|
36
|
-
const base = `/s/${session.nonce}`
|
|
37
|
-
const hostDir = viewerDistDir()
|
|
38
|
-
const proxyFetch = proxy.caFile ? fetchWithCaFile(proxy.caFile) : globalThis.fetch
|
|
39
|
-
let status: PageStatus = { state: 'waiting', at: new Date().toISOString() }
|
|
40
|
-
let grant: TokenGrant | null = null
|
|
41
|
-
let lastActivity = Date.now()
|
|
42
|
-
|
|
43
|
-
/** Mint one TTL-bound credential; raw CLI credentials never enter the browser session. */
|
|
44
|
-
async function freshGrant(): Promise<TokenGrant> {
|
|
45
|
-
if (grant && grant.expiresAt - Date.now() > TOKEN_REFRESH_MARGIN_MS) return grant
|
|
46
|
-
grant = await withClientSession(config.kernel, async ({ auth, target }) => {
|
|
47
|
-
const token = await auth.mint({ audience: target.kernelIssuer, ttlSeconds: 3_600 })
|
|
48
|
-
return {
|
|
49
|
-
token,
|
|
50
|
-
expiresAt: jwtExpiry(token) ?? Date.now() + FALLBACK_TOKEN_TTL_MS,
|
|
51
|
-
kind: 'minted' as const,
|
|
52
|
-
}
|
|
53
|
-
})
|
|
54
|
-
return grant
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const server = createServer((req, res) => {
|
|
58
|
-
lastActivity = Date.now()
|
|
59
|
-
void route(req, res).catch((error: unknown) => {
|
|
60
|
-
const message = error instanceof Error ? error.message : String(error)
|
|
61
|
-
// CORS headers even on failures — the caller may be the cross-origin
|
|
62
|
-
// view iframe, and an opaque error reads as a network failure there.
|
|
63
|
-
if (!res.headersSent) {
|
|
64
|
-
res.writeHead(502, {
|
|
65
|
-
'content-type': 'application/json',
|
|
66
|
-
...corsHeaders(req.headers.origin),
|
|
67
|
-
})
|
|
68
|
-
}
|
|
69
|
-
res.end(JSON.stringify({ error: message }))
|
|
70
|
-
})
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
async function route(req: IncomingMessage, res: ServerResponse): Promise<void> {
|
|
74
|
-
const url = new URL(req.url ?? '/', 'http://localhost')
|
|
75
|
-
if (!url.pathname.startsWith(`${base}/`) && url.pathname !== base) {
|
|
76
|
-
res.writeHead(404).end()
|
|
77
|
-
return
|
|
78
|
-
}
|
|
79
|
-
const sub = url.pathname.slice(base.length) || '/'
|
|
80
|
-
|
|
81
|
-
if (sub === '/k' || sub.startsWith('/k/')) {
|
|
82
|
-
await proxyKernel(req, res, sub.slice('/k'.length), url.search)
|
|
83
|
-
return
|
|
84
|
-
}
|
|
85
|
-
if (sub === '/' || sub === '/index.html') {
|
|
86
|
-
await serveAsset(res, join(hostDir, 'index.html'), 'text/html; charset=utf-8')
|
|
87
|
-
return
|
|
88
|
-
}
|
|
89
|
-
if (sub === '/main.js') {
|
|
90
|
-
await serveAsset(res, join(hostDir, 'main.js'), 'text/javascript; charset=utf-8')
|
|
91
|
-
return
|
|
92
|
-
}
|
|
93
|
-
if (sub === '/config.json' && req.method === 'GET') {
|
|
94
|
-
json(res, 200, {
|
|
95
|
-
view: session.view,
|
|
96
|
-
kernelUrl: proxy.direct ? proxy.kernelUrl : `${base}/k`,
|
|
97
|
-
kernelIssuer: proxy.issuer,
|
|
98
|
-
identity: session.identity ?? null,
|
|
99
|
-
instance: session.instance ?? null,
|
|
100
|
-
sessionId: session.id,
|
|
101
|
-
})
|
|
102
|
-
return
|
|
103
|
-
}
|
|
104
|
-
if (sub === '/token' && req.method === 'POST') {
|
|
105
|
-
if (session.view.route.handshake !== 'shell') {
|
|
106
|
-
json(res, 403, { error: 'plain views have no Astrale credential privilege' })
|
|
107
|
-
return
|
|
108
|
-
}
|
|
109
|
-
const fresh = await freshGrant()
|
|
110
|
-
json(res, 200, { token: fresh.token, expiresAt: fresh.expiresAt, kind: fresh.kind })
|
|
111
|
-
return
|
|
112
|
-
}
|
|
113
|
-
if (sub === '/status' && req.method === 'POST') {
|
|
114
|
-
const body = await readJson(req)
|
|
115
|
-
if (body && typeof body.state === 'string' && body.state !== 'alive') {
|
|
116
|
-
status = { state: body.state, error: asString(body.error), at: new Date().toISOString() }
|
|
117
|
-
}
|
|
118
|
-
res.writeHead(204).end()
|
|
119
|
-
return
|
|
120
|
-
}
|
|
121
|
-
if (sub === '/state' && req.method === 'GET') {
|
|
122
|
-
json(res, 200, status)
|
|
123
|
-
return
|
|
124
|
-
}
|
|
125
|
-
res.writeHead(404).end()
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/** Forward a kernel call: verbatim headers/body both ways, CORS added. */
|
|
129
|
-
async function proxyKernel(
|
|
130
|
-
req: IncomingMessage,
|
|
131
|
-
res: ServerResponse,
|
|
132
|
-
suffix: string,
|
|
133
|
-
search: string,
|
|
134
|
-
): Promise<void> {
|
|
135
|
-
const origin = req.headers.origin
|
|
136
|
-
if (req.method === 'OPTIONS') {
|
|
137
|
-
res.writeHead(204, corsHeaders(origin)).end()
|
|
138
|
-
return
|
|
139
|
-
}
|
|
140
|
-
const target = joinUrl(proxy.kernelUrl, suffix) + search
|
|
141
|
-
const headers: Record<string, string> = {}
|
|
142
|
-
for (const name of ['authorization', 'content-type', 'accept']) {
|
|
143
|
-
const value = req.headers[name]
|
|
144
|
-
if (typeof value === 'string') headers[name] = value
|
|
145
|
-
}
|
|
146
|
-
// Buffer the request body (envelope requests are small JSON): the caFile
|
|
147
|
-
// fetch path speaks node https and cannot consume a web-stream body.
|
|
148
|
-
// Response bodies still stream through.
|
|
149
|
-
const hasBody = req.method !== 'GET' && req.method !== 'HEAD'
|
|
150
|
-
const body = hasBody ? Buffer.concat(await collect(req)) : undefined
|
|
151
|
-
const upstream = await proxyFetch(target, {
|
|
152
|
-
method: req.method,
|
|
153
|
-
headers,
|
|
154
|
-
...(body !== undefined ? { body } : {}),
|
|
155
|
-
} as RequestInit)
|
|
156
|
-
const responseHeaders: Record<string, string> = corsHeaders(origin)
|
|
157
|
-
const contentType = upstream.headers.get('content-type')
|
|
158
|
-
if (contentType) responseHeaders['content-type'] = contentType
|
|
159
|
-
res.writeHead(upstream.status, responseHeaders)
|
|
160
|
-
if (upstream.body) {
|
|
161
|
-
Readable.fromWeb(upstream.body as unknown as WebReadableStream).pipe(res)
|
|
162
|
-
} else {
|
|
163
|
-
res.end()
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
const idleTimer = setInterval(() => {
|
|
168
|
-
if (Date.now() - lastActivity > config.idleMs) void shutdown(0)
|
|
169
|
-
}, IDLE_SWEEP_MS)
|
|
170
|
-
idleTimer.unref()
|
|
171
|
-
|
|
172
|
-
async function shutdown(code: number): Promise<void> {
|
|
173
|
-
clearInterval(idleTimer)
|
|
174
|
-
server.close()
|
|
175
|
-
await removeSessionFiles(session.id)
|
|
176
|
-
process.exit(code)
|
|
177
|
-
}
|
|
178
|
-
process.on('SIGTERM', () => void shutdown(0))
|
|
179
|
-
process.on('SIGINT', () => void shutdown(0))
|
|
180
|
-
|
|
181
|
-
server.listen(session.port, '127.0.0.1')
|
|
182
|
-
return server
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
function jwtExpiry(token: string): number | null {
|
|
186
|
-
try {
|
|
187
|
-
const payload = JSON.parse(Buffer.from(token.split('.')[1], 'base64url').toString('utf8')) as {
|
|
188
|
-
exp?: number
|
|
189
|
-
}
|
|
190
|
-
return typeof payload.exp === 'number' ? payload.exp * 1000 : null
|
|
191
|
-
} catch {
|
|
192
|
-
return null
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
function corsHeaders(origin: string | undefined): Record<string, string> {
|
|
197
|
-
return {
|
|
198
|
-
'access-control-allow-origin': origin ?? '*',
|
|
199
|
-
'access-control-allow-methods': 'GET,POST,PUT,PATCH,DELETE,OPTIONS',
|
|
200
|
-
'access-control-allow-headers': 'authorization, content-type, accept',
|
|
201
|
-
// Chrome private-network-access preflight (public page → loopback proxy).
|
|
202
|
-
'access-control-allow-private-network': 'true',
|
|
203
|
-
'access-control-max-age': '600',
|
|
204
|
-
vary: 'origin',
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
function joinUrl(baseUrl: string, suffix: string): string {
|
|
209
|
-
if (!suffix) return baseUrl
|
|
210
|
-
return baseUrl.replace(/\/$/, '') + suffix
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
function json(res: ServerResponse, code: number, body: unknown): void {
|
|
214
|
-
res.writeHead(code, { 'content-type': 'application/json' })
|
|
215
|
-
res.end(JSON.stringify(body))
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
async function serveAsset(res: ServerResponse, file: string, contentType: string): Promise<void> {
|
|
219
|
-
try {
|
|
220
|
-
const content = await readFile(file)
|
|
221
|
-
res.writeHead(200, { 'content-type': contentType, 'cache-control': 'no-store' })
|
|
222
|
-
res.end(content)
|
|
223
|
-
} catch {
|
|
224
|
-
res.writeHead(404).end()
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
async function collect(req: IncomingMessage): Promise<Buffer[]> {
|
|
229
|
-
const chunks: Buffer[] = []
|
|
230
|
-
for await (const chunk of req) chunks.push(chunk as Buffer)
|
|
231
|
-
return chunks
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
async function readJson(req: IncomingMessage): Promise<Record<string, unknown> | null> {
|
|
235
|
-
try {
|
|
236
|
-
return JSON.parse(Buffer.concat(await collect(req)).toString('utf8')) as Record<string, unknown>
|
|
237
|
-
} catch {
|
|
238
|
-
return null
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
function asString(value: unknown): string | undefined {
|
|
243
|
-
return typeof value === 'string' ? value : undefined
|
|
244
|
-
}
|
package/src/lib/view/session.ts
DELETED
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import type { ResolvedView } from '@astrale-os/shell'
|
|
2
|
-
|
|
3
|
-
import { closeSync, fchmodSync, openSync } from 'node:fs'
|
|
4
|
-
import { chmod, mkdir, readdir, readFile, rm } from 'node:fs/promises'
|
|
5
|
-
import { join } from 'node:path'
|
|
6
|
-
|
|
7
|
-
import { atomicWrite, paths } from '../../state/index'
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* View-session records: one detached server process per open view, tracked as
|
|
11
|
-
* `~/.astrale/view/<id>.json` (+ `<id>.log`, `<id>.config.json`). Records are
|
|
12
|
-
* garbage-collected on every `astrale view` invocation by probing the pid.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
export const VIEW_DIR = join(paths.home, 'view')
|
|
16
|
-
|
|
17
|
-
export type ViewSessionRecord = {
|
|
18
|
-
id: string
|
|
19
|
-
pid: number
|
|
20
|
-
port: number
|
|
21
|
-
nonce: string
|
|
22
|
-
/** Host page URL, nonce-scoped: `http://127.0.0.1:<port>/s/<nonce>/`. */
|
|
23
|
-
pageUrl: string
|
|
24
|
-
/** Exact verified View placement passed to Shell without split aliases. */
|
|
25
|
-
view: ResolvedView
|
|
26
|
-
instance?: string
|
|
27
|
-
identity?: string
|
|
28
|
-
createdAt: string
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/** Everything the detached `view __serve` process needs, written before spawn. */
|
|
32
|
-
export type ViewServeConfig = {
|
|
33
|
-
session: ViewSessionRecord
|
|
34
|
-
/** Kernel passthrough opts, re-resolved server-side for token mints. */
|
|
35
|
-
kernel: { url?: string; instance?: string; as?: string; creds?: string; timeout?: string }
|
|
36
|
-
/**
|
|
37
|
-
* Kernel the view dispatches to. `direct: true` hands the child the kernel
|
|
38
|
-
* URL itself (public https kernels — the router serves CORS, and Chrome's
|
|
39
|
-
* local-network-access rules forbid a public view origin fetching our
|
|
40
|
-
* loopback proxy). Otherwise the child gets the nonce-scoped proxy, which
|
|
41
|
-
* handles CORS and self-signed local CAs.
|
|
42
|
-
*/
|
|
43
|
-
proxy: { kernelUrl: string; issuer: string; caFile?: string; direct: boolean }
|
|
44
|
-
idleMs: number
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export const recordPath = (id: string, directory = VIEW_DIR): string =>
|
|
48
|
-
join(directory, `${id}.json`)
|
|
49
|
-
export const logPath = (id: string, directory = VIEW_DIR): string => join(directory, `${id}.log`)
|
|
50
|
-
export const configPath = (id: string, directory = VIEW_DIR): string =>
|
|
51
|
-
join(directory, `${id}.config.json`)
|
|
52
|
-
|
|
53
|
-
/** Create or repair the credential-bearing session directory as owner-only. */
|
|
54
|
-
export async function ensureViewDirectory(directory = VIEW_DIR): Promise<void> {
|
|
55
|
-
await mkdir(directory, { recursive: true, mode: 0o700 })
|
|
56
|
-
await chmod(directory, 0o700)
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export async function saveRecord(record: ViewSessionRecord, directory = VIEW_DIR): Promise<void> {
|
|
60
|
-
await ensureViewDirectory(directory)
|
|
61
|
-
await atomicWrite(recordPath(record.id, directory), `${JSON.stringify(record, null, 2)}\n`)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/** Atomically publish the detached process config; it may contain raw `--creds`. */
|
|
65
|
-
export async function saveServeConfig(
|
|
66
|
-
config: ViewServeConfig,
|
|
67
|
-
directory = VIEW_DIR,
|
|
68
|
-
): Promise<void> {
|
|
69
|
-
await ensureViewDirectory(directory)
|
|
70
|
-
await atomicWrite(
|
|
71
|
-
configPath(config.session.id, directory),
|
|
72
|
-
`${JSON.stringify(config, null, 2)}\n`,
|
|
73
|
-
)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/** Open or repair a session log as owner-only and return its descriptor. */
|
|
77
|
-
export async function openSessionLog(id: string, directory = VIEW_DIR): Promise<number> {
|
|
78
|
-
await ensureViewDirectory(directory)
|
|
79
|
-
const descriptor = openSync(logPath(id, directory), 'a', 0o600)
|
|
80
|
-
try {
|
|
81
|
-
fchmodSync(descriptor, 0o600)
|
|
82
|
-
return descriptor
|
|
83
|
-
} catch (error) {
|
|
84
|
-
closeSync(descriptor)
|
|
85
|
-
throw error
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
export async function removeSessionFiles(id: string, directory = VIEW_DIR): Promise<void> {
|
|
90
|
-
await Promise.all([
|
|
91
|
-
rm(recordPath(id, directory), { force: true }),
|
|
92
|
-
rm(configPath(id, directory), { force: true }),
|
|
93
|
-
rm(logPath(id, directory), { force: true }),
|
|
94
|
-
])
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export function isAlive(pid: number): boolean {
|
|
98
|
-
try {
|
|
99
|
-
process.kill(pid, 0)
|
|
100
|
-
return true
|
|
101
|
-
} catch {
|
|
102
|
-
return false
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/** List live sessions, removing records whose server process is gone. */
|
|
107
|
-
export async function listSessions(): Promise<ViewSessionRecord[]> {
|
|
108
|
-
let entries: string[]
|
|
109
|
-
try {
|
|
110
|
-
entries = await readdir(VIEW_DIR)
|
|
111
|
-
} catch {
|
|
112
|
-
return []
|
|
113
|
-
}
|
|
114
|
-
const live: ViewSessionRecord[] = []
|
|
115
|
-
for (const entry of entries) {
|
|
116
|
-
if (!/^v-[0-9a-f]+\.json$/.test(entry)) continue
|
|
117
|
-
let record: ViewSessionRecord
|
|
118
|
-
try {
|
|
119
|
-
record = JSON.parse(await readFile(join(VIEW_DIR, entry), 'utf8')) as ViewSessionRecord
|
|
120
|
-
} catch {
|
|
121
|
-
continue
|
|
122
|
-
}
|
|
123
|
-
if (isAlive(record.pid)) live.push(record)
|
|
124
|
-
else await removeSessionFiles(record.id)
|
|
125
|
-
}
|
|
126
|
-
return live.sort((a, b) => a.createdAt.localeCompare(b.createdAt))
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const CLOSE_GRACE_MS = 2000
|
|
130
|
-
|
|
131
|
-
/** SIGTERM the session server (SIGKILL after a grace period), drop its files. */
|
|
132
|
-
export async function closeSession(record: ViewSessionRecord): Promise<void> {
|
|
133
|
-
if (isAlive(record.pid)) {
|
|
134
|
-
try {
|
|
135
|
-
process.kill(record.pid, 'SIGTERM')
|
|
136
|
-
} catch {
|
|
137
|
-
// already gone
|
|
138
|
-
}
|
|
139
|
-
const deadline = Date.now() + CLOSE_GRACE_MS
|
|
140
|
-
while (isAlive(record.pid) && Date.now() < deadline) {
|
|
141
|
-
await new Promise((resolve) => setTimeout(resolve, 100))
|
|
142
|
-
}
|
|
143
|
-
if (isAlive(record.pid)) {
|
|
144
|
-
try {
|
|
145
|
-
process.kill(record.pid, 'SIGKILL')
|
|
146
|
-
} catch {
|
|
147
|
-
// already gone
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
await removeSessionFiles(record.id)
|
|
152
|
-
}
|
package/src/lib/view/snapshot.ts
DELETED
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import type { AbResult } from '../browser'
|
|
2
|
-
|
|
3
|
-
const SETTLE_TIMEOUT_MS = 8_000
|
|
4
|
-
const QUIET_WINDOW_MS = 750
|
|
5
|
-
const POLL_MS = 250
|
|
6
|
-
|
|
7
|
-
type SettleClock = {
|
|
8
|
-
now(): number
|
|
9
|
-
sleep(ms: number): Promise<void>
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
type SettlePolicy = {
|
|
13
|
-
timeoutMs: number
|
|
14
|
-
quietWindowMs: number
|
|
15
|
-
pollMs: number
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const realClock: SettleClock = {
|
|
19
|
-
now: Date.now,
|
|
20
|
-
sleep: (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const defaultPolicy: SettlePolicy = {
|
|
24
|
-
timeoutMs: SETTLE_TIMEOUT_MS,
|
|
25
|
-
quietWindowMs: QUIET_WINDOW_MS,
|
|
26
|
-
pollMs: POLL_MS,
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export function snapshotText(result: AbResult): string | null {
|
|
30
|
-
const data = result.data as { snapshot?: unknown } | string | null
|
|
31
|
-
if (typeof data === 'string') return data
|
|
32
|
-
return typeof data?.snapshot === 'string' ? data.snapshot : null
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
function isMeaningfulSnapshot(text: string): boolean {
|
|
36
|
-
return /"[^"\n]+"/.test(text)
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function isPendingSnapshot(text: string): boolean {
|
|
40
|
-
if (/\[[^\]]*\bbusy\b[^\]]*\]/i.test(text)) return true
|
|
41
|
-
if (/^\s*-\s*progressbar\b/im.test(text)) return true
|
|
42
|
-
|
|
43
|
-
// Views often render loading text without aria-busy. The timeout still
|
|
44
|
-
// returns that snapshot when a view never leaves its loading state.
|
|
45
|
-
return /"(?:loading|opening|connecting|initializing|preparing|starting|fetching|refreshing|please wait)(?:\b[^"\n]{0,100})?"/i.test(
|
|
46
|
-
text,
|
|
47
|
-
)
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
function fingerprint(text: string): string {
|
|
51
|
-
return text
|
|
52
|
-
.replace(/\bref=e\d+\b/g, 'ref')
|
|
53
|
-
.replace(/\s+/g, ' ')
|
|
54
|
-
.trim()
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/**
|
|
58
|
-
* Warm the cross-origin accessibility tree, then wait for a meaningful view
|
|
59
|
-
* snapshot to remain unchanged briefly. Loading/busy states never settle
|
|
60
|
-
* early, but the timeout returns their latest snapshot for diagnosis.
|
|
61
|
-
*/
|
|
62
|
-
export async function waitForSettledSnapshot(
|
|
63
|
-
takeSnapshot: () => Promise<AbResult>,
|
|
64
|
-
clock: SettleClock = realClock,
|
|
65
|
-
policy: SettlePolicy = defaultPolicy,
|
|
66
|
-
): Promise<AbResult> {
|
|
67
|
-
let lastAttempt = await takeSnapshot()
|
|
68
|
-
let lastSuccess = lastAttempt.ok ? lastAttempt : null
|
|
69
|
-
let stableFingerprint: string | null = null
|
|
70
|
-
let stableSince = clock.now()
|
|
71
|
-
const deadline = clock.now() + policy.timeoutMs
|
|
72
|
-
|
|
73
|
-
while (true) {
|
|
74
|
-
lastAttempt = await takeSnapshot()
|
|
75
|
-
const sampledAt = clock.now()
|
|
76
|
-
|
|
77
|
-
if (lastAttempt.ok) {
|
|
78
|
-
lastSuccess = lastAttempt
|
|
79
|
-
const text = snapshotText(lastAttempt)
|
|
80
|
-
if (text && isMeaningfulSnapshot(text)) {
|
|
81
|
-
const nextFingerprint = fingerprint(text)
|
|
82
|
-
if (nextFingerprint !== stableFingerprint) {
|
|
83
|
-
stableFingerprint = nextFingerprint
|
|
84
|
-
stableSince = sampledAt
|
|
85
|
-
} else if (!isPendingSnapshot(text) && sampledAt - stableSince >= policy.quietWindowMs) {
|
|
86
|
-
return lastAttempt
|
|
87
|
-
}
|
|
88
|
-
} else {
|
|
89
|
-
stableFingerprint = null
|
|
90
|
-
stableSince = sampledAt
|
|
91
|
-
}
|
|
92
|
-
} else {
|
|
93
|
-
stableFingerprint = null
|
|
94
|
-
stableSince = sampledAt
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const remaining = deadline - clock.now()
|
|
98
|
-
if (remaining <= 0) return lastSuccess ?? lastAttempt
|
|
99
|
-
await clock.sleep(Math.min(policy.pollMs, remaining))
|
|
100
|
-
}
|
|
101
|
-
}
|
package/src/paths/.spec/api.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
ASTRALE_HOME,
|
|
3
|
-
CONFIG_PATH,
|
|
4
|
-
DATA_DIR,
|
|
5
|
-
IDENTITIES_PATH,
|
|
6
|
-
IDPS_PATH,
|
|
7
|
-
IDP_SESSIONS_DIR,
|
|
8
|
-
INSTALL_PATH,
|
|
9
|
-
INSTANCES_PATH,
|
|
10
|
-
KEYS_DIR,
|
|
11
|
-
createPaths,
|
|
12
|
-
} from '../../state/.spec/api.js'
|
|
13
|
-
export type { PathEnvironment, Paths } from '../../state/.spec/api.js'
|
package/src/paths/index.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
ASTRALE_HOME,
|
|
3
|
-
CONFIG_PATH,
|
|
4
|
-
DATA_DIR,
|
|
5
|
-
IDENTITIES_PATH,
|
|
6
|
-
IDPS_PATH,
|
|
7
|
-
IDP_SESSIONS_DIR,
|
|
8
|
-
INSTALL_PATH,
|
|
9
|
-
INSTANCES_PATH,
|
|
10
|
-
KEYS_DIR,
|
|
11
|
-
createPaths,
|
|
12
|
-
} from '../state/index'
|
|
13
|
-
export type { PathEnvironment, Paths } from '../state/index'
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import type { Command } from 'commander'
|
|
2
|
-
|
|
3
|
-
/** One positional argument in a CLI command definition. */
|
|
4
|
-
export interface CommandArgument {
|
|
5
|
-
readonly name: string
|
|
6
|
-
readonly description: string
|
|
7
|
-
readonly required?: boolean
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/** One Commander-compatible option in a CLI command definition. */
|
|
11
|
-
export interface CommandOption {
|
|
12
|
-
readonly flags: string
|
|
13
|
-
readonly description: string
|
|
14
|
-
readonly default?: string
|
|
15
|
-
readonly choices?: string[]
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/** Internal authoring shape implemented by each command module. */
|
|
19
|
-
export interface CommandDefinition {
|
|
20
|
-
readonly name: string
|
|
21
|
-
readonly description: string
|
|
22
|
-
readonly summary?: string
|
|
23
|
-
readonly hidden?: boolean
|
|
24
|
-
readonly aliases?: string[]
|
|
25
|
-
readonly arguments?: CommandArgument[]
|
|
26
|
-
readonly options?: CommandOption[]
|
|
27
|
-
readonly afterHelpText?: string
|
|
28
|
-
/** Opaque Commander callback; each command module owns its concrete argument tuple. */
|
|
29
|
-
readonly action: (...args: never[]) => Promise<void>
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/** Internal composition shape for one group of commands. */
|
|
33
|
-
export interface CommandGroup {
|
|
34
|
-
readonly name: string
|
|
35
|
-
readonly description: string
|
|
36
|
-
readonly summary?: string
|
|
37
|
-
readonly commands: CommandDefinition[]
|
|
38
|
-
readonly subgroups?: CommandGroup[]
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/** Build a fresh, complete Commander tree without parsing process arguments. */
|
|
42
|
-
export function buildProgram(): Promise<Command>
|