@kodycodes/cli 1.24.1 → 1.25.1

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.
Files changed (48) hide show
  1. package/README.md +33 -2
  2. package/dist/capability-proxy.d.ts +37 -0
  3. package/dist/capability-proxy.js +144 -0
  4. package/dist/capability-proxy.js.map +1 -1
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +19 -1
  7. package/dist/cli.js.map +1 -1
  8. package/dist/dev/dev-registry.d.ts +77 -0
  9. package/dist/dev/dev-registry.js +95 -0
  10. package/dist/dev/dev-registry.js.map +1 -0
  11. package/dist/dev/dev-watcher.d.ts +19 -2
  12. package/dist/dev/dev-watcher.js +56 -8
  13. package/dist/dev/dev-watcher.js.map +1 -1
  14. package/dist/dev/live-reload.d.ts +5 -0
  15. package/dist/dev/live-reload.js +6 -0
  16. package/dist/dev/live-reload.js.map +1 -1
  17. package/dist/dev-command.d.ts +23 -0
  18. package/dist/dev-command.js +118 -10
  19. package/dist/dev-command.js.map +1 -1
  20. package/dist/help.js +9 -2
  21. package/dist/help.js.map +1 -1
  22. package/dist/local-execute.js +14 -50
  23. package/dist/local-execute.js.map +1 -1
  24. package/dist/local-gateway-fetch-forward.d.ts +16 -0
  25. package/dist/local-gateway-fetch-forward.js +135 -0
  26. package/dist/local-gateway-fetch-forward.js.map +1 -0
  27. package/dist/local-host-runtime-surface.d.ts +55 -0
  28. package/dist/local-host-runtime-surface.js +75 -0
  29. package/dist/local-host-runtime-surface.js.map +1 -0
  30. package/dist/local-package-graph.js +23 -1
  31. package/dist/local-package-graph.js.map +1 -1
  32. package/dist/local-package-run.js +14 -50
  33. package/dist/local-package-run.js.map +1 -1
  34. package/dist/local-runtime-bridge.d.ts +36 -0
  35. package/dist/local-runtime-bridge.js +128 -0
  36. package/dist/local-runtime-bridge.js.map +1 -0
  37. package/dist/local-runtime-source.d.ts +5 -0
  38. package/dist/local-runtime-source.js +158 -16
  39. package/dist/local-runtime-source.js.map +1 -1
  40. package/dist/mock/mock-supported.d.ts +1 -1
  41. package/dist/mock/mock-supported.js +1 -0
  42. package/dist/mock/mock-supported.js.map +1 -1
  43. package/dist/package-app-dev.d.ts +3 -0
  44. package/dist/package-app-dev.js +133 -59
  45. package/dist/package-app-dev.js.map +1 -1
  46. package/dist/package-local-runtime-source.js +44 -47
  47. package/dist/package-local-runtime-source.js.map +1 -1
  48. package/package.json +1 -1
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Loopback HTTP bridge between local workerd and the CLI host process.
3
+ *
4
+ * - `POST /call` — JSON CapabilityProxy hop (`{ path, args }` → `{ result|error }`)
5
+ * - `POST /gateway-fetch` — streaming gateway-fetch hop (raw body in/out)
6
+ */
7
+ import { createServer, } from 'node:http';
8
+ import { Readable } from 'node:stream';
9
+ import { redact } from './redact.js';
10
+ import { runSecretHeader } from './local-runtime-source.js';
11
+ export const localBridgeCallPath = '/call';
12
+ export const localBridgeGatewayFetchPath = '/gateway-fetch';
13
+ export async function startLocalRuntimeBridge(input) {
14
+ const inFlight = new AbortController();
15
+ const server = createServer(async (request, response) => {
16
+ const replyJson = (status, body, headers = {}) => {
17
+ response.writeHead(status, {
18
+ 'content-type': 'application/json',
19
+ ...headers,
20
+ });
21
+ response.end(JSON.stringify(body));
22
+ };
23
+ /** Open API-shaped error so workerd `gatewayFetchStream` throws (needs no-store). */
24
+ const replyGatewayFetchError = (status, message, code) => {
25
+ replyJson(status, { error: { code, message } }, { 'Cache-Control': 'no-store' });
26
+ };
27
+ if (request.headers[runSecretHeader] !== input.runSecret) {
28
+ replyJson(403, { error: 'Forbidden' });
29
+ return;
30
+ }
31
+ if (request.method === 'POST' && request.url === localBridgeCallPath) {
32
+ try {
33
+ const call = parseBridgeCall(await readBodyText(request));
34
+ const result = await input.forwardCall(call, inFlight.signal);
35
+ replyJson(200, { result });
36
+ }
37
+ catch (error) {
38
+ replyJson(200, {
39
+ error: redact(error instanceof Error ? error.message : String(error)),
40
+ });
41
+ }
42
+ return;
43
+ }
44
+ if (request.method === 'POST' && request.url === localBridgeGatewayFetchPath) {
45
+ try {
46
+ await input.forwardGatewayFetchStream({
47
+ request,
48
+ response,
49
+ signal: inFlight.signal,
50
+ });
51
+ }
52
+ catch (error) {
53
+ if (response.headersSent) {
54
+ response.destroy(error instanceof Error ? error : new Error(String(error)));
55
+ return;
56
+ }
57
+ replyGatewayFetchError(502, redact(error instanceof Error ? error.message : String(error)), 'gateway_fetch_failed');
58
+ }
59
+ return;
60
+ }
61
+ replyJson(403, { error: 'Forbidden' });
62
+ });
63
+ await new Promise((resolve, reject) => {
64
+ server.once('error', reject);
65
+ server.listen(0, '127.0.0.1', () => resolve());
66
+ });
67
+ return {
68
+ port: server.address().port,
69
+ close: () => new Promise((resolve) => {
70
+ inFlight.abort();
71
+ server.closeAllConnections();
72
+ server.close(() => resolve());
73
+ }),
74
+ };
75
+ }
76
+ export function parseBridgeCall(body) {
77
+ const parsed = JSON.parse(body);
78
+ if (!Array.isArray(parsed.path) ||
79
+ parsed.path.length === 0 ||
80
+ !parsed.path.every((segment) => typeof segment === 'string')) {
81
+ throw new Error('Invalid kody:runtime call path.');
82
+ }
83
+ return {
84
+ path: parsed.path,
85
+ args: Array.isArray(parsed.args) ? parsed.args : [],
86
+ };
87
+ }
88
+ export async function readBodyText(stream) {
89
+ const chunks = [];
90
+ for await (const chunk of stream) {
91
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
92
+ }
93
+ return Buffer.concat(chunks).toString('utf8');
94
+ }
95
+ export async function readBodyBuffer(stream) {
96
+ const chunks = [];
97
+ for await (const chunk of stream) {
98
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
99
+ }
100
+ return Buffer.concat(chunks);
101
+ }
102
+ /** Write a Web `Response` onto a Node `ServerResponse` (streams the body). */
103
+ export async function writeWebResponse(response, web) {
104
+ const headers = {};
105
+ web.headers.forEach((value, name) => {
106
+ const existing = headers[name];
107
+ if (existing === undefined) {
108
+ headers[name] = value;
109
+ return;
110
+ }
111
+ headers[name] = Array.isArray(existing)
112
+ ? [...existing, value]
113
+ : [existing, value];
114
+ });
115
+ response.writeHead(web.status, web.statusText, headers);
116
+ if (!web.body) {
117
+ response.end();
118
+ return;
119
+ }
120
+ const nodeStream = Readable.fromWeb(web.body);
121
+ await new Promise((resolve, reject) => {
122
+ nodeStream.on('error', reject);
123
+ response.on('error', reject);
124
+ response.on('finish', () => resolve());
125
+ nodeStream.pipe(response);
126
+ });
127
+ }
128
+ //# sourceMappingURL=local-runtime-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-runtime-bridge.js","sourceRoot":"","sources":["../src/local-runtime-bridge.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,11 @@ export declare const kodyRuntimeStorageSymbolDescription = "kody.runtimeStorage"
38
38
  * `export *` omits `default`, so re-export it explicitly.
