@astrale-os/cli 1.0.0-beta.8 → 1.0.0-npm-deprecated.0

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 (599) hide show
  1. package/README.md +14 -166
  2. package/package.json +10 -102
  3. package/.check-workspace.cjs +0 -40
  4. package/LICENSE +0 -202
  5. package/THIRD-PARTY-NOTICES.md +0 -27
  6. package/dist/astrale.js +0 -93172
  7. package/dist/public/connect-core.js +0 -29187
  8. package/dist/public/keys/index.js +0 -5651
  9. package/dist/public/paths/index.js +0 -4282
  10. package/dist/types/admin/instance/model.d.ts +0 -39
  11. package/dist/types/connect-core.d.ts +0 -22
  12. package/dist/types/connection/auth.d.ts +0 -36
  13. package/dist/types/errors.d.ts +0 -23
  14. package/dist/types/identity/registry.d.ts +0 -25
  15. package/dist/types/keys/algorithm.d.ts +0 -6
  16. package/dist/types/keys/credential.d.ts +0 -21
  17. package/dist/types/keys/index.d.ts +0 -4
  18. package/dist/types/keys/pair.d.ts +0 -34
  19. package/dist/types/lib/admin-target.d.ts +0 -78
  20. package/dist/types/lib/ca-fetch.d.ts +0 -2
  21. package/dist/types/lib/config.d.ts +0 -71
  22. package/dist/types/lib/failure-debug.d.ts +0 -1
  23. package/dist/types/lib/format.d.ts +0 -1
  24. package/dist/types/lib/idp-session.d.ts +0 -33
  25. package/dist/types/lib/idp.d.ts +0 -404
  26. package/dist/types/lib/instance-target.d.ts +0 -38
  27. package/dist/types/lib/instance.d.ts +0 -196
  28. package/dist/types/lib/invocation.d.ts +0 -3
  29. package/dist/types/lib/log.d.ts +0 -33
  30. package/dist/types/lib/login-flow.d.ts +0 -49
  31. package/dist/types/lib/meta.d.ts +0 -36
  32. package/dist/types/lib/output.d.ts +0 -87
  33. package/dist/types/lib/proc.d.ts +0 -43
  34. package/dist/types/lib/table.d.ts +0 -18
  35. package/dist/types/lib/update.d.ts +0 -131
  36. package/dist/types/lib/validation.d.ts +0 -11
  37. package/dist/types/paths/index.d.ts +0 -2
  38. package/dist/types/state/exchange-credentials.d.ts +0 -25
  39. package/dist/types/state/files.d.ts +0 -9
  40. package/dist/types/state/identities.d.ts +0 -42
  41. package/dist/types/state/index.d.ts +0 -8
  42. package/dist/types/state/paths.d.ts +0 -32
  43. package/src/__tests__/fixtures/publication.ts +0 -20
  44. package/src/admin/.spec/api.d.ts +0 -3
  45. package/src/admin/.spec/architecture.md +0 -15
  46. package/src/admin/.spec/icon.svg +0 -3
  47. package/src/admin/.spec/layout.ts +0 -6
  48. package/src/admin/__tests__/binding.test.ts +0 -31
  49. package/src/admin/__tests__/fixture.ts +0 -101
  50. package/src/admin/binding.ts +0 -98
  51. package/src/admin/catalog/.spec/api.d.ts +0 -65
  52. package/src/admin/catalog/.spec/architecture.md +0 -6
  53. package/src/admin/catalog/.spec/icon.svg +0 -3
  54. package/src/admin/catalog/.spec/layout.ts +0 -6
  55. package/src/admin/catalog/__tests__/client.test.ts +0 -142
  56. package/src/admin/catalog/client.ts +0 -218
  57. package/src/admin/catalog/index.ts +0 -13
  58. package/src/admin/catalog/model.ts +0 -41
  59. package/src/admin/catalog/tsconfig.json +0 -8
  60. package/src/admin/graph/.spec/api.d.ts +0 -22
  61. package/src/admin/graph/.spec/architecture.md +0 -5
  62. package/src/admin/graph/.spec/icon.svg +0 -3
  63. package/src/admin/graph/.spec/layout.ts +0 -3
  64. package/src/admin/graph/index.ts +0 -6
  65. package/src/admin/graph/nodes.ts +0 -56
  66. package/src/admin/index.ts +0 -2
  67. package/src/admin/instance/.spec/api.d.ts +0 -66
  68. package/src/admin/instance/.spec/architecture.md +0 -10
  69. package/src/admin/instance/.spec/icon.svg +0 -3
  70. package/src/admin/instance/.spec/layout.ts +0 -6
  71. package/src/admin/instance/__tests__/client.test.ts +0 -266
  72. package/src/admin/instance/client.ts +0 -290
  73. package/src/admin/instance/index.ts +0 -16
  74. package/src/admin/instance/model.ts +0 -66
  75. package/src/admin/instance/tsconfig.json +0 -8
  76. package/src/commands/__tests__/admin-instance.test.ts +0 -88
  77. package/src/commands/__tests__/auth-login.test.ts +0 -231
  78. package/src/commands/__tests__/auth-token.test.ts +0 -223
  79. package/src/commands/__tests__/call-describe.test.ts +0 -80
  80. package/src/commands/__tests__/call.test.ts +0 -29
  81. package/src/commands/__tests__/domain-install-operation.test.ts +0 -126
  82. package/src/commands/__tests__/domain-install-owned.test.ts +0 -191
  83. package/src/commands/__tests__/domain-list.test.ts +0 -133
  84. package/src/commands/__tests__/domain-uninstall.test.ts +0 -53
  85. package/src/commands/__tests__/install-direct.test.ts +0 -21
  86. package/src/commands/__tests__/install-identity-override.test.ts +0 -76
  87. package/src/commands/__tests__/instance-bookmark.test.ts +0 -166
  88. package/src/commands/__tests__/instance-create-hosts.test.ts +0 -29
  89. package/src/commands/__tests__/instance-list-admin.test.ts +0 -26
  90. package/src/commands/__tests__/instance-list-rows.test.ts +0 -64
  91. package/src/commands/__tests__/instance-use.test.ts +0 -67
  92. package/src/commands/__tests__/introspect-parse.test.ts +0 -21
  93. package/src/commands/__tests__/logs.test.ts +0 -97
  94. package/src/commands/__tests__/read-commands.test.ts +0 -294
  95. package/src/commands/__tests__/setup-plan.test.ts +0 -61
  96. package/src/commands/__tests__/studio-descriptor.test.ts +0 -22
  97. package/src/commands/__tests__/token-ttl.test.ts +0 -21
  98. package/src/commands/__tests__/update.test.ts +0 -95
  99. package/src/commands/__tests__/view-build.test.ts +0 -58
  100. package/src/commands/__tests__/view.test.ts +0 -149
  101. package/src/commands/admin/status.ts +0 -61
  102. package/src/commands/admin/use.ts +0 -100
  103. package/src/commands/auth/login.ts +0 -82
  104. package/src/commands/auth/logout.ts +0 -52
  105. package/src/commands/auth/status.ts +0 -86
  106. package/src/commands/auth/token.ts +0 -174
  107. package/src/commands/browser.ts +0 -207
  108. package/src/commands/call-describe.ts +0 -123
  109. package/src/commands/call.ts +0 -205
  110. package/src/commands/domain/install.ts +0 -548
  111. package/src/commands/domain/list.ts +0 -155
  112. package/src/commands/domain/publish.ts +0 -133
  113. package/src/commands/domain/uninstall.ts +0 -128
  114. package/src/commands/get.ts +0 -69
  115. package/src/commands/identity/__tests__/register.test.ts +0 -93
  116. package/src/commands/identity/create.ts +0 -35
  117. package/src/commands/identity/delete.ts +0 -24
  118. package/src/commands/identity/export.ts +0 -46
  119. package/src/commands/identity/import.ts +0 -61
  120. package/src/commands/identity/list.ts +0 -56
  121. package/src/commands/identity/register.ts +0 -196
  122. package/src/commands/identity/sync.ts +0 -38
  123. package/src/commands/identity/unsync.ts +0 -34
  124. package/src/commands/identity/use.ts +0 -24
  125. package/src/commands/identity/whoami.ts +0 -34
  126. package/src/commands/idp/add.ts +0 -150
  127. package/src/commands/idp/list.ts +0 -57
  128. package/src/commands/idp/refresh.ts +0 -38
  129. package/src/commands/idp/remove.ts +0 -36
  130. package/src/commands/idp/show.ts +0 -29
  131. package/src/commands/instance/active.ts +0 -73
  132. package/src/commands/instance/bookmark.ts +0 -101
  133. package/src/commands/instance/create.ts +0 -69
  134. package/src/commands/instance/delete.ts +0 -68
  135. package/src/commands/instance/forget.ts +0 -26
  136. package/src/commands/instance/list.ts +0 -197
  137. package/src/commands/instance/status.ts +0 -38
  138. package/src/commands/instance/use.ts +0 -259
  139. package/src/commands/introspect.ts +0 -110
  140. package/src/commands/logs.ts +0 -283
  141. package/src/commands/mutate.ts +0 -122
  142. package/src/commands/query.ts +0 -136
  143. package/src/commands/session/analyze.ts +0 -50
  144. package/src/commands/session/list.ts +0 -36
  145. package/src/commands/setup.ts +0 -54
  146. package/src/commands/status.ts +0 -60
  147. package/src/commands/studio.ts +0 -434
  148. package/src/commands/token.ts +0 -107
  149. package/src/commands/update.ts +0 -334
  150. package/src/commands/use.ts +0 -86
  151. package/src/commands/view-serve.ts +0 -26
  152. package/src/commands/view.ts +0 -614
  153. package/src/connect-core.test.ts +0 -38
  154. package/src/connect-core.ts +0 -42
  155. package/src/connection/.spec/api.d.ts +0 -110
  156. package/src/connection/.spec/architecture.md +0 -47
  157. package/src/connection/.spec/capabilities/connection.ts +0 -13
  158. package/src/connection/.spec/examples/call.ts +0 -7
  159. package/src/connection/.spec/flows/command.ts +0 -20
  160. package/src/connection/.spec/flows/session.ts +0 -61
  161. package/src/connection/.spec/laws/connection.ts +0 -205
  162. package/src/connection/.spec/layout.ts +0 -21
  163. package/src/connection/__tests__/auth.test.ts +0 -128
  164. package/src/connection/__tests__/ca-fetch.test.ts +0 -60
  165. package/src/connection/__tests__/call.test.ts +0 -17
  166. package/src/connection/__tests__/credential.test.ts +0 -119
  167. package/src/connection/__tests__/errors.test.ts +0 -577
  168. package/src/connection/__tests__/exchange.test.ts +0 -295
  169. package/src/connection/__tests__/failure-fixtures.ts +0 -39
  170. package/src/connection/__tests__/failure-safety.test.ts +0 -75
  171. package/src/connection/__tests__/fixtures/localhost-cert.pem +0 -19
  172. package/src/connection/__tests__/fixtures/localhost-key.base64 +0 -1
  173. package/src/connection/__tests__/managed.test.ts +0 -39
  174. package/src/connection/__tests__/reasons.test.ts +0 -78
  175. package/src/connection/__tests__/self.test.ts +0 -71
  176. package/src/connection/__tests__/session.test.ts +0 -140
  177. package/src/connection/__tests__/target.test.ts +0 -93
  178. package/src/connection/auth.ts +0 -236
  179. package/src/connection/call.ts +0 -7
  180. package/src/connection/command.ts +0 -67
  181. package/src/connection/credential.ts +0 -117
  182. package/src/connection/errors.ts +0 -1
  183. package/src/connection/exchange.ts +0 -311
  184. package/src/connection/failure/classify.ts +0 -110
  185. package/src/connection/failure/index.ts +0 -18
  186. package/src/connection/failure/model.ts +0 -28
  187. package/src/connection/failure/render.ts +0 -116
  188. package/src/connection/index.ts +0 -8
  189. package/src/connection/reasons.ts +0 -209
  190. package/src/connection/self.ts +0 -138
  191. package/src/connection/session.ts +0 -185
  192. package/src/connection/target.ts +0 -112
  193. package/src/connection/tsconfig.json +0 -6
  194. package/src/errors.ts +0 -66
  195. package/src/graph/.spec/api.d.ts +0 -41
  196. package/src/graph/.spec/laws/documents.ts +0 -24
  197. package/src/graph/.spec/laws/projection.ts +0 -13
  198. package/src/graph/.spec/layout.ts +0 -14
  199. package/src/graph/__tests__/mutation.test.ts +0 -51
  200. package/src/graph/__tests__/projection.test.ts +0 -22
  201. package/src/graph/__tests__/query.test.ts +0 -173
  202. package/src/graph/class.ts +0 -30
  203. package/src/graph/index.ts +0 -4
  204. package/src/graph/mutation.ts +0 -46
  205. package/src/graph/projection.ts +0 -21
  206. package/src/graph/query.ts +0 -97
  207. package/src/graph/tsconfig.json +0 -6
  208. package/src/identity/.history/ard/bootstrap-root-transfer.md +0 -57
  209. package/src/identity/.history/ard/domain-mediated-registration.md +0 -36
  210. package/src/identity/.spec/api.d.ts +0 -124
  211. package/src/identity/.spec/architecture.md +0 -33
  212. package/src/identity/.spec/capabilities/identity.ts +0 -7
  213. package/src/identity/.spec/flows/bootstrap-root.ts +0 -79
  214. package/src/identity/.spec/flows/domain-mediated-registration.ts +0 -51
  215. package/src/identity/.spec/flows/import.ts +0 -29
  216. package/src/identity/.spec/laws/identity.ts +0 -56
  217. package/src/identity/.spec/layout.ts +0 -13
  218. package/src/identity/.spec/schemas/identity-export-v1.schema.json +0 -25
  219. package/src/identity/__tests__/fixtures/registry-journey.ts +0 -53
  220. package/src/identity/__tests__/registration.test.ts +0 -64
  221. package/src/identity/__tests__/registry.test.ts +0 -70
  222. package/src/identity/__tests__/transfer.test.ts +0 -198
  223. package/src/identity/index.ts +0 -23
  224. package/src/identity/registration.ts +0 -72
  225. package/src/identity/registry.ts +0 -179
  226. package/src/identity/transfer.ts +0 -187
  227. package/src/identity/tsconfig.json +0 -6
  228. package/src/index.ts +0 -1
  229. package/src/keys/.spec/api.d.ts +0 -74
  230. package/src/keys/.spec/architecture.md +0 -13
  231. package/src/keys/.spec/laws/keys.ts +0 -43
  232. package/src/keys/.spec/layout.ts +0 -6
  233. package/src/keys/__tests__/algorithm.test.ts +0 -39
  234. package/src/keys/__tests__/keys.test.ts +0 -168
  235. package/src/keys/algorithm.ts +0 -33
  236. package/src/keys/credential.ts +0 -112
  237. package/src/keys/index.ts +0 -14
  238. package/src/keys/pair.ts +0 -219
  239. package/src/keys/tsconfig.json +0 -6
  240. package/src/lib/__tests__/admin-target.test.ts +0 -184
  241. package/src/lib/__tests__/binary.test.ts +0 -55
  242. package/src/lib/__tests__/command-dx.test.ts +0 -102
  243. package/src/lib/__tests__/concurrency.test.ts +0 -62
  244. package/src/lib/__tests__/config.test.ts +0 -54
  245. package/src/lib/__tests__/design.test.ts +0 -99
  246. package/src/lib/__tests__/domain-publication.test.ts +0 -133
  247. package/src/lib/__tests__/format.test.ts +0 -22
  248. package/src/lib/__tests__/idp-session.driver.ts +0 -53
  249. package/src/lib/__tests__/idp-session.test.ts +0 -379
  250. package/src/lib/__tests__/idp.test.ts +0 -415
  251. package/src/lib/__tests__/instance-candidates.test.ts +0 -148
  252. package/src/lib/__tests__/instance-target.test.ts +0 -212
  253. package/src/lib/__tests__/instance.test.ts +0 -192
  254. package/src/lib/__tests__/local-status.test.ts +0 -202
  255. package/src/lib/__tests__/log-errors.test.ts +0 -64
  256. package/src/lib/__tests__/log.test.ts +0 -31
  257. package/src/lib/__tests__/meta.test.ts +0 -55
  258. package/src/lib/__tests__/output.test.ts +0 -162
  259. package/src/lib/__tests__/panel.test.ts +0 -40
  260. package/src/lib/__tests__/port.test.ts +0 -44
  261. package/src/lib/__tests__/prompt.test.ts +0 -25
  262. package/src/lib/__tests__/sdk-deps.test.ts +0 -68
  263. package/src/lib/__tests__/self.test.ts +0 -50
  264. package/src/lib/__tests__/studio-server-deps.test.ts +0 -111
  265. package/src/lib/__tests__/table.test.ts +0 -53
  266. package/src/lib/__tests__/update.test.ts +0 -351
  267. package/src/lib/__tests__/use-target.test.ts +0 -56
  268. package/src/lib/__tests__/validation.test.ts +0 -34
  269. package/src/lib/__tests__/view-assets.test.ts +0 -146
  270. package/src/lib/__tests__/view-open-intent.test.ts +0 -280
  271. package/src/lib/__tests__/view-port-allocation.test.ts +0 -82
  272. package/src/lib/__tests__/view-server.test.ts +0 -68
  273. package/src/lib/__tests__/view-session.test.ts +0 -99
  274. package/src/lib/__tests__/view-snapshot.test.ts +0 -77
  275. package/src/lib/admin-domain.ts +0 -43
  276. package/src/lib/admin-instance.ts +0 -50
  277. package/src/lib/admin-target.ts +0 -290
  278. package/src/lib/binary.ts +0 -110
  279. package/src/lib/browser.ts +0 -150
  280. package/src/lib/ca-fetch.ts +0 -133
  281. package/src/lib/command-dx.ts +0 -188
  282. package/src/lib/concurrency.ts +0 -31
  283. package/src/lib/config.ts +0 -46
  284. package/src/lib/domain-publication.ts +0 -102
  285. package/src/lib/failure-debug.ts +0 -26
  286. package/src/lib/format.ts +0 -4
  287. package/src/lib/idp-session.ts +0 -134
  288. package/src/lib/idp.ts +0 -906
  289. package/src/lib/instance-candidates.ts +0 -49
  290. package/src/lib/instance-target.ts +0 -197
  291. package/src/lib/instance.ts +0 -463
  292. package/src/lib/invocation.ts +0 -11
  293. package/src/lib/local-status.ts +0 -152
  294. package/src/lib/log.ts +0 -143
  295. package/src/lib/login-flow.ts +0 -201
  296. package/src/lib/meta.ts +0 -90
  297. package/src/lib/output.ts +0 -238
  298. package/src/lib/panel.ts +0 -61
  299. package/src/lib/port.ts +0 -41
  300. package/src/lib/proc.ts +0 -82
  301. package/src/lib/prompt.ts +0 -136
  302. package/src/lib/provision-instance.ts +0 -162
  303. package/src/lib/sdk-deps.ts +0 -104
  304. package/src/lib/self.ts +0 -22
  305. package/src/lib/skills.ts +0 -171
  306. package/src/lib/table.ts +0 -62
  307. package/src/lib/update.ts +0 -409
  308. package/src/lib/use-target.ts +0 -24
  309. package/src/lib/validation.ts +0 -59
  310. package/src/lib/view/assets.ts +0 -78
  311. package/src/lib/view/open-intent.ts +0 -67
  312. package/src/lib/view/port-allocation.ts +0 -19
  313. package/src/lib/view/resolve.ts +0 -111
  314. package/src/lib/view/server.ts +0 -244
  315. package/src/lib/view/session.ts +0 -152
  316. package/src/lib/view/snapshot.ts +0 -101
  317. package/src/paths/.spec/api.d.ts +0 -13
  318. package/src/paths/.spec/architecture.md +0 -5
  319. package/src/paths/.spec/layout.ts +0 -3
  320. package/src/paths/index.ts +0 -13
  321. package/src/program/.spec/api.d.ts +0 -42
  322. package/src/program/.spec/architecture.md +0 -18
  323. package/src/program/.spec/laws/program.ts +0 -29
  324. package/src/program/.spec/layout.ts +0 -14
  325. package/src/program/__tests__/program.test.ts +0 -362
  326. package/src/program/build.ts +0 -183
  327. package/src/program/command.ts +0 -42
  328. package/src/program/index.ts +0 -2
  329. package/src/program/options.ts +0 -41
  330. package/src/program/registry.ts +0 -63
  331. package/src/program/tsconfig.json +0 -6
  332. package/src/setup/__tests__/instance-step.test.ts +0 -239
  333. package/src/setup/__tests__/util.test.ts +0 -29
  334. package/src/setup/engine.ts +0 -83
  335. package/src/setup/render.ts +0 -107
  336. package/src/setup/steps/admin.ts +0 -93
  337. package/src/setup/steps/agent-browser.ts +0 -81
  338. package/src/setup/steps/auth.ts +0 -54
  339. package/src/setup/steps/domain.ts +0 -68
  340. package/src/setup/steps/index.ts +0 -18
  341. package/src/setup/steps/instance.ts +0 -199
  342. package/src/setup/steps/skills-bridge.ts +0 -70
  343. package/src/setup/steps/skills.ts +0 -59
  344. package/src/setup/types.ts +0 -61
  345. package/src/setup/util.ts +0 -34
  346. package/src/state/.spec/api.d.ts +0 -133
  347. package/src/state/.spec/architecture.md +0 -31
  348. package/src/state/.spec/capabilities/state.ts +0 -7
  349. package/src/state/.spec/flows/identity-update.ts +0 -22
  350. package/src/state/.spec/laws/state.ts +0 -73
  351. package/src/state/.spec/layout.ts +0 -14
  352. package/src/state/__tests__/exchange-credentials.test.ts +0 -188
  353. package/src/state/__tests__/files.test.ts +0 -113
  354. package/src/state/__tests__/fixtures/identity-transition.ts +0 -37
  355. package/src/state/__tests__/identities.test.ts +0 -142
  356. package/src/state/__tests__/paths.test.ts +0 -27
  357. package/src/state/exchange-credentials.ts +0 -219
  358. package/src/state/files.ts +0 -129
  359. package/src/state/identities.ts +0 -229
  360. package/src/state/index.ts +0 -29
  361. package/src/state/paths.ts +0 -61
  362. package/src/state/tsconfig.json +0 -6
  363. package/src/telemetry/__tests__/gate.test.ts +0 -63
  364. package/src/telemetry/__tests__/recorder.test.ts +0 -110
  365. package/src/telemetry/__tests__/redact.test.ts +0 -79
  366. package/src/telemetry/__tests__/session.test.ts +0 -166
  367. package/src/telemetry/__tests__/trigger.test.ts +0 -49
  368. package/src/telemetry/adapters/__tests__/claude-code.test.ts +0 -89
  369. package/src/telemetry/adapters/__tests__/codex.test.ts +0 -138
  370. package/src/telemetry/adapters/__tests__/index.test.ts +0 -88
  371. package/src/telemetry/adapters/claude-code.ts +0 -90
  372. package/src/telemetry/adapters/codex.ts +0 -160
  373. package/src/telemetry/adapters/index.ts +0 -45
  374. package/src/telemetry/adapters/types.ts +0 -21
  375. package/src/telemetry/analyze.ts +0 -227
  376. package/src/telemetry/gate.ts +0 -79
  377. package/src/telemetry/recorder.ts +0 -57
  378. package/src/telemetry/redact.ts +0 -53
  379. package/src/telemetry/session.ts +0 -88
  380. package/src/telemetry/settings.ts +0 -26
  381. package/src/telemetry/store.ts +0 -91
  382. package/src/telemetry/trigger.ts +0 -119
  383. package/src/telemetry/types.ts +0 -64
  384. package/src/test-utils.ts +0 -18
  385. package/studio/client/dist/assets/elk-api-Di4OXGNH.js +0 -1
  386. package/studio/client/dist/assets/elk-worker.min-C9JGDOE-.js +0 -6312
  387. package/studio/client/dist/assets/index-BLm6J11H.js +0 -81
  388. package/studio/client/dist/assets/index-BiGR8Oo9.css +0 -1
  389. package/studio/client/dist/assets/index-ChOr3yP0.css +0 -1
  390. package/studio/client/dist/assets/index-DTjvkOUX.js +0 -8
  391. package/studio/client/dist/index.html +0 -13
  392. package/studio/package.json +0 -65
  393. package/studio/server/agent/ask.test.ts +0 -74
  394. package/studio/server/agent/ask.ts +0 -71
  395. package/studio/server/agent/bridge/client.test.ts +0 -49
  396. package/studio/server/agent/bridge/client.ts +0 -37
  397. package/studio/server/agent/bridge/grant.test.ts +0 -62
  398. package/studio/server/agent/bridge/grant.ts +0 -84
  399. package/studio/server/agent/bridge/routes.test.ts +0 -151
  400. package/studio/server/agent/bridge/routes.ts +0 -148
  401. package/studio/server/agent/bridge/stdio.ts +0 -195
  402. package/studio/server/agent/conversation.test.ts +0 -89
  403. package/studio/server/agent/conversation.ts +0 -158
  404. package/studio/server/agent/harness/adapter.ts +0 -171
  405. package/studio/server/agent/harness/claude/adapter.test.ts +0 -348
  406. package/studio/server/agent/harness/claude/adapter.ts +0 -71
  407. package/studio/server/agent/harness/claude/ask.ts +0 -114
  408. package/studio/server/agent/harness/claude/capabilities.ts +0 -27
  409. package/studio/server/agent/harness/claude/command.ts +0 -63
  410. package/studio/server/agent/harness/claude/events.ts +0 -215
  411. package/studio/server/agent/harness/claude/loadout.ts +0 -132
  412. package/studio/server/agent/harness/claude/mcp.test.ts +0 -36
  413. package/studio/server/agent/harness/claude/mcp.ts +0 -41
  414. package/studio/server/agent/harness/claude/skills.ts +0 -43
  415. package/studio/server/agent/harness/codex/adapter.test.ts +0 -269
  416. package/studio/server/agent/harness/codex/adapter.ts +0 -116
  417. package/studio/server/agent/harness/codex/ask.test.ts +0 -176
  418. package/studio/server/agent/harness/codex/ask.ts +0 -181
  419. package/studio/server/agent/harness/codex/command.test.ts +0 -69
  420. package/studio/server/agent/harness/codex/command.ts +0 -43
  421. package/studio/server/agent/harness/codex/events.test.ts +0 -94
  422. package/studio/server/agent/harness/codex/events.ts +0 -132
  423. package/studio/server/agent/harness/codex/exec.ts +0 -113
  424. package/studio/server/agent/harness/codex/loadout.ts +0 -60
  425. package/studio/server/agent/harness/codex/mcp.test.ts +0 -32
  426. package/studio/server/agent/harness/codex/mcp.ts +0 -27
  427. package/studio/server/agent/harness/codex/models.test.ts +0 -167
  428. package/studio/server/agent/harness/codex/models.ts +0 -211
  429. package/studio/server/agent/harness/codex/skills.ts +0 -33
  430. package/studio/server/agent/harness/gateway/config.test.ts +0 -98
  431. package/studio/server/agent/harness/gateway/config.ts +0 -214
  432. package/studio/server/agent/harness/gateway/token.test.ts +0 -133
  433. package/studio/server/agent/harness/gateway/token.ts +0 -166
  434. package/studio/server/agent/harness/mock/adapter.ts +0 -190
  435. package/studio/server/agent/harness/mock/domain-edit.ts +0 -41
  436. package/studio/server/agent/harness/process.test.ts +0 -46
  437. package/studio/server/agent/harness/process.ts +0 -104
  438. package/studio/server/agent/harness/registry.ts +0 -37
  439. package/studio/server/agent/harness/selection.test.ts +0 -75
  440. package/studio/server/agent/harness/selection.ts +0 -85
  441. package/studio/server/agent/harness/skills.test.ts +0 -95
  442. package/studio/server/agent/harness/skills.ts +0 -100
  443. package/studio/server/agent/layout.test.ts +0 -95
  444. package/studio/server/agent/notify.ts +0 -12
  445. package/studio/server/agent/prompts/anchors.test.ts +0 -70
  446. package/studio/server/agent/prompts/anchors.ts +0 -153
  447. package/studio/server/agent/prompts/ask.ts +0 -34
  448. package/studio/server/agent/prompts/system.test.ts +0 -13
  449. package/studio/server/agent/prompts/system.ts +0 -99
  450. package/studio/server/agent/prompts/turn.ts +0 -66
  451. package/studio/server/agent/routes.test.ts +0 -176
  452. package/studio/server/agent/routes.ts +0 -214
  453. package/studio/server/agent/run/completion.ts +0 -193
  454. package/studio/server/agent/run/coordinator.test.ts +0 -337
  455. package/studio/server/agent/run/coordinator.ts +0 -104
  456. package/studio/server/agent/run/live-state.ts +0 -73
  457. package/studio/server/agent/run/preparation.ts +0 -163
  458. package/studio/server/agent/run/transcript.test.ts +0 -81
  459. package/studio/server/agent/run/transcript.ts +0 -196
  460. package/studio/server/agent/run/usage.test.ts +0 -70
  461. package/studio/server/agent/run/usage.ts +0 -62
  462. package/studio/server/agent/stream.ts +0 -37
  463. package/studio/server/agent/telemetry.ts +0 -13
  464. package/studio/server/api/canvas.ts +0 -43
  465. package/studio/server/api/comments.ts +0 -85
  466. package/studio/server/api/context.ts +0 -61
  467. package/studio/server/api/deployment.ts +0 -39
  468. package/studio/server/api/documents.ts +0 -55
  469. package/studio/server/api/domain.ts +0 -59
  470. package/studio/server/api/http.ts +0 -45
  471. package/studio/server/api/project.ts +0 -57
  472. package/studio/server/api/schema.ts +0 -12
  473. package/studio/server/api/views.ts +0 -57
  474. package/studio/server/api/workspace.ts +0 -60
  475. package/studio/server/api-agent-loadout.test.ts +0 -69
  476. package/studio/server/api.test.ts +0 -147
  477. package/studio/server/api.ts +0 -34
  478. package/studio/server/cache.test.ts +0 -122
  479. package/studio/server/cache.ts +0 -303
  480. package/studio/server/cli-consumers.test.ts +0 -494
  481. package/studio/server/cli.test.ts +0 -88
  482. package/studio/server/cli.ts +0 -240
  483. package/studio/server/client-package.test.ts +0 -147
  484. package/studio/server/client-package.ts +0 -266
  485. package/studio/server/detect.ts +0 -81
  486. package/studio/server/domain.test.ts +0 -77
  487. package/studio/server/domain.ts +0 -124
  488. package/studio/server/environment/dotenv-preview.test.ts +0 -39
  489. package/studio/server/environment/dotenv-preview.ts +0 -27
  490. package/studio/server/environment/files.test.ts +0 -53
  491. package/studio/server/environment/files.ts +0 -120
  492. package/studio/server/handoff/copy.ts +0 -171
  493. package/studio/server/handoff/service.test.ts +0 -22
  494. package/studio/server/handoff/service.ts +0 -62
  495. package/studio/server/index.ts +0 -148
  496. package/studio/server/instances/active.ts +0 -72
  497. package/studio/server/instances/deploy-record.test.ts +0 -31
  498. package/studio/server/instances/deploy-record.ts +0 -37
  499. package/studio/server/instances/deploy.ts +0 -56
  500. package/studio/server/instances/probe.test.ts +0 -67
  501. package/studio/server/instances/probe.ts +0 -67
  502. package/studio/server/instances/status.test.ts +0 -12
  503. package/studio/server/instances/status.ts +0 -49
  504. package/studio/server/introspect/anatomy/client-tree.ts +0 -57
  505. package/studio/server/introspect/anatomy/env-fields.ts +0 -66
  506. package/studio/server/introspect/anatomy/schema-definition.ts +0 -53
  507. package/studio/server/introspect/anatomy/source.ts +0 -181
  508. package/studio/server/introspect/anatomy/views/routes.ts +0 -114
  509. package/studio/server/introspect/anatomy/views.ts +0 -53
  510. package/studio/server/introspect/anatomy-extras.test.ts +0 -265
  511. package/studio/server/introspect/anatomy-extras.ts +0 -10
  512. package/studio/server/introspect/anatomy.test.ts +0 -41
  513. package/studio/server/introspect/anatomy.ts +0 -147
  514. package/studio/server/introspect/bundle.ts +0 -69
  515. package/studio/server/introspect/canonical-schema.test.ts +0 -179
  516. package/studio/server/introspect/canonical-schema.ts +0 -583
  517. package/studio/server/introspect/config-preview.test.ts +0 -32
  518. package/studio/server/introspect/config-preview.ts +0 -119
  519. package/studio/server/introspect/core-extractor.ts +0 -30
  520. package/studio/server/introspect/core.ts +0 -45
  521. package/studio/server/introspect/diff.test.ts +0 -124
  522. package/studio/server/introspect/diff.ts +0 -316
  523. package/studio/server/introspect/extractor.ts +0 -41
  524. package/studio/server/introspect/hash.ts +0 -24
  525. package/studio/server/introspect/overlay-tsmorph.test.ts +0 -146
  526. package/studio/server/introspect/overlay-tsmorph.ts +0 -9
  527. package/studio/server/introspect/overlay.test.ts +0 -44
  528. package/studio/server/introspect/overlay.ts +0 -40
  529. package/studio/server/introspect/revision.test.ts +0 -54
  530. package/studio/server/introspect/revision.ts +0 -49
  531. package/studio/server/introspect/runtime.test.ts +0 -157
  532. package/studio/server/introspect/runtime.ts +0 -140
  533. package/studio/server/introspect/schema-ir-json.test.ts +0 -70
  534. package/studio/server/introspect/schema-ir-json.ts +0 -151
  535. package/studio/server/introspect/schema-refs.test.ts +0 -55
  536. package/studio/server/introspect/schema-refs.ts +0 -32
  537. package/studio/server/introspect/source-overlay/annotations.ts +0 -14
  538. package/studio/server/introspect/source-overlay/handlers.ts +0 -161
  539. package/studio/server/introspect/source-overlay/kernel-calls.ts +0 -46
  540. package/studio/server/introspect/source-overlay/project.ts +0 -248
  541. package/studio/server/introspect/source-overlay/spans.ts +0 -330
  542. package/studio/server/json.ts +0 -46
  543. package/studio/server/lifecycle.ts +0 -42
  544. package/studio/server/sse.test.ts +0 -26
  545. package/studio/server/sse.ts +0 -60
  546. package/studio/server/state/baseline.test.ts +0 -267
  547. package/studio/server/state/baseline.ts +0 -354
  548. package/studio/server/state/comments.test.ts +0 -94
  549. package/studio/server/state/comments.ts +0 -484
  550. package/studio/server/state/context.ts +0 -199
  551. package/studio/server/state/documents.ts +0 -111
  552. package/studio/server/state/integrations.ts +0 -81
  553. package/studio/server/state/layout.test.ts +0 -34
  554. package/studio/server/state/layout.ts +0 -82
  555. package/studio/server/state/settings.test.ts +0 -78
  556. package/studio/server/state/settings.ts +0 -73
  557. package/studio/server/state/store.test.ts +0 -122
  558. package/studio/server/state/store.ts +0 -146
  559. package/studio/server/state/visibility.ts +0 -48
  560. package/studio/server/views/model.test.ts +0 -57
  561. package/studio/server/views/model.ts +0 -66
  562. package/studio/server/views/runtime.ts +0 -40
  563. package/studio/server/views/selection-repository.test.ts +0 -31
  564. package/studio/server/views/selection-repository.ts +0 -60
  565. package/studio/server/views/session.test.ts +0 -73
  566. package/studio/server/views/session.ts +0 -166
  567. package/studio/server/views/target.test.ts +0 -78
  568. package/studio/server/views/target.ts +0 -222
  569. package/studio/server/watch.test.ts +0 -36
  570. package/studio/server/watch.ts +0 -93
  571. package/studio/server/workspace/catalog.test.ts +0 -17
  572. package/studio/server/workspace/catalog.ts +0 -43
  573. package/studio/server/workspace/create.test.ts +0 -37
  574. package/studio/server/workspace/create.ts +0 -162
  575. package/studio/server/workspace/git.ts +0 -75
  576. package/studio/server/workspace/updates.ts +0 -83
  577. package/studio/server/workspace-state.ts +0 -26
  578. package/studio/server/workspace-watch.ts +0 -106
  579. package/studio/shared/agent-effort.test.ts +0 -12
  580. package/studio/shared/agent-effort.ts +0 -15
  581. package/studio/shared/agent-models.test.ts +0 -9
  582. package/studio/shared/agent-models.ts +0 -14
  583. package/studio/shared/contracts/README.md +0 -16
  584. package/studio/shared/contracts/agent.ts +0 -270
  585. package/studio/shared/contracts/runtime.ts +0 -50
  586. package/studio/shared/contracts/schema.ts +0 -393
  587. package/studio/shared/contracts/surface.test.ts +0 -317
  588. package/studio/shared/contracts/workspace.ts +0 -265
  589. package/studio/shared/layout.test.ts +0 -116
  590. package/studio/shared/schema/identity.test.ts +0 -34
  591. package/studio/shared/schema/identity.ts +0 -68
  592. package/studio/shared/settings-values.test.ts +0 -18
  593. package/studio/shared/settings-values.ts +0 -20
  594. package/studio/shared/types.ts +0 -14
  595. package/studio/tsconfig.json +0 -23
  596. package/tsconfig.json +0 -14
  597. package/viewer/dist/index.html +0 -93
  598. package/viewer/dist/main.js +0 -76
  599. package/viewer/tsconfig.json +0 -13
