executor 1.5.28-windows-arm64 → 1.5.28

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/README.md ADDED
@@ -0,0 +1,253 @@
1
+ # Executor
2
+
3
+ **Connect any agent to everything.**
4
+
5
+ Executor is an open-source integration layer for AI agents. Configure every
6
+ integration once (MCP servers, OpenAPI specs, GraphQL APIs) with authentication
7
+ and per-tool policies, then use that one catalog from any MCP-compatible agent.
8
+
9
+ [Website](https://executor.sh) · [Documentation](https://executor.sh/docs) · [Discord](https://discord.gg/eF29HBHwM6)
10
+
11
+ [https://github.com/user-attachments/assets/11225f83-e848-42ba-99b2-a993bcc88dad](https://github.com/user-attachments/assets/11225f83-e848-42ba-99b2-a993bcc88dad)
12
+
13
+ ## Why Executor
14
+
15
+ Every agent you use (Claude Code, Cursor, ChatGPT, and the rest) needs its own
16
+ copy of every integration: the same API keys pasted in three places, the same
17
+ MCP servers wired up again, no shared idea of what each tool is allowed to do.
18
+
19
+ Executor is the layer in between. Add a tool once, give it credentials once,
20
+ set its policy once, and every agent shares it over MCP. Your integrations,
21
+ auth, and policies live in one place instead of being scattered across each
22
+ client.
23
+
24
+ - **Any source.** First-party support for MCP servers, OpenAPI, GraphQL, and
25
+ Google Discovery. If you can describe it with a JSON schema, it can be an
26
+ integration. The plugin system is open to any source type.
27
+ - **One catalog, every agent.** Anything MCP-compatible connects to the same
28
+ set of tools.
29
+ - **Governed by policy.** Each tool is allowed, gated behind approval, or
30
+ blocked, with sensible defaults derived from the spec.
31
+ - **Run it your way.** Local CLI, a desktop app, hosted Executor Cloud, or
32
+ self-hosted on Docker or Cloudflare. Same functionality, different packaging.
33
+
34
+ ## How it works
35
+
36
+ 1. **Add an integration**: an MCP server, an OpenAPI spec, or a GraphQL API.
37
+ 2. **Create a connection**: one configured (optionally authenticated) instance
38
+ of that integration. An integration can have many connections.
39
+ 3. **Set policies**: decide whether each tool is always allowed, needs
40
+ approval, or is blocked.
41
+ 4. **Point your agents at Executor** over MCP. They all share the same catalog.
42
+
43
+ See [Concepts](https://executor.sh/docs/concepts/integrations) for the full model.
44
+
45
+ ## Quick start
46
+
47
+ The fastest path is **[Executor Cloud](https://executor.sh)**: sign in, add an
48
+ integration, and point your agents at the hosted MCP endpoint. Nothing to
49
+ install.
50
+
51
+ To run it locally instead (Node.js 20+):
52
+
53
+ ```bash
54
+ npm install -g executor # or: pnpm add -g / bun add -g / yarn global add
55
+ executor install # install the durable background service
56
+ executor web # open the web UI in your browser
57
+ ```
58
+
59
+ `executor install` keeps the service running across restarts. For a throwaway
60
+ foreground runtime, use `executor web --foreground`. From the web UI, add your
61
+ first integration and connect an agent.
62
+
63
+ ### Set up with your agent
64
+
65
+ Prefer to let your coding agent do the setup? Copy the
66
+ [setup prompt from the docs](https://executor.sh/docs) and paste it into Claude,
67
+ Cursor, or any MCP-capable agent. It will help you pick how to run Executor,
68
+ install it, connect over MCP, and get your first integration working end to end.
69
+
70
+ ## Ways to run
71
+
72
+ Every form exposes the same functionality, just packaged differently.
73
+
74
+ | Form | Best for | Docs |
75
+ | -------------------------- | ------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
76
+ | **Executor Cloud** | The fastest start. Use it from many agents (including cloud agents like ChatGPT) with nothing running locally. Free tier. | [Cloud](https://executor.sh/docs/hosted/cloud) |
77
+ | **CLI** | A headless or server environment. Runs a local background service. | [CLI](https://executor.sh/docs/local/cli) |
78
+ | **Desktop app** | A regular desktop (Mac, Windows, Linux). The same runtime, as a native app. | [Desktop](https://executor.sh/docs/local/desktop) |
79
+ | **Self-host (Docker)** | Your own infrastructure, full control. | [Docker](https://executor.sh/docs/hosted/docker) |
80
+ | **Self-host (Cloudflare)** | Deploy as a Cloudflare Worker. | [Cloudflare](https://executor.sh/docs/hosted/cloudflare) |
81
+
82
+ ## Connect an agent over MCP
83
+
84
+ Add Executor to any MCP client (Claude Code, Cursor, OpenCode) with
85
+ [`add-mcp`](https://www.npmjs.com/package/add-mcp), which detects the client and
86
+ writes its config for you:
87
+
88
+ ```bash
89
+ # Over HTTP (the running service serves a streamable-HTTP endpoint)
90
+ npx add-mcp http://127.0.0.1:4788/mcp --transport http --name executor
91
+
92
+ # Or over stdio, with the executor CLI on your PATH
93
+ npx add-mcp "executor mcp" --name executor
94
+ ```
95
+
96
+ The **Connect** card in the web UI shows the exact command (and port, if it
97
+ differs) already filled in. Most MCP clients only load servers at startup, so
98
+ you may need to restart the client or open a new chat before the Executor tools
99
+ appear.
100
+
101
+ ## Add an integration
102
+
103
+ From the web UI, click **Add Source**, paste an OpenAPI, GraphQL, or MCP URL,
104
+ and Executor detects the type, indexes the tools, and handles auth. Or add one
105
+ from the CLI:
106
+
107
+ ```bash
108
+ executor call executor openapi addSource '{
109
+ "spec": "https://petstore3.swagger.io/api/v3/openapi.json",
110
+ "namespace": "petstore",
111
+ "baseUrl": "https://petstore3.swagger.io/api/v3"
112
+ }'
113
+ ```
114
+
115
+ Use `baseUrl` when the OpenAPI document has relative `servers` entries (for
116
+ example `"/api/v3"`). Confirm it is live with `executor tools sources`.
117
+
118
+ ## Using tools
119
+
120
+ ### From the CLI
121
+
122
+ ```bash
123
+ executor tools search "send email" # find tools by intent
124
+ executor call github issues --help # browse a namespace
125
+ executor call github issues create '{"owner":"octocat","repo":"Hello-World","title":"Hi"}'
126
+ ```
127
+
128
+ `executor call`, `executor resume`, and `executor tools ...` auto-start the
129
+ local daemon if needed, and pick a free port if the default is busy. If an
130
+ execution pauses for auth or approval, resume it:
131
+
132
+ ```bash
133
+ executor resume --execution-id exec_123
134
+ ```
135
+
136
+ ### From your own code
137
+
138
+ Embed Executor with the TypeScript SDK (a Promise API; an Effect-native API is
139
+ also available):
140
+
141
+ ```ts
142
+ import { createExecutor } from "@executor-js/sdk/promise";
143
+ import { openApiPlugin } from "@executor-js/plugin-openapi/promise";
144
+
145
+ const executor = await createExecutor({ plugins: [openApiPlugin()] });
146
+
147
+ // add an integration, create a connection, then list and call tools
148
+ const tools = await executor.tools.list({ integration: "inventory" });
149
+ const schema = await executor.tools.schema(tools[0].address);
150
+
151
+ await executor.close();
152
+ ```
153
+
154
+ See [`examples/`](examples) for runnable end-to-end scripts.
155
+
156
+ ### CLI reference
157
+
158
+ ```bash
159
+ executor install # install/start the durable background service
160
+ executor web # open the running web UI
161
+ executor web --foreground # start a temporary foreground runtime + web UI
162
+ executor daemon run # start persistent local daemon in background
163
+ executor daemon status # show daemon status
164
+ executor daemon stop # stop daemon
165
+ executor daemon restart # restart daemon
166
+ executor mcp # start MCP endpoint (stdio)
167
+ executor call <path...> '{"k":"v"}' # invoke a tool by path segments
168
+ executor call <path...> --help # browse namespaces/resources/methods
169
+ executor call <path...> --help --match "<text>" --limit <n> # narrow huge namespaces
170
+ executor resume --execution-id <id> # resume paused execution
171
+ executor tools search "<query>" # search tools by intent
172
+ executor tools sources # list configured sources + tool counts
173
+ executor tools describe <path> # show tool TypeScript/JSON schema
174
+ ```
175
+
176
+ ## Project layout
177
+
178
+ Executor is a Bun + Turborepo monorepo.
179
+
180
+ ```
181
+ apps/
182
+ cli/ the `executor` CLI and local background service
183
+ desktop/ the desktop app (Mac, Windows, Linux)
184
+ local/ the local runtime shared by the CLI and desktop
185
+ cloud/ Executor Cloud (the hosted product)
186
+ host-selfhost/ self-hosted server (Docker)
187
+ host-cloudflare/ Cloudflare Worker deployment
188
+ marketing/ the executor.sh site
189
+ docs/ the docs at executor.sh/docs
190
+ packages/
191
+ core/ contracts, plugin wiring, scopes, policies, SDK, API, CLI core
192
+ kernel/ execution runtimes (QuickJS, Deno subprocess, dynamic worker)
193
+ plugins/ source and provider plugins (openapi, graphql, mcp, google,
194
+ microsoft, 1password, keychain, encrypted/file secrets, ...)
195
+ hosts/ host adapters (MCP surface, Cloudflare)
196
+ react/ shared React UI
197
+ app/ the web app UI
198
+ examples/ runnable SDK examples
199
+ e2e/ full-stack end-to-end tests
200
+ ```
201
+
202
+ ## Develop locally
203
+
204
+ ```bash
205
+ bun install
206
+ bun run bootstrap # idempotent: install deps, build required artifacts, fetch Playwright
207
+ bun run dev # start the dev servers (defaults to http://127.0.0.1:4788)
208
+ ```
209
+
210
+ `bun run bootstrap` is required in a fresh checkout: its build step produces
211
+ artifacts the dev servers fail without. See [RUNNING.md](RUNNING.md) for dev
212
+ servers, ports, and environment gotchas, and [AGENTS.md](AGENTS.md) for the
213
+ contributor contract.
214
+
215
+ ### Tests
216
+
217
+ ```bash
218
+ bun run test # unit + integration suites
219
+ bun run test:e2e # full-stack e2e: boots the cloud and self-host apps and drives them
220
+ ```
221
+
222
+ The browser e2e scenarios need Playwright's Chromium once per machine:
223
+ `bunx playwright install chromium`.
224
+
225
+ ## Community
226
+
227
+ Join the [Discord](https://discord.gg/eF29HBHwM6). To learn more, visit
228
+ [executor.sh](https://executor.sh) or [Ask DeepWiki](https://deepwiki.com/UsefulSoftwareCo/executor).
229
+
230
+ ## License
231
+
232
+ [MIT](LICENSE)
233
+
234
+ ## Attribution
235
+
236
+ - Thank you to [Crystian](https://www.linkedin.com/in/crystian/) for providing
237
+ the npm package name `executor`.
238
+
239
+ ## References
240
+
241
+ As part of my coding process, I give my agent access to references to other
242
+ codebases to understand patterns and how other people have implemented systems.
243
+ A non-exhaustive list:
244
+
245
+ - [FumaDB](https://github.com/fuma-nama/fumadb) - Storage adapter reference
246
+ - [Effect](https://github.com/Effect-TS/effect) - General code patterns
247
+ - [OpenCode](https://github.com/anomalyco/opencode) - Plugin system reference
248
+ - [OpenClaw](https://github.com/openclaw/openclaw) - Plugin system reference
249
+ - [Emdash](https://github.com/emdash-cms/emdash) - Plugin system reference
250
+ - [Pi](https://github.com/badlogic/pi-mono) - Plugin system reference
251
+
252
+ You are also encouraged to use this codebase as a reference to understand how it
253
+ is implemented.
package/bin/executor ADDED
@@ -0,0 +1,96 @@
1
+ #!/usr/bin/env node
2
+ const childProcess = require("child_process");
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+ const os = require("os");
6
+
7
+ function spawnAndExit(target) {
8
+ const child = childProcess.spawn(target, process.argv.slice(2), { stdio: "inherit" });
9
+ child.on("error", (err) => { console.error(err.message); process.exit(1); });
10
+ const forward = (signal) => { if (!child.killed) { try { child.kill(signal); } catch {} } };
11
+ ["SIGINT", "SIGTERM", "SIGHUP"].forEach((sig) => process.on(sig, () => forward(sig)));
12
+ child.on("exit", (code, signal) => {
13
+ if (signal) process.kill(process.pid, signal);
14
+ else process.exit(typeof code === "number" ? code : 0);
15
+ });
16
+ }
17
+
18
+ if (process.env.EXECUTOR_BIN_PATH) {
19
+ spawnAndExit(process.env.EXECUTOR_BIN_PATH);
20
+ return;
21
+ }
22
+
23
+ const isWin = process.platform === "win32";
24
+ const binary = isWin ? "executor.exe" : "executor";
25
+
26
+ // Package names use "windows" (not "win32") to match what the build script emits.
27
+ const platformMap = { darwin: "darwin", linux: "linux", win32: "windows" };
28
+ const archMap = { x64: "x64", arm64: "arm64" };
29
+ const platform = platformMap[os.platform()] || os.platform();
30
+ const arch = archMap[os.arch()] || os.arch();
31
+
32
+ const isMusl = (() => {
33
+ if (platform !== "linux") return false;
34
+ try { if (fs.existsSync("/etc/alpine-release")) return true; } catch {}
35
+ try {
36
+ const r = childProcess.spawnSync("ldd", ["--version"], { encoding: "utf8" });
37
+ if (((r.stdout || "") + (r.stderr || "")).toLowerCase().includes("musl")) return true;
38
+ } catch {}
39
+ return false;
40
+ })();
41
+
42
+ // Candidate package names in preference order. On linux a system might match
43
+ // glibc or musl; try musl first if detected, glibc first otherwise.
44
+ const candidates = (() => {
45
+ const base = "executor-" + platform + "-" + arch;
46
+ if (platform === "linux") {
47
+ return isMusl ? [base + "-musl", base] : [base, base + "-musl"];
48
+ }
49
+ return [base];
50
+ })();
51
+
52
+ function detectPackageManager() {
53
+ const ua = process.env.npm_config_user_agent || "";
54
+ if (/\bbun\//.test(ua)) return "bun";
55
+ const execPath = process.env.npm_execpath || "";
56
+ if (execPath.includes("bun")) return "bun";
57
+ if (__dirname.includes(".bun/install/global") || __dirname.includes(".bun\\install\\global")) {
58
+ return "bun";
59
+ }
60
+ return ua ? "npm" : null;
61
+ }
62
+
63
+ for (const name of candidates) {
64
+ try {
65
+ const pkgJson = require.resolve(name + "/package.json");
66
+ const candidate = path.join(path.dirname(pkgJson), "bin", binary);
67
+ if (fs.existsSync(candidate)) {
68
+ spawnAndExit(candidate);
69
+ return;
70
+ }
71
+ } catch {
72
+ // package not installed for this platform; try next candidate
73
+ }
74
+ }
75
+
76
+ // Preview wrapper compat: pkg.pr.new previews download the platform binary
77
+ // to bin/runtime/ rather than via optionalDependencies.
78
+ const scriptDir = path.dirname(fs.realpathSync(__filename));
79
+ const previewBinary = path.join(scriptDir, "runtime", binary);
80
+ if (fs.existsSync(previewBinary)) {
81
+ spawnAndExit(previewBinary);
82
+ return;
83
+ }
84
+
85
+ const pm = detectPackageManager();
86
+ const reinstall = pm === "bun"
87
+ ? "bun install -g executor"
88
+ : pm === "npm"
89
+ ? "npm install -g executor"
90
+ : "reinstall executor";
91
+ console.error(
92
+ "executor: could not locate a platform binary for " + os.platform() + "-" + os.arch() + ".\n" +
93
+ "Tried optionalDependencies: " + candidates.map((n) => '"' + n + '"').join(", ") + "\n" +
94
+ "To fix: " + reinstall
95
+ );
96
+ process.exit(1);
package/package.json CHANGED
@@ -1,12 +1,14 @@
1
1
  {
2
2
  "name": "executor",
3
- "version": "1.5.28-windows-arm64",
4
- "description": "Local AI executor with a CLI, local API server, and web UI. (windows-arm64)",
5
- "os": [
6
- "win32"
7
- ],
8
- "cpu": [
9
- "arm64"
3
+ "version": "1.5.28",
4
+ "description": "Local AI executor with a CLI, local API server, and web UI.",
5
+ "keywords": [
6
+ "agent",
7
+ "ai",
8
+ "automation",
9
+ "cli",
10
+ "executor",
11
+ "local-first"
10
12
  ],
11
13
  "homepage": "https://github.com/UsefulSoftwareCo/executor",
12
14
  "bugs": {
@@ -16,5 +18,21 @@
16
18
  "type": "git",
17
19
  "url": "git+https://github.com/UsefulSoftwareCo/executor.git"
18
20
  },
19
- "license": "MIT"
21
+ "license": "MIT",
22
+ "bin": {
23
+ "executor": "bin/executor"
24
+ },
25
+ "optionalDependencies": {
26
+ "executor-linux-x64": "npm:executor@1.5.28-linux-x64",
27
+ "executor-linux-arm64": "npm:executor@1.5.28-linux-arm64",
28
+ "executor-linux-x64-musl": "npm:executor@1.5.28-linux-x64-musl",
29
+ "executor-linux-arm64-musl": "npm:executor@1.5.28-linux-arm64-musl",
30
+ "executor-darwin-x64": "npm:executor@1.5.28-darwin-x64",
31
+ "executor-darwin-arm64": "npm:executor@1.5.28-darwin-arm64",
32
+ "executor-windows-x64": "npm:executor@1.5.28-windows-x64",
33
+ "executor-windows-arm64": "npm:executor@1.5.28-windows-arm64"
34
+ },
35
+ "engines": {
36
+ "node": ">=20"
37
+ }
20
38
  }
Binary file
package/bin/executor.exe DELETED
Binary file
package/bin/keyring.node DELETED
Binary file