@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,10 +1,10 @@
1
- import type { ClientSession } from '@astrale-os/kernel-client/session'
1
+ import type { ClientSession } from '@astrale-os/sdk/client/session'
2
2
  import type { Node } from '@astrale-os/sdk/graph/node'
3
3
 
4
4
  import { Path } from '@astrale-os/sdk/graph/path'
5
5
  import { Query } from '@astrale-os/sdk/query'
6
6
 
7
- import { bindAdmin, type AdminBinding } from '../binding'
7
+ import { AdminContract, callAdminMethod } from '../contract'
8
8
  import { readAllNodes, type AdminGraphApi } from '../graph'
9
9
  import {
10
10
  AdminDomainNotFoundError,
@@ -13,16 +13,9 @@ import {
13
13
  type PublishDomainResult,
14
14
  } from './model'
15
15
 
16
- const ADMIN_ORIGIN = 'admin.astrale.ai'
17
16
  const PAGE_SIZE = 256
18
17
  const MAXIMUM_DOMAINS = 10_000
19
18
  const MAXIMUM_PAGES = Math.ceil(MAXIMUM_DOMAINS / PAGE_SIZE) + 1
20
- const DomainRef = Object.freeze({ origin: ADMIN_ORIGIN, kind: 'class' as const, name: 'Domain' })
21
- const fleetInstallsByDefault = Object.freeze({
22
- origin: ADMIN_ORIGIN,
23
- kind: 'class' as const,
24
- name: 'fleet_installs_domain_by_default',
25
- })
26
19
 
27
20
  export interface AdminCatalogContext {
28
21
  readonly session: ClientSession
@@ -36,30 +29,21 @@ export interface AdminCatalogApi {
36
29
  }
37
30
 
38
31
  export interface AdminCatalogDependencies {
39
- readonly bind?: (session: ClientSession) => Promise<AdminBinding>
40
32
  readonly operationId?: (kind: 'publish' | 'configure-default') => string
41
33
  }
42
34
 
43
- /** Bind the discovered Admin revision and expose its Domain catalog journey. */
35
+ /** Connect the Domain catalog journey without schema discovery or reflection. */
44
36
  export async function connectAdminCatalog(
45
37
  context: AdminCatalogContext,
46
38
  dependencies: AdminCatalogDependencies = {},
47
39
  ): Promise<AdminCatalogApi> {
48
- const binding = await (dependencies.bind ?? bindAdmin)(context.session)
49
- if (binding.$.publication?.origin !== ADMIN_ORIGIN || binding.$.origin !== ADMIN_ORIGIN) {
50
- throw new TypeError('Configured Admin target does not serve the Admin Domain.')
51
- }
52
- const Domain = binding.$.class('Domain')
53
- const Fleet = binding.$.class('Fleet')
54
- const fleet = binding.$.core.nodes.fleet?.path
55
- if (fleet === undefined) throw new TypeError('Admin Domain has no singleton Fleet receiver.')
56
40
  const operationId = dependencies.operationId ?? defaultOperationId
57
41
 
58
42
  const list = async (): Promise<DomainInfo[]> => {
59
43
  const [nodes, defaultsPage] = await Promise.all([
60
44
  readAllNodes(
61
45
  context.graph,
62
- Query.from({ kind: 'node', definitions: [DomainRef] }).select({
46
+ Query.from({ nodes: [AdminContract.classes.Domain] }).select({
63
47
  kind: 'nodes',
64
48
  projection: { kind: 'value' },
65
49
  }),
@@ -69,16 +53,20 @@ export async function connectAdminCatalog(
69
53
  maximumPages: MAXIMUM_PAGES,
70
54
  },
71
55
  ),
72
- context.graph.neighbors(fleet, fleetInstallsByDefault, {
73
- direction: 'outgoing',
74
- page: { size: PAGE_SIZE },
75
- }),
56
+ context.graph.neighbors(
57
+ AdminContract.fleet,
58
+ AdminContract.edges.fleetInstallsDomainByDefault,
59
+ {
60
+ direction: 'outgoing',
61
+ page: { size: PAGE_SIZE },
62
+ },
63
+ ),
76
64
  ])
77
65
  const defaults = await defaultsPage.collect({ maximumPages: MAXIMUM_PAGES })
78
66
  if (defaults.cursor !== null)
79
67
  throw new TypeError('Admin default Domain catalog exceeded its bound.')
80
68
  const defaultIds = new Set(defaults.nodes.map((node) => String(node.id)))
81
- return nodes.map((node) => domainFromNode(Domain, node, defaultIds.has(String(node.id))))
69
+ return nodes.map((node) => domainFromNode(node, defaultIds.has(String(node.id))))
82
70
  }
83
71
 
84
72
  const requireDomain = async (identifier: string): Promise<DomainInfo> => {
@@ -107,13 +95,13 @@ export async function connectAdminCatalog(
107
95
  let entry = existing
108
96
  if (registryChanged) {
109
97
  entry = domainFromSummary(
110
- await binding.$.invoke(Fleet.$.method('publishDomain') as never, fleet, {
98
+ await callAdminMethod(context.session, AdminContract.fleet, 'publishDomain', {
111
99
  operationId: operationId('publish'),
112
100
  origin: input.origin,
113
101
  name: input.name,
114
102
  discoveryUrl: input.url,
115
103
  ...(description === undefined ? {} : { description }),
116
- } as never),
104
+ }),
117
105
  existing?.installByDefault === true,
118
106
  )
119
107
  }
@@ -124,14 +112,10 @@ export async function connectAdminCatalog(
124
112
  (entry.installByDefault ?? false) !== input.installByDefault
125
113
  if (defaultChanged) {
126
114
  entry = domainFromSummary(
127
- await binding.$.invoke(
128
- Domain.$.method('configureDefault') as never,
129
- Path.parse(entry.id),
130
- {
131
- operationId: operationId('configure-default'),
132
- enabled: input.installByDefault,
133
- } as never,
134
- ),
115
+ await callAdminMethod(context.session, Path.parse(entry.id), 'configureDefault', {
116
+ operationId: operationId('configure-default'),
117
+ enabled: input.installByDefault,
118
+ }),
135
119
  input.installByDefault === true,
136
120
  )
137
121
  }
@@ -144,29 +128,23 @@ export async function connectAdminCatalog(
144
128
  })
145
129
  }
146
130
 
147
- type DynamicDefinition = ReturnType<AdminBinding['$']['class']>
148
-
149
- function domainFromNode(
150
- definition: DynamicDefinition,
151
- node: Node,
152
- installByDefault: boolean,
153
- ): DomainInfo {
131
+ function domainFromNode(node: Node, installByDefault: boolean): DomainInfo {
154
132
  return Object.freeze({
155
133
  id: Path.id(node.id).raw,
156
- origin: requiredProperty(definition, node, 'origin'),
157
- name: requiredProperty(definition, node, 'name'),
158
- url: requiredProperty(definition, node, 'discoveryUrl'),
159
- ...optionalProperty(definition, node, 'description'),
134
+ origin: requiredProperty(node, 'origin'),
135
+ name: requiredProperty(node, 'name'),
136
+ url: requiredProperty(node, 'discoveryUrl'),
137
+ ...optionalProperty(node, 'description'),
160
138
  ...(installByDefault ? { installByDefault: true } : {}),
161
- createdAt: requiredProperty(definition, node, 'createdAt'),
162
- updatedAt: requiredProperty(definition, node, 'updatedAt'),
139
+ createdAt: requiredProperty(node, 'createdAt'),
140
+ updatedAt: requiredProperty(node, 'updatedAt'),
163
141
  })
164
142
  }
165
143
 
166
144
  function domainFromSummary(input: unknown, installByDefault: boolean): DomainInfo {
167
145
  const value = record(input, 'Admin Domain summary')
168
146
  return Object.freeze({
169
- id: requiredString(value.id, 'Admin Domain id'),
147
+ id: requiredNodePath(value.id, 'Admin Domain id'),
170
148
  origin: requiredString(value.origin, 'Admin Domain origin'),
171
149
  name: requiredString(value.name, 'Admin Domain name'),
172
150
  url: requiredString(value.discoveryUrl, 'Admin Domain discovery URL'),
@@ -179,16 +157,15 @@ function domainFromSummary(input: unknown, installByDefault: boolean): DomainInf
179
157
  })
180
158
  }
181
159
 
182
- function requiredProperty(definition: DynamicDefinition, node: Node, name: string): string {
183
- return requiredString(node.props[definition.$.property(name).key], `Admin Domain.${name}`)
160
+ function requiredProperty(node: Node, name: keyof typeof AdminContract.properties.domain): string {
161
+ return requiredString(node.props[AdminContract.properties.domain[name]], `Admin Domain.${name}`)
184
162
  }
185
163
 
186
164
  function optionalProperty(
187
- definition: DynamicDefinition,
188
165
  node: Node,
189
- name: string,
166
+ name: keyof typeof AdminContract.properties.domain,
190
167
  ): Readonly<Record<string, string>> {
191
- const value = node.props[definition.$.property(name).key]
168
+ const value = node.props[AdminContract.properties.domain[name]]
192
169
  return value === undefined ? {} : { [name]: requiredString(value, `Admin Domain.${name}`) }
193
170
  }
194
171
 
@@ -197,6 +174,15 @@ function requiredString(input: unknown, label: string): string {
197
174
  return input
198
175
  }
199
176
 
177
+ function requiredNodePath(input: unknown, label: string): string {
178
+ const value = requiredString(input, label)
179
+ try {
180
+ return Path.parse(value).raw
181
+ } catch {
182
+ throw new TypeError(`${label} is invalid.`)
183
+ }
184
+ }
185
+
200
186
  function record(input: unknown, label: string): Readonly<Record<string, unknown>> {
201
187
  if (typeof input !== 'object' || input === null || Array.isArray(input)) {
202
188
  throw new TypeError(`${label} is invalid.`)
@@ -33,10 +33,9 @@ export interface InstallDomainResult {
33
33
  readonly error?: string | null
34
34
  }
35
35
 
36
- export class AdminDomainNotFoundError extends Error {
37
- readonly name = 'NotFoundError'
38
-
36
+ export class AdminDomainNotFoundError extends AstraleError {
39
37
  constructor(readonly identifier: string) {
40
- super(`No visible Admin Domain matches ${JSON.stringify(identifier)}.`)
38
+ super('DOMAIN_NOT_FOUND', `No visible Admin Domain matches ${JSON.stringify(identifier)}.`)
41
39
  }
42
40
  }
41
+ import { AstraleError } from '../../errors'
@@ -0,0 +1,47 @@
1
+ import type { Input } from '@astrale-os/sdk/client'
2
+ import type { ClientSession, SessionRequestOptions } from '@astrale-os/sdk/client/session'
3
+ import type { ClassRef } from '@astrale-os/sdk/schema'
4
+
5
+ import { call } from '@astrale-os/sdk/client'
6
+ import { Path } from '@astrale-os/sdk/graph/path'
7
+ import { K, PropertyKey } from '@astrale-os/sdk/schema'
8
+
9
+ const origin = 'admin.astrale.ai'
10
+
11
+ function classRef(name: string): ClassRef {
12
+ return Object.freeze({ origin, kind: 'class', name }) as ClassRef
13
+ }
14
+
15
+ const Domain = classRef('Domain')
16
+
17
+ export const AdminContract = Object.freeze({
18
+ origin,
19
+ fleet: Path.parse('/:admin.astrale.ai:core.fleet'),
20
+ classes: Object.freeze({
21
+ Domain,
22
+ }),
23
+ edges: Object.freeze({
24
+ fleetInstallsDomainByDefault: classRef('fleet_installs_domain_by_default'),
25
+ }),
26
+ properties: Object.freeze({
27
+ domain: Object.freeze({
28
+ origin: PropertyKey.of(Domain, 'origin'),
29
+ name: K.classes.Named.properties.name.key,
30
+ discoveryUrl: PropertyKey.of(Domain, 'discoveryUrl'),
31
+ description: K.classes.Descriptable.properties.description.key,
32
+ createdAt: K.classes.Timestamped.properties.createdAt.key,
33
+ updatedAt: K.classes.Timestamped.properties.updatedAt.key,
34
+ }),
35
+ }),
36
+ })
37
+
38
+ /** Invoke one stable Admin instance Method without schema discovery or reflection. */
39
+ export function callAdminMethod(
40
+ session: ClientSession,
41
+ receiver: Path,
42
+ method: string,
43
+ input: Input,
44
+ options?: SessionRequestOptions,
45
+ ): Promise<unknown> {
46
+ return session.call(call(Path.instanceMethod(receiver, method), input), options)
47
+ }
@@ -1,18 +1,12 @@
1
- import type { GraphQueryOptions, NeighborsOptions, NodePage } from '@astrale-os/kernel-client/graph'
2
- import type { ClassPath } from '@astrale-os/sdk/graph/class'
1
+ import type { GraphApi } from '@astrale-os/sdk/client'
3
2
  import type { Node } from '@astrale-os/sdk/graph/node'
4
- import type { PathLike } from '@astrale-os/sdk/graph/path'
5
- import type { QueryAST, QueryResult } from '@astrale-os/sdk/query'
3
+ import type { QueryAST } from '@astrale-os/sdk/query'
6
4
 
7
5
  /** Smallest Kernel graph capability needed by bounded Admin graph reads. */
8
- export interface AdminGraphQueryApi {
9
- query(ast: QueryAST, options?: GraphQueryOptions): Promise<QueryResult>
10
- }
6
+ export type AdminGraphQueryApi = Pick<GraphApi, 'query'>
11
7
 
12
8
  /** Caller-scoped graph reads shared by the Admin catalog and Instance journeys. */
13
- export interface AdminGraphApi extends AdminGraphQueryApi {
14
- neighbors(source: PathLike, edge: ClassPath, options: NeighborsOptions): Promise<NodePage>
15
- }
9
+ export type AdminGraphApi = Pick<GraphApi, 'query' | 'neighbors'>
16
10
 
17
11
  export interface ReadAllNodesOptions {
18
12
  readonly label: string
@@ -1,4 +1,4 @@
1
- import type { GraphApi } from '@astrale-os/kernel-client/graph'
1
+ import type { GraphApi } from '@astrale-os/sdk/client'
2
2
  import type { Node } from '@astrale-os/sdk/graph/node'
3
3
  import type { QueryAST } from '@astrale-os/sdk/query'
4
4
 
@@ -1,7 +1,4 @@
1
- import type { DomainBinding } from '@astrale-os/kernel-client/domain'
2
- import type { ClientSession } from '@astrale-os/kernel-client/session'
3
-
4
- import type { AdminGraphApi } from '../../graph/.spec/api.js'
1
+ import type { ClientSession } from '@astrale-os/sdk/client/session'
5
2
 
6
3
  export type InstanceState = 'provisioning' | 'ready' | 'deleting' | 'failed' | 'deleted'
7
4
 
@@ -11,10 +8,11 @@ export interface InstanceInfo {
11
8
  readonly url: string
12
9
  readonly hostId?: string
13
10
  readonly region?: string
14
- readonly state?: InstanceState
11
+ readonly state: InstanceState
15
12
  readonly phase?: string
16
13
  readonly error?: string | null
17
14
  readonly createdAt?: string
15
+ readonly updatedAt?: string
18
16
  readonly organizationId?: string
19
17
  }
20
18
 
@@ -33,12 +31,11 @@ export interface DomainInstallReceipt {
33
31
 
34
32
  export interface AdminInstanceContext {
35
33
  readonly session: ClientSession
36
- readonly graph: AdminGraphApi
37
34
  }
38
35
 
39
36
  export interface AdminInstanceApi {
40
37
  list(): Promise<OwnedInstanceInfo[]>
41
- create(slug: string, hostId?: string): Promise<InstanceInfo>
38
+ create(slug: string): Promise<InstanceInfo>
42
39
  status(identifier: string): Promise<InstanceInfo>
43
40
  delete(identifier: string): Promise<InstanceInfo>
44
41
  installDomain(identifier: string, domain: string): Promise<DomainInstallReceipt>
@@ -51,7 +48,6 @@ export class AdminInstanceNotFoundError extends Error {
51
48
  }
52
49
 
53
50
  export interface AdminInstanceDependencies {
54
- readonly bind?: (session: ClientSession) => Promise<DomainBinding>
55
51
  readonly operationId?: (kind: 'create' | 'status' | 'delete' | 'install-domain') => string
56
52
  }
57
53
 
@@ -63,4 +59,4 @@ export function findOwnedInstance(
63
59
  instances: readonly OwnedInstanceInfo[],
64
60
  identifier: string,
65
61
  ): OwnedInstanceInfo | undefined
66
- export function formatInstanceLocation(info: InstanceInfo): string
62
+ export function formatInstanceState(info: InstanceInfo): string
@@ -1,10 +1,10 @@
1
1
  # CLI Admin Instance adapter
2
2
 
3
- The adapter discovers and binds the configured Admin Domain, proves its origin, and resolves the
4
- singleton Fleet receiver. Policy-visible `Instance` and `Host` Nodes come from bounded Graph queries;
5
- Host location is joined through `instance_runs_on_host`.
3
+ The adapter calls the stable singleton Fleet receiver directly. Listing and automatic creation are
4
+ one Admin Method call each; connection performs no schema discovery, introspection, or graph read.
5
+ Every returned summary is decoded locally before it reaches a command.
6
6
 
7
- Automatic creation invokes `Fleet.createInstance`; explicit `--host-id` resolves one visible,
8
- non-reserved Host and invokes `Host.createInstance`. Status, deletion, and Domain installation
9
- invoke the exact Instance receiver. The adapter creates internal operation IDs but preserves the
10
- existing CLI projection and selection-required experience.
7
+ Automatic creation invokes `Fleet.createInstance`. Status, deletion, and Domain installation first
8
+ resolve a caller-visible Instance through Fleet and then invoke that exact Instance receiver. The
9
+ adapter creates internal operation IDs but preserves the existing CLI projection and
10
+ selection-required experience.