@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.
Files changed (429) hide show
  1. package/CHANGELOG.md +363 -0
  2. package/README.md +62 -106
  3. package/SECURITY.md +3 -2
  4. package/bin/connecta.mjs +41 -16
  5. package/bin/version.mjs +1 -1
  6. package/dist/access-tokens.d.ts +2 -1
  7. package/dist/access-tokens.js +66 -30
  8. package/dist/activity.d.ts +1 -1
  9. package/dist/activity.js +2 -0
  10. package/dist/agent-config.d.ts +23 -0
  11. package/dist/agent-config.js +59 -0
  12. package/dist/agent-description.js +16 -0
  13. package/dist/agent-identity.js +4 -4
  14. package/dist/agent-observation.js +39 -0
  15. package/dist/auth/clerk-sdk/client.d.ts +2 -0
  16. package/dist/auth/clerk-sdk/generated.js +554 -563
  17. package/dist/auth/clerk-transport.js +70 -3
  18. package/dist/auth/clerk.d.ts +13 -0
  19. package/dist/auth/clerk.js +653 -246
  20. package/dist/auth/cloudflare-access.js +46 -42
  21. package/dist/auth/downstream-client-metadata.js +2 -2
  22. package/dist/auth/downstream-oauth.js +2051 -1160
  23. package/dist/auth/downstream-revocation.js +88 -88
  24. package/dist/auth/native-call.js +20 -0
  25. package/dist/auth/native.js +184 -0
  26. package/dist/auth/oauth-start-reset.js +11 -5
  27. package/dist/auth/oauth-token-response.js +121 -102
  28. package/dist/auth/oauth-v2-migration.js +97 -78
  29. package/dist/auth/renewable-grant.js +10 -0
  30. package/dist/auth/static-oauth.js +663 -271
  31. package/dist/auth/vercel-agent.js +266 -0
  32. package/dist/auth-admission.js +204 -0
  33. package/dist/auth-elicitation.js +350 -241
  34. package/dist/authorization-handoff.js +164 -90
  35. package/dist/call-admission-context.js +3 -10
  36. package/dist/call-admission.js +2 -0
  37. package/dist/call-classification.js +9 -0
  38. package/dist/call-recovery.js +32 -13
  39. package/dist/canonical-json.js +8 -0
  40. package/dist/catalog-cache.js +369 -213
  41. package/dist/catalog-service.js +659 -530
  42. package/dist/catalog.js +5 -1
  43. package/dist/concurrency.js +0 -25
  44. package/dist/config-defaults.d.ts +1 -0
  45. package/dist/config-defaults.js +1 -0
  46. package/dist/config-schema.d.ts +3 -1
  47. package/dist/config-schema.js +13 -3
  48. package/dist/config.d.ts +40 -6
  49. package/dist/config.js +40 -26
  50. package/dist/connector-caller.d.ts +4 -0
  51. package/dist/connector-caller.js +17 -4
  52. package/dist/connectors/api-connector.d.ts +12 -7
  53. package/dist/connectors/api-connector.js +142 -56
  54. package/dist/connectors/guarded-fetch.d.ts +51 -17
  55. package/dist/connectors/guarded-fetch.js +215 -121
  56. package/dist/connectors/negotiation-cache.js +20 -10
  57. package/dist/connectors/remote-mcp.d.ts +10 -30
  58. package/dist/connectors/remote-mcp.js +955 -563
  59. package/dist/d1.js +10 -243
  60. package/dist/derived-context.js +5 -0
  61. package/dist/describe-config.d.ts +3 -1
  62. package/dist/describe-config.js +2 -0
  63. package/dist/downstream-input.js +347 -260
  64. package/dist/errors.d.ts +87 -6
  65. package/dist/errors.js +114 -4
  66. package/dist/execute.js +87 -50
  67. package/dist/executor-admission.js +3 -0
  68. package/dist/executors/quickjs.js +163 -112
  69. package/dist/guarded-transport.js +50 -0
  70. package/dist/guest-runtime.js +1 -1
  71. package/dist/http/client.js +439 -0
  72. package/dist/http/errors.js +558 -0
  73. package/dist/http/fields.js +49 -0
  74. package/dist/http/hatch-paging.js +318 -0
  75. package/dist/http/hatch.js +1279 -0
  76. package/dist/http/json-schema.js +267 -0
  77. package/dist/http/node-transport.js +241 -0
  78. package/dist/http/oauth.js +162 -0
  79. package/dist/http/paging.js +228 -0
  80. package/dist/http/provider.js +221 -0
  81. package/dist/http/safety.js +82 -0
  82. package/dist/http/services.js +79 -0
  83. package/dist/http/tools.js +383 -0
  84. package/dist/http/vendor-index.js +138 -0
  85. package/dist/http/vendor.js +448 -0
  86. package/dist/http/write-request.js +66 -0
  87. package/dist/http-policy.d.ts +11 -0
  88. package/dist/http-policy.js +45 -0
  89. package/dist/inbound-credential.js +1 -1
  90. package/dist/index.d.ts +2 -2
  91. package/dist/index.js +4 -0
  92. package/dist/invocation-auth.js +30 -19
  93. package/dist/invocation.js +218 -85
  94. package/dist/mcp-result.js +0 -4
  95. package/dist/membership.d.ts +4 -0
  96. package/dist/meta-output.js +1 -1
  97. package/dist/meta-tools.js +531 -406
  98. package/dist/native-recovery.js +52 -0
  99. package/dist/native-tools.js +382 -0
  100. package/dist/node.d.ts +4 -3
  101. package/dist/node.js +45 -8
  102. package/dist/oauth-handoff.js +177 -104
  103. package/dist/oauth-partition.js +6 -20
  104. package/dist/oauth-sealing.js +6 -7
  105. package/dist/operation-vocabulary.js +101 -0
  106. package/dist/operator-record.d.ts +2 -2
  107. package/dist/operator-record.js +17 -4
  108. package/dist/operator-ui/agents.d.ts +5 -4
  109. package/dist/operator-ui/agents.js +17 -7
  110. package/dist/operator-ui/config-summary.js +5 -4
  111. package/dist/operator-ui/connection-map.js +7 -5
  112. package/dist/operator-ui/contract.d.ts +7 -3
  113. package/dist/operator-ui/endpoints.js +4 -13
  114. package/dist/operator-ui/fix-prompts.d.ts +1 -1
  115. package/dist/operator-ui/fix-prompts.js +0 -8
  116. package/dist/operator-ui/generated.js +3 -3
  117. package/dist/operator-ui/model.d.ts +2 -3
  118. package/dist/operator-ui/overview.js +5 -2
  119. package/dist/operator-ui/setup-commands.js +0 -4
  120. package/dist/operator-ui/view.d.ts +2 -25
  121. package/dist/operator-ui/view.js +2 -76
  122. package/dist/program-writes.js +47 -26
  123. package/dist/provider-call-facts.d.ts +115 -0
  124. package/dist/provider-call-facts.js +182 -0
  125. package/dist/provider-call.d.ts +112 -0
  126. package/dist/provider-call.js +271 -0
  127. package/dist/provider.d.ts +65 -31
  128. package/dist/provider.js +116 -39
  129. package/dist/providers/_shared/google/hatch.js +91 -0
  130. package/dist/providers/_shared/google/kit.js +537 -0
  131. package/dist/providers/_shared/google/result-size.js +15 -2
  132. package/dist/providers/_shared/google/service-account.d.ts +2 -1
  133. package/dist/providers/_shared/google/service-account.js +8 -4
  134. package/dist/providers/_shared/google/workspace.d.ts +6 -210
  135. package/dist/providers/_shared/google/workspace.js +6 -425
  136. package/dist/providers/_shared/rest/compact-index.js +86 -0
  137. package/dist/providers/_shared/rest/dispatch.js +3 -23
  138. package/dist/providers/_shared/rest/kit.js +546 -0
  139. package/dist/providers/_shared/rest/operation-index.js +230 -14
  140. package/dist/providers/_shared/rest/response-media.js +11 -0
  141. package/dist/providers/_shared/rest/tools.js +101 -78
  142. package/dist/providers/_shared/rest/value-safety.js +353 -195
  143. package/dist/providers/_shared/sensitive-fields.js +27 -0
  144. package/dist/providers/breeze/api.js +584 -0
  145. package/dist/providers/breeze/index.d.ts +1 -3
  146. package/dist/providers/breeze/index.js +67 -1420
  147. package/dist/providers/breeze/openapi.generated.js +60 -0
  148. package/dist/providers/breeze/skill.generated.js +2 -6
  149. package/dist/providers/breeze/tools.js +696 -0
  150. package/dist/providers/ccb/api.js +496 -0
  151. package/dist/providers/ccb/index.d.ts +15 -37
  152. package/dist/providers/ccb/index.js +77 -1702
  153. package/dist/providers/ccb/lib/constants.d.ts +34 -0
  154. package/dist/providers/ccb/lib/constants.js +74 -0
  155. package/dist/providers/ccb/lib/guide.js +9 -0
  156. package/dist/providers/ccb/lib/verdicts.js +387 -0
  157. package/dist/providers/ccb/openapi.generated.js +397 -0
  158. package/dist/providers/ccb/safety.js +295 -0
  159. package/dist/providers/ccb/skill.generated.js +2 -6
  160. package/dist/providers/ccb/tools.js +853 -0
  161. package/dist/providers/cloudflare/api.js +1066 -0
  162. package/dist/providers/cloudflare/index.d.ts +5 -22
  163. package/dist/providers/cloudflare/index.js +79 -197
  164. package/dist/providers/cloudflare/lib/config.d.ts +16 -0
  165. package/dist/providers/cloudflare/lib/config.js +2 -0
  166. package/dist/providers/cloudflare/lib/discovery.js +29 -0
  167. package/dist/providers/cloudflare/{graphql.js → lib/graphql.js} +1 -1
  168. package/dist/providers/cloudflare/lib/hatch.js +103 -0
  169. package/dist/providers/cloudflare/lib/path-bounds.js +28 -0
  170. package/dist/providers/cloudflare/lib/response-media.js +75 -0
  171. package/dist/providers/cloudflare/openapi.generated.js +4 -3
  172. package/dist/providers/cloudflare/{value-safety.js → safety.js} +487 -0
  173. package/dist/providers/cloudflare/skill.generated.js +2 -10
  174. package/dist/providers/cloudflare/tools.js +360 -0
  175. package/dist/providers/docs/api.js +51 -0
  176. package/dist/providers/docs/index.d.ts +1 -12
  177. package/dist/providers/docs/index.js +53 -1165
  178. package/dist/providers/docs/lib/constants.d.ts +18 -0
  179. package/dist/providers/docs/lib/constants.js +18 -0
  180. package/dist/providers/docs/lib/discovery.js +26 -0
  181. package/dist/providers/docs/lib/requests.js +48 -0
  182. package/dist/providers/docs/lib/schemas.js +168 -0
  183. package/dist/providers/docs/openapi.generated.js +16 -0
  184. package/dist/providers/docs/safety.js +54 -0
  185. package/dist/providers/docs/skill.generated.js +2 -6
  186. package/dist/providers/docs/tools.js +802 -0
  187. package/dist/providers/drive/api.js +177 -0
  188. package/dist/providers/drive/index.d.ts +1 -12
  189. package/dist/providers/drive/index.js +38 -1448
  190. package/dist/providers/drive/lib/constants.d.ts +6 -0
  191. package/dist/providers/drive/lib/constants.js +6 -0
  192. package/dist/providers/drive/lib/contracts.js +532 -0
  193. package/dist/providers/drive/lib/hatch.js +197 -0
  194. package/dist/providers/drive/openapi.generated.js +77 -0
  195. package/dist/providers/drive/safety.js +90 -0
  196. package/dist/providers/drive/skill.generated.js +2 -6
  197. package/dist/providers/drive/tools.js +1290 -0
  198. package/dist/providers/forms/api.js +71 -0
  199. package/dist/providers/forms/index.d.ts +1 -12
  200. package/dist/providers/forms/index.js +49 -1145
  201. package/dist/providers/forms/lib/constants.d.ts +14 -0
  202. package/dist/providers/forms/lib/constants.js +19 -0
  203. package/dist/providers/forms/lib/hatch.js +72 -0
  204. package/dist/providers/forms/openapi.generated.js +23 -0
  205. package/dist/providers/forms/safety.js +34 -0
  206. package/dist/providers/forms/skill.generated.js +2 -8
  207. package/dist/providers/forms/tools.js +1024 -0
  208. package/dist/providers/github/api.js +150 -0
  209. package/dist/providers/github/index.d.ts +4 -5
  210. package/dist/providers/github/index.js +30 -87
  211. package/dist/providers/github/{auth.d.ts → lib/auth.d.ts} +5 -3
  212. package/dist/providers/github/{auth.js → lib/auth.js} +40 -43
  213. package/dist/providers/github/lib/discovery.js +132 -0
  214. package/dist/providers/github/lib/operations.js +58 -0
  215. package/dist/providers/github/{scope.d.ts → lib/scope.d.ts} +2 -0
  216. package/dist/providers/github/{scope.js → lib/scope.js} +25 -1
  217. package/dist/providers/github/openapi.generated.js +1216 -0
  218. package/dist/providers/github/safety.js +216 -0
  219. package/dist/providers/github/skill.generated.js +2 -5
  220. package/dist/providers/github/tools.js +506 -0
  221. package/dist/providers/gmail/api.js +114 -0
  222. package/dist/providers/gmail/index.d.ts +1 -12
  223. package/dist/providers/gmail/index.js +73 -1621
  224. package/dist/providers/gmail/lib/constants.d.ts +13 -0
  225. package/dist/providers/gmail/lib/constants.js +16 -0
  226. package/dist/providers/gmail/lib/index.js +173 -0
  227. package/dist/providers/gmail/lib/schemas.js +176 -0
  228. package/dist/providers/gmail/lib/threading.js +120 -0
  229. package/dist/providers/gmail/openapi.generated.js +92 -0
  230. package/dist/providers/gmail/safety.js +21 -0
  231. package/dist/providers/gmail/skill.generated.js +2 -6
  232. package/dist/providers/gmail/tools.js +1435 -0
  233. package/dist/providers/overflow/api.js +1008 -0
  234. package/dist/providers/overflow/index.d.ts +1 -17
  235. package/dist/providers/overflow/index.js +60 -1488
  236. package/dist/providers/overflow/skill.generated.js +2 -5
  237. package/dist/providers/overflow/tools.js +873 -0
  238. package/dist/providers/planning-center/api.js +467 -0
  239. package/dist/providers/planning-center/index.d.ts +4 -35
  240. package/dist/providers/planning-center/index.js +69 -2445
  241. package/dist/providers/planning-center/lib/constants.d.ts +58 -0
  242. package/dist/providers/planning-center/lib/constants.js +83 -0
  243. package/dist/providers/planning-center/lib/discovery.js +40 -0
  244. package/dist/providers/planning-center/lib/guide.js +39 -0
  245. package/dist/providers/planning-center/lib/json-api.js +83 -0
  246. package/dist/providers/planning-center/lib/verdicts.js +1758 -0
  247. package/dist/providers/planning-center/openapi.generated.js +1764 -0
  248. package/dist/providers/planning-center/safety.js +188 -0
  249. package/dist/providers/planning-center/skill.generated.js +2 -27
  250. package/dist/providers/planning-center/tools.js +1010 -0
  251. package/dist/providers/sheets/api.js +133 -0
  252. package/dist/providers/sheets/index.d.ts +4 -16
  253. package/dist/providers/sheets/index.js +61 -1172
  254. package/dist/providers/sheets/lib/constants.d.ts +14 -0
  255. package/dist/providers/sheets/lib/constants.js +14 -0
  256. package/dist/providers/sheets/lib/hatch.js +163 -0
  257. package/dist/providers/sheets/lib/requests.js +105 -0
  258. package/dist/providers/sheets/lib/schemas.js +138 -0
  259. package/dist/providers/sheets/openapi.generated.js +30 -0
  260. package/dist/providers/sheets/safety.js +27 -0
  261. package/dist/providers/sheets/skill.generated.js +2 -7
  262. package/dist/providers/sheets/tools.js +734 -0
  263. package/dist/providers/slides/api.js +147 -0
  264. package/dist/providers/slides/index.d.ts +2 -10
  265. package/dist/providers/slides/index.js +48 -2555
  266. package/dist/providers/slides/lib/constants.d.ts +11 -0
  267. package/dist/providers/slides/lib/constants.js +11 -0
  268. package/dist/providers/slides/lib/requests.js +60 -0
  269. package/dist/providers/slides/lib/schemas.js +565 -0
  270. package/dist/providers/slides/openapi.generated.js +18 -0
  271. package/dist/providers/slides/skill.generated.js +2 -6
  272. package/dist/providers/slides/tools.js +1968 -0
  273. package/dist/providers/stripe/api.js +401 -0
  274. package/dist/providers/stripe/index.d.ts +5 -27
  275. package/dist/providers/stripe/index.js +74 -210
  276. package/dist/providers/stripe/lib/config.d.ts +4 -0
  277. package/dist/providers/stripe/lib/config.js +2 -0
  278. package/dist/providers/stripe/openapi.generated.js +4 -3
  279. package/dist/providers/stripe/{value-safety.js → safety.js} +5 -5
  280. package/dist/providers/stripe/skill.generated.js +2 -11
  281. package/dist/providers/stripe/tools.js +77 -0
  282. package/dist/providers/tithely/api.js +531 -0
  283. package/dist/providers/tithely/index.d.ts +17 -0
  284. package/dist/providers/tithely/index.js +86 -965
  285. package/dist/providers/tithely/skill.generated.js +2 -5
  286. package/dist/providers/tithely/tools.js +426 -0
  287. package/dist/providers/vercel/api.js +551 -0
  288. package/dist/providers/vercel/index.d.ts +9 -25
  289. package/dist/providers/vercel/index.js +66 -260
  290. package/dist/providers/vercel/lib/config.d.ts +2 -0
  291. package/dist/providers/vercel/lib/config.js +2 -0
  292. package/dist/providers/vercel/lib/index.js +117 -0
  293. package/dist/providers/vercel/lib/logs.js +100 -0
  294. package/dist/providers/vercel/lib/pin.js +270 -0
  295. package/dist/providers/vercel/openapi.generated.js +10 -5
  296. package/dist/providers/vercel/{value-safety.js → safety.js} +247 -38
  297. package/dist/providers/vercel/skill.generated.js +2 -7
  298. package/dist/providers/vercel/tools.js +642 -0
  299. package/dist/redaction-identity.js +47 -0
  300. package/dist/redaction-marker.js +125 -0
  301. package/dist/registry.d.ts +21 -15
  302. package/dist/registry.js +409 -376
  303. package/dist/routes/access-tokens.js +1 -1
  304. package/dist/routes/actor-labels.js +1 -1
  305. package/dist/routes/connect.js +1 -1
  306. package/dist/routes/dispatch.js +103 -0
  307. package/dist/routes/mcp.js +170 -79
  308. package/dist/routes/oauth.js +3 -1
  309. package/dist/routes/operator.js +2 -2
  310. package/dist/routes/shared.d.ts +5 -4
  311. package/dist/routes/shared.js +244 -177
  312. package/dist/routes/skills.js +10 -8
  313. package/dist/routes/ui-config.js +27 -3
  314. package/dist/routes/ui-data.js +21 -20
  315. package/dist/routes/ui.js +1 -1
  316. package/dist/runtime/call-admission.js +0 -26
  317. package/dist/runtime/call-entry.js +30 -0
  318. package/dist/runtime/call.js +556 -0
  319. package/dist/runtime/connector-scope.js +7 -0
  320. package/dist/runtime/credential-probe.js +34 -0
  321. package/dist/runtime/executor.js +40 -0
  322. package/dist/runtime/native-storage.js +63 -0
  323. package/dist/runtime/registry.js +27 -0
  324. package/dist/runtime/request-scope.js +72 -0
  325. package/dist/runtime/run.js +15 -7
  326. package/dist/runtime/shared-read.js +34 -5
  327. package/dist/runtime/storage.js +34 -21
  328. package/dist/sent-secrets.d.ts +194 -37
  329. package/dist/sent-secrets.js +1743 -340
  330. package/dist/server.js +5 -56
  331. package/dist/skills.js +322 -222
  332. package/dist/sqlite.js +15 -14
  333. package/dist/storage/d1-copy.js +255 -0
  334. package/dist/storage/d1-driver.js +15 -0
  335. package/dist/storage/keys.js +28 -0
  336. package/dist/storage/sql-driver.js +88 -0
  337. package/dist/storage/sql-native.js +544 -0
  338. package/dist/storage/sql-schema.d.ts +6 -0
  339. package/dist/storage/sql-schema.js +15 -0
  340. package/dist/storage/sql.d.ts +14 -20
  341. package/dist/storage/sql.js +29 -535
  342. package/dist/timeout.js +0 -26
  343. package/dist/tool-safety.js +20 -10
  344. package/dist/types.d.ts +7 -109
  345. package/dist/upward.js +3 -0
  346. package/dist/usage-guide.js +3 -1
  347. package/dist/validate.d.ts +4 -2
  348. package/dist/validate.js +86 -9
  349. package/dist/version.d.ts +1 -1
  350. package/dist/version.js +1 -1
  351. package/dist/worker.js +312 -292
  352. package/dist/workspace-subject.js +5 -1
  353. package/dist/write-outcome.js +454 -34
  354. package/documentation/README.md +27 -7
  355. package/documentation/architecture.md +2547 -226
  356. package/documentation/auth.md +821 -98
  357. package/documentation/code-mode.md +49 -16
  358. package/documentation/deploying.md +164 -20
  359. package/documentation/hosted-mcp-migration.md +460 -0
  360. package/documentation/integrating.md +129 -144
  361. package/documentation/meta-tools.md +409 -32
  362. package/documentation/operating.md +27 -3
  363. package/documentation/operator-tests.md +3 -0
  364. package/documentation/operator-ui.md +68 -45
  365. package/documentation/provider-auth-migration.md +16 -63
  366. package/documentation/provider-migration-0.29.md +10 -5
  367. package/documentation/provider-migration-0.35.md +975 -0
  368. package/documentation/providers.md +965 -0
  369. package/examples/worker/AGENTS.md +23 -9
  370. package/examples/worker/README.md +254 -135
  371. package/examples/worker/alchemy.run.ts +116 -0
  372. package/examples/worker/gitignore +10 -0
  373. package/examples/worker/src/connecta.config.ts +23 -21
  374. package/examples/worker/wrangler.jsonc +14 -5
  375. package/guides/connecting-agents.md +157 -0
  376. package/guides/how-it-works.md +156 -0
  377. package/guides/safety-and-trust.md +153 -0
  378. package/package.json +27 -46
  379. package/templates/node/.env.example +3 -0
  380. package/templates/node/README.md +22 -2
  381. package/templates/node/docker-compose.yml +1 -0
  382. package/templates/node/package.json +3 -2
  383. package/templates/node/src/connecta.config.ts +8 -0
  384. package/dist/catalog-drift.d.ts +0 -138
  385. package/dist/catalog-drift.js +0 -578
  386. package/dist/providers/_shared/request-token.js +0 -83
  387. package/dist/providers/_shared/rest/operation-index.d.ts +0 -133
  388. package/dist/providers/_shared/rest/tools.d.ts +0 -141
  389. package/dist/providers/_shared/rest/value-safety.d.ts +0 -201
  390. package/dist/providers/basecamp/index.d.ts +0 -45
  391. package/dist/providers/basecamp/index.js +0 -997
  392. package/dist/providers/basecamp/skill.generated.js +0 -9
  393. package/dist/providers/cloudflare/rest.d.ts +0 -37
  394. package/dist/providers/cloudflare/rest.js +0 -1097
  395. package/dist/providers/github/hosted.js +0 -218
  396. package/dist/providers/github/rest.js +0 -321
  397. package/dist/providers/infisical/index.d.ts +0 -7
  398. package/dist/providers/infisical/index.js +0 -713
  399. package/dist/providers/infisical/skill.generated.js +0 -8
  400. package/dist/providers/intercom/index.d.ts +0 -24
  401. package/dist/providers/intercom/index.js +0 -121
  402. package/dist/providers/intercom/skill.generated.js +0 -8
  403. package/dist/providers/linear/index.d.ts +0 -55
  404. package/dist/providers/linear/index.js +0 -537
  405. package/dist/providers/linear/skill.generated.js +0 -8
  406. package/dist/providers/mixpanel/index.d.ts +0 -59
  407. package/dist/providers/mixpanel/index.js +0 -472
  408. package/dist/providers/mixpanel/operations.js +0 -20
  409. package/dist/providers/mixpanel/rest.js +0 -603
  410. package/dist/providers/mixpanel/skill.generated.js +0 -10
  411. package/dist/providers/mixpanel/value-safety.js +0 -16
  412. package/dist/providers/notion/index.d.ts +0 -67
  413. package/dist/providers/notion/index.js +0 -368
  414. package/dist/providers/notion/openapi.generated.js +0 -75
  415. package/dist/providers/notion/rest.d.ts +0 -24
  416. package/dist/providers/notion/rest.js +0 -1226
  417. package/dist/providers/notion/skill.generated.js +0 -11
  418. package/dist/providers/notion/value-safety.js +0 -56
  419. package/dist/providers/revenuecat/index.d.ts +0 -51
  420. package/dist/providers/revenuecat/index.js +0 -697
  421. package/dist/providers/revenuecat/skill.generated.js +0 -11
  422. package/dist/providers/stripe/rest.d.ts +0 -14
  423. package/dist/providers/stripe/rest.js +0 -402
  424. package/dist/providers/vercel/rest.d.ts +0 -20
  425. package/dist/providers/vercel/rest.js +0 -1020
  426. package/dist/providers/wispr-flow/index.d.ts +0 -14
  427. package/dist/providers/wispr-flow/index.js +0 -117
  428. package/dist/providers/wispr-flow/skill.generated.js +0 -8
  429. /package/dist/providers/github/{key.js → lib/key.js} +0 -0
