@astrale-os/cli 1.0.0-beta.2 → 1.0.0-beta.20

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.
Files changed (282) hide show
  1. package/README.md +16 -1
  2. package/dist/astrale.js +51105 -58057
  3. package/dist/public/connect-core.js +2085 -30702
  4. package/dist/public/keys/index.js +884 -29476
  5. package/dist/public/paths/index.js +13101 -41452
  6. package/dist/types/admin/contract.d.ts +26 -0
  7. package/dist/types/admin/instance/client.d.ts +20 -0
  8. package/dist/types/admin/instance/index.d.ts +2 -0
  9. package/dist/types/admin/instance/model.d.ts +6 -10
  10. package/dist/types/connection/auth.d.ts +3 -0
  11. package/dist/types/connection/call.d.ts +3 -0
  12. package/dist/types/connection/command.d.ts +27 -0
  13. package/dist/types/connection/credential.d.ts +14 -0
  14. package/dist/types/connection/errors.d.ts +1 -0
  15. package/dist/types/connection/exchange.d.ts +9 -0
  16. package/dist/types/connection/failure/classify.d.ts +2 -0
  17. package/dist/types/connection/failure/index.d.ts +5 -0
  18. package/dist/types/connection/failure/model.d.ts +25 -0
  19. package/dist/types/connection/failure/render.d.ts +3 -0
  20. package/dist/types/connection/index.d.ts +8 -0
  21. package/dist/types/connection/reasons.d.ts +37 -0
  22. package/dist/types/connection/self.d.ts +37 -0
  23. package/dist/types/connection/session.d.ts +31 -0
  24. package/dist/types/connection/target.d.ts +38 -0
  25. package/dist/types/errors.d.ts +1 -1
  26. package/dist/types/lib/admin-instance.d.ts +17 -0
  27. package/dist/types/lib/admin-target.d.ts +11 -36
  28. package/dist/types/lib/config.d.ts +7 -59
  29. package/dist/types/lib/failure-debug.d.ts +1 -0
  30. package/dist/types/lib/idp.d.ts +25 -173
  31. package/dist/types/lib/instance-target.d.ts +1 -1
  32. package/dist/types/lib/instance.d.ts +30 -88
  33. package/dist/types/lib/log.d.ts +5 -3
  34. package/dist/types/lib/output.d.ts +1 -1
  35. package/dist/types/lib/proc.d.ts +43 -0
  36. package/dist/types/lib/self.d.ts +9 -0
  37. package/dist/types/lib/update.d.ts +109 -0
  38. package/dist/types/lib/validation.d.ts +4 -1
  39. package/package.json +15 -20
  40. package/src/__tests__/fixtures/publication.ts +20 -0
  41. package/src/admin/.spec/architecture.md +12 -5
  42. package/src/admin/__tests__/fixture.ts +25 -0
  43. package/src/admin/catalog/.spec/api.d.ts +1 -3
  44. package/src/admin/catalog/.spec/architecture.md +5 -4
  45. package/src/admin/catalog/__tests__/client.test.ts +143 -69
  46. package/src/admin/catalog/client.ts +40 -54
  47. package/src/admin/catalog/model.ts +3 -4
  48. package/src/admin/contract.ts +46 -0
  49. package/src/admin/graph/.spec/api.d.ts +4 -10
  50. package/src/admin/graph/nodes.ts +1 -1
  51. package/src/admin/instance/.spec/api.d.ts +5 -9
  52. package/src/admin/instance/.spec/architecture.md +7 -7
  53. package/src/admin/instance/__tests__/client.test.ts +157 -175
  54. package/src/admin/instance/client.ts +39 -128
  55. package/src/admin/instance/index.ts +1 -2
  56. package/src/admin/instance/model.ts +12 -18
  57. package/src/commands/__tests__/admin-instance.test.ts +11 -8
  58. package/src/commands/__tests__/call-describe.test.ts +46 -33
  59. package/src/commands/__tests__/call.test.ts +34 -0
  60. package/src/commands/__tests__/domain-install-operation.test.ts +7 -22
  61. package/src/commands/__tests__/domain-install-owned.test.ts +1 -1
  62. package/src/commands/__tests__/domain-list.test.ts +5 -25
  63. package/src/commands/__tests__/install-direct.test.ts +115 -8
  64. package/src/commands/__tests__/install-identity-override.test.ts +3 -14
  65. package/src/commands/__tests__/instance-list-rows.test.ts +1 -1
  66. package/src/commands/__tests__/instance-status.test.ts +139 -0
  67. package/src/commands/__tests__/introspect-parse.test.ts +80 -1
  68. package/src/commands/__tests__/logs.test.ts +250 -2
  69. package/src/commands/__tests__/read-commands.test.ts +62 -10
  70. package/src/commands/__tests__/token-ttl.test.ts +49 -4
  71. package/src/commands/__tests__/update.test.ts +25 -3
  72. package/src/commands/__tests__/view.test.ts +49 -0
  73. package/src/commands/call-describe.ts +60 -68
  74. package/src/commands/call.ts +71 -59
  75. package/src/commands/domain/install.ts +54 -35
  76. package/src/commands/domain/list.ts +1 -1
  77. package/src/commands/domain/publish.ts +14 -11
  78. package/src/commands/domain/uninstall.ts +2 -2
  79. package/src/commands/get.ts +14 -15
  80. package/src/commands/identity/__tests__/register.test.ts +3 -3
  81. package/src/commands/identity/register.ts +5 -4
  82. package/src/commands/instance/create.ts +8 -16
  83. package/src/commands/instance/delete.ts +12 -9
  84. package/src/commands/instance/list.ts +2 -2
  85. package/src/commands/instance/status.ts +66 -20
  86. package/src/commands/instance/use.ts +16 -12
  87. package/src/commands/introspect.ts +48 -35
  88. package/src/commands/logs.ts +123 -33
  89. package/src/commands/mutate.ts +6 -5
  90. package/src/commands/query.ts +35 -32
  91. package/src/commands/token.ts +42 -27
  92. package/src/commands/ui/__tests__/commands.test.ts +152 -0
  93. package/src/commands/ui/add.ts +51 -0
  94. package/src/commands/ui/doctor.ts +13 -0
  95. package/src/commands/ui/init.ts +38 -0
  96. package/src/commands/ui/list.ts +26 -0
  97. package/src/commands/ui/preset-apply.ts +19 -0
  98. package/src/commands/ui/preset-list.ts +12 -0
  99. package/src/commands/ui/shared.ts +25 -0
  100. package/src/commands/update.ts +31 -11
  101. package/src/commands/view.ts +82 -37
  102. package/src/connection/.spec/api.d.ts +7 -8
  103. package/src/connection/.spec/architecture.md +5 -4
  104. package/src/connection/.spec/flows/session.ts +2 -2
  105. package/src/connection/.spec/laws/connection.ts +6 -2
  106. package/src/connection/.spec/layout.ts +1 -0
  107. package/src/connection/__tests__/credential.test.ts +20 -1
  108. package/src/connection/__tests__/errors.test.ts +27 -20
  109. package/src/connection/__tests__/exchange.test.ts +30 -1
  110. package/src/connection/__tests__/failure-fixtures.ts +39 -0
  111. package/src/connection/__tests__/failure-safety.test.ts +75 -0
  112. package/src/connection/__tests__/self.test.ts +31 -11
  113. package/src/connection/__tests__/session.test.ts +3 -3
  114. package/src/connection/__tests__/target.test.ts +1 -0
  115. package/src/connection/auth.ts +13 -0
  116. package/src/connection/call.ts +1 -1
  117. package/src/connection/credential.ts +2 -2
  118. package/src/connection/errors.ts +1 -355
  119. package/src/connection/exchange.ts +47 -23
  120. package/src/connection/failure/classify.ts +110 -0
  121. package/src/connection/failure/index.ts +18 -0
  122. package/src/connection/failure/model.ts +28 -0
  123. package/src/connection/failure/render.ts +116 -0
  124. package/src/connection/reasons.ts +16 -0
  125. package/src/connection/self.ts +39 -21
  126. package/src/connection/session.ts +19 -8
  127. package/src/errors.ts +3 -2
  128. package/src/graph/.spec/api.d.ts +12 -5
  129. package/src/graph/.spec/layout.ts +9 -1
  130. package/src/graph/__tests__/mutation.test.ts +2 -2
  131. package/src/graph/__tests__/query.test.ts +25 -6
  132. package/src/graph/class.ts +30 -0
  133. package/src/graph/index.ts +1 -0
  134. package/src/graph/query.ts +21 -32
  135. package/src/identity/.spec/api.d.ts +2 -2
  136. package/src/identity/__tests__/registration.test.ts +1 -1
  137. package/src/identity/registration.ts +3 -3
  138. package/src/keys/__tests__/keys.test.ts +4 -0
  139. package/src/keys/credential.ts +1 -0
  140. package/src/lib/__tests__/admin-target.test.ts +12 -0
  141. package/src/lib/__tests__/binary.test.ts +16 -1
  142. package/src/lib/__tests__/command-dx.test.ts +1 -1
  143. package/src/lib/__tests__/domain-publication.test.ts +10 -16
  144. package/src/lib/__tests__/idp.test.ts +34 -4
  145. package/src/lib/__tests__/instance-candidates.test.ts +1 -3
  146. package/src/lib/__tests__/instance-target.test.ts +7 -39
  147. package/src/lib/__tests__/log-errors.test.ts +64 -0
  148. package/src/lib/__tests__/studio-server-deps.test.ts +1 -1
  149. package/src/lib/__tests__/update.test.ts +264 -11
  150. package/src/lib/__tests__/view-assets.test.ts +14 -0
  151. package/src/lib/__tests__/view-external-open-intent.test.ts +150 -0
  152. package/src/lib/__tests__/view-external-open-origins.test.ts +27 -0
  153. package/src/lib/__tests__/view-open-intent.test.ts +0 -2
  154. package/src/lib/__tests__/view-server.test.ts +26 -3
  155. package/src/lib/__tests__/view-session.test.ts +2 -1
  156. package/src/lib/admin-instance.ts +14 -8
  157. package/src/lib/admin-target.ts +21 -2
  158. package/src/lib/binary.ts +22 -5
  159. package/src/lib/command-dx.ts +9 -9
  160. package/src/lib/domain-publication.ts +9 -7
  161. package/src/lib/failure-debug.ts +26 -0
  162. package/src/lib/idp.ts +34 -3
  163. package/src/lib/instance-candidates.ts +2 -2
  164. package/src/lib/instance-target.ts +3 -14
  165. package/src/lib/instance.ts +16 -11
  166. package/src/lib/log.ts +16 -9
  167. package/src/lib/output.ts +1 -1
  168. package/src/lib/proc.ts +7 -2
  169. package/src/lib/provision-instance.ts +34 -57
  170. package/src/lib/update.ts +298 -45
  171. package/src/lib/validation.ts +2 -2
  172. package/src/lib/view/assets.ts +11 -2
  173. package/src/lib/view/external-open-intent.ts +41 -0
  174. package/src/lib/view/external-open-origins.ts +37 -0
  175. package/src/lib/view/host-capabilities.ts +17 -0
  176. package/src/lib/view/resolve.ts +1 -1
  177. package/src/lib/view/server.ts +18 -3
  178. package/src/lib/view/session.ts +2 -0
  179. package/src/program/.spec/api.d.ts +1 -0
  180. package/src/program/__tests__/program.test.ts +163 -6
  181. package/src/program/argv.ts +14 -0
  182. package/src/program/build.ts +26 -4
  183. package/src/program/command.ts +1 -0
  184. package/src/program/index.ts +1 -0
  185. package/src/program/registry.ts +2 -1
  186. package/src/setup/__tests__/instance-step.test.ts +27 -10
  187. package/src/setup/steps/instance.ts +22 -15
  188. package/src/telemetry/__tests__/recorder.test.ts +1 -0
  189. package/src/telemetry/recorder.ts +9 -1
  190. package/src/ui/.spec/api.d.ts +14 -0
  191. package/src/ui/.spec/architecture.md +10 -0
  192. package/src/ui/.spec/laws.ts +36 -0
  193. package/src/ui/.spec/layout.ts +16 -0
  194. package/src/ui/__tests__/ui.test.ts +981 -0
  195. package/src/ui/index.ts +13 -0
  196. package/src/ui/lock.ts +87 -0
  197. package/src/ui/model.ts +83 -0
  198. package/src/ui/operations.ts +710 -0
  199. package/src/ui/project.ts +219 -0
  200. package/src/ui/release.ts +321 -0
  201. package/src/ui/runner.ts +18 -0
  202. package/studio/client/dist/assets/elk-api-DjmKsHXc.js +1 -0
  203. package/studio/client/dist/assets/index-7YHdeCxp.js +81 -0
  204. package/studio/client/dist/assets/index-C0FAnwNw.css +2 -0
  205. package/studio/client/dist/assets/rolldown-runtime-Dd_uD5pT.js +1 -0
  206. package/studio/client/dist/assets/schema-studio-BilUNb6Z.css +1 -0
  207. package/studio/client/dist/assets/schema-studio-CABpTfvH.js +8 -0
  208. package/studio/client/dist/index.html +3 -2
  209. package/studio/package.json +7 -13
  210. package/studio/server/agent/ask.test.ts +1 -1
  211. package/studio/server/agent/bridge/grant.test.ts +1 -1
  212. package/studio/server/agent/bridge/routes.test.ts +1 -1
  213. package/studio/server/agent/harness/claude/adapter.test.ts +15 -5
  214. package/studio/server/agent/harness/gateway/token.test.ts +1 -1
  215. package/studio/server/agent/harness/gateway/token.ts +3 -3
  216. package/studio/server/agent/prompts/anchors.test.ts +32 -36
  217. package/studio/server/agent/prompts/anchors.ts +20 -49
  218. package/studio/server/agent/prompts/system.test.ts +3 -2
  219. package/studio/server/agent/prompts/system.ts +3 -3
  220. package/studio/server/agent/routes.test.ts +1 -1
  221. package/studio/server/agent/run/coordinator.test.ts +1 -1
  222. package/studio/server/api/canvas.ts +0 -1
  223. package/studio/server/api-agent-loadout.test.ts +1 -1
  224. package/studio/server/api.test.ts +1 -1
  225. package/studio/server/cache.test.ts +23 -12
  226. package/studio/server/cache.ts +12 -15
  227. package/studio/server/domain.test.ts +50 -68
  228. package/studio/server/domain.ts +82 -63
  229. package/studio/server/handoff/copy.ts +1 -1
  230. package/studio/server/index.ts +1 -1
  231. package/studio/server/instances/probe.test.ts +1 -1
  232. package/studio/server/introspect/anatomy/views/routes.ts +46 -37
  233. package/studio/server/introspect/anatomy/views.ts +9 -14
  234. package/studio/server/introspect/anatomy-extras.test.ts +26 -42
  235. package/studio/server/introspect/anatomy.test.ts +22 -14
  236. package/studio/server/introspect/anatomy.ts +6 -9
  237. package/studio/server/introspect/bundle.ts +0 -3
  238. package/studio/server/introspect/canonical-schema.test.ts +94 -389
  239. package/studio/server/introspect/canonical-schema.ts +227 -457
  240. package/studio/server/introspect/core-extractor.ts +18 -127
  241. package/studio/server/introspect/core.ts +1 -2
  242. package/studio/server/introspect/diff.test.ts +11 -7
  243. package/studio/server/introspect/diff.ts +18 -55
  244. package/studio/server/introspect/extractor.ts +22 -117
  245. package/studio/server/introspect/overlay-tsmorph.test.ts +119 -240
  246. package/studio/server/introspect/overlay.test.ts +26 -54
  247. package/studio/server/introspect/overlay.ts +10 -37
  248. package/studio/server/introspect/revision.test.ts +1 -1
  249. package/studio/server/introspect/revision.ts +1 -1
  250. package/studio/server/introspect/runtime.test.ts +65 -183
  251. package/studio/server/introspect/runtime.ts +8 -25
  252. package/studio/server/introspect/schema-ir-json.test.ts +70 -0
  253. package/studio/server/introspect/schema-ir-json.ts +38 -68
  254. package/studio/server/introspect/schema-refs.test.ts +43 -88
  255. package/studio/server/introspect/schema-refs.ts +14 -49
  256. package/studio/server/introspect/source-overlay/handlers.ts +116 -636
  257. package/studio/server/introspect/source-overlay/kernel-calls.ts +0 -3
  258. package/studio/server/introspect/source-overlay/spans.ts +15 -45
  259. package/studio/server/state/baseline.test.ts +14 -9
  260. package/studio/server/state/baseline.ts +3 -5
  261. package/studio/server/state/visibility.ts +1 -5
  262. package/studio/server/views/model.ts +3 -3
  263. package/studio/server/views/target.test.ts +17 -74
  264. package/studio/server/views/target.ts +24 -50
  265. package/studio/server/watch.test.ts +11 -11
  266. package/studio/server/watch.ts +8 -4
  267. package/studio/server/workspace-watch.ts +2 -2
  268. package/studio/shared/contracts/schema.ts +38 -107
  269. package/studio/shared/contracts/surface.test.ts +13 -15
  270. package/studio/shared/contracts/workspace.ts +2 -11
  271. package/studio/shared/schema/identity.test.ts +20 -44
  272. package/studio/shared/schema/identity.ts +9 -23
  273. package/viewer/dist/main.js +30 -51
  274. package/.check-workspace.cjs +0 -40
  275. package/src/admin/binding.ts +0 -168
  276. package/src/commands/__tests__/instance-create-hosts.test.ts +0 -29
  277. package/studio/client/dist/assets/elk-api-lwhFo7vB.js +0 -1
  278. package/studio/client/dist/assets/index-B-c-smo9.js +0 -8
  279. package/studio/client/dist/assets/index-BckHuAWk.js +0 -81
  280. package/studio/client/dist/assets/index-C4aNQ6dz.css +0 -1
  281. package/studio/client/dist/assets/index-ChOr3yP0.css +0 -1
  282. package/studio/server/introspect/anatomy/views/legacy.ts +0 -232
