@zackbart/connecta 0.28.1 → 0.30.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 (332) hide show
  1. package/CHANGELOG.md +855 -5
  2. package/README.md +125 -116
  3. package/bin/connecta.mjs +121 -139
  4. package/bin/meta-tool-names.d.mts +2 -0
  5. package/bin/meta-tool-names.mjs +9 -0
  6. package/bin/version.mjs +3 -0
  7. package/dist/access-tokens.js +53 -63
  8. package/dist/activity-request.js +8 -0
  9. package/dist/activity.d.ts +76 -42
  10. package/dist/activity.js +110 -42
  11. package/dist/argument-redaction.js +230 -0
  12. package/dist/auth/clerk-sdk/client.d.ts +65 -0
  13. package/dist/auth/clerk-sdk/client.js +5 -0
  14. package/dist/auth/clerk-sdk/generated.js +1845 -0
  15. package/dist/auth/clerk-transport.js +19 -0
  16. package/dist/auth/clerk.d.ts +17 -7
  17. package/dist/auth/clerk.js +189 -107
  18. package/dist/auth/cloudflare-access.js +25 -26
  19. package/dist/auth/downstream-client-metadata.d.ts +29 -0
  20. package/dist/auth/downstream-client-metadata.js +133 -0
  21. package/dist/auth/downstream-oauth.js +1584 -1580
  22. package/dist/auth/downstream-revocation.js +106 -0
  23. package/dist/auth/oauth-token-response.js +231 -0
  24. package/dist/auth/oauth-v2-migration.js +116 -0
  25. package/dist/auth/static-oauth.js +93 -71
  26. package/dist/auth-elicitation.js +288 -0
  27. package/dist/authorization-handoff.js +111 -0
  28. package/dist/branding.d.ts +8 -16
  29. package/dist/branding.js +26 -59
  30. package/dist/byte-read-response.js +39 -0
  31. package/dist/call-admission.js +12 -16
  32. package/dist/catalog-cache.js +739 -0
  33. package/dist/catalog-drift.d.ts +50 -15
  34. package/dist/catalog-drift.js +365 -128
  35. package/dist/catalog-fingerprint.js +2 -4
  36. package/dist/catalog-freshness.js +13 -0
  37. package/dist/catalog-limits.js +2 -2
  38. package/dist/catalog-service.js +409 -225
  39. package/dist/catalog.js +43 -84
  40. package/dist/concurrency.js +3 -4
  41. package/dist/config-defaults.d.ts +39 -0
  42. package/dist/config-defaults.js +46 -0
  43. package/dist/config-schema.d.ts +181 -0
  44. package/dist/config-schema.js +435 -0
  45. package/dist/config-value-sources.js +102 -0
  46. package/dist/config.d.ts +633 -0
  47. package/dist/config.js +508 -0
  48. package/dist/connector-access.d.ts +1 -0
  49. package/dist/connector-access.js +13 -15
  50. package/dist/connector-caller.d.ts +8 -0
  51. package/dist/connector-caller.js +15 -6
  52. package/dist/connector-scope.js +1 -1
  53. package/dist/connectors/api-connector.d.ts +59 -7
  54. package/dist/connectors/api-connector.js +106 -19
  55. package/dist/connectors/api.js +4 -1
  56. package/dist/connectors/guarded-fetch.d.ts +144 -0
  57. package/dist/connectors/guarded-fetch.js +87 -38
  58. package/dist/connectors/negotiation-cache.js +46 -0
  59. package/dist/connectors/option-shapes.js +27 -0
  60. package/dist/connectors/remote-mcp.d.ts +30 -4
  61. package/dist/connectors/remote-mcp.js +1774 -320
  62. package/dist/connectors/resource-uri.js +335 -0
  63. package/dist/credential-contract.d.ts +10 -0
  64. package/dist/credential-rules.js +1 -3
  65. package/dist/credential-url.js +108 -0
  66. package/dist/credentials.d.ts +6 -1
  67. package/dist/credentials.js +27 -18
  68. package/dist/d1.d.ts +130 -0
  69. package/dist/d1.js +290 -0
  70. package/dist/describe-config.d.ts +165 -0
  71. package/dist/describe-config.js +315 -0
  72. package/dist/described.js +106 -0
  73. package/dist/downstream-input-context.js +128 -0
  74. package/dist/downstream-input.js +325 -0
  75. package/dist/errors.d.ts +132 -31
  76. package/dist/errors.js +175 -87
  77. package/dist/execute.js +798 -318
  78. package/dist/executor-admission.d.ts +1 -0
  79. package/dist/executor-admission.js +11 -15
  80. package/dist/executor-contract.d.ts +20 -0
  81. package/dist/executor-contract.js +48 -0
  82. package/dist/executor-result.js +30 -13
  83. package/dist/executors/quickjs-child.js +15 -9
  84. package/dist/executors/quickjs-protocol.js +5 -6
  85. package/dist/executors/quickjs-runtime.js +152 -59
  86. package/dist/executors/quickjs.js +49 -39
  87. package/dist/favicon.js +1 -2
  88. package/dist/fix-prompt.js +1 -3
  89. package/dist/guest-runtime.js +238 -0
  90. package/dist/guest-types.d.ts +218 -0
  91. package/dist/guest-types.js +1 -0
  92. package/dist/html-security.js +24 -0
  93. package/dist/identity.js +1 -3
  94. package/dist/inbound-credential.js +52 -0
  95. package/dist/index.d.ts +24 -256
  96. package/dist/index.js +65 -478
  97. package/dist/invocation-auth.js +69 -0
  98. package/dist/invocation.js +262 -79
  99. package/dist/json-schema.d.ts +1 -1
  100. package/dist/mcp-client-context.js +35 -0
  101. package/dist/mcp-result.js +11 -7
  102. package/dist/meta-output.js +61 -0
  103. package/dist/meta-tool-names.d.ts +2 -0
  104. package/dist/meta-tool-names.js +3 -0
  105. package/dist/meta-tools.js +419 -272
  106. package/dist/module-contracts.d.ts +8 -23
  107. package/dist/node.d.ts +0 -2
  108. package/dist/node.js +2 -2
  109. package/dist/oauth-callback-outcome.js +1 -3
  110. package/dist/oauth-handoff.js +194 -0
  111. package/dist/oauth-sealing.js +20 -0
  112. package/dist/operator-record.d.ts +137 -0
  113. package/dist/operator-record.js +420 -0
  114. package/dist/operator-ui/assets.js +31 -0
  115. package/dist/operator-ui/contract.d.ts +72 -0
  116. package/dist/operator-ui/contract.js +1 -0
  117. package/dist/operator-ui/fix-prompts.d.ts +18 -0
  118. package/dist/operator-ui/generated.js +5 -4
  119. package/dist/operator-ui/model.d.ts +12 -87
  120. package/dist/operator-ui/model.js +2 -9
  121. package/dist/operator-ui/setup-commands.js +1 -3
  122. package/dist/operator-ui/view.d.ts +323 -0
  123. package/dist/operator-ui/view.js +62 -189
  124. package/dist/page-styles.js +2 -3
  125. package/dist/program-result.js +5 -0
  126. package/dist/program-source.js +14 -2
  127. package/dist/{exempt-writes.js → program-writes.js} +60 -19
  128. package/dist/provider.d.ts +142 -0
  129. package/dist/provider.js +187 -0
  130. package/dist/providers/_shared/google/result-size.js +57 -0
  131. package/dist/providers/_shared/google/service-account.d.ts +58 -0
  132. package/dist/providers/_shared/google/service-account.js +500 -0
  133. package/dist/providers/_shared/google/workspace.d.ts +276 -0
  134. package/dist/providers/_shared/google/workspace.js +518 -0
  135. package/dist/providers/_shared/request-token.js +83 -0
  136. package/dist/providers/{basecamp.d.ts → basecamp/index.d.ts} +6 -28
  137. package/dist/providers/basecamp/index.js +997 -0
  138. package/dist/providers/basecamp/skill.generated.js +9 -0
  139. package/dist/providers/{breeze.d.ts → breeze/index.d.ts} +2 -2
  140. package/dist/providers/{breeze.js → breeze/index.js} +184 -140
  141. package/dist/providers/breeze/skill.generated.js +9 -0
  142. package/dist/providers/{ccb.d.ts → ccb/index.d.ts} +2 -2
  143. package/dist/providers/{ccb.js → ccb/index.js} +271 -116
  144. package/dist/providers/ccb/skill.generated.js +9 -0
  145. package/dist/providers/{cloudflare.d.ts → cloudflare/index.d.ts} +8 -7
  146. package/dist/providers/{cloudflare.js → cloudflare/index.js} +171 -738
  147. package/dist/providers/cloudflare/skill.generated.js +10 -0
  148. package/dist/providers/docs/index.d.ts +54 -0
  149. package/dist/providers/docs/index.js +1237 -0
  150. package/dist/providers/docs/skill.generated.js +9 -0
  151. package/dist/providers/drive/index.d.ts +53 -0
  152. package/dist/providers/drive/index.js +1523 -0
  153. package/dist/providers/drive/skill.generated.js +9 -0
  154. package/dist/providers/forms/index.d.ts +54 -0
  155. package/dist/providers/forms/index.js +1217 -0
  156. package/dist/providers/forms/skill.generated.js +11 -0
  157. package/dist/providers/github/auth.d.ts +32 -0
  158. package/dist/providers/github/auth.js +361 -0
  159. package/dist/providers/github/hosted.js +218 -0
  160. package/dist/providers/github/index.d.ts +13 -0
  161. package/dist/providers/github/index.js +140 -0
  162. package/dist/providers/github/key.js +100 -0
  163. package/dist/providers/github/rest.js +321 -0
  164. package/dist/providers/github/scope.d.ts +29 -0
  165. package/dist/providers/github/scope.js +124 -0
  166. package/dist/providers/github/skill.generated.js +8 -0
  167. package/dist/providers/gmail/index.d.ts +51 -0
  168. package/dist/providers/gmail/index.js +1436 -0
  169. package/dist/providers/gmail/skill.generated.js +9 -0
  170. package/dist/providers/infisical/index.d.ts +7 -0
  171. package/dist/providers/infisical/index.js +713 -0
  172. package/dist/providers/infisical/skill.generated.js +8 -0
  173. package/dist/providers/{linear.d.ts → linear/index.d.ts} +11 -14
  174. package/dist/providers/linear/index.js +352 -0
  175. package/dist/providers/linear/skill.generated.js +8 -0
  176. package/dist/providers/{mixpanel.d.ts → mixpanel/index.d.ts} +5 -10
  177. package/dist/providers/mixpanel/index.js +416 -0
  178. package/dist/providers/mixpanel/skill.generated.js +9 -0
  179. package/dist/providers/{notion.d.ts → notion/index.d.ts} +8 -8
  180. package/dist/providers/{notion.js → notion/index.js} +226 -239
  181. package/dist/providers/notion/skill.generated.js +10 -0
  182. package/dist/providers/{overflow.d.ts → overflow/index.d.ts} +2 -2
  183. package/dist/providers/{overflow.js → overflow/index.js} +74 -111
  184. package/dist/providers/overflow/skill.generated.js +8 -0
  185. package/dist/providers/{planning-center.d.ts → planning-center/index.d.ts} +2 -2
  186. package/dist/providers/{planning-center.js → planning-center/index.js} +264 -104
  187. package/dist/providers/planning-center/skill.generated.js +10 -0
  188. package/dist/providers/{revenuecat.d.ts → revenuecat/index.d.ts} +5 -10
  189. package/dist/providers/revenuecat/index.js +557 -0
  190. package/dist/providers/revenuecat/skill.generated.js +11 -0
  191. package/dist/providers/sheets/index.d.ts +54 -0
  192. package/dist/providers/sheets/index.js +1237 -0
  193. package/dist/providers/sheets/skill.generated.js +10 -0
  194. package/dist/providers/slides/index.d.ts +53 -0
  195. package/dist/providers/slides/index.js +2645 -0
  196. package/dist/providers/slides/skill.generated.js +9 -0
  197. package/dist/providers/{stripe.d.ts → stripe/index.d.ts} +5 -12
  198. package/dist/providers/stripe/index.js +266 -0
  199. package/dist/providers/stripe/skill.generated.js +11 -0
  200. package/dist/providers/{tithely.d.ts → tithely/index.d.ts} +2 -2
  201. package/dist/providers/{tithely.js → tithely/index.js} +60 -91
  202. package/dist/providers/tithely/skill.generated.js +8 -0
  203. package/dist/providers/{vercel.d.ts → vercel/index.d.ts} +8 -8
  204. package/dist/providers/vercel/index.js +1038 -0
  205. package/dist/providers/vercel/mcp-ownership.js +212 -0
  206. package/dist/providers/vercel/skill.generated.js +11 -0
  207. package/dist/registry.d.ts +110 -171
  208. package/dist/registry.js +588 -927
  209. package/dist/request-state.js +21 -0
  210. package/dist/resource-read.js +103 -0
  211. package/dist/result-shapes.js +17 -49
  212. package/dist/retired-toolkits.js +1 -1
  213. package/dist/routes/access-tokens.js +3 -6
  214. package/dist/routes/activity-context.js +21 -0
  215. package/dist/routes/activity-disclosure.js +40 -0
  216. package/dist/routes/activity.js +59 -21
  217. package/dist/routes/actor-labels.js +3 -50
  218. package/dist/routes/connect.js +221 -0
  219. package/dist/routes/credentials.js +15 -27
  220. package/dist/routes/mcp.js +365 -130
  221. package/dist/routes/oauth-client-metadata.js +15 -0
  222. package/dist/routes/oauth-management.js +45 -107
  223. package/dist/routes/oauth.js +110 -57
  224. package/dist/routes/operator.js +3 -3
  225. package/dist/routes/shared.d.ts +25 -64
  226. package/dist/routes/shared.js +160 -80
  227. package/dist/routes/skills.js +30 -0
  228. package/dist/routes/ui-config.js +225 -0
  229. package/dist/routes/ui-data.js +40 -35
  230. package/dist/routes/ui.js +66 -56
  231. package/dist/runtime/admission.js +4 -2
  232. package/dist/runtime/call-admission.js +3 -1
  233. package/dist/runtime/connector-scope.js +1 -4
  234. package/dist/runtime/run.js +10 -39
  235. package/dist/runtime/services.js +12 -117
  236. package/dist/runtime/shared-read.js +1 -3
  237. package/dist/runtime/storage.js +8 -1
  238. package/dist/sent-secrets.d.ts +93 -0
  239. package/dist/sent-secrets.js +1013 -0
  240. package/dist/server.js +28 -71
  241. package/dist/skills.js +416 -174
  242. package/dist/sqlite.d.ts +48 -0
  243. package/dist/sqlite.js +181 -0
  244. package/dist/storage/keys.js +443 -0
  245. package/dist/storage/memory.js +16 -4
  246. package/dist/storage/sql.d.ts +66 -0
  247. package/dist/storage/sql.js +543 -0
  248. package/dist/timeout.js +4 -2
  249. package/dist/tool-name.js +17 -0
  250. package/dist/tool-safety.d.ts +9 -35
  251. package/dist/tool-safety.js +20 -40
  252. package/dist/types.d.ts +336 -56
  253. package/dist/types.js +0 -1
  254. package/dist/ui.d.ts +7 -19
  255. package/dist/ui.js +76 -90
  256. package/dist/url-safety.js +3 -6
  257. package/dist/usage-guide.js +146 -0
  258. package/dist/validate.d.ts +7 -0
  259. package/dist/validate.js +309 -47
  260. package/dist/version.d.ts +1 -7
  261. package/dist/version.js +3 -7
  262. package/dist/worker.d.ts +11 -0
  263. package/dist/worker.js +435 -0
  264. package/documentation/README.md +63 -0
  265. package/documentation/architecture.md +696 -231
  266. package/documentation/auth.md +1069 -546
  267. package/documentation/code-mode.md +662 -356
  268. package/documentation/deploying.md +146 -0
  269. package/documentation/integrating.md +159 -0
  270. package/documentation/meta-tools.md +570 -216
  271. package/documentation/operating.md +135 -0
  272. package/documentation/operator-tests.md +97 -0
  273. package/documentation/operator-ui.md +132 -0
  274. package/documentation/provider-migration-0.29.md +65 -0
  275. package/examples/worker/AGENTS.md +34 -12
  276. package/examples/worker/README.md +293 -255
  277. package/examples/worker/kv-to-d1.wrangler.jsonc +26 -0
  278. package/examples/worker/scripts/copy-kv-to-d1.mjs +162 -0
  279. package/examples/worker/src/connecta.config.ts +151 -0
  280. package/examples/worker/src/index.ts +14 -197
  281. package/examples/worker/wrangler.jsonc +15 -35
  282. package/package.json +126 -54
  283. package/templates/node/.dockerignore +1 -2
  284. package/templates/node/.env.example +20 -21
  285. package/templates/node/AGENTS.md +21 -17
  286. package/templates/node/Dockerfile +3 -5
  287. package/templates/node/README.md +140 -58
  288. package/templates/node/docker-compose.yml +11 -12
  289. package/templates/node/package.json +4 -2
  290. package/templates/node/src/connecta.config.ts +119 -0
  291. package/templates/node/src/index.ts +9 -154
  292. package/templates/node/src/provision-token.ts +17 -0
  293. package/AGENTS.md +0 -170
  294. package/dist/artifacts/connector.d.ts +0 -58
  295. package/dist/artifacts/connector.js +0 -730
  296. package/dist/artifacts/document.js +0 -86
  297. package/dist/artifacts/guide.js +0 -140
  298. package/dist/artifacts/html-scan.js +0 -329
  299. package/dist/artifacts/json.js +0 -78
  300. package/dist/artifacts/kv-store.d.ts +0 -20
  301. package/dist/artifacts/kv-store.js +0 -140
  302. package/dist/artifacts/markdown.js +0 -478
  303. package/dist/artifacts/module.d.ts +0 -37
  304. package/dist/artifacts/module.js +0 -66
  305. package/dist/artifacts/operations.d.ts +0 -197
  306. package/dist/artifacts/operations.js +0 -1002
  307. package/dist/artifacts/refresh.d.ts +0 -55
  308. package/dist/artifacts/refresh.js +0 -236
  309. package/dist/artifacts/routes.js +0 -206
  310. package/dist/artifacts/types.d.ts +0 -214
  311. package/dist/artifacts/types.js +0 -22
  312. package/dist/artifacts/validate.d.ts +0 -62
  313. package/dist/artifacts/validate.js +0 -651
  314. package/dist/artifacts.d.ts +0 -6
  315. package/dist/artifacts.js +0 -9
  316. package/dist/auth/bearer.d.ts +0 -11
  317. package/dist/auth/bearer.js +0 -50
  318. package/dist/providers/basecamp.js +0 -445
  319. package/dist/providers/linear.js +0 -217
  320. package/dist/providers/mixpanel.js +0 -247
  321. package/dist/providers/revenuecat.js +0 -317
  322. package/dist/providers/stripe.js +0 -253
  323. package/dist/providers/vercel.js +0 -1253
  324. package/dist/storage/file.d.ts +0 -15
  325. package/dist/storage/file.js +0 -455
  326. package/ethos.md +0 -93
  327. package/examples/worker/src/cloudflare-kv.ts +0 -43
  328. package/examples/worker/src/d1-activity-row.ts +0 -155
  329. package/examples/worker/src/d1-activity.ts +0 -147
  330. package/examples/worker/src/d1-storage.ts +0 -138
  331. package/examples/worker/src/r2-artifact-blobs.ts +0 -29
  332. package/templates/node/src/file-activity.ts +0 -182
