@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
|
@@ -20,7 +20,9 @@ import { msg } from "../errors.js";
|
|
|
20
20
|
import { InvocationFailure } from "../invocation.js";
|
|
21
21
|
import { brandExecutor } from "../executor-contract.js";
|
|
22
22
|
import { MAX_EXECUTE_LOG_CHARS } from "../executor-result.js";
|
|
23
|
-
import {
|
|
23
|
+
import { admit } from "../runtime/admission.js";
|
|
24
|
+
import { awaitExecutorLease, executorProgram, provideExecutorProgram } from "../runtime/executor.js";
|
|
25
|
+
import { detach, forkOwned, fromSignal, runEdge } from "../runtime/run.js";
|
|
24
26
|
import { hostCallLabel, MAX_QUICKJS_IPC_BYTES, MAX_QUICKJS_RESULT_BYTES, QUICKJS_RESULT_CHUNK_CHARS, MAX_QUICKJS_HOST_RPC_BYTES, serializedBytes, stringifyBounded, } from "./quickjs-protocol.js";
|
|
25
27
|
export { normalizeCode } from "./quickjs-runtime.js";
|
|
26
28
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
@@ -114,6 +116,7 @@ function terminate(child) {
|
|
|
114
116
|
]);
|
|
115
117
|
});
|
|
116
118
|
}
|
|
119
|
+
let providePoolProgram;
|
|
117
120
|
class QuickJsChildPool {
|
|
118
121
|
/** What `/health` and `connecta doctor` call this sandbox (#368). */
|
|
119
122
|
name = "QuickJS";
|
|
@@ -147,66 +150,87 @@ class QuickJsChildPool {
|
|
|
147
150
|
}));
|
|
148
151
|
this.available = [...this.slots];
|
|
149
152
|
}
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
153
|
+
acquire(options = {}) {
|
|
154
|
+
return runEdge(this.acquireProgram(options));
|
|
155
|
+
}
|
|
156
|
+
acquireProgram(options = {}) {
|
|
157
|
+
return Effect.gen({ self: this }, function* () {
|
|
158
|
+
const admission = yield* admit(this.admission, options);
|
|
159
|
+
const slot = this.available.shift();
|
|
160
|
+
if (!slot) {
|
|
161
|
+
admission.release();
|
|
162
|
+
return yield* Effect.fail(new Error("Executor admission invariant failed: no child slot."));
|
|
163
|
+
}
|
|
164
|
+
let released = false;
|
|
165
|
+
let executed = false;
|
|
166
|
+
const logs = [];
|
|
167
|
+
const stopped = Deferred.makeUnsafe();
|
|
168
|
+
const execute = (code, providers) => Effect.suspend(() => {
|
|
162
169
|
if (released)
|
|
163
|
-
|
|
170
|
+
return Effect.fail(new Error("Executor lease was already released."));
|
|
164
171
|
if (executed)
|
|
165
|
-
|
|
172
|
+
return Effect.fail(new Error("Executor lease may execute only once."));
|
|
166
173
|
executed = true;
|
|
167
|
-
return
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
174
|
+
return Effect.raceFirst(this.run(slot, code, providers, options.signal, logs), Deferred.await(stopped));
|
|
175
|
+
});
|
|
176
|
+
const lease = {
|
|
177
|
+
waitMs: admission.waitMs,
|
|
178
|
+
execute: (code, providers) => runEdge(execute(code, providers)),
|
|
179
|
+
release: () => {
|
|
180
|
+
if (released)
|
|
181
|
+
return;
|
|
182
|
+
released = true;
|
|
183
|
+
// Revoke ownership before a successor can see the slot. A release
|
|
184
|
+
// during readiness/backoff also interrupts the old run, even though
|
|
185
|
+
// slot.active does not exist yet; the warm child may keep starting.
|
|
186
|
+
if (slot.active) {
|
|
187
|
+
this.rejectActive(slot, new Error("Executor lease was released during execution."));
|
|
188
|
+
this.recycle(slot);
|
|
189
|
+
}
|
|
190
|
+
Deferred.doneUnsafe(stopped, Exit.fail(new Error("Executor lease was released during execution.")));
|
|
191
|
+
this.available.push(slot);
|
|
192
|
+
admission.release();
|
|
193
|
+
},
|
|
194
|
+
};
|
|
195
|
+
provideExecutorProgram(lease, execute, () => logs);
|
|
196
|
+
return lease;
|
|
197
|
+
});
|
|
183
198
|
}
|
|
184
199
|
admissionSnapshot() {
|
|
185
200
|
return this.admission.snapshot();
|
|
186
201
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
try {
|
|
190
|
-
return await lease.execute(code, providers);
|
|
191
|
-
}
|
|
192
|
-
finally {
|
|
193
|
-
lease.release();
|
|
194
|
-
}
|
|
202
|
+
execute(code, providers) {
|
|
203
|
+
return runEdge(this.executeProgram(code, providers));
|
|
195
204
|
}
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
205
|
+
executeProgram(code, providers) {
|
|
206
|
+
return Effect.scoped(Effect.gen({ self: this }, function* () {
|
|
207
|
+
const lease = yield* Effect.acquireRelease(Effect.suspend(() => this.acquire !== QuickJsChildPool.prototype.acquire ||
|
|
208
|
+
this.admission.activeCount >= this.admission.concurrency
|
|
209
|
+
? awaitExecutorLease((signal) => this.acquire({ signal }))
|
|
210
|
+
: this.acquireProgram()), (lease) => Effect.sync(() => lease.release()), { interruptible: true });
|
|
211
|
+
return yield* executorProgram(lease, code, providers);
|
|
212
|
+
}));
|
|
213
|
+
}
|
|
214
|
+
close() {
|
|
215
|
+
return runEdge(Effect.gen({ self: this }, function* () {
|
|
216
|
+
if (this.closed)
|
|
217
|
+
return;
|
|
218
|
+
this.closed = true;
|
|
219
|
+
this.admission.close();
|
|
220
|
+
for (const slot of this.slots)
|
|
221
|
+
this.stopSlot(slot);
|
|
222
|
+
yield* Effect.forEach([...this.retiring], (finished) => Deferred.await(finished), { discard: true });
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
static {
|
|
226
|
+
// Register each instance without publishing native methods or Effect types.
|
|
227
|
+
providePoolProgram = (pool) => provideExecutorProgram(pool, (code, providers) => pool.executeProgram(code, providers));
|
|
204
228
|
}
|
|
205
229
|
// One execution on a leased slot: a ready child, the run message, then the
|
|
206
230
|
// outcome raced against the wall deadline and the caller's abort. Either of
|
|
207
231
|
// those settles the outcome and recycles the child; the race's losers are
|
|
208
232
|
// interrupted, which clears their timer and abort listener.
|
|
209
|
-
run(slot, code, providers, signal) {
|
|
233
|
+
run(slot, code, providers, signal, logs = []) {
|
|
210
234
|
return Effect.gen({ self: this }, function* () {
|
|
211
235
|
if (signal?.aborted) {
|
|
212
236
|
return yield* Effect.fail(cancelled("Execution was cancelled before it started."));
|
|
@@ -242,12 +266,13 @@ class QuickJsChildPool {
|
|
|
242
266
|
child.channel?.ref();
|
|
243
267
|
const active = {
|
|
244
268
|
id,
|
|
245
|
-
logs
|
|
269
|
+
logs,
|
|
246
270
|
logChars: 0,
|
|
247
271
|
resultChunks: [],
|
|
248
272
|
resultBytes: 0,
|
|
249
273
|
providers: providerMap,
|
|
250
274
|
outcome: Deferred.makeUnsafe(),
|
|
275
|
+
hosts: Scope.makeUnsafe(),
|
|
251
276
|
};
|
|
252
277
|
slot.active = active;
|
|
253
278
|
try {
|
|
@@ -288,7 +313,12 @@ class QuickJsChildPool {
|
|
|
288
313
|
if (signal) {
|
|
289
314
|
contenders.push(fromSignal(signal).pipe(Effect.catch(() => endWith(cancelled("Execution was cancelled.")))));
|
|
290
315
|
}
|
|
291
|
-
return yield* Effect.raceAllFirst(contenders)
|
|
316
|
+
return yield* Effect.raceAllFirst(contenders).pipe(Effect.onInterrupt(() => Effect.sync(() => {
|
|
317
|
+
if (slot.active !== active)
|
|
318
|
+
return;
|
|
319
|
+
this.rejectActive(slot, new Error("Executor execution was interrupted."));
|
|
320
|
+
this.recycle(slot);
|
|
321
|
+
})));
|
|
292
322
|
});
|
|
293
323
|
}
|
|
294
324
|
// A ready child on the slot: the warm one, or a new one once any crash
|
|
@@ -341,7 +371,7 @@ class QuickJsChildPool {
|
|
|
341
371
|
"@zackbart/connecta/quickjs) when bundling the server."));
|
|
342
372
|
}
|
|
343
373
|
const scope = Scope.makeUnsafe();
|
|
344
|
-
return Effect.acquireRelease(Effect.sync(() => this.forkChild(slot, scope, childPath, sourceMode)).pipe(Effect.tap((child) =>
|
|
374
|
+
return Effect.acquireRelease(Effect.sync(() => this.forkChild(slot, scope, childPath, sourceMode)).pipe(Effect.tap((child) => forkOwned(this.startupWatchdog(slot, child), scope))), terminate).pipe(Scope.provide(scope));
|
|
345
375
|
});
|
|
346
376
|
}
|
|
347
377
|
// Fails a child that never reports ready. It lives in the child's Scope,
|
|
@@ -375,7 +405,7 @@ class QuickJsChildPool {
|
|
|
375
405
|
subprocess.stderr?.unref?.();
|
|
376
406
|
slot.child = child;
|
|
377
407
|
subprocess.on("message", (message) => {
|
|
378
|
-
|
|
408
|
+
this.onMessage(slot, child, message);
|
|
379
409
|
});
|
|
380
410
|
subprocess.on("error", (error) => {
|
|
381
411
|
if (slot.child !== child)
|
|
@@ -411,7 +441,7 @@ class QuickJsChildPool {
|
|
|
411
441
|
subprocess.channel?.unref();
|
|
412
442
|
return child;
|
|
413
443
|
}
|
|
414
|
-
|
|
444
|
+
onMessage(slot, child, message) {
|
|
415
445
|
// A compromised child is exactly the adversary this process boundary
|
|
416
446
|
// contains, and this handler's rejection would crash the serving process.
|
|
417
447
|
// Refuse malformed intake before touching any field.
|
|
@@ -455,7 +485,7 @@ class QuickJsChildPool {
|
|
|
455
485
|
if (message.type === "host-call") {
|
|
456
486
|
if (message.jobId !== active.id)
|
|
457
487
|
return;
|
|
458
|
-
|
|
488
|
+
void detach(forkOwned(this.handleHostCall(slot, child.process, active, message), active.hosts));
|
|
459
489
|
return;
|
|
460
490
|
}
|
|
461
491
|
if ((message.type !== "result" && message.type !== "result-chunk") || message.jobId !== active.id)
|
|
@@ -499,66 +529,78 @@ class QuickJsChildPool {
|
|
|
499
529
|
this.recycle(slot);
|
|
500
530
|
}
|
|
501
531
|
}
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
532
|
+
handleHostCall(slot, child, active, message) {
|
|
533
|
+
return Effect.gen({ self: this }, function* () {
|
|
534
|
+
let payloadJson;
|
|
535
|
+
try {
|
|
536
|
+
if (serializedBytes(message.payloadJson) > MAX_QUICKJS_HOST_RPC_BYTES) {
|
|
537
|
+
// Refused before parsing, so there is no address to name here: parsing
|
|
538
|
+
// an over-limit payload to improve its error message would spend the
|
|
539
|
+
// work the limit exists to refuse.
|
|
540
|
+
throw new RangeError("Host call arguments exceeded the IPC limit.");
|
|
541
|
+
}
|
|
542
|
+
const payload = JSON.parse(message.payloadJson);
|
|
543
|
+
const provider = active.providers.get(payload.namespace);
|
|
544
|
+
const fn = provider && Object.hasOwn(provider.fns, payload.functionName)
|
|
545
|
+
? provider.fns[payload.functionName]
|
|
546
|
+
: undefined;
|
|
547
|
+
if (!fn) {
|
|
548
|
+
throw new Error(`Unknown function ${payload.namespace}.${payload.functionName}`);
|
|
549
|
+
}
|
|
550
|
+
// The provider is an ordinary Promise leaf. Its host fiber belongs to
|
|
551
|
+
// this run and is interrupted when the child settles or is recycled.
|
|
552
|
+
const result = yield* Effect.result(Effect.tryPromise({ try: () => Promise.resolve(fn(...payload.args)), catch: (error) => error }));
|
|
553
|
+
if (result._tag === "Failure") {
|
|
554
|
+
payloadJson = errorPayload(result.failure);
|
|
555
|
+
}
|
|
556
|
+
else {
|
|
557
|
+
const value = result.success;
|
|
558
|
+
try {
|
|
559
|
+
payloadJson = stringifyBounded({ ok: true, value }, `Host result from ${hostCallLabel(payload)}`, MAX_QUICKJS_HOST_RPC_BYTES);
|
|
560
|
+
}
|
|
561
|
+
catch (err) {
|
|
562
|
+
// The guest reads this text, so it names the address the program called
|
|
563
|
+
// rather than only the generic connecta.call bridge function.
|
|
564
|
+
const label = hostCallLabel(payload);
|
|
565
|
+
const detail = err instanceof RangeError
|
|
566
|
+
? `Host result from ${label} exceeds the ${MAX_QUICKJS_HOST_RPC_BYTES}-byte serialized bridge limit.`
|
|
567
|
+
: `Host result from ${label} could not be serialized: ${msg(err)}`;
|
|
568
|
+
payloadJson = errorPayload(detail);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
catch (err) {
|
|
573
|
+
payloadJson = errorPayload(err);
|
|
574
|
+
}
|
|
575
|
+
if (!child.connected || slot.active !== active)
|
|
576
|
+
return;
|
|
577
|
+
const response = {
|
|
578
|
+
type: "host-result",
|
|
579
|
+
jobId: message.jobId,
|
|
580
|
+
callId: message.callId,
|
|
581
|
+
payloadJson,
|
|
582
|
+
};
|
|
583
|
+
try {
|
|
584
|
+
stringifyBounded(response, "QuickJS host-result IPC envelope");
|
|
510
585
|
}
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
if (!fn) {
|
|
515
|
-
throw new Error(`Unknown function ${payload.namespace}.${payload.functionName}`);
|
|
586
|
+
catch {
|
|
587
|
+
// L6/X10: settle the rejected call even if the outer encoding overflows.
|
|
588
|
+
response.payloadJson = errorPayload(`QuickJS host-result IPC envelope could not be serialized within the ${MAX_QUICKJS_IPC_BYTES}-byte IPC limit.`);
|
|
516
589
|
}
|
|
517
|
-
const
|
|
590
|
+
const failedSend = (error) => {
|
|
591
|
+
if (!error || slot.active !== active)
|
|
592
|
+
return;
|
|
593
|
+
this.rejectActive(slot, error);
|
|
594
|
+
this.recycle(slot);
|
|
595
|
+
};
|
|
518
596
|
try {
|
|
519
|
-
|
|
597
|
+
stringifyBounded(response, "QuickJS host-result IPC envelope");
|
|
598
|
+
child.send(response, failedSend);
|
|
520
599
|
}
|
|
521
600
|
catch (err) {
|
|
522
|
-
|
|
523
|
-
// rather than only the generic connecta.call bridge function.
|
|
524
|
-
const label = hostCallLabel(payload);
|
|
525
|
-
const detail = err instanceof RangeError
|
|
526
|
-
? `Host result from ${label} exceeds the ${MAX_QUICKJS_HOST_RPC_BYTES}-byte serialized bridge limit.`
|
|
527
|
-
: `Host result from ${label} could not be serialized: ${msg(err)}`;
|
|
528
|
-
payloadJson = errorPayload(detail);
|
|
601
|
+
failedSend(err instanceof Error ? err : new Error(msg(err)));
|
|
529
602
|
}
|
|
530
|
-
}
|
|
531
|
-
catch (err) {
|
|
532
|
-
payloadJson = errorPayload(err);
|
|
533
|
-
}
|
|
534
|
-
if (!child.connected || slot.active !== active)
|
|
535
|
-
return;
|
|
536
|
-
const response = {
|
|
537
|
-
type: "host-result",
|
|
538
|
-
jobId: message.jobId,
|
|
539
|
-
callId: message.callId,
|
|
540
|
-
payloadJson,
|
|
541
|
-
};
|
|
542
|
-
try {
|
|
543
|
-
stringifyBounded(response, "QuickJS host-result IPC envelope");
|
|
544
|
-
}
|
|
545
|
-
catch {
|
|
546
|
-
// L6/X10: settle the rejected call even if the outer encoding overflows.
|
|
547
|
-
response.payloadJson = errorPayload(`QuickJS host-result IPC envelope could not be serialized within the ${MAX_QUICKJS_IPC_BYTES}-byte IPC limit.`);
|
|
548
|
-
}
|
|
549
|
-
const failedSend = (error) => {
|
|
550
|
-
if (!error || slot.active !== active)
|
|
551
|
-
return;
|
|
552
|
-
this.rejectActive(slot, error);
|
|
553
|
-
this.recycle(slot);
|
|
554
|
-
};
|
|
555
|
-
try {
|
|
556
|
-
stringifyBounded(response, "QuickJS host-result IPC envelope");
|
|
557
|
-
child.send(response, failedSend);
|
|
558
|
-
}
|
|
559
|
-
catch (err) {
|
|
560
|
-
failedSend(err instanceof Error ? err : new Error(msg(err)));
|
|
561
|
-
}
|
|
603
|
+
}).pipe(Effect.catchDefect(() => Effect.void));
|
|
562
604
|
}
|
|
563
605
|
resolveActive(slot, outcome) {
|
|
564
606
|
const active = slot.active;
|
|
@@ -580,7 +622,11 @@ class QuickJsChildPool {
|
|
|
580
622
|
Deferred.doneUnsafe(active.outcome, Exit.fail(error));
|
|
581
623
|
}
|
|
582
624
|
clearActive(slot) {
|
|
625
|
+
const active = slot.active;
|
|
583
626
|
slot.active = undefined;
|
|
627
|
+
active?.providers.clear();
|
|
628
|
+
if (active)
|
|
629
|
+
void detach(Scope.close(active.hosts, Exit.void));
|
|
584
630
|
slot.child?.process.unref();
|
|
585
631
|
slot.child?.process.channel?.unref();
|
|
586
632
|
}
|
|
@@ -617,9 +663,12 @@ class QuickJsChildPool {
|
|
|
617
663
|
slot.child = undefined;
|
|
618
664
|
if (!child.retired) {
|
|
619
665
|
child.retired = true;
|
|
620
|
-
const
|
|
621
|
-
this.retiring.add(
|
|
622
|
-
void
|
|
666
|
+
const finished = Deferred.makeUnsafe();
|
|
667
|
+
this.retiring.add(finished);
|
|
668
|
+
void detach(Scope.close(child.scope, Exit.void).pipe(Effect.ensuring(Effect.sync(() => {
|
|
669
|
+
this.retiring.delete(finished);
|
|
670
|
+
Deferred.doneUnsafe(finished, Exit.void);
|
|
671
|
+
}))));
|
|
623
672
|
}
|
|
624
673
|
if (readyError)
|
|
625
674
|
Deferred.doneUnsafe(child.ready, Exit.fail(readyError));
|
|
@@ -631,5 +680,7 @@ class QuickJsChildPool {
|
|
|
631
680
|
* double-acquire deadlock at concurrency 1.
|
|
632
681
|
*/
|
|
633
682
|
export function quickJsExecutor(options = {}) {
|
|
634
|
-
|
|
683
|
+
const pool = new QuickJsChildPool(options);
|
|
684
|
+
providePoolProgram(pool);
|
|
685
|
+
return brandExecutor(pool, "leased");
|
|
635
686
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// The plain runtime slot keeps the HTTP kit and Node sender off the root
|
|
2
|
+
// and Worker graphs. /node installs its sender when listen() starts serving.
|
|
3
|
+
import { ConnectorCallError } from "./errors.js";
|
|
4
|
+
let owned;
|
|
5
|
+
/** Runtime configuration, never request data. Returns the previous slot for isolated fixtures. */
|
|
6
|
+
export function configureGuardedTransport(transport) {
|
|
7
|
+
const previous = owned;
|
|
8
|
+
owned = transport;
|
|
9
|
+
return previous;
|
|
10
|
+
}
|
|
11
|
+
export function guardedTransport(write) {
|
|
12
|
+
if (owned)
|
|
13
|
+
return owned;
|
|
14
|
+
const node = typeof globalThis.WebSocketPair === "undefined" &&
|
|
15
|
+
typeof process !== "undefined" &&
|
|
16
|
+
process.versions?.node !== undefined;
|
|
17
|
+
if (node && write) {
|
|
18
|
+
throw new ConnectorCallError("connector_call_failed", "Guarded writes on Node require the owned transport: serve with listen from @zackbart/connecta/node.", { retryable: false });
|
|
19
|
+
}
|
|
20
|
+
// workerd supplies its native network implementation, with manual redirects.
|
|
21
|
+
// Node reads can use native fetch without claiming a single physical attempt.
|
|
22
|
+
return { send: (url, init) => globalThis.fetch(url, init) };
|
|
23
|
+
}
|
|
24
|
+
/** Legacy/fake senders dispatch immediately; the owned sender may first establish a tunnel. */
|
|
25
|
+
export function sendGuarded(transport, url, init, beforeDispatch) {
|
|
26
|
+
if (transport.delaysDispatch)
|
|
27
|
+
return transport.send(url, init, beforeDispatch);
|
|
28
|
+
beforeDispatch();
|
|
29
|
+
return transport.send(url, init);
|
|
30
|
+
}
|
|
31
|
+
/** SDK-authenticated token/registration/revocation POST, with no physical replay or redirect. */
|
|
32
|
+
export async function sendCredentialPost(input, init, beforeDispatch = () => { }) {
|
|
33
|
+
const transport = guardedTransport(true);
|
|
34
|
+
try {
|
|
35
|
+
if ((init.method ?? "GET").toUpperCase() !== "POST")
|
|
36
|
+
throw new Error("Expected credential POST.");
|
|
37
|
+
return await sendGuarded(transport, new URL(input), { ...init, redirect: "manual" }, beforeDispatch);
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
if (init.signal?.aborted)
|
|
41
|
+
throw init.signal.reason;
|
|
42
|
+
if (error instanceof ConnectorCallError)
|
|
43
|
+
throw error;
|
|
44
|
+
// SDKs may log transport errors. No native exception/cause can quote a form,
|
|
45
|
+
// client secret, grant, request header or credential-bearing endpoint here.
|
|
46
|
+
throw new ConnectorCallError("connector_call_failed", "OAuth credential request did not return a confirmed response.", {
|
|
47
|
+
retryable: false,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
package/dist/guest-runtime.js
CHANGED
|
@@ -224,7 +224,7 @@ export function programError(raw, code) {
|
|
|
224
224
|
/(?:const|let|var|function|\()\s*connecta\b/.test(code)) {
|
|
225
225
|
hint = "Do not shadow connecta. Use the host-provided connecta global.";
|
|
226
226
|
}
|
|
227
|
-
else if (/callTool
|
|
227
|
+
else if (/callTool|\bskills\b|connecta\.(?:guide|skills)/.test(message) ||
|
|
228
228
|
(["TypeError", "ReferenceError"].includes(name) && /connecta\.(?:guide|skills)\b/.test(code))) {
|
|
229
229
|
hint =
|
|
230
230
|
"Use connecta.call(address, args), connecta.search, connecta.describe, connecta.result, and connecta.skill(name). Services are addressed by connector.tool, never guest globals.";
|