@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.
- package/package.json +3 -3
- package/src/README.md +41 -41
- package/src/__tests__/publish.test.ts +18 -18
- package/src/__tests__/{template-foundations-compatibility.test.ts → template-core-compatibility.test.ts} +99 -99
- package/src/_gen/__tests__/__snapshots__/contracts.md.snap +1135 -1131
- package/src/_gen/__tests__/scaffold-contracts.test.ts +53 -53
- package/src/_gen/scaffold-contracts.ts +45 -45
- package/src/auth/multi-tenancy/credentials/README.md +38 -38
- package/src/auth/multi-tenancy/credentials/index.ts +6 -6
- package/src/auth/multi-tenancy/credentials/server/encryption.ts +39 -39
- package/src/auth/multi-tenancy/credentials/server/service.ts +60 -60
- package/src/auth/multi-tenancy/index.ts +17 -17
- package/src/auth/multi-tenancy/invitations/api-schemas.ts +107 -107
- package/src/auth/multi-tenancy/invitations/index.ts +37 -37
- package/src/auth/multi-tenancy/invitations/invitation.ts +86 -86
- package/src/auth/multi-tenancy/invitations/server/index.ts +25 -25
- package/src/auth/multi-tenancy/invitations/server/transforms.ts +24 -24
- package/src/auth/multi-tenancy/invitations/server/workos.ts +24 -24
- package/src/auth/multi-tenancy/invitations/supabase.ts +50 -50
- package/src/auth/multi-tenancy/memberships/api-schemas.ts +126 -126
- package/src/auth/multi-tenancy/memberships/index.ts +21 -21
- package/src/auth/multi-tenancy/memberships/membership.ts +138 -138
- package/src/auth/multi-tenancy/memberships/server/index.ts +15 -15
- package/src/auth/multi-tenancy/memberships/server/transforms.ts +32 -32
- package/src/auth/multi-tenancy/memberships/server/workos.ts +21 -21
- package/src/auth/multi-tenancy/memberships/supabase.ts +46 -46
- package/src/auth/multi-tenancy/organizations/api-schemas.ts +128 -128
- package/src/auth/multi-tenancy/organizations/index.ts +23 -23
- package/src/auth/multi-tenancy/organizations/organization.ts +24 -24
- package/src/auth/multi-tenancy/organizations/server/index.ts +10 -10
- package/src/auth/multi-tenancy/organizations/server/transforms.ts +35 -35
- package/src/auth/multi-tenancy/organizations/server/workos.ts +20 -20
- package/src/auth/multi-tenancy/types.ts +83 -83
- package/src/auth/multi-tenancy/users/api-schemas.ts +194 -194
- package/src/auth/multi-tenancy/users/index.ts +27 -27
- package/src/auth/multi-tenancy/users/server/index.ts +19 -19
- package/src/auth/multi-tenancy/users/server/transforms.ts +21 -21
- package/src/auth/multi-tenancy/users/server/workos.ts +16 -16
- package/src/auth/multi-tenancy/users/user.ts +65 -65
- package/src/business/README.md +52 -52
- package/src/business/__tests__/entities-published.test.ts +33 -33
- package/src/business/acquisition/api-schemas.ts +759 -759
- package/src/business/acquisition/index.ts +109 -109
- package/src/business/acquisition/types.ts +402 -402
- package/src/business/base-entities.test.ts +481 -481
- package/src/business/base-entities.ts +241 -241
- package/src/business/entities-published.ts +24 -24
- package/src/business/index.ts +15 -15
- package/src/business/pdf/browser/pdfmake-browser.ts +229 -229
- package/src/business/pdf/index.ts +10 -10
- package/src/business/pdf/server/index.ts +21 -21
- package/src/business/pdf/server/themes/default.ts +8 -8
- package/src/business/pdf/server/themes/index.ts +9 -9
- package/src/business/pdf/server/themes/types.ts +8 -8
- package/src/business/pdf/types.ts +272 -272
- package/src/business/projects/index.ts +2 -1
- package/src/business/projects/sse-events.ts +21 -0
- package/src/business/projects/types.ts +89 -89
- package/src/business/sales/api-schemas.ts +75 -75
- package/src/business/seo/__tests__/linking.test.ts +549 -549
- package/src/business/seo/__tests__/types.test.ts +404 -404
- package/src/business/seo/index.ts +2 -2
- package/src/business/seo/linking.ts +281 -281
- package/src/business/seo/types.ts +199 -199
- package/src/commands/queue/index.ts +3 -3
- package/src/commands/queue/schemas.test.ts +593 -593
- package/src/commands/queue/schemas.ts +125 -125
- package/src/commands/queue/sse-events.ts +61 -61
- package/src/commands/queue/types/action.ts +52 -52
- package/src/commands/queue/types/checkpoint.ts +44 -44
- package/src/commands/queue/types/index.ts +7 -7
- package/src/commands/queue/types/task.ts +116 -116
- package/src/commands/queue/types.ts +14 -14
- package/src/content/distribution-metadata.ts +61 -61
- package/src/content/index.ts +10 -10
- package/src/deployments/index.ts +22 -22
- package/src/execution/core/__tests__/archived-logs.test.ts +72 -72
- package/src/execution/core/index.ts +11 -11
- package/src/execution/core/runner-types.ts +80 -80
- package/src/execution/core/server/environment.ts +31 -31
- package/src/execution/core/sse-executions.ts +119 -119
- package/src/execution/core/types.ts +29 -29
- package/src/execution/engine/__tests__/fixtures/test-agents.ts +4 -4
- package/src/execution/engine/__tests__/timeout.test.ts +565 -565
- package/src/execution/engine/agent/__tests__/errors.test.ts +508 -508
- package/src/execution/engine/agent/actions/__tests__/processor.test.ts +531 -531
- package/src/execution/engine/agent/actions/executor.ts +205 -205
- package/src/execution/engine/agent/actions/navigate-knowledge-executor.ts +230 -230
- package/src/execution/engine/agent/actions/processor.ts +116 -116
- package/src/execution/engine/agent/actions/types.ts +70 -70
- package/src/execution/engine/agent/core/agent.ts +810 -810
- package/src/execution/engine/agent/core/types.ts +155 -155
- package/src/execution/engine/agent/errors.ts +251 -251
- package/src/execution/engine/agent/index.ts +78 -78
- package/src/execution/engine/agent/knowledge-map/types.ts +106 -106
- package/src/execution/engine/agent/knowledge-map/utils.ts +101 -101
- package/src/execution/engine/agent/memory/__tests__/manager.test.ts +754 -754
- package/src/execution/engine/agent/memory/domains.ts +99 -99
- package/src/execution/engine/agent/memory/manager.ts +365 -365
- package/src/execution/engine/agent/memory/processor.ts +66 -66
- package/src/execution/engine/agent/memory/types.ts +90 -90
- package/src/execution/engine/agent/memory/utils.ts +134 -134
- package/src/execution/engine/agent/observability/logging.ts +467 -467
- package/src/execution/engine/agent/observability/types.ts +64 -64
- package/src/execution/engine/agent/reasoning/adapters/agent-adapter-helpers.ts +349 -349
- package/src/execution/engine/agent/reasoning/processor.ts +92 -92
- package/src/execution/engine/agent/reasoning/prompt-sections/base-actions.ts +134 -134
- package/src/execution/engine/agent/reasoning/prompt-sections/completion.ts +49 -49
- package/src/execution/engine/agent/reasoning/prompt-sections/knowledge-map.ts +93 -93
- package/src/execution/engine/agent/reasoning/prompt-sections/memory.ts +65 -65
- package/src/execution/engine/agent/reasoning/prompt-sections/tools.ts +44 -44
- package/src/execution/engine/agent/reasoning/request-builder.ts +169 -169
- package/src/execution/engine/agent/reasoning/types.ts +18 -18
- package/src/execution/engine/base/errors.ts +118 -118
- package/src/execution/engine/base/index.ts +2 -2
- package/src/execution/engine/base/logging.ts +31 -31
- package/src/execution/engine/base/serialization.ts +324 -324
- package/src/execution/engine/base/types.ts +126 -126
- package/src/execution/engine/base/utils.ts +41 -41
- package/src/execution/engine/index.ts +434 -434
- package/src/execution/engine/interface/index.ts +1 -1
- package/src/execution/engine/interface/types.ts +62 -62
- package/src/execution/engine/llm/__tests__/model-info.test.ts +50 -50
- package/src/execution/engine/llm/__tests__/model-validation.test.ts +321 -321
- package/src/execution/engine/llm/__tests__/response-schema-validator.test.ts +115 -115
- package/src/execution/engine/llm/adapters/__tests__/adapter-factory.test.ts +375 -375
- package/src/execution/engine/llm/adapters/__tests__/anthropic-adapter.test.ts +463 -463
- package/src/execution/engine/llm/adapters/__tests__/anthropic.integration.test.ts +177 -177
- package/src/execution/engine/llm/adapters/__tests__/google-adapter.test.ts +722 -722
- package/src/execution/engine/llm/adapters/__tests__/google.integration.test.ts +376 -376
- package/src/execution/engine/llm/adapters/__tests__/openai-adapter.test.ts +551 -551
- package/src/execution/engine/llm/adapters/__tests__/openrouter-adapter.test.ts +563 -563
- package/src/execution/engine/llm/adapters/__tests__/openrouter.integration.test.ts +105 -105
- package/src/execution/engine/llm/adapters/__tests__/universal-adapter.test.ts +537 -537
- package/src/execution/engine/llm/adapters/circuit-breaker.ts +147 -147
- package/src/execution/engine/llm/adapters/index.ts +17 -17
- package/src/execution/engine/llm/adapters/mock-adapter.ts +116 -116
- package/src/execution/engine/llm/adapters/server/adapter-factory.ts +130 -130
- package/src/execution/engine/llm/adapters/server/anthropic.ts +137 -137
- package/src/execution/engine/llm/adapters/server/google.ts +283 -283
- package/src/execution/engine/llm/adapters/server/index.ts +12 -12
- package/src/execution/engine/llm/adapters/server/openai.ts +206 -206
- package/src/execution/engine/llm/adapters/server/openrouter.ts +235 -235
- package/src/execution/engine/llm/adapters/universal-adapter.ts +230 -230
- package/src/execution/engine/llm/errors.ts +186 -186
- package/src/execution/engine/llm/model-info.ts +332 -332
- package/src/execution/engine/llm/response-schema-validator.ts +113 -113
- package/src/execution/engine/llm/types.ts +86 -86
- package/src/execution/engine/test-utils/index.ts +6 -6
- package/src/execution/engine/test-utils/mocks.ts +56 -56
- package/src/execution/engine/tools/integration/base-integration-adapter.ts +50 -50
- package/src/execution/engine/tools/integration/index.ts +53 -53
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-adapter.ts +73 -73
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-tools.ts +209 -209
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-company-email/index.ts +82 -82
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-decision-maker-email/index.ts +122 -122
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-person-email/index.ts +89 -89
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/verify-email/index.ts +84 -84
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/index.ts +16 -16
- package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +293 -293
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +100 -100
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-tools.ts +217 -217
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/get-dataset-items/index.ts +92 -92
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/run-actor/index.ts +218 -218
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/start-actor/index.ts +87 -87
- package/src/execution/engine/tools/integration/server/adapters/apify/index.ts +11 -11
- package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +361 -361
- package/src/execution/engine/tools/integration/server/adapters/attio/attio-adapter.ts +162 -162
- package/src/execution/engine/tools/integration/server/adapters/attio/attio-tools.ts +594 -594
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-attribute/index.ts +214 -214
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-note/index.ts +152 -152
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-record/index.ts +141 -141
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-note/index.ts +86 -86
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-record/index.ts +105 -105
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.ts +118 -118
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-attributes/index.ts +165 -165
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-notes/index.ts +96 -96
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-objects/index.ts +104 -104
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.ts +156 -156
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-attribute/index.ts +220 -220
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-record/index.ts +140 -140
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/utils/types.ts +146 -146
- package/src/execution/engine/tools/integration/server/adapters/attio/index.ts +31 -31
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +210 -210
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +104 -104
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -261
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-adapter.ts +1189 -1189
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-tools.ts +641 -641
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/index.ts +18 -18
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/activate-campaign/index.ts +86 -86
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/__tests__/index.test.ts +289 -289
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/index.ts +154 -154
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/__tests__/index.test.ts +325 -325
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/index.ts +153 -153
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-delete-leads/index.ts +84 -84
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-campaign/index.ts +125 -125
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-inbox-test/index.ts +107 -107
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/delete-campaign/index.ts +85 -85
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-account-health/index.ts +91 -91
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign/index.ts +92 -92
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/__tests__/index.test.ts +195 -195
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/index.ts +113 -113
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-daily-campaign-analytics/index.ts +104 -104
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-emails/index.ts +155 -155
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/__tests__/index.test.ts +196 -196
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/index.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/__tests__/index.test.ts +189 -189
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/index.ts +87 -87
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-leads/index.ts +112 -112
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/patch-lead/index.ts +76 -76
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/pause-campaign/index.ts +86 -86
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/remove-from-subsequence/index.ts +98 -98
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/send-reply/index.ts +126 -126
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/__tests__/index.test.ts +193 -193
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/index.ts +99 -99
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/__tests__/index.test.ts +621 -621
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/index.ts +125 -125
- package/src/execution/engine/tools/integration/server/adapters/instantly/index.ts +29 -29
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-adapter.ts +178 -178
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1473 -1473
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/check-credits/index.ts +59 -59
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/verify-email/index.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/index.ts +17 -17
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-adapter.ts +80 -80
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/get-email/index.ts +102 -102
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +134 -134
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +75 -75
- package/src/execution/engine/tools/integration/server/adapters/resend/index.ts +27 -27
- package/src/execution/engine/tools/integration/server/adapters/resend/resend-adapter.ts +108 -108
- package/src/execution/engine/tools/integration/server/adapters/resend/resend-tools.ts +132 -132
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/create-envelope/index.ts +274 -274
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/download-document/index.ts +230 -230
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/get-envelope/index.ts +133 -133
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/void-envelope/index.ts +90 -90
- package/src/execution/engine/tools/integration/server/adapters/stripe/fetch/utils/types.ts +210 -210
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-adapter.ts +517 -517
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +309 -309
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/domain-search/index.ts +133 -133
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-finder/index.ts +122 -122
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-verifier/index.ts +111 -111
- package/src/execution/engine/tools/integration/server/adapters/tomba/index.ts +11 -11
- package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-adapter.ts +78 -78
- package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-tools.ts +222 -222
- package/src/execution/engine/tools/integration/server/index.ts +61 -61
- package/src/execution/engine/tools/integration/service.ts +161 -161
- package/src/execution/engine/tools/integration/tool.ts +253 -253
- package/src/execution/engine/tools/integration/types/anymailfinder.ts +74 -74
- package/src/execution/engine/tools/integration/types/apify.ts +92 -92
- package/src/execution/engine/tools/integration/types/index.ts +19 -19
- package/src/execution/engine/tools/integration/types/instantly.ts +557 -557
- package/src/execution/engine/tools/integration/types/millionverifier.ts +56 -56
- package/src/execution/engine/tools/integration/types/stripe.ts +162 -162
- package/src/execution/engine/tools/integration/types/tomba.ts +94 -94
- package/src/execution/engine/tools/lead-service-types.ts +884 -884
- package/src/execution/engine/tools/llm/index.ts +11 -11
- package/src/execution/engine/tools/llm/server/index.ts +8 -8
- package/src/execution/engine/tools/llm/server/llm-call-tool.ts +118 -118
- package/src/execution/engine/tools/platform/__tests__/pdf.test.ts +441 -441
- package/src/execution/engine/tools/platform/acquisition/company-tools.ts +248 -248
- package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +319 -319
- package/src/execution/engine/tools/platform/acquisition/index.ts +43 -43
- package/src/execution/engine/tools/platform/acquisition/list-tools.ts +148 -148
- package/src/execution/engine/tools/platform/acquisition/types.ts +260 -260
- package/src/execution/engine/tools/platform/email/index.ts +122 -122
- package/src/execution/engine/tools/platform/email/types.ts +96 -96
- package/src/execution/engine/tools/platform/index.ts +157 -157
- package/src/execution/engine/tools/platform/notification.ts +81 -81
- package/src/execution/engine/tools/platform/pdf/index.ts +110 -110
- package/src/execution/engine/tools/platform/pdf/types.ts +77 -77
- package/src/execution/engine/tools/platform/scheduler.ts +87 -87
- package/src/execution/engine/tools/platform/storage/index.ts +370 -370
- package/src/execution/engine/tools/platform/types.ts +148 -148
- package/src/execution/engine/tools/registry.ts +700 -699
- package/src/execution/engine/tools/tool-maps.ts +786 -786
- package/src/execution/engine/tools/types.ts +233 -233
- package/src/execution/engine/workflow/__tests__/errors.test.ts +139 -139
- package/src/execution/engine/workflow/errors.ts +63 -63
- package/src/execution/engine/workflow/helpers/index.ts +11 -11
- package/src/execution/engine/workflow/helpers/server/index.ts +8 -8
- package/src/execution/engine/workflow/helpers/server/llm-call.ts +93 -93
- package/src/execution/engine/workflow/index.ts +19 -19
- package/src/execution/engine/workflow/log-truncate.ts +26 -26
- package/src/execution/engine/workflow/logging.ts +191 -191
- package/src/execution/engine/workflow/types.ts +182 -182
- package/src/execution/engine/workflow/utils.ts +280 -280
- package/src/execution/engine/workflow/workflow.ts +168 -168
- package/src/execution/index.ts +3 -3
- package/src/execution/scheduler/__tests__/api-schemas.test.ts +733 -733
- package/src/execution/scheduler/__tests__/utils.test.ts +1009 -1009
- package/src/execution/scheduler/api-schemas.ts +296 -296
- package/src/execution/scheduler/index.ts +50 -50
- package/src/execution/scheduler/schemas.ts +264 -264
- package/src/execution/scheduler/types.ts +111 -111
- package/src/execution/scheduler/utils.ts +364 -364
- package/src/forms/index.ts +7 -7
- package/src/forms/schemas.ts +69 -69
- package/src/forms/types.ts +70 -70
- package/src/index.ts +71 -60
- package/src/integrations/credentials/__tests__/schemas.test.ts +82 -82
- package/src/integrations/credentials/__tests__/utils.test.ts +144 -144
- package/src/integrations/credentials/api-schemas.ts +143 -143
- package/src/integrations/credentials/index.ts +32 -32
- package/src/integrations/credentials/schemas.ts +164 -164
- package/src/integrations/credentials/utils.ts +59 -59
- package/src/integrations/oauth/__tests__/provider-registry.test.ts +59 -59
- package/src/integrations/oauth/api-schemas.ts +92 -92
- package/src/integrations/oauth/index.ts +19 -19
- package/src/integrations/oauth/provider-registry.ts +61 -61
- package/src/integrations/oauth/server/__tests__/refresh-concurrent.test.ts +183 -183
- package/src/integrations/oauth/server/__tests__/refresh.test.ts +577 -577
- package/src/integrations/oauth/server/credentials.ts +39 -39
- package/src/integrations/oauth/server/refresh.ts +214 -214
- package/src/integrations/oauth/types.ts +34 -34
- package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +318 -318
- package/src/integrations/webhook-endpoints/api-schemas.ts +102 -102
- package/src/integrations/webhook-endpoints/index.ts +28 -28
- package/src/integrations/webhook-endpoints/types.ts +51 -51
- package/src/operations/activities/api-schemas.ts +79 -79
- package/src/operations/activities/index.ts +9 -9
- package/src/operations/activities/sse-events.ts +30 -30
- package/src/operations/activities/types.ts +63 -63
- package/src/operations/debug-logs/client.ts +60 -60
- package/src/operations/debug-logs/debug-logger.ts +83 -83
- package/src/operations/debug-logs/index.ts +8 -8
- package/src/operations/debug-logs/server.ts +19 -19
- package/src/operations/debug-logs/types.ts +33 -33
- package/src/operations/index.ts +50 -50
- package/src/operations/notifications/api-schemas.ts +91 -91
- package/src/operations/notifications/index.ts +3 -3
- package/src/operations/notifications/sse-events.ts +21 -21
- package/src/operations/notifications/types.ts +47 -47
- package/src/operations/observability/__tests__/openrouter-cost-flow.test.ts +297 -297
- package/src/operations/observability/__tests__/utils.test.ts +54 -54
- package/src/operations/observability/ai-usage-collector.ts +64 -64
- package/src/operations/observability/index.ts +13 -13
- package/src/operations/observability/metrics-collector.ts +49 -49
- package/src/operations/observability/schemas.ts +39 -39
- package/src/operations/observability/types.ts +463 -463
- package/src/operations/observability/utils.ts +77 -77
- package/src/operations/sessions/__tests__/manager.test.ts +821 -821
- package/src/operations/sessions/index.ts +26 -26
- package/src/operations/sessions/server/manager.ts +90 -90
- package/src/operations/sessions/server/session.ts +180 -180
- package/src/operations/sessions/types.ts +98 -98
- package/src/operations/triggers/index.ts +12 -12
- package/src/operations/triggers/webhook/definitions/instantly-account-error.ts +44 -44
- package/src/operations/triggers/webhook/definitions/instantly-auto-reply-received.ts +51 -51
- package/src/operations/triggers/webhook/definitions/instantly-campaign-completed.ts +45 -45
- package/src/operations/triggers/webhook/definitions/instantly-email-bounced.ts +49 -49
- package/src/operations/triggers/webhook/definitions/instantly-lead-unsubscribed.ts +45 -45
- package/src/operations/triggers/webhook/definitions/instantly-reply-received.ts +54 -54
- package/src/operations/triggers/webhook/index.ts +35 -35
- package/src/operations/triggers/webhook/types.ts +74 -74
- package/src/organization-model/README.md +97 -97
- package/src/organization-model/__tests__/defaults.test.ts +175 -175
- package/src/organization-model/__tests__/domains/customers.test.ts +295 -295
- package/src/organization-model/__tests__/domains/goals.test.ts +479 -479
- package/src/organization-model/__tests__/domains/identity.test.ts +279 -279
- package/src/organization-model/__tests__/domains/navigation.test.ts +212 -212
- package/src/organization-model/__tests__/domains/offerings.test.ts +419 -419
- package/src/organization-model/__tests__/domains/operations.test.ts +203 -203
- package/src/organization-model/__tests__/domains/resource-mappings.test.ts +362 -362
- package/src/organization-model/__tests__/domains/roles.test.ts +347 -347
- package/src/organization-model/__tests__/domains/statuses.test.ts +243 -243
- package/src/organization-model/__tests__/foundation.test.ts +105 -105
- package/src/organization-model/__tests__/graph.test.ts +894 -894
- package/src/organization-model/__tests__/resolve.test.ts +690 -690
- package/src/organization-model/__tests__/schema.test.ts +407 -407
- package/src/organization-model/contracts.ts +14 -14
- package/src/organization-model/defaults.ts +148 -148
- package/src/organization-model/domains/branding.ts +22 -22
- package/src/organization-model/domains/customers.ts +75 -75
- package/src/organization-model/domains/features.ts +22 -22
- package/src/organization-model/domains/goals.ts +80 -80
- package/src/organization-model/domains/identity.ts +94 -94
- package/src/organization-model/domains/navigation.ts +391 -391
- package/src/organization-model/domains/offerings.ts +66 -66
- package/src/organization-model/domains/operations.ts +85 -85
- package/src/organization-model/domains/projects.ts +48 -48
- package/src/organization-model/domains/prospecting.ts +33 -33
- package/src/organization-model/domains/roles.ts +55 -55
- package/src/organization-model/domains/sales.ts +94 -94
- package/src/organization-model/domains/shared.ts +62 -62
- package/src/organization-model/domains/statuses.ts +130 -130
- package/src/organization-model/foundation.ts +97 -97
- package/src/organization-model/graph/build.ts +399 -399
- package/src/organization-model/graph/index.ts +4 -4
- package/src/organization-model/graph/schema.ts +48 -48
- package/src/organization-model/graph/types.ts +40 -40
- package/src/organization-model/index.ts +13 -13
- package/src/organization-model/organization-graph.mdx +272 -272
- package/src/organization-model/organization-model.mdx +320 -320
- package/src/organization-model/published.ts +85 -85
- package/src/organization-model/resolve.ts +66 -66
- package/src/organization-model/schema.ts +287 -287
- package/src/organization-model/types.ts +46 -46
- package/src/platform/api/index.ts +1 -1
- package/src/platform/api/types.ts +35 -35
- package/src/platform/constants/http.ts +37 -37
- package/src/platform/constants/index.ts +5 -5
- package/src/platform/constants/limits.ts +32 -32
- package/src/platform/constants/resilience.ts +51 -51
- package/src/platform/constants/timeouts.ts +20 -20
- package/src/platform/constants/versions.ts +3 -3
- package/src/platform/registry/__tests__/resource-registry-static.test.ts +347 -347
- package/src/platform/registry/__tests__/resource-registry.integration.test.ts +1028 -1028
- package/src/platform/registry/__tests__/resource-registry.list-executable.test.ts +393 -393
- package/src/platform/registry/__tests__/resource-registry.test.ts +2005 -2005
- package/src/platform/registry/__tests__/serialization.test.ts +1127 -1127
- package/src/platform/registry/command-view.ts +180 -180
- package/src/platform/registry/domains.ts +165 -165
- package/src/platform/registry/index.ts +93 -93
- package/src/platform/registry/reserved.ts +24 -24
- package/src/platform/registry/resource-metadata.ts +59 -59
- package/src/platform/registry/resource-registry.command-queue-groups.test.ts +129 -129
- package/src/platform/registry/resource-registry.ts +876 -876
- package/src/platform/registry/serialization.ts +273 -273
- package/src/platform/registry/serialized-types.ts +231 -231
- package/src/platform/registry/stats-types.ts +66 -66
- package/src/platform/registry/types.ts +404 -404
- package/src/platform/registry/validation.ts +513 -513
- package/src/platform/resilience/__tests__/rate-limiter.test.ts +471 -471
- package/src/platform/resilience/circuit-breaker.ts +164 -164
- package/src/platform/resilience/errors.ts +68 -68
- package/src/platform/resilience/http-error-mapper.ts +129 -129
- package/src/platform/resilience/index.ts +93 -93
- package/src/platform/resilience/rate-limiter-types.ts +46 -46
- package/src/platform/resilience/rate-limiter.ts +140 -140
- package/src/platform/resilience/retry.ts +89 -89
- package/src/platform/resilience/timeout.ts +63 -63
- package/src/platform/sse/events.ts +37 -34
- package/src/platform/sse/index.ts +7 -7
- package/src/platform/utils/__tests__/validation.test.ts +1083 -1083
- package/src/platform/utils/currency.ts +96 -96
- package/src/platform/utils/debounce.ts +52 -52
- package/src/platform/utils/error.ts +41 -41
- package/src/platform/utils/hmac.test.ts +97 -97
- package/src/platform/utils/index.ts +32 -32
- package/src/platform/utils/server/betterstack-logger.ts +210 -210
- package/src/platform/utils/server/hmac.ts +44 -44
- package/src/platform/utils/server/unsubscribe.ts +111 -111
- package/src/platform/utils/token-counter.ts +96 -96
- package/src/platform/utils/validation.ts +425 -425
- package/src/projects/api-schemas.ts +268 -268
- package/src/published.ts +1 -1
- package/src/reference/_generated/contracts.md +611 -607
- package/src/reference/glossary.md +105 -105
- package/src/requests/__tests__/api-schemas.test.ts +277 -277
- package/src/requests/api-schemas.ts +83 -83
- package/src/requests/index.ts +1 -1
- package/src/scaffold-registry/__tests__/index.test.ts +17 -0
- package/src/scaffold-registry/__tests__/schema.test.ts +329 -230
- package/src/scaffold-registry/index.ts +205 -189
- package/src/scaffold-registry/schema.ts +196 -128
- package/src/server.ts +272 -272
- package/src/supabase/database.types.ts +2719 -2719
- package/src/supabase/helpers.ts +20 -20
- package/src/supabase/index.ts +52 -52
- package/src/supabase/server/client.ts +58 -58
- package/src/test-utils/README.md +38 -38
- package/src/test-utils/browser-mocks.ts +54 -54
- package/src/test-utils/fixtures/api-keys.ts +52 -52
- package/src/test-utils/fixtures/index.ts +4 -4
- package/src/test-utils/fixtures/memberships.ts +80 -80
- package/src/test-utils/fixtures/organizations.ts +69 -69
- package/src/test-utils/fixtures/users.ts +79 -79
- package/src/test-utils/index.ts +11 -11
- package/src/test-utils/mocks/index.ts +2 -2
- package/src/test-utils/mocks/supabase.ts +142 -142
- package/src/test-utils/mocks/workos.ts +108 -108
- package/src/test-utils/rls/RLSTestContext.ts +556 -556
- 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
|
+
}
|