@tai42/api-client 19.3.0 → 21.0.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 (401) hide show
  1. package/README.md +29 -0
  2. package/dist/agents.d.ts.map +1 -1
  3. package/dist/agents.js +6 -4
  4. package/dist/agents.js.map +1 -1
  5. package/dist/client/agents-client.d.ts.map +1 -1
  6. package/dist/client/agents-client.js +3 -2
  7. package/dist/client/agents-client.js.map +1 -1
  8. package/dist/client/auth-client.d.ts +143 -90
  9. package/dist/client/auth-client.d.ts.map +1 -1
  10. package/dist/client/auth-client.js +81 -25
  11. package/dist/client/auth-client.js.map +1 -1
  12. package/dist/client/backend-client.d.ts +14 -13
  13. package/dist/client/backend-client.d.ts.map +1 -1
  14. package/dist/client/backend-client.js +7 -3
  15. package/dist/client/backend-client.js.map +1 -1
  16. package/dist/client/backup-client.d.ts +45 -19
  17. package/dist/client/backup-client.d.ts.map +1 -1
  18. package/dist/client/backup-client.js +8 -3
  19. package/dist/client/backup-client.js.map +1 -1
  20. package/dist/client/capabilities-client.d.ts +20 -16
  21. package/dist/client/capabilities-client.d.ts.map +1 -1
  22. package/dist/client/capabilities-client.js +3 -2
  23. package/dist/client/capabilities-client.js.map +1 -1
  24. package/dist/client/channels-client.d.ts.map +1 -1
  25. package/dist/client/channels-client.js +2 -1
  26. package/dist/client/channels-client.js.map +1 -1
  27. package/dist/client/config-client.d.ts +44 -17
  28. package/dist/client/config-client.d.ts.map +1 -1
  29. package/dist/client/config-client.js +10 -4
  30. package/dist/client/config-client.js.map +1 -1
  31. package/dist/client/connectors-client.d.ts +270 -81
  32. package/dist/client/connectors-client.d.ts.map +1 -1
  33. package/dist/client/connectors-client.js +38 -10
  34. package/dist/client/connectors-client.js.map +1 -1
  35. package/dist/client/conversations-client.d.ts +440 -86
  36. package/dist/client/conversations-client.d.ts.map +1 -1
  37. package/dist/client/conversations-client.js +46 -17
  38. package/dist/client/conversations-client.js.map +1 -1
  39. package/dist/client/hooks-client.d.ts +3 -3
  40. package/dist/client/hooks-client.d.ts.map +1 -1
  41. package/dist/client/hooks-client.js +12 -7
  42. package/dist/client/hooks-client.js.map +1 -1
  43. package/dist/client/index.d.ts +2252 -864
  44. package/dist/client/index.d.ts.map +1 -1
  45. package/dist/client/index.js +10 -2
  46. package/dist/client/index.js.map +1 -1
  47. package/dist/client/interactions-client.d.ts +19 -14
  48. package/dist/client/interactions-client.d.ts.map +1 -1
  49. package/dist/client/interactions-client.js +21 -9
  50. package/dist/client/interactions-client.js.map +1 -1
  51. package/dist/client/login-client.d.ts +18 -17
  52. package/dist/client/login-client.d.ts.map +1 -1
  53. package/dist/client/login-client.js +8 -4
  54. package/dist/client/login-client.js.map +1 -1
  55. package/dist/client/manifest-client.d.ts +276 -105
  56. package/dist/client/manifest-client.d.ts.map +1 -1
  57. package/dist/client/manifest-client.js +22 -16
  58. package/dist/client/manifest-client.js.map +1 -1
  59. package/dist/client/marketplace-client.d.ts +181 -51
  60. package/dist/client/marketplace-client.d.ts.map +1 -1
  61. package/dist/client/marketplace-client.js +23 -12
  62. package/dist/client/marketplace-client.js.map +1 -1
  63. package/dist/client/mcp-config-schema-client.d.ts.map +1 -1
  64. package/dist/client/mcp-config-schema-client.js +2 -1
  65. package/dist/client/mcp-config-schema-client.js.map +1 -1
  66. package/dist/client/notifications-client.d.ts +44 -14
  67. package/dist/client/notifications-client.d.ts.map +1 -1
  68. package/dist/client/notifications-client.js +2 -1
  69. package/dist/client/notifications-client.js.map +1 -1
  70. package/dist/client/observability-client.d.ts +78 -38
  71. package/dist/client/observability-client.d.ts.map +1 -1
  72. package/dist/client/observability-client.js +29 -6
  73. package/dist/client/observability-client.js.map +1 -1
  74. package/dist/client/plugins-client.d.ts +8 -6
  75. package/dist/client/plugins-client.d.ts.map +1 -1
  76. package/dist/client/plugins-client.js +2 -1
  77. package/dist/client/plugins-client.js.map +1 -1
  78. package/dist/client/policy-client.d.ts +4 -4
  79. package/dist/client/policy-client.d.ts.map +1 -1
  80. package/dist/client/policy-client.js +11 -4
  81. package/dist/client/policy-client.js.map +1 -1
  82. package/dist/client/presets-client.d.ts +84 -39
  83. package/dist/client/presets-client.d.ts.map +1 -1
  84. package/dist/client/presets-client.js +25 -13
  85. package/dist/client/presets-client.js.map +1 -1
  86. package/dist/client/profiles-client.d.ts +40 -33
  87. package/dist/client/profiles-client.d.ts.map +1 -1
  88. package/dist/client/profiles-client.js +15 -10
  89. package/dist/client/profiles-client.js.map +1 -1
  90. package/dist/client/schedules-client.d.ts +21 -17
  91. package/dist/client/schedules-client.d.ts.map +1 -1
  92. package/dist/client/schedules-client.js +8 -5
  93. package/dist/client/schedules-client.js.map +1 -1
  94. package/dist/client/settings-schema-client.d.ts +1 -1
  95. package/dist/client/settings-schema-client.d.ts.map +1 -1
  96. package/dist/client/settings-schema-client.js +2 -1
  97. package/dist/client/settings-schema-client.js.map +1 -1
  98. package/dist/client/states-client.d.ts +215 -87
  99. package/dist/client/states-client.d.ts.map +1 -1
  100. package/dist/client/states-client.js +98 -37
  101. package/dist/client/states-client.js.map +1 -1
  102. package/dist/client/storage-client.d.ts +5 -5
  103. package/dist/client/storage-client.d.ts.map +1 -1
  104. package/dist/client/storage-client.js +24 -12
  105. package/dist/client/storage-client.js.map +1 -1
  106. package/dist/client/sub-mcp-client.d.ts +3 -1
  107. package/dist/client/sub-mcp-client.d.ts.map +1 -1
  108. package/dist/client/sub-mcp-client.js +9 -4
  109. package/dist/client/sub-mcp-client.js.map +1 -1
  110. package/dist/client/system-client.d.ts +2 -2
  111. package/dist/client/system-client.d.ts.map +1 -1
  112. package/dist/client/system-client.js +2 -1
  113. package/dist/client/system-client.js.map +1 -1
  114. package/dist/client/templates-client.d.ts +65 -6
  115. package/dist/client/templates-client.d.ts.map +1 -1
  116. package/dist/client/templates-client.js +25 -7
  117. package/dist/client/templates-client.js.map +1 -1
  118. package/dist/client/tool-extensions-client.d.ts +41 -16
  119. package/dist/client/tool-extensions-client.d.ts.map +1 -1
  120. package/dist/client/tool-extensions-client.js +6 -4
  121. package/dist/client/tool-extensions-client.js.map +1 -1
  122. package/dist/client/tool-meta-client.d.ts +8 -8
  123. package/dist/client/tool-meta-client.d.ts.map +1 -1
  124. package/dist/client/tool-meta-client.js +12 -8
  125. package/dist/client/tool-meta-client.js.map +1 -1
  126. package/dist/client/tools-client.d.ts +150 -23
  127. package/dist/client/tools-client.d.ts.map +1 -1
  128. package/dist/client/tools-client.js +8 -8
  129. package/dist/client/tools-client.js.map +1 -1
  130. package/dist/client/trigger-links-client.d.ts +11 -9
  131. package/dist/client/trigger-links-client.d.ts.map +1 -1
  132. package/dist/client/trigger-links-client.js +4 -4
  133. package/dist/client/trigger-links-client.js.map +1 -1
  134. package/dist/fleet-report.d.ts +21 -5
  135. package/dist/fleet-report.d.ts.map +1 -1
  136. package/dist/fleet-report.js +31 -6
  137. package/dist/fleet-report.js.map +1 -1
  138. package/dist/generated/api-routes.d.ts +1014 -0
  139. package/dist/generated/api-routes.d.ts.map +1 -0
  140. package/dist/generated/api-routes.js +322 -0
  141. package/dist/generated/api-routes.js.map +1 -0
  142. package/dist/generated/openapi-schemas.d.ts +12425 -0
  143. package/dist/generated/openapi-schemas.d.ts.map +1 -0
  144. package/dist/generated/openapi-schemas.js +671 -0
  145. package/dist/generated/openapi-schemas.js.map +1 -0
  146. package/dist/generated/served-schemas.d.ts +6697 -392
  147. package/dist/generated/served-schemas.d.ts.map +1 -1
  148. package/dist/generated/served-schemas.js +7061 -46
  149. package/dist/generated/served-schemas.js.map +1 -1
  150. package/dist/headers.d.ts +4 -0
  151. package/dist/headers.d.ts.map +1 -0
  152. package/dist/headers.js +4 -0
  153. package/dist/headers.js.map +1 -0
  154. package/dist/http.d.ts.map +1 -1
  155. package/dist/http.js +4 -3
  156. package/dist/http.js.map +1 -1
  157. package/dist/index.d.ts +7 -3
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.js +3 -0
  160. package/dist/index.js.map +1 -1
  161. package/dist/schemas/api-keys.d.ts +14 -12
  162. package/dist/schemas/api-keys.d.ts.map +1 -1
  163. package/dist/schemas/api-keys.js +9 -23
  164. package/dist/schemas/api-keys.js.map +1 -1
  165. package/dist/schemas/auth-routes.d.ts +34 -29
  166. package/dist/schemas/auth-routes.d.ts.map +1 -1
  167. package/dist/schemas/auth-routes.js +22 -27
  168. package/dist/schemas/auth-routes.js.map +1 -1
  169. package/dist/schemas/backup.d.ts +157 -36
  170. package/dist/schemas/backup.d.ts.map +1 -1
  171. package/dist/schemas/backup.js +27 -26
  172. package/dist/schemas/backup.js.map +1 -1
  173. package/dist/schemas/capabilities.d.ts +32 -22
  174. package/dist/schemas/capabilities.d.ts.map +1 -1
  175. package/dist/schemas/capabilities.js +15 -40
  176. package/dist/schemas/capabilities.js.map +1 -1
  177. package/dist/schemas/channels.d.ts +1 -1
  178. package/dist/schemas/channels.d.ts.map +1 -1
  179. package/dist/schemas/channels.js +2 -5
  180. package/dist/schemas/channels.js.map +1 -1
  181. package/dist/schemas/config.d.ts.map +1 -1
  182. package/dist/schemas/config.js +4 -6
  183. package/dist/schemas/config.js.map +1 -1
  184. package/dist/schemas/connectors.d.ts +381 -185
  185. package/dist/schemas/connectors.d.ts.map +1 -1
  186. package/dist/schemas/connectors.js +54 -101
  187. package/dist/schemas/connectors.js.map +1 -1
  188. package/dist/schemas/conversations.d.ts +970 -241
  189. package/dist/schemas/conversations.d.ts.map +1 -1
  190. package/dist/schemas/conversations.js +40 -134
  191. package/dist/schemas/conversations.js.map +1 -1
  192. package/dist/schemas/extensions.d.ts +9 -6
  193. package/dist/schemas/extensions.d.ts.map +1 -1
  194. package/dist/schemas/extensions.js +6 -4
  195. package/dist/schemas/extensions.js.map +1 -1
  196. package/dist/schemas/fleet.d.ts +153 -99
  197. package/dist/schemas/fleet.d.ts.map +1 -1
  198. package/dist/schemas/fleet.js +41 -51
  199. package/dist/schemas/fleet.js.map +1 -1
  200. package/dist/schemas/hooks.d.ts +34 -34
  201. package/dist/schemas/hooks.d.ts.map +1 -1
  202. package/dist/schemas/hooks.js +15 -34
  203. package/dist/schemas/hooks.js.map +1 -1
  204. package/dist/schemas/index.d.ts +1 -1
  205. package/dist/schemas/index.d.ts.map +1 -1
  206. package/dist/schemas/index.js +1 -1
  207. package/dist/schemas/index.js.map +1 -1
  208. package/dist/schemas/interactions.d.ts +146 -123
  209. package/dist/schemas/interactions.d.ts.map +1 -1
  210. package/dist/schemas/interactions.js +44 -129
  211. package/dist/schemas/interactions.js.map +1 -1
  212. package/dist/schemas/login.d.ts +36 -37
  213. package/dist/schemas/login.d.ts.map +1 -1
  214. package/dist/schemas/login.js +8 -42
  215. package/dist/schemas/login.js.map +1 -1
  216. package/dist/schemas/manifest-mcp.d.ts +61 -35
  217. package/dist/schemas/manifest-mcp.d.ts.map +1 -1
  218. package/dist/schemas/manifest-mcp.js +13 -19
  219. package/dist/schemas/manifest-mcp.js.map +1 -1
  220. package/dist/schemas/marketplace.d.ts +219 -133
  221. package/dist/schemas/marketplace.d.ts.map +1 -1
  222. package/dist/schemas/marketplace.js +35 -120
  223. package/dist/schemas/marketplace.js.map +1 -1
  224. package/dist/schemas/members.d.ts +161 -0
  225. package/dist/schemas/members.d.ts.map +1 -0
  226. package/dist/schemas/members.js +73 -0
  227. package/dist/schemas/members.js.map +1 -0
  228. package/dist/schemas/notifications.d.ts +113 -41
  229. package/dist/schemas/notifications.d.ts.map +1 -1
  230. package/dist/schemas/notifications.js +9 -35
  231. package/dist/schemas/notifications.js.map +1 -1
  232. package/dist/schemas/observability.d.ts +174 -72
  233. package/dist/schemas/observability.d.ts.map +1 -1
  234. package/dist/schemas/observability.js +23 -76
  235. package/dist/schemas/observability.js.map +1 -1
  236. package/dist/schemas/policy.d.ts +11 -11
  237. package/dist/schemas/policy.d.ts.map +1 -1
  238. package/dist/schemas/policy.js +5 -12
  239. package/dist/schemas/policy.js.map +1 -1
  240. package/dist/schemas/presets.d.ts +109 -64
  241. package/dist/schemas/presets.d.ts.map +1 -1
  242. package/dist/schemas/presets.js +12 -48
  243. package/dist/schemas/presets.js.map +1 -1
  244. package/dist/schemas/principals.d.ts +28 -21
  245. package/dist/schemas/principals.d.ts.map +1 -1
  246. package/dist/schemas/principals.js +13 -25
  247. package/dist/schemas/principals.js.map +1 -1
  248. package/dist/schemas/profiles.d.ts +75 -63
  249. package/dist/schemas/profiles.d.ts.map +1 -1
  250. package/dist/schemas/profiles.js +24 -54
  251. package/dist/schemas/profiles.js.map +1 -1
  252. package/dist/schemas/roles.d.ts +22 -22
  253. package/dist/schemas/roles.d.ts.map +1 -1
  254. package/dist/schemas/roles.js +10 -17
  255. package/dist/schemas/roles.js.map +1 -1
  256. package/dist/schemas/schedules.d.ts +21 -15
  257. package/dist/schemas/schedules.d.ts.map +1 -1
  258. package/dist/schemas/schedules.js +4 -13
  259. package/dist/schemas/schedules.js.map +1 -1
  260. package/dist/schemas/served.d.ts +6373 -194
  261. package/dist/schemas/served.d.ts.map +1 -1
  262. package/dist/schemas/served.js +21 -0
  263. package/dist/schemas/served.js.map +1 -1
  264. package/dist/schemas/settings-schema.d.ts +1 -1
  265. package/dist/schemas/settings-schema.d.ts.map +1 -1
  266. package/dist/schemas/settings-schema.js +17 -19
  267. package/dist/schemas/settings-schema.js.map +1 -1
  268. package/dist/schemas/setup.d.ts +6 -6
  269. package/dist/schemas/setup.d.ts.map +1 -1
  270. package/dist/schemas/setup.js +2 -11
  271. package/dist/schemas/setup.js.map +1 -1
  272. package/dist/schemas/states.d.ts +450 -135
  273. package/dist/schemas/states.d.ts.map +1 -1
  274. package/dist/schemas/states.js +76 -140
  275. package/dist/schemas/states.js.map +1 -1
  276. package/dist/schemas/storage.d.ts +7 -8
  277. package/dist/schemas/storage.d.ts.map +1 -1
  278. package/dist/schemas/storage.js +8 -17
  279. package/dist/schemas/storage.js.map +1 -1
  280. package/dist/schemas/studio-plugins.d.ts +24 -18
  281. package/dist/schemas/studio-plugins.d.ts.map +1 -1
  282. package/dist/schemas/studio-plugins.js +5 -19
  283. package/dist/schemas/studio-plugins.js.map +1 -1
  284. package/dist/schemas/sub-mcp.d.ts +11 -8
  285. package/dist/schemas/sub-mcp.d.ts.map +1 -1
  286. package/dist/schemas/sub-mcp.js +10 -19
  287. package/dist/schemas/sub-mcp.js.map +1 -1
  288. package/dist/schemas/system-kinds.d.ts +76 -46
  289. package/dist/schemas/system-kinds.d.ts.map +1 -1
  290. package/dist/schemas/system-kinds.js +11 -28
  291. package/dist/schemas/system-kinds.js.map +1 -1
  292. package/dist/schemas/templates.d.ts +83 -25
  293. package/dist/schemas/templates.d.ts.map +1 -1
  294. package/dist/schemas/templates.js +8 -9
  295. package/dist/schemas/templates.js.map +1 -1
  296. package/dist/schemas/tool-meta.d.ts +15 -15
  297. package/dist/schemas/tool-meta.d.ts.map +1 -1
  298. package/dist/schemas/tool-meta.js +6 -21
  299. package/dist/schemas/tool-meta.js.map +1 -1
  300. package/dist/schemas/tools.d.ts +177 -56
  301. package/dist/schemas/tools.d.ts.map +1 -1
  302. package/dist/schemas/tools.js +20 -41
  303. package/dist/schemas/tools.js.map +1 -1
  304. package/dist/schemas/trigger-links.d.ts +22 -17
  305. package/dist/schemas/trigger-links.d.ts.map +1 -1
  306. package/dist/schemas/trigger-links.js +7 -27
  307. package/dist/schemas/trigger-links.js.map +1 -1
  308. package/dist/tool-runs.d.ts +175 -54
  309. package/dist/tool-runs.d.ts.map +1 -1
  310. package/dist/tool-runs.js +33 -34
  311. package/dist/tool-runs.js.map +1 -1
  312. package/package.json +4 -3
  313. package/src/agents.ts +16 -4
  314. package/src/client/agents-client.ts +3 -2
  315. package/src/client/auth-client.ts +134 -34
  316. package/src/client/backend-client.ts +8 -3
  317. package/src/client/backup-client.ts +8 -3
  318. package/src/client/capabilities-client.ts +4 -2
  319. package/src/client/channels-client.ts +3 -1
  320. package/src/client/config-client.ts +13 -5
  321. package/src/client/connectors-client.ts +91 -16
  322. package/src/client/conversations-client.ts +79 -30
  323. package/src/client/hooks-client.ts +25 -12
  324. package/src/client/index.ts +16 -4
  325. package/src/client/interactions-client.ts +40 -16
  326. package/src/client/login-client.ts +8 -4
  327. package/src/client/manifest-client.ts +48 -24
  328. package/src/client/marketplace-client.ts +23 -12
  329. package/src/client/mcp-config-schema-client.ts +2 -1
  330. package/src/client/notifications-client.ts +2 -1
  331. package/src/client/observability-client.ts +60 -8
  332. package/src/client/plugins-client.ts +2 -1
  333. package/src/client/policy-client.ts +24 -9
  334. package/src/client/presets-client.ts +26 -13
  335. package/src/client/profiles-client.ts +53 -24
  336. package/src/client/schedules-client.ts +14 -20
  337. package/src/client/settings-schema-client.ts +2 -1
  338. package/src/client/states-client.ts +151 -49
  339. package/src/client/storage-client.ts +43 -14
  340. package/src/client/sub-mcp-client.ts +10 -4
  341. package/src/client/system-client.ts +2 -1
  342. package/src/client/templates-client.ts +26 -7
  343. package/src/client/tool-extensions-client.ts +14 -7
  344. package/src/client/tool-meta-client.ts +46 -21
  345. package/src/client/tools-client.ts +13 -8
  346. package/src/client/trigger-links-client.ts +10 -6
  347. package/src/fleet-report.ts +48 -7
  348. package/src/generated/api-routes.ts +327 -0
  349. package/src/generated/openapi-schemas.ts +1508 -0
  350. package/src/generated/served-schemas.ts +7118 -82
  351. package/src/headers.ts +4 -0
  352. package/src/http.ts +4 -3
  353. package/src/index.ts +52 -10
  354. package/src/schemas/api-keys.ts +9 -25
  355. package/src/schemas/auth-routes.ts +27 -28
  356. package/src/schemas/backup.ts +33 -31
  357. package/src/schemas/capabilities.ts +16 -39
  358. package/src/schemas/channels.ts +4 -4
  359. package/src/schemas/config.ts +6 -6
  360. package/src/schemas/connectors.ts +61 -102
  361. package/src/schemas/conversations.ts +43 -133
  362. package/src/schemas/extensions.ts +7 -4
  363. package/src/schemas/fleet.ts +51 -51
  364. package/src/schemas/hooks.ts +18 -37
  365. package/src/schemas/index.ts +1 -1
  366. package/src/schemas/interactions.ts +48 -131
  367. package/src/schemas/login.ts +10 -41
  368. package/src/schemas/manifest-mcp.ts +13 -19
  369. package/src/schemas/marketplace.ts +37 -120
  370. package/src/schemas/members.ts +91 -0
  371. package/src/schemas/notifications.ts +10 -34
  372. package/src/schemas/observability.ts +34 -79
  373. package/src/schemas/policy.ts +5 -12
  374. package/src/schemas/presets.ts +13 -48
  375. package/src/schemas/principals.ts +17 -24
  376. package/src/schemas/profiles.ts +25 -55
  377. package/src/schemas/roles.ts +11 -17
  378. package/src/schemas/schedules.ts +4 -15
  379. package/src/schemas/served.ts +33 -0
  380. package/src/schemas/settings-schema.ts +18 -23
  381. package/src/schemas/setup.ts +4 -10
  382. package/src/schemas/states.ts +88 -139
  383. package/src/schemas/storage.ts +10 -16
  384. package/src/schemas/studio-plugins.ts +8 -19
  385. package/src/schemas/sub-mcp.ts +12 -18
  386. package/src/schemas/system-kinds.ts +12 -29
  387. package/src/schemas/templates.ts +8 -10
  388. package/src/schemas/tool-meta.ts +8 -20
  389. package/src/schemas/tools.ts +22 -45
  390. package/src/schemas/trigger-links.ts +8 -26
  391. package/src/tool-runs.ts +47 -38
  392. package/dist/client/web-entry-gate-client.d.ts +0 -34
  393. package/dist/client/web-entry-gate-client.d.ts.map +0 -1
  394. package/dist/client/web-entry-gate-client.js +0 -25
  395. package/dist/client/web-entry-gate-client.js.map +0 -1
  396. package/dist/schemas/web-entry.d.ts +0 -45
  397. package/dist/schemas/web-entry.d.ts.map +0 -1
  398. package/dist/schemas/web-entry.js +0 -36
  399. package/dist/schemas/web-entry.js.map +0 -1
  400. package/src/client/web-entry-gate-client.ts +0 -45
  401. package/src/schemas/web-entry.ts +0 -46
