@sixthsummit/ship-api 0.0.0-stage → 4.1.1

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 (556) hide show
  1. package/CHANGELOG.md +605 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +4 -0
  4. package/README.md +58 -2
  5. package/cli/commands/add.js +537 -0
  6. package/cli/commands/contract.js +2 -0
  7. package/cli/commands/create.js +250 -0
  8. package/cli/commands/dev.js +227 -0
  9. package/cli/commands/doctor.js +286 -0
  10. package/cli/commands/generate.js +937 -0
  11. package/cli/commands/graph.js +2 -0
  12. package/cli/commands/migrate-orm.js +1171 -0
  13. package/cli/commands/update.js +37 -0
  14. package/cli/ship-api.js +285 -0
  15. package/lib/app/auth/AuthProvider.d.ts +91 -0
  16. package/lib/app/auth/AuthProvider.d.ts.map +1 -0
  17. package/lib/app/auth/AuthProvider.js +13 -0
  18. package/lib/app/auth/AuthProvider.js.map +1 -0
  19. package/lib/app/auth/adapters/firebase.d.ts +79 -0
  20. package/lib/app/auth/adapters/firebase.d.ts.map +1 -0
  21. package/lib/app/auth/adapters/firebase.js +122 -0
  22. package/lib/app/auth/adapters/firebase.js.map +1 -0
  23. package/lib/app/auth/adapters/jwtCookie.d.ts +55 -0
  24. package/lib/app/auth/adapters/jwtCookie.d.ts.map +1 -0
  25. package/lib/app/auth/adapters/jwtCookie.js +120 -0
  26. package/lib/app/auth/adapters/jwtCookie.js.map +1 -0
  27. package/lib/app/auth/index.d.ts +8 -0
  28. package/lib/app/auth/index.d.ts.map +1 -0
  29. package/lib/app/auth/index.js +7 -0
  30. package/lib/app/auth/index.js.map +1 -0
  31. package/lib/app/auth/jwt/AuthFlow.d.ts +94 -0
  32. package/lib/app/auth/jwt/AuthFlow.d.ts.map +1 -0
  33. package/lib/app/auth/jwt/AuthFlow.js +127 -0
  34. package/lib/app/auth/jwt/AuthFlow.js.map +1 -0
  35. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts +80 -0
  36. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts.map +1 -0
  37. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js +134 -0
  38. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js.map +1 -0
  39. package/lib/app/auth/jwt/JwtSigner.d.ts +123 -0
  40. package/lib/app/auth/jwt/JwtSigner.d.ts.map +1 -0
  41. package/lib/app/auth/jwt/JwtSigner.js +118 -0
  42. package/lib/app/auth/jwt/JwtSigner.js.map +1 -0
  43. package/lib/app/auth/jwt/RefreshTokenStore.d.ts +97 -0
  44. package/lib/app/auth/jwt/RefreshTokenStore.d.ts.map +1 -0
  45. package/lib/app/auth/jwt/RefreshTokenStore.js +122 -0
  46. package/lib/app/auth/jwt/RefreshTokenStore.js.map +1 -0
  47. package/lib/app/auth/permissionDefinition.d.ts +20 -0
  48. package/lib/app/auth/permissionDefinition.d.ts.map +1 -0
  49. package/lib/app/auth/permissionDefinition.js +2 -0
  50. package/lib/app/auth/permissionDefinition.js.map +1 -0
  51. package/lib/app/context/RequestContext.d.ts +59 -0
  52. package/lib/app/context/RequestContext.d.ts.map +1 -0
  53. package/lib/app/context/RequestContext.js +25 -0
  54. package/lib/app/context/RequestContext.js.map +1 -0
  55. package/lib/app/db/QueryOptions.d.ts +82 -0
  56. package/lib/app/db/QueryOptions.d.ts.map +1 -0
  57. package/lib/app/db/QueryOptions.js +37 -0
  58. package/lib/app/db/QueryOptions.js.map +1 -0
  59. package/lib/app/db/baseFields.d.ts +60 -0
  60. package/lib/app/db/baseFields.d.ts.map +1 -0
  61. package/lib/app/db/baseFields.js +54 -0
  62. package/lib/app/db/baseFields.js.map +1 -0
  63. package/lib/app/db/buildWhere.d.ts +22 -0
  64. package/lib/app/db/buildWhere.d.ts.map +1 -0
  65. package/lib/app/db/buildWhere.js +75 -0
  66. package/lib/app/db/buildWhere.js.map +1 -0
  67. package/lib/app/db/client.d.ts +111 -0
  68. package/lib/app/db/client.d.ts.map +1 -0
  69. package/lib/app/db/client.js +99 -0
  70. package/lib/app/db/client.js.map +1 -0
  71. package/lib/app/db/tenantScoped.d.ts +59 -0
  72. package/lib/app/db/tenantScoped.d.ts.map +1 -0
  73. package/lib/app/db/tenantScoped.js +54 -0
  74. package/lib/app/db/tenantScoped.js.map +1 -0
  75. package/lib/app/db/transaction.d.ts +58 -0
  76. package/lib/app/db/transaction.d.ts.map +1 -0
  77. package/lib/app/db/transaction.js +106 -0
  78. package/lib/app/db/transaction.js.map +1 -0
  79. package/lib/app/health/HealthCheck.d.ts +121 -0
  80. package/lib/app/health/HealthCheck.d.ts.map +1 -0
  81. package/lib/app/health/HealthCheck.js +151 -0
  82. package/lib/app/health/HealthCheck.js.map +1 -0
  83. package/lib/app/health/redisHealthCheck.d.ts +14 -0
  84. package/lib/app/health/redisHealthCheck.d.ts.map +1 -0
  85. package/lib/app/health/redisHealthCheck.js +21 -0
  86. package/lib/app/health/redisHealthCheck.js.map +1 -0
  87. package/lib/app/lifecycle/Bootstrapper.d.ts +92 -0
  88. package/lib/app/lifecycle/Bootstrapper.d.ts.map +1 -0
  89. package/lib/app/lifecycle/Bootstrapper.js +99 -0
  90. package/lib/app/lifecycle/Bootstrapper.js.map +1 -0
  91. package/lib/app/registry/routes.d.ts +89 -0
  92. package/lib/app/registry/routes.d.ts.map +1 -0
  93. package/lib/app/registry/routes.js +72 -0
  94. package/lib/app/registry/routes.js.map +1 -0
  95. package/lib/app/services/DrizzleEntityService.d.ts +123 -0
  96. package/lib/app/services/DrizzleEntityService.d.ts.map +1 -0
  97. package/lib/app/services/DrizzleEntityService.js +342 -0
  98. package/lib/app/services/DrizzleEntityService.js.map +1 -0
  99. package/lib/app/services/RedisProvider.d.ts +52 -0
  100. package/lib/app/services/RedisProvider.d.ts.map +1 -0
  101. package/lib/app/services/RedisProvider.js +75 -0
  102. package/lib/app/services/RedisProvider.js.map +1 -0
  103. package/lib/app/services/cache/Cache.d.ts +70 -0
  104. package/lib/app/services/cache/Cache.d.ts.map +1 -0
  105. package/lib/app/services/cache/Cache.js +18 -0
  106. package/lib/app/services/cache/Cache.js.map +1 -0
  107. package/lib/app/services/cache/InMemoryCache.d.ts +35 -0
  108. package/lib/app/services/cache/InMemoryCache.d.ts.map +1 -0
  109. package/lib/app/services/cache/InMemoryCache.js +76 -0
  110. package/lib/app/services/cache/InMemoryCache.js.map +1 -0
  111. package/lib/app/services/cache/RedisCache.d.ts +99 -0
  112. package/lib/app/services/cache/RedisCache.d.ts.map +1 -0
  113. package/lib/app/services/cache/RedisCache.js +150 -0
  114. package/lib/app/services/cache/RedisCache.js.map +1 -0
  115. package/lib/app/services/cache/cached.d.ts +30 -0
  116. package/lib/app/services/cache/cached.d.ts.map +1 -0
  117. package/lib/app/services/cache/cached.js +38 -0
  118. package/lib/app/services/cache/cached.js.map +1 -0
  119. package/lib/app/services/cache/index.d.ts +5 -0
  120. package/lib/app/services/cache/index.d.ts.map +1 -0
  121. package/lib/app/services/cache/index.js +4 -0
  122. package/lib/app/services/cache/index.js.map +1 -0
  123. package/lib/app/services/cron/defineCron.d.ts +57 -0
  124. package/lib/app/services/cron/defineCron.d.ts.map +1 -0
  125. package/lib/app/services/cron/defineCron.js +15 -0
  126. package/lib/app/services/cron/defineCron.js.map +1 -0
  127. package/lib/app/services/cron/index.d.ts +2 -0
  128. package/lib/app/services/cron/index.d.ts.map +1 -0
  129. package/lib/app/services/cron/index.js +2 -0
  130. package/lib/app/services/cron/index.js.map +1 -0
  131. package/lib/app/services/hooks/LifecycleHooks.d.ts +61 -0
  132. package/lib/app/services/hooks/LifecycleHooks.d.ts.map +1 -0
  133. package/lib/app/services/hooks/LifecycleHooks.js +85 -0
  134. package/lib/app/services/hooks/LifecycleHooks.js.map +1 -0
  135. package/lib/app/services/jobs/JobsManager.d.ts +67 -0
  136. package/lib/app/services/jobs/JobsManager.d.ts.map +1 -0
  137. package/lib/app/services/jobs/JobsManager.js +121 -0
  138. package/lib/app/services/jobs/JobsManager.js.map +1 -0
  139. package/lib/app/services/jobs/bullBoard.d.ts +72 -0
  140. package/lib/app/services/jobs/bullBoard.d.ts.map +1 -0
  141. package/lib/app/services/jobs/bullBoard.js +96 -0
  142. package/lib/app/services/jobs/bullBoard.js.map +1 -0
  143. package/lib/app/services/jobs/defineJob.d.ts +81 -0
  144. package/lib/app/services/jobs/defineJob.d.ts.map +1 -0
  145. package/lib/app/services/jobs/defineJob.js +49 -0
  146. package/lib/app/services/jobs/defineJob.js.map +1 -0
  147. package/lib/app/services/jobs/index.d.ts +4 -0
  148. package/lib/app/services/jobs/index.d.ts.map +1 -0
  149. package/lib/app/services/jobs/index.js +4 -0
  150. package/lib/app/services/jobs/index.js.map +1 -0
  151. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts +23 -0
  152. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts.map +1 -0
  153. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js +51 -0
  154. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js.map +1 -0
  155. package/lib/app/services/rateLimit/RateLimitBackend.d.ts +41 -0
  156. package/lib/app/services/rateLimit/RateLimitBackend.d.ts.map +1 -0
  157. package/lib/app/services/rateLimit/RateLimitBackend.js +19 -0
  158. package/lib/app/services/rateLimit/RateLimitBackend.js.map +1 -0
  159. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts +16 -0
  160. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts.map +1 -0
  161. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js +80 -0
  162. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js.map +1 -0
  163. package/lib/app/services/rateLimit/index.d.ts +4 -0
  164. package/lib/app/services/rateLimit/index.d.ts.map +1 -0
  165. package/lib/app/services/rateLimit/index.js +3 -0
  166. package/lib/app/services/rateLimit/index.js.map +1 -0
  167. package/lib/app/services/storage/DiskStorageAdapter.d.ts +62 -0
  168. package/lib/app/services/storage/DiskStorageAdapter.d.ts.map +1 -0
  169. package/lib/app/services/storage/DiskStorageAdapter.js +295 -0
  170. package/lib/app/services/storage/DiskStorageAdapter.js.map +1 -0
  171. package/lib/app/services/storage/GCSStorageAdapter.d.ts +44 -0
  172. package/lib/app/services/storage/GCSStorageAdapter.d.ts.map +1 -0
  173. package/lib/app/services/storage/GCSStorageAdapter.js +133 -0
  174. package/lib/app/services/storage/GCSStorageAdapter.js.map +1 -0
  175. package/lib/app/services/storage/S3StorageAdapter.d.ts +57 -0
  176. package/lib/app/services/storage/S3StorageAdapter.d.ts.map +1 -0
  177. package/lib/app/services/storage/S3StorageAdapter.js +162 -0
  178. package/lib/app/services/storage/S3StorageAdapter.js.map +1 -0
  179. package/lib/app/services/storage/StorageService.d.ts +88 -0
  180. package/lib/app/services/storage/StorageService.d.ts.map +1 -0
  181. package/lib/app/services/storage/StorageService.js +18 -0
  182. package/lib/app/services/storage/StorageService.js.map +1 -0
  183. package/lib/app/services/storage/index.d.ts +5 -0
  184. package/lib/app/services/storage/index.d.ts.map +1 -0
  185. package/lib/app/services/storage/index.js +4 -0
  186. package/lib/app/services/storage/index.js.map +1 -0
  187. package/lib/app/utils/ContextValidators.d.ts +46 -0
  188. package/lib/app/utils/ContextValidators.d.ts.map +1 -0
  189. package/lib/app/utils/ContextValidators.js +81 -0
  190. package/lib/app/utils/ContextValidators.js.map +1 -0
  191. package/lib/app/utils/defineEnv.d.ts +80 -0
  192. package/lib/app/utils/defineEnv.d.ts.map +1 -0
  193. package/lib/app/utils/defineEnv.js +95 -0
  194. package/lib/app/utils/defineEnv.js.map +1 -0
  195. package/lib/client.d.ts +139 -0
  196. package/lib/client.d.ts.map +1 -0
  197. package/lib/client.js +98 -0
  198. package/lib/client.js.map +1 -0
  199. package/lib/contract/application.d.ts +3 -0
  200. package/lib/contract/application.d.ts.map +1 -0
  201. package/lib/contract/application.js +2 -0
  202. package/lib/contract/application.js.map +1 -0
  203. package/lib/contract/client.d.ts +3 -0
  204. package/lib/contract/client.d.ts.map +1 -0
  205. package/lib/contract/client.js +3 -0
  206. package/lib/contract/client.js.map +1 -0
  207. package/lib/contract/index.d.ts +3 -0
  208. package/lib/contract/index.d.ts.map +1 -0
  209. package/lib/contract/index.js +3 -0
  210. package/lib/contract/index.js.map +1 -0
  211. package/lib/contract/manifest.d.ts +3 -0
  212. package/lib/contract/manifest.d.ts.map +1 -0
  213. package/lib/contract/manifest.js +2 -0
  214. package/lib/contract/manifest.js.map +1 -0
  215. package/lib/contract/openapi.d.ts +3 -0
  216. package/lib/contract/openapi.d.ts.map +1 -0
  217. package/lib/contract/openapi.js +3 -0
  218. package/lib/contract/openapi.js.map +1 -0
  219. package/lib/contract/project.d.ts +3 -0
  220. package/lib/contract/project.d.ts.map +1 -0
  221. package/lib/contract/project.js +3 -0
  222. package/lib/contract/project.js.map +1 -0
  223. package/lib/contract/schema.d.ts +3 -0
  224. package/lib/contract/schema.d.ts.map +1 -0
  225. package/lib/contract/schema.js +3 -0
  226. package/lib/contract/schema.js.map +1 -0
  227. package/lib/drizzle/index.d.ts +3 -0
  228. package/lib/drizzle/index.d.ts.map +1 -0
  229. package/lib/drizzle/index.js +3 -0
  230. package/lib/drizzle/index.js.map +1 -0
  231. package/lib/hono/auth.d.ts +6 -0
  232. package/lib/hono/auth.d.ts.map +1 -0
  233. package/lib/hono/auth.js +54 -0
  234. package/lib/hono/auth.js.map +1 -0
  235. package/lib/hono/index.d.ts +4 -0
  236. package/lib/hono/index.d.ts.map +1 -0
  237. package/lib/hono/index.js +4 -0
  238. package/lib/hono/index.js.map +1 -0
  239. package/lib/http/app/createApp.d.ts +132 -0
  240. package/lib/http/app/createApp.d.ts.map +1 -0
  241. package/lib/http/app/createApp.js +215 -0
  242. package/lib/http/app/createApp.js.map +1 -0
  243. package/lib/http/app/devRoutes.d.ts +31 -0
  244. package/lib/http/app/devRoutes.d.ts.map +1 -0
  245. package/lib/http/app/devRoutes.js +145 -0
  246. package/lib/http/app/devRoutes.js.map +1 -0
  247. package/lib/http/app/errors.d.ts +45 -0
  248. package/lib/http/app/errors.d.ts.map +1 -0
  249. package/lib/http/app/errors.js +93 -0
  250. package/lib/http/app/errors.js.map +1 -0
  251. package/lib/http/app/health.d.ts +66 -0
  252. package/lib/http/app/health.d.ts.map +1 -0
  253. package/lib/http/app/health.js +104 -0
  254. package/lib/http/app/health.js.map +1 -0
  255. package/lib/http/errors/AppError.d.ts +10 -0
  256. package/lib/http/errors/AppError.d.ts.map +1 -0
  257. package/lib/http/errors/AppError.js +19 -0
  258. package/lib/http/errors/AppError.js.map +1 -0
  259. package/lib/http/errors/AuthenticationError.d.ts +8 -0
  260. package/lib/http/errors/AuthenticationError.d.ts.map +1 -0
  261. package/lib/http/errors/AuthenticationError.js +10 -0
  262. package/lib/http/errors/AuthenticationError.js.map +1 -0
  263. package/lib/http/errors/AuthorizationError.d.ts +8 -0
  264. package/lib/http/errors/AuthorizationError.d.ts.map +1 -0
  265. package/lib/http/errors/AuthorizationError.js +10 -0
  266. package/lib/http/errors/AuthorizationError.js.map +1 -0
  267. package/lib/http/errors/BadRequestError.d.ts +8 -0
  268. package/lib/http/errors/BadRequestError.d.ts.map +1 -0
  269. package/lib/http/errors/BadRequestError.js +10 -0
  270. package/lib/http/errors/BadRequestError.js.map +1 -0
  271. package/lib/http/errors/ConflictError.d.ts +8 -0
  272. package/lib/http/errors/ConflictError.d.ts.map +1 -0
  273. package/lib/http/errors/ConflictError.js +10 -0
  274. package/lib/http/errors/ConflictError.js.map +1 -0
  275. package/lib/http/errors/InternalServerError.d.ts +8 -0
  276. package/lib/http/errors/InternalServerError.d.ts.map +1 -0
  277. package/lib/http/errors/InternalServerError.js +10 -0
  278. package/lib/http/errors/InternalServerError.js.map +1 -0
  279. package/lib/http/errors/NotFoundError.d.ts +8 -0
  280. package/lib/http/errors/NotFoundError.d.ts.map +1 -0
  281. package/lib/http/errors/NotFoundError.js +10 -0
  282. package/lib/http/errors/NotFoundError.js.map +1 -0
  283. package/lib/http/errors/RateLimitError.d.ts +13 -0
  284. package/lib/http/errors/RateLimitError.d.ts.map +1 -0
  285. package/lib/http/errors/RateLimitError.js +16 -0
  286. package/lib/http/errors/RateLimitError.js.map +1 -0
  287. package/lib/http/errors/ServiceUnavailableError.d.ts +8 -0
  288. package/lib/http/errors/ServiceUnavailableError.d.ts.map +1 -0
  289. package/lib/http/errors/ServiceUnavailableError.js +10 -0
  290. package/lib/http/errors/ServiceUnavailableError.js.map +1 -0
  291. package/lib/http/errors/ValidationError.d.ts +9 -0
  292. package/lib/http/errors/ValidationError.d.ts.map +1 -0
  293. package/lib/http/errors/ValidationError.js +12 -0
  294. package/lib/http/errors/ValidationError.js.map +1 -0
  295. package/lib/http/errors/index.d.ts +11 -0
  296. package/lib/http/errors/index.d.ts.map +1 -0
  297. package/lib/http/errors/index.js +12 -0
  298. package/lib/http/errors/index.js.map +1 -0
  299. package/lib/http/middleware/apiKey.d.ts +9 -0
  300. package/lib/http/middleware/apiKey.d.ts.map +1 -0
  301. package/lib/http/middleware/apiKey.js +71 -0
  302. package/lib/http/middleware/apiKey.js.map +1 -0
  303. package/lib/http/middleware/csrf.d.ts +63 -0
  304. package/lib/http/middleware/csrf.d.ts.map +1 -0
  305. package/lib/http/middleware/csrf.js +169 -0
  306. package/lib/http/middleware/csrf.js.map +1 -0
  307. package/lib/http/middleware/httpLogger.d.ts +39 -0
  308. package/lib/http/middleware/httpLogger.d.ts.map +1 -0
  309. package/lib/http/middleware/httpLogger.js +118 -0
  310. package/lib/http/middleware/httpLogger.js.map +1 -0
  311. package/lib/http/middleware/idempotency.d.ts +48 -0
  312. package/lib/http/middleware/idempotency.d.ts.map +1 -0
  313. package/lib/http/middleware/idempotency.js +180 -0
  314. package/lib/http/middleware/idempotency.js.map +1 -0
  315. package/lib/http/middleware/rateLimit.d.ts +105 -0
  316. package/lib/http/middleware/rateLimit.d.ts.map +1 -0
  317. package/lib/http/middleware/rateLimit.js +84 -0
  318. package/lib/http/middleware/rateLimit.js.map +1 -0
  319. package/lib/http/middleware/requireAuth.d.ts +58 -0
  320. package/lib/http/middleware/requireAuth.d.ts.map +1 -0
  321. package/lib/http/middleware/requireAuth.js +63 -0
  322. package/lib/http/middleware/requireAuth.js.map +1 -0
  323. package/lib/http/middleware/requirePermission.d.ts +23 -0
  324. package/lib/http/middleware/requirePermission.d.ts.map +1 -0
  325. package/lib/http/middleware/requirePermission.js +50 -0
  326. package/lib/http/middleware/requirePermission.js.map +1 -0
  327. package/lib/http/middleware/resolveTenant.d.ts +41 -0
  328. package/lib/http/middleware/resolveTenant.d.ts.map +1 -0
  329. package/lib/http/middleware/resolveTenant.js +17 -0
  330. package/lib/http/middleware/resolveTenant.js.map +1 -0
  331. package/lib/http/streaming/sse.d.ts +31 -0
  332. package/lib/http/streaming/sse.d.ts.map +1 -0
  333. package/lib/http/streaming/sse.js +11 -0
  334. package/lib/http/streaming/sse.js.map +1 -0
  335. package/lib/http/streaming/streamLLM.d.ts +94 -0
  336. package/lib/http/streaming/streamLLM.d.ts.map +1 -0
  337. package/lib/http/streaming/streamLLM.js +94 -0
  338. package/lib/http/streaming/streamLLM.js.map +1 -0
  339. package/lib/http/utils/authCookies.d.ts +74 -0
  340. package/lib/http/utils/authCookies.d.ts.map +1 -0
  341. package/lib/http/utils/authCookies.js +102 -0
  342. package/lib/http/utils/authCookies.js.map +1 -0
  343. package/lib/http/utils/clientIp.d.ts +85 -0
  344. package/lib/http/utils/clientIp.d.ts.map +1 -0
  345. package/lib/http/utils/clientIp.js +249 -0
  346. package/lib/http/utils/clientIp.js.map +1 -0
  347. package/lib/http/utils/index.d.ts +4 -0
  348. package/lib/http/utils/index.d.ts.map +1 -0
  349. package/lib/http/utils/index.js +5 -0
  350. package/lib/http/utils/index.js.map +1 -0
  351. package/lib/http/utils/metaTags.d.ts +49 -0
  352. package/lib/http/utils/metaTags.d.ts.map +1 -0
  353. package/lib/http/utils/metaTags.js +32 -0
  354. package/lib/http/utils/metaTags.js.map +1 -0
  355. package/lib/http/utils/publicSuffix.d.ts +34 -0
  356. package/lib/http/utils/publicSuffix.d.ts.map +1 -0
  357. package/lib/http/utils/publicSuffix.js +276 -0
  358. package/lib/http/utils/publicSuffix.js.map +1 -0
  359. package/lib/http/utils/uploads.d.ts +92 -0
  360. package/lib/http/utils/uploads.d.ts.map +1 -0
  361. package/lib/http/utils/uploads.js +126 -0
  362. package/lib/http/utils/uploads.js.map +1 -0
  363. package/lib/http/utils/validate.d.ts +41 -0
  364. package/lib/http/utils/validate.d.ts.map +1 -0
  365. package/lib/http/utils/validate.js +55 -0
  366. package/lib/http/utils/validate.js.map +1 -0
  367. package/lib/http/utils/webhooks.d.ts +63 -0
  368. package/lib/http/utils/webhooks.d.ts.map +1 -0
  369. package/lib/http/utils/webhooks.js +133 -0
  370. package/lib/http/utils/webhooks.js.map +1 -0
  371. package/lib/http/ws/auth.d.ts +46 -0
  372. package/lib/http/ws/auth.d.ts.map +1 -0
  373. package/lib/http/ws/auth.js +123 -0
  374. package/lib/http/ws/auth.js.map +1 -0
  375. package/lib/index.d.ts +80 -0
  376. package/lib/index.d.ts.map +1 -0
  377. package/lib/index.js +61 -0
  378. package/lib/index.js.map +1 -0
  379. package/lib/kernel/index.d.ts +3 -0
  380. package/lib/kernel/index.d.ts.map +1 -0
  381. package/lib/kernel/index.js +3 -0
  382. package/lib/kernel/index.js.map +1 -0
  383. package/lib/libraries/.gitkeep +0 -0
  384. package/lib/libraries/ai/CHANGELOG.md +17 -0
  385. package/lib/libraries/ai/README.md +164 -0
  386. package/lib/libraries/ai/adapters/AnthropicAdapter.ts +382 -0
  387. package/lib/libraries/ai/adapters/LLMProvider.ts +76 -0
  388. package/lib/libraries/ai/adapters/OpenAIAdapter.ts +466 -0
  389. package/lib/libraries/ai/experimental/index.ts +20 -0
  390. package/lib/libraries/ai/index.ts +128 -0
  391. package/lib/libraries/ai/library.json +19 -0
  392. package/lib/libraries/ai/loop/agentLoop.ts +377 -0
  393. package/lib/libraries/ai/prompts/definePrompt.ts +0 -0
  394. package/lib/libraries/ai/rag/retrieveAndAnswer.ts +177 -0
  395. package/lib/libraries/ai/streaming/streamLLM.ts +94 -0
  396. package/lib/libraries/ai/structured/completeStructured.ts +143 -0
  397. package/lib/libraries/ai/tokens/Tokenizer.ts +216 -0
  398. package/lib/libraries/ai/tools/defineTool.ts +208 -0
  399. package/lib/libraries/ai/types.ts +260 -0
  400. package/lib/libraries/chunking/ChunkingService.ts +103 -0
  401. package/lib/libraries/chunking/README.md +104 -0
  402. package/lib/libraries/chunking/docs/api-reference.md +549 -0
  403. package/lib/libraries/chunking/docs/best-practices.md +321 -0
  404. package/lib/libraries/chunking/docs/code-organization.md +538 -0
  405. package/lib/libraries/chunking/docs/configuration.md +418 -0
  406. package/lib/libraries/chunking/docs/index.md +236 -0
  407. package/lib/libraries/chunking/docs/quick-start.md +298 -0
  408. package/lib/libraries/chunking/docs/strategies.md +407 -0
  409. package/lib/libraries/chunking/docs/summary.md +258 -0
  410. package/lib/libraries/chunking/docs/troubleshooting.md +527 -0
  411. package/lib/libraries/chunking/index.ts +17 -0
  412. package/lib/libraries/chunking/library.json +16 -0
  413. package/lib/libraries/chunking/strategies/ChunkingStrategy.ts +13 -0
  414. package/lib/libraries/chunking/strategies/FixedLengthChunkingStrategy.ts +88 -0
  415. package/lib/libraries/chunking/strategies/SemanticChunkingStrategy.ts +389 -0
  416. package/lib/libraries/chunking/strategies/SlidingWindowChunkingStrategy.ts +258 -0
  417. package/lib/libraries/chunking/types/index.ts +63 -0
  418. package/lib/libraries/email/EmailService.ts +591 -0
  419. package/lib/libraries/email/README.md +777 -0
  420. package/lib/libraries/email/TemplateRegistry.ts +148 -0
  421. package/lib/libraries/email/TemplateRenderer.ts +273 -0
  422. package/lib/libraries/email/index.ts +4 -0
  423. package/lib/libraries/email/initializeEmailService.ts +60 -0
  424. package/lib/libraries/email/library.json +12 -0
  425. package/lib/libraries/email/types/EmailAddress.ts +4 -0
  426. package/lib/libraries/email/types/EmailAttachment.ts +11 -0
  427. package/lib/libraries/email/types/EmailTag.ts +9 -0
  428. package/lib/libraries/email/types/EmailTemplate.ts +124 -0
  429. package/lib/libraries/email/types/SendBatchEmailsOptions.ts +9 -0
  430. package/lib/libraries/email/types/SendBatchEmailsResult.ts +9 -0
  431. package/lib/libraries/email/types/SendEmailOptions.ts +33 -0
  432. package/lib/libraries/email/types/SendEmailResult.ts +9 -0
  433. package/lib/libraries/email/types/index.ts +8 -0
  434. package/lib/libraries/weaviate/QueryBuilder.ts +292 -0
  435. package/lib/libraries/weaviate/README.md +284 -0
  436. package/lib/libraries/weaviate/Weaviate.ts +1419 -0
  437. package/lib/libraries/weaviate/WeaviateConfig.ts +268 -0
  438. package/lib/libraries/weaviate/docs/.gitkeep +1 -0
  439. package/lib/libraries/weaviate/docs/API_REFERENCE.md +1067 -0
  440. package/lib/libraries/weaviate/docs/CONFIGURATION.md +320 -0
  441. package/lib/libraries/weaviate/docs/ERROR_HANDLING.md +271 -0
  442. package/lib/libraries/weaviate/docs/MULTI_TENANCY.md +348 -0
  443. package/lib/libraries/weaviate/docs/PERFORMANCE.md +602 -0
  444. package/lib/libraries/weaviate/docs/PLUGIN_DEVELOPMENT.md +547 -0
  445. package/lib/libraries/weaviate/docs/QUICK_START.md +443 -0
  446. package/lib/libraries/weaviate/docs/README.md +269 -0
  447. package/lib/libraries/weaviate/docs/SCHEMA_GUIDE.md +630 -0
  448. package/lib/libraries/weaviate/docs/WEAVIATE_README.md +520 -0
  449. package/lib/libraries/weaviate/errors/WeaviateError.ts +92 -0
  450. package/lib/libraries/weaviate/errors/index.ts +1 -0
  451. package/lib/libraries/weaviate/index.ts +35 -0
  452. package/lib/libraries/weaviate/library.json +26 -0
  453. package/lib/libraries/weaviate/plugins/index.ts +2 -0
  454. package/lib/libraries/weaviate/schemas/SchemaRegistry.ts +284 -0
  455. package/lib/libraries/weaviate/schemas/index.ts +2 -0
  456. package/lib/libraries/weaviate/types/BM25SearchOptions.ts +9 -0
  457. package/lib/libraries/weaviate/types/ExtendedWeaviateClient.ts +7 -0
  458. package/lib/libraries/weaviate/types/HybridSearchOptions.ts +11 -0
  459. package/lib/libraries/weaviate/types/MultiTenancy.ts +81 -0
  460. package/lib/libraries/weaviate/types/Plugin.ts +17 -0
  461. package/lib/libraries/weaviate/types/SchemaConfig.ts +25 -0
  462. package/lib/libraries/weaviate/types/SearchMethod.ts +8 -0
  463. package/lib/libraries/weaviate/types/SearchOptions.ts +16 -0
  464. package/lib/libraries/weaviate/types/SearchRequest.ts +19 -0
  465. package/lib/libraries/weaviate/types/SearchResult.ts +16 -0
  466. package/lib/libraries/weaviate/types/SearchableField.ts +87 -0
  467. package/lib/libraries/weaviate/types/VectorIndexConfig.ts +19 -0
  468. package/lib/libraries/weaviate/types/VectorSearchOptions.ts +18 -0
  469. package/lib/libraries/weaviate/types/VectorizerConfig.ts +8 -0
  470. package/lib/libraries/weaviate/types/index.ts +29 -0
  471. package/lib/libraries/weaviate/utils/TenantContextManager.ts +94 -0
  472. package/lib/modules/accounts/index.ts +47 -0
  473. package/lib/modules/accounts/module.json +15 -0
  474. package/lib/modules/accounts/permissions.ts +33 -0
  475. package/lib/modules/accounts/routes.ts +200 -0
  476. package/lib/modules/accounts/schema.ts +219 -0
  477. package/lib/modules/accounts/services/AccountService.ts +44 -0
  478. package/lib/modules/accounts/validation/schemas.ts +70 -0
  479. package/lib/modules/oauth/adapters/GmailOAuthAdapter.ts +35 -0
  480. package/lib/modules/oauth/adapters/GoogleOAuthAdapter.ts +278 -0
  481. package/lib/modules/oauth/adapters/MicrosoftOAuthAdapter.ts +269 -0
  482. package/lib/modules/oauth/adapters/MockOAuthAdapter.ts +138 -0
  483. package/lib/modules/oauth/adapters/OAuthAdapter.ts +211 -0
  484. package/lib/modules/oauth/adapters/OAuthAdapterRegistry.ts +77 -0
  485. package/lib/modules/oauth/adapters/OutlookOAuthAdapter.ts +38 -0
  486. package/lib/modules/oauth/index.ts +79 -0
  487. package/lib/modules/oauth/module.json +23 -0
  488. package/lib/modules/oauth/permissions.ts +39 -0
  489. package/lib/modules/oauth/routes.ts +497 -0
  490. package/lib/modules/oauth/schema.ts +127 -0
  491. package/lib/modules/oauth/services/OAuthConnectionService.ts +147 -0
  492. package/lib/modules/oauth/state.ts +234 -0
  493. package/lib/modules/oauth/stateJtiCache.ts +85 -0
  494. package/lib/modules/oauth/verifyIdToken.ts +178 -0
  495. package/lib/modules/outbox/EventEmitter.ts +106 -0
  496. package/lib/modules/outbox/OutboxDrainer.ts +163 -0
  497. package/lib/modules/outbox/handlers/EventHandler.ts +115 -0
  498. package/lib/modules/outbox/index.ts +43 -0
  499. package/lib/modules/outbox/module.json +15 -0
  500. package/lib/modules/outbox/permissions.ts +36 -0
  501. package/lib/modules/outbox/routes.ts +219 -0
  502. package/lib/modules/outbox/schema.ts +207 -0
  503. package/lib/modules/outbox/services/OutboxEventService.ts +223 -0
  504. package/lib/observability/logger.d.ts +30 -0
  505. package/lib/observability/logger.d.ts.map +1 -0
  506. package/lib/observability/logger.js +110 -0
  507. package/lib/observability/logger.js.map +1 -0
  508. package/lib/observability/metrics.d.ts +3 -0
  509. package/lib/observability/metrics.d.ts.map +1 -0
  510. package/lib/observability/metrics.js +3 -0
  511. package/lib/observability/metrics.js.map +1 -0
  512. package/lib/observability/otel.d.ts +3 -0
  513. package/lib/observability/otel.d.ts.map +1 -0
  514. package/lib/observability/otel.js +3 -0
  515. package/lib/observability/otel.js.map +1 -0
  516. package/lib/observability/safeErrorFields.d.ts +14 -0
  517. package/lib/observability/safeErrorFields.d.ts.map +1 -0
  518. package/lib/observability/safeErrorFields.js +14 -0
  519. package/lib/observability/safeErrorFields.js.map +1 -0
  520. package/lib/observability/tracing.d.ts +3 -0
  521. package/lib/observability/tracing.d.ts.map +1 -0
  522. package/lib/observability/tracing.js +3 -0
  523. package/lib/observability/tracing.js.map +1 -0
  524. package/lib/package.json +4 -0
  525. package/lib/testing.d.ts +3 -0
  526. package/lib/testing.d.ts.map +1 -0
  527. package/lib/testing.js +3 -0
  528. package/lib/testing.js.map +1 -0
  529. package/package.json +193 -3
  530. package/templates/default/.claude/agents/qa-brief.md +106 -0
  531. package/templates/default/.claude/commands/sherpa-brief.md +23 -0
  532. package/templates/default/.cursor/rules/api.mdc +80 -0
  533. package/templates/default/.cursor/rules/commits.mdc +88 -0
  534. package/templates/default/.cursor/rules/security.mdc +92 -0
  535. package/templates/default/.cursor/rules/testing.mdc +123 -0
  536. package/templates/default/.cursor/rules/typescript.mdc +86 -0
  537. package/templates/default/.env.example +79 -0
  538. package/templates/default/.github/workflows/sherpa-brief.yml +180 -0
  539. package/templates/default/AGENTS.md +166 -0
  540. package/templates/default/CLAUDE.md +17 -0
  541. package/templates/default/README.md +97 -0
  542. package/templates/default/_gitignore +27 -0
  543. package/templates/default/docker-compose.yml +83 -0
  544. package/templates/default/drizzle.config.ts +34 -0
  545. package/templates/default/eslint.config.mjs +106 -0
  546. package/templates/default/package.json +57 -0
  547. package/templates/default/ship-api.config.ts +21 -0
  548. package/templates/default/src/client.ts +34 -0
  549. package/templates/default/src/config/modules.ts +23 -0
  550. package/templates/default/src/db/schema.ts +26 -0
  551. package/templates/default/src/environment.ts +81 -0
  552. package/templates/default/src/index.test.ts +53 -0
  553. package/templates/default/src/index.ts +11 -0
  554. package/templates/default/src/instrumentation.ts +13 -0
  555. package/templates/default/src/server.ts +90 -0
  556. package/templates/default/tsconfig.json +24 -0
