@zackbart/connecta 0.34.1 → 0.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (441) hide show
  1. package/CHANGELOG.md +418 -0
  2. package/README.md +65 -105
  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 +2044 -1161
  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 +751 -281
  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 +29 -7
  53. package/dist/connectors/api-connector.js +145 -57
  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 +227 -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 +379 -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/contract.d.ts +8 -3
  109. package/dist/operator-ui/generated.js +4 -4
  110. package/dist/operator-ui/model.d.ts +2 -3
  111. package/dist/program-writes.js +47 -26
  112. package/dist/provider-call-facts.d.ts +115 -0
  113. package/dist/provider-call-facts.js +182 -0
  114. package/dist/provider-call.d.ts +112 -0
  115. package/dist/provider-call.js +271 -0
  116. package/dist/provider.d.ts +65 -31
  117. package/dist/provider.js +116 -39
  118. package/dist/providers/_shared/google/hatch.js +91 -0
  119. package/dist/providers/_shared/google/kit.js +427 -0
  120. package/dist/providers/_shared/google/result-size.js +15 -2
  121. package/dist/providers/_shared/google/service-account.d.ts +2 -1
  122. package/dist/providers/_shared/google/service-account.js +8 -4
  123. package/dist/providers/_shared/google/workspace.d.ts +6 -210
  124. package/dist/providers/_shared/google/workspace.js +6 -425
  125. package/dist/providers/_shared/rest/compact-index.js +86 -0
  126. package/dist/providers/_shared/rest/kit.js +146 -0
  127. package/dist/providers/_shared/rest/operation-index.js +230 -14
  128. package/dist/providers/_shared/rest/response-media.js +11 -0
  129. package/dist/providers/_shared/rest/value-safety.js +353 -195
  130. package/dist/providers/_shared/sensitive-fields.js +27 -0
  131. package/dist/providers/breeze/api.js +584 -0
  132. package/dist/providers/breeze/index.d.ts +1 -3
  133. package/dist/providers/breeze/index.js +67 -1420
  134. package/dist/providers/breeze/openapi.generated.js +60 -0
  135. package/dist/providers/breeze/skill.generated.js +2 -6
  136. package/dist/providers/breeze/tools.js +696 -0
  137. package/dist/providers/ccb/api.js +496 -0
  138. package/dist/providers/ccb/index.d.ts +15 -37
  139. package/dist/providers/ccb/index.js +77 -1702
  140. package/dist/providers/ccb/lib/constants.d.ts +34 -0
  141. package/dist/providers/ccb/lib/constants.js +74 -0
  142. package/dist/providers/ccb/lib/guide.js +9 -0
  143. package/dist/providers/ccb/lib/verdicts.js +387 -0
  144. package/dist/providers/ccb/openapi.generated.js +397 -0
  145. package/dist/providers/ccb/safety.js +295 -0
  146. package/dist/providers/ccb/skill.generated.js +2 -6
  147. package/dist/providers/ccb/tools.js +853 -0
  148. package/dist/providers/cloudflare/api.js +1066 -0
  149. package/dist/providers/cloudflare/index.d.ts +5 -22
  150. package/dist/providers/cloudflare/index.js +79 -197
  151. package/dist/providers/cloudflare/lib/config.d.ts +16 -0
  152. package/dist/providers/cloudflare/lib/config.js +2 -0
  153. package/dist/providers/cloudflare/lib/discovery.js +29 -0
  154. package/dist/providers/cloudflare/{graphql.js → lib/graphql.js} +1 -1
  155. package/dist/providers/cloudflare/lib/hatch.js +103 -0
  156. package/dist/providers/cloudflare/lib/path-bounds.js +28 -0
  157. package/dist/providers/cloudflare/lib/response-media.js +75 -0
  158. package/dist/providers/cloudflare/openapi.generated.js +4 -3
  159. package/dist/providers/cloudflare/{value-safety.js → safety.js} +487 -0
  160. package/dist/providers/cloudflare/skill.generated.js +2 -10
  161. package/dist/providers/cloudflare/tools.js +360 -0
  162. package/dist/providers/docs/api.js +51 -0
  163. package/dist/providers/docs/index.d.ts +1 -12
  164. package/dist/providers/docs/index.js +53 -1165
  165. package/dist/providers/docs/lib/constants.d.ts +18 -0
  166. package/dist/providers/docs/lib/constants.js +18 -0
  167. package/dist/providers/docs/lib/discovery.js +26 -0
  168. package/dist/providers/docs/lib/requests.js +48 -0
  169. package/dist/providers/docs/lib/schemas.js +168 -0
  170. package/dist/providers/docs/openapi.generated.js +16 -0
  171. package/dist/providers/docs/safety.js +54 -0
  172. package/dist/providers/docs/skill.generated.js +2 -6
  173. package/dist/providers/docs/tools.js +801 -0
  174. package/dist/providers/drive/api.js +177 -0
  175. package/dist/providers/drive/index.d.ts +1 -12
  176. package/dist/providers/drive/index.js +38 -1448
  177. package/dist/providers/drive/lib/constants.d.ts +6 -0
  178. package/dist/providers/drive/lib/constants.js +6 -0
  179. package/dist/providers/drive/lib/contracts.js +532 -0
  180. package/dist/providers/drive/lib/hatch.js +197 -0
  181. package/dist/providers/drive/openapi.generated.js +77 -0
  182. package/dist/providers/drive/safety.js +90 -0
  183. package/dist/providers/drive/skill.generated.js +2 -6
  184. package/dist/providers/drive/tools.js +1290 -0
  185. package/dist/providers/forms/api.js +71 -0
  186. package/dist/providers/forms/index.d.ts +1 -12
  187. package/dist/providers/forms/index.js +49 -1145
  188. package/dist/providers/forms/lib/constants.d.ts +14 -0
  189. package/dist/providers/forms/lib/constants.js +19 -0
  190. package/dist/providers/forms/lib/hatch.js +72 -0
  191. package/dist/providers/forms/openapi.generated.js +23 -0
  192. package/dist/providers/forms/safety.js +34 -0
  193. package/dist/providers/forms/skill.generated.js +2 -8
  194. package/dist/providers/forms/tools.js +1023 -0
  195. package/dist/providers/github/api.js +150 -0
  196. package/dist/providers/github/index.d.ts +4 -5
  197. package/dist/providers/github/index.js +30 -87
  198. package/dist/providers/github/{auth.d.ts → lib/auth.d.ts} +5 -3
  199. package/dist/providers/github/{auth.js → lib/auth.js} +40 -43
  200. package/dist/providers/github/lib/discovery.js +132 -0
  201. package/dist/providers/github/lib/operations.js +58 -0
  202. package/dist/providers/github/{scope.d.ts → lib/scope.d.ts} +2 -0
  203. package/dist/providers/github/{scope.js → lib/scope.js} +25 -1
  204. package/dist/providers/github/openapi.generated.js +1216 -0
  205. package/dist/providers/github/safety.js +216 -0
  206. package/dist/providers/github/skill.generated.js +2 -5
  207. package/dist/providers/github/tools.js +506 -0
  208. package/dist/providers/gmail/api.js +114 -0
  209. package/dist/providers/gmail/index.d.ts +1 -12
  210. package/dist/providers/gmail/index.js +73 -1621
  211. package/dist/providers/gmail/lib/constants.d.ts +13 -0
  212. package/dist/providers/gmail/lib/constants.js +16 -0
  213. package/dist/providers/gmail/lib/index.js +173 -0
  214. package/dist/providers/gmail/lib/schemas.js +176 -0
  215. package/dist/providers/gmail/lib/threading.js +120 -0
  216. package/dist/providers/gmail/openapi.generated.js +92 -0
  217. package/dist/providers/gmail/safety.js +21 -0
  218. package/dist/providers/gmail/skill.generated.js +2 -6
  219. package/dist/providers/gmail/tools.js +1435 -0
  220. package/dist/providers/overflow/api.js +1008 -0
  221. package/dist/providers/overflow/index.d.ts +1 -17
  222. package/dist/providers/overflow/index.js +60 -1488
  223. package/dist/providers/overflow/skill.generated.js +2 -5
  224. package/dist/providers/overflow/tools.js +873 -0
  225. package/dist/providers/planning-center/api.js +467 -0
  226. package/dist/providers/planning-center/index.d.ts +4 -35
  227. package/dist/providers/planning-center/index.js +69 -2445
  228. package/dist/providers/planning-center/lib/constants.d.ts +58 -0
  229. package/dist/providers/planning-center/lib/constants.js +83 -0
  230. package/dist/providers/planning-center/lib/discovery.js +40 -0
  231. package/dist/providers/planning-center/lib/guide.js +39 -0
  232. package/dist/providers/planning-center/lib/json-api.js +83 -0
  233. package/dist/providers/planning-center/lib/verdicts.js +1758 -0
  234. package/dist/providers/planning-center/openapi.generated.js +1764 -0
  235. package/dist/providers/planning-center/safety.js +188 -0
  236. package/dist/providers/planning-center/skill.generated.js +2 -27
  237. package/dist/providers/planning-center/tools.js +1010 -0
  238. package/dist/providers/quickbooks/api.js +299 -0
  239. package/dist/providers/quickbooks/index.d.ts +13 -0
  240. package/dist/providers/quickbooks/index.js +93 -0
  241. package/dist/providers/quickbooks/lib/query.js +118 -0
  242. package/dist/providers/quickbooks/lib/writes.js +168 -0
  243. package/dist/providers/quickbooks/safety.js +222 -0
  244. package/dist/providers/quickbooks/skill.generated.js +5 -0
  245. package/dist/providers/quickbooks/tools.js +117 -0
  246. package/dist/providers/sheets/api.js +133 -0
  247. package/dist/providers/sheets/index.d.ts +4 -16
  248. package/dist/providers/sheets/index.js +61 -1172
  249. package/dist/providers/sheets/lib/constants.d.ts +14 -0
  250. package/dist/providers/sheets/lib/constants.js +14 -0
  251. package/dist/providers/sheets/lib/hatch.js +163 -0
  252. package/dist/providers/sheets/lib/requests.js +105 -0
  253. package/dist/providers/sheets/lib/schemas.js +138 -0
  254. package/dist/providers/sheets/openapi.generated.js +30 -0
  255. package/dist/providers/sheets/safety.js +27 -0
  256. package/dist/providers/sheets/skill.generated.js +2 -7
  257. package/dist/providers/sheets/tools.js +733 -0
  258. package/dist/providers/slides/api.js +147 -0
  259. package/dist/providers/slides/index.d.ts +2 -10
  260. package/dist/providers/slides/index.js +48 -2555
  261. package/dist/providers/slides/lib/constants.d.ts +11 -0
  262. package/dist/providers/slides/lib/constants.js +11 -0
  263. package/dist/providers/slides/lib/requests.js +60 -0
  264. package/dist/providers/slides/lib/schemas.js +565 -0
  265. package/dist/providers/slides/openapi.generated.js +18 -0
  266. package/dist/providers/slides/skill.generated.js +2 -6
  267. package/dist/providers/slides/tools.js +1968 -0
  268. package/dist/providers/stripe/api.js +401 -0
  269. package/dist/providers/stripe/index.d.ts +5 -27
  270. package/dist/providers/stripe/index.js +74 -210
  271. package/dist/providers/stripe/lib/config.d.ts +4 -0
  272. package/dist/providers/stripe/lib/config.js +2 -0
  273. package/dist/providers/stripe/openapi.generated.js +4 -3
  274. package/dist/providers/stripe/{value-safety.js → safety.js} +5 -5
  275. package/dist/providers/stripe/skill.generated.js +2 -11
  276. package/dist/providers/stripe/tools.js +77 -0
  277. package/dist/providers/tithely/api.js +531 -0
  278. package/dist/providers/tithely/index.d.ts +17 -0
  279. package/dist/providers/tithely/index.js +86 -965
  280. package/dist/providers/tithely/skill.generated.js +2 -5
  281. package/dist/providers/tithely/tools.js +426 -0
  282. package/dist/providers/vercel/api.js +551 -0
  283. package/dist/providers/vercel/index.d.ts +9 -25
  284. package/dist/providers/vercel/index.js +65 -260
  285. package/dist/providers/vercel/lib/config.d.ts +2 -0
  286. package/dist/providers/vercel/lib/config.js +2 -0
  287. package/dist/providers/vercel/lib/index.js +117 -0
  288. package/dist/providers/vercel/lib/logs.js +100 -0
  289. package/dist/providers/vercel/lib/pin.js +270 -0
  290. package/dist/providers/vercel/openapi.generated.js +10 -5
  291. package/dist/providers/vercel/{value-safety.js → safety.js} +247 -38
  292. package/dist/providers/vercel/skill.generated.js +2 -7
  293. package/dist/providers/vercel/tools.js +642 -0
  294. package/dist/redaction-identity.js +47 -0
  295. package/dist/redaction-marker.js +125 -0
  296. package/dist/registry.d.ts +21 -15
  297. package/dist/registry.js +409 -376
  298. package/dist/routes/access-tokens.js +1 -1
  299. package/dist/routes/actor-labels.js +1 -1
  300. package/dist/routes/connect.js +1 -1
  301. package/dist/routes/dispatch.js +103 -0
  302. package/dist/routes/mcp.js +170 -79
  303. package/dist/routes/oauth.js +6 -1
  304. package/dist/routes/operator.js +2 -2
  305. package/dist/routes/shared.d.ts +5 -4
  306. package/dist/routes/shared.js +244 -177
  307. package/dist/routes/skills.js +10 -8
  308. package/dist/routes/ui-config.js +27 -3
  309. package/dist/routes/ui-data.js +21 -20
  310. package/dist/routes/ui.js +1 -1
  311. package/dist/runtime/call-admission.js +0 -26
  312. package/dist/runtime/call-entry.js +30 -0
  313. package/dist/runtime/call.js +552 -0
  314. package/dist/runtime/connector-scope.js +7 -0
  315. package/dist/runtime/credential-probe.js +34 -0
  316. package/dist/runtime/executor.js +40 -0
  317. package/dist/runtime/native-storage.js +63 -0
  318. package/dist/runtime/registry.js +27 -0
  319. package/dist/runtime/request-scope.js +72 -0
  320. package/dist/runtime/run.js +15 -7
  321. package/dist/runtime/shared-read.js +34 -5
  322. package/dist/runtime/storage.js +34 -21
  323. package/dist/sent-secrets.d.ts +194 -37
  324. package/dist/sent-secrets.js +1743 -340
  325. package/dist/server.js +5 -56
  326. package/dist/skills.js +322 -223
  327. package/dist/sqlite.js +15 -14
  328. package/dist/storage/d1-copy.js +255 -0
  329. package/dist/storage/d1-driver.js +15 -0
  330. package/dist/storage/keys.js +28 -0
  331. package/dist/storage/sql-driver.js +88 -0
  332. package/dist/storage/sql-native.js +544 -0
  333. package/dist/storage/sql-schema.d.ts +6 -0
  334. package/dist/storage/sql-schema.js +15 -0
  335. package/dist/storage/sql.d.ts +14 -20
  336. package/dist/storage/sql.js +29 -535
  337. package/dist/timeout.js +0 -26
  338. package/dist/tool-safety.js +20 -10
  339. package/dist/types.d.ts +9 -109
  340. package/dist/ui.d.ts +1 -1
  341. package/dist/ui.js +0 -1
  342. package/dist/upward.js +3 -0
  343. package/dist/usage-guide.js +3 -1
  344. package/dist/validate.d.ts +4 -2
  345. package/dist/validate.js +86 -9
  346. package/dist/version.d.ts +1 -1
  347. package/dist/version.js +1 -1
  348. package/dist/worker.js +312 -292
  349. package/dist/workspace-subject.js +5 -1
  350. package/dist/write-outcome.js +454 -34
  351. package/documentation/README.md +28 -7
  352. package/documentation/architecture.md +2409 -255
  353. package/documentation/auth.md +867 -114
  354. package/documentation/code-mode.md +49 -16
  355. package/documentation/deploying.md +164 -20
  356. package/documentation/hosted-mcp-migration.md +460 -0
  357. package/documentation/integrating.md +129 -144
  358. package/documentation/meta-tools.md +409 -32
  359. package/documentation/operating.md +27 -3
  360. package/documentation/operator-tests.md +3 -0
  361. package/documentation/operator-ui.md +84 -48
  362. package/documentation/provider-auth-migration.md +16 -63
  363. package/documentation/provider-migration-0.29.md +10 -5
  364. package/documentation/provider-migration-0.35.md +975 -0
  365. package/documentation/providers.md +1347 -0
  366. package/examples/worker/AGENTS.md +23 -9
  367. package/examples/worker/README.md +254 -135
  368. package/examples/worker/alchemy.run.ts +116 -0
  369. package/examples/worker/gitignore +10 -0
  370. package/examples/worker/src/connecta.config.ts +23 -21
  371. package/examples/worker/wrangler.jsonc +14 -5
  372. package/guides/connecting-agents.md +157 -0
  373. package/guides/how-it-works.md +156 -0
  374. package/guides/safety-and-trust.md +153 -0
  375. package/package.json +30 -50
  376. package/templates/node/.env.example +3 -0
  377. package/templates/node/README.md +22 -2
  378. package/templates/node/docker-compose.yml +1 -0
  379. package/templates/node/package.json +3 -2
  380. package/templates/node/src/connecta.config.ts +8 -0
  381. package/dist/catalog-drift.d.ts +0 -138
  382. package/dist/catalog-drift.js +0 -578
  383. package/dist/operator-ui/agents.d.ts +0 -74
  384. package/dist/operator-ui/agents.js +0 -104
  385. package/dist/operator-ui/config-summary.js +0 -565
  386. package/dist/operator-ui/connection-map.js +0 -376
  387. package/dist/operator-ui/endpoints.js +0 -221
  388. package/dist/operator-ui/fix-prompts.d.ts +0 -18
  389. package/dist/operator-ui/fix-prompts.js +0 -87
  390. package/dist/operator-ui/health.js +0 -52
  391. package/dist/operator-ui/member-page.js +0 -97
  392. package/dist/operator-ui/overview.js +0 -123
  393. package/dist/operator-ui/setup-commands.js +0 -51
  394. package/dist/operator-ui/view.d.ts +0 -401
  395. package/dist/operator-ui/view.js +0 -705
  396. package/dist/providers/_shared/request-token.js +0 -83
  397. package/dist/providers/_shared/rest/dispatch.js +0 -41
  398. package/dist/providers/_shared/rest/operation-index.d.ts +0 -133
  399. package/dist/providers/_shared/rest/tools.d.ts +0 -141
  400. package/dist/providers/_shared/rest/tools.js +0 -569
  401. package/dist/providers/_shared/rest/value-safety.d.ts +0 -201
  402. package/dist/providers/basecamp/index.d.ts +0 -45
  403. package/dist/providers/basecamp/index.js +0 -997
  404. package/dist/providers/basecamp/skill.generated.js +0 -9
  405. package/dist/providers/cloudflare/rest.d.ts +0 -37
  406. package/dist/providers/cloudflare/rest.js +0 -1097
  407. package/dist/providers/github/hosted.js +0 -218
  408. package/dist/providers/github/rest.js +0 -321
  409. package/dist/providers/infisical/index.d.ts +0 -7
  410. package/dist/providers/infisical/index.js +0 -713
  411. package/dist/providers/infisical/skill.generated.js +0 -8
  412. package/dist/providers/intercom/index.d.ts +0 -24
  413. package/dist/providers/intercom/index.js +0 -121
  414. package/dist/providers/intercom/skill.generated.js +0 -8
  415. package/dist/providers/linear/index.d.ts +0 -55
  416. package/dist/providers/linear/index.js +0 -537
  417. package/dist/providers/linear/skill.generated.js +0 -8
  418. package/dist/providers/mixpanel/index.d.ts +0 -59
  419. package/dist/providers/mixpanel/index.js +0 -472
  420. package/dist/providers/mixpanel/operations.js +0 -20
  421. package/dist/providers/mixpanel/rest.js +0 -603
  422. package/dist/providers/mixpanel/skill.generated.js +0 -10
  423. package/dist/providers/mixpanel/value-safety.js +0 -16
  424. package/dist/providers/notion/index.d.ts +0 -67
  425. package/dist/providers/notion/index.js +0 -368
  426. package/dist/providers/notion/openapi.generated.js +0 -75
  427. package/dist/providers/notion/rest.d.ts +0 -24
  428. package/dist/providers/notion/rest.js +0 -1226
  429. package/dist/providers/notion/skill.generated.js +0 -11
  430. package/dist/providers/notion/value-safety.js +0 -56
  431. package/dist/providers/revenuecat/index.d.ts +0 -51
  432. package/dist/providers/revenuecat/index.js +0 -697
  433. package/dist/providers/revenuecat/skill.generated.js +0 -11
  434. package/dist/providers/stripe/rest.d.ts +0 -14
  435. package/dist/providers/stripe/rest.js +0 -402
  436. package/dist/providers/vercel/rest.d.ts +0 -20
  437. package/dist/providers/vercel/rest.js +0 -1020
  438. package/dist/providers/wispr-flow/index.d.ts +0 -14
  439. package/dist/providers/wispr-flow/index.js +0 -117
  440. package/dist/providers/wispr-flow/skill.generated.js +0 -8
  441. /package/dist/providers/github/{key.js → lib/key.js} +0 -0