39
39
  */
40
40
  export declare function createRuntimeFlatAliasSource(): string;
41
+ /** Workerd-side `kody.gatewayFetchStream` + bridge install helpers (shared shape). */
42
+ export declare function localGatewayFetchStreamRuntimeSource(options: {
43
+ /** Error when the JSON/call bridge is missing. */
44
+ callUnavailableMessage: string;
45
+ }): string;
41
46
  export declare function createLocalRuntimeModuleSource(): string;
42
47
  /**
43
48
  * Local workerd entry. Optional `sideEffectModules` are imported for their
@@ -42,21 +42,136 @@ export function createRuntimeFlatAliasSource() {
42
42
  const runtime = JSON.stringify(localWorkerModuleNames.runtime);
43
43
  return `export * from ${runtime};\nexport { default } from ${runtime};\n`;
44
44
  }
45
- export function createLocalRuntimeModuleSource() {
45
+ /** Workerd-side `kody.gatewayFetchStream` + bridge install helpers (shared shape). */
46
+ export function localGatewayFetchStreamRuntimeSource(options) {
46
47
  return `
47
- import { AsyncLocalStorage } from 'node:async_hooks';
48
-
49
48
  let __kodyBridge = null;
50
49
 
51
50
  export function __kodyInstallLocalBridge(bridge) {
52
- __kodyBridge = bridge;
51
+ // Object form: { call, gatewayFetch }. Legacy function form still works for /call.
52
+ __kodyBridge =
53
+ typeof bridge === 'function' ? { call: bridge, gatewayFetch: null } : bridge;
53
54
  }
54
55
 
55
56
  function __kodyCall(path, args) {
56
- if (__kodyBridge === null) {
57
- throw new Error('kody:runtime is only available while an execute --local run is in progress.');
57
+ if (__kodyBridge === null || typeof __kodyBridge.call !== 'function') {
58
+ throw new Error(${JSON.stringify(options.callUnavailableMessage)});
58
59
  }
59
- return __kodyBridge(path, args);
60
+ return __kodyBridge.call(path, args);
61
+ }
62
+
63
+ const __kodyGatewayNullBodyStatuses = new Set([101, 103, 204, 205, 304]);
64
+ const __kodySecretResolutionHeader = 'x-kody-secret-resolution';
65
+
66
+ /**
67
+ * Streaming CapabilityProxy hop (POST /v1/capability-proxy/gateway-fetch via the
68
+ * loopback bridge). Returns a real Response — not the JSON gatewayFetch envelope.
69
+ * See kentcdodds/kody docs/contributing/contracts/cli-streaming-gateway-fetch.md.
70
+ */
71
+ async function gatewayFetchStream(input) {
72
+ if (__kodyBridge === null || typeof __kodyBridge.gatewayFetch !== 'function') {
73
+ throw new Error(
74
+ 'Local execute needs kody.gatewayFetchStream on the host runtime to stream a secret-aware fetch body (multipart, large, or ReadableStream). Upgrade @kodycodes/cli, or buffer the body under 4 MiB for the JSON gatewayFetch hop.',
75
+ );
76
+ }
77
+ const record = input != null && typeof input === 'object' && !Array.isArray(input) ? input : null;
78
+ if (!record) {
79
+ throw new Error('gatewayFetchStream requires a single object argument: { request, packageId? }.');
80
+ }
81
+ const requestValue = record.request;
82
+ if (requestValue == null || typeof requestValue !== 'object' || Array.isArray(requestValue)) {
83
+ throw new Error('gatewayFetchStream requires request: { url, method?, headers?, body? }.');
84
+ }
85
+ const url = typeof requestValue.url === 'string' ? requestValue.url.trim() : '';
86
+ if (!url) {
87
+ throw new Error('gatewayFetchStream request.url must be a non-empty absolute URL.');
88
+ }
89
+ const method =
90
+ typeof requestValue.method === 'string' && requestValue.method.trim()
91
+ ? requestValue.method.trim()
92
+ : 'GET';
93
+ const packageId =
94
+ typeof record.packageId === 'string' && record.packageId.trim()
95
+ ? record.packageId.trim()
96
+ : undefined;
97
+ const rawHeaders =
98
+ requestValue.headers != null &&
99
+ typeof requestValue.headers === 'object' &&
100
+ !Array.isArray(requestValue.headers)
101
+ ? { ...requestValue.headers }
102
+ : {};
103
+ const outboundHeaders = {};
104
+ let contentType = null;
105
+ let secretResolution = null;
106
+ for (const [key, value] of Object.entries(rawHeaders)) {
107
+ if (typeof value !== 'string') continue;
108
+ const lower = key.toLowerCase();
109
+ if (lower === 'content-type') {
110
+ contentType = value;
111
+ continue;
112
+ }
113
+ if (lower === __kodySecretResolutionHeader) {
114
+ secretResolution = value;
115
+ continue;
116
+ }
117
+ outboundHeaders[key] = value;
118
+ }
119
+ const headers = {
120
+ 'X-Kody-Gateway-Url': url,
121
+ 'X-Kody-Gateway-Method': method,
122
+ };
123
+ if (packageId) headers['X-Kody-Gateway-Package-Id'] = packageId;
124
+ if (Object.keys(outboundHeaders).length > 0) {
125
+ headers['X-Kody-Gateway-Headers'] = JSON.stringify(outboundHeaders);
126
+ }
127
+ if (contentType) headers['Content-Type'] = contentType;
128
+ if (secretResolution) headers[__kodySecretResolutionHeader] = secretResolution;
129
+ const body = Object.hasOwn(requestValue, 'body') ? requestValue.body : null;
130
+ const init = {
131
+ method: 'POST',
132
+ headers,
133
+ };
134
+ const upper = method.toUpperCase();
135
+ if (body != null && upper !== 'GET' && upper !== 'HEAD') {
136
+ init.body = body;
137
+ init.duplex = 'half';
138
+ }
139
+ if (requestValue.signal != null) init.signal = requestValue.signal;
140
+ if (requestValue.redirect != null) init.redirect = requestValue.redirect;
141
+ const response = await __kodyBridge.gatewayFetch(init);
142
+ const cacheControl = response.headers.get('cache-control') ?? '';
143
+ const contentTypeHeader = response.headers.get('content-type') ?? '';
144
+ if (response.status === 413 && !contentTypeHeader.includes('application/json')) {
145
+ throw new Error(
146
+ 'Request body exceeds the Worker upload limit of 104857600 bytes (100 MiB).',
147
+ );
148
+ }
149
+ if (cacheControl.includes('no-store') && contentTypeHeader.includes('application/json')) {
150
+ const text = await response.clone().text();
151
+ try {
152
+ const parsed = JSON.parse(text);
153
+ if (parsed != null && typeof parsed === 'object' && parsed.error != null) {
154
+ const err = parsed.error;
155
+ const message =
156
+ typeof err === 'string'
157
+ ? err
158
+ : typeof err?.message === 'string'
159
+ ? err.message
160
+ : 'gatewayFetchStream failed.';
161
+ throw new Error(message);
162
+ }
163
+ } catch (error) {
164
+ if (!(error instanceof SyntaxError)) throw error;
165
+ }
166
+ }
167
+ if (__kodyGatewayNullBodyStatuses.has(response.status)) {
168
+ return new Response(null, {
169
+ status: response.status,
170
+ statusText: response.statusText,
171
+ headers: response.headers,
172
+ });
173
+ }
174
+ return response;
60
175
  }
61
176
 
62
177
  function __kodyNamespace(path) {
@@ -67,6 +182,13 @@ function __kodyNamespace(path) {
67
182
  return undefined;
68
183
  }
69
184
  if (property === 'toString' || property === 'inspect') return () => label;
185
+ if (
186
+ path.length === 1 &&
187
+ path[0] === 'kody' &&
188
+ property === 'gatewayFetchStream'
189
+ ) {
190
+ return gatewayFetchStream;
191
+ }
70
192
  return __kodyNamespace([...path, property]);
71
193
  },
72
194
  apply(_target, _thisArg, args) {
@@ -74,6 +196,15 @@ function __kodyNamespace(path) {
74
196
  },
75
197
  });
76
198
  }
199
+ `.trimStart();
200
+ }
201
+ export function createLocalRuntimeModuleSource() {
202
+ return `
203
+ import { AsyncLocalStorage } from 'node:async_hooks';
204
+
205
+ ${localGatewayFetchStreamRuntimeSource({
206
+ callUnavailableMessage: 'kody:runtime is only available while an execute --local run is in progress.',
207
+ })}
77
208
 
78
209
  export const kody = __kodyNamespace(['kody']);
79
210
 
@@ -303,15 +434,26 @@ export default {
303
434
  }
304
435
  __kodyClaimed = true;
305
436
  const { params } = await request.json();
306
- __kodyInstallLocalBridge(async (path, args) => {
307
- const response = await env.KODY_BRIDGE.fetch('http://kody-bridge/call', {
308
- method: 'POST',
309
- headers: { 'content-type': 'application/json', [__kodyRunSecretHeader]: secret },
310
- body: JSON.stringify({ path, args }),
311
- });
312
- const data = await response.json();
313
- if (data.error) throw new Error(data.error);
314
- return data.result;
437
+ __kodyInstallLocalBridge({
438
+ call: async (path, args) => {
439
+ const response = await env.KODY_BRIDGE.fetch('http://kody-bridge/call', {
440
+ method: 'POST',
441
+ headers: { 'content-type': 'application/json', [__kodyRunSecretHeader]: secret },
442
+ body: JSON.stringify({ path, args }),
443
+ });
444
+ const data = await response.json();
445
+ if (data.error) throw new Error(data.error);
446
+ return data.result;
447
+ },
448
+ gatewayFetch: async (init) => {
449
+ const headers = new Headers(init?.headers);
450
+ headers.set(__kodyRunSecretHeader, secret);
451
+ return await env.KODY_BRIDGE.fetch('http://kody-bridge/gateway-fetch', {
452
+ ...init,
453
+ method: 'POST',
454
+ headers,
455
+ });
456
+ },
315
457
  });
316
458
  const logs = [];
317
459
  const nativeConsole = globalThis.console;
@@ -1 +1 @@
1
- {"version":3,"file":"local-runtime-source.js","sourceRoot":"","sources":["../src/local-runtime-source.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-runtime-source.js","sourceRoot":"","sources":["../src/local-runtime-source.ts"],"names":[],"mappings":"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"}
@@ -15,4 +15,4 @@ export type MockCapabilityPath = (typeof mockCapabilityPaths)[number];
15
15
  export declare function isMockOpenApiOperation(id: string): id is MockOpenApiOperationId;
16
16
  export declare function isMockCapabilityPath(pathKey: string): pathKey is MockCapabilityPath;
17
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"];
18
+ export declare const mockCapabilityProxyRoutes: readonly ["GET /v1/capability-proxy/session", "POST /v1/capability-proxy/call", "POST /v1/capability-proxy/gateway-fetch", "POST /v1/local-execute/package-graph"];
@@ -57,6 +57,7 @@ export function isMockCapabilityPath(pathKey) {
57
57
  export const mockCapabilityProxyRoutes = [
58
58
  'GET /v1/capability-proxy/session',
59
59
  'POST /v1/capability-proxy/call',
60
+ 'POST /v1/capability-proxy/gateway-fetch',
60
61
  'POST /v1/local-execute/package-graph',
61
62
  ];
62
63
  //# sourceMappingURL=mock-supported.js.map
@@ -1 +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,8BAA8B;IAC9B,yEAAyE;IACzE,8DAA8D;IAC9D,wBAAwB;IACxB,wBAAwB;IACxB,2BAA2B;IAC3B,yBAAyB;IACzB,wBAAwB;IACxB,wEAAwE;IACxE,2BAA2B;IAC3B,8BAA8B;IAC9B,4BAA4B;IAC5B,8BAA8B;IAC9B,yEAAyE;IACzE,4EAA4E;IAC5E,wEAAwE;IACxE,0DAA0D;IAC1D,yBAAyB;IACzB,mBAAmB;IACnB,yBAAyB;IACzB,8EAA8E;IAC9E,oBAAoB;CACX,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"}
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,8BAA8B;IAC9B,yEAAyE;IACzE,8DAA8D;IAC9D,wBAAwB;IACxB,wBAAwB;IACxB,2BAA2B;IAC3B,yBAAyB;IACzB,wBAAwB;IACxB,wEAAwE;IACxE,2BAA2B;IAC3B,8BAA8B;IAC9B,4BAA4B;IAC5B,8BAA8B;IAC9B,yEAAyE;IACzE,4EAA4E;IAC5E,wEAAwE;IACxE,0DAA0D;IAC1D,yBAAyB;IACzB,mBAAmB;IACnB,yBAAyB;IACzB,8EAA8E;IAC9E,oBAAoB;CACX,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,yCAAyC;IACzC,sCAAsC;CAC7B,CAAA"}
@@ -9,6 +9,7 @@
9
9
  * so a save is never answered by a 503 or a stale bundle.
10
10
  */
11
11
  import { type DevEvent } from './dev/dev-events.js';
12
+ import { type DevServerStatus } from './dev/dev-registry.js';
12
13
  import { type PackageLocalContext } from './package-local-runtime-source.js';
13
14
  import type { KodyPackageManifest } from './package-manifest.js';
14
15
  import type { KodyTarget } from './target.js';
@@ -73,6 +74,8 @@ export type PackageAppDevServer = {
73
74
  headers: Record<string, string>;
74
75
  body: string;
75
76
  }>;
77
+ /** Same JSON as `GET /__kody/dev/status`. */
78
+ status: () => DevServerStatus;
76
79
  close: () => Promise<void>;
77
80
  };
78
81
  export declare function startPackageAppDev(options: PackageAppDevOptions): Promise<PackageAppDevServer>;