@@ -1,37 +1,29 @@
1
1
  /** Backend identity and worker-bus fleet/fan-out response schemas. */
2
2
  import { z } from 'zod';
3
3
 
4
- import { jsonValue } from './shared';
4
+ import * as openapi from '../generated/openapi-schemas';
5
5
 
6
6
  /** `GET /api/backend` — the execution-backend identity, or the absent sentinel
7
7
  * (`present: false`, a 200) when no backend plugin is registered. Backend identity
8
8
  * is kept distinct from the fleet: the fleet doors ride the app's worker bus and
9
9
  * need no backend at all. */
10
- export const backendInfo = z.object({
11
- present: z.boolean(),
12
- backend: z.string().nullable(),
13
- module: z.string().nullable(),
14
- });
10
+ export const backendInfo = openapi.backendInfo;
15
11
  export type BackendInfo = z.infer<typeof backendInfo>;
16
12
 
17
13
  /** The two worker kinds that join the bus: an ASGI `serve` worker or a
18
14
  * `backend` runtime process. A drift throws `ApiSchemaError`. */
19
- export const workerKind = z.enum(['serve', 'backend']);
15
+ export const workerKind = openapi.workerKind;
20
16
  export type WorkerKind = z.infer<typeof workerKind>;
21
17
 
22
18
  /** The lifecycle state a worker advertises in its presence value: `ready` once its
23
19
  * resync has converged, `resyncing` while a boot/reconnect resync runs, `recycling`
24
20
  * once it has begun a graceful self-exit. A drift throws `ApiSchemaError`. */
