@elevasis/core 0.7.0 → 0.8.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 (473) hide show
  1. package/package.json +3 -3
  2. package/src/README.md +41 -41
  3. package/src/__tests__/publish.test.ts +18 -18
  4. package/src/__tests__/{template-foundations-compatibility.test.ts → template-core-compatibility.test.ts} +99 -99
  5. package/src/_gen/__tests__/__snapshots__/contracts.md.snap +1135 -1131
  6. package/src/_gen/__tests__/scaffold-contracts.test.ts +53 -53
  7. package/src/_gen/scaffold-contracts.ts +45 -45
  8. package/src/auth/multi-tenancy/credentials/README.md +38 -38
  9. package/src/auth/multi-tenancy/credentials/index.ts +6 -6
  10. package/src/auth/multi-tenancy/credentials/server/encryption.ts +39 -39
  11. package/src/auth/multi-tenancy/credentials/server/service.ts +60 -60
  12. package/src/auth/multi-tenancy/index.ts +17 -17
  13. package/src/auth/multi-tenancy/invitations/api-schemas.ts +107 -107
  14. package/src/auth/multi-tenancy/invitations/index.ts +37 -37
  15. package/src/auth/multi-tenancy/invitations/invitation.ts +86 -86
  16. package/src/auth/multi-tenancy/invitations/server/index.ts +25 -25
  17. package/src/auth/multi-tenancy/invitations/server/transforms.ts +24 -24
  18. package/src/auth/multi-tenancy/invitations/server/workos.ts +24 -24
  19. package/src/auth/multi-tenancy/invitations/supabase.ts +50 -50
  20. package/src/auth/multi-tenancy/memberships/api-schemas.ts +126 -126
  21. package/src/auth/multi-tenancy/memberships/index.ts +21 -21
  22. package/src/auth/multi-tenancy/memberships/membership.ts +138 -138
  23. package/src/auth/multi-tenancy/memberships/server/index.ts +15 -15
  24. package/src/auth/multi-tenancy/memberships/server/transforms.ts +32 -32
  25. package/src/auth/multi-tenancy/memberships/server/workos.ts +21 -21
  26. package/src/auth/multi-tenancy/memberships/supabase.ts +46 -46
  27. package/src/auth/multi-tenancy/organizations/api-schemas.ts +128 -128
  28. package/src/auth/multi-tenancy/organizations/index.ts +23 -23
  29. package/src/auth/multi-tenancy/organizations/organization.ts +24 -24
  30. package/src/auth/multi-tenancy/organizations/server/index.ts +10 -10
  31. package/src/auth/multi-tenancy/organizations/server/transforms.ts +35 -35
  32. package/src/auth/multi-tenancy/organizations/server/workos.ts +20 -20
  33. package/src/auth/multi-tenancy/types.ts +83 -83
  34. package/src/auth/multi-tenancy/users/api-schemas.ts +194 -194
  35. package/src/auth/multi-tenancy/users/index.ts +27 -27
  36. package/src/auth/multi-tenancy/users/server/index.ts +19 -19
  37. package/src/auth/multi-tenancy/users/server/transforms.ts +21 -21
  38. package/src/auth/multi-tenancy/users/server/workos.ts +16 -16
  39. package/src/auth/multi-tenancy/users/user.ts +65 -65
  40. package/src/business/README.md +52 -52
  41. package/src/business/__tests__/entities-published.test.ts +33 -33
  42. package/src/business/acquisition/api-schemas.ts +759 -759
  43. package/src/business/acquisition/index.ts +109 -109
  44. package/src/business/acquisition/types.ts +402 -402
  45. package/src/business/base-entities.test.ts +481 -481
  46. package/src/business/base-entities.ts +241 -241
  47. package/src/business/entities-published.ts +24 -24
  48. package/src/business/index.ts +15 -15
  49. package/src/business/pdf/browser/pdfmake-browser.ts +229 -229
  50. package/src/business/pdf/index.ts +10 -10
  51. package/src/business/pdf/server/index.ts +21 -21
  52. package/src/business/pdf/server/themes/default.ts +8 -8
  53. package/src/business/pdf/server/themes/index.ts +9 -9
  54. package/src/business/pdf/server/themes/types.ts +8 -8
  55. package/src/business/pdf/types.ts +272 -272
  56. package/src/business/projects/index.ts +2 -1
  57. package/src/business/projects/sse-events.ts +21 -0
  58. package/src/business/projects/types.ts +89 -89
  59. package/src/business/sales/api-schemas.ts +75 -75
  60. package/src/business/seo/__tests__/linking.test.ts +549 -549
  61. package/src/business/seo/__tests__/types.test.ts +404 -404
  62. package/src/business/seo/index.ts +2 -2
  63. package/src/business/seo/linking.ts +281 -281
  64. package/src/business/seo/types.ts +199 -199
  65. package/src/commands/queue/index.ts +3 -3
  66. package/src/commands/queue/schemas.test.ts +593 -593
  67. package/src/commands/queue/schemas.ts +125 -125
  68. package/src/commands/queue/sse-events.ts +61 -61
  69. package/src/commands/queue/types/action.ts +52 -52
  70. package/src/commands/queue/types/checkpoint.ts +44 -44
  71. package/src/commands/queue/types/index.ts +7 -7
  72. package/src/commands/queue/types/task.ts +116 -116
  73. package/src/commands/queue/types.ts +14 -14
  74. package/src/content/distribution-metadata.ts +61 -61
  75. package/src/content/index.ts +10 -10
  76. package/src/deployments/index.ts +22 -22
  77. package/src/execution/core/__tests__/archived-logs.test.ts +72 -72
  78. package/src/execution/core/index.ts +11 -11
  79. package/src/execution/core/runner-types.ts +80 -80
  80. package/src/execution/core/server/environment.ts +31 -31
  81. package/src/execution/core/sse-executions.ts +119 -119
  82. package/src/execution/core/types.ts +29 -29
  83. package/src/execution/engine/__tests__/fixtures/test-agents.ts +4 -4
  84. package/src/execution/engine/__tests__/timeout.test.ts +565 -565
  85. package/src/execution/engine/agent/__tests__/errors.test.ts +508 -508
  86. package/src/execution/engine/agent/actions/__tests__/processor.test.ts +531 -531
  87. package/src/execution/engine/agent/actions/executor.ts +205 -205
  88. package/src/execution/engine/agent/actions/navigate-knowledge-executor.ts +230 -230
  89. package/src/execution/engine/agent/actions/processor.ts +116 -116
  90. package/src/execution/engine/agent/actions/types.ts +70 -70
  91. package/src/execution/engine/agent/core/agent.ts +810 -810
  92. package/src/execution/engine/agent/core/types.ts +155 -155
  93. package/src/execution/engine/agent/errors.ts +251 -251
  94. package/src/execution/engine/agent/index.ts +78 -78
  95. package/src/execution/engine/agent/knowledge-map/types.ts +106 -106
  96. package/src/execution/engine/agent/knowledge-map/utils.ts +101 -101
  97. package/src/execution/engine/agent/memory/__tests__/manager.test.ts +754 -754
  98. package/src/execution/engine/agent/memory/domains.ts +99 -99
  99. package/src/execution/engine/agent/memory/manager.ts +365 -365
  100. package/src/execution/engine/agent/memory/processor.ts +66 -66
  101. package/src/execution/engine/agent/memory/types.ts +90 -90
  102. package/src/execution/engine/agent/memory/utils.ts +134 -134
  103. package/src/execution/engine/agent/observability/logging.ts +467 -467
  104. package/src/execution/engine/agent/observability/types.ts +64 -64
  105. package/src/execution/engine/agent/reasoning/adapters/agent-adapter-helpers.ts +349 -349
  106. package/src/execution/engine/agent/reasoning/processor.ts +92 -92
  107. package/src/execution/engine/agent/reasoning/prompt-sections/base-actions.ts +134 -134
  108. package/src/execution/engine/agent/reasoning/prompt-sections/completion.ts +49 -49
  109. package/src/execution/engine/agent/reasoning/prompt-sections/knowledge-map.ts +93 -93
  110. package/src/execution/engine/agent/reasoning/prompt-sections/memory.ts +65 -65
  111. package/src/execution/engine/agent/reasoning/prompt-sections/tools.ts +44 -44
  112. package/src/execution/engine/agent/reasoning/request-builder.ts +169 -169
  113. package/src/execution/engine/agent/reasoning/types.ts +18 -18
  114. package/src/execution/engine/base/errors.ts +118 -118
  115. package/src/execution/engine/base/index.ts +2 -2
  116. package/src/execution/engine/base/logging.ts +31 -31
  117. package/src/execution/engine/base/serialization.ts +324 -324
  118. package/src/execution/engine/base/types.ts +126 -126
  119. package/src/execution/engine/base/utils.ts +41 -41
  120. package/src/execution/engine/index.ts +434 -434
  121. package/src/execution/engine/interface/index.ts +1 -1
  122. package/src/execution/engine/interface/types.ts +62 -62
  123. package/src/execution/engine/llm/__tests__/model-info.test.ts +50 -50
  124. package/src/execution/engine/llm/__tests__/model-validation.test.ts +321 -321
  125. package/src/execution/engine/llm/__tests__/response-schema-validator.test.ts +115 -115
  126. package/src/execution/engine/llm/adapters/__tests__/adapter-factory.test.ts +375 -375
  127. package/src/execution/engine/llm/adapters/__tests__/anthropic-adapter.test.ts +463 -463
  128. package/src/execution/engine/llm/adapters/__tests__/anthropic.integration.test.ts +177 -177
  129. package/src/execution/engine/llm/adapters/__tests__/google-adapter.test.ts +722 -722
  130. package/src/execution/engine/llm/adapters/__tests__/google.integration.test.ts +376 -376
  131. package/src/execution/engine/llm/adapters/__tests__/openai-adapter.test.ts +551 -551
  132. package/src/execution/engine/llm/adapters/__tests__/openrouter-adapter.test.ts +563 -563
  133. package/src/execution/engine/llm/adapters/__tests__/openrouter.integration.test.ts +105 -105
  134. package/src/execution/engine/llm/adapters/__tests__/universal-adapter.test.ts +537 -537
  135. package/src/execution/engine/llm/adapters/circuit-breaker.ts +147 -147
  136. package/src/execution/engine/llm/adapters/index.ts +17 -17
  137. package/src/execution/engine/llm/adapters/mock-adapter.ts +116 -116
  138. package/src/execution/engine/llm/adapters/server/adapter-factory.ts +130 -130
  139. package/src/execution/engine/llm/adapters/server/anthropic.ts +137 -137
  140. package/src/execution/engine/llm/adapters/server/google.ts +283 -283
  141. package/src/execution/engine/llm/adapters/server/index.ts +12 -12
  142. package/src/execution/engine/llm/adapters/server/openai.ts +206 -206
  143. package/src/execution/engine/llm/adapters/server/openrouter.ts +235 -235
  144. package/src/execution/engine/llm/adapters/universal-adapter.ts +230 -230
  145. package/src/execution/engine/llm/errors.ts +186 -186
  146. package/src/execution/engine/llm/model-info.ts +332 -332
  147. package/src/execution/engine/llm/response-schema-validator.ts +113 -113
  148. package/src/execution/engine/llm/types.ts +86 -86
  149. package/src/execution/engine/test-utils/index.ts +6 -6
  150. package/src/execution/engine/test-utils/mocks.ts +56 -56
  151. package/src/execution/engine/tools/integration/base-integration-adapter.ts +50 -50
  152. package/src/execution/engine/tools/integration/index.ts +53 -53
  153. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-adapter.ts +73 -73
  154. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-tools.ts +209 -209
  155. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-company-email/index.ts +82 -82
  156. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-decision-maker-email/index.ts +122 -122
  157. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-person-email/index.ts +89 -89
  158. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/verify-email/index.ts +84 -84
  159. package/src/execution/engine/tools/integration/server/adapters/anymailfinder/index.ts +16 -16
  160. package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +293 -293
  161. package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +100 -100
  162. package/src/execution/engine/tools/integration/server/adapters/apify/apify-tools.ts +217 -217
  163. package/src/execution/engine/tools/integration/server/adapters/apify/fetch/get-dataset-items/index.ts +92 -92
  164. package/src/execution/engine/tools/integration/server/adapters/apify/fetch/run-actor/index.ts +218 -218
  165. package/src/execution/engine/tools/integration/server/adapters/apify/fetch/start-actor/index.ts +87 -87
  166. package/src/execution/engine/tools/integration/server/adapters/apify/index.ts +11 -11
  167. package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +361 -361
  168. package/src/execution/engine/tools/integration/server/adapters/attio/attio-adapter.ts +162 -162
  169. package/src/execution/engine/tools/integration/server/adapters/attio/attio-tools.ts +594 -594
  170. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-attribute/index.ts +214 -214
  171. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-note/index.ts +152 -152
  172. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-record/index.ts +141 -141
  173. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-note/index.ts +86 -86
  174. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-record/index.ts +105 -105
  175. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.ts +118 -118
  176. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-attributes/index.ts +165 -165
  177. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-notes/index.ts +96 -96
  178. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-objects/index.ts +104 -104
  179. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.ts +156 -156
  180. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-attribute/index.ts +220 -220
  181. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-record/index.ts +140 -140
  182. package/src/execution/engine/tools/integration/server/adapters/attio/fetch/utils/types.ts +146 -146
  183. package/src/execution/engine/tools/integration/server/adapters/attio/index.ts +31 -31
  184. package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +210 -210
  185. package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +104 -104
  186. package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -261
  187. package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-adapter.ts +1189 -1189
  188. package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-tools.ts +641 -641
  189. package/src/execution/engine/tools/integration/server/adapters/google-sheets/index.ts +18 -18
  190. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/activate-campaign/index.ts +86 -86
  191. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/__tests__/index.test.ts +289 -289
  192. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/index.ts +154 -154
  193. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/__tests__/index.test.ts +325 -325
  194. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/index.ts +153 -153
  195. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-delete-leads/index.ts +84 -84
  196. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-campaign/index.ts +125 -125
  197. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-inbox-test/index.ts +107 -107
  198. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/delete-campaign/index.ts +85 -85
  199. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-account-health/index.ts +91 -91
  200. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign/index.ts +92 -92
  201. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/__tests__/index.test.ts +195 -195
  202. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/index.ts +113 -113
  203. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-daily-campaign-analytics/index.ts +104 -104
  204. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-emails/index.ts +155 -155
  205. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/__tests__/index.test.ts +196 -196
  206. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/index.ts +102 -102
  207. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/__tests__/index.test.ts +189 -189
  208. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/index.ts +87 -87
  209. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-leads/index.ts +112 -112
  210. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/patch-lead/index.ts +76 -76
  211. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/pause-campaign/index.ts +86 -86
  212. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/remove-from-subsequence/index.ts +98 -98
  213. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/send-reply/index.ts +126 -126
  214. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/__tests__/index.test.ts +193 -193
  215. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/index.ts +99 -99
  216. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/__tests__/index.test.ts +621 -621
  217. package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/index.ts +125 -125
  218. package/src/execution/engine/tools/integration/server/adapters/instantly/index.ts +29 -29
  219. package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-adapter.ts +178 -178
  220. package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1473 -1473
  221. package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/check-credits/index.ts +59 -59
  222. package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/verify-email/index.ts +102 -102
  223. package/src/execution/engine/tools/integration/server/adapters/millionverifier/index.ts +17 -17
  224. package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-adapter.ts +80 -80
  225. package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +102 -102
  226. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/get-email/index.ts +102 -102
  227. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +134 -134
  228. package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +75 -75
  229. package/src/execution/engine/tools/integration/server/adapters/resend/index.ts +27 -27
  230. package/src/execution/engine/tools/integration/server/adapters/resend/resend-adapter.ts +108 -108
  231. package/src/execution/engine/tools/integration/server/adapters/resend/resend-tools.ts +132 -132
  232. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/create-envelope/index.ts +274 -274
  233. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/download-document/index.ts +230 -230
  234. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/get-envelope/index.ts +133 -133
  235. package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/void-envelope/index.ts +90 -90
  236. package/src/execution/engine/tools/integration/server/adapters/stripe/fetch/utils/types.ts +210 -210
  237. package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-adapter.ts +517 -517
  238. package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +309 -309
  239. package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/domain-search/index.ts +133 -133
  240. package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-finder/index.ts +122 -122
  241. package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-verifier/index.ts +111 -111
  242. package/src/execution/engine/tools/integration/server/adapters/tomba/index.ts +11 -11
  243. package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-adapter.ts +78 -78
  244. package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-tools.ts +222 -222
  245. package/src/execution/engine/tools/integration/server/index.ts +61 -61
  246. package/src/execution/engine/tools/integration/service.ts +161 -161
  247. package/src/execution/engine/tools/integration/tool.ts +253 -253
  248. package/src/execution/engine/tools/integration/types/anymailfinder.ts +74 -74
  249. package/src/execution/engine/tools/integration/types/apify.ts +92 -92
  250. package/src/execution/engine/tools/integration/types/index.ts +19 -19
  251. package/src/execution/engine/tools/integration/types/instantly.ts +557 -557
  252. package/src/execution/engine/tools/integration/types/millionverifier.ts +56 -56
  253. package/src/execution/engine/tools/integration/types/stripe.ts +162 -162
  254. package/src/execution/engine/tools/integration/types/tomba.ts +94 -94
  255. package/src/execution/engine/tools/lead-service-types.ts +884 -884
  256. package/src/execution/engine/tools/llm/index.ts +11 -11
  257. package/src/execution/engine/tools/llm/server/index.ts +8 -8
  258. package/src/execution/engine/tools/llm/server/llm-call-tool.ts +118 -118
  259. package/src/execution/engine/tools/platform/__tests__/pdf.test.ts +441 -441
  260. package/src/execution/engine/tools/platform/acquisition/company-tools.ts +248 -248
  261. package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +319 -319
  262. package/src/execution/engine/tools/platform/acquisition/index.ts +43 -43
  263. package/src/execution/engine/tools/platform/acquisition/list-tools.ts +148 -148
  264. package/src/execution/engine/tools/platform/acquisition/types.ts +260 -260
  265. package/src/execution/engine/tools/platform/email/index.ts +122 -122
  266. package/src/execution/engine/tools/platform/email/types.ts +96 -96
  267. package/src/execution/engine/tools/platform/index.ts +157 -157
  268. package/src/execution/engine/tools/platform/notification.ts +81 -81
  269. package/src/execution/engine/tools/platform/pdf/index.ts +110 -110
  270. package/src/execution/engine/tools/platform/pdf/types.ts +77 -77
  271. package/src/execution/engine/tools/platform/scheduler.ts +87 -87
  272. package/src/execution/engine/tools/platform/storage/index.ts +370 -370
  273. package/src/execution/engine/tools/platform/types.ts +148 -148
  274. package/src/execution/engine/tools/registry.ts +700 -699
  275. package/src/execution/engine/tools/tool-maps.ts +786 -786
  276. package/src/execution/engine/tools/types.ts +233 -233
  277. package/src/execution/engine/workflow/__tests__/errors.test.ts +139 -139
  278. package/src/execution/engine/workflow/errors.ts +63 -63
  279. package/src/execution/engine/workflow/helpers/index.ts +11 -11
  280. package/src/execution/engine/workflow/helpers/server/index.ts +8 -8
  281. package/src/execution/engine/workflow/helpers/server/llm-call.ts +93 -93
  282. package/src/execution/engine/workflow/index.ts +19 -19
  283. package/src/execution/engine/workflow/log-truncate.ts +26 -26
  284. package/src/execution/engine/workflow/logging.ts +191 -191
  285. package/src/execution/engine/workflow/types.ts +182 -182
  286. package/src/execution/engine/workflow/utils.ts +280 -280
  287. package/src/execution/engine/workflow/workflow.ts +168 -168
  288. package/src/execution/index.ts +3 -3
  289. package/src/execution/scheduler/__tests__/api-schemas.test.ts +733 -733
  290. package/src/execution/scheduler/__tests__/utils.test.ts +1009 -1009
  291. package/src/execution/scheduler/api-schemas.ts +296 -296
  292. package/src/execution/scheduler/index.ts +50 -50
  293. package/src/execution/scheduler/schemas.ts +264 -264
  294. package/src/execution/scheduler/types.ts +111 -111
  295. package/src/execution/scheduler/utils.ts +364 -364
  296. package/src/forms/index.ts +7 -7
  297. package/src/forms/schemas.ts +69 -69
  298. package/src/forms/types.ts +70 -70
  299. package/src/index.ts +71 -60
  300. package/src/integrations/credentials/__tests__/schemas.test.ts +82 -82
  301. package/src/integrations/credentials/__tests__/utils.test.ts +144 -144
  302. package/src/integrations/credentials/api-schemas.ts +143 -143
  303. package/src/integrations/credentials/index.ts +32 -32
  304. package/src/integrations/credentials/schemas.ts +164 -164
  305. package/src/integrations/credentials/utils.ts +59 -59
  306. package/src/integrations/oauth/__tests__/provider-registry.test.ts +59 -59
  307. package/src/integrations/oauth/api-schemas.ts +92 -92
  308. package/src/integrations/oauth/index.ts +19 -19
  309. package/src/integrations/oauth/provider-registry.ts +61 -61
  310. package/src/integrations/oauth/server/__tests__/refresh-concurrent.test.ts +183 -183
  311. package/src/integrations/oauth/server/__tests__/refresh.test.ts +577 -577
  312. package/src/integrations/oauth/server/credentials.ts +39 -39
  313. package/src/integrations/oauth/server/refresh.ts +214 -214
  314. package/src/integrations/oauth/types.ts +34 -34
  315. package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +318 -318
  316. package/src/integrations/webhook-endpoints/api-schemas.ts +102 -102
  317. package/src/integrations/webhook-endpoints/index.ts +28 -28
  318. package/src/integrations/webhook-endpoints/types.ts +51 -51
  319. package/src/operations/activities/api-schemas.ts +79 -79
  320. package/src/operations/activities/index.ts +9 -9
  321. package/src/operations/activities/sse-events.ts +30 -30
  322. package/src/operations/activities/types.ts +63 -63
  323. package/src/operations/debug-logs/client.ts +60 -60
  324. package/src/operations/debug-logs/debug-logger.ts +83 -83
  325. package/src/operations/debug-logs/index.ts +8 -8
  326. package/src/operations/debug-logs/server.ts +19 -19
  327. package/src/operations/debug-logs/types.ts +33 -33
  328. package/src/operations/index.ts +50 -50
  329. package/src/operations/notifications/api-schemas.ts +91 -91
  330. package/src/operations/notifications/index.ts +3 -3
  331. package/src/operations/notifications/sse-events.ts +21 -21
  332. package/src/operations/notifications/types.ts +47 -47
  333. package/src/operations/observability/__tests__/openrouter-cost-flow.test.ts +297 -297
  334. package/src/operations/observability/__tests__/utils.test.ts +54 -54
  335. package/src/operations/observability/ai-usage-collector.ts +64 -64
  336. package/src/operations/observability/index.ts +13 -13
  337. package/src/operations/observability/metrics-collector.ts +49 -49
  338. package/src/operations/observability/schemas.ts +39 -39
  339. package/src/operations/observability/types.ts +463 -463
  340. package/src/operations/observability/utils.ts +77 -77
  341. package/src/operations/sessions/__tests__/manager.test.ts +821 -821
  342. package/src/operations/sessions/index.ts +26 -26
  343. package/src/operations/sessions/server/manager.ts +90 -90
  344. package/src/operations/sessions/server/session.ts +180 -180
  345. package/src/operations/sessions/types.ts +98 -98
  346. package/src/operations/triggers/index.ts +12 -12
  347. package/src/operations/triggers/webhook/definitions/instantly-account-error.ts +44 -44
  348. package/src/operations/triggers/webhook/definitions/instantly-auto-reply-received.ts +51 -51
  349. package/src/operations/triggers/webhook/definitions/instantly-campaign-completed.ts +45 -45
  350. package/src/operations/triggers/webhook/definitions/instantly-email-bounced.ts +49 -49
  351. package/src/operations/triggers/webhook/definitions/instantly-lead-unsubscribed.ts +45 -45
  352. package/src/operations/triggers/webhook/definitions/instantly-reply-received.ts +54 -54
  353. package/src/operations/triggers/webhook/index.ts +35 -35
  354. package/src/operations/triggers/webhook/types.ts +74 -74
  355. package/src/organization-model/README.md +97 -97
  356. package/src/organization-model/__tests__/defaults.test.ts +175 -175
  357. package/src/organization-model/__tests__/domains/customers.test.ts +295 -295
  358. package/src/organization-model/__tests__/domains/goals.test.ts +479 -479
  359. package/src/organization-model/__tests__/domains/identity.test.ts +279 -279
  360. package/src/organization-model/__tests__/domains/navigation.test.ts +212 -212
  361. package/src/organization-model/__tests__/domains/offerings.test.ts +419 -419
  362. package/src/organization-model/__tests__/domains/operations.test.ts +203 -203
  363. package/src/organization-model/__tests__/domains/resource-mappings.test.ts +362 -362
  364. package/src/organization-model/__tests__/domains/roles.test.ts +347 -347
  365. package/src/organization-model/__tests__/domains/statuses.test.ts +243 -243
  366. package/src/organization-model/__tests__/foundation.test.ts +105 -105
  367. package/src/organization-model/__tests__/graph.test.ts +894 -894
  368. package/src/organization-model/__tests__/resolve.test.ts +690 -690
  369. package/src/organization-model/__tests__/schema.test.ts +407 -407
  370. package/src/organization-model/contracts.ts +14 -14
  371. package/src/organization-model/defaults.ts +148 -148
  372. package/src/organization-model/domains/branding.ts +22 -22
  373. package/src/organization-model/domains/customers.ts +75 -75
  374. package/src/organization-model/domains/features.ts +22 -22
  375. package/src/organization-model/domains/goals.ts +80 -80
  376. package/src/organization-model/domains/identity.ts +94 -94
  377. package/src/organization-model/domains/navigation.ts +391 -391
  378. package/src/organization-model/domains/offerings.ts +66 -66
  379. package/src/organization-model/domains/operations.ts +85 -85
  380. package/src/organization-model/domains/projects.ts +48 -48
  381. package/src/organization-model/domains/prospecting.ts +33 -33
  382. package/src/organization-model/domains/roles.ts +55 -55
  383. package/src/organization-model/domains/sales.ts +94 -94
  384. package/src/organization-model/domains/shared.ts +62 -62
  385. package/src/organization-model/domains/statuses.ts +130 -130
  386. package/src/organization-model/foundation.ts +97 -97
  387. package/src/organization-model/graph/build.ts +399 -399
  388. package/src/organization-model/graph/index.ts +4 -4
  389. package/src/organization-model/graph/schema.ts +48 -48
  390. package/src/organization-model/graph/types.ts +40 -40
  391. package/src/organization-model/index.ts +13 -13
  392. package/src/organization-model/organization-graph.mdx +272 -272
  393. package/src/organization-model/organization-model.mdx +320 -320
  394. package/src/organization-model/published.ts +85 -85
  395. package/src/organization-model/resolve.ts +66 -66
  396. package/src/organization-model/schema.ts +287 -287
  397. package/src/organization-model/types.ts +46 -46
  398. package/src/platform/api/index.ts +1 -1
  399. package/src/platform/api/types.ts +35 -35
  400. package/src/platform/constants/http.ts +37 -37
  401. package/src/platform/constants/index.ts +5 -5
  402. package/src/platform/constants/limits.ts +32 -32
  403. package/src/platform/constants/resilience.ts +51 -51
  404. package/src/platform/constants/timeouts.ts +20 -20
  405. package/src/platform/constants/versions.ts +3 -3
  406. package/src/platform/registry/__tests__/resource-registry-static.test.ts +347 -347
  407. package/src/platform/registry/__tests__/resource-registry.integration.test.ts +1028 -1028
  408. package/src/platform/registry/__tests__/resource-registry.list-executable.test.ts +393 -393
  409. package/src/platform/registry/__tests__/resource-registry.test.ts +2005 -2005
  410. package/src/platform/registry/__tests__/serialization.test.ts +1127 -1127
  411. package/src/platform/registry/command-view.ts +180 -180
  412. package/src/platform/registry/domains.ts +165 -165
  413. package/src/platform/registry/index.ts +93 -93
  414. package/src/platform/registry/reserved.ts +24 -24
  415. package/src/platform/registry/resource-metadata.ts +59 -59
  416. package/src/platform/registry/resource-registry.command-queue-groups.test.ts +129 -129
  417. package/src/platform/registry/resource-registry.ts +876 -876
  418. package/src/platform/registry/serialization.ts +273 -273
  419. package/src/platform/registry/serialized-types.ts +231 -231
  420. package/src/platform/registry/stats-types.ts +66 -66
  421. package/src/platform/registry/types.ts +404 -404
  422. package/src/platform/registry/validation.ts +513 -513
  423. package/src/platform/resilience/__tests__/rate-limiter.test.ts +471 -471
  424. package/src/platform/resilience/circuit-breaker.ts +164 -164
  425. package/src/platform/resilience/errors.ts +68 -68
  426. package/src/platform/resilience/http-error-mapper.ts +129 -129
  427. package/src/platform/resilience/index.ts +93 -93
  428. package/src/platform/resilience/rate-limiter-types.ts +46 -46
  429. package/src/platform/resilience/rate-limiter.ts +140 -140
  430. package/src/platform/resilience/retry.ts +89 -89
  431. package/src/platform/resilience/timeout.ts +63 -63
  432. package/src/platform/sse/events.ts +37 -34
  433. package/src/platform/sse/index.ts +7 -7
  434. package/src/platform/utils/__tests__/validation.test.ts +1083 -1083
  435. package/src/platform/utils/currency.ts +96 -96
  436. package/src/platform/utils/debounce.ts +52 -52
  437. package/src/platform/utils/error.ts +41 -41
  438. package/src/platform/utils/hmac.test.ts +97 -97
  439. package/src/platform/utils/index.ts +32 -32
  440. package/src/platform/utils/server/betterstack-logger.ts +210 -210
  441. package/src/platform/utils/server/hmac.ts +44 -44
  442. package/src/platform/utils/server/unsubscribe.ts +111 -111
  443. package/src/platform/utils/token-counter.ts +96 -96
  444. package/src/platform/utils/validation.ts +425 -425
  445. package/src/projects/api-schemas.ts +268 -268
  446. package/src/published.ts +1 -1
  447. package/src/reference/_generated/contracts.md +611 -607
  448. package/src/reference/glossary.md +105 -105
  449. package/src/requests/__tests__/api-schemas.test.ts +277 -277
  450. package/src/requests/api-schemas.ts +83 -83
  451. package/src/requests/index.ts +1 -1
  452. package/src/scaffold-registry/__tests__/index.test.ts +17 -0
  453. package/src/scaffold-registry/__tests__/schema.test.ts +329 -230
  454. package/src/scaffold-registry/index.ts +205 -189
  455. package/src/scaffold-registry/schema.ts +196 -128
  456. package/src/server.ts +272 -272
  457. package/src/supabase/database.types.ts +2719 -2719
  458. package/src/supabase/helpers.ts +20 -20
  459. package/src/supabase/index.ts +52 -52
  460. package/src/supabase/server/client.ts +58 -58
  461. package/src/test-utils/README.md +38 -38
  462. package/src/test-utils/browser-mocks.ts +54 -54
  463. package/src/test-utils/fixtures/api-keys.ts +52 -52
  464. package/src/test-utils/fixtures/index.ts +4 -4
  465. package/src/test-utils/fixtures/memberships.ts +80 -80
  466. package/src/test-utils/fixtures/organizations.ts +69 -69
  467. package/src/test-utils/fixtures/users.ts +79 -79
  468. package/src/test-utils/index.ts +11 -11
  469. package/src/test-utils/mocks/index.ts +2 -2
  470. package/src/test-utils/mocks/supabase.ts +142 -142
  471. package/src/test-utils/mocks/workos.ts +108 -108
  472. package/src/test-utils/rls/RLSTestContext.ts +556 -556
  473. package/src/test-utils/rls/index.ts +1 -1
