diff --git a/.changeset/concurrent-stale-tools-sync.md b/.changeset/concurrent-stale-tools-sync.md deleted file mode 100644 index 8f4bc858c..000000000 --- a/.changeset/concurrent-stale-tools-sync.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"executor": patch ---- - -**Stale tool catalogs refresh together instead of one after another, and self-host can set the freshness window** - -A tools read rebuilds every connection whose catalog has gone stale. Those rebuilds each dial their own upstream, but ran strictly one after another, so a host with several stale remote catalogs paid the sum of every server's latency on the read that tripped the TTL. The upstream listings now run concurrently, bounded so a large stale set cannot open an unbounded number of listings from one read. - -Only the listings overlap. Each rebuild's catalog write stays single-file, because a self-host database is one connection issuing raw `BEGIN`/`COMMIT` and a second transaction opened while one is live fails outright. A rebuild that fails now also logs a warning naming the connection and the reason, instead of disappearing: the read still succeeds on the stale-but-working catalog and the other connections still finish, but a permanently broken connection no longer re-fails silently on every read. - -Self-host also exposes the freshness window as `EXECUTOR_TOOLS_SYNC_TTL_MS`. Leave it unset for the 15-minute default, or set `off` (equivalently `null` or `false`, in any case) to disable time-based re-sync and leave stale-marking and config revision as the only refresh triggers. The value forwards to the SDK verbatim, so `0` keeps its SDK meaning: every catalog is expired on every read. A malformed, negative, or too-large-to-represent value is refused at boot rather than silently falling back to the default. diff --git a/.changeset/defer-irreversible-cleanup.md b/.changeset/defer-irreversible-cleanup.md deleted file mode 100644 index 67ff23983..000000000 --- a/.changeset/defer-irreversible-cleanup.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -"executor": minor ---- - -**Irreversible cleanup now waits for the transaction to commit, and plugins can do the same** - -`oauth.removeClient` deleted the client row and then deleted the client secret from the credential provider. The provider does not enlist in the caller's transaction and does not roll back with it, so an abort restored the client row while its secret stayed destroyed — a client that looks configured and can never authenticate again. The deletion now waits until the removal is durable and is discarded if the removal rolls back. With no transaction active it runs immediately, exactly as before. - -Deferring the deletion is not enough on its own. The secret is stored under a key derived from the app's `(owner, slug)` identity alone, so the key outlives the row it belonged to: whoever holds that identity when the deletion finally runs owns the key. A slug registered again before the removal committed would lose the new app's secret to the old app's queued deletion — the same unauthenticatable client, reached the other way round. The deferred deletion now re-checks that the app is still gone and stands down when it is not. A removal that matched no row also no longer queues a deletion at all: it removed nothing, so it has no claim on the key, which may well hold another subject's live secret. - -The same trap was reachable by plugins and they had no way out of it. `removeConnection` and `removeIntegration` run inside core's removal transaction — deliberately, so a plugin's own rows die atomically with the connection — which makes them exactly the wrong place to revoke a token at the provider's API, delete a remote object, or notify a third party. Nothing in the hooks' documentation said so, and `PluginCtx` exposed `transaction` but nothing to defer past it. - -`PluginCtx` gains `afterCommit`. It runs the effect once the outermost transaction commits, discards it if that transaction rolls back, and runs it immediately when no transaction is active. The lifecycle hooks now document that they run inside core's transaction and that outside-world work belongs in `afterCommit`. - -Sequencing work after your own `transaction(...)` call is not equivalent, and the documentation says so explicitly: `transaction` nests by pass-through, so inside an active transaction the inner call simply runs its effect and "afterwards" is still before any commit. diff --git a/.changeset/expired-authorization-session-sweep.md b/.changeset/expired-authorization-session-sweep.md deleted file mode 100644 index 60cf946da..000000000 --- a/.changeset/expired-authorization-session-sweep.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"executor": patch ---- - -**Abandoned authorization sessions no longer keep their PKCE verifier forever** - -An OAuth authorization session stores its PKCE verifier so the callback can redeem the code. `complete` discarded an expired session lazily, but an _abandoned_ flow is never completed, so that check never ran for it and nothing else swept the table — the verifier sat there in plaintext indefinitely. - -Starting a new authorization now sweeps sessions that have already expired. Doing it on `start` bounds the table by how often authorization is begun rather than by how often it is abandoned, and needs no scheduler in any host. A session whose completion cannot be retried is dropped rather than left behind. - -The sweep only ever reaches rows the caller can already see, so one member's authorization never touches another member's sessions. It is best-effort: a sweep that fails logs a warning and lets the authorization continue. diff --git a/.changeset/graphql-introspection-credential-log.md b/.changeset/graphql-introspection-credential-log.md deleted file mode 100644 index d7a146d28..000000000 --- a/.changeset/graphql-introspection-credential-log.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -"executor": patch ---- - -**GraphQL introspection no longer logs a credential carried in the endpoint URL** - -`query` is a supported credential carrier, so a GraphQL endpoint can be reached with `?token=`. Introspection built its request from a URL **string**, and `HttpClientRequest.setUrl` keeps a string verbatim as `request.url`. Every `HttpClientError` renders `${method} ${request.url}` into its `message` getter, and introspection logs the raw failure cause — so on any transport failure or non-JSON response, the connection's secret was written to the process log. - -The request is now built from a URL **object**, which moves the query into `request.urlParams` and clears it from `request.url`. The secret is therefore absent from the error message, and from anything else that renders the request URL. The credential still reaches the upstream: the client recombines url and urlParams when it executes the request. The endpoint's own query string is handled the same way, not just the separately-supplied query parameters, since a configured endpoint can carry a credential too. - -**The query string is now normalized on the wire.** Recombination appends each pair through `URLSearchParams`, so the query is re-serialized in form-urlencoded form instead of passed through byte-for-byte: - -- a space written as `%20` is sent as `+` -- `~` and `!'()` are percent-encoded -- a valueless `?flag` is sent as `flag=` - -Key order, repeated keys, and already-encoded reserved characters are unchanged, and every parameter still decodes to the same value. This is not avoidable while the fix holds: raw query bytes only survive inside `request.url`, which is the one field every error message renders, so byte-transparency and keeping the credential out of the log cannot both hold. An upstream that signs its raw query string is the case to watch. The exact resulting URLs are pinned by test. - -Two endpoints are now rejected up front with an `invalid-endpoint` failure rather than dialed: - -- an endpoint that is not a valid URL, which cannot be split this way and would otherwise be sent without the query parameters it was asked to include -- an endpoint carrying userinfo (`https://user:pass@host/…`), which `URL` keeps in the origin, so it would stay in `request.url` and leak into error messages exactly the way a query-carried secret used to - -Neither rejection echoes any part of the endpoint. A health check on such an integration now reports the invalid configuration and points the operator at the endpoint URL, instead of blaming the credential that was never sent. diff --git a/.changeset/health-response-sample-scrub.md b/.changeset/health-response-sample-scrub.md deleted file mode 100644 index 82897a1d5..000000000 --- a/.changeset/health-response-sample-scrub.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -"executor": patch ---- - -**Credentials are kept out of the health-check result that gets persisted** - -A health check stores a sample of the probed operation's response body, plus the extracted identity, in `connection.last_health` — so whatever those carry is written to the database. The operation is user-chosen from the plugin's catalog, which means it can just as easily be a key-listing endpoint as a `/me`, and those return secrets that no scrub of the connection's own credential value can recognise, because they are different secrets entirely. - -Two passes now cover both kinds of secret: - -- **By key name.** Leaves whose key names a credential (`token`, `api_key`, `secret`, `authorization`, `session`, …) have their value replaced with `[redacted]`. The row itself is kept, so the live preview still shows the response shape and the identity picker still works. Keys that merely contain a matching substring, such as `author`, are left alone. camelCase spellings are recognised too: `accessToken`, `refreshToken`, `clientSecret`, `privateKey` and `sessionId` have no separator before the credential word, so a matcher that only looks for one reads them as innocent. -- **By value.** The OpenAPI health check removes the connection's own credential value from each sampled value, covering the other direction: a body that echoes back the key it was authenticated with under an innocent-looking name. This runs before the sample's 120-char truncation, not after — truncating first leaves a prefix of a long credential that an exact-value scrub can no longer match, and that prefix is what would be persisted. - -The key check reads a dotted path two ways. It uses the nearest NAMED segment, because array elements are named by index: `{"tokens": ["sk-live-…"]}` produces the path `tokens.0`, and testing the literal `"0"` matches nothing. It also uses an enclosing array container, because a key listing returns `{"api_keys": [{"value": "sk-live-…"}]}`, whose path is `api_keys.0.value` — the nearest named segment there is the innocent `value`, and only the array's own key says what the collection holds. A collection whose key names nothing, such as `names.0`, is still shown in full. - -The extracted `identity` goes through both passes as well. It is read straight off the raw body, so it previously bypassed them even though it is persisted the same way, and `identityField` is user-chosen from whatever the picker listed. diff --git a/.changeset/mcp-oauth-declared-scopes.md b/.changeset/mcp-oauth-declared-scopes.md deleted file mode 100644 index 9cd63bac7..000000000 --- a/.changeset/mcp-oauth-declared-scopes.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"executor": patch ---- - -**Fix: allow MCP integrations to declare OAuth scopes when resource metadata omits them** - -MCP OAuth methods can now carry an optional non-empty scope list. Declared scopes -take precedence over protected-resource scope discovery, so servers with fixed -scopes can connect even when their dynamically registered OAuth client has no -resource identifier. Existing integrations without declared scopes keep -discovering them from the server at connect time. diff --git a/.changeset/mcp-pool-idle-sweep.md b/.changeset/mcp-pool-idle-sweep.md deleted file mode 100644 index 56e194401..000000000 --- a/.changeset/mcp-pool-idle-sweep.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -"executor": patch ---- - -**Idle MCP connections age out on the pool's next acquire, even when their identity is never dialled again** - -The pool's five-minute idle window was only consulted against the entry being requested, so an identity that was never asked for a second time was never examined a second time. Its session stayed open and authenticated for as long as the pool lived, holding the bearer token or API key it was dialled with. The advertised bound applied only to connections that happened to be reused. - -`acquire` now sweeps every entry past the window, closing each one, rather than just the entry matching the key. This stays lazy in the sense the pool intends — activity drives it, there is no timer and no background fiber — and the map holds at most one entry per identity, so the scan is trivial. - -Because the sweep is paid for by whichever invocation acquires next, it cannot be allowed to stall that caller. The expired entries leave the pool synchronously, before any close is awaited, and the closes then run concurrently with each one bounded by a two-second timeout — so a server that accepts a close and goes quiet is abandoned rather than waited on, and cannot hold up an unrelated request or the connections queued behind it. - -Reuse is unchanged: an entry still inside the window is left alone, and a second call for the same identity still gets the parked session rather than a fresh dial. diff --git a/.changeset/mcp-pre-initialize-method-not-found.md b/.changeset/mcp-pre-initialize-method-not-found.md deleted file mode 100644 index 3b794e1c8..000000000 --- a/.changeset/mcp-pre-initialize-method-not-found.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -"@executor-js/local": patch ---- - -**An unsupported method probed before `initialize` no longer kills the MCP connection** - -Only `initialize` can open a session, so the streamable-HTTP transport answered every other pre-session method with HTTP 400 + `-32000 Server not initialized`. A 400 is a transport-level failure, so clients dropped the connection instead of treating it as one request failing — a client that opens with an optional probe (MCP 2026-07-28 clients lead with `server/discover`) was disconnected before it could fall back to `initialize`. Over `executor mcp`, which bridges this endpoint to stdio, that closed the client's pipe outright. - -Pre-session dispatch now answers any method other than `initialize` with `-32601 Method not found` on a normal 200, which is a per-request error, so the connection survives and the handshake proceeds. This replaces only that one answer: a POST with a bad `Accept` or `Content-Type` still gets the transport's 406 or 415, and a message that is not a valid JSON-RPC request still gets its parse error. diff --git a/.changeset/mcp-stdio-env-isolation.md b/.changeset/mcp-stdio-env-isolation.md deleted file mode 100644 index f194fbf8c..000000000 --- a/.changeset/mcp-stdio-env-isolation.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"@executor-js/plugin-mcp": patch ---- - -**Stdio MCP servers no longer inherit executor's full environment** - -A stdio MCP server that declared any `env` at all was spawned with every environment variable this process holds. The MCP SDK already guards against that: it spawns with `{ ...getDefaultEnvironment(), ...serverParams.env }`, where `getDefaultEnvironment()` is a sudo-style safe-list of `HOME`, `LOGNAME`, `PATH`, `SHELL`, `TERM` and `USER`. Passing `{ ...process.env, ...config.env }` did not add to that safe-list, it overwrote it. In practice, adding one third-party `npx` server went from "this server can see the API key I gave it" to "this server also holds `EXECUTOR_SECRET_KEY`, the key that decrypts every other stored credential, plus `EXECUTOR_AUTH_TOKEN` and `DATABASE_URL`". The leak sat on the `config.env` branch — the branch a credential-bearing integration takes. - -A stdio server now receives the SDK's safe-list, the variables declared on the source config, and one short allowlist of infrastructure variables read from the host: `HTTP_PROXY`, `HTTPS_PROXY`, `NO_PROXY` (both spellings), `NODE_EXTRA_CA_CERTS`, `SSL_CERT_FILE` and `SSL_CERT_DIR`. Those carry no credential, no source config declares them, and a server behind a corporate proxy or an intercepting CA cannot reach anything without them — the same reasoning and the same list `service install` already uses when it bakes a supervised unit's minimal environment. The declared `env` wins on a key collision. On Windows that collision is resolved case-insensitively, because the OS treats `Path` and `PATH` as one variable while a JavaScript spread does not: a declared `http_proxy` now replaces an inherited `HTTP_PROXY` instead of travelling beside it, which would have left the child reading whichever spelling Windows resolved first. - -If a stdio server relied on some other variable arriving from the host, set it explicitly on the source's `env`. That is now the only way anything beyond the lists above reaches a server, and it is the mechanism that already existed for it. diff --git a/.changeset/oauth-refresh-store-writability-gate.md b/.changeset/oauth-refresh-store-writability-gate.md deleted file mode 100644 index 23d6994d3..000000000 --- a/.changeset/oauth-refresh-store-writability-gate.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -"executor": patch ---- - -**A credential-store outage no longer costs an OAuth connection its grant** - -Refreshing an OAuth token spends the stored refresh token: the authorization server rotates it, so the copy we sent stops working the moment the grant succeeds and the rotated one is the only thing that can mint again. Persisting the rotated token first bounds what a partial write can lose, but it cannot help when the store is refusing writes outright — the grant has already run, there is nowhere to put the successor, and every later refresh replays a token the server has revoked. The connection then reports `invalid_grant` and demands a re-auth over what was only a storage blip. - -The refresh is now gated on a store that is proven writable. Before the grant runs, it writes a fixed value to an item of its own that holds no credential and sits in the same partition as the connection's tokens. A store that cannot take that write fails the resolve while the stored refresh token is still valid, so the connection recovers on its own once the store does. - -The probe deliberately does not test the store by rewriting the refresh token with the value it just read. That is a read-then-write with no compare-and-set, and two instances refreshing one connection would lose the newer token to it: one reads the stored token, the other spends that same token and stores its rotated replacement, and the first then writes the spent one back over the replacement. The connection would die exactly the way the gate is meant to prevent. - -The probe also removes a write rather than adding one in the common case. Authorization servers that do not rotate hand back the same refresh token, and that value is no longer re-persisted when it has not changed — a rotated token never matches, so the write that matters still happens. diff --git a/.changeset/oauth-token-endpoint-error-leak.md b/.changeset/oauth-token-endpoint-error-leak.md deleted file mode 100644 index fe4055647..000000000 --- a/.changeset/oauth-token-endpoint-error-leak.md +++ /dev/null @@ -1,35 +0,0 @@ ---- -"executor": patch ---- - -**Keep token material out of OAuth token-endpoint error messages** - -A token-endpoint failure renders a preview of the upstream body into its -message, and that message is persisted onto connection health, returned to the -caller, and carried into telemetry. On a malformed HTTP 200 the body being -previewed is a _successful_ token response, so an access token and a refresh -token could be rendered into it. - -The preview is now built from an allowlist of fields that are safe to show -(`error`, `errors`, `error_description`, `error_uri`, plus `code`, `message`, -and `detail` nested inside them) instead of a denylist of fields to hide. A -field nobody anticipated is omitted by default rather than printed by default. -Keys stay visible and only non-allowlisted string values are replaced, so an -operator can still read the shape of what the server sent. `code` is readable -only when nested, because at the top level of a token response it is the RFC -6749 authorization code. - -Form-encoded bodies take the same allowlist, the walk over a body is -depth-bounded, and the failure summary records the token endpoint's hostname -rather than its full URL, which can carry identifiers in its path. - -On that same malformed-200 path the failure no longer keeps the underlying -rejection as its `cause`. That rejection carries the parsed token response, so -keeping it put the raw tokens back into anything that renders the whole failure -rather than only its message. Everything the path needs from the body — the -status, the error code, the redacted preview — is read before the failure is -built. A transport failure still keeps its cause, which is what tells a DNS miss -apart from a refused connection. - -No public API changes. The dead-grant classification added for HTTP 200 refresh -refusals is unaffected: it reads the HTTP status, not the rendered preview. diff --git a/.changeset/openapi-multipart-file-fields.md b/.changeset/openapi-multipart-file-fields.md deleted file mode 100644 index 815277fad..000000000 --- a/.changeset/openapi-multipart-file-fields.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -"@executor-js/plugin-openapi": patch ---- - -Multipart file fields in an OpenAPI spec now accept and send real files. A `multipart/form-data` property typed as a binary or byte string is rewritten into the SDK's tool-file schema when the tool is extracted, so an agent supplies a file the same way it does everywhere else. On invocation those values are decoded back into `File`/`Blob` parts — as bare properties and inside arrays, with a per-property `encoding.contentType` applied to each file part — instead of being JSON-stringified into the form body, which is what upstreams were previously rejecting. A file whose base64 payload does not decode now fails the invocation and names the field, rather than sending the file envelope as JSON. - -The rewrite advertises only the shapes the request encoder can deliver. Two are deliberately left alone: - -- A binary field nested inside an object property. Only top-level multipart properties and direct items of a top-level array property become form parts. -- A multipart body schema, or one of its properties, behind a `$ref`. Component schemas are carried through unresolved by design — the streaming compile path never materializes `components.schemas` — so a `$ref`'d file field keeps its declared binary string type. - -The rewrite reads the request schema's own `properties` map rather than walking every object key, so a `default`, `example`, or vendor extension that happens to look like a binary string schema is untouched. Descriptions, titles, and nullability on the replaced field are carried onto the file schema. diff --git a/.changeset/persist-mcp-install-options.md b/.changeset/persist-mcp-install-options.md deleted file mode 100644 index 1a7b31609..000000000 --- a/.changeset/persist-mcp-install-options.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"executor": patch ---- - -Persist the Connect-an-agent card's transport, artifact, integration-search, and approval preferences in the browser so its generated MCP install command remains stable across page reloads. diff --git a/.changeset/scope-mcp-stream-replay.md b/.changeset/scope-mcp-stream-replay.md deleted file mode 100644 index 0374d7460..000000000 --- a/.changeset/scope-mcp-stream-replay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"executor": patch ---- - -Keep Last-Event-ID recovery scoped to its originating MCP stream. diff --git a/.changeset/seat-based-team-pricing.md b/.changeset/seat-based-team-pricing.md deleted file mode 100644 index 380f9daa6..000000000 --- a/.changeset/seat-based-team-pricing.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -"@executor-js/cloud": patch ---- - -**Team pricing is per member with unlimited executions** - -The Team plan moves from $150 per organization with a 250,000-execution -allowance to $15 per member per month with unlimited executions. The -`members` feature is unarchived in `autumn.config.ts` and billed in arrears -on the seat count the app reports; Free keeps its 3-member, 100,000-execution -shape and Enterprise stays custom with seat usage tracked for visibility. - -Seat counts reconcile from a full WorkOS recount (active members only — -pending invites hold a seat for the plan gate but are not billed) after -member removal, invitation acceptance, organization creation, and on every -login callback, which also picks up joins the app never sees a mutation for -(SSO JIT provisioning, join by domain, dashboard edits). Plans that predate -seat pricing have no members balance and are skipped, so existing -subscriptions keep billing exactly as before on their current plan version. - -The plans page, billing page, and marketing pricing cards now show the -per-member price. diff --git a/apps/cli/CHANGELOG.md b/apps/cli/CHANGELOG.md index 27f0acd06..0cc2f06da 100644 --- a/apps/cli/CHANGELOG.md +++ b/apps/cli/CHANGELOG.md @@ -1,5 +1,140 @@ # executor +## 1.7.0 + +### Minor Changes + +- [#1572](https://github.com/UsefulSoftwareCo/executor/pull/1572) [`27cb466`](https://github.com/UsefulSoftwareCo/executor/commit/27cb4664282308e86fdb43218b42fe457d22e782) Thanks [@GeiserX](https://github.com/GeiserX)! - **Irreversible cleanup now waits for the transaction to commit, and plugins can do the same** + + `oauth.removeClient` deleted the client row and then deleted the client secret from the credential provider. The provider does not enlist in the caller's transaction and does not roll back with it, so an abort restored the client row while its secret stayed destroyed — a client that looks configured and can never authenticate again. The deletion now waits until the removal is durable and is discarded if the removal rolls back. With no transaction active it runs immediately, exactly as before. + + Deferring the deletion is not enough on its own. The secret is stored under a key derived from the app's `(owner, slug)` identity alone, so the key outlives the row it belonged to: whoever holds that identity when the deletion finally runs owns the key. A slug registered again before the removal committed would lose the new app's secret to the old app's queued deletion — the same unauthenticatable client, reached the other way round. The deferred deletion now re-checks that the app is still gone and stands down when it is not. A removal that matched no row also no longer queues a deletion at all: it removed nothing, so it has no claim on the key, which may well hold another subject's live secret. + + The same trap was reachable by plugins and they had no way out of it. `removeConnection` and `removeIntegration` run inside core's removal transaction — deliberately, so a plugin's own rows die atomically with the connection — which makes them exactly the wrong place to revoke a token at the provider's API, delete a remote object, or notify a third party. Nothing in the hooks' documentation said so, and `PluginCtx` exposed `transaction` but nothing to defer past it. + + `PluginCtx` gains `afterCommit`. It runs the effect once the outermost transaction commits, discards it if that transaction rolls back, and runs it immediately when no transaction is active. The lifecycle hooks now document that they run inside core's transaction and that outside-world work belongs in `afterCommit`. + + Sequencing work after your own `transaction(...)` call is not equivalent, and the documentation says so explicitly: `transaction` nests by pass-through, so inside an active transaction the inner call simply runs its effect and "afterwards" is still before any commit. + +### Patch Changes + +- [#1560](https://github.com/UsefulSoftwareCo/executor/pull/1560) [`8c20c33`](https://github.com/UsefulSoftwareCo/executor/commit/8c20c33817ad815b252c3d72290004905aedab10) Thanks [@Adityakk9031](https://github.com/Adityakk9031)! - **Stale tool catalogs refresh together instead of one after another, and self-host can set the freshness window** + + A tools read rebuilds every connection whose catalog has gone stale. Those rebuilds each dial their own upstream, but ran strictly one after another, so a host with several stale remote catalogs paid the sum of every server's latency on the read that tripped the TTL. The upstream listings now run concurrently, bounded so a large stale set cannot open an unbounded number of listings from one read. + + Only the listings overlap. Each rebuild's catalog write stays single-file, because a self-host database is one connection issuing raw `BEGIN`/`COMMIT` and a second transaction opened while one is live fails outright. A rebuild that fails now also logs a warning naming the connection and the reason, instead of disappearing: the read still succeeds on the stale-but-working catalog and the other connections still finish, but a permanently broken connection no longer re-fails silently on every read. + + Self-host also exposes the freshness window as `EXECUTOR_TOOLS_SYNC_TTL_MS`. Leave it unset for the 15-minute default, or set `off` (equivalently `null` or `false`, in any case) to disable time-based re-sync and leave stale-marking and config revision as the only refresh triggers. The value forwards to the SDK verbatim, so `0` keeps its SDK meaning: every catalog is expired on every read. A malformed, negative, or too-large-to-represent value is refused at boot rather than silently falling back to the default. + +- [#1569](https://github.com/UsefulSoftwareCo/executor/pull/1569) [`d874455`](https://github.com/UsefulSoftwareCo/executor/commit/d874455c5d5ea83a69e2010152aeb703d74f51c2) Thanks [@GeiserX](https://github.com/GeiserX)! - **Abandoned authorization sessions no longer keep their PKCE verifier forever** + + An OAuth authorization session stores its PKCE verifier so the callback can redeem the code. `complete` discarded an expired session lazily, but an _abandoned_ flow is never completed, so that check never ran for it and nothing else swept the table — the verifier sat there in plaintext indefinitely. + + Starting a new authorization now sweeps sessions that have already expired. Doing it on `start` bounds the table by how often authorization is begun rather than by how often it is abandoned, and needs no scheduler in any host. A session whose completion cannot be retried is dropped rather than left behind. + + The sweep only ever reaches rows the caller can already see, so one member's authorization never touches another member's sessions. It is best-effort: a sweep that fails logs a warning and lets the authorization continue. + +- [#1575](https://github.com/UsefulSoftwareCo/executor/pull/1575) [`e5526f3`](https://github.com/UsefulSoftwareCo/executor/commit/e5526f32b355e56aabe20024bc2f96296bfa982d) Thanks [@GeiserX](https://github.com/GeiserX)! - **GraphQL introspection no longer logs a credential carried in the endpoint URL** + + `query` is a supported credential carrier, so a GraphQL endpoint can be reached with `?token=`. Introspection built its request from a URL **string**, and `HttpClientRequest.setUrl` keeps a string verbatim as `request.url`. Every `HttpClientError` renders `${method} ${request.url}` into its `message` getter, and introspection logs the raw failure cause — so on any transport failure or non-JSON response, the connection's secret was written to the process log. + + The request is now built from a URL **object**, which moves the query into `request.urlParams` and clears it from `request.url`. The secret is therefore absent from the error message, and from anything else that renders the request URL. The credential still reaches the upstream: the client recombines url and urlParams when it executes the request. The endpoint's own query string is handled the same way, not just the separately-supplied query parameters, since a configured endpoint can carry a credential too. + + **The query string is now normalized on the wire.** Recombination appends each pair through `URLSearchParams`, so the query is re-serialized in form-urlencoded form instead of passed through byte-for-byte: + - a space written as `%20` is sent as `+` + - `~` and `!'()` are percent-encoded + - a valueless `?flag` is sent as `flag=` + + Key order, repeated keys, and already-encoded reserved characters are unchanged, and every parameter still decodes to the same value. This is not avoidable while the fix holds: raw query bytes only survive inside `request.url`, which is the one field every error message renders, so byte-transparency and keeping the credential out of the log cannot both hold. An upstream that signs its raw query string is the case to watch. The exact resulting URLs are pinned by test. + + Two endpoints are now rejected up front with an `invalid-endpoint` failure rather than dialed: + - an endpoint that is not a valid URL, which cannot be split this way and would otherwise be sent without the query parameters it was asked to include + - an endpoint carrying userinfo (`https://user:pass@host/…`), which `URL` keeps in the origin, so it would stay in `request.url` and leak into error messages exactly the way a query-carried secret used to + + Neither rejection echoes any part of the endpoint. A health check on such an integration now reports the invalid configuration and points the operator at the endpoint URL, instead of blaming the credential that was never sent. + +- [#1596](https://github.com/UsefulSoftwareCo/executor/pull/1596) [`b77ee69`](https://github.com/UsefulSoftwareCo/executor/commit/b77ee69aeeb90e40a2902c4d849e89d2343d91de) Thanks [@GeiserX](https://github.com/GeiserX)! - **Credentials are kept out of the health-check result that gets persisted** + + A health check stores a sample of the probed operation's response body, plus the extracted identity, in `connection.last_health` — so whatever those carry is written to the database. The operation is user-chosen from the plugin's catalog, which means it can just as easily be a key-listing endpoint as a `/me`, and those return secrets that no scrub of the connection's own credential value can recognise, because they are different secrets entirely. + + Two passes now cover both kinds of secret: + - **By key name.** Leaves whose key names a credential (`token`, `api_key`, `secret`, `authorization`, `session`, …) have their value replaced with `[redacted]`. The row itself is kept, so the live preview still shows the response shape and the identity picker still works. Keys that merely contain a matching substring, such as `author`, are left alone. camelCase spellings are recognised too: `accessToken`, `refreshToken`, `clientSecret`, `privateKey` and `sessionId` have no separator before the credential word, so a matcher that only looks for one reads them as innocent. + - **By value.** The OpenAPI health check removes the connection's own credential value from each sampled value, covering the other direction: a body that echoes back the key it was authenticated with under an innocent-looking name. This runs before the sample's 120-char truncation, not after — truncating first leaves a prefix of a long credential that an exact-value scrub can no longer match, and that prefix is what would be persisted. + + The key check reads a dotted path two ways. It uses the nearest NAMED segment, because array elements are named by index: `{"tokens": ["sk-live-…"]}` produces the path `tokens.0`, and testing the literal `"0"` matches nothing. It also uses an enclosing array container, because a key listing returns `{"api_keys": [{"value": "sk-live-…"}]}`, whose path is `api_keys.0.value` — the nearest named segment there is the innocent `value`, and only the array's own key says what the collection holds. A collection whose key names nothing, such as `names.0`, is still shown in full. + + The extracted `identity` goes through both passes as well. It is read straight off the raw body, so it previously bypassed them even though it is persisted the same way, and `identityField` is user-chosen from whatever the picker listed. + +- [#1607](https://github.com/UsefulSoftwareCo/executor/pull/1607) [`75c917f`](https://github.com/UsefulSoftwareCo/executor/commit/75c917fdb0cb8499678f842c62133483472b4814) Thanks [@timkley](https://github.com/timkley)! - **Fix: allow MCP integrations to declare OAuth scopes when resource metadata omits them** + + MCP OAuth methods can now carry an optional non-empty scope list. Declared scopes + take precedence over protected-resource scope discovery, so servers with fixed + scopes can connect even when their dynamically registered OAuth client has no + resource identifier. Existing integrations without declared scopes keep + discovering them from the server at connect time. + +- [#1577](https://github.com/UsefulSoftwareCo/executor/pull/1577) [`4879d47`](https://github.com/UsefulSoftwareCo/executor/commit/4879d47bd7bc0d80440fe0438ce0e4b36b19a2d2) Thanks [@GeiserX](https://github.com/GeiserX)! - **Idle MCP connections age out on the pool's next acquire, even when their identity is never dialled again** + + The pool's five-minute idle window was only consulted against the entry being requested, so an identity that was never asked for a second time was never examined a second time. Its session stayed open and authenticated for as long as the pool lived, holding the bearer token or API key it was dialled with. The advertised bound applied only to connections that happened to be reused. + + `acquire` now sweeps every entry past the window, closing each one, rather than just the entry matching the key. This stays lazy in the sense the pool intends — activity drives it, there is no timer and no background fiber — and the map holds at most one entry per identity, so the scan is trivial. + + Because the sweep is paid for by whichever invocation acquires next, it cannot be allowed to stall that caller. The expired entries leave the pool synchronously, before any close is awaited, and the closes then run concurrently with each one bounded by a two-second timeout — so a server that accepts a close and goes quiet is abandoned rather than waited on, and cannot hold up an unrelated request or the connections queued behind it. + + Reuse is unchanged: an entry still inside the window is left alone, and a second call for the same identity still gets the parked session rather than a fresh dial. + +- [#1377](https://github.com/UsefulSoftwareCo/executor/pull/1377) [`98615b4`](https://github.com/UsefulSoftwareCo/executor/commit/98615b4bd6ee8b18bc63a304fe215c76332e108f) Thanks [@RhysSullivan](https://github.com/RhysSullivan)! - **A credential-store outage no longer costs an OAuth connection its grant** + + Refreshing an OAuth token spends the stored refresh token: the authorization server rotates it, so the copy we sent stops working the moment the grant succeeds and the rotated one is the only thing that can mint again. Persisting the rotated token first bounds what a partial write can lose, but it cannot help when the store is refusing writes outright — the grant has already run, there is nowhere to put the successor, and every later refresh replays a token the server has revoked. The connection then reports `invalid_grant` and demands a re-auth over what was only a storage blip. + + The refresh is now gated on a store that is proven writable. Before the grant runs, it writes a fixed value to an item of its own that holds no credential and sits in the same partition as the connection's tokens. A store that cannot take that write fails the resolve while the stored refresh token is still valid, so the connection recovers on its own once the store does. + + The probe deliberately does not test the store by rewriting the refresh token with the value it just read. That is a read-then-write with no compare-and-set, and two instances refreshing one connection would lose the newer token to it: one reads the stored token, the other spends that same token and stores its rotated replacement, and the first then writes the spent one back over the replacement. The connection would die exactly the way the gate is meant to prevent. + + The probe also removes a write rather than adding one in the common case. Authorization servers that do not rotate hand back the same refresh token, and that value is no longer re-persisted when it has not changed — a rotated token never matches, so the write that matters still happens. + +- [#1567](https://github.com/UsefulSoftwareCo/executor/pull/1567) [`6225d5e`](https://github.com/UsefulSoftwareCo/executor/commit/6225d5ede05b23f552211ad0a99267f4b94fcaf6) Thanks [@GeiserX](https://github.com/GeiserX)! - **Keep token material out of OAuth token-endpoint error messages** + + A token-endpoint failure renders a preview of the upstream body into its + message, and that message is persisted onto connection health, returned to the + caller, and carried into telemetry. On a malformed HTTP 200 the body being + previewed is a _successful_ token response, so an access token and a refresh + token could be rendered into it. + + The preview is now built from an allowlist of fields that are safe to show + (`error`, `errors`, `error_description`, `error_uri`, plus `code`, `message`, + and `detail` nested inside them) instead of a denylist of fields to hide. A + field nobody anticipated is omitted by default rather than printed by default. + Keys stay visible and only non-allowlisted string values are replaced, so an + operator can still read the shape of what the server sent. `code` is readable + only when nested, because at the top level of a token response it is the RFC + 6749 authorization code. + + Form-encoded bodies take the same allowlist, the walk over a body is + depth-bounded, and the failure summary records the token endpoint's hostname + rather than its full URL, which can carry identifiers in its path. + + On that same malformed-200 path the failure no longer keeps the underlying + rejection as its `cause`. That rejection carries the parsed token response, so + keeping it put the raw tokens back into anything that renders the whole failure + rather than only its message. Everything the path needs from the body — the + status, the error code, the redacted preview — is read before the failure is + built. A transport failure still keeps its cause, which is what tells a DNS miss + apart from a refused connection. + + No public API changes. The dead-grant classification added for HTTP 200 refresh + refusals is unaffected: it reads the HTTP status, not the rendered preview. + +- [#1772](https://github.com/UsefulSoftwareCo/executor/pull/1772) [`597ce90`](https://github.com/UsefulSoftwareCo/executor/commit/597ce90b30b96d2dd333a6c34e5f2cd0ee4c7d42) Thanks [@baggiiiie](https://github.com/baggiiiie)! - Persist the Connect-an-agent card's transport, artifact, integration-search, and approval preferences in the browser so its generated MCP install command remains stable across page reloads. + +- [#1529](https://github.com/UsefulSoftwareCo/executor/pull/1529) [`0004ea3`](https://github.com/UsefulSoftwareCo/executor/commit/0004ea353411c9806273698e42d95ab45e0ba2f9) Thanks [@jadch](https://github.com/jadch)! - Keep Last-Event-ID recovery scoped to its originating MCP stream. + +- Updated dependencies [[`1908dd6`](https://github.com/UsefulSoftwareCo/executor/commit/1908dd6d7611489362d451f7594adca542c13ba1)]: + - @executor-js/local@1.7.0 + - @executor-js/sdk@1.7.0 + - @executor-js/runtime-quickjs@1.7.0 + - @executor-js/api@1.4.66 + ## 1.6.2 ### Patch Changes diff --git a/apps/cli/package.json b/apps/cli/package.json index 5317348e9..0f858f9d6 100644 --- a/apps/cli/package.json +++ b/apps/cli/package.json @@ -1,6 +1,6 @@ { "name": "executor", - "version": "1.6.2", + "version": "1.7.0", "private": true, "bin": { "executor": "./bin/executor.ts" diff --git a/apps/cloud/CHANGELOG.md b/apps/cloud/CHANGELOG.md index 1ff2652ac..1948a3022 100644 --- a/apps/cloud/CHANGELOG.md +++ b/apps/cloud/CHANGELOG.md @@ -1,5 +1,45 @@ # @executor-js/cloud +## 1.4.64 + +### Patch Changes + +- [#1806](https://github.com/UsefulSoftwareCo/executor/pull/1806) [`93817ed`](https://github.com/UsefulSoftwareCo/executor/commit/93817ed43919934092a4706327f50f6adfd14e47) Thanks [@RhysSullivan](https://github.com/RhysSullivan)! - **Team pricing is per member with unlimited executions** + + The Team plan moves from $150 per organization with a 250,000-execution + allowance to $15 per member per month with unlimited executions. The + `members` feature is unarchived in `autumn.config.ts` and billed in arrears + on the seat count the app reports; Free keeps its 3-member, 100,000-execution + shape and Enterprise stays custom with seat usage tracked for visibility. + + Seat counts reconcile from a full WorkOS recount (active members only — + pending invites hold a seat for the plan gate but are not billed) after + member removal, invitation acceptance, organization creation, and on every + login callback, which also picks up joins the app never sees a mutation for + (SSO JIT provisioning, join by domain, dashboard edits). Plans that predate + seat pricing have no members balance and are skipped, so existing + subscriptions keep billing exactly as before on their current plan version. + + The plans page, billing page, and marketing pricing cards now show the + per-member price. + +- Updated dependencies [[`8324e1e`](https://github.com/UsefulSoftwareCo/executor/commit/8324e1eb8b03965050147309f049bdb52be6fcad), [`85b1955`](https://github.com/UsefulSoftwareCo/executor/commit/85b1955b4d24c332e637e15a025d64455e28a626)]: + - @executor-js/plugin-mcp@1.7.0 + - @executor-js/plugin-openapi@1.7.0 + - @executor-js/runtime-dynamic-worker@1.4.4 + - @executor-js/sdk@1.7.0 + - @executor-js/runtime-quickjs@1.7.0 + - @executor-js/execution@1.7.0 + - @executor-js/plugin-graphql@1.7.0 + - @executor-js/api@1.4.66 + - @executor-js/vite-plugin@0.0.63 + - @executor-js/cloudflare@0.0.45 + - @executor-js/host-mcp@1.4.4 + - @executor-js/mcp-apps-shell@1.4.14 + - @executor-js/plugin-toolkits@1.5.38 + - @executor-js/plugin-workos-vault@0.0.2 + - @executor-js/react@1.4.66 + ## 1.4.63 ### Patch Changes diff --git a/apps/cloud/package.json b/apps/cloud/package.json index 8e4ac20c9..c79814165 100644 --- a/apps/cloud/package.json +++ b/apps/cloud/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/cloud", - "version": "1.4.63", + "version": "1.4.64", "private": true, "type": "module", "scripts": { diff --git a/apps/desktop/CHANGELOG.md b/apps/desktop/CHANGELOG.md index 6984cc741..c83b351a4 100644 --- a/apps/desktop/CHANGELOG.md +++ b/apps/desktop/CHANGELOG.md @@ -1,5 +1,7 @@ # @executor-js/desktop +## 1.7.0 + ## 1.6.2 ## 1.6.1 diff --git a/apps/desktop/package.json b/apps/desktop/package.json index fe9099d39..89116aed0 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/desktop", - "version": "1.6.2", + "version": "1.7.0", "private": true, "homepage": "https://github.com/UsefulSoftwareCo/executor", "license": "MIT", diff --git a/apps/host-selfhost/CHANGELOG.md b/apps/host-selfhost/CHANGELOG.md index b60fb3586..08ee294f4 100644 --- a/apps/host-selfhost/CHANGELOG.md +++ b/apps/host-selfhost/CHANGELOG.md @@ -1,5 +1,26 @@ # @executor-js/host-selfhost +## 0.0.45 + +### Patch Changes + +- Updated dependencies [[`8324e1e`](https://github.com/UsefulSoftwareCo/executor/commit/8324e1eb8b03965050147309f049bdb52be6fcad), [`85b1955`](https://github.com/UsefulSoftwareCo/executor/commit/85b1955b4d24c332e637e15a025d64455e28a626)]: + - @executor-js/plugin-mcp@1.7.0 + - @executor-js/plugin-openapi@1.7.0 + - @executor-js/plugin-provider-service-split@0.0.17 + - @executor-js/sdk@1.7.0 + - @executor-js/runtime-quickjs@1.7.0 + - @executor-js/execution@1.7.0 + - @executor-js/plugin-graphql@1.7.0 + - @executor-js/app@1.4.4 + - @executor-js/analytics@0.1.10 + - @executor-js/api@1.4.66 + - @executor-js/host-mcp@1.4.4 + - @executor-js/mcp-apps-shell@1.4.14 + - @executor-js/plugin-encrypted-secrets@0.0.45 + - @executor-js/plugin-toolkits@1.5.38 + - @executor-js/react@1.4.66 + ## 0.0.44 ### Patch Changes diff --git a/apps/host-selfhost/package.json b/apps/host-selfhost/package.json index dfe5b05b0..31225ca7a 100644 --- a/apps/host-selfhost/package.json +++ b/apps/host-selfhost/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/host-selfhost", - "version": "0.0.44", + "version": "0.0.45", "private": true, "type": "module", "exports": { diff --git a/apps/local/CHANGELOG.md b/apps/local/CHANGELOG.md index 847556375..e162836a6 100644 --- a/apps/local/CHANGELOG.md +++ b/apps/local/CHANGELOG.md @@ -1,5 +1,38 @@ # @executor-js/local +## 1.7.0 + +### Patch Changes + +- [#1458](https://github.com/UsefulSoftwareCo/executor/pull/1458) [`1908dd6`](https://github.com/UsefulSoftwareCo/executor/commit/1908dd6d7611489362d451f7594adca542c13ba1) Thanks [@tylergibbs1](https://github.com/tylergibbs1)! - **An unsupported method probed before `initialize` no longer kills the MCP connection** + + Only `initialize` can open a session, so the streamable-HTTP transport answered every other pre-session method with HTTP 400 + `-32000 Server not initialized`. A 400 is a transport-level failure, so clients dropped the connection instead of treating it as one request failing — a client that opens with an optional probe (MCP 2026-07-28 clients lead with `server/discover`) was disconnected before it could fall back to `initialize`. Over `executor mcp`, which bridges this endpoint to stdio, that closed the client's pipe outright. + + Pre-session dispatch now answers any method other than `initialize` with `-32601 Method not found` on a normal 200, which is a per-request error, so the connection survives and the handshake proceeds. This replaces only that one answer: a POST with a bad `Accept` or `Content-Type` still gets the transport's 406 or 415, and a message that is not a valid JSON-RPC request still gets its parse error. + +- Updated dependencies [[`8324e1e`](https://github.com/UsefulSoftwareCo/executor/commit/8324e1eb8b03965050147309f049bdb52be6fcad), [`85b1955`](https://github.com/UsefulSoftwareCo/executor/commit/85b1955b4d24c332e637e15a025d64455e28a626)]: + - @executor-js/plugin-mcp@1.7.0 + - @executor-js/plugin-openapi@1.7.0 + - @executor-js/plugin-provider-service-split@0.0.17 + - @executor-js/sdk@1.7.0 + - @executor-js/runtime-quickjs@1.7.0 + - @executor-js/execution@1.7.0 + - @executor-js/config@1.7.0 + - @executor-js/plugin-file-secrets@1.7.0 + - @executor-js/plugin-graphql@1.7.0 + - @executor-js/plugin-keychain@1.7.0 + - @executor-js/plugin-onepassword@1.7.0 + - @executor-js/plugin-example@1.7.0 + - @executor-js/plugin-desktop-settings@1.7.0 + - @executor-js/app@1.4.4 + - @executor-js/analytics@0.1.10 + - @executor-js/api@1.4.66 + - @executor-js/vite-plugin@0.0.63 + - @executor-js/host-mcp@1.4.4 + - @executor-js/mcp-apps-shell@1.4.14 + - @executor-js/plugin-toolkits@1.5.38 + - @executor-js/react@1.4.66 + ## 1.6.2 ### Patch Changes diff --git a/apps/local/package.json b/apps/local/package.json index 9b9b6aeb2..933c65570 100644 --- a/apps/local/package.json +++ b/apps/local/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/local", - "version": "1.6.2", + "version": "1.7.0", "private": true, "type": "module", "exports": { diff --git a/bun.lock b/bun.lock index 19c5bb967..5b17f12d5 100644 --- a/bun.lock +++ b/bun.lock @@ -31,7 +31,7 @@ }, "apps/cli": { "name": "executor", - "version": "1.6.2", + "version": "1.7.0", "bin": { "executor": "./bin/executor.ts", }, @@ -60,7 +60,7 @@ }, "apps/cloud": { "name": "@executor-js/cloud", - "version": "1.4.63", + "version": "1.4.64", "dependencies": { "@cloudflare/vite-plugin": "^1.31.1", "@effect/atom-react": "catalog:", @@ -133,7 +133,7 @@ }, "apps/desktop": { "name": "@executor-js/desktop", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@sentry/bun": "^10.57.0", "@sentry/electron": "^7.13.0", @@ -220,7 +220,7 @@ }, "apps/host-selfhost": { "name": "@executor-js/host-selfhost", - "version": "0.0.44", + "version": "0.0.45", "dependencies": { "@better-auth/api-key": "^1.6.11", "@cloudflare/worker-bundler": "0.2.1", @@ -272,7 +272,7 @@ }, "apps/local": { "name": "@executor-js/local", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@effect/atom-react": "catalog:", "@effect/platform-node": "catalog:", @@ -352,7 +352,7 @@ }, "e2e": { "name": "@executor-js/e2e", - "version": "0.0.42", + "version": "0.0.43", "dependencies": { "@executor-js/api": "workspace:*", "@executor-js/emulate": "^0.14.1", @@ -387,7 +387,7 @@ }, "examples/all-plugins": { "name": "@executor-js/example-all-plugins", - "version": "0.0.63", + "version": "0.0.64", "dependencies": { "@executor-js/plugin-file-secrets": "workspace:*", "@executor-js/plugin-graphql": "workspace:*", @@ -406,7 +406,7 @@ }, "examples/docs-sdk-quickstart": { "name": "@executor-js/example-docs-sdk-quickstart", - "version": "0.0.48", + "version": "0.0.49", "dependencies": { "@executor-js/plugin-openapi": "workspace:*", "@executor-js/sdk": "workspace:*", @@ -463,7 +463,7 @@ }, "packages/core/analytics": { "name": "@executor-js/analytics", - "version": "0.1.9", + "version": "0.1.10", "dependencies": { "@effect/platform-node": "catalog:", "@executor-js/execution": "workspace:*", @@ -479,7 +479,7 @@ }, "packages/core/api": { "name": "@executor-js/api", - "version": "1.4.65", + "version": "1.4.66", "dependencies": { "@executor-js/execution": "workspace:*", "@executor-js/host-mcp": "workspace:*", @@ -496,7 +496,7 @@ }, "packages/core/cli": { "name": "@executor-js/cli", - "version": "0.2.52", + "version": "0.2.53", "bin": { "executor-sdk": "./dist/index.js", }, @@ -517,7 +517,7 @@ }, "packages/core/config": { "name": "@executor-js/config", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@executor-js/sdk": "workspace:*", "jiti": "^2.6.1", @@ -538,7 +538,7 @@ }, "packages/core/execution": { "name": "@executor-js/execution", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@executor-js/codemode-core": "workspace:*", "@executor-js/sdk": "workspace:*", @@ -604,7 +604,7 @@ }, "packages/core/sdk": { "name": "@executor-js/sdk", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@executor-js/fumadb": "workspace:*", "@standard-schema/spec": "^1.1.0", @@ -657,7 +657,7 @@ }, "packages/core/vite-plugin": { "name": "@executor-js/vite-plugin", - "version": "0.0.62", + "version": "0.0.63", "dependencies": { "@executor-js/sdk": "workspace:*", "jiti": "^2.6.1", @@ -677,7 +677,7 @@ }, "packages/hosts/cloudflare": { "name": "@executor-js/cloudflare", - "version": "0.0.44", + "version": "0.0.45", "dependencies": { "@executor-js/api": "workspace:*", "@executor-js/execution": "workspace:*", @@ -718,7 +718,7 @@ }, "packages/hosts/mcp-apps-shell": { "name": "@executor-js/mcp-apps-shell", - "version": "1.4.13", + "version": "1.4.14", "dependencies": { "@executor-js/react": "workspace:*", "@executor-js/runtime-quickjs": "workspace:*", @@ -756,7 +756,7 @@ }, "packages/kernel/core": { "name": "@executor-js/codemode-core", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@babel/parser": "^7.29.2", "@standard-schema/spec": "^1.0.0", @@ -829,7 +829,7 @@ }, "packages/kernel/runtime-quickjs": { "name": "@executor-js/runtime-quickjs", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@executor-js/codemode-core": "workspace:*", "quickjs-emscripten": "catalog:", @@ -849,7 +849,7 @@ }, "packages/kernel/runtime-workerd-subprocess": { "name": "@executor-js/runtime-workerd-subprocess", - "version": "0.0.17", + "version": "0.0.18", "dependencies": { "@executor-js/codemode-core": "workspace:*", "effect": "catalog:", @@ -864,7 +864,7 @@ }, "packages/plugins/desktop-settings": { "name": "@executor-js/plugin-desktop-settings", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@executor-js/sdk": "workspace:*", "react": "catalog:", @@ -877,7 +877,7 @@ }, "packages/plugins/encrypted-secrets": { "name": "@executor-js/plugin-encrypted-secrets", - "version": "0.0.44", + "version": "0.0.45", "dependencies": { "@executor-js/sdk": "workspace:*", "effect": "catalog:", @@ -892,7 +892,7 @@ }, "packages/plugins/example": { "name": "@executor-js/plugin-example", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@executor-js/sdk": "workspace:*", }, @@ -915,7 +915,7 @@ }, "packages/plugins/file-secrets": { "name": "@executor-js/plugin-file-secrets", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@executor-js/sdk": "workspace:*", }, @@ -932,7 +932,7 @@ }, "packages/plugins/graphql": { "name": "@executor-js/plugin-graphql", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@effect/platform-node": "catalog:", "@executor-js/config": "workspace:*", @@ -971,7 +971,7 @@ }, "packages/plugins/keychain": { "name": "@executor-js/plugin-keychain", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@executor-js/sdk": "workspace:*", "@napi-rs/keyring": "^1.2.0", @@ -990,7 +990,7 @@ }, "packages/plugins/mcp": { "name": "@executor-js/plugin-mcp", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@cfworker/json-schema": "^4.1.1", "@effect/platform-node": "catalog:", @@ -1033,7 +1033,7 @@ }, "packages/plugins/onepassword": { "name": "@executor-js/plugin-onepassword", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@1password/op-js": "^0.1.13", "@1password/sdk": "^0.4.1-beta.1", @@ -1067,7 +1067,7 @@ }, "packages/plugins/openapi": { "name": "@executor-js/plugin-openapi", - "version": "1.6.2", + "version": "1.7.0", "dependencies": { "@effect/platform-node": "catalog:", "@executor-js/config": "workspace:*", @@ -1108,7 +1108,7 @@ }, "packages/plugins/provider-service-split": { "name": "@executor-js/plugin-provider-service-split", - "version": "0.0.16", + "version": "0.0.17", "dependencies": { "@executor-js/plugin-openapi": "workspace:*", "@executor-js/sdk": "workspace:*", @@ -1125,7 +1125,7 @@ }, "packages/plugins/toolkits": { "name": "@executor-js/plugin-toolkits", - "version": "1.5.37", + "version": "1.5.38", "dependencies": { "@executor-js/sdk": "workspace:*", }, @@ -1194,7 +1194,7 @@ }, "packages/react": { "name": "@executor-js/react", - "version": "1.4.65", + "version": "1.4.66", "dependencies": { "@base-ui/react": "^1.3.0", "@effect/atom-react": "catalog:", diff --git a/e2e/CHANGELOG.md b/e2e/CHANGELOG.md index 4779d631d..32015998e 100644 --- a/e2e/CHANGELOG.md +++ b/e2e/CHANGELOG.md @@ -1,5 +1,17 @@ # @executor-js/e2e +## 0.0.43 + +### Patch Changes + +- Updated dependencies [[`8324e1e`](https://github.com/UsefulSoftwareCo/executor/commit/8324e1eb8b03965050147309f049bdb52be6fcad), [`85b1955`](https://github.com/UsefulSoftwareCo/executor/commit/85b1955b4d24c332e637e15a025d64455e28a626)]: + - @executor-js/plugin-mcp@1.7.0 + - @executor-js/plugin-openapi@1.7.0 + - @executor-js/sdk@1.7.0 + - @executor-js/plugin-graphql@1.7.0 + - @executor-js/api@1.4.66 + - @executor-js/plugin-toolkits@1.5.38 + ## 0.0.42 ### Patch Changes diff --git a/e2e/package.json b/e2e/package.json index a41bbe978..9d46a8243 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/e2e", - "version": "0.0.42", + "version": "0.0.43", "private": true, "type": "module", "scripts": { diff --git a/examples/all-plugins/CHANGELOG.md b/examples/all-plugins/CHANGELOG.md index 4d01cbe5b..9b498efc2 100644 --- a/examples/all-plugins/CHANGELOG.md +++ b/examples/all-plugins/CHANGELOG.md @@ -1,5 +1,19 @@ # @executor-js/example-all-plugins +## 0.0.64 + +### Patch Changes + +- Updated dependencies [[`8324e1e`](https://github.com/UsefulSoftwareCo/executor/commit/8324e1eb8b03965050147309f049bdb52be6fcad), [`85b1955`](https://github.com/UsefulSoftwareCo/executor/commit/85b1955b4d24c332e637e15a025d64455e28a626)]: + - @executor-js/plugin-mcp@1.7.0 + - @executor-js/plugin-openapi@1.7.0 + - @executor-js/sdk@1.7.0 + - @executor-js/plugin-file-secrets@1.7.0 + - @executor-js/plugin-graphql@1.7.0 + - @executor-js/plugin-keychain@1.7.0 + - @executor-js/plugin-onepassword@1.7.0 + - @executor-js/plugin-workos-vault@0.0.2 + ## 0.0.63 ### Patch Changes diff --git a/examples/all-plugins/package.json b/examples/all-plugins/package.json index 4f8fe598e..fa634cb7b 100644 --- a/examples/all-plugins/package.json +++ b/examples/all-plugins/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/example-all-plugins", - "version": "0.0.63", + "version": "0.0.64", "private": true, "type": "module", "scripts": { diff --git a/examples/docs-sdk-quickstart/CHANGELOG.md b/examples/docs-sdk-quickstart/CHANGELOG.md index 0e8aec9f2..2dda437d5 100644 --- a/examples/docs-sdk-quickstart/CHANGELOG.md +++ b/examples/docs-sdk-quickstart/CHANGELOG.md @@ -1,5 +1,13 @@ # @executor-js/example-docs-sdk-quickstart +## 0.0.49 + +### Patch Changes + +- Updated dependencies [[`85b1955`](https://github.com/UsefulSoftwareCo/executor/commit/85b1955b4d24c332e637e15a025d64455e28a626)]: + - @executor-js/plugin-openapi@1.7.0 + - @executor-js/sdk@1.7.0 + ## 0.0.48 ### Patch Changes diff --git a/examples/docs-sdk-quickstart/package.json b/examples/docs-sdk-quickstart/package.json index 71cd9ccd5..2e06c4767 100644 --- a/examples/docs-sdk-quickstart/package.json +++ b/examples/docs-sdk-quickstart/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/example-docs-sdk-quickstart", - "version": "0.0.48", + "version": "0.0.49", "private": true, "type": "module", "scripts": { diff --git a/packages/core/analytics/CHANGELOG.md b/packages/core/analytics/CHANGELOG.md index 4a2cd217f..51af460b1 100644 --- a/packages/core/analytics/CHANGELOG.md +++ b/packages/core/analytics/CHANGELOG.md @@ -1,5 +1,12 @@ # @executor-js/analytics +## 0.1.10 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/execution@1.7.0 + ## 0.1.9 ### Patch Changes diff --git a/packages/core/analytics/package.json b/packages/core/analytics/package.json index e66096fe9..c2d378ed9 100644 --- a/packages/core/analytics/package.json +++ b/packages/core/analytics/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/analytics", - "version": "0.1.9", + "version": "0.1.10", "private": true, "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/core/analytics", "bugs": { diff --git a/packages/core/api/CHANGELOG.md b/packages/core/api/CHANGELOG.md index 2fe6976d9..a8fe7dddb 100644 --- a/packages/core/api/CHANGELOG.md +++ b/packages/core/api/CHANGELOG.md @@ -1,5 +1,14 @@ # @executor-js/api +## 1.4.66 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + - @executor-js/execution@1.7.0 + - @executor-js/host-mcp@1.4.4 + ## 1.4.65 ### Patch Changes diff --git a/packages/core/api/package.json b/packages/core/api/package.json index a85e340d1..bf7aec705 100644 --- a/packages/core/api/package.json +++ b/packages/core/api/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/api", - "version": "1.4.65", + "version": "1.4.66", "private": true, "type": "module", "exports": { diff --git a/packages/core/cli/CHANGELOG.md b/packages/core/cli/CHANGELOG.md index 06b9e2901..55d52784f 100644 --- a/packages/core/cli/CHANGELOG.md +++ b/packages/core/cli/CHANGELOG.md @@ -1,5 +1,12 @@ # @executor-js/cli +## 0.2.53 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + ## 0.2.52 ### Patch Changes diff --git a/packages/core/cli/package.json b/packages/core/cli/package.json index 483fa5490..5134b80d2 100644 --- a/packages/core/cli/package.json +++ b/packages/core/cli/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/cli", - "version": "0.2.52", + "version": "0.2.53", "description": "CLI for the executor SDK — schema generation, migrations", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/core/cli", "bugs": { diff --git a/packages/core/config/CHANGELOG.md b/packages/core/config/CHANGELOG.md index 109bcfeb5..07198e264 100644 --- a/packages/core/config/CHANGELOG.md +++ b/packages/core/config/CHANGELOG.md @@ -1,5 +1,12 @@ # @executor-js/config +## 1.7.0 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + ## 1.6.2 ### Patch Changes diff --git a/packages/core/config/package.json b/packages/core/config/package.json index ed76b4be6..881859cd0 100644 --- a/packages/core/config/package.json +++ b/packages/core/config/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/config", - "version": "1.6.2", + "version": "1.7.0", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/core/config", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/core/execution/CHANGELOG.md b/packages/core/execution/CHANGELOG.md index 3740220d1..d7aa53af9 100644 --- a/packages/core/execution/CHANGELOG.md +++ b/packages/core/execution/CHANGELOG.md @@ -1,5 +1,13 @@ # @executor-js/execution +## 1.7.0 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + - @executor-js/codemode-core@1.7.0 + ## 1.6.2 ### Patch Changes diff --git a/packages/core/execution/package.json b/packages/core/execution/package.json index 355724706..9f76c7ce2 100644 --- a/packages/core/execution/package.json +++ b/packages/core/execution/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/execution", - "version": "1.6.2", + "version": "1.7.0", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/core/execution", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/core/sdk/CHANGELOG.md b/packages/core/sdk/CHANGELOG.md index e8b9c6131..f6f874e26 100644 --- a/packages/core/sdk/CHANGELOG.md +++ b/packages/core/sdk/CHANGELOG.md @@ -1,5 +1,7 @@ # @executor-js/sdk +## 1.7.0 + ## 1.6.2 ## 1.6.1 diff --git a/packages/core/sdk/package.json b/packages/core/sdk/package.json index 071589392..f523c8e70 100644 --- a/packages/core/sdk/package.json +++ b/packages/core/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/sdk", - "version": "1.6.2", + "version": "1.7.0", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/core/sdk", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/core/vite-plugin/CHANGELOG.md b/packages/core/vite-plugin/CHANGELOG.md index eebb6919b..187aa4369 100644 --- a/packages/core/vite-plugin/CHANGELOG.md +++ b/packages/core/vite-plugin/CHANGELOG.md @@ -1,5 +1,12 @@ # @executor-js/vite-plugin +## 0.0.63 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + ## 0.0.62 ### Patch Changes diff --git a/packages/core/vite-plugin/package.json b/packages/core/vite-plugin/package.json index cf9a1e3da..227eebf29 100644 --- a/packages/core/vite-plugin/package.json +++ b/packages/core/vite-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/vite-plugin", - "version": "0.0.62", + "version": "0.0.63", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/core/vite-plugin", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/hosts/cloudflare/CHANGELOG.md b/packages/hosts/cloudflare/CHANGELOG.md index ca8465206..0d426344c 100644 --- a/packages/hosts/cloudflare/CHANGELOG.md +++ b/packages/hosts/cloudflare/CHANGELOG.md @@ -1,5 +1,15 @@ # @executor-js/cloudflare +## 0.0.45 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + - @executor-js/execution@1.7.0 + - @executor-js/api@1.4.66 + - @executor-js/host-mcp@1.4.4 + ## 0.0.44 ### Patch Changes diff --git a/packages/hosts/cloudflare/package.json b/packages/hosts/cloudflare/package.json index f89f9b37d..3058487e6 100644 --- a/packages/hosts/cloudflare/package.json +++ b/packages/hosts/cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/cloudflare", - "version": "0.0.44", + "version": "0.0.45", "private": true, "type": "module", "exports": { diff --git a/packages/hosts/mcp-apps-shell/CHANGELOG.md b/packages/hosts/mcp-apps-shell/CHANGELOG.md index 7541d4261..ee141d3dc 100644 --- a/packages/hosts/mcp-apps-shell/CHANGELOG.md +++ b/packages/hosts/mcp-apps-shell/CHANGELOG.md @@ -1,5 +1,13 @@ # @executor-js/mcp-apps-shell +## 1.4.14 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/runtime-quickjs@1.7.0 + - @executor-js/react@1.4.66 + ## 1.4.13 ### Patch Changes diff --git a/packages/hosts/mcp-apps-shell/package.json b/packages/hosts/mcp-apps-shell/package.json index 9e5bf4dda..7ce9f7480 100644 --- a/packages/hosts/mcp-apps-shell/package.json +++ b/packages/hosts/mcp-apps-shell/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/mcp-apps-shell", - "version": "1.4.13", + "version": "1.4.14", "private": true, "type": "module", "exports": { diff --git a/packages/kernel/core/CHANGELOG.md b/packages/kernel/core/CHANGELOG.md index 14c9411fa..c199de52e 100644 --- a/packages/kernel/core/CHANGELOG.md +++ b/packages/kernel/core/CHANGELOG.md @@ -1,5 +1,7 @@ # @executor-js/codemode-core +## 1.7.0 + ## 1.6.2 ## 1.6.1 diff --git a/packages/kernel/core/package.json b/packages/kernel/core/package.json index 8046ed313..aace57ea6 100644 --- a/packages/kernel/core/package.json +++ b/packages/kernel/core/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/codemode-core", - "version": "1.6.2", + "version": "1.7.0", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/kernel/core", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/kernel/runtime-quickjs/CHANGELOG.md b/packages/kernel/runtime-quickjs/CHANGELOG.md index 9522d3060..593b94e19 100644 --- a/packages/kernel/runtime-quickjs/CHANGELOG.md +++ b/packages/kernel/runtime-quickjs/CHANGELOG.md @@ -1,5 +1,12 @@ # @executor-js/runtime-quickjs +## 1.7.0 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/codemode-core@1.7.0 + ## 1.6.2 ### Patch Changes diff --git a/packages/kernel/runtime-quickjs/package.json b/packages/kernel/runtime-quickjs/package.json index e75daf3ce..4ed44e488 100644 --- a/packages/kernel/runtime-quickjs/package.json +++ b/packages/kernel/runtime-quickjs/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/runtime-quickjs", - "version": "1.6.2", + "version": "1.7.0", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/kernel/runtime-quickjs", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/kernel/runtime-workerd-subprocess/CHANGELOG.md b/packages/kernel/runtime-workerd-subprocess/CHANGELOG.md index 601cd264c..89a92f530 100644 --- a/packages/kernel/runtime-workerd-subprocess/CHANGELOG.md +++ b/packages/kernel/runtime-workerd-subprocess/CHANGELOG.md @@ -1,5 +1,12 @@ # @executor-js/runtime-workerd-subprocess +## 0.0.18 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/codemode-core@1.7.0 + ## 0.0.17 ### Patch Changes diff --git a/packages/kernel/runtime-workerd-subprocess/package.json b/packages/kernel/runtime-workerd-subprocess/package.json index b556657c6..109d1d09e 100644 --- a/packages/kernel/runtime-workerd-subprocess/package.json +++ b/packages/kernel/runtime-workerd-subprocess/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/runtime-workerd-subprocess", - "version": "0.0.17", + "version": "0.0.18", "private": true, "type": "module", "exports": { diff --git a/packages/plugins/desktop-settings/CHANGELOG.md b/packages/plugins/desktop-settings/CHANGELOG.md index bf7e37065..376a27efb 100644 --- a/packages/plugins/desktop-settings/CHANGELOG.md +++ b/packages/plugins/desktop-settings/CHANGELOG.md @@ -1,5 +1,12 @@ # @executor-js/plugin-desktop-settings +## 1.7.0 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + ## 1.6.2 ### Patch Changes diff --git a/packages/plugins/desktop-settings/package.json b/packages/plugins/desktop-settings/package.json index 836e6e786..f11471243 100644 --- a/packages/plugins/desktop-settings/package.json +++ b/packages/plugins/desktop-settings/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/plugin-desktop-settings", - "version": "1.6.2", + "version": "1.7.0", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/plugins/desktop-settings", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/plugins/encrypted-secrets/CHANGELOG.md b/packages/plugins/encrypted-secrets/CHANGELOG.md index 7d931fd4b..bb70f60f0 100644 --- a/packages/plugins/encrypted-secrets/CHANGELOG.md +++ b/packages/plugins/encrypted-secrets/CHANGELOG.md @@ -1,5 +1,12 @@ # @executor-js/plugin-encrypted-secrets +## 0.0.45 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + ## 0.0.44 ### Patch Changes diff --git a/packages/plugins/encrypted-secrets/package.json b/packages/plugins/encrypted-secrets/package.json index e544c4efc..bd9a362fd 100644 --- a/packages/plugins/encrypted-secrets/package.json +++ b/packages/plugins/encrypted-secrets/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/plugin-encrypted-secrets", - "version": "0.0.44", + "version": "0.0.45", "private": true, "type": "module", "exports": { diff --git a/packages/plugins/example/CHANGELOG.md b/packages/plugins/example/CHANGELOG.md index 3b4d796d7..9f127426c 100644 --- a/packages/plugins/example/CHANGELOG.md +++ b/packages/plugins/example/CHANGELOG.md @@ -1,5 +1,12 @@ # @executor-js/plugin-example +## 1.7.0 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + ## 1.6.2 ### Patch Changes diff --git a/packages/plugins/example/package.json b/packages/plugins/example/package.json index b6bfde144..cf6626725 100644 --- a/packages/plugins/example/package.json +++ b/packages/plugins/example/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/plugin-example", - "version": "1.6.2", + "version": "1.7.0", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/plugins/example", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/plugins/file-secrets/CHANGELOG.md b/packages/plugins/file-secrets/CHANGELOG.md index ca281ff49..1cc6db6e0 100644 --- a/packages/plugins/file-secrets/CHANGELOG.md +++ b/packages/plugins/file-secrets/CHANGELOG.md @@ -1,5 +1,12 @@ # @executor-js/plugin-file-secrets +## 1.7.0 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + ## 1.6.2 ### Patch Changes diff --git a/packages/plugins/file-secrets/package.json b/packages/plugins/file-secrets/package.json index 8e56bccdc..f83bb5ef4 100644 --- a/packages/plugins/file-secrets/package.json +++ b/packages/plugins/file-secrets/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/plugin-file-secrets", - "version": "1.6.2", + "version": "1.7.0", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/plugins/file-secrets", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/plugins/graphql/CHANGELOG.md b/packages/plugins/graphql/CHANGELOG.md index 34ad2b11a..b4738e62b 100644 --- a/packages/plugins/graphql/CHANGELOG.md +++ b/packages/plugins/graphql/CHANGELOG.md @@ -1,5 +1,15 @@ # @executor-js/plugin-graphql +## 1.7.0 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + - @executor-js/config@1.7.0 + - @executor-js/api@1.4.66 + - @executor-js/react@1.4.66 + ## 1.6.2 ### Patch Changes diff --git a/packages/plugins/graphql/package.json b/packages/plugins/graphql/package.json index dd5d3932a..608495548 100644 --- a/packages/plugins/graphql/package.json +++ b/packages/plugins/graphql/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/plugin-graphql", - "version": "1.6.2", + "version": "1.7.0", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/plugins/graphql", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/plugins/keychain/CHANGELOG.md b/packages/plugins/keychain/CHANGELOG.md index 0f7b23472..a4006e31a 100644 --- a/packages/plugins/keychain/CHANGELOG.md +++ b/packages/plugins/keychain/CHANGELOG.md @@ -1,5 +1,12 @@ # @executor-js/plugin-keychain +## 1.7.0 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + ## 1.6.2 ### Patch Changes diff --git a/packages/plugins/keychain/package.json b/packages/plugins/keychain/package.json index 4de4b3bbc..7bc6e20ec 100644 --- a/packages/plugins/keychain/package.json +++ b/packages/plugins/keychain/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/plugin-keychain", - "version": "1.6.2", + "version": "1.7.0", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/plugins/keychain", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/plugins/mcp/CHANGELOG.md b/packages/plugins/mcp/CHANGELOG.md index 4fc99d087..cd5eb53f9 100644 --- a/packages/plugins/mcp/CHANGELOG.md +++ b/packages/plugins/mcp/CHANGELOG.md @@ -1,5 +1,23 @@ # @executor-js/plugin-mcp +## 1.7.0 + +### Patch Changes + +- [#1595](https://github.com/UsefulSoftwareCo/executor/pull/1595) [`8324e1e`](https://github.com/UsefulSoftwareCo/executor/commit/8324e1eb8b03965050147309f049bdb52be6fcad) Thanks [@GeiserX](https://github.com/GeiserX)! - **Stdio MCP servers no longer inherit executor's full environment** + + A stdio MCP server that declared any `env` at all was spawned with every environment variable this process holds. The MCP SDK already guards against that: it spawns with `{ ...getDefaultEnvironment(), ...serverParams.env }`, where `getDefaultEnvironment()` is a sudo-style safe-list of `HOME`, `LOGNAME`, `PATH`, `SHELL`, `TERM` and `USER`. Passing `{ ...process.env, ...config.env }` did not add to that safe-list, it overwrote it. In practice, adding one third-party `npx` server went from "this server can see the API key I gave it" to "this server also holds `EXECUTOR_SECRET_KEY`, the key that decrypts every other stored credential, plus `EXECUTOR_AUTH_TOKEN` and `DATABASE_URL`". The leak sat on the `config.env` branch — the branch a credential-bearing integration takes. + + A stdio server now receives the SDK's safe-list, the variables declared on the source config, and one short allowlist of infrastructure variables read from the host: `HTTP_PROXY`, `HTTPS_PROXY`, `NO_PROXY` (both spellings), `NODE_EXTRA_CA_CERTS`, `SSL_CERT_FILE` and `SSL_CERT_DIR`. Those carry no credential, no source config declares them, and a server behind a corporate proxy or an intercepting CA cannot reach anything without them — the same reasoning and the same list `service install` already uses when it bakes a supervised unit's minimal environment. The declared `env` wins on a key collision. On Windows that collision is resolved case-insensitively, because the OS treats `Path` and `PATH` as one variable while a JavaScript spread does not: a declared `http_proxy` now replaces an inherited `HTTP_PROXY` instead of travelling beside it, which would have left the child reading whichever spelling Windows resolved first. + + If a stdio server relied on some other variable arriving from the host, set it explicitly on the source's `env`. That is now the only way anything beyond the lists above reaches a server, and it is the mechanism that already existed for it. + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + - @executor-js/config@1.7.0 + - @executor-js/api@1.4.66 + - @executor-js/react@1.4.66 + ## 1.6.2 ### Patch Changes diff --git a/packages/plugins/mcp/package.json b/packages/plugins/mcp/package.json index 30946fae7..06d840b00 100644 --- a/packages/plugins/mcp/package.json +++ b/packages/plugins/mcp/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/plugin-mcp", - "version": "1.6.2", + "version": "1.7.0", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/plugins/mcp", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/plugins/onepassword/CHANGELOG.md b/packages/plugins/onepassword/CHANGELOG.md index 8bd974c0b..034433c76 100644 --- a/packages/plugins/onepassword/CHANGELOG.md +++ b/packages/plugins/onepassword/CHANGELOG.md @@ -1,5 +1,14 @@ # @executor-js/plugin-onepassword +## 1.7.0 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + - @executor-js/api@1.4.66 + - @executor-js/react@1.4.66 + ## 1.6.2 ### Patch Changes diff --git a/packages/plugins/onepassword/package.json b/packages/plugins/onepassword/package.json index f21ad532e..0f317eec7 100644 --- a/packages/plugins/onepassword/package.json +++ b/packages/plugins/onepassword/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/plugin-onepassword", - "version": "1.6.2", + "version": "1.7.0", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/plugins/onepassword", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/plugins/openapi/CHANGELOG.md b/packages/plugins/openapi/CHANGELOG.md index 3d62df373..7adf405b1 100644 --- a/packages/plugins/openapi/CHANGELOG.md +++ b/packages/plugins/openapi/CHANGELOG.md @@ -1,5 +1,23 @@ # @executor-js/plugin-openapi +## 1.7.0 + +### Patch Changes + +- [#1530](https://github.com/UsefulSoftwareCo/executor/pull/1530) [`85b1955`](https://github.com/UsefulSoftwareCo/executor/commit/85b1955b4d24c332e637e15a025d64455e28a626) Thanks [@BittuBarnwal7479](https://github.com/BittuBarnwal7479)! - Multipart file fields in an OpenAPI spec now accept and send real files. A `multipart/form-data` property typed as a binary or byte string is rewritten into the SDK's tool-file schema when the tool is extracted, so an agent supplies a file the same way it does everywhere else. On invocation those values are decoded back into `File`/`Blob` parts — as bare properties and inside arrays, with a per-property `encoding.contentType` applied to each file part — instead of being JSON-stringified into the form body, which is what upstreams were previously rejecting. A file whose base64 payload does not decode now fails the invocation and names the field, rather than sending the file envelope as JSON. + + The rewrite advertises only the shapes the request encoder can deliver. Two are deliberately left alone: + - A binary field nested inside an object property. Only top-level multipart properties and direct items of a top-level array property become form parts. + - A multipart body schema, or one of its properties, behind a `$ref`. Component schemas are carried through unresolved by design — the streaming compile path never materializes `components.schemas` — so a `$ref`'d file field keeps its declared binary string type. + + The rewrite reads the request schema's own `properties` map rather than walking every object key, so a `default`, `example`, or vendor extension that happens to look like a binary string schema is untouched. Descriptions, titles, and nullability on the replaced field are carried onto the file schema. + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + - @executor-js/config@1.7.0 + - @executor-js/api@1.4.66 + - @executor-js/react@1.4.66 + ## 1.6.2 ### Patch Changes diff --git a/packages/plugins/openapi/package.json b/packages/plugins/openapi/package.json index f1679774e..4942425b0 100644 --- a/packages/plugins/openapi/package.json +++ b/packages/plugins/openapi/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/plugin-openapi", - "version": "1.6.2", + "version": "1.7.0", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/plugins/openapi", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/plugins/provider-service-split/CHANGELOG.md b/packages/plugins/provider-service-split/CHANGELOG.md index 66192a63e..baf53963e 100644 --- a/packages/plugins/provider-service-split/CHANGELOG.md +++ b/packages/plugins/provider-service-split/CHANGELOG.md @@ -1,5 +1,13 @@ # @executor-js/plugin-provider-service-split +## 0.0.17 + +### Patch Changes + +- Updated dependencies [[`85b1955`](https://github.com/UsefulSoftwareCo/executor/commit/85b1955b4d24c332e637e15a025d64455e28a626)]: + - @executor-js/plugin-openapi@1.7.0 + - @executor-js/sdk@1.7.0 + ## 0.0.16 ### Patch Changes diff --git a/packages/plugins/provider-service-split/package.json b/packages/plugins/provider-service-split/package.json index 4fc4a95e2..e141fe09e 100644 --- a/packages/plugins/provider-service-split/package.json +++ b/packages/plugins/provider-service-split/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/plugin-provider-service-split", - "version": "0.0.16", + "version": "0.0.17", "private": true, "type": "module", "exports": { diff --git a/packages/plugins/toolkits/CHANGELOG.md b/packages/plugins/toolkits/CHANGELOG.md index 3b35bc00e..24b1f4c9f 100644 --- a/packages/plugins/toolkits/CHANGELOG.md +++ b/packages/plugins/toolkits/CHANGELOG.md @@ -1,5 +1,14 @@ # @executor-js/plugin-toolkits +## 1.5.38 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + - @executor-js/api@1.4.66 + - @executor-js/react@1.4.66 + ## 1.5.37 ### Patch Changes diff --git a/packages/plugins/toolkits/package.json b/packages/plugins/toolkits/package.json index ca726960a..f16cdbad5 100644 --- a/packages/plugins/toolkits/package.json +++ b/packages/plugins/toolkits/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/plugin-toolkits", - "version": "1.5.37", + "version": "1.5.38", "homepage": "https://github.com/UsefulSoftwareCo/executor/tree/main/packages/plugins/toolkits", "bugs": { "url": "https://github.com/UsefulSoftwareCo/executor/issues" diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index c58144ba5..6ed421d81 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,13 @@ # @executor-js/react +## 1.4.66 + +### Patch Changes + +- Updated dependencies []: + - @executor-js/sdk@1.7.0 + - @executor-js/api@1.4.66 + ## 1.4.65 ### Patch Changes diff --git a/packages/react/package.json b/packages/react/package.json index 8493e149b..367899988 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@executor-js/react", - "version": "1.4.65", + "version": "1.4.66", "private": true, "type": "module", "exports": {