25
- export const workerState = z.enum(['ready', 'resyncing', 'recycling']);
21
+ export const workerState = openapi.workerState;
26
22
  export type WorkerState = z.infer<typeof workerState>;
27
23
 
28
24
  /** The last op a worker applied, stamped onto its presence row after the terminal
29
25
  * reply. `outcome` is the free op-outcome string; `at` is the ISO instant it landed. */
30
- export const workerLastOp = z.object({
31
- op: z.string(),
32
- outcome: z.string(),
33
- at: z.string(),
34
- });
26
+ export const workerLastOp = openapi.lastOp;
35
27
  export type WorkerLastOp = z.infer<typeof workerLastOp>;
36
28
 
37
29
  /**
@@ -45,17 +37,7 @@ export type WorkerLastOp = z.infer<typeof workerLastOp>;
45
37
  * only freshness signal a client reads, never a client-side threshold; `last_op` is the
46
38
  * worker's last applied op, or `null` before it has applied one.
47
39
  */
48
- export const fleetWorker = z.object({
49
- name: z.string(),
50
- kind: workerKind,
51
- pid: z.number(),
52
- generation: z.number(),
53
- joined_at: z.string(),
54
- beat_at: z.string(),
55
- state: workerState,
56
- stale: z.boolean(),
57
- last_op: workerLastOp.nullable(),
58
- });
40
+ export const fleetWorker = openapi.workerListingRow;
59
41
  export type FleetWorker = z.infer<typeof fleetWorker>;