@@ -0,0 +1,116 @@
1
+ /**
2
+ * The Alchemy stack that deploys this Worker: the script, its D1 database,
3
+ * Worker Loader, vars and secrets, the Worker-level Cloudflare Access
4
+ * application with Managed OAuth, and the `/agent/*` bypass application.
5
+ * README.md § "Deploy" walks through it; wrangler.jsonc serves only
6
+ * `wrangler dev`.
7
+ *
8
+ * Deploy, update, and plan with an explicit stage, from this folder:
9
+ * npx alchemy deploy --stage production
10
+ * Alchemy reads CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID, and the two
11
+ * secrets below from the environment or `.env`. Never commit `.env` or
12
+ * `.alchemy/`: local state records secret values in plaintext.
13
+ */
14
+ import * as Alchemy from "alchemy";
15
+ import * as Cloudflare from "alchemy/Cloudflare";
16
+ import * as Output from "alchemy/Output";
17
+ import * as Config from "effect/Config";
18
+ import * as Effect from "effect/Effect";
19
+
20
+ // Who may sign in. Replace with the deployment's own Access rule.
21
+ const signIn = { emailDomain: "example.com" };
22
+
23
+ export default Alchemy.Stack(
24
+ "Connecta",
25
+ { providers: Cloudflare.providers(), state: Alchemy.localState() },
26
+ Effect.gen(function* () {
27
+ // The one database. Retained on destroy: `alchemy destroy` forgets it
28
+ // instead of deleting every grant, credential, and token in it, and the
29
+ // next deploy adopts it again by name. connecta creates its tables.
30
+ const database = yield* Cloudflare.D1.Database("ConnectaDB", { name: "connecta" }).pipe(
31
+ Alchemy.RemovalPolicy.retain(),
32
+ );
33
+
34
+ // Optional R2 bucket, for an api() connector handler that stores files.
35
+ // connecta itself never uses one. Bind it as FILES in env below.
36
+ // const files = yield* Cloudflare.R2.Bucket("Files", { name: "connecta-files" }).pipe(
37
+ // Alchemy.RemovalPolicy.retain(),
38
+ // );
39
+
40
+ // Attached to the Worker itself, so Access supplies ctx.access. Managed
41
+ // OAuth's allowlist must keep all three redirect URIs (AGENTS.md).
42
+ const access = yield* Cloudflare.Access.Application("ConnectaAccess", {
43
+ type: "self_hosted",
44
+ name: "connecta",
45
+ policies: [
46
+ { decision: "allow", include: [signIn] },
47
+ // Admits a service token at the edge for `connecta doctor`'s /health
48
+ // read; connecta refuses service identities on MCP and operator routes.
49
+ // { decision: "non_identity", include: [{ serviceToken: "<service token id>" }] },
50
+ ],
51
+ oauthConfiguration: {
52
+ enabled: true,
53
+ dynamicClientRegistration: {
54
+ enabled: true,
55
+ allowedUris: [
56
+ "https://claude.ai/api/mcp/auth_callback",
57
+ "https://chatgpt.com/connector_platform_oauth_redirect",
58
+ "https://chatgpt.com/connector/oauth/*",
59
+ ],
60
+ },
61
+ },
62
+ });
63
+
64
+ const worker = yield* Cloudflare.Worker("Connecta", {
65
+ name: "connecta",
66
+ main: "./src/index.ts",
67
+ // Keep enable_request_signal: a client disconnect aborts its request.
68
+ // Keep enable_weak_ref: it releases an authentication charge whose
69
+ // cancelled work can never settle.
70
+ compatibility: {
71
+ date: "2025-01-01",
72
+ flags: [
73
+ "nodejs_compat",
74
+ "enable_request_signal",
75
+ "enable_weak_ref",
76
+ "unhandled_rejection_after_microtask_checkpoint",
77
+ ],
78
+ },
79
+ access,
80
+ env: {
81
+ CONNECTA_DB: database,
82
+ // Required by execute_code; Dynamic Workers use the Workers Paid plan.
83
+ LOADER: Cloudflare.WorkerLoader(),
84
+ // FILES: files,
85
+ // The Worker's own URL: its custom domain if any, else workers.dev.
86
+ PUBLIC_URL: Cloudflare.Worker.URL,
87
+ // Comma-separated Access user ids (user_uuid, else email).
88
+ CONNECTA_MAINTAINERS: "operator@example.com",
89
+ // CONNECTA_ACTIVITY: "on",
90
+ // Declare every secret here. Each deploy replaces the Worker's whole
91
+ // binding set, deleting secrets set any other way.
92
+ DOWNSTREAM_TOKEN: Config.Redacted("DOWNSTREAM_TOKEN"),
93
+ CREDENTIAL_ENCRYPTION_KEY: Config.Redacted("CREDENTIAL_ENCRYPTION_KEY"),
94
+ },
95
+ });
96
+
97
+ // Lets agents reach /agent/<pool> with only their cta_ token. It bypasses
98
+ // Access on the Worker's primary URL host and never on any other path.
99
+ const agents = yield* Cloudflare.Access.Application("ConnectaAgents", {
100
+ type: "self_hosted",
101
+ name: "connecta agents",
102
+ destinations: Output.map(worker.url, (url) => [
103
+ { type: "public" as const, uri: `${new URL(url!).host}/agent/*` },
104
+ ]),
105
+ policies: [{ decision: "bypass", include: ["everyone"] }],
106
+ });
107
+
108
+ return {
109
+ url: worker.url,
110
+ workerId: worker.workerId,
111
+ databaseId: database.databaseId,
112
+ accessApplicationId: access.applicationId,
113
+ agentsApplicationId: agents.applicationId,
114
+ };
115
+ }),
116
+ );
@@ -0,0 +1,10 @@
1
+ # Rename this file to .gitignore in a copied deployment, before the first
2
+ # `git add`: npm strips .gitignore files from published packages.
3
+ # Alchemy local state records deployed secret values in plaintext.
4
+ .alchemy/
5
+ .env
6
+ .env.*
7
+ .dev.vars
8
+ .dev.vars.*
9
+ .wrangler/
10
+ node_modules/
@@ -18,29 +18,31 @@
18
18
  * Setup (this example has no package.json of its own — it self-references the
19
19
  * installed `@zackbart/connecta` package):
