|
| 1 | +--- |
| 2 | +'@objectstack/spec': minor |
| 3 | +'@objectstack/service-automation': minor |
| 4 | +'@objectstack/connector-rest': minor |
| 5 | +'@objectstack/connector-openapi': minor |
| 6 | +'@objectstack/connector-mcp': minor |
| 7 | +--- |
| 8 | + |
| 9 | +feat(connectors): ADR-0096 — provider-bound declarative connector instances materialized at boot (#2977) |
| 10 | + |
| 11 | +Declarative `connectors:` stack entries used to be **descriptor-only** (#2612): |
| 12 | +registered as metadata but never dispatchable, the platform's one dead metadata |
| 13 | +surface. An entry may now name a **`provider`** — an installed generic executor |
| 14 | +(`openapi` / `mcp` / `rest`) — and the automation service **materializes** it |
| 15 | +into a live, dispatchable connector at boot. AI can now wire an integration as |
| 16 | +pure metadata and a flow `connector_action` calls it end-to-end. |
| 17 | + |
| 18 | +- **Schema (`@objectstack/spec`).** `ConnectorSchema` gains `provider`, |
| 19 | + `providerConfig`, and `auth` (a `credentialRef`-based instance-auth shape — |
| 20 | + `ConnectorInstanceAuthSchema` — that references credentials, never inlines |
| 21 | + them); `authentication` now defaults to `{ type: 'none' }` so a provider-bound |
| 22 | + instance need not author it (loosening — existing connectors are unaffected). |
| 23 | + `DeclarativeConnectorEntrySchema` (used by `stack.zod.ts`) rejects inline |
| 24 | + secrets, orphan `providerConfig`/`auth`, and authored `actions`/`triggers` on a |
| 25 | + provider-bound entry. A new `integration/connector-provider.ts` defines the |
| 26 | + provider-factory contract as pure types. |
| 27 | + |
| 28 | +- **Engine + boot (`@objectstack/service-automation`).** The engine adds a |
| 29 | + connector-provider registry (`registerConnectorProvider`/`getConnectorProvider`) |
| 30 | + and origin-tags registered connectors. At boot the service resolves each |
| 31 | + provider-bound entry — looking up the factory, resolving `auth.credentialRef` |
| 32 | + via a pluggable `CredentialResolver` (open-tier default: environment |
| 33 | + variables), and registering the materialized connector. Boot **fails loudly** |
| 34 | + for an unknown provider, invalid `providerConfig`, an unresolvable |
| 35 | + `credentialRef`, or a name conflict with a plugin-registered connector (no |
| 36 | + silent precedence). |
| 37 | + |
| 38 | +- **Providers (`connector-rest` / `connector-openapi` / `connector-mcp`).** Each |
| 39 | + plugin registers a provider factory in `init()` reusing its existing |
| 40 | + generator/adapter API. Plugin options are now **optional**: with none the |
| 41 | + plugin contributes only its provider factory; with instance options it also |
| 42 | + registers a hand-wired connector (back-compat). `connector-openapi` adds a |
| 43 | + `ConnectorOpenApiPlugin`. |
| 44 | + |
| 45 | +Open tier: static auth (`none`/`api-key`/`basic`/`bearer`) with `credentialRef` |
| 46 | +resolved from env vars. Managed vaulting, OAuth2 refresh, and per-tenant |
| 47 | +connection lifecycle remain the enterprise tier (ADR-0015) — an enterprise host |
| 48 | +injects a vault-backed `CredentialResolver` with no change to the materialization |
| 49 | +path. |
0 commit comments