60
42
 
61
43
  /**
@@ -64,7 +46,7 @@ export type FleetWorker = z.infer<typeof fleetWorker>;
64
46
  * processes alike), not only backend workers. A census read that fails surfaces as a
65
47
  * loud 500, never a fabricated empty fleet.
66
48
  */
67
- export const fleetWorkers = z.object({ workers: z.array(fleetWorker) });
49
+ export const fleetWorkers = openapi.workerListing;
68
50
  export type FleetWorkers = z.infer<typeof fleetWorkers>;
69
51
 
70
52
  /**
@@ -76,16 +58,7 @@ export type FleetWorkers = z.infer<typeof fleetWorkers>;
76
58
  * `recycling` is departing, `stale` is a quiet row past the freshness bound carrying no
77
59
  * convergence promise).
78
60
  */
79
- export const fleetOutcome = z.enum([
80
- 'applied',
81
- 'failed',
82
- 'missing',
83
- 'departed',
84
- 'timed_out',
85
- 'resyncing',
86
- 'recycling',
87
- 'stale',
88
- ]);
61
+ export const fleetOutcome = openapi.opOutcome;
89
62
  export type FleetOutcome = z.infer<typeof fleetOutcome>;
90
63
 
91
64
  /**
@@ -94,13 +67,7 @@ export type FleetOutcome = z.infer<typeof fleetOutcome>;
94
67
  * publisher's report text for a computed gap outcome (`missing`/`departed`/`timed_out`/
95
68
  * `resyncing`/`recycling`/`stale`). A drift throws `ApiSchemaError`.
96
69
  */
