@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.
Files changed (345) hide show
  1. package/README.md +84 -6
  2. package/dist/astrale.js +57586 -60753
  3. package/dist/public/connect-core.js +2158 -30706
  4. package/dist/public/keys/index.js +1016 -29541
  5. package/dist/public/paths/index.js +370 -28654
  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 +13 -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/dist/types/state/exchange-credentials.d.ts +6 -2
  40. package/dist/types/state/files.d.ts +2 -0
  41. package/dist/types/state/index.d.ts +3 -2
  42. package/dist/types/state/paths.d.ts +2 -0
  43. package/dist/types/state/session-routes.d.ts +10 -0
  44. package/package.json +16 -19
  45. package/src/__tests__/fixtures/publication.ts +20 -0
  46. package/src/admin/.spec/architecture.md +12 -5
  47. package/src/admin/__tests__/fixture.ts +25 -0
  48. package/src/admin/catalog/.spec/api.d.ts +1 -3
  49. package/src/admin/catalog/.spec/architecture.md +5 -4
  50. package/src/admin/catalog/__tests__/client.test.ts +143 -69
  51. package/src/admin/catalog/client.ts +40 -54
  52. package/src/admin/catalog/model.ts +3 -4
  53. package/src/admin/contract.ts +47 -0
  54. package/src/admin/graph/.spec/api.d.ts +4 -10
  55. package/src/admin/graph/nodes.ts +1 -1
  56. package/src/admin/instance/.spec/api.d.ts +5 -9
  57. package/src/admin/instance/.spec/architecture.md +7 -7
  58. package/src/admin/instance/__tests__/client.test.ts +157 -175
  59. package/src/admin/instance/client.ts +39 -128
  60. package/src/admin/instance/index.ts +1 -2
  61. package/src/admin/instance/model.ts +12 -18
  62. package/src/commands/__tests__/admin-instance.test.ts +11 -8
  63. package/src/commands/__tests__/call-describe.test.ts +46 -33
  64. package/src/commands/__tests__/call.test.ts +34 -0
  65. package/src/commands/__tests__/domain-install-operation.test.ts +30 -22
  66. package/src/commands/__tests__/domain-install-owned.test.ts +1 -1
  67. package/src/commands/__tests__/domain-list.test.ts +5 -25
  68. package/src/commands/__tests__/install-direct.test.ts +115 -8
  69. package/src/commands/__tests__/install-identity-override.test.ts +6 -17
  70. package/src/commands/__tests__/instance-list-rows.test.ts +1 -1
  71. package/src/commands/__tests__/instance-status.test.ts +139 -0
  72. package/src/commands/__tests__/introspect-parse.test.ts +80 -1
  73. package/src/commands/__tests__/logs.test.ts +250 -2
  74. package/src/commands/__tests__/read-commands.test.ts +119 -11
  75. package/src/commands/__tests__/token-ttl.test.ts +49 -4
  76. package/src/commands/__tests__/update.test.ts +25 -3
  77. package/src/commands/__tests__/view.test.ts +50 -2
  78. package/src/commands/auth/logout.ts +2 -1
  79. package/src/commands/browser.ts +29 -0
  80. package/src/commands/call-describe.ts +60 -68
  81. package/src/commands/call.ts +71 -59
  82. package/src/commands/domain/install.ts +73 -46
  83. package/src/commands/domain/list.ts +1 -1
  84. package/src/commands/domain/publish.ts +14 -11
  85. package/src/commands/domain/uninstall.ts +2 -2
  86. package/src/commands/get.ts +15 -16
  87. package/src/commands/identity/__tests__/register.test.ts +3 -3
  88. package/src/commands/identity/register.ts +8 -8
  89. package/src/commands/instance/create.ts +8 -16
  90. package/src/commands/instance/delete.ts +12 -9
  91. package/src/commands/instance/list.ts +2 -2
  92. package/src/commands/instance/status.ts +66 -20
  93. package/src/commands/instance/use.ts +16 -12
  94. package/src/commands/introspect.ts +53 -41
  95. package/src/commands/logs.ts +123 -36
  96. package/src/commands/mutate.ts +6 -5
  97. package/src/commands/query.ts +39 -36
  98. package/src/commands/session/analyze.ts +26 -4
  99. package/src/commands/token.ts +42 -27
  100. package/src/commands/ui/__tests__/commands.test.ts +152 -0
  101. package/src/commands/ui/add.ts +51 -0
  102. package/src/commands/ui/doctor.ts +21 -0
  103. package/src/commands/ui/init.ts +38 -0
  104. package/src/commands/ui/list.ts +26 -0
  105. package/src/commands/ui/preset-apply.ts +19 -0
  106. package/src/commands/ui/preset-list.ts +12 -0
  107. package/src/commands/ui/shared.ts +25 -0
  108. package/src/commands/update.ts +90 -48
  109. package/src/commands/view.ts +82 -37
  110. package/src/connection/.spec/api.d.ts +7 -8
  111. package/src/connection/.spec/architecture.md +14 -5
  112. package/src/connection/.spec/flows/session.ts +2 -2
  113. package/src/connection/.spec/laws/connection.ts +6 -2
  114. package/src/connection/.spec/layout.ts +1 -0
  115. package/src/connection/__tests__/auth.test.ts +1 -0
  116. package/src/connection/__tests__/credential.test.ts +21 -1
  117. package/src/connection/__tests__/errors.test.ts +27 -20
  118. package/src/connection/__tests__/exchange.test.ts +64 -11
  119. package/src/connection/__tests__/failure-fixtures.ts +39 -0
  120. package/src/connection/__tests__/failure-safety.test.ts +75 -0
  121. package/src/connection/__tests__/self.test.ts +31 -11
  122. package/src/connection/__tests__/session.test.ts +8 -4
  123. package/src/connection/__tests__/target.test.ts +2 -0
  124. package/src/connection/auth.ts +13 -0
  125. package/src/connection/call.ts +1 -1
  126. package/src/connection/credential.ts +2 -2
  127. package/src/connection/errors.ts +1 -355
  128. package/src/connection/exchange.ts +110 -61
  129. package/src/connection/failure/classify.ts +110 -0
  130. package/src/connection/failure/index.ts +18 -0
  131. package/src/connection/failure/model.ts +28 -0
  132. package/src/connection/failure/render.ts +116 -0
  133. package/src/connection/reasons.ts +16 -0
  134. package/src/connection/self.ts +39 -21
  135. package/src/connection/session.ts +27 -9
  136. package/src/errors.ts +3 -2
  137. package/src/graph/.spec/api.d.ts +13 -6
  138. package/src/graph/.spec/laws/documents.ts +7 -7
  139. package/src/graph/.spec/layout.ts +9 -1
  140. package/src/graph/__tests__/mutation.test.ts +2 -2
  141. package/src/graph/__tests__/query.test.ts +35 -9
  142. package/src/graph/class.ts +30 -0
  143. package/src/graph/index.ts +1 -0
  144. package/src/graph/query.ts +27 -40
  145. package/src/identity/.spec/api.d.ts +2 -2
  146. package/src/identity/__tests__/fixtures/registry-journey.ts +13 -1
  147. package/src/identity/__tests__/registration.test.ts +1 -1
  148. package/src/identity/__tests__/registry.test.ts +4 -0
  149. package/src/identity/registration.ts +3 -3
  150. package/src/identity/registry.ts +2 -0
  151. package/src/keys/__tests__/keys.test.ts +4 -0
  152. package/src/keys/credential.ts +1 -0
  153. package/src/lib/__tests__/admin-target.test.ts +12 -0
  154. package/src/lib/__tests__/binary.test.ts +16 -1
  155. package/src/lib/__tests__/browser-retention.test.ts +212 -0
  156. package/src/lib/__tests__/command-dx.test.ts +1 -1
  157. package/src/lib/__tests__/config.test.ts +27 -0
  158. package/src/lib/__tests__/domain-publication.test.ts +10 -16
  159. package/src/lib/__tests__/idp.test.ts +34 -4
  160. package/src/lib/__tests__/instance-candidates.test.ts +1 -3
  161. package/src/lib/__tests__/instance-target.test.ts +7 -39
  162. package/src/lib/__tests__/log-errors.test.ts +64 -0
  163. package/src/lib/__tests__/skills.test.ts +834 -0
  164. package/src/lib/__tests__/studio-server-deps.test.ts +1 -1
  165. package/src/lib/__tests__/update.test.ts +264 -11
  166. package/src/lib/__tests__/view-assets.test.ts +25 -0
  167. package/src/lib/__tests__/view-external-open-intent.test.ts +150 -0
  168. package/src/lib/__tests__/view-external-open-origins.test.ts +27 -0
  169. package/src/lib/__tests__/view-open-intent.test.ts +0 -2
  170. package/src/lib/__tests__/view-server.test.ts +26 -3
  171. package/src/lib/__tests__/view-session.test.ts +2 -1
  172. package/src/lib/admin-instance.ts +14 -8
  173. package/src/lib/admin-target.ts +21 -2
  174. package/src/lib/binary.ts +22 -5
  175. package/src/lib/browser-retention.ts +210 -0
  176. package/src/lib/command-dx.ts +9 -9
  177. package/src/lib/config.ts +12 -1
  178. package/src/lib/domain-publication.ts +9 -7
  179. package/src/lib/failure-debug.ts +26 -0
  180. package/src/lib/idp.ts +34 -3
  181. package/src/lib/instance-candidates.ts +2 -2
  182. package/src/lib/instance-target.ts +3 -14
  183. package/src/lib/instance.ts +16 -11
  184. package/src/lib/log.ts +16 -9
  185. package/src/lib/output.ts +1 -1
  186. package/src/lib/proc.ts +7 -2
  187. package/src/lib/provision-instance.ts +34 -57
  188. package/src/lib/skills/lock.ts +117 -0
  189. package/src/lib/skills/sync.ts +878 -0
  190. package/src/lib/skills.ts +1 -52
  191. package/src/lib/update.ts +298 -45
  192. package/src/lib/validation.ts +2 -2
  193. package/src/lib/view/assets.ts +11 -2
  194. package/src/lib/view/external-open-intent.ts +41 -0
  195. package/src/lib/view/external-open-origins.ts +37 -0
  196. package/src/lib/view/host-capabilities.ts +17 -0
  197. package/src/lib/view/resolve.ts +1 -1
  198. package/src/lib/view/server.ts +18 -3
  199. package/src/lib/view/session.ts +2 -0
  200. package/src/program/.spec/api.d.ts +1 -0
  201. package/src/program/__tests__/program.test.ts +201 -7
  202. package/src/program/argv.ts +14 -0
  203. package/src/program/build.ts +26 -4
  204. package/src/program/command.ts +1 -0
  205. package/src/program/index.ts +1 -0
  206. package/src/program/registry.ts +2 -1
  207. package/src/setup/__tests__/instance-step.test.ts +27 -10
  208. package/src/setup/steps/instance.ts +22 -15
  209. package/src/setup/steps/skills.ts +40 -38
  210. package/src/state/.spec/api.d.ts +21 -2
  211. package/src/state/.spec/architecture.md +18 -4
  212. package/src/state/.spec/layout.ts +1 -0
  213. package/src/state/__tests__/exchange-credentials.test.ts +88 -42
  214. package/src/state/__tests__/files.test.ts +24 -1
  215. package/src/state/__tests__/fixtures/session-route-process.ts +93 -0
  216. package/src/state/__tests__/paths.test.ts +1 -0
  217. package/src/state/__tests__/session-routes.test.ts +138 -0
  218. package/src/state/exchange-credentials.ts +22 -9
  219. package/src/state/files.ts +41 -0
  220. package/src/state/index.ts +3 -1
  221. package/src/state/paths.ts +3 -0
  222. package/src/state/session-routes.ts +34 -0
  223. package/src/telemetry/__tests__/analyze-log.test.ts +38 -0
  224. package/src/telemetry/__tests__/recorder.test.ts +1 -0
  225. package/src/telemetry/__tests__/retention.test.ts +267 -0
  226. package/src/telemetry/__tests__/settings.test.ts +102 -0
  227. package/src/telemetry/__tests__/store-scan.test.ts +128 -0
  228. package/src/telemetry/__tests__/trigger.test.ts +33 -4
  229. package/src/telemetry/analyze.ts +24 -2
  230. package/src/telemetry/recorder.ts +15 -4
  231. package/src/telemetry/retention.ts +176 -0
  232. package/src/telemetry/session.ts +18 -12
  233. package/src/telemetry/settings.ts +64 -11
  234. package/src/telemetry/store.ts +92 -9
  235. package/src/telemetry/trigger.ts +16 -28
  236. package/src/ui/.spec/api.d.ts +14 -0
  237. package/src/ui/.spec/architecture.md +14 -0
  238. package/src/ui/.spec/laws.ts +50 -0
  239. package/src/ui/.spec/layout.ts +16 -0
  240. package/src/ui/__tests__/ui.test.ts +1742 -0
  241. package/src/ui/index.ts +13 -0
  242. package/src/ui/lock.ts +89 -0
  243. package/src/ui/model.ts +83 -0
  244. package/src/ui/operations.ts +1044 -0
  245. package/src/ui/project.ts +333 -0
  246. package/src/ui/release.ts +398 -0
  247. package/src/ui/runner.ts +18 -0
  248. package/studio/client/dist/assets/elk-api-DjmKsHXc.js +1 -0
  249. package/studio/client/dist/assets/index-BFVFs_8x.js +81 -0
  250. package/studio/client/dist/assets/index-DuB9iUdu.css +2 -0
  251. package/studio/client/dist/assets/rolldown-runtime-Dd_uD5pT.js +1 -0
  252. package/studio/client/dist/assets/schema-studio--a0kX3QU.css +1 -0
  253. package/studio/client/dist/assets/schema-studio-DH6oEWME.js +8 -0
  254. package/studio/client/dist/index.html +4 -3
  255. package/studio/package.json +8 -14
  256. package/studio/server/agent/ask.test.ts +1 -1
  257. package/studio/server/agent/bridge/grant.test.ts +1 -1
  258. package/studio/server/agent/bridge/routes.test.ts +1 -1
  259. package/studio/server/agent/harness/claude/adapter.test.ts +15 -5
  260. package/studio/server/agent/harness/gateway/token.test.ts +1 -1
  261. package/studio/server/agent/harness/gateway/token.ts +3 -3
  262. package/studio/server/agent/prompts/anchors.test.ts +41 -32
  263. package/studio/server/agent/prompts/anchors.ts +23 -51
  264. package/studio/server/agent/prompts/system.test.ts +4 -4
  265. package/studio/server/agent/prompts/system.ts +5 -5
  266. package/studio/server/agent/routes.test.ts +1 -1
  267. package/studio/server/agent/run/coordinator.test.ts +1 -1
  268. package/studio/server/agent/run/preparation.ts +1 -1
  269. package/studio/server/api/canvas.ts +0 -1
  270. package/studio/server/api/context.ts +1 -1
  271. package/studio/server/api/deployment.ts +1 -1
  272. package/studio/server/api/views.ts +2 -2
  273. package/studio/server/api/workspace.ts +1 -1
  274. package/studio/server/api-agent-loadout.test.ts +1 -1
  275. package/studio/server/api.test.ts +1 -1
  276. package/studio/server/cache.test.ts +24 -18
  277. package/studio/server/cache.ts +10 -54
  278. package/studio/server/cli-consumers.test.ts +32 -4
  279. package/studio/server/cli.test.ts +2 -2
  280. package/studio/server/domain.test.ts +50 -68
  281. package/studio/server/domain.ts +82 -63
  282. package/studio/server/handoff/copy.ts +2 -2
  283. package/studio/server/index.ts +1 -1
  284. package/studio/server/instances/probe.test.ts +1 -1
  285. package/studio/server/introspect/anatomy/views/routes.ts +46 -37
  286. package/studio/server/introspect/anatomy/views.ts +10 -16
  287. package/studio/server/introspect/anatomy-extras.test.ts +29 -56
  288. package/studio/server/introspect/anatomy.test.ts +22 -14
  289. package/studio/server/introspect/anatomy.ts +6 -9
  290. package/studio/server/introspect/bundle.ts +0 -3
  291. package/studio/server/introspect/canonical-schema.test.ts +155 -424
  292. package/studio/server/introspect/canonical-schema.ts +248 -601
  293. package/studio/server/introspect/core.ts +14 -22
  294. package/studio/server/introspect/diff.test.ts +21 -9
  295. package/studio/server/introspect/diff.ts +19 -64
  296. package/studio/server/introspect/extractor.ts +23 -122
  297. package/studio/server/introspect/overlay-tsmorph.test.ts +116 -241
  298. package/studio/server/introspect/overlay-tsmorph.ts +0 -1
  299. package/studio/server/introspect/overlay.ts +3 -51
  300. package/studio/server/introspect/revision.test.ts +24 -28
  301. package/studio/server/introspect/revision.ts +11 -22
  302. package/studio/server/introspect/runtime.test.ts +77 -195
  303. package/studio/server/introspect/runtime.ts +5 -67
  304. package/studio/server/introspect/schema-ir-json.test.ts +81 -0
  305. package/studio/server/introspect/schema-ir-json.ts +39 -69
  306. package/studio/server/introspect/schema-refs.test.ts +43 -88
  307. package/studio/server/introspect/schema-refs.ts +14 -49
  308. package/studio/server/introspect/source-overlay/handlers.ts +116 -636
  309. package/studio/server/introspect/source-overlay/kernel-calls.ts +0 -3
  310. package/studio/server/introspect/source-overlay/spans.ts +15 -45
  311. package/studio/server/lifecycle.ts +4 -1
  312. package/studio/server/state/baseline.test.ts +14 -9
  313. package/studio/server/state/baseline.ts +3 -5
  314. package/studio/server/state/documents.test.ts +69 -0
  315. package/studio/server/state/documents.ts +57 -10
  316. package/studio/server/state/visibility.ts +1 -5
  317. package/studio/server/views/model.ts +3 -3
  318. package/studio/server/views/target.test.ts +18 -76
  319. package/studio/server/views/target.ts +25 -51
  320. package/studio/server/watch.test.ts +11 -11
  321. package/studio/server/watch.ts +8 -4
  322. package/studio/server/workspace/updates.ts +23 -1
  323. package/studio/server/workspace-watch.ts +2 -2
  324. package/studio/shared/contracts/runtime.ts +4 -0
  325. package/studio/shared/contracts/schema.ts +44 -131
  326. package/studio/shared/contracts/surface.test.ts +15 -17
  327. package/studio/shared/contracts/workspace.ts +5 -11
  328. package/studio/shared/schema/identity.test.ts +20 -44
  329. package/studio/shared/schema/identity.ts +9 -24
  330. package/studio/tsconfig.json +2 -1
  331. package/tsconfig.json +1 -1
  332. package/viewer/dist/index.html +21 -0
  333. package/viewer/dist/main.js +41 -62
  334. package/.check-workspace.cjs +0 -40
  335. package/src/admin/binding.ts +0 -168
  336. package/src/commands/__tests__/instance-create-hosts.test.ts +0 -29
  337. package/studio/client/dist/assets/elk-api-lwhFo7vB.js +0 -1
  338. package/studio/client/dist/assets/index-B-c-smo9.js +0 -8
  339. package/studio/client/dist/assets/index-BckHuAWk.js +0 -81
  340. package/studio/client/dist/assets/index-C4aNQ6dz.css +0 -1
  341. package/studio/client/dist/assets/index-ChOr3yP0.css +0 -1
  342. package/studio/server/introspect/anatomy/views/legacy.ts +0 -232
  343. package/studio/server/introspect/core-extractor.ts +0 -139
  344. package/studio/server/introspect/overlay.test.ts +0 -72
  345. package/studio/server/introspect/source-overlay/annotations.ts +0 -14
