@kodycodes/cli 1.3.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -64,10 +64,47 @@ Or run via `npx @kodycodes/cli` without a global install.
64
64
  | `kody status` | Shows CLI login state without printing secrets. |
65
65
  | `kody whoami` | Confirms the CLI MCP connection and lists tools. |
66
66
  | `kody search [query]` | Calls Kody `search` from the CLI (prefer the host MCP tool). |
67
- | `kody execute` | Calls Kody `execute` from the CLI (`--invoke`, `--code`, `--file`, or stdin via `--file -`). |
67
+ | `kody execute` | Calls Kody `execute` from the CLI (`--invoke`, `--code`, `--file`, or stdin via `--file -`). Add `--local` to run the module on this machine. |
68
68
 
69
69
  `--json` prints structured MCP results.
70
70
 
71
+ ## Local execute
72
+
73
+ `kody execute --local` runs the same execute module (default export called
74
+ with `--params`) on this machine instead of in Kody's cloud sandbox. Local CPU
75
+ is free; every `kody:runtime` call (`kody.*`, `kody.mcp.*`, `workflows`,
76
+ `packages`) is proxied to Kody's CapabilityProxy and metered like a cloud hop.
77
+
78
+ ```bash
79
+ export KODY_API_TOKEN=… # scoped token minted through the Kody `api` tool
80
+ npx @kodycodes/cli execute --local --file ./task.js --params '{"to":"me@example.com"}'
81
+ ```
82
+
83
+ - **Auth:** a scoped API token from `--token` or `KODY_API_TOKEN` (prefer the
84
+ env var so the token stays out of shell history and `ps`). No `kody login`,
85
+ and the CLI never reads MCP OAuth tokens from other hosts. The token stays in
86
+ the CLI process; the sandbox only talks to a loopback bridge.
87
+ - **Runtime:** a pinned [workerd](https://github.com/cloudflare/workerd)
88
+ release, downloaded once from GitHub, sha256-verified, and cached under
89
+ `~/.cache/kody` (Linux, or `$XDG_CACHE_HOME/kody`) or
90
+ `~/Library/Caches/kody` (macOS). Override with `KODY_CACHE_DIR`, or point
91
+ `KODY_WORKERD_PATH` at your own binary. No Docker required. Linux and macOS
92
+ (x64/arm64) only for now.
93
+ - **API:** `https://api.kody.codes` by default (`--api-url` or `KODY_API_URL`
94
+ to override). The CLI calls `GET /v1/capability-proxy/session` before
95
+ starting workerd and `POST /v1/capability-proxy/call` with
96
+ `{ path, args, conversationId? }` for each runtime call.
97
+ - **Errors:** an expired/revoked token or an account without the
98
+ `local-execute` flag fails fast with a clear message before any code runs.
99
+ The token is only sent over https (plain http is allowed for localhost).
100
+ - **Lifetime:** no execution time limit locally; Ctrl-C (or SIGTERM) stops
101
+ workerd and removes the temporary module.
102
+ - **Not yet:** static `kody:@scope/package/export` imports and `--invoke`
103
+ (use cloud execute or `packages.invoke`). `packageStorage()`,
104
+ `packageSecrets`, `email`, and `events` stay unbound like ad hoc cloud
105
+ execute. Outbound `fetch` goes straight from this machine, including to
106
+ local-network hosts.
107
+
71
108
  ## Token storage
72
109
 
73
110
  CLI credentials are stored in the OS secret store:
@@ -82,6 +119,9 @@ If the keychain is unavailable (common on headless Linux), the CLI writes a
82
119
 
83
120
  Access tokens refresh automatically on expiry or HTTP 401.
84
121
 
122
+ `execute --local` does not use stored CLI credentials; it only reads
123
+ `--token` / `KODY_API_TOKEN`.
124
+
85
125
  ## Releases
86
126
 
87
127
  This repo uses [semantic-release](https://github.com/semantic-release/semantic-release)
@@ -0,0 +1,46 @@
1
+ /**
2
+ * HTTP contract for Kody's CapabilityProxy (Open API `/v1`). Local execute
3
+ * runs user code in workerd and forwards every `kody:runtime` call here with
4
+ * a scoped API token.
5
+ *
6
+ * - `GET /v1/capability-proxy/session` validates the token before workerd
7
+ * starts. 200 → `{ scopes?: string[], expiresAt?: string }`.
8
+ * - `POST /v1/capability-proxy/call` with `{ path, args, conversationId? }`
9
+ * where `path` is the runtime property path (`['kody', 'emailSend']`,
10
+ * `['kody', 'mcp', server, tool]`, `['workflows', 'create']`) and `args`
11
+ * is the positional argument list. 200 → `{ result }`.
12
+ *
13
+ * Errors use `{ error: { code, message } }` (a bare string is accepted too).
14
+ * 401 means the token is expired/revoked; 403 `feature_disabled` means the
15
+ * `local-execute` flag is off for the account.
16
+ */
17
+ export declare const capabilityProxySessionPath = "v1/capability-proxy/session";
18
+ export declare const capabilityProxyCallPath = "v1/capability-proxy/call";
19
+ export type CapabilityProxySession = {
20
+ scopes: Array<string>;
21
+ expiresAt: string | null;
22
+ };
23
+ export type CapabilityProxyCall = {
24
+ path: Array<string>;
25
+ args: Array<unknown>;
26
+ conversationId?: string;
27
+ };
28
+ export type CapabilityProxyClientInput = {
29
+ apiUrl: string;
30
+ token: string;
31
+ fetchFn?: typeof fetch;
32
+ signal?: AbortSignal;
33
+ };
34
+ export declare class CapabilityProxyError extends Error {
35
+ readonly status: number | null;
36
+ readonly code: string | null;
37
+ constructor(message: string, options?: {
38
+ status?: number | null;
39
+ code?: string | null;
40
+ });
41
+ }
42
+ /** The bearer token must not cross the network in cleartext. */
43
+ export declare function assertTokenSafeApiUrl(apiUrl: string): void;
44
+ export declare function capabilityProxyUrl(apiUrl: string, path: string): URL;
45
+ export declare function openCapabilityProxySession(input: CapabilityProxyClientInput): Promise<CapabilityProxySession>;
46
+ export declare function callCapabilityProxy(input: CapabilityProxyClientInput & CapabilityProxyCall): Promise<unknown>;
@@ -0,0 +1,151 @@
1
+ import { apiTokenEnvVar, cliName } from './defaults.js';
2
+ import { describeNetworkError } from './network-error.js';
3
+ import { readPackageVersion } from './package-info.js';
4
+ /**
5
+ * HTTP contract for Kody's CapabilityProxy (Open API `/v1`). Local execute
6
+ * runs user code in workerd and forwards every `kody:runtime` call here with
7
+ * a scoped API token.
8
+ *
9
+ * - `GET /v1/capability-proxy/session` validates the token before workerd
10
+ * starts. 200 → `{ scopes?: string[], expiresAt?: string }`.
11
+ * - `POST /v1/capability-proxy/call` with `{ path, args, conversationId? }`
12
+ * where `path` is the runtime property path (`['kody', 'emailSend']`,
13
+ * `['kody', 'mcp', server, tool]`, `['workflows', 'create']`) and `args`
14
+ * is the positional argument list. 200 → `{ result }`.
15
+ *
16
+ * Errors use `{ error: { code, message } }` (a bare string is accepted too).
17
+ * 401 means the token is expired/revoked; 403 `feature_disabled` means the
18
+ * `local-execute` flag is off for the account.
19
+ */
20
+ export const capabilityProxySessionPath = 'v1/capability-proxy/session';
21
+ export const capabilityProxyCallPath = 'v1/capability-proxy/call';
22
+ export class CapabilityProxyError extends Error {
23
+ status;
24
+ code;
25
+ constructor(message, options = {}) {
26
+ super(message);
27
+ this.name = 'CapabilityProxyError';
28
+ this.status = options.status ?? null;
29
+ this.code = options.code ?? null;
30
+ }
31
+ }
32
+ const loopbackHosts = new Set(['localhost', '127.0.0.1', '[::1]']);
33
+ /** The bearer token must not cross the network in cleartext. */
34
+ export function assertTokenSafeApiUrl(apiUrl) {
35
+ let url;
36
+ try {
37
+ url = new URL(apiUrl);
38
+ }
39
+ catch {
40
+ throw new Error(`Invalid Kody API URL: ${apiUrl}`);
41
+ }
42
+ if (url.protocol === 'https:')
43
+ return;
44
+ if (url.protocol === 'http:' && loopbackHosts.has(url.hostname))
45
+ return;
46
+ throw new Error(`Refusing to send the API token to ${url.origin}: use https (plain http is only allowed for localhost).`);
47
+ }
48
+ export function capabilityProxyUrl(apiUrl, path) {
49
+ const base = apiUrl.endsWith('/') ? apiUrl : `${apiUrl}/`;
50
+ return new URL(path, base);
51
+ }
52
+ export async function openCapabilityProxySession(input) {
53
+ const url = capabilityProxyUrl(input.apiUrl, capabilityProxySessionPath);
54
+ const response = await send(input, url, { method: 'GET' });
55
+ const body = await readJson(response);
56
+ if (!response.ok) {
57
+ throw describeFailure(response.status, body, url, 'session');
58
+ }
59
+ const record = isRecord(body) ? body : {};
60
+ return {
61
+ scopes: Array.isArray(record.scopes)
62
+ ? record.scopes.filter((scope) => typeof scope === 'string')
63
+ : [],
64
+ expiresAt: typeof record.expiresAt === 'string' ? record.expiresAt : null,
65
+ };
66
+ }
67
+ export async function callCapabilityProxy(input) {
68
+ const url = capabilityProxyUrl(input.apiUrl, capabilityProxyCallPath);
69
+ const payload = { path: input.path, args: input.args };
70
+ if (input.conversationId !== undefined)
71
+ payload.conversationId = input.conversationId;
72
+ const response = await send(input, url, {
73
+ method: 'POST',
74
+ headers: { 'content-type': 'application/json' },
75
+ body: JSON.stringify(payload),
76
+ });
77
+ const body = await readJson(response);
78
+ if (!response.ok) {
79
+ throw describeFailure(response.status, body, url, 'call');
80
+ }
81
+ const failure = readErrorBody(body);
82
+ if (failure) {
83
+ throw new CapabilityProxyError(failure.message, { status: response.status, code: failure.code });
84
+ }
85
+ return isRecord(body) ? body.result : undefined;
86
+ }
87
+ async function send(input, url, init) {
88
+ const fetchFn = input.fetchFn ?? fetch;
89
+ try {
90
+ return await fetchFn(url, {
91
+ ...init,
92
+ signal: input.signal,
93
+ headers: {
94
+ ...init.headers,
95
+ accept: 'application/json',
96
+ authorization: `Bearer ${input.token}`,
97
+ 'user-agent': `${cliName}/${readPackageVersion()}`,
98
+ },
99
+ });
100
+ }
101
+ catch (error) {
102
+ const reason = describeNetworkError(error);
103
+ throw new CapabilityProxyError(`Could not reach the Kody API at ${url.origin} (${reason}). Check --api-url / KODY_API_URL and your network.`);
104
+ }
105
+ }
106
+ async function readJson(response) {
107
+ const text = await response.text();
108
+ if (!text)
109
+ return null;
110
+ try {
111
+ return JSON.parse(text);
112
+ }
113
+ catch {
114
+ return text;
115
+ }
116
+ }
117
+ function readErrorBody(body) {
118
+ if (!isRecord(body) || body.error == null)
119
+ return null;
120
+ const { error } = body;
121
+ if (typeof error === 'string')
122
+ return { code: null, message: error };
123
+ if (isRecord(error)) {
124
+ const code = typeof error.code === 'string' ? error.code : null;
125
+ const message = typeof error.message === 'string' ? error.message : code ?? JSON.stringify(error);
126
+ return { code, message };
127
+ }
128
+ return { code: null, message: String(error) };
129
+ }
130
+ function describeFailure(status, body, url, stage) {
131
+ const failure = readErrorBody(body);
132
+ const code = failure?.code ?? null;
133
+ const detail = failure?.message ? ` Server said: ${failure.message}` : '';
134
+ if (status === 401) {
135
+ return new CapabilityProxyError(`Kody rejected the API token (expired, revoked, or malformed). Mint a fresh scoped token and pass it with --token or ${apiTokenEnvVar}.${detail}`, { status, code });
136
+ }
137
+ if (code === 'feature_disabled') {
138
+ return new CapabilityProxyError('Local execute is not enabled for this Kody account (feature flag `local-execute`). Run execute without --local, or ask the Kody team for access.', { status, code });
139
+ }
140
+ if (status === 403 && stage === 'session') {
141
+ return new CapabilityProxyError(`The API token is not allowed to use local execute${code ? ` (${code})` : ''}. Mint a token with the local execute scope.${detail}`, { status, code });
142
+ }
143
+ if (status === 404 && stage === 'session') {
144
+ return new CapabilityProxyError(`CapabilityProxy was not found at ${url.href}. Local execute may not be deployed on this Kody API yet; check --api-url / KODY_API_URL.`, { status, code });
145
+ }
146
+ return new CapabilityProxyError(failure?.message ?? `Kody API request failed with HTTP ${status} (${url.pathname}).`, { status, code });
147
+ }
148
+ function isRecord(value) {
149
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
150
+ }
151
+ //# sourceMappingURL=capability-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capability-proxy.js","sourceRoot":"","sources":["../src/capability-proxy.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts CHANGED
@@ -1,4 +1,11 @@
1
1
  export type CommandName = 'login' | 'logout' | 'status' | 'whoami' | 'search' | 'execute' | 'install' | 'skill' | 'help' | 'version';
2
+ export declare function apiUrlFrom(values: {
3
+ apiUrl?: string;
4
+ }, env?: NodeJS.ProcessEnv): string;
5
+ /** `execute --local` authenticates only with a scoped API token, never stored CLI OAuth. */
6
+ export declare function resolveApiToken(values: {
7
+ token?: string;
8
+ }, env?: NodeJS.ProcessEnv): string;
2
9
  declare function parseKnown(args: Array<string>): {
3
10
  values: {
4
11
  [longOption: string]: string | boolean | undefined;
@@ -15,6 +22,9 @@ declare function parseKnown(args: Array<string>): {
15
22
  invoke?: string | boolean | undefined;
16
23
  params?: string | boolean | undefined;
17
24
  'conversation-id'?: string | boolean | undefined;
25
+ local?: string | boolean | undefined;
26
+ token?: string | boolean | undefined;
27
+ 'api-url'?: string | boolean | undefined;
18
28
  project?: string | boolean | undefined;
19
29
  'no-browser'?: string | boolean | undefined;
20
30
  clients?: string | boolean | undefined;
package/dist/cli.js CHANGED
@@ -1,17 +1,29 @@
1
1
  import { parseArgs } from 'node:util';
2
2
  import { readFile } from 'node:fs/promises';
3
- import { defaultMcpUrl, modernMcpProtocolVersion } from './defaults.js';
3
+ import { apiTokenEnvVar, defaultApiUrl, defaultMcpUrl, modernMcpProtocolVersion, } from './defaults.js';
4
4
  import { usage } from './help.js';
5
5
  import { ensureFreshCredentials, login } from './auth.js';
6
6
  import { deleteCredentials, loadCredentials } from './store.js';
7
7
  import { callKodyTool, formatToolResult, listKodyTools } from './mcp.js';
8
8
  import { runInstall } from './install.js';
9
+ import { runLocalExecute } from './local-execute.js';
9
10
  import { installSkill } from './skill.js';
10
11
  import { readPackageVersion } from './package-info.js';
11
12
  import { redactError } from './redact.js';
12
13
  function mcpUrlFrom(values) {
13
14
  return values.mcpUrl || process.env.KODY_MCP_URL || defaultMcpUrl;
14
15
  }
16
+ export function apiUrlFrom(values, env = process.env) {
17
+ return values.apiUrl || env.KODY_API_URL || defaultApiUrl;
18
+ }
19
+ /** `execute --local` authenticates only with a scoped API token, never stored CLI OAuth. */
20
+ export function resolveApiToken(values, env = process.env) {
21
+ const token = (values.token ?? env[apiTokenEnvVar] ?? '').trim();
22
+ if (!token) {
23
+ throw new Error(`execute --local needs a scoped Kody API token: pass --token or set ${apiTokenEnvVar}. Mint one with the Kody \`api\` tool (tokens) or the Kody API.`);
24
+ }
25
+ return token;
26
+ }
15
27
  function parseKnown(args) {
16
28
  return parseArgs({
17
29
  args,
@@ -30,6 +42,9 @@ function parseKnown(args) {
30
42
  invoke: { type: 'string' },
31
43
  params: { type: 'string' },
32
44
  'conversation-id': { type: 'string' },
45
+ local: { type: 'boolean' },
46
+ token: { type: 'string' },
47
+ 'api-url': { type: 'string' },
33
48
  project: { type: 'boolean' },
34
49
  'no-browser': { type: 'boolean' },
35
50
  clients: { type: 'string' },
@@ -73,14 +88,14 @@ export async function runCli(argv = process.argv.slice(2), io = {}) {
73
88
  write(usage);
74
89
  return 0;
75
90
  }
76
- return await dispatch(parsed, write);
91
+ return await dispatch(parsed, write, writeErr);
77
92
  }
78
93
  catch (error) {
79
94
  writeErr(`${redactError(error).message}\n`);
80
95
  return 1;
81
96
  }
82
97
  }
83
- async function dispatch(parsed, write) {
98
+ async function dispatch(parsed, write, writeErr) {
84
99
  const mcpUrl = mcpUrlFrom({
85
100
  mcpUrl: typeof parsed.values['mcp-url'] === 'string' ? parsed.values['mcp-url'] : undefined,
86
101
  });
@@ -169,6 +184,13 @@ async function dispatch(parsed, write) {
169
184
  const hasCodeFlag = typeof parsed.values.code === 'string';
170
185
  const hasFileFlag = typeof parsed.values.file === 'string';
171
186
  const positionalModule = parsed.positionals.join('\n').trim();
187
+ const local = parsed.values.local === true;
188
+ if (!local && typeof parsed.values.token === 'string') {
189
+ throw new Error('--token is only used with execute --local; cloud execute uses `kody login`.');
190
+ }
191
+ if (local && invoke !== undefined) {
192
+ throw new Error('--invoke runs a saved package export in Kody; --local runs a module you provide (--code, --file, or a module string).');
193
+ }
172
194
  if (executeSourcesConflict({ invoke, hasCodeFlag, hasFileFlag, positionalModule })) {
173
195
  throw new Error('--invoke cannot be combined with --code, --file, or a module string.');
174
196
  }
@@ -189,7 +211,22 @@ async function dispatch(parsed, write) {
189
211
  ? parsed.values['conversation-id']
190
212
  : undefined,
191
213
  });
192
- const result = await callKodyTool({ name: 'execute', args, mcpUrl });
214
+ const result = local
215
+ ? await runLocalExecute({
216
+ code: args.code,
217
+ params: args.params,
218
+ conversationId: args.conversationId,
219
+ token: resolveApiToken({
220
+ token: typeof parsed.values.token === 'string' ? parsed.values.token : undefined,
221
+ }),
222
+ apiUrl: apiUrlFrom({
223
+ apiUrl: typeof parsed.values['api-url'] === 'string'
224
+ ? parsed.values['api-url']
225
+ : undefined,
226
+ }),
227
+ onStatus: (message) => writeErr(`${message}\n`),
228
+ })
229
+ : await callKodyTool({ name: 'execute', args, mcpUrl });
193
230
  write(formatToolResult(result, json));
194
231
  return result.isError ? 1 : 0;
195
232
  }
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,7 @@
1
1
  export declare const defaultMcpUrl = "https://kody.codes/mcp";
2
+ /** Kody Open API origin; hosts CapabilityProxy for `execute --local`. */
3
+ export declare const defaultApiUrl = "https://api.kody.codes";
4
+ export declare const apiTokenEnvVar = "KODY_API_TOKEN";
2
5
  /** Pin to Kody's stateless `/mcp` lane. */
3
6
  export declare const modernMcpProtocolVersion = "2026-07-28";
4
7
  export declare const defaultScopes: readonly ["profile", "email"];
package/dist/defaults.js CHANGED
@@ -1,4 +1,7 @@
1
1
  export const defaultMcpUrl = 'https://kody.codes/mcp';
2
+ /** Kody Open API origin; hosts CapabilityProxy for `execute --local`. */
3
+ export const defaultApiUrl = 'https://api.kody.codes';
4
+ export const apiTokenEnvVar = 'KODY_API_TOKEN';
2
5
  /** Pin to Kody's stateless `/mcp` lane. */
3
6
  export const modernMcpProtocolVersion = '2026-07-28';
4
7
  export const defaultScopes = ['profile', 'email'];
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAA;AACrD,2CAA2C;AAC3C,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAA;AACpD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,CAAU,CAAA;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAA;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAA;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,gBAAgB,CAAA;AACvC,MAAM,CAAC,MAAM,YAAY,GAAG,iCAAiC,CAAA;AAC7D,kEAAkE;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAA;AACtC,MAAM,CAAC,MAAM,uBAAuB,GAAG,iCAAiC,CAAA;AAExE,MAAM,UAAU,oBAAoB,CAAC,MAAc;IAClD,OAAO,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,iBAAiB;IAC9D,OAAO,IAAI,GAAG,CAAC,oBAAoB,IAAI,WAAW,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAA;AAE3C,MAAM,UAAU,aAAa,CAAC,MAAc;IAC3C,OAAO,IAAI,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,IAAI,CAAA;AAC5C,CAAC"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../src/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAA;AACrD,yEAAyE;AACzE,MAAM,CAAC,MAAM,aAAa,GAAG,wBAAwB,CAAA;AACrD,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAA;AAC9C,2CAA2C;AAC3C,MAAM,CAAC,MAAM,wBAAwB,GAAG,YAAY,CAAA;AACpD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,OAAO,CAAU,CAAA;AAC1D,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAA;AAC1C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAA;AACvC,MAAM,CAAC,MAAM,OAAO,GAAG,gBAAgB,CAAA;AACvC,MAAM,CAAC,MAAM,YAAY,GAAG,iCAAiC,CAAA;AAC7D,kEAAkE;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAA;AACtC,MAAM,CAAC,MAAM,uBAAuB,GAAG,iCAAiC,CAAA;AAExE,MAAM,UAAU,oBAAoB,CAAC,MAAc;IAClD,OAAO,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC,IAAI,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,iBAAiB;IAC9D,OAAO,IAAI,GAAG,CAAC,oBAAoB,IAAI,WAAW,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAA;AAE3C,MAAM,UAAU,aAAa,CAAC,MAAc;IAC3C,OAAO,IAAI,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,IAAI,CAAA;AAC5C,CAAC"}
package/dist/help.js CHANGED
@@ -1,4 +1,4 @@
1
- import { defaultMcpUrl, onboardingUrl } from './defaults.js';
1
+ import { apiTokenEnvVar, defaultApiUrl, defaultMcpUrl, onboardingUrl } from './defaults.js';
2
2
  import { hostIds } from './host-catalog.js';
3
3
  import { readPackageVersion } from './package-info.js';
4
4
  export const usage = `Kody CLI ${readPackageVersion()}
@@ -12,6 +12,7 @@ Usage:
12
12
  kody whoami [--mcp-url <url>] [--json]
13
13
  kody search [query] [--entity <ref>] [--domain <id>] [--limit <n>] [--json]
14
14
  kody execute [--invoke <ref> | --code <esm> | --file <path>] [--params <json>] [--conversation-id <id>] [--json]
15
+ [--local [--token <token>] [--api-url <url>]]
15
16
  kody install [--mcp-url <url>] [--clients <ids>] [--yes] [--project] [--json]
16
17
  kody skill install [--project]
17
18
 
@@ -21,7 +22,15 @@ Usage:
21
22
 
22
23
  --clients Comma-separated ids: ${hostIds.join(', ')}
23
24
 
25
+ --local Run the execute module on this machine (workerd, Linux/macOS).
26
+ kody:runtime calls go to Kody with a scoped API token from
27
+ ${apiTokenEnvVar} (preferred) or --token; no kody login needed.
28
+
24
29
  Environment:
25
- KODY_MCP_URL Override the default MCP URL (${defaultMcpUrl})
30
+ KODY_MCP_URL Override the default MCP URL (${defaultMcpUrl})
31
+ ${apiTokenEnvVar} Scoped API token for execute --local
32
+ KODY_API_URL Override the Kody API URL for execute --local (${defaultApiUrl})
33
+ KODY_CACHE_DIR Where execute --local caches workerd (default: user cache dir)
34
+ KODY_WORKERD_PATH Use this workerd binary instead of the pinned download
26
35
  `;
27
36
  //# sourceMappingURL=help.js.map
package/dist/help.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,MAAM,CAAC,MAAM,KAAK,GAAG,YAAY,kBAAkB,EAAE;;;;;;;;;;;;;;;;QAgB7C,aAAa,CAAC,aAAa,CAAC;;oCAEA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;iDAGL,aAAa;CAC7D,CAAA"}
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAEtD,MAAM,CAAC,MAAM,KAAK,GAAG,YAAY,kBAAkB,EAAE;;;;;;;;;;;;;;;;;QAiB7C,aAAa,CAAC,aAAa,CAAC;;oCAEA,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;;eAIvC,cAAc;;;sDAGyB,aAAa;IAC/D,cAAc;uEACqD,aAAa;;;CAGnF,CAAA"}
@@ -0,0 +1,28 @@
1
+ import type { ToolCallResult } from './mcp.js';
2
+ export type LocalExecuteInput = {
3
+ code: string;
4
+ params?: unknown;
5
+ conversationId?: string;
6
+ token: string;
7
+ apiUrl: string;
8
+ /** Used for CapabilityProxy requests (session + proxied calls). */
9
+ fetchFn?: typeof fetch;
10
+ /** Skip the pinned download and run this workerd binary. */
11
+ workerdPath?: string;
12
+ onStatus?: (message: string) => void;
13
+ };
14
+ type SandboxResponse = {
15
+ result?: unknown;
16
+ error?: string;
17
+ logs?: Array<string>;
18
+ };
19
+ export declare function assertNoStaticPackageImports(code: string): void;
20
+ export declare function runLocalExecute(input: LocalExecuteInput): Promise<ToolCallResult>;
21
+ /** Same envelope as cloud execute so `formatToolResult` and `--json` behave identically. */
22
+ export declare function buildLocalExecuteResult(input: {
23
+ sandbox: SandboxResponse;
24
+ startedAt: Date;
25
+ endedAt: Date;
26
+ conversationId?: string;
27
+ }): ToolCallResult;
28
+ export {};
@@ -0,0 +1,286 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { randomBytes } from 'node:crypto';
3
+ import { rmSync } from 'node:fs';
4
+ import { mkdtemp, rm, writeFile } from 'node:fs/promises';
5
+ import { createServer, request as httpRequest, } from 'node:http';
6
+ import { tmpdir } from 'node:os';
7
+ import { join } from 'node:path';
8
+ import { setTimeout as delay } from 'node:timers/promises';
9
+ import { assertTokenSafeApiUrl, callCapabilityProxy, openCapabilityProxySession, } from './capability-proxy.js';
10
+ import { apiTokenEnvVar } from './defaults.js';
11
+ import { createLocalEntrySource, createLocalRuntimeModuleSource, createWorkerdConfig, runSecretEnvVar, runSecretHeader, } from './local-runtime-source.js';
12
+ import { redact } from './redact.js';
13
+ import { ensureWorkerdBinary } from './workerd-binary.js';
14
+ const workerdStartTimeoutMs = 30_000;
15
+ const workerdExitGraceMs = 1_000;
16
+ export function assertNoStaticPackageImports(code) {
17
+ if (/(?:\bfrom\s*|\bimport\s*\(?\s*)["']kody:@/.test(code)) {
18
+ throw new Error('execute --local does not resolve saved-package imports (kody:@…) yet. Call the export with packages.invoke(specifier, options) from kody:runtime, or run execute without --local.');
19
+ }
20
+ }
21
+ export async function runLocalExecute(input) {
22
+ assertNoStaticPackageImports(input.code);
23
+ assertTokenSafeApiUrl(input.apiUrl);
24
+ const client = { apiUrl: input.apiUrl, token: input.token, fetchFn: input.fetchFn };
25
+ await openCapabilityProxySession(client);
26
+ const workerdPath = input.workerdPath ??
27
+ (await ensureWorkerdBinary({
28
+ onDownload: (url) => input.onStatus?.(`Downloading workerd for local execute from ${url}…`),
29
+ }));
30
+ const runSecret = randomBytes(32).toString('hex');
31
+ const workDir = await mkdtemp(join(tmpdir(), 'kody-local-'));
32
+ let child;
33
+ let bridge;
34
+ // SIGTERM makes workerd drain in-flight requests, which a hung module never finishes.
35
+ const stopWorkerd = () => child?.kill('SIGKILL');
36
+ const releaseSignals = cleanupOnSignal(() => {
37
+ stopWorkerd();
38
+ rmSync(workDir, { recursive: true, force: true });
39
+ });
40
+ const startedAt = new Date();
41
+ const finish = (sandbox) => buildLocalExecuteResult({
42
+ sandbox,
43
+ startedAt,
44
+ endedAt: new Date(),
45
+ conversationId: input.conversationId,
46
+ });
47
+ try {
48
+ bridge = await startBridge({
49
+ runSecret,
50
+ forward: (call, signal) => callCapabilityProxy({
51
+ ...client,
52
+ ...call,
53
+ conversationId: input.conversationId,
54
+ signal,
55
+ }),
56
+ });
57
+ const files = { entry: 'entry.js', user: 'main.js', runtime: 'runtime.js' };
58
+ await writeFile(join(workDir, files.entry), createLocalEntrySource());
59
+ await writeFile(join(workDir, files.user), input.code);
60
+ await writeFile(join(workDir, files.runtime), createLocalRuntimeModuleSource());
61
+ const configPath = join(workDir, 'config.capnp');
62
+ await writeFile(configPath, createWorkerdConfig({ bridgePort: bridge.port, files }));
63
+ const env = { ...process.env, [runSecretEnvVar]: runSecret };
64
+ delete env[apiTokenEnvVar];
65
+ child = spawn(workerdPath, ['serve', configPath, '--control-fd=3'], {
66
+ cwd: workDir,
67
+ env,
68
+ stdio: ['ignore', 'pipe', 'pipe', 'pipe'],
69
+ });
70
+ const workerd = watchWorkerd(child);
71
+ const started = await workerd.listening;
72
+ if ('exitDetail' in started) {
73
+ return finish({ error: `Local execute could not load the module${started.exitDetail}` });
74
+ }
75
+ let response;
76
+ try {
77
+ response = await postToWorkerd({
78
+ port: started.port,
79
+ runSecret,
80
+ body: JSON.stringify({ params: input.params ?? {} }),
81
+ });
82
+ }
83
+ catch (error) {
84
+ const exitDetail = await Promise.race([workerd.exited, delay(workerdExitGraceMs, null)]);
85
+ if (exitDetail !== null)
86
+ throw new Error(`workerd exited during the run${exitDetail}`);
87
+ const reason = error instanceof Error ? error.message : String(error);
88
+ throw new Error(`Local execute run failed (${reason}).${workerd.stderr()}`);
89
+ }
90
+ if (response.status !== 200) {
91
+ throw new Error(`Local execute runtime returned HTTP ${response.status}.${workerd.stderr()}`);
92
+ }
93
+ return finish(JSON.parse(response.body));
94
+ }
95
+ finally {
96
+ releaseSignals();
97
+ stopWorkerd();
98
+ await bridge?.close();
99
+ await rm(workDir, { recursive: true, force: true });
100
+ }
101
+ }
102
+ /** Same envelope as cloud execute so `formatToolResult` and `--json` behave identically. */
103
+ export function buildLocalExecuteResult(input) {
104
+ const { sandbox } = input;
105
+ const logs = sandbox.logs ?? [];
106
+ const base = {
107
+ ...(input.conversationId !== undefined ? { conversationId: input.conversationId } : {}),
108
+ timing: {
109
+ startedAt: input.startedAt.toISOString(),
110
+ endedAt: input.endedAt.toISOString(),
111
+ durationMs: input.endedAt.getTime() - input.startedAt.getTime(),
112
+ },
113
+ };
114
+ if (typeof sandbox.error === 'string') {
115
+ return {
116
+ content: [{ type: 'text', text: `Error: ${sandbox.error}` }],
117
+ structuredContent: { ...base, returnedBytes: 0, error: sandbox.error, logs },
118
+ isError: true,
119
+ };
120
+ }
121
+ const text = typeof sandbox.result === 'string'
122
+ ? sandbox.result
123
+ : (JSON.stringify(sandbox.result, null, 2) ?? 'undefined');
124
+ const serialized = typeof sandbox.result === 'string'
125
+ ? sandbox.result
126
+ : (JSON.stringify(sandbox.result) ?? 'undefined');
127
+ return {
128
+ content: [{ type: 'text', text }],
129
+ structuredContent: {
130
+ ...base,
131
+ returnedBytes: Buffer.byteLength(serialized),
132
+ result: sandbox.result,
133
+ logs,
134
+ },
135
+ isError: false,
136
+ };
137
+ }
138
+ /**
139
+ * `finally` does not run when the CLI is killed by a signal; without this,
140
+ * workerd is orphaned and the user's module stays in the temp dir.
141
+ */
142
+ function cleanupOnSignal(cleanup) {
143
+ const signals = ['SIGINT', 'SIGTERM', 'SIGHUP'];
144
+ const release = () => {
145
+ for (const signal of signals)
146
+ process.off(signal, handler);
147
+ };
148
+ const handler = (signal) => {
149
+ release();
150
+ cleanup();
151
+ process.kill(process.pid, signal);
152
+ };
153
+ for (const signal of signals)
154
+ process.once(signal, handler);
155
+ return release;
156
+ }
157
+ function watchWorkerd(child) {
158
+ let stderrText = '';
159
+ child.stderr?.on('data', (chunk) => {
160
+ stderrText += chunk.toString('utf8');
161
+ });
162
+ child.stdout?.resume();
163
+ const stderr = () => {
164
+ const trimmed = redact(stderrText.trim());
165
+ return trimmed ? `\n${trimmed}` : '';
166
+ };
167
+ const exited = new Promise((resolve) => {
168
+ child.once('exit', (code, signal) => {
169
+ resolve(` (workerd exit ${signal ?? code})${stderr()}`);
170
+ });
171
+ });
172
+ const listening = new Promise((resolve, reject) => {
173
+ const control = child.stdio[3];
174
+ let buffered = '';
175
+ const timer = setTimeout(() => {
176
+ reject(new Error(`workerd did not start within ${workerdStartTimeoutMs / 1000}s.${stderr()}`));
177
+ }, workerdStartTimeoutMs);
178
+ control?.on('data', (chunk) => {
179
+ buffered += chunk.toString('utf8');
180
+ for (const line of buffered.split('\n')) {
181
+ const port = parseListenPort(line);
182
+ if (port !== null) {
183
+ clearTimeout(timer);
184
+ resolve({ port });
185
+ }
186
+ }
187
+ });
188
+ child.once('error', (error) => {
189
+ clearTimeout(timer);
190
+ reject(new Error(`Could not start workerd: ${error.message}`));
191
+ });
192
+ void exited.then((exitDetail) => {
193
+ clearTimeout(timer);
194
+ resolve({ exitDetail });
195
+ });
196
+ });
197
+ return { listening, exited, stderr };
198
+ }
199
+ function parseListenPort(line) {
200
+ if (!line.trim())
201
+ return null;
202
+ try {
203
+ const event = JSON.parse(line);
204
+ return event.event === 'listen' && event.socket === 'http' && typeof event.port === 'number'
205
+ ? event.port
206
+ : null;
207
+ }
208
+ catch {
209
+ return null;
210
+ }
211
+ }
212
+ /** node:http rather than fetch: local runs have no time limit, and fetch gives up after 300s. */
213
+ function postToWorkerd(input) {
214
+ return new Promise((resolve, reject) => {
215
+ const request = httpRequest({
216
+ host: '127.0.0.1',
217
+ port: input.port,
218
+ method: 'POST',
219
+ path: '/',
220
+ headers: {
221
+ 'content-type': 'application/json',
222
+ 'content-length': Buffer.byteLength(input.body),
223
+ [runSecretHeader]: input.runSecret,
224
+ },
225
+ }, (response) => {
226
+ readBody(response).then((body) => resolve({ status: response.statusCode ?? 0, body }), reject);
227
+ });
228
+ request.on('error', reject);
229
+ request.end(input.body);
230
+ });
231
+ }
232
+ async function startBridge(input) {
233
+ const inFlight = new AbortController();
234
+ const server = createServer(async (request, response) => {
235
+ const reply = (status, body) => {
236
+ response.writeHead(status, { 'content-type': 'application/json' });
237
+ response.end(JSON.stringify(body));
238
+ };
239
+ if (request.method !== 'POST' ||
240
+ request.url !== '/call' ||
241
+ request.headers[runSecretHeader] !== input.runSecret) {
242
+ reply(403, { error: 'Forbidden' });
243
+ return;
244
+ }
245
+ try {
246
+ const call = parseBridgeCall(await readBody(request));
247
+ const result = await input.forward(call, inFlight.signal);
248
+ reply(200, { result });
249
+ }
250
+ catch (error) {
251
+ reply(200, { error: redact(error instanceof Error ? error.message : String(error)) });
252
+ }
253
+ });
254
+ await new Promise((resolve, reject) => {
255
+ server.once('error', reject);
256
+ server.listen(0, '127.0.0.1', () => resolve());
257
+ });
258
+ return {
259
+ port: server.address().port,
260
+ close: () => new Promise((resolve) => {
261
+ inFlight.abort();
262
+ server.closeAllConnections();
263
+ server.close(() => resolve());
264
+ }),
265
+ };
266
+ }
267
+ function parseBridgeCall(body) {
268
+ const parsed = JSON.parse(body);
269
+ if (!Array.isArray(parsed.path) ||
270
+ parsed.path.length === 0 ||
271
+ !parsed.path.every((segment) => typeof segment === 'string')) {
272
+ throw new Error('Invalid kody:runtime call path.');
273
+ }
274
+ return {
275
+ path: parsed.path,
276
+ args: Array.isArray(parsed.args) ? parsed.args : [],
277
+ };
278
+ }
279
+ async function readBody(stream) {
280
+ const chunks = [];
281
+ for await (const chunk of stream) {
282
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
283
+ }
284
+ return Buffer.concat(chunks).toString('utf8');
285
+ }
286
+ //# sourceMappingURL=local-execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-execute.js","sourceRoot":"","sources":["../src/local-execute.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Sources for the workerd process behind `execute --local`. User code sees the
3
+ * same `kody:runtime` surface as ad hoc cloud execute; every call becomes a
4
+ * `{ path, args }` hop to the CLI's loopback bridge, which adds the API token
5
+ * and forwards it to CapabilityProxy. The token never enters workerd.
6
+ */
7
+ export declare const localExecuteCompatibilityDate = "2026-04-16";
8
+ export declare const localExecuteCompatibilityFlags: readonly ["nodejs_compat"];
9
+ export declare const localWorkerModuleNames: {
10
+ readonly entry: "__kody_local_entry.js";
11
+ readonly user: "main.js";
12
+ readonly runtime: "kody:runtime";
13
+ };
14
+ /** Header carrying the per-run secret on workerd → bridge and CLI → workerd hops. */
15
+ export declare const runSecretHeader = "x-kody-run-secret";
16
+ export declare const runSecretEnvVar = "KODY_RUN_SECRET";
17
+ export declare function createLocalRuntimeModuleSource(): string;
18
+ export declare function createLocalEntrySource(): string;
19
+ /**
20
+ * workerd text config. `files` are embedded relative to the config file.
21
+ * Outbound fetch reaches public and private networks: local execute runs as
22
+ * the user on their own machine, and reaching local services is part of why
23
+ * one would run locally.
24
+ */
25
+ export declare function createWorkerdConfig(input: {
26
+ bridgePort: number;
27
+ files: {
28
+ entry: string;
29
+ user: string;
30
+ runtime: string;
31
+ };
32
+ }): string;
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Sources for the workerd process behind `execute --local`. User code sees the
3
+ * same `kody:runtime` surface as ad hoc cloud execute; every call becomes a
4
+ * `{ path, args }` hop to the CLI's loopback bridge, which adds the API token
5
+ * and forwards it to CapabilityProxy. The token never enters workerd.
6
+ */
7
+ export const localExecuteCompatibilityDate = '2026-04-16';
8
+ export const localExecuteCompatibilityFlags = ['nodejs_compat'];
9
+ export const localWorkerModuleNames = {
10
+ entry: '__kody_local_entry.js',
11
+ user: 'main.js',
12
+ runtime: 'kody:runtime',
13
+ };
14
+ /** Header carrying the per-run secret on workerd → bridge and CLI → workerd hops. */
15
+ export const runSecretHeader = 'x-kody-run-secret';
16
+ export const runSecretEnvVar = 'KODY_RUN_SECRET';
17
+ export function createLocalRuntimeModuleSource() {
18
+ return `
19
+ let __kodyBridge = null;
20
+
21
+ export function __kodyInstallLocalBridge(bridge) {
22
+ __kodyBridge = bridge;
23
+ }
24
+
25
+ function __kodyCall(path, args) {
26
+ if (__kodyBridge === null) {
27
+ throw new Error('kody:runtime is only available while an execute --local run is in progress.');
28
+ }
29
+ return __kodyBridge(path, args);
30
+ }
31
+
32
+ function __kodyNamespace(path) {
33
+ const label = '[KodyRuntime:' + path.join('.') + ']';
34
+ return new Proxy(function () {}, {
35
+ get(_target, property) {
36
+ if (typeof property === 'symbol' || property === 'then' || property === 'toJSON') {
37
+ return undefined;
38
+ }
39
+ if (property === 'toString' || property === 'inspect') return () => label;
40
+ return __kodyNamespace([...path, property]);
41
+ },
42
+ apply(_target, _thisArg, args) {
43
+ return __kodyCall(path, args);
44
+ },
45
+ });
46
+ }
47
+
48
+ export const kody = __kodyNamespace(['kody']);
49
+
50
+ export const workflows = {
51
+ create: async (input) => await __kodyCall(['workflows', 'create'], [input ?? {}]),
52
+ };
53
+
54
+ export const packages = {
55
+ invoke: async (specifier, options) => {
56
+ if (typeof specifier !== 'string') {
57
+ throw new Error(
58
+ 'Object-only packages.invoke was removed. Use a static import (import fn from "kody:@owner/package/export") when the name is known, or import(specifier) when the name is data.',
59
+ );
60
+ }
61
+ return await __kodyCall(['packages', 'invoke'], [specifier, options ?? {}]);
62
+ },
63
+ };
64
+
65
+ export function packageStorage() {
66
+ throw new Error(
67
+ 'packageStorage() requires package provenance: this module was not bundled from a saved package and the run has no package context. ' +
68
+ 'Ad hoc execute has no scratch SQLite helper. Persist durable state from a saved package with packageStorage().',
69
+ );
70
+ }
71
+
72
+ function __kodyPackageSecretsUnavailable() {
73
+ throw new Error(
74
+ 'packageSecrets is not available in this execution context. It is bound for stamped saved-package modules and saved-package runtime contexts.',
75
+ );
76
+ }
77
+
78
+ export const packageSecrets = {
79
+ get: async () => __kodyPackageSecretsUnavailable(),
80
+ has: async () => __kodyPackageSecretsUnavailable(),
81
+ };
82
+ export const packageContext = Object.freeze({});
83
+ export const email = null;
84
+ export const events = null;
85
+ export const createAuthenticatedFetch = undefined;
86
+ export const secretHeaders = undefined;
87
+ export const oauthClientCredentials = undefined;
88
+
89
+ const __kodyRuntimeDefault = Object.freeze({
90
+ kody,
91
+ packageStorage,
92
+ createAuthenticatedFetch,
93
+ secretHeaders,
94
+ oauthClientCredentials,
95
+ packageContext,
96
+ packageSecrets,
97
+ email,
98
+ workflows,
99
+ packages,
100
+ events,
101
+ });
102
+ export default __kodyRuntimeDefault;
103
+ export const KodyRuntime = Object.freeze({ defaultValue: __kodyRuntimeDefault });
104
+ `.trimStart();
105
+ }
106
+ export function createLocalEntrySource() {
107
+ return `
108
+ import { __kodyInstallLocalBridge } from ${JSON.stringify(localWorkerModuleNames.runtime)};
109
+
110
+ const __kodyRunSecretHeader = ${JSON.stringify(runSecretHeader)};
111
+ let __kodyClaimed = false;
112
+
113
+ function __kodyFormatLogArgs(args) {
114
+ return args.map(String).join(' ');
115
+ }
116
+
117
+ export default {
118
+ async fetch(request, env) {
119
+ const secret = env.${runSecretEnvVar};
120
+ if (__kodyClaimed || !secret || request.headers.get(__kodyRunSecretHeader) !== secret) {
121
+ return new Response('Forbidden', { status: 403 });
122
+ }
123
+ __kodyClaimed = true;
124
+ const { params } = await request.json();
125
+ __kodyInstallLocalBridge(async (path, args) => {
126
+ const response = await env.KODY_BRIDGE.fetch('http://kody-bridge/call', {
127
+ method: 'POST',
128
+ headers: { 'content-type': 'application/json', [__kodyRunSecretHeader]: secret },
129
+ body: JSON.stringify({ path, args }),
130
+ });
131
+ const data = await response.json();
132
+ if (data.error) throw new Error(data.error);
133
+ return data.result;
134
+ });
135
+ const logs = [];
136
+ const nativeConsole = globalThis.console;
137
+ globalThis.console = {
138
+ ...nativeConsole,
139
+ log: (...a) => { logs.push(__kodyFormatLogArgs(a)); },
140
+ info: (...a) => { logs.push('[info] ' + __kodyFormatLogArgs(a)); },
141
+ debug: (...a) => { logs.push('[debug] ' + __kodyFormatLogArgs(a)); },
142
+ warn: (...a) => { logs.push('[warn] ' + __kodyFormatLogArgs(a)); },
143
+ error: (...a) => { logs.push('[error] ' + __kodyFormatLogArgs(a)); },
144
+ };
145
+ try {
146
+ const module = await import(${JSON.stringify(`./${localWorkerModuleNames.user}`)});
147
+ if (typeof module?.default !== 'function') {
148
+ throw new Error('Kody execute modules must default export a function.');
149
+ }
150
+ const result = await module.default(params);
151
+ return new Response(JSON.stringify({ result, logs }), {
152
+ headers: { 'content-type': 'application/json' },
153
+ });
154
+ } catch (error) {
155
+ const message = error instanceof Error ? error.message : String(error);
156
+ return Response.json({ error: message, logs });
157
+ } finally {
158
+ globalThis.console = nativeConsole;
159
+ }
160
+ },
161
+ };
162
+ `.trimStart();
163
+ }
164
+ /**
165
+ * workerd text config. `files` are embedded relative to the config file.
166
+ * Outbound fetch reaches public and private networks: local execute runs as
167
+ * the user on their own machine, and reaching local services is part of why
168
+ * one would run locally.
169
+ */
170
+ export function createWorkerdConfig(input) {
171
+ const flags = localExecuteCompatibilityFlags.map((flag) => JSON.stringify(flag)).join(', ');
172
+ return `using Workerd = import "/workerd/workerd.capnp";
173
+
174
+ const config :Workerd.Config = (
175
+ services = [
176
+ (name = "main", worker = .kodyWorker),
177
+ (name = "kody-bridge", external = (address = "127.0.0.1:${input.bridgePort}", http = ())),
178
+ (name = "internet", network = (allow = ["public", "private", "local"], tlsOptions = (trustBrowserCas = true))),
179
+ ],
180
+ sockets = [ (name = "http", address = "127.0.0.1:0", http = (), service = "main") ],
181
+ );
182
+
183
+ const kodyWorker :Workerd.Worker = (
184
+ modules = [
185
+ (name = ${JSON.stringify(localWorkerModuleNames.entry)}, esModule = embed ${JSON.stringify(input.files.entry)}),
186
+ (name = ${JSON.stringify(localWorkerModuleNames.user)}, esModule = embed ${JSON.stringify(input.files.user)}),
187
+ (name = ${JSON.stringify(localWorkerModuleNames.runtime)}, esModule = embed ${JSON.stringify(input.files.runtime)}),
188
+ ],
189
+ compatibilityDate = ${JSON.stringify(localExecuteCompatibilityDate)},
190
+ compatibilityFlags = [${flags}],
191
+ globalOutbound = "internet",
192
+ bindings = [
193
+ (name = "KODY_BRIDGE", service = "kody-bridge"),
194
+ (name = ${JSON.stringify(runSecretEnvVar)}, fromEnvironment = ${JSON.stringify(runSecretEnvVar)}),
195
+ ],
196
+ );
197
+ `;
198
+ }
199
+ //# sourceMappingURL=local-runtime-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-runtime-source.js","sourceRoot":"","sources":["../src/local-runtime-source.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,6BAA6B,GAAG,YAAY,CAAA;AACzD,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,eAAe,CAAU,CAAA;AAExE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,KAAK,EAAE,uBAAuB;IAC9B,IAAI,EAAE,SAAS;IACf,OAAO,EAAE,cAAc;CACd,CAAA;AAEV,qFAAqF;AACrF,MAAM,CAAC,MAAM,eAAe,GAAG,mBAAmB,CAAA;AAClD,MAAM,CAAC,MAAM,eAAe,GAAG,iBAAiB,CAAA;AAEhD,MAAM,UAAU,8BAA8B;IAC7C,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsFP,CAAC,SAAS,EAAE,CAAA;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB;IACrC,OAAO;2CACmC,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,OAAO,CAAC;;gCAEzD,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;;;;;;;;;uBASxC,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;iCA2BL,IAAI,CAAC,SAAS,CAAC,KAAK,sBAAsB,CAAC,IAAI,EAAE,CAAC;;;;;;;;;;;;;;;;CAgBlF,CAAC,SAAS,EAAE,CAAA;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAGnC;IACA,MAAM,KAAK,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC3F,OAAO;;;;;8DAKsD,KAAK,CAAC,UAAU;;;;;;;;cAQhE,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,KAAK,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;cACnG,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;cACjG,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAC,OAAO,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;;wBAE7F,IAAI,CAAC,SAAS,CAAC,6BAA6B,CAAC;0BAC3C,KAAK;;;;cAIjB,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,uBAAuB,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;;;CAGlG,CAAA;AACD,CAAC"}
@@ -0,0 +1,2 @@
1
+ /** `fetch failed` alone hides why; undici puts ECONNREFUSED / ENOTFOUND on `cause.code`. */
2
+ export declare function describeNetworkError(error: unknown): string;
@@ -0,0 +1,11 @@
1
+ /** `fetch failed` alone hides why; undici puts ECONNREFUSED / ENOTFOUND on `cause.code`. */
2
+ export function describeNetworkError(error) {
3
+ if (!(error instanceof Error))
4
+ return String(error);
5
+ const cause = error.cause;
6
+ const causeCode = cause && typeof cause === 'object' && 'code' in cause && typeof cause.code === 'string'
7
+ ? cause.code
8
+ : null;
9
+ return causeCode ? `${error.message}: ${causeCode}` : error.message;
10
+ }
11
+ //# sourceMappingURL=network-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"network-error.js","sourceRoot":"","sources":["../src/network-error.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,MAAM,UAAU,oBAAoB,CAAC,KAAc;IAClD,IAAI,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAA;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;IACzB,MAAM,SAAS,GACd,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;QACtF,CAAC,CAAC,KAAK,CAAC,IAAI;QACZ,CAAC,CAAC,IAAI,CAAA;IACR,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAA;AACpE,CAAC"}
@@ -0,0 +1,31 @@
1
+ /** Matches the workerd the Kody platform runs; bump together with the digests. */
2
+ export declare const workerdVersion = "1.20260815.1";
3
+ /** sha256 of each gzipped release asset on github.com/cloudflare/workerd. */
4
+ export declare const workerdAssetDigests: {
5
+ readonly 'linux-64': "05099ec6f50832fcbc327490e5a971d682c97231fb01943b61726db07677e559";
6
+ readonly 'linux-arm64': "0331597b53771170df2ab8344d9ae81d38bad4959e47152dd86592eedd9264c7";
7
+ readonly 'darwin-64': "752ec91c01dfc44d660de6e3a654879cfc1277caa7f3c5312871c608c4c2d6df";
8
+ readonly 'darwin-arm64': "c189fc08f691739c37d8784945e943e33b66cbd4e14635a061fe516dc95f2b39";
9
+ };
10
+ export type WorkerdTarget = keyof typeof workerdAssetDigests;
11
+ export declare function workerdTargetFor(platform?: NodeJS.Platform, arch?: string): WorkerdTarget;
12
+ export declare function workerdAssetUrl(target: WorkerdTarget, version?: string): string;
13
+ export declare function userCacheDir(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, home?: string): string;
14
+ export declare function cachedWorkerdPath(cacheDir: string, target: WorkerdTarget): string;
15
+ /**
16
+ * Returns a runnable workerd path: `KODY_WORKERD_PATH` when set, otherwise the
17
+ * pinned release under the user cache dir (downloaded and verified on first use).
18
+ */
19
+ export declare function ensureWorkerdBinary(input?: {
20
+ env?: NodeJS.ProcessEnv;
21
+ cacheDir?: string;
22
+ target?: WorkerdTarget;
23
+ fetchFn?: typeof fetch;
24
+ onDownload?: (url: string) => void;
25
+ }): Promise<string>;
26
+ export declare function downloadVerifiedGzip(input: {
27
+ url: string;
28
+ sha256: string;
29
+ destination: string;
30
+ fetchFn: typeof fetch;
31
+ }): Promise<void>;
@@ -0,0 +1,98 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { createReadStream, createWriteStream, existsSync } from 'node:fs';
3
+ import { chmod, mkdir, rename, rm } from 'node:fs/promises';
4
+ import { homedir } from 'node:os';
5
+ import { dirname, join } from 'node:path';
6
+ import { Readable, Transform } from 'node:stream';
7
+ import { pipeline } from 'node:stream/promises';
8
+ import { createGunzip } from 'node:zlib';
9
+ import { describeNetworkError } from './network-error.js';
10
+ /** Matches the workerd the Kody platform runs; bump together with the digests. */
11
+ export const workerdVersion = '1.20260815.1';
12
+ /** sha256 of each gzipped release asset on github.com/cloudflare/workerd. */
13
+ export const workerdAssetDigests = {
14
+ 'linux-64': '05099ec6f50832fcbc327490e5a971d682c97231fb01943b61726db07677e559',
15
+ 'linux-arm64': '0331597b53771170df2ab8344d9ae81d38bad4959e47152dd86592eedd9264c7',
16
+ 'darwin-64': '752ec91c01dfc44d660de6e3a654879cfc1277caa7f3c5312871c608c4c2d6df',
17
+ 'darwin-arm64': 'c189fc08f691739c37d8784945e943e33b66cbd4e14635a061fe516dc95f2b39',
18
+ };
19
+ export function workerdTargetFor(platform = process.platform, arch = process.arch) {
20
+ const os = platform === 'linux' ? 'linux' : platform === 'darwin' ? 'darwin' : null;
21
+ const cpu = arch === 'x64' ? '64' : arch === 'arm64' ? 'arm64' : null;
22
+ if (!os || !cpu) {
23
+ throw new Error(`execute --local supports Linux and macOS on x64 or arm64 (this machine is ${platform}-${arch}).`);
24
+ }
25
+ return `${os}-${cpu}`;
26
+ }
27
+ export function workerdAssetUrl(target, version = workerdVersion) {
28
+ return `https://github.com/cloudflare/workerd/releases/download/v${version}/workerd-${target}.gz`;
29
+ }
30
+ export function userCacheDir(env = process.env, platform = process.platform, home = homedir()) {
31
+ if (env.KODY_CACHE_DIR)
32
+ return env.KODY_CACHE_DIR;
33
+ if (platform === 'darwin')
34
+ return join(home, 'Library', 'Caches', 'kody');
35
+ return join(env.XDG_CACHE_HOME || join(home, '.cache'), 'kody');
36
+ }
37
+ export function cachedWorkerdPath(cacheDir, target) {
38
+ return join(cacheDir, 'workerd', `${workerdVersion}-${target}`, 'workerd');
39
+ }
40
+ /**
41
+ * Returns a runnable workerd path: `KODY_WORKERD_PATH` when set, otherwise the
42
+ * pinned release under the user cache dir (downloaded and verified on first use).
43
+ */
44
+ export async function ensureWorkerdBinary(input = {}) {
45
+ const env = input.env ?? process.env;
46
+ if (env.KODY_WORKERD_PATH)
47
+ return env.KODY_WORKERD_PATH;
48
+ const target = input.target ?? workerdTargetFor();
49
+ const binaryPath = cachedWorkerdPath(input.cacheDir ?? userCacheDir(env), target);
50
+ if (existsSync(binaryPath))
51
+ return binaryPath;
52
+ const url = workerdAssetUrl(target);
53
+ input.onDownload?.(url);
54
+ await downloadVerifiedGzip({
55
+ url,
56
+ sha256: workerdAssetDigests[target],
57
+ destination: binaryPath,
58
+ fetchFn: input.fetchFn ?? fetch,
59
+ });
60
+ return binaryPath;
61
+ }
62
+ export async function downloadVerifiedGzip(input) {
63
+ let response;
64
+ try {
65
+ response = await input.fetchFn(input.url);
66
+ }
67
+ catch (error) {
68
+ throw new Error(`Could not download workerd from ${input.url} (${describeNetworkError(error)}).`);
69
+ }
70
+ if (!response.ok || !response.body) {
71
+ throw new Error(`Could not download workerd from ${input.url} (HTTP ${response.status}).`);
72
+ }
73
+ await mkdir(dirname(input.destination), { recursive: true });
74
+ const gzipPath = `${input.destination}.${process.pid}.gz`;
75
+ const partialPath = `${input.destination}.${process.pid}.partial`;
76
+ const hash = createHash('sha256');
77
+ const hashing = new Transform({
78
+ transform(chunk, _encoding, callback) {
79
+ hash.update(chunk);
80
+ callback(null, chunk);
81
+ },
82
+ });
83
+ try {
84
+ await pipeline(Readable.fromWeb(response.body), hashing, createWriteStream(gzipPath));
85
+ const digest = hash.digest('hex');
86
+ if (digest !== input.sha256) {
87
+ throw new Error(`workerd download from ${input.url} failed verification (sha256 ${digest}, expected ${input.sha256}).`);
88
+ }
89
+ await pipeline(createReadStream(gzipPath), createGunzip(), createWriteStream(partialPath));
90
+ await chmod(partialPath, 0o755);
91
+ await rename(partialPath, input.destination);
92
+ }
93
+ finally {
94
+ await rm(gzipPath, { force: true });
95
+ await rm(partialPath, { force: true });
96
+ }
97
+ }
98
+ //# sourceMappingURL=workerd-binary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workerd-binary.js","sourceRoot":"","sources":["../src/workerd-binary.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kodycodes/cli",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Official Kody MCP client CLI: login, secure token storage, search, and execute.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -69,3 +69,13 @@ Never ask the user to paste tokens into chat.
69
69
 
70
70
  Override the MCP URL with `--mcp-url` or `KODY_MCP_URL` for preview or local
71
71
  servers. Default: `https://kody.codes/mcp`.
72
+
73
+ To run an execute module on this machine (Linux/macOS) instead of Kody's
74
+ cloud sandbox, add `--local` and supply a scoped API token through
75
+ `KODY_API_TOKEN` (or `--token`). `kody:runtime` calls still go to Kody; no
76
+ `kody login` is needed. Mint the token with Kody's `api` tool — never read MCP
77
+ OAuth tokens from the host.
78
+
79
+ ```bash
80
+ KODY_API_TOKEN=… npx @kodycodes/cli execute --local --file ./task.js --params '{"q":"email"}'
81
+ ```