97
- export const fleetWorkerResult = z.object({
98
- name: z.string(),
99
- outcome: fleetOutcome,
100
- payload: jsonValue,
101
- error: z.string().nullable(),
102
- detail: z.string().nullable(),
103
- });
70
+ export const fleetWorkerResult = openapi.workerResult;
104
71
  export type FleetWorkerResult = z.infer<typeof fleetWorkerResult>;
105
72
 
106
73
  /**
@@ -114,13 +81,7 @@ export type FleetWorkerResult = z.infer<typeof fleetWorkerResult>;
114
81
  * reload; it is also the body the mode-wrapped {@link fleetReportFanout} carries under its
115
82
  * `fleet` / `unreachable` modes.
116
83
  */
117
- export const fleetResult = z.object({
118
- op: z.string(),
119
- reachable: z.boolean(),
120
- local_only: z.boolean(),
121
- results: z.array(fleetWorkerResult),
122
- error: z.string().nullable(),
123
- });
84
+ export const fleetResult = openapi.fleetResult;
124
85
  export type FleetResult = z.infer<typeof fleetResult>;
125
86
 
126
87
  /**
@@ -146,9 +107,48 @@ export type FleetReloadResult = z.infer<typeof fleetReloadResult>;
146
107
  * unknown-key stripping would otherwise silently drop the field, hiding a failed
147
108
  * propagation from the shared fleet-report handler. A drift throws `ApiSchemaError`.
148
109
  */
110
+ // Hand-written: the spec publishes a fan-out as one object with optional fields; the client
111
+ // discriminates its three modes.
112
+ const fanoutFleetResult = openapi.fleetResult.omit({ ok: true });
149
113
  export const fleetReportFanout = z.discriminatedUnion('mode', [
150
114
  z.object({ mode: z.literal('local-only'), note: z.string() }),
151
- fleetResult.extend({ mode: z.literal('fleet') }),
152
- fleetResult.extend({ mode: z.literal('unreachable') }),
115
+ fanoutFleetResult.extend({ mode: z.literal('fleet') }),
116
+ fanoutFleetResult.extend({ mode: z.literal('unreachable') }),
153
117
  ]);
154
118
  export type FleetReportFanout = z.infer<typeof fleetReportFanout>;
119
+
120
+ /**
121
+ * One worker line of a fleet recycle roll. `status` is `recycled` (confirmed on
122
+ * reality), `timed-out` or `failed` (the target the roll stopped at — `detail` names
123
+ * why), or `self-deferred` (the worker that took the change recycles itself after
124
+ * replying). `generation_before` is the life that was recycled.
125
+ */
126
+ export const recycleEntry = openapi.recycleEntry;
127
+ export type RecycleEntry = z.infer<typeof recycleEntry>;
128
+
129
+ /** One newly-ready worker life observed since the change began — capacity evidence. */
130
+ export const freshLife = openapi.freshLife;
131
+ export type FreshLife = z.infer<typeof freshLife>;
132
+
133
+ /**
134
+ * Where a recycle roll stopped and why: `name` is the target it stopped at, or `null`
135
+ * when the bus could not be read before a target was reached.
136
+ */
137
+ export const recycleStop = openapi.recycleStop;
138
+ export type RecycleStop = z.infer<typeof recycleStop>;
139
+
140
+ /**
141
+ * The report of a fleet recycle roll an env change carrying a recycle-class key ran:
142
+ * the worker lines, the fresh lives, and where the roll stopped (`null` when it ran to
143
+ * its end). Names only — never an env value.
144
+ */
145
+ export const recycleRoll = openapi.recycleRoll;
146
+ export type RecycleRoll = z.infer<typeof recycleRoll>;
147
+
148
+ /**
149
+ * One worker an operation names as still awaiting a respawn: its recycle-class `keys`
150
+ * changed in the stored env since its process bound them (at boot, or when the plugin that
151
+ * declares them was loaded), and nothing in the operation respawns it.
152
+ */
153
+ export const awaitingWorker = openapi.awaitingWorker;
154
+ export type AwaitingWorker = z.infer<typeof awaitingWorker>;
@@ -1,57 +1,38 @@
1
1
  /** Hook listing, registration and topic-verifier response schemas. */
2
2
  import { z } from 'zod';
3
3
 
4
- import { hookParams } from './served';
4
+ import * as openapi from '../generated/openapi-schemas';
5
5
 
6
- // The hand-written hook response DTOs: the fire-door authority enum, the list rows and
7
- // their wrapper, and the per-topic verifier/trigger metadata. The served hook DOCUMENT
8
- // schemas (`hookSubject`/`hookParams`/`hookRegister`) are generated from the contract
9
- // bundle and re-exported at the top of this file, not defined here.
6
+ // The hook response schemas: the fire-door authority enum, the list rows and their
7
+ // wrapper, and the per-topic verifier/trigger metadata. The served hook DOCUMENT schemas
8
+ // (`hookSubject`/`hookParams`/`hookRegister`) are re-exported from `./served`.
10
9
 
11
10
  /** A fire door — who may trigger a path, not what the fire may do. A string enum. */
12
- export const triggerAuth = z.enum([
13
- 'public',
14
- 'verifier',
15
- 'token',
16
- 'token+api_key',
17
- 'out-of-service',
18
- ]);
11
+ export const triggerAuth = openapi.hookListView.shape.trigger_auth.valueType;
19
12
  export type TriggerAuth = z.infer<typeof triggerAuth>;
20
13
 
