@zackbart/connecta 0.34.1 → 0.36.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/CHANGELOG.md +418 -0
- package/README.md +65 -105
- package/SECURITY.md +3 -2
- package/bin/connecta.mjs +41 -16
- package/bin/version.mjs +1 -1
- package/dist/access-tokens.d.ts +2 -1
- package/dist/access-tokens.js +66 -30
- package/dist/activity.d.ts +1 -1
- package/dist/activity.js +2 -0
- package/dist/agent-config.d.ts +23 -0
- package/dist/agent-config.js +59 -0
- package/dist/agent-description.js +16 -0
- package/dist/agent-identity.js +4 -4
- package/dist/agent-observation.js +39 -0
- package/dist/auth/clerk-sdk/client.d.ts +2 -0
- package/dist/auth/clerk-sdk/generated.js +554 -563
- package/dist/auth/clerk-transport.js +70 -3
- package/dist/auth/clerk.d.ts +13 -0
- package/dist/auth/clerk.js +653 -246
- package/dist/auth/cloudflare-access.js +46 -42
- package/dist/auth/downstream-client-metadata.js +2 -2
- package/dist/auth/downstream-oauth.js +2044 -1161
- package/dist/auth/downstream-revocation.js +88 -88
- package/dist/auth/native-call.js +20 -0
- package/dist/auth/native.js +184 -0
- package/dist/auth/oauth-start-reset.js +11 -5
- package/dist/auth/oauth-token-response.js +121 -102
- package/dist/auth/oauth-v2-migration.js +97 -78
- package/dist/auth/renewable-grant.js +10 -0
- package/dist/auth/static-oauth.js +751 -281
- package/dist/auth/vercel-agent.js +266 -0
- package/dist/auth-admission.js +204 -0
- package/dist/auth-elicitation.js +350 -241
- package/dist/authorization-handoff.js +164 -90
- package/dist/call-admission-context.js +3 -10
- package/dist/call-admission.js +2 -0
- package/dist/call-classification.js +9 -0
- package/dist/call-recovery.js +32 -13
- package/dist/canonical-json.js +8 -0
- package/dist/catalog-cache.js +369 -213
- package/dist/catalog-service.js +659 -530
- package/dist/catalog.js +5 -1
- package/dist/concurrency.js +0 -25
- package/dist/config-defaults.d.ts +1 -0
- package/dist/config-defaults.js +1 -0
- package/dist/config-schema.d.ts +3 -1
- package/dist/config-schema.js +13 -3
- package/dist/config.d.ts +40 -6
- package/dist/config.js +40 -26
- package/dist/connector-caller.d.ts +4 -0
- package/dist/connector-caller.js +17 -4
- package/dist/connectors/api-connector.d.ts +29 -7
- package/dist/connectors/api-connector.js +145 -57
- package/dist/connectors/guarded-fetch.d.ts +51 -17
- package/dist/connectors/guarded-fetch.js +215 -121
- package/dist/connectors/negotiation-cache.js +20 -10
- package/dist/connectors/remote-mcp.d.ts +10 -30
- package/dist/connectors/remote-mcp.js +955 -563
- package/dist/d1.js +10 -243
- package/dist/derived-context.js +5 -0
- package/dist/describe-config.d.ts +3 -1
- package/dist/describe-config.js +2 -0
- package/dist/downstream-input.js +347 -260
- package/dist/errors.d.ts +87 -6
- package/dist/errors.js +114 -4
- package/dist/execute.js +87 -50
- package/dist/executor-admission.js +3 -0
- package/dist/executors/quickjs.js +163 -112
- package/dist/guarded-transport.js +50 -0
- package/dist/guest-runtime.js +1 -1
- package/dist/http/client.js +439 -0
- package/dist/http/errors.js +558 -0
- package/dist/http/fields.js +49 -0
- package/dist/http/hatch-paging.js +318 -0
- package/dist/http/hatch.js +1279 -0
- package/dist/http/json-schema.js +267 -0
- package/dist/http/node-transport.js +241 -0
- package/dist/http/oauth.js +162 -0
- package/dist/http/paging.js +227 -0
- package/dist/http/provider.js +221 -0
- package/dist/http/safety.js +82 -0
- package/dist/http/services.js +79 -0
- package/dist/http/tools.js +379 -0
- package/dist/http/vendor-index.js +138 -0
- package/dist/http/vendor.js +448 -0
- package/dist/http/write-request.js +66 -0
- package/dist/http-policy.d.ts +11 -0
- package/dist/http-policy.js +45 -0
- package/dist/inbound-credential.js +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -0
- package/dist/invocation-auth.js +30 -19
- package/dist/invocation.js +218 -85
- package/dist/mcp-result.js +0 -4
- package/dist/membership.d.ts +4 -0
- package/dist/meta-output.js +1 -1
- package/dist/meta-tools.js +531 -406
- package/dist/native-recovery.js +52 -0
- package/dist/native-tools.js +382 -0
- package/dist/node.d.ts +4 -3
- package/dist/node.js +45 -8
- package/dist/oauth-handoff.js +177 -104
- package/dist/oauth-partition.js +6 -20
- package/dist/oauth-sealing.js +6 -7
- package/dist/operation-vocabulary.js +101 -0
- package/dist/operator-record.d.ts +2 -2
- package/dist/operator-record.js +17 -4
- package/dist/operator-ui/contract.d.ts +8 -3
- package/dist/operator-ui/generated.js +4 -4
- package/dist/operator-ui/model.d.ts +2 -3
- package/dist/program-writes.js +47 -26
- package/dist/provider-call-facts.d.ts +115 -0
- package/dist/provider-call-facts.js +182 -0
- package/dist/provider-call.d.ts +112 -0
- package/dist/provider-call.js +271 -0
- package/dist/provider.d.ts +65 -31
- package/dist/provider.js +116 -39
- package/dist/providers/_shared/google/hatch.js +91 -0
- package/dist/providers/_shared/google/kit.js +427 -0
- package/dist/providers/_shared/google/result-size.js +15 -2
- package/dist/providers/_shared/google/service-account.d.ts +2 -1
- package/dist/providers/_shared/google/service-account.js +8 -4
- package/dist/providers/_shared/google/workspace.d.ts +6 -210
- package/dist/providers/_shared/google/workspace.js +6 -425
- package/dist/providers/_shared/rest/compact-index.js +86 -0
- package/dist/providers/_shared/rest/kit.js +146 -0
- package/dist/providers/_shared/rest/operation-index.js +230 -14
- package/dist/providers/_shared/rest/response-media.js +11 -0
- package/dist/providers/_shared/rest/value-safety.js +353 -195
- package/dist/providers/_shared/sensitive-fields.js +27 -0
- package/dist/providers/breeze/api.js +584 -0
- package/dist/providers/breeze/index.d.ts +1 -3
- package/dist/providers/breeze/index.js +67 -1420
- package/dist/providers/breeze/openapi.generated.js +60 -0
- package/dist/providers/breeze/skill.generated.js +2 -6
- package/dist/providers/breeze/tools.js +696 -0
- package/dist/providers/ccb/api.js +496 -0
- package/dist/providers/ccb/index.d.ts +15 -37
- package/dist/providers/ccb/index.js +77 -1702
- package/dist/providers/ccb/lib/constants.d.ts +34 -0
- package/dist/providers/ccb/lib/constants.js +74 -0
- package/dist/providers/ccb/lib/guide.js +9 -0
- package/dist/providers/ccb/lib/verdicts.js +387 -0
- package/dist/providers/ccb/openapi.generated.js +397 -0
- package/dist/providers/ccb/safety.js +295 -0
- package/dist/providers/ccb/skill.generated.js +2 -6
- package/dist/providers/ccb/tools.js +853 -0
- package/dist/providers/cloudflare/api.js +1066 -0
- package/dist/providers/cloudflare/index.d.ts +5 -22
- package/dist/providers/cloudflare/index.js +79 -197
- package/dist/providers/cloudflare/lib/config.d.ts +16 -0
- package/dist/providers/cloudflare/lib/config.js +2 -0
- package/dist/providers/cloudflare/lib/discovery.js +29 -0
- package/dist/providers/cloudflare/{graphql.js → lib/graphql.js} +1 -1
- package/dist/providers/cloudflare/lib/hatch.js +103 -0
- package/dist/providers/cloudflare/lib/path-bounds.js +28 -0
- package/dist/providers/cloudflare/lib/response-media.js +75 -0
- package/dist/providers/cloudflare/openapi.generated.js +4 -3
- package/dist/providers/cloudflare/{value-safety.js → safety.js} +487 -0
- package/dist/providers/cloudflare/skill.generated.js +2 -10
- package/dist/providers/cloudflare/tools.js +360 -0
- package/dist/providers/docs/api.js +51 -0
- package/dist/providers/docs/index.d.ts +1 -12
- package/dist/providers/docs/index.js +53 -1165
- package/dist/providers/docs/lib/constants.d.ts +18 -0
- package/dist/providers/docs/lib/constants.js +18 -0
- package/dist/providers/docs/lib/discovery.js +26 -0
- package/dist/providers/docs/lib/requests.js +48 -0
- package/dist/providers/docs/lib/schemas.js +168 -0
- package/dist/providers/docs/openapi.generated.js +16 -0
- package/dist/providers/docs/safety.js +54 -0
- package/dist/providers/docs/skill.generated.js +2 -6
- package/dist/providers/docs/tools.js +801 -0
- package/dist/providers/drive/api.js +177 -0
- package/dist/providers/drive/index.d.ts +1 -12
- package/dist/providers/drive/index.js +38 -1448
- package/dist/providers/drive/lib/constants.d.ts +6 -0
- package/dist/providers/drive/lib/constants.js +6 -0
- package/dist/providers/drive/lib/contracts.js +532 -0
- package/dist/providers/drive/lib/hatch.js +197 -0
- package/dist/providers/drive/openapi.generated.js +77 -0
- package/dist/providers/drive/safety.js +90 -0
- package/dist/providers/drive/skill.generated.js +2 -6
- package/dist/providers/drive/tools.js +1290 -0
- package/dist/providers/forms/api.js +71 -0
- package/dist/providers/forms/index.d.ts +1 -12
- package/dist/providers/forms/index.js +49 -1145
- package/dist/providers/forms/lib/constants.d.ts +14 -0
- package/dist/providers/forms/lib/constants.js +19 -0
- package/dist/providers/forms/lib/hatch.js +72 -0
- package/dist/providers/forms/openapi.generated.js +23 -0
- package/dist/providers/forms/safety.js +34 -0
- package/dist/providers/forms/skill.generated.js +2 -8
- package/dist/providers/forms/tools.js +1023 -0
- package/dist/providers/github/api.js +150 -0
- package/dist/providers/github/index.d.ts +4 -5
- package/dist/providers/github/index.js +30 -87
- package/dist/providers/github/{auth.d.ts → lib/auth.d.ts} +5 -3
- package/dist/providers/github/{auth.js → lib/auth.js} +40 -43
- package/dist/providers/github/lib/discovery.js +132 -0
- package/dist/providers/github/lib/operations.js +58 -0
- package/dist/providers/github/{scope.d.ts → lib/scope.d.ts} +2 -0
- package/dist/providers/github/{scope.js → lib/scope.js} +25 -1
- package/dist/providers/github/openapi.generated.js +1216 -0
- package/dist/providers/github/safety.js +216 -0
- package/dist/providers/github/skill.generated.js +2 -5
- package/dist/providers/github/tools.js +506 -0
- package/dist/providers/gmail/api.js +114 -0
- package/dist/providers/gmail/index.d.ts +1 -12
- package/dist/providers/gmail/index.js +73 -1621
- package/dist/providers/gmail/lib/constants.d.ts +13 -0
- package/dist/providers/gmail/lib/constants.js +16 -0
- package/dist/providers/gmail/lib/index.js +173 -0
- package/dist/providers/gmail/lib/schemas.js +176 -0
- package/dist/providers/gmail/lib/threading.js +120 -0
- package/dist/providers/gmail/openapi.generated.js +92 -0
- package/dist/providers/gmail/safety.js +21 -0
- package/dist/providers/gmail/skill.generated.js +2 -6
- package/dist/providers/gmail/tools.js +1435 -0
- package/dist/providers/overflow/api.js +1008 -0
- package/dist/providers/overflow/index.d.ts +1 -17
- package/dist/providers/overflow/index.js +60 -1488
- package/dist/providers/overflow/skill.generated.js +2 -5
- package/dist/providers/overflow/tools.js +873 -0
- package/dist/providers/planning-center/api.js +467 -0
- package/dist/providers/planning-center/index.d.ts +4 -35
- package/dist/providers/planning-center/index.js +69 -2445
- package/dist/providers/planning-center/lib/constants.d.ts +58 -0
- package/dist/providers/planning-center/lib/constants.js +83 -0
- package/dist/providers/planning-center/lib/discovery.js +40 -0
- package/dist/providers/planning-center/lib/guide.js +39 -0
- package/dist/providers/planning-center/lib/json-api.js +83 -0
- package/dist/providers/planning-center/lib/verdicts.js +1758 -0
- package/dist/providers/planning-center/openapi.generated.js +1764 -0
- package/dist/providers/planning-center/safety.js +188 -0
- package/dist/providers/planning-center/skill.generated.js +2 -27
- package/dist/providers/planning-center/tools.js +1010 -0
- package/dist/providers/quickbooks/api.js +299 -0
- package/dist/providers/quickbooks/index.d.ts +13 -0
- package/dist/providers/quickbooks/index.js +93 -0
- package/dist/providers/quickbooks/lib/query.js +118 -0
- package/dist/providers/quickbooks/lib/writes.js +168 -0
- package/dist/providers/quickbooks/safety.js +222 -0
- package/dist/providers/quickbooks/skill.generated.js +5 -0
- package/dist/providers/quickbooks/tools.js +117 -0
- package/dist/providers/sheets/api.js +133 -0
- package/dist/providers/sheets/index.d.ts +4 -16
- package/dist/providers/sheets/index.js +61 -1172
- package/dist/providers/sheets/lib/constants.d.ts +14 -0
- package/dist/providers/sheets/lib/constants.js +14 -0
- package/dist/providers/sheets/lib/hatch.js +163 -0
- package/dist/providers/sheets/lib/requests.js +105 -0
- package/dist/providers/sheets/lib/schemas.js +138 -0
- package/dist/providers/sheets/openapi.generated.js +30 -0
- package/dist/providers/sheets/safety.js +27 -0
- package/dist/providers/sheets/skill.generated.js +2 -7
- package/dist/providers/sheets/tools.js +733 -0
- package/dist/providers/slides/api.js +147 -0
- package/dist/providers/slides/index.d.ts +2 -10
- package/dist/providers/slides/index.js +48 -2555
- package/dist/providers/slides/lib/constants.d.ts +11 -0
- package/dist/providers/slides/lib/constants.js +11 -0
- package/dist/providers/slides/lib/requests.js +60 -0
- package/dist/providers/slides/lib/schemas.js +565 -0
- package/dist/providers/slides/openapi.generated.js +18 -0
- package/dist/providers/slides/skill.generated.js +2 -6
- package/dist/providers/slides/tools.js +1968 -0
- package/dist/providers/stripe/api.js +401 -0
- package/dist/providers/stripe/index.d.ts +5 -27
- package/dist/providers/stripe/index.js +74 -210
- package/dist/providers/stripe/lib/config.d.ts +4 -0
- package/dist/providers/stripe/lib/config.js +2 -0
- package/dist/providers/stripe/openapi.generated.js +4 -3
- package/dist/providers/stripe/{value-safety.js → safety.js} +5 -5
- package/dist/providers/stripe/skill.generated.js +2 -11
- package/dist/providers/stripe/tools.js +77 -0
- package/dist/providers/tithely/api.js +531 -0
- package/dist/providers/tithely/index.d.ts +17 -0
- package/dist/providers/tithely/index.js +86 -965
- package/dist/providers/tithely/skill.generated.js +2 -5
- package/dist/providers/tithely/tools.js +426 -0
- package/dist/providers/vercel/api.js +551 -0
- package/dist/providers/vercel/index.d.ts +9 -25
- package/dist/providers/vercel/index.js +65 -260
- package/dist/providers/vercel/lib/config.d.ts +2 -0
- package/dist/providers/vercel/lib/config.js +2 -0
- package/dist/providers/vercel/lib/index.js +117 -0
- package/dist/providers/vercel/lib/logs.js +100 -0
- package/dist/providers/vercel/lib/pin.js +270 -0
- package/dist/providers/vercel/openapi.generated.js +10 -5
- package/dist/providers/vercel/{value-safety.js → safety.js} +247 -38
- package/dist/providers/vercel/skill.generated.js +2 -7
- package/dist/providers/vercel/tools.js +642 -0
- package/dist/redaction-identity.js +47 -0
- package/dist/redaction-marker.js +125 -0
- package/dist/registry.d.ts +21 -15
- package/dist/registry.js +409 -376
- package/dist/routes/access-tokens.js +1 -1
- package/dist/routes/actor-labels.js +1 -1
- package/dist/routes/connect.js +1 -1
- package/dist/routes/dispatch.js +103 -0
- package/dist/routes/mcp.js +170 -79
- package/dist/routes/oauth.js +6 -1
- package/dist/routes/operator.js +2 -2
- package/dist/routes/shared.d.ts +5 -4
- package/dist/routes/shared.js +244 -177
- package/dist/routes/skills.js +10 -8
- package/dist/routes/ui-config.js +27 -3
- package/dist/routes/ui-data.js +21 -20
- package/dist/routes/ui.js +1 -1
- package/dist/runtime/call-admission.js +0 -26
- package/dist/runtime/call-entry.js +30 -0
- package/dist/runtime/call.js +552 -0
- package/dist/runtime/connector-scope.js +7 -0
- package/dist/runtime/credential-probe.js +34 -0
- package/dist/runtime/executor.js +40 -0
- package/dist/runtime/native-storage.js +63 -0
- package/dist/runtime/registry.js +27 -0
- package/dist/runtime/request-scope.js +72 -0
- package/dist/runtime/run.js +15 -7
- package/dist/runtime/shared-read.js +34 -5
- package/dist/runtime/storage.js +34 -21
- package/dist/sent-secrets.d.ts +194 -37
- package/dist/sent-secrets.js +1743 -340
- package/dist/server.js +5 -56
- package/dist/skills.js +322 -223
- package/dist/sqlite.js +15 -14
- package/dist/storage/d1-copy.js +255 -0
- package/dist/storage/d1-driver.js +15 -0
- package/dist/storage/keys.js +28 -0
- package/dist/storage/sql-driver.js +88 -0
- package/dist/storage/sql-native.js +544 -0
- package/dist/storage/sql-schema.d.ts +6 -0
- package/dist/storage/sql-schema.js +15 -0
- package/dist/storage/sql.d.ts +14 -20
- package/dist/storage/sql.js +29 -535
- package/dist/timeout.js +0 -26
- package/dist/tool-safety.js +20 -10
- package/dist/types.d.ts +9 -109
- package/dist/ui.d.ts +1 -1
- package/dist/ui.js +0 -1
- package/dist/upward.js +3 -0
- package/dist/usage-guide.js +3 -1
- package/dist/validate.d.ts +4 -2
- package/dist/validate.js +86 -9
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker.js +312 -292
- package/dist/workspace-subject.js +5 -1
- package/dist/write-outcome.js +454 -34
- package/documentation/README.md +28 -7
- package/documentation/architecture.md +2409 -255
- package/documentation/auth.md +867 -114
- package/documentation/code-mode.md +49 -16
- package/documentation/deploying.md +164 -20
- package/documentation/hosted-mcp-migration.md +460 -0
- package/documentation/integrating.md +129 -144
- package/documentation/meta-tools.md +409 -32
- package/documentation/operating.md +27 -3
- package/documentation/operator-tests.md +3 -0
- package/documentation/operator-ui.md +84 -48
- package/documentation/provider-auth-migration.md +16 -63
- package/documentation/provider-migration-0.29.md +10 -5
- package/documentation/provider-migration-0.35.md +975 -0
- package/documentation/providers.md +1347 -0
- package/examples/worker/AGENTS.md +23 -9
- package/examples/worker/README.md +254 -135
- package/examples/worker/alchemy.run.ts +116 -0
- package/examples/worker/gitignore +10 -0
- package/examples/worker/src/connecta.config.ts +23 -21
- package/examples/worker/wrangler.jsonc +14 -5
- package/guides/connecting-agents.md +157 -0
- package/guides/how-it-works.md +156 -0
- package/guides/safety-and-trust.md +153 -0
- package/package.json +30 -50
- package/templates/node/.env.example +3 -0
- package/templates/node/README.md +22 -2
- package/templates/node/docker-compose.yml +1 -0
- package/templates/node/package.json +3 -2
- package/templates/node/src/connecta.config.ts +8 -0
- package/dist/catalog-drift.d.ts +0 -138
- package/dist/catalog-drift.js +0 -578
- package/dist/operator-ui/agents.d.ts +0 -74
- package/dist/operator-ui/agents.js +0 -104
- package/dist/operator-ui/config-summary.js +0 -565
- package/dist/operator-ui/connection-map.js +0 -376
- package/dist/operator-ui/endpoints.js +0 -221
- package/dist/operator-ui/fix-prompts.d.ts +0 -18
- package/dist/operator-ui/fix-prompts.js +0 -87
- package/dist/operator-ui/health.js +0 -52
- package/dist/operator-ui/member-page.js +0 -97
- package/dist/operator-ui/overview.js +0 -123
- package/dist/operator-ui/setup-commands.js +0 -51
- package/dist/operator-ui/view.d.ts +0 -401
- package/dist/operator-ui/view.js +0 -705
- package/dist/providers/_shared/request-token.js +0 -83
- package/dist/providers/_shared/rest/dispatch.js +0 -41
- package/dist/providers/_shared/rest/operation-index.d.ts +0 -133
- package/dist/providers/_shared/rest/tools.d.ts +0 -141
- package/dist/providers/_shared/rest/tools.js +0 -569
- package/dist/providers/_shared/rest/value-safety.d.ts +0 -201
- package/dist/providers/basecamp/index.d.ts +0 -45
- package/dist/providers/basecamp/index.js +0 -997
- package/dist/providers/basecamp/skill.generated.js +0 -9
- package/dist/providers/cloudflare/rest.d.ts +0 -37
- package/dist/providers/cloudflare/rest.js +0 -1097
- package/dist/providers/github/hosted.js +0 -218
- package/dist/providers/github/rest.js +0 -321
- package/dist/providers/infisical/index.d.ts +0 -7
- package/dist/providers/infisical/index.js +0 -713
- package/dist/providers/infisical/skill.generated.js +0 -8
- package/dist/providers/intercom/index.d.ts +0 -24
- package/dist/providers/intercom/index.js +0 -121
- package/dist/providers/intercom/skill.generated.js +0 -8
- package/dist/providers/linear/index.d.ts +0 -55
- package/dist/providers/linear/index.js +0 -537
- package/dist/providers/linear/skill.generated.js +0 -8
- package/dist/providers/mixpanel/index.d.ts +0 -59
- package/dist/providers/mixpanel/index.js +0 -472
- package/dist/providers/mixpanel/operations.js +0 -20
- package/dist/providers/mixpanel/rest.js +0 -603
- package/dist/providers/mixpanel/skill.generated.js +0 -10
- package/dist/providers/mixpanel/value-safety.js +0 -16
- package/dist/providers/notion/index.d.ts +0 -67
- package/dist/providers/notion/index.js +0 -368
- package/dist/providers/notion/openapi.generated.js +0 -75
- package/dist/providers/notion/rest.d.ts +0 -24
- package/dist/providers/notion/rest.js +0 -1226
- package/dist/providers/notion/skill.generated.js +0 -11
- package/dist/providers/notion/value-safety.js +0 -56
- package/dist/providers/revenuecat/index.d.ts +0 -51
- package/dist/providers/revenuecat/index.js +0 -697
- package/dist/providers/revenuecat/skill.generated.js +0 -11
- package/dist/providers/stripe/rest.d.ts +0 -14
- package/dist/providers/stripe/rest.js +0 -402
- package/dist/providers/vercel/rest.d.ts +0 -20
- package/dist/providers/vercel/rest.js +0 -1020
- package/dist/providers/wispr-flow/index.d.ts +0 -14
- package/dist/providers/wispr-flow/index.js +0 -117
- package/dist/providers/wispr-flow/skill.generated.js +0 -8
- /package/dist/providers/github/{key.js → lib/key.js} +0 -0
package/dist/worker.js
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
// The upstream sandbox, with request-owned loader/RPC handles. A guest's
|
|
2
2
|
// deadline cannot clean up after the parent response has already ended.
|
|
3
|
+
import { Deferred, Effect, Exit, Scope } from "effect";
|
|
4
|
+
import { admit } from "./runtime/admission.js";
|
|
5
|
+
import { detach, runEdge } from "./runtime/run.js";
|
|
6
|
+
import { awaitExecutorLease, provideExecutorProgram, executorProgram } from "./runtime/executor.js";
|
|
3
7
|
import { DynamicWorkerExecutor, normalizeCode } from "@cloudflare/codemode";
|
|
4
8
|
import { AdmissionController, ExecutorExecutionError } from "./executor-admission.js";
|
|
5
9
|
import { brandExecutor } from "./executor-contract.js";
|
|
@@ -48,110 +52,90 @@ export function workerExecutor(options) {
|
|
|
48
52
|
retryAfterMs: 1_000,
|
|
49
53
|
});
|
|
50
54
|
const active = new Set();
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const forward = (index, name) => async (...args) => {
|
|
55
|
+
const acquire = (request = {}) => Effect.gen(function* () {
|
|
56
|
+
const permit = yield* admit(admission, request);
|
|
57
|
+
const resources = Scope.makeUnsafe();
|
|
58
|
+
const stopped = Deferred.makeUnsafe();
|
|
59
|
+
let released = false;
|
|
60
|
+
let executed = false;
|
|
61
|
+
let runEnded = false;
|
|
62
|
+
let hostProviders;
|
|
63
|
+
const hostFailures = new Map();
|
|
64
|
+
// An upstream evaluation can remain pending after disposal. Its
|
|
65
|
+
// dispatchers retain only these forwarders, detached on lease release.
|
|
66
|
+
const forward = (index, name) => (...args) => runEdge(Effect.raceFirst(Effect.tryPromise({
|
|
67
|
+
try: () => {
|
|
65
68
|
const fn = hostProviders?.[index]?.fns[name];
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
}
|
|
89
|
-
return { ok: false, error: { message } };
|
|
69
|
+
if (!fn || released || runEnded)
|
|
70
|
+
throw new Error("The Worker run ended.");
|
|
71
|
+
return Promise.resolve(fn(...args));
|
|
72
|
+
},
|
|
73
|
+
catch: (error) => error,
|
|
74
|
+
}), Deferred.await(stopped)).pipe(Effect.match({
|
|
75
|
+
onSuccess: (value) => ({ ok: true, value }),
|
|
76
|
+
onFailure: (error) => {
|
|
77
|
+
const message = error instanceof Error ? error.message : "Host call failed.";
|
|
78
|
+
if (error instanceof InvocationFailure && !released && !runEnded) {
|
|
79
|
+
const failureId = crypto.randomUUID();
|
|
80
|
+
hostFailures.set(failureId, error.details);
|
|
81
|
+
// Guest hooks receive a copy; authority remains in this map.
|
|
82
|
+
return {
|
|
83
|
+
ok: false,
|
|
84
|
+
error: {
|
|
85
|
+
message,
|
|
86
|
+
code: error.details.code,
|
|
87
|
+
retryable: error.details.retryable,
|
|
88
|
+
details: structuredClone(error.details),
|
|
89
|
+
},
|
|
90
|
+
failureId,
|
|
91
|
+
};
|
|
90
92
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
// RPC dispatchers and retained host-failure identities.
|
|
138
|
-
if (typeof source !== "string" || !executableCode || !hostProviders)
|
|
139
|
-
throw new Error("Worker executable module was unavailable.");
|
|
140
|
-
const index = source.indexOf(executableCode);
|
|
141
|
-
if (index < 0)
|
|
142
|
-
throw new Error("Worker executable module did not contain the program.");
|
|
143
|
-
const guest = guestProgram;
|
|
144
|
-
if (guest)
|
|
145
|
-
normalizationLines = 0;
|
|
146
|
-
const names = hostProviders.map((provider) => provider.name).join(", ");
|
|
147
|
-
const globals = hostProviders
|
|
148
|
-
.map((provider) => `globalThis[${JSON.stringify(provider.name)}] = ${provider.name};`)
|
|
149
|
-
.join("\n");
|
|
150
|
-
let isolated = source.slice(0, index) + "__connecta_program" + source.slice(index + executableCode.length);
|
|
151
|
-
const bridge = `if (data.error) throw new Error(data.error);\n return data.result;`;
|
|
152
|
-
if (hostProviders.length > 0 && !isolated.includes(bridge))
|
|
153
|
-
throw new Error("Worker bridge contract changed.");
|
|
154
|
-
isolated = isolated.replaceAll(bridge, `if (data.error) throw new NativeError(data.error);
|
|
93
|
+
return { ok: false, error: { message } };
|
|
94
|
+
},
|
|
95
|
+
})));
|
|
96
|
+
// The SDK prepares its source/dispatchers against this inert loader.
|
|
97
|
+
// Actual Loader and RPC acquisition belongs to the native program below.
|
|
98
|
+
let prepared;
|
|
99
|
+
const dispose = (resource) => Effect.sync(() => {
|
|
100
|
+
try {
|
|
101
|
+
const method = Reflect.get(resource, Symbol.dispose);
|
|
102
|
+
if (typeof method === "function")
|
|
103
|
+
method.call(resource);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
/* A failed RPC disposer cannot skip the Loader cleanup. */
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
let executableCode;
|
|
110
|
+
let guestProgram;
|
|
111
|
+
let normalizationLines = 0;
|
|
112
|
+
const loader = new Proxy(options.loader, {
|
|
113
|
+
get(target, key) {
|
|
114
|
+
if (key === "load")
|
|
115
|
+
return (...args) => {
|
|
116
|
+
if (released)
|
|
117
|
+
throw new Error("Executor lease was already released.");
|
|
118
|
+
const definition = args[0];
|
|
119
|
+
const source = definition?.modules?.["executor.js"];
|
|
120
|
+
// Keep guest source in its own module, outside the lexical scope of
|
|
121
|
+
// RPC dispatchers and retained host-failure identities.
|
|
122
|
+
if (typeof source !== "string" || !executableCode || !hostProviders)
|
|
123
|
+
throw new Error("Worker executable module was unavailable.");
|
|
124
|
+
const index = source.indexOf(executableCode);
|
|
125
|
+
if (index < 0)
|
|
126
|
+
throw new Error("Worker executable module did not contain the program.");
|
|
127
|
+
const guest = guestProgram;
|
|
128
|
+
if (guest)
|
|
129
|
+
normalizationLines = 0;
|
|
130
|
+
const names = hostProviders.map((provider) => provider.name).join(", ");
|
|
131
|
+
const globals = hostProviders
|
|
132
|
+
.map((provider) => `globalThis[${JSON.stringify(provider.name)}] = ${provider.name};`)
|
|
133
|
+
.join("\n");
|
|
134
|
+
let isolated = source.slice(0, index) + "__connecta_program" + source.slice(index + executableCode.length);
|
|
135
|
+
const bridge = `if (data.error) throw new Error(data.error);\n return data.result;`;
|
|
136
|
+
if (hostProviders.length > 0 && !isolated.includes(bridge))
|
|
137
|
+
throw new Error("Worker bridge contract changed.");
|
|
138
|
+
isolated = isolated.replaceAll(bridge, `if (data.error) throw new NativeError(data.error);
|
|
155
139
|
const reply = data.result;
|
|
156
140
|
if (!reply.ok) {
|
|
157
141
|
const error = new NativeError(reply.error.message);
|
|
@@ -167,14 +151,14 @@ export function workerExecutor(options) {
|
|
|
167
151
|
throw error;
|
|
168
152
|
}
|
|
169
153
|
return reply.value;`);
|
|
170
|
-
|
|
154
|
+
isolated = isolated.replace(" const __logs = [];", ` if (initialized) throw new NativeError("Worker initialization is single-use.");
|
|
171
155
|
initialized = true;
|
|
172
156
|
const failures = new NativeWeakMap();
|
|
173
157
|
const timeoutError = new NativeError("Execution timed out");
|
|
174
158
|
const __logs = [];`);
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
159
|
+
isolated = isolated.replace('new Error("Execution timed out")', "timeoutError");
|
|
160
|
+
isolated = isolated.replace("setTimeout(() => reject(timeoutError)", "nativeSetTimeout(() => reject(timeoutError)");
|
|
161
|
+
isolated = isolated.replace("return { result: undefined, error: err.message, logs: __logs };", `
|
|
178
162
|
const failureId = lookup(failures, err);
|
|
179
163
|
let name = "Error", message = "Program threw a value.", stack = "";
|
|
180
164
|
try {
|
|
@@ -190,29 +174,29 @@ export function workerExecutor(options) {
|
|
|
190
174
|
name, ...(failureId ? { failureId } : {}), ...(location ? { line: toNumber(location[1]) - 1 } : {}),
|
|
191
175
|
...(err === timeoutError ? { timeout: { elapsedMs: ${options.timeout ?? 60_000}, deadlineMs: ${options.timeout ?? 60_000} } } : {})
|
|
192
176
|
} };`);
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
177
|
+
const preludes = [];
|
|
178
|
+
let firstInitializer;
|
|
179
|
+
for (const provider of hostProviders) {
|
|
180
|
+
if (!provider.prelude)
|
|
181
|
+
continue;
|
|
182
|
+
if (!isolated.includes(provider.prelude))
|
|
183
|
+
throw new Error("Worker provider setup was unavailable.");
|
|
184
|
+
preludes.push(provider.prelude);
|
|
185
|
+
const call = firstInitializer ? "" : `__connecta_initialize(${names});`;
|
|
186
|
+
isolated = isolated.replace(provider.prelude, call);
|
|
187
|
+
firstInitializer ||= call;
|
|
188
|
+
}
|
|
189
|
+
// Successive preludes share lexical bindings in both executors.
|
|
190
|
+
const captureGuest = preludes.includes(guestPrelude());
|
|
191
|
+
const initializer = preludes.length
|
|
192
|
+
? `const __connecta_initialize = (${names}) => {\n${preludes.map((prelude) => (prelude === guestPrelude() ? "__connecta_guest_initialize(connecta);" : prelude)).join("\n")}\n};\n`
|
|
193
|
+
: "";
|
|
194
|
+
// Runner modules are inaccessible to guest imports. The callback has
|
|
195
|
+
// no lexical access to initialization or RPC dispatchers.
|
|
196
|
+
const programName = guest ? "__connecta_user_program" : "__connecta_program";
|
|
197
|
+
const imports = 'import Runner from "./connecta-runner.js";\n' + `import program from "./connecta-guest.js";\n`;
|
|
198
|
+
const wrapper = guest ? ` const __connecta_program = (${guest.wrapper});\n` : "";
|
|
199
|
+
const hardening = `
|
|
216
200
|
const builtinAllowed = name => typeof name === "string" && name !== "module" && name !== "node:module" && name !== "process" && name !== "node:process";
|
|
217
201
|
if (typeof process !== "undefined" && typeof process.getBuiltinModule === "function") {
|
|
218
202
|
const getBuiltin = process.getBuiltinModule.bind(process);
|
|
@@ -220,10 +204,10 @@ if (typeof process !== "undefined" && typeof process.getBuiltinModule === "funct
|
|
|
220
204
|
value: name => builtinAllowed(name) ? getBuiltin(name) : undefined });
|
|
221
205
|
}
|
|
222
206
|
`;
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
207
|
+
// ESM evaluates the first dependency completely before the next.
|
|
208
|
+
// This module has no guest dependency; its references and retained
|
|
209
|
+
// failures stay private, and guest imports cannot reach its export.
|
|
210
|
+
const captures = `
|
|
227
211
|
const {
|
|
228
212
|
NativeError, NativeWeakMap, NativeProxy, NativePromise, NativeUint8Array, NativeArrayBuffer,
|
|
229
213
|
defineProperties, freeze, clone, retain, lookup, slice, nativeSetTimeout, toNumber, exec,
|
|
@@ -251,58 +235,59 @@ const {
|
|
|
251
235
|
nativeConsole: console
|
|
252
236
|
});
|
|
253
237
|
`;
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
238
|
+
const binaryTagCheck = "(__CODEMODE_BINARY_TAG in value)";
|
|
239
|
+
const binaryDataCheck = 'typeof value.data !== "string"';
|
|
240
|
+
if (!isolated.includes(binaryTagCheck) || !isolated.includes(binaryDataCheck)) {
|
|
241
|
+
throw new Error("Worker binary codec contract changed.");
|
|
242
|
+
}
|
|
243
|
+
isolated = isolated
|
|
244
|
+
.replace("async evaluate(__dispatchers = {}, __connectors = {}) {", `async evaluate(__dispatchers = {}, __connectors = {}, ${programName}) {\n${wrapper}`)
|
|
245
|
+
.replaceAll("JSON.parse(", "jsonParse(")
|
|
246
|
+
.replaceAll("JSON.stringify(", "jsonStringify(")
|
|
247
|
+
.replaceAll(binaryTagCheck, "hasOwn(value, __CODEMODE_BINARY_TAG)")
|
|
248
|
+
.replaceAll(binaryDataCheck, '!hasOwn(value, "data") || typeof value.data !== "string"')
|
|
249
|
+
.replaceAll("console.", "nativeConsole.")
|
|
250
|
+
.replaceAll("new Proxy(", "new NativeProxy(")
|
|
251
|
+
.replaceAll("Object.prototype.hasOwnProperty.call(target, toolName)", "hasOwn(target, toolName)")
|
|
252
|
+
.replaceAll("String(toolName)", "toString(toolName)")
|
|
253
|
+
.replaceAll('a.map(String).join(" ")', 'join(map(a, toString), " ")')
|
|
254
|
+
.replaceAll("__logs.push(", "push(__logs, ")
|
|
255
|
+
.replaceAll("String.fromCharCode(", "fromCharCode(")
|
|
256
|
+
.replaceAll("bytes.subarray(i, Math.min(i + chunkSize, bytes.byteLength))", "subarray(bytes, i, min(i + chunkSize, bytes.byteLength))")
|
|
257
|
+
.replaceAll("btoa(binary)", "nativeBtoa(binary)")
|
|
258
|
+
.replaceAll("atob(b64)", "nativeAtob(b64)")
|
|
259
|
+
.replaceAll("new Uint8Array(", "new NativeUint8Array(")
|
|
260
|
+
.replaceAll("instanceof Uint8Array", "instanceof NativeUint8Array")
|
|
261
|
+
.replaceAll("instanceof ArrayBuffer", "instanceof NativeArrayBuffer")
|
|
262
|
+
.replaceAll("ArrayBuffer.isView(", "isView(")
|
|
263
|
+
.replaceAll("binary.charCodeAt(i)", "charCodeAt(binary, i)")
|
|
264
|
+
.replaceAll("bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength)", "bufferSlice(bytes.buffer, bytes.byteOffset, bytes.byteOffset + bytes.byteLength)")
|
|
265
|
+
.replaceAll("Promise.race(", "race(")
|
|
266
|
+
.replaceAll("new Promise(", "new NativePromise(");
|
|
267
|
+
// Recompute the insertion point after changing the generated runner.
|
|
268
|
+
const setup = firstInitializer
|
|
269
|
+
? isolated.indexOf(firstInitializer)
|
|
270
|
+
: isolated.indexOf(" try {\n const result = await race");
|
|
271
|
+
if (setup < 0)
|
|
272
|
+
throw new Error("Worker provider setup was unavailable.");
|
|
273
|
+
const runner = hardening +
|
|
274
|
+
(captureGuest
|
|
275
|
+
? `const __connecta_guest_initialize = ${guestInitializer()};\n`
|
|
276
|
+
: `${guestPromiseInitializer()};\n`) +
|
|
277
|
+
captures +
|
|
278
|
+
"let initialized = false;\n" +
|
|
279
|
+
initializer +
|
|
280
|
+
isolated.slice(0, setup) +
|
|
281
|
+
globals +
|
|
282
|
+
"\n" +
|
|
283
|
+
isolated.slice(setup);
|
|
284
|
+
const main = imports +
|
|
285
|
+
`export default class CodeExecutor extends Runner {
|
|
302
286
|
evaluate(dispatchers, connectors) { return super.evaluate(dispatchers, connectors, program); }
|
|
303
287
|
}`;
|
|
304
|
-
|
|
305
|
-
|
|
288
|
+
const routed = routeGuestImports(guest?.program ?? executableCode);
|
|
289
|
+
const acquisition = {
|
|
290
|
+
load: () => Reflect.apply(Reflect.get(target, key), target, [
|
|
306
291
|
{
|
|
307
292
|
...definition,
|
|
308
293
|
modules: {
|
|
@@ -313,123 +298,158 @@ const {
|
|
|
313
298
|
},
|
|
314
299
|
},
|
|
315
300
|
...args.slice(1),
|
|
316
|
-
])
|
|
301
|
+
]),
|
|
302
|
+
args: undefined,
|
|
303
|
+
};
|
|
304
|
+
prepared = acquisition;
|
|
305
|
+
return {
|
|
306
|
+
getEntrypoint: () => ({
|
|
307
|
+
evaluate: (...evaluateArgs) => {
|
|
308
|
+
acquisition.args = evaluateArgs;
|
|
309
|
+
return Promise.resolve({ result: undefined });
|
|
310
|
+
},
|
|
311
|
+
}),
|
|
317
312
|
};
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
313
|
+
};
|
|
314
|
+
const value = Reflect.get(target, key);
|
|
315
|
+
return typeof value === "function" ? (...args) => Reflect.apply(value, target, args) : value;
|
|
316
|
+
},
|
|
317
|
+
});
|
|
318
|
+
const execute = (code, providers) => Effect.suspend(() => {
|
|
319
|
+
if (released)
|
|
320
|
+
return Effect.fail(new Error("Executor lease was already released."));
|
|
321
|
+
if (executed)
|
|
322
|
+
return Effect.fail(new Error("Executor lease may execute only once."));
|
|
323
|
+
executed = true;
|
|
324
|
+
return Effect.gen(function* () {
|
|
325
|
+
hostProviders = providers;
|
|
326
|
+
// Extract the fixed wrapper from the original source. Upstream may
|
|
327
|
+
// wrap invalid syntax as a bare body; that must not turn an attempted
|
|
328
|
+
// module escape into runnable statements or shift guest locations.
|
|
329
|
+
guestProgram = isolateGuestProgram(code.trim());
|
|
330
|
+
executableCode = normalizeCode(code);
|
|
331
|
+
const original = executableCode.indexOf(code.trim());
|
|
332
|
+
if (original >= 0)
|
|
333
|
+
normalizationLines = executableCode.slice(0, original).split("\n").length - 1;
|
|
334
|
+
const detached = providers.map((provider, index) => ({
|
|
335
|
+
name: provider.name,
|
|
336
|
+
...(provider.prelude ? { prelude: provider.prelude } : {}),
|
|
337
|
+
fns: Object.fromEntries(Object.keys(provider.fns).map((name) => [name, forward(index, name)])),
|
|
338
|
+
}));
|
|
339
|
+
const started = Date.now();
|
|
340
|
+
const operation = Effect.gen(function* () {
|
|
341
|
+
const setup = yield* Effect.tryPromise({
|
|
342
|
+
try: () => new DynamicWorkerExecutor({
|
|
343
|
+
loader,
|
|
344
|
+
...(options.timeout !== undefined ? { timeout: options.timeout } : {}),
|
|
345
|
+
}).execute(code, detached),
|
|
346
|
+
catch: (error) => error,
|
|
346
347
|
});
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
: location?.line !== undefined
|
|
380
|
-
? Math.max(1, location.line)
|
|
381
|
-
: undefined;
|
|
382
|
-
return {
|
|
383
|
-
result: undefined,
|
|
384
|
-
error: (syntax?.[1] ?? message) || "Invalid JavaScript program.",
|
|
385
|
-
failure: { name: "SyntaxError", ...(line !== undefined ? { line } : {}) },
|
|
386
|
-
};
|
|
387
|
-
}
|
|
388
|
-
throw error;
|
|
389
|
-
}
|
|
390
|
-
finally {
|
|
391
|
-
runEnded = true;
|
|
392
|
-
cancel = undefined;
|
|
393
|
-
hostFailures.clear();
|
|
348
|
+
// Provider validation can return before the SDK reaches its loader.
|
|
349
|
+
if (!prepared)
|
|
350
|
+
return setup;
|
|
351
|
+
const load = prepared.load;
|
|
352
|
+
const args = prepared.args;
|
|
353
|
+
const open = () => Effect.suspend(() => released || resources.state._tag === "Closed"
|
|
354
|
+
? Effect.fail(new ExecutorExecutionError("executor_cancelled", "Worker executor lease was released during execution."))
|
|
355
|
+
: Effect.void);
|
|
356
|
+
const evaluation = Effect.gen(function* () {
|
|
357
|
+
yield* open();
|
|
358
|
+
const worker = yield* Effect.acquireRelease(Effect.try({ try: load, catch: (error) => error }), dispose);
|
|
359
|
+
yield* open();
|
|
360
|
+
const entrypoint = yield* Effect.acquireRelease(Effect.try({
|
|
361
|
+
try: () => Reflect.apply(Reflect.get(worker, "getEntrypoint"), worker, []),
|
|
362
|
+
catch: (error) => error,
|
|
363
|
+
}), dispose);
|
|
364
|
+
yield* open();
|
|
365
|
+
return yield* Effect.tryPromise({
|
|
366
|
+
try: () => Reflect.apply(Reflect.get(entrypoint, "evaluate"), entrypoint, args ?? []),
|
|
367
|
+
catch: (error) => error,
|
|
368
|
+
});
|
|
369
|
+
}).pipe(Scope.provide(resources));
|
|
370
|
+
const result = yield* evaluation;
|
|
371
|
+
const outcome = result;
|
|
372
|
+
if (outcome.failure) {
|
|
373
|
+
const failure = { ...outcome.failure };
|
|
374
|
+
const call = typeof failure.failureId === "string" ? hostFailures.get(failure.failureId) : undefined;
|
|
375
|
+
// Neither an unknown id nor a guest/RPC-supplied call record
|
|
376
|
+
// supplies typed host details. Strip the private id at the edge.
|
|
377
|
+
delete failure.call;
|
|
378
|
+
delete failure.failureId;
|
|
379
|
+
outcome.failure = { ...failure, ...(call ? { call } : {}) };
|
|
394
380
|
}
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
381
|
+
if (outcome.failure?.timeout)
|
|
382
|
+
outcome.failure.timeout.elapsedMs = Date.now() - started;
|
|
383
|
+
return outcome;
|
|
384
|
+
});
|
|
385
|
+
return yield* operation.pipe(Effect.catch((error) => {
|
|
386
|
+
const message = error instanceof Error ? error.message : "";
|
|
387
|
+
// Worker Loader erases the native SyntaxError type at its RPC edge.
|
|
388
|
+
// Match its startup diagnostic only; guest/downstream failures return normally.
|
|
389
|
+
const syntax = /^Failed to start Worker:\nUncaught SyntaxError: ([^\n]*)\n\s+at connecta-guest\.js:(\d+):\d+$/.exec(message);
|
|
390
|
+
if (error instanceof SyntaxError || syntax) {
|
|
391
|
+
const location = error instanceof SyntaxError && "loc" in error ? error.loc : undefined;
|
|
392
|
+
const line = syntax
|
|
393
|
+
? Math.max(1, Number(syntax[2]) - normalizationLines - 1)
|
|
394
|
+
: location?.line !== undefined
|
|
395
|
+
? Math.max(1, location.line)
|
|
396
|
+
: undefined;
|
|
397
|
+
return Effect.succeed({
|
|
398
|
+
result: undefined,
|
|
399
|
+
error: (syntax?.[1] ?? message) || "Invalid JavaScript program.",
|
|
400
|
+
failure: { name: "SyntaxError", ...(line !== undefined ? { line } : {}) },
|
|
401
|
+
});
|
|
410
402
|
}
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
403
|
+
return Effect.fail(error);
|
|
404
|
+
}));
|
|
405
|
+
}).pipe(Effect.raceFirst(Deferred.await(stopped)), Effect.catchDefect((error) => Effect.fail(error)), Effect.ensuring(Effect.sync(() => {
|
|
406
|
+
runEnded = true;
|
|
407
|
+
hostProviders = undefined;
|
|
408
|
+
prepared = undefined;
|
|
409
|
+
hostFailures.clear();
|
|
410
|
+
Deferred.doneUnsafe(stopped, Exit.fail(new ExecutorExecutionError("executor_cancelled", "The Worker run ended.")));
|
|
411
|
+
})), Effect.ensuring(Scope.close(resources, Exit.void)));
|
|
412
|
+
});
|
|
413
|
+
const lease = {
|
|
414
|
+
waitMs: permit.waitMs,
|
|
415
|
+
execute: (code, providers) => runEdge(execute(code, providers)),
|
|
416
|
+
release() {
|
|
417
|
+
if (released)
|
|
418
|
+
return;
|
|
419
|
+
released = true;
|
|
420
|
+
hostProviders = undefined;
|
|
421
|
+
prepared = undefined;
|
|
422
|
+
hostFailures.clear();
|
|
423
|
+
// Only synchronous SDK disposers inhabit this scope. They run before
|
|
424
|
+
// release returns, even if evaluate never settles or a disposer throws.
|
|
425
|
+
void detach(Scope.close(resources, Exit.void));
|
|
426
|
+
Deferred.doneUnsafe(stopped, Exit.fail(new ExecutorExecutionError("executor_cancelled", "Worker executor lease was released during execution.")));
|
|
427
|
+
active.delete(lease);
|
|
428
|
+
permit.release();
|
|
429
|
+
},
|
|
430
|
+
};
|
|
431
|
+
provideExecutorProgram(lease, execute);
|
|
432
|
+
active.add(lease);
|
|
433
|
+
return lease;
|
|
434
|
+
});
|
|
435
|
+
const acquireShell = (request) => runEdge(acquire(request));
|
|
436
|
+
const executor = {
|
|
437
|
+
name: "DynamicWorkerExecutor",
|
|
438
|
+
acquire: acquireShell,
|
|
439
|
+
execute: (code, providers) => runEdge(execute(code, providers)),
|
|
428
440
|
admissionSnapshot: () => admission.snapshot(),
|
|
429
441
|
close() {
|
|
430
442
|
admission.close();
|
|
431
443
|
for (const lease of active)
|
|
432
444
|
lease.release();
|
|
433
445
|
},
|
|
434
|
-
}
|
|
446
|
+
};
|
|
447
|
+
const execute = (code, providers) => Effect.scoped(Effect.gen(function* () {
|
|
448
|
+
const lease = yield* Effect.acquireRelease(Effect.suspend(() => executor.acquire !== acquireShell || admission.activeCount >= admission.concurrency
|
|
449
|
+
? awaitExecutorLease((signal) => executor.acquire({ signal }))
|
|
450
|
+
: acquire()), (lease) => Effect.sync(() => lease.release()), { interruptible: true });
|
|
451
|
+
return yield* executorProgram(lease, code, providers);
|
|
452
|
+
}));
|
|
453
|
+
provideExecutorProgram(executor, execute);
|
|
454
|
+
return brandExecutor(executor, "leased");
|
|
435
455
|
}
|