@astrale-os/cli 1.0.0-beta.0 → 1.0.0-beta.10

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 (322) hide show
  1. package/README.md +23 -12
  2. package/dist/astrale.js +51494 -56307
  3. package/dist/public/connect-core.js +2028 -26846
  4. package/dist/public/keys/index.js +1755 -40694
  5. package/dist/public/paths/index.js +859 -39518
  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 +6 -2
  28. package/dist/types/lib/failure-debug.d.ts +1 -0
  29. package/dist/types/lib/idp.d.ts +7 -0
  30. package/dist/types/lib/instance-target.d.ts +1 -1
  31. package/dist/types/lib/instance.d.ts +10 -2
  32. package/dist/types/lib/log.d.ts +5 -3
  33. package/dist/types/lib/meta.d.ts +2 -2
  34. package/dist/types/lib/proc.d.ts +43 -0
  35. package/dist/types/lib/self.d.ts +9 -0
  36. package/dist/types/lib/update.d.ts +131 -0
  37. package/package.json +8 -10
  38. package/src/__tests__/fixtures/publication.ts +20 -0
  39. package/src/admin/__tests__/binding.test.ts +31 -0
  40. package/src/admin/__tests__/fixture.ts +101 -0
  41. package/src/admin/binding.ts +98 -0
  42. package/src/admin/catalog/.spec/api.d.ts +2 -2
  43. package/src/admin/catalog/__tests__/client.test.ts +20 -49
  44. package/src/admin/catalog/client.ts +36 -32
  45. package/src/admin/catalog/model.ts +3 -4
  46. package/src/admin/graph/.spec/api.d.ts +4 -10
  47. package/src/admin/graph/nodes.ts +1 -1
  48. package/src/admin/instance/.spec/api.d.ts +2 -2
  49. package/src/admin/instance/__tests__/client.test.ts +40 -163
  50. package/src/admin/instance/client.ts +35 -137
  51. package/src/admin/instance/index.ts +1 -2
  52. package/src/admin/instance/model.ts +11 -20
  53. package/src/commands/__tests__/admin-instance.test.ts +11 -8
  54. package/src/commands/__tests__/auth-login.test.ts +54 -1
  55. package/src/commands/__tests__/call-describe.test.ts +46 -33
  56. package/src/commands/__tests__/call.test.ts +5 -1
  57. package/src/commands/__tests__/domain-install-operation.test.ts +12 -7
  58. package/src/commands/__tests__/domain-install-owned.test.ts +6 -2
  59. package/src/commands/__tests__/domain-list.test.ts +63 -4
  60. package/src/commands/__tests__/install-identity-override.test.ts +19 -19
  61. package/src/commands/__tests__/instance-list-rows.test.ts +1 -1
  62. package/src/commands/__tests__/instance-status.test.ts +139 -0
  63. package/src/commands/__tests__/read-commands.test.ts +35 -10
  64. package/src/commands/__tests__/studio-descriptor.test.ts +22 -0
  65. package/src/commands/__tests__/update.test.ts +95 -0
  66. package/src/commands/call-describe.ts +60 -68
  67. package/src/commands/call.ts +43 -56
  68. package/src/commands/domain/install.ts +13 -17
  69. package/src/commands/domain/list.ts +18 -13
  70. package/src/commands/domain/publish.ts +14 -11
  71. package/src/commands/domain/uninstall.ts +2 -2
  72. package/src/commands/get.ts +14 -15
  73. package/src/commands/identity/__tests__/register.test.ts +3 -3
  74. package/src/commands/identity/register.ts +5 -4
  75. package/src/commands/instance/create.ts +8 -16
  76. package/src/commands/instance/delete.ts +12 -9
  77. package/src/commands/instance/list.ts +2 -2
  78. package/src/commands/instance/status.ts +66 -20
  79. package/src/commands/instance/use.ts +16 -12
  80. package/src/commands/introspect.ts +9 -16
  81. package/src/commands/logs.ts +24 -25
  82. package/src/commands/mutate.ts +6 -5
  83. package/src/commands/query.ts +27 -30
  84. package/src/commands/studio.ts +20 -0
  85. package/src/commands/token.ts +8 -7
  86. package/src/commands/update.ts +68 -22
  87. package/src/commands/view.ts +7 -6
  88. package/src/connection/.spec/api.d.ts +7 -8
  89. package/src/connection/.spec/architecture.md +5 -4
  90. package/src/connection/.spec/flows/session.ts +2 -2
  91. package/src/connection/.spec/laws/connection.ts +6 -2
  92. package/src/connection/.spec/layout.ts +1 -0
  93. package/src/connection/__tests__/credential.test.ts +20 -1
  94. package/src/connection/__tests__/errors.test.ts +43 -32
  95. package/src/connection/__tests__/exchange.test.ts +36 -6
  96. package/src/connection/__tests__/failure-fixtures.ts +39 -0
  97. package/src/connection/__tests__/failure-safety.test.ts +75 -0
  98. package/src/connection/__tests__/self.test.ts +31 -11
  99. package/src/connection/__tests__/session.test.ts +3 -3
  100. package/src/connection/__tests__/target.test.ts +1 -0
  101. package/src/connection/auth.ts +13 -0
  102. package/src/connection/call.ts +1 -1
  103. package/src/connection/credential.ts +2 -2
  104. package/src/connection/errors.ts +1 -355
  105. package/src/connection/exchange.ts +52 -27
  106. package/src/connection/failure/classify.ts +110 -0
  107. package/src/connection/failure/index.ts +18 -0
  108. package/src/connection/failure/model.ts +28 -0
  109. package/src/connection/failure/render.ts +116 -0
  110. package/src/connection/reasons.ts +16 -0
  111. package/src/connection/self.ts +39 -21
  112. package/src/connection/session.ts +19 -8
  113. package/src/errors.ts +3 -2
  114. package/src/graph/.spec/api.d.ts +12 -5
  115. package/src/graph/.spec/layout.ts +9 -1
  116. package/src/graph/__tests__/mutation.test.ts +2 -2
  117. package/src/graph/__tests__/query.test.ts +25 -6
  118. package/src/graph/class.ts +30 -0
  119. package/src/graph/index.ts +1 -0
  120. package/src/graph/query.ts +21 -32
  121. package/src/identity/.spec/api.d.ts +2 -2
  122. package/src/identity/__tests__/registration.test.ts +1 -1
  123. package/src/identity/registration.ts +3 -3
  124. package/src/keys/__tests__/keys.test.ts +4 -0
  125. package/src/keys/credential.ts +1 -0
  126. package/src/lib/__tests__/admin-target.test.ts +12 -0
  127. package/src/lib/__tests__/command-dx.test.ts +1 -1
  128. package/src/lib/__tests__/domain-publication.test.ts +138 -0
  129. package/src/lib/__tests__/idp-session.test.ts +22 -0
  130. package/src/lib/__tests__/idp.test.ts +36 -4
  131. package/src/lib/__tests__/instance-candidates.test.ts +1 -3
  132. package/src/lib/__tests__/instance-target.test.ts +7 -39
  133. package/src/lib/__tests__/instance.test.ts +6 -0
  134. package/src/lib/__tests__/log-errors.test.ts +64 -0
  135. package/src/lib/__tests__/studio-server-deps.test.ts +53 -16
  136. package/src/lib/__tests__/update.test.ts +113 -8
  137. package/src/lib/__tests__/view-open-intent.test.ts +0 -2
  138. package/src/lib/__tests__/view-server.test.ts +1 -1
  139. package/src/lib/__tests__/view-session.test.ts +1 -1
  140. package/src/lib/admin-instance.ts +14 -8
  141. package/src/lib/admin-target.ts +21 -2
  142. package/src/lib/command-dx.ts +9 -9
  143. package/src/lib/domain-publication.ts +104 -0
  144. package/src/lib/failure-debug.ts +26 -0
  145. package/src/lib/idp.ts +39 -4
  146. package/src/lib/instance-candidates.ts +2 -2
  147. package/src/lib/instance-target.ts +3 -14
  148. package/src/lib/instance.ts +22 -12
  149. package/src/lib/log.ts +16 -9
  150. package/src/lib/login-flow.ts +13 -3
  151. package/src/lib/meta.ts +2 -2
  152. package/src/lib/provision-instance.ts +34 -57
  153. package/src/lib/update.ts +124 -30
  154. package/src/lib/validation.ts +2 -2
  155. package/src/lib/view/resolve.ts +1 -1
  156. package/src/program/__tests__/program.test.ts +20 -4
  157. package/src/program/build.ts +2 -2
  158. package/src/setup/__tests__/instance-step.test.ts +27 -10
  159. package/src/setup/steps/instance.ts +22 -15
  160. package/studio/client/dist/assets/{elk-api-D2xgMJvi.js → elk-api-ByzoDZWH.js} +1 -1
  161. package/studio/client/dist/assets/index-B0RCgUOT.js +8 -0
  162. package/studio/client/dist/assets/index-BiGR8Oo9.css +1 -0
  163. package/studio/client/dist/assets/index-N8J8EKlB.js +81 -0
  164. package/studio/client/dist/index.html +2 -2
  165. package/studio/package.json +5 -10
  166. package/studio/server/agent/ask.test.ts +1 -1
  167. package/studio/server/agent/bridge/grant.test.ts +1 -1
  168. package/studio/server/agent/bridge/routes.test.ts +1 -1
  169. package/studio/server/agent/bridge/stdio.ts +8 -1
  170. package/studio/server/agent/conversation.test.ts +10 -5
  171. package/studio/server/agent/conversation.ts +56 -8
  172. package/studio/server/agent/harness/claude/adapter.test.ts +15 -5
  173. package/studio/server/agent/harness/codex/loadout.ts +18 -21
  174. package/studio/server/agent/harness/gateway/config.ts +20 -18
  175. package/studio/server/agent/harness/selection.ts +9 -1
  176. package/studio/server/agent/prompts/anchors.test.ts +32 -36
  177. package/studio/server/agent/prompts/anchors.ts +20 -49
  178. package/studio/server/agent/prompts/system.test.ts +3 -2
  179. package/studio/server/agent/prompts/system.ts +6 -5
  180. package/studio/server/agent/prompts/turn.ts +13 -4
  181. package/studio/server/agent/routes.test.ts +1 -1
  182. package/studio/server/agent/run/completion.ts +2 -2
  183. package/studio/server/agent/run/coordinator.test.ts +1 -1
  184. package/studio/server/agent/run/preparation.ts +6 -5
  185. package/studio/server/agent/run/transcript.test.ts +35 -1
  186. package/studio/server/agent/run/transcript.ts +169 -3
  187. package/studio/server/agent/run/usage.test.ts +24 -0
  188. package/studio/server/agent/run/usage.ts +26 -1
  189. package/studio/server/api/canvas.ts +43 -0
  190. package/studio/server/api/comments.ts +85 -0
  191. package/studio/server/api/context.ts +61 -0
  192. package/studio/server/api/deployment.ts +39 -0
  193. package/studio/server/api/documents.ts +55 -0
  194. package/studio/server/api/domain.ts +59 -0
  195. package/studio/server/api/http.ts +45 -0
  196. package/studio/server/api/project.ts +57 -0
  197. package/studio/server/api/schema.ts +12 -0
  198. package/studio/server/api/views.ts +57 -0
  199. package/studio/server/api/workspace.ts +60 -0
  200. package/studio/server/api-agent-loadout.test.ts +1 -1
  201. package/studio/server/api.test.ts +147 -0
  202. package/studio/server/api.ts +20 -422
  203. package/studio/server/cache.test.ts +122 -0
  204. package/studio/server/cache.ts +162 -11
  205. package/studio/server/cli-consumers.test.ts +494 -0
  206. package/studio/server/cli.test.ts +88 -0
  207. package/studio/server/cli.ts +240 -0
  208. package/studio/server/client-package.ts +25 -1
  209. package/studio/server/domain.test.ts +50 -40
  210. package/studio/server/domain.ts +83 -52
  211. package/studio/server/environment/dotenv-preview.test.ts +39 -0
  212. package/studio/server/environment/dotenv-preview.ts +27 -0
  213. package/studio/server/environment/files.test.ts +53 -0
  214. package/studio/server/{state/env.ts → environment/files.ts} +7 -48
  215. package/studio/server/{state → handoff}/copy.ts +21 -6
  216. package/studio/server/handoff/service.test.ts +22 -0
  217. package/studio/server/{state/handoff.ts → handoff/service.ts} +21 -14
  218. package/studio/server/index.ts +1 -1
  219. package/studio/server/instances/active.ts +72 -0
  220. package/studio/server/instances/deploy-record.test.ts +31 -0
  221. package/studio/server/instances/deploy-record.ts +37 -0
  222. package/studio/server/instances/deploy.ts +56 -0
  223. package/studio/server/{state/instance.test.ts → instances/probe.test.ts} +25 -21
  224. package/studio/server/instances/probe.ts +67 -0
  225. package/studio/server/instances/status.test.ts +12 -0
  226. package/studio/server/instances/status.ts +49 -0
  227. package/studio/server/introspect/anatomy/client-tree.ts +57 -0
  228. package/studio/server/introspect/anatomy/env-fields.ts +66 -0
  229. package/studio/server/introspect/anatomy/schema-definition.ts +53 -0
  230. package/studio/server/introspect/anatomy/source.ts +181 -0
  231. package/studio/server/introspect/anatomy/views/routes.ts +114 -0
  232. package/studio/server/introspect/anatomy/views.ts +53 -0
  233. package/studio/server/introspect/anatomy-extras.test.ts +106 -35
  234. package/studio/server/introspect/anatomy-extras.ts +7 -726
  235. package/studio/server/introspect/anatomy.test.ts +22 -14
  236. package/studio/server/introspect/anatomy.ts +52 -28
  237. package/studio/server/introspect/bundle.ts +15 -9
  238. package/studio/server/introspect/canonical-schema.test.ts +93 -309
  239. package/studio/server/introspect/canonical-schema.ts +257 -425
  240. package/studio/server/introspect/config-preview.test.ts +32 -0
  241. package/studio/server/introspect/config-preview.ts +119 -0
  242. package/studio/server/introspect/core-extractor.ts +18 -127
  243. package/studio/server/introspect/core.ts +1 -2
  244. package/studio/server/introspect/diff.test.ts +18 -18
  245. package/studio/server/introspect/diff.ts +44 -90
  246. package/studio/server/introspect/extractor.ts +23 -116
  247. package/studio/server/introspect/hash.ts +5 -2
  248. package/studio/server/introspect/overlay-tsmorph.test.ts +119 -240
  249. package/studio/server/introspect/overlay-tsmorph.ts +7 -1305
  250. package/studio/server/introspect/overlay.test.ts +26 -54
  251. package/studio/server/introspect/overlay.ts +10 -37
  252. package/studio/server/introspect/revision.test.ts +54 -0
  253. package/studio/server/introspect/revision.ts +49 -0
  254. package/studio/server/introspect/runtime.test.ts +83 -143
  255. package/studio/server/introspect/runtime.ts +40 -11
  256. package/studio/server/introspect/schema-ir-json.test.ts +70 -0
  257. package/studio/server/introspect/schema-ir-json.ts +151 -0
  258. package/studio/server/introspect/schema-refs.test.ts +43 -88
  259. package/studio/server/introspect/schema-refs.ts +14 -49
  260. package/studio/server/introspect/source-overlay/annotations.ts +14 -0
  261. package/studio/server/introspect/source-overlay/handlers.ts +161 -0
  262. package/studio/server/introspect/source-overlay/kernel-calls.ts +46 -0
  263. package/studio/server/introspect/source-overlay/project.ts +248 -0
  264. package/studio/server/introspect/source-overlay/spans.ts +330 -0
  265. package/studio/server/json.ts +46 -0
  266. package/studio/server/lifecycle.ts +5 -1
  267. package/studio/server/sse.test.ts +26 -0
  268. package/studio/server/sse.ts +4 -1
  269. package/studio/server/state/baseline.test.ts +223 -7
  270. package/studio/server/state/baseline.ts +148 -34
  271. package/studio/server/state/comments.test.ts +66 -1
  272. package/studio/server/state/comments.ts +173 -10
  273. package/studio/server/state/context.ts +34 -2
  274. package/studio/server/state/documents.ts +42 -1
  275. package/studio/server/state/integrations.ts +27 -1
  276. package/studio/server/state/layout.test.ts +34 -0
  277. package/studio/server/state/layout.ts +44 -17
  278. package/studio/server/state/settings.ts +29 -22
  279. package/studio/server/state/store.test.ts +122 -0
  280. package/studio/server/state/store.ts +66 -17
  281. package/studio/server/state/visibility.ts +22 -11
  282. package/studio/server/views/model.test.ts +57 -0
  283. package/studio/server/views/model.ts +66 -0
  284. package/studio/server/views/runtime.ts +40 -0
  285. package/studio/server/views/selection-repository.test.ts +31 -0
  286. package/studio/server/views/selection-repository.ts +60 -0
  287. package/studio/server/views/session.test.ts +73 -0
  288. package/studio/server/views/session.ts +166 -0
  289. package/studio/server/views/target.test.ts +78 -0
  290. package/studio/server/views/target.ts +222 -0
  291. package/studio/server/watch.test.ts +11 -11
  292. package/studio/server/watch.ts +9 -5
  293. package/studio/server/workspace/catalog.test.ts +17 -0
  294. package/studio/server/workspace/catalog.ts +43 -0
  295. package/studio/server/{state → workspace}/create.test.ts +1 -1
  296. package/studio/server/{state → workspace}/create.ts +1 -1
  297. package/studio/server/{state → workspace}/git.ts +1 -1
  298. package/studio/server/workspace/updates.ts +83 -0
  299. package/studio/server/workspace-state.ts +1 -1
  300. package/studio/server/workspace-watch.ts +2 -2
  301. package/studio/shared/contracts/README.md +16 -0
  302. package/studio/shared/contracts/agent.ts +270 -0
  303. package/studio/shared/contracts/runtime.ts +50 -0
  304. package/studio/shared/contracts/schema.ts +393 -0
  305. package/studio/shared/contracts/surface.test.ts +317 -0
  306. package/studio/shared/contracts/workspace.ts +265 -0
  307. package/studio/shared/layout.test.ts +116 -0
  308. package/studio/shared/schema/identity.test.ts +34 -0
  309. package/studio/shared/schema/identity.ts +68 -0
  310. package/studio/shared/types.ts +11 -1099
  311. package/studio/tsconfig.json +1 -1
  312. package/viewer/dist/main.js +40 -61
  313. package/.check-workspace.cjs +0 -40
  314. package/src/commands/__tests__/instance-create-hosts.test.ts +0 -29
  315. package/studio/client/dist/assets/index-BMdnsIJA.css +0 -1
  316. package/studio/client/dist/assets/index-D-vRV8w7.js +0 -8
  317. package/studio/client/dist/assets/index-LGSWRrk8.js +0 -81
  318. package/studio/server/state/catalog.ts +0 -117
  319. package/studio/server/state/instance.ts +0 -280
  320. package/studio/server/state/updates.ts +0 -63
  321. package/studio/server/state/views.test.ts +0 -286
  322. package/studio/server/state/views.ts +0 -535
