@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,349 +1,349 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agent-Specific LLM Adapter Helpers
|
|
3
|
-
* Wraps generic LLM adapter with agent-specific request/response formatting
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { z, ZodError } from 'zod'
|
|
7
|
-
import type { LLMAdapter, LLMMessage } from '../../../llm/types'
|
|
8
|
-
import type { ToolDefinition } from '../../../tools/types'
|
|
9
|
-
import type { AgentAction } from '../../actions/types'
|
|
10
|
-
import { AgentActionSchema } from '../../actions/types'
|
|
11
|
-
import { getModelInfo } from '../../../llm/model-info'
|
|
12
|
-
import { InsufficientTokensError } from '../../../llm/errors'
|
|
13
|
-
import { AgentOutputValidationError } from '../../errors'
|
|
14
|
-
|
|
15
|
-
// ============================================================================
|
|
16
|
-
// Memory Operations Schema
|
|
17
|
-
// ============================================================================
|
|
18
|
-
|
|
19
|
-
const MemoryOperationsSchema = z.object({
|
|
20
|
-
set: z.record(z.string(), z.any()).optional(), // Accept any type - framework will stringify
|
|
21
|
-
delete: z.array(z.string()).optional()
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
// ============================================================================
|
|
25
|
-
// Zod Schemas for Agent Responses
|
|
26
|
-
// ============================================================================
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Agent iteration output schema
|
|
30
|
-
* Validates LLM response during iteration phase
|
|
31
|
-
*/
|
|
32
|
-
const AgentIterationOutputSchema = z.object({
|
|
33
|
-
reasoning: z.string(),
|
|
34
|
-
memoryOps: MemoryOperationsSchema.optional(),
|
|
35
|
-
nextActions: z.array(AgentActionSchema)
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
// ============================================================================
|
|
39
|
-
// Token Validation
|
|
40
|
-
// ============================================================================
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Validate token configuration meets model minimums
|
|
44
|
-
* Uses centralized MODEL_INFO from model-info.ts
|
|
45
|
-
*
|
|
46
|
-
* @param model - Model name (e.g., 'gpt-5-mini')
|
|
47
|
-
* @param maxOutputTokens - Configured max output tokens (optional)
|
|
48
|
-
* @throws InsufficientTokensError if below minimum
|
|
49
|
-
*/
|
|
50
|
-
function validateTokenConfiguration(model: string, maxOutputTokens?: number): void {
|
|
51
|
-
const modelInfo = getModelInfo(model)
|
|
52
|
-
const configured = maxOutputTokens || 1000 // Default if not specified
|
|
53
|
-
|
|
54
|
-
if (!modelInfo) {
|
|
55
|
-
// Unknown model - use conservative default (2000 tokens)
|
|
56
|
-
if (configured < 2000) {
|
|
57
|
-
throw new InsufficientTokensError(
|
|
58
|
-
`Unknown model '${model}' requires at least 2000 tokens (conservative default), but only ${configured} configured.`,
|
|
59
|
-
{ model, required: 2000, configured }
|
|
60
|
-
)
|
|
61
|
-
}
|
|
62
|
-
return
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Check against model-specific minimum
|
|
66
|
-
if (configured < modelInfo.minTokens) {
|
|
67
|
-
throw new InsufficientTokensError(
|
|
68
|
-
`Model ${model} requires at least ${modelInfo.minTokens} tokens, but only ${configured} configured. ` +
|
|
69
|
-
`${modelInfo.category === 'reasoning' ? 'Reasoning models need more tokens to generate both internal reasoning and output.' : ''}`,
|
|
70
|
-
{
|
|
71
|
-
model,
|
|
72
|
-
required: modelInfo.minTokens,
|
|
73
|
-
recommended: modelInfo.recommendedTokens,
|
|
74
|
-
configured
|
|
75
|
-
}
|
|
76
|
-
)
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// ============================================================================
|
|
81
|
-
// Helper Functions
|
|
82
|
-
// ============================================================================
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Call LLM for agent iteration phase
|
|
86
|
-
* Wraps generic adapter with agent-specific request/response formats
|
|
87
|
-
*
|
|
88
|
-
* Dual validation:
|
|
89
|
-
* 1. OpenAI validates with JSON Schema (structured output)
|
|
90
|
-
* 2. Zod validates at runtime (TypeScript type safety)
|
|
91
|
-
*
|
|
92
|
-
* @param adapter - Generic LLM adapter
|
|
93
|
-
* @param request - Agent-specific iteration request
|
|
94
|
-
* @returns Reasoning and next actions
|
|
95
|
-
*/
|
|
96
|
-
export async function callLLMForAgentIteration(
|
|
97
|
-
adapter: LLMAdapter,
|
|
98
|
-
request: {
|
|
99
|
-
systemPrompt: string
|
|
100
|
-
memoryContext: string
|
|
101
|
-
tools: ToolDefinition[]
|
|
102
|
-
constraints: { maxOutputTokens?: number; temperature?: number }
|
|
103
|
-
model: string // Model name for validation
|
|
104
|
-
includeMessageAction: boolean // Whether to include message action (session-based only)
|
|
105
|
-
includeNavigateKnowledge: boolean // Whether to include navigate-knowledge action (knowledge map present)
|
|
106
|
-
includeMemoryOps: boolean // Whether to include memoryOps in schema (based on memoryPreferences)
|
|
107
|
-
signal?: AbortSignal // Execution-level abort signal for timeout/cancellation
|
|
108
|
-
}
|
|
109
|
-
): Promise<{
|
|
110
|
-
reasoning: string
|
|
111
|
-
memoryOps?: { set?: Record<string, any>; delete?: string[] }
|
|
112
|
-
nextActions: AgentAction[]
|
|
113
|
-
}> {
|
|
114
|
-
// Step 0: VALIDATE token configuration before API call
|
|
115
|
-
validateTokenConfiguration(request.model, request.constraints.maxOutputTokens)
|
|
116
|
-
|
|
117
|
-
const messages: LLMMessage[] = [
|
|
118
|
-
{ role: 'system', content: request.systemPrompt },
|
|
119
|
-
{ role: 'user', content: request.memoryContext }
|
|
120
|
-
]
|
|
121
|
-
|
|
122
|
-
// Step 1: Call generic adapter with JSON Schema
|
|
123
|
-
const response = await adapter.generate<unknown>({
|
|
124
|
-
messages,
|
|
125
|
-
responseSchema: buildIterationResponseSchema(
|
|
126
|
-
request.tools,
|
|
127
|
-
request.includeMessageAction,
|
|
128
|
-
request.includeNavigateKnowledge,
|
|
129
|
-
request.includeMemoryOps
|
|
130
|
-
),
|
|
131
|
-
maxOutputTokens: request.constraints.maxOutputTokens,
|
|
132
|
-
temperature: request.constraints.temperature,
|
|
133
|
-
signal: request.signal
|
|
134
|
-
})
|
|
135
|
-
|
|
136
|
-
// Step 2: Validate with Zod (defense in depth, wrap errors in typed core error)
|
|
137
|
-
try {
|
|
138
|
-
const validated = AgentIterationOutputSchema.parse(response.output)
|
|
139
|
-
|
|
140
|
-
// Step 3: Return typed response (cast to AgentAction[] for proper typing)
|
|
141
|
-
return {
|
|
142
|
-
reasoning: validated.reasoning,
|
|
143
|
-
memoryOps: validated.memoryOps,
|
|
144
|
-
nextActions: validated.nextActions as AgentAction[]
|
|
145
|
-
}
|
|
146
|
-
} catch (error) {
|
|
147
|
-
// Don't let Zod error bubble up - wrap in typed core error
|
|
148
|
-
throw new AgentOutputValidationError('Agent iteration output validation failed', {
|
|
149
|
-
zodError: error instanceof ZodError ? error.format() : error
|
|
150
|
-
})
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
/**
|
|
155
|
-
* Call LLM for agent completion phase
|
|
156
|
-
* Same dual validation flow as iteration
|
|
157
|
-
*
|
|
158
|
-
* @param adapter - Generic LLM adapter
|
|
159
|
-
* @param request - Agent-specific completion request
|
|
160
|
-
* @returns Structured output (no reasoning - output should be self-explanatory)
|
|
161
|
-
*/
|
|
162
|
-
export async function callLLMForAgentCompletion(
|
|
163
|
-
adapter: LLMAdapter,
|
|
164
|
-
request: {
|
|
165
|
-
systemPrompt: string
|
|
166
|
-
memoryContext: string
|
|
167
|
-
outputSchema: unknown
|
|
168
|
-
constraints: { maxOutputTokens?: number; temperature?: number }
|
|
169
|
-
model: string // Model name for validation
|
|
170
|
-
signal?: AbortSignal // Execution-level abort signal for timeout/cancellation
|
|
171
|
-
}
|
|
172
|
-
): Promise<unknown> {
|
|
173
|
-
// Step 0: VALIDATE token configuration before API call
|
|
174
|
-
validateTokenConfiguration(request.model, request.constraints.maxOutputTokens)
|
|
175
|
-
|
|
176
|
-
// Step 1: Call generic adapter with JSON Schema (directly use output schema)
|
|
177
|
-
const response = await adapter.generate<unknown>({
|
|
178
|
-
messages: [
|
|
179
|
-
{ role: 'system', content: request.systemPrompt },
|
|
180
|
-
{ role: 'user', content: request.memoryContext }
|
|
181
|
-
],
|
|
182
|
-
responseSchema: request.outputSchema, // Use output schema directly
|
|
183
|
-
temperature: request.constraints.temperature || 0.3,
|
|
184
|
-
maxOutputTokens: request.constraints.maxOutputTokens,
|
|
185
|
-
signal: request.signal
|
|
186
|
-
})
|
|
187
|
-
|
|
188
|
-
// Step 2: Return output directly (already validated by LLM against schema)
|
|
189
|
-
return response.output
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// ============================================================================
|
|
193
|
-
// JSON Schema Builders
|
|
194
|
-
// ============================================================================
|
|
195
|
-
|
|
196
|
-
/**
|
|
197
|
-
* Clean a JSON Schema for LLM consumption
|
|
198
|
-
* - Removes $schema property (Gemini doesn't accept it)
|
|
199
|
-
* - Ensures object types have non-empty properties (Gemini requirement)
|
|
200
|
-
*/
|
|
201
|
-
function cleanJsonSchemaForLLM(schema: unknown): unknown {
|
|
202
|
-
if (!schema || typeof schema !== 'object') {
|
|
203
|
-
return schema
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
const cleaned: Record<string, unknown> = {}
|
|
207
|
-
for (const [key, value] of Object.entries(schema as Record<string, unknown>)) {
|
|
208
|
-
// Skip $schema - Gemini doesn't accept it
|
|
209
|
-
if (key === '$schema') {
|
|
210
|
-
continue
|
|
211
|
-
}
|
|
212
|
-
// Recursively clean nested objects
|
|
213
|
-
if (value && typeof value === 'object') {
|
|
214
|
-
if (Array.isArray(value)) {
|
|
215
|
-
cleaned[key] = value.map((item) => cleanJsonSchemaForLLM(item))
|
|
216
|
-
} else {
|
|
217
|
-
cleaned[key] = cleanJsonSchemaForLLM(value)
|
|
218
|
-
}
|
|
219
|
-
} else {
|
|
220
|
-
cleaned[key] = value
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// SAFEGUARD: Gemini requires objects to have non-empty properties
|
|
225
|
-
// If this is an object type with empty properties, add a placeholder
|
|
226
|
-
// Google's API strictly requires properties to be non-empty for OBJECT type.
|
|
227
|
-
if (
|
|
228
|
-
cleaned.type === 'object' &&
|
|
229
|
-
cleaned.properties &&
|
|
230
|
-
typeof cleaned.properties === 'object' &&
|
|
231
|
-
Object.keys(cleaned.properties as object).length === 0
|
|
232
|
-
) {
|
|
233
|
-
// Add a placeholder that signals "no input required"
|
|
234
|
-
// The LLM will see this and know to pass an empty object or omit input
|
|
235
|
-
;(cleaned.properties as Record<string, unknown>).noInputRequired = {
|
|
236
|
-
type: 'boolean',
|
|
237
|
-
description: 'No input required for this tool. Pass true or omit entirely.'
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
return cleaned
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/**
|
|
245
|
-
* Build iteration response JSON Schema for OpenAI
|
|
246
|
-
* Converts agent action schemas to JSON Schema format
|
|
247
|
-
*
|
|
248
|
-
* @param tools - Tool definitions with their JSON Schema input schemas
|
|
249
|
-
* @param includeMessageAction - Whether to include message action (session-based only)
|
|
250
|
-
* @param includeNavigateKnowledge - Whether to include navigate-knowledge action (knowledge map present)
|
|
251
|
-
* @param includeMemoryOps - Whether to include memoryOps in schema (based on memoryPreferences)
|
|
252
|
-
*/
|
|
253
|
-
function buildIterationResponseSchema(
|
|
254
|
-
tools: ToolDefinition[],
|
|
255
|
-
includeMessageAction: boolean,
|
|
256
|
-
includeNavigateKnowledge: boolean,
|
|
257
|
-
includeMemoryOps: boolean
|
|
258
|
-
): unknown {
|
|
259
|
-
// Build action schemas array
|
|
260
|
-
const actionSchemas: any[] = []
|
|
261
|
-
|
|
262
|
-
// Add tool-specific schemas for each available tool
|
|
263
|
-
// This gives the LLM precise input schemas, preventing malformed tool calls
|
|
264
|
-
for (const tool of tools) {
|
|
265
|
-
actionSchemas.push({
|
|
266
|
-
type: 'object',
|
|
267
|
-
properties: {
|
|
268
|
-
type: { type: 'string', enum: ['tool-call'] },
|
|
269
|
-
id: { type: 'string' },
|
|
270
|
-
name: { type: 'string', enum: [tool.name] }, // Constrain to this specific tool
|
|
271
|
-
input: cleanJsonSchemaForLLM(tool.inputSchema) // Clean and use the actual JSON Schema
|
|
272
|
-
},
|
|
273
|
-
required: ['type', 'id', 'name', 'input'],
|
|
274
|
-
additionalProperties: false
|
|
275
|
-
})
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
// complete action (always available)
|
|
279
|
-
actionSchemas.push({
|
|
280
|
-
type: 'object',
|
|
281
|
-
properties: {
|
|
282
|
-
type: { type: 'string', enum: ['complete'] }
|
|
283
|
-
},
|
|
284
|
-
required: ['type'],
|
|
285
|
-
additionalProperties: false
|
|
286
|
-
})
|
|
287
|
-
|
|
288
|
-
// Conditionally add message action (session-based agents only)
|
|
289
|
-
if (includeMessageAction) {
|
|
290
|
-
actionSchemas.push({
|
|
291
|
-
type: 'object',
|
|
292
|
-
properties: {
|
|
293
|
-
type: { type: 'string', enum: ['message'] },
|
|
294
|
-
text: { type: 'string' }
|
|
295
|
-
},
|
|
296
|
-
required: ['type', 'text'],
|
|
297
|
-
additionalProperties: false
|
|
298
|
-
})
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// Conditionally add navigate-knowledge action (knowledge map present)
|
|
302
|
-
if (includeNavigateKnowledge) {
|
|
303
|
-
actionSchemas.push({
|
|
304
|
-
type: 'object',
|
|
305
|
-
properties: {
|
|
306
|
-
type: { type: 'string', enum: ['navigate-knowledge'] },
|
|
307
|
-
id: { type: 'string' },
|
|
308
|
-
nodeId: { type: 'string' }
|
|
309
|
-
},
|
|
310
|
-
required: ['type', 'id', 'nodeId'],
|
|
311
|
-
additionalProperties: false
|
|
312
|
-
})
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// Build base properties
|
|
316
|
-
const properties: any = {
|
|
317
|
-
reasoning: { type: 'string', description: 'Your reasoning process' },
|
|
318
|
-
nextActions: {
|
|
319
|
-
type: 'array',
|
|
320
|
-
items: {
|
|
321
|
-
anyOf: actionSchemas
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
// CONDITIONAL: Only include memoryOps if agent opted in
|
|
327
|
-
if (includeMemoryOps) {
|
|
328
|
-
properties.memoryOps = {
|
|
329
|
-
type: 'object',
|
|
330
|
-
properties: {
|
|
331
|
-
set: {
|
|
332
|
-
type: 'object',
|
|
333
|
-
// Memory keys are dynamic - allow any string keys with any values
|
|
334
|
-
// Validated at runtime by the memory manager
|
|
335
|
-
additionalProperties: true
|
|
336
|
-
},
|
|
337
|
-
delete: { type: 'array', items: { type: 'string' } }
|
|
338
|
-
},
|
|
339
|
-
additionalProperties: false
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
return {
|
|
344
|
-
type: 'object',
|
|
345
|
-
properties,
|
|
346
|
-
required: ['reasoning', 'nextActions'],
|
|
347
|
-
additionalProperties: false
|
|
348
|
-
}
|
|
349
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Agent-Specific LLM Adapter Helpers
|
|
3
|
+
* Wraps generic LLM adapter with agent-specific request/response formatting
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { z, ZodError } from 'zod'
|
|
7
|
+
import type { LLMAdapter, LLMMessage } from '../../../llm/types'
|
|
8
|
+
import type { ToolDefinition } from '../../../tools/types'
|
|
9
|
+
import type { AgentAction } from '../../actions/types'
|
|
10
|
+
import { AgentActionSchema } from '../../actions/types'
|
|
11
|
+
import { getModelInfo } from '../../../llm/model-info'
|
|
12
|
+
import { InsufficientTokensError } from '../../../llm/errors'
|
|
13
|
+
import { AgentOutputValidationError } from '../../errors'
|
|
14
|
+
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Memory Operations Schema
|
|
17
|
+
// ============================================================================
|
|
18
|
+
|
|
19
|
+
const MemoryOperationsSchema = z.object({
|
|
20
|
+
set: z.record(z.string(), z.any()).optional(), // Accept any type - framework will stringify
|
|
21
|
+
delete: z.array(z.string()).optional()
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Zod Schemas for Agent Responses
|
|
26
|
+
// ============================================================================
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Agent iteration output schema
|
|
30
|
+
* Validates LLM response during iteration phase
|
|
31
|
+
*/
|
|
32
|
+
const AgentIterationOutputSchema = z.object({
|
|
33
|
+
reasoning: z.string(),
|
|
34
|
+
memoryOps: MemoryOperationsSchema.optional(),
|
|
35
|
+
nextActions: z.array(AgentActionSchema)
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
// ============================================================================
|
|
39
|
+
// Token Validation
|
|
40
|
+
// ============================================================================
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Validate token configuration meets model minimums
|
|
44
|
+
* Uses centralized MODEL_INFO from model-info.ts
|
|
45
|
+
*
|
|
46
|
+
* @param model - Model name (e.g., 'gpt-5-mini')
|
|
47
|
+
* @param maxOutputTokens - Configured max output tokens (optional)
|
|
48
|
+
* @throws InsufficientTokensError if below minimum
|
|
49
|
+
*/
|
|
50
|
+
function validateTokenConfiguration(model: string, maxOutputTokens?: number): void {
|
|
51
|
+
const modelInfo = getModelInfo(model)
|
|
52
|
+
const configured = maxOutputTokens || 1000 // Default if not specified
|
|
53
|
+
|
|
54
|
+
if (!modelInfo) {
|
|
55
|
+
// Unknown model - use conservative default (2000 tokens)
|
|
56
|
+
if (configured < 2000) {
|
|
57
|
+
throw new InsufficientTokensError(
|
|
58
|
+
`Unknown model '${model}' requires at least 2000 tokens (conservative default), but only ${configured} configured.`,
|
|
59
|
+
{ model, required: 2000, configured }
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Check against model-specific minimum
|
|
66
|
+
if (configured < modelInfo.minTokens) {
|
|
67
|
+
throw new InsufficientTokensError(
|
|
68
|
+
`Model ${model} requires at least ${modelInfo.minTokens} tokens, but only ${configured} configured. ` +
|
|
69
|
+
`${modelInfo.category === 'reasoning' ? 'Reasoning models need more tokens to generate both internal reasoning and output.' : ''}`,
|
|
70
|
+
{
|
|
71
|
+
model,
|
|
72
|
+
required: modelInfo.minTokens,
|
|
73
|
+
recommended: modelInfo.recommendedTokens,
|
|
74
|
+
configured
|
|
75
|
+
}
|
|
76
|
+
)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// ============================================================================
|
|
81
|
+
// Helper Functions
|
|
82
|
+
// ============================================================================
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Call LLM for agent iteration phase
|
|
86
|
+
* Wraps generic adapter with agent-specific request/response formats
|
|
87
|
+
*
|
|
88
|
+
* Dual validation:
|
|
89
|
+
* 1. OpenAI validates with JSON Schema (structured output)
|
|
90
|
+
* 2. Zod validates at runtime (TypeScript type safety)
|
|
91
|
+
*
|
|
92
|
+
* @param adapter - Generic LLM adapter
|
|
93
|
+
* @param request - Agent-specific iteration request
|
|
94
|
+
* @returns Reasoning and next actions
|
|
95
|
+
*/
|
|
96
|
+
export async function callLLMForAgentIteration(
|
|
97
|
+
adapter: LLMAdapter,
|
|
98
|
+
request: {
|
|
99
|
+
systemPrompt: string
|
|
100
|
+
memoryContext: string
|
|
101
|
+
tools: ToolDefinition[]
|
|
102
|
+
constraints: { maxOutputTokens?: number; temperature?: number }
|
|
103
|
+
model: string // Model name for validation
|
|
104
|
+
includeMessageAction: boolean // Whether to include message action (session-based only)
|
|
105
|
+
includeNavigateKnowledge: boolean // Whether to include navigate-knowledge action (knowledge map present)
|
|
106
|
+
includeMemoryOps: boolean // Whether to include memoryOps in schema (based on memoryPreferences)
|
|
107
|
+
signal?: AbortSignal // Execution-level abort signal for timeout/cancellation
|
|
108
|
+
}
|
|
109
|
+
): Promise<{
|
|
110
|
+
reasoning: string
|
|
111
|
+
memoryOps?: { set?: Record<string, any>; delete?: string[] }
|
|
112
|
+
nextActions: AgentAction[]
|
|
113
|
+
}> {
|
|
114
|
+
// Step 0: VALIDATE token configuration before API call
|
|
115
|
+
validateTokenConfiguration(request.model, request.constraints.maxOutputTokens)
|
|
116
|
+
|
|
117
|
+
const messages: LLMMessage[] = [
|
|
118
|
+
{ role: 'system', content: request.systemPrompt },
|
|
119
|
+
{ role: 'user', content: request.memoryContext }
|
|
120
|
+
]
|
|
121
|
+
|
|
122
|
+
// Step 1: Call generic adapter with JSON Schema
|
|
123
|
+
const response = await adapter.generate<unknown>({
|
|
124
|
+
messages,
|
|
125
|
+
responseSchema: buildIterationResponseSchema(
|
|
126
|
+
request.tools,
|
|
127
|
+
request.includeMessageAction,
|
|
128
|
+
request.includeNavigateKnowledge,
|
|
129
|
+
request.includeMemoryOps
|
|
130
|
+
),
|
|
131
|
+
maxOutputTokens: request.constraints.maxOutputTokens,
|
|
132
|
+
temperature: request.constraints.temperature,
|
|
133
|
+
signal: request.signal
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
// Step 2: Validate with Zod (defense in depth, wrap errors in typed core error)
|
|
137
|
+
try {
|
|
138
|
+
const validated = AgentIterationOutputSchema.parse(response.output)
|
|
139
|
+
|
|
140
|
+
// Step 3: Return typed response (cast to AgentAction[] for proper typing)
|
|
141
|
+
return {
|
|
142
|
+
reasoning: validated.reasoning,
|
|
143
|
+
memoryOps: validated.memoryOps,
|
|
144
|
+
nextActions: validated.nextActions as AgentAction[]
|
|
145
|
+
}
|
|
146
|
+
} catch (error) {
|
|
147
|
+
// Don't let Zod error bubble up - wrap in typed core error
|
|
148
|
+
throw new AgentOutputValidationError('Agent iteration output validation failed', {
|
|
149
|
+
zodError: error instanceof ZodError ? error.format() : error
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Call LLM for agent completion phase
|
|
156
|
+
* Same dual validation flow as iteration
|
|
157
|
+
*
|
|
158
|
+
* @param adapter - Generic LLM adapter
|
|
159
|
+
* @param request - Agent-specific completion request
|
|
160
|
+
* @returns Structured output (no reasoning - output should be self-explanatory)
|
|
161
|
+
*/
|
|
162
|
+
export async function callLLMForAgentCompletion(
|
|
163
|
+
adapter: LLMAdapter,
|
|
164
|
+
request: {
|
|
165
|
+
systemPrompt: string
|
|
166
|
+
memoryContext: string
|
|
167
|
+
outputSchema: unknown
|
|
168
|
+
constraints: { maxOutputTokens?: number; temperature?: number }
|
|
169
|
+
model: string // Model name for validation
|
|
170
|
+
signal?: AbortSignal // Execution-level abort signal for timeout/cancellation
|
|
171
|
+
}
|
|
172
|
+
): Promise<unknown> {
|
|
173
|
+
// Step 0: VALIDATE token configuration before API call
|
|
174
|
+
validateTokenConfiguration(request.model, request.constraints.maxOutputTokens)
|
|
175
|
+
|
|
176
|
+
// Step 1: Call generic adapter with JSON Schema (directly use output schema)
|
|
177
|
+
const response = await adapter.generate<unknown>({
|
|
178
|
+
messages: [
|
|
179
|
+
{ role: 'system', content: request.systemPrompt },
|
|
180
|
+
{ role: 'user', content: request.memoryContext }
|
|
181
|
+
],
|
|
182
|
+
responseSchema: request.outputSchema, // Use output schema directly
|
|
183
|
+
temperature: request.constraints.temperature || 0.3,
|
|
184
|
+
maxOutputTokens: request.constraints.maxOutputTokens,
|
|
185
|
+
signal: request.signal
|
|
186
|
+
})
|
|
187
|
+
|
|
188
|
+
// Step 2: Return output directly (already validated by LLM against schema)
|
|
189
|
+
return response.output
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// ============================================================================
|
|
193
|
+
// JSON Schema Builders
|
|
194
|
+
// ============================================================================
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Clean a JSON Schema for LLM consumption
|
|
198
|
+
* - Removes $schema property (Gemini doesn't accept it)
|
|
199
|
+
* - Ensures object types have non-empty properties (Gemini requirement)
|
|
200
|
+
*/
|
|
201
|
+
function cleanJsonSchemaForLLM(schema: unknown): unknown {
|
|
202
|
+
if (!schema || typeof schema !== 'object') {
|
|
203
|
+
return schema
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const cleaned: Record<string, unknown> = {}
|
|
207
|
+
for (const [key, value] of Object.entries(schema as Record<string, unknown>)) {
|
|
208
|
+
// Skip $schema - Gemini doesn't accept it
|
|
209
|
+
if (key === '$schema') {
|
|
210
|
+
continue
|
|
211
|
+
}
|
|
212
|
+
// Recursively clean nested objects
|
|
213
|
+
if (value && typeof value === 'object') {
|
|
214
|
+
if (Array.isArray(value)) {
|
|
215
|
+
cleaned[key] = value.map((item) => cleanJsonSchemaForLLM(item))
|
|
216
|
+
} else {
|
|
217
|
+
cleaned[key] = cleanJsonSchemaForLLM(value)
|
|
218
|
+
}
|
|
219
|
+
} else {
|
|
220
|
+
cleaned[key] = value
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// SAFEGUARD: Gemini requires objects to have non-empty properties
|
|
225
|
+
// If this is an object type with empty properties, add a placeholder
|
|
226
|
+
// Google's API strictly requires properties to be non-empty for OBJECT type.
|
|
227
|
+
if (
|
|
228
|
+
cleaned.type === 'object' &&
|
|
229
|
+
cleaned.properties &&
|
|
230
|
+
typeof cleaned.properties === 'object' &&
|
|
231
|
+
Object.keys(cleaned.properties as object).length === 0
|
|
232
|
+
) {
|
|
233
|
+
// Add a placeholder that signals "no input required"
|
|
234
|
+
// The LLM will see this and know to pass an empty object or omit input
|
|
235
|
+
;(cleaned.properties as Record<string, unknown>).noInputRequired = {
|
|
236
|
+
type: 'boolean',
|
|
237
|
+
description: 'No input required for this tool. Pass true or omit entirely.'
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return cleaned
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Build iteration response JSON Schema for OpenAI
|
|
246
|
+
* Converts agent action schemas to JSON Schema format
|
|
247
|
+
*
|
|
248
|
+
* @param tools - Tool definitions with their JSON Schema input schemas
|
|
249
|
+
* @param includeMessageAction - Whether to include message action (session-based only)
|
|
250
|
+
* @param includeNavigateKnowledge - Whether to include navigate-knowledge action (knowledge map present)
|
|
251
|
+
* @param includeMemoryOps - Whether to include memoryOps in schema (based on memoryPreferences)
|
|
252
|
+
*/
|
|
253
|
+
function buildIterationResponseSchema(
|
|
254
|
+
tools: ToolDefinition[],
|
|
255
|
+
includeMessageAction: boolean,
|
|
256
|
+
includeNavigateKnowledge: boolean,
|
|
257
|
+
includeMemoryOps: boolean
|
|
258
|
+
): unknown {
|
|
259
|
+
// Build action schemas array
|
|
260
|
+
const actionSchemas: any[] = []
|
|
261
|
+
|
|
262
|
+
// Add tool-specific schemas for each available tool
|
|
263
|
+
// This gives the LLM precise input schemas, preventing malformed tool calls
|
|
264
|
+
for (const tool of tools) {
|
|
265
|
+
actionSchemas.push({
|
|
266
|
+
type: 'object',
|
|
267
|
+
properties: {
|
|
268
|
+
type: { type: 'string', enum: ['tool-call'] },
|
|
269
|
+
id: { type: 'string' },
|
|
270
|
+
name: { type: 'string', enum: [tool.name] }, // Constrain to this specific tool
|
|
271
|
+
input: cleanJsonSchemaForLLM(tool.inputSchema) // Clean and use the actual JSON Schema
|
|
272
|
+
},
|
|
273
|
+
required: ['type', 'id', 'name', 'input'],
|
|
274
|
+
additionalProperties: false
|
|
275
|
+
})
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// complete action (always available)
|
|
279
|
+
actionSchemas.push({
|
|
280
|
+
type: 'object',
|
|
281
|
+
properties: {
|
|
282
|
+
type: { type: 'string', enum: ['complete'] }
|
|
283
|
+
},
|
|
284
|
+
required: ['type'],
|
|
285
|
+
additionalProperties: false
|
|
286
|
+
})
|
|
287
|
+
|
|
288
|
+
// Conditionally add message action (session-based agents only)
|
|
289
|
+
if (includeMessageAction) {
|
|
290
|
+
actionSchemas.push({
|
|
291
|
+
type: 'object',
|
|
292
|
+
properties: {
|
|
293
|
+
type: { type: 'string', enum: ['message'] },
|
|
294
|
+
text: { type: 'string' }
|
|
295
|
+
},
|
|
296
|
+
required: ['type', 'text'],
|
|
297
|
+
additionalProperties: false
|
|
298
|
+
})
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// Conditionally add navigate-knowledge action (knowledge map present)
|
|
302
|
+
if (includeNavigateKnowledge) {
|
|
303
|
+
actionSchemas.push({
|
|
304
|
+
type: 'object',
|
|
305
|
+
properties: {
|
|
306
|
+
type: { type: 'string', enum: ['navigate-knowledge'] },
|
|
307
|
+
id: { type: 'string' },
|
|
308
|
+
nodeId: { type: 'string' }
|
|
309
|
+
},
|
|
310
|
+
required: ['type', 'id', 'nodeId'],
|
|
311
|
+
additionalProperties: false
|
|
312
|
+
})
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Build base properties
|
|
316
|
+
const properties: any = {
|
|
317
|
+
reasoning: { type: 'string', description: 'Your reasoning process' },
|
|
318
|
+
nextActions: {
|
|
319
|
+
type: 'array',
|
|
320
|
+
items: {
|
|
321
|
+
anyOf: actionSchemas
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// CONDITIONAL: Only include memoryOps if agent opted in
|
|
327
|
+
if (includeMemoryOps) {
|
|
328
|
+
properties.memoryOps = {
|
|
329
|
+
type: 'object',
|
|
330
|
+
properties: {
|
|
331
|
+
set: {
|
|
332
|
+
type: 'object',
|
|
333
|
+
// Memory keys are dynamic - allow any string keys with any values
|
|
334
|
+
// Validated at runtime by the memory manager
|
|
335
|
+
additionalProperties: true
|
|
336
|
+
},
|
|
337
|
+
delete: { type: 'array', items: { type: 'string' } }
|
|
338
|
+
},
|
|
339
|
+
additionalProperties: false
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
return {
|
|
344
|
+
type: 'object',
|
|
345
|
+
properties,
|
|
346
|
+
required: ['reasoning', 'nextActions'],
|
|
347
|
+
additionalProperties: false
|
|
348
|
+
}
|
|
349
|
+
}
|