package/lib/index.js ADDED
@@ -0,0 +1,61 @@
1
+ /**
2
+ * `@sixthsummit/ship-api` — public API barrel for ShipAPI v4.
3
+ *
4
+ * This is the canonical entry point for consumer apps. The framework
5
+ * exports a curated, semver-stable surface here; deep-path imports
6
+ * (`@sixthsummit/ship-api/http/middleware/...`) are still available
7
+ * but NOT covered by semver — they're for internal cross-module use
8
+ * and advanced consumers who need primitives the barrel doesn't yet
9
+ * surface.
10
+ *
11
+ * The `@sixthsummit/ship-api/client` subpath remains a separate
12
+ * lightweight bundle for typed-client consumers (web / mobile) that
13
+ * shouldn't pull in the framework's runtime deps. Import from there:
14
+ *
15
+ * import { hc } from "@sixthsummit/ship-api/client";
16
+ * import type { ShipApiClient } from "@my-org/api";
17
+ */
18
+ export { ApplicationCompilationError, anyPermission, authenticatedAccess, checkOperationAccess, compileApp, createExecutor, createTenantBypassAuthority, createTenantScopeAuthority, defineActorResolver, defineApp, defineModule, defineOperation, defineProvider, dependency, effectDependency, InvalidModuleDefinitionError, InvalidOperationDefinitionError, InvalidProviderDefinitionError, isActorResolution, isActorResolver, isEffectDependencyToken, isExplicitOperationResponse, isOperationActor, isOperationIdentity, isTenantBypass, isTenantScope, isUnitOfWork, isUnitOfWorkDependencyToken, normalizeActorResolution, normalizeOperationActor, OperationExecutionError, OperationFailure, operationActor, operationError, operationFailure, operationIdentity, optionalIdentityAccess, permission, permissionSnapshot, publicAccess, respond, TenantCapabilityError, unitOfWorkDependency, valueProvider, } from "./kernel/index.js";
19
+ export { createHonoAdapter, defineHonoCredentialAdapter, HonoAdapterError, honoAuthProvider, http, InvalidHttpTransportError, isHonoCredentialAdapter, isHttpTransport, requestHeadersCredential, } from "./hono/index.js";
20
+ export { createApp, createModuleApp } from "./http/app/createApp.js";
21
+ export { registerErrorHandlers } from "./http/app/errors.js";
22
+ export { apiKey } from "./http/middleware/apiKey.js";
23
+ export { csrf } from "./http/middleware/csrf.js";
24
+ export { httpLogger } from "./http/middleware/httpLogger.js";
25
+ export { idempotency } from "./http/middleware/idempotency.js";
26
+ export { rateLimit } from "./http/middleware/rateLimit.js";
27
+ export { AUTH_CONTEXT_KEYS, requireAuth } from "./http/middleware/requireAuth.js";
28
+ export { requirePermission } from "./http/middleware/requirePermission.js";
29
+ export { resolveTenant } from "./http/middleware/resolveTenant.js";
30
+ export { streamSSE } from "./http/streaming/sse.js";
31
+ export { streamLLM } from "./http/streaming/streamLLM.js";
32
+ export { parseUpload } from "./http/utils/uploads.js";
33
+ export { validate } from "./http/utils/validate.js";
34
+ export { parseWebhook } from "./http/utils/webhooks.js";
35
+ // ─── Error taxonomy ────────────────────────────────────────────────
36
+ export { AppError, AuthenticationError, AuthorizationError, BadRequestError, ConflictError, InternalServerError, NotFoundError, RateLimitError, ServiceUnavailableError, ValidationError, } from "./http/errors/index.js";
37
+ export { FirebaseAuthProvider, firebaseAuth } from "./app/auth/adapters/firebase.js";
38
+ export { getRequestContext } from "./app/context/RequestContext.js";
39
+ export { baseFields, baseFieldsTimestampsOnly } from "./app/db/baseFields.js";
40
+ // `DslQueryFilter` (the DSL filter shape) lives in app/db/QueryOptions.js and
41
+ // is intentionally NOT re-exported here — it's the ORM-translation detail, not
42
+ // the common surface. Consumers driving the DSL directly import it from the
43
+ // subpath:
44
+ // import type { DslQueryFilter } from "@sixthsummit/ship-api/app/db/QueryOptions";
45
+ // The barrel re-exports the lifecycle-hook `QueryFilter` below (the common one).
46
+ export { isQueryOperator, QUERY_OPERATORS } from "./app/db/QueryOptions.js";
47
+ export { tenantScoped } from "./app/db/tenantScoped.js";
48
+ export { RollbackError, withTransaction } from "./app/db/transaction.js";
49
+ export { DrizzleEntityService } from "./app/services/DrizzleEntityService.js";
50
+ export { composeHooks } from "./app/services/hooks/LifecycleHooks.js";
51
+ export { cached, InMemoryCache, RedisCache } from "./app/services/cache/index.js";
52
+ // ─── Redis provider ────────────────────────────────────────────────
53
+ export { RedisProvider } from "./app/services/RedisProvider.js";
54
+ export { defineJob, JobRegistry, JobsManager, jobRegistry } from "./app/services/jobs/index.js";
55
+ export { CRON_QUEUE, defineCron } from "./app/services/cron/index.js";
56
+ export { HealthCheckRegistry, healthCheckRegistry } from "./app/health/HealthCheck.js";
57
+ export { redisHealthCheck } from "./app/health/redisHealthCheck.js";
58
+ export { hasHealthRoutes, registerHealthRoutes } from "./http/app/health.js";
59
+ export { routeRegistry } from "./app/registry/routes.js";
60
+ export { defineEnv } from "./app/utils/defineEnv.js";
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AA8GH,OAAO,EACL,2BAA2B,EAC3B,aAAa,EACb,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,cAAc,EACd,2BAA2B,EAC3B,0BAA0B,EAC1B,mBAAmB,EACnB,SAAS,EACT,YAAY,EACZ,eAAe,EACf,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,4BAA4B,EAC5B,+BAA+B,EAC/B,8BAA8B,EAC9B,iBAAiB,EACjB,eAAe,EACf,uBAAuB,EACvB,2BAA2B,EAC3B,gBAAgB,EAChB,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,OAAO,EACP,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,GACd,MAAM,mBAAmB,CAAC;AAwB3B,OAAO,EACL,iBAAiB,EACjB,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,IAAI,EACJ,yBAAyB,EACzB,uBAAuB,EACvB,eAAe,EACf,wBAAwB,GACzB,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAErD,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAE3D,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAE3E,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,sEAAsE;AAEtE,OAAO,EACL,QAAQ,EACR,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,uBAAuB,EACvB,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAWhC,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAKrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAO9E,8EAA8E;AAC9E,+EAA+E;AAC/E,4EAA4E;AAC5E,WAAW;AACX,qFAAqF;AACrF,iFAAiF;AACjF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE5E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAS9E,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAKtE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAElF,sEAAsE;AAEtE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAYhE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAKhG,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAYtE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvF,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAMpE,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAK7E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAWzD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** @deprecated Import the redesign kernel from `@sixthsummit/ship-core`. */
2
+ export * from "@sixthsummit/ship-core";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/kernel/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** @deprecated Import the redesign kernel from `@sixthsummit/ship-core`. */
2
+ export * from "@sixthsummit/ship-core";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/kernel/index.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,cAAc,wBAAwB,CAAC"}
File without changes
@@ -0,0 +1,17 @@
1
+ # `ai` library — changelog
2
+
3
+ The `ai` library is **versioned independently of the framework core** (AI-A3 / A2-11): the AI substrate churns fastest, so it bumps on its own schedule without dragging the stable framework version. The current version lives in `library.json#version` and is stamped into a consumer's `src/lib/ai/.ship-lib.json` on `ship-api add -l ai` (so staleness is detectable and `ship-api update` has an anchor).
4
+
5
+ **Versioning rule:** bump `library.json#version` on any meaningful change to the `ai` surface. Pre-1.0, breaking changes bump the **minor**; additive/fix changes bump the **patch**. This is decoupled from the framework's `4.x` line.
6
+
7
+ ## 0.2.0
8
+
9
+ Part II AI-library refinement (alpha-window, deliberate).
10
+
11
+ - **AI-R1** — the `LLMProvider` seam is now genuinely pass-through, not lowest-common-denominator: `CompleteResult` / `StreamStopEvent` carry `raw` + `providerExtras`, `TokenUsage` carries `reasoningTokens` + `raw`, both adapters populate them (Anthropic thinking/citations/server-tool-use; OpenAI refusal/reasoning tokens), and `agentLoop` / `retrieveAndAnswer` no longer drop `providerOptions` / `metadata`. Additive-optional.
12
+ - **AI-R2** (breaking) — `agentLoop` moved off the stable barrel to `@sixthsummit/ship-api/libraries/ai/experimental`; it carries no stability promise and is expected to be superseded by MCP / provider-native agent runtimes. `defineTool` / `toolRegistry` stay on the stable barrel.
13
+ - **AI-R3** — `HeuristicTokenizer` / `countMessageTokens` deprecated (token truth is the provider response `usage`); added thin `estimateTokens` / `estimateMessageTokens` for pre-call prompt-fit / rate-limit budgeting. The `Tokenizer` interface is unchanged.
14
+
15
+ ## 0.1.0
16
+
17
+ Initial `ai` library: the `LLMProvider` interface + Anthropic & OpenAI adapters, `defineTool` / `toolRegistry`, `agentLoop`, `completeStructured`, the `definePrompt` prompt registry, the `retrieveAndAnswer` RAG pipeline, and a pluggable `Tokenizer`.
@@ -0,0 +1,164 @@
1
+ # `libraries/ai/` — LLM helper library
2
+
3
+ The framework's defining differentiator. Provider-agnostic LLM tooling that consumers compose into their app: provider adapters (Anthropic + OpenAI today), prompt registry, tool-calling, agent loop, structured outputs, RAG, token counting.
4
+
5
+ > **Install via**: `ship-api add -l ai`. The library itself takes **no** SDK runtime dependency — concrete provider adapters are opt-in (install only the SDK for the providers you use).
6
+
7
+ ## What's inside
8
+
9
+ ```
10
+ libraries/ai/
11
+ ├── adapters/
12
+ │ ├── LLMProvider.ts — pluggable provider contract
13
+ │ ├── AnthropicAdapter.ts — wraps @anthropic-ai/sdk
14
+ │ └── OpenAIAdapter.ts — wraps openai
15
+ ├── tools/
16
+ │ └── defineTool.ts — Zod schema → typed handler + ToolRegistry
17
+ ├── loop/
18
+ │ └── agentLoop.ts — model→tool→model cycle with retry budget + signal honoring
19
+ ├── structured/
20
+ │ └── completeStructured.ts — Zod-typed single-shot via synthetic-tool pattern
21
+ ├── prompts/
22
+ │ └── definePrompt.ts — versioned prompt primitive + PromptRegistry
23
+ ├── rag/
24
+ │ └── retrieveAndAnswer.ts — pluggable VectorStore + LLMProvider RAG driver
25
+ ├── tokens/
26
+ │ └── Tokenizer.ts — pluggable tokenizer + HeuristicTokenizer baseline
27
+ ├── types.ts — cross-provider lingua franca
28
+ └── index.ts — public barrel
29
+ ```
30
+
31
+ ## Quick reference
32
+
33
+ ### Provider-portable completion
34
+
35
+ ```ts
36
+ import { AnthropicAdapter } from "@sixthsummit/ship-api/libraries/ai";
37
+
38
+ const llm = new AnthropicAdapter({ apiKey: env.ANTHROPIC_API_KEY });
39
+
40
+ const result = await llm.complete({
41
+ model: "claude-opus-4-7",
42
+ system: "Be concise.",
43
+ messages: [{ role: "user", content: "What is 2+2?" }],
44
+ });
45
+ console.log(result.text); // "4"
46
+ ```
47
+
48
+ Swap `AnthropicAdapter` for `OpenAIAdapter` and the same call site works — provider-specific tunables ride on `providerOptions` so the cross-provider surface stays narrow.
49
+
50
+ ### Tool calling
51
+
52
+ ```ts
53
+ import { defineTool, toolRegistry } from "@sixthsummit/ship-api/libraries/ai";
54
+ // agentLoop is experimental (AI-R2) — no stability promise; the hand-rolled
55
+ // loop is expected to be superseded by MCP / provider-native agent runtimes.
56
+ import { agentLoop } from "@sixthsummit/ship-api/libraries/ai/experimental";
57
+ import { z } from "zod";
58
+
59
+ const getWeather = defineTool({
60
+ name: "get_weather",
61
+ description: "Look up current weather for a city",
62
+ schema: z.object({ city: z.string() }),
63
+ handler: async ({ city }) => fetchWeather(city),
64
+ });
65
+
66
+ const result = await agentLoop({
67
+ llm,
68
+ tools: toolRegistry(getWeather),
69
+ model: "claude-opus-4-7",
70
+ messages: [{ role: "user", content: "What's the weather in Paris?" }],
71
+ maxIterations: 5,
72
+ });
73
+ console.log(result.finalText);
74
+ ```
75
+
76
+ ### Structured outputs
77
+
78
+ ```ts
79
+ import { completeStructured } from "@sixthsummit/ship-api/libraries/ai";
80
+ import { z } from "zod";
81
+
82
+ const { data } = await completeStructured({
83
+ llm,
84
+ schema: z.object({
85
+ sentiment: z.enum(["positive", "neutral", "negative"]),
86
+ confidence: z.number().min(0).max(1),
87
+ }),
88
+ model: "claude-opus-4-7",
89
+ messages: [{ role: "user", content: "I love this product!" }],
90
+ });
91
+ // data: { sentiment: "positive", confidence: 0.95 }
92
+ ```
93
+
94
+ ### RAG
95
+
96
+ ```ts
97
+ import { retrieveAndAnswer } from "@sixthsummit/ship-api/libraries/ai";
98
+
99
+ // Bring your own VectorStore — interface-only; no library coupling.
100
+ const store: VectorStore = {
101
+ name: "weaviate",
102
+ async search({ query, topK }) {
103
+ /* ... */
104
+ },
105
+ };
106
+
107
+ const { answer, sources } = await retrieveAndAnswer({
108
+ llm,
109
+ vectorStore: store,
110
+ query: "What is the capital of France?",
111
+ topK: 5,
112
+ model: "claude-opus-4-7",
113
+ });
114
+ ```
115
+
116
+ ### Streaming
117
+
118
+ ```ts
119
+ import { streamLLM } from "@sixthsummit/ship-api";
120
+
121
+ app.post("/chat", validate("json", schema), async (c) => {
122
+ const { prompt } = c.req.valid("json");
123
+ const stream = llm.streamComplete({
124
+ model: "claude-opus-4-7",
125
+ messages: [{ role: "user", content: prompt }],
126
+ });
127
+ return streamLLM(c, stream); // → SSE; client disconnect cancels upstream
128
+ });
129
+ ```
130
+
131
+ ### Versioned prompts
132
+
133
+ ```ts
134
+ import { definePrompt, PromptRegistry } from "@sixthsummit/ship-api/libraries/ai";
135
+
136
+ const greetPrompt = definePrompt({
137
+ id: "greetings.welcome",
138
+ version: 3,
139
+ template: "Hello, {{name}}! Welcome to {{appName}}.",
140
+ schema: z.object({ name: z.string(), appName: z.string() }),
141
+ });
142
+
143
+ greetPrompt.render({ name: "Ada", appName: "ShipAPI" });
144
+ // "Hello, Ada! Welcome to ShipAPI."
145
+ ```
146
+
147
+ CI lint flags un-versioned changes — bumping `version` on every meaningful change makes the change auditable and lets eval suites pin to a known-good version.
148
+
149
+ ## Conventions
150
+
151
+ - **The library never imports a provider SDK directly.** Adapters import the SDK they wrap; consumers install only the SDK for the providers they use.
152
+ - **Provider-specific tunables ride in `providerOptions` / `providerExtras`** so the cross-provider surface stays narrow.
153
+ - **Tools must be idempotent.** The agent loop's at-least-once delivery semantics mean a handler may be re-invoked after a crash or retry. Use `dedupeKey` for downstream deduplication where supported.
154
+ - **Streaming abort honored end-to-end.** Client disconnect propagates through `streamLLM` → `iterator.return()` → upstream provider stream cancellation.
155
+
156
+ ## Versioning
157
+
158
+ This library is **versioned independently of the framework core** (AI-A3): the AI substrate moves fastest, so it bumps on its own schedule via `library.json#version` without dragging the stable `4.x` framework version. On `ship-api add -l ai` the vendored version is stamped into `src/lib/ai/.ship-lib.json`, so staleness is detectable and `ship-api update` has an anchor to diff against. **Bump `library.json#version` on any meaningful change** — pre-1.0, breaking changes bump the minor, additive/fix changes bump the patch. See [`CHANGELOG.md`](./CHANGELOG.md).
159
+
160
+ ## See also
161
+
162
+ - [Plan §G](#) (LLM helpers section in the master plan)
163
+ - [v4 status](../../docs/V4_STATUS.md)
164
+ - [AGENTS.md](../../AGENTS.md)
@@ -0,0 +1,382 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+ import type {
3
+ Message as AnthropicMessage,
4
+ Tool as AnthropicTool,
5
+ ToolChoice as AnthropicToolChoice,
6
+ MessageCreateParamsBase,
7
+ MessageCreateParamsNonStreaming,
8
+ MessageCreateParamsStreaming,
9
+ MessageParam,
10
+ RawMessageStreamEvent,
11
+ ToolUseBlock,
12
+ } from "@anthropic-ai/sdk/resources/messages/messages.js";
13
+ import type {
14
+ CompleteOptions,
15
+ CompleteResult,
16
+ Message,
17
+ MessageContentPart,
18
+ StopReason,
19
+ StreamCompleteOptions,
20
+ StreamEvent,
21
+ TokenUsage,
22
+ ToolChoice,
23
+ ToolDefinition,
24
+ } from "../types.js";
25
+ import type { LLMProvider } from "./LLMProvider.js";
26
+
27
+ /**
28
+ * Concrete `LLMProvider` implementation backed by `@anthropic-ai/sdk`.
29
+ *
30
+ * Translation surface:
31
+ * - Cross-provider `Message` (text-or-content-parts) → Anthropic
32
+ * `MessageParam[]` (top-level `system` extracted out per API
33
+ * convention).
34
+ * - `ToolDefinition` → Anthropic `Tool` (passes `inputSchema` through
35
+ * as `input_schema` — both are JSON Schema).
36
+ * - Anthropic `Message` response → `CompleteResult` with normalized
37
+ * `StopReason` + `TokenUsage` (cache reads/creation surfaced when
38
+ * present so cost trackers can see them).
39
+ * - Anthropic `RawMessageStreamEvent` → normalized `StreamEvent`
40
+ * stream — buffers tool-use input JSON deltas and emits the parsed
41
+ * object on `content_block_stop` so consumers don't have to
42
+ * re-implement the buffer.
43
+ *
44
+ * Constructor takes either an `apiKey` (the common case — instantiates
45
+ * the SDK internally) or a pre-built `client` (tests inject a stub
46
+ * implementing `client.messages.create(...)`; lets us drive end-to-end
47
+ * translation without monkey-patching the SDK module).
48
+ *
49
+ * Error normalization across providers lands in a later commit (along
50
+ * with `LLMProviderError`); for now SDK errors propagate as-is.
51
+ *
52
+ * Default model: `claude-opus-4-7` (the most capable Claude as of v4
53
+ * launch). Callers override per request via `opts.model`.
54
+ */
55
+
56
+ export interface AnthropicAdapterOptions {
57
+ /** Anthropic API key. Required unless `client` is supplied. */
58
+ apiKey?: string;
59
+ /** Override the default Anthropic API base URL. */
60
+ baseURL?: string;
61
+ /** Forwarded as `defaultHeaders` to the SDK. */
62
+ defaultHeaders?: Record<string, string>;
63
+ /**
64
+ * Pre-built / stubbed SDK client. When supplied, `apiKey` / `baseURL`
65
+ * are ignored — useful for tests and for shared client reuse.
66
+ */
67
+ client?: AnthropicMessagesClient;
68
+ /** Default `max_tokens` when caller doesn't supply one. Defaults 4096. */
69
+ defaultMaxTokens?: number;
70
+ }
71
+
72
+ /**
73
+ * Structural slice of `Anthropic` we actually call — narrows what tests
74
+ * have to stub. The real `Anthropic` client satisfies this trivially.
75
+ */
76
+ export interface AnthropicMessagesClient {
77
+ messages: {
78
+ create(
79
+ body: MessageCreateParamsNonStreaming,
80
+ options?: { signal?: AbortSignal },
81
+ ): Promise<AnthropicMessage>;
82
+ create(
83
+ body: MessageCreateParamsStreaming,
84
+ options?: { signal?: AbortSignal },
85
+ ): Promise<AsyncIterable<RawMessageStreamEvent>>;
86
+ create(
87
+ body: MessageCreateParamsBase,
88
+ options?: { signal?: AbortSignal },
89
+ ): Promise<AnthropicMessage | AsyncIterable<RawMessageStreamEvent>>;
90
+ };
91
+ }
92
+
93
+ const DEFAULT_MAX_TOKENS = 4096;
94
+ const DEFAULT_MODEL = "claude-opus-4-7";
95
+
96
+ export class AnthropicAdapter implements LLMProvider {
97
+ readonly name = "anthropic";
98
+
99
+ private readonly client: AnthropicMessagesClient;
100
+ private readonly defaultMaxTokens: number;
101
+
102
+ constructor(opts: AnthropicAdapterOptions = {}) {
103
+ if (opts.client) {
104
+ this.client = opts.client;
105
+ } else {
106
+ if (!opts.apiKey) {
107
+ throw new Error("AnthropicAdapter requires `apiKey` or a pre-built `client`");
108
+ }
109
+ this.client = new Anthropic({
110
+ apiKey: opts.apiKey,
111
+ baseURL: opts.baseURL,
112
+ defaultHeaders: opts.defaultHeaders,
113
+ }) as unknown as AnthropicMessagesClient;
114
+ }
115
+ this.defaultMaxTokens = opts.defaultMaxTokens ?? DEFAULT_MAX_TOKENS;
116
+ }
117
+
118
+ async complete(opts: CompleteOptions): Promise<CompleteResult> {
119
+ const body = this.buildRequestBody(opts, false) as MessageCreateParamsNonStreaming;
120
+ const response = (await this.client.messages.create(body, {
121
+ signal: opts.signal,
122
+ })) as AnthropicMessage;
123
+ return this.translateResponse(response);
124
+ }
125
+
126
+ async *streamComplete(opts: StreamCompleteOptions): AsyncIterable<StreamEvent> {
127
+ const body = this.buildRequestBody(opts, true) as MessageCreateParamsStreaming;
128
+ const stream = (await this.client.messages.create(body, {
129
+ signal: opts.signal,
130
+ })) as AsyncIterable<RawMessageStreamEvent>;
131
+
132
+ // Indexed buffers: Anthropic identifies content blocks by `index` (a
133
+ // turn-local integer); we map index → adapter-issued ID + buffered
134
+ // input JSON for tool-use blocks.
135
+ const blocks = new Map<
136
+ number,
137
+ { kind: "text" } | { kind: "tool_use"; id: string; name: string; jsonBuffer: string }
138
+ >();
139
+ let stopReason: StopReason = "unknown";
140
+ let stopSequence: string | undefined;
141
+ let usage: TokenUsage = { inputTokens: 0, outputTokens: 0 };
142
+
143
+ for await (const event of stream) {
144
+ switch (event.type) {
145
+ case "message_start": {
146
+ const msg = event.message;
147
+ usage = translateUsage(msg.usage);
148
+ yield { type: "start", id: msg.id, model: msg.model };
149
+ break;
150
+ }
151
+ case "content_block_start": {
152
+ const block = event.content_block;
153
+ if (block.type === "text") {
154
+ blocks.set(event.index, { kind: "text" });
155
+ } else if (block.type === "tool_use") {
156
+ blocks.set(event.index, {
157
+ kind: "tool_use",
158
+ id: block.id,
159
+ name: block.name,
160
+ jsonBuffer: "",
161
+ });
162
+ yield { type: "tool_use_start", id: block.id, name: block.name };
163
+ }
164
+ // Other block kinds (thinking, server_tool_use, …) are not yet
165
+ // surfaced through the cross-provider stream — adapters can
166
+ // expand the StreamEvent union in a later commit.
167
+ break;
168
+ }
169
+ case "content_block_delta": {
170
+ const block = blocks.get(event.index);
171
+ if (!block) break;
172
+ const delta = event.delta;
173
+ if (delta.type === "text_delta" && block.kind === "text") {
174
+ yield { type: "text_delta", delta: delta.text };
175
+ } else if (delta.type === "input_json_delta" && block.kind === "tool_use") {
176
+ block.jsonBuffer += delta.partial_json;
177
+ yield {
178
+ type: "tool_input_delta",
179
+ id: block.id,
180
+ partialJson: delta.partial_json,
181
+ };
182
+ }
183
+ break;
184
+ }
185
+ case "content_block_stop": {
186
+ const block = blocks.get(event.index);
187
+ if (block?.kind === "tool_use") {
188
+ const input = parseToolInput(block.jsonBuffer);
189
+ yield { type: "tool_use_end", id: block.id, input };
190
+ }
191
+ blocks.delete(event.index);
192
+ break;
193
+ }
194
+ case "message_delta": {
195
+ if (event.delta.stop_reason) stopReason = translateStopReason(event.delta.stop_reason);
196
+ if (event.delta.stop_sequence) stopSequence = event.delta.stop_sequence;
197
+ // Output tokens accumulate in message_delta's usage.
198
+ if (event.usage) {
199
+ usage = {
200
+ ...usage,
201
+ outputTokens: event.usage.output_tokens,
202
+ };
203
+ }
204
+ break;
205
+ }
206
+ case "message_stop": {
207
+ yield { type: "stop", stopReason, stopSequence, usage };
208
+ break;
209
+ }
210
+ }
211
+ }
212
+ }
213
+
214
+ // --- Translation helpers ------------------------------------------------
215
+
216
+ private buildRequestBody(
217
+ opts: CompleteOptions,
218
+ stream: boolean,
219
+ ): MessageCreateParamsBase & { stream?: boolean } {
220
+ const body: MessageCreateParamsBase & { stream?: boolean } = {
221
+ model: opts.model || DEFAULT_MODEL,
222
+ messages: opts.messages.map(toAnthropicMessage),
223
+ max_tokens: opts.maxTokens ?? this.defaultMaxTokens,
224
+ };
225
+ if (opts.system) body.system = opts.system;
226
+ if (opts.temperature !== undefined) body.temperature = opts.temperature;
227
+ if (opts.stopSequences?.length) body.stop_sequences = opts.stopSequences;
228
+ if (opts.tools?.length) body.tools = opts.tools.map(toAnthropicTool);
229
+ if (opts.toolChoice) body.tool_choice = toAnthropicToolChoice(opts.toolChoice);
230
+ if (opts.metadata) body.metadata = opts.metadata as { user_id?: string };
231
+ if (opts.providerOptions) Object.assign(body, opts.providerOptions);
232
+ if (stream) body.stream = true;
233
+ return body;
234
+ }
235
+
236
+ private translateResponse(response: AnthropicMessage): CompleteResult {
237
+ const content: MessageContentPart[] = [];
238
+ const extraBlocks: unknown[] = [];
239
+ for (const block of response.content) {
240
+ if (block.type === "text") {
241
+ content.push({ type: "text", text: block.text });
242
+ } else if (block.type === "tool_use") {
243
+ content.push({
244
+ type: "tool_use",
245
+ id: block.id,
246
+ name: block.name,
247
+ input: ((block as ToolUseBlock).input ?? {}) as Record<string, unknown>,
248
+ });
249
+ } else {
250
+ // Native blocks not on the cross-provider surface (thinking,
251
+ // redacted_thinking, citations, server_tool_use, …): pass them
252
+ // THROUGH `providerExtras` rather than drop them (AI-R1). The full
253
+ // untranslated response is also on `raw` below.
254
+ extraBlocks.push(block);
255
+ }
256
+ }
257
+ const text = content
258
+ .filter((p): p is { type: "text"; text: string } => p.type === "text")
259
+ .map((p) => p.text)
260
+ .join("");
261
+
262
+ const result: CompleteResult = {
263
+ id: response.id,
264
+ model: response.model,
265
+ content,
266
+ text,
267
+ stopReason: translateStopReason(response.stop_reason),
268
+ stopSequence: response.stop_sequence ?? undefined,
269
+ usage: translateUsage(response.usage),
270
+ raw: response,
271
+ };
272
+ if (extraBlocks.length > 0) result.providerExtras = { blocks: extraBlocks };
273
+ return result;
274
+ }
275
+ }
276
+
277
+ function toAnthropicMessage(msg: Message): MessageParam {
278
+ // Anthropic supports user/assistant roles in the messages array;
279
+ // tool-result messages are encoded as user messages with a
280
+ // `tool_result` content block per Anthropic API convention.
281
+ const role: MessageParam["role"] = msg.role === "assistant" ? "assistant" : "user";
282
+
283
+ if (typeof msg.content === "string") {
284
+ return { role, content: msg.content };
285
+ }
286
+
287
+ // biome-ignore lint/suspicious/useIterableCallbackReturn: MessageContentPart is a closed discriminated union and every member returns.
288
+ const blocks = msg.content.map((part) => {
289
+ switch (part.type) {
290
+ case "text":
291
+ return { type: "text", text: part.text } as const;
292
+ case "tool_use":
293
+ return {
294
+ type: "tool_use",
295
+ id: part.id,
296
+ name: part.name,
297
+ input: part.input,
298
+ } as const;
299
+ case "tool_result":
300
+ return {
301
+ type: "tool_result",
302
+ tool_use_id: part.toolUseId,
303
+ content: part.content,
304
+ is_error: part.isError ?? false,
305
+ } as const;
306
+ case "image":
307
+ return {
308
+ type: "image",
309
+ source: {
310
+ type: "base64" as const,
311
+ media_type: part.mediaType,
312
+ data: part.data,
313
+ },
314
+ } as const;
315
+ }
316
+ });
317
+
318
+ return { role, content: blocks } as MessageParam;
319
+ }
320
+
321
+ function toAnthropicTool(tool: ToolDefinition): AnthropicTool {
322
+ return {
323
+ name: tool.name,
324
+ description: tool.description,
325
+ input_schema: tool.inputSchema as AnthropicTool["input_schema"],
326
+ };
327
+ }
328
+
329
+ function toAnthropicToolChoice(choice: ToolChoice): AnthropicToolChoice {
330
+ switch (choice.type) {
331
+ case "auto":
332
+ return { type: "auto" };
333
+ case "any":
334
+ return { type: "any" };
335
+ case "none":
336
+ return { type: "none" };
337
+ case "tool":
338
+ return { type: "tool", name: choice.name };
339
+ }
340
+ }
341
+
342
+ function translateStopReason(
343
+ reason: AnthropicMessage["stop_reason"] | string | null | undefined,
344
+ ): StopReason {
345
+ switch (reason) {
346
+ case "end_turn":
347
+ case "max_tokens":
348
+ case "stop_sequence":
349
+ case "tool_use":
350
+ return reason;
351
+ case "refusal":
352
+ return "content_filter";
353
+ case "pause_turn":
354
+ // Treat extended-thinking pause as end-of-turn for cross-provider
355
+ // simplicity; consumers needing the distinction should target the
356
+ // Anthropic SDK directly.
357
+ return "end_turn";
358
+ default:
359
+ return "unknown";
360
+ }
361
+ }
362
+
363
+ function translateUsage(usage: AnthropicMessage["usage"]): TokenUsage {
364
+ return {
365
+ inputTokens: usage.input_tokens,
366
+ outputTokens: usage.output_tokens,
367
+ cacheReadInputTokens: usage.cache_read_input_tokens ?? undefined,
368
+ cacheCreationInputTokens: usage.cache_creation_input_tokens ?? undefined,
369
+ raw: usage,
370
+ };
371
+ }
372
+
373
+ function parseToolInput(buffer: string): Record<string, unknown> {
374
+ if (!buffer) return {};
375
+ try {
376
+ return JSON.parse(buffer) as Record<string, unknown>;
377
+ } catch {
378
+ // The Anthropic stream guarantees valid JSON when complete; if we
379
+ // get here the upstream call was canceled mid-stream.
380
+ return { __ship_api_partial: buffer };
381
+ }
382
+ }