@@ -1,365 +1,365 @@
1
- /**
2
- * Memory Manager
3
- * Encapsulates all memory operations with ultra-simple agent API
4
- * Agent provides strings, framework handles wrapping and auto-compaction
5
- */
6
-
7
- import type { AgentMemory, MemoryEntry, MemoryStatus, MemoryConstraints } from './types'
8
- import { estimateTokens } from '../../../../platform/utils'
9
- import type { AgentScopedLogger } from '../observability/logging'
10
- import { AgentMemoryValidationError } from '../errors'
11
- import {
12
- MAX_SESSION_MEMORY_KEYS,
13
- MAX_MEMORY_TOKENS,
14
- MAX_SINGLE_ENTRY_TOKENS,
15
- MAX_TOOL_RESULT_TOKENS
16
- } from '../../../../platform/constants/limits'
17
-
18
- /**
19
- * Truncate tool result content if it exceeds the token limit.
20
- * Uses character-based estimation (1 token ~ 3.5 chars, matching estimateTokens).
21
- * Appends a notice so the agent knows data was cut.
22
- *
23
- * @param content - Raw tool result string
24
- * @param maxTokens - Maximum allowed tokens
25
- * @returns Original content if under limit, truncated content with notice otherwise
26
- */
27
- export function truncateToolResult(content: string, maxTokens: number): string {
28
- const estimated = estimateTokens(content)
29
- if (estimated <= maxTokens) return content
30
-
31
- // Use same ratio as estimateTokens (3.5 chars per token)
32
- const maxChars = Math.floor(maxTokens * 3.5)
33
- const truncated = content.slice(0, maxChars)
34
- const omitted = estimated - maxTokens
35
- return (
36
- truncated +
37
- `\n\n[Response truncated — estimated ${omitted} tokens omitted. Use more specific filters to get smaller results.]`
38
- )
39
- }
40
-
41
- /**
42
- * Memory Manager - Agent memory orchestration
43
- * Provides ultra-simple API for agents (strings only)
44
- * Handles automatic compaction and token management
45
- */
46
- export class MemoryManager {
47
- private cachedSnapshot?: AgentMemory
48
-
49
- constructor(
50
- private memory: AgentMemory,
51
- private constraints: MemoryConstraints = {},
52
- private logger?: AgentScopedLogger
53
- ) {}
54
-
55
- // === Agent Operations (Ultra-Simple) ===
56
-
57
- /**
58
- * Set session memory entry (agent provides string, framework wraps it)
59
- * @param key - Session memory key
60
- * @param content - String content from agent
61
- */
62
- set(key: string, content: string): void {
63
- // Check single entry token limit
64
- const entryTokens = estimateTokens(content)
65
- if (entryTokens > MAX_SINGLE_ENTRY_TOKENS) {
66
- const truncateTime = Date.now()
67
- this.logger?.action(
68
- 'memory-truncate',
69
- `Single entry exceeds token limit (${entryTokens}/${MAX_SINGLE_ENTRY_TOKENS}): ${key}`,
70
- 0,
71
- truncateTime,
72
- truncateTime,
73
- 0
74
- )
75
- // Truncate content to fit limit
76
- const maxChars = MAX_SINGLE_ENTRY_TOKENS * 4
77
- content = content.slice(0, maxChars) + '... [truncated]'
78
- }
79
-
80
- this.memory.sessionMemory[key] = {
81
- type: 'context',
82
- content,
83
- timestamp: Date.now(),
84
- turnNumber: null, // Session memory entries are not turn-specific
85
- iterationNumber: null // Session memory entries are not iteration-specific
86
- }
87
- }
88
-
89
- /**
90
- * Get session memory entry content
91
- * @param key - Session memory key
92
- * @returns String content if exists, undefined otherwise
93
- */
94
- get(key: string): string | undefined {
95
- const entry = this.memory.sessionMemory[key]
96
- return entry?.content
97
- }
98
-
99
- /**
100
- * Delete session memory entry
101
- * @param key - Key to delete
102
- * @returns True if key existed and was deleted
103
- */
104
- delete(key: string): boolean {
105
- if (key in this.memory.sessionMemory) {
106
- delete this.memory.sessionMemory[key]
107
- return true
108
- }
109
- return false
110
- }
111
-
112
- // === Framework Operations (Automatic) ===
113
-
114
- /**
115
- * Add entry to history (called by framework after tool results, reasoning, etc.)
116
- * Automatically sets timestamp to current time
117
- * @param entry - Memory entry to add (without timestamp - auto-generated)
118
- */
119
- addToHistory(entry: Omit<MemoryEntry, 'timestamp'>): void {
120
- // Validate turnNumber is provided for history entries (use null for session memory)
121
- if (entry.turnNumber === undefined && entry.type !== 'context') {
122
- throw new AgentMemoryValidationError('turnNumber required for history entries (use null for session memory)', {
123
- entryType: entry.type,
124
- missingField: 'turnNumber',
125
- iterationNumber: entry.iterationNumber
126
- })
127
- }
128
-
129
- // Truncate tool-result content if it exceeds the tool result token limit
130
- let content = entry.content
131
- if (entry.type === 'tool-result') {
132
- const before = content
133
- content = truncateToolResult(content, MAX_TOOL_RESULT_TOKENS)
134
- if (content !== before) {
135
- const truncateTime = Date.now()
136
- this.logger?.action(
137
- 'memory-tool-result-truncate',
138
- `Tool result truncated (${estimateTokens(before)} -> ${MAX_TOOL_RESULT_TOKENS} tokens)`,
139
- entry.iterationNumber ?? 0,
140
- truncateTime,
141
- truncateTime,
142
- 0
143
- )
144
- }
145
- }
146
-
147
- this.memory.history.push({
148
- ...entry,
149
- content,
150
- timestamp: Date.now()
151
- })
152
- // Auto-compact after adding (if needed)
153
- this.autoCompact()
154
- }
155
-
156
- /**
157
- * Auto-compact history if approaching token budget
158
- * Uses preserve-anchors strategy: keep first + recent entries
159
- */
160
- autoCompact(): void {
161
- const status = this.getStatus()
162
-
163
- // Auto-compact when at 100% of token budget
164
- if (status.historyPercent >= 100) {
165
- const before = this.memory.history.length
166
-
167
- // Preserve-anchors strategy: first entry + last 10 entries
168
- this.memory.history = [
169
- this.memory.history[0], // First (original input)
170
- ...this.memory.history.slice(-10) // Last 10
171
- ]
172
-
173
- const compactTime = Date.now()
174
- this.logger?.action(
175
- 'memory-auto-compact',
176
- `Auto-compacted: ${before} -> ${this.memory.history.length} entries`,
177
- 0,
178
- compactTime,
179
- compactTime,
180
- 0
181
- )
182
- }
183
- }
184
-
185
- /**
186
- * Enforce hard limits (called before LLM request)
187
- * Emergency fallback if agent exceeds limits
188
- */
189
- enforceHardLimits(): void {
190
- const maxSessionMemoryKeys = this.constraints.maxSessionMemoryKeys || MAX_SESSION_MEMORY_KEYS
191
-
192
- // Check session memory count
193
- const sessionMemoryKeys = Object.keys(this.memory.sessionMemory)
194
- if (sessionMemoryKeys.length > maxSessionMemoryKeys) {
195
- const limitTime = Date.now()
196
- this.logger?.action(
197
- 'memory-limit-exceeded',
198
- `Session memory exceeds hard limit (${sessionMemoryKeys.length}/${maxSessionMemoryKeys})`,
199
- 0,
200
- limitTime,
201
- limitTime,
202
- 0
203
- )
204
-
205
- // Remove oldest entries by timestamp
206
- const sorted = Object.entries(this.memory.sessionMemory).sort((a, b) => a[1].timestamp - b[1].timestamp)
207
-
208
- this.memory.sessionMemory = Object.fromEntries(sorted.slice(-maxSessionMemoryKeys))
209
- }
210
-
211
- // Check total token budget (emergency compaction)
212
- const status = this.getStatus()
213
- const maxTokens = this.constraints.maxMemoryTokens || MAX_MEMORY_TOKENS
214
-
215
- if (status.historyTokens > maxTokens) {
216
- const before = this.memory.history.length
217
- const emergencyStartTime = Date.now()
218
- this.logger?.action(
219
- 'memory-emergency',
220
- `Total memory exceeds token budget (${status.historyTokens}/${maxTokens}), forcing emergency compaction`,
221
- 0,
222
- emergencyStartTime,
223
- emergencyStartTime,
224
- 0
225
- )
226
-
227
- // Emergency: Aggressively compact history
228
- this.memory.history = [
229
- this.memory.history[0],
230
- ...this.memory.history.slice(-5) // Keep only last 5
231
- ]
232
-
233
- const emergencyEndTime = Date.now()
234
- this.logger?.action(
235
- 'memory-emergency-compact',
236
- `Emergency compaction: ${before} -> ${this.memory.history.length} entries`,
237
- 0,
238
- emergencyStartTime,
239
- emergencyEndTime,
240
- emergencyEndTime - emergencyStartTime
241
- )
242
- }
243
- }
244
-
245
- /**
246
- * Get history length (for logging and introspection)
247
- * @returns Number of entries in history
248
- */
249
- getHistoryLength(): number {
250
- return this.memory.history.length
251
- }
252
-
253
- /**
254
- * Get memory status for agent awareness
255
- * @returns Memory status with token usage and key counts
256
- */
257
- getStatus(): MemoryStatus {
258
- const sessionMemoryKeys = Object.keys(this.memory.sessionMemory)
259
-
260
- // Calculate tokens
261
- const sessionMemoryContent = Object.values(this.memory.sessionMemory)
262
- .map((entry) => entry.content)
263
- .join('')
264
- const historyContent = this.memory.history.map((entry) => entry.content).join('')
265
- const sessionMemoryTokens = estimateTokens(sessionMemoryContent)
266
- const historyTokens = estimateTokens(historyContent)
267
- const totalTokens = sessionMemoryTokens + historyTokens
268
-
269
- // Token budget
270
- const tokenBudget = this.constraints.maxMemoryTokens || MAX_MEMORY_TOKENS
271
- const sessionMemoryLimit = this.constraints.maxSessionMemoryKeys || MAX_SESSION_MEMORY_KEYS
272
-
273
- return {
274
- sessionMemoryKeys: sessionMemoryKeys.length,
275
- sessionMemoryLimit,
276
- currentKeys: sessionMemoryKeys,
277
- historyPercent: Math.round((totalTokens / tokenBudget) * 100),
278
- historyTokens: totalTokens,
279
- tokenBudget
280
- }
281
- }
282
-
283
- /**
284
- * Create memory snapshot for persistence
285
- * Caches snapshot internally for later retrieval
286
- * @returns Deep copy of current memory state
287
- */
288
- toSnapshot(): AgentMemory {
289
- this.cachedSnapshot = structuredClone(this.memory)
290
- return this.cachedSnapshot
291
- }
292
-
293
- /**
294
- * Get cached memory snapshot
295
- * Returns snapshot created by toSnapshot()
296
- * @returns Cached snapshot (undefined if toSnapshot() not called yet)
297
- */
298
- getSnapshot(): AgentMemory | undefined {
299
- return this.cachedSnapshot
300
- }
301
-
302
- /**
303
- * Build context string for LLM
304
- * Serializes sessionmemory + history memory with clear sections
305
- * Shows current iteration entries FIRST (reverse chronological) for LLM attention
306
- * @param currentIteration - Current iteration number (0 = pre-iteration)
307
- * @param currentTurn - Current turn number (optional, for session context filtering)
308
- * @returns Formatted memory context for LLM prompt
309
- */
310
- toContext(currentIteration: number, currentTurn?: number): string {
311
- const status = this.getStatus()
312
-
313
- // Split by turn and iteration number
314
- // DUAL FILTERING: Turn scope first (if provided), then iteration scope
315
- // null iterations are session memory entries (excluded from history context)
316
- // undefined/null turnNumbers are treated as legacy entries (pre-migration) or one-off executions
317
- const currentContext = this.memory.history
318
- .filter(
319
- (entry) =>
320
- (!currentTurn || entry.turnNumber === currentTurn || entry.turnNumber === undefined) &&
321
- entry.iterationNumber === currentIteration
322
- )
323
- .reverse() // Most recent first (LLM positional bias)
324
-
325
- const earlierContext = this.memory.history.filter(
326
- (entry) =>
327
- (!currentTurn || entry.turnNumber === currentTurn || entry.turnNumber === undefined) &&
328
- entry.iterationNumber !== null &&
329
- entry.iterationNumber < currentIteration
330
- )
331
- // Earlier entries stay chronological
332
-
333
- // Format entry with simple label
334
- const formatEntry = (entry: MemoryEntry): string => {
335
- const label = `[${entry.type.toUpperCase()}]`
336
- return `${label}\n${entry.content}`
337
- }
338
-
339
- // Serialize session memory
340
- const sessionMemoryContext = Object.entries(this.memory.sessionMemory)
341
- .map(([key, entry]) => `[SESSION:${key}]\n${entry.content}`)
342
- .join('\n\n')
343
-
344
- const currentSection = currentContext.map(formatEntry).join('\n\n')
345
- const earlierSection =
346
- earlierContext.length > 0 ? earlierContext.map(formatEntry).join('\n\n') : '(no earlier context)'
347
-
348
- return `
349
- === MEMORY STATUS ===
350
- ${status.sessionMemoryKeys}/${status.sessionMemoryLimit} session keys
351
- ${status.historyPercent}% of token budget
352
-
353
- === SESSION MEMORY (Persists for conversation) ===
354
- ${sessionMemoryContext || '(empty)'}
355
-
356
- === ITERATION ${currentIteration} - CURRENT CONTEXT ===
357
-
358
- ${currentSection}
359
-
360
- === EARLIER CONTEXT ===
361
-
362
- ${earlierSection}
363
- `.trim()
364
- }
365
- }
1
+ /**
2
+ * Memory Manager
3
+ * Encapsulates all memory operations with ultra-simple agent API
4
+ * Agent provides strings, framework handles wrapping and auto-compaction
5
+ */
6
+
7
+ import type { AgentMemory, MemoryEntry, MemoryStatus, MemoryConstraints } from './types'
8
+ import { estimateTokens } from '../../../../platform/utils'
9
+ import type { AgentScopedLogger } from '../observability/logging'
10
+ import { AgentMemoryValidationError } from '../errors'
11
+ import {
12
+ MAX_SESSION_MEMORY_KEYS,
13
+ MAX_MEMORY_TOKENS,
14
+ MAX_SINGLE_ENTRY_TOKENS,
15
+ MAX_TOOL_RESULT_TOKENS
16
+ } from '../../../../platform/constants/limits'
17
+
18
+ /**
19
+ * Truncate tool result content if it exceeds the token limit.
20
+ * Uses character-based estimation (1 token ~ 3.5 chars, matching estimateTokens).
21
+ * Appends a notice so the agent knows data was cut.
22
+ *
23
+ * @param content - Raw tool result string
24
+ * @param maxTokens - Maximum allowed tokens
25
+ * @returns Original content if under limit, truncated content with notice otherwise
26
+ */
27
+ export function truncateToolResult(content: string, maxTokens: number): string {
28
+ const estimated = estimateTokens(content)
29
+ if (estimated <= maxTokens) return content
30
+
31
+ // Use same ratio as estimateTokens (3.5 chars per token)
32
+ const maxChars = Math.floor(maxTokens * 3.5)
33
+ const truncated = content.slice(0, maxChars)
34
+ const omitted = estimated - maxTokens
35
+ return (
36
+ truncated +
37
+ `\n\n[Response truncated — estimated ${omitted} tokens omitted. Use more specific filters to get smaller results.]`
38
+ )
39
+ }
40
+
41
+ /**
42
+ * Memory Manager - Agent memory orchestration
43
+ * Provides ultra-simple API for agents (strings only)
44
+ * Handles automatic compaction and token management
45
+ */
46
+ export class MemoryManager {
47
+ private cachedSnapshot?: AgentMemory
48
+
49
+ constructor(
50
+ private memory: AgentMemory,
51
+ private constraints: MemoryConstraints = {},
52
+ private logger?: AgentScopedLogger
53
+ ) {}
54
+
55
+ // === Agent Operations (Ultra-Simple) ===
56
+
57
+ /**
58
+ * Set session memory entry (agent provides string, framework wraps it)
59
+ * @param key - Session memory key
60
+ * @param content - String content from agent
61
+ */
62
+ set(key: string, content: string): void {
63
+ // Check single entry token limit
64
+ const entryTokens = estimateTokens(content)
65
+ if (entryTokens > MAX_SINGLE_ENTRY_TOKENS) {
66
+ const truncateTime = Date.now()
67
+ this.logger?.action(
68
+ 'memory-truncate',
69
+ `Single entry exceeds token limit (${entryTokens}/${MAX_SINGLE_ENTRY_TOKENS}): ${key}`,
70
+ 0,
71
+ truncateTime,
72
+ truncateTime,
73
+ 0
74
+ )
75
+ // Truncate content to fit limit
76
+ const maxChars = MAX_SINGLE_ENTRY_TOKENS * 4
77
+ content = content.slice(0, maxChars) + '... [truncated]'
78
+ }
79
+
80
+ this.memory.sessionMemory[key] = {
81
+ type: 'context',
82
+ content,
83
+ timestamp: Date.now(),
84
+ turnNumber: null, // Session memory entries are not turn-specific
85
+ iterationNumber: null // Session memory entries are not iteration-specific
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Get session memory entry content
91
+ * @param key - Session memory key
92
+ * @returns String content if exists, undefined otherwise
93
+ */
94
+ get(key: string): string | undefined {
95
+ const entry = this.memory.sessionMemory[key]
96
+ return entry?.content
97
+ }
98
+
99
+ /**
100
+ * Delete session memory entry
101
+ * @param key - Key to delete
102
+ * @returns True if key existed and was deleted
103
+ */
104
+ delete(key: string): boolean {
105
+ if (key in this.memory.sessionMemory) {
106
+ delete this.memory.sessionMemory[key]
107
+ return true
108
+ }
109
+ return false
110
+ }
111
+
112
+ // === Framework Operations (Automatic) ===
113
+
114
+ /**
115
+ * Add entry to history (called by framework after tool results, reasoning, etc.)
116
+ * Automatically sets timestamp to current time
117
+ * @param entry - Memory entry to add (without timestamp - auto-generated)
118
+ */
119
+ addToHistory(entry: Omit<MemoryEntry, 'timestamp'>): void {
120
+ // Validate turnNumber is provided for history entries (use null for session memory)
121
+ if (entry.turnNumber === undefined && entry.type !== 'context') {
122
+ throw new AgentMemoryValidationError('turnNumber required for history entries (use null for session memory)', {
123
+ entryType: entry.type,
124
+ missingField: 'turnNumber',
125
+ iterationNumber: entry.iterationNumber
126
+ })
127
+ }
128
+
129
+ // Truncate tool-result content if it exceeds the tool result token limit
130
+ let content = entry.content
131
+ if (entry.type === 'tool-result') {
132
+ const before = content
133
+ content = truncateToolResult(content, MAX_TOOL_RESULT_TOKENS)
134
+ if (content !== before) {
135
+ const truncateTime = Date.now()
136
+ this.logger?.action(
137
+ 'memory-tool-result-truncate',
138
+ `Tool result truncated (${estimateTokens(before)} -> ${MAX_TOOL_RESULT_TOKENS} tokens)`,
139
+ entry.iterationNumber ?? 0,
140
+ truncateTime,
141
+ truncateTime,
142
+ 0
143
+ )
144
+ }
145
+ }
146
+
147
+ this.memory.history.push({
148
+ ...entry,
149
+ content,
150
+ timestamp: Date.now()
151
+ })
152
+ // Auto-compact after adding (if needed)
153
+ this.autoCompact()
154
+ }
155
+
156
+ /**
157
+ * Auto-compact history if approaching token budget
158
+ * Uses preserve-anchors strategy: keep first + recent entries
159
+ */
160
+ autoCompact(): void {
161
+ const status = this.getStatus()
162
+
163
+ // Auto-compact when at 100% of token budget
164
+ if (status.historyPercent >= 100) {
165
+ const before = this.memory.history.length
166
+
167
+ // Preserve-anchors strategy: first entry + last 10 entries
168
+ this.memory.history = [
169
+ this.memory.history[0], // First (original input)
170
+ ...this.memory.history.slice(-10) // Last 10
171
+ ]
172
+
173
+ const compactTime = Date.now()
174
+ this.logger?.action(
175
+ 'memory-auto-compact',
176
+ `Auto-compacted: ${before} -> ${this.memory.history.length} entries`,
177
+ 0,
178
+ compactTime,
179
+ compactTime,
180
+ 0
181
+ )
182
+ }
183
+ }
184
+
185
+ /**
186
+ * Enforce hard limits (called before LLM request)
187
+ * Emergency fallback if agent exceeds limits
188
+ */
189
+ enforceHardLimits(): void {
190
+ const maxSessionMemoryKeys = this.constraints.maxSessionMemoryKeys || MAX_SESSION_MEMORY_KEYS
191
+
192
+ // Check session memory count
193
+ const sessionMemoryKeys = Object.keys(this.memory.sessionMemory)
194
+ if (sessionMemoryKeys.length > maxSessionMemoryKeys) {
195
+ const limitTime = Date.now()
196
+ this.logger?.action(
197
+ 'memory-limit-exceeded',
198
+ `Session memory exceeds hard limit (${sessionMemoryKeys.length}/${maxSessionMemoryKeys})`,
199
+ 0,
200
+ limitTime,
201
+ limitTime,
202
+ 0
203
+ )
204
+
205
+ // Remove oldest entries by timestamp
206
+ const sorted = Object.entries(this.memory.sessionMemory).sort((a, b) => a[1].timestamp - b[1].timestamp)
207
+
208
+ this.memory.sessionMemory = Object.fromEntries(sorted.slice(-maxSessionMemoryKeys))
209
+ }
210
+
211
+ // Check total token budget (emergency compaction)
212
+ const status = this.getStatus()
213
+ const maxTokens = this.constraints.maxMemoryTokens || MAX_MEMORY_TOKENS
214
+
215
+ if (status.historyTokens > maxTokens) {
216
+ const before = this.memory.history.length
217
+ const emergencyStartTime = Date.now()
218
+ this.logger?.action(
219
+ 'memory-emergency',
220
+ `Total memory exceeds token budget (${status.historyTokens}/${maxTokens}), forcing emergency compaction`,
221
+ 0,
222
+ emergencyStartTime,
223
+ emergencyStartTime,
224
+ 0
225
+ )
226
+
227
+ // Emergency: Aggressively compact history
228
+ this.memory.history = [
229
+ this.memory.history[0],
230
+ ...this.memory.history.slice(-5) // Keep only last 5
231
+ ]
232
+
233
+ const emergencyEndTime = Date.now()
234
+ this.logger?.action(
235
+ 'memory-emergency-compact',
236
+ `Emergency compaction: ${before} -> ${this.memory.history.length} entries`,
237
+ 0,
238
+ emergencyStartTime,
239
+ emergencyEndTime,
240
+ emergencyEndTime - emergencyStartTime
241
+ )
242
+ }
243
+ }
244
+
245
+ /**
246
+ * Get history length (for logging and introspection)
247
+ * @returns Number of entries in history
248
+ */
249
+ getHistoryLength(): number {
250
+ return this.memory.history.length
251
+ }
252
+
253
+ /**
254
+ * Get memory status for agent awareness
255
+ * @returns Memory status with token usage and key counts
256
+ */
257
+ getStatus(): MemoryStatus {
258
+ const sessionMemoryKeys = Object.keys(this.memory.sessionMemory)
259
+
260
+ // Calculate tokens
261
+ const sessionMemoryContent = Object.values(this.memory.sessionMemory)
262
+ .map((entry) => entry.content)
263
+ .join('')
264
+ const historyContent = this.memory.history.map((entry) => entry.content).join('')
265
+ const sessionMemoryTokens = estimateTokens(sessionMemoryContent)
266
+ const historyTokens = estimateTokens(historyContent)
267
+ const totalTokens = sessionMemoryTokens + historyTokens
268
+
269
+ // Token budget
270
+ const tokenBudget = this.constraints.maxMemoryTokens || MAX_MEMORY_TOKENS
271
+ const sessionMemoryLimit = this.constraints.maxSessionMemoryKeys || MAX_SESSION_MEMORY_KEYS
272
+
273
+ return {
274
+ sessionMemoryKeys: sessionMemoryKeys.length,
275
+ sessionMemoryLimit,
276
+ currentKeys: sessionMemoryKeys,
277
+ historyPercent: Math.round((totalTokens / tokenBudget) * 100),
278
+ historyTokens: totalTokens,
279
+ tokenBudget
280
+ }
281
+ }
282
+
283
+ /**
284
+ * Create memory snapshot for persistence
285
+ * Caches snapshot internally for later retrieval
286
+ * @returns Deep copy of current memory state
287
+ */
288
+ toSnapshot(): AgentMemory {
289
+ this.cachedSnapshot = structuredClone(this.memory)
290
+ return this.cachedSnapshot
291
+ }
292
+
293
+ /**
294
+ * Get cached memory snapshot
295
+ * Returns snapshot created by toSnapshot()
296
+ * @returns Cached snapshot (undefined if toSnapshot() not called yet)
297
+ */
298
+ getSnapshot(): AgentMemory | undefined {
299
+ return this.cachedSnapshot
300
+ }
301
+
302
+ /**
303
+ * Build context string for LLM
304
+ * Serializes sessionmemory + history memory with clear sections
305
+ * Shows current iteration entries FIRST (reverse chronological) for LLM attention
306
+ * @param currentIteration - Current iteration number (0 = pre-iteration)
307
+ * @param currentTurn - Current turn number (optional, for session context filtering)
308
+ * @returns Formatted memory context for LLM prompt
309
+ */
310
+ toContext(currentIteration: number, currentTurn?: number): string {
311
+ const status = this.getStatus()
312
+
313
+ // Split by turn and iteration number
314
+ // DUAL FILTERING: Turn scope first (if provided), then iteration scope
315
+ // null iterations are session memory entries (excluded from history context)
316
+ // undefined/null turnNumbers are treated as legacy entries (pre-migration) or one-off executions
317
+ const currentContext = this.memory.history
318
+ .filter(
319
+ (entry) =>
320
+ (!currentTurn || entry.turnNumber === currentTurn || entry.turnNumber === undefined) &&
321
+ entry.iterationNumber === currentIteration
322
+ )
323
+ .reverse() // Most recent first (LLM positional bias)
324
+
325
+ const earlierContext = this.memory.history.filter(
326
+ (entry) =>
327
+ (!currentTurn || entry.turnNumber === currentTurn || entry.turnNumber === undefined) &&
328
+ entry.iterationNumber !== null &&
329
+ entry.iterationNumber < currentIteration
330
+ )
331
+ // Earlier entries stay chronological
332
+
333
+ // Format entry with simple label
334
+ const formatEntry = (entry: MemoryEntry): string => {
335
+ const label = `[${entry.type.toUpperCase()}]`
336
+ return `${label}\n${entry.content}`
337
+ }
338
+
339
+ // Serialize session memory
340
+ const sessionMemoryContext = Object.entries(this.memory.sessionMemory)
341
+ .map(([key, entry]) => `[SESSION:${key}]\n${entry.content}`)
342
+ .join('\n\n')
343
+
344
+ const currentSection = currentContext.map(formatEntry).join('\n\n')
345
+ const earlierSection =
346
+ earlierContext.length > 0 ? earlierContext.map(formatEntry).join('\n\n') : '(no earlier context)'
347
+
348
+ return `
349
+ === MEMORY STATUS ===
350
+ ${status.sessionMemoryKeys}/${status.sessionMemoryLimit} session keys
351
+ ${status.historyPercent}% of token budget
352
+
353
+ === SESSION MEMORY (Persists for conversation) ===
354
+ ${sessionMemoryContext || '(empty)'}
355
+
356
+ === ITERATION ${currentIteration} - CURRENT CONTEXT ===
357
+
358
+ ${currentSection}
359
+
360
+ === EARLIER CONTEXT ===
361
+
362
+ ${earlierSection}
363
+ `.trim()
364
+ }
365
+ }