@astrale-os/cli 1.0.0-beta.3 → 1.0.0-beta.30

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 (343) hide show
  1. package/README.md +80 -6
  2. package/dist/astrale.js +55471 -58674
  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 +118 -10
  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 +35 -32
  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 +89 -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 +12 -5
  138. package/src/graph/.spec/layout.ts +9 -1
  139. package/src/graph/__tests__/mutation.test.ts +2 -2
  140. package/src/graph/__tests__/query.test.ts +25 -6
  141. package/src/graph/class.ts +30 -0
  142. package/src/graph/index.ts +1 -0
  143. package/src/graph/query.ts +21 -32
  144. package/src/identity/.spec/api.d.ts +2 -2
  145. package/src/identity/__tests__/fixtures/registry-journey.ts +13 -1
  146. package/src/identity/__tests__/registration.test.ts +1 -1
  147. package/src/identity/__tests__/registry.test.ts +4 -0
  148. package/src/identity/registration.ts +3 -3
  149. package/src/identity/registry.ts +2 -0
  150. package/src/keys/__tests__/keys.test.ts +4 -0
  151. package/src/keys/credential.ts +1 -0
  152. package/src/lib/__tests__/admin-target.test.ts +12 -0
  153. package/src/lib/__tests__/binary.test.ts +16 -1
  154. package/src/lib/__tests__/browser-retention.test.ts +212 -0
  155. package/src/lib/__tests__/command-dx.test.ts +1 -1
  156. package/src/lib/__tests__/config.test.ts +27 -0
  157. package/src/lib/__tests__/domain-publication.test.ts +10 -16
  158. package/src/lib/__tests__/idp.test.ts +34 -4
  159. package/src/lib/__tests__/instance-candidates.test.ts +1 -3
  160. package/src/lib/__tests__/instance-target.test.ts +7 -39
  161. package/src/lib/__tests__/log-errors.test.ts +64 -0
  162. package/src/lib/__tests__/skills.test.ts +809 -0
  163. package/src/lib/__tests__/studio-server-deps.test.ts +1 -1
  164. package/src/lib/__tests__/update.test.ts +264 -11
  165. package/src/lib/__tests__/view-assets.test.ts +25 -0
  166. package/src/lib/__tests__/view-external-open-intent.test.ts +150 -0
  167. package/src/lib/__tests__/view-external-open-origins.test.ts +27 -0
  168. package/src/lib/__tests__/view-open-intent.test.ts +0 -2
  169. package/src/lib/__tests__/view-server.test.ts +26 -3
  170. package/src/lib/__tests__/view-session.test.ts +2 -1
  171. package/src/lib/admin-instance.ts +14 -8
  172. package/src/lib/admin-target.ts +21 -2
  173. package/src/lib/binary.ts +22 -5
  174. package/src/lib/browser-retention.ts +210 -0
  175. package/src/lib/command-dx.ts +9 -9
  176. package/src/lib/config.ts +12 -1
  177. package/src/lib/domain-publication.ts +9 -7
  178. package/src/lib/failure-debug.ts +26 -0
  179. package/src/lib/idp.ts +34 -3
  180. package/src/lib/instance-candidates.ts +2 -2
  181. package/src/lib/instance-target.ts +3 -14
  182. package/src/lib/instance.ts +16 -11
  183. package/src/lib/log.ts +16 -9
  184. package/src/lib/output.ts +1 -1
  185. package/src/lib/proc.ts +7 -2
  186. package/src/lib/provision-instance.ts +34 -57
  187. package/src/lib/skills/lock.ts +117 -0
  188. package/src/lib/skills/sync.ts +814 -0
  189. package/src/lib/skills.ts +1 -52
  190. package/src/lib/update.ts +298 -45
  191. package/src/lib/validation.ts +2 -2
  192. package/src/lib/view/assets.ts +11 -2
  193. package/src/lib/view/external-open-intent.ts +41 -0
  194. package/src/lib/view/external-open-origins.ts +37 -0
  195. package/src/lib/view/host-capabilities.ts +17 -0
  196. package/src/lib/view/resolve.ts +1 -1
  197. package/src/lib/view/server.ts +18 -3
  198. package/src/lib/view/session.ts +2 -0
  199. package/src/program/.spec/api.d.ts +1 -0
  200. package/src/program/__tests__/program.test.ts +163 -6
  201. package/src/program/argv.ts +14 -0
  202. package/src/program/build.ts +26 -4
  203. package/src/program/command.ts +1 -0
  204. package/src/program/index.ts +1 -0
  205. package/src/program/registry.ts +2 -1
  206. package/src/setup/__tests__/instance-step.test.ts +27 -10
  207. package/src/setup/steps/instance.ts +22 -15
  208. package/src/setup/steps/skills.ts +40 -38
  209. package/src/state/.spec/api.d.ts +21 -2
  210. package/src/state/.spec/architecture.md +18 -4
  211. package/src/state/.spec/layout.ts +1 -0
  212. package/src/state/__tests__/exchange-credentials.test.ts +88 -42
  213. package/src/state/__tests__/files.test.ts +24 -1
  214. package/src/state/__tests__/fixtures/session-route-process.ts +93 -0
  215. package/src/state/__tests__/paths.test.ts +1 -0
  216. package/src/state/__tests__/session-routes.test.ts +138 -0
  217. package/src/state/exchange-credentials.ts +22 -9
  218. package/src/state/files.ts +41 -0
  219. package/src/state/index.ts +3 -1
  220. package/src/state/paths.ts +3 -0
  221. package/src/state/session-routes.ts +34 -0
  222. package/src/telemetry/__tests__/analyze-log.test.ts +38 -0
  223. package/src/telemetry/__tests__/recorder.test.ts +1 -0
  224. package/src/telemetry/__tests__/retention.test.ts +267 -0
  225. package/src/telemetry/__tests__/settings.test.ts +102 -0
  226. package/src/telemetry/__tests__/store-scan.test.ts +128 -0
  227. package/src/telemetry/__tests__/trigger.test.ts +33 -4
  228. package/src/telemetry/analyze.ts +24 -2
  229. package/src/telemetry/recorder.ts +15 -4
  230. package/src/telemetry/retention.ts +176 -0
  231. package/src/telemetry/session.ts +18 -12
  232. package/src/telemetry/settings.ts +64 -11
  233. package/src/telemetry/store.ts +92 -9
  234. package/src/telemetry/trigger.ts +16 -28
  235. package/src/ui/.spec/api.d.ts +14 -0
  236. package/src/ui/.spec/architecture.md +14 -0
  237. package/src/ui/.spec/laws.ts +50 -0
  238. package/src/ui/.spec/layout.ts +16 -0
  239. package/src/ui/__tests__/ui.test.ts +1742 -0
  240. package/src/ui/index.ts +13 -0
  241. package/src/ui/lock.ts +89 -0
  242. package/src/ui/model.ts +83 -0
  243. package/src/ui/operations.ts +1044 -0
  244. package/src/ui/project.ts +333 -0
  245. package/src/ui/release.ts +398 -0
  246. package/src/ui/runner.ts +18 -0
  247. package/studio/client/dist/assets/elk-api-DjmKsHXc.js +1 -0
  248. package/studio/client/dist/assets/index-BFVFs_8x.js +81 -0
  249. package/studio/client/dist/assets/index-DuB9iUdu.css +2 -0
  250. package/studio/client/dist/assets/rolldown-runtime-Dd_uD5pT.js +1 -0
  251. package/studio/client/dist/assets/schema-studio--a0kX3QU.css +1 -0
  252. package/studio/client/dist/assets/schema-studio-DH6oEWME.js +8 -0
  253. package/studio/client/dist/index.html +4 -3
  254. package/studio/package.json +8 -14
  255. package/studio/server/agent/ask.test.ts +1 -1
  256. package/studio/server/agent/bridge/grant.test.ts +1 -1
  257. package/studio/server/agent/bridge/routes.test.ts +1 -1
  258. package/studio/server/agent/harness/claude/adapter.test.ts +15 -5
  259. package/studio/server/agent/harness/gateway/token.test.ts +1 -1
  260. package/studio/server/agent/harness/gateway/token.ts +3 -3
  261. package/studio/server/agent/prompts/anchors.test.ts +41 -32
  262. package/studio/server/agent/prompts/anchors.ts +23 -51
  263. package/studio/server/agent/prompts/system.test.ts +4 -4
  264. package/studio/server/agent/prompts/system.ts +5 -5
  265. package/studio/server/agent/routes.test.ts +1 -1
  266. package/studio/server/agent/run/coordinator.test.ts +1 -1
  267. package/studio/server/agent/run/preparation.ts +1 -1
  268. package/studio/server/api/canvas.ts +0 -1
  269. package/studio/server/api/context.ts +1 -1
  270. package/studio/server/api/deployment.ts +1 -1
  271. package/studio/server/api/views.ts +2 -2
  272. package/studio/server/api/workspace.ts +1 -1
  273. package/studio/server/api-agent-loadout.test.ts +1 -1
  274. package/studio/server/api.test.ts +1 -1
  275. package/studio/server/cache.test.ts +24 -18
  276. package/studio/server/cache.ts +10 -54
  277. package/studio/server/cli-consumers.test.ts +31 -3
  278. package/studio/server/domain.test.ts +50 -68
  279. package/studio/server/domain.ts +82 -63
  280. package/studio/server/handoff/copy.ts +2 -2
  281. package/studio/server/index.ts +1 -1
  282. package/studio/server/instances/probe.test.ts +1 -1
  283. package/studio/server/introspect/anatomy/views/routes.ts +46 -37
  284. package/studio/server/introspect/anatomy/views.ts +10 -16
  285. package/studio/server/introspect/anatomy-extras.test.ts +29 -56
  286. package/studio/server/introspect/anatomy.test.ts +22 -14
  287. package/studio/server/introspect/anatomy.ts +6 -9
  288. package/studio/server/introspect/bundle.ts +0 -3
  289. package/studio/server/introspect/canonical-schema.test.ts +155 -424
  290. package/studio/server/introspect/canonical-schema.ts +248 -601
  291. package/studio/server/introspect/core.ts +14 -22
  292. package/studio/server/introspect/diff.test.ts +21 -9
  293. package/studio/server/introspect/diff.ts +19 -64
  294. package/studio/server/introspect/extractor.ts +23 -122
  295. package/studio/server/introspect/overlay-tsmorph.test.ts +116 -241
  296. package/studio/server/introspect/overlay-tsmorph.ts +0 -1
  297. package/studio/server/introspect/overlay.ts +3 -51
  298. package/studio/server/introspect/revision.test.ts +24 -28
  299. package/studio/server/introspect/revision.ts +11 -22
  300. package/studio/server/introspect/runtime.test.ts +77 -195
  301. package/studio/server/introspect/runtime.ts +5 -67
  302. package/studio/server/introspect/schema-ir-json.test.ts +81 -0
  303. package/studio/server/introspect/schema-ir-json.ts +39 -69
  304. package/studio/server/introspect/schema-refs.test.ts +43 -88
  305. package/studio/server/introspect/schema-refs.ts +14 -49
  306. package/studio/server/introspect/source-overlay/handlers.ts +116 -636
  307. package/studio/server/introspect/source-overlay/kernel-calls.ts +0 -3
  308. package/studio/server/introspect/source-overlay/spans.ts +15 -45
  309. package/studio/server/lifecycle.ts +4 -1
  310. package/studio/server/state/baseline.test.ts +14 -9
  311. package/studio/server/state/baseline.ts +3 -5
  312. package/studio/server/state/documents.test.ts +69 -0
  313. package/studio/server/state/documents.ts +57 -10
  314. package/studio/server/state/visibility.ts +1 -5
  315. package/studio/server/views/model.ts +3 -3
  316. package/studio/server/views/target.test.ts +18 -76
  317. package/studio/server/views/target.ts +24 -50
  318. package/studio/server/watch.test.ts +11 -11
  319. package/studio/server/watch.ts +8 -4
  320. package/studio/server/workspace/updates.ts +23 -1
  321. package/studio/server/workspace-watch.ts +2 -2
  322. package/studio/shared/contracts/runtime.ts +4 -0
  323. package/studio/shared/contracts/schema.ts +44 -131
  324. package/studio/shared/contracts/surface.test.ts +15 -17
  325. package/studio/shared/contracts/workspace.ts +5 -11
  326. package/studio/shared/schema/identity.test.ts +20 -44
  327. package/studio/shared/schema/identity.ts +9 -24
  328. package/studio/tsconfig.json +2 -1
  329. package/tsconfig.json +1 -1
  330. package/viewer/dist/index.html +21 -0
  331. package/viewer/dist/main.js +41 -62
  332. package/.check-workspace.cjs +0 -40
  333. package/src/admin/binding.ts +0 -168
  334. package/src/commands/__tests__/instance-create-hosts.test.ts +0 -29
  335. package/studio/client/dist/assets/elk-api-lwhFo7vB.js +0 -1
  336. package/studio/client/dist/assets/index-B-c-smo9.js +0 -8
  337. package/studio/client/dist/assets/index-BckHuAWk.js +0 -81
  338. package/studio/client/dist/assets/index-C4aNQ6dz.css +0 -1
  339. package/studio/client/dist/assets/index-ChOr3yP0.css +0 -1
  340. package/studio/server/introspect/anatomy/views/legacy.ts +0 -232
  341. package/studio/server/introspect/core-extractor.ts +0 -139
  342. package/studio/server/introspect/overlay.test.ts +0 -72
  343. package/studio/server/introspect/source-overlay/annotations.ts +0 -14