20
20
  * 1. `pnpm install` in the connecta repository root (../../ from here) so the
21
- * package import and wrangler resolve. A copy in its own repository
22
- * installs `@zackbart/connecta @cloudflare/codemode` instead. Codemode is
23
- * an optional peer.
24
- * 2. `wrangler d1 create connecta` and put its id in wrangler.jsonc under
25
- * `d1_databases`. connecta creates its tables on first use.
26
- * 3. Set secrets:
27
- * wrangler secret put DOWNSTREAM_TOKEN
28
- * wrangler secret put CREDENTIAL_ENCRYPTION_KEY
29
- * and PUBLIC_URL as a plain var in wrangler.jsonc.
30
- * 4. Attach Cloudflare Access to this Worker. Enable Managed OAuth and
21
+ * package import and alchemy resolve. A copy in its own repository
22
+ * installs `@zackbart/connecta @cloudflare/codemode` plus the exact
23
+ * alchemy and effect pins instead (README.md § "Copied into its own
24
+ * repository"). Codemode is an optional peer.
25
+ * 2. alchemy.run.ts declares the deployment: this Worker, its one D1
26
+ * database (connecta creates its tables on first use), the Worker Loader,
27
+ * the vars, and the DOWNSTREAM_TOKEN and CREDENTIAL_ENCRYPTION_KEY
28
+ * secrets, read from the environment or .env at deploy time. Declare
29
+ * every secret there: each deploy removes bindings set any other way.
30
+ * 3. It attaches Cloudflare Access to this Worker with Managed OAuth and
31
31
  * Dynamic Client Registration. Its Allowed redirect URIs must include
32
32
  * Claude's https://claude.ai/api/mcp/auth_callback plus ChatGPT's
33
33
  * https://chatgpt.com/connector_platform_oauth_redirect and
34
34
  * https://chatgpt.com/connector/oauth/* forms (see ../AGENTS.md).
35
- * Then add one self-hosted Access application per hostname for
36
- * `<host>/agent/*` with a single Bypass policy (Everyone), so agents send
37
- * only their cta_ token (README.md § "Let agents through Access").
38
- * 5. Use the Workers Paid plan required by the `worker_loaders` binding.
39
- * 6. List the maintainers' Access user ids (the identity's user_uuid, else
40
- * its email) in the CONNECTA_MAINTAINERS var, comma-separated.
41
- * 7. `wrangler deploy` from this folder (examples/worker), where wrangler.jsonc
42
- * lives. Point a maintainer's MCP client at `<PUBLIC_URL>/mcp`, and an
43
- * agent's at `<PUBLIC_URL>/agent/ci`.
35
+ * A second self-hosted application bypasses Access for
36
+ * `<host>/agent/*` only, so agents send only their cta_ token
37
+ * (README.md § "Let agents through Access").
38
+ * 4. Use the Workers Paid plan required by the Worker Loader binding.
39
+ * 5. List the maintainers' Access user ids (the identity's user_uuid, else
40
+ * its email) in the CONNECTA_MAINTAINERS var, comma-separated, and set
41
+ * the stack's Access sign-in rule.
42
+ * 6. `npx alchemy deploy --stage production` from this folder
43
+ * (examples/worker). Never commit .env or .alchemy/. Point a
44
+ * maintainer's MCP client at `<PUBLIC_URL>/mcp`, and an agent's at
45
+ * `<PUBLIC_URL>/agent/ci`. wrangler.jsonc serves only `wrangler dev`.
44
46
  */
