@cavi-ai/api-client 0.1.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 (665) hide show
  1. package/ARCHITECTURE.md +12 -0
  2. package/CHANGELOG.md +80 -0
  3. package/CONTRIBUTING.md +158 -0
  4. package/LICENSE +21 -0
  5. package/README.md +618 -0
  6. package/SECURITY.md +48 -0
  7. package/dist/contracts/index.d.ts +5 -0
  8. package/dist/contracts/index.d.ts.map +1 -0
  9. package/dist/contracts/index.js +4 -0
  10. package/dist/contracts/paths.d.ts +154 -0
  11. package/dist/contracts/paths.d.ts.map +1 -0
  12. package/dist/contracts/paths.js +89 -0
  13. package/dist/contracts/resolve.d.ts +7 -0
  14. package/dist/contracts/resolve.d.ts.map +1 -0
  15. package/dist/contracts/resolve.js +22 -0
  16. package/dist/contracts/surfaces.d.ts +13 -0
  17. package/dist/contracts/surfaces.d.ts.map +1 -0
  18. package/dist/contracts/surfaces.js +332 -0
  19. package/dist/contracts/team-manifest.d.ts +200 -0
  20. package/dist/contracts/team-manifest.d.ts.map +1 -0
  21. package/dist/contracts/team-manifest.js +951 -0
  22. package/dist/core/data/guards.d.ts +6 -0
  23. package/dist/core/data/guards.d.ts.map +1 -0
  24. package/dist/core/data/guards.js +22 -0
  25. package/dist/core/data/index.d.ts +2 -0
  26. package/dist/core/data/index.d.ts.map +1 -0
  27. package/dist/core/data/index.js +1 -0
  28. package/dist/core/env/config.d.ts +40 -0
  29. package/dist/core/env/config.d.ts.map +1 -0
  30. package/dist/core/env/config.js +44 -0
  31. package/dist/core/env/index.d.ts +3 -0
  32. package/dist/core/env/index.d.ts.map +1 -0
  33. package/dist/core/env/index.js +2 -0
  34. package/dist/core/env/repo-root.d.ts +11 -0
  35. package/dist/core/env/repo-root.d.ts.map +1 -0
  36. package/dist/core/env/repo-root.js +36 -0
  37. package/dist/core/gateway/agent/commands.d.ts +93 -0
  38. package/dist/core/gateway/agent/commands.d.ts.map +1 -0
  39. package/dist/core/gateway/agent/commands.js +351 -0
  40. package/dist/core/gateway/agent/config.d.ts +158 -0
  41. package/dist/core/gateway/agent/config.d.ts.map +1 -0
  42. package/dist/core/gateway/agent/config.js +536 -0
  43. package/dist/core/gateway/agent/index.d.ts +4 -0
  44. package/dist/core/gateway/agent/index.d.ts.map +1 -0
  45. package/dist/core/gateway/agent/index.js +3 -0
  46. package/dist/core/gateway/agent/voice-config.d.ts +20 -0
  47. package/dist/core/gateway/agent/voice-config.d.ts.map +1 -0
  48. package/dist/core/gateway/agent/voice-config.js +65 -0
  49. package/dist/core/gateway/client/capabilities.d.ts +28 -0
  50. package/dist/core/gateway/client/capabilities.d.ts.map +1 -0
  51. package/dist/core/gateway/client/capabilities.js +288 -0
  52. package/dist/core/gateway/client/client.d.ts +106 -0
  53. package/dist/core/gateway/client/client.d.ts.map +1 -0
  54. package/dist/core/gateway/client/client.js +41 -0
  55. package/dist/core/gateway/client/error-details.d.ts +17 -0
  56. package/dist/core/gateway/client/error-details.d.ts.map +1 -0
  57. package/dist/core/gateway/client/error-details.js +50 -0
  58. package/dist/core/gateway/client/fetch.d.ts +24 -0
  59. package/dist/core/gateway/client/fetch.d.ts.map +1 -0
  60. package/dist/core/gateway/client/fetch.js +98 -0
  61. package/dist/core/gateway/client/index.d.ts +6 -0
  62. package/dist/core/gateway/client/index.d.ts.map +1 -0
  63. package/dist/core/gateway/client/index.js +5 -0
  64. package/dist/core/gateway/client/runtime-targets.d.ts +11 -0
  65. package/dist/core/gateway/client/runtime-targets.d.ts.map +1 -0
  66. package/dist/core/gateway/client/runtime-targets.js +86 -0
  67. package/dist/core/gateway/envelope/envelope.d.ts +25 -0
  68. package/dist/core/gateway/envelope/envelope.d.ts.map +1 -0
  69. package/dist/core/gateway/envelope/envelope.js +141 -0
  70. package/dist/core/gateway/envelope/index.d.ts +3 -0
  71. package/dist/core/gateway/envelope/index.d.ts.map +1 -0
  72. package/dist/core/gateway/envelope/index.js +1 -0
  73. package/dist/core/gateway/envelope/types.d.ts +32 -0
  74. package/dist/core/gateway/envelope/types.d.ts.map +1 -0
  75. package/dist/core/gateway/envelope/types.js +1 -0
  76. package/dist/core/gateway/index.d.ts +11 -0
  77. package/dist/core/gateway/index.d.ts.map +1 -0
  78. package/dist/core/gateway/index.js +10 -0
  79. package/dist/core/gateway/jobs.d.ts +44 -0
  80. package/dist/core/gateway/jobs.d.ts.map +1 -0
  81. package/dist/core/gateway/jobs.js +104 -0
  82. package/dist/core/gateway/portal/config-patch.d.ts +42 -0
  83. package/dist/core/gateway/portal/config-patch.d.ts.map +1 -0
  84. package/dist/core/gateway/portal/config-patch.js +99 -0
  85. package/dist/core/gateway/portal/index.d.ts +2 -0
  86. package/dist/core/gateway/portal/index.d.ts.map +1 -0
  87. package/dist/core/gateway/portal/index.js +1 -0
  88. package/dist/core/gateway/providers/factory.d.ts +18 -0
  89. package/dist/core/gateway/providers/factory.d.ts.map +1 -0
  90. package/dist/core/gateway/providers/factory.js +40 -0
  91. package/dist/core/gateway/providers/index.d.ts +5 -0
  92. package/dist/core/gateway/providers/index.d.ts.map +1 -0
  93. package/dist/core/gateway/providers/index.js +4 -0
  94. package/dist/core/gateway/providers/normalize.d.ts +2 -0
  95. package/dist/core/gateway/providers/normalize.d.ts.map +1 -0
  96. package/dist/core/gateway/providers/normalize.js +6 -0
  97. package/dist/core/gateway/providers/registry.d.ts +5 -0
  98. package/dist/core/gateway/providers/registry.d.ts.map +1 -0
  99. package/dist/core/gateway/providers/registry.js +76 -0
  100. package/dist/core/gateway/providers/types.d.ts +42 -0
  101. package/dist/core/gateway/providers/types.d.ts.map +1 -0
  102. package/dist/core/gateway/providers/types.js +4 -0
  103. package/dist/core/gateway/resources/index.d.ts +3 -0
  104. package/dist/core/gateway/resources/index.d.ts.map +1 -0
  105. package/dist/core/gateway/resources/index.js +2 -0
  106. package/dist/core/gateway/resources/media.d.ts +165 -0
  107. package/dist/core/gateway/resources/media.d.ts.map +1 -0
  108. package/dist/core/gateway/resources/media.js +170 -0
  109. package/dist/core/gateway/resources/wiki.d.ts +136 -0
  110. package/dist/core/gateway/resources/wiki.d.ts.map +1 -0
  111. package/dist/core/gateway/resources/wiki.js +72 -0
  112. package/dist/core/gateway/rpc/client.d.ts +150 -0
  113. package/dist/core/gateway/rpc/client.d.ts.map +1 -0
  114. package/dist/core/gateway/rpc/client.js +675 -0
  115. package/dist/core/gateway/rpc/device-crypto.d.ts +19 -0
  116. package/dist/core/gateway/rpc/device-crypto.d.ts.map +1 -0
  117. package/dist/core/gateway/rpc/device-crypto.js +75 -0
  118. package/dist/core/gateway/rpc/device-store.d.ts +8 -0
  119. package/dist/core/gateway/rpc/device-store.d.ts.map +1 -0
  120. package/dist/core/gateway/rpc/device-store.js +113 -0
  121. package/dist/core/gateway/rpc/error.d.ts +5 -0
  122. package/dist/core/gateway/rpc/error.d.ts.map +1 -0
  123. package/dist/core/gateway/rpc/error.js +9 -0
  124. package/dist/core/gateway/rpc/index.d.ts +6 -0
  125. package/dist/core/gateway/rpc/index.d.ts.map +1 -0
  126. package/dist/core/gateway/rpc/index.js +5 -0
  127. package/dist/core/gateway/rpc/preauth-handshake.d.ts +39 -0
  128. package/dist/core/gateway/rpc/preauth-handshake.d.ts.map +1 -0
  129. package/dist/core/gateway/rpc/preauth-handshake.js +58 -0
  130. package/dist/core/gateway/run/contracts.d.ts +126 -0
  131. package/dist/core/gateway/run/contracts.d.ts.map +1 -0
  132. package/dist/core/gateway/run/contracts.js +23 -0
  133. package/dist/core/gateway/run/event-stream.d.ts +106 -0
  134. package/dist/core/gateway/run/event-stream.d.ts.map +1 -0
  135. package/dist/core/gateway/run/event-stream.js +264 -0
  136. package/dist/core/gateway/run/index.d.ts +5 -0
  137. package/dist/core/gateway/run/index.d.ts.map +1 -0
  138. package/dist/core/gateway/run/index.js +4 -0
  139. package/dist/core/gateway/run/sse-run-event-provider.d.ts +55 -0
  140. package/dist/core/gateway/run/sse-run-event-provider.d.ts.map +1 -0
  141. package/dist/core/gateway/run/sse-run-event-provider.js +394 -0
  142. package/dist/core/gateway/run/stream-failure.d.ts +11 -0
  143. package/dist/core/gateway/run/stream-failure.d.ts.map +1 -0
  144. package/dist/core/gateway/run/stream-failure.js +101 -0
  145. package/dist/core/gateway/snapshots/cache.d.ts +7 -0
  146. package/dist/core/gateway/snapshots/cache.d.ts.map +1 -0
  147. package/dist/core/gateway/snapshots/cache.js +13 -0
  148. package/dist/core/gateway/snapshots/contracts.d.ts +279 -0
  149. package/dist/core/gateway/snapshots/contracts.d.ts.map +1 -0
  150. package/dist/core/gateway/snapshots/contracts.js +1 -0
  151. package/dist/core/gateway/snapshots/index.d.ts +7 -0
  152. package/dist/core/gateway/snapshots/index.d.ts.map +1 -0
  153. package/dist/core/gateway/snapshots/index.js +6 -0
  154. package/dist/core/gateway/snapshots/loaders.d.ts +76 -0
  155. package/dist/core/gateway/snapshots/loaders.d.ts.map +1 -0
  156. package/dist/core/gateway/snapshots/loaders.js +515 -0
  157. package/dist/core/gateway/snapshots/session-loaders.d.ts +116 -0
  158. package/dist/core/gateway/snapshots/session-loaders.d.ts.map +1 -0
  159. package/dist/core/gateway/snapshots/session-loaders.js +310 -0
  160. package/dist/core/gateway/snapshots/system-loaders.d.ts +16 -0
  161. package/dist/core/gateway/snapshots/system-loaders.d.ts.map +1 -0
  162. package/dist/core/gateway/snapshots/system-loaders.js +61 -0
  163. package/dist/core/gateway/snapshots/transforms.d.ts +38 -0
  164. package/dist/core/gateway/snapshots/transforms.d.ts.map +1 -0
  165. package/dist/core/gateway/snapshots/transforms.js +328 -0
  166. package/dist/core/http/client-id.d.ts +6 -0
  167. package/dist/core/http/client-id.d.ts.map +1 -0
  168. package/dist/core/http/client-id.js +29 -0
  169. package/dist/core/http/client.d.ts +25 -0
  170. package/dist/core/http/client.d.ts.map +1 -0
  171. package/dist/core/http/client.js +234 -0
  172. package/dist/core/http/contracts.d.ts +3 -0
  173. package/dist/core/http/contracts.d.ts.map +1 -0
  174. package/dist/core/http/contracts.js +5 -0
  175. package/dist/core/http/errors.d.ts +17 -0
  176. package/dist/core/http/errors.d.ts.map +1 -0
  177. package/dist/core/http/errors.js +16 -0
  178. package/dist/core/http/gateway-error.d.ts +15 -0
  179. package/dist/core/http/gateway-error.d.ts.map +1 -0
  180. package/dist/core/http/gateway-error.js +15 -0
  181. package/dist/core/http/index.d.ts +10 -0
  182. package/dist/core/http/index.d.ts.map +1 -0
  183. package/dist/core/http/index.js +9 -0
  184. package/dist/core/http/json-client.d.ts +17 -0
  185. package/dist/core/http/json-client.d.ts.map +1 -0
  186. package/dist/core/http/json-client.js +62 -0
  187. package/dist/core/http/raw-client.d.ts +16 -0
  188. package/dist/core/http/raw-client.d.ts.map +1 -0
  189. package/dist/core/http/raw-client.js +36 -0
  190. package/dist/core/http/redaction.d.ts +20 -0
  191. package/dist/core/http/redaction.d.ts.map +1 -0
  192. package/dist/core/http/redaction.js +58 -0
  193. package/dist/core/http/types.d.ts +44 -0
  194. package/dist/core/http/types.d.ts.map +1 -0
  195. package/dist/core/http/types.js +3 -0
  196. package/dist/core/runtime/index.d.ts +2 -0
  197. package/dist/core/runtime/index.d.ts.map +1 -0
  198. package/dist/core/runtime/index.js +1 -0
  199. package/dist/core/runtime/paths.d.ts +5 -0
  200. package/dist/core/runtime/paths.d.ts.map +1 -0
  201. package/dist/core/runtime/paths.js +29 -0
  202. package/dist/core/sse/index.d.ts +2 -0
  203. package/dist/core/sse/index.d.ts.map +1 -0
  204. package/dist/core/sse/index.js +1 -0
  205. package/dist/core/sse/stream.d.ts +17 -0
  206. package/dist/core/sse/stream.d.ts.map +1 -0
  207. package/dist/core/sse/stream.js +106 -0
  208. package/dist/core/ws/close.d.ts +11 -0
  209. package/dist/core/ws/close.d.ts.map +1 -0
  210. package/dist/core/ws/close.js +34 -0
  211. package/dist/core/ws/gateway-websocket.d.ts +2 -0
  212. package/dist/core/ws/gateway-websocket.d.ts.map +1 -0
  213. package/dist/core/ws/gateway-websocket.js +1 -0
  214. package/dist/core/ws/index.d.ts +4 -0
  215. package/dist/core/ws/index.d.ts.map +1 -0
  216. package/dist/core/ws/index.js +3 -0
  217. package/dist/core/ws/targets.d.ts +21 -0
  218. package/dist/core/ws/targets.d.ts.map +1 -0
  219. package/dist/core/ws/targets.js +61 -0
  220. package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-loaders.d.ts +21 -0
  221. package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-loaders.d.ts.map +1 -0
  222. package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-loaders.js +22 -0
  223. package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-snapshot-loaders.d.ts +30 -0
  224. package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-snapshot-loaders.d.ts.map +1 -0
  225. package/dist/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-snapshot-loaders.js +72 -0
  226. package/dist/extensions/cavi/adapters/cavi-control-adapters/library-live.d.ts +4 -0
  227. package/dist/extensions/cavi/adapters/cavi-control-adapters/library-live.d.ts.map +1 -0
  228. package/dist/extensions/cavi/adapters/cavi-control-adapters/library-live.js +66 -0
  229. package/dist/extensions/cavi/adapters/cavi-control-adapters/operator-control-live.d.ts +7 -0
  230. package/dist/extensions/cavi/adapters/cavi-control-adapters/operator-control-live.d.ts.map +1 -0
  231. package/dist/extensions/cavi/adapters/cavi-control-adapters/operator-control-live.js +318 -0
  232. package/dist/extensions/cavi/adapters/create-cavi-control-adapters.d.ts +88 -0
  233. package/dist/extensions/cavi/adapters/create-cavi-control-adapters.d.ts.map +1 -0
  234. package/dist/extensions/cavi/adapters/create-cavi-control-adapters.js +172 -0
  235. package/dist/extensions/cavi/client.d.ts +72 -0
  236. package/dist/extensions/cavi/client.d.ts.map +1 -0
  237. package/dist/extensions/cavi/client.js +19 -0
  238. package/dist/extensions/cavi/contracts/index.d.ts +6 -0
  239. package/dist/extensions/cavi/contracts/index.d.ts.map +1 -0
  240. package/dist/extensions/cavi/contracts/index.js +5 -0
  241. package/dist/extensions/cavi/contracts/mobile.d.ts +441 -0
  242. package/dist/extensions/cavi/contracts/mobile.d.ts.map +1 -0
  243. package/dist/extensions/cavi/contracts/mobile.js +467 -0
  244. package/dist/extensions/cavi/contracts/paths.d.ts +121 -0
  245. package/dist/extensions/cavi/contracts/paths.d.ts.map +1 -0
  246. package/dist/extensions/cavi/contracts/paths.js +197 -0
  247. package/dist/extensions/cavi/contracts/portals.d.ts +78 -0
  248. package/dist/extensions/cavi/contracts/portals.d.ts.map +1 -0
  249. package/dist/extensions/cavi/contracts/portals.js +70 -0
  250. package/dist/extensions/cavi/contracts/resolve.d.ts +3 -0
  251. package/dist/extensions/cavi/contracts/resolve.d.ts.map +1 -0
  252. package/dist/extensions/cavi/contracts/resolve.js +4 -0
  253. package/dist/extensions/cavi/contracts/surfaces.d.ts +5 -0
  254. package/dist/extensions/cavi/contracts/surfaces.d.ts.map +1 -0
  255. package/dist/extensions/cavi/contracts/surfaces.js +551 -0
  256. package/dist/extensions/cavi/discourse/contracts.d.ts +5 -0
  257. package/dist/extensions/cavi/discourse/contracts.d.ts.map +1 -0
  258. package/dist/extensions/cavi/discourse/contracts.js +7 -0
  259. package/dist/extensions/cavi/discourse/fallback.d.ts +3 -0
  260. package/dist/extensions/cavi/discourse/fallback.d.ts.map +1 -0
  261. package/dist/extensions/cavi/discourse/fallback.js +364 -0
  262. package/dist/extensions/cavi/discourse/live.d.ts +5 -0
  263. package/dist/extensions/cavi/discourse/live.d.ts.map +1 -0
  264. package/dist/extensions/cavi/discourse/live.js +22 -0
  265. package/dist/extensions/cavi/discourse/normalize-helpers.d.ts +11 -0
  266. package/dist/extensions/cavi/discourse/normalize-helpers.d.ts.map +1 -0
  267. package/dist/extensions/cavi/discourse/normalize-helpers.js +155 -0
  268. package/dist/extensions/cavi/discourse/normalize.d.ts +4 -0
  269. package/dist/extensions/cavi/discourse/normalize.d.ts.map +1 -0
  270. package/dist/extensions/cavi/discourse/normalize.js +287 -0
  271. package/dist/extensions/cavi/domain/discourse.d.ts +161 -0
  272. package/dist/extensions/cavi/domain/discourse.d.ts.map +1 -0
  273. package/dist/extensions/cavi/domain/discourse.js +1 -0
  274. package/dist/extensions/cavi/domain/index.d.ts +6 -0
  275. package/dist/extensions/cavi/domain/index.d.ts.map +1 -0
  276. package/dist/extensions/cavi/domain/index.js +5 -0
  277. package/dist/extensions/cavi/domain/library.d.ts +80 -0
  278. package/dist/extensions/cavi/domain/library.d.ts.map +1 -0
  279. package/dist/extensions/cavi/domain/library.js +2 -0
  280. package/dist/extensions/cavi/domain/observability.d.ts +34 -0
  281. package/dist/extensions/cavi/domain/observability.d.ts.map +1 -0
  282. package/dist/extensions/cavi/domain/observability.js +1 -0
  283. package/dist/extensions/cavi/domain/operator.d.ts +420 -0
  284. package/dist/extensions/cavi/domain/operator.d.ts.map +1 -0
  285. package/dist/extensions/cavi/domain/operator.js +1 -0
  286. package/dist/extensions/cavi/domain/project-board.d.ts +96 -0
  287. package/dist/extensions/cavi/domain/project-board.d.ts.map +1 -0
  288. package/dist/extensions/cavi/domain/project-board.js +1 -0
  289. package/dist/extensions/cavi/fallbacks/provider.d.ts +13 -0
  290. package/dist/extensions/cavi/fallbacks/provider.d.ts.map +1 -0
  291. package/dist/extensions/cavi/fallbacks/provider.js +23 -0
  292. package/dist/extensions/cavi/fallbacks/snapshots/agent-memory.d.ts +3 -0
  293. package/dist/extensions/cavi/fallbacks/snapshots/agent-memory.d.ts.map +1 -0
  294. package/dist/extensions/cavi/fallbacks/snapshots/agent-memory.js +6 -0
  295. package/dist/extensions/cavi/fallbacks/snapshots/cost-history.d.ts +3 -0
  296. package/dist/extensions/cavi/fallbacks/snapshots/cost-history.d.ts.map +1 -0
  297. package/dist/extensions/cavi/fallbacks/snapshots/cost-history.js +73 -0
  298. package/dist/extensions/cavi/fallbacks/snapshots/incidents.d.ts +3 -0
  299. package/dist/extensions/cavi/fallbacks/snapshots/incidents.d.ts.map +1 -0
  300. package/dist/extensions/cavi/fallbacks/snapshots/incidents.js +50 -0
  301. package/dist/extensions/cavi/fallbacks/snapshots/index.d.ts +10 -0
  302. package/dist/extensions/cavi/fallbacks/snapshots/index.d.ts.map +1 -0
  303. package/dist/extensions/cavi/fallbacks/snapshots/index.js +9 -0
  304. package/dist/extensions/cavi/fallbacks/snapshots/library.d.ts +3 -0
  305. package/dist/extensions/cavi/fallbacks/snapshots/library.d.ts.map +1 -0
  306. package/dist/extensions/cavi/fallbacks/snapshots/library.js +110 -0
  307. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/defaults.d.ts +8 -0
  308. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/defaults.d.ts.map +1 -0
  309. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/defaults.js +29 -0
  310. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/index.d.ts +4 -0
  311. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/index.d.ts.map +1 -0
  312. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/index.js +3 -0
  313. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-memory.d.ts +3 -0
  314. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-memory.d.ts.map +1 -0
  315. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-memory.js +63 -0
  316. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-registry-detail.d.ts +3 -0
  317. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-registry-detail.d.ts.map +1 -0
  318. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-registry-detail.js +716 -0
  319. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-section-status.d.ts +3 -0
  320. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-section-status.d.ts.map +1 -0
  321. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-section-status.js +38 -0
  322. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-status.d.ts +3 -0
  323. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-status.d.ts.map +1 -0
  324. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-status.js +84 -0
  325. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-tasks.d.ts +3 -0
  326. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-tasks.d.ts.map +1 -0
  327. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-tasks.js +111 -0
  328. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-ready.d.ts +3 -0
  329. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-ready.d.ts.map +1 -0
  330. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-ready.js +16 -0
  331. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-tasks.d.ts +3 -0
  332. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-tasks.d.ts.map +1 -0
  333. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-tasks.js +43 -0
  334. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot.d.ts +3 -0
  335. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot.d.ts.map +1 -0
  336. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/snapshot.js +16 -0
  337. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/transports.d.ts +4 -0
  338. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/transports.d.ts.map +1 -0
  339. package/dist/extensions/cavi/fallbacks/snapshots/operator-control/transports.js +65 -0
  340. package/dist/extensions/cavi/fallbacks/snapshots/overview.d.ts +3 -0
  341. package/dist/extensions/cavi/fallbacks/snapshots/overview.d.ts.map +1 -0
  342. package/dist/extensions/cavi/fallbacks/snapshots/overview.js +40 -0
  343. package/dist/extensions/cavi/fallbacks/snapshots/routing.d.ts +3 -0
  344. package/dist/extensions/cavi/fallbacks/snapshots/routing.d.ts.map +1 -0
  345. package/dist/extensions/cavi/fallbacks/snapshots/routing.js +36 -0
  346. package/dist/extensions/cavi/fallbacks/snapshots/runs.d.ts +4 -0
  347. package/dist/extensions/cavi/fallbacks/snapshots/runs.d.ts.map +1 -0
  348. package/dist/extensions/cavi/fallbacks/snapshots/runs.js +133 -0
  349. package/dist/extensions/cavi/fallbacks/snapshots/shared.d.ts +2 -0
  350. package/dist/extensions/cavi/fallbacks/snapshots/shared.d.ts.map +1 -0
  351. package/dist/extensions/cavi/fallbacks/snapshots/shared.js +1 -0
  352. package/dist/extensions/cavi/index.d.ts +27 -0
  353. package/dist/extensions/cavi/index.d.ts.map +1 -0
  354. package/dist/extensions/cavi/index.js +26 -0
  355. package/dist/extensions/cavi/library/api.d.ts +18 -0
  356. package/dist/extensions/cavi/library/api.d.ts.map +1 -0
  357. package/dist/extensions/cavi/library/api.js +67 -0
  358. package/dist/extensions/cavi/library/client.d.ts +51 -0
  359. package/dist/extensions/cavi/library/client.d.ts.map +1 -0
  360. package/dist/extensions/cavi/library/client.js +23 -0
  361. package/dist/extensions/cavi/library/clip.d.ts +93 -0
  362. package/dist/extensions/cavi/library/clip.d.ts.map +1 -0
  363. package/dist/extensions/cavi/library/clip.js +272 -0
  364. package/dist/extensions/cavi/operator-control/constants.d.ts +4 -0
  365. package/dist/extensions/cavi/operator-control/constants.d.ts.map +1 -0
  366. package/dist/extensions/cavi/operator-control/constants.js +3 -0
  367. package/dist/extensions/cavi/operator-control/defaults.d.ts +11 -0
  368. package/dist/extensions/cavi/operator-control/defaults.d.ts.map +1 -0
  369. package/dist/extensions/cavi/operator-control/defaults.js +243 -0
  370. package/dist/extensions/cavi/operator-control/load-section.d.ts +24 -0
  371. package/dist/extensions/cavi/operator-control/load-section.d.ts.map +1 -0
  372. package/dist/extensions/cavi/operator-control/load-section.js +46 -0
  373. package/dist/extensions/cavi/portal/client.d.ts +16 -0
  374. package/dist/extensions/cavi/portal/client.d.ts.map +1 -0
  375. package/dist/extensions/cavi/portal/client.js +38 -0
  376. package/dist/extensions/cavi/portal/tts.d.ts +69 -0
  377. package/dist/extensions/cavi/portal/tts.d.ts.map +1 -0
  378. package/dist/extensions/cavi/portal/tts.js +116 -0
  379. package/dist/extensions/cavi/project-board/constants.d.ts +68 -0
  380. package/dist/extensions/cavi/project-board/constants.d.ts.map +1 -0
  381. package/dist/extensions/cavi/project-board/constants.js +9 -0
  382. package/dist/extensions/cavi/project-board/fallback.d.ts +3 -0
  383. package/dist/extensions/cavi/project-board/fallback.d.ts.map +1 -0
  384. package/dist/extensions/cavi/project-board/fallback.js +127 -0
  385. package/dist/extensions/cavi/project-board/live.d.ts +16 -0
  386. package/dist/extensions/cavi/project-board/live.d.ts.map +1 -0
  387. package/dist/extensions/cavi/project-board/live.js +86 -0
  388. package/dist/extensions/cavi/project-board/mutations.d.ts +43 -0
  389. package/dist/extensions/cavi/project-board/mutations.d.ts.map +1 -0
  390. package/dist/extensions/cavi/project-board/mutations.js +210 -0
  391. package/dist/extensions/cavi/project-board/normalize.d.ts +23 -0
  392. package/dist/extensions/cavi/project-board/normalize.d.ts.map +1 -0
  393. package/dist/extensions/cavi/project-board/normalize.js +410 -0
  394. package/dist/extensions/cavi/project-board/trace-id.d.ts +2 -0
  395. package/dist/extensions/cavi/project-board/trace-id.d.ts.map +1 -0
  396. package/dist/extensions/cavi/project-board/trace-id.js +7 -0
  397. package/dist/extensions/cavi/registry/canonical-team-registry.d.ts +41 -0
  398. package/dist/extensions/cavi/registry/canonical-team-registry.d.ts.map +1 -0
  399. package/dist/extensions/cavi/registry/canonical-team-registry.js +102 -0
  400. package/dist/extensions/cavi/registry/portal-library-registry.d.ts +6 -0
  401. package/dist/extensions/cavi/registry/portal-library-registry.d.ts.map +1 -0
  402. package/dist/extensions/cavi/registry/portal-library-registry.js +17 -0
  403. package/dist/extensions/cavi/registry/session-keys.d.ts +16 -0
  404. package/dist/extensions/cavi/registry/session-keys.d.ts.map +1 -0
  405. package/dist/extensions/cavi/registry/session-keys.js +68 -0
  406. package/dist/extensions/cavi/registry/team-registry-config.d.ts +6 -0
  407. package/dist/extensions/cavi/registry/team-registry-config.d.ts.map +1 -0
  408. package/dist/extensions/cavi/registry/team-registry-config.js +23 -0
  409. package/dist/extensions/cavi/registry/team-registry.d.ts +49 -0
  410. package/dist/extensions/cavi/registry/team-registry.d.ts.map +1 -0
  411. package/dist/extensions/cavi/registry/team-registry.js +290 -0
  412. package/dist/extensions/cavi/runtime/env-config.d.ts +35 -0
  413. package/dist/extensions/cavi/runtime/env-config.d.ts.map +1 -0
  414. package/dist/extensions/cavi/runtime/env-config.js +74 -0
  415. package/dist/extensions/cavi/runtime/paths.d.ts +11 -0
  416. package/dist/extensions/cavi/runtime/paths.d.ts.map +1 -0
  417. package/dist/extensions/cavi/runtime/paths.js +43 -0
  418. package/dist/extensions/cavi/runtime/standalone-mode.d.ts +3 -0
  419. package/dist/extensions/cavi/runtime/standalone-mode.d.ts.map +1 -0
  420. package/dist/extensions/cavi/runtime/standalone-mode.js +15 -0
  421. package/dist/index.d.ts +70 -0
  422. package/dist/index.d.ts.map +1 -0
  423. package/dist/index.js +75 -0
  424. package/dist/providers/hermes/agent-config.d.ts +36 -0
  425. package/dist/providers/hermes/agent-config.d.ts.map +1 -0
  426. package/dist/providers/hermes/agent-config.js +242 -0
  427. package/dist/providers/hermes/chat-run.d.ts +106 -0
  428. package/dist/providers/hermes/chat-run.d.ts.map +1 -0
  429. package/dist/providers/hermes/chat-run.js +221 -0
  430. package/dist/providers/hermes/client.d.ts +13 -0
  431. package/dist/providers/hermes/client.d.ts.map +1 -0
  432. package/dist/providers/hermes/client.js +6 -0
  433. package/dist/providers/hermes/env-config.d.ts +18 -0
  434. package/dist/providers/hermes/env-config.d.ts.map +1 -0
  435. package/dist/providers/hermes/env-config.js +38 -0
  436. package/dist/providers/hermes/index.d.ts +12 -0
  437. package/dist/providers/hermes/index.d.ts.map +1 -0
  438. package/dist/providers/hermes/index.js +11 -0
  439. package/dist/providers/hermes/media.d.ts +6 -0
  440. package/dist/providers/hermes/media.d.ts.map +1 -0
  441. package/dist/providers/hermes/media.js +10 -0
  442. package/dist/providers/hermes/provider-module.d.ts +3 -0
  443. package/dist/providers/hermes/provider-module.d.ts.map +1 -0
  444. package/dist/providers/hermes/provider-module.js +22 -0
  445. package/dist/providers/hermes/sse-run-event-provider.d.ts +24 -0
  446. package/dist/providers/hermes/sse-run-event-provider.d.ts.map +1 -0
  447. package/dist/providers/hermes/sse-run-event-provider.js +32 -0
  448. package/dist/providers/hermes/team-registry-config.d.ts +3 -0
  449. package/dist/providers/hermes/team-registry-config.d.ts.map +1 -0
  450. package/dist/providers/hermes/team-registry-config.js +1 -0
  451. package/dist/providers/hermes/team-registry.d.ts +3 -0
  452. package/dist/providers/hermes/team-registry.d.ts.map +1 -0
  453. package/dist/providers/hermes/team-registry.js +5 -0
  454. package/dist/providers/hermes/websocket.d.ts +6 -0
  455. package/dist/providers/hermes/websocket.d.ts.map +1 -0
  456. package/dist/providers/hermes/websocket.js +6 -0
  457. package/dist/providers/hermes/wiki.d.ts +6 -0
  458. package/dist/providers/hermes/wiki.d.ts.map +1 -0
  459. package/dist/providers/hermes/wiki.js +10 -0
  460. package/dist/providers/openclaw/agent-config.d.ts +6 -0
  461. package/dist/providers/openclaw/agent-config.d.ts.map +1 -0
  462. package/dist/providers/openclaw/agent-config.js +10 -0
  463. package/dist/providers/openclaw/client.d.ts +13 -0
  464. package/dist/providers/openclaw/client.d.ts.map +1 -0
  465. package/dist/providers/openclaw/client.js +6 -0
  466. package/dist/providers/openclaw/index.d.ts +10 -0
  467. package/dist/providers/openclaw/index.d.ts.map +1 -0
  468. package/dist/providers/openclaw/index.js +9 -0
  469. package/dist/providers/openclaw/media.d.ts +6 -0
  470. package/dist/providers/openclaw/media.d.ts.map +1 -0
  471. package/dist/providers/openclaw/media.js +10 -0
  472. package/dist/providers/openclaw/provider-module.d.ts +3 -0
  473. package/dist/providers/openclaw/provider-module.d.ts.map +1 -0
  474. package/dist/providers/openclaw/provider-module.js +16 -0
  475. package/dist/providers/openclaw/sse-run-event-provider.d.ts +6 -0
  476. package/dist/providers/openclaw/sse-run-event-provider.d.ts.map +1 -0
  477. package/dist/providers/openclaw/sse-run-event-provider.js +10 -0
  478. package/dist/providers/openclaw/team-registry-config.d.ts +3 -0
  479. package/dist/providers/openclaw/team-registry-config.d.ts.map +1 -0
  480. package/dist/providers/openclaw/team-registry-config.js +1 -0
  481. package/dist/providers/openclaw/team-registry.d.ts +3 -0
  482. package/dist/providers/openclaw/team-registry.d.ts.map +1 -0
  483. package/dist/providers/openclaw/team-registry.js +5 -0
  484. package/dist/providers/openclaw/websocket.d.ts +6 -0
  485. package/dist/providers/openclaw/websocket.d.ts.map +1 -0
  486. package/dist/providers/openclaw/websocket.js +28 -0
  487. package/dist/providers/openclaw/wiki.d.ts +6 -0
  488. package/dist/providers/openclaw/wiki.d.ts.map +1 -0
  489. package/dist/providers/openclaw/wiki.js +10 -0
  490. package/dist/react/gateway-provider.d.ts +142 -0
  491. package/dist/react/gateway-provider.d.ts.map +1 -0
  492. package/dist/react/gateway-provider.js +569 -0
  493. package/dist/react/index.d.ts +2 -0
  494. package/dist/react/index.d.ts.map +1 -0
  495. package/dist/react/index.js +1 -0
  496. package/docs/assets/api-client-hero.svg +73 -0
  497. package/docs/cavi-team-manifest.example.ts +219 -0
  498. package/docs/team-manifest.consumer.template.ts +248 -0
  499. package/docs/team-manifest.md +252 -0
  500. package/package.json +152 -0
  501. package/src/contracts/index.ts +4 -0
  502. package/src/contracts/paths.ts +126 -0
  503. package/src/contracts/resolve.ts +42 -0
  504. package/src/contracts/surfaces.ts +366 -0
  505. package/src/contracts/team-manifest.ts +1402 -0
  506. package/src/core/data/guards.ts +26 -0
  507. package/src/core/data/index.ts +1 -0
  508. package/src/core/env/config.ts +97 -0
  509. package/src/core/env/index.ts +2 -0
  510. package/src/core/env/repo-root.ts +59 -0
  511. package/src/core/gateway/README.md +35 -0
  512. package/src/core/gateway/agent/commands.ts +482 -0
  513. package/src/core/gateway/agent/config.ts +786 -0
  514. package/src/core/gateway/agent/index.ts +3 -0
  515. package/src/core/gateway/agent/voice-config.ts +91 -0
  516. package/src/core/gateway/client/capabilities.ts +385 -0
  517. package/src/core/gateway/client/client.ts +137 -0
  518. package/src/core/gateway/client/error-details.ts +74 -0
  519. package/src/core/gateway/client/fetch.ts +180 -0
  520. package/src/core/gateway/client/index.ts +5 -0
  521. package/src/core/gateway/client/runtime-targets.ts +132 -0
  522. package/src/core/gateway/envelope/envelope.ts +204 -0
  523. package/src/core/gateway/envelope/index.ts +2 -0
  524. package/src/core/gateway/envelope/types.ts +48 -0
  525. package/src/core/gateway/index.ts +10 -0
  526. package/src/core/gateway/jobs.ts +178 -0
  527. package/src/core/gateway/portal/config-patch.ts +136 -0
  528. package/src/core/gateway/portal/index.ts +1 -0
  529. package/src/core/gateway/providers/factory.ts +77 -0
  530. package/src/core/gateway/providers/index.ts +4 -0
  531. package/src/core/gateway/providers/normalize.ts +7 -0
  532. package/src/core/gateway/providers/registry.ts +96 -0
  533. package/src/core/gateway/providers/types.ts +73 -0
  534. package/src/core/gateway/resources/index.ts +2 -0
  535. package/src/core/gateway/resources/media.ts +474 -0
  536. package/src/core/gateway/resources/wiki.ts +301 -0
  537. package/src/core/gateway/rpc/client.ts +1067 -0
  538. package/src/core/gateway/rpc/device-crypto.ts +101 -0
  539. package/src/core/gateway/rpc/device-store.ts +147 -0
  540. package/src/core/gateway/rpc/error.ts +11 -0
  541. package/src/core/gateway/rpc/index.ts +5 -0
  542. package/src/core/gateway/rpc/preauth-handshake.ts +99 -0
  543. package/src/core/gateway/run/contracts.ts +155 -0
  544. package/src/core/gateway/run/event-stream.ts +373 -0
  545. package/src/core/gateway/run/index.ts +4 -0
  546. package/src/core/gateway/run/sse-run-event-provider.ts +513 -0
  547. package/src/core/gateway/run/stream-failure.ts +135 -0
  548. package/src/core/gateway/snapshots/cache.ts +22 -0
  549. package/src/core/gateway/snapshots/contracts.ts +293 -0
  550. package/src/core/gateway/snapshots/index.ts +6 -0
  551. package/src/core/gateway/snapshots/loaders.ts +738 -0
  552. package/src/core/gateway/snapshots/session-loaders.ts +534 -0
  553. package/src/core/gateway/snapshots/system-loaders.ts +93 -0
  554. package/src/core/gateway/snapshots/transforms.ts +508 -0
  555. package/src/core/http/client-id.ts +40 -0
  556. package/src/core/http/client.ts +271 -0
  557. package/src/core/http/contracts.ts +9 -0
  558. package/src/core/http/errors.ts +26 -0
  559. package/src/core/http/gateway-error.ts +38 -0
  560. package/src/core/http/index.ts +9 -0
  561. package/src/core/http/json-client.ts +90 -0
  562. package/src/core/http/raw-client.ts +57 -0
  563. package/src/core/http/redaction.ts +78 -0
  564. package/src/core/http/types.ts +59 -0
  565. package/src/core/runtime/index.ts +1 -0
  566. package/src/core/runtime/paths.ts +44 -0
  567. package/src/core/sse/index.ts +1 -0
  568. package/src/core/sse/stream.ts +118 -0
  569. package/src/core/ws/close.ts +51 -0
  570. package/src/core/ws/gateway-websocket.ts +8 -0
  571. package/src/core/ws/index.ts +3 -0
  572. package/src/core/ws/targets.ts +74 -0
  573. package/src/extensions/README.md +16 -0
  574. package/src/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-loaders.ts +33 -0
  575. package/src/extensions/cavi/adapters/cavi-control-adapters/gateway-ws-snapshot-loaders.ts +152 -0
  576. package/src/extensions/cavi/adapters/cavi-control-adapters/library-live.ts +120 -0
  577. package/src/extensions/cavi/adapters/cavi-control-adapters/operator-control-live.ts +422 -0
  578. package/src/extensions/cavi/adapters/create-cavi-control-adapters.ts +350 -0
  579. package/src/extensions/cavi/client.ts +25 -0
  580. package/src/extensions/cavi/contracts/index.ts +5 -0
  581. package/src/extensions/cavi/contracts/mobile.ts +528 -0
  582. package/src/extensions/cavi/contracts/paths.ts +242 -0
  583. package/src/extensions/cavi/contracts/portals.ts +165 -0
  584. package/src/extensions/cavi/contracts/resolve.ts +6 -0
  585. package/src/extensions/cavi/contracts/surfaces.ts +567 -0
  586. package/src/extensions/cavi/discourse/contracts.ts +9 -0
  587. package/src/extensions/cavi/discourse/fallback.ts +387 -0
  588. package/src/extensions/cavi/discourse/live.ts +36 -0
  589. package/src/extensions/cavi/discourse/normalize-helpers.ts +202 -0
  590. package/src/extensions/cavi/discourse/normalize.ts +415 -0
  591. package/src/extensions/cavi/domain/discourse.ts +209 -0
  592. package/src/extensions/cavi/domain/index.ts +5 -0
  593. package/src/extensions/cavi/domain/library.ts +96 -0
  594. package/src/extensions/cavi/domain/observability.ts +36 -0
  595. package/src/extensions/cavi/domain/operator.ts +486 -0
  596. package/src/extensions/cavi/domain/project-board.ts +107 -0
  597. package/src/extensions/cavi/fallbacks/provider.ts +57 -0
  598. package/src/extensions/cavi/fallbacks/snapshots/agent-memory.ts +8 -0
  599. package/src/extensions/cavi/fallbacks/snapshots/cost-history.ts +101 -0
  600. package/src/extensions/cavi/fallbacks/snapshots/incidents.ts +56 -0
  601. package/src/extensions/cavi/fallbacks/snapshots/index.ts +9 -0
  602. package/src/extensions/cavi/fallbacks/snapshots/library.ts +112 -0
  603. package/src/extensions/cavi/fallbacks/snapshots/operator-control/defaults.ts +57 -0
  604. package/src/extensions/cavi/fallbacks/snapshots/operator-control/index.ts +3 -0
  605. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-memory.ts +65 -0
  606. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-registry-detail.ts +735 -0
  607. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-section-status.ts +41 -0
  608. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-status.ts +87 -0
  609. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-tasks.ts +113 -0
  610. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-ready.ts +19 -0
  611. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot-worker-tasks.ts +46 -0
  612. package/src/extensions/cavi/fallbacks/snapshots/operator-control/snapshot.ts +18 -0
  613. package/src/extensions/cavi/fallbacks/snapshots/operator-control/transports.ts +81 -0
  614. package/src/extensions/cavi/fallbacks/snapshots/overview.ts +42 -0
  615. package/src/extensions/cavi/fallbacks/snapshots/routing.ts +38 -0
  616. package/src/extensions/cavi/fallbacks/snapshots/runs.ts +141 -0
  617. package/src/extensions/cavi/fallbacks/snapshots/shared.ts +1 -0
  618. package/src/extensions/cavi/index.ts +52 -0
  619. package/src/extensions/cavi/library/api.ts +120 -0
  620. package/src/extensions/cavi/library/client.ts +54 -0
  621. package/src/extensions/cavi/library/clip.ts +389 -0
  622. package/src/extensions/cavi/operator-control/constants.ts +3 -0
  623. package/src/extensions/cavi/operator-control/defaults.ts +254 -0
  624. package/src/extensions/cavi/operator-control/load-section.ts +92 -0
  625. package/src/extensions/cavi/portal/client.ts +63 -0
  626. package/src/extensions/cavi/portal/tts.ts +213 -0
  627. package/src/extensions/cavi/project-board/constants.ts +84 -0
  628. package/src/extensions/cavi/project-board/fallback.ts +129 -0
  629. package/src/extensions/cavi/project-board/live.ts +121 -0
  630. package/src/extensions/cavi/project-board/mutations.ts +306 -0
  631. package/src/extensions/cavi/project-board/normalize.ts +552 -0
  632. package/src/extensions/cavi/project-board/trace-id.ts +9 -0
  633. package/src/extensions/cavi/registry/canonical-team-registry.ts +193 -0
  634. package/src/extensions/cavi/registry/portal-library-registry.ts +24 -0
  635. package/src/extensions/cavi/registry/session-keys.ts +92 -0
  636. package/src/extensions/cavi/registry/team-registry-config.ts +36 -0
  637. package/src/extensions/cavi/registry/team-registry.ts +414 -0
  638. package/src/extensions/cavi/runtime/env-config.ts +114 -0
  639. package/src/extensions/cavi/runtime/paths.ts +82 -0
  640. package/src/extensions/cavi/runtime/standalone-mode.ts +28 -0
  641. package/src/index.ts +576 -0
  642. package/src/providers/hermes/agent-config.ts +322 -0
  643. package/src/providers/hermes/chat-run.ts +340 -0
  644. package/src/providers/hermes/client.ts +21 -0
  645. package/src/providers/hermes/env-config.ts +58 -0
  646. package/src/providers/hermes/index.ts +11 -0
  647. package/src/providers/hermes/media.ts +12 -0
  648. package/src/providers/hermes/provider-module.ts +26 -0
  649. package/src/providers/hermes/sse-run-event-provider.ts +47 -0
  650. package/src/providers/hermes/team-registry-config.ts +2 -0
  651. package/src/providers/hermes/team-registry.ts +12 -0
  652. package/src/providers/hermes/websocket.ts +16 -0
  653. package/src/providers/hermes/wiki.ts +12 -0
  654. package/src/providers/openclaw/agent-config.ts +12 -0
  655. package/src/providers/openclaw/client.ts +21 -0
  656. package/src/providers/openclaw/index.ts +9 -0
  657. package/src/providers/openclaw/media.ts +12 -0
  658. package/src/providers/openclaw/provider-module.ts +20 -0
  659. package/src/providers/openclaw/sse-run-event-provider.ts +16 -0
  660. package/src/providers/openclaw/team-registry-config.ts +2 -0
  661. package/src/providers/openclaw/team-registry.ts +12 -0
  662. package/src/providers/openclaw/websocket.ts +56 -0
  663. package/src/providers/openclaw/wiki.ts +12 -0
  664. package/src/react/gateway-provider.tsx +835 -0
  665. package/src/react/index.ts +1 -0
