@astrale-os/cli 1.0.0-beta.1 → 1.0.0-beta.11

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 (329) hide show
  1. package/README.md +23 -12
  2. package/dist/astrale.js +48048 -56798
  3. package/dist/public/connect-core.js +2011 -30765
  4. package/dist/public/keys/index.js +884 -29483
  5. package/dist/public/paths/index.js +13101 -41459
  6. package/dist/types/admin/binding.d.ts +19 -0
  7. package/dist/types/admin/instance/client.d.ts +22 -0
  8. package/dist/types/admin/instance/index.d.ts +2 -0
  9. package/dist/types/admin/instance/model.d.ts +5 -12
  10. package/dist/types/connection/auth.d.ts +3 -0
  11. package/dist/types/connection/call.d.ts +3 -0
  12. package/dist/types/connection/command.d.ts +27 -0
  13. package/dist/types/connection/credential.d.ts +14 -0
  14. package/dist/types/connection/errors.d.ts +1 -0
  15. package/dist/types/connection/exchange.d.ts +9 -0
  16. package/dist/types/connection/failure/classify.d.ts +2 -0
  17. package/dist/types/connection/failure/index.d.ts +5 -0
  18. package/dist/types/connection/failure/model.d.ts +25 -0
  19. package/dist/types/connection/failure/render.d.ts +3 -0
  20. package/dist/types/connection/index.d.ts +8 -0
  21. package/dist/types/connection/reasons.d.ts +37 -0
  22. package/dist/types/connection/self.d.ts +37 -0
  23. package/dist/types/connection/session.d.ts +31 -0
  24. package/dist/types/connection/target.d.ts +38 -0
  25. package/dist/types/errors.d.ts +1 -1
  26. package/dist/types/lib/admin-instance.d.ts +17 -0
  27. package/dist/types/lib/admin-target.d.ts +11 -36
  28. package/dist/types/lib/config.d.ts +7 -59
  29. package/dist/types/lib/failure-debug.d.ts +1 -0
  30. package/dist/types/lib/idp.d.ts +26 -168
  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/meta.d.ts +2 -2
  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 +91 -0
  38. package/dist/types/lib/validation.d.ts +4 -1
  39. package/package.json +16 -19
  40. package/src/__tests__/fixtures/publication.ts +20 -0
  41. package/src/admin/__tests__/binding.test.ts +31 -0
  42. package/src/admin/__tests__/fixture.ts +101 -0
  43. package/src/admin/binding.ts +98 -0
  44. package/src/admin/catalog/.spec/api.d.ts +2 -2
  45. package/src/admin/catalog/__tests__/client.test.ts +20 -49
  46. package/src/admin/catalog/client.ts +36 -32
  47. package/src/admin/catalog/model.ts +3 -4
  48. package/src/admin/graph/.spec/api.d.ts +4 -10
  49. package/src/admin/graph/nodes.ts +1 -1
  50. package/src/admin/instance/.spec/api.d.ts +2 -2
  51. package/src/admin/instance/__tests__/client.test.ts +39 -164
  52. package/src/admin/instance/client.ts +35 -124
  53. package/src/admin/instance/index.ts +1 -2
  54. package/src/admin/instance/model.ts +11 -20
  55. package/src/commands/__tests__/admin-instance.test.ts +11 -8
  56. package/src/commands/__tests__/auth-login.test.ts +54 -1
  57. package/src/commands/__tests__/call-describe.test.ts +46 -33
  58. package/src/commands/__tests__/call.test.ts +5 -1
  59. package/src/commands/__tests__/domain-install-operation.test.ts +12 -7
  60. package/src/commands/__tests__/domain-install-owned.test.ts +6 -2
  61. package/src/commands/__tests__/domain-list.test.ts +63 -4
  62. package/src/commands/__tests__/install-identity-override.test.ts +19 -19
  63. package/src/commands/__tests__/instance-list-rows.test.ts +1 -1
  64. package/src/commands/__tests__/instance-status.test.ts +139 -0
  65. package/src/commands/__tests__/read-commands.test.ts +35 -10
  66. package/src/commands/__tests__/studio-descriptor.test.ts +22 -0
  67. package/src/commands/__tests__/update.test.ts +48 -19
  68. package/src/commands/call-describe.ts +60 -68
  69. package/src/commands/call.ts +43 -56
  70. package/src/commands/domain/install.ts +13 -17
  71. package/src/commands/domain/list.ts +18 -13
  72. package/src/commands/domain/publish.ts +14 -11
  73. package/src/commands/domain/uninstall.ts +2 -2
  74. package/src/commands/get.ts +14 -15
  75. package/src/commands/identity/__tests__/register.test.ts +3 -3
  76. package/src/commands/identity/register.ts +5 -4
  77. package/src/commands/instance/create.ts +8 -16
  78. package/src/commands/instance/delete.ts +12 -9
  79. package/src/commands/instance/list.ts +2 -2
  80. package/src/commands/instance/status.ts +66 -20
  81. package/src/commands/instance/use.ts +16 -12
  82. package/src/commands/introspect.ts +9 -16
  83. package/src/commands/logs.ts +24 -25
  84. package/src/commands/mutate.ts +6 -5
  85. package/src/commands/query.ts +27 -30
  86. package/src/commands/studio.ts +20 -0
  87. package/src/commands/token.ts +8 -7
  88. package/src/commands/update.ts +38 -14
  89. package/src/commands/view.ts +7 -6
  90. package/src/connection/.spec/api.d.ts +7 -8
  91. package/src/connection/.spec/architecture.md +5 -4
  92. package/src/connection/.spec/flows/session.ts +2 -2
  93. package/src/connection/.spec/laws/connection.ts +6 -2
  94. package/src/connection/.spec/layout.ts +1 -0
  95. package/src/connection/__tests__/credential.test.ts +20 -1
  96. package/src/connection/__tests__/errors.test.ts +43 -32
  97. package/src/connection/__tests__/exchange.test.ts +36 -6
  98. package/src/connection/__tests__/failure-fixtures.ts +39 -0
  99. package/src/connection/__tests__/failure-safety.test.ts +75 -0
  100. package/src/connection/__tests__/self.test.ts +31 -11
  101. package/src/connection/__tests__/session.test.ts +3 -3
  102. package/src/connection/__tests__/target.test.ts +1 -0
  103. package/src/connection/auth.ts +13 -0
  104. package/src/connection/call.ts +1 -1
  105. package/src/connection/credential.ts +2 -2
  106. package/src/connection/errors.ts +1 -355
  107. package/src/connection/exchange.ts +52 -27
  108. package/src/connection/failure/classify.ts +110 -0
  109. package/src/connection/failure/index.ts +18 -0
  110. package/src/connection/failure/model.ts +28 -0
  111. package/src/connection/failure/render.ts +116 -0
  112. package/src/connection/reasons.ts +16 -0
  113. package/src/connection/self.ts +39 -21
  114. package/src/connection/session.ts +19 -8
  115. package/src/errors.ts +3 -2
  116. package/src/graph/.spec/api.d.ts +12 -5
  117. package/src/graph/.spec/layout.ts +9 -1
  118. package/src/graph/__tests__/mutation.test.ts +2 -2
  119. package/src/graph/__tests__/query.test.ts +25 -6
  120. package/src/graph/class.ts +30 -0
  121. package/src/graph/index.ts +1 -0
  122. package/src/graph/query.ts +21 -32
  123. package/src/identity/.spec/api.d.ts +2 -2
  124. package/src/identity/__tests__/registration.test.ts +1 -1
  125. package/src/identity/registration.ts +3 -3
  126. package/src/keys/__tests__/keys.test.ts +4 -0
  127. package/src/keys/credential.ts +1 -0
  128. package/src/lib/__tests__/admin-target.test.ts +12 -0
  129. package/src/lib/__tests__/command-dx.test.ts +1 -1
  130. package/src/lib/__tests__/domain-publication.test.ts +138 -0
  131. package/src/lib/__tests__/idp-session.test.ts +22 -0
  132. package/src/lib/__tests__/idp.test.ts +36 -4
  133. package/src/lib/__tests__/instance-candidates.test.ts +1 -3
  134. package/src/lib/__tests__/instance-target.test.ts +7 -39
  135. package/src/lib/__tests__/instance.test.ts +6 -0
  136. package/src/lib/__tests__/log-errors.test.ts +64 -0
  137. package/src/lib/__tests__/studio-server-deps.test.ts +53 -16
  138. package/src/lib/__tests__/update.test.ts +113 -8
  139. package/src/lib/__tests__/view-open-intent.test.ts +0 -2
  140. package/src/lib/__tests__/view-server.test.ts +18 -3
  141. package/src/lib/__tests__/view-session.test.ts +1 -1
  142. package/src/lib/admin-instance.ts +14 -8
  143. package/src/lib/admin-target.ts +21 -2
  144. package/src/lib/command-dx.ts +9 -9
  145. package/src/lib/domain-publication.ts +104 -0
  146. package/src/lib/failure-debug.ts +26 -0
  147. package/src/lib/idp.ts +39 -4
  148. package/src/lib/instance-candidates.ts +2 -2
  149. package/src/lib/instance-target.ts +3 -14
  150. package/src/lib/instance.ts +22 -12
  151. package/src/lib/log.ts +16 -9
  152. package/src/lib/login-flow.ts +13 -3
  153. package/src/lib/meta.ts +2 -2
  154. package/src/lib/provision-instance.ts +34 -57
  155. package/src/lib/update.ts +124 -30
  156. package/src/lib/validation.ts +2 -2
  157. package/src/lib/view/resolve.ts +1 -1
  158. package/src/lib/view/server.ts +17 -3
  159. package/src/program/__tests__/program.test.ts +20 -4
  160. package/src/program/build.ts +2 -2
  161. package/src/setup/__tests__/instance-step.test.ts +27 -10
  162. package/src/setup/steps/instance.ts +22 -15
  163. package/studio/client/dist/assets/elk-api-DjmKsHXc.js +1 -0
  164. package/studio/client/dist/assets/index-7YHdeCxp.js +81 -0
  165. package/studio/client/dist/assets/index-C0FAnwNw.css +2 -0
  166. package/studio/client/dist/assets/rolldown-runtime-Dd_uD5pT.js +1 -0
  167. package/studio/client/dist/assets/schema-studio-BilUNb6Z.css +1 -0
  168. package/studio/client/dist/assets/schema-studio-CABpTfvH.js +8 -0
  169. package/studio/client/dist/index.html +3 -2
  170. package/studio/package.json +10 -14
  171. package/studio/server/agent/ask.test.ts +1 -1
  172. package/studio/server/agent/bridge/grant.test.ts +1 -1
  173. package/studio/server/agent/bridge/routes.test.ts +1 -1
  174. package/studio/server/agent/bridge/stdio.ts +8 -1
  175. package/studio/server/agent/conversation.test.ts +10 -5
  176. package/studio/server/agent/conversation.ts +56 -8
  177. package/studio/server/agent/harness/claude/adapter.test.ts +15 -5
  178. package/studio/server/agent/harness/codex/loadout.ts +18 -21
  179. package/studio/server/agent/harness/gateway/config.ts +20 -18
  180. package/studio/server/agent/harness/selection.ts +9 -1
  181. package/studio/server/agent/prompts/anchors.test.ts +32 -36
  182. package/studio/server/agent/prompts/anchors.ts +20 -49
  183. package/studio/server/agent/prompts/system.test.ts +3 -2
  184. package/studio/server/agent/prompts/system.ts +6 -5
  185. package/studio/server/agent/prompts/turn.ts +13 -4
  186. package/studio/server/agent/routes.test.ts +1 -1
  187. package/studio/server/agent/run/completion.ts +2 -2
  188. package/studio/server/agent/run/coordinator.test.ts +1 -1
  189. package/studio/server/agent/run/preparation.ts +6 -5
  190. package/studio/server/agent/run/transcript.test.ts +35 -1
  191. package/studio/server/agent/run/transcript.ts +169 -3
  192. package/studio/server/agent/run/usage.test.ts +24 -0
  193. package/studio/server/agent/run/usage.ts +26 -1
  194. package/studio/server/api/canvas.ts +43 -0
  195. package/studio/server/api/comments.ts +85 -0
  196. package/studio/server/api/context.ts +61 -0
  197. package/studio/server/api/deployment.ts +39 -0
  198. package/studio/server/api/documents.ts +55 -0
  199. package/studio/server/api/domain.ts +59 -0
  200. package/studio/server/api/http.ts +45 -0
  201. package/studio/server/api/project.ts +57 -0
  202. package/studio/server/api/schema.ts +12 -0
  203. package/studio/server/api/views.ts +57 -0
  204. package/studio/server/api/workspace.ts +60 -0
  205. package/studio/server/api-agent-loadout.test.ts +1 -1
  206. package/studio/server/api.test.ts +147 -0
  207. package/studio/server/api.ts +20 -422
  208. package/studio/server/cache.test.ts +122 -0
  209. package/studio/server/cache.ts +162 -11
  210. package/studio/server/cli-consumers.test.ts +494 -0
  211. package/studio/server/cli.test.ts +88 -0
  212. package/studio/server/cli.ts +240 -0
  213. package/studio/server/client-package.ts +25 -1
  214. package/studio/server/domain.test.ts +50 -40
  215. package/studio/server/domain.ts +83 -52
  216. package/studio/server/environment/dotenv-preview.test.ts +39 -0
  217. package/studio/server/environment/dotenv-preview.ts +27 -0
  218. package/studio/server/environment/files.test.ts +53 -0
  219. package/studio/server/{state/env.ts → environment/files.ts} +7 -48
  220. package/studio/server/{state → handoff}/copy.ts +21 -6
  221. package/studio/server/handoff/service.test.ts +22 -0
  222. package/studio/server/{state/handoff.ts → handoff/service.ts} +21 -14
  223. package/studio/server/index.ts +1 -1
  224. package/studio/server/instances/active.ts +72 -0
  225. package/studio/server/instances/deploy-record.test.ts +31 -0
  226. package/studio/server/instances/deploy-record.ts +37 -0
  227. package/studio/server/instances/deploy.ts +56 -0
  228. package/studio/server/{state/instance.test.ts → instances/probe.test.ts} +25 -21
  229. package/studio/server/instances/probe.ts +67 -0
  230. package/studio/server/instances/status.test.ts +12 -0
  231. package/studio/server/instances/status.ts +49 -0
  232. package/studio/server/introspect/anatomy/client-tree.ts +57 -0
  233. package/studio/server/introspect/anatomy/env-fields.ts +66 -0
  234. package/studio/server/introspect/anatomy/schema-definition.ts +53 -0
  235. package/studio/server/introspect/anatomy/source.ts +181 -0
  236. package/studio/server/introspect/anatomy/views/routes.ts +114 -0
  237. package/studio/server/introspect/anatomy/views.ts +53 -0
  238. package/studio/server/introspect/anatomy-extras.test.ts +106 -35
  239. package/studio/server/introspect/anatomy-extras.ts +7 -726
  240. package/studio/server/introspect/anatomy.test.ts +22 -14
  241. package/studio/server/introspect/anatomy.ts +52 -28
  242. package/studio/server/introspect/bundle.ts +15 -9
  243. package/studio/server/introspect/canonical-schema.test.ts +93 -309
  244. package/studio/server/introspect/canonical-schema.ts +257 -425
  245. package/studio/server/introspect/config-preview.test.ts +32 -0
  246. package/studio/server/introspect/config-preview.ts +119 -0
  247. package/studio/server/introspect/core-extractor.ts +18 -127
  248. package/studio/server/introspect/core.ts +1 -2
  249. package/studio/server/introspect/diff.test.ts +18 -18
  250. package/studio/server/introspect/diff.ts +44 -90
  251. package/studio/server/introspect/extractor.ts +23 -116
  252. package/studio/server/introspect/hash.ts +5 -2
  253. package/studio/server/introspect/overlay-tsmorph.test.ts +119 -240
  254. package/studio/server/introspect/overlay-tsmorph.ts +7 -1305
  255. package/studio/server/introspect/overlay.test.ts +26 -54
  256. package/studio/server/introspect/overlay.ts +10 -37
  257. package/studio/server/introspect/revision.test.ts +54 -0
  258. package/studio/server/introspect/revision.ts +49 -0
  259. package/studio/server/introspect/runtime.test.ts +83 -143
  260. package/studio/server/introspect/runtime.ts +40 -11
  261. package/studio/server/introspect/schema-ir-json.test.ts +70 -0
  262. package/studio/server/introspect/schema-ir-json.ts +151 -0
  263. package/studio/server/introspect/schema-refs.test.ts +43 -88
  264. package/studio/server/introspect/schema-refs.ts +14 -49
  265. package/studio/server/introspect/source-overlay/annotations.ts +14 -0
  266. package/studio/server/introspect/source-overlay/handlers.ts +161 -0
  267. package/studio/server/introspect/source-overlay/kernel-calls.ts +46 -0
  268. package/studio/server/introspect/source-overlay/project.ts +248 -0
  269. package/studio/server/introspect/source-overlay/spans.ts +330 -0
  270. package/studio/server/json.ts +46 -0
  271. package/studio/server/lifecycle.ts +5 -1
  272. package/studio/server/sse.test.ts +26 -0
  273. package/studio/server/sse.ts +4 -1
  274. package/studio/server/state/baseline.test.ts +223 -7
  275. package/studio/server/state/baseline.ts +148 -34
  276. package/studio/server/state/comments.test.ts +66 -1
  277. package/studio/server/state/comments.ts +173 -10
  278. package/studio/server/state/context.ts +34 -2
  279. package/studio/server/state/documents.ts +42 -1
  280. package/studio/server/state/integrations.ts +27 -1
  281. package/studio/server/state/layout.test.ts +34 -0
  282. package/studio/server/state/layout.ts +44 -17
  283. package/studio/server/state/settings.ts +29 -22
  284. package/studio/server/state/store.test.ts +122 -0
  285. package/studio/server/state/store.ts +66 -17
  286. package/studio/server/state/visibility.ts +22 -11
  287. package/studio/server/views/model.test.ts +57 -0
  288. package/studio/server/views/model.ts +66 -0
  289. package/studio/server/views/runtime.ts +40 -0
  290. package/studio/server/views/selection-repository.test.ts +31 -0
  291. package/studio/server/views/selection-repository.ts +60 -0
  292. package/studio/server/views/session.test.ts +73 -0
  293. package/studio/server/views/session.ts +166 -0
  294. package/studio/server/views/target.test.ts +78 -0
  295. package/studio/server/views/target.ts +222 -0
  296. package/studio/server/watch.test.ts +11 -11
  297. package/studio/server/watch.ts +9 -5
  298. package/studio/server/workspace/catalog.test.ts +17 -0
  299. package/studio/server/workspace/catalog.ts +43 -0
  300. package/studio/server/{state → workspace}/create.test.ts +1 -1
  301. package/studio/server/{state → workspace}/create.ts +1 -1
  302. package/studio/server/{state → workspace}/git.ts +1 -1
  303. package/studio/server/workspace/updates.ts +83 -0
  304. package/studio/server/workspace-state.ts +1 -1
  305. package/studio/server/workspace-watch.ts +2 -2
  306. package/studio/shared/contracts/README.md +16 -0
  307. package/studio/shared/contracts/agent.ts +270 -0
  308. package/studio/shared/contracts/runtime.ts +50 -0
  309. package/studio/shared/contracts/schema.ts +393 -0
  310. package/studio/shared/contracts/surface.test.ts +317 -0
  311. package/studio/shared/contracts/workspace.ts +265 -0
  312. package/studio/shared/layout.test.ts +116 -0
  313. package/studio/shared/schema/identity.test.ts +34 -0
  314. package/studio/shared/schema/identity.ts +68 -0
  315. package/studio/shared/types.ts +11 -1099
  316. package/studio/tsconfig.json +1 -1
  317. package/viewer/dist/main.js +40 -61
  318. package/.check-workspace.cjs +0 -40
  319. package/src/commands/__tests__/instance-create-hosts.test.ts +0 -29
  320. package/studio/client/dist/assets/elk-api-D2xgMJvi.js +0 -1
  321. package/studio/client/dist/assets/index-BMdnsIJA.css +0 -1
  322. package/studio/client/dist/assets/index-ChOr3yP0.css +0 -1
  323. package/studio/client/dist/assets/index-D-vRV8w7.js +0 -8
  324. package/studio/client/dist/assets/index-LGSWRrk8.js +0 -81
  325. package/studio/server/state/catalog.ts +0 -117
  326. package/studio/server/state/instance.ts +0 -280
  327. package/studio/server/state/updates.ts +0 -63
  328. package/studio/server/state/views.test.ts +0 -286
  329. package/studio/server/state/views.ts +0 -535