@@ -1,16 +1,13 @@
1
1
  /**
2
- * core.ts — assembles a domain's StudioCore: the genesis node/edge graph
3
- * extracted from canonical `schema.core` (or legacy `defineCore` fallback), gated
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 { type DomainHandle, depsInstalled } from '../domain'
10
- import { readSettings } from '../state/settings'
11
- import { coreExtract } from './runtime'
8
+ import { isCanonicalDomainSchemaV1, projectCanonicalCore } from './canonical-schema'
12
9
 
13
- export async function buildCore(handle: DomainHandle): Promise<StudioCore> {
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(handle.root)) {
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 r = await coreExtract(
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: r.core.domain,
41
- nodes: r.core.nodes,
42
- edges: r.core.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
- 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,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' }, auth: 'public' } },
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: { home: { ...before.views!.home, auth: 'required' } },
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. 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)) {
@@ -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(m: IrClass | IrInterface): 'class' | 'edge' | 'interface' {
200
- if ((m as IrInterface).type === 'interface') return 'interface'
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 | IrInterface>,
206
- next: Record<string, IrClass | IrInterface>,
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 | IrInterface, name: string): boolean {
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 | IrInterface): unknown {
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
- family: iface.family,
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: cls.policies,
279
+ policies: member.policies,
325
280
  }
326
281
  }
327
282
 
328
- function memberMetadata(member: IrClass | IrInterface): unknown {
329
- return { description: member.description, icon: (member as IrClass).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
- * 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
- */
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
- 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
- }
4
+ import { extractCanonicalSchemaFromSdk, findCanonicalDomainSchemaExport } from './canonical-schema'
38
5
 
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
- }
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: normalizeLegacySchemaIR(ir),
120
- root: null,
121
- schemaMode: 'legacy',
122
- revision: null,
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((err: any) => {
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
  })