@astrale-os/cli 1.0.0-beta.3 → 1.0.0-beta.31
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 +84 -6
- package/dist/astrale.js +57586 -60753
- package/dist/public/connect-core.js +2158 -30706
- package/dist/public/keys/index.js +1016 -29541
- package/dist/public/paths/index.js +370 -28654
- package/dist/types/admin/contract.d.ts +26 -0
- package/dist/types/admin/instance/client.d.ts +20 -0
- package/dist/types/admin/instance/index.d.ts +2 -0
- package/dist/types/admin/instance/model.d.ts +6 -10
- package/dist/types/connection/auth.d.ts +3 -0
- package/dist/types/connection/call.d.ts +3 -0
- package/dist/types/connection/command.d.ts +27 -0
- package/dist/types/connection/credential.d.ts +14 -0
- package/dist/types/connection/errors.d.ts +1 -0
- package/dist/types/connection/exchange.d.ts +9 -0
- package/dist/types/connection/failure/classify.d.ts +2 -0
- package/dist/types/connection/failure/index.d.ts +5 -0
- package/dist/types/connection/failure/model.d.ts +25 -0
- package/dist/types/connection/failure/render.d.ts +3 -0
- package/dist/types/connection/index.d.ts +8 -0
- package/dist/types/connection/reasons.d.ts +37 -0
- package/dist/types/connection/self.d.ts +37 -0
- package/dist/types/connection/session.d.ts +31 -0
- package/dist/types/connection/target.d.ts +38 -0
- package/dist/types/errors.d.ts +1 -1
- package/dist/types/lib/admin-instance.d.ts +17 -0
- package/dist/types/lib/admin-target.d.ts +11 -36
- package/dist/types/lib/config.d.ts +13 -59
- package/dist/types/lib/failure-debug.d.ts +1 -0
- package/dist/types/lib/idp.d.ts +25 -173
- package/dist/types/lib/instance-target.d.ts +1 -1
- package/dist/types/lib/instance.d.ts +30 -88
- package/dist/types/lib/log.d.ts +5 -3
- package/dist/types/lib/output.d.ts +1 -1
- package/dist/types/lib/proc.d.ts +43 -0
- package/dist/types/lib/self.d.ts +9 -0
- package/dist/types/lib/update.d.ts +109 -0
- package/dist/types/lib/validation.d.ts +4 -1
- package/dist/types/state/exchange-credentials.d.ts +6 -2
- package/dist/types/state/files.d.ts +2 -0
- package/dist/types/state/index.d.ts +3 -2
- package/dist/types/state/paths.d.ts +2 -0
- package/dist/types/state/session-routes.d.ts +10 -0
- package/package.json +16 -19
- package/src/__tests__/fixtures/publication.ts +20 -0
- package/src/admin/.spec/architecture.md +12 -5
- package/src/admin/__tests__/fixture.ts +25 -0
- package/src/admin/catalog/.spec/api.d.ts +1 -3
- package/src/admin/catalog/.spec/architecture.md +5 -4
- package/src/admin/catalog/__tests__/client.test.ts +143 -69
- package/src/admin/catalog/client.ts +40 -54
- package/src/admin/catalog/model.ts +3 -4
- package/src/admin/contract.ts +47 -0
- package/src/admin/graph/.spec/api.d.ts +4 -10
- package/src/admin/graph/nodes.ts +1 -1
- package/src/admin/instance/.spec/api.d.ts +5 -9
- package/src/admin/instance/.spec/architecture.md +7 -7
- package/src/admin/instance/__tests__/client.test.ts +157 -175
- package/src/admin/instance/client.ts +39 -128
- package/src/admin/instance/index.ts +1 -2
- package/src/admin/instance/model.ts +12 -18
- package/src/commands/__tests__/admin-instance.test.ts +11 -8
- package/src/commands/__tests__/call-describe.test.ts +46 -33
- package/src/commands/__tests__/call.test.ts +34 -0
- package/src/commands/__tests__/domain-install-operation.test.ts +30 -22
- package/src/commands/__tests__/domain-install-owned.test.ts +1 -1
- package/src/commands/__tests__/domain-list.test.ts +5 -25
- package/src/commands/__tests__/install-direct.test.ts +115 -8
- package/src/commands/__tests__/install-identity-override.test.ts +6 -17
- package/src/commands/__tests__/instance-list-rows.test.ts +1 -1
- package/src/commands/__tests__/instance-status.test.ts +139 -0
- package/src/commands/__tests__/introspect-parse.test.ts +80 -1
- package/src/commands/__tests__/logs.test.ts +250 -2
- package/src/commands/__tests__/read-commands.test.ts +119 -11
- package/src/commands/__tests__/token-ttl.test.ts +49 -4
- package/src/commands/__tests__/update.test.ts +25 -3
- package/src/commands/__tests__/view.test.ts +50 -2
- package/src/commands/auth/logout.ts +2 -1
- package/src/commands/browser.ts +29 -0
- package/src/commands/call-describe.ts +60 -68
- package/src/commands/call.ts +71 -59
- package/src/commands/domain/install.ts +73 -46
- package/src/commands/domain/list.ts +1 -1
- package/src/commands/domain/publish.ts +14 -11
- package/src/commands/domain/uninstall.ts +2 -2
- package/src/commands/get.ts +15 -16
- package/src/commands/identity/__tests__/register.test.ts +3 -3
- package/src/commands/identity/register.ts +8 -8
- package/src/commands/instance/create.ts +8 -16
- package/src/commands/instance/delete.ts +12 -9
- package/src/commands/instance/list.ts +2 -2
- package/src/commands/instance/status.ts +66 -20
- package/src/commands/instance/use.ts +16 -12
- package/src/commands/introspect.ts +53 -41
- package/src/commands/logs.ts +123 -36
- package/src/commands/mutate.ts +6 -5
- package/src/commands/query.ts +39 -36
- package/src/commands/session/analyze.ts +26 -4
- package/src/commands/token.ts +42 -27
- package/src/commands/ui/__tests__/commands.test.ts +152 -0
- package/src/commands/ui/add.ts +51 -0
- package/src/commands/ui/doctor.ts +21 -0
- package/src/commands/ui/init.ts +38 -0
- package/src/commands/ui/list.ts +26 -0
- package/src/commands/ui/preset-apply.ts +19 -0
- package/src/commands/ui/preset-list.ts +12 -0
- package/src/commands/ui/shared.ts +25 -0
- package/src/commands/update.ts +90 -48
- package/src/commands/view.ts +82 -37
- package/src/connection/.spec/api.d.ts +7 -8
- package/src/connection/.spec/architecture.md +14 -5
- package/src/connection/.spec/flows/session.ts +2 -2
- package/src/connection/.spec/laws/connection.ts +6 -2
- package/src/connection/.spec/layout.ts +1 -0
- package/src/connection/__tests__/auth.test.ts +1 -0
- package/src/connection/__tests__/credential.test.ts +21 -1
- package/src/connection/__tests__/errors.test.ts +27 -20
- package/src/connection/__tests__/exchange.test.ts +64 -11
- package/src/connection/__tests__/failure-fixtures.ts +39 -0
- package/src/connection/__tests__/failure-safety.test.ts +75 -0
- package/src/connection/__tests__/self.test.ts +31 -11
- package/src/connection/__tests__/session.test.ts +8 -4
- package/src/connection/__tests__/target.test.ts +2 -0
- package/src/connection/auth.ts +13 -0
- package/src/connection/call.ts +1 -1
- package/src/connection/credential.ts +2 -2
- package/src/connection/errors.ts +1 -355
- package/src/connection/exchange.ts +110 -61
- package/src/connection/failure/classify.ts +110 -0
- package/src/connection/failure/index.ts +18 -0
- package/src/connection/failure/model.ts +28 -0
- package/src/connection/failure/render.ts +116 -0
- package/src/connection/reasons.ts +16 -0
- package/src/connection/self.ts +39 -21
- package/src/connection/session.ts +27 -9
- package/src/errors.ts +3 -2
- package/src/graph/.spec/api.d.ts +13 -6
- package/src/graph/.spec/laws/documents.ts +7 -7
- package/src/graph/.spec/layout.ts +9 -1
- package/src/graph/__tests__/mutation.test.ts +2 -2
- package/src/graph/__tests__/query.test.ts +35 -9
- package/src/graph/class.ts +30 -0
- package/src/graph/index.ts +1 -0
- package/src/graph/query.ts +27 -40
- package/src/identity/.spec/api.d.ts +2 -2
- package/src/identity/__tests__/fixtures/registry-journey.ts +13 -1
- package/src/identity/__tests__/registration.test.ts +1 -1
- package/src/identity/__tests__/registry.test.ts +4 -0
- package/src/identity/registration.ts +3 -3
- package/src/identity/registry.ts +2 -0
- package/src/keys/__tests__/keys.test.ts +4 -0
- package/src/keys/credential.ts +1 -0
- package/src/lib/__tests__/admin-target.test.ts +12 -0
- package/src/lib/__tests__/binary.test.ts +16 -1
- package/src/lib/__tests__/browser-retention.test.ts +212 -0
- package/src/lib/__tests__/command-dx.test.ts +1 -1
- package/src/lib/__tests__/config.test.ts +27 -0
- package/src/lib/__tests__/domain-publication.test.ts +10 -16
- package/src/lib/__tests__/idp.test.ts +34 -4
- package/src/lib/__tests__/instance-candidates.test.ts +1 -3
- package/src/lib/__tests__/instance-target.test.ts +7 -39
- package/src/lib/__tests__/log-errors.test.ts +64 -0
- package/src/lib/__tests__/skills.test.ts +834 -0
- package/src/lib/__tests__/studio-server-deps.test.ts +1 -1
- package/src/lib/__tests__/update.test.ts +264 -11
- package/src/lib/__tests__/view-assets.test.ts +25 -0
- package/src/lib/__tests__/view-external-open-intent.test.ts +150 -0
- package/src/lib/__tests__/view-external-open-origins.test.ts +27 -0
- package/src/lib/__tests__/view-open-intent.test.ts +0 -2
- package/src/lib/__tests__/view-server.test.ts +26 -3
- package/src/lib/__tests__/view-session.test.ts +2 -1
- package/src/lib/admin-instance.ts +14 -8
- package/src/lib/admin-target.ts +21 -2
- package/src/lib/binary.ts +22 -5
- package/src/lib/browser-retention.ts +210 -0
- package/src/lib/command-dx.ts +9 -9
- package/src/lib/config.ts +12 -1
- package/src/lib/domain-publication.ts +9 -7
- package/src/lib/failure-debug.ts +26 -0
- package/src/lib/idp.ts +34 -3
- package/src/lib/instance-candidates.ts +2 -2
- package/src/lib/instance-target.ts +3 -14
- package/src/lib/instance.ts +16 -11
- package/src/lib/log.ts +16 -9
- package/src/lib/output.ts +1 -1
- package/src/lib/proc.ts +7 -2
- package/src/lib/provision-instance.ts +34 -57
- package/src/lib/skills/lock.ts +117 -0
- package/src/lib/skills/sync.ts +878 -0
- package/src/lib/skills.ts +1 -52
- package/src/lib/update.ts +298 -45
- package/src/lib/validation.ts +2 -2
- package/src/lib/view/assets.ts +11 -2
- package/src/lib/view/external-open-intent.ts +41 -0
- package/src/lib/view/external-open-origins.ts +37 -0
- package/src/lib/view/host-capabilities.ts +17 -0
- package/src/lib/view/resolve.ts +1 -1
- package/src/lib/view/server.ts +18 -3
- package/src/lib/view/session.ts +2 -0
- package/src/program/.spec/api.d.ts +1 -0
- package/src/program/__tests__/program.test.ts +201 -7
- package/src/program/argv.ts +14 -0
- package/src/program/build.ts +26 -4
- package/src/program/command.ts +1 -0
- package/src/program/index.ts +1 -0
- package/src/program/registry.ts +2 -1
- package/src/setup/__tests__/instance-step.test.ts +27 -10
- package/src/setup/steps/instance.ts +22 -15
- package/src/setup/steps/skills.ts +40 -38
- package/src/state/.spec/api.d.ts +21 -2
- package/src/state/.spec/architecture.md +18 -4
- package/src/state/.spec/layout.ts +1 -0
- package/src/state/__tests__/exchange-credentials.test.ts +88 -42
- package/src/state/__tests__/files.test.ts +24 -1
- package/src/state/__tests__/fixtures/session-route-process.ts +93 -0
- package/src/state/__tests__/paths.test.ts +1 -0
- package/src/state/__tests__/session-routes.test.ts +138 -0
- package/src/state/exchange-credentials.ts +22 -9
- package/src/state/files.ts +41 -0
- package/src/state/index.ts +3 -1
- package/src/state/paths.ts +3 -0
- package/src/state/session-routes.ts +34 -0
- package/src/telemetry/__tests__/analyze-log.test.ts +38 -0
- package/src/telemetry/__tests__/recorder.test.ts +1 -0
- package/src/telemetry/__tests__/retention.test.ts +267 -0
- package/src/telemetry/__tests__/settings.test.ts +102 -0
- package/src/telemetry/__tests__/store-scan.test.ts +128 -0
- package/src/telemetry/__tests__/trigger.test.ts +33 -4
- package/src/telemetry/analyze.ts +24 -2
- package/src/telemetry/recorder.ts +15 -4
- package/src/telemetry/retention.ts +176 -0
- package/src/telemetry/session.ts +18 -12
- package/src/telemetry/settings.ts +64 -11
- package/src/telemetry/store.ts +92 -9
- package/src/telemetry/trigger.ts +16 -28
- package/src/ui/.spec/api.d.ts +14 -0
- package/src/ui/.spec/architecture.md +14 -0
- package/src/ui/.spec/laws.ts +50 -0
- package/src/ui/.spec/layout.ts +16 -0
- package/src/ui/__tests__/ui.test.ts +1742 -0
- package/src/ui/index.ts +13 -0
- package/src/ui/lock.ts +89 -0
- package/src/ui/model.ts +83 -0
- package/src/ui/operations.ts +1044 -0
- package/src/ui/project.ts +333 -0
- package/src/ui/release.ts +398 -0
- package/src/ui/runner.ts +18 -0
- package/studio/client/dist/assets/elk-api-DjmKsHXc.js +1 -0
- package/studio/client/dist/assets/index-BFVFs_8x.js +81 -0
- package/studio/client/dist/assets/index-DuB9iUdu.css +2 -0
- package/studio/client/dist/assets/rolldown-runtime-Dd_uD5pT.js +1 -0
- package/studio/client/dist/assets/schema-studio--a0kX3QU.css +1 -0
- package/studio/client/dist/assets/schema-studio-DH6oEWME.js +8 -0
- package/studio/client/dist/index.html +4 -3
- package/studio/package.json +8 -14
- package/studio/server/agent/ask.test.ts +1 -1
- package/studio/server/agent/bridge/grant.test.ts +1 -1
- package/studio/server/agent/bridge/routes.test.ts +1 -1
- package/studio/server/agent/harness/claude/adapter.test.ts +15 -5
- package/studio/server/agent/harness/gateway/token.test.ts +1 -1
- package/studio/server/agent/harness/gateway/token.ts +3 -3
- package/studio/server/agent/prompts/anchors.test.ts +41 -32
- package/studio/server/agent/prompts/anchors.ts +23 -51
- package/studio/server/agent/prompts/system.test.ts +4 -4
- package/studio/server/agent/prompts/system.ts +5 -5
- package/studio/server/agent/routes.test.ts +1 -1
- package/studio/server/agent/run/coordinator.test.ts +1 -1
- package/studio/server/agent/run/preparation.ts +1 -1
- package/studio/server/api/canvas.ts +0 -1
- package/studio/server/api/context.ts +1 -1
- package/studio/server/api/deployment.ts +1 -1
- package/studio/server/api/views.ts +2 -2
- package/studio/server/api/workspace.ts +1 -1
- package/studio/server/api-agent-loadout.test.ts +1 -1
- package/studio/server/api.test.ts +1 -1
- package/studio/server/cache.test.ts +24 -18
- package/studio/server/cache.ts +10 -54
- package/studio/server/cli-consumers.test.ts +32 -4
- package/studio/server/cli.test.ts +2 -2
- package/studio/server/domain.test.ts +50 -68
- package/studio/server/domain.ts +82 -63
- package/studio/server/handoff/copy.ts +2 -2
- package/studio/server/index.ts +1 -1
- package/studio/server/instances/probe.test.ts +1 -1
- package/studio/server/introspect/anatomy/views/routes.ts +46 -37
- package/studio/server/introspect/anatomy/views.ts +10 -16
- package/studio/server/introspect/anatomy-extras.test.ts +29 -56
- package/studio/server/introspect/anatomy.test.ts +22 -14
- package/studio/server/introspect/anatomy.ts +6 -9
- package/studio/server/introspect/bundle.ts +0 -3
- package/studio/server/introspect/canonical-schema.test.ts +155 -424
- package/studio/server/introspect/canonical-schema.ts +248 -601
- package/studio/server/introspect/core.ts +14 -22
- package/studio/server/introspect/diff.test.ts +21 -9
- package/studio/server/introspect/diff.ts +19 -64
- package/studio/server/introspect/extractor.ts +23 -122
- package/studio/server/introspect/overlay-tsmorph.test.ts +116 -241
- package/studio/server/introspect/overlay-tsmorph.ts +0 -1
- package/studio/server/introspect/overlay.ts +3 -51
- package/studio/server/introspect/revision.test.ts +24 -28
- package/studio/server/introspect/revision.ts +11 -22
- package/studio/server/introspect/runtime.test.ts +77 -195
- package/studio/server/introspect/runtime.ts +5 -67
- package/studio/server/introspect/schema-ir-json.test.ts +81 -0
- package/studio/server/introspect/schema-ir-json.ts +39 -69
- package/studio/server/introspect/schema-refs.test.ts +43 -88
- package/studio/server/introspect/schema-refs.ts +14 -49
- package/studio/server/introspect/source-overlay/handlers.ts +116 -636
- package/studio/server/introspect/source-overlay/kernel-calls.ts +0 -3
- package/studio/server/introspect/source-overlay/spans.ts +15 -45
- package/studio/server/lifecycle.ts +4 -1
- package/studio/server/state/baseline.test.ts +14 -9
- package/studio/server/state/baseline.ts +3 -5
- package/studio/server/state/documents.test.ts +69 -0
- package/studio/server/state/documents.ts +57 -10
- package/studio/server/state/visibility.ts +1 -5
- package/studio/server/views/model.ts +3 -3
- package/studio/server/views/target.test.ts +18 -76
- package/studio/server/views/target.ts +25 -51
- package/studio/server/watch.test.ts +11 -11
- package/studio/server/watch.ts +8 -4
- package/studio/server/workspace/updates.ts +23 -1
- package/studio/server/workspace-watch.ts +2 -2
- package/studio/shared/contracts/runtime.ts +4 -0
- package/studio/shared/contracts/schema.ts +44 -131
- package/studio/shared/contracts/surface.test.ts +15 -17
- package/studio/shared/contracts/workspace.ts +5 -11
- package/studio/shared/schema/identity.test.ts +20 -44
- package/studio/shared/schema/identity.ts +9 -24
- package/studio/tsconfig.json +2 -1
- package/tsconfig.json +1 -1
- package/viewer/dist/index.html +21 -0
- package/viewer/dist/main.js +41 -62
- package/.check-workspace.cjs +0 -40
- package/src/admin/binding.ts +0 -168
- package/src/commands/__tests__/instance-create-hosts.test.ts +0 -29
- package/studio/client/dist/assets/elk-api-lwhFo7vB.js +0 -1
- package/studio/client/dist/assets/index-B-c-smo9.js +0 -8
- package/studio/client/dist/assets/index-BckHuAWk.js +0 -81
- package/studio/client/dist/assets/index-C4aNQ6dz.css +0 -1
- package/studio/client/dist/assets/index-ChOr3yP0.css +0 -1
- package/studio/server/introspect/anatomy/views/legacy.ts +0 -232
- package/studio/server/introspect/core-extractor.ts +0 -139
- package/studio/server/introspect/overlay.test.ts +0 -72
- package/studio/server/introspect/source-overlay/annotations.ts +0 -14
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* core.ts —
|
|
3
|
-
* extracted
|
|
4
|
-
* on installed deps. Never throws; a failed import or a domain with no core both
|
|
5
|
-
* become a well-formed (empty) render state.
|
|
2
|
+
* core.ts — derives a domain's genesis graph from the canonical Schema already
|
|
3
|
+
* extracted for its Studio bundle. Schema code is imported exactly once.
|
|
6
4
|
*/
|
|
7
|
-
import type { StudioCore } from '../../shared/types'
|
|
5
|
+
import type { StudioCore, StudioSchemaBundle } from '../../shared/types'
|
|
6
|
+
import type { DomainHandle } from '../domain'
|
|
8
7
|
|
|
9
|
-
import {
|
|
10
|
-
import { readSettings } from '../state/settings'
|
|
11
|
-
import { coreExtract } from './runtime'
|
|
8
|
+
import { isCanonicalDomainSchemaV1, projectCanonicalCore } from './canonical-schema'
|
|
12
9
|
|
|
13
|
-
export
|
|
10
|
+
export function buildCore(handle: DomainHandle, bundle: StudioSchemaBundle | null): StudioCore {
|
|
14
11
|
const at = new Date().toISOString()
|
|
15
12
|
const empty = (error: StudioCore['error']): StudioCore => ({
|
|
16
13
|
domain: handle.origin ?? handle.id,
|
|
@@ -20,26 +17,21 @@ export async function buildCore(handle: DomainHandle): Promise<StudioCore> {
|
|
|
20
17
|
extractedAt: at,
|
|
21
18
|
})
|
|
22
19
|
|
|
23
|
-
if (!depsInstalled
|
|
20
|
+
if (!bundle?.depsInstalled) {
|
|
24
21
|
return empty({
|
|
25
22
|
message: 'dependencies not installed — run `pnpm install` in the domain for core extraction',
|
|
26
23
|
})
|
|
27
24
|
}
|
|
25
|
+
if (!isCanonicalDomainSchemaV1(bundle.schemaRoot)) {
|
|
26
|
+
return empty(bundle.error ?? { message: 'canonical schema unavailable for core extraction' })
|
|
27
|
+
}
|
|
28
28
|
|
|
29
|
-
const
|
|
30
|
-
handle.schemaIndex,
|
|
31
|
-
handle.domainFile,
|
|
32
|
-
handle.root,
|
|
33
|
-
readSettings(handle.root).introspectTimeoutMs,
|
|
34
|
-
)
|
|
35
|
-
// r.ok && r.core===null → the domain simply defines no core (not an error).
|
|
36
|
-
if (!r.ok) return empty(r.error ?? { message: 'core extraction failed' })
|
|
37
|
-
if (!r.core) return empty(null)
|
|
29
|
+
const core = projectCanonicalCore(bundle.schemaRoot)
|
|
38
30
|
|
|
39
31
|
return {
|
|
40
|
-
domain:
|
|
41
|
-
nodes:
|
|
42
|
-
edges:
|
|
32
|
+
domain: core.domain,
|
|
33
|
+
nodes: core.nodes,
|
|
34
|
+
edges: core.edges,
|
|
43
35
|
error: null,
|
|
44
36
|
extractedAt: at,
|
|
45
37
|
}
|
|
@@ -7,22 +7,22 @@ import { diffSchemas, structuralStatusOf } from './diff'
|
|
|
7
7
|
const callable = (returnsType = 'string'): IrFunction => ({
|
|
8
8
|
name: 'inspect',
|
|
9
9
|
input: { type: 'object', properties: {}, additionalProperties: false },
|
|
10
|
-
params: {},
|
|
11
10
|
output: { mode: 'value', schema: { type: returnsType } },
|
|
12
|
-
returns: { type: returnsType },
|
|
13
|
-
static: true,
|
|
14
|
-
inheritance: 'default',
|
|
15
11
|
auth: 'authenticated',
|
|
16
12
|
})
|
|
17
13
|
|
|
18
14
|
const schema = (functions: SchemaIR['functions']): SchemaIR => ({
|
|
19
15
|
version: 'v1',
|
|
16
|
+
format: 'astrale.dsl',
|
|
20
17
|
domain: 'example.test',
|
|
21
|
-
types: {},
|
|
22
|
-
interfaces: {},
|
|
23
18
|
classes: {},
|
|
24
|
-
|
|
19
|
+
importsByKey: {},
|
|
20
|
+
importedClassesByKey: {},
|
|
25
21
|
functions,
|
|
22
|
+
views: {},
|
|
23
|
+
policies: {},
|
|
24
|
+
dependencies: [],
|
|
25
|
+
core: {},
|
|
26
26
|
})
|
|
27
27
|
|
|
28
28
|
const withClass = (member: IrClass): SchemaIR => ({
|
|
@@ -63,6 +63,8 @@ describe('canonical standalone Function diffs', () => {
|
|
|
63
63
|
const member = (required: string[], minLength: number): IrClass => ({
|
|
64
64
|
type: 'node',
|
|
65
65
|
name: 'Person',
|
|
66
|
+
origin: 'example.test',
|
|
67
|
+
ref: { origin: 'example.test', kind: 'class', name: 'Person' },
|
|
66
68
|
properties: { name: { type: 'string', minLength } },
|
|
67
69
|
required,
|
|
68
70
|
methods: {},
|
|
@@ -87,13 +89,15 @@ describe('canonical standalone Function diffs', () => {
|
|
|
87
89
|
...withClass({
|
|
88
90
|
type: 'edge',
|
|
89
91
|
name: 'owns',
|
|
92
|
+
origin: 'example.test',
|
|
93
|
+
ref: { origin: 'example.test', kind: 'class', name: 'owns' },
|
|
90
94
|
properties: {},
|
|
91
95
|
required: [],
|
|
92
96
|
methods: {},
|
|
93
97
|
orientation: 'directed',
|
|
94
98
|
endpoints: [],
|
|
95
99
|
}),
|
|
96
|
-
views: { home: { name: 'home', target: { kind: 'domain' }
|
|
100
|
+
views: { home: { name: 'home', target: { kind: 'domain' } } },
|
|
97
101
|
policies: { canRead: { anyOf: [] } },
|
|
98
102
|
dependencies: [{ origin: 'kernel.astrale.ai', revision: 'sha256:one' }],
|
|
99
103
|
core: { nodes: {}, edges: [] },
|
|
@@ -103,7 +107,15 @@ describe('canonical standalone Function diffs', () => {
|
|
|
103
107
|
classes: {
|
|
104
108
|
owns: { ...before.classes.owns, orientation: 'undirected' },
|
|
105
109
|
},
|
|
106
|
-
views: {
|
|
110
|
+
views: {
|
|
111
|
+
home: {
|
|
112
|
+
...before.views.home,
|
|
113
|
+
target: {
|
|
114
|
+
kind: 'definition',
|
|
115
|
+
definitions: [{ origin: 'example.test', kind: 'class', name: 'owns' }],
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
},
|
|
107
119
|
policies: { canRead: { anyOf: [{ name: 'owner' }] } },
|
|
108
120
|
dependencies: [{ origin: 'kernel.astrale.ai', revision: 'sha256:two' }],
|
|
109
121
|
core: { nodes: { root: {} }, edges: [] },
|
|
@@ -2,14 +2,12 @@
|
|
|
2
2
|
* diff.ts — indicative structural diff of two Studio render IRs. Pure.
|
|
3
3
|
*
|
|
4
4
|
* Canonical V1 keeps optionality in the owning `required` arrays and nullability
|
|
5
|
-
* in each value schema.
|
|
6
|
-
* inventory deliberately makes no installation or data-migration claim;
|
|
5
|
+
* in each value schema. This inventory makes no installation or data-migration claim;
|
|
7
6
|
* only the Kernel Runtime can assess those transitions against installed data.
|
|
8
7
|
*/
|
|
9
8
|
import type {
|
|
10
9
|
IrClass,
|
|
11
10
|
IrFunction,
|
|
12
|
-
IrInterface,
|
|
13
11
|
IrMethod,
|
|
14
12
|
JsonSchema,
|
|
15
13
|
SchemaChange,
|
|
@@ -32,28 +30,11 @@ export function baseType(s: JsonSchema | undefined): string {
|
|
|
32
30
|
return s.enum ? `enum(${s.enum.join(',')})` : 'unknown'
|
|
33
31
|
}
|
|
34
32
|
|
|
35
|
-
function requiredParams(m: IrMethod | IrFunction): string[] {
|
|
36
|
-
return (
|
|
37
|
-
m.requiredParams ??
|
|
38
|
-
Object.entries(m.params ?? {}).flatMap(([name, schema]) => (isOptional(schema) ? [] : [name]))
|
|
39
|
-
)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
33
|
function callableContract(m: IrMethod | IrFunction): unknown {
|
|
43
|
-
const required = requiredParams(m)
|
|
44
34
|
return {
|
|
45
|
-
input:
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
type: 'object',
|
|
49
|
-
properties: m.params ?? {},
|
|
50
|
-
required,
|
|
51
|
-
additionalProperties: false,
|
|
52
|
-
} satisfies JsonSchema),
|
|
53
|
-
required,
|
|
54
|
-
output: m.output ?? { mode: 'value', schema: m.returns },
|
|
55
|
-
static: m.static,
|
|
56
|
-
inheritance: m.inheritance,
|
|
35
|
+
input: m.input,
|
|
36
|
+
output: m.output,
|
|
37
|
+
...('static' in m ? { static: m.static, inheritance: m.inheritance } : {}),
|
|
57
38
|
auth: m.auth,
|
|
58
39
|
policy: m.policy,
|
|
59
40
|
}
|
|
@@ -76,15 +57,8 @@ export function diffSchemas(prev: SchemaIR | null, next: SchemaIR | null): Schem
|
|
|
76
57
|
changes.push({ kind: 'schema-metadata-changed', target: next.domain })
|
|
77
58
|
}
|
|
78
59
|
|
|
79
|
-
diffValueRecord(prev.
|
|
80
|
-
|
|
81
|
-
prev.importsByKey ?? prev.imports ?? {},
|
|
82
|
-
next.importsByKey ?? next.imports ?? {},
|
|
83
|
-
'import',
|
|
84
|
-
changes,
|
|
85
|
-
)
|
|
86
|
-
diffMembers(prev.interfaces ?? {}, next.interfaces ?? {}, 'interface', changes)
|
|
87
|
-
diffMembers(prev.classes ?? {}, next.classes ?? {}, 'class', changes)
|
|
60
|
+
diffValueRecord(prev.importsByKey, next.importsByKey, 'import', changes)
|
|
61
|
+
diffMembers(prev.classes, next.classes, changes)
|
|
88
62
|
diffFunctions(prev.functions ?? {}, next.functions ?? {}, changes)
|
|
89
63
|
diffViews(prev.views ?? {}, next.views ?? {}, changes)
|
|
90
64
|
diffValueRecord(prev.policies ?? {}, next.policies ?? {}, 'policy', changes)
|
|
@@ -98,7 +72,7 @@ export function diffSchemas(prev: SchemaIR | null, next: SchemaIR | null): Schem
|
|
|
98
72
|
function diffValueRecord(
|
|
99
73
|
prev: Record<string, unknown>,
|
|
100
74
|
next: Record<string, unknown>,
|
|
101
|
-
scope: '
|
|
75
|
+
scope: 'import' | 'policy',
|
|
102
76
|
out: SchemaChange[],
|
|
103
77
|
): void {
|
|
104
78
|
for (const name of sortedKeys(next)) {
|
|
@@ -150,15 +124,7 @@ function diffViews(
|
|
|
150
124
|
out.push({ kind: 'view-removed', target: name })
|
|
151
125
|
continue
|
|
152
126
|
}
|
|
153
|
-
if (
|
|
154
|
-
!same(
|
|
155
|
-
{ target: prev[name].target, auth: prev[name].auth },
|
|
156
|
-
{
|
|
157
|
-
target: next[name].target,
|
|
158
|
-
auth: next[name].auth,
|
|
159
|
-
},
|
|
160
|
-
)
|
|
161
|
-
) {
|
|
127
|
+
if (!same(prev[name].target, next[name].target)) {
|
|
162
128
|
out.push({ kind: 'view-changed', target: name })
|
|
163
129
|
}
|
|
164
130
|
if (prev[name].description !== next[name].description) {
|
|
@@ -196,15 +162,13 @@ function diffDependencies(
|
|
|
196
162
|
}
|
|
197
163
|
}
|
|
198
164
|
|
|
199
|
-
function memberKind(
|
|
200
|
-
|
|
201
|
-
return (m as IrClass).type === 'edge' ? 'edge' : 'class'
|
|
165
|
+
function memberKind(member: IrClass): 'class' | 'edge' {
|
|
166
|
+
return member.type === 'edge' ? 'edge' : 'class'
|
|
202
167
|
}
|
|
203
168
|
|
|
204
169
|
function diffMembers(
|
|
205
|
-
prev: Record<string, IrClass
|
|
206
|
-
next: Record<string, IrClass
|
|
207
|
-
_scope: 'class' | 'interface',
|
|
170
|
+
prev: Record<string, IrClass>,
|
|
171
|
+
next: Record<string, IrClass>,
|
|
208
172
|
out: SchemaChange[],
|
|
209
173
|
): void {
|
|
210
174
|
for (const name of sortedKeys(next)) {
|
|
@@ -223,12 +187,7 @@ function diffMembers(
|
|
|
223
187
|
}
|
|
224
188
|
}
|
|
225
189
|
|
|
226
|
-
function diffMemberBody(
|
|
227
|
-
name: string,
|
|
228
|
-
a: IrClass | IrInterface,
|
|
229
|
-
b: IrClass | IrInterface,
|
|
230
|
-
out: SchemaChange[],
|
|
231
|
-
): void {
|
|
190
|
+
function diffMemberBody(name: string, a: IrClass, b: IrClass, out: SchemaChange[]): void {
|
|
232
191
|
const pa = a.properties ?? {}
|
|
233
192
|
const pb = b.properties ?? {}
|
|
234
193
|
for (const p of sortedKeys(pb)) {
|
|
@@ -302,31 +261,27 @@ function diffMemberBody(
|
|
|
302
261
|
}
|
|
303
262
|
}
|
|
304
263
|
|
|
305
|
-
function propertyRequired(member: IrClass
|
|
264
|
+
function propertyRequired(member: IrClass, name: string): boolean {
|
|
306
265
|
return member.required ? member.required.includes(name) : !isOptional(member.properties?.[name])
|
|
307
266
|
}
|
|
308
267
|
|
|
309
|
-
function memberContract(member: IrClass
|
|
310
|
-
const cls = member as IrClass
|
|
311
|
-
const iface = member as IrInterface
|
|
268
|
+
function memberContract(member: IrClass): unknown {
|
|
312
269
|
return {
|
|
313
270
|
type: member.type,
|
|
314
271
|
origin: member.origin,
|
|
315
272
|
ref: member.ref,
|
|
316
|
-
|
|
317
|
-
extends: iface.extendsRefs ?? iface.extends,
|
|
318
|
-
implements: cls.implementsRefs ?? cls.implements,
|
|
273
|
+
extends: member.extendsRefs ?? member.extends,
|
|
319
274
|
endpoints: member.endpoints,
|
|
320
275
|
orientation: member.orientation,
|
|
321
276
|
constraints: member.constraints,
|
|
322
277
|
propertyMetadata: member.propertyMetadata,
|
|
323
278
|
data: member.data,
|
|
324
|
-
policies:
|
|
279
|
+
policies: member.policies,
|
|
325
280
|
}
|
|
326
281
|
}
|
|
327
282
|
|
|
328
|
-
function memberMetadata(member: IrClass
|
|
329
|
-
return { description: member.description, icon:
|
|
283
|
+
function memberMetadata(member: IrClass): unknown {
|
|
284
|
+
return { description: member.description, icon: member.icon }
|
|
330
285
|
}
|
|
331
286
|
|
|
332
287
|
function sortedKeys(value: Record<string, unknown>): string[] {
|
|
@@ -1,136 +1,37 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
* runtime.ts. It imports ONLY the domain's pure `schema/index.ts` module graph
|
|
4
|
-
* (never astrale.config.ts or the composition entry → integrations). Canonical
|
|
5
|
-
* DomainSchema V1 roots are projected directly; legacy `D.$.ir` / serialize
|
|
6
|
-
* domains retain their existing fallback.
|
|
7
|
-
*
|
|
8
|
-
* bun extractor.ts <schemaIndexPath> <domainDir>
|
|
9
|
-
*
|
|
10
|
-
* A thrown error prints { ok:false } and exits 0 — the driver treats it as a
|
|
11
|
-
* render state, never a crash.
|
|
12
|
-
*/
|
|
13
|
-
import {
|
|
14
|
-
admitCanonicalSchemaFromSdk,
|
|
15
|
-
findCanonicalDomainSchemaExport,
|
|
16
|
-
normalizeLegacySchemaIR,
|
|
17
|
-
projectCanonicalSchema,
|
|
18
|
-
} from './canonical-schema'
|
|
1
|
+
/** Bun subprocess that imports only the authored Schema entry and its installed SDK. */
|
|
2
|
+
import type { SchemaSdk } from './canonical-schema'
|
|
19
3
|
|
|
20
|
-
|
|
21
|
-
const domainDir = process.argv[3] ?? process.cwd()
|
|
22
|
-
|
|
23
|
-
async function main() {
|
|
24
|
-
if (!schemaPath) throw new Error('extractor: missing <schemaIndexPath>')
|
|
25
|
-
const mod: Record<string, any> = await import(schemaPath)
|
|
26
|
-
|
|
27
|
-
// Resolve through the DOMAIN's dependency graph. This prevents Studio's own
|
|
28
|
-
// SDK version from accepting or resolving a root authored by another cohort.
|
|
29
|
-
let sdk: Record<string, any> | null = null
|
|
30
|
-
const loadSdkSchema = async (): Promise<Record<string, any>> => {
|
|
31
|
-
if (sdk) return sdk
|
|
32
|
-
const loaded: Record<string, any> = await import(
|
|
33
|
-
Bun.resolveSync('@astrale-os/sdk/schema', domainDir)
|
|
34
|
-
)
|
|
35
|
-
sdk = loaded
|
|
36
|
-
return loaded
|
|
37
|
-
}
|
|
4
|
+
import { extractCanonicalSchemaFromSdk, findCanonicalDomainSchemaExport } from './canonical-schema'
|
|
38
5
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
root: admission.root,
|
|
49
|
-
schemaMode: admission.status === 'admitted' ? 'canonical-admitted' : 'canonical-preview',
|
|
50
|
-
revision: admission.revision,
|
|
51
|
-
importedInterfaces: projected.importedInterfaces,
|
|
52
|
-
}),
|
|
53
|
-
)
|
|
54
|
-
return
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Prefer the conventional `D` (compiled), but accept a compiled domain exported
|
|
58
|
-
// under ANY name — e.g. ai-gateway exports its `compileDomain(...)` result as
|
|
59
|
-
// `Gateway`, not `D`. A compiled domain is recognized by shape (`.$.ir`).
|
|
60
|
-
let ir: unknown = mod?.D?.$?.ir
|
|
61
|
-
if (!ir) {
|
|
62
|
-
for (const v of Object.values(mod)) {
|
|
63
|
-
const candidate = (v as any)?.$?.ir
|
|
64
|
-
if (candidate) {
|
|
65
|
-
ir = candidate
|
|
66
|
-
break
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
if (!ir) {
|
|
71
|
-
// Fallback: serialize a raw schema — the conventional `schema`, else any
|
|
72
|
-
// exported `defineSchema(...)` result (recognized by its `kind === 'schema'`).
|
|
73
|
-
const schema =
|
|
74
|
-
mod?.schema ??
|
|
75
|
-
Object.values(mod).find(
|
|
76
|
-
(v) =>
|
|
77
|
-
typeof (v as any)?.domain === 'string' && !!(v as any)?.classes && !!(v as any)?.imports,
|
|
78
|
-
)
|
|
79
|
-
if (!schema) {
|
|
80
|
-
throw new Error(
|
|
81
|
-
'schema entry exports no compiled domain (a `compileDomain(...)` value with `.$.ir`, e.g. `D`) nor a raw `schema`',
|
|
82
|
-
)
|
|
83
|
-
}
|
|
84
|
-
const d = await loadSdkSchema()
|
|
85
|
-
if (typeof d.serialize !== 'function') throw new Error('kernel-dsl.serialize unavailable')
|
|
86
|
-
ir = d.serialize(schema)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Recover member bodies of IMPORTED interfaces (kernel mixins + cross-domain
|
|
90
|
-
// interfaces). `serialize()` emits them in `ir.imports` as name-only
|
|
91
|
-
// descriptors, so re-serialize each imported schema (KernelSchema, other
|
|
92
|
-
// domains) and collect its interface definitions. Best-effort: a single import
|
|
93
|
-
// failing to serialize must never break extraction of the primary IR.
|
|
94
|
-
const importedInterfaces: Record<string, unknown> = {}
|
|
95
|
-
const importSchemas: any[] = Array.isArray(mod?.schema?.imports) ? mod.schema.imports : []
|
|
96
|
-
if (importSchemas.length > 0) {
|
|
97
|
-
try {
|
|
98
|
-
const d = await loadSdkSchema()
|
|
99
|
-
if (typeof d.serialize === 'function') {
|
|
100
|
-
for (const imp of importSchemas) {
|
|
101
|
-
try {
|
|
102
|
-
const sub = d.serialize(imp)
|
|
103
|
-
for (const [name, def] of Object.entries(sub?.interfaces ?? {})) {
|
|
104
|
-
if (!(name in importedInterfaces)) importedInterfaces[name] = def
|
|
105
|
-
}
|
|
106
|
-
} catch {
|
|
107
|
-
/* skip this import — keep going */
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
} catch {
|
|
112
|
-
/* dsl unavailable — degrade gracefully (no imported-interface bodies) */
|
|
113
|
-
}
|
|
6
|
+
const schemaPath = process.argv[2]
|
|
7
|
+
const projectRoot = process.argv[3] ?? process.cwd()
|
|
8
|
+
|
|
9
|
+
async function main(): Promise<void> {
|
|
10
|
+
if (!schemaPath) throw new Error('extractor: missing <schemaPath>')
|
|
11
|
+
const exports = (await import(schemaPath)) as Record<string, unknown>
|
|
12
|
+
const candidate = findCanonicalDomainSchemaExport(exports)
|
|
13
|
+
if (candidate === null) {
|
|
14
|
+
throw new Error('Schema entry exports no canonical V1 DomainSchema.')
|
|
114
15
|
}
|
|
115
|
-
|
|
16
|
+
const sdk = (await import(
|
|
17
|
+
Bun.resolveSync('@astrale-os/sdk/schema', projectRoot)
|
|
18
|
+
)) as unknown as SchemaSdk
|
|
19
|
+
const extraction = extractCanonicalSchemaFromSdk(sdk, candidate)
|
|
116
20
|
process.stdout.write(
|
|
117
21
|
JSON.stringify({
|
|
118
22
|
ok: true,
|
|
119
|
-
ir:
|
|
120
|
-
root:
|
|
121
|
-
schemaMode: '
|
|
122
|
-
revision:
|
|
123
|
-
importedInterfaces,
|
|
23
|
+
ir: extraction.ir,
|
|
24
|
+
root: extraction.root,
|
|
25
|
+
schemaMode: extraction.status === 'admitted' ? 'canonical-admitted' : 'canonical-preview',
|
|
26
|
+
revision: extraction.revision,
|
|
124
27
|
}),
|
|
125
28
|
)
|
|
126
29
|
}
|
|
127
30
|
|
|
128
|
-
main().catch((
|
|
31
|
+
main().catch((cause: unknown) => {
|
|
32
|
+
const error = cause instanceof Error ? cause : new Error(String(cause))
|
|
129
33
|
process.stdout.write(
|
|
130
|
-
JSON.stringify({
|
|
131
|
-
ok: false,
|
|
132
|
-
error: { message: String(err?.message ?? err), stack: String(err?.stack ?? '') },
|
|
133
|
-
}),
|
|
34
|
+
JSON.stringify({ ok: false, error: { message: error.message, stack: error.stack ?? '' } }),
|
|
134
35
|
)
|
|
135
36
|
process.exit(0)
|
|
136
37
|
})
|