@@ -5,9 +5,9 @@ import type { CommandDefinition } from '../program/index'
5
5
 
6
6
  import { runKernelCommand } from '../connection'
7
7
  import { AstraleError } from '../errors'
8
- import { failClosed } from '../lib/log'
8
+ import { failInput } from '../lib/log'
9
9
  import { output } from '../lib/output'
10
- import { describeCallableFromSchema, missingCallableDescription } from './call-describe'
10
+ import { describeCallableFromBundle, missingCallableDescription } from './call-describe'
11
11
 
12
12
  type IntrospectOpts = KernelCommandOpts & { bundle?: boolean }
13
13
 
@@ -17,7 +17,7 @@ export async function introspectCommand(target: string, opts: IntrospectOpts): P
17
17
  try {
18
18
  ;({ origin, path } = parseIntrospectTarget(target))
19
19
  } catch (error) {
20
- failClosed(error, opts)
20
+ failInput(error, opts)
21
21
  }
22
22
  const wantsCallable = isCallablePath(path)
23
23
 
@@ -44,7 +44,7 @@ export async function introspectCommand(target: string, opts: IntrospectOpts): P
44
44
  )
45
45
  }
46
46
  if (wantsCallable) {
47
- const described = describeCallableFromSchema(path, bundleRoot(result.bundle))
47
+ const described = describeCallableFromBundle(path, result.bundle)
48
48
  if (described === undefined) throw missingCallableDescription(path.raw)
49
49
  return described
50
50
  }