@@ -1,139 +1,30 @@
1
- /**
2
- * core-extractor.ts — the Bun-executed island for a domain's CORE (genesis) data.
3
- * Spawned as a short-lived subprocess by runtime.ts (cwd = domain dir, so the
4
- * domain's own node_modules resolve @astrale-os/*). It imports the pure schema
5
- * entry and reads canonical V1 `schema.core` directly. Importing the composition
6
- * entry and discovering legacy `defineCore(...)` output is retained only as a
7
- * fallback.
8
- *
9
- * bun core-extractor.ts <schemaIndexPath> <domainFile> <domainDir>
10
- *
11
- * Contract mirrors extractor.ts exactly: NEVER crash. A thrown error prints
12
- * { ok:false } and exits 0 — the driver treats it as a render state. A domain
13
- * with no core prints { ok:true, core:null }.
14
- *
15
- * NOTE: the `export {}` below marks this as a module so its top-level `domainDir`/
16
- * `main` are module-scoped (extractor.ts is a sibling script with the same names).
17
- *
18
- * className resolution: a core node's `def` is the runtime class-definition
19
- * object (shape `{ __kind, config }` — it carries NO name field). We resolve the
20
- * name by identity-matching `def` against the core's own `schema.classes` /
21
- * `schema.interfaces`, AND every `schema.imports[*]` group — imported kernel
22
- * classes like `Folder` ONLY resolve via the imports walk. `data` is passed
23
- * through as the author wrote it in `node(Class, {...})` (most readable form).
24
- */
25
- export {} // module marker — see header note
1
+ /** Bun subprocess that projects canonical Core directly from the pure Schema entry. */
26
2
  import { isAbsolute, resolve } from 'node:path'