@@ -1,25 +1,8 @@
1
- import type { CatalogAccessObservation, CatalogDriftReport } from "../types.js";
2
- /**
3
- * Which call path a tool takes, decided on the server by the same
4
- * `isExplicitlyReadOnly` predicate discovery and invocation use
5
- * (`src/tool-safety.ts`) and never re-derived in the browser: a second copy of
6
- * the rule is a second place for it to be wrong.
7
- *
8
- * - `runs_in_programs` — explicitly read-only, so `execute_code` may call it.
9
- * - `exempt` — not read-only, but the deployment's `execute.approval` lets a
10
- * program call it without asking (#566). Still approval-required
11
- * everywhere else.
12
- * - `needs_approval` — everything else: a program refuses it, and it crosses
13
- * `call_destructive_tool`, where the host asks.
14
- *
15
- * The badge renders from a table keyed by this union, so each value is one
16
- * entry, not a branch.
17
- */
18
- export type UiToolSafety = "runs_in_programs" | "exempt" | "needs_approval";
19
- export interface UiTool {
20
- name: string;
21
- address: string;
22
- description?: string;
1
+ import type { OperatorConnectorOverlay, OperatorTool, OperatorUiContract, OperatorViewer } from "./contract.js";
2
+ import type { CatalogAccessObservation, CatalogDriftReport, ResourceTemplateRefusalCode } from "../types.js";
3
+ /** Tool verdicts, independent of the selected pool's trust. */
4
+ export type UiToolSafety = "runs_in_programs" | "needs_approval";
5
+ export interface UiTool extends Pick<OperatorTool, "name" | "address" | "description"> {
23
6
  /** Absent only in payloads older than the field; the page then shows no badge. */
24
7
  safety?: UiToolSafety;
25
8
  }
@@ -76,12 +59,8 @@ export interface UiConnector {
76
59
  authScope?: "shared" | "personal";
77
60
  title?: string;
78
61
  description?: string;
79
- status: "loading" | "ok" | "auth_required" | "error";
80
- permissions?: {
81
- use: boolean;
82
- manageSharedAuth: boolean;
83
- connectPersonal: boolean;
84
- };
62
+ status: "loading" | OperatorConnectorOverlay["status"];
63
+ permissions?: Omit<OperatorViewer["permissions"]["connectors"][number], "id">;
85
64
  /**
86
65
  * Why this connector is not usable, when it is not. See `UiProblem`. The
87
66
  * only failure detail the payload carries; the status message behind it is
@@ -93,6 +72,8 @@ export interface UiConnector {
93
72
  tools: UiTool[];
94
73
  /** This connector exposes manageable downstream OAuth lifecycle hooks. */
95
74
  oauth?: boolean;
75
+ /** Selected downstream client identity mechanism; never a client ID or secret. */
76
+ registrationPath?: "cimd" | "dcr" | "static";
96
77
  credential?: UiCredential;
97
78
  /**
98
79
  * Drift the last catalog refresh saw *in this runtime*
@@ -105,16 +86,14 @@ export interface UiConnector {
105
86
  catalogDrift?: CatalogDriftReport;
106
87
  /** Last agent-facing catalog read in this runtime; never persisted. */
107
88
  catalogAccess?: CatalogAccessObservation;
89
+ resourceTemplateRefusals?: ResourceTemplateRefusalCode[];
108
90
  }
109
91
  export type CredentialManagementCapability = "available" | "requires_operator" | "vault_not_configured" | "no_slots";
110
92
  export interface UiData {
111
93
  accessTokenManagement?: "available" | "requires_operator";
112
- serverInfo: {
113
- name: string;
114
- version: string;
115
- };
94
+ serverInfo: Pick<OperatorUiContract["config"]["server"], "name" | "version">;
116
95
  /** Version of the installed @zackbart/connecta package. */
117
- connectaVersion: string;
96
+ connectaVersion: OperatorUiContract["config"]["connectaVersion"];
118
97
  connectors: UiConnector[];
119
98
  activityEnabled: boolean;
120
99
  credentialManagement: CredentialManagementCapability;
@@ -126,60 +105,6 @@ export interface UiData {
126
105
  * it with a 404, so the page never enumerates a pool its reader cannot open.
127
106
  */
128
107
  pools?: string[];
129
- /** True when artifact pages are mounted and this identity may open them. */
130
- artifactsEnabled?: boolean;
131
- }
132
- /**
133
- * One row of the artifact library. Every field is a fact the store keeps or
134
- * an enum; nothing here is a message, a log line, or a downstream's words.
135
- */
136
- export interface UiArtifactRow {
137
- id: string;
138
- title: string;
139
- kind: "html" | "markdown";
140
- viewVersion: number;
141
- updatedAt: string;
142
- updatedBy: {
143
- label: string;
144
- };
145
- archived: boolean;
146
- freshness?: UiArtifactFreshness;
147
- }
148
- interface UiArtifactFreshness {
149
- state: "unconfigured" | "current" | "stale";
150
- schedule?: "manual" | "daily" | "weekly";
151
- document?: string;
152
- dueAt?: string;
153
- last?: {
154
- at: string;
155
- status: "succeeded" | "unchanged" | "failed" | "superseded";
156
- };
157
- running?: boolean;
158
- }
159
- /** The viewer's payload: the page's facts and the one document its frame loads. */
160
- export interface UiArtifactView {
161
- id: string;
162
- title: string;
163
- kind: "html" | "markdown";
164
- archived: boolean;
165
- snapshot: boolean;
166
- latestViewVersion: number;
167
- view: {
168
- version: number;
169
- at: string;
170
- by: {
171
- label: string;
172
- };
173
- };
174
- documents: {
175
- name: string;
176
- version: number;
177
- updatedAt: string;
178
- }[];
179
- url: string;
180
- snapshotUrl: string;
181
- document: string;
182
- freshness?: UiArtifactFreshness;
183
108
  }
184
109
  export interface FilteredUiConnector {
185
110
  connector: UiConnector;
@@ -7,18 +7,11 @@ export function filterUiConnectors(connectors, query) {
7
7
  const q = query.trim().toLowerCase();
8
8
  const filtered = [];
9
9
  for (const connector of connectors) {
10
- const connectorText = [
11
- connector.id,
12
- connector.title,
13
- connector.description,
14
- connector.status,
15
- ]
10
+ const connectorText = [connector.id, connector.title, connector.description, connector.status]
16
11
  .join(" ")
17
12
  .toLowerCase();
18
13
  const connectorMatches = Boolean(q && connectorText.includes(q));
19
- const tools = connector.tools.filter((tool) => !q ||
20
- connectorMatches ||
21
- `${tool.name} ${tool.description ?? ""}`.toLowerCase().includes(q));
14
+ const tools = connector.tools.filter((tool) => !q || connectorMatches || `${tool.name} ${tool.description ?? ""}`.toLowerCase().includes(q));
22
15
  if (q && tools.length === 0 && !connectorMatches)
23
16
  continue;
24
17
  filtered.push({ connector, tools });
@@ -28,9 +28,7 @@ export function poolEndpointUrl(mcpUrl, pool) {
28
28
  }
29
29
  /** POSIX single-quoting, only when the value needs it. */
30
30
  function shellWord(value) {
31
- return /^[A-Za-z0-9_./:@%+=,~-]+$/.test(value)
32
- ? value
33
- : `'${value.replace(/'/g, `'"'"'`)}'`;
31
+ return /^[A-Za-z0-9_./:@%+=,~-]+$/.test(value) ? value : `'${value.replace(/'/g, `'"'"'`)}'`;
34
32
  }
35
33
  export function clientSetupCommands(name, url) {
36
34
  return [
@@ -0,0 +1,323 @@
1
+ import type { OperatorUiContract } from "./contract.js";
2
+ import type { CatalogDriftReport } from "../types.js";
3
+ import type { CredentialManagementCapability, UiConnector, UiData, UiProblem } from "./model.js";
4
+ import type { FixPromptKind } from "./fix-prompts.js";
5
+ export declare function registrationPathLabel(path: NonNullable<UiConnector["registrationPath"]>): string;
6
+ export type OperatorPage = "overview" | "tools" | "access" | "config" | "connector" | "tokens" | "connections" | "activity";
7
+ /** Pages the nav lists. */
8
+ export declare const OPERATOR_PAGES: readonly OperatorPage[];
9
+ export declare const PAGE_META: Readonly<Record<OperatorPage, {
10
+ path: string;
11
+ label: string;
12
+ }>>;
13
+ /**
14
+ * What each page is for, in one line under its heading — on the gate as well
15
+ * as once signed in, so the page an operator lands on reads the same before
16
+ * and after the session is checked.
17
+ */
18
+ export declare function pageDescription(page: OperatorPage, productDescription: string): string;
19
+ /** What the gate says while the session is checked, page by page. */
20
+ export declare function checkingCopy(): string;
21
+ export declare function pageForPath(path: string): OperatorPage;
22
+ export interface UiActivityActor {
23
+ kind?: string;
24
+ id?: string;
25
+ namespace?: string;
26
+ label?: string;
27
+ }
28
+ export interface UiActivityEvent {
29
+ kind?: "catalog_drift";
30
+ drift?: import("../activity.js").ActivityCatalogChange;
31
+ id?: string;
32
+ requestId?: string;
33
+ classification?: "read" | "write";
34
+ resultBytes?: number;
35
+ occurredAt: string;
36
+ actor?: UiActivityActor;
37
+ connectorId: string;
38
+ toolName: string;
39
+ address: string;
40
+ source: string;
41
+ outcome: string;
42
+ durationMs: number;
43
+ attempts: number;
44
+ errorCode?: string;
45
+ friction?: string;
46
+ approval?: string;
47
+ packageVersion?: string;
48
+ clientName?: string;
49
+ clientVersion?: string;
50
+ }
51
+ /**
52
+ * Which fix prompt a failure offers. A kind and a configured connector id —
53
+ * the message beside it never travels with it.
54
+ */
55
+ export interface NoticeFix {
56
+ kind: FixPromptKind;
57
+ connectorId: string;
58
+ }
59
+ /** A message with the tone that decides its live region: status or alert. */
60
+ export interface Notice {
61
+ message: string;
62
+ tone: "info" | "error";
63
+ fix?: NoticeFix;
64
+ }
65
+ export declare function info(message: string): Notice;
66
+ export declare function failure(message: string, fix?: NoticeFix): Notice;
67
+ /**
68
+ * Why a request the page made did not land, as the store classifies it. Only
69
+ * this kind, a status code, and a closed `problem` enum ever reach a notice;
70
+ * the route's `error` text never does.
71
+ *
72
+ * - `session` — no usable session, or the route answered 401.
73
+ * - `forbidden` — the route answered 403: this identity may not do that. On a
74
+ * mutation that is a permission, not an expired session, so it stays inline.
75
+ * - `network` — the browser could not reach the deployment at all.
76
+ * - `refused` — the route answered, and said no.
77
+ */
78
+ export type RequestFailureKind = "session" | "forbidden" | "network" | "refused";
79
+ export interface RequestFailureFacts {
80
+ kind: RequestFailureKind;
81
+ status?: number | undefined;
82
+ problem?: unknown;
83
+ }
84
+ /**
85
+ * What the notices for an OAuth action and a credential Test say. Each of
86
+ * those actions reaches a downstream, and a downstream's refusal can quote the
87
+ * secret it was sent — so these notices are fixed sentences chosen by outcome,
88
+ * and no text the server sent back is ever one of them. The route logs the
89
+ * downstream's words on the host; the fix prompt beside a failure is keyed off
90
+ * the same outcome.
91
+ */
92
+ export type DownstreamAction = "oauth_disconnect" | "oauth_reconnect" | "credential_test";
93
+ /** Every action a connector row can start, downstream or not. */
94
+ export type RowAction = DownstreamAction | "credential_save" | "credential_remove";
95
+ /**
96
+ * The route's answer to a finished OAuth action. Its state picks the sentence;
97
+ * `opened` says whether the authorization page is already in a new tab.
98
+ */
99
+ export declare function oauthDoneNotice(action: "oauth_disconnect" | "oauth_reconnect", answer: {
100
+ state?: unknown;
101
+ code?: unknown;
102
+ } | null, opened?: boolean): Notice;
103
+ /** A credential Test's result. `ok` is the only part of the answer it reads. */
104
+ export declare function credentialTestNotice(connectorId: string, answer: {
105
+ ok?: unknown;
106
+ } | null): Notice;
107
+ /**
108
+ * A route that refused one of these actions. A credential Test that found
109
+ * nothing usable to test names the problem, which picks the same copy and fix
110
+ * prompt the Connections page uses for it; every other refusal gets the
111
+ * action's one sentence. `problem` is whatever the response carried, so it is
112
+ * checked, not trusted.
113
+ */
114
+ export declare function refusedNotice(action: DownstreamAction, connectorId: string, problem?: unknown): Notice;
115
+ /**
116
+ * Every row action's failure, in one voice. The page's own failures — a
117
+ * lapsed session, a denied identity, a dropped connection — read the same for
118
+ * every action; a route's refusal picks the action's fixed sentence.
119
+ */
120
+ export declare function actionFailedNotice(action: RowAction, connectorId: string, facts: RequestFailureFacts, productName: string): Notice;
121
+ /**
122
+ * Why one connector's details did not load, when the reason is on this side
123
+ * of the deployment rather than the downstream's. A downstream failure is the
124
+ * server's `connector_unavailable` and keeps its own copy and fix prompt;
125
+ * these two have nothing for a coding agent to fix.
126
+ */
127
+ export type ConnectorLoadFailure = "session" | "network";
128
+ export declare function connectorLoadFailureCopy(failure: ConnectorLoadFailure, productName: string): string;
129
+ /** The signed-in page's answer when `/ui/data` could not be read. */
130
+ export declare function loadFailureCopy(failure: "server" | "network", productName: string): {
131
+ title: string;
132
+ body: string;
133
+ };
134
+ /** A collection page's load failure: fixed words, whatever the route said. */
135
+ export declare function collectionFailureCopy(_collection: "activity", facts: RequestFailureFacts, productName: string): string;
136
+ /** A destructive or disruptive row action waiting for a second, in-page click. */
137
+ export interface PendingConfirm {
138
+ connectorId: string;
139
+ action: "oauth_disconnect" | "oauth_restart" | "credential_remove";
140
+ }
141
+ /** The confirm's question, naming the connector by its title. */
142
+ export declare function confirmCopy(action: PendingConfirm["action"], name: string): {
143
+ question: string;
144
+ confirm: string;
145
+ };
146
+ /**
147
+ * A remote collection's four states, named once so every page spells them the
148
+ * same way. `idle` is "nobody has asked yet" and is what makes a re-entered
149
+ * page fetch again after an identity change.
150
+ */
151
+ type LoadPhase = "idle" | "loading" | "ready" | "error";
152
+ export interface UiAccessToken {
153
+ id: string;
154
+ name: string;
155
+ tokenPrefix: string;
156
+ createdAt: string;
157
+ revokedAt?: string;
158
+ }
159
+ export declare function accessTokenUnavailableCopy(capability?: string): string;
160
+ export interface OperatorState {
161
+ tokenPhase: LoadPhase;
162
+ tokenNotice: Notice | null;
163
+ tokens: UiAccessToken[];
164
+ createdToken: string | null;
165
+ tokenRenaming: string | null;
166
+ tokenBusy: boolean;
167
+ page: OperatorPage;
168
+ /**
169
+ * Bumped by every identity change. Async work captures it before awaiting and
170
+ * throws its result away if the operator is no longer the one who asked —
171
+ * the fence that keeps one identity's data off another identity's screen.
172
+ */
173
+ generation: number;
174
+ /** `loading` until the first /ui/data answer decides gated or ready. */
175
+ session: "loading" | "gated" | "ready";
176
+ gate: Notice | null;
177
+ /** True while a signed-in operator's /ui/data is in flight. */
178
+ refreshing: boolean;
179
+ /**
180
+ * Why the last /ui/data read failed when the session itself was not the
181
+ * reason: the page stays signed in, with its chrome, and offers a retry.
182
+ * Only a 401 or 403 on that read returns to the gate.
183
+ */
184
+ loadFailure: "server" | "network" | null;
185
+ /**
186
+ * Element id the next render should focus. A rebuilt page has no stable node
187
+ * to hand focus to from an event handler, so the request travels through
188
+ * state and the shell spends it once the new markup exists.
189
+ */
190
+ pendingFocus: string | null;
191
+ /**
192
+ * Like `pendingFocus`, but spent only when focus has nowhere to be — the
193
+ * control that had it is gone. An action that lands next to its own control
194
+ * announces through its live region and leaves focus where the operator is.
195
+ */
196
+ focusIfLost: string | null;
197
+ data: UiData | null;
198
+ contract: OperatorUiContract | null;
199
+ contractPhase: LoadPhase;
200
+ health: "loading" | "ok" | "unavailable";
201
+ connectorFilter: string;
202
+ oauthNotice: Notice | null;
203
+ /** The connector row `oauthNotice` answers, which is where it renders. */
204
+ oauthNoticeFor: string | null;
205
+ /** Connector id whose OAuth mutation is in flight. */
206
+ oauthBusy: string | null;
207
+ /**
208
+ * Connector id whose authorization started while the browser refused the
209
+ * new tab: its row offers the link instead of the button.
210
+ */
211
+ oauthBlocked: string | null;
212
+ /** A row action waiting for its in-page confirmation. */
213
+ confirming: PendingConfirm | null;
214
+ /** Connectors whose details failed on this side of the deployment. */
215
+ connectorFailures: Readonly<Record<string, ConnectorLoadFailure>>;
216
+ credentialNotice: Notice | null;
217
+ /** The connector row `credentialNotice` answers. */
218
+ credentialNoticeFor: string | null;
219
+ /** Connector id whose credential form is open. */
220
+ credentialEditing: string | null;
221
+ /** Connector id whose credential mutation is in flight. */
222
+ credentialBusy: string | null;
223
+ activityPhase: LoadPhase;
224
+ activityNotice: Notice | null;
225
+ activityEvents: UiActivityEvent[];
226
+ activityCursor: string | null;
227
+ activitySearch: string;
228
+ }
229
+ export declare function initialState(page: OperatorPage): OperatorState;
230
+ /**
231
+ * Drop to the gate and forget the previous operator. Bumping the generation is
232
+ * what makes the drop stick: work already in flight for the old identity
233
+ * resolves into a state that no longer accepts it.
234
+ */
235
+ export declare function resetIdentity(state: OperatorState, gate?: Notice | null): OperatorState;
236
+ /**
237
+ * Leaving a page closes what should not survive it: a one-time secret, a half
238
+ * typed credential, and the notices that answered the page just left.
239
+ */
240
+ export declare function withPage(state: OperatorState, page: OperatorPage): OperatorState;
241
+ export declare function credentialUnavailableCopy(capability?: CredentialManagementCapability): string;
242
+ /**
243
+ * The status badge. An auth-needed connector is named by what it needs, so a
244
+ * row whose fix is "Add credential" does not say "Authorization needed".
245
+ */
246
+ export declare function connectorStatusLabel(status: string, problem?: UiProblem): string;
247
+ /** The tone a status carries wherever it is rendered as a badge or a tile. */
248
+ export type Tone = "ok" | "warn" | "danger" | "neutral";
249
+ export declare function connectorStatusTone(status: string): Tone;
250
+ export declare function problemCopy(problem: UiProblem | undefined): string | null;
251
+ /**
252
+ * A problem someone can fix by authorizing is a warning, matching the amber
253
+ * "Authorization needed" badge above it; one where something broke is an
254
+ * error. The two used to share the red box, so the row contradicted itself.
255
+ */
256
+ export declare function problemTone(problem: UiProblem): "warn" | "danger";
257
+ /**
258
+ * What this identity may do with a connector, in one line. Being able to use it
259
+ * is implied by seeing it at all, so the sentence covers authentication, which
260
+ * is the part that differs between operators.
261
+ */
262
+ export declare function permissionLabel(connector: UiConnector): string;
263
+ /**
264
+ * Hosted-provider catalog drift, as an operator reads it
265
+ * ([#343](https://github.com/zackbart/connecta/issues/343)).
266
+ *
267
+ * - `unavailable` — no refresh has been observed in this runtime, so there is
268
+ * nothing to report. Deliberately not `clean`: "we have not looked" and "we
269
+ * looked and it matches" are different answers, and only one of them is a
270
+ * reason to stop worrying.
271
+ * - `clean` — a refresh happened and every category counted zero.
272
+ * - `warning` — a refresh happened and at least one category did not.
273
+ */
274
+ export type DriftState = "clean" | "warning" | "unavailable";
275
+ export declare function driftState(drift?: CatalogDriftReport): DriftState;
276
+ /** Every category with its count, so a clean report still shows its zeros. */
277
+ export declare function driftCounts(drift?: CatalogDriftReport): Array<{
278
+ key: string;
279
+ label: string;
280
+ count: number;
281
+ }>;
282
+ /** One line naming the state and when it was observed. Never what drifted. */
283
+ export declare function driftSummary(drift?: CatalogDriftReport): string;
284
+ /**
285
+ * Only http/https may become a clickable href — the browser half of the gate
286
+ * `src/ui.ts` applies before an authorizationUrl is ever serialized. A hostile
287
+ * downstream that gets a `javascript:` URL past one of them still meets the
288
+ * other, and the caller renders inert text instead of a link.
289
+ */
290
+ export declare function safeHttpHref(url: string | undefined): string | null;
291
+ /** Locale timestamp, or "" for anything that is not a readable date. */
292
+ export declare function formatDate(value?: string): string;
293
+ /** Who made a call: their name when there is one, and how they signed in. */
294
+ export declare function actorLabel(actor?: UiActivityActor): string;
295
+ /**
296
+ * The stable id behind a friendly label, shown only when a label or namespace
297
+ * could otherwise make two different people look like one.
298
+ */
299
+ export declare function actorStableId(actor?: UiActivityActor): string | null;
300
+ export declare function filterActivity(events: UiActivityEvent[], query: string): UiActivityEvent[];
301
+ /** Counts only. What the deployment ran, never what it sent or received. */
302
+ export declare function activitySummary(events: UiActivityEvent[]): string;
303
+ export declare function activityOutcomeClass(outcome: string): string;
304
+ export declare function activityOutcomeBadge(outcome: string): {
305
+ label: string;
306
+ tone: Tone;
307
+ };
308
+ /** The one-line detail under an address: where it ran, retries, and why it stalled. */
309
+ export declare function activityDetail(event: UiActivityEvent): string;
310
+ /**
311
+ * A stored credential that cannot be used, by cause. The payload's `error`
312
+ * beside it is not shown: it can carry a vault's own words.
313
+ */
314
+ export declare function credentialProblemCopy(problem: string | undefined): string;
315
+ export declare function credentialStateLabel(credential: {
316
+ configured: boolean;
317
+ fields?: unknown[];
318
+ lastFour?: string;
319
+ updatedAt?: string;
320
+ }): string;
321
+ /** Gate copy for each browser-auth shape, so the sign-in state is never a blank page. */
322
+ export declare function gateCopy(kind: string, signedIn: boolean): string;
323
+ export {};