@elevasis/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +435 -0
- package/dist/index.js +403 -0
- package/dist/organization-model/index.d.ts +435 -0
- package/dist/organization-model/index.js +403 -0
- package/package.json +62 -0
- package/src/README.md +34 -0
- package/src/__tests__/observability-exports.test.ts +36 -0
- package/src/__tests__/publish.test.ts +18 -0
- package/src/__tests__/template-foundations-compatibility.test.ts +34 -0
- package/src/auth/index.ts +8 -0
- package/src/auth/multi-tenancy/credentials/README.md +38 -0
- package/src/auth/multi-tenancy/credentials/__tests__/encryption.test.ts +216 -0
- package/src/auth/multi-tenancy/credentials/__tests__/service.test.ts +174 -0
- package/src/auth/multi-tenancy/credentials/index.ts +6 -0
- package/src/auth/multi-tenancy/credentials/server/encryption.ts +39 -0
- package/src/auth/multi-tenancy/credentials/server/service.ts +60 -0
- package/src/auth/multi-tenancy/index.ts +17 -0
- package/src/auth/multi-tenancy/invitations/__tests__/invitation.test.ts +237 -0
- package/src/auth/multi-tenancy/invitations/api-schemas.ts +107 -0
- package/src/auth/multi-tenancy/invitations/index.ts +38 -0
- package/src/auth/multi-tenancy/invitations/invitation.ts +86 -0
- package/src/auth/multi-tenancy/invitations/server/index.ts +25 -0
- package/src/auth/multi-tenancy/invitations/server/transforms.ts +24 -0
- package/src/auth/multi-tenancy/invitations/server/workos.ts +24 -0
- package/src/auth/multi-tenancy/invitations/supabase.ts +50 -0
- package/src/auth/multi-tenancy/memberships/__tests__/membership.test.ts +227 -0
- package/src/auth/multi-tenancy/memberships/__tests__/supabase-transforms.test.ts +88 -0
- package/src/auth/multi-tenancy/memberships/__tests__/workos-transforms.test.ts +139 -0
- package/src/auth/multi-tenancy/memberships/api-schemas.ts +126 -0
- package/src/auth/multi-tenancy/memberships/index.ts +22 -0
- package/src/auth/multi-tenancy/memberships/membership.ts +138 -0
- package/src/auth/multi-tenancy/memberships/server/index.ts +15 -0
- package/src/auth/multi-tenancy/memberships/server/transforms.ts +32 -0
- package/src/auth/multi-tenancy/memberships/server/workos.ts +21 -0
- package/src/auth/multi-tenancy/memberships/supabase.ts +46 -0
- package/src/auth/multi-tenancy/organizations/__tests__/organization.test.ts +249 -0
- package/src/auth/multi-tenancy/organizations/api-schemas.ts +128 -0
- package/src/auth/multi-tenancy/organizations/index.ts +23 -0
- package/src/auth/multi-tenancy/organizations/organization.ts +25 -0
- package/src/auth/multi-tenancy/organizations/server/index.ts +10 -0
- package/src/auth/multi-tenancy/organizations/server/transforms.ts +35 -0
- package/src/auth/multi-tenancy/organizations/server/workos.ts +20 -0
- package/src/auth/multi-tenancy/types.ts +89 -0
- package/src/auth/multi-tenancy/users/__tests__/user.test.ts +208 -0
- package/src/auth/multi-tenancy/users/api-schemas.ts +194 -0
- package/src/auth/multi-tenancy/users/index.ts +28 -0
- package/src/auth/multi-tenancy/users/server/index.ts +19 -0
- package/src/auth/multi-tenancy/users/server/transforms.ts +21 -0
- package/src/auth/multi-tenancy/users/server/workos.ts +16 -0
- package/src/auth/multi-tenancy/users/user.ts +65 -0
- package/src/business/acquisition/api-schemas.ts +759 -0
- package/src/business/acquisition/index.ts +109 -0
- package/src/business/acquisition/types.ts +400 -0
- package/src/business/crm/api-schemas.ts +75 -0
- package/src/business/delivery/index.ts +1 -0
- package/src/business/delivery/types.ts +89 -0
- package/src/business/index.ts +12 -0
- package/src/business/pdf/assets/ElevasisLogo.png +0 -0
- package/src/business/pdf/browser/image-utils.ts +74 -0
- package/src/business/pdf/browser/index.ts +16 -0
- package/src/business/pdf/browser/pdfmake-browser.ts +229 -0
- package/src/business/pdf/index.ts +10 -0
- package/src/business/pdf/sections/acceptance.ts +112 -0
- package/src/business/pdf/sections/automation.ts +56 -0
- package/src/business/pdf/sections/cover.ts +51 -0
- package/src/business/pdf/sections/index.ts +57 -0
- package/src/business/pdf/sections/investment.ts +69 -0
- package/src/business/pdf/sections/proposal-document.ts +200 -0
- package/src/business/pdf/sections/summary-investment.ts +124 -0
- package/src/business/pdf/sections/summary.ts +55 -0
- package/src/business/pdf/sections/table-summary.ts +59 -0
- package/src/business/pdf/sections/types.ts +124 -0
- package/src/business/pdf/server/__tests__/pdfmake-test.ts +219 -0
- package/src/business/pdf/server/index.ts +21 -0
- package/src/business/pdf/server/pdfmake-service.ts +237 -0
- package/src/business/pdf/server/themes/default.ts +8 -0
- package/src/business/pdf/server/themes/index.ts +9 -0
- package/src/business/pdf/server/themes/types.ts +8 -0
- package/src/business/pdf/shared/convert.ts +514 -0
- package/src/business/pdf/shared/index.ts +12 -0
- package/src/business/pdf/themes.ts +78 -0
- package/src/business/pdf/types.ts +272 -0
- package/src/business/seo/__tests__/linking.test.ts +549 -0
- package/src/business/seo/__tests__/types.test.ts +404 -0
- package/src/business/seo/index.ts +2 -0
- package/src/business/seo/linking.ts +281 -0
- package/src/business/seo/types.ts +199 -0
- package/src/commands/index.ts +8 -0
- package/src/commands/queue/index.ts +3 -0
- package/src/commands/queue/schemas.test.ts +593 -0
- package/src/commands/queue/schemas.ts +125 -0
- package/src/commands/queue/sse-events.ts +61 -0
- package/src/commands/queue/types/action.ts +52 -0
- package/src/commands/queue/types/checkpoint.ts +44 -0
- package/src/commands/queue/types/index.ts +7 -0
- package/src/commands/queue/types/task.ts +116 -0
- package/src/commands/queue/types.ts +14 -0
- package/src/content/distribution-metadata.ts +61 -0
- package/src/content/index.ts +10 -0
- package/src/deployments/index.ts +22 -0
- package/src/execution/calibration/__tests__/schemas.test.ts +320 -0
- package/src/execution/calibration/index.ts +3 -0
- package/src/execution/calibration/schemas.ts +121 -0
- package/src/execution/calibration/sse-events.ts +125 -0
- package/src/execution/calibration/types.ts +190 -0
- package/src/execution/core/__tests__/api-schemas.test.ts +667 -0
- package/src/execution/core/__tests__/archived-logs.test.ts +72 -0
- package/src/execution/core/api-schemas.ts +312 -0
- package/src/execution/core/index.ts +11 -0
- package/src/execution/core/resource-validator.test.ts +63 -0
- package/src/execution/core/runner-types.ts +80 -0
- package/src/execution/core/server/environment.ts +31 -0
- package/src/execution/core/sse-executions.ts +119 -0
- package/src/execution/core/types.ts +29 -0
- package/src/execution/engine/__tests__/fixtures/index.ts +2 -0
- package/src/execution/engine/__tests__/fixtures/mock-scenarios.ts +60 -0
- package/src/execution/engine/__tests__/fixtures/test-agents.ts +85 -0
- package/src/execution/engine/__tests__/integration/agent-framework.integration.test.ts +1031 -0
- package/src/execution/engine/__tests__/timeout.test.ts +565 -0
- package/src/execution/engine/agent/__tests__/errors.test.ts +508 -0
- package/src/execution/engine/agent/actions/__tests__/processor.test.ts +531 -0
- package/src/execution/engine/agent/actions/executor.ts +205 -0
- package/src/execution/engine/agent/actions/navigate-knowledge-executor.ts +230 -0
- package/src/execution/engine/agent/actions/processor.ts +116 -0
- package/src/execution/engine/agent/actions/types.ts +70 -0
- package/src/execution/engine/agent/core/__tests__/agent.test.ts +614 -0
- package/src/execution/engine/agent/core/__tests__/error-passthrough.test.ts +134 -0
- package/src/execution/engine/agent/core/agent.ts +810 -0
- package/src/execution/engine/agent/core/types.ts +155 -0
- package/src/execution/engine/agent/errors.ts +251 -0
- package/src/execution/engine/agent/index.ts +78 -0
- package/src/execution/engine/agent/knowledge-map/__tests__/navigate-knowledge-executor.test.ts +580 -0
- package/src/execution/engine/agent/knowledge-map/__tests__/utils.test.ts +622 -0
- package/src/execution/engine/agent/knowledge-map/types.ts +106 -0
- package/src/execution/engine/agent/knowledge-map/utils.ts +101 -0
- package/src/execution/engine/agent/memory/__tests__/domains.test.ts +72 -0
- package/src/execution/engine/agent/memory/__tests__/manager.test.ts +754 -0
- package/src/execution/engine/agent/memory/__tests__/utils.test.ts +285 -0
- package/src/execution/engine/agent/memory/domains.ts +99 -0
- package/src/execution/engine/agent/memory/manager.ts +365 -0
- package/src/execution/engine/agent/memory/processor.ts +66 -0
- package/src/execution/engine/agent/memory/types.ts +90 -0
- package/src/execution/engine/agent/memory/utils.ts +134 -0
- package/src/execution/engine/agent/observability/logging.ts +467 -0
- package/src/execution/engine/agent/observability/types.ts +64 -0
- package/src/execution/engine/agent/reasoning/__tests__/request-builder.test.ts +209 -0
- package/src/execution/engine/agent/reasoning/adapters/agent-adapter-helpers.ts +349 -0
- package/src/execution/engine/agent/reasoning/processor.ts +92 -0
- package/src/execution/engine/agent/reasoning/prompt-sections/base-actions.ts +134 -0
- package/src/execution/engine/agent/reasoning/prompt-sections/completion.ts +49 -0
- package/src/execution/engine/agent/reasoning/prompt-sections/knowledge-map.ts +93 -0
- package/src/execution/engine/agent/reasoning/prompt-sections/memory.ts +65 -0
- package/src/execution/engine/agent/reasoning/prompt-sections/security.ts +32 -0
- package/src/execution/engine/agent/reasoning/prompt-sections/tools.ts +44 -0
- package/src/execution/engine/agent/reasoning/request-builder.ts +169 -0
- package/src/execution/engine/agent/reasoning/types.ts +18 -0
- package/src/execution/engine/base/__tests__/errors.test.ts +246 -0
- package/src/execution/engine/base/__tests__/serialization.test.ts +670 -0
- package/src/execution/engine/base/__tests__/utils.test.ts +45 -0
- package/src/execution/engine/base/errors.ts +118 -0
- package/src/execution/engine/base/index.ts +2 -0
- package/src/execution/engine/base/logging.ts +31 -0
- package/src/execution/engine/base/serialization.ts +324 -0
- package/src/execution/engine/base/types.ts +126 -0
- package/src/execution/engine/base/utils.ts +41 -0
- package/src/execution/engine/index.ts +440 -0
- package/src/execution/engine/interface/index.ts +1 -0
- package/src/execution/engine/interface/types.ts +62 -0
- package/src/execution/engine/llm/__tests__/errors.test.ts +318 -0
- package/src/execution/engine/llm/__tests__/input-sanitizer.test.ts +286 -0
- package/src/execution/engine/llm/__tests__/model-info.test.ts +50 -0
- package/src/execution/engine/llm/__tests__/model-validation.test.ts +321 -0
- package/src/execution/engine/llm/__tests__/response-schema-validator.test.ts +115 -0
- package/src/execution/engine/llm/adapters/__tests__/adapter-factory.test.ts +375 -0
- package/src/execution/engine/llm/adapters/__tests__/anthropic-adapter.test.ts +463 -0
- package/src/execution/engine/llm/adapters/__tests__/anthropic.integration.test.ts +177 -0
- package/src/execution/engine/llm/adapters/__tests__/circuit-breaker-error.test.ts +94 -0
- package/src/execution/engine/llm/adapters/__tests__/google-adapter.test.ts +722 -0
- package/src/execution/engine/llm/adapters/__tests__/google.integration.test.ts +376 -0
- package/src/execution/engine/llm/adapters/__tests__/mock-adapter.test.ts +432 -0
- package/src/execution/engine/llm/adapters/__tests__/openai-adapter.test.ts +551 -0
- package/src/execution/engine/llm/adapters/__tests__/openrouter-adapter.test.ts +563 -0
- package/src/execution/engine/llm/adapters/__tests__/openrouter.integration.test.ts +105 -0
- package/src/execution/engine/llm/adapters/__tests__/universal-adapter.test.ts +537 -0
- package/src/execution/engine/llm/adapters/circuit-breaker.ts +147 -0
- package/src/execution/engine/llm/adapters/index.ts +17 -0
- package/src/execution/engine/llm/adapters/mock-adapter.ts +116 -0
- package/src/execution/engine/llm/adapters/server/adapter-factory.ts +130 -0
- package/src/execution/engine/llm/adapters/server/anthropic.ts +137 -0
- package/src/execution/engine/llm/adapters/server/compose-signal.ts +18 -0
- package/src/execution/engine/llm/adapters/server/google.ts +283 -0
- package/src/execution/engine/llm/adapters/server/index.ts +12 -0
- package/src/execution/engine/llm/adapters/server/openai.ts +206 -0
- package/src/execution/engine/llm/adapters/server/openrouter.ts +235 -0
- package/src/execution/engine/llm/adapters/universal-adapter.ts +230 -0
- package/src/execution/engine/llm/errors.ts +186 -0
- package/src/execution/engine/llm/input-sanitizer.ts +129 -0
- package/src/execution/engine/llm/model-info.ts +332 -0
- package/src/execution/engine/llm/response-schema-validator.ts +113 -0
- package/src/execution/engine/llm/types.ts +86 -0
- package/src/execution/engine/test-utils/index.ts +6 -0
- package/src/execution/engine/test-utils/mocks.ts +56 -0
- package/src/execution/engine/tools/__tests__/tooling-error.test.ts +265 -0
- package/src/execution/engine/tools/__tests__/types.test.ts +47 -0
- package/src/execution/engine/tools/integration/base-integration-adapter.ts +50 -0
- package/src/execution/engine/tools/integration/index.ts +53 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-adapter.ts +73 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/anymailfinder-tools.ts +209 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-company-email/index.ts +82 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-decision-maker-email/index.ts +122 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/find-person-email/index.ts +89 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/fetch/verify-email/index.ts +84 -0
- package/src/execution/engine/tools/integration/server/adapters/anymailfinder/index.ts +16 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/__tests__/apify-run-actor.integration.test.ts +293 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-adapter.ts +100 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/apify-tools.ts +217 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/get-dataset-items/index.ts +92 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/run-actor/index.ts +218 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/fetch/start-actor/index.ts +87 -0
- package/src/execution/engine/tools/integration/server/adapters/apify/index.ts +11 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/__tests__/attio-crud.integration.test.ts +362 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/attio-adapter.ts +162 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/attio-tools.ts +594 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/README.md +632 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-attribute/index.ts +214 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-note/index.ts +152 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/create-record/index.ts +141 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-note/index.ts +86 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/delete-record/index.ts +105 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.test.ts +186 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/get-record/index.ts +118 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-attributes/index.ts +165 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-notes/index.ts +96 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-objects/index.ts +104 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.test.ts +338 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/list-records/index.ts +156 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-attribute/index.ts +220 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/update-record/index.ts +140 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/fetch/utils/types.ts +147 -0
- package/src/execution/engine/tools/integration/server/adapters/attio/index.ts +31 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/__tests__/dropbox-adapter.test.ts +409 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/dropbox-adapter.ts +281 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/dropbox-tools.ts +106 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/fetch/create-folder/__tests__/index.test.ts +451 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/fetch/create-folder/index.ts +114 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/fetch/upload-file/__tests__/index.test.ts +415 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/fetch/upload-file/index.ts +111 -0
- package/src/execution/engine/tools/integration/server/adapters/dropbox/index.ts +25 -0
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-adapter.ts +210 -0
- package/src/execution/engine/tools/integration/server/adapters/gmail/gmail-tools.ts +104 -0
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/__tests__/google-sheets.integration.test.ts +261 -0
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-adapter.ts +1189 -0
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/google-sheets-tools.ts +641 -0
- package/src/execution/engine/tools/integration/server/adapters/google-sheets/index.ts +18 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/activate-campaign/index.ts +86 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/__tests__/index.test.ts +289 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/add-to-campaign/index.ts +154 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/__tests__/index.test.ts +325 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-add-leads/index.ts +153 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/bulk-delete-leads/index.ts +84 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-campaign/index.ts +125 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/create-inbox-test/index.ts +107 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/delete-campaign/index.ts +85 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-account-health/index.ts +91 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign/index.ts +92 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/__tests__/index.test.ts +195 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-campaign-analytics/index.ts +113 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-daily-campaign-analytics/index.ts +104 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-emails/index.ts +155 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/__tests__/index.test.ts +196 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/get-step-analytics/index.ts +102 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/__tests__/index.test.ts +189 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-campaigns/index.ts +87 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/list-leads/index.ts +112 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/patch-lead/index.ts +76 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/pause-campaign/index.ts +86 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/remove-from-subsequence/index.ts +98 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/send-reply/index.ts +126 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/__tests__/index.test.ts +193 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-campaign/index.ts +99 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/__tests__/index.test.ts +621 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/fetch/update-interest-status/index.ts +125 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/index.ts +29 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-adapter.ts +178 -0
- package/src/execution/engine/tools/integration/server/adapters/instantly/instantly-tools.ts +1473 -0
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/check-credits/index.ts +59 -0
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/fetch/verify-email/index.ts +102 -0
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/index.ts +17 -0
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-adapter.ts +80 -0
- package/src/execution/engine/tools/integration/server/adapters/millionverifier/millionverifier-tools.ts +102 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/get-email/index.ts +102 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/send-email/index.ts +134 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/fetch/utils/types.ts +75 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/index.ts +27 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/resend-adapter.ts +108 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/resend-tools.ts +132 -0
- package/src/execution/engine/tools/integration/server/adapters/resend/types.ts +44 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/create-envelope/index.ts +274 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/download-document/index.ts +230 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/get-envelope/index.ts +133 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/utils/types.ts +246 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/fetch/void-envelope/index.ts +90 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/index.ts +38 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/signature-api-adapter.ts +87 -0
- package/src/execution/engine/tools/integration/server/adapters/signature-api/signature-api-tools.ts +179 -0
- package/src/execution/engine/tools/integration/server/adapters/stripe/fetch/utils/types.ts +210 -0
- package/src/execution/engine/tools/integration/server/adapters/stripe/index.ts +44 -0
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-adapter.ts +517 -0
- package/src/execution/engine/tools/integration/server/adapters/stripe/stripe-tools.ts +309 -0
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/domain-search/index.ts +133 -0
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-finder/index.ts +122 -0
- package/src/execution/engine/tools/integration/server/adapters/tomba/fetch/email-verifier/index.ts +111 -0
- package/src/execution/engine/tools/integration/server/adapters/tomba/index.ts +11 -0
- package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-adapter.ts +78 -0
- package/src/execution/engine/tools/integration/server/adapters/tomba/tomba-tools.ts +222 -0
- package/src/execution/engine/tools/integration/server/index.ts +61 -0
- package/src/execution/engine/tools/integration/service.ts +161 -0
- package/src/execution/engine/tools/integration/tool.ts +253 -0
- package/src/execution/engine/tools/integration/types/anymailfinder.ts +74 -0
- package/src/execution/engine/tools/integration/types/apify.ts +92 -0
- package/src/execution/engine/tools/integration/types/attio.ts +354 -0
- package/src/execution/engine/tools/integration/types/dropbox.ts +64 -0
- package/src/execution/engine/tools/integration/types/gmail.ts +35 -0
- package/src/execution/engine/tools/integration/types/google-sheets.ts +303 -0
- package/src/execution/engine/tools/integration/types/index.ts +19 -0
- package/src/execution/engine/tools/integration/types/instantly.ts +557 -0
- package/src/execution/engine/tools/integration/types/millionverifier.ts +56 -0
- package/src/execution/engine/tools/integration/types/resend.ts +63 -0
- package/src/execution/engine/tools/integration/types/signature-api.ts +164 -0
- package/src/execution/engine/tools/integration/types/stripe.ts +162 -0
- package/src/execution/engine/tools/integration/types/tomba.ts +94 -0
- package/src/execution/engine/tools/lead-service-types.ts +884 -0
- package/src/execution/engine/tools/llm/index.ts +11 -0
- package/src/execution/engine/tools/llm/server/index.ts +8 -0
- package/src/execution/engine/tools/llm/server/llm-call-tool.ts +118 -0
- package/src/execution/engine/tools/platform/__tests__/approval.test.ts +242 -0
- package/src/execution/engine/tools/platform/__tests__/email.test.ts +482 -0
- package/src/execution/engine/tools/platform/__tests__/hitl-cancel.test.ts +97 -0
- package/src/execution/engine/tools/platform/__tests__/notification.test.ts +208 -0
- package/src/execution/engine/tools/platform/__tests__/pdf.test.ts +441 -0
- package/src/execution/engine/tools/platform/__tests__/scheduler.test.ts +189 -0
- package/src/execution/engine/tools/platform/__tests__/schedules.test.ts +336 -0
- package/src/execution/engine/tools/platform/acquisition/company-tools.ts +248 -0
- package/src/execution/engine/tools/platform/acquisition/contact-tools.ts +319 -0
- package/src/execution/engine/tools/platform/acquisition/index.ts +43 -0
- package/src/execution/engine/tools/platform/acquisition/list-tools.ts +148 -0
- package/src/execution/engine/tools/platform/acquisition/types.ts +260 -0
- package/src/execution/engine/tools/platform/approval/cancel-by-metadata.ts +65 -0
- package/src/execution/engine/tools/platform/approval/index.ts +4 -0
- package/src/execution/engine/tools/platform/approval/tool.ts +99 -0
- package/src/execution/engine/tools/platform/email/index.ts +122 -0
- package/src/execution/engine/tools/platform/email/types.ts +96 -0
- package/src/execution/engine/tools/platform/index.ts +181 -0
- package/src/execution/engine/tools/platform/notification.ts +81 -0
- package/src/execution/engine/tools/platform/pdf/index.ts +110 -0
- package/src/execution/engine/tools/platform/pdf/types.ts +77 -0
- package/src/execution/engine/tools/platform/resource-invocation/__tests__/edge-cases.test.ts +507 -0
- package/src/execution/engine/tools/platform/resource-invocation/__tests__/resource-invocation-service.test.ts +500 -0
- package/src/execution/engine/tools/platform/resource-invocation/__tests__/tool.test.ts +555 -0
- package/src/execution/engine/tools/platform/resource-invocation/dynamic-tool.ts +94 -0
- package/src/execution/engine/tools/platform/resource-invocation/index.ts +14 -0
- package/src/execution/engine/tools/platform/resource-invocation/resource-invocation-service.ts +147 -0
- package/src/execution/engine/tools/platform/resource-invocation/tool.ts +115 -0
- package/src/execution/engine/tools/platform/resource-invocation/types.ts +31 -0
- package/src/execution/engine/tools/platform/scheduler.ts +87 -0
- package/src/execution/engine/tools/platform/schedules/cancel-by-key-tool.ts +48 -0
- package/src/execution/engine/tools/platform/schedules/cancel-by-metadata-tool.ts +42 -0
- package/src/execution/engine/tools/platform/schedules/delete-by-key-tool.ts +43 -0
- package/src/execution/engine/tools/platform/schedules/index.ts +13 -0
- package/src/execution/engine/tools/platform/schedules/list-tool.ts +56 -0
- package/src/execution/engine/tools/platform/schedules/types.ts +88 -0
- package/src/execution/engine/tools/platform/storage/__tests__/storage.test.ts +998 -0
- package/src/execution/engine/tools/platform/storage/index.ts +370 -0
- package/src/execution/engine/tools/platform/storage/types.ts +128 -0
- package/src/execution/engine/tools/platform/types.ts +148 -0
- package/src/execution/engine/tools/registry.ts +590 -0
- package/src/execution/engine/tools/tool-maps.ts +694 -0
- package/src/execution/engine/tools/types.ts +233 -0
- package/src/execution/engine/workflow/__tests__/errors.test.ts +139 -0
- package/src/execution/engine/workflow/__tests__/utils.test.ts +645 -0
- package/src/execution/engine/workflow/__tests__/workflow.test.ts +818 -0
- package/src/execution/engine/workflow/errors.ts +63 -0
- package/src/execution/engine/workflow/helpers/index.ts +11 -0
- package/src/execution/engine/workflow/helpers/server/index.ts +8 -0
- package/src/execution/engine/workflow/helpers/server/llm-call.ts +93 -0
- package/src/execution/engine/workflow/index.ts +19 -0
- package/src/execution/engine/workflow/log-truncate.ts +26 -0
- package/src/execution/engine/workflow/logging.ts +191 -0
- package/src/execution/engine/workflow/types.ts +183 -0
- package/src/execution/engine/workflow/utils.ts +280 -0
- package/src/execution/engine/workflow/workflow.ts +168 -0
- package/src/execution/index.ts +20 -0
- package/src/execution/scheduler/__tests__/api-schemas.test.ts +733 -0
- package/src/execution/scheduler/__tests__/retry.test.ts +37 -0
- package/src/execution/scheduler/__tests__/utils.test.ts +1009 -0
- package/src/execution/scheduler/api-schemas.ts +296 -0
- package/src/execution/scheduler/index.ts +50 -0
- package/src/execution/scheduler/schemas.ts +264 -0
- package/src/execution/scheduler/types.ts +111 -0
- package/src/execution/scheduler/utils.ts +364 -0
- package/src/forms/index.ts +7 -0
- package/src/forms/schemas.test.ts +113 -0
- package/src/forms/schemas.ts +69 -0
- package/src/forms/types.ts +70 -0
- package/src/index.ts +54 -0
- package/src/integrations/credentials/__tests__/api-schemas.test.ts +496 -0
- package/src/integrations/credentials/__tests__/schemas.test.ts +82 -0
- package/src/integrations/credentials/__tests__/utils.test.ts +144 -0
- package/src/integrations/credentials/api-schemas.ts +143 -0
- package/src/integrations/credentials/index.ts +32 -0
- package/src/integrations/credentials/schemas.ts +164 -0
- package/src/integrations/credentials/utils.ts +59 -0
- package/src/integrations/oauth/__tests__/provider-registry.test.ts +59 -0
- package/src/integrations/oauth/api-schemas.ts +92 -0
- package/src/integrations/oauth/index.ts +19 -0
- package/src/integrations/oauth/provider-registry.ts +61 -0
- package/src/integrations/oauth/server/__tests__/refresh-concurrent.test.ts +183 -0
- package/src/integrations/oauth/server/__tests__/refresh.integration.test.ts +257 -0
- package/src/integrations/oauth/server/__tests__/refresh.test.ts +577 -0
- package/src/integrations/oauth/server/credentials.ts +39 -0
- package/src/integrations/oauth/server/refresh.ts +214 -0
- package/src/integrations/oauth/types.ts +34 -0
- package/src/integrations/webhook-endpoints/__tests__/api-schemas.test.ts +318 -0
- package/src/integrations/webhook-endpoints/api-schemas.ts +102 -0
- package/src/integrations/webhook-endpoints/index.ts +28 -0
- package/src/integrations/webhook-endpoints/types.ts +51 -0
- package/src/operations/activities/api-schemas.ts +79 -0
- package/src/operations/activities/index.ts +9 -0
- package/src/operations/activities/sse-events.ts +30 -0
- package/src/operations/activities/types.ts +63 -0
- package/src/operations/debug-logs/client.ts +60 -0
- package/src/operations/debug-logs/debug-logger.ts +83 -0
- package/src/operations/debug-logs/index.ts +8 -0
- package/src/operations/debug-logs/server.ts +19 -0
- package/src/operations/debug-logs/types.ts +33 -0
- package/src/operations/index.ts +50 -0
- package/src/operations/notifications/__tests__/api-schemas.test.ts +216 -0
- package/src/operations/notifications/api-schemas.ts +91 -0
- package/src/operations/notifications/index.ts +3 -0
- package/src/operations/notifications/sse-events.ts +21 -0
- package/src/operations/notifications/types.ts +47 -0
- package/src/operations/observability/__tests__/openrouter-cost-flow.test.ts +297 -0
- package/src/operations/observability/__tests__/schemas.test.ts +151 -0
- package/src/operations/observability/__tests__/types.test.ts +109 -0
- package/src/operations/observability/__tests__/utils.test.ts +54 -0
- package/src/operations/observability/ai-usage-collector.ts +64 -0
- package/src/operations/observability/index.ts +13 -0
- package/src/operations/observability/metrics-collector.ts +49 -0
- package/src/operations/observability/schemas.ts +39 -0
- package/src/operations/observability/types.ts +463 -0
- package/src/operations/observability/utils.ts +77 -0
- package/src/operations/sessions/__tests__/api-schemas.test.ts +361 -0
- package/src/operations/sessions/__tests__/manager.test.ts +821 -0
- package/src/operations/sessions/api-schemas.ts +166 -0
- package/src/operations/sessions/index.ts +26 -0
- package/src/operations/sessions/server/manager.ts +90 -0
- package/src/operations/sessions/server/session.ts +180 -0
- package/src/operations/sessions/types.ts +98 -0
- package/src/operations/triggers/index.ts +12 -0
- package/src/operations/triggers/webhook/definitions/__tests__/instantly-reply-received.test.ts +72 -0
- package/src/operations/triggers/webhook/definitions/instantly-account-error.ts +44 -0
- package/src/operations/triggers/webhook/definitions/instantly-auto-reply-received.ts +51 -0
- package/src/operations/triggers/webhook/definitions/instantly-campaign-completed.ts +45 -0
- package/src/operations/triggers/webhook/definitions/instantly-email-bounced.ts +49 -0
- package/src/operations/triggers/webhook/definitions/instantly-lead-unsubscribed.ts +45 -0
- package/src/operations/triggers/webhook/definitions/instantly-reply-received.ts +54 -0
- package/src/operations/triggers/webhook/index.ts +35 -0
- package/src/operations/triggers/webhook/types.ts +74 -0
- package/src/organization-model/README.md +79 -0
- package/src/organization-model/__tests__/graph.test.ts +250 -0
- package/src/organization-model/__tests__/resolve.test.ts +47 -0
- package/src/organization-model/defaults.ts +60 -0
- package/src/organization-model/domains/branding.ts +22 -0
- package/src/organization-model/domains/crm.ts +46 -0
- package/src/organization-model/domains/delivery.ts +48 -0
- package/src/organization-model/domains/features.ts +57 -0
- package/src/organization-model/domains/lead-gen.ts +33 -0
- package/src/organization-model/domains/navigation.ts +103 -0
- package/src/organization-model/domains/shared.ts +42 -0
- package/src/organization-model/graph/build.ts +432 -0
- package/src/organization-model/graph/index.ts +4 -0
- package/src/organization-model/graph/schema.ts +50 -0
- package/src/organization-model/graph/types.ts +52 -0
- package/src/organization-model/index.ts +11 -0
- package/src/organization-model/published.ts +18 -0
- package/src/organization-model/resolve.ts +42 -0
- package/src/organization-model/schema.ts +21 -0
- package/src/organization-model/types.ts +27 -0
- package/src/platform/api/index.ts +1 -0
- package/src/platform/api/types.ts +35 -0
- package/src/platform/constants/http.ts +37 -0
- package/src/platform/constants/index.ts +5 -0
- package/src/platform/constants/limits.ts +32 -0
- package/src/platform/constants/resilience.ts +51 -0
- package/src/platform/constants/timeouts.ts +20 -0
- package/src/platform/constants/versions.ts +3 -0
- package/src/platform/index.ts +27 -0
- package/src/platform/registry/__tests__/command-view.test.ts +410 -0
- package/src/platform/registry/__tests__/resource-registry-static.test.ts +347 -0
- package/src/platform/registry/__tests__/resource-registry.integration.test.ts +1004 -0
- package/src/platform/registry/__tests__/resource-registry.list-executable.test.ts +393 -0
- package/src/platform/registry/__tests__/resource-registry.test.ts +1942 -0
- package/src/platform/registry/__tests__/serialization.test.ts +1127 -0
- package/src/platform/registry/__tests__/validation.test.ts +1086 -0
- package/src/platform/registry/command-view.ts +180 -0
- package/src/platform/registry/domains.ts +165 -0
- package/src/platform/registry/index.ts +93 -0
- package/src/platform/registry/reserved.ts +24 -0
- package/src/platform/registry/resource-metadata.ts +59 -0
- package/src/platform/registry/resource-registry.command-queue-groups.test.ts +129 -0
- package/src/platform/registry/resource-registry.ts +788 -0
- package/src/platform/registry/serialization.ts +273 -0
- package/src/platform/registry/serialized-types.ts +231 -0
- package/src/platform/registry/stats-types.ts +66 -0
- package/src/platform/registry/types.ts +404 -0
- package/src/platform/registry/validation.ts +513 -0
- package/src/platform/resilience/__tests__/circuit-breaker.test.ts +291 -0
- package/src/platform/resilience/__tests__/http-error-mapper.test.ts +173 -0
- package/src/platform/resilience/__tests__/rate-limiter.test.ts +471 -0
- package/src/platform/resilience/__tests__/retry.test.ts +380 -0
- package/src/platform/resilience/__tests__/timeout.test.ts +219 -0
- package/src/platform/resilience/circuit-breaker.ts +164 -0
- package/src/platform/resilience/errors.ts +68 -0
- package/src/platform/resilience/http-error-mapper.ts +129 -0
- package/src/platform/resilience/index.ts +93 -0
- package/src/platform/resilience/rate-limiter-types.ts +46 -0
- package/src/platform/resilience/rate-limiter.ts +140 -0
- package/src/platform/resilience/retry.ts +89 -0
- package/src/platform/resilience/timeout.ts +63 -0
- package/src/platform/sse/events.ts +67 -0
- package/src/platform/sse/index.ts +7 -0
- package/src/platform/utils/__tests__/currency.test.ts +77 -0
- package/src/platform/utils/__tests__/validation.test.ts +1083 -0
- package/src/platform/utils/currency.ts +96 -0
- package/src/platform/utils/debounce.ts +52 -0
- package/src/platform/utils/error.ts +42 -0
- package/src/platform/utils/hmac.test.ts +97 -0
- package/src/platform/utils/index.ts +32 -0
- package/src/platform/utils/server/betterstack-logger.ts +210 -0
- package/src/platform/utils/server/hmac.ts +44 -0
- package/src/platform/utils/server/unsubscribe.ts +111 -0
- package/src/platform/utils/token-counter.ts +96 -0
- package/src/platform/utils/validation.ts +425 -0
- package/src/projects/api-schemas.ts +265 -0
- package/src/published.ts +1 -0
- package/src/server.ts +273 -0
- package/src/supabase/__tests__/helpers.test.ts +51 -0
- package/src/supabase/database.types.ts +2674 -0
- package/src/supabase/helpers.ts +20 -0
- package/src/supabase/index.ts +52 -0
- package/src/supabase/server/client.ts +58 -0
- package/src/test-utils/README.md +150 -0
- package/src/test-utils/browser-mocks.ts +54 -0
- package/src/test-utils/fixtures/api-keys.ts +52 -0
- package/src/test-utils/fixtures/index.ts +4 -0
- package/src/test-utils/fixtures/memberships.ts +80 -0
- package/src/test-utils/fixtures/organizations.ts +69 -0
- package/src/test-utils/fixtures/users.ts +79 -0
- package/src/test-utils/index.ts +11 -0
- package/src/test-utils/mocks/index.ts +2 -0
- package/src/test-utils/mocks/supabase.ts +142 -0
- package/src/test-utils/mocks/workos.ts +108 -0
- package/src/test-utils/rls/RLSTestContext.ts +586 -0
- package/src/test-utils/rls/index.ts +1 -0
|
@@ -0,0 +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
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Phase Processor
|
|
3
|
+
* Handles memory operations from LLM responses
|
|
4
|
+
* Phase 2 of iteration: REASON -> MEMORY -> ACT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { LLMIterationResponse } from '../reasoning/types'
|
|
8
|
+
import type { MemoryManager } from './manager'
|
|
9
|
+
import type { AgentScopedLogger } from '../observability/logging'
|
|
10
|
+
import { validateMemoryKeyOwnership } from './utils'
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Process memory operations from LLM response
|
|
14
|
+
* Applies agent-directed memory management (set/delete)
|
|
15
|
+
*
|
|
16
|
+
* @param memoryManager - Memory manager instance
|
|
17
|
+
* @param response - LLM iteration response with optional memoryOps
|
|
18
|
+
* @param logger - Scoped logger for memory operations
|
|
19
|
+
* @param iteration - Current iteration number
|
|
20
|
+
*/
|
|
21
|
+
export async function processMemory(
|
|
22
|
+
memoryManager: MemoryManager,
|
|
23
|
+
response: LLMIterationResponse,
|
|
24
|
+
logger: AgentScopedLogger,
|
|
25
|
+
iteration: number
|
|
26
|
+
): Promise<void> {
|
|
27
|
+
if (!response.memoryOps) return
|
|
28
|
+
|
|
29
|
+
const { memoryOps } = response
|
|
30
|
+
|
|
31
|
+
// Apply set operations with domain validation
|
|
32
|
+
if (memoryOps.set) {
|
|
33
|
+
for (const [key, content] of Object.entries(memoryOps.set)) {
|
|
34
|
+
// Validate ownership - skip if system-managed
|
|
35
|
+
if (!validateMemoryKeyOwnership(key, logger, iteration)) {
|
|
36
|
+
continue
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const startTime = Date.now()
|
|
40
|
+
// Auto-stringify non-string values (arrays, objects, etc.)
|
|
41
|
+
const stringValue = typeof content === 'string' ? content : JSON.stringify(content)
|
|
42
|
+
memoryManager.set(key, stringValue)
|
|
43
|
+
const endTime = Date.now()
|
|
44
|
+
logger.action('memory-set', `Set: ${key}`, iteration, startTime, endTime, endTime - startTime)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Apply delete operations with domain validation
|
|
49
|
+
if (memoryOps.delete) {
|
|
50
|
+
for (const key of memoryOps.delete) {
|
|
51
|
+
// Validate ownership - skip if system-managed
|
|
52
|
+
if (!validateMemoryKeyOwnership(key, logger, iteration)) {
|
|
53
|
+
continue
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const startTime = Date.now()
|
|
57
|
+
const deleted = memoryManager.delete(key)
|
|
58
|
+
const endTime = Date.now()
|
|
59
|
+
if (deleted) {
|
|
60
|
+
logger.action('memory-delete', `Deleted: ${key}`, iteration, startTime, endTime, endTime - startTime)
|
|
61
|
+
} else {
|
|
62
|
+
logger.action('memory-delete-missing', `Attempted to delete non-existent key: ${key}`, iteration, startTime, endTime, endTime - startTime)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory type definitions
|
|
3
|
+
* Types for agent memory management with semantic entry types
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Semantic memory entry types
|
|
8
|
+
* Use-case agnostic types that describe the purpose of each entry
|
|
9
|
+
* Memory types mirror action types for clarity and filtering
|
|
10
|
+
*/
|
|
11
|
+
export type MemoryEntryType =
|
|
12
|
+
| 'context' // Pre-loaded context entry (before execution)
|
|
13
|
+
| 'input' // User request or event payload
|
|
14
|
+
| 'reasoning' // LLM thought process
|
|
15
|
+
| 'tool-result' // Result from tool execution
|
|
16
|
+
| 'delegation-result' // Result from sub-agent delegation (future)
|
|
17
|
+
| 'error' // Error from failed action (tool error, validation error, etc.)
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Memory entry - represents a single entry in agent memory
|
|
21
|
+
* Stored in agent memory, translated by adapters to vendor-specific formats
|
|
22
|
+
*/
|
|
23
|
+
export interface MemoryEntry {
|
|
24
|
+
type: MemoryEntryType
|
|
25
|
+
content: string
|
|
26
|
+
timestamp: number
|
|
27
|
+
turnNumber: number | null // Which turn/execution created this entry (1, 2, 3... for session turns, null for session memory or one-off executions)
|
|
28
|
+
iterationNumber: number | null // Which iteration created this entry (0 = pre-iteration input, null = session memory/non-iteration-specific)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Agent memory - Self-orchestrated memory with session + working storage
|
|
33
|
+
* Agent has full control over what persists, framework handles auto-compaction
|
|
34
|
+
*/
|
|
35
|
+
export interface AgentMemory {
|
|
36
|
+
/**
|
|
37
|
+
* Session memory - Persists for session/conversation duration
|
|
38
|
+
* Never auto-trimmed by framework
|
|
39
|
+
* Agent-managed key-value store for critical information
|
|
40
|
+
* Agent provides strings, framework wraps in MemoryEntry
|
|
41
|
+
*/
|
|
42
|
+
sessionMemory: Record<string, MemoryEntry>
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Working memory - Execution history
|
|
46
|
+
* Automatically compacted by framework when needed
|
|
47
|
+
* Agent doesn't control compaction
|
|
48
|
+
*/
|
|
49
|
+
history: MemoryEntry[]
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Memory operations - Agent-directed memory management
|
|
54
|
+
* Agent provides string content, framework wraps in MemoryEntry structure
|
|
55
|
+
*/
|
|
56
|
+
export interface MemoryOperations {
|
|
57
|
+
/**
|
|
58
|
+
* Add/update session memory
|
|
59
|
+
* Agent provides string content, framework wraps in MemoryEntry
|
|
60
|
+
*/
|
|
61
|
+
set?: Record<string, string> // key -> content string
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Remove from session memory
|
|
65
|
+
*/
|
|
66
|
+
delete?: string[] // array of keys to delete
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Memory status for agent awareness
|
|
71
|
+
*/
|
|
72
|
+
export interface MemoryStatus {
|
|
73
|
+
// Session memory
|
|
74
|
+
sessionMemoryKeys: number // Current count
|
|
75
|
+
sessionMemoryLimit: number // Max allowed (default: 10)
|
|
76
|
+
currentKeys: string[] // List of keys currently stored
|
|
77
|
+
|
|
78
|
+
// History memory (token-based)
|
|
79
|
+
historyPercent: number // 0-100 (percentage of token budget used)
|
|
80
|
+
historyTokens: number // Current token count
|
|
81
|
+
tokenBudget: number // Total token budget for memory
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Memory constraints (optional limits)
|
|
86
|
+
*/
|
|
87
|
+
export interface MemoryConstraints {
|
|
88
|
+
maxSessionMemoryKeys?: number // Max session memory keys (default: 10)
|
|
89
|
+
maxMemoryTokens?: number // Total token budget for all memory (default: 14000)
|
|
90
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory utilities
|
|
3
|
+
* Helper functions for memory manipulation (formatting, snapshots)
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { AgentMemory } from './types'
|
|
7
|
+
import type { ExecutionContext } from '../../base/types'
|
|
8
|
+
import type { SupabaseClient } from '../../../../supabase'
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Load session memory from database
|
|
12
|
+
*
|
|
13
|
+
* Standard pattern for preloadMemory callback:
|
|
14
|
+
* - If sessionId exists: restore memory snapshot from database
|
|
15
|
+
* - If no sessionId: return fresh memory (one-off task)
|
|
16
|
+
* - Handles errors gracefully by returning empty memory
|
|
17
|
+
*
|
|
18
|
+
* @param supabaseClient - Supabase client instance
|
|
19
|
+
* @param context - Execution context (must include organizationId, optional sessionId)
|
|
20
|
+
* @returns Agent memory (restored from DB or fresh)
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* import { loadSessionMemory } from '@repo/core'
|
|
25
|
+
* import { supabaseClient } from '@repo/core/server'
|
|
26
|
+
*
|
|
27
|
+
* async function preloadMemory(context: ExecutionContext): Promise<AgentMemory> {
|
|
28
|
+
* return loadSessionMemory(supabaseClient, context)
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export async function loadSessionMemory(
|
|
33
|
+
supabaseClient: SupabaseClient,
|
|
34
|
+
context: ExecutionContext
|
|
35
|
+
): Promise<AgentMemory> {
|
|
36
|
+
// If session turn, restore memory snapshot from database
|
|
37
|
+
if (context.sessionId) {
|
|
38
|
+
const { data: session, error } = await supabaseClient
|
|
39
|
+
.from('sessions')
|
|
40
|
+
.select('memory_snapshot')
|
|
41
|
+
.eq('session_id', context.sessionId)
|
|
42
|
+
.eq('organization_id', context.organizationId)
|
|
43
|
+
.single()
|
|
44
|
+
|
|
45
|
+
if (error) {
|
|
46
|
+
console.error('Failed to load session from DB', {
|
|
47
|
+
sessionId: context.sessionId,
|
|
48
|
+
error: error.message
|
|
49
|
+
})
|
|
50
|
+
return { sessionMemory: {}, history: [] }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const result = (session?.memory_snapshot as unknown as AgentMemory) || { sessionMemory: {}, history: [] }
|
|
54
|
+
return result
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// One-off task: start with fresh memory
|
|
58
|
+
return { sessionMemory: {}, history: [] }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Memory Helpers
|
|
63
|
+
// Utility functions for memory manipulation during action execution
|
|
64
|
+
// ============================================================================
|
|
65
|
+
|
|
66
|
+
import type { ToolCallAction } from '../actions/types'
|
|
67
|
+
import type { MemoryManager } from './manager'
|
|
68
|
+
import type { AgentScopedLogger } from '../observability/logging'
|
|
69
|
+
import { isToolOwnedKey, isActionOwnedKey, getKeyOwner } from './domains'
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Add tool execution error to memory
|
|
73
|
+
* Errors are stored as 'error' type entries and returned to LLM as tool results
|
|
74
|
+
* This allows the LLM to recover from errors and try alternative approaches
|
|
75
|
+
*
|
|
76
|
+
* @param memoryManager - Memory manager to add error to
|
|
77
|
+
* @param action - Tool call that failed
|
|
78
|
+
* @param errorMessage - Error description
|
|
79
|
+
* @param iteration - Iteration number when error occurred
|
|
80
|
+
* @param turnNumber - Turn number when error occurred (optional, defaults to null for one-off executions)
|
|
81
|
+
* @param metadata - Structured error metadata from ToolingError (optional)
|
|
82
|
+
*/
|
|
83
|
+
export function addToolError(
|
|
84
|
+
memoryManager: MemoryManager,
|
|
85
|
+
action: ToolCallAction,
|
|
86
|
+
errorMessage: string,
|
|
87
|
+
iteration: number,
|
|
88
|
+
turnNumber: number | null = null,
|
|
89
|
+
metadata?: {
|
|
90
|
+
errorType?: string
|
|
91
|
+
severity?: string
|
|
92
|
+
isRetryable?: boolean
|
|
93
|
+
}
|
|
94
|
+
): void {
|
|
95
|
+
memoryManager.addToHistory({
|
|
96
|
+
type: 'error',
|
|
97
|
+
content: JSON.stringify({
|
|
98
|
+
error: errorMessage,
|
|
99
|
+
toolName: action.name,
|
|
100
|
+
toolCallId: action.id,
|
|
101
|
+
...(metadata?.errorType && { errorType: metadata.errorType }),
|
|
102
|
+
...(metadata?.severity && { severity: metadata.severity }),
|
|
103
|
+
...(metadata?.isRetryable !== undefined && { isRetryable: metadata.isRetryable })
|
|
104
|
+
}),
|
|
105
|
+
turnNumber,
|
|
106
|
+
iterationNumber: iteration
|
|
107
|
+
})
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Validate memory key ownership
|
|
112
|
+
* Prevents LLM from updating system-managed keys (tool-owned or action-owned)
|
|
113
|
+
*
|
|
114
|
+
* @param key - Memory key to validate
|
|
115
|
+
* @param logger - Logger for rejected operations
|
|
116
|
+
* @param iteration - Current iteration number
|
|
117
|
+
* @returns true if key can be updated by LLM, false if rejected
|
|
118
|
+
*/
|
|
119
|
+
export function validateMemoryKeyOwnership(key: string, logger: AgentScopedLogger, iteration: number): boolean {
|
|
120
|
+
// VALIDATION: Prevent LLM from updating system-managed keys
|
|
121
|
+
if (isToolOwnedKey(key) || isActionOwnedKey(key)) {
|
|
122
|
+
const owner = getKeyOwner(key)
|
|
123
|
+
logger.action(
|
|
124
|
+
'memory-set-rejected',
|
|
125
|
+
`Rejected LLM update to ${owner}-managed key: ${key}`,
|
|
126
|
+
iteration,
|
|
127
|
+
Date.now(),
|
|
128
|
+
Date.now(),
|
|
129
|
+
0
|
|
130
|
+
)
|
|
131
|
+
return false
|
|
132
|
+
}
|
|
133
|
+
return true
|
|
134
|
+
}
|