@zackbart/connecta 0.33.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/README.md +99 -128
- package/SECURITY.md +1 -1
- package/bin/version.mjs +1 -1
- package/dist/activity.d.ts +3 -0
- package/dist/branding.d.ts +7 -0
- package/dist/branding.js +76 -9
- package/dist/catalog-service.js +15 -1
- package/dist/config-value-sources.js +6 -1
- package/dist/config.d.ts +13 -2
- package/dist/config.js +36 -2
- package/dist/connector-caller.js +2 -1
- package/dist/describe-config.d.ts +3 -1
- package/dist/describe-config.js +1 -0
- package/dist/execute.js +1 -11
- package/dist/fix-prompt.js +2 -2
- package/dist/index.js +1 -0
- package/dist/membership.d.ts +2 -0
- package/dist/oauth-callback-outcome.js +2 -2
- package/dist/operator-ui/agents.d.ts +1 -1
- package/dist/operator-ui/agents.js +16 -16
- package/dist/operator-ui/config-summary.js +562 -0
- package/dist/operator-ui/connection-map.js +375 -0
- package/dist/operator-ui/endpoints.js +44 -15
- package/dist/operator-ui/fix-prompts.js +1 -1
- package/dist/operator-ui/generated.js +4 -4
- package/dist/operator-ui/member-page.js +13 -28
- package/dist/operator-ui/overview.js +134 -0
- package/dist/operator-ui/view.d.ts +27 -22
- package/dist/operator-ui/view.js +104 -88
- package/dist/page-styles.js +5 -3
- package/dist/providers/_shared/google/workspace.d.ts +6 -4
- package/dist/providers/_shared/google/workspace.js +6 -2
- package/dist/providers/ccb/index.js +1 -1
- package/dist/providers/docs/index.js +1 -1
- package/dist/providers/docs/skill.generated.js +2 -2
- package/dist/providers/drive/index.js +1 -1
- package/dist/providers/drive/skill.generated.js +2 -2
- package/dist/providers/forms/index.js +1 -1
- package/dist/providers/forms/skill.generated.js +2 -2
- package/dist/providers/gmail/index.js +1 -1
- package/dist/providers/gmail/skill.generated.js +2 -2
- package/dist/providers/mixpanel/skill.generated.js +3 -3
- package/dist/providers/notion/skill.generated.js +1 -1
- package/dist/providers/overflow/index.js +1 -1
- package/dist/providers/overflow/skill.generated.js +2 -2
- package/dist/providers/planning-center/index.js +1 -1
- package/dist/providers/planning-center/skill.generated.js +4 -4
- package/dist/providers/revenuecat/skill.generated.js +2 -2
- package/dist/providers/sheets/index.js +1 -1
- package/dist/providers/sheets/skill.generated.js +2 -2
- package/dist/providers/slides/index.js +1 -1
- package/dist/providers/slides/skill.generated.js +2 -2
- package/dist/providers/tithely/index.js +1 -1
- package/dist/providers/vercel/index.js +1 -1
- package/dist/providers/vercel/skill.generated.js +1 -1
- package/dist/registry.js +15 -0
- package/dist/routes/mcp.js +20 -13
- package/dist/routes/oauth.js +2 -2
- package/dist/skills.js +10 -0
- package/dist/storage/sql.js +5 -1
- package/dist/types.d.ts +18 -7
- package/dist/ui.js +9 -4
- package/dist/usage-guide.js +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/documentation/README.md +2 -2
- package/documentation/architecture.md +18 -13
- package/documentation/auth.md +183 -67
- package/documentation/code-mode.md +23 -5
- package/documentation/deploying.md +5 -1
- package/documentation/integrating.md +9 -6
- package/documentation/meta-tools.md +36 -22
- package/documentation/migration-0.33.md +21 -13
- package/documentation/migration-0.34.md +67 -0
- package/documentation/operator-tests.md +46 -20
- package/documentation/operator-ui.md +294 -104
- package/examples/worker/AGENTS.md +15 -9
- package/examples/worker/README.md +41 -14
- package/examples/worker/src/connecta.config.ts +5 -4
- package/examples/worker/wrangler.jsonc +1 -1
- package/package.json +19 -19
- package/templates/node/AGENTS.md +13 -7
- package/templates/node/README.md +14 -11
- package/templates/node/package.json +1 -1
- package/templates/node/src/connecta.config.ts +2 -2
|
@@ -10,6 +10,7 @@ credential ownership, and grants use [Auth](./auth.md).
|
|
|
10
10
|
| Task | Read |
|
|
11
11
|
| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
12
12
|
| Enable UI, vault, or history in a deployment | [Setup](#setup), then the platform template |
|
|
13
|
+
| Find what a page shows or where a route goes | [Pages](#pages) |
|
|
13
14
|
| Find a member's endpoint or set up their client | [Use the member page](#use-the-member-page) |
|
|
14
15
|
| Consume config, provenance, status, or activity | [Operator data contract](#operator-data-contract) |
|
|
15
16
|
| Change a UI page or data route | [Source and tests](#source-and-tests), [browser verification](./operator-tests.md) |
|
|
@@ -23,82 +24,6 @@ and [Worker example](../examples/worker/README.md#select-optional-modules)
|
|
|
23
24
|
own the runnable configuration, variables, and branding shape. The UI is an
|
|
24
25
|
explicit optional import and stays outside the root package import graph.
|
|
25
26
|
|
|
26
|
-
Endpoints, Connectors, Activity, Tokens, and Settings are the maintainer's
|
|
27
|
-
pages. Endpoints is the default page at `/`: one row for `/mcp` and each pool,
|
|
28
|
-
with a copyable URL, who can use it, tool count, endpoint mode, and client
|
|
29
|
-
setup. Who can use it is `root.maintainers` on `/mcp` and the pool's `members`
|
|
30
|
-
elsewhere: a person by label, or by raw id when the label is null, beside their
|
|
31
|
-
initials, and an agent as `agent:<name>` with a token mark. A row shows four
|
|
32
|
-
and a "+N more" button that reveals the rest. A pool with
|
|
33
|
-
agent members also shows its agent URL, muted. Expanding a row lists each
|
|
34
|
-
connector on that endpoint with what it runs as and its tools, marking write
|
|
35
|
-
tools. The runs-as label comes from that endpoint's matrix cell. A shared connector
|
|
36
|
-
names its credential's source: "Shared · saved <date>" (vault), "Shared ·
|
|
37
|
-
connected <date>" (OAuth), "Shared · not configured", "Shared · set in
|
|
38
|
-
deployment", or "Shared · no credential needed"; a vault or OAuth cell without a
|
|
39
|
-
date omits it. The others read "Personal · N of M connected", "Workspace · people:
|
|
40
|
-
self · agents: <owner>" (or "none"), or "Everyone acts as <subject>" for a
|
|
41
|
-
fixed-subject Workspace connector. Connector health is not repeated per
|
|
42
|
-
endpoint: a connector that needs attention gets a status dot linking to its
|
|
43
|
-
Connection tab. Counts intersect live tools with the pool's declared tools
|
|
44
|
-
(the `/mcp` matrix cells for the root), guarded grants' live verdicts, and
|
|
45
|
-
read-only mode. Connectors lists each connector with one status badge, auth
|
|
46
|
-
scope, tool count, and last call; a problem adds one action (Connect, Replace
|
|
47
|
-
key, or Inspect) that opens Connection. A List / Matrix toggle (`?view=matrix`)
|
|
48
|
-
switches to a table of connectors by endpoint, `/mcp` first: each cell reads
|
|
49
|
-
"all", a tool count, or a dash, read-only columns are tinted, and a Runs as
|
|
50
|
-
column summarizes the `/mcp` cell, else the first pool's. A cell with tools is
|
|
51
|
-
a button named like "GitHub on /mcp/support: 1 tool, read-only"; Enter, Space or
|
|
52
|
-
a click opens a popover listing exactly that cell's tool names, write tools
|
|
53
|
-
marked, with the cell's runs-as. Escape or Tab returns focus to the cell. The
|
|
54
|
-
popover opens below its cell, or above when the viewport has more room there,
|
|
55
|
-
with a capped height that scrolls; CSS anchor positioning places it, and the
|
|
56
|
-
page sets no inline styles. A browser without anchor positioning gets the same
|
|
57
|
-
list, with the same keys, in an expansion row under the connector. `GET /ui/api/config` is the browser's one gate: a 401
|
|
58
|
-
shows sign-in, the private 404 shows a "No access" page naming who to ask, with
|
|
59
|
-
Sign out or Change token, and a 200 renders by `role`. `/ui/data`, connector
|
|
60
|
-
details, activity and tokens are requested only after the contract says
|
|
61
|
-
`maintainer`, and every such read checks the role again when it is sent, focus
|
|
62
|
-
returns included. Until a role is confirmed, the page shows its loading or
|
|
63
|
-
error state and no navigation. The store keeps the last confirmed role through
|
|
64
|
-
a failed refresh: a maintainer's page stays mounted, inert and dimmed, under
|
|
65
|
-
one shell banner with Retry, whichever page it is, and sends nothing
|
|
66
|
-
maintainer-only until a contract confirms the role again. Recovery closes the
|
|
67
|
-
page's dialogs, drawers and popovers and the command palette, and moves focus
|
|
68
|
-
to Retry. Credential and OAuth writes also wait for a contract that agrees
|
|
69
|
-
with the confirmed role: a maintainer's for a connector it shows, a member's
|
|
70
|
-
for a personal connector their contract lists with that action in `manage`;
|
|
71
|
-
otherwise the write is not sent and its row says so. An
|
|
72
|
-
answer with a different role clears everything read under the old one and
|
|
73
|
-
admits the viewer again. A
|
|
74
|
-
pool member sees the [member page](#use-the-member-page) on every path, with
|
|
75
|
-
no tabs. Connector
|
|
76
|
-
detail has Tools, Connection, and Activity tabs. Connection combines
|
|
77
|
-
authentication (including the OAuth client mechanism), catalog diagnostics,
|
|
78
|
-
one fix prompt beside each problem it reports, and the connector snapshot with its source. Settings combines inbound-auth facts with the
|
|
79
|
-
configuration snapshot and labels values as default or configured. Deployment code owns connectors, grants, pools, and classification;
|
|
80
|
-
the UI changes only authorized authentication material.
|
|
81
|
-
|
|
82
|
-
Tokens has one row per agent declared in code, in `GET /ui/access-tokens`
|
|
83
|
-
order: its pools, a state badge (No token, Issued or Revoked), the issue or
|
|
84
|
-
revoke date, and last seen ("never" when null). One line says agents are
|
|
85
|
-
declared in code; nothing creates or renames one. Issue appears for a slot with
|
|
86
|
-
no token or a revoked one, Rotate and Revoke for an issued one; rotate and
|
|
87
|
-
revoke ask first in a row under the agent's, with focus on Cancel. Every
|
|
88
|
-
mutation sends `{ "expect": "<revision>" }` with the slot revision the
|
|
89
|
-
operator confirmed against. A new secret opens once in a dialog with a copy
|
|
90
|
-
button and a note that it won't be shown again; closing it drops the secret
|
|
91
|
-
from the page, and recovery never closes it. A 409 `slot_changed` reads
|
|
92
|
-
"Changed since you looked, refresh"; a 503 `outcome_unknown` or 499 `aborted`
|
|
93
|
-
is a failure notice and is never retried. Sending a mutation leaves the slot
|
|
94
|
-
unresolved until its successful response is validated, which resolves it. Any
|
|
95
|
-
other outcome, a contract whose `agents[].token` disagrees with the list
|
|
96
|
-
(revision included) or drops the agent, or a failed read leaves it unresolved
|
|
97
|
-
until a slot-list read that started afterwards succeeds. Until then its
|
|
98
|
-
controls are off with "Refresh to continue", and each action is
|
|
99
|
-
checked again immediately before it is sent. Under the recovery banner Tokens
|
|
100
|
-
offers no Refresh of its own, and an open rotate or revoke question closes.
|
|
101
|
-
|
|
102
27
|
Install the vault for declared credential slots and activity history for
|
|
103
28
|
persisted call records. Neither module grants permission to manage or read
|
|
104
29
|
it: [auth](./auth.md#management-permissions) does. Interactive maintainers
|
|
@@ -108,24 +33,286 @@ Token management issues, rotates, and revokes the tokens of agents declared in
|
|
|
108
33
|
code; it never creates, renames, or binds an agent. Agent tokens never grant
|
|
109
34
|
interactive credential or token management authority.
|
|
110
35
|
|
|
36
|
+
## Pages
|
|
37
|
+
|
|
38
|
+
The UI shows configuration and never edits it. Deployment code owns
|
|
39
|
+
connectors, grants, pools, agents and classification. The UI changes only
|
|
40
|
+
credentials, OAuth connections and agent tokens, through the existing routes.
|
|
41
|
+
No select menu displays configuration. Copy is short labels; a failure names
|
|
42
|
+
what to do next in one or two sentences and never quotes a route's or
|
|
43
|
+
downstream's text.
|
|
44
|
+
|
|
45
|
+
| Path | Page | Who |
|
|
46
|
+
| ------------------ | ------------------------------------------------------ | ---------- |
|
|
47
|
+
| `/` | Overview (a member gets the member page) | Maintainer |
|
|
48
|
+
| `/endpoints` | Endpoints; `#mcp/<pool>` opens that row | Maintainer |
|
|
49
|
+
| `/connectors` | Connectors list; `?view=matrix` for the matrix | Maintainer |
|
|
50
|
+
| `/connectors/<id>` | Connector detail; `#tools`, `#connection`, `#activity` | Maintainer |
|
|
51
|
+
| `/activity` | Activity | Maintainer |
|
|
52
|
+
| `/tokens` | Tokens, when token management is open to the viewer | Maintainer |
|
|
53
|
+
| `/settings` | Settings | Maintainer |
|
|
54
|
+
|
|
55
|
+
`/access` redirects to `/endpoints`, `/tools` to `/connectors`, and `/config`
|
|
56
|
+
to `/settings`, replacing the history entry. Connector hashes `#config`,
|
|
57
|
+
`#auth` and `#diagnostics` redirect to `#connection` and keep query
|
|
58
|
+
parameters such as signed handoffs. A pool member sees the
|
|
59
|
+
[member page](#use-the-member-page) on every path.
|
|
60
|
+
|
|
61
|
+
### Overview
|
|
62
|
+
|
|
63
|
+
- **Status pill.** "N need attention" (red when a connector is failing) or
|
|
64
|
+
"All healthy". No pill without connectors.
|
|
65
|
+
- **Stat tiles.** Connectors (healthy of total, a bar with one segment per
|
|
66
|
+
connector in its health color), Endpoints (count, a bar split read-only and
|
|
67
|
+
read-write), and People · Agents (both counts, up to eight avatars and agent
|
|
68
|
+
marks; a tokenless agent's mark is hollow). A dot legend counts each segment
|
|
69
|
+
kind; the first two tiles link to their pages. At 760px and below the tiles
|
|
70
|
+
sit two up, with People · Agents as one row across both.
|
|
71
|
+
- **Needs attention.** One row per connector whose health is not ok, failing
|
|
72
|
+
first, then one per agent in a pool whose token is missing or revoked. A
|
|
73
|
+
row names the problem ("crm needs authorization"), the endpoints it
|
|
74
|
+
affects ("Affects /mcp and /mcp/team") or the agent URL it can't connect at,
|
|
75
|
+
and links to the existing fix: Connect, Replace key, Inspect or Review on
|
|
76
|
+
the connector's Connection tab, or Issue token on Tokens. A row with a
|
|
77
|
+
problem code or drift also has Copy fix prompt. A problem keeps its row and
|
|
78
|
+
prompt when the connector's detail read failed, prefixed "Details didn't
|
|
79
|
+
load". With no rows it reads "All clear".
|
|
80
|
+
- **Who reaches what.** The [connection map](#connection-map).
|
|
81
|
+
|
|
82
|
+
### Connection map
|
|
83
|
+
|
|
84
|
+
An SVG flow of callers (people in contract order, then declared agents) to
|
|
85
|
+
endpoints (`/mcp`, then pools) to connectors in config order, with a last
|
|
86
|
+
column of each connector's read and write tool counts. A connector whose
|
|
87
|
+
catalog is unknown (failed or not yet observed) draws a muted dash there
|
|
88
|
+
instead of "0 tools".
|
|
89
|
+
|
|
90
|
+
- A grant link takes its connector's health color. Grants on a read-only
|
|
91
|
+
endpoint are dashed; an agent's link to its pool is dotted while it has no
|
|
92
|
+
issued token. Plain `/mcp` admits no agents. A read-only endpoint carries a
|
|
93
|
+
read-only chip.
|
|
94
|
+
- Hovering or focusing a node dims everything off its paths and replaces the
|
|
95
|
+
legend with one sentence, such as "alice reaches 2 connectors through /mcp
|
|
96
|
+
and /mcp/team: 6 tools, 1 write." The sentence is also the node's accessible
|
|
97
|
+
name. Hover wins while both are set.
|
|
98
|
+
- The map is one tab stop. Arrow keys move within a column and to the nearest
|
|
99
|
+
node in the next one; Home and End go to the first and last node.
|
|
100
|
+
- Click or Enter opens the node's page: a connector's Tools tab (Connection
|
|
101
|
+
when it needs attention), an endpoint's row on Endpoints, a person's first
|
|
102
|
+
endpoint, or Tokens for an agent when that page is open. A node without a
|
|
103
|
+
page is a `group`.
|
|
104
|
+
- The drawing never scales below 880px; a narrower card scrolls it sideways.
|
|
105
|
+
At 960px and below it becomes a list with one entry per endpoint: its mode,
|
|
106
|
+
its callers as chips that link like map nodes, and its connectors with
|
|
107
|
+
health. With no connectors it reads "Nothing to map yet".
|
|
108
|
+
|
|
109
|
+
### Endpoints
|
|
110
|
+
|
|
111
|
+
One row each for `/mcp` and every pool: the path, a read-only pill on a
|
|
112
|
+
read-only endpoint, a copyable URL, who can use it, its connectors as colored
|
|
113
|
+
monograms (four, then "+N"), its tool count over a read and write bar, and a
|
|
114
|
+
Setup button.
|
|
115
|
+
|
|
116
|
+
- Who can use it is `root.maintainers` on `/mcp` and the pool's `members`
|
|
117
|
+
elsewhere, as an avatar stack named on hover and to screen readers (label,
|
|
118
|
+
raw id when the label is null, or agent name). Four show, then a "+N"
|
|
119
|
+
button. A pool with agent members labels its two URLs People and Agents.
|
|
120
|
+
- Expanding a row lists everyone by name, then each connector with what it
|
|
121
|
+
runs as and its tools, write tools amber with a pencil. Runs-as comes from
|
|
122
|
+
the endpoint's matrix cell: "Shared · saved <date>", "Shared · connected
|
|
123
|
+
<date>", "Shared · not configured", "Shared · set in deployment", "Shared ·
|
|
124
|
+
no credential needed", "Personal · N of M connected", "Workspace · people:
|
|
125
|
+
self · agents: <owner>" (or "none"), or "Everyone acts as <subject>".
|
|
126
|
+
- A connector that needs attention gets a status dot on its monogram and
|
|
127
|
+
beside its name, linking to its Connection tab.
|
|
128
|
+
- Setup opens a drawer with the URL and a Claude Code, Codex or JSON snippet
|
|
129
|
+
with a copy button. No snippet carries a token.
|
|
130
|
+
|
|
131
|
+
Counts intersect live tools with the pool's declared tools (the `/mcp` matrix
|
|
132
|
+
cells for the root), guarded grants' live verdicts, and read-only mode.
|
|
133
|
+
|
|
134
|
+
### Connectors
|
|
135
|
+
|
|
136
|
+
One card per connector: title and id, one status pill, a Shared or Per person
|
|
137
|
+
badge, its tool count over a read and write bar, and when it was last called.
|
|
138
|
+
All, Needs attention and Healthy filter the cards, with counts, beside a
|
|
139
|
+
search field. A connector that is not fine adds one action (Connect, Replace
|
|
140
|
+
key, Inspect, or Review for drift) that opens its Connection tab.
|
|
141
|
+
|
|
142
|
+
Every view shares one verdict per connector: the server's problem code first
|
|
143
|
+
(a failed catalog reads "Catalog failed", never "Connected"), then a failed
|
|
144
|
+
detail read ("Couldn't load", with no fix prompt), then a non-ok status, then
|
|
145
|
+
catalog drift.
|
|
146
|
+
|
|
147
|
+
A List / Matrix toggle (`?view=matrix`) switches to a table of connectors by
|
|
148
|
+
endpoint, `/mcp` first. A row header is the connector's monogram and name, plus
|
|
149
|
+
a status dot linking to Connection when it needs fixing. Each cell is a pie of
|
|
150
|
+
how much of the live catalog it grants, with "all", a count, or a dash for
|
|
151
|
+
none; read-only columns are hatched. Only granted names still in the live
|
|
152
|
+
catalog count. An unknown catalog shows a dashed empty ring and "?". A cell
|
|
153
|
+
with grants is a button named like "GitHub on /mcp/support: 1 of 2 live
|
|
154
|
+
tools, read-only"; it opens a popover of that cell's tools, each with a read
|
|
155
|
+
or write pill (a write struck through on a read-only endpoint), and its
|
|
156
|
+
runs-as. Escape or Tab returns focus to the cell. CSS anchor positioning
|
|
157
|
+
places the popover below the cell, or above when there is more room, and the
|
|
158
|
+
page sets no inline styles. Without anchor support the same list opens as a
|
|
159
|
+
row under the connector.
|
|
160
|
+
|
|
161
|
+
### Connector detail
|
|
162
|
+
|
|
163
|
+
The title, status pill, id, auth badge and read and write bar, then three
|
|
164
|
+
tabs:
|
|
165
|
+
|
|
166
|
+
- **Tools.** Each tool by its mono address with a Read or Write badge and
|
|
167
|
+
annotation badges (Destructive, Open world), filtered by search and All,
|
|
168
|
+
Read and Write. A tool opens its schema in a side drawer.
|
|
169
|
+
- **Connection.** An Authentication card (mode, OAuth client mechanism, who
|
|
170
|
+
manages it, OAuth actions, and the credential card with masked last four,
|
|
171
|
+
field states, and Replace, Test and Remove); a Diagnostics card of tiles
|
|
172
|
+
(catalog age, last call, drift counts) with a fix prompt beside each
|
|
173
|
+
problem; and a Configuration card. Its badges name the kind (Remote MCP,
|
|
174
|
+
HTTP API or Custom), provider, auth scope, endpoint host and usage guide.
|
|
175
|
+
The auth row names the mode and draws each auth fact as a mono badge
|
|
176
|
+
(credential fields, header and scheme, static header names, OAuth scope, API
|
|
177
|
+
origins as `→ api.crm.example`, OAuth endpoints, client metadata host,
|
|
178
|
+
token auth method, Client secret, PKCE, extra parameter and header names).
|
|
179
|
+
Tiles follow for the result cap, call admission rules and transport. Any
|
|
180
|
+
other key becomes a tile labelled from its name.
|
|
181
|
+
- **Activity.** The [Activity](#activity) page for that connector, without
|
|
182
|
+
connector chips or monograms.
|
|
183
|
+
|
|
184
|
+
### Settings
|
|
185
|
+
|
|
186
|
+
The configuration snapshot as tiles, tagged "Defined in code", with no
|
|
187
|
+
editing controls. An empty section is not drawn.
|
|
188
|
+
|
|
189
|
+
- **Deployment.** Fact chips: name and version (`Production · v1`), Writes
|
|
190
|
+
allowed or Read-only, connecta version, public URL, allowed origins,
|
|
191
|
+
sandbox, storage, activity store, deployment ID, website, icon count and
|
|
192
|
+
`deploymentInfo` keys. Default memory storage reads "Memory · default" as a
|
|
193
|
+
warning: on Node a restart loses it.
|
|
194
|
+
- **Sign-in.** One tile per inbound auth provider in the order they are tried,
|
|
195
|
+
with its mark and whether it admits people or machines; the agent-token
|
|
196
|
+
tile counts agents ("3 agents"). Then a Maintainers tile with the `/mcp`
|
|
197
|
+
maintainers, or "None". With no providers an Open tile comes first.
|
|
198
|
+
- **Features.** Vault ("Seals OAuth" when it does), activity, agent tokens
|
|
199
|
+
and any other module, on or off.
|
|
200
|
+
- **Limits.** Each limit as a value over a short label: durations in their
|
|
201
|
+
largest whole unit, sizes in decimal KB or MB with exact bytes as a
|
|
202
|
+
tooltip, counts with separators, "No limit", and On or Off. A null tool
|
|
203
|
+
timeout shows the host-call timeout it falls back to. Headline limits and
|
|
204
|
+
any limit set in code draw large. The rest sit behind one disclosure
|
|
205
|
+
("17 defaults") with Discovery, Results, Programs and Requests groups. A
|
|
206
|
+
value set in code (by `configSources`) has an accent dot; a default reads
|
|
207
|
+
muted. Activity retention counts as set only when the activity store
|
|
208
|
+
reports `optionSources.retentionDays` as `"config"`, as the shipped D1 and
|
|
209
|
+
SQLite stores do.
|
|
210
|
+
- **Overrides.** Each classification override as tool address and verdict.
|
|
211
|
+
- **Other.** Any snapshot key Settings does not map, as a tile labelled from
|
|
212
|
+
its name, set only when its value carries `source: "config"`.
|
|
213
|
+
|
|
214
|
+
### Tokens
|
|
215
|
+
|
|
216
|
+
One row per agent declared in code, in `GET /ui/access-tokens` order: agent
|
|
217
|
+
mark and name, pools as chips, a state pill (No token, Issued or Revoked), the
|
|
218
|
+
issue or revoke date, and last seen ("never" when null). The heading note
|
|
219
|
+
reads "Declared in code"; nothing creates or renames an agent. Narrow screens
|
|
220
|
+
stack each row into a card.
|
|
221
|
+
|
|
222
|
+
- Issue appears for a slot with no token or a revoked one; Rotate and a quiet
|
|
223
|
+
red Revoke for an issued one. Rotate and Revoke ask first in a row under the
|
|
224
|
+
agent, with focus on Cancel.
|
|
225
|
+
- Every mutation sends `{ "expect": "<revision>" }` with the slot revision the
|
|
226
|
+
operator saw. A new secret opens once in a dialog with a copy button and
|
|
227
|
+
"You won't see this token again."; closing it drops the secret, and
|
|
228
|
+
recovery never closes it.
|
|
229
|
+
- A 409 `slot_changed` reads "Changed since you looked. Refresh." A 503
|
|
230
|
+
`outcome_unknown` or 499 `aborted` is a failure notice and is never
|
|
231
|
+
retried.
|
|
232
|
+
- A sent mutation leaves its slot unresolved until its successful response is
|
|
233
|
+
validated. Any other outcome, a contract whose `agents[].token` disagrees
|
|
234
|
+
with the list (revision included) or drops the agent, or a failed read
|
|
235
|
+
leaves it unresolved until a later slot-list read succeeds. Until then its
|
|
236
|
+
controls are off with "Refresh to continue", and each action is checked
|
|
237
|
+
again just before it is sent.
|
|
238
|
+
- Under the recovery banner Tokens has no Refresh or list Retry of its own,
|
|
239
|
+
and an open rotate or revoke question closes.
|
|
240
|
+
|
|
241
|
+
### Activity
|
|
242
|
+
|
|
243
|
+
Counts for the loaded history (calls, failed, tools, catalog changes), also
|
|
244
|
+
in its accessible summary, and a strip of calls over time with failures in
|
|
245
|
+
red when the calls span more than a minute.
|
|
246
|
+
|
|
247
|
+
- **Filters.** One bar: search, All / Failed / Succeeded (`?outcome=failed`
|
|
248
|
+
keeps errors and timeouts, `?outcome=succeeded` successes and approvals),
|
|
249
|
+
and chips for each loaded connector and source (`?connector=`, `?source=`).
|
|
250
|
+
Pressing a pressed chip clears it, and a selected value keeps its chip.
|
|
251
|
+
Another `?outcome=` value matches exactly and shows as a clearable Exact
|
|
252
|
+
outcome chip.
|
|
253
|
+
- **Rows.** Grouped by recorded request id on a shared rail. Each shows a
|
|
254
|
+
status dot, time, caller (a person by label or id with initials, an agent
|
|
255
|
+
by name with its mark, anything else by kind), connector monogram and tool
|
|
256
|
+
address, a write tag, the failure reason, and duration and size. Opening a
|
|
257
|
+
row lists what was recorded: result, how it ran, classification, exact
|
|
258
|
+
duration and size, caller, stable caller id, request id, client, and
|
|
259
|
+
connecta version. Unrecorded fields are left out. Catalog changes are rows
|
|
260
|
+
with added, removed and changed counts.
|
|
261
|
+
- **Empty.** "No calls yet" with Refresh, or "No matches" with Clear filters.
|
|
262
|
+
|
|
263
|
+
### Navigation, gates and recovery
|
|
264
|
+
|
|
265
|
+
The top bar is one row: the mark, branding and deployment name, the section
|
|
266
|
+
links (Overview, Endpoints, Connectors, Activity, Tokens, Settings), then
|
|
267
|
+
Search (the command palette, also ⌘K or Ctrl+K), Appearance, and Account
|
|
268
|
+
(the signed-in account with Sign out or Change token). The mark is connecta's
|
|
269
|
+
drawn "C" only when no product name, owner or favicon is configured; with
|
|
270
|
+
`branding.favicon.svg` it is that SVG; otherwise there is none. The sign-in
|
|
271
|
+
gate shows the same mark above "Sign in". Below 820px the section links move
|
|
272
|
+
to a second row that scrolls sideways and keeps the current section in view,
|
|
273
|
+
and Search shrinks to its icon. A member's top bar has only branding and
|
|
274
|
+
Account. The command palette searches visible pages, connectors and tools,
|
|
275
|
+
opening connector results on Tools.
|
|
276
|
+
|
|
277
|
+
`GET /ui/api/config` is the browser's one gate: a 401 shows sign-in, the
|
|
278
|
+
private 404 shows "No access" with who to ask and Sign out or Change token,
|
|
279
|
+
and a 200 renders by `role`. `/ui/data`, connector details, activity and
|
|
280
|
+
tokens are requested only after the contract says `maintainer`, and each read
|
|
281
|
+
checks the role again when it is sent. Until a role is confirmed the page
|
|
282
|
+
shows its loading or error state and no navigation. Activity and Tokens keep
|
|
283
|
+
their own permission gates.
|
|
284
|
+
|
|
285
|
+
The store keeps the last confirmed role through a failed refresh: a
|
|
286
|
+
maintainer's page stays mounted, inert and dimmed, under one shell banner
|
|
287
|
+
("Couldn't load configuration" with Retry), and sends nothing maintainer-only
|
|
288
|
+
until a contract confirms the role again. Recovery closes the page's dialogs,
|
|
289
|
+
drawers, popovers and the command palette, and moves focus to Retry.
|
|
290
|
+
Credential and OAuth writes also wait for a contract that agrees with the
|
|
291
|
+
confirmed role: a maintainer's for a connector it shows, a member's for a
|
|
292
|
+
personal connector whose `manage` lists that action. Otherwise the write is
|
|
293
|
+
not sent and its row says so. An answer with a different role clears
|
|
294
|
+
everything read under the old one.
|
|
295
|
+
|
|
111
296
|
## Use the member page
|
|
112
297
|
|
|
113
298
|
With `operatorUi()` enabled, sign in at the deployment's public URL using
|
|
114
299
|
Clerk (Node) or Cloudflare Access (Workers). A person listed in a pool's
|
|
115
300
|
`members` can open the page without becoming a maintainer. The page, **Your
|
|
116
|
-
connections**, has no tabs; its
|
|
117
|
-
(Clerk's primary email,
|
|
118
|
-
lists:
|
|
301
|
+
connections**, has no tabs; its heading shows the signed-in email when the
|
|
302
|
+
sign-in exposes one (Clerk's primary email), and its top bar shows branding and
|
|
303
|
+
an **Account** button with Sign out or Change token. It lists:
|
|
119
304
|
|
|
120
|
-
- **Your endpoints**:
|
|
121
|
-
**Client setup**. For example, Bob in pool `team` copies
|
|
305
|
+
- **Your endpoints**: one card per admitted `/mcp/<pool>` URL with a copy button
|
|
306
|
+
and **Client setup**. For example, Bob in pool `team` copies
|
|
122
307
|
`https://connecta.example.com/mcp/team` into an MCP client and authenticates
|
|
123
308
|
as Bob.
|
|
124
|
-
- **Your accounts**: the personal connectors in their pools, each with
|
|
125
|
-
status badge
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
309
|
+
- **Your accounts**: the personal connectors in their pools, each with a
|
|
310
|
+
monogram, tool count, one status badge in an aligned column, and only the
|
|
311
|
+
controls its `manage.actions` lists. A saved credential that no longer fits
|
|
312
|
+
or does not work adds a short note beside the tool count. An OAuth connector
|
|
313
|
+
offers Connect, Reconnect or Disconnect; Reconnect and Disconnect ask first.
|
|
314
|
+
A credential connector offers **Add credential** when only `save` is listed,
|
|
315
|
+
and Replace, Test and Clear once a value is stored; Clear asks first.
|
|
129
316
|
- **Shared with you**: shared connectors by name and tool count, without status.
|
|
130
317
|
|
|
131
318
|
Every browser path shows that same member page; it does not expose maintainer
|
|
@@ -160,8 +347,9 @@ only gate: a signed-out caller gets the auth provider's 401 challenge, and a
|
|
|
160
347
|
`cta_` agent token the machine-only 401 Bearer challenge every human route
|
|
161
348
|
gives it; a maintainer, or a person listed in a pool's `members`, gets 200
|
|
162
349
|
with `role` `"maintainer"` or `"member"`; anyone else gets the private JSON 404
|
|
163
|
-
`{ "error": "not found" }`. An open deployment's anonymous caller
|
|
164
|
-
|
|
350
|
+
`{ "error": "not found" }`. An open deployment's anonymous caller gets
|
|
351
|
+
`role: "maintainer"` but has no principal: activity is `"forbidden"`, the
|
|
352
|
+
activity and access-token routes answer 404, and owners are `null`. Every response is private, `no-store` JSON, and only GET is
|
|
165
353
|
allowed. One shape serves both roles; a field a role does not receive is
|
|
166
354
|
`null` or empty, never omitted.
|
|
167
355
|
|
|
@@ -193,7 +381,8 @@ The maintainer view carries:
|
|
|
193
381
|
pool that serves it, with that endpoint's tool names or `"all"` and
|
|
194
382
|
`runsAs`. A Workspace connector with a subject mapping is
|
|
195
383
|
`{ kind: "workspace", humans: "self", agents }`, `agents` being the pool's
|
|
196
|
-
owner, or `null` on plain `/mcp` and in an ownerless pool
|
|
384
|
+
owner, or `null` on plain `/mcp` and in an ownerless pool, where agents do
|
|
385
|
+
not see the connector at all; a fixed subject is
|
|
197
386
|
`{ kind: "workspaceFixed", subject }`. A personal connector counts the
|
|
198
387
|
endpoint's people (the maintainers on plain `/mcp`) and how many have
|
|
199
388
|
connected in their own partition: a stored credential of the declared shape,
|
|
@@ -273,7 +462,7 @@ existing doctor authentication environment variables; it runs no diagnostic
|
|
|
273
462
|
program, follows no redirects, and prints no raw HTTP failure body.
|
|
274
463
|
|
|
275
464
|
The operator shell uses React, TanStack Router/Query/Table, Radix, cmdk and
|
|
276
|
-
Tailwind v4.
|
|
465
|
+
Tailwind v4. Hanken Grotesk, JetBrains Mono, CSS, JavaScript and dependency notices are hashed assets
|
|
277
466
|
under `/ui/assets/*`, served identically with immutable cache headers on Node
|
|
278
467
|
and Workers. HTML contains only mount points and escaped inert configuration;
|
|
279
468
|
it remains uncached. Ahead of the stylesheet, every operator page (sign-in
|
|
@@ -334,7 +523,7 @@ A later focus return can request another status read. Recovery never starts OAut
|
|
|
334
523
|
or replays a mutation.
|
|
335
524
|
Unreadable credential metadata uses `configured: null`, including named fields,
|
|
336
525
|
and renders as unavailable with a retry prompt. It does not claim that the slot
|
|
337
|
-
is empty. Endpoints, Connectors, connector
|
|
526
|
+
is empty. Overview, Endpoints, Connectors, connector
|
|
338
527
|
detail, Settings, and the member page consume the typed contract; Activity opens
|
|
339
528
|
only to a maintainer whose contract reports readable history. Connector detail
|
|
340
529
|
reads auth permissions from its `/ui/data` connector. Activity retains
|
|
@@ -364,19 +553,6 @@ id and typed actor when available, otherwise a fresh id and system actor. No
|
|
|
364
553
|
names, descriptions or schemas enter the event. Private catalog changes require
|
|
365
554
|
a matching principal owner even when the connector uses shared auth. Empty credential declarations
|
|
366
555
|
report `credential_required` before running a connector status or catalog probe.
|
|
367
|
-
The top bar shows deployment branding and a name breadcrumb, then Search (the
|
|
368
|
-
command palette), Appearance, and the session action (Change token or Sign out)
|
|
369
|
-
at one quiet size; a member's top bar has only branding, the account and the
|
|
370
|
-
session action. The tab row lists Endpoints, Connectors, Activity,
|
|
371
|
-
Tokens, and Settings. Activity and Tokens keep their permission gates; a gated
|
|
372
|
-
viewer sees no operator navigation. The command palette searches visible pages,
|
|
373
|
-
connectors and tools, opening connector results on Tools. `/access` redirects
|
|
374
|
-
to `/`, `/tools` to `/connectors`, and `/config` to `/settings` in the browser
|
|
375
|
-
with history replacement. Connector hashes `#config`, `#auth` and `#diagnostics`
|
|
376
|
-
redirect to `#connection`, preserving query parameters such as signed handoffs.
|
|
377
|
-
Token controls retain their existing permission gate.
|
|
378
|
-
Configuration remains in deployment code. The UI mutates only credentials,
|
|
379
|
-
OAuth connections and agent tokens through the existing routes.
|
|
380
556
|
|
|
381
557
|
## Contributor reference
|
|
382
558
|
|
|
@@ -390,6 +566,20 @@ projection built from config, membership, the member's own partition status,
|
|
|
390
566
|
and each personal connector's exact `manage`;
|
|
391
567
|
`test/operator-contract-server.test.ts` runs it against real responses.
|
|
392
568
|
|
|
569
|
+
The Overview's map and attention rows are pure functions of the contract in
|
|
570
|
+
[connection-map.ts](https://github.com/zackbart/connecta/blob/main/src/operator-ui/connection-map.ts)
|
|
571
|
+
and [overview.ts](https://github.com/zackbart/connecta/blob/main/src/operator-ui/overview.ts),
|
|
572
|
+
covered by `test/operator-connection-map.test.ts` and
|
|
573
|
+
`test/operator-overview.test.ts`; `src/operator-ui/styles/overview.css` holds
|
|
574
|
+
the page's styles.
|
|
575
|
+
|
|
576
|
+
`src/operator-ui/config-summary.ts` maps the snapshot and its provenance to
|
|
577
|
+
those tiles: one table of limit labels, the formatters, and the walk that turns
|
|
578
|
+
an unmapped key into an Other tile. `app/config-tiles.tsx` draws them, and
|
|
579
|
+
`test/operator-config-summary.test.ts` checks formatting, provenance, unknown
|
|
580
|
+
keys, an empty deployment, and that a real deployment's snapshot leaves no key
|
|
581
|
+
unmapped.
|
|
582
|
+
|
|
393
583
|
The contract type is [contract.ts](https://github.com/zackbart/connecta/blob/main/src/operator-ui/contract.ts).
|
|
394
584
|
[UI routes](https://github.com/zackbart/connecta/blob/main/src/routes/ui.ts) and
|
|
395
585
|
[UI implementation](https://github.com/zackbart/connecta/blob/main/src/ui.ts)
|
|
@@ -72,7 +72,7 @@ tokens, upgrading, and diagnosis with `connecta doctor` to their procedures.
|
|
|
72
72
|
`CF_ACCESS_CLIENT_ID`, `CF_ACCESS_CLIENT_SECRET`, and `CONNECTA_TOKEN`
|
|
73
73
|
together, and pass `--pool ci`, a pool that lists the agent.
|
|
74
74
|
Machine clients are the `agents` declared in `src/connecta.config.ts`. Issue
|
|
75
|
-
or rotate a token through the
|
|
75
|
+
or rotate a token through the operator Tokens page as a signed-in maintainer or trusted
|
|
76
76
|
`AccessTokenManager.rotate` tooling against this same D1 storage, as README
|
|
77
77
|
"Machine tokens" describes. Never configure a static bearer or open startup.
|
|
78
78
|
UI, vault, and activity use explicit optional imports;
|
|
@@ -80,20 +80,26 @@ tokens, upgrading, and diagnosis with `connecta doctor` to their procedures.
|
|
|
80
80
|
- Organize agent pools by connecta's agent pool layout:
|
|
81
81
|
`node_modules/@zackbart/connecta/documentation/auth.md#organizing-an-agents-pools`
|
|
82
82
|
([online](https://github.com/zackbart/connecta/blob/main/documentation/auth.md#organizing-an-agents-pools)).
|
|
83
|
-
Each agent keeps one Connecta connection whose
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
83
|
+
Each agent keeps one Connecta connection whose harness, never the model,
|
|
84
|
+
picks the pool per turn. Tiers are nested pools of shared connectors with
|
|
85
|
+
no `owner`, each spreading the tool list below. Recommended names are
|
|
86
|
+
`<agent>` for the lowest and `<agent>-<tier>` above it; any named pool,
|
|
87
|
+
including an existing `team` or `leadership` pool, may be a tier if all its
|
|
88
|
+
human members are cleared for it. A chat gets the most capable tier everyone
|
|
89
|
+
present is cleared for, and the lowest when anyone present is unknown.
|
|
90
|
+
`<agent>-<user>` (that user's highest tier plus their own connector ids,
|
|
91
|
+
`owner` set to their Workspace address) is used only in a one-on-one with
|
|
92
|
+
that user. List only cleared people in a tier, and never another person in
|
|
93
|
+
a `<agent>-<user>` pool: its per-user connectors act as that user for every
|
|
94
|
+
member. Never add a second Connecta connection or mount downstream tools
|
|
95
|
+
directly.
|
|
90
96
|
- Brand the operator UI in `operatorUi({ branding })`: product and owner names,
|
|
91
97
|
description, favicon, and `theme` (`accent`, `radius`, `fontFamily`,
|
|
92
98
|
`monoFamily`, `colorScheme`). Ask the deployment's owner for their brand
|
|
93
99
|
rather than leaving the default. README "UI and encrypted credentials" shows
|
|
94
100
|
the shape.
|
|
95
101
|
- After configuration changes, typecheck: inside the connecta repository that
|
|
96
|
-
is `
|
|
102
|
+
is `pnpm run check:examples`; a copied deployment runs its own `tsc --noEmit`.
|
|
97
103
|
After deployment, connect both Claude and ChatGPT to `<PUBLIC_URL>/mcp` and
|
|
98
104
|
complete their browser authorization flows before calling setup complete.
|
|
99
105
|
|
|
@@ -11,7 +11,8 @@ A deployable Worker that aggregates a downstream remote MCP and an in-code HTTP
|
|
|
11
11
|
API connector, guarded by Cloudflare Access. It uses three Cloudflare resources
|
|
12
12
|
and nothing else: one D1 database (`CONNECTA_DB`) for every piece of state, the
|
|
13
13
|
Worker Loader binding (`LOADER`) behind the six-tool surface, which requires
|
|
14
|
-
the Workers Paid plan, and
|
|
14
|
+
the Workers Paid plan, and two secrets: `DOWNSTREAM_TOKEN` (the example remote
|
|
15
|
+
MCP connector's token) and `CREDENTIAL_ENCRYPTION_KEY` (the credential vault).
|
|
15
16
|
|
|
16
17
|
This is also the **starting template for a deployment**: a real deployment
|
|
17
18
|
should be its own repository that pins an exact `@zackbart/connecta` version and
|
|
@@ -46,9 +47,11 @@ This example has no `package.json` of its own — it resolves the installed
|
|
|
46
47
|
package from the repository root.
|
|
47
48
|
|
|
48
49
|
```sh
|
|
49
|
-
|
|
50
|
+
pnpm install # from the repository root
|
|
50
51
|
|
|
51
52
|
wrangler d1 create connecta # paste the id into wrangler.jsonc
|
|
53
|
+
# In wrangler.jsonc also set PUBLIC_URL to this Worker's URL and
|
|
54
|
+
# CONNECTA_MAINTAINERS to your Access user ids (user_uuid, else email).
|
|
52
55
|
|
|
53
56
|
cd examples/worker
|
|
54
57
|
wrangler secret put DOWNSTREAM_TOKEN
|
|
@@ -140,7 +143,8 @@ auth. [Deploying Connecta](https://github.com/zackbart/connecta/blob/main/docume
|
|
|
140
143
|
records the untested cases and the propagation details.
|
|
141
144
|
|
|
142
145
|
The checked-in `access.dev` block gives `wrangler dev` a local operator
|
|
143
|
-
identity
|
|
146
|
+
identity; it requires Wrangler 4.123.0 or later, and earlier versions ignore it
|
|
147
|
+
with an unexpected-field warning. Remove the block to test the missing-Access refusal. It has no effect
|
|
144
148
|
on a deployed Worker's production identity.
|
|
145
149
|
|
|
146
150
|
### Optional resource management with Alchemy
|
|
@@ -228,12 +232,34 @@ Access adoption or preserve production identity.
|
|
|
228
232
|
|
|
229
233
|
### Copied into its own repository
|
|
230
234
|
|
|
231
|
-
The `
|
|
235
|
+
The `pnpm install` above is the connecta repository's, which already has every
|
|
232
236
|
dependency this file imports. A copy with its own `package.json` installs
|
|
233
237
|
Connecta and the separately installed `@cloudflare/codemode` peer:
|
|
234
238
|
|
|
235
239
|
```sh
|
|
236
|
-
npm install @zackbart/connecta
|
|
240
|
+
npm install --save-exact @zackbart/connecta@<version>
|
|
241
|
+
npm install @cloudflare/codemode
|
|
242
|
+
npm install --save-dev wrangler @cloudflare/workers-types typescript @types/node
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
A `tsconfig.json` like the following lets `tsc --noEmit` resolve `D1Database`,
|
|
246
|
+
`WorkerLoader`, and `ExecutionContext`. `wrangler` also serves
|
|
247
|
+
`scripts/copy-kv-to-d1.mjs`.
|
|
248
|
+
|
|
249
|
+
```json
|
|
250
|
+
{
|
|
251
|
+
"compilerOptions": {
|
|
252
|
+
"target": "ES2022",
|
|
253
|
+
"module": "ES2022",
|
|
254
|
+
"moduleResolution": "Bundler",
|
|
255
|
+
"lib": ["ES2022"],
|
|
256
|
+
"types": ["@cloudflare/workers-types", "node"],
|
|
257
|
+
"strict": true,
|
|
258
|
+
"skipLibCheck": true,
|
|
259
|
+
"noEmit": true
|
|
260
|
+
},
|
|
261
|
+
"include": ["src/**/*.ts"]
|
|
262
|
+
}
|
|
237
263
|
```
|
|
238
264
|
|
|
239
265
|
`@cloudflare/codemode` is the optional peer behind `execute_code`, declared in
|
|
@@ -250,12 +276,12 @@ Then list the maintainers' Access user ids (`user_uuid`, else email) in the
|
|
|
250
276
|
`CONNECTA_MAINTAINERS` var and point a maintainer's MCP client at
|
|
251
277
|
`<PUBLIC_URL>/mcp`. Other people use `<PUBLIC_URL>/mcp/<pool>`, and agents
|
|
252
278
|
`<PUBLIC_URL>/agent/<pool>`, for a pool that lists them in `members`. The example explicitly enables
|
|
253
|
-
`ui: operatorUi()`; open `<PUBLIC_URL>/` for
|
|
254
|
-
authentication controls. The page labels tool safety, offers fixed repair
|
|
279
|
+
`ui: operatorUi()`; open `<PUBLIC_URL>/` for endpoints, and each connector's Connection tab
|
|
280
|
+
(`/connectors/<id>`) for its authentication controls. The page labels tool safety, offers fixed repair
|
|
255
281
|
prompts for classified failures, and shows client setup commands for endpoints
|
|
256
282
|
the signed-in person may use. Those commands contain no token. There is no
|
|
257
|
-
separate Credentials tab. The
|
|
258
|
-
declared agent, is available to
|
|
283
|
+
separate Credentials tab. The Tokens page, listing one token slot per
|
|
284
|
+
declared agent, is available to signed-in maintainers.
|
|
259
285
|
|
|
260
286
|
## Select optional modules
|
|
261
287
|
|
|
@@ -281,9 +307,9 @@ See [inbound identity](../../documentation/auth.md#principals-visibility-and-ope
|
|
|
281
307
|
Machine clients are agents declared by name in `agents` in
|
|
282
308
|
`src/connecta.config.ts`; this example declares `ci`. Each agent has one
|
|
283
309
|
`cta_` token held by `accessTokens(storage)` over `CONNECTA_DB`, with no new
|
|
284
|
-
binding. An agent with no issued token admits nothing. A
|
|
285
|
-
|
|
286
|
-
`<PUBLIC_URL>/`, select
|
|
310
|
+
binding. An agent with no issued token admits nothing. A maintainer (an Access
|
|
311
|
+
identity listed in `CONNECTA_MAINTAINERS`) signs in and issues the first token.
|
|
312
|
+
Open `<PUBLIC_URL>/`, select Tokens, and issue the agent's token. Save the
|
|
287
313
|
returned `cta_` secret privately; it is returned once. Rotating replaces it
|
|
288
314
|
immediately: the old secret stops on its next request. An agent has no human
|
|
289
315
|
principal, so personal connectors are absent for it; connector and pool rules
|
|
@@ -380,7 +406,7 @@ with the `cta_` token alone:
|
|
|
380
406
|
CF_ACCESS_CLIENT_ID='REPLACE_WITH_ACCESS_CLIENT_ID' \
|
|
381
407
|
CF_ACCESS_CLIENT_SECRET='REPLACE_WITH_ACCESS_CLIENT_SECRET' \
|
|
382
408
|
CONNECTA_TOKEN='cta_REPLACE_WITH_STORED_SECRET' \
|
|
383
|
-
connecta doctor --url
|
|
409
|
+
npx connecta doctor --url https://connecta.example.workers.dev --pool ci
|
|
384
410
|
```
|
|
385
411
|
|
|
386
412
|
Doctor reports the configured `DynamicWorkerExecutor`, not a presumed Node
|
|
@@ -439,7 +465,8 @@ CREATE TABLE IF NOT EXISTS connecta_kv (
|
|
|
439
465
|
);
|
|
440
466
|
CREATE INDEX IF NOT EXISTS connecta_kv_expiry ON connecta_kv (expires_at_ms);
|
|
441
467
|
-- tool_call_activity: one row per completed call, keyset-paged on
|
|
442
|
-
-- (occurred_at_ms, id); see
|
|
468
|
+
-- (occurred_at_ms, id); see
|
|
469
|
+
-- https://github.com/zackbart/connecta/blob/main/src/storage/sql.ts
|
|
443
470
|
```
|
|
444
471
|
|
|
445
472
|
### Upgrading from 0.28
|