@zackbart/connecta 0.34.1 → 0.35.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 +363 -0
- package/README.md +62 -106
- 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 +2051 -1160
- 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 +663 -271
- 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 +12 -7
- package/dist/connectors/api-connector.js +142 -56
- 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 +228 -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 +383 -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/agents.d.ts +5 -4
- package/dist/operator-ui/agents.js +17 -7
- package/dist/operator-ui/config-summary.js +5 -4
- package/dist/operator-ui/connection-map.js +7 -5
- package/dist/operator-ui/contract.d.ts +7 -3
- package/dist/operator-ui/endpoints.js +4 -13
- package/dist/operator-ui/fix-prompts.d.ts +1 -1
- package/dist/operator-ui/fix-prompts.js +0 -8
- package/dist/operator-ui/generated.js +3 -3
- package/dist/operator-ui/model.d.ts +2 -3
- package/dist/operator-ui/overview.js +5 -2
- package/dist/operator-ui/setup-commands.js +0 -4
- package/dist/operator-ui/view.d.ts +2 -25
- package/dist/operator-ui/view.js +2 -76
- 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 +537 -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/dispatch.js +3 -23
- package/dist/providers/_shared/rest/kit.js +546 -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/tools.js +101 -78
- 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 +802 -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 +1024 -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/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 +734 -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 +66 -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 +3 -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 +556 -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 -222
- 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 +7 -109
- 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 +27 -7
- package/documentation/architecture.md +2547 -226
- package/documentation/auth.md +821 -98
- 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 +68 -45
- 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 +965 -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 +27 -46
- 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/providers/_shared/request-token.js +0 -83
- 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/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
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Optional native capabilities, with no SQL or platform implementation imports.
|
|
2
|
+
// Custom KVStorage implementations continue through the existing Promise lift.
|
|
3
|
+
import { Effect } from "effect";
|
|
4
|
+
// Match the custom Promise-store lift: operation construction, validation and
|
|
5
|
+
// decoding throws are ordinary failures with the exact thrown value. Interrupt
|
|
6
|
+
// reasons stay interrupts; catchDefect never recovers cancellation.
|
|
7
|
+
const typed = (operation) => Effect.suspend(operation).pipe(Effect.catchDefect((error) => Effect.fail(error)));
|
|
8
|
+
const storage = new WeakMap();
|
|
9
|
+
const storageMethods = new WeakMap();
|
|
10
|
+
const activity = new WeakMap();
|
|
11
|
+
/** Recheck identity when the operation runs, even for an already-selected program. */
|
|
12
|
+
function current(receiver, key, own, args, native) {
|
|
13
|
+
return typed(() => {
|
|
14
|
+
const method = Reflect.get(receiver, key);
|
|
15
|
+
return method === own
|
|
16
|
+
? native()
|
|
17
|
+
: Effect.tryPromise({
|
|
18
|
+
try: () => Promise.resolve(Reflect.apply(method, receiver, args)),
|
|
19
|
+
catch: (error) => error,
|
|
20
|
+
});
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export function registerNativeStorage(edge, native) {
|
|
24
|
+
const own = { get: edge.get, set: edge.set, delete: edge.delete, list: edge.list, compareAndSet: edge.compareAndSet };
|
|
25
|
+
storageMethods.set(edge, own);
|
|
26
|
+
storage.set(edge, {
|
|
27
|
+
get: (key) => current(edge, "get", own.get, [key], () => native.get(key)),
|
|
28
|
+
set: (key, value, options) => current(edge, "set", own.set, [key, value, options], () => native.set(key, value, options)),
|
|
29
|
+
delete: (key) => current(edge, "delete", own.delete, [key], () => native.delete(key)),
|
|
30
|
+
list: (prefix) => current(edge, "list", own.list, [prefix], () => native.list(prefix)),
|
|
31
|
+
compareAndSet: (key, expected, next, options) => current(edge, "compareAndSet", own.compareAndSet, [key, expected, next, options], () => native.compareAndSet(key, expected, next, options)),
|
|
32
|
+
});
|
|
33
|
+
return edge;
|
|
34
|
+
}
|
|
35
|
+
/** Capability presence does not authorize bypassing a current override. */
|
|
36
|
+
export function hasNativeStorage(edge) {
|
|
37
|
+
return storage.has(edge);
|
|
38
|
+
}
|
|
39
|
+
export function getNativeStorage(edge) {
|
|
40
|
+
const own = storageMethods.get(edge);
|
|
41
|
+
return own &&
|
|
42
|
+
own.get === edge.get &&
|
|
43
|
+
own.set === edge.set &&
|
|
44
|
+
own.delete === edge.delete &&
|
|
45
|
+
own.list === edge.list &&
|
|
46
|
+
own.compareAndSet === edge.compareAndSet
|
|
47
|
+
? storage.get(edge)
|
|
48
|
+
: undefined;
|
|
49
|
+
}
|
|
50
|
+
const activityMethods = new WeakMap();
|
|
51
|
+
export function registerNativeActivity(edge, native) {
|
|
52
|
+
const own = { record: edge.record, list: edge.list };
|
|
53
|
+
activityMethods.set(edge, own);
|
|
54
|
+
activity.set(edge, {
|
|
55
|
+
record: (event) => current(edge, "record", own.record, [event], () => native.record(event)),
|
|
56
|
+
list: (options) => current(edge, "list", own.list, [options], () => native.list(options)),
|
|
57
|
+
});
|
|
58
|
+
return edge;
|
|
59
|
+
}
|
|
60
|
+
export function getNativeActivity(edge) {
|
|
61
|
+
const own = activityMethods.get(edge);
|
|
62
|
+
return own && own.record === edge.record && own.list === edge.list ? activity.get(edge) : undefined;
|
|
63
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Private native programs for the published Promise registry. Static class
|
|
2
|
+
// blocks install them without adding members to its published declaration.
|
|
3
|
+
import { Effect } from "effect";
|
|
4
|
+
const programs = new WeakMap();
|
|
5
|
+
export function provideRegistryPrograms(prototype, entries) {
|
|
6
|
+
programs.set(prototype, new Map(Object.entries(entries).map(([name, run]) => [name, { own: Reflect.get(prototype, name), run }])));
|
|
7
|
+
}
|
|
8
|
+
/** A Promise method runs its own implementation, even when a wrapper calls the original. */
|
|
9
|
+
export function registryEdgeProgram(prototype, view, key, ...args) {
|
|
10
|
+
return Effect.suspend(() => programs
|
|
11
|
+
.get(prototype)
|
|
12
|
+
.get(key)
|
|
13
|
+
.run(view, ...args)).pipe(Effect.catchDefect((error) => Effect.fail(error)));
|
|
14
|
+
}
|
|
15
|
+
/** Custom registry methods are real Promise leaves; registered methods compose directly. */
|
|
16
|
+
export function registryProgram(view, key, ...args) {
|
|
17
|
+
return Effect.suspend(() => {
|
|
18
|
+
const own = view[key];
|
|
19
|
+
const entry = programs.get(Object.getPrototypeOf(view))?.get(key);
|
|
20
|
+
return entry?.own === own
|
|
21
|
+
? entry.run(view, ...args)
|
|
22
|
+
: Effect.tryPromise({
|
|
23
|
+
try: () => Reflect.apply(own, view, args),
|
|
24
|
+
catch: (error) => error,
|
|
25
|
+
});
|
|
26
|
+
}).pipe(Effect.catchDefect((error) => Effect.fail(error)));
|
|
27
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// One owner per existing upstream request identity. Facts survive revocation;
|
|
2
|
+
// retaining them never reconstitutes a call capability or a live operation.
|
|
3
|
+
import { Context, Exit, Scope } from "effect";
|
|
4
|
+
import { detach } from "./run.js";
|
|
5
|
+
export class RequestOwner {
|
|
6
|
+
identity;
|
|
7
|
+
open = true;
|
|
8
|
+
admitted = false;
|
|
9
|
+
controller = new AbortController();
|
|
10
|
+
finalizers = [];
|
|
11
|
+
entries = new Set();
|
|
12
|
+
calls = new Set();
|
|
13
|
+
signals = new WeakMap();
|
|
14
|
+
scope = Scope.makeUnsafe();
|
|
15
|
+
// Initialize secrets only when data is sent. Metadata-only UI imports must
|
|
16
|
+
// not retain the payload matcher merely to revoke a request.
|
|
17
|
+
retained = {
|
|
18
|
+
secrets: undefined,
|
|
19
|
+
invocations: { entered: [], authFailures: new Map(), retryReads: new Map() },
|
|
20
|
+
handoffs: undefined,
|
|
21
|
+
};
|
|
22
|
+
constructor(identity) {
|
|
23
|
+
this.identity = identity;
|
|
24
|
+
}
|
|
25
|
+
own(finalizer) {
|
|
26
|
+
if (this.open)
|
|
27
|
+
this.finalizers.push(finalizer);
|
|
28
|
+
else
|
|
29
|
+
finalizer();
|
|
30
|
+
}
|
|
31
|
+
close() {
|
|
32
|
+
if (!this.open)
|
|
33
|
+
return;
|
|
34
|
+
this.open = false;
|
|
35
|
+
const failures = [];
|
|
36
|
+
const attempt = (step) => {
|
|
37
|
+
try {
|
|
38
|
+
step();
|
|
39
|
+
}
|
|
40
|
+
catch (failure) {
|
|
41
|
+
failures.push(failure);
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
for (const call of this.calls) {
|
|
45
|
+
try {
|
|
46
|
+
call.close();
|
|
47
|
+
}
|
|
48
|
+
catch (failure) {
|
|
49
|
+
failures.push(...(failure instanceof AggregateError ? failure.errors : [failure]));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
this.calls.clear();
|
|
53
|
+
this.entries.clear();
|
|
54
|
+
attempt(() => this.controller.abort(new Error("The request ended.")));
|
|
55
|
+
for (const finalizer of this.finalizers.splice(0).reverse())
|
|
56
|
+
attempt(finalizer);
|
|
57
|
+
// A synchronous published close revokes first. The runtime scope contains
|
|
58
|
+
// only native children and their cleanup; it cannot renew live authority.
|
|
59
|
+
void detach(Scope.close(this.scope, Exit.void));
|
|
60
|
+
if (failures.length)
|
|
61
|
+
throw new AggregateError(failures, `Closing the request: ${failures.length} cleanup step(s) failed.`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
export class RequestScope extends Context.Service()("connecta/request/Scope") {
|
|
65
|
+
}
|
|
66
|
+
const requests = new WeakMap();
|
|
67
|
+
export function requestOwner(identity) {
|
|
68
|
+
let owner = requests.get(identity);
|
|
69
|
+
if (!owner)
|
|
70
|
+
requests.set(identity, (owner = new RequestOwner(identity)));
|
|
71
|
+
return owner;
|
|
72
|
+
}
|
package/dist/runtime/run.js
CHANGED
|
@@ -31,7 +31,7 @@ function setMicrotask(task) {
|
|
|
31
31
|
};
|
|
32
32
|
}
|
|
33
33
|
/** The scheduler every edge-run fiber uses; see the header for why. */
|
|
34
|
-
|
|
34
|
+
const microtaskScheduler = new Scheduler.MixedScheduler("async", setMicrotask);
|
|
35
35
|
const runExit = Effect.runPromiseExitWith(Context.make(Scheduler.Scheduler, microtaskScheduler));
|
|
36
36
|
function abortReason(signal) {
|
|
37
37
|
return signal && signal.reason !== undefined ? signal.reason : new DOMException("aborted", "AbortError");
|
|
@@ -44,18 +44,18 @@ function abortReason(signal) {
|
|
|
44
44
|
* then the first defect — never a wrapper, because callers check `instanceof`,
|
|
45
45
|
* `name`, and `message` on connecta's own error classes.
|
|
46
46
|
*/
|
|
47
|
-
function
|
|
47
|
+
export function causeError(cause, signal) {
|
|
48
48
|
const reasons = cause.reasons;
|
|
49
49
|
if (signal?.aborted && reasons.some(Cause.isInterruptReason)) {
|
|
50
|
-
|
|
50
|
+
return abortReason(signal);
|
|
51
51
|
}
|
|
52
52
|
const failure = reasons.find(Cause.isFailReason);
|
|
53
53
|
if (failure)
|
|
54
|
-
|
|
54
|
+
return failure.error;
|
|
55
55
|
const defect = reasons.find(Cause.isDieReason);
|
|
56
56
|
if (defect)
|
|
57
|
-
|
|
58
|
-
|
|
57
|
+
return defect.defect;
|
|
58
|
+
return abortReason(signal);
|
|
59
59
|
}
|
|
60
60
|
/**
|
|
61
61
|
* Run an effect at a Promise boundary.
|
|
@@ -69,7 +69,7 @@ export async function runEdge(effect, options = {}) {
|
|
|
69
69
|
const exit = await runExit(effect, options.signal ? { signal: options.signal } : undefined);
|
|
70
70
|
if (Exit.isSuccess(exit))
|
|
71
71
|
return exit.value;
|
|
72
|
-
|
|
72
|
+
throw causeError(exit.cause, options.signal);
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
75
|
* Fail with the signal's abort reason once it aborts; never succeed.
|
|
@@ -149,3 +149,11 @@ export function detach(effect, ctx) {
|
|
|
149
149
|
ctx?.waitUntil?.(settled);
|
|
150
150
|
return settled;
|
|
151
151
|
}
|
|
152
|
+
/** Native children of one request, independent of any individual waiter. */
|
|
153
|
+
export function forkRequest(effect, scope) {
|
|
154
|
+
return forkOwned(effect, scope);
|
|
155
|
+
}
|
|
156
|
+
/** A native host child owned by an explicit run or process Scope. */
|
|
157
|
+
export function forkOwned(effect, scope) {
|
|
158
|
+
return Effect.forkIn(effect, scope, { startImmediately: true });
|
|
159
|
+
}
|
|
@@ -14,25 +14,54 @@
|
|
|
14
14
|
// is waited on only by that request's fibers, which is why a plain count of
|
|
15
15
|
// readers is enough and no edge is needed between them.
|
|
16
16
|
import { Deferred, Effect, Exit } from "effect";
|
|
17
|
+
import { forkRequest } from "./run.js";
|
|
18
|
+
import { requestOwner } from "./request-scope.js";
|
|
17
19
|
export class SharedRead {
|
|
20
|
+
read;
|
|
18
21
|
onEnd;
|
|
22
|
+
request;
|
|
19
23
|
controller = new AbortController();
|
|
20
24
|
outcome = Deferred.makeUnsafe();
|
|
21
25
|
readers = 0;
|
|
22
26
|
ended = false;
|
|
27
|
+
started = false;
|
|
28
|
+
releaseRequest;
|
|
23
29
|
/**
|
|
24
|
-
*
|
|
30
|
+
* The first join starts `read` under a signal the read owns. `onEnd` runs once:
|
|
25
31
|
* when the read settles, with whether it succeeded, or when it is cancelled
|
|
26
32
|
* first, with `false`. It runs before any reader hears the outcome, so an
|
|
27
33
|
* owner that evicts the read there sends a reader who retries on hearing of
|
|
28
34
|
* a failure to a fresh read, never back to this one.
|
|
29
35
|
*/
|
|
30
|
-
constructor(read, onEnd = () => { }) {
|
|
36
|
+
constructor(read, onEnd = () => { }, request = {}) {
|
|
37
|
+
this.read = read;
|
|
31
38
|
this.onEnd = onEnd;
|
|
32
|
-
|
|
33
|
-
|
|
39
|
+
this.request = request;
|
|
40
|
+
}
|
|
41
|
+
start() {
|
|
42
|
+
return Effect.gen({ self: this }, function* () {
|
|
43
|
+
if (this.started)
|
|
44
|
+
return;
|
|
45
|
+
this.started = true;
|
|
46
|
+
const owner = requestOwner(this.request);
|
|
47
|
+
if (!owner.open) {
|
|
48
|
+
this.cancel(owner.controller.signal.reason);
|
|
49
|
+
this.settle(Exit.fail(owner.controller.signal.reason));
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const close = () => this.cancel(owner.controller.signal.reason);
|
|
53
|
+
owner.own(close);
|
|
54
|
+
this.releaseRequest = () => {
|
|
55
|
+
const index = owner.finalizers.indexOf(close);
|
|
56
|
+
if (index !== -1)
|
|
57
|
+
owner.finalizers.splice(index, 1);
|
|
58
|
+
};
|
|
59
|
+
yield* forkRequest(Effect.suspend(() => this.read(this.controller.signal)).pipe(Effect.onExit((exit) => Effect.sync(() => this.settle(exit)))), owner.scope);
|
|
60
|
+
});
|
|
34
61
|
}
|
|
35
62
|
settle(exit) {
|
|
63
|
+
this.releaseRequest?.();
|
|
64
|
+
this.releaseRequest = undefined;
|
|
36
65
|
this.end(Exit.isSuccess(exit));
|
|
37
66
|
Deferred.doneUnsafe(this.outcome, exit);
|
|
38
67
|
}
|
|
@@ -74,7 +103,7 @@ export class SharedRead {
|
|
|
74
103
|
if (this.readers === 0)
|
|
75
104
|
this.cancel(signal?.reason);
|
|
76
105
|
});
|
|
77
|
-
const answer = Deferred.await(this.outcome);
|
|
106
|
+
const answer = this.start().pipe(Effect.andThen(Deferred.await(this.outcome)));
|
|
78
107
|
const own = signal ? Effect.raceFirst(answer, this.leftBy(signal)) : answer;
|
|
79
108
|
return Effect.ensuring(own, leave);
|
|
80
109
|
});
|
package/dist/runtime/storage.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
//
|
|
3
3
|
// KVStorage stays Promise-shaped: it is what a deployment author implements,
|
|
4
4
|
// and nobody should need Effect to write a storage adapter. The operations
|
|
5
|
-
// below
|
|
6
|
-
//
|
|
7
|
-
//
|
|
5
|
+
// below compose a registered built-in native program, or lift one custom
|
|
6
|
+
// adapter call, using the Storage service. Failures retain the original thrown
|
|
7
|
+
// object so warnings keep the same checked facts.
|
|
8
8
|
//
|
|
9
9
|
// Which Storage a program sees is the registry's decision, not the runtime's.
|
|
10
10
|
// The Connecta runtime (src/runtime/services.ts) is keyed by the root
|
|
@@ -20,36 +20,49 @@
|
|
|
20
20
|
// because its capacity is deployment-wide.
|
|
21
21
|
import { Context, Effect } from "effect";
|
|
22
22
|
import { runEdge } from "./run.js";
|
|
23
|
+
import { getNativeStorage } from "./native-storage.js";
|
|
23
24
|
import { Logger, Storage } from "./services.js";
|
|
24
25
|
/** Read one key; null when absent. */
|
|
25
26
|
export function storageGet(key) {
|
|
26
|
-
return Storage.use((storage) =>
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
27
|
+
return Storage.use((storage) => getNativeStorage(storage)?.get(key) ??
|
|
28
|
+
Effect.tryPromise({
|
|
29
|
+
// Promise.resolve keeps an adapter that answers synchronously working,
|
|
30
|
+
// as `await` did; a synchronous throw is caught either way.
|
|
31
|
+
try: () => Promise.resolve(storage.get(key)),
|
|
32
|
+
catch: (error) => error,
|
|
33
|
+
}));
|
|
32
34
|
}
|
|
33
35
|
/** Write one key, with the adapter's optional TTL. */
|
|
34
36
|
export function storageSet(key, value, options) {
|
|
35
|
-
return Storage.use((storage) =>
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
return Storage.use((storage) => getNativeStorage(storage)?.set(key, value, options) ??
|
|
38
|
+
Effect.tryPromise({
|
|
39
|
+
try: () => Promise.resolve(storage.set(key, value, options)),
|
|
40
|
+
catch: (error) => error,
|
|
41
|
+
}));
|
|
39
42
|
}
|
|
40
43
|
/** Delete one key. */
|
|
41
44
|
export function storageDelete(key) {
|
|
42
|
-
return Storage.use((storage) =>
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
45
|
+
return Storage.use((storage) => getNativeStorage(storage)?.delete(key) ??
|
|
46
|
+
Effect.tryPromise({
|
|
47
|
+
try: () => Promise.resolve(storage.delete(key)),
|
|
48
|
+
catch: (error) => error,
|
|
49
|
+
}));
|
|
46
50
|
}
|
|
47
51
|
/** Atomic compare-and-set of one key, as `KVStorage.compareAndSet`. */
|
|
48
52
|
export function storageCompareAndSet(key, expected, next, options) {
|
|
49
|
-
return Storage.use((storage) =>
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
return Storage.use((storage) => getNativeStorage(storage)?.compareAndSet(key, expected, next, options) ??
|
|
54
|
+
Effect.tryPromise({
|
|
55
|
+
try: () => Promise.resolve(storage.compareAndSet(key, expected, next, options)),
|
|
56
|
+
catch: (error) => error,
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
/** List keys under one literal prefix, preserving the adapter's ordering. */
|
|
60
|
+
export function storageList(prefix) {
|
|
61
|
+
return Storage.use((storage) => getNativeStorage(storage)?.list(prefix) ??
|
|
62
|
+
Effect.tryPromise({
|
|
63
|
+
try: () => Promise.resolve(storage.list(prefix)),
|
|
64
|
+
catch: (error) => error,
|
|
65
|
+
}));
|
|
53
66
|
}
|
|
54
67
|
// One context per partition object, built on first use. A registry's options
|
|
55
68
|
// object lives exactly as long as the registry, so the WeakMap never holds a
|