@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,788 @@
1
+ /**
2
+ * ResourceRegistry - Resource discovery and lookup
3
+ * Handles resource definitions from OrganizationRegistry
4
+ *
5
+ * Features:
6
+ * - Resource discovery by organization
7
+ * - Startup validation (duplicate IDs, model configs, relationships, interface-schema alignment)
8
+ * - Pre-serialization cache for instant API responses
9
+ * - Command View data generation
10
+ */
11
+
12
+ import type { WorkflowDefinition } from '../../execution/engine/workflow/types'
13
+ import type { AgentDefinition } from '../../execution/engine/agent/core/types'
14
+ import type {
15
+ ResourceStatus,
16
+ ResourceDefinition,
17
+ ResourceList,
18
+ TriggerDefinition,
19
+ IntegrationDefinition,
20
+ ResourceRelationships,
21
+ ExternalResourceDefinition,
22
+ HumanCheckpointDefinition
23
+ } from './types'
24
+ import type {
25
+ SerializedOrganizationData,
26
+ SerializedAgentDefinition,
27
+ SerializedWorkflowDefinition,
28
+ SerializedExecutionInterface,
29
+ CommandViewData
30
+ } from './serialized-types'
31
+ import { validateDeploymentSpec, validateRelationships } from './validation'
32
+ import { serializeAllOrganizations, serializeOrganization } from './serialization'
33
+ import { isReservedResourceId } from './reserved'
34
+
35
+ /** Filter out archived resources from an organization's resource collection */
36
+ function filterArchived(org: DeploymentSpec): DeploymentSpec {
37
+ return {
38
+ ...org,
39
+ workflows: org.workflows?.filter((w) => !w.config.archived),
40
+ agents: org.agents?.filter((a) => !a.config.archived),
41
+ triggers: org.triggers?.filter((t) => !t.archived),
42
+ integrations: org.integrations?.filter((i) => !i.archived),
43
+ externalResources: org.externalResources?.filter((e) => !e.archived),
44
+ humanCheckpoints: org.humanCheckpoints?.filter((h) => !h.archived)
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Configuration for a remotely-deployed organization
50
+ *
51
+ * Stored alongside runtime-registered organizations to support
52
+ * worker thread execution branching and credential management.
53
+ */
54
+ export interface RemoteOrgConfig {
55
+ /** Supabase Storage path: "{orgId}/{deploymentId}/bundle.js" */
56
+ storagePath: string
57
+ /** Deployment record ID */
58
+ deploymentId: string
59
+ /** OS temp path to bundle -- set after first download, used by worker threads */
60
+ cachedTempPath?: string
61
+ /** Platform tool name -> credential name mapping */
62
+ toolCredentials?: Record<string, string>
63
+ /** SDK version used to deploy this bundle */
64
+ sdkVersion?: string
65
+ /** Deployment version (semver) of the deployed bundle */
66
+ deploymentVersion?: string
67
+ }
68
+
69
+ /**
70
+ * Organization-specific resource collection
71
+ *
72
+ * Complete manifest of all automation resources for an organization.
73
+ * Used by ResourceRegistry for discovery and Command View for visualization.
74
+ */
75
+ export interface DeploymentSpec {
76
+ /** Deployment version (semver) */
77
+ version: string
78
+ /** Workflow definitions */
79
+ workflows?: WorkflowDefinition[]
80
+ /** Agent definitions */
81
+ agents?: AgentDefinition[]
82
+
83
+ // Resource Manifest fields (optional for backwards compatibility)
84
+ /** Trigger definitions - entry points that initiate executions */
85
+ triggers?: TriggerDefinition[]
86
+ /** Integration definitions - external service connections */
87
+ integrations?: IntegrationDefinition[]
88
+ /** Explicit relationship declarations between resources */
89
+ relationships?: ResourceRelationships
90
+ /** External automation resources (n8n, Make, Zapier, etc.) */
91
+ externalResources?: ExternalResourceDefinition[]
92
+ /** Human checkpoint definitions - human decision points in automation */
93
+ humanCheckpoints?: HumanCheckpointDefinition[]
94
+ }
95
+
96
+ /**
97
+ * Organization Registry type
98
+ */
99
+ export type OrganizationRegistry = Record<string, DeploymentSpec>
100
+
101
+ export class ResourceRegistry {
102
+ /**
103
+ * Pre-serialized organization data cache
104
+ * Computed once at construction for static orgs, updated incrementally for runtime orgs
105
+ */
106
+ private serializedCache: Map<string, SerializedOrganizationData>
107
+
108
+ /**
109
+ * Per-resource remote configuration (external deployments)
110
+ * Key: "orgName/resourceId", Value: RemoteOrgConfig for that resource.
111
+ * Tracks which individual resources were added at runtime via deploy pipeline.
112
+ * Static and remote resources coexist in the same org.
113
+ */
114
+ private remoteResources = new Map<string, RemoteOrgConfig>()
115
+
116
+ constructor(private registry: OrganizationRegistry) {
117
+ this.validateRegistry()
118
+ this.validateRelationships()
119
+ this.serializedCache = serializeAllOrganizations(registry)
120
+ }
121
+
122
+ /**
123
+ * Validates registry on construction
124
+ * - Checks for duplicate resourceIds within organizations
125
+ * - Validates model configurations against constraints
126
+ * - Validates ExecutionInterface matches inputSchema
127
+ * @throws Error if validation fails
128
+ */
129
+ private validateRegistry(): void {
130
+ for (const [orgName, resources] of Object.entries(this.registry)) {
131
+ validateDeploymentSpec(orgName, resources)
132
+ }
133
+ }
134
+
135
+ /**
136
+ * Validates relationship declarations reference valid resources
137
+ * Runs at API server startup - fails fast in development
138
+ * @throws Error if validation fails
139
+ */
140
+ private validateRelationships(): void {
141
+ for (const [orgName, resources] of Object.entries(this.registry)) {
142
+ validateRelationships(orgName, resources)
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Get a resource definition by ID
148
+ * Returns full definition (WorkflowDefinition or AgentDefinition)
149
+ * Check definition.config.type to determine if it's a workflow or agent
150
+ */
151
+ getResourceDefinition(organizationName: string, resourceId: string): WorkflowDefinition | AgentDefinition | null {
152
+ const orgResources = this.registry[organizationName]
153
+ if (!orgResources) return null
154
+
155
+ // Check workflows first
156
+ const workflow = orgResources.workflows?.find((w) => w.config.resourceId === resourceId)
157
+ if (workflow) return workflow
158
+
159
+ // Check agents
160
+ const agent = orgResources.agents?.find((a) => a.config.resourceId === resourceId)
161
+ if (agent) return agent
162
+
163
+ return null
164
+ }
165
+
166
+ /**
167
+ * List all resources for an organization
168
+ * Returns ResourceDefinition metadata (not full definitions)
169
+ *
170
+ * All resources are returned regardless of server environment.
171
+ * Pass an explicit `environment` filter to get only 'dev' or 'prod' resources.
172
+ */
173
+ listResourcesForOrganization(organizationName: string, environment?: ResourceStatus): ResourceList {
174
+ const orgResources = this.registry[organizationName]
175
+ if (!orgResources) {
176
+ return {
177
+ workflows: [],
178
+ agents: [],
179
+ total: 0,
180
+ organizationName,
181
+ environment
182
+ }
183
+ }
184
+
185
+ // Map workflows to ResourceDefinition metadata and filter by environment
186
+ const workflows: ResourceDefinition[] = (orgResources.workflows || [])
187
+ .map((def) => ({
188
+ resourceId: def.config.resourceId,
189
+ name: def.config.name,
190
+ description: def.config.description,
191
+ version: def.config.version,
192
+ type: def.config.type,
193
+ status: def.config.status,
194
+ domains: def.config.domains,
195
+ origin: this.remoteResources.has(`${organizationName}/${def.config.resourceId}`)
196
+ ? ('remote' as const)
197
+ : ('local' as const)
198
+ }))
199
+ .filter((resource) => !environment || resource.status === environment)
200
+
201
+ // Map agents to ResourceDefinition metadata and filter by environment
202
+ const agents: ResourceDefinition[] = (orgResources.agents || [])
203
+ .map((def) => ({
204
+ resourceId: def.config.resourceId,
205
+ name: def.config.name,
206
+ description: def.config.description,
207
+ version: def.config.version,
208
+ type: def.config.type,
209
+ status: def.config.status,
210
+ domains: def.config.domains,
211
+ sessionCapable: def.config.sessionCapable ?? false,
212
+ origin: this.remoteResources.has(`${organizationName}/${def.config.resourceId}`)
213
+ ? ('remote' as const)
214
+ : ('local' as const)
215
+ }))
216
+ .filter((resource) => !environment || resource.status === environment)
217
+
218
+ return {
219
+ workflows,
220
+ agents,
221
+ total: workflows.length + agents.length,
222
+ organizationName,
223
+ environment
224
+ }
225
+ }
226
+
227
+ /**
228
+ * List all resources from all organizations
229
+ * NOTE: For debugging only - returns raw registry data
230
+ */
231
+ listAllResources(): OrganizationRegistry {
232
+ return this.registry
233
+ }
234
+
235
+ // ============================================================================
236
+ // Runtime Organization Registration (External Deployments)
237
+ // ============================================================================
238
+
239
+ /**
240
+ * Register external resources at runtime
241
+ *
242
+ * Called during deploy pipeline when an external developer deploys their bundle.
243
+ * Merges the incoming stub definitions into the org's registry and stores
244
+ * per-resource remote config for worker thread execution branching.
245
+ *
246
+ * Static and remote resources coexist in the same org. If the org already
247
+ * has static resources, the incoming remote resources are merged alongside them.
248
+ * If redeploying (some resources already registered as remote for this org),
249
+ * the previous remote resources are unregistered first.
250
+ *
251
+ * @param orgName - Organization name (used as registry key)
252
+ * @param org - Stub resource definitions (workflows/agents with placeholder handlers)
253
+ * @param remote - Remote configuration (bundle path, deployment ID, env vars)
254
+ * @throws Error if incoming resourceId conflicts with a static resource
255
+ * @throws Error if incoming deployment contains duplicate resourceIds
256
+ */
257
+ registerOrganization(orgName: string, org: DeploymentSpec, remote: RemoteOrgConfig): void {
258
+ // Filter out archived resources before any processing
259
+ org = filterArchived(org)
260
+
261
+ // Collect all incoming resource IDs for conflict checking
262
+ const incomingWorkflowIds = (org.workflows ?? []).map((w) => w.config.resourceId)
263
+ const incomingAgentIds = (org.agents ?? []).map((a) => a.config.resourceId)
264
+ const incomingIds = [...incomingWorkflowIds, ...incomingAgentIds]
265
+
266
+ // Check for intra-deployment duplicates
267
+ const seen = new Set<string>()
268
+ for (const id of incomingIds) {
269
+ if (seen.has(id)) {
270
+ throw new Error(`Duplicate resource ID '${id}' in deployment. Each resource must have a unique ID.`)
271
+ }
272
+ seen.add(id)
273
+ }
274
+
275
+ // Check for reserved resource IDs (cannot be claimed by external deployments)
276
+ for (const id of incomingIds) {
277
+ if (isReservedResourceId(id)) {
278
+ throw new Error(
279
+ `Resource ID '${id}' is reserved for platform use. External deployments cannot use reserved resource IDs.`
280
+ )
281
+ }
282
+ }
283
+
284
+ // If redeploying (some resources already registered as remote for this org), clean up first
285
+ if (this.isRemote(orgName)) {
286
+ this.unregisterOrganization(orgName)
287
+ }
288
+
289
+ // Check for conflicts with static (non-remote) resources in the existing org
290
+ const existingOrg = this.registry[orgName]
291
+ if (existingOrg) {
292
+ const staticWorkflowIds = new Set((existingOrg.workflows ?? []).map((w) => w.config.resourceId))
293
+ const staticAgentIds = new Set((existingOrg.agents ?? []).map((a) => a.config.resourceId))
294
+
295
+ for (const id of incomingIds) {
296
+ if (staticWorkflowIds.has(id) || staticAgentIds.has(id)) {
297
+ throw new Error(
298
+ `Resource '${id}' already exists in '${orgName}' as an internal resource. External deployments cannot override internal resources.`
299
+ )
300
+ }
301
+ }
302
+ }
303
+
304
+ // Merge incoming resources into the org (or create new org entry)
305
+ if (existingOrg) {
306
+ existingOrg.workflows = [...(existingOrg.workflows ?? []), ...(org.workflows ?? [])]
307
+ existingOrg.agents = [...(existingOrg.agents ?? []), ...(org.agents ?? [])]
308
+ // Deployment-owned metadata: replace entirely (unregister cleared these)
309
+ existingOrg.triggers = org.triggers
310
+ existingOrg.integrations = org.integrations
311
+ existingOrg.humanCheckpoints = org.humanCheckpoints
312
+ existingOrg.externalResources = org.externalResources
313
+ if (org.relationships) {
314
+ existingOrg.relationships = {
315
+ ...(existingOrg.relationships ?? {}),
316
+ ...org.relationships
317
+ }
318
+ }
319
+ } else {
320
+ this.registry[orgName] = org
321
+ }
322
+
323
+ // Populate per-resource remote config entries
324
+ for (const id of incomingIds) {
325
+ this.remoteResources.set(`${orgName}/${id}`, remote)
326
+ }
327
+
328
+ // Rebuild serialized cache for the full merged org
329
+ this.serializedCache.set(orgName, serializeOrganization(this.registry[orgName]))
330
+ }
331
+
332
+ /**
333
+ * Patch serialized cache with pre-serialized schemas from an external manifest.
334
+ *
335
+ * External deployments use stub definitions with z.any() schemas (never called).
336
+ * The manifest carries the real schemas as pre-serialized JSON Schema from the worker.
337
+ * This method patches those into the serialized cache so describe/CLI display them.
338
+ *
339
+ * @param orgName - Organization name
340
+ * @param manifestSchemas - Map of resourceId -> { contract, steps } with JSON Schema
341
+ */
342
+ patchManifestSchemas(
343
+ orgName: string,
344
+ manifestSchemas: Array<{
345
+ resourceId: string
346
+ type: 'workflow' | 'agent'
347
+ contract?: { inputSchema?: object; outputSchema?: object }
348
+ steps?: Array<{ id: string; inputSchema?: object; outputSchema?: object }>
349
+ }>
350
+ ): void {
351
+ const cache = this.serializedCache.get(orgName)
352
+ if (!cache) return
353
+
354
+ for (const entry of manifestSchemas) {
355
+ if (entry.type === 'workflow') {
356
+ const def = cache.definitions.workflows.get(entry.resourceId)
357
+ if (!def) continue
358
+
359
+ // Patch contract schemas
360
+ if (entry.contract?.inputSchema) def.contract.inputSchema = entry.contract.inputSchema
361
+ if (entry.contract?.outputSchema) def.contract.outputSchema = entry.contract.outputSchema
362
+
363
+ // Patch step schemas
364
+ if (entry.steps && def.steps) {
365
+ for (const stepPatch of entry.steps) {
366
+ const step = def.steps.find((s) => s.id === stepPatch.id)
367
+ if (!step) continue
368
+ if (stepPatch.inputSchema) step.inputSchema = stepPatch.inputSchema
369
+ if (stepPatch.outputSchema) step.outputSchema = stepPatch.outputSchema
370
+ }
371
+ }
372
+ } else if (entry.type === 'agent') {
373
+ const def = cache.definitions.agents.get(entry.resourceId)
374
+ if (!def) continue
375
+ if (entry.contract?.inputSchema) def.contract.inputSchema = entry.contract.inputSchema
376
+ if (entry.contract?.outputSchema) def.contract.outputSchema = entry.contract.outputSchema
377
+ }
378
+ }
379
+ }
380
+
381
+ /**
382
+ * Register built-in platform resources (static, local execution)
383
+ *
384
+ * Unlike registerOrganization(), these resources:
385
+ * - Do NOT have remote config (execute in-process, not in worker threads)
386
+ * - Are NOT removed by unregisterOrganization() (persist across redeployments)
387
+ * - Use reserved resource IDs that external deployments cannot claim
388
+ *
389
+ * @param orgName - Organization name
390
+ * @param org - Resource definitions with real handlers (not stubs)
391
+ */
392
+ registerStaticResources(orgName: string, org: DeploymentSpec): void {
393
+ // Filter out archived resources before any processing
394
+ org = filterArchived(org)
395
+
396
+ const incomingWorkflowIds = (org.workflows ?? []).map((w) => w.config.resourceId)
397
+ const incomingAgentIds = (org.agents ?? []).map((a) => a.config.resourceId)
398
+ const incomingIds = [...incomingWorkflowIds, ...incomingAgentIds]
399
+
400
+ // Check for duplicates within incoming resources
401
+ const seen = new Set<string>()
402
+ for (const id of incomingIds) {
403
+ if (seen.has(id)) {
404
+ throw new Error(`Duplicate resource ID '${id}' in static resources.`)
405
+ }
406
+ seen.add(id)
407
+ }
408
+
409
+ // Check for conflicts with existing resources in this org
410
+ const existingOrg = this.registry[orgName]
411
+ if (existingOrg) {
412
+ const existingWorkflowIds = new Set((existingOrg.workflows ?? []).map((w) => w.config.resourceId))
413
+ const existingAgentIds = new Set((existingOrg.agents ?? []).map((a) => a.config.resourceId))
414
+
415
+ for (const id of incomingIds) {
416
+ if (existingWorkflowIds.has(id) || existingAgentIds.has(id)) {
417
+ throw new Error(`Static resource '${id}' conflicts with existing resource in '${orgName}'.`)
418
+ }
419
+ }
420
+ }
421
+
422
+ // Merge into registry (no remote config = local execution path)
423
+ if (existingOrg) {
424
+ existingOrg.workflows = [...(existingOrg.workflows ?? []), ...(org.workflows ?? [])]
425
+ existingOrg.agents = [...(existingOrg.agents ?? []), ...(org.agents ?? [])]
426
+ } else {
427
+ this.registry[orgName] = org
428
+ }
429
+
430
+ // Rebuild serialized cache
431
+ this.serializedCache.set(orgName, serializeOrganization(this.registry[orgName]))
432
+ }
433
+
434
+ /**
435
+ * Unregister runtime-registered resources for an organization
436
+ *
437
+ * Removes only resources that were registered at runtime (via registerOrganization).
438
+ * Static resources loaded at startup are preserved. If the org still has static
439
+ * resources after removal, the serialization cache is rebuilt. If no resources
440
+ * remain, the org is fully removed from the registry.
441
+ * No-op if the org has no remote resources.
442
+ *
443
+ * @param orgName - Organization name to unregister remote resources from
444
+ */
445
+ unregisterOrganization(orgName: string): void {
446
+ // Find all remote resource keys for this org
447
+ const prefix = `${orgName}/`
448
+ const remoteIds = new Set<string>()
449
+ for (const key of this.remoteResources.keys()) {
450
+ if (key.startsWith(prefix)) {
451
+ remoteIds.add(key.slice(prefix.length))
452
+ this.remoteResources.delete(key)
453
+ }
454
+ }
455
+
456
+ // No-op if org had no remote resources
457
+ if (remoteIds.size === 0) return
458
+
459
+ const orgResources = this.registry[orgName]
460
+ if (!orgResources) return
461
+
462
+ // Remove remote resources from the org's arrays
463
+ orgResources.workflows = (orgResources.workflows ?? []).filter((w) => !remoteIds.has(w.config.resourceId))
464
+ orgResources.agents = (orgResources.agents ?? []).filter((a) => !remoteIds.has(a.config.resourceId))
465
+
466
+ // Remove deployment-owned metadata (triggers, integrations, checkpoints, external resources)
467
+ // These are always fully owned by the deployment — replaced on each deploy
468
+ orgResources.triggers = undefined
469
+ orgResources.integrations = undefined
470
+ orgResources.humanCheckpoints = undefined
471
+ orgResources.externalResources = undefined
472
+
473
+ // Remove relationship entries for remote resource IDs
474
+ if (orgResources.relationships) {
475
+ for (const id of remoteIds) {
476
+ delete orgResources.relationships[id]
477
+ }
478
+ if (Object.keys(orgResources.relationships).length === 0) {
479
+ delete orgResources.relationships
480
+ }
481
+ }
482
+
483
+ // If the org still has static resources, rebuild cache; otherwise fully remove
484
+ // (triggers, integrations, checkpoints, externalResources were cleared above)
485
+ const remaining = (orgResources.workflows?.length ?? 0) + (orgResources.agents?.length ?? 0)
486
+
487
+ if (remaining > 0) {
488
+ this.serializedCache.set(orgName, serializeOrganization(orgResources))
489
+ } else {
490
+ delete this.registry[orgName]
491
+ this.serializedCache.delete(orgName)
492
+ }
493
+ }
494
+
495
+ /**
496
+ * Get remote configuration for a specific resource
497
+ *
498
+ * Returns the RemoteOrgConfig if the resource was registered at runtime,
499
+ * or null if it's a static resource or doesn't exist.
500
+ * Used by the execution coordinator to branch between local and worker execution.
501
+ *
502
+ * @param orgName - Organization name
503
+ * @param resourceId - Resource ID
504
+ * @returns Remote config or null
505
+ */
506
+ getRemoteConfig(orgName: string, resourceId: string): RemoteOrgConfig | null {
507
+ return this.remoteResources.get(`${orgName}/${resourceId}`) ?? null
508
+ }
509
+
510
+ /**
511
+ * Check if an organization has any remote (externally deployed) resources
512
+ *
513
+ * @param orgName - Organization name
514
+ * @returns true if the org has at least one runtime-registered resource
515
+ */
516
+ isRemote(orgName: string): boolean {
517
+ const prefix = `${orgName}/`
518
+ for (const key of this.remoteResources.keys()) {
519
+ if (key.startsWith(prefix)) return true
520
+ }
521
+ return false
522
+ }
523
+
524
+ /**
525
+ * Get the remote config for any resource in an organization.
526
+ * Used when the specific resource ID is unknown (e.g., to clean up a
527
+ * temp file before unregistering an org -- all resources share one config).
528
+ *
529
+ * @param orgName - Organization name
530
+ * @returns Remote config or null if org has no remote resources
531
+ */
532
+ getAnyRemoteConfig(orgName: string): RemoteOrgConfig | null {
533
+ const prefix = `${orgName}/`
534
+ for (const [key, config] of this.remoteResources) {
535
+ if (key.startsWith(prefix)) return config
536
+ }
537
+ return null
538
+ }
539
+
540
+ /**
541
+ * Get statistics about remotely-deployed resources
542
+ * Used by the health endpoint for platform-wide deployment visibility.
543
+ */
544
+ getRemoteStats(): { activeOrgs: number; totalResources: number } {
545
+ const orgs = new Set<string>()
546
+ for (const key of this.remoteResources.keys()) {
547
+ const orgName = key.split('/')[0]
548
+ orgs.add(orgName)
549
+ }
550
+ return {
551
+ activeOrgs: orgs.size,
552
+ totalResources: this.remoteResources.size
553
+ }
554
+ }
555
+
556
+ // ============================================================================
557
+ // Resource Manifest Accessors
558
+ // ============================================================================
559
+
560
+ /**
561
+ * Get triggers for an organization
562
+ * @param organizationName - Organization name
563
+ * @returns Array of trigger definitions (empty if none defined)
564
+ */
565
+ getTriggers(organizationName: string): TriggerDefinition[] {
566
+ return this.registry[organizationName]?.triggers ?? []
567
+ }
568
+
569
+ /**
570
+ * Get integrations for an organization
571
+ * @param organizationName - Organization name
572
+ * @returns Array of integration definitions (empty if none defined)
573
+ */
574
+ getIntegrations(organizationName: string): IntegrationDefinition[] {
575
+ return this.registry[organizationName]?.integrations ?? []
576
+ }
577
+
578
+ /**
579
+ * Get resource relationships for an organization
580
+ * @param organizationName - Organization name
581
+ * @returns Resource relationships map (undefined if none defined)
582
+ */
583
+ getRelationships(organizationName: string): ResourceRelationships | undefined {
584
+ return this.registry[organizationName]?.relationships
585
+ }
586
+
587
+ /**
588
+ * Get a specific trigger by ID
589
+ * @param organizationName - Organization name
590
+ * @param triggerId - Trigger ID
591
+ * @returns Trigger definition or null if not found
592
+ */
593
+ getTrigger(organizationName: string, triggerId: string): TriggerDefinition | null {
594
+ const triggers = this.getTriggers(organizationName)
595
+ return triggers.find((t) => t.resourceId === triggerId) ?? null
596
+ }
597
+
598
+ /**
599
+ * Get a specific integration by ID
600
+ * @param organizationName - Organization name
601
+ * @param integrationId - Integration ID
602
+ * @returns Integration definition or null if not found
603
+ */
604
+ getIntegration(organizationName: string, integrationId: string): IntegrationDefinition | null {
605
+ const integrations = this.getIntegrations(organizationName)
606
+ return integrations.find((i) => i.resourceId === integrationId) ?? null
607
+ }
608
+
609
+ /**
610
+ * Get external resources for an organization
611
+ * @param organizationName - Organization name
612
+ * @returns Array of external resource definitions (empty if none defined)
613
+ */
614
+ getExternalResources(organizationName: string): ExternalResourceDefinition[] {
615
+ return this.registry[organizationName]?.externalResources ?? []
616
+ }
617
+
618
+ /**
619
+ * Get a specific external resource by ID
620
+ * @param organizationName - Organization name
621
+ * @param externalId - External resource ID
622
+ * @returns External resource definition or null if not found
623
+ */
624
+ getExternalResource(organizationName: string, externalId: string): ExternalResourceDefinition | null {
625
+ const externalResources = this.getExternalResources(organizationName)
626
+ return externalResources.find((e) => e.resourceId === externalId) ?? null
627
+ }
628
+
629
+ /**
630
+ * Get human checkpoints for an organization
631
+ * @param organizationName - Organization name
632
+ * @returns Array of human checkpoint definitions (empty if none defined)
633
+ */
634
+ getHumanCheckpoints(organizationName: string): HumanCheckpointDefinition[] {
635
+ return this.registry[organizationName]?.humanCheckpoints ?? []
636
+ }
637
+
638
+ /**
639
+ * Get a specific human checkpoint by ID
640
+ * @param organizationName - Organization name
641
+ * @param humanCheckpointId - Human checkpoint ID
642
+ * @returns Human checkpoint definition or null if not found
643
+ */
644
+ getHumanCheckpoint(organizationName: string, humanCheckpointId: string): HumanCheckpointDefinition | null {
645
+ const humanCheckpoints = this.getHumanCheckpoints(organizationName)
646
+ return humanCheckpoints.find((hc) => hc.resourceId === humanCheckpointId) ?? null
647
+ }
648
+
649
+ // ============================================================================
650
+ // Serialized Data Access (Pre-computed at Startup)
651
+ // ============================================================================
652
+
653
+ /**
654
+ * Get serialized resource definition (instant lookup)
655
+ * Use for API responses - returns pre-computed JSON-safe structure
656
+ *
657
+ * @param organizationName - Organization name
658
+ * @param resourceId - Resource ID
659
+ * @returns Serialized definition or null if not found
660
+ */
661
+ getSerializedDefinition(
662
+ organizationName: string,
663
+ resourceId: string
664
+ ): SerializedAgentDefinition | SerializedWorkflowDefinition | null {
665
+ const cache = this.serializedCache.get(organizationName)
666
+ if (!cache) return null
667
+
668
+ return cache.definitions.agents.get(resourceId) ?? cache.definitions.workflows.get(resourceId) ?? null
669
+ }
670
+
671
+ /**
672
+ * Get resource list for organization (instant lookup)
673
+ * Use for /resources endpoint - returns pre-computed ResourceDefinition array
674
+ *
675
+ * @param organizationName - Organization name
676
+ * @returns Resource list with workflows, agents, and total count
677
+ */
678
+ getResourceList(organizationName: string): {
679
+ workflows: ResourceDefinition[]
680
+ agents: ResourceDefinition[]
681
+ total: number
682
+ } {
683
+ const cache = this.serializedCache.get(organizationName)
684
+ if (!cache) {
685
+ return { workflows: [], agents: [], total: 0 }
686
+ }
687
+ return cache.resources
688
+ }
689
+
690
+ /**
691
+ * Get Command View data for organization (instant lookup)
692
+ * Use for /command-view endpoint - returns complete graph data
693
+ *
694
+ * @param organizationName - Organization name
695
+ * @returns Command View data with nodes and edges
696
+ */
697
+ getCommandViewData(organizationName: string): CommandViewData {
698
+ const cache = this.serializedCache.get(organizationName)
699
+ if (!cache) {
700
+ return {
701
+ workflows: [],
702
+ agents: [],
703
+ triggers: [],
704
+ integrations: [],
705
+ externalResources: [],
706
+ humanCheckpoints: [],
707
+ edges: []
708
+ }
709
+ }
710
+ return cache.commandView
711
+ }
712
+
713
+ /**
714
+ * List resources that have UI interfaces configured
715
+ * Used by Execution Runner Catalog UI
716
+ *
717
+ * @param organizationName - Organization name
718
+ * @param environment - Optional environment filter ('dev' or 'prod')
719
+ * @returns Array of resources with interfaces
720
+ */
721
+ listExecutable(
722
+ organizationName: string,
723
+ environment?: 'dev' | 'prod'
724
+ ): Array<{
725
+ resourceId: string
726
+ resourceName: string
727
+ resourceType: 'workflow' | 'agent'
728
+ description?: string
729
+ status: 'dev' | 'prod'
730
+ version: string
731
+ interface: SerializedExecutionInterface
732
+ }> {
733
+ const cache = this.serializedCache.get(organizationName)
734
+ if (!cache) {
735
+ return []
736
+ }
737
+
738
+ const results: Array<{
739
+ resourceId: string
740
+ resourceName: string
741
+ resourceType: 'workflow' | 'agent'
742
+ description?: string
743
+ status: 'dev' | 'prod'
744
+ version: string
745
+ interface: SerializedExecutionInterface
746
+ }> = []
747
+
748
+ // Check workflows with interfaces
749
+ cache.definitions.workflows.forEach((serializedWorkflow, resourceId) => {
750
+ // Skip if no interface defined
751
+ if (!serializedWorkflow.interface) return
752
+
753
+ // Apply environment filter if specified
754
+ if (environment && serializedWorkflow.config.status !== environment) return
755
+
756
+ results.push({
757
+ resourceId,
758
+ resourceName: serializedWorkflow.config.name,
759
+ resourceType: 'workflow',
760
+ description: serializedWorkflow.config.description,
761
+ status: serializedWorkflow.config.status as 'dev' | 'prod',
762
+ version: serializedWorkflow.config.version,
763
+ interface: serializedWorkflow.interface
764
+ })
765
+ })
766
+
767
+ // Check agents with interfaces
768
+ cache.definitions.agents.forEach((serializedAgent, resourceId) => {
769
+ // Skip if no interface defined
770
+ if (!serializedAgent.interface) return
771
+
772
+ // Apply environment filter if specified
773
+ if (environment && serializedAgent.config.status !== environment) return
774
+
775
+ results.push({
776
+ resourceId,
777
+ resourceName: serializedAgent.config.name,
778
+ resourceType: 'agent',
779
+ description: serializedAgent.config.description,
780
+ status: serializedAgent.config.status as 'dev' | 'prod',
781
+ version: serializedAgent.config.version,
782
+ interface: serializedAgent.interface
783
+ })
784
+ })
785
+
786
+ return results
787
+ }
788
+ }