@@ -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,49 +104,89 @@ 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
 
118
- async function cliStale(opts: UpdateOpts): Promise<StaleReport['cli']> {
126
+ type CliStaleDependencies = {
127
+ update: typeof updateAstrale
128
+ fetchPackageVersion: (opts: Pick<UpdateOpts, 'channel' | 'version'>) => Promise<string>
129
+ }
130
+
131
+ const CLI_STALE_DEPENDENCIES: CliStaleDependencies = {
132
+ update: updateAstrale,
133
+ fetchPackageVersion: fetchNpmTargetVersion,
134
+ }
135
+
136
+ export async function cliStale(
137
+ opts: Pick<UpdateOpts, 'channel' | 'version'>,
138
+ dependencies: CliStaleDependencies = CLI_STALE_DEPENDENCIES,
139
+ ): Promise<StaleReport['cli']> {
119
140
  const running = pkg.version
120
- const latest = await fetchNpmLatestVersion().catch(() => undefined)
141
+ const target = { ...opts, channel: opts.channel ?? DEFAULT_UPDATE_CHANNEL }
121
142
  try {
122
- const r = await updateAstrale({
143
+ const r = await dependencies.update({
123
144
  check: true,
124
- channel: opts.channel,
125
- version: opts.version,
145
+ channel: target.channel,
146
+ version: target.version,
126
147
  currentVersion: running,
127
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
+ }
128
158
  if (r.status === 'updated') {
129
- return { stale: false, managed: false, current: running, latest: latest ?? running }
159
+ return {
160
+ stale: false,
161
+ managed: false,
162
+ current: r.currentVersion,
163
+ latest: r.currentVersion,
164
+ channel: r.channel,
165
+ }
130
166
  }
131
167
  return {
132
- stale: latest !== undefined ? latest !== running : r.status === 'available',
168
+ stale: r.status === 'available',
133
169
  managed: false,
134
- current: running,
135
- latest: latest ?? r.latestVersion,
136
- channel: latest !== undefined ? 'npm' : r.channel,
170
+ current: r.currentVersion,
171
+ latest: r.latestVersion,
172
+ channel: r.channel,
137
173
  }
138
- } catch {
174
+ } catch (error) {
139
175
  return {
140
- stale: latest !== undefined && latest !== running,
141
- managed: true,
176
+ stale: false,
177
+ managed: false,
142
178
  current: running,
143
- ...(latest === undefined ? {} : { latest, channel: 'npm' }),
179
+ error: error instanceof Error ? error.message : String(error),
144
180
  }
145
181
  }
146
182
  }
147
183
 
148
- async function fetchNpmLatestVersion(): Promise<string> {
149
- const response = await fetch('https://registry.npmjs.org/@astrale-os/cli/latest')
184
+ export async function fetchNpmTargetVersion(
185
+ opts: Pick<UpdateOpts, 'channel' | 'version'>,
186
+ ): Promise<string> {
187
+ const channel = opts.channel ?? DEFAULT_UPDATE_CHANNEL
188
+ const target = opts.version ?? (channel === 'stable' ? 'latest' : channel)
189
+ const response = await fetch(`https://registry.npmjs.org/@astrale-os/cli/${target}`)
150
190
  if (!response.ok) throw new Error(`npm registry HTTP ${response.status}`)
151
191
  const body: unknown = await response.json()
152
192
  if (
@@ -175,6 +215,7 @@ export default {
175
215
  {
176
216
  flags: '--channel <name>',
177
217
  description: 'Update from a release channel (alpha, beta, rc, canary, stable)',
218
+ default: DEFAULT_UPDATE_CHANNEL,
178
219
  },
179
220
  { flags: '--version <version>', description: 'Update to an exact version tag' },
180
221
  { flags: '--no-skills', description: 'Skip refreshing the astrale agent skills' },
@@ -199,6 +240,7 @@ Behavior:
199
240
  the lockfile, honoring your registry + supply-chain age policy; run "pnpm
200
241
  install" to materialize).
201
242
 
243
+ The default release channel is beta; --channel overrides it for one run.
202
244
  --check is a dry run (binary + SDK deps; exit 10 if anything is available) and
203
245
  never writes. With --json it emits a unified staleness report
204
246
  ({ stale, cli, sdk }) for tooling — non-throwing, skills omitted (they ride
@@ -268,6 +310,10 @@ Examples:
268
310
  log.success(`Updated astrale ${result.previousVersion} -> ${result.currentVersion}`)
269
311
  log.dim(` channel: ${result.channel}`)
270
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}`)
271
317
  }
272
318
 
273
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',
@@ -1,4 +1,4 @@
1
- import type { SessionAuth } from '@astrale-os/kernel-client/session'
1
+ import type { SessionAuth } from '@astrale-os/sdk/client/session'
2
2
 
3
3
  import { issuer, type IssuerId } from '@astrale-os/sdk/auth'
4
4
  import { Path } from '@astrale-os/sdk/graph/path'
@@ -6,6 +6,7 @@ import { describe, expect, test } from 'bun:test'
6
6
 
7
7
  import type { AstraleConfig } from '../../lib/config'
8
8
 
9
+ import { bindCredentialIdentity } from '../auth'
9
10
  import { createCliCredential, createConnectionCredential } from '../credential'
10
11
 
11
12
  const SOURCE = issuer.accept('https://kernel.example')
@@ -20,6 +21,24 @@ const config: AstraleConfig = {
20
21
  }
21
22
 
22
23
  describe('connection credential', () => {
24
+ test('pins the bookmark identity while leaving explicit credentials unnamed', async () => {
25
+ const target = {
26
+ url: `${SOURCE}/invoke`,
27
+ kernelIssuer: SOURCE,
28
+ defaultIdentity: 'bookmark-owner',
29
+ }
30
+
31
+ await expect(bindCredentialIdentity({}, target)).resolves.toMatchObject({
32
+ as: 'bookmark-owner',
33
+ })
34
+ await expect(bindCredentialIdentity({ as: 'explicit-owner' }, target)).resolves.toEqual({
35
+ as: 'explicit-owner',
36
+ })
37
+ await expect(bindCredentialIdentity({ creds: 'opaque' }, target)).resolves.toEqual({
38
+ creds: 'opaque',
39
+ })
40
+ })
41
+
23
42
  /** @evidence TEST-CLI-CONNECTION-RESOLVES-SOURCE-AUTH-BEFORE-ROUTING */
24
43
  test('resolves source authority without destination knowledge', async () => {
25
44
  const audiences: IssuerId[] = []
@@ -1,10 +1,16 @@
1
- import { ResponseError, TransportError } from '@astrale-os/kernel-client'
1
+ import { ResponseError } from '@astrale-os/sdk/client'
2
+ import { Path } from '@astrale-os/sdk/graph/path'
2
3
  import { describe, expect, test } from 'bun:test'
3
4
 
4
5
  import { formatKernelError, functionInputIssues, schemaUpgradeHint } from '../errors'
6
+ import { transportFailure } from './failure-fixtures'
5
7
 
6
8
  const CONFLICT = 4001
7
9
  const VALIDATION = 1003
10
+ const TEST_INVOCATION = {
11
+ source: 'https://kernel.test',
12
+ id: 'connection-errors',
13
+ } as ConstructorParameters<typeof ResponseError>[2]
8
14
 
9
15
  describe('formatKernelError', () => {
10
16
  /** @evidence TEST-CLI-CONNECTION-MAPS-TYPED-TRANSPORT */
@@ -15,24 +21,28 @@ describe('formatKernelError', () => {
15
21
  writes.push(typeof chunk === 'string' ? chunk : new TextDecoder().decode(chunk))
16
22
  return true
17
23
  }) as typeof process.stderr.write
18
- const error = new TransportError('Publication discovery request failed.', {
19
- cause: Object.assign(new Error('connect ECONNREFUSED'), { code: 'ECONNREFUSED' }),
20
- phase: 'connect',
21
- delivery: 'unknown',
22
- }) as TransportError & { url?: string }
23
- error.url = 'https://localhost:8443/kernel/host'
24
+ const error = Object.assign(
25
+ transportFailure('Publication discovery request failed.', 'unknown', {
26
+ kind: 'acquisition',
27
+ resource: 'publication',
28
+ }),
29
+ {
30
+ url: 'https://localhost:8443/kernel/host',
31
+ cause: Object.assign(new Error('connect ECONNREFUSED'), { code: 'ECONNREFUSED' }),
32
+ },
33
+ )
24
34
  try {
25
- await formatKernelError(error, true)
35
+ await formatKernelError(error, true, 'https://localhost:8443/kernel/host')
26
36
  } finally {
27
37
  process.stderr.write = original
28
38
  }
29
39
 
30
40
  expect(JSON.parse(writes[0]!)).toMatchObject({
31
- error: 'CONNECTION_ERROR',
41
+ error: 'TRANSPORT_ERROR',
32
42
  message: 'Publication discovery request failed.',
33
43
  url: 'https://localhost:8443/kernel/host',
34
- phase: 'connect',
35
- delivery: 'unknown',
44
+ phase: 'unknown',
45
+ transport: { kind: 'acquisition', resource: 'publication' },
36
46
  })
37
47
  expect(writes[0]).not.toContain('ECONNREFUSED')
38
48
  })
@@ -46,9 +56,8 @@ describe('formatKernelError', () => {
46
56
  }) as typeof process.stderr.write
47
57
  try {
48
58
  await formatKernelError(
49
- new TransportError('Request timed out.', {
50
- cause: new Error('timeout'),
51
- phase: 'timeout',
59
+ transportFailure('Request timed out.', 'timeout', {
60
+ kind: 'invocation',
52
61
  delivery: 'unknown',
53
62
  }),
54
63
  true,
@@ -70,7 +79,7 @@ describe('formatKernelError', () => {
70
79
  expect(JSON.parse(writes[0]!)).toMatchObject({
71
80
  error: 'TIMEOUT',
72
81
  phase: 'timeout',
73
- delivery: 'unknown',
82
+ transport: { kind: 'invocation', delivery: 'unknown' },
74
83
  operation: '4a4c9a18-50f6-4d84-a7b7-2d83e3e45dc8',
75
84
  retry:
76
85
  'astrale domain install https://crm.test --direct --operation 4a4c9a18-50f6-4d84-a7b7-2d83e3e45dc8',
@@ -87,7 +96,7 @@ describe('formatKernelError', () => {
87
96
  }) as typeof process.stderr.write
88
97
  try {
89
98
  await formatKernelError(
90
- new ResponseError(CONFLICT, 'Schema change requires migration.', {
99
+ new ResponseError(CONFLICT, 'Schema change requires migration.', TEST_INVOCATION, {
91
100
  code: 'DATA_MIGRATION_REQUIRED',
92
101
  details: {
93
102
  requirements: [
@@ -138,7 +147,7 @@ describe('formatKernelError', () => {
138
147
  }) as typeof process.stderr.write
139
148
  try {
140
149
  await formatKernelError(
141
- new ResponseError(CONFLICT, 'Schema change requires migration.', {
150
+ new ResponseError(CONFLICT, 'Schema change requires migration.', TEST_INVOCATION, {
142
151
  code: 'DATA_MIGRATION_REQUIRED',
143
152
  details: {
144
153
  requirements: [
@@ -193,7 +202,7 @@ describe('formatKernelError', () => {
193
202
  console.log = (...values: unknown[]) => hints.push(values.map(String).join(' '))
194
203
  try {
195
204
  await formatKernelError(
196
- new ResponseError(CONFLICT, 'Schema change requires migration.', {
205
+ new ResponseError(CONFLICT, 'Schema change requires migration.', TEST_INVOCATION, {
197
206
  code: 'DATA_MIGRATION_REQUIRED',
198
207
  details: {
199
208
  requirements: [
@@ -225,7 +234,7 @@ describe('formatKernelError', () => {
225
234
  )
226
235
  })
227
236
 
228
- test('maps SDK class names to stable CLI error codes', async () => {
237
+ test('maps SDK error identities to stable CLI error codes', async () => {
229
238
  const writes: string[] = []
230
239
  const original = process.stderr.write
231
240
  process.stderr.write = ((chunk: string | Uint8Array) => {
@@ -233,15 +242,17 @@ describe('formatKernelError', () => {
233
242
  return true
234
243
  }) as typeof process.stderr.write
235
244
  try {
236
- const pathError = new Error('Path must have an Id or Domain anchor.')
237
- pathError.name = 'PathError'
238
- await formatKernelError(pathError, true)
245
+ try {
246
+ Path.parse('not-a-path')
247
+ } catch (error) {
248
+ await formatKernelError(error, true)
249
+ }
239
250
  } finally {
240
251
  process.stderr.write = original
241
252
  }
242
253
  expect(JSON.parse(writes[0]!)).toEqual({
243
254
  error: 'PATH_INVALID',
244
- message: 'Path must have an Id or Domain anchor.',
255
+ message: expect.any(String),
245
256
  })
246
257
  })
247
258
 
@@ -254,7 +265,7 @@ describe('formatKernelError', () => {
254
265
  console.log = (...values: unknown[]) => lines.push(values.join(' '))
255
266
  try {
256
267
  await formatKernelError(
257
- new ResponseError(VALIDATION, 'Function input is invalid.', {
268
+ new ResponseError(VALIDATION, 'Function input is invalid.', TEST_INVOCATION, {
258
269
  code: 'FUNCTION_INPUT_INVALID',
259
270
  details: {
260
271
  issues: [
@@ -279,7 +290,7 @@ describe('formatKernelError', () => {
279
290
  false,
280
291
  )
281
292
  await formatKernelError(
282
- new ResponseError(VALIDATION, 'Query input is invalid.', {
293
+ new ResponseError(VALIDATION, 'Query input is invalid.', TEST_INVOCATION, {
283
294
  code: 'QUERY_INPUT_INVALID',
284
295
  details: {
285
296
  phase: 'plan',
@@ -310,7 +321,7 @@ describe('formatKernelError', () => {
310
321
  }) as typeof process.stderr.write
311
322
  try {
312
323
  await formatKernelError(
313
- new ResponseError(5001, 'Schema operation is not supported.', {
324
+ new ResponseError(5001, 'Schema operation is not supported.', TEST_INVOCATION, {
314
325
  code: 'SCHEMA_UPGRADE_INCOMPATIBLE',
315
326
  details: {
316
327
  phase: 'upgrade',
@@ -358,7 +369,7 @@ describe('formatKernelError', () => {
358
369
  console.log = (...values: unknown[]) => details.push(values.map(String).join(' '))
359
370
  try {
360
371
  await formatKernelError(
361
- new ResponseError(5001, 'Schema operation is not supported.', {
372
+ new ResponseError(5001, 'Schema operation is not supported.', TEST_INVOCATION, {
362
373
  code: 'SCHEMA_UPGRADE_INCOMPATIBLE',
363
374
  details: {
364
375
  phase: 'upgrade',
@@ -391,7 +402,7 @@ describe('formatKernelError', () => {
391
402
  }) as typeof process.stderr.write
392
403
  try {
393
404
  await formatKernelError(
394
- new ResponseError(1003, 'Function input is invalid.', {
405
+ new ResponseError(1003, 'Function input is invalid.', TEST_INVOCATION, {
395
406
  code: 'SCHEMA_DOMAIN_ADDRESS_NOT_PUBLIC',
396
407
  details: { phase: 'publication', requiredScope: 'public' },
397
408
  }),
@@ -421,7 +432,7 @@ describe('formatKernelError', () => {
421
432
  console.log = (...values: unknown[]) => hints.push(values.map(String).join(' '))
422
433
  try {
423
434
  await formatKernelError(
424
- new ResponseError(1003, 'Function input is invalid.', {
435
+ new ResponseError(1003, 'Function input is invalid.', TEST_INVOCATION, {
425
436
  code: 'SCHEMA_DOMAIN_ADDRESS_NOT_PUBLIC',
426
437
  details: { phase: 'publication', requiredScope: 'public' },
427
438
  }),
@@ -448,7 +459,7 @@ describe('formatKernelError', () => {
448
459
  }) as typeof process.stderr.write
449
460
  try {
450
461
  await formatKernelError(
451
- new ResponseError(1003, 'Function input is invalid.', {
462
+ new ResponseError(1003, 'Function input is invalid.', TEST_INVOCATION, {
452
463
  code: 'FUNCTION_INPUT_INVALID',
453
464
  details: {
454
465
  issues: [
@@ -495,7 +506,7 @@ describe('formatKernelError', () => {
495
506
  console.log = (...values: unknown[]) => details.push(values.map(String).join(' '))
496
507
  try {
497
508
  await formatKernelError(
498
- new ResponseError(1003, 'Function input is invalid.', {
509
+ new ResponseError(1003, 'Function input is invalid.', TEST_INVOCATION, {
499
510
  code: 'FUNCTION_INPUT_INVALID',
500
511
  details: {
501
512
  issues: [
@@ -530,7 +541,7 @@ describe('formatKernelError', () => {
530
541
  }) as typeof process.stderr.write
531
542
  try {
532
543
  await formatKernelError(
533
- new ResponseError(1003, 'Function input is invalid.', {
544
+ new ResponseError(1003, 'Function input is invalid.', TEST_INVOCATION, {
534
545
  code: 'FUNCTION_INPUT_INVALID',
535
546
  details: { issues: [{ code: 'INVALID_FORMAT', path: '/customer/email' }] },
536
547
  }),