21
- export const hookList = z.object({
22
- items: z.array(hookParams),
23
- total: z.number(),
24
- // Per-topic verifier bindings: the topic name maps to the verifier bound to it
25
- // and that verifier's config (which carries a `secret_env` name, never a secret
26
- // value). Tolerant of an older/empty response, which omits the key entirely.
27
- topic_verifiers: z
28
- .record(
29
- z.string(),
30
- z.object({ verifier: z.string(), config: z.record(z.string(), z.unknown()) }),
31
- )
32
- .default({}),
33
- // Per-topic fire door (topic → door). Tolerant of an older response omitting it.
34
- trigger_auth: z.record(z.string(), triggerAuth).default({}),
14
+ export const hookList = openapi.hookListView.extend({
15
+ // Per-topic verifier bindings: the topic name maps to the verifier bound to it and that
16
+ // verifier's config (which carries a `secret_env` name, never a secret value). Hand-typed:
17
+ // the spec publishes a binding as an open value.
18
+ topic_verifiers: z.record(
19
+ z.string(),
20
+ z.object({ verifier: z.string(), config: z.record(z.string(), z.unknown()) }),
21
+ ),
35
22
  });
36
23
  export type HookList = z.infer<typeof hookList>;
37
24
 
38
- export const hookRegistered = z.object({
39
- registered: z.boolean(),
40
- name: z.string(),
41
- });
25
+ export const hookRegistered = openapi.hookRegisterResult;
42
26
 
43
- export const hookRemoved = z.object({
44
- removed: z.boolean(),
45
- name: z.string(),
46
- });
27
+ export const hookRemoved = openapi.removedByName;
47
28
 
48
29
  // The registered webhook-verifier catalog (`GET /api/hooks/verifiers`) — the
49
30
  // sorted verifier NAMES only, never any verifier's config. An empty registry is a
50
31
  // valid empty array. This is the ONLY source the topic-verifier bind picker reads.
51
- export const hookVerifiers = z.array(z.string());
32
+ export const hookVerifiers = openapi.stringListResponse;
52
33
 
53
34
  /** `PUT /api/hooks/topics/{topic}/verifier` — the bound topic + verifier name. */
54
- export const topicVerifierSet = z.object({ topic: z.string(), verifier: z.string() });
35
+ export const topicVerifierSet = openapi.topicVerifierView;
55
36
 
56
37
  /** `DELETE /api/hooks/topics/{topic}/verifier` — the unbound topic. */
57
- export const topicVerifierRemoved = z.object({ removed: z.boolean(), topic: z.string() });
38
+ export const topicVerifierRemoved = openapi.removedByTopic;
@@ -15,6 +15,7 @@ export * from './interactions';
15
15
  export * from './login';
16
16
  export * from './manifest-mcp';
17
17
  export * from './marketplace';
18
+ export * from './members';
18
19
  export * from './notifications';
19
20
  export * from './observability';
20
21
  export * from './policy';
@@ -36,4 +37,3 @@ export * from './templates';
36
37
  export * from './tool-meta';
37
38
  export * from './tools';
38
39
  export * from './trigger-links';
39
- export * from './web-entry';
@@ -1,69 +1,41 @@
1
1
  /** Interaction question, answer and media response schemas. */
2
2
  import { z } from 'zod';
3
3
 
4
- import { pageWindow } from './shared';
4
+ import * as openapi from '../generated/openapi-schemas';
5
+ import * as served from '../generated/served-schemas';
5
6
 
6
7
  // Shapes match the skeleton's interactions SSE contract: the SSE
7
8
  // `interaction.add` frame carries the question and its answer format; the answer
8
9
  // door returns { interaction_id, status }. `answered` is not a wire field — it
9
10
  // is a client-side flag the stream hook flips on an `interaction.answered` event.
10
11
 
11
- export const answerFormat = z.enum(['text', 'confirm', 'select', 'form', 'external']);
12
+ export const answerFormat = openapi.answerFormat;
12
13
  export type AnswerFormat = z.infer<typeof answerFormat>;
13
14
 
14
- /** The kind of a question's display-only media item: a remote/inline image, or a link. */
15
- export const mediaKind = z.enum(['image', 'link']);
15
+ /** The kind of a display-only media item: an image, a link, or a document, video or audio file. */
16
+ export const mediaKind = openapi.mediaKind;
16
17
  export type MediaKind = z.infer<typeof mediaKind>;
17
18
 
18
19
  /**
19
- * One item of a question's display-only media. Applied PER ITEM by the renderer
20
- * (never as a strict array on the frame): the frame's `media` field is a loose
21
- * `z.array(z.unknown())`, and the renderer `safeParse`s each item with this schema
22
- * so one malformed/hostile item is a loud per-item notice, not a whole-frame parse
23
- * failure that would silently vanish an answerable question.
24
- *
25
- * `caption` is `.nullish()` (absent OR `null` both parse to a caption-less item):
26
- * a caption-less item may arrive with the key omitted OR with an explicit `null`, so
27
- * `.optional()` here would false-fail the explicit `null` and render a good image as
28
- * malformed. `url` and `kind` are the only load-bearing fields; the image
29
- * src scheme gate and the link neutralization are enforced by the renderer.
20
+ * One item of a question's display-only media. The renderer resolves `url` (the image src
21
+ * scheme gate and the link neutralization are enforced there); `caption` and `filename`
22
+ * are `null` when absent.
30
23
  */
31
- export const interactionMediaItem = z.object({
32
- kind: mediaKind,
33
- url: z.string(),
34
- caption: z.string().nullish(),
35
- });
24
+ export const interactionMediaItem = openapi.mediaItem;
36
25
  export type InteractionMediaItem = z.infer<typeof interactionMediaItem>;
37
26
 
38
- /**
39
- * The kind of a byte-backed inbound attachment carried on a transcript record. A
40
- * fetchable file — `image`/`document`/`audio`/`video` — never a `link`: a labelled
41
- * anchor is question CONTEXT (see {@link mediaKind}), not a participant's sent file.
42
- */
43
- export const attachmentMediaKind = z.enum(['image', 'document', 'audio', 'video']);
27
+ /** The kind of an inbound attachment carried on a transcript record. */
28
+ export const attachmentMediaKind = openapi.mediaKind;
44
29
  export type AttachmentMediaKind = z.infer<typeof attachmentMediaKind>;
45
30
 
46
31
  /**
47
32
  * One inbound attachment a participant sent, projected onto a transcript record's
48
- * `inbound_attachments`. Applied PER ITEM by the renderer (the record's array is a
49
- * loose `z.array(z.unknown())`, `safeParse`d per member) so one malformed/hostile
50
- * item is a loud per-item notice, never a whole-record parse failure that would
51
- * vanish the transcript.
52
- *
53
- * `url` is the served-media reference the renderer resolves to the API origin (the
54
- * same served-url discipline the ask-media renderer uses); the image src scheme gate
55
- * and the per-item load-failure notice are enforced there. `caption` and `filename`
56
- * are `.nullish()` (absent OR explicit `null` both parse to absent): the projection
57
- * may omit the key OR emit `null`, so `.optional()` alone would false-fail an explicit
58
- * `null`. `filename` is meaningful only for a `document`; the renderer shows it as the
59
- * download label.
33
+ * `inbound_attachments`. `url` is the served-media reference the renderer resolves to the
34
+ * API origin (the same served-url discipline the ask-media renderer uses); the image src
35
+ * scheme gate and the per-item load-failure notice are enforced there. `filename` is
36
+ * meaningful only for a `document`; the renderer shows it as the download label.
60
37
  */
61
- export const attachmentMediaItem = z.object({
62
- kind: attachmentMediaKind,
63
- url: z.string(),
64
- caption: z.string().nullish(),
65
- filename: z.string().nullish(),
66
- });
38
+ export const attachmentMediaItem = openapi.mediaItem;
67
39
  export type AttachmentMediaItem = z.infer<typeof attachmentMediaItem>;
68
40
 
69
41
  /**
@@ -73,10 +45,7 @@ export type AttachmentMediaItem = z.infer<typeof attachmentMediaItem>;
73
45
  * `enum` this way for one ask without republishing the form. Applied per property by
74
46
  * the form preview (safeParsed), so a malformed entry is a loud notice, never silent.
75
47
  */
76
- export const formOption = z.object({
77
- value: z.string(),
78
- label: z.string().nullish(),
79
- });
48
+ export const formOption = openapi.formOption;
80
49
  export type FormOption = z.infer<typeof formOption>;
81
50
 
82
51
  /**
@@ -85,14 +54,11 @@ export type FormOption = z.infer<typeof formOption>;
85
54
  * default to empty. The form preview safeParses this off `format_payload.data`, so a
86
55
  * malformed block is a loud notice rather than a whole-frame parse failure.
87
56
  */
88
- export const formData = z.object({
89
- values: z.record(z.string(), z.unknown()).default({}),
90
- options: z.record(z.string(), z.array(formOption)).default({}),
91
- });
57
+ export const formData = openapi.formData;
92
58
  export type FormData = z.infer<typeof formData>;
93
59
 
94
60
  /** The kind of an ordered display block a page may carry alongside its input fields. */
95
- export const displayBlockKind = z.enum(['heading', 'body', 'image']);
61
+ export const displayBlockKind = openapi.displayBlock.shape.kind;
96
62
  export type DisplayBlockKind = z.infer<typeof displayBlockKind>;
97
63
 
98
64
  /**
@@ -106,17 +72,11 @@ export type DisplayBlockKind = z.infer<typeof displayBlockKind>;
106
72
  * whole-page parse failure. Applied per block by the preview (safeParsed via its page),
107
73
  * so a malformed block is a loud notice, never silent.
108
74
  */
109
- export const displayBlock = z.object({
110
- kind: displayBlockKind,
111
- text: z.string().nullish(),
112
- src: z.string().nullish(),
113
- alt: z.string().nullish(),
114
- slot: z.string().nullish(),
115
- });
75
+ export const displayBlock = openapi.displayBlock;
116
76
  export type DisplayBlock = z.infer<typeof displayBlock>;
117
77
 
118
78
  /** A page's role: an ordinary `input` page (default) or a terminal `review` summary. */
119
- export const formPageKind = z.enum(['input', 'review']);
79
+ export const formPageKind = openapi.formPage.shape.kind.unwrap();
120
80
  export type FormPageKind = z.infer<typeof formPageKind>;
121
81
 
122
82
  /**
@@ -131,18 +91,16 @@ export type FormPageKind = z.infer<typeof formPageKind>;
131
91
  * and carries no new input fields; it defaults to `input`. Both are additive: an older
132
92
  * payload ({title, fields}) parses unchanged.
133
93
  */
134
- export const formPage = z.object({
135
- title: z.string(),
136
- fields: z.array(z.string()),
137
- display: z.array(displayBlock).default([]),
138
- kind: formPageKind.default('input'),
139
- });
94
+ export const formPage = openapi.formPage;
140
95
  export type FormPage = z.infer<typeof formPage>;
141
96
 
142
97
  /** The `form` pages list (`format_payload.pages`), safeParsed as a whole by the preview. */
143
98
  export const formPages = z.array(formPage);
144
99
  export type FormPages = z.infer<typeof formPages>;
145
100
 
101
+ // The form reactions and the form update are hand-written: the spec carries them inside an
102
+ // open `format_payload` and an open reaction `update`.
103
+
146
104
  /**
147
105
  * When a `form` reacts while it is open (`format_payload.reactions`): the plain,
148
106
  * renderer-readable description of WHEN the form calls its reaction handler. Absent ⇒ a
@@ -163,12 +121,12 @@ export const formReactions = z.object({
163
121
  export type FormReactions = z.infer<typeof formReactions>;
164
122
 
165
123
  /**
166
- * The form update a reaction door returns (`POST /api/interactions/{id}/react`): the
167
- * same kind of data a form is sent with, applied to the open form. `values` sets field
168
- * values; `options` replaces the per-send choice list of option-bearing fields; `errors`
169
- * shows per-field messages (keyed by field name); `display` fills display slots (keyed by
170
- * slot name) — a computed total among them. Every member defaults to empty, so a reaction
171
- * that touches only one of them returns only that one. The door response is safeParsed, so
124
+ * The form update a reaction door returns (`POST /api/interactions/{id}/react`, its
125
+ * `update`): the same kind of data a form is sent with, applied to the open form. `values`
126
+ * sets field values; `options` replaces the per-send choice list of option-bearing fields;
127
+ * `errors` shows per-field messages (keyed by field name); `display` fills display slots
128
+ * (keyed by slot name) — a computed total among them. Every member defaults to empty, so a
129
+ * reaction that touches only one of them returns only that one. The door response is safeParsed, so
172
130
  * a malformed update surfaces loudly rather than applying a half-understood change.
173
131
  */
174
132
  export const formUpdate = z.object({
@@ -180,68 +138,33 @@ export const formUpdate = z.object({
180
138
  export type FormUpdate = z.infer<typeof formUpdate>;
181
139
 
182
140
  /**
183
- * The event a reaction round-trip reports to the door: `kind` is which of the three
184
- * declared events fired, `field` names the changed field for a `field_changed` event, and
185
- * `page` names the advanced-from page (by title) for a `page_advanced` event. A
186
- * `submitted` event carries neither. The body also carries the partial `values` filled so
187
- * far (see {@link interactionsClient}'s `reactInteraction`).
141
+ * The event a reaction round-trip reports to the door (the contract's `FormReactionEvent`
142
+ * document): `kind` is which of the three declared events fired, `field` names the changed
143
+ * field for a `field_changed` event, and `page` names the advanced-from page (by title) for a
144
+ * `page_advanced` event. A `submitted` event carries neither. The body also carries the
145
+ * partial `values` filled so far (see {@link interactionsClient}'s `reactInteraction`).
188
146
  */
189
- export const reactionEventKind = z.enum(['field_changed', 'page_advanced', 'submitted']);
190
- export type ReactionEventKind = z.infer<typeof reactionEventKind>;
191
-
192
- export const reactionEvent = z.object({
193
- kind: reactionEventKind,
194
- field: z.string().optional(),
195
- page: z.string().optional(),
196
- });
147
+ export const reactionEvent = served.formReactionEvent;
197
148
  export type ReactionEvent = z.infer<typeof reactionEvent>;
149
+ export type ReactionEventKind = ReactionEvent['kind'];
198
150
 
199
- export const interaction = z.object({
200
- interaction_id: z.string(),
201
- group_id: z.string(),
202
- question: z.string().default(''),
203
- answer_format: answerFormat,
204
- // Format-specific payload: select options, form JSON schema (with optional per-send
205
- // `data` and `pages`), external url. The wire sends `null` for formats that carry
151
+ /** The reaction door's reply: the interaction id and the form `update` to apply. */
152
+ export const interactionReaction = openapi.interactionReactionResult.extend({ update: formUpdate });
153
+ export type InteractionReaction = z.infer<typeof interactionReaction>;
154
+
155
+ export const interaction = openapi.interactionFrame.extend({
156
+ // Hand-written: the format-specific payload (select options, form JSON schema with
157
+ // optional per-send `data` and `pages`, external url) is `null` for formats that carry
206
158
  // none (text/confirm); it is normalized to `{}` so consumers always see an object.
207
159
  format_payload: z
208
160
  .record(z.string(), z.unknown())
209
161
  .nullish()
210
162
  .transform((value) => value ?? {}),
211
- created_at: z.string(),
212
- timeout_at: z.string(),
213
- // Whether the answer body is sensitive and never persisted server-side. Rides
214
- // every add frame; an absent value (older frame) normalizes to false.
215
- sensitive: z.boolean().default(false),
216
- // True only for an external question answered by a signed server-to-server
217
- // callback (never by a human); the frame never carries the verifier object.
218
- // Absent/undefined for every other question.
219
- server_verified: z.boolean().optional(),
220
- // Name of the channel plugin the question was also delivered through (e.g.
221
- // "telegram"); absent when the question lives only in this inbox.
222
- channel: z.string().optional(),
223
- // Interaction attribution, each additive and absent when unset. `recipient` is
224
- // the channel delivery address the question went to; `origin` is the run id of
225
- // the background tool run that asked; `audience` is the user_id the question is
226
- // addressed to. Display/binding data only, never an authorization axis; a
227
- // present non-string is malformed.
228
- recipient: z.string().optional(),
229
- origin: z.string().optional(),
230
- audience: z.string().optional(),
231
- // Display-only media shown WITH the question (images and/or links). Absent when
232
- // the question carries none. Deliberately LOOSE (`z.array(z.unknown())`): each
233
- // item is `safeParse`d per item by the renderer against `interactionMediaItem`,
234
- // so one malformed/hostile item can never fail the whole frame parse and hide an
235
- // answerable question. A present non-array value is still malformed.
236
- media: z.array(z.unknown()).optional(),
237
163
  });
238
164
  export type Interaction = z.infer<typeof interaction>;
239
165
 
240
166
  /** The answer door's response — the blocked caller was woken. */
241
- export const interactionAnswered = z.object({
242
- interaction_id: z.string(),
243
- status: z.string(),
244
- });
167
+ export const interactionAnswered = openapi.interactionActionResult;
245
168
  export type InteractionAnswered = z.infer<typeof interactionAnswered>;
246
169
 
247
170
  /**
@@ -250,10 +173,7 @@ export type InteractionAnswered = z.infer<typeof interactionAnswered>;
250
173
  * answer door's terminal reply, but the door is distinct so it carries its own
251
174
  * schema.
252
175
  */
253
- export const interactionCancelled = z.object({
254
- interaction_id: z.string(),
255
- status: z.string(),
256
- });
176
+ export const interactionCancelled = openapi.interactionActionResult;
257
177
  export type InteractionCancelled = z.infer<typeof interactionCancelled>;
258
178
 
259
179
  /**
@@ -261,8 +181,5 @@ export type InteractionCancelled = z.infer<typeof interactionCancelled>;
261
181
  * item is the same record the stream's `interaction.add` frame carries. The pending
262
182
  * set is the paged base the tail-only stream applies live deltas over.
263
183
  */
264
- export const interactionsPage = z.object({
265
- items: z.array(interaction),
266
- ...pageWindow,
267
- });
184
+ export const interactionsPage = openapi.interactionWindow.extend({ items: z.array(interaction) });
268
185
  export type InteractionsPage = z.infer<typeof interactionsPage>;
@@ -1,67 +1,36 @@
1
1
  /** Public login-method aggregator and login-result schemas. */
2
- import { z } from 'zod';
2
+ import type { z } from 'zod';
3
+
4
+ import * as openapi from '../generated/openapi-schemas';
3
5
 
4
6
  /**
5
7
  * One field of a `form` login method. `secret` fields render as password
6
8
  * inputs; `autocomplete` passes through to the input (e.g. "email",
7
9
  * "current-password", "new-password").
8
10
  */
9
- export const loginFormField = z.object({
10
- name: z.string().min(1),
11
- label: z.string().min(1),
12
- secret: z.boolean(),
13
- autocomplete: z.string().optional(),
14
- });
11
+ export const loginFormField = openapi.formField;
15
12
 
16
13
  /**
17
14
  * The two — and only two — login-method shapes. Discriminated on `shape`; an
18
15
  * unknown shape fails validation loudly (contract drift, not a soft skip).
19
- * Optional fields are `.optional()` (absent), never `.nullable()`: the server
20
- * serializes with `exclude_none`, so an absent field is OMITTED, never `null`.
21
16
  */
22
- export const loginMethod = z.discriminatedUnion('shape', [
23
- z.object({
24
- shape: z.literal('form'),
25
- id: z.string().min(1),
26
- title: z.string().min(1),
27
- purpose: z.enum(['login', 'invite']).default('login'),
28
- fields: z.array(loginFormField).min(1),
29
- submit_path: z.string().min(1),
30
- }),
31
- z.object({
32
- shape: z.literal('button'),
33
- id: z.string().min(1),
34
- label: z.string().min(1),
35
- icon: z.string().optional(),
36
- href: z.string().min(1),
37
- }),
38
- ]);
17
+ export const loginMethod = openapi.loginMethodsListing.shape.methods.element;
39
18
 
40
19
  /**
41
20
  * `GET /api/login/methods` (PUBLIC). `needs_setup: true` ⇒ no principal exists
42
21
  * yet, so the deployment must be initialized through the setup door before anyone
43
22
  * can sign in. `setup_login` names the login-credential kinds the setup door can
44
- * attach the owner's login with; it is `null`/absent when no login-attaching
45
- * accounts provider is configured (a keys-only deployment). Non-strict — the
46
- * skeleton may grow additive fields.
23
+ * attach the owner's login with; it is `null` when no login-attaching accounts
24
+ * provider is configured (a keys-only deployment). `claim_fragment_key` names the
25
+ * URL-fragment key a claim link carries its token under.
47
26
  */
48
- export const loginMethods = z.object({
49
- methods: z.array(loginMethod),
50
- needs_setup: z.boolean(),
51
- setup_login: z
52
- .object({ kinds: z.array(z.enum(['password', 'invite'])) })
53
- .nullable()
54
- .optional(),
55
- });
27
+ export const loginMethods = openapi.loginMethodsListing;
56
28
 
57
29
  /**
58
30
  * A successful login/exchange: the minted session token (opaque, `tai-sess-`
59
31
  * prefixed — the client treats it as an opaque string) + its user.
60
32
  */
61
- export const loginResult = z.object({
62
- token: z.string().min(1),
63
- user_id: z.string().min(1),
64
- });
33
+ export const loginResult = openapi.claimExchangeResult;
65
34
 
66
35
  export type LoginFormField = z.infer<typeof loginFormField>;
67
36
  export type LoginMethod = z.infer<typeof loginMethod>;