@elevasis/core 0.7.1 → 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 +1 -1
- 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 -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 +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,324 +1,324 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generic serialization system for resource definitions
|
|
3
|
-
* Automatically handles Zod schemas, Maps, Sets, functions, and special types (Tools, KnowledgeMap)
|
|
4
|
-
*
|
|
5
|
-
* Replaces manual field extraction with automatic type detection and conversion.
|
|
6
|
-
* Used for API responses, CLI exports, and testing fixtures.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { zodToJsonSchema } from '@alcyone-labs/zod-to-json-schema'
|
|
10
|
-
import type { AgentDefinition } from '../agent/core/types'
|
|
11
|
-
import type { WorkflowDefinition, NextConfig } from '../workflow/types'
|
|
12
|
-
import { StepType } from '../workflow/types'
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Serialization options for different use cases
|
|
16
|
-
*/
|
|
17
|
-
export interface SerializationOptions {
|
|
18
|
-
/** Redact secrets (apiKey, tokens, passwords) - Default: true */
|
|
19
|
-
redactSecrets?: boolean
|
|
20
|
-
/** Include tool schemas in serialized tools - Default: true */
|
|
21
|
-
includeToolSchemas?: boolean
|
|
22
|
-
/** Include knowledge map metadata - Default: true */
|
|
23
|
-
includeKnowledgeMap?: boolean
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Internal serialization context (includes circular reference tracking)
|
|
28
|
-
*/
|
|
29
|
-
interface SerializationContext extends Required<SerializationOptions> {
|
|
30
|
-
/** Circular reference protection via WeakSet */
|
|
31
|
-
visited: WeakSet<object>
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Main entry point: Serialize any resource definition to JSON-safe format
|
|
36
|
-
*
|
|
37
|
-
* Automatically converts:
|
|
38
|
-
* - Zod schemas → JSON Schema
|
|
39
|
-
* - Maps → arrays with id field
|
|
40
|
-
* - Sets → arrays
|
|
41
|
-
* - Dates → ISO strings
|
|
42
|
-
* - Functions → removed
|
|
43
|
-
* - Secrets → redacted
|
|
44
|
-
*
|
|
45
|
-
* @param definition - Resource definition (AgentDefinition or WorkflowDefinition)
|
|
46
|
-
* @param options - Serialization options
|
|
47
|
-
* @returns JSON-serializable object
|
|
48
|
-
*/
|
|
49
|
-
export function serializeDefinition(
|
|
50
|
-
definition: AgentDefinition | WorkflowDefinition,
|
|
51
|
-
options?: SerializationOptions
|
|
52
|
-
): any {
|
|
53
|
-
const opts: Required<SerializationOptions> = {
|
|
54
|
-
redactSecrets: true,
|
|
55
|
-
includeToolSchemas: true,
|
|
56
|
-
includeKnowledgeMap: true,
|
|
57
|
-
...options
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const context: SerializationContext = {
|
|
61
|
-
...opts,
|
|
62
|
-
visited: new WeakSet()
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
return deepSerialize(definition, context)
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Recursive serialization with type detection
|
|
70
|
-
* Handles all special types and delegates to specialized handlers
|
|
71
|
-
*/
|
|
72
|
-
function deepSerialize(value: any, ctx: SerializationContext): any {
|
|
73
|
-
// Primitives & null/undefined
|
|
74
|
-
if (value === null || value === undefined) return value
|
|
75
|
-
if (typeof value !== 'object') return value
|
|
76
|
-
|
|
77
|
-
// Zod schemas are leaf values — always convert (no circular tracking needed)
|
|
78
|
-
if (isZodSchema(value)) return convertZodToJsonSchema(value)
|
|
79
|
-
|
|
80
|
-
// Circular reference check (for non-leaf objects only)
|
|
81
|
-
if (ctx.visited.has(value)) {
|
|
82
|
-
return { __circular: true }
|
|
83
|
-
}
|
|
84
|
-
ctx.visited.add(value)
|
|
85
|
-
if (value instanceof Map) return convertMapToArray(value, ctx)
|
|
86
|
-
if (value instanceof Set) return convertSetToArray(value, ctx)
|
|
87
|
-
if (value instanceof Date) return value.toISOString()
|
|
88
|
-
if (typeof value === 'function') return undefined // Remove functions
|
|
89
|
-
|
|
90
|
-
// Arrays
|
|
91
|
-
if (Array.isArray(value)) {
|
|
92
|
-
return value.map((item) => deepSerialize(item, ctx)).filter((item) => item !== undefined)
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Objects - special handling for known types
|
|
96
|
-
if (isToolObject(value)) return serializeTool(value, ctx)
|
|
97
|
-
if (isKnowledgeMapObject(value)) return serializeKnowledgeMap(value, ctx)
|
|
98
|
-
if (isNextConfigObject(value)) return serializeNextConfig(value, ctx)
|
|
99
|
-
|
|
100
|
-
// Generic object recursion
|
|
101
|
-
return serializeObject(value, ctx)
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Serialize generic object (recursively process all properties)
|
|
106
|
-
* Handles secret redaction and function removal
|
|
107
|
-
*/
|
|
108
|
-
function serializeObject(obj: any, ctx: SerializationContext): any {
|
|
109
|
-
const result: any = {}
|
|
110
|
-
|
|
111
|
-
for (const [key, val] of Object.entries(obj)) {
|
|
112
|
-
if (typeof val === 'function') continue
|
|
113
|
-
|
|
114
|
-
// Redact secrets
|
|
115
|
-
if (ctx.redactSecrets && isSecretKey(key)) {
|
|
116
|
-
result[key] = redactSecret(val)
|
|
117
|
-
continue
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Record-based steps → array format (backward compat with Map-based steps)
|
|
121
|
-
if (key === 'steps' && isWorkflowStepsRecord(val)) {
|
|
122
|
-
result[key] = convertRecordToArray(val as Record<string, any>, ctx)
|
|
123
|
-
continue
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Recurse
|
|
127
|
-
const serialized = deepSerialize(val, ctx)
|
|
128
|
-
if (serialized !== undefined) {
|
|
129
|
-
result[key] = serialized
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
return result
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Serialize Tool object
|
|
138
|
-
* Extracts name, description, and optional schemas
|
|
139
|
-
*/
|
|
140
|
-
function serializeTool(tool: any, ctx: SerializationContext): any {
|
|
141
|
-
const result: any = {
|
|
142
|
-
name: tool.name,
|
|
143
|
-
description: tool.description
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// Include schemas if requested
|
|
147
|
-
if (ctx.includeToolSchemas && tool.inputSchema) {
|
|
148
|
-
result.inputSchema = deepSerialize(tool.inputSchema, ctx)
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
if (ctx.includeToolSchemas && tool.outputSchema) {
|
|
152
|
-
result.outputSchema = deepSerialize(tool.outputSchema, ctx)
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
// execute function automatically omitted (typeof === 'function')
|
|
156
|
-
|
|
157
|
-
return result
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Serialize KnowledgeMap object
|
|
162
|
-
* Extracts node metadata without content or file paths
|
|
163
|
-
*/
|
|
164
|
-
function serializeKnowledgeMap(km: any, ctx: SerializationContext): any {
|
|
165
|
-
if (!ctx.includeKnowledgeMap) return undefined
|
|
166
|
-
|
|
167
|
-
// Handle nodes field (Record<string, KnowledgeNode>)
|
|
168
|
-
const nodes = km.nodes || {}
|
|
169
|
-
const nodeEntries = Object.entries(nodes).map(([id, node]: [string, any]) => ({
|
|
170
|
-
id,
|
|
171
|
-
description: node.description,
|
|
172
|
-
loaded: node.loaded || false,
|
|
173
|
-
hasPrompt: Boolean(node.prompt)
|
|
174
|
-
// load function automatically omitted
|
|
175
|
-
// prompt content omitted (too large for structure metadata)
|
|
176
|
-
}))
|
|
177
|
-
|
|
178
|
-
return {
|
|
179
|
-
nodeCount: nodeEntries.length,
|
|
180
|
-
nodes: nodeEntries
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
/**
|
|
185
|
-
* Serialize NextConfig object
|
|
186
|
-
* Strips non-serializable condition functions while preserving route structure
|
|
187
|
-
*/
|
|
188
|
-
function serializeNextConfig(nextConfig: NextConfig, _context: SerializationContext): any {
|
|
189
|
-
if (!nextConfig) return null
|
|
190
|
-
|
|
191
|
-
// Handle linear next (simple target)
|
|
192
|
-
if (nextConfig.type === StepType.LINEAR) {
|
|
193
|
-
return {
|
|
194
|
-
type: nextConfig.type,
|
|
195
|
-
target: nextConfig.target
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
// Handle conditional next (strip condition functions)
|
|
200
|
-
if (nextConfig.type === StepType.CONDITIONAL) {
|
|
201
|
-
return {
|
|
202
|
-
type: nextConfig.type,
|
|
203
|
-
routes:
|
|
204
|
-
nextConfig.routes?.map((route) => ({
|
|
205
|
-
// Strip condition function, keep only target
|
|
206
|
-
target: route.target
|
|
207
|
-
})) ?? [],
|
|
208
|
-
default: nextConfig.default
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
return null
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Convert Map to array with id field
|
|
217
|
-
*/
|
|
218
|
-
function convertMapToArray(map: Map<any, any>, ctx: SerializationContext): any[] {
|
|
219
|
-
return Array.from(map.entries()).map(([key, val]) => ({
|
|
220
|
-
id: key,
|
|
221
|
-
...deepSerialize(val, ctx)
|
|
222
|
-
}))
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/**
|
|
226
|
-
* Check if value is a Record of WorkflowStep objects (plain object with step-shaped values)
|
|
227
|
-
* Used to detect Record<string, WorkflowStep> after the Map-to-Record refactor
|
|
228
|
-
*/
|
|
229
|
-
function isWorkflowStepsRecord(value: any): boolean {
|
|
230
|
-
if (!value || typeof value !== 'object' || Array.isArray(value) || value instanceof Map || value instanceof Set) {
|
|
231
|
-
return false
|
|
232
|
-
}
|
|
233
|
-
const entries = Object.values(value)
|
|
234
|
-
if (entries.length === 0) return false
|
|
235
|
-
// Check that at least the first entry looks like a WorkflowStep (has name + handler)
|
|
236
|
-
const first = entries[0] as any
|
|
237
|
-
return first && typeof first === 'object' && 'name' in first && 'handler' in first
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/**
|
|
241
|
-
* Convert Record<string, WorkflowStep> to array with id field
|
|
242
|
-
* Produces the same format as convertMapToArray for backward compatibility
|
|
243
|
-
*/
|
|
244
|
-
function convertRecordToArray(record: Record<string, any>, ctx: SerializationContext): any[] {
|
|
245
|
-
return Object.entries(record).map(([key, val]) => ({
|
|
246
|
-
id: key,
|
|
247
|
-
...deepSerialize(val, ctx)
|
|
248
|
-
}))
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Convert Set to array
|
|
253
|
-
*/
|
|
254
|
-
function convertSetToArray(set: Set<any>, ctx: SerializationContext): any[] {
|
|
255
|
-
return Array.from(set).map((v) => deepSerialize(v, ctx))
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Convert Zod schema to JSON Schema
|
|
260
|
-
* Reuses existing utility function
|
|
261
|
-
*/
|
|
262
|
-
function convertZodToJsonSchema(schema: any): any {
|
|
263
|
-
return zodToJsonSchema(schema, {
|
|
264
|
-
$refStrategy: 'none',
|
|
265
|
-
errorMessages: true
|
|
266
|
-
})
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* Type guard: Check if value is a Zod schema
|
|
271
|
-
*/
|
|
272
|
-
function isZodSchema(value: any): boolean {
|
|
273
|
-
return value && typeof value === 'object' && '_def' in value && 'parse' in value
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
/**
|
|
277
|
-
* Type guard: Check if value is a Tool object
|
|
278
|
-
*/
|
|
279
|
-
function isToolObject(value: any): boolean {
|
|
280
|
-
return value && typeof value === 'object' && 'name' in value && 'description' in value && 'execute' in value
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/**
|
|
284
|
-
* Type guard: Check if value is a KnowledgeMap object
|
|
285
|
-
*/
|
|
286
|
-
function isKnowledgeMapObject(value: any): boolean {
|
|
287
|
-
return value && typeof value === 'object' && 'nodes' in value && typeof value.nodes === 'object'
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Type guard: Check if value is a NextConfig object
|
|
292
|
-
*/
|
|
293
|
-
function isNextConfigObject(value: any): boolean {
|
|
294
|
-
return (
|
|
295
|
-
value &&
|
|
296
|
-
typeof value === 'object' &&
|
|
297
|
-
'type' in value &&
|
|
298
|
-
(value.type === StepType.LINEAR || value.type === StepType.CONDITIONAL)
|
|
299
|
-
)
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/**
|
|
303
|
-
* Check if key name indicates secret data
|
|
304
|
-
*/
|
|
305
|
-
function isSecretKey(key: string): boolean {
|
|
306
|
-
const lower = key.toLowerCase()
|
|
307
|
-
|
|
308
|
-
// Whitelist: keys that contain "token" but are not secrets
|
|
309
|
-
const whitelist = ['maxtokens', 'memorytokens', 'inputtokens', 'outputtokens']
|
|
310
|
-
if (whitelist.some((w) => lower.includes(w))) return false
|
|
311
|
-
|
|
312
|
-
const patterns = ['apikey', 'secret', 'password', 'token', 'credential']
|
|
313
|
-
return patterns.some((p) => lower.includes(p))
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
/**
|
|
317
|
-
* Redact secret value while preserving prefix
|
|
318
|
-
* Example: 'sk-proj-abc123...' → 'sk-proj...'
|
|
319
|
-
*/
|
|
320
|
-
function redactSecret(value: any): string {
|
|
321
|
-
if (typeof value !== 'string') return '[REDACTED]'
|
|
322
|
-
if (value.length <= 7) return '[REDACTED]'
|
|
323
|
-
return value.substring(0, 7) + '...'
|
|
324
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Generic serialization system for resource definitions
|
|
3
|
+
* Automatically handles Zod schemas, Maps, Sets, functions, and special types (Tools, KnowledgeMap)
|
|
4
|
+
*
|
|
5
|
+
* Replaces manual field extraction with automatic type detection and conversion.
|
|
6
|
+
* Used for API responses, CLI exports, and testing fixtures.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { zodToJsonSchema } from '@alcyone-labs/zod-to-json-schema'
|
|
10
|
+
import type { AgentDefinition } from '../agent/core/types'
|
|
11
|
+
import type { WorkflowDefinition, NextConfig } from '../workflow/types'
|
|
12
|
+
import { StepType } from '../workflow/types'
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Serialization options for different use cases
|
|
16
|
+
*/
|
|
17
|
+
export interface SerializationOptions {
|
|
18
|
+
/** Redact secrets (apiKey, tokens, passwords) - Default: true */
|
|
19
|
+
redactSecrets?: boolean
|
|
20
|
+
/** Include tool schemas in serialized tools - Default: true */
|
|
21
|
+
includeToolSchemas?: boolean
|
|
22
|
+
/** Include knowledge map metadata - Default: true */
|
|
23
|
+
includeKnowledgeMap?: boolean
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Internal serialization context (includes circular reference tracking)
|
|
28
|
+
*/
|
|
29
|
+
interface SerializationContext extends Required<SerializationOptions> {
|
|
30
|
+
/** Circular reference protection via WeakSet */
|
|
31
|
+
visited: WeakSet<object>
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Main entry point: Serialize any resource definition to JSON-safe format
|
|
36
|
+
*
|
|
37
|
+
* Automatically converts:
|
|
38
|
+
* - Zod schemas → JSON Schema
|
|
39
|
+
* - Maps → arrays with id field
|
|
40
|
+
* - Sets → arrays
|
|
41
|
+
* - Dates → ISO strings
|
|
42
|
+
* - Functions → removed
|
|
43
|
+
* - Secrets → redacted
|
|
44
|
+
*
|
|
45
|
+
* @param definition - Resource definition (AgentDefinition or WorkflowDefinition)
|
|
46
|
+
* @param options - Serialization options
|
|
47
|
+
* @returns JSON-serializable object
|
|
48
|
+
*/
|
|
49
|
+
export function serializeDefinition(
|
|
50
|
+
definition: AgentDefinition | WorkflowDefinition,
|
|
51
|
+
options?: SerializationOptions
|
|
52
|
+
): any {
|
|
53
|
+
const opts: Required<SerializationOptions> = {
|
|
54
|
+
redactSecrets: true,
|
|
55
|
+
includeToolSchemas: true,
|
|
56
|
+
includeKnowledgeMap: true,
|
|
57
|
+
...options
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const context: SerializationContext = {
|
|
61
|
+
...opts,
|
|
62
|
+
visited: new WeakSet()
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return deepSerialize(definition, context)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Recursive serialization with type detection
|
|
70
|
+
* Handles all special types and delegates to specialized handlers
|
|
71
|
+
*/
|
|
72
|
+
function deepSerialize(value: any, ctx: SerializationContext): any {
|
|
73
|
+
// Primitives & null/undefined
|
|
74
|
+
if (value === null || value === undefined) return value
|
|
75
|
+
if (typeof value !== 'object') return value
|
|
76
|
+
|
|
77
|
+
// Zod schemas are leaf values — always convert (no circular tracking needed)
|
|
78
|
+
if (isZodSchema(value)) return convertZodToJsonSchema(value)
|
|
79
|
+
|
|
80
|
+
// Circular reference check (for non-leaf objects only)
|
|
81
|
+
if (ctx.visited.has(value)) {
|
|
82
|
+
return { __circular: true }
|
|
83
|
+
}
|
|
84
|
+
ctx.visited.add(value)
|
|
85
|
+
if (value instanceof Map) return convertMapToArray(value, ctx)
|
|
86
|
+
if (value instanceof Set) return convertSetToArray(value, ctx)
|
|
87
|
+
if (value instanceof Date) return value.toISOString()
|
|
88
|
+
if (typeof value === 'function') return undefined // Remove functions
|
|
89
|
+
|
|
90
|
+
// Arrays
|
|
91
|
+
if (Array.isArray(value)) {
|
|
92
|
+
return value.map((item) => deepSerialize(item, ctx)).filter((item) => item !== undefined)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Objects - special handling for known types
|
|
96
|
+
if (isToolObject(value)) return serializeTool(value, ctx)
|
|
97
|
+
if (isKnowledgeMapObject(value)) return serializeKnowledgeMap(value, ctx)
|
|
98
|
+
if (isNextConfigObject(value)) return serializeNextConfig(value, ctx)
|
|
99
|
+
|
|
100
|
+
// Generic object recursion
|
|
101
|
+
return serializeObject(value, ctx)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Serialize generic object (recursively process all properties)
|
|
106
|
+
* Handles secret redaction and function removal
|
|
107
|
+
*/
|
|
108
|
+
function serializeObject(obj: any, ctx: SerializationContext): any {
|
|
109
|
+
const result: any = {}
|
|
110
|
+
|
|
111
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
112
|
+
if (typeof val === 'function') continue
|
|
113
|
+
|
|
114
|
+
// Redact secrets
|
|
115
|
+
if (ctx.redactSecrets && isSecretKey(key)) {
|
|
116
|
+
result[key] = redactSecret(val)
|
|
117
|
+
continue
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Record-based steps → array format (backward compat with Map-based steps)
|
|
121
|
+
if (key === 'steps' && isWorkflowStepsRecord(val)) {
|
|
122
|
+
result[key] = convertRecordToArray(val as Record<string, any>, ctx)
|
|
123
|
+
continue
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Recurse
|
|
127
|
+
const serialized = deepSerialize(val, ctx)
|
|
128
|
+
if (serialized !== undefined) {
|
|
129
|
+
result[key] = serialized
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return result
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Serialize Tool object
|
|
138
|
+
* Extracts name, description, and optional schemas
|
|
139
|
+
*/
|
|
140
|
+
function serializeTool(tool: any, ctx: SerializationContext): any {
|
|
141
|
+
const result: any = {
|
|
142
|
+
name: tool.name,
|
|
143
|
+
description: tool.description
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Include schemas if requested
|
|
147
|
+
if (ctx.includeToolSchemas && tool.inputSchema) {
|
|
148
|
+
result.inputSchema = deepSerialize(tool.inputSchema, ctx)
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (ctx.includeToolSchemas && tool.outputSchema) {
|
|
152
|
+
result.outputSchema = deepSerialize(tool.outputSchema, ctx)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// execute function automatically omitted (typeof === 'function')
|
|
156
|
+
|
|
157
|
+
return result
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Serialize KnowledgeMap object
|
|
162
|
+
* Extracts node metadata without content or file paths
|
|
163
|
+
*/
|
|
164
|
+
function serializeKnowledgeMap(km: any, ctx: SerializationContext): any {
|
|
165
|
+
if (!ctx.includeKnowledgeMap) return undefined
|
|
166
|
+
|
|
167
|
+
// Handle nodes field (Record<string, KnowledgeNode>)
|
|
168
|
+
const nodes = km.nodes || {}
|
|
169
|
+
const nodeEntries = Object.entries(nodes).map(([id, node]: [string, any]) => ({
|
|
170
|
+
id,
|
|
171
|
+
description: node.description,
|
|
172
|
+
loaded: node.loaded || false,
|
|
173
|
+
hasPrompt: Boolean(node.prompt)
|
|
174
|
+
// load function automatically omitted
|
|
175
|
+
// prompt content omitted (too large for structure metadata)
|
|
176
|
+
}))
|
|
177
|
+
|
|
178
|
+
return {
|
|
179
|
+
nodeCount: nodeEntries.length,
|
|
180
|
+
nodes: nodeEntries
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Serialize NextConfig object
|
|
186
|
+
* Strips non-serializable condition functions while preserving route structure
|
|
187
|
+
*/
|
|
188
|
+
function serializeNextConfig(nextConfig: NextConfig, _context: SerializationContext): any {
|
|
189
|
+
if (!nextConfig) return null
|
|
190
|
+
|
|
191
|
+
// Handle linear next (simple target)
|
|
192
|
+
if (nextConfig.type === StepType.LINEAR) {
|
|
193
|
+
return {
|
|
194
|
+
type: nextConfig.type,
|
|
195
|
+
target: nextConfig.target
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Handle conditional next (strip condition functions)
|
|
200
|
+
if (nextConfig.type === StepType.CONDITIONAL) {
|
|
201
|
+
return {
|
|
202
|
+
type: nextConfig.type,
|
|
203
|
+
routes:
|
|
204
|
+
nextConfig.routes?.map((route) => ({
|
|
205
|
+
// Strip condition function, keep only target
|
|
206
|
+
target: route.target
|
|
207
|
+
})) ?? [],
|
|
208
|
+
default: nextConfig.default
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return null
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Convert Map to array with id field
|
|
217
|
+
*/
|
|
218
|
+
function convertMapToArray(map: Map<any, any>, ctx: SerializationContext): any[] {
|
|
219
|
+
return Array.from(map.entries()).map(([key, val]) => ({
|
|
220
|
+
id: key,
|
|
221
|
+
...deepSerialize(val, ctx)
|
|
222
|
+
}))
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Check if value is a Record of WorkflowStep objects (plain object with step-shaped values)
|
|
227
|
+
* Used to detect Record<string, WorkflowStep> after the Map-to-Record refactor
|
|
228
|
+
*/
|
|
229
|
+
function isWorkflowStepsRecord(value: any): boolean {
|
|
230
|
+
if (!value || typeof value !== 'object' || Array.isArray(value) || value instanceof Map || value instanceof Set) {
|
|
231
|
+
return false
|
|
232
|
+
}
|
|
233
|
+
const entries = Object.values(value)
|
|
234
|
+
if (entries.length === 0) return false
|
|
235
|
+
// Check that at least the first entry looks like a WorkflowStep (has name + handler)
|
|
236
|
+
const first = entries[0] as any
|
|
237
|
+
return first && typeof first === 'object' && 'name' in first && 'handler' in first
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Convert Record<string, WorkflowStep> to array with id field
|
|
242
|
+
* Produces the same format as convertMapToArray for backward compatibility
|
|
243
|
+
*/
|
|
244
|
+
function convertRecordToArray(record: Record<string, any>, ctx: SerializationContext): any[] {
|
|
245
|
+
return Object.entries(record).map(([key, val]) => ({
|
|
246
|
+
id: key,
|
|
247
|
+
...deepSerialize(val, ctx)
|
|
248
|
+
}))
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Convert Set to array
|
|
253
|
+
*/
|
|
254
|
+
function convertSetToArray(set: Set<any>, ctx: SerializationContext): any[] {
|
|
255
|
+
return Array.from(set).map((v) => deepSerialize(v, ctx))
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Convert Zod schema to JSON Schema
|
|
260
|
+
* Reuses existing utility function
|
|
261
|
+
*/
|
|
262
|
+
function convertZodToJsonSchema(schema: any): any {
|
|
263
|
+
return zodToJsonSchema(schema, {
|
|
264
|
+
$refStrategy: 'none',
|
|
265
|
+
errorMessages: true
|
|
266
|
+
})
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Type guard: Check if value is a Zod schema
|
|
271
|
+
*/
|
|
272
|
+
function isZodSchema(value: any): boolean {
|
|
273
|
+
return value && typeof value === 'object' && '_def' in value && 'parse' in value
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Type guard: Check if value is a Tool object
|
|
278
|
+
*/
|
|
279
|
+
function isToolObject(value: any): boolean {
|
|
280
|
+
return value && typeof value === 'object' && 'name' in value && 'description' in value && 'execute' in value
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* Type guard: Check if value is a KnowledgeMap object
|
|
285
|
+
*/
|
|
286
|
+
function isKnowledgeMapObject(value: any): boolean {
|
|
287
|
+
return value && typeof value === 'object' && 'nodes' in value && typeof value.nodes === 'object'
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Type guard: Check if value is a NextConfig object
|
|
292
|
+
*/
|
|
293
|
+
function isNextConfigObject(value: any): boolean {
|
|
294
|
+
return (
|
|
295
|
+
value &&
|
|
296
|
+
typeof value === 'object' &&
|
|
297
|
+
'type' in value &&
|
|
298
|
+
(value.type === StepType.LINEAR || value.type === StepType.CONDITIONAL)
|
|
299
|
+
)
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Check if key name indicates secret data
|
|
304
|
+
*/
|
|
305
|
+
function isSecretKey(key: string): boolean {
|
|
306
|
+
const lower = key.toLowerCase()
|
|
307
|
+
|
|
308
|
+
// Whitelist: keys that contain "token" but are not secrets
|
|
309
|
+
const whitelist = ['maxtokens', 'memorytokens', 'inputtokens', 'outputtokens']
|
|
310
|
+
if (whitelist.some((w) => lower.includes(w))) return false
|
|
311
|
+
|
|
312
|
+
const patterns = ['apikey', 'secret', 'password', 'token', 'credential']
|
|
313
|
+
return patterns.some((p) => lower.includes(p))
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Redact secret value while preserving prefix
|
|
318
|
+
* Example: 'sk-proj-abc123...' → 'sk-proj...'
|
|
319
|
+
*/
|
|
320
|
+
function redactSecret(value: any): string {
|
|
321
|
+
if (typeof value !== 'string') return '[REDACTED]'
|
|
322
|
+
if (value.length <= 7) return '[REDACTED]'
|
|
323
|
+
return value.substring(0, 7) + '...'
|
|
324
|
+
}
|