@@ -0,0 +1,1402 @@
1
+ export const TEAM_MANIFEST_VERSION = 1 as const;
2
+
3
+ export const DEFAULT_TEAM_ID = "default" as const;
4
+ export const DEFAULT_TEAM_MEMBER_ID = "default-agent" as const;
5
+
6
+ export const DEFAULT_TEAM_ROUTE_KEYS = ["kanban", "runs", "config", "workspace"] as const;
7
+ export const TEAM_ACTION_INPUT_MODES = ["command", "json", "text"] as const;
8
+ export const TEAM_ACTION_OUTPUT_MODES = [
9
+ "artifact",
10
+ "json",
11
+ "markdown",
12
+ "text",
13
+ ] as const;
14
+
15
+ export type TeamManifestVersion = typeof TEAM_MANIFEST_VERSION;
16
+ export type DefaultTeamRouteKey = (typeof DEFAULT_TEAM_ROUTE_KEYS)[number];
17
+ export type TeamActionInputMode = (typeof TEAM_ACTION_INPUT_MODES)[number];
18
+ export type TeamActionOutputMode = (typeof TEAM_ACTION_OUTPUT_MODES)[number];
19
+ export type TeamActionHttpMethod = "DELETE" | "GET" | "PATCH" | "POST" | "PUT";
20
+ export type TeamActionParamType =
21
+ | "boolean"
22
+ | "enum"
23
+ | "file"
24
+ | "json"
25
+ | "number"
26
+ | "string";
27
+ export type TeamActionJsonValue =
28
+ | string
29
+ | number
30
+ | boolean
31
+ | null
32
+ | readonly TeamActionJsonValue[]
33
+ | { readonly [key: string]: TeamActionJsonValue };
34
+
35
+ export type TeamRouteKey =
36
+ | DefaultTeamRouteKey
37
+ | "action"
38
+ | "agent.action"
39
+ | "agent.config"
40
+ | "agent.workspace"
41
+ | (string & {});
42
+
43
+ export type TeamManifestIdentity = {
44
+ name?: string | null;
45
+ displayName?: string | null;
46
+ slug?: string | null;
47
+ code?: string | null;
48
+ sectorSlug?: string | null;
49
+ sectorCode?: string | null;
50
+ portalId?: string | null;
51
+ aliases?: readonly string[] | null;
52
+ };
53
+
54
+ export type TeamWorkspacePathEntry =
55
+ | string
56
+ | {
57
+ key: string;
58
+ path?: string | null;
59
+ };
60
+
61
+ export type TeamWorkspaceConfig = {
62
+ rootPath: string;
63
+ paths?: readonly TeamWorkspacePathEntry[] | null;
64
+ };
65
+
66
+ export type TeamActionParamContract = {
67
+ key: string;
68
+ type?: TeamActionParamType | null;
69
+ required?: boolean | null;
70
+ default?: TeamActionJsonValue;
71
+ values?: readonly string[] | null;
72
+ aliases?: readonly string[] | null;
73
+ description?: string | null;
74
+ metadata?: Record<string, unknown> | null;
75
+ };
76
+
77
+ export type TeamActionInputContract = {
78
+ mode?: TeamActionInputMode | null;
79
+ command?: string | null;
80
+ params?: readonly TeamActionParamContract[] | null;
81
+ schema?: Record<string, unknown> | null;
82
+ examples?: readonly string[] | null;
83
+ metadata?: Record<string, unknown> | null;
84
+ };
85
+
86
+ export type TeamActionArtifactContract = {
87
+ key: string;
88
+ contentType?: string | null;
89
+ path?: string | null;
90
+ description?: string | null;
91
+ metadata?: Record<string, unknown> | null;
92
+ };
93
+
94
+ export type TeamActionOutputContract = {
95
+ mode?: TeamActionOutputMode | null;
96
+ contentType?: string | null;
97
+ schema?: Record<string, unknown> | null;
98
+ artifacts?: readonly TeamActionArtifactContract[] | null;
99
+ metadata?: Record<string, unknown> | null;
100
+ };
101
+
102
+ export type TeamActionRouteContract = {
103
+ method?: TeamActionHttpMethod | null;
104
+ surfaceKey?: string | null;
105
+ path?: string | null;
106
+ metadata?: Record<string, unknown> | null;
107
+ };
108
+
109
+ export type TeamActionContract = {
110
+ id: string;
111
+ title?: string | null;
112
+ description?: string | null;
113
+ enabled?: boolean | null;
114
+ route?: TeamActionRouteContract | null;
115
+ input?: TeamActionInputContract | null;
116
+ output?: TeamActionOutputContract | null;
117
+ defaults?: Record<string, TeamActionJsonValue> | null;
118
+ capabilities?: readonly string[] | null;
119
+ metadata?: Record<string, unknown> | null;
120
+ };
121
+
122
+ export type TeamActionArtifact = {
123
+ key: string;
124
+ contentType?: string | null;
125
+ path?: string | null;
126
+ url?: string | null;
127
+ metadata?: Record<string, unknown> | null;
128
+ };
129
+
130
+ export type TeamActionResponseBase = {
131
+ actionId?: string | null;
132
+ teamId?: string | null;
133
+ memberId?: string | null;
134
+ metadata?: Record<string, unknown> | null;
135
+ };
136
+
137
+ export type TeamActionResponse =
138
+ | (TeamActionResponseBase & {
139
+ kind: "artifact";
140
+ artifacts: readonly TeamActionArtifact[];
141
+ data?: TeamActionJsonValue;
142
+ })
143
+ | (TeamActionResponseBase & {
144
+ kind: "json";
145
+ data: TeamActionJsonValue;
146
+ })
147
+ | (TeamActionResponseBase & {
148
+ kind: "markdown";
149
+ markdown: string;
150
+ })
151
+ | (TeamActionResponseBase & {
152
+ kind: "text";
153
+ text: string;
154
+ });
155
+
156
+ export type TeamManifestMember = {
157
+ id: string;
158
+ identity?: TeamManifestIdentity | null;
159
+ workspace?: TeamWorkspaceConfig | null;
160
+ actions?: readonly TeamActionContract[] | null;
161
+ capabilities?: readonly string[] | null;
162
+ metadata?: Record<string, unknown> | null;
163
+ };
164
+
165
+ export type TeamManifestRouteConfig = {
166
+ key: string;
167
+ path?: string | null;
168
+ };
169
+
170
+ export type TeamManifestTeam = {
171
+ id: string;
172
+ identity?: TeamManifestIdentity | null;
173
+ members?: readonly TeamManifestMember[] | null;
174
+ workspace?: TeamWorkspaceConfig | null;
175
+ actions?: readonly TeamActionContract[] | null;
176
+ capabilities?: readonly string[] | null;
177
+ routes?: readonly TeamManifestRouteConfig[] | null;
178
+ metadata?: Record<string, unknown> | null;
179
+ };
180
+
181
+ export type GatewayRouteBinding = {
182
+ id: string;
183
+ teamId: string;
184
+ memberId?: string | null;
185
+ source?: string | null;
186
+ channel?: string | null;
187
+ actionId?: string | null;
188
+ routeKey?: TeamRouteKey | null;
189
+ sessionKeyPattern?: string | null;
190
+ metadata?: Record<string, unknown> | null;
191
+ };
192
+
193
+ export type GatewayResolvedRouteBinding = {
194
+ id: string;
195
+ teamId: string;
196
+ memberId: string | null;
197
+ source: string | null;
198
+ channel: string | null;
199
+ actionId: string | null;
200
+ routeKey: TeamRouteKey;
201
+ path: string;
202
+ metadata?: Record<string, unknown> | null;
203
+ };
204
+
205
+ export type ResolveGatewayRouteBindingOptions = {
206
+ bindingId?: string | null;
207
+ source?: string | null;
208
+ channel?: string | null;
209
+ sessionKey?: string | null;
210
+ key?: string | null;
211
+ agentId?: string | null;
212
+ actionId?: string | null;
213
+ };
214
+
215
+ export type TeamManifest = {
216
+ version: TeamManifestVersion;
217
+ actions?: readonly TeamActionContract[] | null;
218
+ bindings?: readonly GatewayRouteBinding[] | null;
219
+ teams: readonly TeamManifestTeam[];
220
+ };
221
+
222
+ export type CreateDefaultTeamManifestOptions = {
223
+ teamId?: string;
224
+ memberId?: string;
225
+ workspaceRootPath?: string | null;
226
+ workspacePaths?: readonly TeamWorkspacePathEntry[] | null;
227
+ };
228
+
229
+ export type ResolveTeamRoutePathOptions = {
230
+ teamId: string;
231
+ actionId?: string | null;
232
+ agentId?: string | null;
233
+ workspacePath?: string | null;
234
+ };
235
+
236
+ export type ResolveTeamWorkspacePathOptions = {
237
+ memberId?: string | null;
238
+ };
239
+
240
+ export type ResolveTeamActionContractOptions = {
241
+ memberId?: string | null;
242
+ };
243
+
244
+ type NormalizedWorkspacePathEntry = {
245
+ key: string;
246
+ path: string;
247
+ };
248
+
249
+ function nonEmpty(value: string | null | undefined): string | null {
250
+ const trimmed = value?.trim();
251
+ return trimmed ? trimmed : null;
252
+ }
253
+
254
+ function requiredText(value: string | null | undefined, label: string): string {
255
+ const trimmed = nonEmpty(value);
256
+ if (!trimmed) {
257
+ throw new Error(`team manifest: missing ${label}`);
258
+ }
259
+ return trimmed;
260
+ }
261
+
262
+ function decodePathSegment(segment: string): string {
263
+ try {
264
+ return decodeURIComponent(segment);
265
+ } catch {
266
+ return segment;
267
+ }
268
+ }
269
+
270
+ function uniqueStrings(values: readonly string[] | null | undefined): string[] {
271
+ const seen = new Set<string>();
272
+ const result: string[] = [];
273
+ for (const value of values ?? []) {
274
+ const trimmed = nonEmpty(value);
275
+ if (!trimmed || seen.has(trimmed)) {
276
+ continue;
277
+ }
278
+ seen.add(trimmed);
279
+ result.push(trimmed);
280
+ }
281
+ return result;
282
+ }
283
+
284
+ function hasOwn(value: object, key: string): boolean {
285
+ return Object.prototype.hasOwnProperty.call(value, key);
286
+ }
287
+
288
+ function normalizeActionInputMode(
289
+ value: TeamActionInputMode | null | undefined,
290
+ ): TeamActionInputMode | null {
291
+ const mode = nonEmpty(value);
292
+ if (!mode) {
293
+ return null;
294
+ }
295
+ if (!TEAM_ACTION_INPUT_MODES.includes(mode as TeamActionInputMode)) {
296
+ throw new Error(`team manifest: invalid action input mode "${mode}"`);
297
+ }
298
+ return mode as TeamActionInputMode;
299
+ }
300
+
301
+ function normalizeActionOutputMode(
302
+ value: TeamActionOutputMode | null | undefined,
303
+ ): TeamActionOutputMode | null {
304
+ const mode = nonEmpty(value);
305
+ if (!mode) {
306
+ return null;
307
+ }
308
+ if (!TEAM_ACTION_OUTPUT_MODES.includes(mode as TeamActionOutputMode)) {
309
+ throw new Error(`team manifest: invalid action output mode "${mode}"`);
310
+ }
311
+ return mode as TeamActionOutputMode;
312
+ }
313
+
314
+ function normalizeActionParamType(
315
+ value: TeamActionParamType | null | undefined,
316
+ ): TeamActionParamType | null {
317
+ const type = nonEmpty(value);
318
+ if (!type) {
319
+ return null;
320
+ }
321
+ switch (type) {
322
+ case "boolean":
323
+ case "enum":
324
+ case "file":
325
+ case "json":
326
+ case "number":
327
+ case "string":
328
+ return type;
329
+ default:
330
+ throw new Error(`team manifest: invalid action param type "${type}"`);
331
+ }
332
+ }
333
+
334
+ function normalizeActionHttpMethod(
335
+ value: TeamActionHttpMethod | null | undefined,
336
+ ): TeamActionHttpMethod | null {
337
+ const method = nonEmpty(value)?.toUpperCase();
338
+ if (!method) {
339
+ return null;
340
+ }
341
+ switch (method) {
342
+ case "DELETE":
343
+ case "GET":
344
+ case "PATCH":
345
+ case "POST":
346
+ case "PUT":
347
+ return method;
348
+ default:
349
+ throw new Error(`team manifest: invalid action route method "${method}"`);
350
+ }
351
+ }
352
+
353
+ function normalizeActionDefaults(
354
+ defaults: Record<string, TeamActionJsonValue> | null | undefined,
355
+ ): Record<string, TeamActionJsonValue> | null {
356
+ if (!defaults) {
357
+ return null;
358
+ }
359
+ const normalized: Record<string, TeamActionJsonValue> = {};
360
+ for (const [key, value] of Object.entries(defaults)) {
361
+ const normalizedKey = nonEmpty(key);
362
+ if (normalizedKey) {
363
+ normalized[normalizedKey] = value;
364
+ }
365
+ }
366
+ return Object.keys(normalized).length ? normalized : null;
367
+ }
368
+
369
+ function normalizeActionParamContract(
370
+ param: TeamActionParamContract,
371
+ ): TeamActionParamContract {
372
+ return {
373
+ key: requiredText(param.key, "action param key"),
374
+ ...(normalizeActionParamType(param.type)
375
+ ? { type: normalizeActionParamType(param.type) }
376
+ : {}),
377
+ ...(param.required !== undefined && param.required !== null
378
+ ? { required: Boolean(param.required) }
379
+ : {}),
380
+ ...(hasOwn(param, "default") ? { default: param.default } : {}),
381
+ values: uniqueStrings(param.values),
382
+ aliases: uniqueStrings(param.aliases),
383
+ ...(nonEmpty(param.description)
384
+ ? { description: nonEmpty(param.description) }
385
+ : {}),
386
+ ...(param.metadata ? { metadata: param.metadata } : {}),
387
+ };
388
+ }
389
+
390
+ function normalizeActionParams(
391
+ params: readonly TeamActionParamContract[] | null | undefined,
392
+ ): TeamActionParamContract[] {
393
+ const seen = new Set<string>();
394
+ const normalized: TeamActionParamContract[] = [];
395
+ for (const param of params ?? []) {
396
+ const entry = normalizeActionParamContract(param);
397
+ if (seen.has(entry.key)) {
398
+ throw new Error(`team manifest: duplicate action param "${entry.key}"`);
399
+ }
400
+ seen.add(entry.key);
401
+ normalized.push(entry);
402
+ }
403
+ return normalized;
404
+ }
405
+
406
+ function normalizeActionInputContract(
407
+ input: TeamActionInputContract | null | undefined,
408
+ ): TeamActionInputContract | null {
409
+ if (!input) {
410
+ return null;
411
+ }
412
+ return {
413
+ ...(normalizeActionInputMode(input.mode)
414
+ ? { mode: normalizeActionInputMode(input.mode) }
415
+ : {}),
416
+ ...(nonEmpty(input.command) ? { command: nonEmpty(input.command) } : {}),
417
+ params: normalizeActionParams(input.params),
418
+ ...(input.schema ? { schema: input.schema } : {}),
419
+ examples: uniqueStrings(input.examples),
420
+ ...(input.metadata ? { metadata: input.metadata } : {}),
421
+ };
422
+ }
423
+
424
+ function normalizeActionArtifactContract(
425
+ artifact: TeamActionArtifactContract,
426
+ ): TeamActionArtifactContract {
427
+ return {
428
+ key: requiredText(artifact.key, "action artifact key"),
429
+ ...(nonEmpty(artifact.contentType)
430
+ ? { contentType: nonEmpty(artifact.contentType) }
431
+ : {}),
432
+ ...(nonEmpty(artifact.path) ? { path: nonEmpty(artifact.path) } : {}),
433
+ ...(nonEmpty(artifact.description)
434
+ ? { description: nonEmpty(artifact.description) }
435
+ : {}),
436
+ ...(artifact.metadata ? { metadata: artifact.metadata } : {}),
437
+ };
438
+ }
439
+
440
+ function normalizeActionArtifacts(
441
+ artifacts: readonly TeamActionArtifactContract[] | null | undefined,
442
+ ): TeamActionArtifactContract[] {
443
+ const seen = new Set<string>();
444
+ const normalized: TeamActionArtifactContract[] = [];
445
+ for (const artifact of artifacts ?? []) {
446
+ const entry = normalizeActionArtifactContract(artifact);
447
+ if (seen.has(entry.key)) {
448
+ throw new Error(`team manifest: duplicate action artifact "${entry.key}"`);
449
+ }
450
+ seen.add(entry.key);
451
+ normalized.push(entry);
452
+ }
453
+ return normalized;
454
+ }
455
+
456
+ function normalizeActionOutputContract(
457
+ output: TeamActionOutputContract | null | undefined,
458
+ ): TeamActionOutputContract | null {
459
+ if (!output) {
460
+ return null;
461
+ }
462
+ return {
463
+ ...(normalizeActionOutputMode(output.mode)
464
+ ? { mode: normalizeActionOutputMode(output.mode) }
465
+ : {}),
466
+ ...(nonEmpty(output.contentType)
467
+ ? { contentType: nonEmpty(output.contentType) }
468
+ : {}),
469
+ ...(output.schema ? { schema: output.schema } : {}),
470
+ artifacts: normalizeActionArtifacts(output.artifacts),
471
+ ...(output.metadata ? { metadata: output.metadata } : {}),
472
+ };
473
+ }
474
+
475
+ function normalizeActionRouteContract(
476
+ route: TeamActionRouteContract | null | undefined,
477
+ ): TeamActionRouteContract | null {
478
+ if (!route) {
479
+ return null;
480
+ }
481
+ const path = nonEmpty(route.path);
482
+ return {
483
+ ...(normalizeActionHttpMethod(route.method)
484
+ ? { method: normalizeActionHttpMethod(route.method) }
485
+ : {}),
486
+ ...(nonEmpty(route.surfaceKey) ? { surfaceKey: nonEmpty(route.surfaceKey) } : {}),
487
+ ...(path ? { path: normalizeAbsoluteApiPath(path, "action route path") } : {}),
488
+ ...(route.metadata ? { metadata: route.metadata } : {}),
489
+ };
490
+ }
491
+
492
+ function normalizeTeamActionContract(action: TeamActionContract): TeamActionContract {
493
+ const defaults = normalizeActionDefaults(action.defaults);
494
+ return {
495
+ id: requiredText(action.id, "action id"),
496
+ ...(nonEmpty(action.title) ? { title: nonEmpty(action.title) } : {}),
497
+ ...(nonEmpty(action.description)
498
+ ? { description: nonEmpty(action.description) }
499
+ : {}),
500
+ ...(action.enabled !== undefined && action.enabled !== null
501
+ ? { enabled: Boolean(action.enabled) }
502
+ : {}),
503
+ ...(action.route ? { route: normalizeActionRouteContract(action.route) } : {}),
504
+ ...(action.input ? { input: normalizeActionInputContract(action.input) } : {}),
505
+ ...(action.output ? { output: normalizeActionOutputContract(action.output) } : {}),
506
+ ...(defaults ? { defaults } : {}),
507
+ capabilities: uniqueStrings(action.capabilities),
508
+ ...(action.metadata ? { metadata: action.metadata } : {}),
509
+ };
510
+ }
511
+
512
+ function normalizeTeamActionContracts(
513
+ actions: readonly TeamActionContract[] | null | undefined,
514
+ ): TeamActionContract[] {
515
+ const seen = new Set<string>();
516
+ const normalized: TeamActionContract[] = [];
517
+ for (const action of actions ?? []) {
518
+ const entry = normalizeTeamActionContract(action);
519
+ if (seen.has(entry.id)) {
520
+ throw new Error(`team manifest: duplicate action "${entry.id}"`);
521
+ }
522
+ seen.add(entry.id);
523
+ normalized.push(entry);
524
+ }
525
+ return normalized;
526
+ }
527
+
528
+ function pathSegment(value: string, label: string): string {
529
+ const segment = requiredText(value, label);
530
+ const decoded = decodePathSegment(segment);
531
+ if (
532
+ segment === "." ||
533
+ segment === ".." ||
534
+ decoded === "." ||
535
+ decoded === ".." ||
536
+ /[/?#\\]/u.test(segment) ||
537
+ /[/?#\\]/u.test(decoded)
538
+ ) {
539
+ throw new Error(`team manifest: invalid ${label}: ${segment}`);
540
+ }
541
+ return encodeURIComponent(segment);
542
+ }
543
+
544
+ function normalizeRelativePath(value: string): string {
545
+ const trimmed = nonEmpty(value);
546
+ if (!trimmed) {
547
+ throw new Error("team manifest: missing workspace path");
548
+ }
549
+ if (
550
+ /^[a-z][a-z0-9+.-]*:/iu.test(trimmed) ||
551
+ trimmed.startsWith("/") ||
552
+ trimmed.includes("\\")
553
+ ) {
554
+ throw new Error(`team manifest: workspace path must be relative: ${trimmed}`);
555
+ }
556
+ const segments = trimmed
557
+ .split("/")
558
+ .map((segment) => segment.trim())
559
+ .filter(Boolean);
560
+ if (
561
+ segments.length === 0 ||
562
+ segments.some((segment) => {
563
+ const decoded = decodePathSegment(segment);
564
+ return (
565
+ segment === "." ||
566
+ segment === ".." ||
567
+ decoded === "." ||
568
+ decoded === ".." ||
569
+ decoded.includes("/") ||
570
+ decoded.includes("\\")
571
+ );
572
+ })
573
+ ) {
574
+ throw new Error(`team manifest: invalid workspace path: ${trimmed}`);
575
+ }
576
+ return segments.join("/");
577
+ }
578
+
579
+ function normalizeAbsoluteApiPath(value: string, label: string): string {
580
+ const trimmed = requiredText(value, label);
581
+ if (
582
+ !trimmed.startsWith("/") ||
583
+ trimmed.startsWith("//") ||
584
+ /^[a-z][a-z0-9+.-]*:/iu.test(trimmed) ||
585
+ /[\\?#]/u.test(trimmed)
586
+ ) {
587
+ throw new Error(`team manifest: invalid ${label}: ${trimmed}`);
588
+ }
589
+ const segments = trimmed
590
+ .split("/")
591
+ .map((segment) => segment.trim())
592
+ .filter(Boolean);
593
+ if (segments.length === 0) {
594
+ throw new Error(`team manifest: invalid ${label}: ${trimmed}`);
595
+ }
596
+ for (const segment of segments) {
597
+ const decoded = decodePathSegment(segment);
598
+ if (
599
+ segment === "." ||
600
+ segment === ".." ||
601
+ decoded === "." ||
602
+ decoded === ".." ||
603
+ decoded.includes("/") ||
604
+ decoded.includes("\\")
605
+ ) {
606
+ throw new Error(`team manifest: invalid ${label}: ${trimmed}`);
607
+ }
608
+ }
609
+ return `/${segments.join("/")}`;
610
+ }
611
+
612
+ function normalizeRootPath(value: string): string {
613
+ const trimmed = nonEmpty(value);
614
+ if (!trimmed) {
615
+ throw new Error("team manifest: missing workspace rootPath");
616
+ }
617
+ return normalizeAbsoluteApiPath(trimmed, "workspace rootPath");
618
+ }
619
+
620
+ function joinUrlPath(segments: readonly string[]): string {
621
+ return `/${segments.map((segment) => pathSegment(segment, "path segment")).join("/")}`;
622
+ }
623
+
624
+ function workspacePathSegments(value: string | null | undefined): string[] {
625
+ return normalizeRelativePath(requiredText(value, "workspace path")).split("/");
626
+ }
627
+
628
+ function joinWorkspacePath(rootPath: string, relativePath: string): string {
629
+ return `${normalizeRootPath(rootPath)}/${normalizeRelativePath(relativePath)}`;
630
+ }
631
+
632
+ function normalizeWorkspacePathEntry(
633
+ entry: TeamWorkspacePathEntry,
634
+ ): NormalizedWorkspacePathEntry {
635
+ if (typeof entry === "string") {
636
+ const path = normalizeRelativePath(entry);
637
+ return { key: path, path };
638
+ }
639
+ const key = nonEmpty(entry.key);
640
+ if (!key) {
641
+ throw new Error("team manifest: missing workspace path key");
642
+ }
643
+ return {
644
+ key,
645
+ path: normalizeRelativePath(entry.path ?? key),
646
+ };
647
+ }
648
+
649
+ function normalizeWorkspaceConfig(
650
+ workspace: TeamWorkspaceConfig | null | undefined,
651
+ ): TeamWorkspaceConfig | null {
652
+ if (!workspace) {
653
+ return null;
654
+ }
655
+ return {
656
+ rootPath: normalizeRootPath(workspace.rootPath),
657
+ paths: (workspace.paths ?? []).map(normalizeWorkspacePathEntry),
658
+ };
659
+ }
660
+
661
+ function normalizeIdentity(
662
+ identity: TeamManifestIdentity | null | undefined,
663
+ ): TeamManifestIdentity | null {
664
+ if (!identity) {
665
+ return null;
666
+ }
667
+ return {
668
+ ...(nonEmpty(identity.name) ? { name: nonEmpty(identity.name) } : {}),
669
+ ...(nonEmpty(identity.displayName)
670
+ ? { displayName: nonEmpty(identity.displayName) }
671
+ : {}),
672
+ ...(nonEmpty(identity.slug) ? { slug: nonEmpty(identity.slug) } : {}),
673
+ ...(nonEmpty(identity.code) ? { code: nonEmpty(identity.code) } : {}),
674
+ ...(nonEmpty(identity.sectorSlug)
675
+ ? { sectorSlug: nonEmpty(identity.sectorSlug) }
676
+ : {}),
677
+ ...(nonEmpty(identity.sectorCode)
678
+ ? { sectorCode: nonEmpty(identity.sectorCode) }
679
+ : {}),
680
+ ...(nonEmpty(identity.portalId) ? { portalId: nonEmpty(identity.portalId) } : {}),
681
+ aliases: uniqueStrings(identity.aliases),
682
+ };
683
+ }
684
+
685
+ function normalizeMember(member: TeamManifestMember): TeamManifestMember {
686
+ return {
687
+ id: requiredText(member.id, "member id"),
688
+ ...(member.identity ? { identity: normalizeIdentity(member.identity) } : {}),
689
+ ...(member.workspace
690
+ ? { workspace: normalizeWorkspaceConfig(member.workspace) }
691
+ : {}),
692
+ actions: normalizeTeamActionContracts(member.actions),
693
+ capabilities: uniqueStrings(member.capabilities),
694
+ ...(member.metadata ? { metadata: member.metadata } : {}),
695
+ };
696
+ }
697
+
698
+ function normalizeMembers(
699
+ members: readonly TeamManifestMember[] | null | undefined,
700
+ ): TeamManifestMember[] {
701
+ const seen = new Set<string>();
702
+ const normalized: TeamManifestMember[] = [];
703
+ for (const member of members ?? []) {
704
+ const entry = normalizeMember(member);
705
+ if (seen.has(entry.id)) {
706
+ throw new Error(`team manifest: duplicate member "${entry.id}"`);
707
+ }
708
+ seen.add(entry.id);
709
+ normalized.push(entry);
710
+ }
711
+ return normalized;
712
+ }
713
+
714
+ function normalizeTeamRoutes(
715
+ routes: readonly TeamManifestRouteConfig[] | null | undefined,
716
+ ): TeamManifestRouteConfig[] {
717
+ const seen = new Set<string>();
718
+ const normalized: TeamManifestRouteConfig[] = [];
719
+ for (const route of routes ?? []) {
720
+ const key = requiredText(route.key, "route key");
721
+ const routePath = nonEmpty(route.path);
722
+ if (seen.has(key)) {
723
+ throw new Error(`team manifest: duplicate route "${key}"`);
724
+ }
725
+ seen.add(key);
726
+ normalized.push({
727
+ key,
728
+ ...(routePath
729
+ ? { path: normalizeAbsoluteApiPath(routePath, "route path") }
730
+ : {}),
731
+ });
732
+ }
733
+ return normalized;
734
+ }
735
+
736
+ function normalizeTeam(team: TeamManifestTeam): TeamManifestTeam {
737
+ return {
738
+ id: requiredText(team.id, "team id"),
739
+ ...(team.identity ? { identity: normalizeIdentity(team.identity) } : {}),
740
+ members: normalizeMembers(team.members),
741
+ ...(team.workspace ? { workspace: normalizeWorkspaceConfig(team.workspace) } : {}),
742
+ actions: normalizeTeamActionContracts(team.actions),
743
+ capabilities: uniqueStrings(team.capabilities),
744
+ routes: normalizeTeamRoutes(team.routes),
745
+ ...(team.metadata ? { metadata: team.metadata } : {}),
746
+ };
747
+ }
748
+
749
+ function normalizeTeams(
750
+ teams: readonly TeamManifestTeam[] | null | undefined,
751
+ ): TeamManifestTeam[] {
752
+ const seen = new Set<string>();
753
+ const normalized: TeamManifestTeam[] = [];
754
+ for (const team of teams ?? []) {
755
+ const entry = normalizeTeam(team);
756
+ if (seen.has(entry.id)) {
757
+ throw new Error(`team manifest: duplicate team "${entry.id}"`);
758
+ }
759
+ seen.add(entry.id);
760
+ normalized.push(entry);
761
+ }
762
+ return normalized;
763
+ }
764
+
765
+ function normalizeGatewayRouteBinding(
766
+ binding: GatewayRouteBinding,
767
+ ): GatewayRouteBinding {
768
+ return {
769
+ id: requiredText(binding.id, "gateway route binding id"),
770
+ teamId: requiredText(binding.teamId, "gateway route binding teamId"),
771
+ ...(nonEmpty(binding.memberId) ? { memberId: nonEmpty(binding.memberId) } : {}),
772
+ ...(nonEmpty(binding.source) ? { source: nonEmpty(binding.source) } : {}),
773
+ ...(nonEmpty(binding.channel) ? { channel: nonEmpty(binding.channel) } : {}),
774
+ ...(nonEmpty(binding.actionId) ? { actionId: nonEmpty(binding.actionId) } : {}),
775
+ ...(nonEmpty(binding.routeKey)
776
+ ? { routeKey: nonEmpty(binding.routeKey) as TeamRouteKey }
777
+ : {}),
778
+ ...(nonEmpty(binding.sessionKeyPattern)
779
+ ? { sessionKeyPattern: nonEmpty(binding.sessionKeyPattern) }
780
+ : {}),
781
+ ...(binding.metadata ? { metadata: binding.metadata } : {}),
782
+ };
783
+ }
784
+
785
+ function normalizeGatewayRouteBindings(
786
+ bindings: readonly GatewayRouteBinding[] | null | undefined,
787
+ ): GatewayRouteBinding[] {
788
+ const seen = new Set<string>();
789
+ const normalized: GatewayRouteBinding[] = [];
790
+ for (const binding of bindings ?? []) {
791
+ const entry = normalizeGatewayRouteBinding(binding);
792
+ if (seen.has(entry.id)) {
793
+ throw new Error(`team manifest: duplicate gateway route binding "${entry.id}"`);
794
+ }
795
+ seen.add(entry.id);
796
+ normalized.push(entry);
797
+ }
798
+ return normalized;
799
+ }
800
+
801
+ function findWorkspacePath(
802
+ workspace: TeamWorkspaceConfig,
803
+ keyOrPath: string,
804
+ ): NormalizedWorkspacePathEntry | null {
805
+ const requested = normalizeRelativePath(keyOrPath);
806
+ for (const entry of workspace.paths ?? []) {
807
+ const normalized = normalizeWorkspacePathEntry(entry);
808
+ if (normalized.key === keyOrPath || normalized.path === requested) {
809
+ return normalized;
810
+ }
811
+ }
812
+ return null;
813
+ }
814
+
815
+ export function createDefaultTeamManifest(
816
+ options: CreateDefaultTeamManifestOptions = {},
817
+ ): TeamManifest {
818
+ const teamId = nonEmpty(options.teamId) ?? DEFAULT_TEAM_ID;
819
+ const memberId = nonEmpty(options.memberId) ?? DEFAULT_TEAM_MEMBER_ID;
820
+ const workspace =
821
+ options.workspaceRootPath !== undefined && options.workspaceRootPath !== null
822
+ ? {
823
+ rootPath: options.workspaceRootPath,
824
+ paths: options.workspacePaths ?? [],
825
+ }
826
+ : null;
827
+
828
+ return normalizeTeamManifest({
829
+ version: TEAM_MANIFEST_VERSION,
830
+ teams: [
831
+ {
832
+ id: teamId,
833
+ identity: {
834
+ name: teamId,
835
+ displayName: teamId,
836
+ slug: teamId,
837
+ code: teamId,
838
+ },
839
+ members: [
840
+ {
841
+ id: memberId,
842
+ ...(workspace ? { workspace } : {}),
843
+ },
844
+ ],
845
+ ...(workspace ? { workspace } : {}),
846
+ },
847
+ ],
848
+ });
849
+ }
850
+
851
+ export function normalizeTeamManifest(
852
+ manifest: Partial<TeamManifest> | null | undefined,
853
+ ): TeamManifest {
854
+ if (!manifest?.teams?.length) {
855
+ return createDefaultTeamManifest();
856
+ }
857
+ return {
858
+ version: TEAM_MANIFEST_VERSION,
859
+ actions: normalizeTeamActionContracts(manifest.actions),
860
+ bindings: normalizeGatewayRouteBindings(manifest.bindings),
861
+ teams: normalizeTeams(manifest.teams),
862
+ };
863
+ }
864
+
865
+ export function findTeamManifestTeam(
866
+ manifest: TeamManifest,
867
+ teamId: string | null | undefined,
868
+ ): TeamManifestTeam | null {
869
+ const normalized = nonEmpty(teamId);
870
+ if (!normalized) {
871
+ return null;
872
+ }
873
+ return manifest.teams.find((team) => team.id === normalized) ?? null;
874
+ }
875
+
876
+ export function findTeamManifestMember(
877
+ team: TeamManifestTeam,
878
+ memberId: string | null | undefined,
879
+ ): TeamManifestMember | null {
880
+ const normalized = nonEmpty(memberId);
881
+ if (!normalized) {
882
+ return null;
883
+ }
884
+ return team.members?.find((member) => member.id === normalized) ?? null;
885
+ }
886
+
887
+ export function findTeamActionContract(
888
+ actions: readonly TeamActionContract[] | null | undefined,
889
+ actionId: string | null | undefined,
890
+ ): TeamActionContract | null {
891
+ const normalized = nonEmpty(actionId);
892
+ if (!normalized) {
893
+ return null;
894
+ }
895
+ return actions?.find((action) => action.id === normalized) ?? null;
896
+ }
897
+
898
+ function mergeRecords<T>(
899
+ base: Record<string, T> | null | undefined,
900
+ override: Record<string, T> | null | undefined,
901
+ ): Record<string, T> | null {
902
+ const merged: Record<string, T> = {};
903
+ Object.assign(merged, base ?? {}, override ?? {});
904
+ return Object.keys(merged).length ? merged : null;
905
+ }
906
+
907
+ function mergeActionParamContract(
908
+ base: TeamActionParamContract,
909
+ override: TeamActionParamContract,
910
+ ): TeamActionParamContract {
911
+ const metadata = mergeRecords(base.metadata, override.metadata);
912
+ const required =
913
+ override.required !== undefined && override.required !== null
914
+ ? override.required
915
+ : base.required;
916
+ return {
917
+ key: base.key,
918
+ ...(override.type ?? base.type ? { type: override.type ?? base.type } : {}),
919
+ ...(required !== undefined && required !== null
920
+ ? { required }
921
+ : {}),
922
+ ...(hasOwn(override, "default")
923
+ ? { default: override.default }
924
+ : hasOwn(base, "default")
925
+ ? { default: base.default }
926
+ : {}),
927
+ values: uniqueStrings([...(base.values ?? []), ...(override.values ?? [])]),
928
+ aliases: uniqueStrings([...(base.aliases ?? []), ...(override.aliases ?? [])]),
929
+ ...(override.description ?? base.description
930
+ ? { description: override.description ?? base.description }
931
+ : {}),
932
+ ...(metadata ? { metadata } : {}),
933
+ };
934
+ }
935
+
936
+ function mergeActionParams(
937
+ base: readonly TeamActionParamContract[] | null | undefined,
938
+ override: readonly TeamActionParamContract[] | null | undefined,
939
+ ): TeamActionParamContract[] {
940
+ const merged = new Map<string, TeamActionParamContract>();
941
+ for (const param of base ?? []) {
942
+ merged.set(param.key, param);
943
+ }
944
+ for (const param of override ?? []) {
945
+ const existing = merged.get(param.key);
946
+ merged.set(param.key, existing ? mergeActionParamContract(existing, param) : param);
947
+ }
948
+ return [...merged.values()];
949
+ }
950
+
951
+ function mergeActionInputContract(
952
+ base: TeamActionInputContract | null | undefined,
953
+ override: TeamActionInputContract | null | undefined,
954
+ ): TeamActionInputContract | null {
955
+ if (!base && !override) {
956
+ return null;
957
+ }
958
+ const metadata = mergeRecords(base?.metadata, override?.metadata);
959
+ return {
960
+ ...(override?.mode ?? base?.mode ? { mode: override?.mode ?? base?.mode } : {}),
961
+ ...(override?.command ?? base?.command
962
+ ? { command: override?.command ?? base?.command }
963
+ : {}),
964
+ params: mergeActionParams(base?.params, override?.params),
965
+ ...(override?.schema ?? base?.schema ? { schema: override?.schema ?? base?.schema } : {}),
966
+ examples: uniqueStrings([...(base?.examples ?? []), ...(override?.examples ?? [])]),
967
+ ...(metadata ? { metadata } : {}),
968
+ };
969
+ }
970
+
971
+ function mergeActionArtifactContract(
972
+ base: TeamActionArtifactContract,
973
+ override: TeamActionArtifactContract,
974
+ ): TeamActionArtifactContract {
975
+ const metadata = mergeRecords(base.metadata, override.metadata);
976
+ return {
977
+ key: base.key,
978
+ ...(override.contentType ?? base.contentType
979
+ ? { contentType: override.contentType ?? base.contentType }
980
+ : {}),
981
+ ...(override.path ?? base.path ? { path: override.path ?? base.path } : {}),
982
+ ...(override.description ?? base.description
983
+ ? { description: override.description ?? base.description }
984
+ : {}),
985
+ ...(metadata ? { metadata } : {}),
986
+ };
987
+ }
988
+
989
+ function mergeActionArtifacts(
990
+ base: readonly TeamActionArtifactContract[] | null | undefined,
991
+ override: readonly TeamActionArtifactContract[] | null | undefined,
992
+ ): TeamActionArtifactContract[] {
993
+ const merged = new Map<string, TeamActionArtifactContract>();
994
+ for (const artifact of base ?? []) {
995
+ merged.set(artifact.key, artifact);
996
+ }
997
+ for (const artifact of override ?? []) {
998
+ const existing = merged.get(artifact.key);
999
+ merged.set(
1000
+ artifact.key,
1001
+ existing ? mergeActionArtifactContract(existing, artifact) : artifact,
1002
+ );
1003
+ }
1004
+ return [...merged.values()];
1005
+ }
1006
+
1007
+ function mergeActionOutputContract(
1008
+ base: TeamActionOutputContract | null | undefined,
1009
+ override: TeamActionOutputContract | null | undefined,
1010
+ ): TeamActionOutputContract | null {
1011
+ if (!base && !override) {
1012
+ return null;
1013
+ }
1014
+ const metadata = mergeRecords(base?.metadata, override?.metadata);
1015
+ return {
1016
+ ...(override?.mode ?? base?.mode ? { mode: override?.mode ?? base?.mode } : {}),
1017
+ ...(override?.contentType ?? base?.contentType
1018
+ ? { contentType: override?.contentType ?? base?.contentType }
1019
+ : {}),
1020
+ ...(override?.schema ?? base?.schema ? { schema: override?.schema ?? base?.schema } : {}),
1021
+ artifacts: mergeActionArtifacts(base?.artifacts, override?.artifacts),
1022
+ ...(metadata ? { metadata } : {}),
1023
+ };
1024
+ }
1025
+
1026
+ function mergeActionRouteContract(
1027
+ base: TeamActionRouteContract | null | undefined,
1028
+ override: TeamActionRouteContract | null | undefined,
1029
+ ): TeamActionRouteContract | null {
1030
+ if (!base && !override) {
1031
+ return null;
1032
+ }
1033
+ const metadata = mergeRecords(base?.metadata, override?.metadata);
1034
+ return {
1035
+ ...(override?.method ?? base?.method
1036
+ ? { method: override?.method ?? base?.method }
1037
+ : {}),
1038
+ ...(override?.surfaceKey ?? base?.surfaceKey
1039
+ ? { surfaceKey: override?.surfaceKey ?? base?.surfaceKey }
1040
+ : {}),
1041
+ ...(override?.path ?? base?.path ? { path: override?.path ?? base?.path } : {}),
1042
+ ...(metadata ? { metadata } : {}),
1043
+ };
1044
+ }
1045
+
1046
+ function mergeTeamActionContracts(
1047
+ base: TeamActionContract,
1048
+ override: TeamActionContract,
1049
+ ): TeamActionContract {
1050
+ if (base.id !== override.id) {
1051
+ throw new Error(
1052
+ `team manifest: cannot merge action "${override.id}" into "${base.id}"`,
1053
+ );
1054
+ }
1055
+ const route = mergeActionRouteContract(base.route, override.route);
1056
+ const input = mergeActionInputContract(base.input, override.input);
1057
+ const output = mergeActionOutputContract(base.output, override.output);
1058
+ const defaults = mergeRecords(base.defaults, override.defaults);
1059
+ const metadata = mergeRecords(base.metadata, override.metadata);
1060
+ const enabled =
1061
+ override.enabled !== undefined && override.enabled !== null
1062
+ ? override.enabled
1063
+ : base.enabled;
1064
+ return {
1065
+ id: base.id,
1066
+ ...(override.title ?? base.title ? { title: override.title ?? base.title } : {}),
1067
+ ...(override.description ?? base.description
1068
+ ? { description: override.description ?? base.description }
1069
+ : {}),
1070
+ ...(enabled !== undefined && enabled !== null ? { enabled } : {}),
1071
+ ...(route ? { route } : {}),
1072
+ ...(input ? { input } : {}),
1073
+ ...(output ? { output } : {}),
1074
+ ...(defaults ? { defaults } : {}),
1075
+ capabilities: uniqueStrings([
1076
+ ...(base.capabilities ?? []),
1077
+ ...(override.capabilities ?? []),
1078
+ ]),
1079
+ ...(metadata ? { metadata } : {}),
1080
+ };
1081
+ }
1082
+
1083
+ export function resolveTeamActionContract(
1084
+ manifest: TeamManifest,
1085
+ teamId: string | null | undefined,
1086
+ actionId: string | null | undefined,
1087
+ options: ResolveTeamActionContractOptions = {},
1088
+ ): TeamActionContract {
1089
+ const normalizedTeamId = requiredText(teamId, "team id");
1090
+ const normalizedActionId = requiredText(actionId, "action id");
1091
+ const team = findTeamManifestTeam(manifest, normalizedTeamId);
1092
+ if (!team) {
1093
+ throw new Error(`team manifest: unknown team "${normalizedTeamId}"`);
1094
+ }
1095
+ const normalizedMemberId = nonEmpty(options.memberId);
1096
+ const member = normalizedMemberId
1097
+ ? findTeamManifestMember(team, normalizedMemberId)
1098
+ : null;
1099
+ if (normalizedMemberId && !member) {
1100
+ throw new Error(
1101
+ `team manifest: unknown member "${normalizedMemberId}" for team "${team.id}"`,
1102
+ );
1103
+ }
1104
+ const scopedActions = [
1105
+ findTeamActionContract(manifest.actions, normalizedActionId),
1106
+ findTeamActionContract(team.actions, normalizedActionId),
1107
+ member ? findTeamActionContract(member.actions, normalizedActionId) : null,
1108
+ ].filter((action): action is TeamActionContract => Boolean(action));
1109
+ if (!scopedActions.length) {
1110
+ throw new Error(
1111
+ `team manifest: unknown action "${normalizedActionId}" for team "${team.id}"`,
1112
+ );
1113
+ }
1114
+ return scopedActions.reduce((merged, action) =>
1115
+ mergeTeamActionContracts(merged, action),
1116
+ );
1117
+ }
1118
+
1119
+ export function resolveTeamActionApiPath(
1120
+ manifest: TeamManifest,
1121
+ teamId: string | null | undefined,
1122
+ actionId: string | null | undefined,
1123
+ options: ResolveTeamActionContractOptions = {},
1124
+ ): string {
1125
+ const action = resolveTeamActionContract(manifest, teamId, actionId, options);
1126
+ if (action.enabled === false) {
1127
+ throw new Error(`team manifest: action "${action.id}" is disabled`);
1128
+ }
1129
+ if (action.route?.path) {
1130
+ return action.route.path;
1131
+ }
1132
+ const normalizedMemberId = nonEmpty(options.memberId);
1133
+ if (normalizedMemberId) {
1134
+ return resolveTeamRoutePath("agent.action", {
1135
+ teamId: requiredText(teamId, "team id"),
1136
+ agentId: normalizedMemberId,
1137
+ actionId: action.id,
1138
+ });
1139
+ }
1140
+ return resolveTeamRoutePath("action", {
1141
+ teamId: requiredText(teamId, "team id"),
1142
+ actionId: action.id,
1143
+ });
1144
+ }
1145
+
1146
+ export function resolveTeamRoutePath(
1147
+ routeKey: TeamRouteKey,
1148
+ options: ResolveTeamRoutePathOptions,
1149
+ ): string {
1150
+ const teamId = requiredText(options.teamId, "team id");
1151
+ switch (routeKey) {
1152
+ case "action": {
1153
+ const actionId = requiredText(options.actionId, "action id");
1154
+ return joinUrlPath(["api", "teams", teamId, "actions", actionId]);
1155
+ }
1156
+ case "agent.action": {
1157
+ const agentId = requiredText(options.agentId, "agent id");
1158
+ const actionId = requiredText(options.actionId, "action id");
1159
+ return joinUrlPath([
1160
+ "api",
1161
+ "teams",
1162
+ teamId,
1163
+ "agents",
1164
+ agentId,
1165
+ "actions",
1166
+ actionId,
1167
+ ]);
1168
+ }
1169
+ case "kanban":
1170
+ case "runs":
1171
+ case "config":
1172
+ return joinUrlPath(["api", "teams", teamId, routeKey]);
1173
+ case "workspace":
1174
+ return joinUrlPath([
1175
+ "api",
1176
+ "teams",
1177
+ teamId,
1178
+ "workspace",
1179
+ ...workspacePathSegments(options.workspacePath),
1180
+ ]);
1181
+ case "agent.config": {
1182
+ const agentId = requiredText(options.agentId, "agent id");
1183
+ return joinUrlPath([
1184
+ "api",
1185
+ "teams",
1186
+ teamId,
1187
+ "agents",
1188
+ agentId,
1189
+ "config",
1190
+ ]);
1191
+ }
1192
+ case "agent.workspace": {
1193
+ const agentId = requiredText(options.agentId, "agent id");
1194
+ return joinUrlPath([
1195
+ "api",
1196
+ "teams",
1197
+ teamId,
1198
+ "agents",
1199
+ agentId,
1200
+ "workspace",
1201
+ ...workspacePathSegments(options.workspacePath),
1202
+ ]);
1203
+ }
1204
+ default:
1205
+ throw new Error(`team manifest: unknown team route "${routeKey}"`);
1206
+ }
1207
+ }
1208
+
1209
+ function normalizeBindingMatchValue(value: string | null | undefined): string | null {
1210
+ const trimmed = nonEmpty(value);
1211
+ return trimmed ? trimmed.toLowerCase() : null;
1212
+ }
1213
+
1214
+ function escapeRegExp(value: string): string {
1215
+ return value.replace(/[\\^$.*+?()[\]{}|]/gu, "\\$&");
1216
+ }
1217
+
1218
+ function expandSessionKeyPattern(
1219
+ pattern: string,
1220
+ binding: GatewayRouteBinding,
1221
+ ): string {
1222
+ return pattern
1223
+ .replace(/\{teamId\}/gu, binding.teamId)
1224
+ .replace(/\{memberId\}/gu, binding.memberId ?? "")
1225
+ .replace(/\{actionId\}/gu, binding.actionId ?? "");
1226
+ }
1227
+
1228
+ function matchesSessionKeyPattern(
1229
+ binding: GatewayRouteBinding,
1230
+ sessionKey: string | null,
1231
+ ): boolean {
1232
+ const pattern = nonEmpty(binding.sessionKeyPattern);
1233
+ if (!pattern) {
1234
+ return true;
1235
+ }
1236
+ const candidate = nonEmpty(sessionKey);
1237
+ if (!candidate) {
1238
+ return false;
1239
+ }
1240
+ const expanded = expandSessionKeyPattern(pattern, binding);
1241
+ if (!expanded.includes("*")) {
1242
+ return candidate === expanded;
1243
+ }
1244
+ const source = expanded.split("*").map(escapeRegExp).join(".*");
1245
+ return new RegExp(`^${source}$`, "u").test(candidate);
1246
+ }
1247
+
1248
+ function bindingMatchScore(
1249
+ binding: GatewayRouteBinding,
1250
+ options: ResolveGatewayRouteBindingOptions,
1251
+ ): number {
1252
+ if (options.bindingId && binding.id !== options.bindingId.trim()) {
1253
+ return -1;
1254
+ }
1255
+
1256
+ const inputSource = normalizeBindingMatchValue(options.source);
1257
+ const inputChannel = normalizeBindingMatchValue(options.channel);
1258
+ const inputAgentId = normalizeBindingMatchValue(options.agentId);
1259
+ const inputActionId = normalizeBindingMatchValue(options.actionId);
1260
+ const bindingSource = normalizeBindingMatchValue(binding.source);
1261
+ const bindingChannel = normalizeBindingMatchValue(binding.channel);
1262
+ const bindingMemberId = normalizeBindingMatchValue(binding.memberId);
1263
+ const bindingActionId = normalizeBindingMatchValue(binding.actionId);
1264
+
1265
+ if (bindingSource && bindingSource !== inputSource && bindingSource !== inputChannel) {
1266
+ return -1;
1267
+ }
1268
+ if (bindingChannel && bindingChannel !== inputChannel && bindingChannel !== inputSource) {
1269
+ return -1;
1270
+ }
1271
+ if (bindingMemberId && inputAgentId && bindingMemberId !== inputAgentId) {
1272
+ return -1;
1273
+ }
1274
+ if (bindingActionId && inputActionId && bindingActionId !== inputActionId) {
1275
+ return -1;
1276
+ }
1277
+ const sessionKey = nonEmpty(options.sessionKey) ?? nonEmpty(options.key);
1278
+ if (!matchesSessionKeyPattern(binding, sessionKey)) {
1279
+ return -1;
1280
+ }
1281
+
1282
+ let score = 0;
1283
+ if (options.bindingId) score += 100;
1284
+ if (binding.sessionKeyPattern) score += 20;
1285
+ if (bindingSource) score += 10;
1286
+ if (bindingChannel) score += 10;
1287
+ if (bindingMemberId) score += 5;
1288
+ if (bindingActionId) score += 5;
1289
+ return score;
1290
+ }
1291
+
1292
+ function bindingRouteKey(binding: GatewayRouteBinding): TeamRouteKey {
1293
+ const explicit = nonEmpty(binding.routeKey);
1294
+ if (explicit) {
1295
+ return explicit as TeamRouteKey;
1296
+ }
1297
+ if (nonEmpty(binding.actionId)) {
1298
+ return nonEmpty(binding.memberId) ? "agent.action" : "action";
1299
+ }
1300
+ return "runs";
1301
+ }
1302
+
1303
+ export function resolveGatewayRouteBinding(
1304
+ manifest: TeamManifest,
1305
+ options: ResolveGatewayRouteBindingOptions,
1306
+ ): GatewayResolvedRouteBinding | null {
1307
+ const bindings = normalizeGatewayRouteBindings(manifest.bindings);
1308
+ let selected: GatewayRouteBinding | null = null;
1309
+ let selectedScore = -1;
1310
+ for (const binding of bindings) {
1311
+ const score = bindingMatchScore(binding, options);
1312
+ if (score > selectedScore) {
1313
+ selected = binding;
1314
+ selectedScore = score;
1315
+ }
1316
+ }
1317
+ if (!selected || selectedScore < 0) {
1318
+ return null;
1319
+ }
1320
+
1321
+ const team = findTeamManifestTeam(manifest, selected.teamId);
1322
+ if (!team) {
1323
+ throw new Error(`team manifest: binding "${selected.id}" references unknown team "${selected.teamId}"`);
1324
+ }
1325
+ const memberId = nonEmpty(selected.memberId);
1326
+ if (memberId && !findTeamManifestMember(team, memberId)) {
1327
+ throw new Error(
1328
+ `team manifest: binding "${selected.id}" references unknown member "${memberId}" for team "${team.id}"`,
1329
+ );
1330
+ }
1331
+
1332
+ const routeKey = bindingRouteKey(selected);
1333
+ const actionId = nonEmpty(selected.actionId);
1334
+ const path = resolveTeamRoutePath(routeKey, {
1335
+ teamId: team.id,
1336
+ agentId: memberId,
1337
+ actionId,
1338
+ });
1339
+ return {
1340
+ id: selected.id,
1341
+ teamId: team.id,
1342
+ memberId,
1343
+ source: nonEmpty(selected.source),
1344
+ channel: nonEmpty(selected.channel),
1345
+ actionId,
1346
+ routeKey,
1347
+ path,
1348
+ ...(selected.metadata ? { metadata: selected.metadata } : {}),
1349
+ };
1350
+ }
1351
+
1352
+ function resolveTeamWorkspaceEntry(
1353
+ team: TeamManifestTeam,
1354
+ keyOrPath: string,
1355
+ options: ResolveTeamWorkspacePathOptions = {},
1356
+ ): NormalizedWorkspacePathEntry {
1357
+ const member = findTeamManifestMember(team, options.memberId);
1358
+ const workspace = member?.workspace ?? team.workspace ?? null;
1359
+ if (!workspace) {
1360
+ throw new Error(`team manifest: team "${team.id}" has no workspace root`);
1361
+ }
1362
+ const entry = findWorkspacePath(workspace, keyOrPath);
1363
+ if (!entry) {
1364
+ throw new Error(
1365
+ `team manifest: workspace path "${keyOrPath}" is not whitelisted for team "${team.id}"`,
1366
+ );
1367
+ }
1368
+ return entry;
1369
+ }
1370
+
1371
+ export function resolveTeamWorkspacePath(
1372
+ team: TeamManifestTeam,
1373
+ keyOrPath: string,
1374
+ options: ResolveTeamWorkspacePathOptions = {},
1375
+ ): string {
1376
+ const member = findTeamManifestMember(team, options.memberId);
1377
+ const workspace = member?.workspace ?? team.workspace ?? null;
1378
+ if (!workspace) {
1379
+ throw new Error(`team manifest: team "${team.id}" has no workspace root`);
1380
+ }
1381
+ const entry = resolveTeamWorkspaceEntry(team, keyOrPath, options);
1382
+ return joinWorkspacePath(workspace.rootPath, entry.path);
1383
+ }
1384
+
1385
+ export function resolveTeamWorkspaceApiPath(
1386
+ team: TeamManifestTeam,
1387
+ keyOrPath: string,
1388
+ options: ResolveTeamWorkspacePathOptions = {},
1389
+ ): string {
1390
+ const entry = resolveTeamWorkspaceEntry(team, keyOrPath, options);
1391
+ if (options.memberId) {
1392
+ return resolveTeamRoutePath("agent.workspace", {
1393
+ teamId: team.id,
1394
+ agentId: options.memberId,
1395
+ workspacePath: entry.path,
1396
+ });
1397
+ }
1398
+ return resolveTeamRoutePath("workspace", {
1399
+ teamId: team.id,
1400
+ workspacePath: entry.path,
1401
+ });
1402
+ }