@shipfox/api-agent 2.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 (274) hide show
  1. package/.turbo/turbo-build.log +2 -0
  2. package/.turbo/turbo-type$colon$emit.log +1 -0
  3. package/.turbo/turbo-type.log +1 -0
  4. package/CHANGELOG.md +105 -0
  5. package/LICENSE +21 -0
  6. package/dist/config.d.ts +13 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +60 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/core/credential-fingerprints.d.ts +10 -0
  11. package/dist/core/credential-fingerprints.d.ts.map +1 -0
  12. package/dist/core/credential-fingerprints.js +65 -0
  13. package/dist/core/credential-fingerprints.js.map +1 -0
  14. package/dist/core/custom-model-provider-config-service.d.ts +26 -0
  15. package/dist/core/custom-model-provider-config-service.d.ts.map +1 -0
  16. package/dist/core/custom-model-provider-config-service.js +390 -0
  17. package/dist/core/custom-model-provider-config-service.js.map +1 -0
  18. package/dist/core/custom-provider-url.d.ts +4 -0
  19. package/dist/core/custom-provider-url.d.ts.map +1 -0
  20. package/dist/core/custom-provider-url.js +23 -0
  21. package/dist/core/custom-provider-url.js.map +1 -0
  22. package/dist/core/discover-custom-model-provider-models.d.ts +3 -0
  23. package/dist/core/discover-custom-model-provider-models.d.ts.map +1 -0
  24. package/dist/core/discover-custom-model-provider-models.js +122 -0
  25. package/dist/core/discover-custom-model-provider-models.js.map +1 -0
  26. package/dist/core/entities/agent-workspace-settings.d.ts +9 -0
  27. package/dist/core/entities/agent-workspace-settings.d.ts.map +1 -0
  28. package/dist/core/entities/agent-workspace-settings.js +3 -0
  29. package/dist/core/entities/agent-workspace-settings.js.map +1 -0
  30. package/dist/core/entities/model-provider-config.d.ts +19 -0
  31. package/dist/core/entities/model-provider-config.d.ts.map +1 -0
  32. package/dist/core/entities/model-provider-config.js +3 -0
  33. package/dist/core/entities/model-provider-config.js.map +1 -0
  34. package/dist/core/errors.d.ts +62 -0
  35. package/dist/core/errors.d.ts.map +1 -0
  36. package/dist/core/errors.js +80 -0
  37. package/dist/core/errors.js.map +1 -0
  38. package/dist/core/harness/claude.d.ts +6 -0
  39. package/dist/core/harness/claude.d.ts.map +1 -0
  40. package/dist/core/harness/claude.js +104 -0
  41. package/dist/core/harness/claude.js.map +1 -0
  42. package/dist/core/harness/index.d.ts +4 -0
  43. package/dist/core/harness/index.d.ts.map +1 -0
  44. package/dist/core/harness/index.js +5 -0
  45. package/dist/core/harness/index.js.map +1 -0
  46. package/dist/core/harness/pi.d.ts +6 -0
  47. package/dist/core/harness/pi.d.ts.map +1 -0
  48. package/dist/core/harness/pi.js +16 -0
  49. package/dist/core/harness/pi.js.map +1 -0
  50. package/dist/core/harness/registry.d.ts +22 -0
  51. package/dist/core/harness/registry.d.ts.map +1 -0
  52. package/dist/core/harness/registry.js +46 -0
  53. package/dist/core/harness/registry.js.map +1 -0
  54. package/dist/core/index.d.ts +12 -0
  55. package/dist/core/index.d.ts.map +1 -0
  56. package/dist/core/index.js +11 -0
  57. package/dist/core/index.js.map +1 -0
  58. package/dist/core/model-provider-catalog.d.ts +3 -0
  59. package/dist/core/model-provider-catalog.d.ts.map +1 -0
  60. package/dist/core/model-provider-catalog.js +25 -0
  61. package/dist/core/model-provider-catalog.js.map +1 -0
  62. package/dist/core/model-provider-config-service.d.ts +32 -0
  63. package/dist/core/model-provider-config-service.d.ts.map +1 -0
  64. package/dist/core/model-provider-config-service.js +133 -0
  65. package/dist/core/model-provider-config-service.js.map +1 -0
  66. package/dist/core/model-provider-validation.d.ts +31 -0
  67. package/dist/core/model-provider-validation.d.ts.map +1 -0
  68. package/dist/core/model-provider-validation.js +220 -0
  69. package/dist/core/model-provider-validation.js.map +1 -0
  70. package/dist/core/resolve-agent-config.d.ts +32 -0
  71. package/dist/core/resolve-agent-config.d.ts.map +1 -0
  72. package/dist/core/resolve-agent-config.js +143 -0
  73. package/dist/core/resolve-agent-config.js.map +1 -0
  74. package/dist/core/resolve-runtime-credentials.d.ts +21 -0
  75. package/dist/core/resolve-runtime-credentials.d.ts.map +1 -0
  76. package/dist/core/resolve-runtime-credentials.js +101 -0
  77. package/dist/core/resolve-runtime-credentials.js.map +1 -0
  78. package/dist/core/workspace-agent-defaults-resolver.d.ts +3 -0
  79. package/dist/core/workspace-agent-defaults-resolver.d.ts.map +1 -0
  80. package/dist/core/workspace-agent-defaults-resolver.js +26 -0
  81. package/dist/core/workspace-agent-defaults-resolver.js.map +1 -0
  82. package/dist/db/agent-defaults-snapshot.d.ts +9 -0
  83. package/dist/db/agent-defaults-snapshot.d.ts.map +1 -0
  84. package/dist/db/agent-defaults-snapshot.js +24 -0
  85. package/dist/db/agent-defaults-snapshot.js.map +1 -0
  86. package/dist/db/agent-workspace-settings.d.ts +12 -0
  87. package/dist/db/agent-workspace-settings.d.ts.map +1 -0
  88. package/dist/db/agent-workspace-settings.js +53 -0
  89. package/dist/db/agent-workspace-settings.js.map +1 -0
  90. package/dist/db/db.d.ts +771 -0
  91. package/dist/db/db.d.ts.map +1 -0
  92. package/dist/db/db.js +20 -0
  93. package/dist/db/db.js.map +1 -0
  94. package/dist/db/index.d.ts +9 -0
  95. package/dist/db/index.d.ts.map +1 -0
  96. package/dist/db/index.js +11 -0
  97. package/dist/db/index.js.map +1 -0
  98. package/dist/db/model-provider-configs.d.ts +38 -0
  99. package/dist/db/model-provider-configs.d.ts.map +1 -0
  100. package/dist/db/model-provider-configs.js +159 -0
  101. package/dist/db/model-provider-configs.js.map +1 -0
  102. package/dist/db/schema/agent-workspace-settings.d.ts +97 -0
  103. package/dist/db/schema/agent-workspace-settings.d.ts.map +1 -0
  104. package/dist/db/schema/agent-workspace-settings.js +26 -0
  105. package/dist/db/schema/agent-workspace-settings.js.map +1 -0
  106. package/dist/db/schema/common.d.ts +2 -0
  107. package/dist/db/schema/common.d.ts.map +1 -0
  108. package/dist/db/schema/common.js +4 -0
  109. package/dist/db/schema/common.js.map +1 -0
  110. package/dist/db/schema/model-provider-configs.d.ts +296 -0
  111. package/dist/db/schema/model-provider-configs.d.ts.map +1 -0
  112. package/dist/db/schema/model-provider-configs.js +52 -0
  113. package/dist/db/schema/model-provider-configs.js.map +1 -0
  114. package/dist/index.d.ts +5 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +18 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/metrics/index.d.ts +2 -0
  119. package/dist/metrics/index.d.ts.map +1 -0
  120. package/dist/metrics/index.js +3 -0
  121. package/dist/metrics/index.js.map +1 -0
  122. package/dist/metrics/instance.d.ts +10 -0
  123. package/dist/metrics/instance.d.ts.map +1 -0
  124. package/dist/metrics/instance.js +10 -0
  125. package/dist/metrics/instance.js.map +1 -0
  126. package/dist/presentation/dto/index.d.ts +2 -0
  127. package/dist/presentation/dto/index.d.ts.map +1 -0
  128. package/dist/presentation/dto/index.js +3 -0
  129. package/dist/presentation/dto/index.js.map +1 -0
  130. package/dist/presentation/dto/model-provider-config.d.ts +6 -0
  131. package/dist/presentation/dto/model-provider-config.d.ts.map +1 -0
  132. package/dist/presentation/dto/model-provider-config.js +32 -0
  133. package/dist/presentation/dto/model-provider-config.js.map +1 -0
  134. package/dist/presentation/e2eRoutes/create-model-provider.d.ts +2 -0
  135. package/dist/presentation/e2eRoutes/create-model-provider.d.ts.map +1 -0
  136. package/dist/presentation/e2eRoutes/create-model-provider.js +66 -0
  137. package/dist/presentation/e2eRoutes/create-model-provider.js.map +1 -0
  138. package/dist/presentation/e2eRoutes/index.d.ts +3 -0
  139. package/dist/presentation/e2eRoutes/index.d.ts.map +1 -0
  140. package/dist/presentation/e2eRoutes/index.js +9 -0
  141. package/dist/presentation/e2eRoutes/index.js.map +1 -0
  142. package/dist/presentation/index.d.ts +2 -0
  143. package/dist/presentation/index.d.ts.map +1 -0
  144. package/dist/presentation/index.js +3 -0
  145. package/dist/presentation/index.js.map +1 -0
  146. package/dist/presentation/routes/create-custom-model-provider.d.ts +2 -0
  147. package/dist/presentation/routes/create-custom-model-provider.d.ts.map +1 -0
  148. package/dist/presentation/routes/create-custom-model-provider.js +45 -0
  149. package/dist/presentation/routes/create-custom-model-provider.js.map +1 -0
  150. package/dist/presentation/routes/delete-model-provider-config.d.ts +2 -0
  151. package/dist/presentation/routes/delete-model-provider-config.d.ts.map +1 -0
  152. package/dist/presentation/routes/delete-model-provider-config.js +38 -0
  153. package/dist/presentation/routes/delete-model-provider-config.js.map +1 -0
  154. package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.d.ts +2 -0
  155. package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.d.ts.map +1 -0
  156. package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.js +37 -0
  157. package/dist/presentation/routes/discover-custom-model-provider-models-by-slug.js.map +1 -0
  158. package/dist/presentation/routes/discover-custom-model-provider-models.d.ts +2 -0
  159. package/dist/presentation/routes/discover-custom-model-provider-models.d.ts.map +1 -0
  160. package/dist/presentation/routes/discover-custom-model-provider-models.js +31 -0
  161. package/dist/presentation/routes/discover-custom-model-provider-models.js.map +1 -0
  162. package/dist/presentation/routes/errors.d.ts +2 -0
  163. package/dist/presentation/routes/errors.d.ts.map +1 -0
  164. package/dist/presentation/routes/errors.js +112 -0
  165. package/dist/presentation/routes/errors.js.map +1 -0
  166. package/dist/presentation/routes/index.d.ts +3 -0
  167. package/dist/presentation/routes/index.d.ts.map +1 -0
  168. package/dist/presentation/routes/index.js +39 -0
  169. package/dist/presentation/routes/index.js.map +1 -0
  170. package/dist/presentation/routes/list-model-provider-catalog.d.ts +2 -0
  171. package/dist/presentation/routes/list-model-provider-catalog.d.ts.map +1 -0
  172. package/dist/presentation/routes/list-model-provider-catalog.js +18 -0
  173. package/dist/presentation/routes/list-model-provider-catalog.js.map +1 -0
  174. package/dist/presentation/routes/list-model-provider-configs.d.ts +2 -0
  175. package/dist/presentation/routes/list-model-provider-configs.d.ts.map +1 -0
  176. package/dist/presentation/routes/list-model-provider-configs.js +37 -0
  177. package/dist/presentation/routes/list-model-provider-configs.js.map +1 -0
  178. package/dist/presentation/routes/set-default-harness.d.ts +2 -0
  179. package/dist/presentation/routes/set-default-harness.d.ts.map +1 -0
  180. package/dist/presentation/routes/set-default-harness.js +38 -0
  181. package/dist/presentation/routes/set-default-harness.js.map +1 -0
  182. package/dist/presentation/routes/set-default-model-provider.d.ts +2 -0
  183. package/dist/presentation/routes/set-default-model-provider.d.ts.map +1 -0
  184. package/dist/presentation/routes/set-default-model-provider.js +48 -0
  185. package/dist/presentation/routes/set-default-model-provider.js.map +1 -0
  186. package/dist/presentation/routes/update-custom-model-provider.d.ts +2 -0
  187. package/dist/presentation/routes/update-custom-model-provider.d.ts.map +1 -0
  188. package/dist/presentation/routes/update-custom-model-provider.js +47 -0
  189. package/dist/presentation/routes/update-custom-model-provider.js.map +1 -0
  190. package/dist/presentation/routes/update-model-provider-default-model.d.ts +2 -0
  191. package/dist/presentation/routes/update-model-provider-default-model.d.ts.map +1 -0
  192. package/dist/presentation/routes/update-model-provider-default-model.js +38 -0
  193. package/dist/presentation/routes/update-model-provider-default-model.js.map +1 -0
  194. package/dist/presentation/routes/upsert-model-provider-config.d.ts +2 -0
  195. package/dist/presentation/routes/upsert-model-provider-config.d.ts.map +1 -0
  196. package/dist/presentation/routes/upsert-model-provider-config.js +52 -0
  197. package/dist/presentation/routes/upsert-model-provider-config.js.map +1 -0
  198. package/dist/tsconfig.test.tsbuildinfo +1 -0
  199. package/drizzle/0000_daffy_leopardon.sql +28 -0
  200. package/drizzle/0001_default_harness.sql +1 -0
  201. package/drizzle/meta/0000_snapshot.json +199 -0
  202. package/drizzle/meta/0001_snapshot.json +205 -0
  203. package/drizzle/meta/_journal.json +20 -0
  204. package/drizzle.config.ts +7 -0
  205. package/package.json +109 -0
  206. package/src/config.test.ts +118 -0
  207. package/src/config.ts +75 -0
  208. package/src/core/catalog-registry.test.ts +48 -0
  209. package/src/core/credential-fingerprints.test.ts +34 -0
  210. package/src/core/credential-fingerprints.ts +84 -0
  211. package/src/core/custom-model-provider-config-service.ts +537 -0
  212. package/src/core/custom-provider-url.ts +24 -0
  213. package/src/core/discover-custom-model-provider-models.ts +147 -0
  214. package/src/core/entities/agent-workspace-settings.ts +9 -0
  215. package/src/core/entities/model-provider-config.ts +25 -0
  216. package/src/core/errors.ts +139 -0
  217. package/src/core/harness/claude.ts +75 -0
  218. package/src/core/harness/index.ts +19 -0
  219. package/src/core/harness/pi.ts +18 -0
  220. package/src/core/harness/registry.test.ts +281 -0
  221. package/src/core/harness/registry.ts +108 -0
  222. package/src/core/index.ts +56 -0
  223. package/src/core/model-provider-catalog.ts +33 -0
  224. package/src/core/model-provider-config-service.test.ts +940 -0
  225. package/src/core/model-provider-config-service.ts +207 -0
  226. package/src/core/model-provider-validation.test.ts +354 -0
  227. package/src/core/model-provider-validation.ts +276 -0
  228. package/src/core/resolve-agent-config.test.ts +441 -0
  229. package/src/core/resolve-agent-config.ts +272 -0
  230. package/src/core/resolve-runtime-credentials.test.ts +316 -0
  231. package/src/core/resolve-runtime-credentials.ts +147 -0
  232. package/src/core/workspace-agent-defaults-resolver.ts +42 -0
  233. package/src/db/agent-defaults-snapshot.ts +49 -0
  234. package/src/db/agent-workspace-settings.test.ts +111 -0
  235. package/src/db/agent-workspace-settings.ts +92 -0
  236. package/src/db/db.ts +20 -0
  237. package/src/db/index.ts +29 -0
  238. package/src/db/model-provider-configs.test.ts +281 -0
  239. package/src/db/model-provider-configs.ts +230 -0
  240. package/src/db/schema/agent-workspace-settings.ts +27 -0
  241. package/src/db/schema/common.ts +3 -0
  242. package/src/db/schema/model-provider-configs.ts +80 -0
  243. package/src/index.ts +43 -0
  244. package/src/metrics/index.ts +1 -0
  245. package/src/metrics/instance.ts +18 -0
  246. package/src/presentation/dto/index.ts +5 -0
  247. package/src/presentation/dto/model-provider-config.ts +41 -0
  248. package/src/presentation/e2eRoutes/create-model-provider.test.ts +47 -0
  249. package/src/presentation/e2eRoutes/create-model-provider.ts +61 -0
  250. package/src/presentation/e2eRoutes/index.ts +7 -0
  251. package/src/presentation/index.ts +1 -0
  252. package/src/presentation/routes/create-custom-model-provider.ts +45 -0
  253. package/src/presentation/routes/delete-model-provider-config.ts +31 -0
  254. package/src/presentation/routes/discover-custom-model-provider-models-by-slug.ts +42 -0
  255. package/src/presentation/routes/discover-custom-model-provider-models.ts +29 -0
  256. package/src/presentation/routes/errors.ts +122 -0
  257. package/src/presentation/routes/index.ts +37 -0
  258. package/src/presentation/routes/list-model-provider-catalog.ts +15 -0
  259. package/src/presentation/routes/list-model-provider-configs.ts +33 -0
  260. package/src/presentation/routes/model-provider-catalog.test.ts +73 -0
  261. package/src/presentation/routes/model-provider-config.test.ts +807 -0
  262. package/src/presentation/routes/set-default-harness.ts +33 -0
  263. package/src/presentation/routes/set-default-model-provider.ts +47 -0
  264. package/src/presentation/routes/update-custom-model-provider.ts +50 -0
  265. package/src/presentation/routes/update-model-provider-default-model.ts +40 -0
  266. package/src/presentation/routes/upsert-model-provider-config.ts +53 -0
  267. package/test/env.ts +8 -0
  268. package/test/globalSetup.ts +25 -0
  269. package/test/setup.ts +17 -0
  270. package/tsconfig.build.json +9 -0
  271. package/tsconfig.build.tsbuildinfo +1 -0
  272. package/tsconfig.json +3 -0
  273. package/tsconfig.test.json +8 -0
  274. package/vitest.config.ts +11 -0