45
47
  import { api, defineConfig, remoteMcp } from "@zackbart/connecta";
46
48
  import { activityHistory } from "@zackbart/connecta/activity";
@@ -67,7 +69,7 @@ export interface Env {
67
69
  /** "on" switches on activity history, in CONNECTA_DB. */
68
70
  CONNECTA_ACTIVITY?: string;
69
71
  /**
70
- * Worker Loader binding (wrangler.jsonc `worker_loaders`) powering
72
+ * Worker Loader binding (alchemy.run.ts `LOADER`) powering
71
73
  * execute_code. Dynamic Workers require the Workers Paid plan.
72
74
  */
73
75
  LOADER: WorkerLoader;
@@ -138,7 +140,7 @@ export default defineConfig((env: Env) => {
138
140
  // with a static key: the operator manages it inside its connection
139
141
  // in the operator UI, so no Worker secret holds it.
140
142
  // type: "credential",
141
- // credential: { label: "Notion internal integration token" },
143
+ // credential: { label: "Downstream token accepted by the hosted server" },
142
144
  },
143
145
  // Use `authScope: "personal"` with OAuth or credential auth when each
144
146
  // Access user connects their own downstream account. Literal headers
@@ -1,13 +1,22 @@
1
+ // Local development only: `wrangler dev` runs this Worker with local D1 and a
2
+ // simulated Access identity. Deploy with alchemy.run.ts, never with this file,
3
+ // and keep its vars, flags, and bindings in step with that stack.
1
4
  {
2
5
  "$schema": "node_modules/wrangler/config-schema.json",
3
6
  "name": "connecta-example",
4
7
  "main": "src/index.ts",
5
8
  "compatibility_date": "2025-01-01",
6
- "compatibility_flags": ["nodejs_compat", "enable_request_signal"],
9
+ "compatibility_flags": [
10
+ "nodejs_compat",
11
+ "enable_request_signal",
12
+ "enable_weak_ref",
13
+ "unhandled_rejection_after_microtask_checkpoint",
14
+ ],
7
15
  "observability": { "enabled": true },
8
16
 
9
- // Plain vars. Secrets (CREDENTIAL_ENCRYPTION_KEY, DOWNSTREAM_TOKEN) are set with
10
- // `wrangler secret put <NAME>`, not here.
17
+ // Plain vars. Local secrets (CREDENTIAL_ENCRYPTION_KEY, DOWNSTREAM_TOKEN) go
18
+ // in an uncommitted .dev.vars file; deployed ones are declared in
19
+ // alchemy.run.ts.
11
20
  // CONNECTA_ACTIVITY switches on activity history in src/connecta.config.ts
12
21
  // when "on"; its data stays in CONNECTA_DB.
13
22
  "vars": {
@@ -28,8 +37,8 @@
28
37
  },
29
38
  },
30
39
 
31
- // The one database. Create with `wrangler d1 create connecta` and paste
32
- // the id. connecta creates its tables on first use; nothing to apply.
40
+ // The one database, local under `wrangler dev`; alchemy.run.ts creates the
41
+ // deployed one. connecta creates its tables on first use; nothing to apply.
33
42
  "d1_databases": [
34
43
  {
35
44
  "binding": "CONNECTA_DB",
@@ -0,0 +1,157 @@
1
+ # Connecting an agent
2
+
3
+ Your **operator** is the person or team running the Connecta server. They
4
+ choose which agent can connect, which tools it can use, and which service
5
+ accounts those tools use. The model cannot grant itself more access.
6
+
7
+ This guide explains those choices. The [operator documentation](../documentation/README.md)
8
+ has exact setup and verification steps.
9
+
10
+ ## Choose the pool first
11
+
12
+ Imagine an agent named `assistant` that helps with CRM records and tickets.
13
+ Its operator creates a pool with the actions needed for that job and adds
14
+ the agent as a member. The pool can be read-only if updates must be impossible.
15
+
16
+ ```mermaid
17
+ flowchart LR
18
+ Identity["Agent · assistant"] --> Pool["Member of pool · tickets"]
19
+ Pool --> Tools["Allowed CRM and ticket tools"]
20
+ Tools --> Accounts["Connecta uses each connection's configured account"]
21
+ ```
22
+
23
+ The address uses the **pool name**, not the agent name. If `assistant` belongs
24
+ to a pool called `tickets`, its address is `/agent/tickets` on your Connecta
25
+ server. For a pool called `assistant`, it is `/agent/assistant`.
26
+ Ask your operator for the complete URL, such as
27
+ `https://connecta.example.com/agent/tickets`; the model should not guess it.
28
+
29
+ For shared organization access, a maintainer connects the service accounts
30
+ once. The agent proves its identity to Connecta and never needs the CRM's
31
+ password or the ticket service's API key. The operator should enable the
32
+ [encrypted credential vault](../documentation/auth.md#connect-a-shared-credential)
33
+ before saving those credentials or connecting accounts.
34
+
35
+ ## What to ask your operator for
36
+
37
+ - **The pool name and complete endpoint URL.** Confirm this agent is a member.
38
+ - **The authentication method.** Ask how the AI app will receive the agent
39
+ credential privately; keep it out of prompts and source files.
40
+ - **The tools and accounts.** Know which actions are available, whose account
41
+ they use, and whether changes are allowed. In 0.35.0, a pool can offer
42
+ [native tools](../documentation/meta-tools.md#tool-presentation) for apps
43
+ with their own tool search.
44
+ - **The approval policy.** Find out whether writes ask a person or run unattended.
45
+ - **A safe first test.** Agree on a small read, such as listing one ticket,
46
+ and the result you expect.
47
+
48
+ People use separate sign-in endpoints. The
49
+ [pool reference](../documentation/auth.md#pools) owns the address and membership rules.
50
+
51
+ ## Choose how the agent proves its identity
52
+
53
+ | Method | Best fit | What the operator provides |
54
+ | ------------------------ | --------------------------- | -------------------------------------------------------------- |
55
+ | Connecta agent token | An agent running anywhere | A `cta_` secret issued for the declared agent. |
56
+ | Vercel workload identity | An agent deployed on Vercel | Permission for a trusted project and its allowed environments. |
57
+
58
+ An agent token stays in the AI app's secret store. The app presents it when
59
+ it connects. Vercel identity uses a signed project token instead of a
60
+ separately provisioned Connecta secret.
61
+
62
+ ```mermaid
63
+ sequenceDiagram
64
+ participant H as AI app
65
+ participant C as Connecta
66
+ H->>C: Present the configured agent credential
67
+ C->>C: Verify the credential and pool membership
68
+ C-->>H: Serve the pool's permitted tools
69
+ ```
70
+
71
+ Anyone who obtains either token can act as the agent. Trust the Vercel
72
+ project code and build steps that can obtain its tokens, and enable only
73
+ environments that should have the pool's access.
74
+
75
+ The [token management guide](../documentation/auth.md#issue-rotate-or-revoke-an-agent-token)
76
+ and [Vercel identity guide](../documentation/auth.md#vercel-workload-credentials)
77
+ own availability, setup, rotation, and revocation. If both methods are
78
+ enabled, stopping one does not stop the other.
79
+
80
+ ## An optional integration for Eve
81
+
82
+ **Eve** is an app framework for building agents. If your agent uses Eve,
83
+ `@zackbart/connecta-eve` can connect it to a pool and load the endpoint's
84
+ instructions at the start of a turn. The helper runs in the Eve app; your
85
+ Connecta server runs separately.
86
+
87
+ The [helper's README](https://github.com/zackbart/connecta/blob/main/packages/connecta-eve/README.md)
88
+ owns installation, supported Node/Eve versions, environment setup, and the
89
+ Vercel variant. The following two files illustrate its two jobs after your
90
+ operator has configured the endpoint and credential.
91
+
92
+ `agent/connections/connecta.ts` connects to the pool:
93
+
94
+ ```ts
95
+ import { connectaConnection } from "@zackbart/connecta-eve";
96
+
97
+ export default connectaConnection({
98
+ pool: "tickets",
99
+ description: "Shared CRM and tickets for the assistant.",
100
+ });
101
+ ```
102
+
103
+ `agent/instructions/connecta.ts` supplies guidance for using it:
104
+
105
+ ```ts
106
+ import { connectaInstructions } from "@zackbart/connecta-eve";
107
+
108
+ export default connectaInstructions({ pool: "tickets" });
109
+ ```
110
+
111
+ Both files must use the same endpoint and credential source. The helper uses
112
+ the configured agent credential, without forwarding the chatting person's
113
+ identity. Instructions help the model use tools; they grant no permissions.
114
+
115
+ ## Decide whether writes need a person
116
+
117
+ The helper defaults to unattended execution of authorized writes. Connecting
118
+ an agent does not automatically add an approval step.
119
+
120
+ ```mermaid
121
+ flowchart TB
122
+ Call["Agent requests a change"] --> Ask{"App asks for approval?"}
123
+ Ask -->|Yes| Approved{"Person approves?"}
124
+ Approved -->|No| Stop["Stop"]
125
+ Approved -->|Yes| Pool{"Connecta allows this write?"}
126
+ Ask -->|No| Pool
127
+ Pool -->|No| Refuse["Refuse before sending"]
128
+ Pool -->|Yes| Send["Send the change"]
129
+ ```
130
+
131
+ For an interactive Eve agent, `gateWrites: true` asks before tools not marked
132
+ read-only. An explicit Eve approval policy takes precedence. If the agent
133
+ must never update data, use a read-only pool.
134
+
135
+ Approval may rely on an earlier tool label. A writable pool can execute a
136
+ newly classified write without a fresh approval; a read-only pool refuses it.
137
+ [Safety and trust](./safety-and-trust.md) explains the boundary, and the
138
+ [helper guide](https://github.com/zackbart/connecta/blob/main/packages/connecta-eve/README.md#approval-and-writes)
139
+ explains the policy mechanics.
140
+
141
+ ## When accounts or audiences differ
142
+
143
+ Personal connections belong to a signed-in person and are absent for agents.
144
+ Google Workspace has an explicit exception: an operator can assign a pool
145
+ owner whose account the agent will use. See
146
+ [Workspace pool owners](../documentation/auth.md#pool-owners-for-google-workspace)
147
+ before connecting an agent to someone's account.
148
+
149
+ An assistant serving several people must use a pool appropriate for everyone
150
+ in the conversation. Its app chooses that pool; the model does not choose
151
+ its own access level. Keep private results out of broader conversations.
152
+ The [pool layout guide](../documentation/auth.md#organizing-an-agents-pools)
153
+ owns that policy.
154
+
155
+ After setup, run the agreed small read with your operator. Use the
156
+ [verification guide](../documentation/deploying.md#verify-and-diagnose)
157
+ when the connection or access differs from what you expected.
@@ -0,0 +1,156 @@
1
+ # How Connecta works
2
+
3
+ Connecta is a front door for the services your agent needs. It gives the
4
+ agent one connection, then checks each request before it reaches a service.
5
+ Your **operator**, the person or team running Connecta, chooses what belongs
6
+ behind that door.
7
+
8
+ This guide explains the pieces. The [operator documentation](../documentation/README.md)
9
+ owns exact setup and behavior.
10
+
11
+ ## Start with connections
12
+
13
+ A **connector** is one connection to a service. For example, a connector
14
+ called `crm` could reach your shared CRM account, where you keep customer
15
+ records. Its tools might find a person or update their address.
16
+ A second connector could reach a different account at the same service.
17
+
18
+ An **API** is the interface a service gives other software. Connecta can wrap
19
+ that interface in tools, or connect to a hosted MCP server that already offers
20
+ tools. MCP is the standard used to make those tools available to AI apps.
21
+
22
+ ```mermaid
23
+ flowchart LR
24
+ Connecta --> Maintained["Maintained integration"] --> Vendor["Vendor API"]
25
+ Connecta --> Remote["Remote MCP connection"] --> Hosted["Hosted tools"]
26
+ Connecta --> Custom["Your API connection"] --> CRM["Your CRM API"]
27
+ ```
28
+
29
+ A maintained integration comes with Connecta's tools and guidance. A remote
30
+ MCP connection uses the tools the server offers to that account. A custom
31
+ API connection lets your operator describe selected actions.
32
+
33
+ All three go through Connecta's access checks. A remote server's list of
34
+ actions can change, and Connecta relies on truthful descriptions of which
35
+ actions change data.
36
+
37
+ The README lists [maintained connections](../README.md#what-you-can-connect).
38
+ For setup and migrations, see [Integrating services](../documentation/integrating.md).
39
+
40
+ ## A pool is a smaller front door
41
+
42
+ A **pool** is a named selection of tools and the people or agents allowed
43
+ to use them. The operator creates it and gives it an **endpoint**: a
44
+ connection address for that pool.
45
+
46
+ One pool might let the assistant read CRM records. Another might let a
47
+ person update tickets. Tools and accounts are separate choices: a pool
48
+ chooses the actions, while each connection uses its configured account.
49
+
50
+ ```mermaid
51
+ flowchart LR
52
+ Alice["alice · person"] --> Tickets["tickets pool<br/>ticket tools"]
53
+ Assistant["assistant · agent"] --> CRM["crm pool<br/>CRM reads"]
54
+ Tickets --> Check["Connecta checks access"]
55
+ CRM --> Check
56
+ Check --> Accounts["Use each connection's configured account"]
57
+ ```
58
+
59
+ People sign in. Agents use an identity configured by the operator.
60
+ The model cannot change that identity or add itself to a pool.
61
+
62
+ Each request uses one pool. Belonging to two pools does not merge them.
63
+ An AI app can switch between pools it is allowed to use; its software must
64
+ choose the right one for the conversation. The model does not choose its
65
+ own access level.
66
+
67
+ Maintainers run the deployment and can reach its whole tool list through
68
+ the main human endpoint. Other people use their assigned pools.
69
+ Agents use shared accounts selected by the operator. They do not inherit
70
+ the account of the person chatting with them.
71
+
72
+ [Connecting agents](./connecting-agents.md) explains pool addresses and
73
+ account choices, including the Google Workspace exception.
74
+
75
+ ## Finding a tool and using it are separate steps
76
+
77
+ First the agent finds an action and learns what information it needs.
78
+ Then it calls that action. The default connection gives the AI app six small
79
+ **meta-tools** to help it do this without loading every service's tools into
80
+ the conversation.
81
+
82
+ | Tool | Job |
83
+ | ----------------------- | ---------------------------------------------------------------------------- |
84
+ | `search_tools` | Find available actions. |
85
+ | `call_tool` | Call a discovered action that reads data. |
86
+ | `call_destructive_tool` | Call a discovered action that changes data, under the app's approval policy. |
87
+ | `execute_code` | Combine discovery, actions, and a small answer in a program. |
88
+ | `authorize_connector` | Request the permitted account-connection handoff. |
89
+ | `skills` | Read guidance for using a connection. |
90
+
91
+ In 0.35.0, **native tools** let apps with their own tool search find service
92
+ actions directly. The operator chooses the pool's presentation.
93
+
94
+ ```mermaid
95
+ flowchart TB
96
+ Meta["Default · meta-tools<br/>Connecta helps find the action"] --> Checks
97
+ Native["Optional · native tools<br/>the app finds the action"] --> Checks
98
+ Checks["Same access checks"] --> Service["Service action"]
99
+ ```
100
+
101
+ The presentation changes how an action is found, without granting more
102
+ access. The [tool reference](../documentation/meta-tools.md#tool-presentation)
103
+ tracks availability and supported behavior.
104
+
105
+ ## Why run code inside Connecta?
106
+
107
+ Suppose the agent needs a count of open tickets for each CRM account.
108
+ Instead of returning every record to the conversation, a short JavaScript
109
+ program can fetch the records, match their IDs, and return a small table.
110
+
111
+ The program runs in a restricted environment. It can use only this endpoint's
112
+ tools, and cannot create connections, choose another identity, or obtain
113
+ service credentials. Limits keep it from running indefinitely or returning
114
+ unbounded data.
115
+
116
+ With meta-tools, one discovered read can use a direct call. Finding an unfamiliar
117
+ action, combining several calls, or reducing a large answer belongs in a program.
118
+ On a writable endpoint, a program may also change data. The AI app decides
119
+ whether to ask for approval before running it.
120
+
121
+ The [endpoint workflow](../documentation/operating.md) and
122
+ [code reference](../documentation/code-mode.md) explain the mechanics.
123
+
124
+ ## Follow one call
125
+
126
+ ```mermaid
127
+ sequenceDiagram
128
+ participant A as AI app
129
+ participant C as Connecta
130
+ participant S as Service
131
+ A->>C: Request an action through a pool
132
+ C->>C: Check caller, allowed tools, and read-only rules
133
+ C->>S: Send with the configured service credential
134
+ S-->>C: Result or failure
135
+ C-->>A: Bounded result with known secrets redacted
136
+ ```
137
+
138
+ These checks also apply to calls inside programs. Guessing a tool name does
139
+ not bypass them. Read-only rules refuse tools marked as writes before they
140
+ are sent.
141
+
142
+ For tools marked as writes, Connecta does not automatically repeat a sent
143
+ change after an uncertain failure. Truthful tool classification matters;
144
+ [Safety and trust](./safety-and-trust.md) explains the limit and recovery.
145
+
146
+ ## Why an answer may be shorter
147
+
148
+ Programs can filter, count, join, and summarize records before returning
149
+ them. Connecta also limits output size. Some large results return a preview
150
+ and a handle for retrieving more; some tools shorten fields and report it.
151
+ A preview is not necessarily the whole answer.
152
+
153
+ The [result reference](../documentation/meta-tools.md#result-representation)
154
+ explains how to retrieve more. Never repeat a change just to recover its
155
+ output. Redaction keeps known secrets out of results; it does not make
156
+ business records safe to share with everyone.