@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
|
@@ -0,0 +1,373 @@
|
|
|
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 { createServer, } from 'node:http';
|
|
7
|
+
import { notImplementedInMock, StructuredCliError } from '../structured-error.js';
|
|
8
|
+
import { isMockCapabilityPath, isMockOpenApiOperation, mockOpenApiOperationIds, } from './mock-supported.js';
|
|
9
|
+
import { loadMockSession, packageStorageDelete, packageStorageGet, packageStorageList, packageStorageSet, persistMockSession, } from './mock-storage.js';
|
|
10
|
+
const mockTokenPrefix = 'kody_mock_';
|
|
11
|
+
export function isMockApiToken(token) {
|
|
12
|
+
return token.startsWith(mockTokenPrefix) || token === 'mock';
|
|
13
|
+
}
|
|
14
|
+
/** Issue a bearer the mock accepts (never a real kody_at_…). */
|
|
15
|
+
export function mintMockApiToken(sessionId) {
|
|
16
|
+
return `${mockTokenPrefix}${sessionId}`;
|
|
17
|
+
}
|
|
18
|
+
export async function startMockServer(options = {}) {
|
|
19
|
+
let state = await loadMockSession({
|
|
20
|
+
sessionId: options.sessionId,
|
|
21
|
+
env: options.env,
|
|
22
|
+
reset: options.resetStorage,
|
|
23
|
+
});
|
|
24
|
+
const packageId = options.packageId ?? `local-${state.sessionId}`;
|
|
25
|
+
const server = createServer((req, res) => {
|
|
26
|
+
void handleRequest(req, res, {
|
|
27
|
+
getState: () => state,
|
|
28
|
+
setState: async (next) => {
|
|
29
|
+
state = next;
|
|
30
|
+
await persistMockSession(state, options.env);
|
|
31
|
+
},
|
|
32
|
+
packageId,
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
const host = options.host ?? '127.0.0.1';
|
|
36
|
+
const port = options.port ?? 0;
|
|
37
|
+
await new Promise((resolve, reject) => {
|
|
38
|
+
server.once('error', reject);
|
|
39
|
+
server.listen(port, host, () => resolve());
|
|
40
|
+
});
|
|
41
|
+
const address = server.address();
|
|
42
|
+
const url = `http://${host}:${address.port}`;
|
|
43
|
+
return {
|
|
44
|
+
url,
|
|
45
|
+
port: address.port,
|
|
46
|
+
sessionId: state.sessionId,
|
|
47
|
+
state: () => state,
|
|
48
|
+
close: () => new Promise((resolve, reject) => {
|
|
49
|
+
server.close((error) => (error ? reject(error) : resolve()));
|
|
50
|
+
}),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** Ensure a mock is running and return its API origin + token for CLI wiring. */
|
|
54
|
+
export async function ensureMockTarget(input) {
|
|
55
|
+
if (input.existing) {
|
|
56
|
+
return {
|
|
57
|
+
apiUrl: input.existing.url,
|
|
58
|
+
token: mintMockApiToken(input.existing.sessionId),
|
|
59
|
+
server: input.existing,
|
|
60
|
+
started: false,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const server = await startMockServer({
|
|
64
|
+
sessionId: input.sessionId,
|
|
65
|
+
resetStorage: input.resetStorage,
|
|
66
|
+
packageId: input.packageId,
|
|
67
|
+
env: input.env,
|
|
68
|
+
});
|
|
69
|
+
return {
|
|
70
|
+
apiUrl: server.url,
|
|
71
|
+
token: mintMockApiToken(server.sessionId),
|
|
72
|
+
server,
|
|
73
|
+
started: true,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
async function handleRequest(req, res, ctx) {
|
|
77
|
+
try {
|
|
78
|
+
const url = new URL(req.url ?? '/', 'http://127.0.0.1');
|
|
79
|
+
const method = (req.method ?? 'GET').toUpperCase();
|
|
80
|
+
const body = await readJsonBody(req);
|
|
81
|
+
if (method === 'GET' && url.pathname === '/openapi.json') {
|
|
82
|
+
return sendJson(res, 200, mockOpenApiDocument());
|
|
83
|
+
}
|
|
84
|
+
if (method === 'GET' && url.pathname === '/v1/capability-proxy/session') {
|
|
85
|
+
assertMockAuth(req);
|
|
86
|
+
return sendJson(res, 200, {
|
|
87
|
+
scopes: ['org:execute', 'org:read', 'package:execute', 'package:read', 'search:read'],
|
|
88
|
+
features: ['local-execute', 'credential-call-map'],
|
|
89
|
+
expiresAt: new Date(Date.now() + 86_400_000).toISOString(),
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (method === 'POST' && url.pathname === '/v1/capability-proxy/call') {
|
|
93
|
+
assertMockAuth(req);
|
|
94
|
+
const path = Array.isArray(body?.path) ? body.path : null;
|
|
95
|
+
const args = Array.isArray(body?.args) ? body.args : [];
|
|
96
|
+
if (!path || path.length === 0) {
|
|
97
|
+
return sendJson(res, 400, {
|
|
98
|
+
error: { code: 'invalid_request', message: 'path is required' },
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
const pathKey = path.join('.');
|
|
102
|
+
if (!isMockCapabilityPath(pathKey)) {
|
|
103
|
+
const err = notImplementedInMock({ operation: `CapabilityProxy ${pathKey}` });
|
|
104
|
+
return sendJson(res, 501, { error: err.toJSON() });
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const result = await dispatchCapabilityCall(pathKey, args, ctx);
|
|
108
|
+
return sendJson(res, 200, { result });
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
if (error instanceof StructuredCliError) {
|
|
112
|
+
return sendJson(res, 501, { error: error.toJSON() });
|
|
113
|
+
}
|
|
114
|
+
throw error;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (method === 'POST' && url.pathname === '/v1/local-execute/package-graph') {
|
|
118
|
+
assertMockAuth(req);
|
|
119
|
+
// Empty module list: local unpublished code has no stamped kody:@ deps
|
|
120
|
+
// from origin. Gateway-fetch shim is omitted; ambient secret placeholders
|
|
121
|
+
// are unavailable on mock (use mock credentials instead).
|
|
122
|
+
return sendJson(res, 200, {
|
|
123
|
+
modules: [],
|
|
124
|
+
compatibilityDate: '2026-04-16',
|
|
125
|
+
compatibilityFlags: ['nodejs_compat'],
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Open API style: GET /v1/search?query=
|
|
129
|
+
if (method === 'GET' && url.pathname === '/v1/search') {
|
|
130
|
+
assertMockAuth(req);
|
|
131
|
+
const query = url.searchParams.get('query') ?? '';
|
|
132
|
+
const entity = url.searchParams.get('entity') ?? undefined;
|
|
133
|
+
return sendJson(res, 200, mockSearch(ctx.getState(), { query, entity }));
|
|
134
|
+
}
|
|
135
|
+
if (method === 'GET' && url.pathname === '/v1/me') {
|
|
136
|
+
assertMockAuth(req);
|
|
137
|
+
return sendJson(res, 200, mockCurrentUser(ctx.getState()));
|
|
138
|
+
}
|
|
139
|
+
// Generic Open API POST /v1/... by operation is not fully routed; refuse.
|
|
140
|
+
if (url.pathname.startsWith('/v1/')) {
|
|
141
|
+
const err = notImplementedInMock({
|
|
142
|
+
operation: `${method} ${url.pathname}`,
|
|
143
|
+
});
|
|
144
|
+
return sendJson(res, 501, { error: err.toJSON() });
|
|
145
|
+
}
|
|
146
|
+
const err = notImplementedInMock({ operation: `${method} ${url.pathname}` });
|
|
147
|
+
return sendJson(res, 501, { error: err.toJSON() });
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
if (error instanceof AuthError) {
|
|
151
|
+
return sendJson(res, 401, {
|
|
152
|
+
error: { code: 'unauthorized', message: error.message },
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
156
|
+
return sendJson(res, 500, {
|
|
157
|
+
error: { code: 'mock_internal_error', message },
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
class AuthError extends Error {
|
|
162
|
+
constructor(message) {
|
|
163
|
+
super(message);
|
|
164
|
+
this.name = 'AuthError';
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
function assertMockAuth(req) {
|
|
168
|
+
const header = req.headers.authorization;
|
|
169
|
+
if (typeof header !== 'string' || !header.toLowerCase().startsWith('bearer ')) {
|
|
170
|
+
throw new AuthError('Mock API requires Authorization: Bearer <token>.');
|
|
171
|
+
}
|
|
172
|
+
const token = header.slice('bearer '.length).trim();
|
|
173
|
+
if (!isMockApiToken(token) && !token.startsWith('kody_at_') && token.length > 0) {
|
|
174
|
+
// Accept any non-empty bearer for local bridging when callers forward a
|
|
175
|
+
// login token; mock still never reaches prod secrets.
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
if (!token)
|
|
179
|
+
throw new AuthError('Mock API bearer token is empty.');
|
|
180
|
+
}
|
|
181
|
+
async function dispatchCapabilityCall(pathKey, args, ctx) {
|
|
182
|
+
const state = ctx.getState();
|
|
183
|
+
switch (pathKey) {
|
|
184
|
+
case 'kody.metaGetCurrentUser':
|
|
185
|
+
return mockCurrentUser(state);
|
|
186
|
+
case 'kody.search': {
|
|
187
|
+
const params = (args[0] ?? {});
|
|
188
|
+
return mockSearch(state, params);
|
|
189
|
+
}
|
|
190
|
+
case 'kody.usageGet':
|
|
191
|
+
return {
|
|
192
|
+
period: 'mock',
|
|
193
|
+
credits: { used: 0, limit: null },
|
|
194
|
+
note: 'Mock usage — not real entitlement data.',
|
|
195
|
+
};
|
|
196
|
+
case 'kody.execute': {
|
|
197
|
+
const params = (args[0] ?? {});
|
|
198
|
+
throw notImplementedInMock({
|
|
199
|
+
operation: 'kody.execute (cloud sandbox)',
|
|
200
|
+
fix: 'Use `kody execute --local --target mock` so the module runs in local workerd against this mock.',
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
case 'kody.__mockPackageStorageGet': {
|
|
204
|
+
const key = String(args[0]?.key ?? '');
|
|
205
|
+
return { value: packageStorageGet(state, ctx.packageId, key) ?? null };
|
|
206
|
+
}
|
|
207
|
+
case 'kody.__mockPackageStorageSet': {
|
|
208
|
+
const input = args[0];
|
|
209
|
+
packageStorageSet(state, ctx.packageId, String(input?.key ?? ''), input?.value);
|
|
210
|
+
await ctx.setState(state);
|
|
211
|
+
return { ok: true };
|
|
212
|
+
}
|
|
213
|
+
case 'kody.__mockPackageStorageDelete': {
|
|
214
|
+
const key = String(args[0]?.key ?? '');
|
|
215
|
+
const deleted = packageStorageDelete(state, ctx.packageId, key);
|
|
216
|
+
await ctx.setState(state);
|
|
217
|
+
return { deleted };
|
|
218
|
+
}
|
|
219
|
+
case 'kody.__mockPackageStorageList': {
|
|
220
|
+
return { entries: packageStorageList(state, ctx.packageId) };
|
|
221
|
+
}
|
|
222
|
+
case 'kody.credentialClientOpen': {
|
|
223
|
+
const key = String(args[0]?.key ?? args[0] ?? '');
|
|
224
|
+
const cred = state.credentials[key] ?? state.credentials[key.toUpperCase()];
|
|
225
|
+
if (!cred) {
|
|
226
|
+
throw new StructuredCliError({
|
|
227
|
+
code: 'missing_secret',
|
|
228
|
+
message: `Mock credential ${JSON.stringify(key)} is not defined for this session.`,
|
|
229
|
+
target: 'mock',
|
|
230
|
+
fix: 'Add a fake credential to the mock session or use --target prod with a real allow-listed secret.',
|
|
231
|
+
details: { key },
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
ok: true,
|
|
236
|
+
value: {
|
|
237
|
+
handle: `mock-handle:${cred.id}`,
|
|
238
|
+
name: cred.name,
|
|
239
|
+
kind: cred.kind,
|
|
240
|
+
// Never expose a real secret; mockValue is session-local scratch only.
|
|
241
|
+
metadata: { mock: true },
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
case 'kody.credentialClientCheck':
|
|
246
|
+
return { ok: true, warnings: [] };
|
|
247
|
+
default: {
|
|
248
|
+
const exhaustive = pathKey;
|
|
249
|
+
throw notImplementedInMock({ operation: String(exhaustive) });
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
function mockCurrentUser(state) {
|
|
254
|
+
return {
|
|
255
|
+
user: {
|
|
256
|
+
id: 'user_mock',
|
|
257
|
+
username: 'mock-user',
|
|
258
|
+
email: 'mock@example.com',
|
|
259
|
+
},
|
|
260
|
+
org: {
|
|
261
|
+
id: 'org_mock',
|
|
262
|
+
slug: 'mock-org',
|
|
263
|
+
name: 'Mock Org',
|
|
264
|
+
},
|
|
265
|
+
mockSessionId: state.sessionId,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
function mockSearch(state, params) {
|
|
269
|
+
if (params.entity) {
|
|
270
|
+
const hit = state.searchCatalog.find((item) => `${item.type}:${item.id}` === params.entity || item.id === params.entity);
|
|
271
|
+
return {
|
|
272
|
+
conversationId: `mock-${state.sessionId}`,
|
|
273
|
+
matches: hit
|
|
274
|
+
? [
|
|
275
|
+
{
|
|
276
|
+
type: hit.type,
|
|
277
|
+
id: hit.id,
|
|
278
|
+
entityRef: `${hit.type}:${hit.id}`,
|
|
279
|
+
title: hit.title,
|
|
280
|
+
description: hit.description,
|
|
281
|
+
},
|
|
282
|
+
]
|
|
283
|
+
: [],
|
|
284
|
+
offline: false,
|
|
285
|
+
warnings: [],
|
|
286
|
+
guidance: 'Mock catalog — not the live Kody search index.',
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
const q = (params.query ?? '').toLowerCase().trim();
|
|
290
|
+
const matches = state.searchCatalog
|
|
291
|
+
.filter((item) => !q ||
|
|
292
|
+
item.title.toLowerCase().includes(q) ||
|
|
293
|
+
item.description.toLowerCase().includes(q) ||
|
|
294
|
+
item.id.toLowerCase().includes(q))
|
|
295
|
+
.slice(0, params.limit ?? 20)
|
|
296
|
+
.map((item) => ({
|
|
297
|
+
type: item.type,
|
|
298
|
+
id: item.id,
|
|
299
|
+
entityRef: `${item.type}:${item.id}`,
|
|
300
|
+
title: item.title,
|
|
301
|
+
description: item.description,
|
|
302
|
+
}));
|
|
303
|
+
return {
|
|
304
|
+
conversationId: `mock-${state.sessionId}`,
|
|
305
|
+
matches,
|
|
306
|
+
offline: false,
|
|
307
|
+
warnings: [],
|
|
308
|
+
guidance: 'Mock catalog — not the live Kody search index.',
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
function mockOpenApiDocument() {
|
|
312
|
+
return {
|
|
313
|
+
openapi: '3.1.0',
|
|
314
|
+
info: {
|
|
315
|
+
title: 'Kody API (CLI mock)',
|
|
316
|
+
version: 'mock',
|
|
317
|
+
description: 'Subset document for the CLI mock. Unsupported operations refuse with not_implemented_in_mock.',
|
|
318
|
+
},
|
|
319
|
+
paths: {
|
|
320
|
+
'/v1/search': {
|
|
321
|
+
get: {
|
|
322
|
+
operationId: 'search',
|
|
323
|
+
summary: 'Search the mock catalog',
|
|
324
|
+
},
|
|
325
|
+
},
|
|
326
|
+
'/v1/me': {
|
|
327
|
+
get: {
|
|
328
|
+
operationId: 'metaGetCurrentUser',
|
|
329
|
+
summary: 'Mock current user',
|
|
330
|
+
},
|
|
331
|
+
},
|
|
332
|
+
},
|
|
333
|
+
'x-kody-mock-operations': [...mockOpenApiOperationIds],
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
async function readJsonBody(req) {
|
|
337
|
+
const chunks = [];
|
|
338
|
+
for await (const chunk of req) {
|
|
339
|
+
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
340
|
+
}
|
|
341
|
+
if (chunks.length === 0)
|
|
342
|
+
return null;
|
|
343
|
+
const text = Buffer.concat(chunks).toString('utf8').trim();
|
|
344
|
+
if (!text)
|
|
345
|
+
return null;
|
|
346
|
+
try {
|
|
347
|
+
return JSON.parse(text);
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
return null;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
function sendJson(res, status, body) {
|
|
354
|
+
const payload = JSON.stringify(body);
|
|
355
|
+
res.writeHead(status, {
|
|
356
|
+
'content-type': 'application/json; charset=utf-8',
|
|
357
|
+
'content-length': Buffer.byteLength(payload),
|
|
358
|
+
});
|
|
359
|
+
res.end(payload);
|
|
360
|
+
}
|
|
361
|
+
/** Close helper used by tests and short-lived CLI commands. */
|
|
362
|
+
export async function withMockServer(options, fn) {
|
|
363
|
+
const server = await startMockServer(options);
|
|
364
|
+
try {
|
|
365
|
+
return await fn(server);
|
|
366
|
+
}
|
|
367
|
+
finally {
|
|
368
|
+
await server.close();
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
// Silence unused Server type import lint when only createServer is needed in some builds
|
|
372
|
+
void null;
|
|
373
|
+
//# sourceMappingURL=mock-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-server.js","sourceRoot":"","sources":["../../src/mock/mock-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scratch storage for `--target mock`, keyed by the active content-addressed
|
|
3
|
+
* session directory under the user cache. Reset with `--reset-storage`.
|
|
4
|
+
*/
|
|
5
|
+
export type MockStorageBucket = {
|
|
6
|
+
/** Arbitrary JSON-serializable rows keyed by string id. */
|
|
7
|
+
rows: Record<string, unknown>;
|
|
8
|
+
};
|
|
9
|
+
export type MockSessionState = {
|
|
10
|
+
version: 1;
|
|
11
|
+
sessionId: string;
|
|
12
|
+
createdAt: string;
|
|
13
|
+
updatedAt: string;
|
|
14
|
+
/** packageId → bucket */
|
|
15
|
+
packageStorage: Record<string, MockStorageBucket>;
|
|
16
|
+
/** Fake / local credential metadata only — never real secret values from prod. */
|
|
17
|
+
credentials: Record<string, {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
kind: 'secret' | 'oauth';
|
|
21
|
+
/** Placeholder value used only inside the mock. */
|
|
22
|
+
mockValue: string;
|
|
23
|
+
}>;
|
|
24
|
+
/** Soft catalog entries surfaced by mock search. */
|
|
25
|
+
searchCatalog: Array<{
|
|
26
|
+
type: string;
|
|
27
|
+
id: string;
|
|
28
|
+
title: string;
|
|
29
|
+
description: string;
|
|
30
|
+
}>;
|
|
31
|
+
};
|
|
32
|
+
export declare function mockSessionRoot(sessionId: string, env?: NodeJS.ProcessEnv): string;
|
|
33
|
+
export declare function defaultMockSessionId(env?: NodeJS.ProcessEnv): string;
|
|
34
|
+
export declare function loadMockSession(input: {
|
|
35
|
+
sessionId?: string;
|
|
36
|
+
env?: NodeJS.ProcessEnv;
|
|
37
|
+
reset?: boolean;
|
|
38
|
+
}): Promise<MockSessionState>;
|
|
39
|
+
export declare function persistMockSession(state: MockSessionState, env?: NodeJS.ProcessEnv): Promise<void>;
|
|
40
|
+
export declare function packageStorageGet(state: MockSessionState, packageId: string, key: string): unknown;
|
|
41
|
+
export declare function packageStorageSet(state: MockSessionState, packageId: string, key: string, value: unknown): void;
|
|
42
|
+
export declare function packageStorageDelete(state: MockSessionState, packageId: string, key: string): boolean;
|
|
43
|
+
export declare function packageStorageList(state: MockSessionState, packageId: string): Array<{
|
|
44
|
+
key: string;
|
|
45
|
+
value: unknown;
|
|
46
|
+
}>;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scratch storage for `--target mock`, keyed by the active content-addressed
|
|
3
|
+
* session directory under the user cache. Reset with `--reset-storage`.
|
|
4
|
+
*/
|
|
5
|
+
import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { userCacheDir } from '../workerd-binary.js';
|
|
8
|
+
const mockStateFile = 'state.json';
|
|
9
|
+
export function mockSessionRoot(sessionId, env = process.env) {
|
|
10
|
+
return join(userCacheDir(env), 'mock-sessions', sessionId);
|
|
11
|
+
}
|
|
12
|
+
export function defaultMockSessionId(env = process.env) {
|
|
13
|
+
return env.KODY_MOCK_SESSION_ID?.trim() || 'default';
|
|
14
|
+
}
|
|
15
|
+
export async function loadMockSession(input) {
|
|
16
|
+
const env = input.env ?? process.env;
|
|
17
|
+
const sessionId = input.sessionId ?? defaultMockSessionId(env);
|
|
18
|
+
const root = mockSessionRoot(sessionId, env);
|
|
19
|
+
if (input.reset) {
|
|
20
|
+
await rm(root, { recursive: true, force: true });
|
|
21
|
+
}
|
|
22
|
+
await mkdir(root, { recursive: true });
|
|
23
|
+
const path = join(root, mockStateFile);
|
|
24
|
+
try {
|
|
25
|
+
const raw = JSON.parse(await readFile(path, 'utf8'));
|
|
26
|
+
if (raw?.version === 1 && raw.sessionId === sessionId) {
|
|
27
|
+
return raw;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// miss → create
|
|
32
|
+
}
|
|
33
|
+
const now = new Date().toISOString();
|
|
34
|
+
const fresh = {
|
|
35
|
+
version: 1,
|
|
36
|
+
sessionId,
|
|
37
|
+
createdAt: now,
|
|
38
|
+
updatedAt: now,
|
|
39
|
+
packageStorage: {},
|
|
40
|
+
credentials: {
|
|
41
|
+
MOCK_SECRET: {
|
|
42
|
+
id: 'cred_mock_secret',
|
|
43
|
+
name: 'MOCK_SECRET',
|
|
44
|
+
kind: 'secret',
|
|
45
|
+
mockValue: 'mock-secret-value',
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
searchCatalog: [
|
|
49
|
+
{
|
|
50
|
+
type: 'guide',
|
|
51
|
+
id: 'local_execute',
|
|
52
|
+
title: 'Local CLI execute',
|
|
53
|
+
description: 'Prefer @kodycodes/cli execute --local when Node ≥22.',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
type: 'capability',
|
|
57
|
+
id: 'metaGetCurrentUser',
|
|
58
|
+
title: 'metaGetCurrentUser',
|
|
59
|
+
description: 'Return the current authenticated user and org binding.',
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
type: 'guide',
|
|
63
|
+
id: 'package_apps',
|
|
64
|
+
title: 'Package apps',
|
|
65
|
+
description: 'Hosted Worker apps on *.kody.run; use kody dev for local.',
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
};
|
|
69
|
+
await persistMockSession(fresh, env);
|
|
70
|
+
return fresh;
|
|
71
|
+
}
|
|
72
|
+
export async function persistMockSession(state, env = process.env) {
|
|
73
|
+
state.updatedAt = new Date().toISOString();
|
|
74
|
+
const root = mockSessionRoot(state.sessionId, env);
|
|
75
|
+
await mkdir(root, { recursive: true });
|
|
76
|
+
await writeFile(join(root, mockStateFile), `${JSON.stringify(state, null, 2)}\n`);
|
|
77
|
+
}
|
|
78
|
+
export function packageStorageGet(state, packageId, key) {
|
|
79
|
+
return state.packageStorage[packageId]?.rows[key];
|
|
80
|
+
}
|
|
81
|
+
export function packageStorageSet(state, packageId, key, value) {
|
|
82
|
+
const bucket = (state.packageStorage[packageId] ??= { rows: {} });
|
|
83
|
+
bucket.rows[key] = value;
|
|
84
|
+
}
|
|
85
|
+
export function packageStorageDelete(state, packageId, key) {
|
|
86
|
+
const bucket = state.packageStorage[packageId];
|
|
87
|
+
if (!bucket || !(key in bucket.rows))
|
|
88
|
+
return false;
|
|
89
|
+
delete bucket.rows[key];
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
export function packageStorageList(state, packageId) {
|
|
93
|
+
const rows = state.packageStorage[packageId]?.rows ?? {};
|
|
94
|
+
return Object.entries(rows).map(([key, value]) => ({ key, value }));
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=mock-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-storage.js","sourceRoot":"","sources":["../../src/mock/mock-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operations the CLI mock implements. Generated-adjacent: keep this list in
|
|
3
|
+
* sync with handlers in mock-server.ts. Contract tests assert every id here
|
|
4
|
+
* works on mock; anything else must refuse with not_implemented_in_mock.
|
|
5
|
+
*
|
|
6
|
+
* Source of truth for the *prod* surface remains api.kody.codes/openapi.json
|
|
7
|
+
* plus CapabilityProxy paths. When adding a mock handler, add its id here.
|
|
8
|
+
*/
|
|
9
|
+
/** Open API operationIds the mock answers. */
|
|
10
|
+
export declare const mockOpenApiOperationIds: readonly ["search", "metaGetCurrentUser", "usageGet"];
|
|
11
|
+
/** CapabilityProxy `path` joins (dot form) the mock answers under kody.*. */
|
|
12
|
+
export declare const mockCapabilityPaths: readonly ["kody.metaGetCurrentUser", "kody.search", "kody.execute", "kody.usageGet", "kody.__mockPackageStorageGet", "kody.__mockPackageStorageSet", "kody.__mockPackageStorageDelete", "kody.__mockPackageStorageList", "kody.credentialClientOpen", "kody.credentialClientCheck"];
|
|
13
|
+
export type MockOpenApiOperationId = (typeof mockOpenApiOperationIds)[number];
|
|
14
|
+
export type MockCapabilityPath = (typeof mockCapabilityPaths)[number];
|
|
15
|
+
export declare function isMockOpenApiOperation(id: string): id is MockOpenApiOperationId;
|
|
16
|
+
export declare function isMockCapabilityPath(pathKey: string): pathKey is MockCapabilityPath;
|
|
17
|
+
/** CapabilityProxy routes always present on every target. */
|
|
18
|
+
export declare const mockCapabilityProxyRoutes: readonly ["GET /v1/capability-proxy/session", "POST /v1/capability-proxy/call", "POST /v1/local-execute/package-graph"];
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Operations the CLI mock implements. Generated-adjacent: keep this list in
|
|
3
|
+
* sync with handlers in mock-server.ts. Contract tests assert every id here
|
|
4
|
+
* works on mock; anything else must refuse with not_implemented_in_mock.
|
|
5
|
+
*
|
|
6
|
+
* Source of truth for the *prod* surface remains api.kody.codes/openapi.json
|
|
7
|
+
* plus CapabilityProxy paths. When adding a mock handler, add its id here.
|
|
8
|
+
*/
|
|
9
|
+
/** Open API operationIds the mock answers. */
|
|
10
|
+
export const mockOpenApiOperationIds = [
|
|
11
|
+
'search',
|
|
12
|
+
'metaGetCurrentUser',
|
|
13
|
+
'usageGet',
|
|
14
|
+
];
|
|
15
|
+
/** CapabilityProxy `path` joins (dot form) the mock answers under kody.*. */
|
|
16
|
+
export const mockCapabilityPaths = [
|
|
17
|
+
'kody.metaGetCurrentUser',
|
|
18
|
+
'kody.search',
|
|
19
|
+
'kody.execute',
|
|
20
|
+
'kody.usageGet',
|
|
21
|
+
// Local package scratch storage via capability hops used by packageStorage()
|
|
22
|
+
// bridging in the mock runtime (see mock-server call dispatch).
|
|
23
|
+
'kody.__mockPackageStorageGet',
|
|
24
|
+
'kody.__mockPackageStorageSet',
|
|
25
|
+
'kody.__mockPackageStorageDelete',
|
|
26
|
+
'kody.__mockPackageStorageList',
|
|
27
|
+
// Credential client open returns fake metadata only (never prod secrets).
|
|
28
|
+
'kody.credentialClientOpen',
|
|
29
|
+
'kody.credentialClientCheck',
|
|
30
|
+
];
|
|
31
|
+
export function isMockOpenApiOperation(id) {
|
|
32
|
+
return mockOpenApiOperationIds.includes(id);
|
|
33
|
+
}
|
|
34
|
+
export function isMockCapabilityPath(pathKey) {
|
|
35
|
+
return mockCapabilityPaths.includes(pathKey);
|
|
36
|
+
}
|
|
37
|
+
/** CapabilityProxy routes always present on every target. */
|
|
38
|
+
export const mockCapabilityProxyRoutes = [
|
|
39
|
+
'GET /v1/capability-proxy/session',
|
|
40
|
+
'POST /v1/capability-proxy/call',
|
|
41
|
+
'POST /v1/local-execute/package-graph',
|
|
42
|
+
];
|
|
43
|
+
//# sourceMappingURL=mock-supported.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-supported.js","sourceRoot":"","sources":["../../src/mock/mock-supported.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,8CAA8C;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACtC,QAAQ;IACR,oBAAoB;IACpB,UAAU;CACD,CAAA;AAEV,6EAA6E;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAClC,yBAAyB;IACzB,aAAa;IACb,cAAc;IACd,eAAe;IACf,6EAA6E;IAC7E,gEAAgE;IAChE,8BAA8B;IAC9B,8BAA8B;IAC9B,iCAAiC;IACjC,+BAA+B;IAC/B,0EAA0E;IAC1E,2BAA2B;IAC3B,4BAA4B;CACnB,CAAA;AAKV,MAAM,UAAU,sBAAsB,CAAC,EAAU;IAChD,OAAQ,uBAAiD,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;AACvE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe;IACnD,OAAQ,mBAA6C,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;AACxE,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACxC,kCAAkC;IAClC,gCAAgC;IAChC,sCAAsC;CAC7B,CAAA"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Long-running `kody dev` app server: bundles `kody.app.entry` the same way
|
|
3
|
+
* local-bundle/publish does for esbuild, serves via workerd, strips the mount
|
|
4
|
+
* at the Node proxy, and rebuilds on file changes.
|
|
5
|
+
*/
|
|
6
|
+
import { type PackageLocalContext } from './package-local-runtime-source.js';
|
|
7
|
+
import type { KodyPackageManifest } from './package-manifest.js';
|
|
8
|
+
import type { KodyTarget } from './target.js';
|
|
9
|
+
export type PackageAppDevOptions = {
|
|
10
|
+
manifest: KodyPackageManifest;
|
|
11
|
+
token: string;
|
|
12
|
+
apiUrl: string;
|
|
13
|
+
target: KodyTarget;
|
|
14
|
+
host?: string;
|
|
15
|
+
port?: number;
|
|
16
|
+
/** Public mount path the Node proxy strips (default ''). */
|
|
17
|
+
appBasePath?: string;
|
|
18
|
+
allowPrivateNetwork?: boolean;
|
|
19
|
+
workerdPath?: string;
|
|
20
|
+
fetchFn?: typeof fetch;
|
|
21
|
+
/** Hot reload via fs.watch (default true). One-shot `dev fetch` turns this off. */
|
|
22
|
+
watch?: boolean;
|
|
23
|
+
onStatus?: (message: string) => void;
|
|
24
|
+
onError?: (message: string) => void;
|
|
25
|
+
};
|
|
26
|
+
export type PackageAppDevServer = {
|
|
27
|
+
url: string;
|
|
28
|
+
port: number;
|
|
29
|
+
hostedUrl: string;
|
|
30
|
+
appBasePath: string;
|
|
31
|
+
packageContext: PackageLocalContext;
|
|
32
|
+
fetchPath: (path: string, init?: {
|
|
33
|
+
method?: string;
|
|
34
|
+
headers?: Record<string, string>;
|
|
35
|
+
body?: string;
|
|
36
|
+
}) => Promise<{
|
|
37
|
+
status: number;
|
|
38
|
+
headers: Record<string, string>;
|
|
39
|
+
body: string;
|
|
40
|
+
}>;
|
|
41
|
+
close: () => Promise<void>;
|
|
42
|
+
};
|
|
43
|
+
export declare function startPackageAppDev(options: PackageAppDevOptions): Promise<PackageAppDevServer>;
|