@kodycodes/cli 1.18.0 → 1.19.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 +33 -1
- package/dist/cli.d.ts +7 -1
- package/dist/cli.js +319 -82
- package/dist/cli.js.map +1 -1
- package/dist/dev-command.d.ts +93 -0
- package/dist/dev-command.js +369 -0
- package/dist/dev-command.js.map +1 -0
- package/dist/help.js +38 -4
- package/dist/help.js.map +1 -1
- package/dist/local-package-run.d.ts +28 -0
- package/dist/local-package-run.js +299 -0
- package/dist/local-package-run.js.map +1 -0
- package/dist/mock/mock-server.d.ts +42 -0
- package/dist/mock/mock-server.js +373 -0
- package/dist/mock/mock-server.js.map +1 -0
- package/dist/mock/mock-storage.d.ts +46 -0
- package/dist/mock/mock-storage.js +96 -0
- package/dist/mock/mock-storage.js.map +1 -0
- package/dist/mock/mock-supported.d.ts +18 -0
- package/dist/mock/mock-supported.js +43 -0
- package/dist/mock/mock-supported.js.map +1 -0
- package/dist/package-app-dev.d.ts +43 -0
- package/dist/package-app-dev.js +356 -0
- package/dist/package-app-dev.js.map +1 -0
- package/dist/package-local-runtime-source.d.ts +35 -0
- package/dist/package-local-runtime-source.js +317 -0
- package/dist/package-local-runtime-source.js.map +1 -0
- package/dist/package-manifest.d.ts +43 -0
- package/dist/package-manifest.js +264 -0
- package/dist/package-manifest.js.map +1 -0
- package/dist/structured-error.d.ts +28 -0
- package/dist/structured-error.js +57 -0
- package/dist/structured-error.js.map +1 -0
- package/dist/target.d.ts +25 -0
- package/dist/target.js +45 -0
- package/dist/target.js.map +1 -0
- package/package.json +1 -1
package/dist/help.js
CHANGED
|
@@ -45,10 +45,16 @@ Usage:
|
|
|
45
45
|
kody auth remove-git [--mcp-url <url>] [--api-url <url>]
|
|
46
46
|
kody git-credential <get|store|erase>
|
|
47
47
|
kody whoami [--org <slug>] [--mcp-url <url>] [--token <token>] [--api-url <url>] [--json]
|
|
48
|
-
kody search [query] [--org <slug>] [--entity <ref>] [--domain <id>] [--limit <n>] [--token <token>] [--api-url <url>] [--json]
|
|
48
|
+
kody search [query] [--org <slug>] [--entity <ref>] [--domain <id>] [--limit <n>] [--target prod|mock] [--token <token>] [--api-url <url>] [--json]
|
|
49
49
|
kody api <operationId> [--org <slug>] [--params <json>] [--token <token>] [--api-url <url>] [--json]
|
|
50
50
|
kody execute [--org <slug>] [--invoke <ref> | --code <esm> | --file <path>] [--params <json>] [--conversation-id <id>] [--json]
|
|
51
|
-
[--credential <key=name>]… [--token <token>] [--api-url <url>] [--local] [--allow-private-network]
|
|
51
|
+
[--credential <key=name>]… [--target prod|mock] [--token <token>] [--api-url <url>] [--local] [--allow-private-network]
|
|
52
|
+
kody dev [serve] [--org <slug>] [--target prod|mock] [--reset-storage] [--port <n>] [--app-base-path <path>] [--allow-private-network]
|
|
53
|
+
kody dev fetch <path> [--method <verb>] [--body <file>] [--target prod|mock] [--json]
|
|
54
|
+
kody dev job <name> [--target prod|mock] [--json]
|
|
55
|
+
kody dev webhook <name> --body <file.json> [--target prod|mock] [--json]
|
|
56
|
+
kody dev emit <event> --body <event.json> [--target prod|mock] [--json]
|
|
57
|
+
kody dev check [--target prod|mock] [--json]
|
|
52
58
|
kody install [--mcp-url <url>] [--clients <ids>] [--yes] [--project] [--json]
|
|
53
59
|
kody skill install [--project]
|
|
54
60
|
|
|
@@ -200,14 +206,42 @@ ${orgBlock}
|
|
|
200
206
|
rejects the flag — use \`--local\` or MCP.
|
|
201
207
|
|
|
202
208
|
--allow-private-network
|
|
203
|
-
Allow execute --local code to fetch private and
|
|
204
|
-
addresses. Default is public-only
|
|
209
|
+
Allow execute --local / \`kody dev\` code to fetch private and
|
|
210
|
+
local network addresses. Default is public-only.
|
|
211
|
+
|
|
212
|
+
--target prod|mock
|
|
213
|
+
Where server-side calls go (storage, credentials, kody:*,
|
|
214
|
+
execute, invoke, search). Same meaning on \`dev\`, \`execute\`,
|
|
215
|
+
and \`search\`. Defaults: \`mock\` for \`kody dev\`; \`prod\` for
|
|
216
|
+
execute/search (unchanged). \`--target mock\` starts the
|
|
217
|
+
built-in CLI mock (no kody-celld); scratch storage; fake or
|
|
218
|
+
local credentials so unpublished packages never touch real
|
|
219
|
+
secrets. Unimplemented mock routes refuse with
|
|
220
|
+
\`not_implemented_in_mock\`.
|
|
221
|
+
|
|
222
|
+
--reset-storage
|
|
223
|
+
With \`--target mock\`, wipe the mock session's scratch storage
|
|
224
|
+
before the command.
|
|
225
|
+
|
|
226
|
+
kody dev Local testing for unpublished packages. Serves \`kody.app.entry\`
|
|
227
|
+
on localhost via workerd with hot reload (mount-stripped path;
|
|
228
|
+
packageContext.hostedUrl / appBasePath point at localhost).
|
|
229
|
+
Bundles with the same esbuild path as publish (\`local-bundle\`).
|
|
230
|
+
Four surfaces: exports (\`execute --invoke ./export\` or
|
|
231
|
+
\`--file\` against the local package), webhooks
|
|
232
|
+
(\`kody dev webhook\`), schedules (\`kody dev job\` — runs once,
|
|
233
|
+
never schedules locally), subscriptions
|
|
234
|
+
(\`kody dev emit <event> --body event.json\`). \`kody dev check\`
|
|
235
|
+
bundles + light publish validations without running. Share
|
|
236
|
+
previews are out of scope.
|
|
205
237
|
|
|
206
238
|
Environment:
|
|
207
239
|
KODY_MCP_URL Override the default MCP URL (${defaultMcpUrl})
|
|
208
240
|
${orgEnvVar} Default org slug for org-scoped commands (overridden by --org)
|
|
209
241
|
${apiTokenEnvVar} Scoped API token for token-auth search / whoami / api / execute
|
|
210
242
|
KODY_API_URL Override the Kody API URL (${defaultApiUrl})
|
|
243
|
+
KODY_TARGET Default \`prod\`|\`mock\` (overridden by --target)
|
|
244
|
+
KODY_MOCK_SESSION_ID Scratch storage key for --target mock (default: default)
|
|
211
245
|
KODY_CACHE_DIR Where execute --local caches workerd (default: user cache dir)
|
|
212
246
|
KODY_WORKERD_PATH Use this workerd binary instead of the pinned download
|
|
213
247
|
`;
|
package/dist/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EACN,cAAc,GAId,MAAM,YAAY,CAAA;AAEnB,SAAS,mBAAmB,CAAC,IAAsB,EAAE,MAAM,GAAG,IAAI;IACjE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,MAAM,sCAAsC,CAAA;IACvD,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,iBAAiB,CAAC,CAAA;IAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;QACnC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO;YAC1B,CAAC,CAAC,kDAAkD;YACpD,CAAC,CAAC,EAAE,CAAA;QACL,KAAK,CAAC,IAAI,CACT,GAAG,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAC3E,CAAA;IACF,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAKvB,EAAE;IACL,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,aAAa,CAAA;IAC5C,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,IAAI,CAAC;YACJ,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;QAC/D,CAAC;QAAC,MAAM,CAAC;YACR,IAAI,GAAG,EAAE,CAAA;QACV,CAAC;IACF,CAAC;IACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAA;IAE1C,OAAO,YAAY,kBAAkB,EAAE
|
|
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,SAAS,EAAE,MAAM,eAAe,CAAA;AACzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EACN,cAAc,GAId,MAAM,YAAY,CAAA;AAEnB,SAAS,mBAAmB,CAAC,IAAsB,EAAE,MAAM,GAAG,IAAI;IACjE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,MAAM,sCAAsC,CAAA;IACvD,CAAC;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,iBAAiB,CAAC,CAAA;IAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAA;QACnC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO;YAC1B,CAAC,CAAC,kDAAkD;YACpD,CAAC,CAAC,EAAE,CAAA;QACL,KAAK,CAAC,IAAI,CACT,GAAG,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,CAC3E,CAAA;IACF,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;AAC/B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAKvB,EAAE;IACL,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,aAAa,CAAA;IAC5C,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACrB,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,IAAI,CAAC;YACJ,IAAI,GAAG,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,CAAA;QAC/D,CAAC;QAAC,MAAM,CAAC;YACR,IAAI,GAAG,EAAE,CAAA;QACV,CAAC;IACF,CAAC;IACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAA;IAE1C,OAAO,YAAY,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA+BhC,aAAa,CAAC,aAAa,CAAC;;;EAGlC,QAAQ;;;gBAGM,SAAS;;;;;;eAMV,SAAS;;;;;;;;;;;;;;;;oCAgBY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;eAyBvC,cAAc;;;;;;;;;+DASkC,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wCAmCrC,cAAc;;;eAGvC,aAAa;;;;cAId,cAAc;;;;;eAKb,cAAc;;;;;;;;2BAQF,SAAS;;;;;;;;eAQrB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sDAmDyB,aAAa;IAC/D,SAAS;IACT,cAAc;mDACiC,aAAa;;;;;CAK/D,CAAA;AACD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,KAAwC;IAC7D,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;AACzB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run one unpublished package module (export / job / webhook / subscription)
|
|
3
|
+
* in local workerd against `--target prod|mock`.
|
|
4
|
+
*/
|
|
5
|
+
import { type PackageLocalContext } from './package-local-runtime-source.js';
|
|
6
|
+
import type { KodyTarget } from './target.js';
|
|
7
|
+
import type { ToolCallResult } from './tool-result.js';
|
|
8
|
+
export type LocalPackageRunInput = {
|
|
9
|
+
modulePath: string;
|
|
10
|
+
params?: unknown;
|
|
11
|
+
token: string;
|
|
12
|
+
apiUrl: string;
|
|
13
|
+
target: KodyTarget;
|
|
14
|
+
packageContext: PackageLocalContext;
|
|
15
|
+
fetchFn?: typeof fetch;
|
|
16
|
+
workerdPath?: string;
|
|
17
|
+
allowPrivateNetwork?: boolean;
|
|
18
|
+
onStatus?: (message: string) => void;
|
|
19
|
+
};
|
|
20
|
+
export declare function runLocalPackageModule(input: LocalPackageRunInput): Promise<ToolCallResult>;
|
|
21
|
+
/** Build the packageContext used for local unpublished package runs. */
|
|
22
|
+
export declare function buildLocalPackageContext(input: {
|
|
23
|
+
kodyId: string;
|
|
24
|
+
packageId?: string;
|
|
25
|
+
hostedUrl: string;
|
|
26
|
+
appBasePath?: string;
|
|
27
|
+
clientModuleUrl?: string | null;
|
|
28
|
+
}): PackageLocalContext;
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run one unpublished package module (export / job / webhook / subscription)
|
|
3
|
+
* in local workerd against `--target prod|mock`.
|
|
4
|
+
*/
|
|
5
|
+
import { spawn } from 'node:child_process';
|
|
6
|
+
import { randomBytes } from 'node:crypto';
|
|
7
|
+
import { rmSync } from 'node:fs';
|
|
8
|
+
import { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
9
|
+
import { createServer, request as httpRequest, } from 'node:http';
|
|
10
|
+
import { tmpdir } from 'node:os';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
13
|
+
import { assertTokenSafeApiUrl, callCapabilityProxy, } from './capability-proxy.js';
|
|
14
|
+
import { apiTokenEnvVar } from './defaults.js';
|
|
15
|
+
import { bundleLocalUserModule } from './local-bundle.js';
|
|
16
|
+
import { createWorkerdConfig, } from './local-runtime-source.js';
|
|
17
|
+
import { createPackageLocalRuntimeModuleSource, createPackageModuleEntrySource, localWorkerModuleNames, runSecretEnvVar, runSecretHeader, } from './package-local-runtime-source.js';
|
|
18
|
+
import { redact } from './redact.js';
|
|
19
|
+
import { ensureWorkerdBinary } from './workerd-binary.js';
|
|
20
|
+
const workerdStartTimeoutMs = 30_000;
|
|
21
|
+
const workerdExitGraceMs = 1_000;
|
|
22
|
+
export async function runLocalPackageModule(input) {
|
|
23
|
+
assertTokenSafeApiUrl(input.apiUrl);
|
|
24
|
+
input.onStatus?.(`Bundling ${input.modulePath}…`);
|
|
25
|
+
const code = await bundleLocalUserModule(input.modulePath);
|
|
26
|
+
const client = { apiUrl: input.apiUrl, token: input.token, fetchFn: input.fetchFn };
|
|
27
|
+
const workerdPath = input.workerdPath ??
|
|
28
|
+
(await ensureWorkerdBinary({
|
|
29
|
+
onDownload: (url) => input.onStatus?.(`Downloading workerd from ${url}…`),
|
|
30
|
+
}));
|
|
31
|
+
const runSecret = randomBytes(32).toString('hex');
|
|
32
|
+
const workDir = await mkdtemp(join(tmpdir(), 'kody-pkg-'));
|
|
33
|
+
let child;
|
|
34
|
+
let bridge;
|
|
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) => {
|
|
42
|
+
const endedAt = new Date();
|
|
43
|
+
const logs = sandbox.logs ?? [];
|
|
44
|
+
const base = {
|
|
45
|
+
timing: {
|
|
46
|
+
startedAt: startedAt.toISOString(),
|
|
47
|
+
endedAt: endedAt.toISOString(),
|
|
48
|
+
durationMs: endedAt.getTime() - startedAt.getTime(),
|
|
49
|
+
},
|
|
50
|
+
target: input.target,
|
|
51
|
+
};
|
|
52
|
+
if (typeof sandbox.error === 'string') {
|
|
53
|
+
return {
|
|
54
|
+
content: [{ type: 'text', text: `Error: ${sandbox.error}` }],
|
|
55
|
+
structuredContent: { ...base, returnedBytes: 0, error: sandbox.error, logs },
|
|
56
|
+
isError: true,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
const text = typeof sandbox.result === 'string'
|
|
60
|
+
? sandbox.result
|
|
61
|
+
: (JSON.stringify(sandbox.result, null, 2) ?? 'undefined');
|
|
62
|
+
const serialized = typeof sandbox.result === 'string'
|
|
63
|
+
? sandbox.result
|
|
64
|
+
: (JSON.stringify(sandbox.result) ?? 'undefined');
|
|
65
|
+
return {
|
|
66
|
+
content: [{ type: 'text', text }],
|
|
67
|
+
structuredContent: {
|
|
68
|
+
...base,
|
|
69
|
+
returnedBytes: Buffer.byteLength(serialized),
|
|
70
|
+
result: sandbox.result,
|
|
71
|
+
logs,
|
|
72
|
+
},
|
|
73
|
+
isError: false,
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
try {
|
|
77
|
+
bridge = await startBridge({
|
|
78
|
+
runSecret,
|
|
79
|
+
forward: (call, signal) => callCapabilityProxy({
|
|
80
|
+
...client,
|
|
81
|
+
...call,
|
|
82
|
+
signal,
|
|
83
|
+
}),
|
|
84
|
+
});
|
|
85
|
+
const files = { entry: 'entry.js', user: 'main.js', runtime: 'runtime.js' };
|
|
86
|
+
await writeFile(join(workDir, files.entry), createPackageModuleEntrySource());
|
|
87
|
+
await writeFile(join(workDir, files.user), code);
|
|
88
|
+
await writeFile(join(workDir, files.runtime), createPackageLocalRuntimeModuleSource({
|
|
89
|
+
packageContext: input.packageContext,
|
|
90
|
+
mockStorage: input.target === 'mock',
|
|
91
|
+
}));
|
|
92
|
+
const packageModules = [];
|
|
93
|
+
const configPath = join(workDir, 'config.capnp');
|
|
94
|
+
await writeFile(configPath, createWorkerdConfig({
|
|
95
|
+
bridgePort: bridge.port,
|
|
96
|
+
files,
|
|
97
|
+
packageModules,
|
|
98
|
+
allowPrivateNetwork: input.allowPrivateNetwork,
|
|
99
|
+
}));
|
|
100
|
+
const env = { ...process.env, [runSecretEnvVar]: runSecret };
|
|
101
|
+
delete env[apiTokenEnvVar];
|
|
102
|
+
child = spawn(workerdPath, ['serve', configPath, '--control-fd=3'], {
|
|
103
|
+
cwd: workDir,
|
|
104
|
+
env,
|
|
105
|
+
stdio: ['ignore', 'pipe', 'pipe', 'pipe'],
|
|
106
|
+
});
|
|
107
|
+
const workerd = watchWorkerd(child);
|
|
108
|
+
const started = await workerd.listening;
|
|
109
|
+
if ('exitDetail' in started) {
|
|
110
|
+
return finish({
|
|
111
|
+
error: `Local package run could not load the module${started.exitDetail}`,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
let response;
|
|
115
|
+
try {
|
|
116
|
+
response = await postToWorkerd({
|
|
117
|
+
port: started.port,
|
|
118
|
+
runSecret,
|
|
119
|
+
body: JSON.stringify({ params: input.params ?? {} }),
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
const exitDetail = await Promise.race([workerd.exited, delay(workerdExitGraceMs, null)]);
|
|
124
|
+
if (exitDetail !== null)
|
|
125
|
+
throw new Error(`workerd exited during the run${exitDetail}`);
|
|
126
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
127
|
+
throw new Error(`Local package run failed (${reason}).${workerd.stderr()}`);
|
|
128
|
+
}
|
|
129
|
+
if (response.status !== 200) {
|
|
130
|
+
throw new Error(`Local package runtime returned HTTP ${response.status}.${workerd.stderr()}`);
|
|
131
|
+
}
|
|
132
|
+
return finish(JSON.parse(response.body));
|
|
133
|
+
}
|
|
134
|
+
finally {
|
|
135
|
+
releaseSignals();
|
|
136
|
+
stopWorkerd();
|
|
137
|
+
await bridge?.close();
|
|
138
|
+
await rm(workDir, { recursive: true, force: true });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
/** Build the packageContext used for local unpublished package runs. */
|
|
142
|
+
export function buildLocalPackageContext(input) {
|
|
143
|
+
const appBasePath = input.appBasePath ?? '';
|
|
144
|
+
return {
|
|
145
|
+
packageId: input.packageId ?? `local:${input.kodyId}`,
|
|
146
|
+
kodyId: input.kodyId,
|
|
147
|
+
sourceId: `local:${input.kodyId}`,
|
|
148
|
+
publishedCommit: null,
|
|
149
|
+
appBasePath,
|
|
150
|
+
hostedUrl: input.hostedUrl.replace(/\/+$/, ''),
|
|
151
|
+
assetBasePath: appBasePath ? `${appBasePath}/_assets` : '/_assets',
|
|
152
|
+
clientModuleUrl: input.clientModuleUrl ?? null,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
function cleanupOnSignal(cleanup) {
|
|
156
|
+
const signals = ['SIGINT', 'SIGTERM', 'SIGHUP'];
|
|
157
|
+
const release = () => {
|
|
158
|
+
for (const signal of signals)
|
|
159
|
+
process.off(signal, handler);
|
|
160
|
+
};
|
|
161
|
+
const handler = (signal) => {
|
|
162
|
+
release();
|
|
163
|
+
cleanup();
|
|
164
|
+
process.kill(process.pid, signal);
|
|
165
|
+
};
|
|
166
|
+
for (const signal of signals)
|
|
167
|
+
process.once(signal, handler);
|
|
168
|
+
return release;
|
|
169
|
+
}
|
|
170
|
+
function watchWorkerd(child) {
|
|
171
|
+
let stderrText = '';
|
|
172
|
+
child.stderr?.on('data', (chunk) => {
|
|
173
|
+
stderrText += chunk.toString('utf8');
|
|
174
|
+
});
|
|
175
|
+
child.stdout?.resume();
|
|
176
|
+
const stderr = () => {
|
|
177
|
+
const trimmed = redact(stderrText.trim());
|
|
178
|
+
return trimmed ? `\n${trimmed}` : '';
|
|
179
|
+
};
|
|
180
|
+
const exited = new Promise((resolve) => {
|
|
181
|
+
child.once('exit', (code, signal) => {
|
|
182
|
+
resolve(` (workerd exit ${signal ?? code})${stderr()}`);
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
const listening = new Promise((resolve, reject) => {
|
|
186
|
+
const control = child.stdio[3];
|
|
187
|
+
let buffered = '';
|
|
188
|
+
const timer = setTimeout(() => {
|
|
189
|
+
reject(new Error(`workerd did not start within ${workerdStartTimeoutMs / 1000}s.${stderr()}`));
|
|
190
|
+
}, workerdStartTimeoutMs);
|
|
191
|
+
control?.on('data', (chunk) => {
|
|
192
|
+
buffered += chunk.toString('utf8');
|
|
193
|
+
for (const line of buffered.split('\n')) {
|
|
194
|
+
const port = parseListenPort(line);
|
|
195
|
+
if (port !== null) {
|
|
196
|
+
clearTimeout(timer);
|
|
197
|
+
resolve({ port });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
child.once('error', (error) => {
|
|
202
|
+
clearTimeout(timer);
|
|
203
|
+
reject(new Error(`Could not start workerd: ${error.message}`));
|
|
204
|
+
});
|
|
205
|
+
void exited.then((exitDetail) => {
|
|
206
|
+
clearTimeout(timer);
|
|
207
|
+
resolve({ exitDetail });
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
return { listening, exited, stderr };
|
|
211
|
+
}
|
|
212
|
+
function parseListenPort(line) {
|
|
213
|
+
if (!line.trim())
|
|
214
|
+
return null;
|
|
215
|
+
try {
|
|
216
|
+
const event = JSON.parse(line);
|
|
217
|
+
return event.event === 'listen' && event.socket === 'http' && typeof event.port === 'number'
|
|
218
|
+
? event.port
|
|
219
|
+
: null;
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function postToWorkerd(input) {
|
|
226
|
+
return new Promise((resolve, reject) => {
|
|
227
|
+
const request = httpRequest({
|
|
228
|
+
host: '127.0.0.1',
|
|
229
|
+
port: input.port,
|
|
230
|
+
method: 'POST',
|
|
231
|
+
path: '/',
|
|
232
|
+
headers: {
|
|
233
|
+
'content-type': 'application/json',
|
|
234
|
+
'content-length': Buffer.byteLength(input.body),
|
|
235
|
+
[runSecretHeader]: input.runSecret,
|
|
236
|
+
},
|
|
237
|
+
}, (response) => {
|
|
238
|
+
readBody(response).then((body) => resolve({ status: response.statusCode ?? 0, body }), reject);
|
|
239
|
+
});
|
|
240
|
+
request.on('error', reject);
|
|
241
|
+
request.end(input.body);
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
async function startBridge(input) {
|
|
245
|
+
const inFlight = new AbortController();
|
|
246
|
+
const server = createServer(async (request, response) => {
|
|
247
|
+
const reply = (status, body) => {
|
|
248
|
+
response.writeHead(status, { 'content-type': 'application/json' });
|
|
249
|
+
response.end(JSON.stringify(body));
|
|
250
|
+
};
|
|
251
|
+
if (request.method !== 'POST' ||
|
|
252
|
+
request.url !== '/call' ||
|
|
253
|
+
request.headers[runSecretHeader] !== input.runSecret) {
|
|
254
|
+
reply(403, { error: 'Forbidden' });
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
try {
|
|
258
|
+
const call = parseBridgeCall(await readBody(request));
|
|
259
|
+
const result = await input.forward(call, inFlight.signal);
|
|
260
|
+
reply(200, { result });
|
|
261
|
+
}
|
|
262
|
+
catch (error) {
|
|
263
|
+
reply(200, { error: redact(error instanceof Error ? error.message : String(error)) });
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
await new Promise((resolve, reject) => {
|
|
267
|
+
server.once('error', reject);
|
|
268
|
+
server.listen(0, '127.0.0.1', () => resolve());
|
|
269
|
+
});
|
|
270
|
+
return {
|
|
271
|
+
port: server.address().port,
|
|
272
|
+
close: () => new Promise((resolve) => {
|
|
273
|
+
inFlight.abort();
|
|
274
|
+
server.closeAllConnections();
|
|
275
|
+
server.close(() => resolve());
|
|
276
|
+
}),
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
function parseBridgeCall(body) {
|
|
280
|
+
const parsed = JSON.parse(body);
|
|
281
|
+
if (!Array.isArray(parsed.path) ||
|
|
282
|
+
parsed.path.length === 0 ||
|
|
283
|
+
!parsed.path.every((segment) => typeof segment === 'string')) {
|
|
284
|
+
throw new Error('Invalid kody:runtime call path.');
|
|
285
|
+
}
|
|
286
|
+
return {
|
|
287
|
+
path: parsed.path,
|
|
288
|
+
args: Array.isArray(parsed.args) ? parsed.args : [],
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
async function readBody(stream) {
|
|
292
|
+
const chunks = [];
|
|
293
|
+
for await (const chunk of stream) {
|
|
294
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
295
|
+
}
|
|
296
|
+
return Buffer.concat(chunks).toString('utf8');
|
|
297
|
+
}
|
|
298
|
+
void localWorkerModuleNames;
|
|
299
|
+
//# sourceMappingURL=local-package-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-package-run.js","sourceRoot":"","sources":["../src/local-package-run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight in-process mock of the Kody production API for `--target mock`.
|
|
3
|
+
* Does not ship or require kody-celld. Refuses unimplemented routes/ops with
|
|
4
|
+
* `not_implemented_in_mock` rather than faking success.
|
|
5
|
+
*/
|
|
6
|
+
import { type MockSessionState } from './mock-storage.js';
|
|
7
|
+
export type MockServerOptions = {
|
|
8
|
+
sessionId?: string;
|
|
9
|
+
resetStorage?: boolean;
|
|
10
|
+
host?: string;
|
|
11
|
+
port?: number;
|
|
12
|
+
/** Fixed package id for scratch packageStorage in local package runs. */
|
|
13
|
+
packageId?: string;
|
|
14
|
+
env?: NodeJS.ProcessEnv;
|
|
15
|
+
};
|
|
16
|
+
export type MockServer = {
|
|
17
|
+
url: string;
|
|
18
|
+
port: number;
|
|
19
|
+
sessionId: string;
|
|
20
|
+
close: () => Promise<void>;
|
|
21
|
+
state: () => MockSessionState;
|
|
22
|
+
};
|
|
23
|
+
export declare function isMockApiToken(token: string): boolean;
|
|
24
|
+
/** Issue a bearer the mock accepts (never a real kody_at_…). */
|
|
25
|
+
export declare function mintMockApiToken(sessionId: string): string;
|
|
26
|
+
export declare function startMockServer(options?: MockServerOptions): Promise<MockServer>;
|
|
27
|
+
/** Ensure a mock is running and return its API origin + token for CLI wiring. */
|
|
28
|
+
export declare function ensureMockTarget(input: {
|
|
29
|
+
sessionId?: string;
|
|
30
|
+
resetStorage?: boolean;
|
|
31
|
+
packageId?: string;
|
|
32
|
+
env?: NodeJS.ProcessEnv;
|
|
33
|
+
/** Reuse an already-started server (e.g. long-lived `kody dev`). */
|
|
34
|
+
existing?: MockServer;
|
|
35
|
+
}): Promise<{
|
|
36
|
+
apiUrl: string;
|
|
37
|
+
token: string;
|
|
38
|
+
server: MockServer;
|
|
39
|
+
started: boolean;
|
|
40
|
+
}>;
|
|
41
|
+
/** Close helper used by tests and short-lived CLI commands. */
|
|
42
|
+
export declare function withMockServer<T>(options: MockServerOptions, fn: (server: MockServer) => Promise<T>): Promise<T>;
|