@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,55 +0,0 @@
1
- /** Context-document HTTP transport, including multipart uploads and raw bodies. */
2
- import {
3
- addDocument,
4
- deleteDocument,
5
- listDocuments,
6
- readDocument,
7
- updateDocument,
8
- } from '../state/documents'
9
- import { json, notFound, type DomainRouteContext } from './http'
10
-
11
- /** Routes that must run before POST bodies are parsed as JSON. */
12
- export async function handleDocumentTransport(
13
- req: Request,
14
- rest: string,
15
- root: string,
16
- ): Promise<Response | null> {
17
- if (rest === '/context/documents' && req.method === 'GET') return json(listDocuments(root))
18
- if (rest === '/context/documents' && req.method === 'POST') {
19
- const form = await req.formData()
20
- const added = []
21
- for (const value of form.getAll('files')) {
22
- if (value instanceof File) {
23
- added.push(
24
- addDocument(root, value.name, value.type, new Uint8Array(await value.arrayBuffer())),
25
- )
26
- }
27
- }
28
- return json(added)
29
- }
30
-
31
- const raw = rest.match(/^\/context\/documents\/([^/]+)\/raw$/)
32
- if (raw && req.method === 'GET') {
33
- const document = readDocument(root, decodeURIComponent(raw[1]))
34
- if (!document) return notFound()
35
- return new Response(Bun.file(document.abs), {
36
- headers: { 'content-type': document.meta.type },
37
- })
38
- }
39
-
40
- return null
41
- }
42
-
43
- /** JSON document mutations dispatched with the rest of the domain routes. */
44
- export function handleDocumentMutation(context: DomainRouteContext): Response | null {
45
- const { req, rest, body, handle } = context
46
- const root = handle.root
47
- if (rest === '/context/documents/delete' && req.method === 'POST') {
48
- return json({ ok: deleteDocument(root, body.id) })
49
- }
50
- if (rest === '/context/documents/update' && req.method === 'POST') {
51
- const meta = updateDocument(root, body.id, new TextEncoder().encode(String(body.content ?? '')))
52
- return meta ? json(meta) : notFound()
53
- }
54
- return null
55
- }
@@ -1,59 +0,0 @@
1
- import type { DomainHandle } from '../domain'
2
- import type { DomainRouteContext, Notify } from './http'
3
-
4
- /** Domain-scoped route composition and the multipart/JSON body boundary. */
5
- import { handleAgentRoute } from '../agent/routes'
6
- import { handleCanvasRoute } from './canvas'
7
- import { handleCommentRoute } from './comments'
8
- import { handleContextRoute } from './context'
9
- import { handleDeploymentRoute } from './deployment'
10
- import { handleDocumentMutation, handleDocumentTransport } from './documents'
11
- import { notFound } from './http'
12
- import { handleProjectRoute } from './project'
13
- import { handleSchemaRoute } from './schema'
14
- import { handleViewRoute } from './views'
15
-
16
- export async function handleDomainRoute(input: {
17
- req: Request
18
- url: URL
19
- rest: string
20
- handle: DomainHandle
21
- notify: Notify
22
- }): Promise<Response> {
23
- const { req, url, rest, handle, notify } = input
24
-
25
- const documentTransport = await handleDocumentTransport(req, rest, handle.root)
26
- if (documentTransport) return documentTransport
27
-
28
- const body = req.method === 'POST' ? await req.json().catch(() => ({})) : {}
29
- const context: DomainRouteContext = { req, url, rest, body, handle, notify }
30
-
31
- const documentMutation = handleDocumentMutation(context)
32
- if (documentMutation) return documentMutation
33
-
34
- const schema = await handleSchemaRoute(context)
35
- if (schema) return schema
36
-
37
- const deployment = await handleDeploymentRoute(context)
38
- if (deployment) return deployment
39
-
40
- const view = await handleViewRoute(context)
41
- if (view) return view
42
-
43
- const comment = await handleCommentRoute(context)
44
- if (comment) return comment
45
-
46
- const agent = await handleAgentRoute({ req, url, rest, body, handle, notify })
47
- if (agent) return agent
48
-
49
- const contextResponse = await handleContextRoute(context)
50
- if (contextResponse) return contextResponse
51
-
52
- const project = await handleProjectRoute(context)
53
- if (project) return project
54
-
55
- const canvas = await handleCanvasRoute(context)
56
- if (canvas) return canvas
57
-
58
- return notFound()
59
- }
@@ -1,45 +0,0 @@
1
- /** Internal HTTP contract shared by Studio API route modules. */
2
- import type { StudioEvent } from '../../shared/types'
3
- import type { DomainHandle } from '../domain'
4
-
5
- export type Notify = (event: StudioEvent) => void
6
-
7
- export interface DomainRouteContext {
8
- req: Request
9
- url: URL
10
- rest: string
11
- body: any
12
- handle: DomainHandle
13
- notify: Notify
14
- }
15
-
16
- export function json(data: unknown, status = 200): Response {
17
- return new Response(JSON.stringify(data), {
18
- status,
19
- headers: { 'content-type': 'application/json' },
20
- })
21
- }
22
-
23
- export const notFound = () => json({ error: 'not found' }, 404)
24
- export const badRequest = (message: string) => json({ error: message }, 400)
25
-
26
- /**
27
- * Block cross-site state-changing requests. Same-origin browser requests and
28
- * non-browser clients without Origin/Sec-Fetch-Site remain allowed.
29
- */
30
- export function crossSiteBlocked(req: Request, url: URL): boolean {
31
- if (req.method === 'GET' || req.method === 'HEAD') return false
32
- const site = req.headers.get('sec-fetch-site')
33
- if (site) return !(site === 'same-origin' || site === 'none')
34
- const origin = req.headers.get('origin')
35
- if (origin) {
36
- try {
37
- // Same-origin includes the scheme as well as host and effective port.
38
- // Comparing only `host` would accept an HTTPS origin for an HTTP Studio.
39
- return new URL(origin).origin !== url.origin
40
- } catch {
41
- return true
42
- }
43
- }
44
- return false
45
- }
@@ -1,57 +0,0 @@
1
- /** Domain project configuration routes: integrations, settings, and env files. */
2
- import { getAnatomy, invalidate } from '../cache'
3
- import { isEnvName, readEnvModel, writeEnvUpdates } from '../environment/files'
4
- import { deleteIntegration, readIntegrations, upsertIntegration } from '../state/integrations'
5
- import { readSettings, updateSettings } from '../state/settings'
6
- import { badRequest, json, type DomainRouteContext } from './http'
7
-
8
- export async function handleProjectRoute(context: DomainRouteContext): Promise<Response | null> {
9
- const { req, url, rest, body, handle, notify } = context
10
- const id = handle.id
11
- const root = handle.root
12
-
13
- if (rest === '/integrations') {
14
- const detected = (await getAnatomy(id))?.detectedIntegrations ?? []
15
- if (req.method === 'GET') return json(readIntegrations(root, detected))
16
- if (body.action === 'upsert') return json(upsertIntegration(root, body))
17
- if (body.action === 'delete') return json({ ok: deleteIntegration(root, body.id) })
18
- return badRequest('unknown integrations action')
19
- }
20
-
21
- if (rest === '/settings') {
22
- if (req.method === 'GET') return json(readSettings(root))
23
- if (body.action === 'update') {
24
- const next = updateSettings(root, body.settings ?? {})
25
- invalidate(id, 'anatomy')
26
- notify({ type: 'anatomy-diff', domainId: id })
27
- return json(next)
28
- }
29
- return badRequest('unknown settings action')
30
- }
31
-
32
- if (rest === '/env') {
33
- const envName = req.method === 'GET' ? url.searchParams.get('env') : body.env
34
- if (!isEnvName(envName)) return badRequest('env must be "dev" or "prod"')
35
- if (req.method === 'GET') return json(readEnvModel(root, envName))
36
- if (req.method === 'POST') {
37
- if (!body.updates || typeof body.updates !== 'object') {
38
- return badRequest('updates object required')
39
- }
40
- const updates: Record<string, string | null> = {}
41
- for (const [key, value] of Object.entries(body.updates as Record<string, unknown>)) {
42
- if (!/^[A-Za-z_]\w*$/.test(key)) continue
43
- updates[key] = value === null ? null : String(value)
44
- }
45
- try {
46
- const model = writeEnvUpdates(root, envName, updates)
47
- notify({ type: 'anatomy-diff', domainId: id })
48
- return json(model)
49
- } catch (error: any) {
50
- return badRequest(String(error?.message ?? error))
51
- }
52
- }
53
- return badRequest('GET or POST')
54
- }
55
-
56
- return null
57
- }
@@ -1,12 +0,0 @@
1
- /** Canonical schema, anatomy, and genesis inspection routes. */
2
- import { getAnatomy, getBundle, getCore } from '../cache'
3
- import { json, type DomainRouteContext } from './http'
4
-
5
- export async function handleSchemaRoute(context: DomainRouteContext): Promise<Response | null> {
6
- const { rest, url, handle } = context
7
- const fresh = url.searchParams.has('fresh')
8
- if (rest === '/bundle') return json(await getBundle(handle.id, fresh))
9
- if (rest === '/anatomy') return json(await getAnatomy(handle.id, fresh))
10
- if (rest === '/core') return json(await getCore(handle.id, fresh))
11
- return null
12
- }
@@ -1,57 +0,0 @@
1
- /** CLI-resolved View target discovery and Shell session routes. */
2
- import { getAnatomy, getBundle } from '../cache'
3
- import { readSettings } from '../state/settings'
4
- import { getViewRuntime } from '../views/runtime'
5
- import { closeViewSession, launchViewSession } from '../views/session'
6
- import { badRequest, json, notFound, type DomainRouteContext } from './http'
7
-
8
- const VALID_SLUG = /^[a-z][a-z0-9-]*$/
9
-
10
- export async function handleViewRoute(context: DomainRouteContext): Promise<Response | null> {
11
- const { req, rest, body, handle } = context
12
- const id = handle.id
13
- const root = handle.root
14
-
15
- if (rest === '/views/sessions/close' && req.method === 'POST') {
16
- return json(await closeViewSession(String(body.sessionId ?? '')))
17
- }
18
-
19
- const runtimeMatch = rest.match(/^\/views\/([^/]+)\/runtime$/)
20
- if (runtimeMatch && req.method === 'GET') {
21
- const slug = decodeURIComponent(runtimeMatch[1])
22
- if (!VALID_SLUG.test(slug)) return badRequest('invalid view slug')
23
- const anatomy = await getAnatomy(id)
24
- const view = anatomy?.views.find((candidate) => candidate.slug === slug)
25
- if (!view) return notFound()
26
- const bundle = await getBundle(id)
27
- const origin = bundle?.overlay.origin || anatomy?.overview.origin
28
- if (!origin) return badRequest('domain origin is unavailable')
29
- return json(
30
- await getViewRuntime(root, origin, view, bundle, readSettings(root).viewProbeTimeoutMs),
31
- )
32
- }
33
-
34
- const sessionMatch = rest.match(/^\/views\/([^/]+)\/session$/)
35
- if (sessionMatch && req.method === 'POST') {
36
- const slug = decodeURIComponent(sessionMatch[1])
37
- if (!VALID_SLUG.test(slug)) return badRequest('invalid view slug')
38
- const anatomy = await getAnatomy(id)
39
- const view = anatomy?.views.find((candidate) => candidate.slug === slug)
40
- if (!view) return notFound()
41
- const bundle = await getBundle(id)
42
- const origin = bundle?.overlay.origin || anatomy?.overview.origin
43
- if (!origin) return badRequest('domain origin is unavailable')
44
- return json(
45
- await launchViewSession(
46
- root,
47
- origin,
48
- view,
49
- bundle,
50
- body,
51
- readSettings(root).viewProbeTimeoutMs,
52
- ),
53
- )
54
- }
55
-
56
- return null
57
- }
@@ -1,60 +0,0 @@
1
- /** Workspace-wide routes that do not require a DomainHandle. */
2
- import { getBundle } from '../cache'
3
- import { allDomains, depsInstalled } from '../domain'
4
- import { activeInstanceName, listInstances, setActiveInstance } from '../instances/active'
5
- import { buildCatalog } from '../workspace/catalog'
6
- import { createDomain } from '../workspace/create'
7
- import { detectGit } from '../workspace/git'
8
- import { badRequest, json, type Notify } from './http'
9
-
10
- export async function handleWorkspaceRoute(
11
- req: Request,
12
- path: string,
13
- notify: Notify,
14
- ): Promise<Response | null> {
15
- if (path === '/api/workspace') {
16
- const domains = await Promise.all(
17
- allDomains().map(async (handle) => {
18
- const bundle = await getBundle(handle.id)
19
- return {
20
- id: handle.id,
21
- origin: bundle?.overlay.origin || handle.origin || handle.id,
22
- path: handle.root,
23
- schemaDir: handle.schemaDirName,
24
- depsInstalled: depsInstalled(handle.root),
25
- hasGit: detectGit(handle.root).hasGit,
26
- configFile: handle.configFile,
27
- }
28
- }),
29
- )
30
- return json(domains)
31
- }
32
-
33
- if (path === '/api/workspace/create' && req.method === 'POST') {
34
- const body = await req.json().catch(() => ({}))
35
- const result = await createDomain(String(body.name ?? ''), await activeInstanceName())
36
- if (result.ok) notify({ type: 'workspace', domains: allDomains().map((domain) => domain.id) })
37
- return json(result)
38
- }
39
-
40
- if (path === '/api/catalog') {
41
- return json(
42
- buildCatalog(
43
- allDomains().map((handle) => ({
44
- origin: handle.origin ?? handle.id,
45
- id: handle.id,
46
- })),
47
- ),
48
- )
49
- }
50
-
51
- if (path === '/api/instances' && req.method === 'GET') return json(await listInstances())
52
- if (path === '/api/instances/use' && req.method === 'POST') {
53
- const body = await req.json().catch(() => ({}))
54
- const name = String(body.name ?? '').trim()
55
- if (!name) return badRequest('name is required')
56
- return json(await setActiveInstance(name))
57
- }
58
-
59
- return null
60
- }
@@ -1,69 +0,0 @@
1
- import { afterEach, expect, test } from 'bun:test'
2
- import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
3
- import { tmpdir } from 'node:os'
4
- import { join } from 'node:path'
5
-
6
- import { setHarnessGateway } from './agent/harness/gateway/config'
7
- import { getHarness } from './agent/harness/selection'
8
- import { handleApi } from './api'
9
- import { registerDomain, unregisterDomain } from './domain'
10
-
11
- const roots: string[] = []
12
- const domainIds: string[] = []
13
- const originalHarness = process.env.DOMAIN_STUDIO_HARNESS
14
- let restoreLoadout: (() => void) | undefined
15
-
16
- afterEach(() => {
17
- restoreLoadout?.()
18
- restoreLoadout = undefined
19
- if (originalHarness === undefined) delete process.env.DOMAIN_STUDIO_HARNESS
20
- else process.env.DOMAIN_STUDIO_HARNESS = originalHarness
21
- while (domainIds.length) unregisterDomain(domainIds.pop()!)
22
- while (roots.length) rmSync(roots.pop()!, { recursive: true, force: true })
23
- })
24
-
25
- test('loadout fails closed instead of probing ambient Claude when gateway auth fails', async () => {
26
- const root = mkdtempSync(join(tmpdir(), 'studio-loadout-gateway-'))
27
- roots.push(root)
28
- mkdirSync(join(root, 'schema'))
29
- writeFileSync(join(root, 'astrale.config.ts'), 'export default {}\n')
30
- writeFileSync(join(root, 'application.ts'), 'export default {}\n')
31
- writeFileSync(join(root, 'schema/index.ts'), 'export const Test = {}\n')
32
- const handle = registerDomain(root)!
33
- domainIds.push(handle.id)
34
-
35
- process.env.DOMAIN_STUDIO_HARNESS = 'claude'
36
- const harness = getHarness(root)
37
- const originalLoadout = harness.loadout
38
- let probes = 0
39
- harness.loadout = async () => {
40
- probes += 1
41
- throw new Error('ambient Claude must not be probed')
42
- }
43
- restoreLoadout = () => {
44
- harness.loadout = originalLoadout
45
- }
46
- setHarnessGateway(root, {
47
- scope: 'domain',
48
- config: {
49
- enabled: true,
50
- baseUrl: 'https://gateway.example/v1/models/test',
51
- auth: { mode: 'host' },
52
- },
53
- })
54
-
55
- const url = new URL(`http://127.0.0.1/api/domain/${encodeURIComponent(handle.id)}/agent/loadout`)
56
- const response = await handleApi(new Request(url), url, () => {})
57
- expect(response?.status).toBe(200)
58
- const body = await response!.json()
59
- expect(body).toMatchObject({
60
- ok: false,
61
- tools: [],
62
- mcpServers: [],
63
- skills: [],
64
- agents: [],
65
- })
66
- expect(body.detail).toContain('model gateway auth failed')
67
- expect(body.detail).toContain('no valid host-supplied token')
68
- expect(probes).toBe(0)
69
- })
@@ -1,147 +0,0 @@
1
- import { afterEach, expect, test } from 'bun:test'
2
- import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
3
- import { tmpdir } from 'node:os'
4
- import { join } from 'node:path'
5
-
6
- import { handleApi } from './api'
7
- import { registerDomain, unregisterDomain } from './domain'
8
-
9
- const roots: string[] = []
10
- const domainIds: string[] = []
11
-
12
- afterEach(() => {
13
- while (domainIds.length) unregisterDomain(domainIds.pop()!)
14
- while (roots.length) rmSync(roots.pop()!, { recursive: true, force: true })
15
- })
16
-
17
- function fixture() {
18
- const root = mkdtempSync(join(tmpdir(), 'studio-api-contract-'))
19
- roots.push(root)
20
- mkdirSync(join(root, 'schema'))
21
- writeFileSync(join(root, 'astrale.config.ts'), 'export default {}\n')
22
- writeFileSync(join(root, 'application.ts'), 'export default {}\n')
23
- writeFileSync(join(root, 'schema/index.ts'), 'export const Test = {}\n')
24
- const handle = registerDomain(root)!
25
- domainIds.push(handle.id)
26
- return handle
27
- }
28
-
29
- async function route(path: string, init?: RequestInit) {
30
- const url = new URL(`http://127.0.0.1${path}`)
31
- return handleApi(new Request(url, init), url, () => {})
32
- }
33
-
34
- test('router ignores non-api paths and returns the stable JSON 404 for unknown API paths', async () => {
35
- expect(await route('/assets/app.js')).toBeNull()
36
-
37
- const response = await route('/api/unknown')
38
- expect(response?.status).toBe(404)
39
- expect(response?.headers.get('content-type')).toBe('application/json')
40
- expect(await response?.json()).toEqual({ error: 'not found' })
41
- })
42
-
43
- test('router blocks cross-site mutations before route dispatch but permits same-origin requests', async () => {
44
- const blocked = await route('/api/unknown', {
45
- method: 'POST',
46
- headers: { origin: 'https://malicious.example' },
47
- })
48
- expect(blocked?.status).toBe(403)
49
- expect(await blocked?.json()).toEqual({ error: 'cross-site request blocked' })
50
-
51
- const sameOrigin = await route('/api/unknown', {
52
- method: 'POST',
53
- headers: { origin: 'http://127.0.0.1' },
54
- })
55
- expect(sameOrigin?.status).toBe(404)
56
- })
57
-
58
- test('cross-site protection compares the complete origin and leaves mutation state unchanged', async () => {
59
- const handle = fixture()
60
- const contextPath = `/api/domain/${encodeURIComponent(handle.id)}/context`
61
- const mutation = {
62
- method: 'POST',
63
- headers: {
64
- 'content-type': 'application/json',
65
- // The host matches Studio, but the scheme does not: this is not same-origin.
66
- origin: 'https://127.0.0.1',
67
- },
68
- body: JSON.stringify({ action: 'add', title: 'Injected', body: 'Must not persist' }),
69
- }
70
-
71
- const blocked = await route(contextPath, mutation)
72
- expect(blocked?.status).toBe(403)
73
- expect(await blocked?.json()).toEqual({ error: 'cross-site request blocked' })
74
-
75
- const wrongPort = await route(contextPath, {
76
- ...mutation,
77
- headers: { ...mutation.headers, origin: 'http://127.0.0.1:3000' },
78
- })
79
- expect(wrongPort?.status).toBe(403)
80
-
81
- const unchanged = await route(contextPath)
82
- expect(await unchanged?.json()).toEqual({ user: [], auto: [] })
83
-
84
- const allowed = await route(contextPath, {
85
- ...mutation,
86
- headers: { ...mutation.headers, origin: 'http://127.0.0.1' },
87
- })
88
- expect(allowed?.status).toBe(200)
89
- const stored = (await (await route(contextPath))?.json()) as { user: unknown[] }
90
- expect(stored.user).toHaveLength(1)
91
- })
92
-
93
- test('domain dispatch preserves context success, validation, and unknown-domain responses', async () => {
94
- const handle = fixture()
95
- const base = `/api/domain/${encodeURIComponent(handle.id)}`
96
-
97
- const context = await route(`${base}/context`)
98
- expect(context?.status).toBe(200)
99
- expect(await context?.json()).toEqual({ user: [], auto: [] })
100
-
101
- const invalid = await route(`${base}/context`, {
102
- method: 'POST',
103
- headers: { 'content-type': 'application/json' },
104
- body: JSON.stringify({ action: 'invalid' }),
105
- })
106
- expect(invalid?.status).toBe(400)
107
- expect(await invalid?.json()).toEqual({ error: 'unknown context action' })
108
-
109
- const missing = await route('/api/domain/not-registered/context')
110
- expect(missing?.status).toBe(404)
111
- expect(await missing?.json()).toEqual({ error: 'not found' })
112
- })
113
-
114
- test('workspace dispatch preserves catalog responses and instance request validation', async () => {
115
- const handle = fixture()
116
-
117
- const catalog = await route('/api/catalog')
118
- expect(catalog?.status).toBe(200)
119
- const origins = (await catalog?.json()).map((entry: { origin: string }) => entry.origin)
120
- expect(origins[0]).toBe('kernel.astrale.ai')
121
- expect(origins).toContain(handle.id)
122
-
123
- const invalidInstance = await route('/api/instances/use', {
124
- method: 'POST',
125
- headers: { 'content-type': 'application/json' },
126
- body: JSON.stringify({ name: ' ' }),
127
- })
128
- expect(invalidInstance?.status).toBe(400)
129
- expect(await invalidInstance?.json()).toEqual({ error: 'name is required' })
130
- })
131
-
132
- test('multipart document upload remains ahead of JSON parsing and raw download keeps its media type', async () => {
133
- const handle = fixture()
134
- const base = `/api/domain/${encodeURIComponent(handle.id)}`
135
- const form = new FormData()
136
- form.append('files', new File(['contract body'], 'contract.txt', { type: 'text/plain' }))
137
-
138
- const uploaded = await route(`${base}/context/documents`, { method: 'POST', body: form })
139
- expect(uploaded?.status).toBe(200)
140
- const documents = (await uploaded?.json()) as Array<{ id: string; type: string }>
141
- expect(documents).toHaveLength(1)
142
-
143
- const raw = await route(`${base}/context/documents/${encodeURIComponent(documents[0]!.id)}/raw`)
144
- expect(raw?.status).toBe(200)
145
- expect(raw?.headers.get('content-type')).toBe('text/plain;charset=utf-8')
146
- expect(await raw?.text()).toBe('contract body')
147
- })
@@ -1,34 +0,0 @@
1
- /**
2
- * Studio JSON API composition root. It owns only the public `/api/` boundary,
3
- * cross-site mutation guard, workspace-vs-domain addressing, and final 404.
4
- * Capability modules under `api/` own the route implementations.
5
- */
6
- import { handleDomainRoute } from './api/domain'
7
- import { crossSiteBlocked, json, notFound, type Notify } from './api/http'
8
- import { handleWorkspaceRoute } from './api/workspace'
9
- import { getDomain } from './domain'
10
-
11
- export type { Notify } from './api/http'
12
-
13
- export async function handleApi(req: Request, url: URL, notify: Notify): Promise<Response | null> {
14
- const path = url.pathname
15
- if (!path.startsWith('/api/')) return null
16
- if (crossSiteBlocked(req, url)) return json({ error: 'cross-site request blocked' }, 403)
17
-
18
- const workspace = await handleWorkspaceRoute(req, path, notify)
19
- if (workspace) return workspace
20
-
21
- const match = path.match(/^\/api\/domain\/([^/]+)(\/.*)?$/)
22
- if (!match) return notFound()
23
- const id = decodeURIComponent(match[1])
24
- const handle = getDomain(id)
25
- if (!handle) return notFound()
26
-
27
- return handleDomainRoute({
28
- req,
29
- url,
30
- rest: match[2] ?? '',
31
- handle,
32
- notify,
33
- })
34
- }