@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
@@ -14,6 +14,7 @@ export interface Paths {
14
14
  readonly idps: string;
15
15
  readonly idpSessionsDir: string;
16
16
  readonly exchangeCredentials: string;
17
+ readonly sessionRoutes: string;
17
18
  idpDir(name: string): string;
18
19
  idpSession(identityName: string): string;
19
20
  }
@@ -30,3 +31,4 @@ export declare const INSTANCES_PATH: string;
30
31
  export declare const IDPS_PATH: string;
31
32
  export declare const IDP_SESSIONS_DIR: string;
32
33
  export declare const EXCHANGE_CREDENTIALS_PATH: string;
34
+ export declare const SESSION_ROUTES_PATH: string;
@@ -0,0 +1,10 @@
1
+ import type { SessionRouteArtifact, SessionRouteStore } from '@astrale-os/sdk/client/session';
2
+ /** CLI filesystem representation for Kernel Client's admitted confidential route artifact. */
3
+ export declare class FileSessionRouteStore implements SessionRouteStore {
4
+ private readonly path;
5
+ constructor(path?: string);
6
+ read(): unknown;
7
+ write(artifact: SessionRouteArtifact): void;
8
+ clear(): void;
9
+ }
10
+ export declare const SESSION_ROUTE_STORE: Readonly<FileSessionRouteStore>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astrale-os/cli",
3
- "version": "1.0.0-beta.3",
3
+ "version": "1.0.0-beta.30",
4
4
  "description": "Astrale CLI — connect to existing Astrale kernels",
5
5
  "keywords": [
6
6
  "astrale",
@@ -19,7 +19,6 @@
19
19
  "dist",
20
20
  "src",
21
21
  "tsconfig.json",
22
- ".check-workspace.cjs",
23
22
  "studio/server",
24
23
  "studio/shared",
25
24
  "studio/client/dist",
@@ -58,27 +57,25 @@
58
57
  "jose": "^6.1.3",
59
58
  "ora": "^9.0.0",
60
59
  "ts-morph": "^25.0.1",
60
+ "tsconfig-paths": "4.2.0",
61
61
  "yaml": "^2.8.2",
62
- "zod": "^3.25.0"
62
+ "zod": "^4.4.3"
63
63
  },
64
64
  "devDependencies": {
65
- "@astrale-os/kernel-client": ">=0.6.0-beta.4 <1.0.0",
66
- "@astrale-os/kernel-protocol": ">=0.5.0-beta.3 <1.0.0",
67
65
  "@astrale-os/ox": ">=0.1.3 <1.0.0",
68
- "@astrale-os/sdk": ">=0.5.0-beta.9 <1.0.0",
69
- "@astrale-os/shell": ">=0.3.8-beta.2 <1.0.0",
66
+ "@astrale-os/sdk": "0.5.0-beta.54",
67
+ "@astrale-os/shell": "0.4.2-beta.6",
70
68
  "@astrale/commitlint-config": "npm:@jsr/astrale__commitlint-config@~2.0.1",
71
- "@commitlint/cli": "~20.3.1",
72
- "@commitlint/config-conventional": "~20.3.1",
73
- "@types/bun": "^1.1.16",
69
+ "@commitlint/cli": "21.2.2",
70
+ "@commitlint/config-conventional": "21.2.2",
74
71
  "@types/node": "^22.0.0",
75
- "@typescript/native-preview": "latest",
72
+ "bun-types": "1.4.0",
76
73
  "husky": "~9.1.7",
77
- "lint-staged": "~16.2.7",
78
- "msgpackr": "^1.12.1",
79
- "oxfmt": "0.52.0",
80
- "oxlint": "latest",
81
- "typescript": "~6.0.1-rc"
74
+ "lint-staged": "17.3.0",
75
+ "msgpackr": "^2.0.5",
76
+ "oxfmt": "0.63.0",
77
+ "oxlint": "1.78.0",
78
+ "typescript": "7.0.2"
82
79
  },