@@ -61,7 +61,7 @@ export async function listViewTargets(
61
61
 
62
62
  const queried = await Promise.all(
63
63
  bindings.map(async (binding) => {
64
- const definition = targetDefinition(binding.className, binding.classOrigin, binding.kind)
64
+ const definition = targetDefinition(binding.className, binding.classOrigin)
65
65
  const result = await runAstraleJson<RawQueryResult>(
66
66
  [
67
67
  'query',
@@ -116,21 +116,17 @@ export async function listViewTargets(
116
116
  }
117
117
  }
118
118
 
119
- export function targetDefinition(
120
- className: string,
121
- classOrigin: string,
122
- kind: 'class' | 'interface' = 'class',
123
- ): string {
124
- return `/:${assertOrigin(classOrigin)}:${kind}.${assertSchemaName(className)}`
119
+ export function targetDefinition(className: string, classOrigin: string): string {
120
+ return `/:${assertOrigin(classOrigin)}:class.${assertSchemaName(className)}`
125
121
  }
126
122
 
127
123
  export interface ViewDefinitionBinding {
128
124
  className: string
129
125
  classOrigin: string
130
- kind: 'class' | 'interface'
126
+ kind: 'class'
131
127
  }
132
128
 
133
- /** Preserve exact canonical View target coordinates; short-name anatomy is legacy-only. */
129
+ /** Preserve exact canonical View target coordinates. */
134
130
  export function viewDefinitionBindings(
135
131
  origin: string,
136
132
  view: ViewInfo,
@@ -140,16 +136,17 @@ export function viewDefinitionBindings(
140
136
  if (target) {
141
137
  if (target.kind === 'domain') return []
142
138
  return uniqueViewBindings(
143
- target.definitions
144
- .filter(
145
- (definition): definition is typeof definition & { kind: 'class' | 'interface' } =>
146
- definition.kind === 'class' || definition.kind === 'interface',
147
- )
148
- .map((definition) => ({
149
- className: definition.name,
150
- classOrigin: definition.origin,
151
- kind: definition.kind,
152
- })),
139
+ target.definitions.flatMap((definition) =>
140
+ definition.kind === 'class'
141
+ ? [
142
+ {
143
+ className: definition.name,
144
+ classOrigin: definition.origin,
145
+ kind: 'class' as const,
146
+ },
147
+ ]
148
+ : [],
149
+ ),
153
150
  )
154
151
  }
155
152
 
@@ -165,7 +162,6 @@ export function viewDefinitionBindings(
165
162
  names.flatMap((className) => {
166
163
  const local: ViewDefinitionBinding[] = []
167
164
  const localClass = ir.classes[className]
168
- const localInterface = ir.interfaces[className]
169
165
  if (localClass) {
170
166
  local.push({
171
167
  className,
@@ -173,33 +169,11 @@ export function viewDefinitionBindings(
173
169
  kind: 'class',
174
170
  })
175
171
  }
176
- if (localInterface) {
177
- local.push({
178
- className,
179
- classOrigin: localInterface.ref?.origin ?? localInterface.origin ?? ir.domain ?? origin,
180
- kind: 'interface',
181
- })
182
- }
183
-
184
- if (ir.importsByKey !== undefined) {
185
- const imported = Object.keys(ir.importsByKey).flatMap((key) => {
186
- const binding = viewBindingFromDefinitionKey(key)
187
- return binding?.className === className ? [binding] : []
188
- })
189
- return [...local, ...imported]
190
- }
191
-
192
- const legacy = ir.imports[className]
193
- if (legacy) {
194
- return [
195
- ...local,
196
- {
197
- className,
198
- classOrigin: legacy.origin,
199
- kind: legacy.definition,
200
- } satisfies ViewDefinitionBinding,
201
- ]
202
- }
172
+ const imported = Object.keys(ir.importsByKey).flatMap((key) => {
173
+ const binding = viewBindingFromDefinitionKey(key)
174
+ return binding?.className === className ? [binding] : []
175
+ })
176
+ if (imported.length > 0) return [...local, ...imported]
203
177
 
204
178
  return local.length > 0 ? local : [{ className, classOrigin: origin, kind: 'class' }]
205
179
  }),
@@ -211,12 +185,12 @@ function viewBindingFromDefinitionKey(key: string): ViewDefinitionBinding | null
211
185
  if (separator <= 0) return null
212
186
  const classOrigin = key.slice(0, separator)
213
187
  const ref = key.slice(separator + 1)
214
- const match = /^(class|interface)\.([A-Za-z_$][\w$]*)$/.exec(ref)
188
+ const match = /^class\.([A-Za-z_$][\w$]*)$/.exec(ref)
215
189
  if (!match) return null
216
190
  return {
217
- className: match[2]!,
191
+ className: match[1]!,
218
192
  classOrigin,
219
- kind: match[1] as ViewDefinitionBinding['kind'],
193
+ kind: 'class',
220
194
  }
221
195
  }
222
196
 
@@ -10,27 +10,27 @@ const handle: DomainHandle = {
10
10
  id: 'current',
11
11
  root: '/workspace/current',
12
12
  configFile: '/workspace/current/astrale.config.ts',
13
- domainFile: '/workspace/current/implementation.ts',
13
+ applicationFile: '/workspace/current/application.ts',
14
14
  schemaDirName: 'schema',
15
15
  schemaDir: '/workspace/current/schema',
16
16
  schemaIndex: '/workspace/current/schema/index.ts',
17
17
  }
18
18
 
19
- test('watches current layout roots and reconciles either composition entry', () => {
20
- expect(ANATOMY_PATHS).toContain('implementation.ts')
19
+ test('watches current Application, Runtime, and vertical authoring roots', () => {
20
+ expect(ANATOMY_PATHS).toContain('application.ts')
21
+ expect(ANATOMY_PATHS).toContain('runtime.ts')
21
22
  expect(ANATOMY_PATHS).toContain('ui')
22
- expect(ANATOMY_PATHS).toContain('handlers')
23
+ expect(ANATOMY_PATHS).toContain('providers')
23
24
  expect(ANATOMY_PATHS).toContain('queries')
24
25
  expect(ANATOMY_PATHS).toContain('workflows')
25
- expect(DOMAIN_SET_TRIGGER_FILES.has('implementation.ts')).toBe(true)
26
- expect(DOMAIN_SET_TRIGGER_FILES.has('domain.ts')).toBe(true)
26
+ expect(DOMAIN_SET_TRIGGER_FILES.has('application.ts')).toBe(true)
27
+ expect(DOMAIN_SET_TRIGGER_FILES.has('schema.ts')).toBe(true)
27
28
  })
28
29
 
29
- test('composition and handler source changes invalidate the schema bundle', () => {
30
- expect(affectsBundle(handle, join(handle.root, 'implementation.ts'))).toBe(true)
31
- expect(affectsBundle(handle, join(handle.root, 'domain.ts'))).toBe(true)
30
+ test('Application, Runtime, Action, and Workflow changes invalidate the schema bundle', () => {
31
+ expect(affectsBundle(handle, join(handle.root, 'application.ts'))).toBe(true)
32
+ expect(affectsBundle(handle, join(handle.root, 'runtime.ts'))).toBe(true)
32
33
  expect(affectsBundle(handle, join(handle.root, 'actions', 'risk', 'create.ts'))).toBe(true)
33
- expect(affectsBundle(handle, join(handle.root, 'functions', 'user', 'ensure.ts'))).toBe(true)
34
- expect(affectsBundle(handle, join(handle.root, 'handlers', 'create.ts'))).toBe(true)
34
+ expect(affectsBundle(handle, join(handle.root, 'workflows', 'user', 'ensure.ts'))).toBe(true)
35
35
  expect(affectsBundle(handle, join(handle.root, 'views', 'routes.ts'))).toBe(false)
36
36
  })
@@ -19,10 +19,9 @@ export const ANATOMY_PATHS = [...ANATOMY_GLOBS.files, ...ANATOMY_GLOBS.dirs]
19
19
  // part of the schema bundle cache even though they are outside schema/ itself.
20
20
  const BUNDLE_SOURCE_DIRS = new Set([
21
21
  'actions',
22
- 'capabilities',
23
- 'functions',
24
- 'handlers',
22
+ 'integrations',
25
23
  'mutations',
24
+ 'providers',
26
25
  'queries',
27
26
  'rules',
28
27
  'runtime',
@@ -42,7 +41,12 @@ function ignored(p: string): boolean {
42
41
  export function affectsBundle(handle: DomainHandle, path: string): boolean {
43
42
  const rel = relative(handle.root, path).split('\\').join('/')
44
43
  const topLevel = rel.split('/')[0]
45
- return rel === 'implementation.ts' || rel === 'domain.ts' || BUNDLE_SOURCE_DIRS.has(topLevel)
44
+ return (
45
+ path === handle.applicationFile ||
46
+ rel === 'runtime.ts' ||
47
+ rel.endsWith('/runtime.ts') ||
48
+ BUNDLE_SOURCE_DIRS.has(topLevel)
49
+ )
46
50
  }
47
51
 
48
52
  export function watchDomain(handle: DomainHandle): () => void {
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * We don't reimplement staleness: the `astrale` CLI owns it. `astrale update
5
5
  * --check --json`, run in the DOMAIN ROOT (so its @astrale-os/* SDK-dep axis sees
6
- * THIS project), emits a unified `{ stale, cli, sdk }` report. We run it with
6
+ * THIS project), emits a unified `{ stale, cli, skills, sdk }` report. We run it with
7
7
  * stdout piped and read it regardless of exit code — a stale result exits 10 by
8
8
  * design, which is not an error here. Best-effort: anything unexpected (no
9
9
  * bad output) collapses to "nothing stale" so the badge stays
@@ -16,6 +16,7 @@ import { decodeJsonObject, runStudioCliJson, runStudioCliText } from '../cli'
16
16
  const NOT_STALE: StaleReport = {
17
17
  stale: false,
18
18
  cli: { stale: false, managed: true },
19
+ skills: { status: 'current' },
19
20
  sdk: { stale: false, inProject: false, outdated: [] },
20
21
  }
21
22
 
@@ -30,6 +31,7 @@ export async function getUpdates(root: string): Promise<StaleReport> {
30
31
  function decodeStaleReport(value: unknown): StaleReport | null {
31
32
  const report = decodeJsonObject(value)
32
33
  const cli = decodeJsonObject(report?.cli)
34
+ const skills = decodeJsonObject(report?.skills)
33
35
  const sdk = decodeJsonObject(report?.sdk)
34
36
  if (
35
37
  typeof report?.stale !== 'boolean' ||
@@ -50,6 +52,22 @@ function decodeStaleReport(value: unknown): StaleReport | null {
50
52
  : []
51
53
  })
52
54
  if (outdated.length !== sdk.outdated.length) return null
55
+ const skillStatuses = new Set([
56
+ 'current',
57
+ 'update-available',
58
+ 'repair-needed',
59
+ 'unavailable',
60
+ 'skipped',
61
+ ])
62
+ // Additive compatibility: Studio can briefly run a newer server against an
63
+ // older CLI report while a binary update is being applied.
64
+ const skillStatus =
65
+ skills === null || skills === undefined
66
+ ? 'current'
67
+ : typeof skills.status === 'string' && skillStatuses.has(skills.status)
68
+ ? (skills.status as StaleReport['skills']['status'])
69
+ : null
70
+ if (skillStatus === null) return null
53
71
  return {
54
72
  stale: report.stale,
55
73
  cli: {
@@ -59,6 +77,10 @@ function decodeStaleReport(value: unknown): StaleReport | null {
59
77
  ...(typeof cli.latest === 'string' ? { latest: cli.latest } : {}),
60
78
  ...(typeof cli.channel === 'string' ? { channel: cli.channel } : {}),
61
79
  },
80
+ skills: {
81
+ status: skillStatus,
82
+ ...(typeof skills?.error === 'string' ? { error: skills.error } : {}),
83
+ },
62
84
  sdk: { stale: sdk.stale, inProject: sdk.inProject, outdated },
63
85
  }
64
86
  }
@@ -19,8 +19,8 @@ const IGNORED =
19
19
  // only these file changes can change the domain SET (vs. ordinary in-domain edits)
20
20
  export const DOMAIN_SET_TRIGGER_FILES = new Set([
21
21
  'astrale.config.ts',
22
- 'implementation.ts',
23
- 'domain.ts',
22
+ 'application.ts',
23
+ 'schema.ts',
24
24
  'index.ts',
25
25
  ])
26
26
 
@@ -42,6 +42,10 @@ export interface StudioSettings {
42
42
  export interface StaleReport {
43
43
  stale: boolean
44
44
  cli: { stale: boolean; managed: boolean; current?: string; latest?: string; channel?: string }
45
+ skills: {
46
+ status: 'current' | 'update-available' | 'repair-needed' | 'unavailable' | 'skipped'
47
+ error?: string
48
+ }
45
49
  sdk: {
46
50
  stale: boolean
47
51
  inProject: boolean
@@ -5,7 +5,7 @@
5
5
  * is owned by `../schema/identity`; SDK admission owns schema semantics.
6
6
  */
7
7
 
8
- import type { IrDefinitionKey, IrDefinitionRef, IrSchemaRef } from '../schema/identity'
8
+ import type { IrClassKey, IrClassRef, IrSchemaRef } from '../schema/identity'
9
9
 
10
10
  export interface JsonSchema {
11
11
  type?: string | string[]
@@ -18,11 +18,17 @@ export interface JsonSchema {
18
18
  maximum?: number
19
19
  format?: string
20
20
  description?: string
21
- $nodeRef?: unknown
22
- $dataRef?: unknown
21
+ $ref?: string
23
22
  [k: string]: unknown
24
23
  }
25
24
 
25
+ const NODE_PATH_SCHEMA_ID = 'https://schemas.astrale.ai/graph/1/node-path'
26
+
27
+ /** Structural form emitted by the V1 DSL for a graph Node path. */
28
+ export function isNodePathSchema(schema: JsonSchema): boolean {
29
+ return schema.$ref === NODE_PATH_SCHEMA_ID && Object.hasOwn(schema, 'x-astrale-path')
30
+ }
31
+
26
32
  export type MethodInheritance = 'default' | 'abstract' | 'sealed'
27
33
 
28
34
  /** Portable form of the DSL-owned canonical schema revision. */
@@ -37,7 +43,7 @@ export function isSchemaRevision(value: unknown): value is SchemaRevision {
37
43
  * Version of Studio's lossy canonical-schema -> render-IR projection. Persisted
38
44
  * baselines must match this value before their IR can be compared.
39
45
  */
40
- export const STUDIO_SCHEMA_PROJECTION_VERSION = 1
46
+ export const STUDIO_SCHEMA_PROJECTION_VERSION = 3
41
47
 
42
48
  export type IrCallableAuth = 'anonymous' | 'authenticated' | 'authorized'
43
49
 
@@ -46,67 +52,27 @@ export type IrCallableOutput =
46
52
  | { mode: 'stream'; item: JsonSchema }
47
53
  | { mode: 'binary' }
48
54
 
49
- export interface IrMethod {
50
- name: string
51
- /** Canonical callable input. Legacy projections expose only `params`. */
52
- input?: JsonSchema
53
- params: Record<string, JsonSchema>
54
- /** Names required by canonical `input.required`; absent on legacy Methods. */
55
- requiredParams?: string[]
56
- /** Canonical discriminated output. Legacy projections expose only `returns`. */
57
- output?: IrCallableOutput
58
- returns: JsonSchema
59
- static: boolean
60
- inheritance: MethodInheritance
61
- description?: string
62
- auth?: IrCallableAuth
63
- policy?: unknown
64
- }
65
-
66
- /** Standalone Domain Function projected into the Studio's callable vocabulary. */
67
- export interface IrFunction {
55
+ export interface IrCallable {
68
56
  name: string
69
57
  input: JsonSchema
70
- params: Record<string, JsonSchema>
71
- /** Names required by canonical `input.required`. */
72
- requiredParams?: string[]
73
58
  output: IrCallableOutput
74
- returns: JsonSchema
75
- /** Standalone Functions have no receiver; these legacy-compatible fields let
76
- * existing callable renderers consume them alongside static Methods. */
77
- static: true
78
- inheritance: 'default'
79
59
  description?: string
80
60
  auth?: IrCallableAuth
81
61
  policy?: unknown
82
62
  }
83
63
 
84
- export interface IrInterface {
85
- type: 'interface'
86
- name: string
87
- /** Canonical declaration owner/family; absent on legacy projections. */
88
- origin?: string
89
- family?: 'node' | 'edge' | 'both'
90
- ref?: IrSchemaRef
91
- extends?: string[]
92
- extendsRefs?: IrSchemaRef[]
93
- properties: Record<string, JsonSchema>
94
- /** Canonical `properties.required`; absence, unlike null, encodes optionality. */
95
- required?: string[]
96
- methods: Record<string, IrMethod>
97
- endpoints?: IrEndpoint[]
98
- orientation?: 'directed' | 'undirected'
99
- constraints?: { noSelf?: true; acyclic?: true }
100
- description?: string
101
- propertyMetadata?: Record<string, unknown>
102
- /** Canonical data declaration; `mediaType` is required and extensions stay lossless. */
103
- data?: { mediaType: string; [key: string]: unknown }
64
+ export interface IrMethod extends IrCallable {
65
+ static: boolean
66
+ inheritance: MethodInheritance
104
67
  }
105
68
 
69
+ /** Standalone DSL callable projected without inventing a receiver. */
70
+ export interface IrFunction extends IrCallable {}
71
+
106
72
  export interface IrEndpoint {
107
73
  name: string
108
74
  types: string[]
109
- /** Exact accepted Definition coordinates. `types` remains for existing UI consumers. */
75
+ /** Exact accepted Definition coordinates. `types` is the local display projection. */
110
76
  refs?: IrSchemaRef[]
111
77
  /** declared multiplicity for this end; max:null = unbounded ("many"). Absent ⇒ unconstrained. */
112
78
  cardinality?: { min: number; max: number | null }
@@ -115,11 +81,10 @@ export interface IrEndpoint {
115
81
  export interface IrClass {
116
82
  type: 'node' | 'edge'
117
83
  name: string
118
- /** Canonical declaration owner/ref; absent on legacy projections. */
119
- origin?: string
120
- ref?: IrSchemaRef
121
- implements?: string[]
122
- implementsRefs?: IrSchemaRef[]
84
+ origin: string
85
+ ref: IrClassRef
86
+ extends?: string[]
87
+ extendsRefs?: IrClassRef[]
123
88
  /** edges only: the two (source,target) endpoints with role names + allowed types */
124
89
  endpoints?: IrEndpoint[]
125
90
  orientation?: 'directed' | 'undirected'
@@ -139,10 +104,8 @@ export interface IrClass {
139
104
 
140
105
  export interface IrImportDescriptor {
141
106
  origin: string
142
- definition: 'interface' | 'class'
143
- ref?: IrDefinitionRef
144
- /** Canonical qualified identity; absent on legacy import descriptors. */
145
- key?: IrDefinitionKey
107
+ ref: IrClassRef
108
+ key: IrClassKey
146
109
  }
147
110
 
148
111
  export type IrViewTarget = { kind: 'domain' } | { kind: 'definition'; definitions: IrSchemaRef[] }
@@ -150,41 +113,30 @@ export type IrViewTarget = { kind: 'domain' } | { kind: 'definition'; definition
150
113
  export interface IrView {
151
114
  name: string
152
115
  target: IrViewTarget
153
- auth: 'required' | 'optional' | 'public'
154
116
  description?: string
155
117
  }
156
118
 
157
119
  export interface SchemaIR {
120
+ format: 'astrale.dsl'
158
121
  version: string
159
122
  domain: string
160
- /** Canonical document format; absent on legacy projections. */
161
- format?: 'astrale.dsl'
162
- types: Record<string, JsonSchema>
163
- interfaces: Record<string, IrInterface>
164
123
  classes: Record<string, IrClass>
165
- imports: Record<string, IrImportDescriptor>
166
- /**
167
- * Canonical authoritative import index, keyed by `origin:kind.name`.
168
- * `imports` remains the unambiguous short-name compatibility index.
169
- */
170
- importsByKey?: Record<IrDefinitionKey, IrImportDescriptor>
171
- /** Exact imported Interface bodies under the same collision-free identity. */
172
- importedInterfacesByKey?: Record<IrDefinitionKey, IrInterface>
173
- /** Canonical V1 members absent from the legacy serializer projection. */
124
+ importsByKey: Record<IrClassKey, IrImportDescriptor>
125
+ importedClassesByKey: Record<IrClassKey, IrClass>
174
126
  functions: Record<string, IrFunction>
175
- views?: Record<string, IrView>
176
- policies?: Record<string, unknown>
177
- dependencies?: Array<{ origin: string; revision: string }>
178
- /** Exact canonical genesis declaration; absent on legacy projections. */
179
- core?: unknown
127
+ views: Record<string, IrView>
128
+ policies: Record<string, unknown>
129
+ dependencies: Array<{ origin: string; revision: string }>
130
+ core: unknown
180
131
  }
181
132
 
182
133
  export interface HandlerLink {
183
134
  owner: string
184
- ownerKind: 'class' | 'interface' | 'function'
135
+ ownerKind: 'class' | 'function'
136
+ kind: 'action' | 'workflow'
185
137
  method: string
186
138
  static: boolean
187
- /** the legacy runtime registry or current implementation.ts wiring site */
139
+ /** The Runtime registry or one modular Action/Workflow file. */
188
140
  wiringFile?: string
189
141
  wiringLine?: number
190
142
  /** the resolved handler file (followed from the `execute` import) */
@@ -192,14 +144,6 @@ export interface HandlerLink {
192
144
  handlerLine?: number
193
145
  /** kernel ops detected in the handler (::update, ::link, createNode, …) */
194
146
  kernelCalls?: string[]
195
- /** declared auth policy on the runtime config; absent ⇒ defaults to 'required'. */
196
- auth?: 'public' | 'optional' | 'required'
197
- /** Canonical V1 callable auth, when the handler comes from implementation.ts. */
198
- callableAuth?: IrCallableAuth
199
- /** authorize hook shape: 'absent' (none), 'noop' (allow-all), 'custom' (real check). */
200
- authorize?: 'absent' | 'noop' | 'custom'
201
- /** raw source of the authorize hook (for the hover preview). */
202
- authorizeSnippet?: string
203
147
  /** false ⇒ a todo()/NotImplemented stub → "contract-only" badge */
204
148
  implemented: boolean
205
149
  /** true ⇒ resolver could not link a file → "unlinked" badge */
@@ -213,33 +157,10 @@ export interface SourceSpan {
213
157
  doc?: string
214
158
  }
215
159
 
216
- export interface SchemaAnnotation {
217
- /** anchor ref key, e.g. 'class.Monitor.property.status' */
218
- target: string
219
- severity: 'warn' | 'info'
220
- code: 'COMPILE_ERROR' | 'EDGE_PROP_TYPE_MISSING'
221
- message: string
222
- }
223
-
224
- export interface CrossDomainImport {
225
- name: string
226
- origin: string
227
- definition: 'interface' | 'class'
228
- }
229
-
230
160
  export interface SchemaOverlay {
231
- origin: string
232
- /** defineDomain({ requires }) — runtime domain dependencies */
233
- requires: string[]
234
- /** non-kernel ir.imports → true cross-domain imports */
235
- crossDomainImports: CrossDomainImport[]
236
- /** kernel-origin ir.imports → mixin interfaces (collapsed chip) */
237
- mixins: CrossDomainImport[]
238
- postInstall?: string
239
161
  handlerLinks: HandlerLink[]
240
- /** keyed by anchor ref (class.X / class.X.property.y / class.X.method.m / edge.e / interface.I…) */
162
+ /** Keyed by Class, Property, Method, Function, Policy, View, or Core anchor. */
241
163
  sourceSpans: Record<string, SourceSpan>
242
- annotations: SchemaAnnotation[]
243
164
  }
244
165
 
245
166
  export interface BundleError {
@@ -251,25 +172,19 @@ export interface StudioSchemaBundle {
251
172
  domainId: string
252
173
  /** UI/cache identity only. This is not the DSL schema revision. */
253
174
  renderFingerprint: string
254
- schemaMode: 'canonical-admitted' | 'canonical-preview' | 'legacy' | 'unavailable'
255
- /** DSL-owned revision, present only after cohort SDK admission. */
175
+ schemaMode: 'canonical-admitted' | 'canonical-preview' | 'unavailable'
176
+ /** DSL-owned revision, present only after installed SDK admission. */
256
177
  schemaRevision?: SchemaRevision
257
178
  extractedBy: 'runtime-bun' | 'static-tsmorph-fallback'
258
179
  depsInstalled: boolean
259
180
  ir: SchemaIR | null
260
181
  /**
261
182
  * Portable canonical V1 document emitted by the domain. `schemaMode` records
262
- * whether the cohort SDK admitted it or Studio is rendering it as a structural
263
- * preview. Kept separate from the lossy render IR; absent for legacy domains.
183
+ * whether the installed SDK admitted it or Studio is rendering it as a structural
184
+ * preview. Kept separate from the lossy render IR.
264
185
  */
265
186
  schemaRoot?: unknown
266
187
  overlay: SchemaOverlay
267
- /**
268
- * Unambiguous short-name aliases for imported Interface bodies, retained for
269
- * legacy renderers. Canonical consumers use `ir.importedInterfacesByKey`, whose
270
- * `origin:interface.Name` keys cannot collide. Empty when deps aren't installed.
271
- */
272
- importedInterfaces?: Record<string, IrInterface>
273
188
  /** present when the runtime import failed to compile (render state, not a crash) */
274
189
  error?: BundleError | null
275
190
  extractedAt: string
@@ -277,12 +192,11 @@ export interface StudioSchemaBundle {
277
192
 
278
193
  export interface DomainOverview {
279
194
  origin: string
280
- /** Active SDK composition entry; `domain.ts` is retained for legacy projects. */
281
- compositionFile?: 'implementation.ts' | 'domain.ts'
195
+ /** Active SDK Application entry relative to the project root. */
196
+ applicationFile?: string
282
197
  adapter: 'astrale' | 'cloudflare' | 'unknown'
283
198
  prodTarget?: string
284
199
  devSecrets?: string
285
- postInstall?: string
286
200
  requires: string[]
287
201
  packageName?: string
288
202
  packageVersion?: string
@@ -294,7 +208,6 @@ export interface DomainOverview {
294
208
  export interface ViewInfo {
295
209
  slug: string
296
210
  kind: 'inline-html' | 'spa' | 'unknown'
297
- auth?: string
298
211
  mount?: string
299
212
  url?: string
300
213
  /** the class(es) this view binds to via `viewFor: selfOf(Class)` (DSL allows an array);
@@ -427,9 +340,9 @@ export interface StudioCoreNode {
427
340
 
428
341
  /** One materialized edge instance wiring two core nodes. */
429
342
  export interface StudioCoreEdge {
430
- /** source Core path, owning Domain path, or a legacy meta-node endpoint */
343
+ /** source Core path or owning Domain path */
431
344
  from: string
432
- /** target Core path, owning Domain path, or a legacy meta-node endpoint */
345
+ /** target Core path or owning Domain path */
433
346
  to: string
434
347
  /** the IR edge class name (keys into StudioSchemaBundle.ir.classes, type:'edge') */
435
348
  edgeName: string
@@ -459,4 +372,4 @@ export type TypeDescriptor =
459
372
  required: string[]
460
373
  optional: boolean
461
374
  }
462
- | { kind: 'ref'; target: string; refKind: 'node' | 'data'; optional: boolean }
375
+ | { kind: 'ref'; target: 'node'; optional: boolean }