@@ -1,99 +0,0 @@
1
- import { describe, expect, test } from 'bun:test'
2
-
3
- import { IdentifierCollisionError, ReservedSlugError } from '../../errors'
4
- import { InstanceStoreSchema, assertNoCollision, resolveInstanceKey } from '../instance'
5
- import { validateSlug } from '../validation'
6
-
7
- const baseStore = InstanceStoreSchema.parse({
8
- active: 'staging',
9
- instances: {
10
- staging: {
11
- url: 'https://staging.example.com',
12
- createdAt: '2024-02-01T00:00:00Z',
13
- slug: 'staging',
14
- name: 'Staging Cluster',
15
- kind: 'bookmark',
16
- mode: 'remote',
17
- },
18
- localdev: {
19
- url: 'https://localdev.example.com',
20
- createdAt: '2024-02-02T00:00:00Z',
21
- slug: 'localdev',
22
- kind: 'bookmark',
23
- mode: 'remote',
24
- },
25
- },
26
- })
27
-
28
- describe('DESIGN — §4.7 slug + namespace', () => {
29
- test('validateSlug accepts URL-safe slugs', () => {
30
- expect(() => validateSlug('foo')).not.toThrow()
31
- expect(() => validateSlug('foo-bar')).not.toThrow()
32
- expect(() => validateSlug('f00-bar-1')).not.toThrow()
33
- })
34
-
35
- test('validateSlug rejects invalid slugs', () => {
36
- expect(() => validateSlug('Foo')).toThrow(/Invalid slug/)
37
- expect(() => validateSlug('-foo')).toThrow(/Invalid slug/)
38
- expect(() => validateSlug('foo_bar')).toThrow(/Invalid slug/)
39
- expect(() => validateSlug('foo.bar')).toThrow(/Invalid slug/)
40
- expect(() => validateSlug('')).toThrow(/Invalid slug/)
41
- })
42
-
43
- test('validateSlug rejects reserved "manager"', () => {
44
- expect(() => validateSlug('manager')).toThrow(ReservedSlugError)
45
- })
46
-
47
- test('assertNoCollision rejects existing key', () => {
48
- expect(() => assertNoCollision(baseStore, ['staging'])).toThrow(IdentifierCollisionError)
49
- })
50
-
51
- test('assertNoCollision rejects existing slug', () => {
52
- expect(() => assertNoCollision(baseStore, ['localdev'])).toThrow(IdentifierCollisionError)
53
- })
54
-
55
- test('assertNoCollision rejects existing name', () => {
56
- expect(() => assertNoCollision(baseStore, ['Staging Cluster'])).toThrow(
57
- IdentifierCollisionError,
58
- )
59
- })
60
-
61
- test('assertNoCollision accepts new identifier', () => {
62
- expect(() => assertNoCollision(baseStore, ['newname'])).not.toThrow()
63
- })
64
-
65
- test('assertNoCollision ignoreKey skips that entry', () => {
66
- expect(() =>
67
- assertNoCollision(baseStore, ['staging', 'Staging Cluster'], 'staging'),
68
- ).not.toThrow()
69
- })
70
- })
71
-
72
- describe('DESIGN — §7 resolver', () => {
73
- test('resolveInstanceKey matches by key', () => {
74
- expect(resolveInstanceKey(baseStore, 'staging')).toBe('staging')
75
- })
76
-
77
- test('resolveInstanceKey matches by slug', () => {
78
- expect(resolveInstanceKey(baseStore, 'localdev')).toBe('localdev')
79
- })
80
-
81
- test('resolveInstanceKey matches by name', () => {
82
- expect(resolveInstanceKey(baseStore, 'Staging Cluster')).toBe('staging')
83
- })
84
-
85
- test('resolveInstanceKey returns null on miss', () => {
86
- expect(resolveInstanceKey(baseStore, 'nope')).toBeNull()
87
- })
88
- })
89
-
90
- describe('DESIGN — backward compat registry', () => {
91
- test('legacy store without kind/slug/mode parses', () => {
92
- const legacy = InstanceStoreSchema.parse({
93
- active: 'old',
94
- instances: { old: { url: 'http://x', createdAt: '2023-01-01' } },
95
- })
96
- expect(legacy.instances.old.kind).toBeUndefined()
97
- expect(legacy.instances.old.mode).toBeUndefined()
98
- })
99
- })
@@ -1,133 +0,0 @@
1
- import { publication } from '@astrale-os/sdk/publication'
2
- import { defineSchema } from '@astrale-os/sdk/schema'
3
- import { describe, expect, test } from 'bun:test'
4
-
5
- import { releaseFor } from '../../__tests__/fixtures/publication'
6
- import { fetchDomainPublication } from '../domain-publication'
7
-
8
- const ROOT = 'https://publication-reader.example.dev'
9
- const PUBLICATION_URL = `${ROOT}/.well-known/astrale/domain.json`
10
- const MAXIMUM_PUBLICATION_BYTES = 1024 * 1024
11
- const schema = defineSchema('publication-reader.example.dev', {})
12
- const deployed = releaseFor(schema, ROOT).publication
13
-
14
- describe('Domain Publication reader', () => {
15
- test('fetches only the canonical path with redirects disabled', async () => {
16
- const requests: Array<{ readonly url: string; readonly redirect?: RequestRedirect }> = []
17
- const fetch = async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
18
- requests.push({ url: String(input), redirect: init?.redirect })
19
- return Response.json(deployed)
20
- }
21
-
22
- await expect(fetchDomainPublication(`${ROOT}/`, undefined, fetch)).resolves.toEqual(deployed)
23
- expect(requests).toEqual([{ url: PUBLICATION_URL, redirect: 'error' }])
24
- })
25
-
26
- test('propagates redirect rejection instead of accepting another target', async () => {
27
- const fetch = async (_input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
28
- expect(init?.redirect).toBe('error')
29
- throw new TypeError('redirect rejected')
30
- }
31
-
32
- await expect(fetchDomainPublication(ROOT, undefined, fetch)).rejects.toThrow(
33
- 'redirect rejected',
34
- )
35
- })
36
-
37
- test('stops at one MiB and cancels an over-limit response stream', async () => {
38
- let pulls = 0
39
- let cancelled = false
40
- const body = new ReadableStream<Uint8Array>(
41
- {
42
- pull(controller) {
43
- pulls += 1
44
- if (pulls === 1) {
45
- controller.enqueue(new Uint8Array(MAXIMUM_PUBLICATION_BYTES))
46
- return
47
- }
48
- if (pulls === 2) {
49
- controller.enqueue(Uint8Array.of(0))
50
- return
51
- }
52
- controller.error(new Error('reader consumed beyond its byte limit'))
53
- },
54
- cancel() {
55
- cancelled = true
56
- },
57
- },
58
- { highWaterMark: 0 },
59
- )
60
- const fetch = async (): Promise<Response> => new Response(body)
61
-
62
- await expect(fetchDomainPublication(ROOT, undefined, fetch)).rejects.toThrow(
63
- `exceeded ${MAXIMUM_PUBLICATION_BYTES} bytes`,
64
- )
65
- expect(pulls).toBe(2)
66
- expect(cancelled).toBe(true)
67
- })
68
-
69
- test('rejects an oversized Content-Length before pulling and cancels the body', async () => {
70
- let pulls = 0
71
- let cancelled = false
72
- const body = new ReadableStream<Uint8Array>(
73
- {
74
- pull() {
75
- pulls += 1
76
- },
77
- cancel() {
78
- cancelled = true
79
- },
80
- },
81
- { highWaterMark: 0 },
82
- )
83
- const fetch = async (): Promise<Response> =>
84
- new Response(body, {
85
- headers: { 'content-length': String(MAXIMUM_PUBLICATION_BYTES + 1) },
86
- })
87
-
88
- await expect(fetchDomainPublication(ROOT, undefined, fetch)).rejects.toThrow(
89
- `exceeded ${MAXIMUM_PUBLICATION_BYTES} bytes`,
90
- )
91
- expect(pulls).toBe(0)
92
- expect(cancelled).toBe(true)
93
- })
94
-
95
- test.each([
96
- ['invalid UTF-8', Uint8Array.of(0xc3, 0x28), TypeError],
97
- ['invalid JSON', new TextEncoder().encode('{'), SyntaxError],
98
- ['invalid Publication', new TextEncoder().encode('{}'), publication.PublicationError],
99
- ] as const)('rejects %s before returning a Publication', async (_label, bytes, Cause) => {
100
- const fetch = async (): Promise<Response> => new Response(bytes)
101
- const error = await rejection(fetchDomainPublication(ROOT, undefined, fetch))
102
-
103
- expect(error.message).toBe(`GET ${PUBLICATION_URL} returned an invalid Domain Publication`)
104
- expect(error.cause).toBeInstanceOf(Cause)
105
- })
106
-
107
- test.each([
108
- `${ROOT}/nested`,
109
- `${ROOT}?deployment=current`,
110
- `${ROOT}#fragment`,
111
- 'https://user:secret@publication-reader.example.dev',
112
- 'ftp://publication-reader.example.dev',
113
- ])('rejects a non-origin deployment URL before fetch: %s', async (input) => {
114
- let called = false
115
- const fetch = async (): Promise<Response> => {
116
- called = true
117
- return Response.json(deployed)
118
- }
119
-
120
- await expect(fetchDomainPublication(input, undefined, fetch)).rejects.toBeInstanceOf(TypeError)
121
- expect(called).toBe(false)
122
- })
123
- })
124
-
125
- async function rejection(input: Promise<unknown>): Promise<Error> {
126
- try {
127
- await input
128
- } catch (cause) {
129
- if (cause instanceof Error) return cause
130
- throw new Error('Expected an Error rejection.', { cause })
131
- }
132
- throw new Error('Expected the promise to reject.')
133
- }
@@ -1,22 +0,0 @@
1
- import { describe, expect, test } from 'bun:test'
2
-
3
- import { formatElapsed } from '../format'
4
-
5
- describe('formatElapsed', () => {
6
- test('formats milliseconds under 1s', () => {
7
- expect(formatElapsed(50)).toBe('50ms')
8
- expect(formatElapsed(999)).toBe('999ms')
9
- expect(formatElapsed(0)).toBe('0ms')
10
- })
11
-
12
- test('rounds fractional ms', () => {
13
- expect(formatElapsed(50.7)).toBe('51ms')
14
- expect(formatElapsed(0.4)).toBe('0ms')
15
- })
16
-
17
- test('formats seconds at 1000ms+', () => {
18
- expect(formatElapsed(1000)).toBe('1.00s')
19
- expect(formatElapsed(1500)).toBe('1.50s')
20
- expect(formatElapsed(12345)).toBe('12.35s')
21
- })
22
- })
@@ -1,53 +0,0 @@
1
- /**
2
- * Subprocess driver for idp-session.test.ts. `ensureFreshSession` resolves
3
- * paths through the import-time ASTRALE_HOME singleton, and `bun test` shares
4
- * one process across files, so session-touching scenarios run here — in a
5
- * fresh process whose ASTRALE_HOME the test controls.
6
- *
7
- * Usage: bun idp-session.driver.ts <ensure|ensure-concurrent>
8
- * Env: ASTRALE_HOME (required), DRIVER_AUDIENCE, DRIVER_ORG_ID
9
- * Stdout: one JSON line describing the outcome.
10
- */
11
- import { accessTokenForAudience, classifyRefreshFailure } from '../idp'
12
- import { ensureFreshSession } from '../idp-session'
13
-
14
- const scenario = process.argv[2]
15
- const audience = process.env.DRIVER_AUDIENCE || undefined
16
- let orgHintCalls = 0
17
- const resolveOrganizationId = async (): Promise<string | undefined> => {
18
- orgHintCalls += 1
19
- return process.env.DRIVER_ORG_ID || undefined
20
- }
21
-
22
- function print(result: Record<string, unknown>): void {
23
- process.stdout.write(JSON.stringify(result) + '\n')
24
- }
25
-
26
- try {
27
- if (scenario === 'ensure') {
28
- const session = await ensureFreshSession('alice', { audience, resolveOrganizationId })
29
- print({ ok: true, token: accessTokenForAudience(session, audience), orgHintCalls })
30
- } else if (scenario === 'ensure-concurrent') {
31
- const [a, b] = await Promise.all([
32
- ensureFreshSession('alice', { audience, resolveOrganizationId }),
33
- ensureFreshSession('alice', { audience, resolveOrganizationId }),
34
- ])
35
- print({
36
- ok: true,
37
- tokens: [accessTokenForAudience(a, audience), accessTokenForAudience(b, audience)],
38
- orgHintCalls,
39
- })
40
- } else {
41
- throw new Error(`Unknown scenario: ${scenario}`)
42
- }
43
- } catch (e) {
44
- const error = e as Error & { code?: string }
45
- print({
46
- ok: false,
47
- errorName: error.name,
48
- errorCode: error.code,
49
- classification: classifyRefreshFailure(e),
50
- message: error.message,
51
- orgHintCalls,
52
- })
53
- }
@@ -1,379 +0,0 @@
1
- import { afterEach, beforeEach, describe, expect, test } from 'bun:test'
2
- import { mkdir, mkdtemp, readFile, readdir, rm, unlink, writeFile } from 'node:fs/promises'
3
- import { tmpdir } from 'node:os'
4
- import { join } from 'node:path'
5
-
6
- const AUD = 'https://kernel.example.com'
7
-
8
- let tmp: string
9
-
10
- beforeEach(async () => {
11
- tmp = await mkdtemp(join(tmpdir(), 'astrale-idp-session-'))
12
- await mkdir(join(tmp, 'idp-sessions'), { recursive: true })
13
- })
14
-
15
- afterEach(async () => {
16
- await rm(tmp, { recursive: true, force: true })
17
- })
18
-
19
- describe('ensureFreshSession', () => {
20
- test('returns a fresh session without touching the IdP or the org hint', async () => {
21
- const server = rotationServer()
22
- try {
23
- await writeIdpConfig(server.url)
24
- await writeSession({ expires_at: future() })
25
-
26
- const result = await runDriver('ensure')
27
-
28
- expect(result.ok).toBe(true)
29
- expect(result.orgHintCalls).toBe(0)
30
- expect(server.refreshCount()).toBe(0)
31
- } finally {
32
- await server.stop()
33
- }
34
- })
35
-
36
- test('serves an instance flip from the per-audience map without a refresh', async () => {
37
- const server = rotationServer()
38
- try {
39
- await writeIdpConfig(server.url)
40
- await writeSession({
41
- access_token: unsignedJwt({ aud: 'https://other.example.com', exp: futureEpoch() }),
42
- expires_at: future(),
43
- tokens: {
44
- [AUD]: { access_token: 'cached-for-kernel', expires_at: future() },
45
- },
46
- })
47
-
48
- const result = await runDriver('ensure', { DRIVER_AUDIENCE: AUD })
49
-
50
- expect(result.ok).toBe(true)
51
- expect(result.token).toBe('cached-for-kernel')
52
- expect(result.orgHintCalls).toBe(0)
53
- expect(server.refreshCount()).toBe(0)
54
- } finally {
55
- await server.stop()
56
- }
57
- })
58
-
59
- test('refreshes an expired session, rotating the refresh token and caching by audience', async () => {
60
- const server = rotationServer()
61
- try {
62
- await writeIdpConfig(server.url)
63
- await writeSession({ expires_at: past() })
64
-
65
- const result = await runDriver('ensure', { DRIVER_AUDIENCE: AUD, DRIVER_ORG_ID: 'org_1' })
66
-
67
- expect(result.ok).toBe(true)
68
- expect(result.orgHintCalls).toBe(1)
69
- expect(server.refreshCount()).toBe(1)
70
- const session = await readSession()
71
- expect(session.clientId).toBe('c_1')
72
- expect(session.refresh_token).toBe('rt-1')
73
- expect((session.tokens as Record<string, { access_token: string }>)[AUD].access_token).toBe(
74
- result.token as string,
75
- )
76
- expect(server.lastOrganizationId()).toBe('org_1')
77
- expect(server.lastClientId()).toBe('c_1')
78
- } finally {
79
- await server.stop()
80
- }
81
- })
82
-
83
- test('refreshes with the client that issued the session instead of the IdP default', async () => {
84
- const server = rotationServer()
85
- try {
86
- await writeIdpConfig(server.url)
87
- await writeSession({ clientId: 'c_session', expires_at: past() })
88
-
89
- const result = await runDriver('ensure', { DRIVER_AUDIENCE: AUD })
90
-
91
- expect(result.ok).toBe(true)
92
- expect(server.lastClientId()).toBe('c_session')
93
- expect((await readSession()).clientId).toBe('c_session')
94
- } finally {
95
- await server.stop()
96
- }
97
- })
98
-
99
- test('two concurrent callers in one process perform exactly one refresh', async () => {
100
- const server = rotationServer({ delayMs: 50 })
101
- try {
102
- await writeIdpConfig(server.url)
103
- await writeSession({ expires_at: past() })
104
-
105
- const result = await runDriver('ensure-concurrent')
106
-
107
- expect(result.ok).toBe(true)
108
- const [a, b] = result.tokens as [string, string]
109
- expect(a).toBe(b)
110
- expect(server.refreshCount()).toBe(1)
111
- } finally {
112
- await server.stop()
113
- }
114
- })
115
-
116
- test('two concurrent PROCESSES perform exactly one refresh (single-use token survives)', async () => {
117
- const server = rotationServer({ delayMs: 50 })
118
- try {
119
- await writeIdpConfig(server.url)
120
- await writeSession({ expires_at: past() })
121
-
122
- const [a, b] = await Promise.all([runDriver('ensure'), runDriver('ensure')])
123
-
124
- expect(a.ok).toBe(true)
125
- expect(b.ok).toBe(true)
126
- expect(a.token).toBe(b.token)
127
- expect(server.refreshCount()).toBe(1)
128
- expect(await lockFilesLeft()).toEqual([])
129
- } finally {
130
- await server.stop()
131
- }
132
- })
133
-
134
- test('rescues an invalid_grant raced by a non-locking winner that saved a rotated session', async () => {
135
- const winnerToken = unsignedJwt({ aud: AUD, exp: futureEpoch() })
136
- const server = rotationServer({
137
- beforeRespond: async () => {
138
- // Simulate an old, non-locking CLI that already exchanged the token
139
- // and persisted the rotated session before our request landed.
140
- await writeSession({
141
- access_token: winnerToken,
142
- expires_at: future(),
143
- refresh_token: 'rt-winner',
144
- updatedAt: new Date(Date.now() + 1000).toISOString(),
145
- })
146
- return Response.json(
147
- { error: 'invalid_grant', error_description: 'Refresh token already exchanged.' },
148
- { status: 400 },
149
- )
150
- },
151
- })
152
- try {
153
- await writeIdpConfig(server.url)
154
- await writeSession({ expires_at: past() })
155
-
156
- const result = await runDriver('ensure')
157
-
158
- expect(result.ok).toBe(true)
159
- expect(result.token).toBe(winnerToken)
160
- } finally {
161
- await server.stop()
162
- }
163
- })
164
-
165
- test('reports a missing session when it is deleted while waiting for the lock', async () => {
166
- const server = rotationServer()
167
- try {
168
- await writeIdpConfig(server.url)
169
- await writeSession({ expires_at: past() })
170
- const lockPath = join(tmp, 'idp-sessions', 'alice.json.lock')
171
- await writeFile(lockPath, JSON.stringify({ pid: process.pid }))
172
-
173
- const pending = runDriver('ensure')
174
- await new Promise((r) => setTimeout(r, 300))
175
- await unlink(join(tmp, 'idp-sessions', 'alice.json'))
176
- await unlink(lockPath)
177
- const result = await pending
178
-
179
- expect(result.ok).toBe(false)
180
- expect(result.errorName).toBe('IdpSessionMissingError')
181
- expect(await lockFilesLeft()).toEqual([])
182
- } finally {
183
- await server.stop()
184
- }
185
- })
186
-
187
- test('classifies a dead grant as session-ended when no winner can rescue it', async () => {
188
- const server = rotationServer()
189
- try {
190
- await writeIdpConfig(server.url)
191
- await writeSession({ expires_at: past(), refresh_token: 'rt-already-burned' })
192
-
193
- const result = await runDriver('ensure')
194
-
195
- expect(result.ok).toBe(false)
196
- expect(result.errorName).toBe('OAuthTokenError')
197
- expect(result.errorCode).toBe('invalid_grant')
198
- expect(result.classification).toBe('session-ended')
199
- } finally {
200
- await server.stop()
201
- }
202
- })
203
-
204
- test('classifies an IdP 503 as transient', async () => {
205
- const server = rotationServer({
206
- beforeRespond: async () =>
207
- Response.json({ error_description: 'upstream unavailable' }, { status: 503 }),
208
- })
209
- try {
210
- await writeIdpConfig(server.url)
211
- await writeSession({ expires_at: past() })
212
-
213
- const result = await runDriver('ensure')
214
-
215
- expect(result.ok).toBe(false)
216
- expect(result.classification).toBe('transient')
217
- } finally {
218
- await server.stop()
219
- }
220
- })
221
-
222
- test('classifies an unreachable IdP as transient', async () => {
223
- const server = rotationServer()
224
- await server.stop()
225
- await writeIdpConfig(server.url)
226
- await writeSession({ expires_at: past() })
227
-
228
- const result = await runDriver('ensure')
229
-
230
- expect(result.ok).toBe(false)
231
- expect(result.classification).toBe('transient')
232
- })
233
- })
234
-
235
- // --- fixtures -------------------------------------------------------------
236
-
237
- async function writeIdpConfig(baseUrl: string): Promise<void> {
238
- await mkdir(join(tmp, 'idps', 'test'), { recursive: true })
239
- await writeFile(
240
- join(tmp, 'idps', 'index.json'),
241
- JSON.stringify({
242
- idps: {
243
- test: {
244
- issuer: baseUrl,
245
- createdAt: '2026-01-01T00:00:00.000Z',
246
- updatedAt: '2026-01-01T00:00:00.000Z',
247
- },
248
- },
249
- }),
250
- )
251
- await writeFile(
252
- join(tmp, 'idps', 'test', 'metadata.json'),
253
- JSON.stringify({
254
- issuer: baseUrl,
255
- token_endpoint: `${baseUrl}/token`,
256
- jwks_uri: `${baseUrl}/jwks`,
257
- }),
258
- )
259
- await writeFile(join(tmp, 'idps', 'test', 'client.json'), JSON.stringify({ client_id: 'c_1' }))
260
- }
261
-
262
- async function writeSession(overrides: Record<string, unknown>): Promise<void> {
263
- await writeFile(
264
- join(tmp, 'idp-sessions', 'alice.json'),
265
- JSON.stringify({
266
- identity: 'alice',
267
- idp: 'test',
268
- issuer: 'https://idp.example.com',
269
- subject: 'user_123',
270
- access_token: 'expired-access-token',
271
- refresh_token: 'rt-0',
272
- token_type: 'Bearer',
273
- updatedAt: '2026-01-01T00:00:00.000Z',
274
- ...overrides,
275
- }),
276
- )
277
- }
278
-
279
- async function readSession(): Promise<Record<string, unknown>> {
280
- return JSON.parse(await readFile(join(tmp, 'idp-sessions', 'alice.json'), 'utf-8'))
281
- }
282
-
283
- async function lockFilesLeft(): Promise<string[]> {
284
- const entries = await readdir(join(tmp, 'idp-sessions'))
285
- return entries.filter((e) => e.endsWith('.lock') || e.endsWith('.tmp'))
286
- }
287
-
288
- function rotationServer(opts?: {
289
- delayMs?: number
290
- beforeRespond?: () => Promise<Response | undefined>
291
- }): {
292
- url: string
293
- refreshCount: () => number
294
- lastClientId: () => string | undefined
295
- lastOrganizationId: () => string | undefined
296
- stop: () => Promise<void>
297
- } {
298
- // WorkOS-style single-use rotation: presenting anything but the CURRENT
299
- // refresh token is invalid_grant.
300
- let current = 'rt-0'
301
- let count = 0
302
- let lastClientId: string | undefined
303
- let lastOrgId: string | undefined
304
- const server = Bun.serve({
305
- port: 0,
306
- fetch: async (request) => {
307
- const url = new URL(request.url)
308
- if (url.pathname !== '/token') return new Response('not found', { status: 404 })
309
- const form = new URLSearchParams(await request.text())
310
- if (opts?.beforeRespond) {
311
- const response = await opts.beforeRespond()
312
- if (response) return response
313
- }
314
- if (form.get('refresh_token') !== current) {
315
- return Response.json(
316
- { error: 'invalid_grant', error_description: 'Refresh token already exchanged.' },
317
- { status: 400 },
318
- )
319
- }
320
- if (opts?.delayMs) await new Promise((r) => setTimeout(r, opts.delayMs))
321
- count += 1
322
- current = `rt-${count}`
323
- lastClientId = form.get('client_id') ?? undefined
324
- lastOrgId = form.get('organization_id') ?? undefined
325
- return Response.json({
326
- access_token: unsignedJwt({ aud: AUD, exp: futureEpoch() }),
327
- refresh_token: current,
328
- token_type: 'Bearer',
329
- expires_in: 3600,
330
- })
331
- },
332
- })
333
- return {
334
- url: `http://${server.hostname}:${server.port}`,
335
- refreshCount: () => count,
336
- lastClientId: () => lastClientId,
337
- lastOrganizationId: () => lastOrgId,
338
- stop: () => server.stop(true),
339
- }
340
- }
341
-
342
- async function runDriver(
343
- scenario: string,
344
- env: Record<string, string> = {},
345
- ): Promise<Record<string, unknown> & { tokens?: unknown }> {
346
- const proc = Bun.spawn({
347
- cmd: ['bun', join(import.meta.dir, 'idp-session.driver.ts'), scenario],
348
- env: { ...process.env, ASTRALE_HOME: tmp, ...env },
349
- stdout: 'pipe',
350
- stderr: 'pipe',
351
- })
352
- const [stdout, stderr, exitCode] = await Promise.all([
353
- new Response(proc.stdout).text(),
354
- new Response(proc.stderr).text(),
355
- proc.exited,
356
- ])
357
- if (exitCode !== 0) throw new Error(`driver exited ${exitCode}: ${stderr}`)
358
- return JSON.parse(stdout.trim().split('\n').at(-1) ?? '{}')
359
- }
360
-
361
- function unsignedJwt(payload: Record<string, unknown>): string {
362
- return [base64url({ alg: 'none', typ: 'JWT' }), base64url(payload), ''].join('.')
363
- }
364
-
365
- function base64url(value: Record<string, unknown>): string {
366
- return Buffer.from(JSON.stringify(value)).toString('base64url')
367
- }
368
-
369
- function future(): string {
370
- return new Date(Date.now() + 3_600_000).toISOString()
371
- }
372
-
373
- function futureEpoch(): number {
374
- return Math.floor(Date.now() / 1000) + 3600
375
- }
376
-
377
- function past(): string {
378
- return new Date(Date.now() - 3_600_000).toISOString()
379
- }