@zackbart/connecta 0.28.0 → 0.29.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 +961 -5
- package/README.md +62 -39
- package/bin/connecta.mjs +110 -139
- package/bin/meta-tool-names.d.mts +2 -0
- package/bin/meta-tool-names.mjs +9 -0
- package/bin/version.mjs +3 -0
- package/dist/access-tokens.js +53 -63
- package/dist/activity-request.js +8 -0
- package/dist/activity.d.ts +76 -42
- package/dist/activity.js +110 -42
- package/dist/auth/clerk-sdk/client.d.ts +65 -0
- package/dist/auth/clerk-sdk/client.js +5 -0
- package/dist/auth/clerk-sdk/generated.js +1845 -0
- package/dist/auth/clerk-transport.js +19 -0
- package/dist/auth/clerk.d.ts +17 -7
- package/dist/auth/clerk.js +189 -107
- package/dist/auth/cloudflare-access.js +25 -26
- package/dist/auth/downstream-client-metadata.d.ts +29 -0
- package/dist/auth/downstream-client-metadata.js +133 -0
- package/dist/auth/downstream-oauth.js +1632 -1509
- package/dist/auth/downstream-revocation.js +106 -0
- package/dist/auth/oauth-token-response.js +231 -0
- package/dist/auth/oauth-v2-migration.js +116 -0
- package/dist/auth/static-oauth.js +526 -0
- package/dist/auth-elicitation.js +283 -0
- package/dist/branding.d.ts +8 -16
- package/dist/branding.js +26 -59
- package/dist/byte-read-response.js +39 -0
- package/dist/call-admission.js +12 -16
- package/dist/catalog-cache.js +739 -0
- package/dist/catalog-drift.d.ts +50 -15
- package/dist/catalog-drift.js +365 -128
- package/dist/catalog-fingerprint.js +2 -4
- package/dist/catalog-freshness.js +13 -0
- package/dist/catalog-limits.js +2 -2
- package/dist/catalog-service.js +368 -224
- package/dist/catalog.js +43 -84
- package/dist/concurrency.js +3 -4
- package/dist/config-defaults.d.ts +39 -0
- package/dist/config-defaults.js +46 -0
- package/dist/config-schema.d.ts +181 -0
- package/dist/config-schema.js +435 -0
- package/dist/config-value-sources.js +102 -0
- package/dist/config.d.ts +631 -0
- package/dist/config.js +503 -0
- package/dist/connector-access.d.ts +1 -0
- package/dist/connector-access.js +13 -15
- package/dist/connector-caller.d.ts +8 -0
- package/dist/connector-caller.js +15 -6
- package/dist/connector-scope.js +1 -1
- package/dist/connectors/api-connector.d.ts +220 -0
- package/dist/connectors/api-connector.js +214 -0
- package/dist/connectors/api.d.ts +8 -71
- package/dist/connectors/api.js +13 -99
- package/dist/connectors/guarded-fetch.d.ts +144 -0
- package/dist/connectors/guarded-fetch.js +108 -25
- package/dist/connectors/negotiation-cache.js +46 -0
- package/dist/connectors/option-shapes.js +27 -0
- package/dist/connectors/remote-mcp.d.ts +30 -4
- package/dist/connectors/remote-mcp.js +1780 -351
- package/dist/connectors/resource-uri.js +335 -0
- package/dist/credential-contract.d.ts +10 -0
- package/dist/credential-rules.js +1 -3
- package/dist/credential-url.js +108 -0
- package/dist/credentials.d.ts +6 -1
- package/dist/credentials.js +27 -18
- package/dist/d1.d.ts +130 -0
- package/dist/d1.js +290 -0
- package/dist/describe-config.d.ts +165 -0
- package/dist/describe-config.js +315 -0
- package/dist/described.js +106 -0
- package/dist/downstream-input-context.js +119 -0
- package/dist/downstream-input.js +323 -0
- package/dist/errors.d.ts +97 -20
- package/dist/errors.js +158 -80
- package/dist/execute.js +453 -305
- package/dist/executor-admission.d.ts +1 -0
- package/dist/executor-admission.js +11 -15
- package/dist/executor-contract.d.ts +20 -0
- package/dist/executor-contract.js +48 -0
- package/dist/executor-result.js +24 -9
- package/dist/executors/quickjs-child.js +3 -4
- package/dist/executors/quickjs-runtime.js +147 -59
- package/dist/executors/quickjs.js +29 -35
- package/dist/favicon.js +1 -2
- package/dist/fix-prompt.js +1 -3
- package/dist/guest-runtime.js +188 -0
- package/dist/guest-types.d.ts +176 -0
- package/dist/guest-types.js +1 -0
- package/dist/html-security.js +24 -0
- package/dist/identity.js +1 -3
- package/dist/inbound-credential.js +52 -0
- package/dist/index.d.ts +25 -257
- package/dist/index.js +65 -478
- package/dist/invocation-auth.js +69 -0
- package/dist/invocation.js +230 -73
- package/dist/json-schema.d.ts +1 -1
- package/dist/mcp-client-context.js +35 -0
- package/dist/mcp-result.js +11 -7
- package/dist/meta-output.js +76 -0
- package/dist/meta-tool-names.d.ts +2 -0
- package/dist/meta-tool-names.js +3 -0
- package/dist/meta-tools.js +285 -209
- package/dist/module-contracts.d.ts +8 -23
- package/dist/node.d.ts +0 -2
- package/dist/node.js +2 -2
- package/dist/oauth-callback-outcome.js +1 -3
- package/dist/oauth-handoff.js +117 -0
- package/dist/oauth-partition.js +17 -0
- package/dist/oauth-sealing.js +20 -0
- package/dist/operator-record.d.ts +137 -0
- package/dist/operator-record.js +420 -0
- package/dist/operator-ui/assets.js +31 -0
- package/dist/operator-ui/contract.d.ts +72 -0
- package/dist/operator-ui/contract.js +1 -0
- package/dist/operator-ui/fix-prompts.d.ts +18 -0
- package/dist/operator-ui/generated.js +5 -4
- package/dist/operator-ui/model.d.ts +12 -87
- package/dist/operator-ui/model.js +2 -9
- package/dist/operator-ui/setup-commands.js +1 -3
- package/dist/operator-ui/view.d.ts +323 -0
- package/dist/operator-ui/view.js +62 -189
- package/dist/page-styles.js +2 -3
- package/dist/program-source.js +14 -2
- package/dist/{exempt-writes.js → program-writes.js} +55 -18
- package/dist/provider.d.ts +142 -0
- package/dist/provider.js +187 -0
- package/dist/providers/_shared/google/result-size.js +57 -0
- package/dist/providers/_shared/google/service-account.d.ts +58 -0
- package/dist/providers/_shared/google/service-account.js +500 -0
- package/dist/providers/_shared/google/workspace.d.ts +276 -0
- package/dist/providers/_shared/google/workspace.js +518 -0
- package/dist/providers/basecamp/index.d.ts +43 -0
- package/dist/providers/basecamp/index.js +997 -0
- package/dist/providers/basecamp/skill.generated.js +9 -0
- package/dist/providers/breeze/index.d.ts +34 -0
- package/dist/providers/breeze/index.js +1446 -0
- package/dist/providers/breeze/skill.generated.js +9 -0
- package/dist/providers/ccb/index.d.ts +103 -0
- package/dist/providers/ccb/index.js +1725 -0
- package/dist/providers/ccb/skill.generated.js +9 -0
- package/dist/providers/{cloudflare.d.ts → cloudflare/index.d.ts} +8 -7
- package/dist/providers/{cloudflare.js → cloudflare/index.js} +171 -738
- package/dist/providers/cloudflare/skill.generated.js +10 -0
- package/dist/providers/docs/index.d.ts +54 -0
- package/dist/providers/docs/index.js +1237 -0
- package/dist/providers/docs/skill.generated.js +9 -0
- package/dist/providers/drive/index.d.ts +53 -0
- package/dist/providers/drive/index.js +1523 -0
- package/dist/providers/drive/skill.generated.js +9 -0
- package/dist/providers/forms/index.d.ts +54 -0
- package/dist/providers/forms/index.js +1217 -0
- package/dist/providers/forms/skill.generated.js +11 -0
- package/dist/providers/github/auth.d.ts +32 -0
- package/dist/providers/github/auth.js +361 -0
- package/dist/providers/github/hosted.js +218 -0
- package/dist/providers/github/index.d.ts +13 -0
- package/dist/providers/github/index.js +140 -0
- package/dist/providers/github/key.js +100 -0
- package/dist/providers/github/rest.js +321 -0
- package/dist/providers/github/scope.d.ts +29 -0
- package/dist/providers/github/scope.js +124 -0
- package/dist/providers/github/skill.generated.js +8 -0
- package/dist/providers/gmail/index.d.ts +51 -0
- package/dist/providers/gmail/index.js +1436 -0
- package/dist/providers/gmail/skill.generated.js +9 -0
- package/dist/providers/{linear.d.ts → linear/index.d.ts} +11 -14
- package/dist/providers/linear/index.js +352 -0
- package/dist/providers/linear/skill.generated.js +8 -0
- package/dist/providers/{mixpanel.d.ts → mixpanel/index.d.ts} +5 -10
- package/dist/providers/mixpanel/index.js +416 -0
- package/dist/providers/mixpanel/skill.generated.js +9 -0
- package/dist/providers/{notion.d.ts → notion/index.d.ts} +8 -8
- package/dist/providers/{notion.js → notion/index.js} +226 -239
- package/dist/providers/notion/skill.generated.js +10 -0
- package/dist/providers/overflow/index.d.ts +60 -0
- package/dist/providers/overflow/index.js +1535 -0
- package/dist/providers/overflow/skill.generated.js +8 -0
- package/dist/providers/planning-center/index.d.ts +59 -0
- package/dist/providers/planning-center/index.js +2199 -0
- package/dist/providers/planning-center/skill.generated.js +10 -0
- package/dist/providers/{revenuecat.d.ts → revenuecat/index.d.ts} +5 -10
- package/dist/providers/revenuecat/index.js +557 -0
- package/dist/providers/revenuecat/skill.generated.js +11 -0
- package/dist/providers/sheets/index.d.ts +54 -0
- package/dist/providers/sheets/index.js +1237 -0
- package/dist/providers/sheets/skill.generated.js +10 -0
- package/dist/providers/slides/index.d.ts +53 -0
- package/dist/providers/slides/index.js +2645 -0
- package/dist/providers/slides/skill.generated.js +9 -0
- package/dist/providers/{stripe.d.ts → stripe/index.d.ts} +5 -12
- package/dist/providers/stripe/index.js +266 -0
- package/dist/providers/stripe/skill.generated.js +11 -0
- package/dist/providers/tithely/index.d.ts +49 -0
- package/dist/providers/tithely/index.js +1003 -0
- package/dist/providers/tithely/skill.generated.js +8 -0
- package/dist/providers/{vercel.d.ts → vercel/index.d.ts} +8 -8
- package/dist/providers/vercel/index.js +1038 -0
- package/dist/providers/vercel/mcp-ownership.js +212 -0
- package/dist/providers/vercel/skill.generated.js +11 -0
- package/dist/registry.d.ts +108 -171
- package/dist/registry.js +513 -925
- package/dist/request-state.js +21 -0
- package/dist/resource-read.js +100 -0
- package/dist/result-shapes.js +17 -49
- package/dist/retired-toolkits.js +1 -1
- package/dist/routes/access-tokens.js +3 -6
- package/dist/routes/activity-context.js +21 -0
- package/dist/routes/activity-disclosure.js +40 -0
- package/dist/routes/activity.js +59 -21
- package/dist/routes/actor-labels.js +3 -50
- package/dist/routes/connect.js +221 -0
- package/dist/routes/credentials.js +15 -27
- package/dist/routes/mcp.js +356 -130
- package/dist/routes/oauth-client-metadata.js +15 -0
- package/dist/routes/oauth-management.js +45 -107
- package/dist/routes/oauth.js +136 -57
- package/dist/routes/operator.js +3 -3
- package/dist/routes/shared.d.ts +25 -64
- package/dist/routes/shared.js +160 -80
- package/dist/routes/skills.js +30 -0
- package/dist/routes/ui-config.js +225 -0
- package/dist/routes/ui-data.js +40 -35
- package/dist/routes/ui.js +66 -56
- package/dist/runtime/admission.js +4 -2
- package/dist/runtime/call-admission.js +3 -1
- package/dist/runtime/connector-scope.js +1 -4
- package/dist/runtime/run.js +10 -39
- package/dist/runtime/services.js +12 -117
- package/dist/runtime/shared-read.js +1 -3
- package/dist/runtime/storage.js +8 -1
- package/dist/sent-secrets.d.ts +52 -0
- package/dist/sent-secrets.js +474 -0
- package/dist/server.js +28 -71
- package/dist/skills.js +406 -174
- package/dist/sqlite.d.ts +48 -0
- package/dist/sqlite.js +166 -0
- package/dist/storage/keys.js +428 -0
- package/dist/storage/memory.js +7 -0
- package/dist/storage/sql.d.ts +66 -0
- package/dist/storage/sql.js +534 -0
- package/dist/timeout.js +4 -2
- package/dist/tool-name.js +17 -0
- package/dist/tool-safety.d.ts +9 -35
- package/dist/tool-safety.js +20 -40
- package/dist/types.d.ts +320 -54
- package/dist/types.js +0 -1
- package/dist/ui.d.ts +7 -19
- package/dist/ui.js +76 -90
- package/dist/url-safety.js +3 -6
- package/dist/usage-guide.js +137 -0
- package/dist/validate.d.ts +7 -0
- package/dist/validate.js +309 -47
- package/dist/version.d.ts +1 -7
- package/dist/version.js +3 -7
- package/dist/worker.d.ts +11 -0
- package/dist/worker.js +434 -0
- package/documentation/architecture.md +665 -230
- package/documentation/auth.md +962 -458
- package/documentation/code-mode.md +501 -312
- package/documentation/meta-tools.md +449 -200
- package/documentation/operator-tests.md +93 -0
- package/documentation/provider-migration-0.29.md +60 -0
- package/examples/worker/AGENTS.md +34 -12
- package/examples/worker/README.md +286 -255
- package/examples/worker/kv-to-d1.wrangler.jsonc +26 -0
- package/examples/worker/scripts/copy-kv-to-d1.mjs +162 -0
- package/examples/worker/src/connecta.config.ts +151 -0
- package/examples/worker/src/index.ts +14 -197
- package/examples/worker/wrangler.jsonc +15 -35
- package/package.json +125 -35
- package/templates/node/.dockerignore +1 -2
- package/templates/node/.env.example +20 -21
- package/templates/node/AGENTS.md +21 -17
- package/templates/node/Dockerfile +3 -5
- package/templates/node/README.md +133 -58
- package/templates/node/docker-compose.yml +11 -12
- package/templates/node/package.json +4 -2
- package/templates/node/src/connecta.config.ts +119 -0
- package/templates/node/src/index.ts +9 -154
- package/templates/node/src/provision-token.ts +17 -0
- package/AGENTS.md +0 -170
- package/dist/artifacts/connector.d.ts +0 -58
- package/dist/artifacts/connector.js +0 -730
- package/dist/artifacts/document.js +0 -86
- package/dist/artifacts/guide.js +0 -140
- package/dist/artifacts/html-scan.js +0 -329
- package/dist/artifacts/json.js +0 -78
- package/dist/artifacts/kv-store.d.ts +0 -20
- package/dist/artifacts/kv-store.js +0 -140
- package/dist/artifacts/markdown.js +0 -478
- package/dist/artifacts/module.d.ts +0 -37
- package/dist/artifacts/module.js +0 -66
- package/dist/artifacts/operations.d.ts +0 -197
- package/dist/artifacts/operations.js +0 -1002
- package/dist/artifacts/refresh.d.ts +0 -55
- package/dist/artifacts/refresh.js +0 -236
- package/dist/artifacts/routes.js +0 -206
- package/dist/artifacts/types.d.ts +0 -214
- package/dist/artifacts/types.js +0 -22
- package/dist/artifacts/validate.d.ts +0 -62
- package/dist/artifacts/validate.js +0 -651
- package/dist/artifacts.d.ts +0 -6
- package/dist/artifacts.js +0 -9
- package/dist/auth/bearer.d.ts +0 -11
- package/dist/auth/bearer.js +0 -50
- package/dist/providers/linear.js +0 -217
- package/dist/providers/mixpanel.js +0 -247
- package/dist/providers/revenuecat.js +0 -317
- package/dist/providers/stripe.js +0 -253
- package/dist/providers/vercel.js +0 -1253
- package/dist/storage/file.d.ts +0 -15
- package/dist/storage/file.js +0 -455
- package/ethos.md +0 -93
- package/examples/worker/src/cloudflare-kv.ts +0 -43
- package/examples/worker/src/d1-activity-row.ts +0 -155
- package/examples/worker/src/d1-activity.ts +0 -147
- package/examples/worker/src/d1-storage.ts +0 -138
- package/examples/worker/src/r2-artifact-blobs.ts +0 -29
- package/templates/node/src/file-activity.ts +0 -182
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Trusted local provisioning against the same database the server uses. */
|
|
2
|
+
import { AccessTokenManager } from "@zackbart/connecta/auth/access-tokens";
|
|
3
|
+
import { openSqlite, sqliteStorage } from "@zackbart/connecta/sqlite";
|
|
4
|
+
|
|
5
|
+
const name = process.argv[2];
|
|
6
|
+
if (!name || process.argv.length !== 3) {
|
|
7
|
+
throw new Error('Usage: npm run provision-token -- "machine-name"');
|
|
8
|
+
}
|
|
9
|
+
const database = openSqlite(process.env.CONNECTA_DATABASE || "./.connecta.sqlite");
|
|
10
|
+
try {
|
|
11
|
+
const manager = new AccessTokenManager(sqliteStorage(database));
|
|
12
|
+
const { token } = await manager.create(name, "local-provisioning");
|
|
13
|
+
// The secret is returned once. Keep stdout private; storage holds its hash.
|
|
14
|
+
process.stdout.write(`${token}\n`);
|
|
15
|
+
} finally {
|
|
16
|
+
database.close();
|
|
17
|
+
}
|
package/AGENTS.md
DELETED
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
# Working on connecta
|
|
2
|
-
|
|
3
|
-
This is the canonical instruction file for coding agents. `CLAUDE.md` is a
|
|
4
|
-
symlink to this file so every agent works from the same conventions.
|
|
5
|
-
|
|
6
|
-
A single MCP endpoint aggregating downstream connectors (remote MCP servers and
|
|
7
|
-
plain HTTP APIs) behind seven meta-tools, `execute_code` among them. Every
|
|
8
|
-
deployment configures an executor, and agents reach connectors by writing
|
|
9
|
-
JavaScript against it. One fetch-native core on Effect behind a Promise API,
|
|
10
|
-
running on both Node and Cloudflare Workers. A program runs read-only and
|
|
11
|
-
config-exempt tools; every other write is its own `call_destructive_tool` call,
|
|
12
|
-
so the host's permission prompt is the only approval. The code and the guides
|
|
13
|
-
describe what exists.
|
|
14
|
-
|
|
15
|
-
- **[`ethos.md`](./ethos.md) is the constitution.** It states what connecta is
|
|
16
|
-
and isn't, and its decisions table carries a verdict for every shape already
|
|
17
|
-
considered — accepted, planned, refused, removed, provisional, or gated.
|
|
18
|
-
Check the table before designing or building anything: a `planned` row is a
|
|
19
|
-
"yes" that has not shipped, binding on review now and absent from the guides
|
|
20
|
-
until it lands, so never document it there as if it exists; a `refused` row
|
|
21
|
-
is a "no" with the reason attached, and a `removed` row (toolkits
|
|
22
|
-
[#178](https://github.com/zackbart/connecta/issues/178), proactive credential
|
|
23
|
-
liveness [#179](https://github.com/zackbart/connecta/issues/179), the classic
|
|
24
|
-
executor-free surface
|
|
25
|
-
[#273](https://github.com/zackbart/connecta/issues/273)) records a surface
|
|
26
|
-
that no longer exists — do not reintroduce it without a new decision.
|
|
27
|
-
- There is no TODO.md — the roadmap lives in
|
|
28
|
-
[GitHub issues](https://github.com/zackbart/connecta/issues). When you find
|
|
29
|
-
TODO items (in code comments, docs, or conversation), don't accumulate them
|
|
30
|
-
in a file: turn each one into a GitHub issue that clearly defines what to do
|
|
31
|
-
— motivation, behavioral requirements, and acceptance criteria — without
|
|
32
|
-
prescribing the implementation.
|
|
33
|
-
|
|
34
|
-
## Verification
|
|
35
|
-
|
|
36
|
-
`npm run check` must pass before you claim anything is done — `check:docs` →
|
|
37
|
-
`check:operator-ui` → `check:lint` → `check:unused` → `typecheck` → `test`
|
|
38
|
-
(both vitest projects) → `test:browser` (the operator UI in Chromium; run
|
|
39
|
-
`npm run test:browser:install` once per machine, since `check` is also what
|
|
40
|
-
`npm pack` runs) → `build` (which prunes unreachable declarations) →
|
|
41
|
-
`check:declarations` (no Effect type in what ships) → `check:bundle` (per-entry
|
|
42
|
-
gzip caps in `scripts/bundle-budget.json`) → `check:examples`. It is also the
|
|
43
|
-
`prepack` hook. `npm run release:check` adds `check:security` and `check:package` and is
|
|
44
|
-
what CI runs on every pull request, on `main`, and again on publish; use it
|
|
45
|
-
when touching packaging, dependencies, or exports.
|
|
46
|
-
|
|
47
|
-
## The map
|
|
48
|
-
|
|
49
|
-
- [`ethos.md`](./ethos.md) — what connecta is, what it refuses to be, the
|
|
50
|
-
decisions table, and the invariants every change must preserve. Check it
|
|
51
|
-
before building something new; "we already decided not to" is a real answer
|
|
52
|
-
there, and its planned/removed/provisional verdicts override anything staler.
|
|
53
|
-
- [`documentation/`](./documentation/) — four guides for agents working on the
|
|
54
|
-
repo: `architecture.md`, `meta-tools.md`, `code-mode.md`, and `auth.md`.
|
|
55
|
-
Everything else — connectors, providers, admission, storage, the operator
|
|
56
|
-
UI, operations — is documented where it lives, in the source and its tests.
|
|
57
|
-
The guides that once covered those survive only in git history, which is
|
|
58
|
-
worth mining for rationale and worth nothing where it disagrees with
|
|
59
|
-
`ethos.md` or the code. Start with `architecture.md`.
|
|
60
|
-
- [`README.md`](./README.md) — the human-facing overview.
|
|
61
|
-
- [`templates/node/`](./templates/node/) — the one standalone Node deployment
|
|
62
|
-
shape copied by `connecta init`, Docker-ready rather than Docker-only. Keep
|
|
63
|
-
it small and prescribed. There are exactly two deployment shapes, this one
|
|
64
|
-
and [`examples/worker/`](./examples/worker/); a third scaffold that is a
|
|
65
|
-
diff away from one of them is the shape
|
|
66
|
-
[#344](https://github.com/zackbart/connecta/issues/344) deleted.
|
|
67
|
-
|
|
68
|
-
**Read `ethos.md` before changing a subsystem, and its guide when it has one.**
|
|
69
|
-
|
|
70
|
-
## Deployment setup
|
|
71
|
-
|
|
72
|
-
`connecta init [directory]` is the golden path. It copies `templates/node/`,
|
|
73
|
-
pins the generated deployment to the CLI package's exact version, restores the
|
|
74
|
-
template `.gitignore` and the `CLAUDE.md` symlink, and refuses to merge into an
|
|
75
|
-
existing path.
|
|
76
|
-
`connecta doctor` verifies a running deployment's health, executor, and exact
|
|
77
|
-
seven-tool surface. The template carries its own `Dockerfile` and
|
|
78
|
-
`docker-compose.yml`, so the generated project is the container: setup changes
|
|
79
|
-
must keep the root README, the template (source, container files, and README),
|
|
80
|
-
and the `scripts/check-package.mjs` smoke — which builds and runs that
|
|
81
|
-
container when Docker is available — aligned. Do not add a second initializer,
|
|
82
|
-
a second container recipe, or another “recommended” project shape.
|
|
83
|
-
|
|
84
|
-
## Where new code goes
|
|
85
|
-
|
|
86
|
-
Two boundaries CI enforces that are not obvious from reading a file:
|
|
87
|
-
|
|
88
|
-
- **Import-graph purity.** Nothing reachable from `src/index.ts` may import a
|
|
89
|
-
`node:` builtin — the core is Web-API only so it runs unchanged on Workers.
|
|
90
|
-
`src/node.ts`, `src/storage/file.ts`, and the QuickJS process-pool entry
|
|
91
|
-
(`src/executors/quickjs.ts` + child) are the Node-touching paths and must stay
|
|
92
|
-
unreachable from the root entry. `test/purity.test.ts` walks the import graph
|
|
93
|
-
and fails otherwise. Need a Node API? It goes behind an explicit Node-only
|
|
94
|
-
subpath (`/node` or `/quickjs`), never the root. `effect/testing` is banned
|
|
95
|
-
from `src/` on the same terms — its test clocks and layers have no business
|
|
96
|
-
in a runtime graph — and the purity walk catches it. The same walk keeps
|
|
97
|
-
the root entry to `effect` itself and lets only `src/runtime/run.ts` start
|
|
98
|
-
a fiber.
|
|
99
|
-
- **Optional modules.** Core owns catalog discovery, execution, invocation, and
|
|
100
|
-
enforcement. UI, activity history, encrypted credentials, and bearer auth
|
|
101
|
-
implementations stay behind explicit subpaths and outside the root import
|
|
102
|
-
graph. Use the typed `ui`, `activity`, and `vault` slots; do not add a generic
|
|
103
|
-
plugin registry or runtime installation.
|
|
104
|
-
- **The published surface.** Platform-specific storage adapters live in
|
|
105
|
-
`examples/worker/`, never in `src/` and never in the `exports` map. That
|
|
106
|
-
example does ship in the tarball, Cloudflare KV and D1 adapters included —
|
|
107
|
-
it is the Workers starting template a consumer copies, and copying it is the
|
|
108
|
-
point — but every `exports` target resolves into `dist/`, so those adapters
|
|
109
|
-
are readable reference source and not an importable subpath. What is
|
|
110
|
-
forbidden is a platform-bound adapter becoming importable from the package,
|
|
111
|
-
not a file appearing in the artifact. `@clerk/backend` and
|
|
112
|
-
`quickjs-emscripten` are optional peers behind the `./auth/clerk` and
|
|
113
|
-
`./quickjs` subpaths, and `@cloudflare/codemode` is the third, peered
|
|
114
|
-
without a subpath because a Worker deployment imports it directly. None may
|
|
115
|
-
become a dependency or install with core. Enforced by `test/package-surface.test.ts` and
|
|
116
|
-
`scripts/check-package.mjs`. Anything heavyweight or platform-bound gets a
|
|
117
|
-
subpath and an optional peer. The Effect core is the one deliberate
|
|
118
|
-
exception: it is the core, so it is a hard dependency rather than a peer,
|
|
119
|
-
under the rule in [Conventions](#conventions).
|
|
120
|
-
|
|
121
|
-
## Where new tests go
|
|
122
|
-
|
|
123
|
-
Suites live in `test/` and run as two vitest projects (`vitest.config.ts`).
|
|
124
|
-
Every `*.test.ts` belongs to exactly one explicit list: runtime-portable suites
|
|
125
|
-
in `WORKERS_SUITES`, Node-bound suites in `NODE_ONLY_SUITES` with a reason. The
|
|
126
|
-
`node` project runs both lists; the `workers` project re-runs the portable list
|
|
127
|
-
inside workerd. `test/suite-partition.test.ts` walks the directory and fails on
|
|
128
|
-
an unclassified, double-classified, stale, or reasonless entry.
|
|
129
|
-
|
|
130
|
-
## Conventions
|
|
131
|
-
|
|
132
|
-
- **Static analysis.** `npm run check:lint` runs Oxlint's correctness category
|
|
133
|
-
only; it does not enforce style. `npm run check:unused` runs Knip's
|
|
134
|
-
unused-export and dependency gate. Keep both clean, and prefer removing dead
|
|
135
|
-
declarations over suppressing a finding.
|
|
136
|
-
- **Effect inside, Promises at the edge.** The core runs on Effect v4 and
|
|
137
|
-
exports none of it; [Effect inside](./documentation/architecture.md#effect-inside)
|
|
138
|
-
has the shell/core shape, the one runner, and the cross-request rules.
|
|
139
|
-
`createConnecta`,
|
|
140
|
-
`remoteMcp()`, `api()`, custom connectors, and every published `.d.ts` stay
|
|
141
|
-
Promise-based and name no Effect type: a deployment author should never need
|
|
142
|
-
a second async paradigm to write a connector, so convert at the boundary,
|
|
143
|
-
not in the caller. Effect is a hard dependency pinned to one exact version,
|
|
144
|
-
never a range, and compatible with Alchemy's peer requirement, so a deployment
|
|
145
|
-
that uses both resolves one Effect rather than two. Modules tagged
|
|
146
|
-
`@stability unstable` are allowed behind subpaths: they can break in minor releases,
|
|
147
|
-
so an upgrade is its own deliberate pull request, never a drive-by in another
|
|
148
|
-
change. `effect/testing` stays out of `src/` (see import-graph purity). The
|
|
149
|
-
MCP edges do not move with the core — `@modelcontextprotocol/server` upward,
|
|
150
|
-
the SDK client downstream. Replacing either requires separate proof of the
|
|
151
|
-
wire contracts and request lifetimes; the stable core release is not that proof.
|
|
152
|
-
- **Style.** There is no formatter. Match the surrounding code. The docs voice
|
|
153
|
-
is precise, occasionally wry, and always explains *why* — don't flatten it
|
|
154
|
-
into boilerplate.
|
|
155
|
-
- **Commits.** Imperative summary naming the behavior change, with issue refs in
|
|
156
|
-
parens: `Normalize maxResultBytes at every intake point (#32) (#39)`.
|
|
157
|
-
- **CHANGELOG.** Each release opens with a narrative paragraph — what this
|
|
158
|
-
release is, what breaks, what a deployment can ignore — then
|
|
159
|
-
`### Added` / `### Changed` / `### Fixed`.
|
|
160
|
-
- **Provider drift.** Run `npm run providers:check` for the credential-free
|
|
161
|
-
public check across every maintained provider. It covers official MCP
|
|
162
|
-
documentation and OpenAPI contracts and never reads a provider credential.
|
|
163
|
-
Remote MCP schemas remain owned by the live `tools/list` response rather than
|
|
164
|
-
a vendored copy. Findings are read by a human and become GitHub issues;
|
|
165
|
-
nothing files itself. `scripts/drift-check.mjs` is the reference for what
|
|
166
|
-
each flag covers.
|
|
167
|
-
- **Releases.** `npm run release:check`, tag `v<version>` matching
|
|
168
|
-
`package.json` exactly (the publish workflow verifies this and fails
|
|
169
|
-
otherwise), and publishing fires on GitHub **Release publication**, not on the
|
|
170
|
-
tag push.
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { type ResolvedTheme } from "../branding.js";
|
|
2
|
-
import type { Connector } from "../types.js";
|
|
3
|
-
import { type ArtifactOperations } from "./operations.js";
|
|
4
|
-
import { type ArtifactRefreshService } from "./refresh.js";
|
|
5
|
-
import type { ArtifactAllowlist, ArtifactIssue, ArtifactKind, ArtifactLimits } from "./types.js";
|
|
6
|
-
/** What a deployment's render check is handed: exactly what the viewer loads. */
|
|
7
|
-
export interface ArtifactRenderCheckInput {
|
|
8
|
-
/** The complete frame document, data injected. */
|
|
9
|
-
document: string;
|
|
10
|
-
/** The Content-Security-Policy the viewer serves it under. */
|
|
11
|
-
csp: string;
|
|
12
|
-
kind: ArtifactKind;
|
|
13
|
-
/** Aborted when the check's 20-second deadline or the call's own passes. */
|
|
14
|
-
signal: AbortSignal;
|
|
15
|
-
}
|
|
16
|
-
export type ArtifactRenderCheckResult = {
|
|
17
|
-
ok: true;
|
|
18
|
-
warnings?: string[];
|
|
19
|
-
} | {
|
|
20
|
-
ok: false;
|
|
21
|
-
errors: string[];
|
|
22
|
-
};
|
|
23
|
-
/**
|
|
24
|
-
* A real render check — a headless browser, say — run on `validate_artifact`
|
|
25
|
-
* and on every write that changes what a page renders. It must answer within
|
|
26
|
-
* 20 seconds; a throw or a timeout fails the write as retryable `unavailable`
|
|
27
|
-
* and saves nothing.
|
|
28
|
-
*/
|
|
29
|
-
export type ArtifactRenderCheck = (input: ArtifactRenderCheckInput) => Promise<ArtifactRenderCheckResult>;
|
|
30
|
-
type RenderVerdict = {
|
|
31
|
-
ok: true;
|
|
32
|
-
warnings: ArtifactIssue[];
|
|
33
|
-
} | {
|
|
34
|
-
ok: false;
|
|
35
|
-
errors: ArtifactIssue[];
|
|
36
|
-
} | {
|
|
37
|
-
ok: false;
|
|
38
|
-
unavailable: string;
|
|
39
|
-
};
|
|
40
|
-
/** Run a hook under its 20-second deadline and the call's own signal. Never throws. */
|
|
41
|
-
export declare function runRenderCheck(hook: ArtifactRenderCheck, input: {
|
|
42
|
-
document: string;
|
|
43
|
-
csp: string;
|
|
44
|
-
kind: ArtifactKind;
|
|
45
|
-
}, callSignal: AbortSignal | undefined): Promise<RenderVerdict>;
|
|
46
|
-
export interface ArtifactsConnectorOptions {
|
|
47
|
-
operations: ArtifactOperations;
|
|
48
|
-
refresh: ArtifactRefreshService;
|
|
49
|
-
allowlist: ArtifactAllowlist;
|
|
50
|
-
limits: ArtifactLimits;
|
|
51
|
-
renderCheck?: ArtifactRenderCheck;
|
|
52
|
-
/** Where pages are served, when not the deployment's own origin. */
|
|
53
|
-
origin?: string;
|
|
54
|
-
/** Resolved deployment theme, available after the module binds to core. */
|
|
55
|
-
theme?: () => ResolvedTheme | undefined;
|
|
56
|
-
}
|
|
57
|
-
export declare function artifactsConnector(options: ArtifactsConnectorOptions): Connector;
|
|
58
|
-
export {};
|