@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
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
import { ConnectorCallError } from "../../errors.js";
|
|
2
|
-
import { target, workflowPath } from "./scope.js";
|
|
3
|
-
// Exact reviewed ownership map. New upstream names, arguments and methods
|
|
4
|
-
// require review before they can authenticate or dispatch.
|
|
5
|
-
export const HOSTED_ROUTES = {
|
|
6
|
-
get_file_contents: {
|
|
7
|
-
verdict: "read",
|
|
8
|
-
permissions: { "contents": "read" },
|
|
9
|
-
keys: ["fields", "owner", "path", "ref", "repo", "sha"],
|
|
10
|
-
},
|
|
11
|
-
get_commit: {
|
|
12
|
-
verdict: "read",
|
|
13
|
-
permissions: { "contents": "read" },
|
|
14
|
-
keys: ["detail", "owner", "page", "perPage", "repo", "sha"],
|
|
15
|
-
},
|
|
16
|
-
list_commits: {
|
|
17
|
-
verdict: "read",
|
|
18
|
-
permissions: { "contents": "read" },
|
|
19
|
-
keys: ["author", "fields", "owner", "page", "path", "perPage", "repo", "sha", "since", "until"],
|
|
20
|
-
},
|
|
21
|
-
list_branches: { verdict: "read", permissions: { "contents": "read" }, keys: ["owner", "page", "perPage", "repo"] },
|
|
22
|
-
get_tag: { verdict: "read", permissions: { "contents": "read" }, keys: ["owner", "repo", "tag"] },
|
|
23
|
-
list_tags: { verdict: "read", permissions: { "contents": "read" }, keys: ["owner", "page", "perPage", "repo"] },
|
|
24
|
-
get_latest_release: { verdict: "read", permissions: { "contents": "read" }, keys: ["owner", "repo"] },
|
|
25
|
-
get_release_by_tag: { verdict: "read", permissions: { "contents": "read" }, keys: ["owner", "repo", "tag"] },
|
|
26
|
-
list_releases: {
|
|
27
|
-
verdict: "read",
|
|
28
|
-
permissions: { "contents": "read" },
|
|
29
|
-
keys: ["fields", "owner", "page", "perPage", "repo"],
|
|
30
|
-
},
|
|
31
|
-
list_issues: {
|
|
32
|
-
verdict: "read",
|
|
33
|
-
permissions: { "issues": "read", "pull_requests": "read" },
|
|
34
|
-
keys: [
|
|
35
|
-
"after",
|
|
36
|
-
"direction",
|
|
37
|
-
"field_filters",
|
|
38
|
-
"fields",
|
|
39
|
-
"labels",
|
|
40
|
-
"orderBy",
|
|
41
|
-
"owner",
|
|
42
|
-
"perPage",
|
|
43
|
-
"repo",
|
|
44
|
-
"since",
|
|
45
|
-
"state",
|
|
46
|
-
],
|
|
47
|
-
},
|
|
48
|
-
issue_read: {
|
|
49
|
-
verdict: "read",
|
|
50
|
-
permissions: { "issues": "read" },
|
|
51
|
-
keys: ["issue_number", "method", "owner", "page", "perPage", "repo"],
|
|
52
|
-
methods: ["get", "get_comments", "get_labels"],
|
|
53
|
-
},
|
|
54
|
-
get_label: { verdict: "read", permissions: { "issues": "read" }, keys: ["name", "owner", "repo"] },
|
|
55
|
-
list_pull_requests: {
|
|
56
|
-
verdict: "read",
|
|
57
|
-
permissions: { "pull_requests": "read" },
|
|
58
|
-
keys: ["base", "direction", "fields", "head", "owner", "page", "perPage", "repo", "sort", "state"],
|
|
59
|
-
},
|
|
60
|
-
pull_request_read: {
|
|
61
|
-
verdict: "read",
|
|
62
|
-
permissions: { "pull_requests": "read", "contents": "read", "checks": "read", "statuses": "read" },
|
|
63
|
-
keys: ["after", "method", "owner", "page", "perPage", "pullNumber", "repo"],
|
|
64
|
-
methods: [
|
|
65
|
-
"get",
|
|
66
|
-
"get_diff",
|
|
67
|
-
"get_status",
|
|
68
|
-
"get_files",
|
|
69
|
-
"get_commits",
|
|
70
|
-
"get_review_comments",
|
|
71
|
-
"get_reviews",
|
|
72
|
-
"get_comments",
|
|
73
|
-
"get_check_runs",
|
|
74
|
-
],
|
|
75
|
-
},
|
|
76
|
-
actions_list: {
|
|
77
|
-
verdict: "read",
|
|
78
|
-
permissions: { "actions": "read" },
|
|
79
|
-
keys: ["method", "owner", "page", "perPage", "repo", "resource_id", "workflow_jobs_filter", "workflow_runs_filter"],
|
|
80
|
-
methods: ["list_workflows", "list_workflow_runs", "list_workflow_jobs", "list_workflow_run_artifacts"],
|
|
81
|
-
},
|
|
82
|
-
actions_get: {
|
|
83
|
-
verdict: "read",
|
|
84
|
-
permissions: { "actions": "read" },
|
|
85
|
-
keys: ["method", "owner", "repo", "resource_id"],
|
|
86
|
-
methods: ["get_workflow", "get_workflow_run", "get_workflow_run_usage", "get_workflow_job"],
|
|
87
|
-
},
|
|
88
|
-
issue_write: {
|
|
89
|
-
verdict: "destructive",
|
|
90
|
-
permissions: { "issues": "write", "pull_requests": "write" },
|
|
91
|
-
keys: [
|
|
92
|
-
"assignees",
|
|
93
|
-
"body",
|
|
94
|
-
"duplicate_of",
|
|
95
|
-
"issue_fields",
|
|
96
|
-
"issue_number",
|
|
97
|
-
"labels",
|
|
98
|
-
"method",
|
|
99
|
-
"milestone",
|
|
100
|
-
"owner",
|
|
101
|
-
"parent_issue_number",
|
|
102
|
-
"parent_owner",
|
|
103
|
-
"parent_repo",
|
|
104
|
-
"repo",
|
|
105
|
-
"state",
|
|
106
|
-
"state_reason",
|
|
107
|
-
"title",
|
|
108
|
-
"type",
|
|
109
|
-
],
|
|
110
|
-
methods: ["create", "update"],
|
|
111
|
-
},
|
|
112
|
-
add_issue_comment: {
|
|
113
|
-
verdict: "write",
|
|
114
|
-
permissions: { "issues": "write", "pull_requests": "write" },
|
|
115
|
-
keys: ["body", "comment_id", "issue_number", "owner", "reaction", "repo"],
|
|
116
|
-
},
|
|
117
|
-
create_pull_request: {
|
|
118
|
-
verdict: "write",
|
|
119
|
-
permissions: { "pull_requests": "write" },
|
|
120
|
-
keys: ["base", "body", "draft", "head", "maintainer_can_modify", "owner", "repo", "reviewers", "title"],
|
|
121
|
-
},
|
|
122
|
-
update_pull_request: {
|
|
123
|
-
verdict: "destructive",
|
|
124
|
-
permissions: { "pull_requests": "write" },
|
|
125
|
-
keys: [
|
|
126
|
-
"base",
|
|
127
|
-
"body",
|
|
128
|
-
"draft",
|
|
129
|
-
"maintainer_can_modify",
|
|
130
|
-
"owner",
|
|
131
|
-
"pullNumber",
|
|
132
|
-
"repo",
|
|
133
|
-
"reviewers",
|
|
134
|
-
"state",
|
|
135
|
-
"title",
|
|
136
|
-
],
|
|
137
|
-
},
|
|
138
|
-
pull_request_review_write: {
|
|
139
|
-
verdict: "destructive",
|
|
140
|
-
permissions: { "pull_requests": "write" },
|
|
141
|
-
keys: ["body", "commitID", "event", "method", "owner", "pullNumber", "repo", "threadId"],
|
|
142
|
-
methods: ["create", "submit_pending", "delete_pending"],
|
|
143
|
-
},
|
|
144
|
-
create_branch: {
|
|
145
|
-
verdict: "write",
|
|
146
|
-
permissions: { "contents": "write" },
|
|
147
|
-
keys: ["branch", "from_branch", "owner", "repo"],
|
|
148
|
-
},
|
|
149
|
-
create_or_update_file: {
|
|
150
|
-
verdict: "destructive",
|
|
151
|
-
permissions: { "contents": "write" },
|
|
152
|
-
keys: ["allow_symlink_write", "branch", "content", "message", "owner", "path", "repo", "sha"],
|
|
153
|
-
},
|
|
154
|
-
delete_file: {
|
|
155
|
-
verdict: "destructive",
|
|
156
|
-
permissions: { "contents": "write" },
|
|
157
|
-
keys: ["branch", "message", "owner", "path", "repo"],
|
|
158
|
-
},
|
|
159
|
-
push_files: {
|
|
160
|
-
verdict: "destructive",
|
|
161
|
-
permissions: { "contents": "write" },
|
|
162
|
-
keys: ["branch", "files", "message", "owner", "repo"],
|
|
163
|
-
},
|
|
164
|
-
actions_run_trigger: {
|
|
165
|
-
verdict: "destructive",
|
|
166
|
-
permissions: { "actions": "write" },
|
|
167
|
-
keys: ["inputs", "method", "owner", "ref", "repo", "run_id", "workflow_id"],
|
|
168
|
-
methods: ["run_workflow", "rerun_workflow_run", "rerun_failed_jobs", "cancel_workflow_run"],
|
|
169
|
-
},
|
|
170
|
-
};
|
|
171
|
-
export const HOSTED_CLASSIFICATION = {
|
|
172
|
-
unlisted: "hide",
|
|
173
|
-
tools: Object.fromEntries(Object.entries(HOSTED_ROUTES).map(([name, route]) => [name, route.verdict])),
|
|
174
|
-
};
|
|
175
|
-
export function hostedTarget(name, input, policy) {
|
|
176
|
-
const route = Object.hasOwn(HOSTED_ROUTES, name) ? HOSTED_ROUTES[name] : undefined;
|
|
177
|
-
if (!route)
|
|
178
|
-
throw new ConnectorCallError("invalid_args", "This GitHub tool is not in the reviewed allowlist.");
|
|
179
|
-
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
180
|
-
throw new ConnectorCallError("invalid_args", "Supply GitHub arguments as an object.");
|
|
181
|
-
const args = input;
|
|
182
|
-
const t = target(args.owner, args.repo);
|
|
183
|
-
policy.scope(t, route.verdict !== "read");
|
|
184
|
-
if (Object.keys(args).some((key) => !route.keys.includes(key)))
|
|
185
|
-
throw new ConnectorCallError("invalid_args", "Unreviewed GitHub arguments are refused; use the reviewed tool schema.");
|
|
186
|
-
if (route.methods && !route.methods.includes(String(args.method)))
|
|
187
|
-
throw new ConnectorCallError("invalid_args", "This GitHub method is not in the reviewed allowlist.");
|
|
188
|
-
// Secondary repositories and opaque review-thread IDs cannot choose a grant.
|
|
189
|
-
if (args.parent_owner !== undefined ||
|
|
190
|
-
args.parent_repo !== undefined ||
|
|
191
|
-
args.threadId !== undefined ||
|
|
192
|
-
args.comment_id !== undefined) {
|
|
193
|
-
throw new ConnectorCallError("invalid_args", "Cross-repository parent references and opaque comment/thread IDs are not supported. Use the scoped repository operation.");
|
|
194
|
-
}
|
|
195
|
-
if (args.allow_symlink_write === true)
|
|
196
|
-
throw new ConnectorCallError("invalid_args", "Symlink writes cannot establish a workflow-file boundary.");
|
|
197
|
-
if (name === "create_pull_request" && (typeof args.head !== "string" || args.head.includes(":")))
|
|
198
|
-
throw new ConnectorCallError("invalid_args", "Create pull requests from a branch in the target repository; cross-owner heads are not supported.");
|
|
199
|
-
let workflows = false;
|
|
200
|
-
if (["create_or_update_file", "delete_file"].includes(name))
|
|
201
|
-
workflows = workflowPath(args.path);
|
|
202
|
-
if (name === "push_files") {
|
|
203
|
-
if (!Array.isArray(args.files) || args.files.length === 0 || args.files.length > 100)
|
|
204
|
-
throw new ConnectorCallError("invalid_args", "Supply between 1 and 100 file changes.");
|
|
205
|
-
for (const file of args.files) {
|
|
206
|
-
if (!file ||
|
|
207
|
-
typeof file !== "object" ||
|
|
208
|
-
Array.isArray(file) ||
|
|
209
|
-
Object.keys(file).some((key) => !["path", "content"].includes(key)))
|
|
210
|
-
throw new ConnectorCallError("invalid_args", "Each file has only path and content fields.");
|
|
211
|
-
workflows = workflowPath(file.path) || workflows;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
if (name === "get_file_contents" && args.path !== undefined && args.path !== "")
|
|
215
|
-
workflowPath(args.path);
|
|
216
|
-
policy.scope(t, route.verdict !== "read", workflows);
|
|
217
|
-
return { target: t, permissions: { ...route.permissions, ...(workflows ? { workflows: "write" } : {}) } };
|
|
218
|
-
}
|
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
import { api } from "../../connectors/api.js";
|
|
2
|
-
import { ConnectorCallError } from "../../errors.js";
|
|
3
|
-
import { target } from "./scope.js";
|
|
4
|
-
const text = (description) => ({ type: "string", minLength: 1, description });
|
|
5
|
-
const ownerRepo = { owner: text("Configured repository owner."), repo: text("Repository name under that owner.") };
|
|
6
|
-
const object = (properties, required = []) => ({
|
|
7
|
-
type: "object",
|
|
8
|
-
properties,
|
|
9
|
-
required,
|
|
10
|
-
additionalProperties: false,
|
|
11
|
-
});
|
|
12
|
-
const integer = (description) => ({ type: "integer", minimum: 1, description });
|
|
13
|
-
const bool = (description) => ({ type: "boolean", description });
|
|
14
|
-
const jsonObject = { type: "object", additionalProperties: true };
|
|
15
|
-
const scopeRecord = object({
|
|
16
|
-
org: { type: "string" },
|
|
17
|
-
repo: { type: "string" },
|
|
18
|
-
access: { type: "string", enum: ["read", "read-write"] },
|
|
19
|
-
workflows: { type: "string", enum: ["write"] },
|
|
20
|
-
}, ["access"]);
|
|
21
|
-
const selector = object({
|
|
22
|
-
org: text("Configured org scope."),
|
|
23
|
-
repo: text("Exact owner/repo within configured scope."),
|
|
24
|
-
});
|
|
25
|
-
const repoPath = (t) => `/repos/${encodeURIComponent(t.owner)}/${encodeURIComponent(t.repo)}`;
|
|
26
|
-
const row = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : {};
|
|
27
|
-
function selectors(input, policy) {
|
|
28
|
-
if (!Array.isArray(input) || input.length === 0 || input.length > 100)
|
|
29
|
-
throw new ConnectorCallError("invalid_args", "Select between 1 and 100 configured scopes.");
|
|
30
|
-
return input.map((item) => {
|
|
31
|
-
const value = row(item);
|
|
32
|
-
if ((value.org === undefined) === (value.repo === undefined))
|
|
33
|
-
throw new ConnectorCallError("invalid_args", "Each selector names either org or repo.");
|
|
34
|
-
if (value.org !== undefined) {
|
|
35
|
-
const owner = policy.owner(value.org);
|
|
36
|
-
const grant = policy.scopes.find((scope) => scope.org === owner);
|
|
37
|
-
if (!grant)
|
|
38
|
-
throw new ConnectorCallError("invalid_args", "This org is not configured for org-wide access.");
|
|
39
|
-
return grant;
|
|
40
|
-
}
|
|
41
|
-
const parts = typeof value.repo === "string" ? value.repo.split("/") : [];
|
|
42
|
-
const t = target(parts[0], parts.length === 2 ? parts[1] : undefined);
|
|
43
|
-
const grant = policy.scope(t);
|
|
44
|
-
return { repo: `${t.owner}/${t.repo}`, access: grant.access };
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
function searchPartitions(scopes) {
|
|
48
|
-
const orgs = new Set(scopes.flatMap((scope) => (scope.org ? [scope.org] : [])));
|
|
49
|
-
const repos = new Map();
|
|
50
|
-
for (const scope of scopes) {
|
|
51
|
-
if (!scope.repo)
|
|
52
|
-
continue;
|
|
53
|
-
const [owner, repo] = scope.repo.split("/");
|
|
54
|
-
if (orgs.has(owner))
|
|
55
|
-
continue;
|
|
56
|
-
if (!repos.has(owner))
|
|
57
|
-
repos.set(owner, new Set());
|
|
58
|
-
repos.get(owner).add(repo);
|
|
59
|
-
}
|
|
60
|
-
const partitions = [...orgs].sort().map((owner) => ({ id: `org:${owner}`, owner, qualifier: `org:${owner}` }));
|
|
61
|
-
const result = [...partitions];
|
|
62
|
-
for (const [owner, names] of [...repos].sort(([a], [b]) => a.localeCompare(b))) {
|
|
63
|
-
const sorted = [...names].sort();
|
|
64
|
-
for (let offset = 0; offset < sorted.length; offset += 5) {
|
|
65
|
-
const chunk = sorted.slice(offset, offset + 5);
|
|
66
|
-
result.push({
|
|
67
|
-
id: chunk.map((repo) => `${owner}/${repo}`).join(","),
|
|
68
|
-
owner,
|
|
69
|
-
repos: chunk,
|
|
70
|
-
qualifier: chunk.map((repo) => `repo:${owner}/${repo}`).join(" "),
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
if (result.length > 20)
|
|
75
|
-
throw new ConnectorCallError("invalid_args", "Search fan-out exceeds 20 partitions. Select fewer scopes.");
|
|
76
|
-
return result;
|
|
77
|
-
}
|
|
78
|
-
function resultTarget(item, kind) {
|
|
79
|
-
if (kind === "repositories" || kind === "code") {
|
|
80
|
-
const name = kind === "code" ? row(item.repository).full_name : item.full_name;
|
|
81
|
-
const parts = typeof name === "string" ? name.split("/") : [];
|
|
82
|
-
return target(parts[0], parts.length === 2 ? parts[1] : undefined);
|
|
83
|
-
}
|
|
84
|
-
let url;
|
|
85
|
-
try {
|
|
86
|
-
url = new URL(item.repository_url);
|
|
87
|
-
}
|
|
88
|
-
catch {
|
|
89
|
-
throw new ConnectorCallError("connector_call_failed", "GitHub search omitted the repository binding.");
|
|
90
|
-
}
|
|
91
|
-
const match = /^\/repos\/([^/]+)\/([^/]+)$/.exec(url.pathname);
|
|
92
|
-
if (url.origin !== "https://api.github.com" || !match || url.search || url.hash)
|
|
93
|
-
throw new ConnectorCallError("connector_call_failed", "GitHub search returned an invalid repository binding.");
|
|
94
|
-
return target(match[1], match[2]);
|
|
95
|
-
}
|
|
96
|
-
export function restConnector(id, auth, policy) {
|
|
97
|
-
const scopedRequest = async (args, permissions, method, suffix, body, ctx) => {
|
|
98
|
-
const t = target(args.owner, args.repo);
|
|
99
|
-
policy.scope(t, true);
|
|
100
|
-
const token = await auth.repo(t, permissions, ctx);
|
|
101
|
-
const data = await auth.json({ method, path: `${repoPath(t)}${suffix}`, ...(body !== undefined ? { body } : {}) }, token, ctx);
|
|
102
|
-
return data ?? { deleted: true };
|
|
103
|
-
};
|
|
104
|
-
const tools = [
|
|
105
|
-
{
|
|
106
|
-
name: "list_scopes",
|
|
107
|
-
description: "List configured GitHub scopes and reachable repositories for one owner.",
|
|
108
|
-
annotations: { readOnlyHint: true },
|
|
109
|
-
inputSchema: object({
|
|
110
|
-
owner: text("Configured owner; omit to return configuration without network access."),
|
|
111
|
-
page: integer("Repository page, default 1, at most 1000."),
|
|
112
|
-
per_page: { ...integer("Repositories per page, default 100."), maximum: 100 },
|
|
113
|
-
}),
|
|
114
|
-
outputSchema: object({
|
|
115
|
-
acting_as: { type: "string" },
|
|
116
|
-
scopes: { type: "array", items: scopeRecord },
|
|
117
|
-
repositories: { type: "array", items: { type: "string" } },
|
|
118
|
-
next_page: { type: ["integer", "null"] },
|
|
119
|
-
}, ["acting_as", "scopes"]),
|
|
120
|
-
async handler(args, ctx) {
|
|
121
|
-
if (args.owner === undefined)
|
|
122
|
-
return { acting_as: "GitHub App", scopes: policy.scopes };
|
|
123
|
-
const owner = policy.owner(args.owner);
|
|
124
|
-
const page = args.page ?? 1;
|
|
125
|
-
const count = args.per_page ?? 100;
|
|
126
|
-
if (page > 1000)
|
|
127
|
-
throw new ConnectorCallError("invalid_args", "Repository page must be at most 1000.");
|
|
128
|
-
const token = await auth.token(owner, undefined, { metadata: "read" }, ctx);
|
|
129
|
-
const data = row(await auth.json({ method: "GET", path: "/installation/repositories", query: { page, per_page: count } }, token, ctx));
|
|
130
|
-
if (!Array.isArray(data.repositories))
|
|
131
|
-
throw new ConnectorCallError("connector_call_failed", "GitHub returned an invalid repository list.");
|
|
132
|
-
const repositories = [];
|
|
133
|
-
for (const item of data.repositories) {
|
|
134
|
-
const repository = row(item);
|
|
135
|
-
const t = resultTarget(repository, "repositories");
|
|
136
|
-
if (t.owner !== owner)
|
|
137
|
-
throw new ConnectorCallError("connector_call_failed", "GitHub returned a repository from another installation owner.");
|
|
138
|
-
await auth.checkResult(t, repository.id, token, ctx);
|
|
139
|
-
repositories.push(`${t.owner}/${t.repo}`);
|
|
140
|
-
}
|
|
141
|
-
return {
|
|
142
|
-
acting_as: "GitHub App",
|
|
143
|
-
scopes: policy.scopes.filter((scope) => scope.org === owner || scope.repo?.startsWith(`${owner}/`)),
|
|
144
|
-
repositories,
|
|
145
|
-
next_page: repositories.length === count ? page + 1 : null,
|
|
146
|
-
};
|
|
147
|
-
},
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
name: "search_scoped",
|
|
151
|
-
description: "Search GitHub repositories, issues, pull requests or code within configured scopes.",
|
|
152
|
-
annotations: { readOnlyHint: true },
|
|
153
|
-
inputSchema: object({
|
|
154
|
-
terms: text("Literal words only; scope qualifiers and Boolean operators are refused."),
|
|
155
|
-
kind: {
|
|
156
|
-
type: "string",
|
|
157
|
-
enum: ["repositories", "issues", "pull-requests", "code"],
|
|
158
|
-
description: "Resource to search.",
|
|
159
|
-
},
|
|
160
|
-
scopes: {
|
|
161
|
-
type: "array",
|
|
162
|
-
minItems: 1,
|
|
163
|
-
maxItems: 100,
|
|
164
|
-
items: selector,
|
|
165
|
-
description: "Optional subset; defaults to all configured scopes.",
|
|
166
|
-
},
|
|
167
|
-
pages: {
|
|
168
|
-
type: "object",
|
|
169
|
-
additionalProperties: { type: "integer", minimum: 1, maximum: 10 },
|
|
170
|
-
description: "Page per returned partition ID, at most 10.",
|
|
171
|
-
},
|
|
172
|
-
per_page: { ...integer("Results per partition, default 30."), maximum: 100 },
|
|
173
|
-
}, ["terms", "kind"]),
|
|
174
|
-
outputSchema: object({ partitions: { type: "array", items: jsonObject }, incomplete_results: { type: "boolean" } }, ["partitions", "incomplete_results"]),
|
|
175
|
-
async handler(args, ctx) {
|
|
176
|
-
if (!/^[a-z0-9_. -]{1,128}$/i.test(args.terms) || /\b(?:OR|NOT|AND)\b/i.test(args.terms))
|
|
177
|
-
throw new ConnectorCallError("invalid_args", "Search terms must be literal words, without qualifiers or Boolean operators.");
|
|
178
|
-
const selected = args.scopes === undefined ? policy.scopes : selectors(args.scopes, policy);
|
|
179
|
-
const partitions = searchPartitions(selected);
|
|
180
|
-
if (Object.keys(args.pages ?? {}).some((key) => !partitions.some((partition) => partition.id === key)))
|
|
181
|
-
throw new ConnectorCallError("invalid_args", "Pagination keys must match the selected search partitions.");
|
|
182
|
-
const type = args.kind === "issues" ? " is:issue" : args.kind === "pull-requests" ? " is:pr" : "";
|
|
183
|
-
const queries = partitions.map((partition) => `${partition.qualifier} ${args.terms.trim()}${type}`);
|
|
184
|
-
if (queries.some((query) => query.length > 256))
|
|
185
|
-
throw new ConnectorCallError("invalid_args", "The scoped search query exceeds GitHub's 256-character bound. Select fewer repositories.");
|
|
186
|
-
const seen = new Set();
|
|
187
|
-
const output = [];
|
|
188
|
-
let incomplete = false;
|
|
189
|
-
for (const partition of partitions) {
|
|
190
|
-
const page = args.pages?.[partition.id] ?? 1;
|
|
191
|
-
const count = args.per_page ?? 30;
|
|
192
|
-
const permissions = args.kind === "repositories"
|
|
193
|
-
? { metadata: "read" }
|
|
194
|
-
: args.kind === "code"
|
|
195
|
-
? { contents: "read" }
|
|
196
|
-
: { issues: "read", pull_requests: "read" };
|
|
197
|
-
const token = await auth.token(partition.owner, partition.repos, permissions, ctx);
|
|
198
|
-
const kind = args.kind === "pull-requests" ? "issues" : args.kind;
|
|
199
|
-
const query = `${partition.qualifier} ${args.terms.trim()}${type}`;
|
|
200
|
-
const data = row(await auth.json({ method: "GET", path: `/search/${kind}`, query: { q: query, page, per_page: count } }, token, ctx));
|
|
201
|
-
if (!Array.isArray(data.items))
|
|
202
|
-
throw new ConnectorCallError("connector_call_failed", "GitHub returned an invalid search result.");
|
|
203
|
-
const items = [];
|
|
204
|
-
for (const value of data.items) {
|
|
205
|
-
const item = row(value);
|
|
206
|
-
const t = resultTarget(item, args.kind);
|
|
207
|
-
policy.owner(t.owner);
|
|
208
|
-
if (t.owner !== partition.owner)
|
|
209
|
-
throw new ConnectorCallError("connector_call_failed", "GitHub search escaped its selected partition; results were withheld.");
|
|
210
|
-
await auth.checkResult(t, args.kind === "repositories" ? item.id : args.kind === "code" ? row(item.repository).id : undefined, token, ctx);
|
|
211
|
-
const key = `${args.kind}:${t.owner}/${t.repo}:${args.kind === "code" ? item.path : item.id}`;
|
|
212
|
-
if (!seen.has(key)) {
|
|
213
|
-
seen.add(key);
|
|
214
|
-
items.push(value);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
const more = data.items.length === count || data.total_count > page * count;
|
|
218
|
-
const limited = data.incomplete_results === true || (more && page === 10);
|
|
219
|
-
incomplete ||= limited;
|
|
220
|
-
output.push({
|
|
221
|
-
scope: partition.id,
|
|
222
|
-
items,
|
|
223
|
-
total_count: data.total_count,
|
|
224
|
-
incomplete_results: limited,
|
|
225
|
-
next_page: more && page < 10 ? page + 1 : null,
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
return { partitions: output, incomplete_results: incomplete };
|
|
229
|
-
},
|
|
230
|
-
},
|
|
231
|
-
{
|
|
232
|
-
name: "create_release",
|
|
233
|
-
description: "Create a GitHub release, optionally as a draft.",
|
|
234
|
-
annotations: { readOnlyHint: false },
|
|
235
|
-
inputSchema: object({
|
|
236
|
-
...ownerRepo,
|
|
237
|
-
tag_name: text("Release tag."),
|
|
238
|
-
target_commitish: text("Branch or commit for a new tag."),
|
|
239
|
-
name: text("Release title."),
|
|
240
|
-
body: { type: "string", description: "Release notes." },
|
|
241
|
-
draft: bool("Create a draft release."),
|
|
242
|
-
prerelease: bool("Mark as a prerelease."),
|
|
243
|
-
}, ["owner", "repo", "tag_name"]),
|
|
244
|
-
outputSchema: jsonObject,
|
|
245
|
-
handler: (args, ctx) => {
|
|
246
|
-
const { owner: _owner, repo: _repo, ...body } = args;
|
|
247
|
-
return scopedRequest(args, { contents: "write" }, "POST", "/releases", body, ctx);
|
|
248
|
-
},
|
|
249
|
-
},
|
|
250
|
-
{
|
|
251
|
-
name: "update_release",
|
|
252
|
-
description: "Update or publish an existing GitHub release.",
|
|
253
|
-
annotations: { readOnlyHint: false, destructiveHint: true },
|
|
254
|
-
inputSchema: object({
|
|
255
|
-
...ownerRepo,
|
|
256
|
-
release_id: integer("Release ID in this repository."),
|
|
257
|
-
tag_name: text("Release tag."),
|
|
258
|
-
name: text("Release title."),
|
|
259
|
-
body: { type: "string", description: "Release notes." },
|
|
260
|
-
draft: bool("Set false to publish a draft."),
|
|
261
|
-
prerelease: bool("Mark as a prerelease."),
|
|
262
|
-
}, ["owner", "repo", "release_id"]),
|
|
263
|
-
outputSchema: jsonObject,
|
|
264
|
-
handler: (args, ctx) => {
|
|
265
|
-
const { owner: _owner, repo: _repo, release_id, ...body } = args;
|
|
266
|
-
return scopedRequest(args, { contents: "write" }, "PATCH", `/releases/${release_id}`, body, ctx);
|
|
267
|
-
},
|
|
268
|
-
},
|
|
269
|
-
{
|
|
270
|
-
name: "delete_release",
|
|
271
|
-
description: "Delete a GitHub release from the scoped repository.",
|
|
272
|
-
annotations: { readOnlyHint: false, destructiveHint: true },
|
|
273
|
-
inputSchema: object({ ...ownerRepo, release_id: integer("Release ID in this repository.") }, [
|
|
274
|
-
"owner",
|
|
275
|
-
"repo",
|
|
276
|
-
"release_id",
|
|
277
|
-
]),
|
|
278
|
-
outputSchema: jsonObject,
|
|
279
|
-
handler: (args, ctx) => scopedRequest(args, { contents: "write" }, "DELETE", `/releases/${args.release_id}`, undefined, ctx),
|
|
280
|
-
},
|
|
281
|
-
{
|
|
282
|
-
name: "merge_pull_request",
|
|
283
|
-
description: "Merge a same-repository GitHub pull request with explicit workflow-write scope.",
|
|
284
|
-
annotations: { readOnlyHint: false, destructiveHint: true },
|
|
285
|
-
inputSchema: object({
|
|
286
|
-
...ownerRepo,
|
|
287
|
-
pull_number: integer("Pull request number."),
|
|
288
|
-
sha: text("Expected head commit SHA; reread after a conflict."),
|
|
289
|
-
merge_method: {
|
|
290
|
-
type: "string",
|
|
291
|
-
enum: ["merge", "squash", "rebase"],
|
|
292
|
-
description: "Merge strategy, default merge.",
|
|
293
|
-
},
|
|
294
|
-
}, ["owner", "repo", "pull_number", "sha"]),
|
|
295
|
-
outputSchema: jsonObject,
|
|
296
|
-
async handler(args, ctx) {
|
|
297
|
-
const t = target(args.owner, args.repo);
|
|
298
|
-
// GitHub's atomic sha guard binds only the head, not the base/ref.
|
|
299
|
-
// Retargeting can turn a file-safe diff into workflow changes. Require
|
|
300
|
-
// explicit workflow permission before any authentication for merges.
|
|
301
|
-
policy.scope(t, true, true);
|
|
302
|
-
const reader = await auth.repo(t, { pull_requests: "read", contents: "read" }, ctx);
|
|
303
|
-
const pr = row(await auth.json({ method: "GET", path: `${repoPath(t)}/pulls/${args.pull_number}` }, reader, ctx));
|
|
304
|
-
const head = row(pr.head);
|
|
305
|
-
const base = row(pr.base);
|
|
306
|
-
if (head.sha !== args.sha ||
|
|
307
|
-
row(head.repo).full_name?.toLowerCase() !== `${t.owner}/${t.repo}` ||
|
|
308
|
-
row(base.repo).full_name?.toLowerCase() !== `${t.owner}/${t.repo}`)
|
|
309
|
-
throw new ConnectorCallError("conflict", "Merge requires the expected head SHA and a same-repository head and base. Reread the pull request.");
|
|
310
|
-
const token = await auth.repo(t, { contents: "write", pull_requests: "write", workflows: "write" }, ctx);
|
|
311
|
-
// GitHub verifies sha atomically. No automatic write retry.
|
|
312
|
-
return auth.json({
|
|
313
|
-
method: "PUT",
|
|
314
|
-
path: `${repoPath(t)}/pulls/${args.pull_number}/merge`,
|
|
315
|
-
body: { sha: args.sha, merge_method: args.merge_method ?? "merge" },
|
|
316
|
-
}, token, ctx);
|
|
317
|
-
},
|
|
318
|
-
},
|
|
319
|
-
];
|
|
320
|
-
return api(id, { tools });
|
|
321
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { type ProviderOptions } from "../../provider.js";
|
|
2
|
-
export declare const INFISICAL_API_BASE_URL = "https://app.infisical.com/api";
|
|
3
|
-
export interface InfisicalOptions extends ProviderOptions {
|
|
4
|
-
/** API base including /api; US cloud by default, EU cloud or self-hosted HTTPS allowed. */
|
|
5
|
-
baseUrl?: string;
|
|
6
|
-
}
|
|
7
|
-
export declare const infisical: import("../../provider.js").ProviderFactory<InfisicalOptions>;
|