@elevasis/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (564) hide show
  1. package/dist/index.d.ts +435 -0
  2. package/dist/index.js +403 -0
  3. package/dist/organization-model/index.d.ts +435 -0
  4. package/dist/organization-model/index.js +403 -0
  5. package/package.json +62 -0
  6. package/src/README.md +34 -0
  7. package/src/__tests__/observability-exports.test.ts +36 -0
  8. package/src/__tests__/publish.test.ts +18 -0
  9. package/src/__tests__/template-foundations-compatibility.test.ts +34 -0
  10. package/src/auth/index.ts +8 -0
  11. package/src/auth/multi-tenancy/credentials/README.md +38 -0
  12. package/src/auth/multi-tenancy/credentials/__tests__/encryption.test.ts +216 -0
  13. package/src/auth/multi-tenancy/credentials/__tests__/service.test.ts +174 -0
  14. package/src/auth/multi-tenancy/credentials/index.ts +6 -0
  15. package/src/auth/multi-tenancy/credentials/server/encryption.ts +39 -0
  16. package/src/auth/multi-tenancy/credentials/server/service.ts +60 -0
  17. package/src/auth/multi-tenancy/index.ts +17 -0
  18. package/src/auth/multi-tenancy/invitations/__tests__/invitation.test.ts +237 -0
  19. package/src/auth/multi-tenancy/invitations/api-schemas.ts +107 -0
  20. package/src/auth/multi-tenancy/invitations/index.ts +38 -0
  21. package/src/auth/multi-tenancy/invitations/invitation.ts +86 -0
  22. package/src/auth/multi-tenancy/invitations/server/index.ts +25 -0
  23. package/src/auth/multi-tenancy/invitations/server/transforms.ts +24 -0
  24. package/src/auth/multi-tenancy/invitations/server/workos.ts +24 -0
  25. package/src/auth/multi-tenancy/invitations/supabase.ts +50 -0
  26. package/src/auth/multi-tenancy/memberships/__tests__/membership.test.ts +227 -0
  27. package/src/auth/multi-tenancy/memberships/__tests__/supabase-transforms.test.ts +88 -0
  28. package/src/auth/multi-tenancy/memberships/__tests__/workos-transforms.test.ts +139 -0
  29. package/src/auth/multi-tenancy/memberships/api-schemas.ts +126 -0
  30. package/src/auth/multi-tenancy/memberships/index.ts +22 -0
  31. package/src/auth/multi-tenancy/memberships/membership.ts +138 -0
  32. package/src/auth/multi-tenancy/memberships/server/index.ts +15 -0
  33. package/src/auth/multi-tenancy/memberships/server/transforms.ts +32 -0
  34. package/src/auth/multi-tenancy/memberships/server/workos.ts +21 -0
  35. package/src/auth/multi-tenancy/memberships/supabase.ts +46 -0
  36. package/src/auth/multi-tenancy/organizations/__tests__/organization.test.ts +249 -0
  37. package/src/auth/multi-tenancy/organizations/api-schemas.ts +128 -0
  38. package/src/auth/multi-tenancy/organizations/index.ts +23 -0
  39. package/src/auth/multi-tenancy/organizations/organization.ts +25 -0
  40. package/src/auth/multi-tenancy/organizations/server/index.ts +10 -0
  41. package/src/auth/multi-tenancy/organizations/server/transforms.ts +35 -0
  42. package/src/auth/multi-tenancy/organizations/server/workos.ts +20 -0
  43. package/src/auth/multi-tenancy/types.ts +89 -0
  44. package/src/auth/multi-tenancy/users/__tests__/user.test.ts +208 -0
  45. package/src/auth/multi-tenancy/users/api-schemas.ts +194 -0
  46. package/src/auth/multi-tenancy/users/index.ts +28 -0
  47. package/src/auth/multi-tenancy/users/server/index.ts +19 -0
  48. package/src/auth/multi-tenancy/users/server/transforms.ts +21 -0
  49. package/src/auth/multi-tenancy/users/server/workos.ts +16 -0
  50. package/src/auth/multi-tenancy/users/user.ts +65 -0
  51. package/src/business/acquisition/api-schemas.ts +759 -0
  52. package/src/business/acquisition/index.ts +109 -0
  53. package/src/business/acquisition/types.ts +400 -0
  54. package/src/business/crm/api-schemas.ts +75 -0
  55. package/src/business/delivery/index.ts +1 -0
  56. package/src/business/delivery/types.ts +89 -0
  57. package/src/business/index.ts +12 -0
  58. package/src/business/pdf/assets/ElevasisLogo.png +0 -0
  59. package/src/business/pdf/browser/image-utils.ts +74 -0
  60. package/src/business/pdf/browser/index.ts +16 -0
  61. package/src/business/pdf/browser/pdfmake-browser.ts +229 -0
  62. package/src/business/pdf/index.ts +10 -0
  63. package/src/business/pdf/sections/acceptance.ts +112 -0
  64. package/src/business/pdf/sections/automation.ts +56 -0
  65. package/src/business/pdf/sections/cover.ts +51 -0
  66. package/src/business/pdf/sections/index.ts +57 -0
  67. package/src/business/pdf/sections/investment.ts +69 -0
  68. package/src/business/pdf/sections/proposal-document.ts +200 -0
  69. package/src/business/pdf/sections/summary-investment.ts +124 -0
  70. package/src/business/pdf/sections/summary.ts +55 -0
  71. package/src/business/pdf/sections/table-summary.ts +59 -0
  72. package/src/business/pdf/sections/types.ts +124 -0
  73. package/src/business/pdf/server/__tests__/pdfmake-test.ts +219 -0
  74. package/src/business/pdf/server/index.ts +21 -0
  75. package/src/business/pdf/server/pdfmake-service.ts +237 -0
  76. package/src/business/pdf/server/themes/default.ts +8 -0
  77. package/src/business/pdf/server/themes/index.ts +9 -0
  78. package/src/business/pdf/server/themes/types.ts +8 -0
  79. package/src/business/pdf/shared/convert.ts +514 -0
  80. package/src/business/pdf/shared/index.ts +12 -0
  81. package/src/business/pdf/themes.ts +78 -0
  82. package/src/business/pdf/types.ts +272 -0
  83. package/src/business/seo/__tests__/linking.test.ts +549 -0
  84. package/src/business/seo/__tests__/types.test.ts +404 -0
  85. package/src/business/seo/index.ts +2 -0
  86. package/src/business/seo/linking.ts +281 -0
  87. package/src/business/seo/types.ts +199 -0
  88. package/src/commands/index.ts +8 -0
  89. package/src/commands/queue/index.ts +3 -0
  90. package/src/commands/queue/schemas.test.ts +593 -0
  91. package/src/commands/queue/schemas.ts +125 -0
  92. package/src/commands/queue/sse-events.ts +61 -0
  93. package/src/commands/queue/types/action.ts +52 -0
  94. package/src/commands/queue/types/checkpoint.ts +44 -0
  95. package/src/commands/queue/types/index.ts +7 -0
  96. package/src/commands/queue/types/task.ts +116 -0
  97. package/src/commands/queue/types.ts +14 -0
  98. package/src/content/distribution-metadata.ts +61 -0
  99. package/src/content/index.ts +10 -0
  100. package/src/deployments/index.ts +22 -0
  101. package/src/execution/calibration/__tests__/schemas.test.ts +320 -0
  102. package/src/execution/calibration/index.ts +3 -0
  103. package/src/execution/calibration/schemas.ts +121 -0
  104. package/src/execution/calibration/sse-events.ts +125 -0
  105. package/src/execution/calibration/types.ts +190 -0
  106. package/src/execution/core/__tests__/api-schemas.test.ts +667 -0
  107. package/src/execution/core/__tests__/archived-logs.test.ts +72 -0
  108. package/src/execution/core/api-schemas.ts +312 -0
  109. package/src/execution/core/index.ts +11 -0
  110. package/src/execution/core/resource-validator.test.ts +63 -0
  111. package/src/execution/core/runner-types.ts +80 -0
  112. package/src/execution/core/server/environment.ts +31 -0
  113. package/src/execution/core/sse-executions.ts +119 -0
  114. package/src/execution/core/types.ts +29 -0
  115. package/src/execution/engine/__tests__/fixtures/index.ts +2 -0
  116. package/src/execution/engine/__tests__/fixtures/mock-scenarios.ts +60 -0
  117. package/src/execution/engine/__tests__/fixtures/test-agents.ts +85 -0
  118. package/src/execution/engine/__tests__/integration/agent-framework.integration.test.ts +1031 -0
  119. package/src/execution/engine/__tests__/timeout.test.ts +565 -0
  120. package/src/execution/engine/agent/__tests__/errors.test.ts +508 -0
  121. package/src/execution/engine/agent/actions/__tests__/processor.test.ts +531 -0
  122. package/src/execution/engine/agent/actions/executor.ts +205 -0
  123. package/src/execution/engine/agent/actions/navigate-knowledge-executor.ts +230 -0
  124. package/src/execution/engine/agent/actions/processor.ts +116 -0
  125. package/src/execution/engine/agent/actions/types.ts +70 -0
  126. package/src/execution/engine/agent/core/__tests__/agent.test.ts +614 -0
  127. package/src/execution/engine/agent/core/__tests__/error-passthrough.test.ts +134 -0
  128. package/src/execution/engine/agent/core/agent.ts +810 -0
  129. package/src/execution/engine/agent/core/types.ts +155 -0
  130. package/src/execution/engine/agent/errors.ts +251 -0
  131. package/src/execution/engine/agent/index.ts +78 -0
  132. package/src/execution/engine/agent/knowledge-map/__tests__/navigate-knowledge-executor.test.ts +580 -0
  133. package/src/execution/engine/agent/knowledge-map/__tests__/utils.test.ts +622 -0
  134. package/src/execution/engine/agent/knowledge-map/types.ts +106 -0
  135. package/src/execution/engine/agent/knowledge-map/utils.ts +101 -0
  136. package/src/execution/engine/agent/memory/__tests__/domains.test.ts +72 -0
  137. package/src/execution/engine/agent/memory/__tests__/manager.test.ts +754 -0
  138. package/src/execution/engine/agent/memory/__tests__/utils.test.ts +285 -0
  139. package/src/execution/engine/agent/memory/domains.ts +99 -0
  140. package/src/execution/engine/agent/memory/manager.ts +365 -0
  141. package/src/execution/engine/agent/memory/processor.ts +66 -0
  142. package/src/execution/engine/agent/memory/types.ts +90 -0
  143. package/src/execution/engine/agent/memory/utils.ts +134 -0
  144. package/src/execution/engine/agent/observability/logging.ts +467 -0
  145. package/src/execution/engine/agent/observability/types.ts +64 -0
  146. package/src/execution/engine/agent/reasoning/__tests__/request-builder.test.ts +209 -0
  147. package/src/execution/engine/agent/reasoning/adapters/agent-adapter-helpers.ts +349 -0
  148. package/src/execution/engine/agent/reasoning/processor.ts +92 -0
  149. package/src/execution/engine/agent/reasoning/prompt-sections/base-actions.ts +134 -0
  150. package/src/execution/engine/agent/reasoning/prompt-sections/completion.ts +49 -0
  151. package/src/execution/engine/agent/reasoning/prompt-sections/knowledge-map.ts +93 -0
  152. package/src/execution/engine/agent/reasoning/prompt-sections/memory.ts +65 -0
  153. package/src/execution/engine/agent/reasoning/prompt-sections/security.ts +32 -0
  154. package/src/execution/engine/agent/reasoning/prompt-sections/tools.ts +44 -0
  155. package/src/execution/engine/agent/reasoning/request-builder.ts +169 -0
  156. package/src/execution/engine/agent/reasoning/types.ts +18 -0
  157. package/src/execution/engine/base/__tests__/errors.test.ts +246 -0
  158. package/src/execution/engine/base/__tests__/serialization.test.ts +670 -0
  159. package/src/execution/engine/base/__tests__/utils.test.ts +45 -0
  160. package/src/execution/engine/base/errors.ts +118 -0
  161. package/src/execution/engine/base/index.ts +2 -0
  162. package/src/execution/engine/base/logging.ts +31 -0
  163. package/src/execution/engine/base/serialization.ts +324 -0
  164. package/src/execution/engine/base/types.ts +126 -0
  165. package/src/execution/engine/base/utils.ts +41 -0
  166. package/src/execution/engine/index.ts +440 -0
  167. package/src/execution/engine/interface/index.ts +1 -0
  168. package/src/execution/engine/interface/types.ts +62 -0
  169. package/src/execution/engine/llm/__tests__/errors.test.ts +318 -0
  170. package/src/execution/engine/llm/__tests__/input-sanitizer.test.ts +286 -0
  171. package/src/execution/engine/llm/__tests__/model-info.test.ts +50 -0
  172. package/src/execution/engine/llm/__tests__/model-validation.test.ts +321 -0
  173. package/src/execution/engine/llm/__tests__/response-schema-validator.test.ts +115 -0
  174. package/src/execution/engine/llm/adapters/__tests__/adapter-factory.test.ts +375 -0
  175. package/src/execution/engine/llm/adapters/__tests__/anthropic-adapter.test.ts +463 -0
  176. package/src/execution/engine/llm/adapters/__tests__/anthropic.integration.test.ts +177 -0
  177. package/src/execution/engine/llm/adapters/__tests__/circuit-breaker-error.test.ts +94 -0
  178. package/src/execution/engine/llm/adapters/__tests__/google-adapter.test.ts +722 -0
  179. package/src/execution/engine/llm/adapters/__tests__/google.integration.test.ts +376 -0
  180. package/src/execution/engine/llm/adapters/__tests__/mock-adapter.test.ts +432 -0
  181. package/src/execution/engine/llm/adapters/__tests__/openai-adapter.test.ts +551 -0
  182. package/src/execution/engine/llm/adapters/__tests__/openrouter-adapter.test.ts +563 -0
  183. package/src/execution/engine/llm/adapters/__tests__/openrouter.integration.test.ts +105 -0
  184. package/src/execution/engine/llm/adapters/__tests__/universal-adapter.test.ts +537 -0
  185. package/src/execution/engine/llm/adapters/circuit-breaker.ts +147 -0
  186. package/src/execution/engine/llm/adapters/index.ts +17 -0
  187. package/src/execution/engine/llm/adapters/mock-adapter.ts +116 -0
  188. package/src/execution/engine/llm/adapters/server/adapter-factory.ts +130 -0
  189. package/src/execution/engine/llm/adapters/server/anthropic.ts +137 -0
  190. package/src/execution/engine/llm/adapters/server/compose-signal.ts +18 -0
  191. package/src/execution/engine/llm/adapters/server/google.ts +283 -0
  192. package/src/execution/engine/llm/adapters/server/index.ts +12 -0
  193. package/src/execution/engine/llm/adapters/server/openai.ts +206 -0
  194. package/src/execution/engine/llm/adapters/server/openrouter.ts +235 -0
  195. package/src/execution/engine/llm/adapters/universal-adapter.ts +230 -0
  196. package/src/execution/engine/llm/errors.ts +186 -0
  197. package/src/execution/engine/llm/input-sanitizer.ts +129 -0
  198. package/src/execution/engine/llm/model-info.ts +332 -0
  199. package/src/execution/engine/llm/response-schema-validator.ts +113 -0
  200. package/src/execution/engine/llm/types.ts +86 -0
  201. package/src/execution/engine/test-utils/index.ts +6 -0
  202. package/src/execution/engine/test-utils/mocks.ts +56 -0
  203. package/src/execution/engine/tools/__tests__/tooling-error.test.ts +265 -0
  204. package/src/execution/engine/tools/__tests__/types.test.ts +47 -0
  205. package/src/execution/engine/tools/integration/base-integration-adapter.ts +50 -0
  206. package/src/execution/engine/tools/integration/index.ts +53 -0
  207. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-adapter.ts +73 -0
  208. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-tools.ts +209 -0
  209. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-company-email/index.ts +82 -0
  210. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-decision-maker-email/index.ts +122 -0
  211. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-person-email/index.ts +89 -0
  212. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/verify-email/index.ts +84 -0
  213. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/index.ts +16 -0
  214. package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +293 -0
  215. package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +100 -0
  216. package/src/execution/engine/tools/integration/server/adapters/apify/apify-tools.ts +217 -0
  217. package/src/execution/engine/tools/integration/server/adapters/apify/fetch/get-dataset-items/index.ts +92 -0
  218. package/src/execution/engine/tools/integration/server/adapters/apify/fetch/run-actor/index.ts +218 -0
  219. package/src/execution/engine/tools/integration/server/adapters/apify/fetch/start-actor/index.ts +87 -0
  220. package/src/execution/engine/tools/integration/server/adapters/apify/index.ts +11 -0
  221. package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +362 -0
  222. package/src/execution/engine/tools/integration/server/adapters/attio/attio-adapter.ts +162 -0
  223. package/src/execution/engine/tools/integration/server/adapters/attio/attio-tools.ts +594 -0
  224. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/README.md +632 -0
  225. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-attribute/index.ts +214 -0
  226. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-note/index.ts +152 -0
  227. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-record/index.ts +141 -0
  228. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-note/index.ts +86 -0
  229. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-record/index.ts +105 -0
  230. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.test.ts +186 -0
  231. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.ts +118 -0
  232. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-attributes/index.ts +165 -0
  233. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-notes/index.ts +96 -0
  234. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-objects/index.ts +104 -0
  235. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.test.ts +338 -0
  236. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.ts +156 -0
  237. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-attribute/index.ts +220 -0
  238. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-record/index.ts +140 -0
  239. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/utils/types.ts +147 -0
  240. package/src/execution/engine/tools/integration/server/adapters/attio/index.ts +31 -0
  241. package/src/execution/engine/tools/integration/server/adapters/dropbox/__tests__/dropbox-adapter.test.ts +409 -0
  242. package/src/execution/engine/tools/integration/server/adapters/dropbox/dropbox-adapter.ts +281 -0
  243. package/src/execution/engine/tools/integration/server/adapters/dropbox/dropbox-tools.ts +106 -0
  244. package/src/execution/engine/tools/integration/server/adapters/dropbox/fetch/create-folder/__tests__/index.test.ts +451 -0
  245. package/src/execution/engine/tools/integration/server/adapters/dropbox/fetch/create-folder/index.ts +114 -0
  246. package/src/execution/engine/tools/integration/server/adapters/dropbox/fetch/upload-file/__tests__/index.test.ts +415 -0
  247. package/src/execution/engine/tools/integration/server/adapters/dropbox/fetch/upload-file/index.ts +111 -0
  248. package/src/execution/engine/tools/integration/server/adapters/dropbox/index.ts +25 -0
  249. package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +210 -0
  250. package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +104 -0
  251. package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -0
  252. package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-adapter.ts +1189 -0
  253. package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-tools.ts +641 -0
  254. package/src/execution/engine/tools/integration/server/adapters/google-sheets/index.ts +18 -0
  255. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/activate-campaign/index.ts +86 -0
  256. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/__tests__/index.test.ts +289 -0
  257. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/index.ts +154 -0
  258. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/__tests__/index.test.ts +325 -0
  259. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/index.ts +153 -0
  260. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-delete-leads/index.ts +84 -0
  261. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-campaign/index.ts +125 -0
  262. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-inbox-test/index.ts +107 -0
  263. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/delete-campaign/index.ts +85 -0
  264. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-account-health/index.ts +91 -0
  265. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign/index.ts +92 -0
  266. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/__tests__/index.test.ts +195 -0
  267. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/index.ts +113 -0
  268. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-daily-campaign-analytics/index.ts +104 -0
  269. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-emails/index.ts +155 -0
  270. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/__tests__/index.test.ts +196 -0
  271. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/index.ts +102 -0
  272. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/__tests__/index.test.ts +189 -0
  273. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/index.ts +87 -0
  274. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-leads/index.ts +112 -0
  275. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/patch-lead/index.ts +76 -0
  276. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/pause-campaign/index.ts +86 -0
  277. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/remove-from-subsequence/index.ts +98 -0
  278. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/send-reply/index.ts +126 -0
  279. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/__tests__/index.test.ts +193 -0
  280. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/index.ts +99 -0
  281. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/__tests__/index.test.ts +621 -0
  282. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/index.ts +125 -0
  283. package/src/execution/engine/tools/integration/server/adapters/instantly/index.ts +29 -0
  284. package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-adapter.ts +178 -0
  285. package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1473 -0
  286. package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/check-credits/index.ts +59 -0
  287. package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/verify-email/index.ts +102 -0
  288. package/src/execution/engine/tools/integration/server/adapters/millionverifier/index.ts +17 -0
  289. package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-adapter.ts +80 -0
  290. package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +102 -0
  291. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/get-email/index.ts +102 -0
  292. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +134 -0
  293. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +75 -0
  294. package/src/execution/engine/tools/integration/server/adapters/resend/index.ts +27 -0
  295. package/src/execution/engine/tools/integration/server/adapters/resend/resend-adapter.ts +108 -0
  296. package/src/execution/engine/tools/integration/server/adapters/resend/resend-tools.ts +132 -0
  297. package/src/execution/engine/tools/integration/server/adapters/resend/types.ts +44 -0
  298. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/create-envelope/index.ts +274 -0
  299. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/download-document/index.ts +230 -0
  300. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/get-envelope/index.ts +133 -0
  301. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/utils/types.ts +246 -0
  302. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/void-envelope/index.ts +90 -0
  303. package/src/execution/engine/tools/integration/server/adapters/signature-api/index.ts +38 -0
  304. package/src/execution/engine/tools/integration/server/adapters/signature-api/signature-api-adapter.ts +87 -0
  305. package/src/execution/engine/tools/integration/server/adapters/signature-api/signature-api-tools.ts +179 -0
  306. package/src/execution/engine/tools/integration/server/adapters/stripe/fetch/utils/types.ts +210 -0
  307. package/src/execution/engine/tools/integration/server/adapters/stripe/index.ts +44 -0
  308. package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-adapter.ts +517 -0
  309. package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +309 -0
  310. package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/domain-search/index.ts +133 -0
  311. package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-finder/index.ts +122 -0
  312. package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-verifier/index.ts +111 -0
  313. package/src/execution/engine/tools/integration/server/adapters/tomba/index.ts +11 -0
  314. package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-adapter.ts +78 -0
  315. package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-tools.ts +222 -0
  316. package/src/execution/engine/tools/integration/server/index.ts +61 -0
  317. package/src/execution/engine/tools/integration/service.ts +161 -0
  318. package/src/execution/engine/tools/integration/tool.ts +253 -0
  319. package/src/execution/engine/tools/integration/types/anymailfinder.ts +74 -0
  320. package/src/execution/engine/tools/integration/types/apify.ts +92 -0
  321. package/src/execution/engine/tools/integration/types/attio.ts +354 -0
  322. package/src/execution/engine/tools/integration/types/dropbox.ts +64 -0
  323. package/src/execution/engine/tools/integration/types/gmail.ts +35 -0
  324. package/src/execution/engine/tools/integration/types/google-sheets.ts +303 -0
  325. package/src/execution/engine/tools/integration/types/index.ts +19 -0
  326. package/src/execution/engine/tools/integration/types/instantly.ts +557 -0
  327. package/src/execution/engine/tools/integration/types/millionverifier.ts +56 -0
  328. package/src/execution/engine/tools/integration/types/resend.ts +63 -0
  329. package/src/execution/engine/tools/integration/types/signature-api.ts +164 -0
  330. package/src/execution/engine/tools/integration/types/stripe.ts +162 -0
  331. package/src/execution/engine/tools/integration/types/tomba.ts +94 -0
  332. package/src/execution/engine/tools/lead-service-types.ts +884 -0
  333. package/src/execution/engine/tools/llm/index.ts +11 -0
  334. package/src/execution/engine/tools/llm/server/index.ts +8 -0
  335. package/src/execution/engine/tools/llm/server/llm-call-tool.ts +118 -0
  336. package/src/execution/engine/tools/platform/__tests__/approval.test.ts +242 -0
  337. package/src/execution/engine/tools/platform/__tests__/email.test.ts +482 -0
  338. package/src/execution/engine/tools/platform/__tests__/hitl-cancel.test.ts +97 -0
  339. package/src/execution/engine/tools/platform/__tests__/notification.test.ts +208 -0
  340. package/src/execution/engine/tools/platform/__tests__/pdf.test.ts +441 -0
  341. package/src/execution/engine/tools/platform/__tests__/scheduler.test.ts +189 -0
  342. package/src/execution/engine/tools/platform/__tests__/schedules.test.ts +336 -0
  343. package/src/execution/engine/tools/platform/acquisition/company-tools.ts +248 -0
  344. package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +319 -0
  345. package/src/execution/engine/tools/platform/acquisition/index.ts +43 -0
  346. package/src/execution/engine/tools/platform/acquisition/list-tools.ts +148 -0
  347. package/src/execution/engine/tools/platform/acquisition/types.ts +260 -0
  348. package/src/execution/engine/tools/platform/approval/cancel-by-metadata.ts +65 -0
  349. package/src/execution/engine/tools/platform/approval/index.ts +4 -0
  350. package/src/execution/engine/tools/platform/approval/tool.ts +99 -0
  351. package/src/execution/engine/tools/platform/email/index.ts +122 -0
  352. package/src/execution/engine/tools/platform/email/types.ts +96 -0
  353. package/src/execution/engine/tools/platform/index.ts +181 -0
  354. package/src/execution/engine/tools/platform/notification.ts +81 -0
  355. package/src/execution/engine/tools/platform/pdf/index.ts +110 -0
  356. package/src/execution/engine/tools/platform/pdf/types.ts +77 -0
  357. package/src/execution/engine/tools/platform/resource-invocation/__tests__/edge-cases.test.ts +507 -0
  358. package/src/execution/engine/tools/platform/resource-invocation/__tests__/resource-invocation-service.test.ts +500 -0
  359. package/src/execution/engine/tools/platform/resource-invocation/__tests__/tool.test.ts +555 -0
  360. package/src/execution/engine/tools/platform/resource-invocation/dynamic-tool.ts +94 -0
  361. package/src/execution/engine/tools/platform/resource-invocation/index.ts +14 -0
  362. package/src/execution/engine/tools/platform/resource-invocation/resource-invocation-service.ts +147 -0
  363. package/src/execution/engine/tools/platform/resource-invocation/tool.ts +115 -0
  364. package/src/execution/engine/tools/platform/resource-invocation/types.ts +31 -0
  365. package/src/execution/engine/tools/platform/scheduler.ts +87 -0
  366. package/src/execution/engine/tools/platform/schedules/cancel-by-key-tool.ts +48 -0
  367. package/src/execution/engine/tools/platform/schedules/cancel-by-metadata-tool.ts +42 -0
  368. package/src/execution/engine/tools/platform/schedules/delete-by-key-tool.ts +43 -0
  369. package/src/execution/engine/tools/platform/schedules/index.ts +13 -0
  370. package/src/execution/engine/tools/platform/schedules/list-tool.ts +56 -0
  371. package/src/execution/engine/tools/platform/schedules/types.ts +88 -0
  372. package/src/execution/engine/tools/platform/storage/__tests__/storage.test.ts +998 -0
  373. package/src/execution/engine/tools/platform/storage/index.ts +370 -0
  374. package/src/execution/engine/tools/platform/storage/types.ts +128 -0
  375. package/src/execution/engine/tools/platform/types.ts +148 -0
  376. package/src/execution/engine/tools/registry.ts +590 -0
  377. package/src/execution/engine/tools/tool-maps.ts +694 -0
  378. package/src/execution/engine/tools/types.ts +233 -0
  379. package/src/execution/engine/workflow/__tests__/errors.test.ts +139 -0
  380. package/src/execution/engine/workflow/__tests__/utils.test.ts +645 -0
  381. package/src/execution/engine/workflow/__tests__/workflow.test.ts +818 -0
  382. package/src/execution/engine/workflow/errors.ts +63 -0
  383. package/src/execution/engine/workflow/helpers/index.ts +11 -0
  384. package/src/execution/engine/workflow/helpers/server/index.ts +8 -0
  385. package/src/execution/engine/workflow/helpers/server/llm-call.ts +93 -0
  386. package/src/execution/engine/workflow/index.ts +19 -0
  387. package/src/execution/engine/workflow/log-truncate.ts +26 -0
  388. package/src/execution/engine/workflow/logging.ts +191 -0
  389. package/src/execution/engine/workflow/types.ts +183 -0
  390. package/src/execution/engine/workflow/utils.ts +280 -0
  391. package/src/execution/engine/workflow/workflow.ts +168 -0
  392. package/src/execution/index.ts +20 -0
  393. package/src/execution/scheduler/__tests__/api-schemas.test.ts +733 -0
  394. package/src/execution/scheduler/__tests__/retry.test.ts +37 -0
  395. package/src/execution/scheduler/__tests__/utils.test.ts +1009 -0
  396. package/src/execution/scheduler/api-schemas.ts +296 -0
  397. package/src/execution/scheduler/index.ts +50 -0
  398. package/src/execution/scheduler/schemas.ts +264 -0
  399. package/src/execution/scheduler/types.ts +111 -0
  400. package/src/execution/scheduler/utils.ts +364 -0
  401. package/src/forms/index.ts +7 -0
  402. package/src/forms/schemas.test.ts +113 -0
  403. package/src/forms/schemas.ts +69 -0
  404. package/src/forms/types.ts +70 -0
  405. package/src/index.ts +54 -0
  406. package/src/integrations/credentials/__tests__/api-schemas.test.ts +496 -0
  407. package/src/integrations/credentials/__tests__/schemas.test.ts +82 -0
  408. package/src/integrations/credentials/__tests__/utils.test.ts +144 -0
  409. package/src/integrations/credentials/api-schemas.ts +143 -0
  410. package/src/integrations/credentials/index.ts +32 -0
  411. package/src/integrations/credentials/schemas.ts +164 -0
  412. package/src/integrations/credentials/utils.ts +59 -0
  413. package/src/integrations/oauth/__tests__/provider-registry.test.ts +59 -0
  414. package/src/integrations/oauth/api-schemas.ts +92 -0
  415. package/src/integrations/oauth/index.ts +19 -0
  416. package/src/integrations/oauth/provider-registry.ts +61 -0
  417. package/src/integrations/oauth/server/__tests__/refresh-concurrent.test.ts +183 -0
  418. package/src/integrations/oauth/server/__tests__/refresh.integration.test.ts +257 -0
  419. package/src/integrations/oauth/server/__tests__/refresh.test.ts +577 -0
  420. package/src/integrations/oauth/server/credentials.ts +39 -0
  421. package/src/integrations/oauth/server/refresh.ts +214 -0
  422. package/src/integrations/oauth/types.ts +34 -0
  423. package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +318 -0
  424. package/src/integrations/webhook-endpoints/api-schemas.ts +102 -0
  425. package/src/integrations/webhook-endpoints/index.ts +28 -0
  426. package/src/integrations/webhook-endpoints/types.ts +51 -0
  427. package/src/operations/activities/api-schemas.ts +79 -0
  428. package/src/operations/activities/index.ts +9 -0
  429. package/src/operations/activities/sse-events.ts +30 -0
  430. package/src/operations/activities/types.ts +63 -0
  431. package/src/operations/debug-logs/client.ts +60 -0
  432. package/src/operations/debug-logs/debug-logger.ts +83 -0
  433. package/src/operations/debug-logs/index.ts +8 -0
  434. package/src/operations/debug-logs/server.ts +19 -0
  435. package/src/operations/debug-logs/types.ts +33 -0
  436. package/src/operations/index.ts +50 -0
  437. package/src/operations/notifications/__tests__/api-schemas.test.ts +216 -0
  438. package/src/operations/notifications/api-schemas.ts +91 -0
  439. package/src/operations/notifications/index.ts +3 -0
  440. package/src/operations/notifications/sse-events.ts +21 -0
  441. package/src/operations/notifications/types.ts +47 -0
  442. package/src/operations/observability/__tests__/openrouter-cost-flow.test.ts +297 -0
  443. package/src/operations/observability/__tests__/schemas.test.ts +151 -0
  444. package/src/operations/observability/__tests__/types.test.ts +109 -0
  445. package/src/operations/observability/__tests__/utils.test.ts +54 -0
  446. package/src/operations/observability/ai-usage-collector.ts +64 -0
  447. package/src/operations/observability/index.ts +13 -0
  448. package/src/operations/observability/metrics-collector.ts +49 -0
  449. package/src/operations/observability/schemas.ts +39 -0
  450. package/src/operations/observability/types.ts +463 -0
  451. package/src/operations/observability/utils.ts +77 -0
  452. package/src/operations/sessions/__tests__/api-schemas.test.ts +361 -0
  453. package/src/operations/sessions/__tests__/manager.test.ts +821 -0
  454. package/src/operations/sessions/api-schemas.ts +166 -0
  455. package/src/operations/sessions/index.ts +26 -0
  456. package/src/operations/sessions/server/manager.ts +90 -0
  457. package/src/operations/sessions/server/session.ts +180 -0
  458. package/src/operations/sessions/types.ts +98 -0
  459. package/src/operations/triggers/index.ts +12 -0
  460. package/src/operations/triggers/webhook/definitions/__tests__/instantly-reply-received.test.ts +72 -0
  461. package/src/operations/triggers/webhook/definitions/instantly-account-error.ts +44 -0
  462. package/src/operations/triggers/webhook/definitions/instantly-auto-reply-received.ts +51 -0
  463. package/src/operations/triggers/webhook/definitions/instantly-campaign-completed.ts +45 -0
  464. package/src/operations/triggers/webhook/definitions/instantly-email-bounced.ts +49 -0
  465. package/src/operations/triggers/webhook/definitions/instantly-lead-unsubscribed.ts +45 -0
  466. package/src/operations/triggers/webhook/definitions/instantly-reply-received.ts +54 -0
  467. package/src/operations/triggers/webhook/index.ts +35 -0
  468. package/src/operations/triggers/webhook/types.ts +74 -0
  469. package/src/organization-model/README.md +79 -0
  470. package/src/organization-model/__tests__/graph.test.ts +250 -0
  471. package/src/organization-model/__tests__/resolve.test.ts +47 -0
  472. package/src/organization-model/defaults.ts +60 -0
  473. package/src/organization-model/domains/branding.ts +22 -0
  474. package/src/organization-model/domains/crm.ts +46 -0
  475. package/src/organization-model/domains/delivery.ts +48 -0
  476. package/src/organization-model/domains/features.ts +57 -0
  477. package/src/organization-model/domains/lead-gen.ts +33 -0
  478. package/src/organization-model/domains/navigation.ts +103 -0
  479. package/src/organization-model/domains/shared.ts +42 -0
  480. package/src/organization-model/graph/build.ts +432 -0
  481. package/src/organization-model/graph/index.ts +4 -0
  482. package/src/organization-model/graph/schema.ts +50 -0
  483. package/src/organization-model/graph/types.ts +52 -0
  484. package/src/organization-model/index.ts +11 -0
  485. package/src/organization-model/published.ts +18 -0
  486. package/src/organization-model/resolve.ts +42 -0
  487. package/src/organization-model/schema.ts +21 -0
  488. package/src/organization-model/types.ts +27 -0
  489. package/src/platform/api/index.ts +1 -0
  490. package/src/platform/api/types.ts +35 -0
  491. package/src/platform/constants/http.ts +37 -0
  492. package/src/platform/constants/index.ts +5 -0
  493. package/src/platform/constants/limits.ts +32 -0
  494. package/src/platform/constants/resilience.ts +51 -0
  495. package/src/platform/constants/timeouts.ts +20 -0
  496. package/src/platform/constants/versions.ts +3 -0
  497. package/src/platform/index.ts +27 -0
  498. package/src/platform/registry/__tests__/command-view.test.ts +410 -0
  499. package/src/platform/registry/__tests__/resource-registry-static.test.ts +347 -0
  500. package/src/platform/registry/__tests__/resource-registry.integration.test.ts +1004 -0
  501. package/src/platform/registry/__tests__/resource-registry.list-executable.test.ts +393 -0
  502. package/src/platform/registry/__tests__/resource-registry.test.ts +1942 -0
  503. package/src/platform/registry/__tests__/serialization.test.ts +1127 -0
  504. package/src/platform/registry/__tests__/validation.test.ts +1086 -0
  505. package/src/platform/registry/command-view.ts +180 -0
  506. package/src/platform/registry/domains.ts +165 -0
  507. package/src/platform/registry/index.ts +93 -0
  508. package/src/platform/registry/reserved.ts +24 -0
  509. package/src/platform/registry/resource-metadata.ts +59 -0
  510. package/src/platform/registry/resource-registry.command-queue-groups.test.ts +129 -0
  511. package/src/platform/registry/resource-registry.ts +788 -0
  512. package/src/platform/registry/serialization.ts +273 -0
  513. package/src/platform/registry/serialized-types.ts +231 -0
  514. package/src/platform/registry/stats-types.ts +66 -0
  515. package/src/platform/registry/types.ts +404 -0
  516. package/src/platform/registry/validation.ts +513 -0
  517. package/src/platform/resilience/__tests__/circuit-breaker.test.ts +291 -0
  518. package/src/platform/resilience/__tests__/http-error-mapper.test.ts +173 -0
  519. package/src/platform/resilience/__tests__/rate-limiter.test.ts +471 -0
  520. package/src/platform/resilience/__tests__/retry.test.ts +380 -0
  521. package/src/platform/resilience/__tests__/timeout.test.ts +219 -0
  522. package/src/platform/resilience/circuit-breaker.ts +164 -0
  523. package/src/platform/resilience/errors.ts +68 -0
  524. package/src/platform/resilience/http-error-mapper.ts +129 -0
  525. package/src/platform/resilience/index.ts +93 -0
  526. package/src/platform/resilience/rate-limiter-types.ts +46 -0
  527. package/src/platform/resilience/rate-limiter.ts +140 -0
  528. package/src/platform/resilience/retry.ts +89 -0
  529. package/src/platform/resilience/timeout.ts +63 -0
  530. package/src/platform/sse/events.ts +67 -0
  531. package/src/platform/sse/index.ts +7 -0
  532. package/src/platform/utils/__tests__/currency.test.ts +77 -0
  533. package/src/platform/utils/__tests__/validation.test.ts +1083 -0
  534. package/src/platform/utils/currency.ts +96 -0
  535. package/src/platform/utils/debounce.ts +52 -0
  536. package/src/platform/utils/error.ts +42 -0
  537. package/src/platform/utils/hmac.test.ts +97 -0
  538. package/src/platform/utils/index.ts +32 -0
  539. package/src/platform/utils/server/betterstack-logger.ts +210 -0
  540. package/src/platform/utils/server/hmac.ts +44 -0
  541. package/src/platform/utils/server/unsubscribe.ts +111 -0
  542. package/src/platform/utils/token-counter.ts +96 -0
  543. package/src/platform/utils/validation.ts +425 -0
  544. package/src/projects/api-schemas.ts +265 -0
  545. package/src/published.ts +1 -0
  546. package/src/server.ts +273 -0
  547. package/src/supabase/__tests__/helpers.test.ts +51 -0
  548. package/src/supabase/database.types.ts +2674 -0
  549. package/src/supabase/helpers.ts +20 -0
  550. package/src/supabase/index.ts +52 -0
  551. package/src/supabase/server/client.ts +58 -0
  552. package/src/test-utils/README.md +150 -0
  553. package/src/test-utils/browser-mocks.ts +54 -0
  554. package/src/test-utils/fixtures/api-keys.ts +52 -0
  555. package/src/test-utils/fixtures/index.ts +4 -0
  556. package/src/test-utils/fixtures/memberships.ts +80 -0
  557. package/src/test-utils/fixtures/organizations.ts +69 -0
  558. package/src/test-utils/fixtures/users.ts +79 -0
  559. package/src/test-utils/index.ts +11 -0
  560. package/src/test-utils/mocks/index.ts +2 -0
  561. package/src/test-utils/mocks/supabase.ts +142 -0
  562. package/src/test-utils/mocks/workos.ts +108 -0
  563. package/src/test-utils/rls/RLSTestContext.ts +586 -0
  564. package/src/test-utils/rls/index.ts +1 -0