@@ -0,0 +1,9 @@
1
+ import type { Harness, ModelProviderRef } from '@shipfox/api-agent-dto';
2
+ export interface AgentWorkspaceSettings {
3
+ workspaceId: string;
4
+ defaultProviderId: ModelProviderRef | null;
5
+ defaultHarnessId: Harness | null;
6
+ createdAt: Date;
7
+ updatedAt: Date;
8
+ }
9
+ //# sourceMappingURL=agent-workspace-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-workspace-settings.d.ts","sourceRoot":"","sources":["../../../src/core/entities/agent-workspace-settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAE,gBAAgB,EAAC,MAAM,wBAAwB,CAAC;AAEtE,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC3C,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB"}
@@ -0,0 +1,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=agent-workspace-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/entities/agent-workspace-settings.ts"],"sourcesContent":["import type {Harness, ModelProviderRef} from '@shipfox/api-agent-dto';\n\nexport interface AgentWorkspaceSettings {\n workspaceId: string;\n defaultProviderId: ModelProviderRef | null;\n defaultHarnessId: Harness | null;\n createdAt: Date;\n updatedAt: Date;\n}\n"],"names":[],"mappings":"AAEA,WAMC"}
@@ -0,0 +1,19 @@
1
+ import type { AgentThinking, CustomAgentModelDto, CustomModelProviderHeaderDto, ModelProviderApi, ModelProviderRef } from '@shipfox/api-agent-dto';
2
+ export interface ModelProviderConfig {
3
+ id: string;
4
+ workspaceId: string;
5
+ providerId: ModelProviderRef;
6
+ kind: 'builtin' | 'custom';
7
+ displayName: string | null;
8
+ api: ModelProviderApi | null;
9
+ baseUrl: string | null;
10
+ headers: CustomModelProviderHeaderDto[] | null;
11
+ secretHeaderNames: string[] | null;
12
+ models: CustomAgentModelDto[] | null;
13
+ requiresApiKey: boolean;
14
+ defaultModel: string | null;
15
+ defaultThinking: AgentThinking;
16
+ createdAt: Date;
17
+ updatedAt: Date;
18
+ }
19
+ //# sourceMappingURL=model-provider-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-provider-config.d.ts","sourceRoot":"","sources":["../../../src/core/entities/model-provider-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,4BAA4B,EAC5B,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,wBAAwB,CAAC;AAEhC,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,IAAI,EAAE,SAAS,GAAG,QAAQ,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC7B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,4BAA4B,EAAE,GAAG,IAAI,CAAC;IAC/C,iBAAiB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACnC,MAAM,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;IACrC,cAAc,EAAE,OAAO,CAAC;IACxB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,EAAE,aAAa,CAAC;IAC/B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB"}
@@ -0,0 +1,3 @@
1
+ export { };
2
+
3
+ //# sourceMappingURL=model-provider-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/entities/model-provider-config.ts"],"sourcesContent":["import type {\n AgentThinking,\n CustomAgentModelDto,\n CustomModelProviderHeaderDto,\n ModelProviderApi,\n ModelProviderRef,\n} from '@shipfox/api-agent-dto';\n\nexport interface ModelProviderConfig {\n id: string;\n workspaceId: string;\n providerId: ModelProviderRef;\n kind: 'builtin' | 'custom';\n displayName: string | null;\n api: ModelProviderApi | null;\n baseUrl: string | null;\n headers: CustomModelProviderHeaderDto[] | null;\n secretHeaderNames: string[] | null;\n models: CustomAgentModelDto[] | null;\n requiresApiKey: boolean;\n defaultModel: string | null;\n defaultThinking: AgentThinking;\n createdAt: Date;\n updatedAt: Date;\n}\n"],"names":[],"mappings":"AAQA,WAgBC"}
@@ -0,0 +1,62 @@
1
+ import type { AgentThinking, Harness, ModelProviderRef, SupportedModelProviderId } from '@shipfox/api-agent-dto';
2
+ export declare class ModelProviderValidationError extends Error {
3
+ readonly providerId: ModelProviderRef;
4
+ readonly sanitizedMessage: string;
5
+ constructor(providerId: ModelProviderRef, sanitizedMessage: string);
6
+ }
7
+ export declare class ModelProviderConfigNotFoundError extends Error {
8
+ readonly workspaceId: string;
9
+ readonly providerId: string;
10
+ constructor(workspaceId: string, providerId: string);
11
+ }
12
+ export declare class UnsupportedModelProviderError extends Error {
13
+ readonly providerId: string;
14
+ constructor(providerId: string);
15
+ }
16
+ export declare class UnsupportedHarnessProviderError extends Error {
17
+ readonly harness: Harness;
18
+ readonly providerId: string;
19
+ readonly supportedProviderIds: readonly string[];
20
+ constructor(harness: Harness, providerId: string, supportedProviderIds: readonly string[]);
21
+ }
22
+ export declare class UnsupportedHarnessThinkingError extends Error {
23
+ readonly harness: Harness;
24
+ readonly thinking: AgentThinking;
25
+ readonly supportedLevels: readonly AgentThinking[];
26
+ constructor(harness: Harness, thinking: AgentThinking, supportedLevels: readonly AgentThinking[]);
27
+ }
28
+ export declare class InvalidCredentialFieldsError extends Error {
29
+ readonly providerId: SupportedModelProviderId;
30
+ constructor(providerId: SupportedModelProviderId);
31
+ }
32
+ export declare class InvalidAgentModelError extends Error {
33
+ readonly harness: Harness;
34
+ readonly providerId: ModelProviderRef;
35
+ readonly model: string;
36
+ constructor(providerId: ModelProviderRef, model: string);
37
+ constructor(harness: Harness, providerId: ModelProviderRef, model: string);
38
+ }
39
+ export declare class ModelProviderValidationUnavailableError extends Error {
40
+ readonly providerId: SupportedModelProviderId;
41
+ constructor(providerId: SupportedModelProviderId);
42
+ }
43
+ export declare class CustomModelProviderSlugCollisionError extends Error {
44
+ readonly workspaceId: string;
45
+ readonly providerId: ModelProviderRef;
46
+ constructor(workspaceId: string, providerId: ModelProviderRef);
47
+ }
48
+ export declare class CustomModelProviderConfigNotFoundError extends Error {
49
+ readonly workspaceId: string;
50
+ readonly providerId: ModelProviderRef;
51
+ constructor(workspaceId: string, providerId: ModelProviderRef);
52
+ }
53
+ export declare class InvalidCustomModelProviderHeaderKeepError extends Error {
54
+ readonly providerId: ModelProviderRef;
55
+ readonly headerName: string;
56
+ constructor(providerId: ModelProviderRef, headerName: string);
57
+ }
58
+ export declare class CustomModelProviderStoredSecretBaseUrlChangeError extends Error {
59
+ readonly providerId: ModelProviderRef;
60
+ constructor(providerId: ModelProviderRef);
61
+ }
62
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EACb,OAAO,EACP,gBAAgB,EAChB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAEhC,qBAAa,4BAA6B,SAAQ,KAAK;aAEnC,UAAU,EAAE,gBAAgB;aAC5B,gBAAgB,EAAE,MAAM;gBADxB,UAAU,EAAE,gBAAgB,EAC5B,gBAAgB,EAAE,MAAM;CAK3C;AAED,qBAAa,gCAAiC,SAAQ,KAAK;aAEvC,WAAW,EAAE,MAAM;aACnB,UAAU,EAAE,MAAM;gBADlB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM;CAKrC;AAED,qBAAa,6BAA8B,SAAQ,KAAK;aAC1B,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM;CAI/C;AAED,qBAAa,+BAAgC,SAAQ,KAAK;aAEtC,OAAO,EAAE,OAAO;aAChB,UAAU,EAAE,MAAM;aAClB,oBAAoB,EAAE,SAAS,MAAM,EAAE;gBAFvC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,EAClB,oBAAoB,EAAE,SAAS,MAAM,EAAE;CAO1D;AAED,qBAAa,+BAAgC,SAAQ,KAAK;aAEtC,OAAO,EAAE,OAAO;aAChB,QAAQ,EAAE,aAAa;aACvB,eAAe,EAAE,SAAS,aAAa,EAAE;gBAFzC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,aAAa,EACvB,eAAe,EAAE,SAAS,aAAa,EAAE;CAO5D;AAED,qBAAa,4BAA6B,SAAQ,KAAK;aACzB,UAAU,EAAE,wBAAwB;gBAApC,UAAU,EAAE,wBAAwB;CAIjE;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,SAAgB,OAAO,EAAE,OAAO,CAAC;IACjC,SAAgB,UAAU,EAAE,gBAAgB,CAAC;IAC7C,SAAgB,KAAK,EAAE,MAAM,CAAC;gBAElB,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM;gBAC3C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM;CAmB1E;AAED,qBAAa,uCAAwC,SAAQ,KAAK;aACpC,UAAU,EAAE,wBAAwB;gBAApC,UAAU,EAAE,wBAAwB;CAIjE;AAED,qBAAa,qCAAsC,SAAQ,KAAK;aAE5C,WAAW,EAAE,MAAM;aACnB,UAAU,EAAE,gBAAgB;gBAD5B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,gBAAgB;CAK/C;AAED,qBAAa,sCAAuC,SAAQ,KAAK;aAE7C,WAAW,EAAE,MAAM;aACnB,UAAU,EAAE,gBAAgB;gBAD5B,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,gBAAgB;CAK/C;AAED,qBAAa,yCAA0C,SAAQ,KAAK;aAEhD,UAAU,EAAE,gBAAgB;aAC5B,UAAU,EAAE,MAAM;gBADlB,UAAU,EAAE,gBAAgB,EAC5B,UAAU,EAAE,MAAM;CAKrC;AAED,qBAAa,iDAAkD,SAAQ,KAAK;aAC9C,UAAU,EAAE,gBAAgB;gBAA5B,UAAU,EAAE,gBAAgB;CAMzD"}
@@ -0,0 +1,80 @@
1
+ export class ModelProviderValidationError extends Error {
2
+ constructor(providerId, sanitizedMessage){
3
+ super(`Model provider validation failed for ${providerId}: ${sanitizedMessage}`), this.providerId = providerId, this.sanitizedMessage = sanitizedMessage;
4
+ this.name = 'ModelProviderValidationError';
5
+ }
6
+ }
7
+ export class ModelProviderConfigNotFoundError extends Error {
8
+ constructor(workspaceId, providerId){
9
+ super(`Model provider config not found: ${workspaceId}/${providerId}`), this.workspaceId = workspaceId, this.providerId = providerId;
10
+ this.name = 'ModelProviderConfigNotFoundError';
11
+ }
12
+ }
13
+ export class UnsupportedModelProviderError extends Error {
14
+ constructor(providerId){
15
+ super(`Unsupported model provider: ${providerId}`), this.providerId = providerId;
16
+ this.name = 'UnsupportedModelProviderError';
17
+ }
18
+ }
19
+ export class UnsupportedHarnessProviderError extends Error {
20
+ constructor(harness, providerId, supportedProviderIds){
21
+ super(`Harness ${harness} does not support model provider ${providerId}. Supported providers: ${supportedProviderIds.join(', ')}`), this.harness = harness, this.providerId = providerId, this.supportedProviderIds = supportedProviderIds;
22
+ this.name = 'UnsupportedHarnessProviderError';
23
+ }
24
+ }
25
+ export class UnsupportedHarnessThinkingError extends Error {
26
+ constructor(harness, thinking, supportedLevels){
27
+ super(`Harness ${harness} does not support thinking ${thinking}. Supported levels: ${supportedLevels.join(', ')}`), this.harness = harness, this.thinking = thinking, this.supportedLevels = supportedLevels;
28
+ this.name = 'UnsupportedHarnessThinkingError';
29
+ }
30
+ }
31
+ export class InvalidCredentialFieldsError extends Error {
32
+ constructor(providerId){
33
+ super(`Invalid credential fields for model provider: ${providerId}`), this.providerId = providerId;
34
+ this.name = 'InvalidCredentialFieldsError';
35
+ }
36
+ }
37
+ export class InvalidAgentModelError extends Error {
38
+ constructor(harnessOrProviderId, providerIdOrModel, model){
39
+ const harness = model === undefined ? 'pi' : harnessOrProviderId;
40
+ const providerId = model === undefined ? harnessOrProviderId : providerIdOrModel;
41
+ const resolvedModel = model ?? providerIdOrModel;
42
+ super(`Model is not available for harness ${harness}: ${providerId}/${resolvedModel}`);
43
+ this.name = 'InvalidAgentModelError';
44
+ this.harness = harness;
45
+ this.providerId = providerId;
46
+ this.model = resolvedModel;
47
+ }
48
+ }
49
+ export class ModelProviderValidationUnavailableError extends Error {
50
+ constructor(providerId){
51
+ super(`Model provider validation is not available for model provider: ${providerId}`), this.providerId = providerId;
52
+ this.name = 'ModelProviderValidationUnavailableError';
53
+ }
54
+ }
55
+ export class CustomModelProviderSlugCollisionError extends Error {
56
+ constructor(workspaceId, providerId){
57
+ super(`Custom model provider slug already exists: ${workspaceId}/${providerId}`), this.workspaceId = workspaceId, this.providerId = providerId;
58
+ this.name = 'CustomModelProviderSlugCollisionError';
59
+ }
60
+ }
61
+ export class CustomModelProviderConfigNotFoundError extends Error {
62
+ constructor(workspaceId, providerId){
63
+ super(`Custom model provider config not found: ${workspaceId}/${providerId}`), this.workspaceId = workspaceId, this.providerId = providerId;
64
+ this.name = 'CustomModelProviderConfigNotFoundError';
65
+ }
66
+ }
67
+ export class InvalidCustomModelProviderHeaderKeepError extends Error {
68
+ constructor(providerId, headerName){
69
+ super(`Custom model provider secret header cannot be kept: ${providerId}/${headerName}`), this.providerId = providerId, this.headerName = headerName;
70
+ this.name = 'InvalidCustomModelProviderHeaderKeepError';
71
+ }
72
+ }
73
+ export class CustomModelProviderStoredSecretBaseUrlChangeError extends Error {
74
+ constructor(providerId){
75
+ super(`Stored custom model provider secrets cannot be reused with a changed base URL: ${providerId}`), this.providerId = providerId;
76
+ this.name = 'CustomModelProviderStoredSecretBaseUrlChangeError';
77
+ }
78
+ }
79
+
80
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/errors.ts"],"sourcesContent":["import type {\n AgentThinking,\n Harness,\n ModelProviderRef,\n SupportedModelProviderId,\n} from '@shipfox/api-agent-dto';\n\nexport class ModelProviderValidationError extends Error {\n constructor(\n public readonly providerId: ModelProviderRef,\n public readonly sanitizedMessage: string,\n ) {\n super(`Model provider validation failed for ${providerId}: ${sanitizedMessage}`);\n this.name = 'ModelProviderValidationError';\n }\n}\n\nexport class ModelProviderConfigNotFoundError extends Error {\n constructor(\n public readonly workspaceId: string,\n public readonly providerId: string,\n ) {\n super(`Model provider config not found: ${workspaceId}/${providerId}`);\n this.name = 'ModelProviderConfigNotFoundError';\n }\n}\n\nexport class UnsupportedModelProviderError extends Error {\n constructor(public readonly providerId: string) {\n super(`Unsupported model provider: ${providerId}`);\n this.name = 'UnsupportedModelProviderError';\n }\n}\n\nexport class UnsupportedHarnessProviderError extends Error {\n constructor(\n public readonly harness: Harness,\n public readonly providerId: string,\n public readonly supportedProviderIds: readonly string[],\n ) {\n super(\n `Harness ${harness} does not support model provider ${providerId}. Supported providers: ${supportedProviderIds.join(', ')}`,\n );\n this.name = 'UnsupportedHarnessProviderError';\n }\n}\n\nexport class UnsupportedHarnessThinkingError extends Error {\n constructor(\n public readonly harness: Harness,\n public readonly thinking: AgentThinking,\n public readonly supportedLevels: readonly AgentThinking[],\n ) {\n super(\n `Harness ${harness} does not support thinking ${thinking}. Supported levels: ${supportedLevels.join(', ')}`,\n );\n this.name = 'UnsupportedHarnessThinkingError';\n }\n}\n\nexport class InvalidCredentialFieldsError extends Error {\n constructor(public readonly providerId: SupportedModelProviderId) {\n super(`Invalid credential fields for model provider: ${providerId}`);\n this.name = 'InvalidCredentialFieldsError';\n }\n}\n\nexport class InvalidAgentModelError extends Error {\n public readonly harness: Harness;\n public readonly providerId: ModelProviderRef;\n public readonly model: string;\n\n constructor(providerId: ModelProviderRef, model: string);\n constructor(harness: Harness, providerId: ModelProviderRef, model: string);\n constructor(\n harnessOrProviderId: Harness | ModelProviderRef,\n providerIdOrModel: ModelProviderRef | string,\n model?: string,\n ) {\n const harness = model === undefined ? 'pi' : (harnessOrProviderId as Harness);\n const providerId =\n model === undefined\n ? (harnessOrProviderId as ModelProviderRef)\n : (providerIdOrModel as ModelProviderRef);\n const resolvedModel = model ?? (providerIdOrModel as string);\n\n super(`Model is not available for harness ${harness}: ${providerId}/${resolvedModel}`);\n this.name = 'InvalidAgentModelError';\n this.harness = harness;\n this.providerId = providerId;\n this.model = resolvedModel;\n }\n}\n\nexport class ModelProviderValidationUnavailableError extends Error {\n constructor(public readonly providerId: SupportedModelProviderId) {\n super(`Model provider validation is not available for model provider: ${providerId}`);\n this.name = 'ModelProviderValidationUnavailableError';\n }\n}\n\nexport class CustomModelProviderSlugCollisionError extends Error {\n constructor(\n public readonly workspaceId: string,\n public readonly providerId: ModelProviderRef,\n ) {\n super(`Custom model provider slug already exists: ${workspaceId}/${providerId}`);\n this.name = 'CustomModelProviderSlugCollisionError';\n }\n}\n\nexport class CustomModelProviderConfigNotFoundError extends Error {\n constructor(\n public readonly workspaceId: string,\n public readonly providerId: ModelProviderRef,\n ) {\n super(`Custom model provider config not found: ${workspaceId}/${providerId}`);\n this.name = 'CustomModelProviderConfigNotFoundError';\n }\n}\n\nexport class InvalidCustomModelProviderHeaderKeepError extends Error {\n constructor(\n public readonly providerId: ModelProviderRef,\n public readonly headerName: string,\n ) {\n super(`Custom model provider secret header cannot be kept: ${providerId}/${headerName}`);\n this.name = 'InvalidCustomModelProviderHeaderKeepError';\n }\n}\n\nexport class CustomModelProviderStoredSecretBaseUrlChangeError extends Error {\n constructor(public readonly providerId: ModelProviderRef) {\n super(\n `Stored custom model provider secrets cannot be reused with a changed base URL: ${providerId}`,\n );\n this.name = 'CustomModelProviderStoredSecretBaseUrlChangeError';\n }\n}\n"],"names":["ModelProviderValidationError","Error","providerId","sanitizedMessage","name","ModelProviderConfigNotFoundError","workspaceId","UnsupportedModelProviderError","UnsupportedHarnessProviderError","harness","supportedProviderIds","join","UnsupportedHarnessThinkingError","thinking","supportedLevels","InvalidCredentialFieldsError","InvalidAgentModelError","harnessOrProviderId","providerIdOrModel","model","undefined","resolvedModel","ModelProviderValidationUnavailableError","CustomModelProviderSlugCollisionError","CustomModelProviderConfigNotFoundError","InvalidCustomModelProviderHeaderKeepError","headerName","CustomModelProviderStoredSecretBaseUrlChangeError"],"mappings":"AAOA,OAAO,MAAMA,qCAAqCC;IAChD,YACE,AAAgBC,UAA4B,EAC5C,AAAgBC,gBAAwB,CACxC;QACA,KAAK,CAAC,CAAC,qCAAqC,EAAED,WAAW,EAAE,EAAEC,kBAAkB,QAH/DD,aAAAA,iBACAC,mBAAAA;QAGhB,IAAI,CAACC,IAAI,GAAG;IACd;AACF;AAEA,OAAO,MAAMC,yCAAyCJ;IACpD,YACE,AAAgBK,WAAmB,EACnC,AAAgBJ,UAAkB,CAClC;QACA,KAAK,CAAC,CAAC,iCAAiC,EAAEI,YAAY,CAAC,EAAEJ,YAAY,QAHrDI,cAAAA,kBACAJ,aAAAA;QAGhB,IAAI,CAACE,IAAI,GAAG;IACd;AACF;AAEA,OAAO,MAAMG,sCAAsCN;IACjD,YAAY,AAAgBC,UAAkB,CAAE;QAC9C,KAAK,CAAC,CAAC,4BAA4B,EAAEA,YAAY,QADvBA,aAAAA;QAE1B,IAAI,CAACE,IAAI,GAAG;IACd;AACF;AAEA,OAAO,MAAMI,wCAAwCP;IACnD,YACE,AAAgBQ,OAAgB,EAChC,AAAgBP,UAAkB,EAClC,AAAgBQ,oBAAuC,CACvD;QACA,KAAK,CACH,CAAC,QAAQ,EAAED,QAAQ,iCAAiC,EAAEP,WAAW,uBAAuB,EAAEQ,qBAAqBC,IAAI,CAAC,OAAO,QAL7GF,UAAAA,cACAP,aAAAA,iBACAQ,uBAAAA;QAKhB,IAAI,CAACN,IAAI,GAAG;IACd;AACF;AAEA,OAAO,MAAMQ,wCAAwCX;IACnD,YACE,AAAgBQ,OAAgB,EAChC,AAAgBI,QAAuB,EACvC,AAAgBC,eAAyC,CACzD;QACA,KAAK,CACH,CAAC,QAAQ,EAAEL,QAAQ,2BAA2B,EAAEI,SAAS,oBAAoB,EAAEC,gBAAgBH,IAAI,CAAC,OAAO,QAL7FF,UAAAA,cACAI,WAAAA,eACAC,kBAAAA;QAKhB,IAAI,CAACV,IAAI,GAAG;IACd;AACF;AAEA,OAAO,MAAMW,qCAAqCd;IAChD,YAAY,AAAgBC,UAAoC,CAAE;QAChE,KAAK,CAAC,CAAC,8CAA8C,EAAEA,YAAY,QADzCA,aAAAA;QAE1B,IAAI,CAACE,IAAI,GAAG;IACd;AACF;AAEA,OAAO,MAAMY,+BAA+Bf;IAO1C,YACEgB,mBAA+C,EAC/CC,iBAA4C,EAC5CC,KAAc,CACd;QACA,MAAMV,UAAUU,UAAUC,YAAY,OAAQH;QAC9C,MAAMf,aACJiB,UAAUC,YACLH,sBACAC;QACP,MAAMG,gBAAgBF,SAAUD;QAEhC,KAAK,CAAC,CAAC,mCAAmC,EAAET,QAAQ,EAAE,EAAEP,WAAW,CAAC,EAAEmB,eAAe;QACrF,IAAI,CAACjB,IAAI,GAAG;QACZ,IAAI,CAACK,OAAO,GAAGA;QACf,IAAI,CAACP,UAAU,GAAGA;QAClB,IAAI,CAACiB,KAAK,GAAGE;IACf;AACF;AAEA,OAAO,MAAMC,gDAAgDrB;IAC3D,YAAY,AAAgBC,UAAoC,CAAE;QAChE,KAAK,CAAC,CAAC,+DAA+D,EAAEA,YAAY,QAD1DA,aAAAA;QAE1B,IAAI,CAACE,IAAI,GAAG;IACd;AACF;AAEA,OAAO,MAAMmB,8CAA8CtB;IACzD,YACE,AAAgBK,WAAmB,EACnC,AAAgBJ,UAA4B,CAC5C;QACA,KAAK,CAAC,CAAC,2CAA2C,EAAEI,YAAY,CAAC,EAAEJ,YAAY,QAH/DI,cAAAA,kBACAJ,aAAAA;QAGhB,IAAI,CAACE,IAAI,GAAG;IACd;AACF;AAEA,OAAO,MAAMoB,+CAA+CvB;IAC1D,YACE,AAAgBK,WAAmB,EACnC,AAAgBJ,UAA4B,CAC5C;QACA,KAAK,CAAC,CAAC,wCAAwC,EAAEI,YAAY,CAAC,EAAEJ,YAAY,QAH5DI,cAAAA,kBACAJ,aAAAA;QAGhB,IAAI,CAACE,IAAI,GAAG;IACd;AACF;AAEA,OAAO,MAAMqB,kDAAkDxB;IAC7D,YACE,AAAgBC,UAA4B,EAC5C,AAAgBwB,UAAkB,CAClC;QACA,KAAK,CAAC,CAAC,oDAAoD,EAAExB,WAAW,CAAC,EAAEwB,YAAY,QAHvExB,aAAAA,iBACAwB,aAAAA;QAGhB,IAAI,CAACtB,IAAI,GAAG;IACd;AACF;AAEA,OAAO,MAAMuB,0DAA0D1B;IACrE,YAAY,AAAgBC,UAA4B,CAAE;QACxD,KAAK,CACH,CAAC,+EAA+E,EAAEA,YAAY,QAFtEA,aAAAA;QAI1B,IAAI,CAACE,IAAI,GAAG;IACd;AACF"}
@@ -0,0 +1,6 @@
1
+ import { type AgentModelOptionDto, CLAUDE_HARNESS } from '@shipfox/api-agent-dto';
2
+ import type { HarnessProviderCatalog } from './registry.js';
3
+ export declare const CLAUDE_MODEL_LINE: AgentModelOptionDto[];
4
+ export { CLAUDE_HARNESS };
5
+ export declare const claudeHarnessCatalog: HarnessProviderCatalog;
6
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../src/core/harness/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,mBAAmB,EAAE,cAAc,EAAC,MAAM,wBAAwB,CAAC;AAEhF,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,eAAe,CAAC;AAO1D,eAAO,MAAM,iBAAiB,EAAE,mBAAmB,EAalD,CAAC;AAEF,OAAO,EAAC,cAAc,EAAC,CAAC;AAExB,eAAO,MAAM,oBAAoB,EAAE,sBAGlC,CAAC"}
@@ -0,0 +1,104 @@
1
+ import { CLAUDE_HARNESS } from '@shipfox/api-agent-dto';
2
+ import { config } from '#config.js';
3
+ const ANTHROPIC_MESSAGES_URL = 'https://api.anthropic.com/v1/messages';
4
+ const ANTHROPIC_VERSION = '2023-06-01';
5
+ const PROBE_MAX_TOKENS = 64;
6
+ const PROBE_PROMPT = 'Reply with OK.';
7
+ export const CLAUDE_MODEL_LINE = [
8
+ {
9
+ id: 'claude-haiku-4-5',
10
+ label: 'Claude Haiku 4.5 (latest)'
11
+ },
12
+ {
13
+ id: 'claude-haiku-4-5-20251001',
14
+ label: 'Claude Haiku 4.5'
15
+ },
16
+ {
17
+ id: 'claude-opus-4-1',
18
+ label: 'Claude Opus 4.1 (latest)'
19
+ },
20
+ {
21
+ id: 'claude-opus-4-1-20250805',
22
+ label: 'Claude Opus 4.1'
23
+ },
24
+ {
25
+ id: 'claude-opus-4-5',
26
+ label: 'Claude Opus 4.5 (latest)'
27
+ },
28
+ {
29
+ id: 'claude-opus-4-5-20251101',
30
+ label: 'Claude Opus 4.5'
31
+ },
32
+ {
33
+ id: 'claude-opus-4-6',
34
+ label: 'Claude Opus 4.6'
35
+ },
36
+ {
37
+ id: 'claude-opus-4-7',
38
+ label: 'Claude Opus 4.7'
39
+ },
40
+ {
41
+ id: 'claude-opus-4-8',
42
+ label: 'Claude Opus 4.8'
43
+ },
44
+ {
45
+ id: 'claude-sonnet-4-5',
46
+ label: 'Claude Sonnet 4.5 (latest)'
47
+ },
48
+ {
49
+ id: 'claude-sonnet-4-5-20250929',
50
+ label: 'Claude Sonnet 4.5'
51
+ },
52
+ {
53
+ id: 'claude-sonnet-4-6',
54
+ label: 'Claude Sonnet 4.6'
55
+ }
56
+ ];
57
+ export { CLAUDE_HARNESS };
58
+ export const claudeHarnessCatalog = {
59
+ listModels: ()=>CLAUDE_MODEL_LINE,
60
+ validateCredentials: probeClaudeCredentials
61
+ };
62
+ async function probeClaudeCredentials(params) {
63
+ const apiKey = params.credentials.api_key;
64
+ if (apiKey === undefined) throw new Error('Missing Anthropic API key credential.');
65
+ const response = await fetch(ANTHROPIC_MESSAGES_URL, {
66
+ method: 'POST',
67
+ headers: claudeProbeHeaders(apiKey),
68
+ body: JSON.stringify(claudeProbeBody(params.model)),
69
+ redirect: 'error',
70
+ signal: timeoutSignal(params.signal, config.AGENT_PROVIDER_VALIDATION_TIMEOUT_MS)
71
+ });
72
+ try {
73
+ if (!response.ok) throw new Error(`Provider returned HTTP ${response.status}.`);
74
+ } finally{
75
+ await response.body?.cancel();
76
+ }
77
+ }
78
+ function claudeProbeHeaders(apiKey) {
79
+ const headers = new Headers();
80
+ headers.set('content-type', 'application/json');
81
+ headers.set('x-api-key', apiKey);
82
+ headers.set('anthropic-version', ANTHROPIC_VERSION);
83
+ return headers;
84
+ }
85
+ function claudeProbeBody(model) {
86
+ return {
87
+ model,
88
+ max_tokens: PROBE_MAX_TOKENS,
89
+ messages: [
90
+ {
91
+ role: 'user',
92
+ content: PROBE_PROMPT
93
+ }
94
+ ]
95
+ };
96
+ }
97
+ function timeoutSignal(signal, timeoutMs) {
98
+ return signal === undefined ? AbortSignal.timeout(timeoutMs) : AbortSignal.any([
99
+ signal,
100
+ AbortSignal.timeout(timeoutMs)
101
+ ]);
102
+ }
103
+
104
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/harness/claude.ts"],"sourcesContent":["import {type AgentModelOptionDto, CLAUDE_HARNESS} from '@shipfox/api-agent-dto';\nimport {config} from '#config.js';\nimport type {HarnessProviderCatalog} from './registry.js';\n\nconst ANTHROPIC_MESSAGES_URL = 'https://api.anthropic.com/v1/messages';\nconst ANTHROPIC_VERSION = '2023-06-01';\nconst PROBE_MAX_TOKENS = 64;\nconst PROBE_PROMPT = 'Reply with OK.';\n\nexport const CLAUDE_MODEL_LINE: AgentModelOptionDto[] = [\n {id: 'claude-haiku-4-5', label: 'Claude Haiku 4.5 (latest)'},\n {id: 'claude-haiku-4-5-20251001', label: 'Claude Haiku 4.5'},\n {id: 'claude-opus-4-1', label: 'Claude Opus 4.1 (latest)'},\n {id: 'claude-opus-4-1-20250805', label: 'Claude Opus 4.1'},\n {id: 'claude-opus-4-5', label: 'Claude Opus 4.5 (latest)'},\n {id: 'claude-opus-4-5-20251101', label: 'Claude Opus 4.5'},\n {id: 'claude-opus-4-6', label: 'Claude Opus 4.6'},\n {id: 'claude-opus-4-7', label: 'Claude Opus 4.7'},\n {id: 'claude-opus-4-8', label: 'Claude Opus 4.8'},\n {id: 'claude-sonnet-4-5', label: 'Claude Sonnet 4.5 (latest)'},\n {id: 'claude-sonnet-4-5-20250929', label: 'Claude Sonnet 4.5'},\n {id: 'claude-sonnet-4-6', label: 'Claude Sonnet 4.6'},\n];\n\nexport {CLAUDE_HARNESS};\n\nexport const claudeHarnessCatalog: HarnessProviderCatalog = {\n listModels: () => CLAUDE_MODEL_LINE,\n validateCredentials: probeClaudeCredentials,\n};\n\nasync function probeClaudeCredentials(params: {\n model: string;\n credentials: Record<string, string>;\n signal?: AbortSignal | undefined;\n}): Promise<void> {\n const apiKey = params.credentials.api_key;\n if (apiKey === undefined) throw new Error('Missing Anthropic API key credential.');\n\n const response = await fetch(ANTHROPIC_MESSAGES_URL, {\n method: 'POST',\n headers: claudeProbeHeaders(apiKey),\n body: JSON.stringify(claudeProbeBody(params.model)),\n redirect: 'error',\n signal: timeoutSignal(params.signal, config.AGENT_PROVIDER_VALIDATION_TIMEOUT_MS),\n });\n\n try {\n if (!response.ok) throw new Error(`Provider returned HTTP ${response.status}.`);\n } finally {\n await response.body?.cancel();\n }\n}\n\nfunction claudeProbeHeaders(apiKey: string): Headers {\n const headers = new Headers();\n headers.set('content-type', 'application/json');\n headers.set('x-api-key', apiKey);\n headers.set('anthropic-version', ANTHROPIC_VERSION);\n return headers;\n}\n\nfunction claudeProbeBody(model: string): unknown {\n return {\n model,\n max_tokens: PROBE_MAX_TOKENS,\n messages: [{role: 'user', content: PROBE_PROMPT}],\n };\n}\n\nfunction timeoutSignal(signal: AbortSignal | undefined, timeoutMs: number): AbortSignal {\n return signal === undefined\n ? AbortSignal.timeout(timeoutMs)\n : AbortSignal.any([signal, AbortSignal.timeout(timeoutMs)]);\n}\n"],"names":["CLAUDE_HARNESS","config","ANTHROPIC_MESSAGES_URL","ANTHROPIC_VERSION","PROBE_MAX_TOKENS","PROBE_PROMPT","CLAUDE_MODEL_LINE","id","label","claudeHarnessCatalog","listModels","validateCredentials","probeClaudeCredentials","params","apiKey","credentials","api_key","undefined","Error","response","fetch","method","headers","claudeProbeHeaders","body","JSON","stringify","claudeProbeBody","model","redirect","signal","timeoutSignal","AGENT_PROVIDER_VALIDATION_TIMEOUT_MS","ok","status","cancel","Headers","set","max_tokens","messages","role","content","timeoutMs","AbortSignal","timeout","any"],"mappings":"AAAA,SAAkCA,cAAc,QAAO,yBAAyB;AAChF,SAAQC,MAAM,QAAO,aAAa;AAGlC,MAAMC,yBAAyB;AAC/B,MAAMC,oBAAoB;AAC1B,MAAMC,mBAAmB;AACzB,MAAMC,eAAe;AAErB,OAAO,MAAMC,oBAA2C;IACtD;QAACC,IAAI;QAAoBC,OAAO;IAA2B;IAC3D;QAACD,IAAI;QAA6BC,OAAO;IAAkB;IAC3D;QAACD,IAAI;QAAmBC,OAAO;IAA0B;IACzD;QAACD,IAAI;QAA4BC,OAAO;IAAiB;IACzD;QAACD,IAAI;QAAmBC,OAAO;IAA0B;IACzD;QAACD,IAAI;QAA4BC,OAAO;IAAiB;IACzD;QAACD,IAAI;QAAmBC,OAAO;IAAiB;IAChD;QAACD,IAAI;QAAmBC,OAAO;IAAiB;IAChD;QAACD,IAAI;QAAmBC,OAAO;IAAiB;IAChD;QAACD,IAAI;QAAqBC,OAAO;IAA4B;IAC7D;QAACD,IAAI;QAA8BC,OAAO;IAAmB;IAC7D;QAACD,IAAI;QAAqBC,OAAO;IAAmB;CACrD,CAAC;AAEF,SAAQR,cAAc,GAAE;AAExB,OAAO,MAAMS,uBAA+C;IAC1DC,YAAY,IAAMJ;IAClBK,qBAAqBC;AACvB,EAAE;AAEF,eAAeA,uBAAuBC,MAIrC;IACC,MAAMC,SAASD,OAAOE,WAAW,CAACC,OAAO;IACzC,IAAIF,WAAWG,WAAW,MAAM,IAAIC,MAAM;IAE1C,MAAMC,WAAW,MAAMC,MAAMlB,wBAAwB;QACnDmB,QAAQ;QACRC,SAASC,mBAAmBT;QAC5BU,MAAMC,KAAKC,SAAS,CAACC,gBAAgBd,OAAOe,KAAK;QACjDC,UAAU;QACVC,QAAQC,cAAclB,OAAOiB,MAAM,EAAE7B,OAAO+B,oCAAoC;IAClF;IAEA,IAAI;QACF,IAAI,CAACb,SAASc,EAAE,EAAE,MAAM,IAAIf,MAAM,CAAC,uBAAuB,EAAEC,SAASe,MAAM,CAAC,CAAC,CAAC;IAChF,SAAU;QACR,MAAMf,SAASK,IAAI,EAAEW;IACvB;AACF;AAEA,SAASZ,mBAAmBT,MAAc;IACxC,MAAMQ,UAAU,IAAIc;IACpBd,QAAQe,GAAG,CAAC,gBAAgB;IAC5Bf,QAAQe,GAAG,CAAC,aAAavB;IACzBQ,QAAQe,GAAG,CAAC,qBAAqBlC;IACjC,OAAOmB;AACT;AAEA,SAASK,gBAAgBC,KAAa;IACpC,OAAO;QACLA;QACAU,YAAYlC;QACZmC,UAAU;YAAC;gBAACC,MAAM;gBAAQC,SAASpC;YAAY;SAAE;IACnD;AACF;AAEA,SAAS0B,cAAcD,MAA+B,EAAEY,SAAiB;IACvE,OAAOZ,WAAWb,YACd0B,YAAYC,OAAO,CAACF,aACpBC,YAAYE,GAAG,CAAC;QAACf;QAAQa,YAAYC,OAAO,CAACF;KAAW;AAC9D"}
@@ -0,0 +1,4 @@
1
+ export { CLAUDE_HARNESS, CLAUDE_MODEL_LINE, claudeHarnessCatalog } from './claude.js';
2
+ export { listPiProviderModels, PI_HARNESS, piHarnessCatalog } from './pi.js';
3
+ export { getHarnessDescriptor, getHarnessToolDescriptor, type HarnessDescriptor, type HarnessProviderCatalog, type HarnessToolDeploymentConfig, type HarnessToolDescriptor, type HarnessToolPackageName, harnessSupportsProvider, harnessSupportsTool, listEnabledHarnessTools, listHarnessDescriptors, listHarnessProviderModels, listHarnessTools, type ProbeHarnessProviderCredentialsParams, probeHarnessProviderCredentials, } from './registry.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/harness/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,aAAa,CAAC;AACpF,OAAO,EAAC,oBAAoB,EAAE,UAAU,EAAE,gBAAgB,EAAC,MAAM,SAAS,CAAC;AAC3E,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,gBAAgB,EAChB,KAAK,qCAAqC,EAC1C,+BAA+B,GAChC,MAAM,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { CLAUDE_HARNESS, CLAUDE_MODEL_LINE, claudeHarnessCatalog } from './claude.js';
2
+ export { listPiProviderModels, PI_HARNESS, piHarnessCatalog } from './pi.js';
3
+ export { getHarnessDescriptor, getHarnessToolDescriptor, harnessSupportsProvider, harnessSupportsTool, listEnabledHarnessTools, listHarnessDescriptors, listHarnessProviderModels, listHarnessTools, probeHarnessProviderCredentials } from './registry.js';
4
+
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/harness/index.ts"],"sourcesContent":["export {CLAUDE_HARNESS, CLAUDE_MODEL_LINE, claudeHarnessCatalog} from './claude.js';\nexport {listPiProviderModels, PI_HARNESS, piHarnessCatalog} from './pi.js';\nexport {\n getHarnessDescriptor,\n getHarnessToolDescriptor,\n type HarnessDescriptor,\n type HarnessProviderCatalog,\n type HarnessToolDeploymentConfig,\n type HarnessToolDescriptor,\n type HarnessToolPackageName,\n harnessSupportsProvider,\n harnessSupportsTool,\n listEnabledHarnessTools,\n listHarnessDescriptors,\n listHarnessProviderModels,\n listHarnessTools,\n type ProbeHarnessProviderCredentialsParams,\n probeHarnessProviderCredentials,\n} from './registry.js';\n"],"names":["CLAUDE_HARNESS","CLAUDE_MODEL_LINE","claudeHarnessCatalog","listPiProviderModels","PI_HARNESS","piHarnessCatalog","getHarnessDescriptor","getHarnessToolDescriptor","harnessSupportsProvider","harnessSupportsTool","listEnabledHarnessTools","listHarnessDescriptors","listHarnessProviderModels","listHarnessTools","probeHarnessProviderCredentials"],"mappings":"AAAA,SAAQA,cAAc,EAAEC,iBAAiB,EAAEC,oBAAoB,QAAO,cAAc;AACpF,SAAQC,oBAAoB,EAAEC,UAAU,EAAEC,gBAAgB,QAAO,UAAU;AAC3E,SACEC,oBAAoB,EACpBC,wBAAwB,EAMxBC,uBAAuB,EACvBC,mBAAmB,EACnBC,uBAAuB,EACvBC,sBAAsB,EACtBC,yBAAyB,EACzBC,gBAAgB,EAEhBC,+BAA+B,QAC1B,gBAAgB"}
@@ -0,0 +1,6 @@
1
+ import { type AgentModelOptionDto, PI_HARNESS } from '@shipfox/api-agent-dto';
2
+ import type { HarnessProviderCatalog } from './registry.js';
3
+ export { PI_HARNESS };
4
+ export declare function listPiProviderModels(providerId: string): AgentModelOptionDto[];
5
+ export declare const piHarnessCatalog: HarnessProviderCatalog;
6
+ //# sourceMappingURL=pi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pi.d.ts","sourceRoot":"","sources":["../../../src/core/harness/pi.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,mBAAmB,EAAE,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAE5E,OAAO,KAAK,EAAC,sBAAsB,EAAC,MAAM,eAAe,CAAC;AAE1D,OAAO,EAAC,UAAU,EAAC,CAAC;AAEpB,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAK9E;AAED,eAAO,MAAM,gBAAgB,EAAE,sBAG9B,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { getModels } from '@earendil-works/pi-ai';
2
+ import { PI_HARNESS } from '@shipfox/api-agent-dto';
3
+ import { probeModelProviderCredentials } from '../model-provider-validation.js';
4
+ export { PI_HARNESS };
5
+ export function listPiProviderModels(providerId) {
6
+ return getModels(providerId).map((model)=>({
7
+ id: model.id,
8
+ label: model.name
9
+ }));
10
+ }
11
+ export const piHarnessCatalog = {
12
+ listModels: listPiProviderModels,
13
+ validateCredentials: probeModelProviderCredentials
14
+ };
15
+
16
+ //# sourceMappingURL=pi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/harness/pi.ts"],"sourcesContent":["import {getModels, type KnownProvider} from '@earendil-works/pi-ai';\nimport {type AgentModelOptionDto, PI_HARNESS} from '@shipfox/api-agent-dto';\nimport {probeModelProviderCredentials} from '../model-provider-validation.js';\nimport type {HarnessProviderCatalog} from './registry.js';\n\nexport {PI_HARNESS};\n\nexport function listPiProviderModels(providerId: string): AgentModelOptionDto[] {\n return getModels(providerId as KnownProvider).map((model) => ({\n id: model.id,\n label: model.name,\n }));\n}\n\nexport const piHarnessCatalog: HarnessProviderCatalog = {\n listModels: listPiProviderModels,\n validateCredentials: probeModelProviderCredentials,\n};\n"],"names":["getModels","PI_HARNESS","probeModelProviderCredentials","listPiProviderModels","providerId","map","model","id","label","name","piHarnessCatalog","listModels","validateCredentials"],"mappings":"AAAA,SAAQA,SAAS,QAA2B,wBAAwB;AACpE,SAAkCC,UAAU,QAAO,yBAAyB;AAC5E,SAAQC,6BAA6B,QAAO,kCAAkC;AAG9E,SAAQD,UAAU,GAAE;AAEpB,OAAO,SAASE,qBAAqBC,UAAkB;IACrD,OAAOJ,UAAUI,YAA6BC,GAAG,CAAC,CAACC,QAAW,CAAA;YAC5DC,IAAID,MAAMC,EAAE;YACZC,OAAOF,MAAMG,IAAI;QACnB,CAAA;AACF;AAEA,OAAO,MAAMC,mBAA2C;IACtDC,YAAYR;IACZS,qBAAqBV;AACvB,EAAE"}
@@ -0,0 +1,22 @@
1
+ import type { AgentModelOptionDto, Harness, HarnessDescriptor, HarnessToolDeploymentConfig, HarnessToolDescriptor, HarnessToolPackageName } from '@shipfox/api-agent-dto';
2
+ import { getHarnessDescriptor, getHarnessToolDescriptor, harnessSupportsProvider, harnessSupportsTool, listEnabledHarnessTools, listHarnessDescriptors, listHarnessTools } from '@shipfox/api-agent-dto';
3
+ export { getHarnessDescriptor, getHarnessToolDescriptor, type HarnessDescriptor, type HarnessToolDeploymentConfig, type HarnessToolDescriptor, type HarnessToolPackageName, harnessSupportsProvider, harnessSupportsTool, listEnabledHarnessTools, listHarnessDescriptors, listHarnessTools, };
4
+ export interface HarnessProviderCatalog {
5
+ listModels(providerId: string): AgentModelOptionDto[];
6
+ validateCredentials(params: {
7
+ providerId: string;
8
+ model: string;
9
+ credentials: Record<string, string>;
10
+ signal?: AbortSignal | undefined;
11
+ }): Promise<void>;
12
+ }
13
+ export interface ProbeHarnessProviderCredentialsParams {
14
+ harness: Harness;
15
+ providerId: string;
16
+ model: string;
17
+ credentials: Record<string, string>;
18
+ signal?: AbortSignal | undefined;
19
+ }
20
+ export declare function listHarnessProviderModels(harness: Harness, providerId: string): AgentModelOptionDto[];
21
+ export declare function probeHarnessProviderCredentials(params: ProbeHarnessProviderCredentialsParams): Promise<void>;
22
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/core/harness/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,OAAO,EACP,iBAAiB,EACjB,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,EAEvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,EAEjB,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,gBAAgB,GACjB,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACtD,mBAAmB,CAAC,MAAM,EAAE;QAC1B,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;KAClC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,qCAAqC;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAC;CAClC;AASD,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,GACjB,mBAAmB,EAAE,CAIvB;AAED,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,qCAAqC,GAC5C,OAAO,CAAC,IAAI,CAAC,CAiBf"}
@@ -0,0 +1,46 @@
1
+ import { getHarnessDescriptor, getHarnessToolDescriptor, harnessSupportsProvider, harnessSupportsTool, listEnabledHarnessTools, listHarnessDescriptors, listHarnessTools, SUPPORTED_MODEL_PROVIDER_IDS } from '@shipfox/api-agent-dto';
2
+ import { UnsupportedHarnessProviderError } from '../errors.js';
3
+ import { runProviderProbe } from '../model-provider-validation.js';
4
+ import { claudeHarnessCatalog } from './claude.js';
5
+ import { piHarnessCatalog } from './pi.js';
6
+ export { getHarnessDescriptor, getHarnessToolDescriptor, harnessSupportsProvider, harnessSupportsTool, listEnabledHarnessTools, listHarnessDescriptors, listHarnessTools };
7
+ const CATALOGS = {
8
+ pi: piHarnessCatalog,
9
+ claude: claudeHarnessCatalog
10
+ };
11
+ const supportedModelProviderIds = new Set(SUPPORTED_MODEL_PROVIDER_IDS);
12
+ export function listHarnessProviderModels(harness, providerId) {
13
+ const descriptor = getHarnessDescriptor(harness);
14
+ assertHarnessSupportsProvider(descriptor, providerId);
15
+ return CATALOGS[harness].listModels(providerId);
16
+ }
17
+ export async function probeHarnessProviderCredentials(params) {
18
+ const descriptor = getHarnessDescriptor(params.harness);
19
+ assertHarnessSupportsProvider(descriptor, params.providerId);
20
+ await runProviderProbe({
21
+ probe: CATALOGS[params.harness].validateCredentials,
22
+ args: {
23
+ providerId: params.providerId,
24
+ model: params.model,
25
+ credentials: params.credentials,
26
+ ...params.signal ? {
27
+ signal: params.signal
28
+ } : {}
29
+ },
30
+ metricLabel: metricLabel(params.providerId),
31
+ providerId: params.providerId,
32
+ secrets: Object.values(params.credentials),
33
+ ...params.signal ? {
34
+ signal: params.signal
35
+ } : {}
36
+ });
37
+ }
38
+ function assertHarnessSupportsProvider(descriptor, providerId) {
39
+ if (descriptor.supportedProviderIds.includes(providerId)) return;
40
+ throw new UnsupportedHarnessProviderError(descriptor.id, providerId, descriptor.supportedProviderIds);
41
+ }
42
+ function metricLabel(providerId) {
43
+ return supportedModelProviderIds.has(providerId) ? providerId : 'custom';
44
+ }
45
+
46
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/core/harness/registry.ts"],"sourcesContent":["import type {\n AgentModelOptionDto,\n Harness,\n HarnessDescriptor,\n HarnessToolDeploymentConfig,\n HarnessToolDescriptor,\n HarnessToolPackageName,\n SupportedModelProviderId,\n} from '@shipfox/api-agent-dto';\nimport {\n getHarnessDescriptor,\n getHarnessToolDescriptor,\n harnessSupportsProvider,\n harnessSupportsTool,\n listEnabledHarnessTools,\n listHarnessDescriptors,\n listHarnessTools,\n SUPPORTED_MODEL_PROVIDER_IDS,\n} from '@shipfox/api-agent-dto';\nimport {UnsupportedHarnessProviderError} from '../errors.js';\nimport {runProviderProbe} from '../model-provider-validation.js';\nimport {claudeHarnessCatalog} from './claude.js';\nimport {piHarnessCatalog} from './pi.js';\n\nexport {\n getHarnessDescriptor,\n getHarnessToolDescriptor,\n type HarnessDescriptor,\n type HarnessToolDeploymentConfig,\n type HarnessToolDescriptor,\n type HarnessToolPackageName,\n harnessSupportsProvider,\n harnessSupportsTool,\n listEnabledHarnessTools,\n listHarnessDescriptors,\n listHarnessTools,\n};\n\nexport interface HarnessProviderCatalog {\n listModels(providerId: string): AgentModelOptionDto[];\n validateCredentials(params: {\n providerId: string;\n model: string;\n credentials: Record<string, string>;\n signal?: AbortSignal | undefined;\n }): Promise<void>;\n}\n\nexport interface ProbeHarnessProviderCredentialsParams {\n harness: Harness;\n providerId: string;\n model: string;\n credentials: Record<string, string>;\n signal?: AbortSignal | undefined;\n}\n\nconst CATALOGS: Record<Harness, HarnessProviderCatalog> = {\n pi: piHarnessCatalog,\n claude: claudeHarnessCatalog,\n};\n\nconst supportedModelProviderIds = new Set<string>(SUPPORTED_MODEL_PROVIDER_IDS);\n\nexport function listHarnessProviderModels(\n harness: Harness,\n providerId: string,\n): AgentModelOptionDto[] {\n const descriptor = getHarnessDescriptor(harness);\n assertHarnessSupportsProvider(descriptor, providerId);\n return CATALOGS[harness].listModels(providerId);\n}\n\nexport async function probeHarnessProviderCredentials(\n params: ProbeHarnessProviderCredentialsParams,\n): Promise<void> {\n const descriptor = getHarnessDescriptor(params.harness);\n assertHarnessSupportsProvider(descriptor, params.providerId);\n\n await runProviderProbe({\n probe: CATALOGS[params.harness].validateCredentials,\n args: {\n providerId: params.providerId,\n model: params.model,\n credentials: params.credentials,\n ...(params.signal ? {signal: params.signal} : {}),\n },\n metricLabel: metricLabel(params.providerId),\n providerId: params.providerId,\n secrets: Object.values(params.credentials),\n ...(params.signal ? {signal: params.signal} : {}),\n });\n}\n\nfunction assertHarnessSupportsProvider(descriptor: HarnessDescriptor, providerId: string): void {\n if (descriptor.supportedProviderIds.includes(providerId)) return;\n\n throw new UnsupportedHarnessProviderError(\n descriptor.id,\n providerId,\n descriptor.supportedProviderIds,\n );\n}\n\nfunction metricLabel(providerId: string): SupportedModelProviderId | 'custom' {\n return supportedModelProviderIds.has(providerId)\n ? (providerId as SupportedModelProviderId)\n : 'custom';\n}\n"],"names":["getHarnessDescriptor","getHarnessToolDescriptor","harnessSupportsProvider","harnessSupportsTool","listEnabledHarnessTools","listHarnessDescriptors","listHarnessTools","SUPPORTED_MODEL_PROVIDER_IDS","UnsupportedHarnessProviderError","runProviderProbe","claudeHarnessCatalog","piHarnessCatalog","CATALOGS","pi","claude","supportedModelProviderIds","Set","listHarnessProviderModels","harness","providerId","descriptor","assertHarnessSupportsProvider","listModels","probeHarnessProviderCredentials","params","probe","validateCredentials","args","model","credentials","signal","metricLabel","secrets","Object","values","supportedProviderIds","includes","id","has"],"mappings":"AASA,SACEA,oBAAoB,EACpBC,wBAAwB,EACxBC,uBAAuB,EACvBC,mBAAmB,EACnBC,uBAAuB,EACvBC,sBAAsB,EACtBC,gBAAgB,EAChBC,4BAA4B,QACvB,yBAAyB;AAChC,SAAQC,+BAA+B,QAAO,eAAe;AAC7D,SAAQC,gBAAgB,QAAO,kCAAkC;AACjE,SAAQC,oBAAoB,QAAO,cAAc;AACjD,SAAQC,gBAAgB,QAAO,UAAU;AAEzC,SACEX,oBAAoB,EACpBC,wBAAwB,EAKxBC,uBAAuB,EACvBC,mBAAmB,EACnBC,uBAAuB,EACvBC,sBAAsB,EACtBC,gBAAgB,GAChB;AAoBF,MAAMM,WAAoD;IACxDC,IAAIF;IACJG,QAAQJ;AACV;AAEA,MAAMK,4BAA4B,IAAIC,IAAYT;AAElD,OAAO,SAASU,0BACdC,OAAgB,EAChBC,UAAkB;IAElB,MAAMC,aAAapB,qBAAqBkB;IACxCG,8BAA8BD,YAAYD;IAC1C,OAAOP,QAAQ,CAACM,QAAQ,CAACI,UAAU,CAACH;AACtC;AAEA,OAAO,eAAeI,gCACpBC,MAA6C;IAE7C,MAAMJ,aAAapB,qBAAqBwB,OAAON,OAAO;IACtDG,8BAA8BD,YAAYI,OAAOL,UAAU;IAE3D,MAAMV,iBAAiB;QACrBgB,OAAOb,QAAQ,CAACY,OAAON,OAAO,CAAC,CAACQ,mBAAmB;QACnDC,MAAM;YACJR,YAAYK,OAAOL,UAAU;YAC7BS,OAAOJ,OAAOI,KAAK;YACnBC,aAAaL,OAAOK,WAAW;YAC/B,GAAIL,OAAOM,MAAM,GAAG;gBAACA,QAAQN,OAAOM,MAAM;YAAA,IAAI,CAAC,CAAC;QAClD;QACAC,aAAaA,YAAYP,OAAOL,UAAU;QAC1CA,YAAYK,OAAOL,UAAU;QAC7Ba,SAASC,OAAOC,MAAM,CAACV,OAAOK,WAAW;QACzC,GAAIL,OAAOM,MAAM,GAAG;YAACA,QAAQN,OAAOM,MAAM;QAAA,IAAI,CAAC,CAAC;IAClD;AACF;AAEA,SAAST,8BAA8BD,UAA6B,EAAED,UAAkB;IACtF,IAAIC,WAAWe,oBAAoB,CAACC,QAAQ,CAACjB,aAAa;IAE1D,MAAM,IAAIX,gCACRY,WAAWiB,EAAE,EACblB,YACAC,WAAWe,oBAAoB;AAEnC;AAEA,SAASJ,YAAYZ,UAAkB;IACrC,OAAOJ,0BAA0BuB,GAAG,CAACnB,cAChCA,aACD;AACN"}
@@ -0,0 +1,12 @@
1
+ export { createCustomModelProviderConfig, resolveCustomModelProviderDiscoveryParams, updateCustomModelProviderConfig, } from './custom-model-provider-config-service.js';
2
+ export { discoverCustomModelProviderModels } from './discover-custom-model-provider-models.js';
3
+ export type { AgentWorkspaceSettings } from './entities/agent-workspace-settings.js';
4
+ export type { ModelProviderConfig } from './entities/model-provider-config.js';
5
+ export { CustomModelProviderConfigNotFoundError, CustomModelProviderSlugCollisionError, CustomModelProviderStoredSecretBaseUrlChangeError, InvalidAgentModelError, InvalidCredentialFieldsError, InvalidCustomModelProviderHeaderKeepError, ModelProviderConfigNotFoundError, ModelProviderValidationError, ModelProviderValidationUnavailableError, UnsupportedHarnessProviderError, UnsupportedHarnessThinkingError, UnsupportedModelProviderError, } from './errors.js';
6
+ export { getHarnessDescriptor, getHarnessToolDescriptor, type HarnessDescriptor, type HarnessToolDeploymentConfig, type HarnessToolDescriptor, type HarnessToolPackageName, harnessSupportsProvider, harnessSupportsTool, listEnabledHarnessTools, listHarnessDescriptors, listHarnessProviderModels, listHarnessTools, probeHarnessProviderCredentials, } from './harness/index.js';
7
+ export { buildModelProviderCatalog } from './model-provider-catalog.js';
8
+ export { deleteModelProviderConfig, testAndSaveModelProviderConfig, updateModelProviderConfigDefaultModel, } from './model-provider-config-service.js';
9
+ export { type AgentConfigResolutionContext, type AgentDefaultsResolver, type ContextualAgentConfig, catalogDefaultAgentResolver, type ResolvedAgentConfig, resolveAgentConfig, } from './resolve-agent-config.js';
10
+ export { type ResolveRuntimeCredentialsParams, resolveRuntimeCredentials, } from './resolve-runtime-credentials.js';
11
+ export { createWorkspaceAgentDefaultsResolver } from './workspace-agent-defaults-resolver.js';
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,yCAAyC,EACzC,+BAA+B,GAChC,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAC,iCAAiC,EAAC,MAAM,4CAA4C,CAAC;AAC7F,YAAY,EAAC,sBAAsB,EAAC,MAAM,wCAAwC,CAAC;AACnF,YAAY,EAAC,mBAAmB,EAAC,MAAM,qCAAqC,CAAC;AAC7E,OAAO,EACL,sCAAsC,EACtC,qCAAqC,EACrC,iDAAiD,EACjD,sBAAsB,EACtB,4BAA4B,EAC5B,yCAAyC,EACzC,gCAAgC,EAChC,4BAA4B,EAC5B,uCAAuC,EACvC,+BAA+B,EAC/B,+BAA+B,EAC/B,6BAA6B,GAC9B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,KAAK,iBAAiB,EACtB,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,uBAAuB,EACvB,mBAAmB,EACnB,uBAAuB,EACvB,sBAAsB,EACtB,yBAAyB,EACzB,gBAAgB,EAChB,+BAA+B,GAChC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,yBAAyB,EAAC,MAAM,6BAA6B,CAAC;AACtE,OAAO,EACL,yBAAyB,EACzB,8BAA8B,EAC9B,qCAAqC,GACtC,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,2BAA2B,EAC3B,KAAK,mBAAmB,EACxB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,KAAK,+BAA+B,EACpC,yBAAyB,GAC1B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAC,oCAAoC,EAAC,MAAM,wCAAwC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export { createCustomModelProviderConfig, resolveCustomModelProviderDiscoveryParams, updateCustomModelProviderConfig } from './custom-model-provider-config-service.js';
2
+ export { discoverCustomModelProviderModels } from './discover-custom-model-provider-models.js';
3
+ export { CustomModelProviderConfigNotFoundError, CustomModelProviderSlugCollisionError, CustomModelProviderStoredSecretBaseUrlChangeError, InvalidAgentModelError, InvalidCredentialFieldsError, InvalidCustomModelProviderHeaderKeepError, ModelProviderConfigNotFoundError, ModelProviderValidationError, ModelProviderValidationUnavailableError, UnsupportedHarnessProviderError, UnsupportedHarnessThinkingError, UnsupportedModelProviderError } from './errors.js';
4
+ export { getHarnessDescriptor, getHarnessToolDescriptor, harnessSupportsProvider, harnessSupportsTool, listEnabledHarnessTools, listHarnessDescriptors, listHarnessProviderModels, listHarnessTools, probeHarnessProviderCredentials } from './harness/index.js';
5
+ export { buildModelProviderCatalog } from './model-provider-catalog.js';
6
+ export { deleteModelProviderConfig, testAndSaveModelProviderConfig, updateModelProviderConfigDefaultModel } from './model-provider-config-service.js';
7
+ export { catalogDefaultAgentResolver, resolveAgentConfig } from './resolve-agent-config.js';
8
+ export { resolveRuntimeCredentials } from './resolve-runtime-credentials.js';
9
+ export { createWorkspaceAgentDefaultsResolver } from './workspace-agent-defaults-resolver.js';
10
+
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/index.ts"],"sourcesContent":["export {\n createCustomModelProviderConfig,\n resolveCustomModelProviderDiscoveryParams,\n updateCustomModelProviderConfig,\n} from './custom-model-provider-config-service.js';\nexport {discoverCustomModelProviderModels} from './discover-custom-model-provider-models.js';\nexport type {AgentWorkspaceSettings} from './entities/agent-workspace-settings.js';\nexport type {ModelProviderConfig} from './entities/model-provider-config.js';\nexport {\n CustomModelProviderConfigNotFoundError,\n CustomModelProviderSlugCollisionError,\n CustomModelProviderStoredSecretBaseUrlChangeError,\n InvalidAgentModelError,\n InvalidCredentialFieldsError,\n InvalidCustomModelProviderHeaderKeepError,\n ModelProviderConfigNotFoundError,\n ModelProviderValidationError,\n ModelProviderValidationUnavailableError,\n UnsupportedHarnessProviderError,\n UnsupportedHarnessThinkingError,\n UnsupportedModelProviderError,\n} from './errors.js';\nexport {\n getHarnessDescriptor,\n getHarnessToolDescriptor,\n type HarnessDescriptor,\n type HarnessToolDeploymentConfig,\n type HarnessToolDescriptor,\n type HarnessToolPackageName,\n harnessSupportsProvider,\n harnessSupportsTool,\n listEnabledHarnessTools,\n listHarnessDescriptors,\n listHarnessProviderModels,\n listHarnessTools,\n probeHarnessProviderCredentials,\n} from './harness/index.js';\nexport {buildModelProviderCatalog} from './model-provider-catalog.js';\nexport {\n deleteModelProviderConfig,\n testAndSaveModelProviderConfig,\n updateModelProviderConfigDefaultModel,\n} from './model-provider-config-service.js';\nexport {\n type AgentConfigResolutionContext,\n type AgentDefaultsResolver,\n type ContextualAgentConfig,\n catalogDefaultAgentResolver,\n type ResolvedAgentConfig,\n resolveAgentConfig,\n} from './resolve-agent-config.js';\nexport {\n type ResolveRuntimeCredentialsParams,\n resolveRuntimeCredentials,\n} from './resolve-runtime-credentials.js';\nexport {createWorkspaceAgentDefaultsResolver} from './workspace-agent-defaults-resolver.js';\n"],"names":["createCustomModelProviderConfig","resolveCustomModelProviderDiscoveryParams","updateCustomModelProviderConfig","discoverCustomModelProviderModels","CustomModelProviderConfigNotFoundError","CustomModelProviderSlugCollisionError","CustomModelProviderStoredSecretBaseUrlChangeError","InvalidAgentModelError","InvalidCredentialFieldsError","InvalidCustomModelProviderHeaderKeepError","ModelProviderConfigNotFoundError","ModelProviderValidationError","ModelProviderValidationUnavailableError","UnsupportedHarnessProviderError","UnsupportedHarnessThinkingError","UnsupportedModelProviderError","getHarnessDescriptor","getHarnessToolDescriptor","harnessSupportsProvider","harnessSupportsTool","listEnabledHarnessTools","listHarnessDescriptors","listHarnessProviderModels","listHarnessTools","probeHarnessProviderCredentials","buildModelProviderCatalog","deleteModelProviderConfig","testAndSaveModelProviderConfig","updateModelProviderConfigDefaultModel","catalogDefaultAgentResolver","resolveAgentConfig","resolveRuntimeCredentials","createWorkspaceAgentDefaultsResolver"],"mappings":"AAAA,SACEA,+BAA+B,EAC/BC,yCAAyC,EACzCC,+BAA+B,QAC1B,4CAA4C;AACnD,SAAQC,iCAAiC,QAAO,6CAA6C;AAG7F,SACEC,sCAAsC,EACtCC,qCAAqC,EACrCC,iDAAiD,EACjDC,sBAAsB,EACtBC,4BAA4B,EAC5BC,yCAAyC,EACzCC,gCAAgC,EAChCC,4BAA4B,EAC5BC,uCAAuC,EACvCC,+BAA+B,EAC/BC,+BAA+B,EAC/BC,6BAA6B,QACxB,cAAc;AACrB,SACEC,oBAAoB,EACpBC,wBAAwB,EAKxBC,uBAAuB,EACvBC,mBAAmB,EACnBC,uBAAuB,EACvBC,sBAAsB,EACtBC,yBAAyB,EACzBC,gBAAgB,EAChBC,+BAA+B,QAC1B,qBAAqB;AAC5B,SAAQC,yBAAyB,QAAO,8BAA8B;AACtE,SACEC,yBAAyB,EACzBC,8BAA8B,EAC9BC,qCAAqC,QAChC,qCAAqC;AAC5C,SAIEC,2BAA2B,EAE3BC,kBAAkB,QACb,4BAA4B;AACnC,SAEEC,yBAAyB,QACpB,mCAAmC;AAC1C,SAAQC,oCAAoC,QAAO,yCAAyC"}
@@ -0,0 +1,3 @@
1
+ import { type ModelProviderCatalogEntryDto } from '@shipfox/api-agent-dto';
2
+ export declare function buildModelProviderCatalog(): readonly ModelProviderCatalogEntryDto[];
3
+ //# sourceMappingURL=model-provider-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-provider-catalog.d.ts","sourceRoot":"","sources":["../../src/core/model-provider-catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,4BAA4B,EAElC,MAAM,wBAAwB,CAAC;AAKhC,wBAAgB,yBAAyB,IAAI,SAAS,4BAA4B,EAAE,CAanF"}
@@ -0,0 +1,25 @@
1
+ import { MODEL_PROVIDER_CATALOG_SEED, modelProviderCatalogEntrySchema } from '@shipfox/api-agent-dto';
2
+ import { listPiProviderModels } from './harness/pi.js';
3
+ let cachedCatalog;
4
+ export function buildModelProviderCatalog() {
5
+ if (cachedCatalog) return cachedCatalog;
6
+ const catalog = modelProviderCatalogEntrySchema.array().parse(MODEL_PROVIDER_CATALOG_SEED.map((entry)=>({
7
+ ...entry,
8
+ credential_fields: entry.credential_fields.map((field)=>({
9
+ ...field
10
+ })),
11
+ models: entry.support_status === 'supported' ? listPiProviderModels(entry.id) : []
12
+ })));
13
+ cachedCatalog = deepFreeze(catalog);
14
+ return cachedCatalog;
15
+ }
16
+ function deepFreeze(value) {
17
+ if (Array.isArray(value)) {
18
+ for (const item of value)deepFreeze(item);
19
+ } else if (value !== null && typeof value === 'object') {
20
+ for (const item of Object.values(value))deepFreeze(item);
21
+ }
22
+ return Object.freeze(value);
23
+ }
24
+
25
+ //# sourceMappingURL=model-provider-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/model-provider-catalog.ts"],"sourcesContent":["import {\n MODEL_PROVIDER_CATALOG_SEED,\n type ModelProviderCatalogEntryDto,\n modelProviderCatalogEntrySchema,\n} from '@shipfox/api-agent-dto';\nimport {listPiProviderModels} from './harness/pi.js';\n\nlet cachedCatalog: readonly ModelProviderCatalogEntryDto[] | undefined;\n\nexport function buildModelProviderCatalog(): readonly ModelProviderCatalogEntryDto[] {\n if (cachedCatalog) return cachedCatalog;\n\n const catalog = modelProviderCatalogEntrySchema.array().parse(\n MODEL_PROVIDER_CATALOG_SEED.map((entry) => ({\n ...entry,\n credential_fields: entry.credential_fields.map((field) => ({...field})),\n models: entry.support_status === 'supported' ? listPiProviderModels(entry.id) : [],\n })),\n );\n\n cachedCatalog = deepFreeze(catalog);\n return cachedCatalog;\n}\n\nfunction deepFreeze<T>(value: T): T {\n if (Array.isArray(value)) {\n for (const item of value) deepFreeze(item);\n } else if (value !== null && typeof value === 'object') {\n for (const item of Object.values(value)) deepFreeze(item);\n }\n\n return Object.freeze(value);\n}\n"],"names":["MODEL_PROVIDER_CATALOG_SEED","modelProviderCatalogEntrySchema","listPiProviderModels","cachedCatalog","buildModelProviderCatalog","catalog","array","parse","map","entry","credential_fields","field","models","support_status","id","deepFreeze","value","Array","isArray","item","Object","values","freeze"],"mappings":"AAAA,SACEA,2BAA2B,EAE3BC,+BAA+B,QAC1B,yBAAyB;AAChC,SAAQC,oBAAoB,QAAO,kBAAkB;AAErD,IAAIC;AAEJ,OAAO,SAASC;IACd,IAAID,eAAe,OAAOA;IAE1B,MAAME,UAAUJ,gCAAgCK,KAAK,GAAGC,KAAK,CAC3DP,4BAA4BQ,GAAG,CAAC,CAACC,QAAW,CAAA;YAC1C,GAAGA,KAAK;YACRC,mBAAmBD,MAAMC,iBAAiB,CAACF,GAAG,CAAC,CAACG,QAAW,CAAA;oBAAC,GAAGA,KAAK;gBAAA,CAAA;YACpEC,QAAQH,MAAMI,cAAc,KAAK,cAAcX,qBAAqBO,MAAMK,EAAE,IAAI,EAAE;QACpF,CAAA;IAGFX,gBAAgBY,WAAWV;IAC3B,OAAOF;AACT;AAEA,SAASY,WAAcC,KAAQ;IAC7B,IAAIC,MAAMC,OAAO,CAACF,QAAQ;QACxB,KAAK,MAAMG,QAAQH,MAAOD,WAAWI;IACvC,OAAO,IAAIH,UAAU,QAAQ,OAAOA,UAAU,UAAU;QACtD,KAAK,MAAMG,QAAQC,OAAOC,MAAM,CAACL,OAAQD,WAAWI;IACtD;IAEA,OAAOC,OAAOE,MAAM,CAACN;AACvB"}