27
3
 
28
4
  import { findCanonicalDomainSchemaExport, projectCanonicalCore } from './canonical-schema'
29
5
 
30
- const domainDir = process.argv[4] ?? process.cwd()
31
- const resolveInput = (file: string | undefined): string | undefined =>
32
- file && !isAbsolute(file) ? resolve(domainDir, file) : file
33
- const schemaFile = resolveInput(process.argv[2])
34
- const domainFile = resolveInput(process.argv[3])
6
+ const projectRoot = process.argv[3] ?? process.cwd()
7
+ const input = process.argv[2]
8
+ const schemaFile = input && !isAbsolute(input) ? resolve(projectRoot, input) : input
35
9
 
36
- type AnyRec = Record<string, any>
37
-
38
- /** A defineCore() result: flat __nodes/__edges arrays + its schema + domain. */
39
- function looksLikeCore(v: any): boolean {
40
- return (
41
- !!v &&
42
- typeof v === 'object' &&
43
- Array.isArray(v.__nodes) &&
44
- Array.isArray(v.__edges) &&
45
- !!v.schema &&
46
- typeof v.domain === 'string'
10
+ async function main(): Promise<void> {
11
+ if (!schemaFile) throw new Error('core-extractor: missing <schemaPath>')
12
+ const exports = (await import(schemaFile)) as Record<string, unknown>
13
+ const schema = findCanonicalDomainSchemaExport(exports)
14
+ if (schema === null) throw new Error('Schema entry exports no canonical V1 DomainSchema.')
15
+ const core = projectCanonicalCore(schema)
16
+ process.stdout.write(
17
+ JSON.stringify({
18
+ ok: true,
19
+ core: core.nodes.length === 0 && core.edges.length === 0 ? null : core,
20
+ }),
47
21
  )
48
22
  }
49
23
 
50
- /** Find the Core object — wired as `domain.core`, exported directly, or by shape. */
51
- function findCore(mod: AnyRec): any {
52
- const wired = mod?.domain?.core ?? mod?.default?.core ?? mod?.core
53
- if (looksLikeCore(wired)) return wired
54
- // export name varies per domain (GatewayCore / IntegrationCore / …) — scan by shape
55
- for (const v of Object.values(mod ?? {})) {
56
- if (looksLikeCore(v)) return v
57
- if (v && typeof v === 'object' && looksLikeCore((v as AnyRec).core)) return (v as AnyRec).core
58
- }
59
- return null
60
- }
61
-
62
- /** Build def→className from the schema's own classes/interfaces + imported schemas. */
63
- function classNameMap(schema: AnyRec): Map<any, string> {
64
- const m = new Map<any, string>()
65
- const add = (group?: AnyRec) => {
66
- for (const [name, def] of Object.entries(group ?? {})) if (def && !m.has(def)) m.set(def, name)
67
- }
68
- add(schema?.interfaces)
69
- add(schema?.classes)
70
- for (const imp of schema?.imports ?? []) {
71
- add(imp?.interfaces)
72
- add(imp?.classes)
73
- }
74
- return m
75
- }
76
-
77
- async function main() {
78
- if (!schemaFile) throw new Error('core-extractor: missing <schemaIndexPath>')
79
-
80
- // Current SDK roots embed genesis data in the canonical, portable schema.
81
- // Do not import implementation.ts/domain.ts when that source of truth exists.
82
- try {
83
- const schemaModule: AnyRec = await import(schemaFile)
84
- const canonical = findCanonicalDomainSchemaExport(schemaModule)
85
- if (canonical) {
86
- const core = projectCanonicalCore(canonical)
87
- const empty = core.nodes.length === 0 && core.edges.length === 0
88
- process.stdout.write(JSON.stringify({ ok: true, core: empty ? null : core }))
89
- return
90
- }
91
- } catch {
92
- // A legacy composition entry may still expose a valid defineCore result.
93
- }
94
-
95
- if (!domainFile) throw new Error('core-extractor: missing <domainFile> legacy fallback')
96
- const mod: AnyRec = await import(domainFile)
97
- const core = findCore(mod)
98
- if (!core) {
99
- process.stdout.write(JSON.stringify({ ok: true, core: null }))
100
- return
101
- }
102
-
103
- const names = classNameMap(core.schema)
104
- const nameOf = (def: any): string => names.get(def) ?? def?.config?.name ?? def?.name ?? '?'
105
- // CorePath is a branded string; nested parents are objects with toString/valueOf,
106
- // so String() is the correct universal coercion (never JSON.stringify a path).
107
- const pathStr = (p: any): string => (p == null ? '' : String(p))
108
- // An edge endpoint is a CorePath OR a SelfMarker ({ type:'core-self', __def }).
109
- const endpoint = (e: any): string =>
110
- e && typeof e === 'object' && (e.type === 'core-self' || e.__def)
111
- ? `self(${nameOf(e.__def)})`
112
- : pathStr(e)
113
-
114
- const nodes = (core.__nodes ?? []).map((n: AnyRec) => ({
115
- path: pathStr(n.path),
116
- className: nameOf(n.def),
117
- data: n.data ?? {},
118
- ...(n.parent != null ? { parent: pathStr(n.parent) } : {}),
119
- }))
120
-
121
- const edges = (core.__edges ?? []).map((e: AnyRec) => ({
122
- from: endpoint(e.from),
123
- to: endpoint(e.to),
124
- edgeName: nameOf(e.edge),
125
- ...(e.data != null ? { data: e.data } : {}),
126
- }))
127
-
128
- process.stdout.write(JSON.stringify({ ok: true, core: { domain: core.domain, nodes, edges } }))
129
- }
130
-
131
- main().catch((err: any) => {
24
+ main().catch((cause: unknown) => {
25
+ const error = cause instanceof Error ? cause : new Error(String(cause))
132
26
  process.stdout.write(
133
- JSON.stringify({
134
- ok: false,
135
- error: { message: String(err?.message ?? err), stack: String(err?.stack ?? '') },
136
- }),
27
+ JSON.stringify({ ok: false, error: { message: error.message, stack: error.stack ?? '' } }),
137
28
  )
138
29
  process.exit(0)
139
30
  })
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * core.ts — assembles a domain's StudioCore: the genesis node/edge graph
3
- * extracted from canonical `schema.core` (or legacy `defineCore` fallback), gated
3
+ * extracted from canonical `schema.core`, gated
4
4
  * on installed deps. Never throws; a failed import or a domain with no core both
5
5
  * become a well-formed (empty) render state.
6
6
  */
@@ -28,7 +28,6 @@ export async function buildCore(handle: DomainHandle): Promise<StudioCore> {
28
28
 
29
29
  const r = await coreExtract(
30
30
  handle.schemaIndex,
31
- handle.domainFile,
32
31
  handle.root,
33
32
  readSettings(handle.root).introspectTimeoutMs,
34
33
  )
@@ -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
- imports: {},
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,6 +89,8 @@ 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: {},
@@ -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. Legacy nullable projections remain supported. This
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
- m.input ??
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.types ?? {}, next.types ?? {}, 'type', changes)
80
- diffValueRecord(
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: 'type' | 'import' | 'policy',
75
+ scope: 'import' | 'policy',
102
76
  out: SchemaChange[],
103
77
  ): void {
104
78
  for (const name of sortedKeys(next)) {
@@ -196,15 +170,13 @@ function diffDependencies(
196
170
  }
197
171
  }
198
172
 
199
- function memberKind(m: IrClass | IrInterface): 'class' | 'edge' | 'interface' {
200
- if ((m as IrInterface).type === 'interface') return 'interface'
201
- return (m as IrClass).type === 'edge' ? 'edge' : 'class'
173
+ function memberKind(member: IrClass): 'class' | 'edge' {
174
+ return member.type === 'edge' ? 'edge' : 'class'
202
175
  }
203
176
 
204
177
  function diffMembers(
205
- prev: Record<string, IrClass | IrInterface>,
206
- next: Record<string, IrClass | IrInterface>,
207
- _scope: 'class' | 'interface',
178
+ prev: Record<string, IrClass>,
179
+ next: Record<string, IrClass>,
208
180
  out: SchemaChange[],
209
181
  ): void {
210
182
  for (const name of sortedKeys(next)) {
@@ -223,12 +195,7 @@ function diffMembers(
223
195
  }
224
196
  }
225
197
 
226
- function diffMemberBody(
227
- name: string,
228
- a: IrClass | IrInterface,
229
- b: IrClass | IrInterface,
230
- out: SchemaChange[],
231
- ): void {
198
+ function diffMemberBody(name: string, a: IrClass, b: IrClass, out: SchemaChange[]): void {
232
199
  const pa = a.properties ?? {}
233
200
  const pb = b.properties ?? {}
234
201
  for (const p of sortedKeys(pb)) {
@@ -302,31 +269,27 @@ function diffMemberBody(
302
269
  }
303
270
  }
304
271
 
305
- function propertyRequired(member: IrClass | IrInterface, name: string): boolean {
272
+ function propertyRequired(member: IrClass, name: string): boolean {
306
273
  return member.required ? member.required.includes(name) : !isOptional(member.properties?.[name])
307
274
  }
308
275
 
309
- function memberContract(member: IrClass | IrInterface): unknown {
310
- const cls = member as IrClass
311
- const iface = member as IrInterface
276
+ function memberContract(member: IrClass): unknown {
312
277
  return {
313
278
  type: member.type,
314
279
  origin: member.origin,
315
280
  ref: member.ref,
316
- family: iface.family,
317
- extends: iface.extendsRefs ?? iface.extends,
318
- implements: cls.implementsRefs ?? cls.implements,
281
+ extends: member.extendsRefs ?? member.extends,
319
282
  endpoints: member.endpoints,
320
283
  orientation: member.orientation,
321
284
  constraints: member.constraints,
322
285
  propertyMetadata: member.propertyMetadata,
323
286
  data: member.data,
324
- policies: cls.policies,
287
+ policies: member.policies,
325
288
  }
326
289
  }
327
290
 
328
- function memberMetadata(member: IrClass | IrInterface): unknown {
329
- return { description: member.description, icon: (member as IrClass).icon }
291
+ function memberMetadata(member: IrClass): unknown {
292
+ return { description: member.description, icon: member.icon }
330
293
  }
331
294
 
332
295
  function sortedKeys(value: Record<string, unknown>): string[] {
@@ -1,136 +1,41 @@
1
- /**
2
- * extractor.ts — the Bun-executed island. Spawned as a short-lived subprocess by
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
- */
1
+ /** Bun subprocess that imports only the authored Schema entry and its installed SDK. */
13
2
  import {
14
3
  admitCanonicalSchemaFromSdk,
15
4
  findCanonicalDomainSchemaExport,
16
- normalizeLegacySchemaIR,
17
5
  projectCanonicalSchema,
18
6
  } from './canonical-schema'
19
7
 
20
8
  const schemaPath = process.argv[2]
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
- }
38
-
39
- const canonicalRoot = findCanonicalDomainSchemaExport(mod)
40
- if (canonicalRoot) {
41
- const domainSdk = await loadSdkSchema()
42
- const admission = admitCanonicalSchemaFromSdk(domainSdk, canonicalRoot)
43
- const projected = projectCanonicalSchema(admission.root, admission.closure)
44
- process.stdout.write(
45
- JSON.stringify({
46
- ok: true,
47
- ir: projected.ir,
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
- }
9
+ const projectRoot = process.argv[3] ?? process.cwd()
10
+
11
+ async function main(): Promise<void> {
12
+ if (!schemaPath) throw new Error('extractor: missing <schemaPath>')
13
+ const exports = (await import(schemaPath)) as Record<string, unknown>
14
+ const candidate = findCanonicalDomainSchemaExport(exports)
15
+ if (candidate === null) {
16
+ throw new Error('Schema entry exports no canonical V1 DomainSchema.')
69
17
  }
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
- }
114
- }
115
-
18
+ const sdk = (await import(Bun.resolveSync('@astrale-os/sdk/schema', projectRoot))) as Record<
19
+ string,
20
+ unknown
21
+ >
22
+ const admission = admitCanonicalSchemaFromSdk(sdk, candidate)
23
+ const projected = projectCanonicalSchema(admission.root, admission.closure)
116
24
  process.stdout.write(
117
25
  JSON.stringify({
118
26
  ok: true,
119
- ir: normalizeLegacySchemaIR(ir),
120
- root: null,
121
- schemaMode: 'legacy',
122
- revision: null,
123
- importedInterfaces,
27
+ ir: projected.ir,
28
+ root: admission.root,
29
+ schemaMode: admission.status === 'admitted' ? 'canonical-admitted' : 'canonical-preview',
30
+ revision: admission.revision,
124
31
  }),
125
32
  )
126
33
  }
127
34
 
128
- main().catch((err: any) => {
35
+ main().catch((cause: unknown) => {
36
+ const error = cause instanceof Error ? cause : new Error(String(cause))
129
37
  process.stdout.write(
130
- JSON.stringify({
131
- ok: false,
132
- error: { message: String(err?.message ?? err), stack: String(err?.stack ?? '') },
133
- }),
38
+ JSON.stringify({ ok: false, error: { message: error.message, stack: error.stack ?? '' } }),
134
39
  )
135
40
  process.exit(0)
136
41
  })