@elevasis/core 0.7.1 → 0.8.2
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/test-utils/index.d.ts +3122 -0
- package/dist/test-utils/index.js +386 -0
- package/package.json +6 -1
- package/src/README.md +39 -36
- package/src/__tests__/publish.test.ts +18 -13
- 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 +47 -36
- 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 -2
- package/src/business/projects/sse-events.ts +21 -21
- 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 -700
- 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 -37
- 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 +607 -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 +30 -138
- 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 +7 -8
- 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/published.ts +4 -0
- package/src/test-utils/rls/RLSTestContext.ts +554 -554
- package/src/test-utils/rls/index.ts +1 -1
|
@@ -1,376 +1,376 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Google Adapter Integration Test
|
|
3
|
-
*
|
|
4
|
-
* Purpose: Verify Google adapter works with real API calls
|
|
5
|
-
* Pattern: External API Integration (Pattern 4)
|
|
6
|
-
* Runs in CI: NO (requires GOOGLE_AI_STUDIO_KEY)
|
|
7
|
-
*
|
|
8
|
-
* Prerequisites:
|
|
9
|
-
* - GOOGLE_AI_STUDIO_KEY in .env.development
|
|
10
|
-
*
|
|
11
|
-
* Run locally:
|
|
12
|
-
* cd packages/core
|
|
13
|
-
* pnpm vitest run google.integration
|
|
14
|
-
*
|
|
15
|
-
* Note: Tests use models defined in GoogleModel type (model-info.ts)
|
|
16
|
-
*
|
|
17
|
-
* Token Limits: Using 8000 tokens (recommended for gemini-3-flash-preview)
|
|
18
|
-
* Gemini 3 uses internal "thinking" tokens that consume output budget,
|
|
19
|
-
* so we need generous limits to avoid truncated JSON responses.
|
|
20
|
-
*
|
|
21
|
-
* Retry Logic: Tests use retry(3) due to API instability with the preview model.
|
|
22
|
-
* The Gemini 3 Flash preview API can occasionally return truncated JSON.
|
|
23
|
-
*/
|
|
24
|
-
|
|
25
|
-
import { describe, it, expect, beforeAll } from 'vitest'
|
|
26
|
-
import { createLLMAdapter } from '../server/adapter-factory'
|
|
27
|
-
import type { ModelConfig } from '../../model-info'
|
|
28
|
-
import type { LLMGenerateRequest } from '../../types'
|
|
29
|
-
|
|
30
|
-
// Skip if GOOGLE_AI_STUDIO_KEY not available (CI environments)
|
|
31
|
-
const SKIP_TESTS = !process.env.GOOGLE_AI_STUDIO_KEY
|
|
32
|
-
|
|
33
|
-
describe.skipIf(SKIP_TESTS)('Google Adapter Integration', () => {
|
|
34
|
-
let apiKey: string
|
|
35
|
-
|
|
36
|
-
beforeAll(() => {
|
|
37
|
-
apiKey = process.env.GOOGLE_AI_STUDIO_KEY!
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
const createRequest = (prompt: string): LLMGenerateRequest => ({
|
|
41
|
-
messages: [
|
|
42
|
-
{
|
|
43
|
-
role: 'system',
|
|
44
|
-
content: 'You are a helpful assistant. Always respond with valid JSON matching the schema.'
|
|
45
|
-
},
|
|
46
|
-
{ role: 'user', content: prompt }
|
|
47
|
-
],
|
|
48
|
-
responseSchema: {
|
|
49
|
-
type: 'object',
|
|
50
|
-
properties: {
|
|
51
|
-
answer: { type: 'string' },
|
|
52
|
-
confidence: { type: 'number' }
|
|
53
|
-
},
|
|
54
|
-
required: ['answer', 'confidence'],
|
|
55
|
-
additionalProperties: false
|
|
56
|
-
},
|
|
57
|
-
maxOutputTokens: 8000
|
|
58
|
-
})
|
|
59
|
-
|
|
60
|
-
describe('Gemini 3 Flash via Google AI Studio', () => {
|
|
61
|
-
it('generates structured output with accurate token counts', { timeout: 60000, retry: 3 }, async () => {
|
|
62
|
-
const config: ModelConfig = {
|
|
63
|
-
provider: 'google',
|
|
64
|
-
model: 'gemini-3-flash-preview',
|
|
65
|
-
apiKey,
|
|
66
|
-
temperature: 1, // Gemini 3 requires temperature 1
|
|
67
|
-
maxOutputTokens: 8000
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
const adapter = createLLMAdapter(config)
|
|
71
|
-
const request = createRequest('What is the capital of France? Be concise.')
|
|
72
|
-
|
|
73
|
-
const response = await adapter.generate<{ answer: string; confidence: number }>(request)
|
|
74
|
-
|
|
75
|
-
// Verify structured output
|
|
76
|
-
expect(response.output).toBeDefined()
|
|
77
|
-
expect(response.output.answer).toBeDefined()
|
|
78
|
-
expect(typeof response.output.answer).toBe('string')
|
|
79
|
-
expect(response.output.answer.toLowerCase()).toContain('paris')
|
|
80
|
-
expect(typeof response.output.confidence).toBe('number')
|
|
81
|
-
|
|
82
|
-
// Verify usage metadata
|
|
83
|
-
expect(response.usage).toBeDefined()
|
|
84
|
-
expect(response.usage?.inputTokens).toBeGreaterThan(0)
|
|
85
|
-
expect(response.usage?.outputTokens).toBeGreaterThan(0)
|
|
86
|
-
// Note: totalTokens may include thinking tokens, so it can be >= input + output
|
|
87
|
-
expect(response.usage?.totalTokens).toBeGreaterThanOrEqual(
|
|
88
|
-
(response.usage?.inputTokens || 0) + (response.usage?.outputTokens || 0)
|
|
89
|
-
)
|
|
90
|
-
})
|
|
91
|
-
|
|
92
|
-
it('works with thinking level option', { timeout: 60000, retry: 3 }, async () => {
|
|
93
|
-
const config: ModelConfig = {
|
|
94
|
-
provider: 'google',
|
|
95
|
-
model: 'gemini-3-flash-preview',
|
|
96
|
-
apiKey,
|
|
97
|
-
temperature: 1,
|
|
98
|
-
maxOutputTokens: 8000,
|
|
99
|
-
modelOptions: {
|
|
100
|
-
thinkingLevel: 'low' // Use low for faster test execution
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const adapter = createLLMAdapter(config)
|
|
105
|
-
const request = createRequest('What is 2 + 2?')
|
|
106
|
-
|
|
107
|
-
const response = await adapter.generate<{ answer: string; confidence: number }>(request)
|
|
108
|
-
|
|
109
|
-
expect(response.output).toBeDefined()
|
|
110
|
-
expect(response.output.answer).toBeDefined()
|
|
111
|
-
// Should contain "4" in some form
|
|
112
|
-
expect(response.output.answer).toMatch(/4|four/i)
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
it('handles schema with const keyword (z.literal() from Zod)', { timeout: 60000, retry: 3 }, async () => {
|
|
116
|
-
// This test verifies the fix for Gemini schema compatibility
|
|
117
|
-
// Gemini doesn't support "const" keyword, so we transform it to "enum" + "type: string"
|
|
118
|
-
const config: ModelConfig = {
|
|
119
|
-
provider: 'google',
|
|
120
|
-
model: 'gemini-3-flash-preview',
|
|
121
|
-
apiKey,
|
|
122
|
-
temperature: 1,
|
|
123
|
-
maxOutputTokens: 8000
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
const adapter = createLLMAdapter(config)
|
|
127
|
-
|
|
128
|
-
// Schema that mimics agent action output with const (from z.literal())
|
|
129
|
-
// This is the pattern that was previously failing with Gemini
|
|
130
|
-
const request: LLMGenerateRequest = {
|
|
131
|
-
messages: [
|
|
132
|
-
{
|
|
133
|
-
role: 'system',
|
|
134
|
-
content:
|
|
135
|
-
'You are an agent that decides on actions. Respond with a valid action matching the schema. Choose "complete" action and provide reasoning.'
|
|
136
|
-
},
|
|
137
|
-
{ role: 'user', content: 'The task is done. What action should we take?' }
|
|
138
|
-
],
|
|
139
|
-
responseSchema: {
|
|
140
|
-
type: 'object',
|
|
141
|
-
properties: {
|
|
142
|
-
reasoning: { type: 'string' },
|
|
143
|
-
action: {
|
|
144
|
-
anyOf: [
|
|
145
|
-
{
|
|
146
|
-
type: 'object',
|
|
147
|
-
properties: {
|
|
148
|
-
type: { const: 'complete' } // Transformed to: type: "string", enum: ["complete"]
|
|
149
|
-
},
|
|
150
|
-
required: ['type']
|
|
151
|
-
},
|
|
152
|
-
{
|
|
153
|
-
type: 'object',
|
|
154
|
-
properties: {
|
|
155
|
-
type: { const: 'tool-call' }, // Transformed to: type: "string", enum: ["tool-call"]
|
|
156
|
-
name: { type: 'string' },
|
|
157
|
-
// Note: Object properties must be non-empty for Gemini
|
|
158
|
-
input: {
|
|
159
|
-
type: 'object',
|
|
160
|
-
properties: {
|
|
161
|
-
value: { type: 'string' }
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
},
|
|
165
|
-
required: ['type', 'name', 'input']
|
|
166
|
-
}
|
|
167
|
-
]
|
|
168
|
-
}
|
|
169
|
-
},
|
|
170
|
-
required: ['reasoning', 'action']
|
|
171
|
-
},
|
|
172
|
-
maxOutputTokens: 8000
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// This call should NOT fail with "Unknown name const" error anymore
|
|
176
|
-
const response = await adapter.generate<{ reasoning: string; action: { type: string } }>(request)
|
|
177
|
-
|
|
178
|
-
expect(response.output).toBeDefined()
|
|
179
|
-
expect(response.output.reasoning).toBeDefined()
|
|
180
|
-
expect(typeof response.output.reasoning).toBe('string')
|
|
181
|
-
expect(response.output.action).toBeDefined()
|
|
182
|
-
expect(response.output.action.type).toBe('complete')
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Tests for empty object schema handling
|
|
187
|
-
* Google requires properties to be non-empty for OBJECT type
|
|
188
|
-
* These tests verify our transformation handles these cases correctly
|
|
189
|
-
*
|
|
190
|
-
* SKIP REASON: The gemini-3-flash-preview model is unstable with additionalProperties schemas.
|
|
191
|
-
* It generates very long responses (10-20KB) that frequently get truncated mid-JSON,
|
|
192
|
-
* causing JSON.parse to fail. This triggers the circuit breaker after multiple retries.
|
|
193
|
-
* The schema transformation logic is verified by the unit tests in google-adapter.test.ts.
|
|
194
|
-
* These integration tests can be re-enabled when using a stable Gemini model.
|
|
195
|
-
*/
|
|
196
|
-
describe.skip('Empty Object Schema Handling', () => {
|
|
197
|
-
it(
|
|
198
|
-
'handles object with additionalProperties but no properties (memoryOps.set pattern)',
|
|
199
|
-
{ timeout: 60000, retry: 3 },
|
|
200
|
-
async () => {
|
|
201
|
-
// This is the pattern used by memoryOps.set: { type: 'object', additionalProperties: true }
|
|
202
|
-
// Google rejects: "properties: should be non-empty for OBJECT type"
|
|
203
|
-
const config: ModelConfig = {
|
|
204
|
-
provider: 'google',
|
|
205
|
-
model: 'gemini-3-flash-preview',
|
|
206
|
-
apiKey,
|
|
207
|
-
temperature: 1,
|
|
208
|
-
maxOutputTokens: 8000
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
const adapter = createLLMAdapter(config)
|
|
212
|
-
|
|
213
|
-
const request: LLMGenerateRequest = {
|
|
214
|
-
messages: [
|
|
215
|
-
{ role: 'system', content: 'Return a simple key-value object.' },
|
|
216
|
-
{ role: 'user', content: 'Give me a config with name="test" and value=123' }
|
|
217
|
-
],
|
|
218
|
-
responseSchema: {
|
|
219
|
-
type: 'object',
|
|
220
|
-
properties: {
|
|
221
|
-
data: {
|
|
222
|
-
type: 'object',
|
|
223
|
-
additionalProperties: true // No properties defined - dynamic keys
|
|
224
|
-
}
|
|
225
|
-
},
|
|
226
|
-
required: ['data']
|
|
227
|
-
},
|
|
228
|
-
maxOutputTokens: 8000
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const response = await adapter.generate<{ data: Record<string, unknown> }>(request)
|
|
232
|
-
|
|
233
|
-
expect(response.output).toBeDefined()
|
|
234
|
-
expect(response.output.data).toBeDefined()
|
|
235
|
-
expect(typeof response.output.data).toBe('object')
|
|
236
|
-
}
|
|
237
|
-
)
|
|
238
|
-
|
|
239
|
-
it(
|
|
240
|
-
'handles z.record() pattern (responseSchema input in generate_content)',
|
|
241
|
-
{ timeout: 60000, retry: 3 },
|
|
242
|
-
async () => {
|
|
243
|
-
// This is the pattern from generate_content tool input:
|
|
244
|
-
// responseSchema: z.record(z.string(), z.unknown())
|
|
245
|
-
// Which becomes: { type: 'object', additionalProperties: true }
|
|
246
|
-
const config: ModelConfig = {
|
|
247
|
-
provider: 'google',
|
|
248
|
-
model: 'gemini-3-flash-preview',
|
|
249
|
-
apiKey,
|
|
250
|
-
temperature: 1,
|
|
251
|
-
maxOutputTokens: 8000
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
const adapter = createLLMAdapter(config)
|
|
255
|
-
|
|
256
|
-
const request: LLMGenerateRequest = {
|
|
257
|
-
messages: [
|
|
258
|
-
{ role: 'system', content: 'You are generating a JSON schema for structured output.' },
|
|
259
|
-
{ role: 'user', content: 'Create a schema with properties: name (string) and age (number)' }
|
|
260
|
-
],
|
|
261
|
-
responseSchema: {
|
|
262
|
-
type: 'object',
|
|
263
|
-
properties: {
|
|
264
|
-
schema: {
|
|
265
|
-
type: 'object',
|
|
266
|
-
additionalProperties: true // Dynamic schema structure
|
|
267
|
-
}
|
|
268
|
-
},
|
|
269
|
-
required: ['schema']
|
|
270
|
-
},
|
|
271
|
-
maxOutputTokens: 8000
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
const response = await adapter.generate<{ schema: Record<string, unknown> }>(request)
|
|
275
|
-
|
|
276
|
-
expect(response.output).toBeDefined()
|
|
277
|
-
expect(response.output.schema).toBeDefined()
|
|
278
|
-
}
|
|
279
|
-
)
|
|
280
|
-
|
|
281
|
-
it('handles empty object type with no additionalProperties', { timeout: 60000, retry: 3 }, async () => {
|
|
282
|
-
// Pure empty object: { type: 'object', properties: {} }
|
|
283
|
-
// Must add placeholder property
|
|
284
|
-
const config: ModelConfig = {
|
|
285
|
-
provider: 'google',
|
|
286
|
-
model: 'gemini-3-flash-preview',
|
|
287
|
-
apiKey,
|
|
288
|
-
temperature: 1,
|
|
289
|
-
maxOutputTokens: 8000
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
const adapter = createLLMAdapter(config)
|
|
293
|
-
|
|
294
|
-
const request: LLMGenerateRequest = {
|
|
295
|
-
messages: [
|
|
296
|
-
{ role: 'system', content: 'Return a result with an empty metadata object.' },
|
|
297
|
-
{ role: 'user', content: 'Give me a result with status=ok and empty metadata' }
|
|
298
|
-
],
|
|
299
|
-
responseSchema: {
|
|
300
|
-
type: 'object',
|
|
301
|
-
properties: {
|
|
302
|
-
status: { type: 'string' },
|
|
303
|
-
metadata: {
|
|
304
|
-
type: 'object',
|
|
305
|
-
properties: {} // Empty properties - needs placeholder
|
|
306
|
-
}
|
|
307
|
-
},
|
|
308
|
-
required: ['status', 'metadata']
|
|
309
|
-
},
|
|
310
|
-
maxOutputTokens: 8000
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
const response = await adapter.generate<{ status: string; metadata: object }>(request)
|
|
314
|
-
|
|
315
|
-
expect(response.output).toBeDefined()
|
|
316
|
-
expect(response.output.status).toBe('ok')
|
|
317
|
-
expect(response.output.metadata).toBeDefined()
|
|
318
|
-
})
|
|
319
|
-
|
|
320
|
-
it('handles agent iteration schema with memoryOps.set pattern', { timeout: 60000, retry: 3 }, async () => {
|
|
321
|
-
// This is the actual pattern from agent iteration schema
|
|
322
|
-
// memoryOps: { set: { type: 'object', additionalProperties: true } }
|
|
323
|
-
const config: ModelConfig = {
|
|
324
|
-
provider: 'google',
|
|
325
|
-
model: 'gemini-3-flash-preview',
|
|
326
|
-
apiKey,
|
|
327
|
-
temperature: 1,
|
|
328
|
-
maxOutputTokens: 8000
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
const adapter = createLLMAdapter(config)
|
|
332
|
-
|
|
333
|
-
const request: LLMGenerateRequest = {
|
|
334
|
-
messages: [
|
|
335
|
-
{ role: 'system', content: 'You are an agent. Respond with reasoning and memory operations.' },
|
|
336
|
-
{ role: 'user', content: 'Store the value "hello" under key "greeting" in memory.' }
|
|
337
|
-
],
|
|
338
|
-
responseSchema: {
|
|
339
|
-
type: 'object',
|
|
340
|
-
properties: {
|
|
341
|
-
reasoning: { type: 'string' },
|
|
342
|
-
memoryOps: {
|
|
343
|
-
type: 'object',
|
|
344
|
-
properties: {
|
|
345
|
-
set: {
|
|
346
|
-
type: 'object',
|
|
347
|
-
additionalProperties: true // Dynamic key-value pairs
|
|
348
|
-
},
|
|
349
|
-
delete: {
|
|
350
|
-
type: 'array',
|
|
351
|
-
items: { type: 'string' }
|
|
352
|
-
}
|
|
353
|
-
},
|
|
354
|
-
additionalProperties: false
|
|
355
|
-
}
|
|
356
|
-
},
|
|
357
|
-
required: ['reasoning']
|
|
358
|
-
},
|
|
359
|
-
maxOutputTokens: 8000
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
const response = await adapter.generate<{
|
|
363
|
-
reasoning: string
|
|
364
|
-
memoryOps?: { set?: Record<string, unknown>; delete?: string[] }
|
|
365
|
-
}>(request)
|
|
366
|
-
|
|
367
|
-
expect(response.output).toBeDefined()
|
|
368
|
-
expect(response.output.reasoning).toBeDefined()
|
|
369
|
-
// memoryOps.set should work with dynamic keys
|
|
370
|
-
if (response.output.memoryOps?.set) {
|
|
371
|
-
expect(typeof response.output.memoryOps.set).toBe('object')
|
|
372
|
-
}
|
|
373
|
-
})
|
|
374
|
-
})
|
|
375
|
-
})
|
|
376
|
-
})
|
|
1
|
+
/**
|
|
2
|
+
* Google Adapter Integration Test
|
|
3
|
+
*
|
|
4
|
+
* Purpose: Verify Google adapter works with real API calls
|
|
5
|
+
* Pattern: External API Integration (Pattern 4)
|
|
6
|
+
* Runs in CI: NO (requires GOOGLE_AI_STUDIO_KEY)
|
|
7
|
+
*
|
|
8
|
+
* Prerequisites:
|
|
9
|
+
* - GOOGLE_AI_STUDIO_KEY in .env.development
|
|
10
|
+
*
|
|
11
|
+
* Run locally:
|
|
12
|
+
* cd packages/core
|
|
13
|
+
* pnpm vitest run google.integration
|
|
14
|
+
*
|
|
15
|
+
* Note: Tests use models defined in GoogleModel type (model-info.ts)
|
|
16
|
+
*
|
|
17
|
+
* Token Limits: Using 8000 tokens (recommended for gemini-3-flash-preview)
|
|
18
|
+
* Gemini 3 uses internal "thinking" tokens that consume output budget,
|
|
19
|
+
* so we need generous limits to avoid truncated JSON responses.
|
|
20
|
+
*
|
|
21
|
+
* Retry Logic: Tests use retry(3) due to API instability with the preview model.
|
|
22
|
+
* The Gemini 3 Flash preview API can occasionally return truncated JSON.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import { describe, it, expect, beforeAll } from 'vitest'
|
|
26
|
+
import { createLLMAdapter } from '../server/adapter-factory'
|
|
27
|
+
import type { ModelConfig } from '../../model-info'
|
|
28
|
+
import type { LLMGenerateRequest } from '../../types'
|
|
29
|
+
|
|
30
|
+
// Skip if GOOGLE_AI_STUDIO_KEY not available (CI environments)
|
|
31
|
+
const SKIP_TESTS = !process.env.GOOGLE_AI_STUDIO_KEY
|
|
32
|
+
|
|
33
|
+
describe.skipIf(SKIP_TESTS)('Google Adapter Integration', () => {
|
|
34
|
+
let apiKey: string
|
|
35
|
+
|
|
36
|
+
beforeAll(() => {
|
|
37
|
+
apiKey = process.env.GOOGLE_AI_STUDIO_KEY!
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
const createRequest = (prompt: string): LLMGenerateRequest => ({
|
|
41
|
+
messages: [
|
|
42
|
+
{
|
|
43
|
+
role: 'system',
|
|
44
|
+
content: 'You are a helpful assistant. Always respond with valid JSON matching the schema.'
|
|
45
|
+
},
|
|
46
|
+
{ role: 'user', content: prompt }
|
|
47
|
+
],
|
|
48
|
+
responseSchema: {
|
|
49
|
+
type: 'object',
|
|
50
|
+
properties: {
|
|
51
|
+
answer: { type: 'string' },
|
|
52
|
+
confidence: { type: 'number' }
|
|
53
|
+
},
|
|
54
|
+
required: ['answer', 'confidence'],
|
|
55
|
+
additionalProperties: false
|
|
56
|
+
},
|
|
57
|
+
maxOutputTokens: 8000
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
describe('Gemini 3 Flash via Google AI Studio', () => {
|
|
61
|
+
it('generates structured output with accurate token counts', { timeout: 60000, retry: 3 }, async () => {
|
|
62
|
+
const config: ModelConfig = {
|
|
63
|
+
provider: 'google',
|
|
64
|
+
model: 'gemini-3-flash-preview',
|
|
65
|
+
apiKey,
|
|
66
|
+
temperature: 1, // Gemini 3 requires temperature 1
|
|
67
|
+
maxOutputTokens: 8000
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const adapter = createLLMAdapter(config)
|
|
71
|
+
const request = createRequest('What is the capital of France? Be concise.')
|
|
72
|
+
|
|
73
|
+
const response = await adapter.generate<{ answer: string; confidence: number }>(request)
|
|
74
|
+
|
|
75
|
+
// Verify structured output
|
|
76
|
+
expect(response.output).toBeDefined()
|
|
77
|
+
expect(response.output.answer).toBeDefined()
|
|
78
|
+
expect(typeof response.output.answer).toBe('string')
|
|
79
|
+
expect(response.output.answer.toLowerCase()).toContain('paris')
|
|
80
|
+
expect(typeof response.output.confidence).toBe('number')
|
|
81
|
+
|
|
82
|
+
// Verify usage metadata
|
|
83
|
+
expect(response.usage).toBeDefined()
|
|
84
|
+
expect(response.usage?.inputTokens).toBeGreaterThan(0)
|
|
85
|
+
expect(response.usage?.outputTokens).toBeGreaterThan(0)
|
|
86
|
+
// Note: totalTokens may include thinking tokens, so it can be >= input + output
|
|
87
|
+
expect(response.usage?.totalTokens).toBeGreaterThanOrEqual(
|
|
88
|
+
(response.usage?.inputTokens || 0) + (response.usage?.outputTokens || 0)
|
|
89
|
+
)
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
it('works with thinking level option', { timeout: 60000, retry: 3 }, async () => {
|
|
93
|
+
const config: ModelConfig = {
|
|
94
|
+
provider: 'google',
|
|
95
|
+
model: 'gemini-3-flash-preview',
|
|
96
|
+
apiKey,
|
|
97
|
+
temperature: 1,
|
|
98
|
+
maxOutputTokens: 8000,
|
|
99
|
+
modelOptions: {
|
|
100
|
+
thinkingLevel: 'low' // Use low for faster test execution
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const adapter = createLLMAdapter(config)
|
|
105
|
+
const request = createRequest('What is 2 + 2?')
|
|
106
|
+
|
|
107
|
+
const response = await adapter.generate<{ answer: string; confidence: number }>(request)
|
|
108
|
+
|
|
109
|
+
expect(response.output).toBeDefined()
|
|
110
|
+
expect(response.output.answer).toBeDefined()
|
|
111
|
+
// Should contain "4" in some form
|
|
112
|
+
expect(response.output.answer).toMatch(/4|four/i)
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
it('handles schema with const keyword (z.literal() from Zod)', { timeout: 60000, retry: 3 }, async () => {
|
|
116
|
+
// This test verifies the fix for Gemini schema compatibility
|
|
117
|
+
// Gemini doesn't support "const" keyword, so we transform it to "enum" + "type: string"
|
|
118
|
+
const config: ModelConfig = {
|
|
119
|
+
provider: 'google',
|
|
120
|
+
model: 'gemini-3-flash-preview',
|
|
121
|
+
apiKey,
|
|
122
|
+
temperature: 1,
|
|
123
|
+
maxOutputTokens: 8000
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const adapter = createLLMAdapter(config)
|
|
127
|
+
|
|
128
|
+
// Schema that mimics agent action output with const (from z.literal())
|
|
129
|
+
// This is the pattern that was previously failing with Gemini
|
|
130
|
+
const request: LLMGenerateRequest = {
|
|
131
|
+
messages: [
|
|
132
|
+
{
|
|
133
|
+
role: 'system',
|
|
134
|
+
content:
|
|
135
|
+
'You are an agent that decides on actions. Respond with a valid action matching the schema. Choose "complete" action and provide reasoning.'
|
|
136
|
+
},
|
|
137
|
+
{ role: 'user', content: 'The task is done. What action should we take?' }
|
|
138
|
+
],
|
|
139
|
+
responseSchema: {
|
|
140
|
+
type: 'object',
|
|
141
|
+
properties: {
|
|
142
|
+
reasoning: { type: 'string' },
|
|
143
|
+
action: {
|
|
144
|
+
anyOf: [
|
|
145
|
+
{
|
|
146
|
+
type: 'object',
|
|
147
|
+
properties: {
|
|
148
|
+
type: { const: 'complete' } // Transformed to: type: "string", enum: ["complete"]
|
|
149
|
+
},
|
|
150
|
+
required: ['type']
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
type: 'object',
|
|
154
|
+
properties: {
|
|
155
|
+
type: { const: 'tool-call' }, // Transformed to: type: "string", enum: ["tool-call"]
|
|
156
|
+
name: { type: 'string' },
|
|
157
|
+
// Note: Object properties must be non-empty for Gemini
|
|
158
|
+
input: {
|
|
159
|
+
type: 'object',
|
|
160
|
+
properties: {
|
|
161
|
+
value: { type: 'string' }
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
},
|
|
165
|
+
required: ['type', 'name', 'input']
|
|
166
|
+
}
|
|
167
|
+
]
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
required: ['reasoning', 'action']
|
|
171
|
+
},
|
|
172
|
+
maxOutputTokens: 8000
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// This call should NOT fail with "Unknown name const" error anymore
|
|
176
|
+
const response = await adapter.generate<{ reasoning: string; action: { type: string } }>(request)
|
|
177
|
+
|
|
178
|
+
expect(response.output).toBeDefined()
|
|
179
|
+
expect(response.output.reasoning).toBeDefined()
|
|
180
|
+
expect(typeof response.output.reasoning).toBe('string')
|
|
181
|
+
expect(response.output.action).toBeDefined()
|
|
182
|
+
expect(response.output.action.type).toBe('complete')
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Tests for empty object schema handling
|
|
187
|
+
* Google requires properties to be non-empty for OBJECT type
|
|
188
|
+
* These tests verify our transformation handles these cases correctly
|
|
189
|
+
*
|
|
190
|
+
* SKIP REASON: The gemini-3-flash-preview model is unstable with additionalProperties schemas.
|
|
191
|
+
* It generates very long responses (10-20KB) that frequently get truncated mid-JSON,
|
|
192
|
+
* causing JSON.parse to fail. This triggers the circuit breaker after multiple retries.
|
|
193
|
+
* The schema transformation logic is verified by the unit tests in google-adapter.test.ts.
|
|
194
|
+
* These integration tests can be re-enabled when using a stable Gemini model.
|
|
195
|
+
*/
|
|
196
|
+
describe.skip('Empty Object Schema Handling', () => {
|
|
197
|
+
it(
|
|
198
|
+
'handles object with additionalProperties but no properties (memoryOps.set pattern)',
|
|
199
|
+
{ timeout: 60000, retry: 3 },
|
|
200
|
+
async () => {
|
|
201
|
+
// This is the pattern used by memoryOps.set: { type: 'object', additionalProperties: true }
|
|
202
|
+
// Google rejects: "properties: should be non-empty for OBJECT type"
|
|
203
|
+
const config: ModelConfig = {
|
|
204
|
+
provider: 'google',
|
|
205
|
+
model: 'gemini-3-flash-preview',
|
|
206
|
+
apiKey,
|
|
207
|
+
temperature: 1,
|
|
208
|
+
maxOutputTokens: 8000
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const adapter = createLLMAdapter(config)
|
|
212
|
+
|
|
213
|
+
const request: LLMGenerateRequest = {
|
|
214
|
+
messages: [
|
|
215
|
+
{ role: 'system', content: 'Return a simple key-value object.' },
|
|
216
|
+
{ role: 'user', content: 'Give me a config with name="test" and value=123' }
|
|
217
|
+
],
|
|
218
|
+
responseSchema: {
|
|
219
|
+
type: 'object',
|
|
220
|
+
properties: {
|
|
221
|
+
data: {
|
|
222
|
+
type: 'object',
|
|
223
|
+
additionalProperties: true // No properties defined - dynamic keys
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
required: ['data']
|
|
227
|
+
},
|
|
228
|
+
maxOutputTokens: 8000
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const response = await adapter.generate<{ data: Record<string, unknown> }>(request)
|
|
232
|
+
|
|
233
|
+
expect(response.output).toBeDefined()
|
|
234
|
+
expect(response.output.data).toBeDefined()
|
|
235
|
+
expect(typeof response.output.data).toBe('object')
|
|
236
|
+
}
|
|
237
|
+
)
|
|
238
|
+
|
|
239
|
+
it(
|
|
240
|
+
'handles z.record() pattern (responseSchema input in generate_content)',
|
|
241
|
+
{ timeout: 60000, retry: 3 },
|
|
242
|
+
async () => {
|
|
243
|
+
// This is the pattern from generate_content tool input:
|
|
244
|
+
// responseSchema: z.record(z.string(), z.unknown())
|
|
245
|
+
// Which becomes: { type: 'object', additionalProperties: true }
|
|
246
|
+
const config: ModelConfig = {
|
|
247
|
+
provider: 'google',
|
|
248
|
+
model: 'gemini-3-flash-preview',
|
|
249
|
+
apiKey,
|
|
250
|
+
temperature: 1,
|
|
251
|
+
maxOutputTokens: 8000
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const adapter = createLLMAdapter(config)
|
|
255
|
+
|
|
256
|
+
const request: LLMGenerateRequest = {
|
|
257
|
+
messages: [
|
|
258
|
+
{ role: 'system', content: 'You are generating a JSON schema for structured output.' },
|
|
259
|
+
{ role: 'user', content: 'Create a schema with properties: name (string) and age (number)' }
|
|
260
|
+
],
|
|
261
|
+
responseSchema: {
|
|
262
|
+
type: 'object',
|
|
263
|
+
properties: {
|
|
264
|
+
schema: {
|
|
265
|
+
type: 'object',
|
|
266
|
+
additionalProperties: true // Dynamic schema structure
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
required: ['schema']
|
|
270
|
+
},
|
|
271
|
+
maxOutputTokens: 8000
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
const response = await adapter.generate<{ schema: Record<string, unknown> }>(request)
|
|
275
|
+
|
|
276
|
+
expect(response.output).toBeDefined()
|
|
277
|
+
expect(response.output.schema).toBeDefined()
|
|
278
|
+
}
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
it('handles empty object type with no additionalProperties', { timeout: 60000, retry: 3 }, async () => {
|
|
282
|
+
// Pure empty object: { type: 'object', properties: {} }
|
|
283
|
+
// Must add placeholder property
|
|
284
|
+
const config: ModelConfig = {
|
|
285
|
+
provider: 'google',
|
|
286
|
+
model: 'gemini-3-flash-preview',
|
|
287
|
+
apiKey,
|
|
288
|
+
temperature: 1,
|
|
289
|
+
maxOutputTokens: 8000
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const adapter = createLLMAdapter(config)
|
|
293
|
+
|
|
294
|
+
const request: LLMGenerateRequest = {
|
|
295
|
+
messages: [
|
|
296
|
+
{ role: 'system', content: 'Return a result with an empty metadata object.' },
|
|
297
|
+
{ role: 'user', content: 'Give me a result with status=ok and empty metadata' }
|
|
298
|
+
],
|
|
299
|
+
responseSchema: {
|
|
300
|
+
type: 'object',
|
|
301
|
+
properties: {
|
|
302
|
+
status: { type: 'string' },
|
|
303
|
+
metadata: {
|
|
304
|
+
type: 'object',
|
|
305
|
+
properties: {} // Empty properties - needs placeholder
|
|
306
|
+
}
|
|
307
|
+
},
|
|
308
|
+
required: ['status', 'metadata']
|
|
309
|
+
},
|
|
310
|
+
maxOutputTokens: 8000
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const response = await adapter.generate<{ status: string; metadata: object }>(request)
|
|
314
|
+
|
|
315
|
+
expect(response.output).toBeDefined()
|
|
316
|
+
expect(response.output.status).toBe('ok')
|
|
317
|
+
expect(response.output.metadata).toBeDefined()
|
|
318
|
+
})
|
|
319
|
+
|
|
320
|
+
it('handles agent iteration schema with memoryOps.set pattern', { timeout: 60000, retry: 3 }, async () => {
|
|
321
|
+
// This is the actual pattern from agent iteration schema
|
|
322
|
+
// memoryOps: { set: { type: 'object', additionalProperties: true } }
|
|
323
|
+
const config: ModelConfig = {
|
|
324
|
+
provider: 'google',
|
|
325
|
+
model: 'gemini-3-flash-preview',
|
|
326
|
+
apiKey,
|
|
327
|
+
temperature: 1,
|
|
328
|
+
maxOutputTokens: 8000
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const adapter = createLLMAdapter(config)
|
|
332
|
+
|
|
333
|
+
const request: LLMGenerateRequest = {
|
|
334
|
+
messages: [
|
|
335
|
+
{ role: 'system', content: 'You are an agent. Respond with reasoning and memory operations.' },
|
|
336
|
+
{ role: 'user', content: 'Store the value "hello" under key "greeting" in memory.' }
|
|
337
|
+
],
|
|
338
|
+
responseSchema: {
|
|
339
|
+
type: 'object',
|
|
340
|
+
properties: {
|
|
341
|
+
reasoning: { type: 'string' },
|
|
342
|
+
memoryOps: {
|
|
343
|
+
type: 'object',
|
|
344
|
+
properties: {
|
|
345
|
+
set: {
|
|
346
|
+
type: 'object',
|
|
347
|
+
additionalProperties: true // Dynamic key-value pairs
|
|
348
|
+
},
|
|
349
|
+
delete: {
|
|
350
|
+
type: 'array',
|
|
351
|
+
items: { type: 'string' }
|
|
352
|
+
}
|
|
353
|
+
},
|
|
354
|
+
additionalProperties: false
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
required: ['reasoning']
|
|
358
|
+
},
|
|
359
|
+
maxOutputTokens: 8000
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
const response = await adapter.generate<{
|
|
363
|
+
reasoning: string
|
|
364
|
+
memoryOps?: { set?: Record<string, unknown>; delete?: string[] }
|
|
365
|
+
}>(request)
|
|
366
|
+
|
|
367
|
+
expect(response.output).toBeDefined()
|
|
368
|
+
expect(response.output.reasoning).toBeDefined()
|
|
369
|
+
// memoryOps.set should work with dynamic keys
|
|
370
|
+
if (response.output.memoryOps?.set) {
|
|
371
|
+
expect(typeof response.output.memoryOps.set).toBe('object')
|
|
372
|
+
}
|
|
373
|
+
})
|
|
374
|
+
})
|
|
375
|
+
})
|
|
376
|
+
})
|