executor 1.4.28-windows-x64 → 1.4.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 +154 -0
- package/bin/executor +96 -0
- package/package.json +26 -8
- package/bin/emscripten-module.wasm +0 -0
- package/bin/executor.exe +0 -0
- package/bin/keyring.node +0 -0
package/README.md
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# executor
|
|
2
|
+
|
|
3
|
+
[https://github.com/user-attachments/assets/11225f83-e848-42ba-99b2-a993bcc88dad](https://github.com/user-attachments/assets/11225f83-e848-42ba-99b2-a993bcc88dad)
|
|
4
|
+
|
|
5
|
+
The integration layer for AI agents. One catalog for every tool, shared across every agent you use.
|
|
6
|
+
|
|
7
|
+
[Ask DeepWiki](https://deepwiki.com/RhysSullivan/executor)
|
|
8
|
+
|
|
9
|
+
## Quick start
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npm install -g executor
|
|
13
|
+
executor web
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
This starts a local runtime with a web UI at `http://127.0.0.1:4788`. From there, add your first source and start using tools.
|
|
17
|
+
|
|
18
|
+
### Use as an MCP server
|
|
19
|
+
|
|
20
|
+
Point any MCP-compatible agent (Cursor, Claude Code, OpenCode, etc.) at Executor to share your tool catalog, auth, and policies across all of them.
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
|
|
24
|
+
executor mcp
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Example `mcp.json` for Claude Code / Cursor:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"mcpServers": {
|
|
32
|
+
"executor": {
|
|
33
|
+
"command": "executor",
|
|
34
|
+
"args": ["mcp"]
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Add a source
|
|
41
|
+
|
|
42
|
+
If you can represent it with a JSON schema, it can be an integration. Executor has first-party support for OpenAPI, GraphQL, MCP, and Google Discovery — but the plugin system is open to any source type.
|
|
43
|
+
|
|
44
|
+
### Via the web UI
|
|
45
|
+
|
|
46
|
+
Open `http://127.0.0.1:4788`, go to **Add Source**, paste a URL, and Executor will detect the type, index the tools, and handle auth.
|
|
47
|
+
|
|
48
|
+
### Via the CLI
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
executor call executor openapi addSource '{
|
|
52
|
+
"spec": "https://petstore3.swagger.io/api/v3/openapi.json",
|
|
53
|
+
"namespace": "petstore",
|
|
54
|
+
"baseUrl": "https://petstore3.swagger.io/api/v3"
|
|
55
|
+
}'
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Use `baseUrl` when the OpenAPI document has relative `servers` entries (for example `"/api/v3"`).
|
|
59
|
+
|
|
60
|
+
## Use tools
|
|
61
|
+
|
|
62
|
+
Agents discover and call tools through a typed TypeScript runtime:
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
// discover by intent
|
|
66
|
+
const matches = await tools.discover({ query: "github issues", limit: 5 });
|
|
67
|
+
|
|
68
|
+
// inspect the schema
|
|
69
|
+
const detail = await tools.describe.tool({
|
|
70
|
+
path: matches.bestPath,
|
|
71
|
+
includeSchemas: true,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// call with type safety
|
|
75
|
+
const issues = await tools.github.issues.list({
|
|
76
|
+
owner: "vercel",
|
|
77
|
+
repo: "next.js",
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Use tools via the CLI:
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
executor tools search "send email"
|
|
85
|
+
executor call --help
|
|
86
|
+
executor call github --help
|
|
87
|
+
executor call github issues --help
|
|
88
|
+
executor call cloudflare --help --match dns --limit 20
|
|
89
|
+
executor call github issues create '{"owner":"octocat","repo":"Hello-World","title":"Hi"}'
|
|
90
|
+
executor call gmail send '{"to":"alice@example.com","subject":"Hi"}'
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
`executor call`, `executor resume`, and `executor tools ...` commands auto-start a local daemon if needed.
|
|
94
|
+
If the default port is busy, the CLI will pick an available local port and track it automatically.
|
|
95
|
+
|
|
96
|
+
If an execution pauses for auth or approval, resume it:
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
executor resume --execution-id exec_123
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## CLI reference
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
executor web # start runtime + web UI
|
|
106
|
+
executor daemon run # start persistent local daemon in background
|
|
107
|
+
executor daemon status # show daemon status
|
|
108
|
+
executor daemon stop # stop daemon
|
|
109
|
+
executor daemon restart # restart daemon
|
|
110
|
+
executor mcp # start MCP endpoint
|
|
111
|
+
executor call <path...> '{"k":"v"}' # invoke a tool by path segments
|
|
112
|
+
executor call <path...> --help # browse namespaces/resources/methods
|
|
113
|
+
executor call <path...> --help --match "<text>" --limit <n> # narrow huge namespaces
|
|
114
|
+
executor resume --execution-id <id> # resume paused execution
|
|
115
|
+
executor tools search "<query>" # search tools by intent
|
|
116
|
+
executor tools sources # list configured sources + tool counts
|
|
117
|
+
executor tools describe <path> # show tool TypeScript/JSON schema
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Developing locally
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
bun install
|
|
124
|
+
bun dev
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The dev server starts at `http://127.0.0.1:4788`.
|
|
128
|
+
|
|
129
|
+
## Community
|
|
130
|
+
|
|
131
|
+
Join the Discord: [https://discord.gg/eF29HBHwM6](https://discord.gg/eF29HBHwM6)
|
|
132
|
+
|
|
133
|
+
## Learn more
|
|
134
|
+
|
|
135
|
+
Visit [executor.sh](https://executor.sh) to learn more.
|
|
136
|
+
|
|
137
|
+
## Attribution
|
|
138
|
+
|
|
139
|
+
- Thank you to [Crystian](https://www.linkedin.com/in/crystian/) for providing the npm package name `executor`.
|
|
140
|
+
|
|
141
|
+
## References
|
|
142
|
+
|
|
143
|
+
As part of my coding process, I give my agent access to references to other codebases to understand patterns and how other people have implemented systems.
|
|
144
|
+
|
|
145
|
+
A non exhaustive list of references are:
|
|
146
|
+
|
|
147
|
+
- [Better Auth](https://github.com/better-auth/better-auth) - Storage adapter reference
|
|
148
|
+
- [Effect](https://github.com/Effect-TS/effect) - General code patterns
|
|
149
|
+
- [OpenCode](https://github.com/anomalyco/opencode) - Plugin system reference
|
|
150
|
+
- [OpenClaw](https://github.com/openclaw/openclaw) - Plugin system reference
|
|
151
|
+
- [Emdash](https://github.com/emdash-cms/emdash) - Plugin system reference
|
|
152
|
+
- [Pi](https://github.com/badlogic/pi-mono) - Plugin system reference
|
|
153
|
+
|
|
154
|
+
It's encouraged also that you can use this codebase as a reference to understand how it's 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.4.28
|
|
4
|
-
"description": "Local AI executor with a CLI, local API server, and web UI.
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
"
|
|
3
|
+
"version": "1.4.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/RhysSullivan/executor",
|
|
12
14
|
"bugs": {
|
|
@@ -16,5 +18,21 @@
|
|
|
16
18
|
"type": "git",
|
|
17
19
|
"url": "git+https://github.com/RhysSullivan/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.4.28-linux-x64",
|
|
27
|
+
"executor-linux-arm64": "npm:executor@1.4.28-linux-arm64",
|
|
28
|
+
"executor-linux-x64-musl": "npm:executor@1.4.28-linux-x64-musl",
|
|
29
|
+
"executor-linux-arm64-musl": "npm:executor@1.4.28-linux-arm64-musl",
|
|
30
|
+
"executor-darwin-x64": "npm:executor@1.4.28-darwin-x64",
|
|
31
|
+
"executor-darwin-arm64": "npm:executor@1.4.28-darwin-arm64",
|
|
32
|
+
"executor-windows-x64": "npm:executor@1.4.28-windows-x64",
|
|
33
|
+
"executor-windows-arm64": "npm:executor@1.4.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
|