83
80
  "lint-staged": {
84
81
  "*.{js,cjs,mjs,ts,tsx}": [
@@ -100,15 +97,15 @@
100
97
  "node": ">=22"
101
98
  },
102
99
  "scripts": {
103
- "preinstall": "node .check-workspace.cjs",
104
100
  "build": "bun scripts/build.ts",
105
101
  "package:check": "pnpm run typecheck && pnpm run test && pnpm run build && node scripts/verify-public-exports.mjs && node scripts/verify-public-dependency-boundary.mjs",
106
- "typecheck": "tsgo --noEmit && tsgo --noEmit -p tsconfig.tests.json && tsgo --noEmit -p viewer && tsgo --noEmit -p studio",
102
+ "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.tests.json && tsc --noEmit -p tsconfig.scripts.json && tsc --noEmit -p viewer && pnpm --dir studio run typecheck",
107
103
  "lint": "oxlint .",
108
104
  "lint:fix": "oxlint --fix .",
109
105
  "format": "pnpm exec oxfmt --write .",
110
106
  "format:check": "pnpm exec oxfmt --check .",
111
- "test": "bun test src studio/client/src studio/server studio/shared && node --test scripts/*.test.mjs",
107
+ "test": "node scripts/qualification/source-boundary.mjs --target && bun test src studio/client/src studio/server studio/shared && node --test scripts/*.test.mjs",
108
+ "test:skills-e2e": "node scripts/qualification/skills-update-e2e.mjs",
112
109
  "test:studio": "pnpm --dir studio test",
113
110
  "test:watch": "bun test --watch src"
114
111
  }
@@ -0,0 +1,20 @@
1
+ import type { schema } from '@astrale-os/sdk/schema'
2
+
3
+ import { defineApplication } from '@astrale-os/sdk/application'
4
+ import { compile } from '@astrale-os/sdk/deployment/build'
5
+ import { addressing, assemble } from '@astrale-os/sdk/deployment/release'
6
+ import { defineRuntime } from '@astrale-os/sdk/runtime'
7
+
8
+ /** Build a canonical empty-runtime Release for cross-boundary CLI tests. */
9
+ export function releaseFor<const Schema extends schema.DomainSchema>(
10
+ source: Schema,
11
+ issuer: string,
12
+ ) {
13
+ const runtime = defineRuntime<Schema>()({
14
+ integrations: {},
15
+ initialize: () => ({ providers: {} }),
16
+ actions: [],
17
+ workflows: [],
18
+ })
19
+ return assemble(compile(defineApplication({ schema: source, runtime })), addressing(issuer))
20
+ }
@@ -1,10 +1,10 @@
1
1
  # CLI Admin adapters
2
2
 
3
- This private aggregate translates the frozen CLI command journey into the discovered V2
4
- `admin.astrale.ai` contract. It binds the exact served Domain revision through Kernel Client,
5
- uses `GraphApi` for policy-visible inventory, and invokes receiver-oriented Methods through
6
- `DomainBinding`. It does not import Admin implementation code, hard-code one schema revision, call
7
- Host directly, or persist remote graph truth.
3
+ This private aggregate translates the frozen CLI command journey into the stable public
4
+ `admin.astrale.ai` contract. Routine commands use canonical Admin Class, Property, Core receiver,
5
+ and Method paths through Kernel Client. They do not download, inspect, bind, or rebuild the Admin
6
+ schema. Strict local decoders admit every untrusted Admin result. The adapter does not import Admin
7
+ implementation code, call Host directly, or persist remote graph truth.
8
8
 
9
9
  `instance` owns create/list/status/delete/install projection and explicitly excludes the reserved
10
10
  Admin Host from consumer placement. `catalog` owns Domain inventory, publication, and default-set
@@ -13,3 +13,10 @@ configuration. `graph` is their bounded cursor helper and is not re-exported by
13
13
  Commander grammar, help text, output shapes, bookmark behavior, and current interactive host
14
14
  selection remain owned by the existing command surface; these adapters change only its remote
15
15
  semantic owner.
16
+
17
+ ## Performance contract
18
+
19
+ `instance list` performs one Admin method call after connection setup and no schema-discovery call.
20
+ Against the production beta Admin endpoint, the complete command must finish in less than 1 second
21
+ with a warm route/cache and less than 2 seconds from a cold CLI process. Unit tests prove the
22
+ single-call/no-reflection shape; retained live evidence proves the wall-clock bounds.
@@ -0,0 +1,25 @@
1
+ import type { Call } from '@astrale-os/sdk/client'
2
+ import type { ClientSession } from '@astrale-os/sdk/client/session'
3
+
4
+ import { mock } from 'bun:test'
5
+
6
+ export function adminSession(implementation?: (target: string, input: unknown) => unknown): {
7
+ readonly call: ReturnType<typeof mock>
8
+ readonly reflection: ReturnType<typeof mock>
9
+ readonly session: ClientSession
10
+ } {
11
+ const call = mock(async (request: Call) =>
12
+ implementation?.(String(request.target), request.input),
13
+ )
14
+ const reflection = mock(() => {
15
+ throw new Error('Routine Admin commands must not perform schema discovery or reflection.')
16
+ })
17
+ const session = {
18
+ call,
19
+ installation: reflection,
20
+ snapshot: reflection,
21
+ bind: reflection,
22
+ invoke: reflection,
23
+ } as unknown as ClientSession
24
+ return { call, reflection, session }
25
+ }
@@ -1,5 +1,4 @@
1
- import type { DomainBinding } from '@astrale-os/kernel-client/domain'
2
- import type { ClientSession } from '@astrale-os/kernel-client/session'
1
+ import type { ClientSession } from '@astrale-os/sdk/client/session'
3
2
 
4
3
  import type { AdminGraphApi } from '../../graph/.spec/api.js'
5
4
 
@@ -55,7 +54,6 @@ export class AdminDomainNotFoundError extends Error {
55
54
  }
56
55
 
57
56
  export interface AdminCatalogDependencies {
58
- readonly bind?: (session: ClientSession) => Promise<DomainBinding>
59
57
  readonly operationId?: (kind: 'publish' | 'configure-default') => string
60
58
  }
61
59
 
@@ -1,6 +1,7 @@
1
1
  # CLI Admin catalog adapter
2
2
 
3
- The adapter reads policy-visible `Domain` Nodes through bounded Graph pages and derives default
4
- membership from the Fleet relation. Publication invokes `Fleet.publishDomain`; a requested default
5
- change is a separate explicit `Domain.configureDefault` call. Unchanged publication input is a
6
- no-op, and an omitted description preserves the current value.
3
+ The adapter reads policy-visible `Domain` Nodes through bounded Graph pages using stable Class and
4
+ Property keys, and derives default membership from the stable Fleet relation. It performs no schema
5
+ discovery or reflection. Publication invokes `Fleet.publishDomain`; a requested default change is a
6
+ separate explicit `Domain.configureDefault` call. Unchanged publication input is a no-op, and an
7
+ omitted description preserves the current value.
@@ -1,67 +1,53 @@
1
1
  import type { Node } from '@astrale-os/sdk/graph/node'
2
2
  import type { QueryAST } from '@astrale-os/sdk/query'
3
3
 
4
- import { ClassPath } from '@astrale-os/sdk/graph/class'
5
4
  import { NodeId } from '@astrale-os/sdk/graph/node'
6
- import { Path } from '@astrale-os/sdk/graph/path'
5
+ import { normalizeProperties } from '@astrale-os/sdk/graph/properties'
6
+ import { PropertyKey } from '@astrale-os/sdk/schema'
7
7
  import { describe, expect, mock, test } from 'bun:test'
8
8
 
9
- import type { AdminBinding } from '../../binding'
10
9
  import type { AdminGraphApi } from '../../graph'
11
10
 
11
+ import { adminSession } from '../../__tests__/fixture'
12
12
  import { connectAdminCatalog } from '../client'
13
13
 
14
- function definition(name: string) {
15
- return {
16
- name,
17
- $: {
18
- method(method: string) {
19
- return { owner: name, name: method }
20
- },
21
- property(property: string) {
22
- return { key: property }
23
- },
24
- },
25
- }
26
- }
14
+ const domainProperties = Object.freeze({
15
+ origin: PropertyKey('admin.astrale.ai:class.Domain.property.origin'),
16
+ name: PropertyKey('kernel.astrale.ai:class.Named.property.name'),
17
+ discoveryUrl: PropertyKey('admin.astrale.ai:class.Domain.property.discoveryUrl'),
18
+ description: PropertyKey('kernel.astrale.ai:class.Descriptable.property.description'),
19
+ createdAt: PropertyKey('kernel.astrale.ai:class.Timestamped.property.createdAt'),
20
+ updatedAt: PropertyKey('kernel.astrale.ai:class.Timestamped.property.updatedAt'),
21
+ })
27
22
 
28
23
  function domainNode(id: string, origin: string): Node {
29
24
  return {
30
25
  id: NodeId(id),
31
- class: ClassPath.from('admin.astrale.ai', 'Domain'),
32
- props: {
33
- origin,
34
- name: origin.split('.')[0]!,
35
- discoveryUrl: `https://${origin}`,
36
- createdAt: '2026-08-12T00:00:00.000Z',
37
- updatedAt: '2026-08-12T00:00:00.000Z',
38
- } as never,
26
+ class: 'admin.astrale.ai:Domain' as Node['class'],
27
+ props: normalizeProperties({
28
+ [domainProperties.origin]: origin,
29
+ [domainProperties.name]: origin.split('.')[0]!,
30
+ [domainProperties.discoveryUrl]: `https://${origin}`,
31
+ [domainProperties.description]: `${origin} description`,
32
+ [domainProperties.createdAt]: '2026-08-12T00:00:00.000Z',
33
+ [domainProperties.updatedAt]: '2026-08-12T00:00:00.000Z',
34
+ }),
39
35
  }
40
36
  }
41
37
 
42
38
  function fixture(input: {
43
39
  domains?: readonly Node[]
44
40
  defaults?: readonly Node[]
45
- invoke?: (method: { owner: string; name: string }, receiver: unknown, value: unknown) => unknown
41
+ invoke?: (target: string, value: unknown) => unknown
46
42
  }) {
47
- const Domain = definition('Domain')
48
- const Fleet = definition('Fleet')
49
- const invoke = mock(async (method: unknown, receiver: unknown, value: unknown) =>
50
- input.invoke?.(method as { owner: string; name: string }, receiver, value),
51
- )
52
- const binding = {
53
- $: {
54
- publication: { origin: 'admin.astrale.ai' },
55
- origin: 'admin.astrale.ai',
56
- class(name: string) {
57
- if (name === 'Domain') return Domain
58
- if (name === 'Fleet') return Fleet
59
- throw new Error(`Unexpected class ${name}`)
60
- },
61
- core: { nodes: { fleet: { path: Path.id(NodeId('fleet')) } } },
62
- invoke,
63
- },
64
- } as unknown as AdminBinding
43
+ const calls: Array<{
44
+ target: string
45
+ value: unknown
46
+ }> = []
47
+ const remote = adminSession((target, value) => {
48
+ calls.push({ target, value })
49
+ return input.invoke?.(target, value)
50
+ })
65
51
  const query = mock(async (_ast: QueryAST) => ({
66
52
  result: {
67
53
  kind: 'nodes' as const,
@@ -70,21 +56,30 @@ function fixture(input: {
70
56
  page: {},
71
57
  }))
72
58
  const defaultNodes = input.defaults ?? []
73
- const neighbors = mock(async () => ({
74
- nodes: defaultNodes,
75
- first: defaultNodes[0] ?? null,
76
- graph: { nodes: defaultNodes, edges: [] },
77
- cursor: null,
78
- collect: async () => ({ nodes: defaultNodes, cursor: null }),
79
- }))
59
+ const neighbors = mock(
60
+ async (
61
+ _source: Parameters<AdminGraphApi['neighbors']>[0],
62
+ _via: Parameters<AdminGraphApi['neighbors']>[1],
63
+ _options: Parameters<AdminGraphApi['neighbors']>[2],
64
+ ) => ({
65
+ nodes: defaultNodes,
66
+ first: defaultNodes[0] ?? null,
67
+ graph: { nodes: defaultNodes, edges: [] },
68
+ cursor: null,
69
+ collect: async () => ({ nodes: defaultNodes, cursor: null }),
70
+ }),
71
+ )
80
72
  const graph = { query, neighbors } as unknown as AdminGraphApi
81
73
  return {
82
- invoke,
74
+ call: remote.call,
75
+ reflection: remote.reflection,
76
+ query,
77
+ neighbors,
78
+ calls,
83
79
  connect: () =>
84
80
  connectAdminCatalog(
85
- { session: {} as never, graph },
81
+ { session: remote.session, graph },
86
82
  {
87
- bind: async () => binding,
88
83
  operationId: (kind) => `cli.domain.${kind}:test`,
89
84
  },
90
85
  ),
@@ -106,16 +101,57 @@ describe('V2 Admin Domain catalog adapter', () => {
106
101
  test('lists Domain nodes through GraphApi and joins the Fleet default relation', async () => {
107
102
  const crm = domainNode('crm-domain', 'crm.acme.dev')
108
103
  const notes = domainNode('notes-domain', 'notes.acme.dev')
109
- const api = await fixture({ domains: [crm, notes], defaults: [crm] }).connect()
104
+ const contract = fixture({ domains: [crm, notes], defaults: [crm] })
105
+ const api = await contract.connect()
110
106
 
111
107
  await expect(api.list()).resolves.toEqual([
112
- expect.objectContaining({
108
+ {
113
109
  id: '@crm-domain',
114
110
  origin: 'crm.acme.dev',
111
+ name: 'crm',
112
+ url: 'https://crm.acme.dev',
113
+ description: 'crm.acme.dev description',
115
114
  installByDefault: true,
116
- }),
117
- expect.objectContaining({ id: '@notes-domain', origin: 'notes.acme.dev' }),
115
+ createdAt: '2026-08-12T00:00:00.000Z',
116
+ updatedAt: '2026-08-12T00:00:00.000Z',
117
+ },
118
+ {
119
+ id: '@notes-domain',
120
+ origin: 'notes.acme.dev',
121
+ name: 'notes',
122
+ url: 'https://notes.acme.dev',
123
+ description: 'notes.acme.dev description',
124
+ createdAt: '2026-08-12T00:00:00.000Z',
125
+ updatedAt: '2026-08-12T00:00:00.000Z',
126
+ },
118
127
  ])
128
+ expect(contract.query).toHaveBeenCalledWith(
129
+ {
130
+ format: 'astrale.graph.query',
131
+ version: 'v6',
132
+ source: {
133
+ kind: 'node',
134
+ terms: [
135
+ {
136
+ kind: 'class',
137
+ class: { origin: 'admin.astrale.ai', kind: 'class', name: 'Domain' },
138
+ },
139
+ ],
140
+ binding: 'n0',
141
+ },
142
+ steps: [],
143
+ select: { kind: 'nodes', binding: 'n0', projection: { kind: 'value' } },
144
+ },
145
+ { page: { size: 256 } },
146
+ )
147
+ const [source, edge, options] = contract.neighbors.mock.calls[0]!
148
+ expect(String(source)).toBe('/:admin.astrale.ai:core.fleet')
149
+ expect(edge).toEqual({
150
+ origin: 'admin.astrale.ai',
151
+ kind: 'class',
152
+ name: 'fleet_installs_domain_by_default',
153
+ })
154
+ expect(options).toEqual({ direction: 'outgoing', page: { size: 256 } })
119
155
  })
120
156
 
121
157
  test('publishes through Fleet then configures the Domain default explicitly', async () => {
@@ -130,16 +166,9 @@ describe('V2 Admin Domain catalog adapter', () => {
130
166
  installByDefault: true,
131
167
  }),
132
168
  ).resolves.toMatchObject({ changed: true, isNew: true, entry: { installByDefault: true } })
133
- expect(
134
- contract.invoke.mock.calls.map(([method, receiver, value]) => ({
135
- method,
136
- receiver: String(receiver),
137
- value,
138
- })),
139
- ).toEqual([
169
+ expect(contract.calls).toEqual([
140
170
  {
141
- method: { owner: 'Fleet', name: 'publishDomain' },
142
- receiver: '@fleet',
171
+ target: '/:admin.astrale.ai:core.fleet::publishDomain',
143
172
  value: {
144
173
  operationId: 'cli.domain.publish:test',
145
174
  origin: 'crm.acme.dev',
@@ -148,8 +177,7 @@ describe('V2 Admin Domain catalog adapter', () => {
148
177
  },
149
178
  },
150
179
  {
151
- method: { owner: 'Domain', name: 'configureDefault' },
152
- receiver: '@crm-domain',
180
+ target: '@crm-domain::configureDefault',
153
181
  value: {
154
182
  operationId: 'cli.domain.configure-default:test',
155
183
  enabled: true,
@@ -166,6 +194,52 @@ describe('V2 Admin Domain catalog adapter', () => {
166
194
  await expect(
167
195
  api.publish({ origin: 'crm.acme.dev', name: 'crm', url: 'https://crm.acme.dev' }),
168
196
  ).resolves.toMatchObject({ changed: false, isNew: false })
169
- expect(contract.invoke).not.toHaveBeenCalled()
197
+ expect(contract.call).not.toHaveBeenCalled()
198
+ expect(contract.reflection).not.toHaveBeenCalled()
199
+ })
200
+
201
+ test('connects without schema discovery or graph I/O', async () => {
202
+ const contract = fixture({})
203
+
204
+ await contract.connect()
205
+
206
+ expect(contract.call).not.toHaveBeenCalled()
207
+ expect(contract.reflection).not.toHaveBeenCalled()
208
+ expect(contract.query).not.toHaveBeenCalled()
209
+ expect(contract.neighbors).not.toHaveBeenCalled()
210
+ })
211
+
212
+ test('rejects malformed graph records and publication summaries', async () => {
213
+ const invalidNode = {
214
+ id: NodeId('invalid-domain'),
215
+ class: 'admin.astrale.ai:Domain' as Node['class'],
216
+ props: normalizeProperties({
217
+ [domainProperties.origin]: 'invalid.example.dev',
218
+ [domainProperties.name]: 'invalid',
219
+ [domainProperties.discoveryUrl]: 'https://invalid.example.dev',
220
+ [domainProperties.createdAt]: '2026-08-12T00:00:00.000Z',
221
+ }),
222
+ }
223
+ await expect((await fixture({ domains: [invalidNode] }).connect()).list()).rejects.toThrow(
224
+ 'Admin Domain.updatedAt is invalid.',
225
+ )
226
+
227
+ const malformed = fixture({ invoke: () => ({ id: '@domain-only' }) })
228
+ await expect(
229
+ (await malformed.connect()).publish({
230
+ origin: 'crm.acme.dev',
231
+ name: 'crm',
232
+ url: 'https://crm.acme.dev',
233
+ }),
234
+ ).rejects.toThrow('Admin Domain origin is invalid.')
235
+
236
+ const malformedPath = fixture({ invoke: () => ({ ...summary('crm.acme.dev'), id: 'bad' }) })
237
+ await expect(
238
+ (await malformedPath.connect()).publish({
239
+ origin: 'crm.acme.dev',
240
+ name: 'crm',
241
+ url: 'https://crm.acme.dev',
242
+ }),
243
+ ).rejects.toThrow('Admin Domain id is invalid.')
170
244
  })
171
245
  })