@@ -0,0 +1,216 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import {
3
+ GetNotificationsQuerySchema,
4
+ MarkAsReadParamsSchema,
5
+ CreateNotificationSchema,
6
+ NotificationCategorySchema
7
+ } from '../api-schemas'
8
+
9
+ describe('GetNotificationsQuerySchema', () => {
10
+ it('accepts valid limit', () => {
11
+ const result = GetNotificationsQuerySchema.safeParse({ limit: '50' })
12
+ expect(result.success).toBe(true)
13
+ if (result.success) {
14
+ expect(result.data.limit).toBe(50) // Coerced to number
15
+ }
16
+ })
17
+
18
+ it('applies default limit', () => {
19
+ const result = GetNotificationsQuerySchema.safeParse({})
20
+ expect(result.success).toBe(true)
21
+ if (result.success) {
22
+ expect(result.data.limit).toBe(50)
23
+ }
24
+ })
25
+
26
+ it('rejects limit > 100 (DoS prevention)', () => {
27
+ const result = GetNotificationsQuerySchema.safeParse({ limit: '101' })
28
+ expect(result.success).toBe(false)
29
+ })
30
+
31
+ it('rejects limit < 1', () => {
32
+ const result = GetNotificationsQuerySchema.safeParse({ limit: '0' })
33
+ expect(result.success).toBe(false)
34
+ })
35
+
36
+ it('rejects non-numeric limit', () => {
37
+ const result = GetNotificationsQuerySchema.safeParse({ limit: 'abc' })
38
+ expect(result.success).toBe(false)
39
+ })
40
+
41
+ it('accepts numeric limit', () => {
42
+ const result = GetNotificationsQuerySchema.safeParse({ limit: 25 })
43
+ expect(result.success).toBe(true)
44
+ if (result.success) {
45
+ expect(result.data.limit).toBe(25)
46
+ }
47
+ })
48
+ })
49
+
50
+ describe('MarkAsReadParamsSchema', () => {
51
+ it('accepts valid UUID', () => {
52
+ const result = MarkAsReadParamsSchema.safeParse({
53
+ id: '123e4567-e89b-12d3-a456-426614174000'
54
+ })
55
+ expect(result.success).toBe(true)
56
+ })
57
+
58
+ it('rejects non-UUID string', () => {
59
+ const result = MarkAsReadParamsSchema.safeParse({ id: 'not-a-uuid' })
60
+ expect(result.success).toBe(false)
61
+ })
62
+
63
+ it('rejects empty string', () => {
64
+ const result = MarkAsReadParamsSchema.safeParse({ id: '' })
65
+ expect(result.success).toBe(false)
66
+ })
67
+
68
+ it('rejects SQL injection attempt', () => {
69
+ const result = MarkAsReadParamsSchema.safeParse({ id: "'; DROP TABLE notifications;--" })
70
+ expect(result.success).toBe(false)
71
+ })
72
+ })
73
+
74
+ describe('CreateNotificationSchema', () => {
75
+ const validNotification = {
76
+ userId: '123e4567-e89b-12d3-a456-426614174000',
77
+ organizationId: '123e4567-e89b-12d3-a456-426614174001',
78
+ category: 'info' as const,
79
+ title: 'Test Notification',
80
+ message: 'This is a test message'
81
+ }
82
+
83
+ it('accepts valid notification', () => {
84
+ const result = CreateNotificationSchema.safeParse({
85
+ ...validNotification,
86
+ actionUrl: 'https://example.com/action'
87
+ })
88
+ expect(result.success).toBe(true)
89
+ })
90
+
91
+ it('accepts notification without actionUrl', () => {
92
+ const result = CreateNotificationSchema.safeParse(validNotification)
93
+ expect(result.success).toBe(true)
94
+ })
95
+
96
+ it('rejects invalid category', () => {
97
+ const result = CreateNotificationSchema.safeParse({
98
+ ...validNotification,
99
+ category: 'invalid'
100
+ })
101
+ expect(result.success).toBe(false)
102
+ })
103
+
104
+ it('rejects title too long (DoS prevention)', () => {
105
+ const result = CreateNotificationSchema.safeParse({
106
+ ...validNotification,
107
+ title: 'a'.repeat(201)
108
+ })
109
+ expect(result.success).toBe(false)
110
+ })
111
+
112
+ it('rejects message too long (DoS prevention)', () => {
113
+ const result = CreateNotificationSchema.safeParse({
114
+ ...validNotification,
115
+ message: 'a'.repeat(1001)
116
+ })
117
+ expect(result.success).toBe(false)
118
+ })
119
+
120
+ it('accepts title at max length', () => {
121
+ const result = CreateNotificationSchema.safeParse({
122
+ ...validNotification,
123
+ title: 'a'.repeat(200)
124
+ })
125
+ expect(result.success).toBe(true)
126
+ })
127
+
128
+ it('accepts message at max length', () => {
129
+ const result = CreateNotificationSchema.safeParse({
130
+ ...validNotification,
131
+ message: 'a'.repeat(1000)
132
+ })
133
+ expect(result.success).toBe(true)
134
+ })
135
+
136
+ it('rejects invalid actionUrl', () => {
137
+ const result = CreateNotificationSchema.safeParse({
138
+ ...validNotification,
139
+ actionUrl: 'not-a-url'
140
+ })
141
+ expect(result.success).toBe(false)
142
+ })
143
+
144
+ it('rejects invalid userId UUID', () => {
145
+ const result = CreateNotificationSchema.safeParse({
146
+ ...validNotification,
147
+ userId: 'not-a-uuid'
148
+ })
149
+ expect(result.success).toBe(false)
150
+ })
151
+
152
+ it('rejects invalid organizationId UUID', () => {
153
+ const result = CreateNotificationSchema.safeParse({
154
+ ...validNotification,
155
+ organizationId: 'not-a-uuid'
156
+ })
157
+ expect(result.success).toBe(false)
158
+ })
159
+
160
+ it('trims whitespace from title and message', () => {
161
+ const result = CreateNotificationSchema.safeParse({
162
+ ...validNotification,
163
+ title: ' Test ',
164
+ message: ' Message '
165
+ })
166
+ expect(result.success).toBe(true)
167
+ if (result.success) {
168
+ expect(result.data.title).toBe('Test')
169
+ expect(result.data.message).toBe('Message')
170
+ }
171
+ })
172
+
173
+ it('rejects empty title after trim', () => {
174
+ const result = CreateNotificationSchema.safeParse({
175
+ ...validNotification,
176
+ title: ' '
177
+ })
178
+ expect(result.success).toBe(false)
179
+ })
180
+
181
+ it('rejects empty message after trim', () => {
182
+ const result = CreateNotificationSchema.safeParse({
183
+ ...validNotification,
184
+ message: ' '
185
+ })
186
+ expect(result.success).toBe(false)
187
+ })
188
+
189
+ it('prevents unknown fields (strict mode - mass assignment prevention)', () => {
190
+ const result = CreateNotificationSchema.safeParse({
191
+ ...validNotification,
192
+ unknownField: 'should fail'
193
+ })
194
+ expect(result.success).toBe(false)
195
+ })
196
+ })
197
+
198
+ describe('NotificationCategorySchema', () => {
199
+ it('accepts all valid categories', () => {
200
+ const categories = ['info', 'queue', 'alert', 'error', 'system']
201
+ categories.forEach((category) => {
202
+ const result = NotificationCategorySchema.safeParse(category)
203
+ expect(result.success).toBe(true)
204
+ })
205
+ })
206
+
207
+ it('rejects invalid category', () => {
208
+ const result = NotificationCategorySchema.safeParse('invalid')
209
+ expect(result.success).toBe(false)
210
+ })
211
+
212
+ it('rejects empty string', () => {
213
+ const result = NotificationCategorySchema.safeParse('')
214
+ expect(result.success).toBe(false)
215
+ })
216
+ })
@@ -0,0 +1,91 @@
1
+ import { z } from 'zod'
2
+ import { UuidSchema } from '../../platform/utils/validation'
3
+
4
+ /**
5
+ * API validation schemas for notification endpoints.
6
+ * Separate from domain types to enforce input validation at API boundary.
7
+ */
8
+
9
+ /**
10
+ * Notification category enum (matches database constraint)
11
+ */
12
+ export const NotificationCategorySchema = z.enum(['info', 'queue', 'alert', 'error', 'system'])
13
+
14
+ /**
15
+ * GET /api/notifications - Query parameters
16
+ *
17
+ * Security:
18
+ * - limit: Max 100 to prevent DoS via excessive data transfer
19
+ * - Default: 50 notifications
20
+ * - Coerced from string to number (query params are always strings)
21
+ */
22
+ export const GetNotificationsQuerySchema = z.object({
23
+ limit: z.coerce.number().int().min(1).max(100).default(50),
24
+ offset: z.coerce.number().int().min(0).default(0)
25
+ })
26
+
27
+ /**
28
+ * PATCH /api/notifications/:id/read - Path parameters
29
+ *
30
+ * Security:
31
+ * - UUID validation prevents SQL injection attempts
32
+ */
33
+ export const MarkAsReadParamsSchema = z.object({
34
+ id: UuidSchema
35
+ })
36
+
37
+ /**
38
+ * Internal: Create notification schema
39
+ * Used by notification service/triggers, not exposed as API endpoint
40
+ * (notifications are created by system only, not by users)
41
+ *
42
+ * Security:
43
+ * - Strict mode: prevents mass assignment attacks
44
+ * - UUID validation: ensures valid user/org IDs
45
+ * - Length limits: prevents DoS via large payloads
46
+ * - Title: 200 chars (reasonable for notification headers)
47
+ * - Message: 1000 chars (detailed messages without DoS risk)
48
+ * - URL validation: ensures actionUrl is valid URL if provided
49
+ */
50
+ export const CreateNotificationSchema = z
51
+ .object({
52
+ userId: UuidSchema,
53
+ organizationId: UuidSchema,
54
+ category: NotificationCategorySchema,
55
+ title: z.string().trim().min(1).max(200),
56
+ message: z.string().trim().min(1).max(1000),
57
+ actionUrl: z.string().url().optional()
58
+ })
59
+ .strict()
60
+
61
+ /**
62
+ * PATCH /api/notifications/batch/read - Request body
63
+ *
64
+ * Security:
65
+ * - Strict mode: prevents mass assignment attacks
66
+ * - UUID array validation: ensures valid notification IDs
67
+ * - Min 1 / Max 500: prevents empty no-op calls and oversized batches
68
+ */
69
+ export const BatchMarkAsReadRequestSchema = z
70
+ .object({
71
+ ids: z.array(UuidSchema).min(1).max(500)
72
+ })
73
+ .strict()
74
+
75
+ /**
76
+ * Bundled export (mirrors ProjectSchemas pattern)
77
+ */
78
+ export const NotificationSchemas = {
79
+ GetNotificationsQuery: GetNotificationsQuerySchema,
80
+ MarkAsReadParams: MarkAsReadParamsSchema,
81
+ CreateNotification: CreateNotificationSchema,
82
+ BatchMarkAsReadRequest: BatchMarkAsReadRequestSchema
83
+ }
84
+
85
+ /**
86
+ * Type exports for use in handlers
87
+ */
88
+ export type GetNotificationsQuery = z.infer<typeof GetNotificationsQuerySchema>
89
+ export type MarkAsReadParams = z.infer<typeof MarkAsReadParamsSchema>
90
+ export type CreateNotificationInput = z.infer<typeof CreateNotificationSchema>
91
+ export type BatchMarkAsReadRequest = z.infer<typeof BatchMarkAsReadRequestSchema>
@@ -0,0 +1,3 @@
1
+ export * from './types'
2
+ export * from './api-schemas'
3
+ export * from './sse-events'
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Notification SSE Event Types
3
+ *
4
+ * Type-safe definitions for notification-related SSE events
5
+ */
6
+
7
+ /**
8
+ * Event sent when notification unread count changes
9
+ */
10
+ export interface NotificationCountUpdatedEvent {
11
+ type: 'unread_count_updated'
12
+ timestamp: number
13
+ data: {
14
+ count: number
15
+ }
16
+ }
17
+
18
+ /**
19
+ * Union of all notification SSE events
20
+ */
21
+ export type NotificationSSEEvent = NotificationCountUpdatedEvent
@@ -0,0 +1,47 @@
1
+ import type { Database } from '../../supabase/database.types'
2
+
3
+ // Import Supabase-generated types (don't recreate!)
4
+ export type NotificationRow = Database['public']['Tables']['notifications']['Row']
5
+ export type NotificationInsert = Database['public']['Tables']['notifications']['Insert']
6
+ export type NotificationUpdate = Database['public']['Tables']['notifications']['Update']
7
+
8
+ // Only create types for business logic transformations
9
+ export interface Notification {
10
+ id: string
11
+ userId: string // Transformed from user_id
12
+ organizationId: string // Transformed from organization_id
13
+ category: NotificationRow['category']
14
+ title: string
15
+ message: string
16
+ actionUrl: string | null // Transformed from action_url
17
+ read: boolean
18
+ readAt: Date | null // Transformed from read_at
19
+ createdAt: Date // Transformed from created_at
20
+ }
21
+
22
+ export interface CreateNotificationParams {
23
+ userId: string
24
+ organizationId: string
25
+ category: NotificationRow['category']
26
+ title: string
27
+ message: string
28
+ actionUrl?: string
29
+ }
30
+
31
+ /**
32
+ * Wire-format DTO for notification API responses.
33
+ * Dates are ISO 8601 strings (not Date objects like the domain Notification type).
34
+ * Used by frontend hooks that consume /api/notifications.
35
+ */
36
+ export interface NotificationDTO {
37
+ id: string
38
+ userId: string
39
+ organizationId: string
40
+ category: string
41
+ title: string
42
+ message: string
43
+ actionUrl: string | null
44
+ read: boolean
45
+ readAt: string | null
46
+ createdAt: string
47
+ }
@@ -0,0 +1,297 @@
1
+ /**
2
+ * OpenRouter Cost Flow Integration Tests
3
+ * Verifies that actual cost from OpenRouter flows through the full observability pipeline:
4
+ * OpenRouterAdapter → UniversalLLMAdapter → AIUsageCollector → Database
5
+ */
6
+
7
+ import { describe, it, expect, vi, beforeEach } from 'vitest'
8
+ import { AIUsageCollector } from '../ai-usage-collector'
9
+ import { UniversalLLMAdapter } from '../../../execution/engine/llm/adapters/universal-adapter'
10
+ import type { LLMAdapter, LLMGenerateRequest, LLMGenerateResponse } from '../../../execution/engine/llm/types'
11
+ import type { LLMModel } from '../../../execution/engine/llm/model-info'
12
+
13
+ describe('OpenRouter Cost Flow', () => {
14
+ describe('AIUsageCollector', () => {
15
+ it('uses actual cost when provided by adapter', () => {
16
+ const collector = new AIUsageCollector()
17
+
18
+ collector.record({
19
+ model: 'openrouter/anthropic/claude-sonnet-4.5',
20
+ inputTokens: 100,
21
+ outputTokens: 50,
22
+ latencyMs: 1500,
23
+ cost: 0.00125 // Actual cost from OpenRouter
24
+ })
25
+
26
+ const summary = collector.getSummary()
27
+
28
+ expect(summary.totalCostUsd).toBe(0.00125)
29
+ expect(summary.calls[0].costUsd).toBe(0.00125)
30
+ })
31
+
32
+ it('falls back to calculateCost when cost not provided', () => {
33
+ const collector = new AIUsageCollector()
34
+
35
+ collector.record({
36
+ model: 'gpt-5-mini',
37
+ inputTokens: 100,
38
+ outputTokens: 50,
39
+ latencyMs: 1000
40
+ // No cost field - should use calculateCost()
41
+ })
42
+
43
+ const summary = collector.getSummary()
44
+
45
+ // Should have calculated a cost (not zero, not undefined)
46
+ expect(summary.totalCostUsd).toBeGreaterThan(0)
47
+ expect(summary.calls[0].costUsd).toBeGreaterThan(0)
48
+ })
49
+
50
+ it('handles mixed providers - some with actual cost, some calculated', () => {
51
+ const collector = new AIUsageCollector()
52
+
53
+ // OpenRouter call with actual cost
54
+ collector.record({
55
+ model: 'openrouter/anthropic/claude-sonnet-4.5',
56
+ inputTokens: 100,
57
+ outputTokens: 50,
58
+ latencyMs: 1500,
59
+ cost: 0.00125
60
+ })
61
+
62
+ // OpenAI call without cost (will be calculated)
63
+ collector.record({
64
+ model: 'gpt-5-mini',
65
+ inputTokens: 200,
66
+ outputTokens: 100,
67
+ latencyMs: 800
68
+ })
69
+
70
+ const summary = collector.getSummary()
71
+
72
+ expect(summary.callCount).toBe(2)
73
+ expect(summary.calls[0].costUsd).toBe(0.00125) // Actual
74
+ expect(summary.calls[1].costUsd).toBeGreaterThan(0) // Calculated
75
+ expect(summary.totalCostUsd).toBeGreaterThan(0.00125) // Sum of both
76
+ })
77
+
78
+ it('uses actual cost of zero when explicitly provided', () => {
79
+ const collector = new AIUsageCollector()
80
+
81
+ // Edge case: OpenRouter returns cost of 0 (e.g., free tier, cached response)
82
+ collector.record({
83
+ model: 'openrouter/anthropic/claude-sonnet-4.5',
84
+ inputTokens: 100,
85
+ outputTokens: 50,
86
+ latencyMs: 500,
87
+ cost: 0 // Explicitly zero (not undefined)
88
+ })
89
+
90
+ const summary = collector.getSummary()
91
+
92
+ // Should use the explicit zero, not fall back to calculated cost
93
+ expect(summary.totalCostUsd).toBe(0)
94
+ expect(summary.calls[0].costUsd).toBe(0)
95
+ })
96
+ })
97
+
98
+ describe('UniversalLLMAdapter Cost Passthrough', () => {
99
+ let mockBaseAdapter: LLMAdapter
100
+ let collector: AIUsageCollector
101
+
102
+ const baseRequest: LLMGenerateRequest = {
103
+ messages: [{ role: 'user', content: 'Hello' }],
104
+ responseSchema: { type: 'object', properties: { response: { type: 'string' } } },
105
+ maxOutputTokens: 1000
106
+ }
107
+
108
+ beforeEach(() => {
109
+ vi.clearAllMocks()
110
+ collector = new AIUsageCollector()
111
+ })
112
+
113
+ it('passes actual cost from response to collector', async () => {
114
+ // Mock adapter that returns response with cost (like OpenRouter)
115
+ mockBaseAdapter = {
116
+ generate: vi.fn().mockResolvedValue({
117
+ output: { response: 'Hello!' },
118
+ usage: {
119
+ inputTokens: 15,
120
+ outputTokens: 25,
121
+ totalTokens: 40
122
+ },
123
+ cost: 0.00089 // Actual cost from OpenRouter
124
+ } as LLMGenerateResponse)
125
+ }
126
+
127
+ const universalAdapter = new UniversalLLMAdapter(
128
+ mockBaseAdapter,
129
+ 'openrouter/anthropic/claude-sonnet-4.5' as LLMModel,
130
+ collector,
131
+ 'agent-reasoning'
132
+ )
133
+
134
+ await universalAdapter.generate(baseRequest)
135
+
136
+ const summary = collector.getSummary()
137
+
138
+ expect(summary.callCount).toBe(1)
139
+ expect(summary.calls[0].costUsd).toBe(0.00089)
140
+ expect(summary.totalCostUsd).toBe(0.00089)
141
+ })
142
+
143
+ it('collector calculates cost when response has no cost field', async () => {
144
+ // Mock adapter that returns response without cost (like OpenAI)
145
+ mockBaseAdapter = {
146
+ generate: vi.fn().mockResolvedValue({
147
+ output: { response: 'Hello!' },
148
+ usage: {
149
+ inputTokens: 15,
150
+ outputTokens: 25,
151
+ totalTokens: 40
152
+ }
153
+ // No cost field
154
+ } as LLMGenerateResponse)
155
+ }
156
+
157
+ const universalAdapter = new UniversalLLMAdapter(
158
+ mockBaseAdapter,
159
+ 'gpt-5-mini' as LLMModel,
160
+ collector,
161
+ 'agent-reasoning'
162
+ )
163
+
164
+ await universalAdapter.generate(baseRequest)
165
+
166
+ const summary = collector.getSummary()
167
+
168
+ expect(summary.callCount).toBe(1)
169
+ // Cost should be calculated (not zero, not undefined)
170
+ expect(summary.calls[0].costUsd).toBeGreaterThan(0)
171
+ })
172
+
173
+ it('tracks multiple calls with mixed cost sources', async () => {
174
+ // First call: OpenRouter with actual cost
175
+ const openRouterAdapter: LLMAdapter = {
176
+ generate: vi.fn().mockResolvedValue({
177
+ output: { response: 'Hello from Claude!' },
178
+ usage: { inputTokens: 100, outputTokens: 50, totalTokens: 150 },
179
+ cost: 0.0025
180
+ } as LLMGenerateResponse)
181
+ }
182
+
183
+ // Second call: OpenAI without cost
184
+ const openAIAdapter: LLMAdapter = {
185
+ generate: vi.fn().mockResolvedValue({
186
+ output: { response: 'Hello from GPT!' },
187
+ usage: { inputTokens: 80, outputTokens: 40, totalTokens: 120 }
188
+ } as LLMGenerateResponse)
189
+ }
190
+
191
+ const universalOpenRouter = new UniversalLLMAdapter(
192
+ openRouterAdapter,
193
+ 'openrouter/anthropic/claude-sonnet-4.5' as LLMModel,
194
+ collector,
195
+ 'agent-reasoning'
196
+ )
197
+
198
+ const universalOpenAI = new UniversalLLMAdapter(
199
+ openAIAdapter,
200
+ 'gpt-5-mini' as LLMModel,
201
+ collector,
202
+ 'workflow-step'
203
+ )
204
+
205
+ await universalOpenRouter.generate(baseRequest)
206
+ await universalOpenAI.generate(baseRequest)
207
+
208
+ const summary = collector.getSummary()
209
+
210
+ expect(summary.callCount).toBe(2)
211
+ expect(summary.calls[0].costUsd).toBe(0.0025) // Actual from OpenRouter
212
+ expect(summary.calls[1].costUsd).toBeGreaterThan(0) // Calculated for OpenAI
213
+ expect(summary.totalCostUsd).toBeGreaterThan(0.0025) // Sum
214
+ })
215
+
216
+ it('preserves call context alongside cost', async () => {
217
+ mockBaseAdapter = {
218
+ generate: vi.fn().mockResolvedValue({
219
+ output: { response: 'Hello!' },
220
+ usage: { inputTokens: 50, outputTokens: 25, totalTokens: 75 },
221
+ cost: 0.00045
222
+ } as LLMGenerateResponse)
223
+ }
224
+
225
+ const universalAdapter = new UniversalLLMAdapter(
226
+ mockBaseAdapter,
227
+ 'openrouter/deepseek/deepseek-v3.2' as LLMModel,
228
+ collector,
229
+ 'agent-reasoning',
230
+ { type: 'agent-reasoning', iteration: 3 }
231
+ )
232
+
233
+ await universalAdapter.generate(baseRequest)
234
+
235
+ const summary = collector.getSummary()
236
+ const call = summary.calls[0]
237
+
238
+ // Verify cost is captured
239
+ expect(call.costUsd).toBe(0.00045)
240
+
241
+ // Verify context is preserved
242
+ expect(call.callType).toBe('agent-reasoning')
243
+ expect(call.context).toEqual({ type: 'agent-reasoning', iteration: 3 })
244
+
245
+ // Verify tokens are tracked
246
+ expect(call.inputTokens).toBe(50)
247
+ expect(call.outputTokens).toBe(25)
248
+ })
249
+ })
250
+
251
+ describe('End-to-End Cost Accuracy', () => {
252
+ it('aggregates costs correctly across multiple calls', () => {
253
+ const collector = new AIUsageCollector()
254
+
255
+ // Simulate a typical execution with multiple LLM calls
256
+ const calls = [
257
+ { model: 'openrouter/anthropic/claude-sonnet-4.5', cost: 0.00125 },
258
+ { model: 'openrouter/anthropic/claude-sonnet-4.5', cost: 0.00089 },
259
+ { model: 'openrouter/deepseek/deepseek-v3.2', cost: 0.00034 }
260
+ ]
261
+
262
+ calls.forEach((call, i) => {
263
+ collector.record({
264
+ model: call.model as LLMModel,
265
+ inputTokens: 100 + i * 50,
266
+ outputTokens: 50 + i * 25,
267
+ latencyMs: 1000 + i * 200,
268
+ cost: call.cost
269
+ })
270
+ })
271
+
272
+ const summary = collector.getSummary()
273
+
274
+ expect(summary.callCount).toBe(3)
275
+ expect(summary.totalCostUsd).toBe(0.00125 + 0.00089 + 0.00034)
276
+ expect(summary.totalCostUsd).toBeCloseTo(0.00248, 5)
277
+ })
278
+
279
+ it('maintains precision for small costs', () => {
280
+ const collector = new AIUsageCollector()
281
+
282
+ // Very small cost (e.g., DeepSeek which is very cheap)
283
+ collector.record({
284
+ model: 'openrouter/deepseek/deepseek-v3.2',
285
+ inputTokens: 10,
286
+ outputTokens: 5,
287
+ latencyMs: 200,
288
+ cost: 0.000001 // $0.000001 = $1 per million tokens
289
+ })
290
+
291
+ const summary = collector.getSummary()
292
+
293
+ expect(summary.totalCostUsd).toBe(0.000001)
294
+ expect(summary.calls[0].costUsd).toBe(0.000001)
295
+ })
296
+ })
297
+ })