@@ -1,705 +0,0 @@
1
- /**
2
- * Everything the operator app knows, and every rule for changing it, with no
3
- * DOM in sight. The components render this and nothing else, so the questions
4
- * that matter — what a page shows while it loads, what an identity change
5
- * erases, whether a value may become an href — are answered by functions a test
6
- * can call directly rather than by reading rendered markup back out of a
7
- * browser.
8
- */
9
- const REGISTRATION_LABELS = {
10
- cimd: "Client metadata document (CIMD)",
11
- dcr: "Dynamic registration (DCR)",
12
- static: "Pre-registered client",
13
- };
14
- export function registrationPathLabel(path) {
15
- return REGISTRATION_LABELS[path];
16
- }
17
- /** Pages the nav lists, in dashboard order. */
18
- export const OPERATOR_PAGES = [
19
- "overview",
20
- "endpoints",
21
- "connections",
22
- "activity",
23
- "tokens",
24
- "settings",
25
- ];
26
- export const PAGE_META = {
27
- overview: { path: "/", label: "Overview" },
28
- endpoints: { path: "/endpoints", label: "Endpoints" },
29
- connector: { path: "/connectors", label: "Connector" },
30
- settings: { path: "/settings", label: "Settings" },
31
- tokens: { path: "/tokens", label: "Tokens" },
32
- connections: { path: "/connectors", label: "Connectors" },
33
- activity: { path: "/activity", label: "Activity" },
34
- };
35
- /** Legacy links remain valid, with the browser replacing their URL. */
36
- export function canonicalOperatorPath(path) {
37
- return ({ "/access": "/endpoints", "/tools": "/connectors", "/config": "/settings" }[path] ??
38
- path);
39
- }
40
- /**
41
- * What each page is for, in one line under its heading — on the gate as well
42
- * as once signed in, so the page an operator lands on reads the same before
43
- * and after the session is checked.
44
- */
45
- export function pageDescription(page, productDescription) {
46
- if (page === "activity") {
47
- return "Tool calls by caller and result. Arguments and results are not stored.";
48
- }
49
- return productDescription;
50
- }
51
- /**
52
- * Signed in, but neither a maintainer nor a member of any endpoint: who to
53
- * ask, and that this is not an error to retry.
54
- */
55
- export function noAccessCopy(kind, productName) {
56
- const who = kind === "clerk" ? "This account" : kind === "cloudflare-access" ? "This Cloudflare Access identity" : "This token";
57
- return `${who} has no access to ${productName}. Ask a maintainer to add you to an endpoint, then reload.`;
58
- }
59
- /** What the gate says while the session is checked, page by page. */
60
- export function checkingCopy() {
61
- return "Checking your session…";
62
- }
63
- export function pageForPath(path) {
64
- if (/^\/connectors\/[a-z0-9_-]+$/.test(path))
65
- return "connector";
66
- if (path === "/tokens")
67
- return "tokens";
68
- const match = OPERATOR_PAGES.find((page) => PAGE_META[page].path === canonicalOperatorPath(path));
69
- return match ?? "connections";
70
- }
71
- export function info(message) {
72
- return { message, tone: "info" };
73
- }
74
- export function failure(message, fix) {
75
- return fix ? { message, tone: "error", fix } : { message, tone: "error" };
76
- }
77
- const REFUSED_COPY = {
78
- oauth_disconnect: "Disconnect failed. The deployment log has the reason.",
79
- oauth_reconnect: "Authorization couldn't start. The deployment log has the reason.",
80
- credential_test: "The credential test couldn't run.",
81
- };
82
- /**
83
- * The route's answer to a finished OAuth action. Its state picks the sentence;
84
- * `opened` says whether the authorization page is already in a new tab.
85
- */
86
- export function oauthDoneNotice(action, answer, opened = true) {
87
- if (action === "oauth_disconnect") {
88
- if (answer?.code === "oauth_revocation_failed")
89
- return info("Disconnected here. Revoke the grant in the provider's console too.");
90
- return info("Disconnected.");
91
- }
92
- if (answer?.state === "ok")
93
- return info("Connected.");
94
- return info(opened ? "Finish in the new tab." : "The new tab was blocked. Open the link here.");
95
- }
96
- /** A credential Test's result. `ok` is the only part of the answer it reads. */
97
- export function credentialTestNotice(connectorId, answer) {
98
- return answer?.ok === true
99
- ? info("Credential is valid.")
100
- : failure("Credential test failed. The deployment log has the reason.", {
101
- kind: "credential_test_failed",
102
- connectorId,
103
- });
104
- }
105
- /**
106
- * A route that refused one of these actions. A credential Test that found
107
- * nothing usable to test names the problem, which picks the same copy and fix
108
- * prompt the Connections page uses for it; every other refusal gets the
109
- * action's one sentence. `problem` is whatever the response carried, so it is
110
- * checked, not trusted.
111
- */
112
- export function refusedNotice(action, connectorId, problem) {
113
- if (action === "credential_test" && (problem === "credential_required" || problem === "credential_mismatch")) {
114
- return failure(PROBLEM_COPY[problem], { kind: problem, connectorId });
115
- }
116
- return failure(REFUSED_COPY[action], {
117
- kind: action === "credential_test" ? "credential_test_failed" : "oauth_action_failed",
118
- connectorId,
119
- });
120
- }
121
- /**
122
- * A credential save or removal the route refused, by status. The route's
123
- * `error` can name a vault failure or echo validation detail, so none of it
124
- * is shown; the status is enough to say what to do next.
125
- */
126
- function credentialRefusedCopy(action, status, problem) {
127
- if (problem === "credential_mismatch")
128
- return PROBLEM_COPY.credential_mismatch;
129
- const verb = action === "credential_save" ? "saved" : "removed";
130
- if (status === 400 || status === 413 || status === 415) {
131
- return action === "credential_save"
132
- ? "Not saved. A value is empty or in the wrong format."
133
- : "Not removed. Refresh and try again.";
134
- }
135
- if (status === 404) {
136
- return "This connector no longer has a credential slot. Refresh the page.";
137
- }
138
- if (status === 503) {
139
- return `No credential storage is configured, so nothing was ${verb}.`;
140
- }
141
- return `Not ${verb}. Try again, or check the deployment log.`;
142
- }
143
- /** An action whose permission or target changed before it was sent. */
144
- export const STALE_COPY = "This changed before sending, so nothing was sent. Try again.";
145
- /**
146
- * Every row action's failure, in one voice. The page's own failures — a
147
- * lapsed session, a denied identity, a dropped connection — read the same for
148
- * every action; a route's refusal picks the action's fixed sentence.
149
- */
150
- export function actionFailedNotice(action, connectorId, facts, productName) {
151
- if (facts.kind === "session") {
152
- return failure("Session ended. Sign in again.");
153
- }
154
- if (facts.kind === "forbidden") {
155
- return failure("You can't change this connection's authentication.");
156
- }
157
- if (facts.kind === "network") {
158
- return failure(`Couldn't reach ${productName}. Try again.`);
159
- }
160
- if (facts.kind === "stale")
161
- return failure(STALE_COPY);
162
- if (action === "credential_save" || action === "credential_remove") {
163
- return failure(credentialRefusedCopy(action, facts.status, facts.problem));
164
- }
165
- return refusedNotice(action, connectorId, facts.problem);
166
- }
167
- export function connectorLoadFailureCopy(failure, productName) {
168
- if (failure === "unavailable")
169
- return "Session identity is unavailable. Retry.";
170
- return failure === "session"
171
- ? "Session not accepted. Retry, or sign in again."
172
- : `Couldn't reach ${productName}. Refresh to retry.`;
173
- }
174
- /** The signed-in page's answer when `/ui/data` could not be read. */
175
- export function loadFailureCopy(failure, productName) {
176
- return {
177
- title: `Couldn't reach ${productName}`,
178
- body: failure === "network"
179
- ? "Your browser couldn't connect. Retry."
180
- : "The deployment returned an error. Retry, or check its log.",
181
- };
182
- }
183
- /** A collection page's load failure: fixed words, whatever the route said. */
184
- export function collectionFailureCopy(_collection, facts, productName) {
185
- if (facts.kind === "network") {
186
- return `Couldn't reach ${productName}. Retry.`;
187
- }
188
- if (facts.kind === "session")
189
- return "Session ended. Sign in again.";
190
- if (facts.kind === "forbidden" || facts.status === 404) {
191
- return "Activity isn't available to you.";
192
- }
193
- return "The deployment returned an error. Retry, or check its log.";
194
- }
195
- /** The confirm's question, naming the connector by its title. */
196
- export function confirmCopy(action, name) {
197
- if (action === "oauth_disconnect") {
198
- return {
199
- question: `Disconnect ${name}? Its tools stop working until you connect again.`,
200
- confirm: "Disconnect",
201
- };
202
- }
203
- if (action === "oauth_restart") {
204
- return {
205
- question: `Reconnect ${name}? It stops working until you finish in the new tab.`,
206
- confirm: "Reconnect",
207
- };
208
- }
209
- return {
210
- question: `Remove ${name}'s credential? Its tools stop working until you add a new one.`,
211
- confirm: "Remove",
212
- };
213
- }
214
- export function accessTokenUnavailableCopy(capability) {
215
- return capability === undefined
216
- ? "Agent tokens aren't configured."
217
- : "Managing tokens needs an interactive sign-in with permission.";
218
- }
219
- /** Who the contract says this viewer is, or null before it loads. */
220
- export function operatorRole(state) {
221
- return state.contract?.role ?? null;
222
- }
223
- /**
224
- * The role pages and navigation render for. The contract's, or, while a
225
- * refresh that failed has left no contract on screen, maintainer when the
226
- * last good contract confirmed one and that maintainer's data is still here:
227
- * their page stays mounted on its own retry state instead of being torn down
228
- * mid-recovery. Never a request's permission; the store sends maintainer
229
- * reads only while the contract itself says maintainer.
230
- */
231
- export function displayRole(state) {
232
- if (state.contract)
233
- return state.contract.role;
234
- return state.role === "maintainer" && state.data ? "maintainer" : null;
235
- }
236
- /**
237
- * A confirmed maintainer's page is mounted without a contract behind it: a
238
- * refresh failed, or its read ran past the deadline. The shell shows one
239
- * recovery banner with Retry above whichever page is open, and that page is
240
- * stale until a contract confirms the role again.
241
- */
242
- export function contractRecovering(state) {
243
- return !state.contract && displayRole(state) === "maintainer";
244
- }
245
- /**
246
- * Whether Activity is open to this viewer: maintainers only, on a deployment
247
- * that records history. Members always read "forbidden".
248
- */
249
- export function activityReadable(state) {
250
- return Boolean(state.data?.activityEnabled) && activityAllowed(state);
251
- }
252
- /** The contract's half of `activityReadable`: a maintainer, on a deployment that records. */
253
- export function activityAllowed(state) {
254
- const contract = state.contract;
255
- return (contract?.role === "maintainer" &&
256
- contract.live.activity !== "forbidden" &&
257
- contract.live.activity !== "unconfigured");
258
- }
259
- export function initialState(page) {
260
- return {
261
- page,
262
- generation: 0,
263
- session: "loading",
264
- gate: null,
265
- refreshing: false,
266
- loadFailure: null,
267
- pendingFocus: null,
268
- focusIfLost: null,
269
- ...identityScopedState(),
270
- };
271
- }
272
- /**
273
- * Every field that belongs to one operator identity. Split out because the only
274
- * safe way to change identity is to replace all of them at once: a field left
275
- * behind here is one identity's data on another identity's screen.
276
- */
277
- function identityScopedState() {
278
- return {
279
- recoveryPending: false,
280
- data: null,
281
- contract: null,
282
- role: null,
283
- contractPhase: "idle",
284
- health: "loading",
285
- connectorFilter: "",
286
- oauthNotice: null,
287
- oauthNoticeFor: null,
288
- oauthBusy: null,
289
- oauthBlocked: null,
290
- oauthBlockedUrl: null,
291
- confirming: null,
292
- connectorFailures: {},
293
- credentialNotice: null,
294
- credentialNoticeFor: null,
295
- credentialEditing: null,
296
- credentialBusy: null,
297
- tokenPhase: "idle",
298
- tokenNotice: null,
299
- tokens: [],
300
- createdToken: null,
301
- createdTokenFor: null,
302
- tokenConfirm: null,
303
- unresolvedSlots: [],
304
- tokenBusy: false,
305
- activityPhase: "idle",
306
- activityNotice: null,
307
- activityEvents: [],
308
- activityCursor: null,
309
- activitySearch: "",
310
- };
311
- }
312
- /**
313
- * Drop to the gate and forget the previous operator. Bumping the generation is
314
- * what makes the drop stick: work already in flight for the old identity
315
- * resolves into a state that no longer accepts it.
316
- */
317
- export function resetIdentity(state, gate = null) {
318
- return {
319
- ...state,
320
- generation: state.generation + 1,
321
- session: "gated",
322
- gate,
323
- refreshing: false,
324
- loadFailure: null,
325
- pendingFocus: null,
326
- focusIfLost: null,
327
- ...identityScopedState(),
328
- };
329
- }
330
- /**
331
- * Leaving a page closes what should not survive it: a one-time secret, a half
332
- * typed credential, and the notices that answered the page just left.
333
- */
334
- export function withPage(state, page) {
335
- return {
336
- ...state,
337
- page,
338
- createdToken: null,
339
- createdTokenFor: null,
340
- tokenConfirm: null,
341
- tokenNotice: null,
342
- credentialEditing: null,
343
- credentialNotice: null,
344
- credentialNoticeFor: null,
345
- confirming: null,
346
- };
347
- }
348
- export function credentialUnavailableCopy(capability) {
349
- if (capability === "no_slots") {
350
- return "No connector declares a credential slot. Credentials stay in code.";
351
- }
352
- if (capability === "vault_not_configured") {
353
- return "No credential vault is configured.";
354
- }
355
- return "Managing credentials needs an interactive sign-in. A bearer token can only view them.";
356
- }
357
- /**
358
- * The status badge. An auth-needed connector is named by what it needs, so a
359
- * row whose fix is "Add credential" does not say "Authorization needed".
360
- */
361
- export function connectorStatusLabel(status, problem) {
362
- if (status === "loading")
363
- return "Loading details";
364
- if (status === "ok")
365
- return "Connected";
366
- if (status === "credential_required")
367
- return "Credential needed";
368
- if (status === "auth_required") {
369
- return problem === "credential_required" ? "Credential needed" : "Authorization needed";
370
- }
371
- return "Unavailable";
372
- }
373
- export function connectorStatusTone(status) {
374
- if (status === "ok")
375
- return "ok";
376
- if (status === "auth_required" || status === "credential_required")
377
- return "warn";
378
- if (status === "loading")
379
- return "neutral";
380
- return "danger";
381
- }
382
- /**
383
- * What the page says about a connector that is not usable, one fixed sentence
384
- * per problem kind the server classified. This is the only account of a
385
- * failure the Connections page renders: a connector's status message can quote
386
- * a downstream error body, and a downstream error body can quote the secret
387
- * that was just rejected, so the raw text stays in the deployment's log and
388
- * never reaches the payload or the DOM. The fix prompt beside it is keyed off
389
- * the same kind.
390
- */
391
- const PROBLEM_COPY = {
392
- connector_unavailable: "Unavailable. Its status check or catalog load failed or timed out. The deployment log has the error.",
393
- oauth_required: "Needs OAuth authorization. No grant is stored, or it expired or was revoked.",
394
- credential_required: "Needs a credential. Nothing usable is stored.",
395
- auth_required: "Needs authorization. Its secret is set in deployment config, not here.",
396
- credential_mismatch: "The stored credential doesn't match this connector's fields.",
397
- catalog_failed: "Connected, but its catalog failed to load, so no tools are served.",
398
- };
399
- export function problemCopy(problem) {
400
- return problem ? (PROBLEM_COPY[problem] ?? null) : null;
401
- }
402
- /**
403
- * A problem someone can fix by authorizing is a warning, matching the amber
404
- * "Authorization needed" badge above it; one where something broke is an
405
- * error. The two used to share the red box, so the row contradicted itself.
406
- */
407
- export function problemTone(problem) {
408
- return problem === "oauth_required" || problem === "credential_required" || problem === "auth_required"
409
- ? "warn"
410
- : "danger";
411
- }
412
- const PROBLEM_LABEL = {
413
- connector_unavailable: "Unavailable",
414
- oauth_required: "Authorization needed",
415
- credential_required: "Credential needed",
416
- auth_required: "Authorization needed",
417
- credential_mismatch: "Credential mismatch",
418
- catalog_failed: "Catalog failed",
419
- };
420
- function problemAction(problem) {
421
- if (problem === "credential_mismatch")
422
- return "Replace key";
423
- return problemTone(problem) === "warn" ? "Connect" : "Inspect";
424
- }
425
- /**
426
- * The verdict the Connectors list, the Overview, Endpoints and a connector's
427
- * page all show. The server's problem code comes first, then a failed detail
428
- * read on this page, then a non-ok status. Catalog drift is informational. A problem
429
- * outranks the status, so a connector whose catalog failed is never
430
- * "Connected". A failed read marks its connector `connector_unavailable` in
431
- * the store, so that one code beside a failed read is the page's own and
432
- * reads "Couldn't load" instead of blaming the downstream.
433
- */
434
- export function connectorVerdict(live, signals = {}) {
435
- if (live.problem && !(signals.failed && live.problem === "connector_unavailable")) {
436
- return { tone: problemTone(live.problem), label: PROBLEM_LABEL[live.problem], action: problemAction(live.problem) };
437
- }
438
- if (signals.failed)
439
- return { tone: "warn", label: "Couldn't load", action: "Inspect" };
440
- if (live.status === "loading")
441
- return { tone: "neutral", label: connectorStatusLabel(live.status), action: null };
442
- if (live.status !== "ok") {
443
- const tone = connectorStatusTone(live.status) === "warn" ? "warn" : "danger";
444
- return { tone, label: connectorStatusLabel(live.status), action: tone === "warn" ? "Connect" : "Inspect" };
445
- }
446
- return { tone: "ok", label: "Connected", action: null };
447
- }
448
- /**
449
- * The categories, in the order an operator should read them: what the
450
- * deployment refuses to call, what it can no longer call, what contradicts a
451
- * vetted verdict, and what changed shape underneath a reviewed schema. Counts
452
- * only — a name or a schema on this path would be the payload leak the whole
453
- * drift model exists to avoid.
454
- */
455
- const DRIFT_CATEGORIES = [
456
- { key: "unclassifiedTools", label: "Unclassified" },
457
- { key: "unservedTools", label: "Unserved" },
458
- { key: "annotationConflicts", label: "Annotation conflicts" },
459
- { key: "schemaChanges", label: "Schema changes" },
460
- { key: "droppedTools", label: "Dropped tool names" },
461
- ];
462
- function driftTotal(drift) {
463
- if (!drift)
464
- return 0;
465
- return DRIFT_CATEGORIES.reduce((sum, { key }) => sum + (drift[key] || 0), 0);
466
- }
467
- export function driftState(drift) {
468
- if (!drift)
469
- return "unavailable";
470
- if (driftTotal(drift) > 0)
471
- return "warning";
472
- if (drift.reviewedBaseline !== true ||
473
- drift.verification !== "complete" ||
474
- !drift.schemaCoverage ||
475
- drift.schemaCoverage.unpinned > 0 ||
476
- drift.schemaCoverage.pinned === 0)
477
- return "unavailable";
478
- return "clean";
479
- }
480
- /** Every category with its count, so a clean report still shows its zeros. */
481
- export function driftCounts(drift) {
482
- if (!drift)
483
- return [];
484
- return DRIFT_CATEGORIES.filter(({ key }) => key !== "droppedTools" || drift.droppedTools !== undefined).map(({ key, label }) => ({
485
- key,
486
- label,
487
- count: drift[key] || 0,
488
- }));
489
- }
490
- /** One line naming the state and when it was observed. Never what drifted. */
491
- export function driftSummary(drift) {
492
- if (!drift)
493
- return "No catalog refresh yet.";
494
- const observed = formatDate(drift.observedAt);
495
- const when = observed ? ` · observed ${observed}` : "";
496
- const total = driftTotal(drift);
497
- const difference = total
498
- ? `${total} difference${total === 1 ? "" : "s"}${drift.reviewedBaseline === false ? "" : " from the reviewed manifest"} · `
499
- : "";
500
- if (drift.reviewedBaseline === false)
501
- return `${difference}No reviewed baseline${when}`;
502
- if (drift.verification === "unavailable")
503
- return `${difference}Schema verification unavailable${when}`;
504
- const coverage = drift.schemaCoverage;
505
- if (!coverage || coverage.pinned === 0)
506
- return `${difference}Schemas not pinned${when}`;
507
- if (coverage.unpinned > 0)
508
- return `${difference}Partial schema coverage (${coverage.pinned} pinned, ${coverage.unpinned} not pinned)${when}`;
509
- if (driftState(drift) === "clean")
510
- return `Matches the reviewed manifest${when}`;
511
- if (!total)
512
- return `Schema verification unavailable${when}`;
513
- return `${difference.replace(/ · $/, "")}${when}`;
514
- }
515
- /**
516
- * Only http/https may become a clickable href — the browser half of the gate
517
- * `src/ui.ts` applies before an authorizationUrl is ever serialized. A hostile
518
- * downstream that gets a `javascript:` URL past one of them still meets the
519
- * other, and the caller renders inert text instead of a link.
520
- */
521
- export function safeHttpHref(url) {
522
- if (!url)
523
- return null;
524
- try {
525
- const protocol = new URL(url).protocol;
526
- return protocol === "http:" || protocol === "https:" ? url : null;
527
- }
528
- catch {
529
- return null;
530
- }
531
- }
532
- /** Locale timestamp, or "" for anything that is not a readable date. */
533
- export function formatDate(value) {
534
- if (!value)
535
- return "";
536
- const date = new Date(value);
537
- // Minutes, not seconds: nothing on these pages is read to the second, and
538
- // the seconds were most of the noise in every row that carried a date.
539
- return Number.isNaN(date.valueOf())
540
- ? ""
541
- : date.toLocaleString(undefined, { dateStyle: "medium", timeStyle: "short" });
542
- }
543
- const ACTOR_KINDS = {
544
- clerk: "Clerk",
545
- bearer: "Bearer token",
546
- "cloudflare-access": "Cloudflare Access",
547
- anonymous: "Anonymous",
548
- access_token: "Agent token",
549
- };
550
- /** How a caller signed in, as a person reads it. An unknown kind is shown as sent. */
551
- function actorKindLabel(kind) {
552
- if (!kind)
553
- return "Unknown caller";
554
- return ACTOR_KINDS[kind] ?? kind;
555
- }
556
- /** Who made a call: their name when there is one, and how they signed in. */
557
- export function actorLabel(actor) {
558
- if (!actor?.kind)
559
- return "Unknown caller";
560
- const who = actor.label || actor.id;
561
- const kind = actorKindLabel(actor.kind);
562
- return who ? `${who} (${kind})` : kind;
563
- }
564
- /**
565
- * The stable id behind a friendly label, shown only when a label or namespace
566
- * could otherwise make two different people look like one.
567
- */
568
- export function actorStableId(actor) {
569
- if (!actor?.id)
570
- return null;
571
- if (!actor.label && !actor.namespace)
572
- return null;
573
- return actor.namespace ? `${actor.namespace} · ${actor.id}` : actor.id;
574
- }
575
- function activityMatches(event, query) {
576
- const q = query.trim().toLowerCase();
577
- if (!q)
578
- return true;
579
- return [
580
- event.address,
581
- event.connectorId,
582
- event.toolName,
583
- event.source,
584
- event.outcome,
585
- event.errorCode,
586
- event.friction,
587
- event.actor?.kind,
588
- event.actor?.id,
589
- event.actor?.namespace,
590
- event.actor?.label,
591
- activityOutcomeBadge(event.outcome).label,
592
- activityDetail(event),
593
- actorKindLabel(event.actor?.kind),
594
- ].some((value) => String(value ?? "")
595
- .toLowerCase()
596
- .includes(q));
597
- }
598
- export function filterActivity(events, query) {
599
- return events.filter((event) => activityMatches(event, query));
600
- }
601
- /** Counts only. What the deployment ran, never what it sent or received. */
602
- export function activitySummary(events) {
603
- if (events.length === 0)
604
- return "";
605
- const calls = events.filter((event) => event.kind !== "catalog_drift");
606
- const failed = calls.filter((event) => ["error", "timeout"].includes(activityOutcomeClass(event.outcome))).length;
607
- const changes = events.length - calls.length;
608
- const tools = new Set(calls.map((event) => event.address)).size;
609
- return `${calls.length} loaded call${calls.length === 1 ? "" : "s"} · ${failed} failed · ${tools} tool${tools === 1 ? "" : "s"}${changes ? ` · ${changes} catalog change${changes === 1 ? "" : "s"}` : ""}`;
610
- }
611
- // A pause and an approval are neither success nor failure: each gets its own
612
- // class, and the stylesheet paints neither as an error. Nothing has emitted
613
- // either since issue #672 removed program pauses, but older rows carry them.
614
- const ACTIVITY_OUTCOMES = ["success", "error", "timeout", "cancelled", "paused", "approved"];
615
- export function activityOutcomeClass(outcome) {
616
- return ACTIVITY_OUTCOMES.includes(outcome) ? outcome : "error";
617
- }
618
- /** Each outcome as a badge: a word a person reads, and a tone that is never alone. */
619
- const OUTCOME_BADGE = {
620
- success: { label: "Succeeded", tone: "ok" },
621
- error: { label: "Failed", tone: "danger" },
622
- timeout: { label: "Timed out", tone: "danger" },
623
- cancelled: { label: "Cancelled", tone: "neutral" },
624
- paused: { label: "Paused for approval", tone: "warn" },
625
- approved: { label: "Approved", tone: "ok" },
626
- };
627
- export function activityOutcomeBadge(outcome) {
628
- return OUTCOME_BADGE[outcome] ?? { label: "Failed", tone: "danger" };
629
- }
630
- const SOURCE_LABELS = {
631
- execute_code: "In a program",
632
- call_tool: "Direct call",
633
- call_destructive_tool: "Direct call, approved by the host",
634
- // History only: resume_execution left with program pauses (#672).
635
- resume_execution: "Resumed program",
636
- batch_call: "Batch call",
637
- };
638
- /**
639
- * Friction classes and the error codes an operator meets most, in words. An
640
- * unknown code falls back to itself with the underscores taken out, which is
641
- * still more readable than the wire form and never a guess at its meaning.
642
- */
643
- const REASON_LABELS = {
644
- tool_not_found: "tool not found",
645
- unknown_address: "tool not found",
646
- unknown_tool: "tool not found",
647
- ambiguous_tool_alias: "ambiguous tool name",
648
- schema_retry: "arguments didn't match the schema",
649
- invalid_args: "arguments didn't match the schema",
650
- destructive_reroute: "needed host approval",
651
- destructive_tool_requires_approval: "needed host approval",
652
- read_only_endpoint: "endpoint is read-only",
653
- approval_required: "needed approval",
654
- auth_required: "needed authorization",
655
- result_too_large: "result too large",
656
- timeout: "timed out",
657
- };
658
- function reasonLabel(code) {
659
- return REASON_LABELS[code] ?? code.replaceAll("_", " ");
660
- }
661
- /** Why a call stalled or failed, in words; "" when nothing was recorded. */
662
- export function activityReason(event) {
663
- const reasons = [event.friction, event.errorCode].filter((code) => Boolean(code)).map(reasonLabel);
664
- return [...new Set(reasons)].join(" · ");
665
- }
666
- /** The one-line detail under an address: where it ran, retries, and why it stalled. */
667
- export function activityDetail(event) {
668
- if (event.kind === "catalog_drift")
669
- return "Catalog changed";
670
- const parts = [SOURCE_LABELS[event.source] ?? event.source];
671
- if (event.approval === "tool")
672
- parts.push("approved for the rest of the run");
673
- if (event.approval === "call")
674
- parts.push("approved for this call");
675
- if (event.attempts > 1)
676
- parts.push(`${event.attempts} attempts`);
677
- const reasons = [event.friction, event.errorCode].filter((code) => Boolean(code)).map(reasonLabel);
678
- // The friction class and the code often say the same thing in two
679
- // vocabularies ("auth_required" twice); once is enough.
680
- for (const reason of new Set(reasons))
681
- parts.push(reason);
682
- return parts.join(" · ");
683
- }
684
- /**
685
- * A stored credential that cannot be used, by cause. The payload's `error`
686
- * beside it is not shown: it can carry a vault's own words.
687
- */
688
- export function credentialProblemCopy(problem) {
689
- if (problem === "credential_mismatch")
690
- return PROBLEM_COPY.credential_mismatch;
691
- if (problem === "credential_unreadable") {
692
- return "Credential status is unavailable. Retry before replacing or removing it.";
693
- }
694
- return "The stored credential can't be used. Replace it.";
695
- }
696
- /** Gate copy for each browser-auth shape, so the sign-in state is never a blank page. */
697
- export function gateCopy(kind, signedIn) {
698
- if (kind === "cloudflare-access") {
699
- return "Couldn't check your Cloudflare Access identity. Retry.";
700
- }
701
- if (kind !== "clerk") {
702
- return "Paste an operator token.";
703
- }
704
- return signedIn ? "This Clerk account can't open operator pages." : "Sign in with Clerk.";
705
- }