@@ -59,7 +59,7 @@ export function parseIntrospectTarget(target: string): { origin: string; path: P
59
59
  throw new AstraleError(
60
60
  'NOT_A_DOMAIN',
61
61
  'introspect requires a Domain origin or Path, not an @id.',
62
- 'Example: astrale introspect host.astrale.ai or /:host.astrale.ai:class.Manager:createInstance',
62
+ 'Example: astrale introspect kernel.astrale.ai or /:kernel.astrale.ai:class.Identity:whois',
63
63
  )
64
64
  }
65
65
  const raw = target.startsWith('/') ? target : `/:${target}`
@@ -85,28 +85,21 @@ function isCallablePath(path: Path): boolean {
85
85
  return last.kind === 'projection' && last.projection.kind === 'function'
86
86
  }
87
87
 
88
- function bundleRoot(bundle: unknown): unknown {
89
- if (bundle !== null && typeof bundle === 'object' && 'root' in bundle) {
90
- return (bundle as { root: unknown }).root
91
- }
92
- return bundle
93
- }
94
-
95
88
  export default {
96
89
  name: 'introspect',
97
90
  description: 'Read installed Domain schema from the Kernel Schema syscall',
98
91
  afterHelpText: `
99
92
  Behavior:
100
93
  Calls the public Kernel introspect syscall for one installed Domain.
101
- A bare origin (host.astrale.ai or /:host.astrale.ai) prints installation
94
+ A bare origin (kernel.astrale.ai or /:kernel.astrale.ai) prints installation
102
95
  state, target, source, readiness, and capabilities. --bundle includes the
103
96
  schema bundle. A method or Function Path projects that callable's
104
97
  input/output from the installed bundle.
105
98
 
106
99
  Examples:
107
- $ astrale introspect host.astrale.ai
108
- $ astrale introspect /:host.astrale.ai --bundle
109
- $ astrale introspect /:host.astrale.ai:class.Manager:createInstance
100
+ $ astrale introspect kernel.astrale.ai
101
+ $ astrale introspect /:kernel.astrale.ai --bundle
102
+ $ astrale introspect /:kernel.astrale.ai:class.Identity:whois
110
103
  $ astrale introspect /:kernel.astrale.ai:function.journal
111
104
  `,
112
105
  arguments: [{ name: 'target', description: 'Domain origin or canonical Path' }],
@@ -1,21 +1,16 @@
1
1
  import { Path } from '@astrale-os/sdk/graph/path'
2
- import { syscalls } from '@astrale-os/sdk/schema/kernel'
2
+ import { K } from '@astrale-os/sdk/schema'
3
3
  import chalk from 'chalk'
4
4
 
5
5
  import type { ConnectionContext, KernelCommandOpts } from '../connection'
6
6
  import type { Column, ListProjection } from '../lib/output'
7
7
  import type { CommandDefinition } from '../program/index'
8
8
 
9
- import {
10
- createPathCall,
11
- expandSelfInPath,
12
- runKernelCommand,
13
- withClientSession,
14
- } from '../connection'
15
- import { failClosed } from '../lib/log'
9
+ import { createPathCall, expandSelfInPath, runKernelCommand } from '../connection'
10
+ import { failInput } from '../lib/log'
16
11
  import { isMachine, output, presentList } from '../lib/output'
17
12
 
18
- const JOURNAL_PATH = Path.project(syscalls.journal.ref).raw
13
+ const JOURNAL_PATH = Path.project(K.functions.journal.ref).raw
19
14
  const DEFAULT_LIMIT = 200
20
15
  const FOLLOW_INTERVAL_MS = 2_000
21
16
 
@@ -127,7 +122,7 @@ async function runOnce(opts: LogsOpts): Promise<void> {
127
122
  await runKernelCommand({
128
123
  opts,
129
124
  label: 'Kernel journal',
130
- fn: (context) => fetchPage(context, opts),
125
+ fn: async (context) => fetchPage(context, await resolveLogsOpts(opts, context)),
131
126
  format: (page, format) => {
132
127
  if (isMachine(format) || format.format !== undefined) output(page, format)
133
128
  else {
@@ -139,14 +134,19 @@ async function runOnce(opts: LogsOpts): Promise<void> {
139
134
  }
140
135
 
141
136
  async function follow(opts: LogsOpts): Promise<void> {
142
- await withClientSession(opts, async (context) => {
143
- let cursor = opts.cursor
144
- for (;;) {
145
- const page = await fetchPage(context, { ...opts, cursor })
146
- for (const record of page.records) printRecord(record)
147
- cursor = page.cursor ?? cursor
148
- await new Promise((resolve) => setTimeout(resolve, FOLLOW_INTERVAL_MS))
149
- }
137
+ await runKernelCommand({
138
+ opts,
139
+ label: 'Kernel journal',
140
+ fn: async (context): Promise<never> => {
141
+ const resolved = await resolveLogsOpts(opts, context)
142
+ let cursor = resolved.cursor
143
+ for (;;) {
144
+ const page = await fetchPage(context, { ...resolved, cursor })
145
+ for (const record of page.records) printRecord(record)
146
+ cursor = page.cursor ?? cursor
147
+ await new Promise((resolve) => setTimeout(resolve, FOLLOW_INTERVAL_MS))
148
+ }
149
+ },
150
150
  })
151
151
  }
152
152
 
@@ -227,11 +227,10 @@ function positiveInteger(flag: string, raw: string): number {
227
227
  return value
228
228
  }
229
229
 
230
- async function prepareLogsOpts(opts: LogsOpts): Promise<LogsOpts> {
231
- buildJournalInput(opts)
230
+ async function resolveLogsOpts(opts: LogsOpts, context: ConnectionContext): Promise<LogsOpts> {
232
231
  const principal = nonEmpty(opts.principal)
233
232
  if (principal !== '@self') return opts
234
- const { path } = await expandSelfInPath('@self', opts)
233
+ const { path } = await expandSelfInPath('@self', context)
235
234
  return { ...opts, principal: path.startsWith('@') ? path.slice(1) : path }
236
235
  }
237
236
 
@@ -274,11 +273,11 @@ Examples:
274
273
  ],
275
274
  action: async (opts: LogsOpts) => {
276
275
  try {
277
- const prepared = await prepareLogsOpts(opts)
278
- if (prepared.follow) await follow(prepared)
279
- else await runOnce(prepared)
276
+ buildJournalInput(opts)
280
277
  } catch (error) {
281
- failClosed(error, opts)
278
+ failInput(error, opts)
282
279
  }
280
+ if (opts.follow) await follow(opts)
281
+ else await runOnce(opts)
283
282
  },
284
283
  } satisfies CommandDefinition
@@ -7,8 +7,9 @@ import type { KernelCommandOpts } from '../connection'
7
7
  import type { CommandDefinition } from '../program/index'
8
8
 
9
9
  import { runKernelCommand } from '../connection'
10
+ import { AstraleError } from '../errors'
10
11
  import { prepareMutation } from '../graph/index'
11
- import { failClosed } from '../lib/log'
12
+ import { failInput } from '../lib/log'
12
13
  import { output } from '../lib/output'
13
14
  import { renderTable } from '../lib/table'
14
15
 
@@ -23,7 +24,7 @@ export async function mutateCommand(opts: MutateOpts): Promise<void> {
23
24
  try {
24
25
  mutation = prepareMutation(await readDocument(opts))
25
26
  } catch (error) {
26
- failClosed(error, opts)
27
+ failInput(error, opts)
27
28
  }
28
29
 
29
30
  if (opts.dry) {
@@ -51,9 +52,9 @@ async function readDocument(opts: MutateOpts): Promise<unknown> {
51
52
  try {
52
53
  raw = await readFile(opts.file, 'utf8')
53
54
  } catch (error) {
54
- throw new Error(
55
- `Cannot read --file ${opts.file}: ${error instanceof Error ? error.message : error}`,
56
- )
55
+ throw new AstraleError('FILE_READ_FAILED', `Cannot read --file ${opts.file}.`, undefined, {
56
+ cause: error,
57
+ })
57
58
  }
58
59
  return parseJson(raw, opts.file)
59
60
  }
@@ -6,8 +6,9 @@ import type { KernelCommandOpts, SelfExpansionMeta } from '../connection'
6
6
  import type { CommandDefinition } from '../program/index'
7
7
 
8
8
  import { expandSelfInPath, runKernelCommand, withSelfHint } from '../connection'
9
+ import { AstraleError } from '../errors'
9
10
  import { prepareQuery, type QueryCommandInput } from '../graph/index'
10
- import { failClosed } from '../lib/log'
11
+ import { failInput } from '../lib/log'
11
12
  import { isMachine, output } from '../lib/output'
12
13
 
13
14
  type QueryOpts = KernelCommandOpts & {
@@ -22,46 +23,42 @@ type QueryOpts = KernelCommandOpts & {
22
23
 
23
24
  export async function queryCommand(sources: string[], opts: QueryOpts): Promise<void> {
24
25
  let input: QueryCommandInput
25
- let meta: SelfExpansionMeta | undefined
26
26
  try {
27
27
  const ast = await readAst(opts)
28
- if (ast === undefined) {
29
- const expanded = await Promise.all(sources.map((source) => expandSelfInPath(source, opts)))
30
- input = {
31
- sources: expanded.map(({ path }) => path),
32
- definition: opts.definition,
33
- edge: opts.edge,
34
- direction: opts.direction,
35
- limit: opts.limit,
36
- cursor: opts.cursor,
37
- }
38
- meta = expanded.find((entry) => entry.meta !== undefined)?.meta
39
- } else {
40
- input = {
41
- sources,
42
- ast,
43
- definition: opts.definition,
44
- edge: opts.edge,
45
- direction: opts.direction,
46
- limit: opts.limit,
47
- cursor: opts.cursor,
48
- }
28
+ input = {
29
+ sources,
30
+ ...(ast === undefined ? {} : { ast }),
31
+ definition: opts.definition,
32
+ edge: opts.edge,
33
+ direction: opts.direction,
34
+ limit: opts.limit,
35
+ cursor: opts.cursor,
49
36
  }
50
37
  } catch (error) {
51
- failClosed(error, opts)
38
+ failInput(error, opts)
52
39
  }
53
40
 
54
41
  let prepared
55
42
  try {
56
43
  prepared = prepareQuery(input)
57
44
  } catch (error) {
58
- failClosed(error, opts)
45
+ failInput(error, opts)
59
46
  }
60
47
 
61
48
  await runKernelCommand({
62
49
  opts,
63
50
  label: 'Query',
64
- fn: ({ graph }) => withSelfHint(() => graph.query(prepared.ast, { page: prepared.page }), meta),
51
+ fn: async (context) => {
52
+ const expanded = await Promise.all(sources.map((source) => expandSelfInPath(source, context)))
53
+ const meta: SelfExpansionMeta | undefined = expanded.find(
54
+ (entry) => entry.meta !== undefined,
55
+ )?.meta
56
+ const resolved =
57
+ meta === undefined
58
+ ? prepared
59
+ : prepareQuery({ ...input, sources: expanded.map(({ path }) => path) })
60
+ return withSelfHint(() => context.graph.query(resolved.ast, { page: resolved.page }), meta)
61
+ },
65
62
  format: (response, format) => {
66
63
  output(response.result, format)
67
64
  if (response.page.next && !isMachine(format)) {
@@ -81,9 +78,9 @@ async function readAst(opts: QueryOpts): Promise<unknown | undefined> {
81
78
  try {
82
79
  raw = await readFile(opts.file, 'utf8')
83
80
  } catch (error) {
84
- throw new Error(
85
- `Cannot read --file ${opts.file}: ${error instanceof Error ? error.message : error}`,
86
- )
81
+ throw new AstraleError('FILE_READ_FAILED', `Cannot read --file ${opts.file}.`, undefined, {
82
+ cause: error,
83
+ })
87
84
  }
88
85
  return parseJson(raw, opts.file)
89
86
  }
@@ -122,7 +119,7 @@ Examples:
122
119
  { flags: '-f, --file <path>', description: 'Read a canonical Query V6 document from a file' },
123
120
  {
124
121
  flags: '--definition <path>',
125
- description: 'Select Nodes implementing one exact Class or Interface',
122
+ description: 'Select Nodes satisfying one exact Class',
126
123
  },
127
124
  { flags: '--edge <class>', description: 'Expand one exact Edge Class' },
128
125
  {
@@ -25,6 +25,23 @@ type StudioOpts = RawOutputOpts & {
25
25
  const STUDIO_PORT_BASE = 4319
26
26
  const VITE_PORT_BASE = 5273
27
27
  const PORT_SPAN = 20
28
+ const STUDIO_CLI_DESCRIPTOR_ENV = 'DOMAIN_STUDIO_CLI_DESCRIPTOR'
29
+
30
+ /**
31
+ * Describe this exact CLI invocation for the Studio server. A source/published
32
+ * script needs its entrypoint after node/bun; a Bun-compiled executable is
33
+ * self-contained and therefore has no prefix argument.
34
+ */
35
+ export function encodeStudioCliDescriptor(
36
+ executable = process.execPath,
37
+ entry = process.argv[1],
38
+ ): string {
39
+ const args =
40
+ entry && entry !== executable && !entry.startsWith('/$bunfs') && existsSync(entry)
41
+ ? [realpathSync(entry)]
42
+ : []
43
+ return JSON.stringify({ version: 1, executable, args })
44
+ }
28
45
 
29
46
  /**
30
47
  * Locate the studio package shipped with / alongside the CLI. Anchored to the
@@ -217,6 +234,7 @@ Examples:
217
234
  log.dim(` using ASTRALE_STUDIO_DIR=${studioDir}`)
218
235
  }
219
236
  await ensureBun()
237
+ const cliDescriptor = encodeStudioCliDescriptor()
220
238
 
221
239
  // Default to PROD — serve the prebuilt client. It always renders, is what a
222
240
  // published/global install runs, and avoids dev's heavy source-module graph.
@@ -342,6 +360,7 @@ Examples:
342
360
  VITE_URL: `http://127.0.0.1:${vitePort}`,
343
361
  PORT: String(studioPort),
344
362
  DOMAIN_STUDIO_HOST: '127.0.0.1',
363
+ [STUDIO_CLI_DESCRIPTOR_ENV]: cliDescriptor,
345
364
  ...(opts.harness ? { DOMAIN_STUDIO_HARNESS: opts.harness } : {}),
346
365
  },
347
366
  },
@@ -367,6 +386,7 @@ Examples:
367
386
  DOMAIN_STUDIO_DIST: dist,
368
387
  PORT: String(studioPort),
369
388
  DOMAIN_STUDIO_HOST: '127.0.0.1',
389
+ [STUDIO_CLI_DESCRIPTOR_ENV]: cliDescriptor,
370
390
  ...(opts.harness ? { DOMAIN_STUDIO_HARNESS: opts.harness } : {}),
371
391
  },
372
392
  },
@@ -6,7 +6,7 @@ import type { CommandDefinition } from '../program/index'
6
6
  import { runKernelCommand } from '../connection'
7
7
  import { AstraleError } from '../errors'
8
8
  import { decodeJwtExpiration } from '../lib/local-status'
9
- import { failClosed, log } from '../lib/log'
9
+ import { failInput, log } from '../lib/log'
10
10
  import { output } from '../lib/output'
11
11
 
12
12
  /**
@@ -23,7 +23,12 @@ export type TokenOpts = KernelCommandOpts & {
23
23
 
24
24
  export async function tokenCommand(opts: TokenOpts): Promise<void> {
25
25
  const commandOpts: TokenOpts = opts.for && !opts.as ? { ...opts, as: opts.for } : opts
26
- const ttl = parseTtl(commandOpts.ttl)
26
+ let ttl: number
27
+ try {
28
+ ttl = parseTtl(commandOpts.ttl)
29
+ } catch (error) {
30
+ failInput(error, opts)
31
+ }
27
32
  await runKernelCommand<string>({
28
33
  opts: commandOpts,
29
34
  label: 'Minting delegation token',
@@ -97,10 +102,6 @@ Examples:
97
102
  { flags: '--for <identity>', description: 'Mint the token for this identity (alias of --as)' },
98
103
  ],
99
104
  action: async (opts) => {
100
- try {
101
- await tokenCommand(opts as Parameters<typeof tokenCommand>[0])
102
- } catch (error) {
103
- failClosed(error, opts as TokenOpts)
104
- }
105
+ await tokenCommand(opts as Parameters<typeof tokenCommand>[0])
105
106
  },
106
107
  } satisfies CommandDefinition
@@ -12,7 +12,7 @@ import {
12
12
  type SdkOutdated,
13
13
  } from '../lib/sdk-deps'
14
14
  import { ASTRALE_CLI_SKILL, detectSkill, installSkills, SKILL_INSTALL_HINT } from '../lib/skills'
15
- import { updateAstrale } from '../lib/update'
15
+ import { DEFAULT_UPDATE_CHANNEL, packageManagedUpdateError, updateAstrale } from '../lib/update'
16
16
 
17
17
  type UpdateOpts = RawOutputOpts & {
18
18
  check?: boolean
@@ -104,14 +104,22 @@ async function refreshSdkDeps(check: boolean, assumeYes = false): Promise<boolea
104
104
  /**
105
105
  * Read-only staleness report for tooling — `astrale update --check --json`.
106
106
  * domain-studio polls this on load to drive its "update available" badge. It is
107
- * unified and NON-THROWING: the CLI axis catches the package-managed / no-metadata
108
- * case (reported as `managed`, never stale), and the SDK axis is already
109
- * best-effort. Skills are intentionally absent they ride along with `astrale
110
- * update`, so a stale CLI or SDK is the only signal worth surfacing.
107
+ * unified and NON-THROWING: an explicit package-managed result uses npm release
108
+ * identity, while script-install failures remain script failures in `error`
109
+ * instead of being recategorized. The SDK axis is already best-effort. Skills are
110
+ * intentionally absent — they ride along with `astrale update`, so a stale CLI or
111
+ * SDK is the only signal worth surfacing.
111
112
  */
112
113
  export type StaleReport = {
113
114
  stale: boolean
114
- cli: { stale: boolean; managed: boolean; current?: string; latest?: string; channel?: string }
115
+ cli: {
116
+ stale: boolean
117
+ managed: boolean
118
+ current?: string
119
+ latest?: string
120
+ channel?: string
121
+ error?: string
122
+ }
115
123
  sdk: { stale: boolean; inProject: boolean; outdated: SdkOutdated[] }
116
124
  }
117
125
 
@@ -130,13 +138,23 @@ export async function cliStale(
130
138
  dependencies: CliStaleDependencies = CLI_STALE_DEPENDENCIES,
131
139
  ): Promise<StaleReport['cli']> {
132
140
  const running = pkg.version
141
+ const target = { ...opts, channel: opts.channel ?? DEFAULT_UPDATE_CHANNEL }
133
142
  try {
134
143
  const r = await dependencies.update({
135
144
  check: true,
136
- channel: opts.channel,
137
- version: opts.version,
145
+ channel: target.channel,
146
+ version: target.version,
138
147
  currentVersion: running,
139
148
  })
149
+ if (r.status === 'managed') {
150
+ const latest = await dependencies.fetchPackageVersion(target).catch(() => undefined)
151
+ return {
152
+ stale: latest !== undefined && latest !== running,
153
+ managed: true,
154
+ current: running,
155
+ ...(latest === undefined ? {} : { latest, channel: 'npm' }),
156
+ }
157
+ }
140
158
  if (r.status === 'updated') {
141
159
  return {
142
160
  stale: false,
@@ -153,13 +171,12 @@ export async function cliStale(
153
171
  latest: r.latestVersion,
154
172
  channel: r.channel,
155
173
  }
156
- } catch {
157
- const latest = await dependencies.fetchPackageVersion(opts).catch(() => undefined)
174
+ } catch (error) {
158
175
  return {
159
- stale: latest !== undefined && latest !== running,
160
- managed: true,
176
+ stale: false,
177
+ managed: false,
161
178
  current: running,
162
- ...(latest === undefined ? {} : { latest, channel: 'npm' }),
179
+ error: error instanceof Error ? error.message : String(error),
163
180
  }
164
181
  }
165
182
  }
@@ -167,7 +184,8 @@ export async function cliStale(
167
184
  export async function fetchNpmTargetVersion(
168
185
  opts: Pick<UpdateOpts, 'channel' | 'version'>,
169
186
  ): Promise<string> {
170
- const target = opts.version ?? (opts.channel === 'stable' ? 'latest' : opts.channel) ?? 'latest'
187
+ const channel = opts.channel ?? DEFAULT_UPDATE_CHANNEL
188
+ const target = opts.version ?? (channel === 'stable' ? 'latest' : channel)
171
189
  const response = await fetch(`https://registry.npmjs.org/@astrale-os/cli/${target}`)
172
190
  if (!response.ok) throw new Error(`npm registry HTTP ${response.status}`)
173
191
  const body: unknown = await response.json()
@@ -197,6 +215,7 @@ export default {
197
215
  {
198
216
  flags: '--channel <name>',
199
217
  description: 'Update from a release channel (alpha, beta, rc, canary, stable)',
218
+ default: DEFAULT_UPDATE_CHANNEL,
200
219
  },
201
220
  { flags: '--version <version>', description: 'Update to an exact version tag' },
202
221
  { flags: '--no-skills', description: 'Skip refreshing the astrale agent skills' },
@@ -221,6 +240,7 @@ Behavior:
221
240
  the lockfile, honoring your registry + supply-chain age policy; run "pnpm
222
241
  install" to materialize).
223
242
 
243
+ The default release channel is beta; --channel overrides it for one run.
224
244
  --check is a dry run (binary + SDK deps; exit 10 if anything is available) and
225
245
  never writes. With --json it emits a unified staleness report
226
246
  ({ stale, cli, sdk }) for tooling — non-throwing, skills omitted (they ride
@@ -290,6 +310,10 @@ Examples:
290
310
  log.success(`Updated astrale ${result.previousVersion} -> ${result.currentVersion}`)
291
311
  log.dim(` channel: ${result.channel}`)
292
312
  log.dim(` binary: ${result.bin}`)
313
+ } else if (result?.status === 'managed') {
314
+ const error = packageManagedUpdateError(result.executable)
315
+ if (!opts.yes) throw error
316
+ log.warn(`CLI self-update skipped: ${error.message}`)
293
317
  }
294
318
 
295
319
  // Axis B — agent skills. Keep an existing install current with the CLI.
@@ -42,7 +42,7 @@ import {
42
42
  import { snapshotText, waitForSettledSnapshot } from '../lib/view/snapshot'
43
43
 
44
44
  /**
45
- * `astrale view` — open ONE view in an emulated host shell, authenticated as
45
+ * `astrale view` — open ONE view in a local browser shell, authenticated as
46
46
  * the CLI identity, driveable by agent-browser (default) or a real browser.
47
47
  * Design + protocol details: VIEW_CLI_SPEC.md at the workspace root.
48
48
  */
@@ -89,9 +89,10 @@ export async function resolveSession(
89
89
  }
90
90
  const targetInput =
91
91
  parsed.kind === 'target' ? parsed.path : (opts.target ?? viewOwnerTarget(parsed.path))
92
- const { path: target } = await expandSelfInPath(targetInput, opts)
93
-
94
- const candidates = await withClientSession(opts, (ctx) => resolveViewCandidates(ctx, target))
92
+ const { target, candidates } = await withClientSession(opts, async (context) => {
93
+ const { path: target } = await expandSelfInPath(targetInput, context)
94
+ return { target, candidates: await resolveViewCandidates(context, target) }
95
+ })
95
96
 
96
97
  if (opts.list) {
97
98
  return { candidates }
@@ -484,7 +485,7 @@ async function sessionsCommand(opts: ViewOpts): Promise<void> {
484
485
 
485
486
  export default {
486
487
  name: 'view',
487
- description: 'Open one view in an emulated host shell your agent can drive',
488
+ description: 'Open one view in a local browser shell your agent can drive',
488
489
  arguments: [
489
490
  {
490
491
  name: 'spec',
@@ -524,7 +525,7 @@ export default {
524
525
  afterHelpText: `
525
526
  What it does:
526
527
  Renders ONE view — no GUI, no cookies, no WorkOS. It resolves the view on the
527
- kernel, starts a loopback session server that emulates the shell host (real
528
+ kernel, starts a loopback session server that supplies the shell handshake (real
528
529
  handshake via @astrale-os/shell, token minted from YOUR CLI identity, kernel
529
530
  calls proxied), and opens the page headless in agent-browser. Driving stays
530
531
  agent-browser's job; auth follows --as/--creds/-i like any kernel command.
@@ -1,8 +1,7 @@
1
- import type { Call } from '@astrale-os/kernel-client'
2
- import type { AuthApi } from '@astrale-os/kernel-client/auth'
3
- import type { GraphApi } from '@astrale-os/kernel-client/graph'
4
- import type { ClientSession } from '@astrale-os/kernel-client/session'
5
1
  import type { IssuerId } from '@astrale-os/sdk/auth'
2
+ import type { AuthApi } from '@astrale-os/sdk/auth'
3
+ import type { Call, GraphApi } from '@astrale-os/sdk/client'
4
+ import type { ClientSession } from '@astrale-os/sdk/client/session'
6
5
 
7
6
  /** Existing CLI connection flags accepted by Kernel-touching commands. */
8
7
  export interface ConnectionOptions {
@@ -78,17 +77,17 @@ export function withAdminClientSession<Value>(
78
77
  /** Expand @self through the effective principal returned by authenticated Identity.whoami. */
79
78
  export function expandSelfInPath(
80
79
  path: string,
81
- options: KernelCommandOpts,
80
+ context: ConnectionContext,
82
81
  ): Promise<{ readonly path: string; readonly meta?: SelfExpansionMeta }>
83
82
 
84
83
  /** Expand @self once across one Call path and its CLI-authored string parameters. */
85
84
  export function expandSelfInCall(
86
85
  path: string,
87
- parameters: readonly string[],
88
- options: KernelCommandOpts,
86
+ parameters: Readonly<Record<string, unknown>>,
87
+ context: ConnectionContext,
89
88
  ): Promise<{
90
89
  readonly path: string
91
- readonly parameters: readonly string[]
90
+ readonly parameters: Readonly<Record<string, unknown>>
92
91
  readonly meta?: SelfExpansionMeta
93
92
  }>
94
93
 
@@ -40,7 +40,8 @@ customizes only the Fetch capability passed to Client. `withClientSession` and
40
40
  `withAdminClientSession` are terminal lifecycle boundaries: success, failure, and cancellation all
41
41
  close both the Client Session and its direct source-Auth client.
42
42
 
43
- The command boundary maps typed Client transport phase and delivery evidence without inspecting a
44
- private cause message. It preserves every admitted Kernel reason in machine output; human repair
45
- details are rendered only after the connection owner admits bounded public Function issues or one
46
- exact Query reason variant.
43
+ The command boundary projects typed Client failure identity, transport context, phase, and
44
+ invocation-only delivery evidence without inspecting a private cause message. Unknown native
45
+ failures become one honest unexpected diagnostic; their bounded cause graph is visible only under
46
+ explicit debug output. Every admitted Kernel reason remains available in machine output, while
47
+ human repair details require a bounded public Function issue or exact Query reason variant.
@@ -1,5 +1,5 @@
1
- import type { SessionAuth } from '@astrale-os/kernel-client/session'
2
- import type { Call } from '@astrale-os/kernel-protocol/invocation'
1
+ import type { Call } from '@astrale-os/sdk/client'
2
+ import type { SessionAuth } from '@astrale-os/sdk/client/session'
3
3
 
4
4
  import type { ConnectionContext, ConnectionOptions, ConnectionTarget } from '../api.js'
5
5
 
@@ -111,7 +111,7 @@ export const CLI_AUTH_REGISTRATION_TARGET = defineLaw({
111
111
  export const CLI_SELF_AUTHENTICATED_PRINCIPAL = defineLaw({
112
112
  id: 'CLI-SELF-AUTHENTICATED-PRINCIPAL',
113
113
  statement:
114
- '@self resolves only from authenticated Identity.whoami on the selected target, so delegated carriers use their effective principal and never an unverified JWT subject or stale local registration.',
114
+ '@self resolves inside the command-owned Client Session from authenticated Identity.whoami on the selected target, so resolution and dispatch share one lifecycle and delegated carriers never use an unverified JWT subject or stale local registration.',
115
115
  tests: [
116
116
  {
117
117
  file: '__tests__/self.test.ts',
@@ -183,7 +183,7 @@ export const CLI_CONNECTION_PUBLIC_SEMANTIC_REASON = defineLaw({
183
183
  export const CLI_CONNECTION_TYPED_ERROR_PRESENTATION = defineLaw({
184
184
  id: 'CLI-CONNECTION-TYPED-ERROR-PRESENTATION',
185
185
  statement:
186
- 'The command boundary maps typed Client transport phase and delivery evidence without parsing a private cause, preserves the admitted Kernel reason in machine output, and renders only bounded public Function issues or one exact Query repair variant for humans.',
186
+ 'The command boundary maps typed Client failure identity, transport context, phase, and invocation-only delivery evidence without parsing a private cause; acquisition never receives retry advice, unknown native failures have one non-blank unexpected diagnostic, and raw causes appear only under explicit debug output.',
187
187
  tests: [
188
188
  {
189
189
  file: '__tests__/errors.test.ts',
@@ -197,5 +197,9 @@ export const CLI_CONNECTION_TYPED_ERROR_PRESENTATION = defineLaw({
197
197
  file: '__tests__/reasons.test.ts',
198
198
  id: 'TEST-CLI-CONNECTION-ADMITS-BOUNDED-REASONS',
199
199
  },
200
+ {
201
+ file: '__tests__/failure-safety.test.ts',
202
+ id: 'TEST-CLI-CONNECTION-FAILURE-SAFETY',
203
+ },
200
204
  ],
201
205
  })
@@ -8,6 +8,7 @@ export default defineLayout({
8
8
  'command.ts',
9
9
  'credential.ts',
10
10
  'errors.ts',
11
+ 'failure/',
11
12
  'exchange.ts',
12
13
  'index.ts',
13
14
  'reasons.ts',