@kindgi/handler-runtime 0.0.0-bootstrap.0 → 0.1.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.
Files changed (68) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +218 -2
  3. package/dist/build-extensions.d.ts +75 -0
  4. package/dist/build-extensions.d.ts.map +1 -0
  5. package/dist/build-extensions.js +27 -0
  6. package/dist/build-extensions.js.map +1 -0
  7. package/dist/discovery.d.ts +19 -0
  8. package/dist/discovery.d.ts.map +1 -0
  9. package/dist/discovery.js +81 -0
  10. package/dist/discovery.js.map +1 -0
  11. package/dist/entrypoint.d.ts +10 -0
  12. package/dist/entrypoint.d.ts.map +1 -0
  13. package/dist/entrypoint.js +24 -0
  14. package/dist/entrypoint.js.map +1 -0
  15. package/dist/handler-runner.d.ts +127 -0
  16. package/dist/handler-runner.d.ts.map +1 -0
  17. package/dist/handler-runner.js +318 -0
  18. package/dist/handler-runner.js.map +1 -0
  19. package/dist/index.d.ts +8 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +7 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/kindgi-index-main.d.ts +2 -0
  24. package/dist/kindgi-index-main.d.ts.map +1 -0
  25. package/dist/kindgi-index-main.js +15 -0
  26. package/dist/kindgi-index-main.js.map +1 -0
  27. package/dist/kindgi-index.d.ts +316 -0
  28. package/dist/kindgi-index.d.ts.map +1 -0
  29. package/dist/kindgi-index.js +1201 -0
  30. package/dist/kindgi-index.js.map +1 -0
  31. package/dist/pack-env.d.ts +66 -0
  32. package/dist/pack-env.d.ts.map +1 -0
  33. package/dist/pack-env.js +97 -0
  34. package/dist/pack-env.js.map +1 -0
  35. package/dist/pack-service/index.d.ts +7 -0
  36. package/dist/pack-service/index.d.ts.map +1 -0
  37. package/dist/pack-service/index.js +6 -0
  38. package/dist/pack-service/index.js.map +1 -0
  39. package/dist/pack-service/main.d.ts +47 -0
  40. package/dist/pack-service/main.d.ts.map +1 -0
  41. package/dist/pack-service/main.js +201 -0
  42. package/dist/pack-service/main.js.map +1 -0
  43. package/dist/pack-service/service.d.ts +61 -0
  44. package/dist/pack-service/service.d.ts.map +1 -0
  45. package/dist/pack-service/service.js +341 -0
  46. package/dist/pack-service/service.js.map +1 -0
  47. package/dist/pack-service/supervisor.d.ts +138 -0
  48. package/dist/pack-service/supervisor.d.ts.map +1 -0
  49. package/dist/pack-service/supervisor.js +424 -0
  50. package/dist/pack-service/supervisor.js.map +1 -0
  51. package/dist/protocol.d.ts +104 -0
  52. package/dist/protocol.d.ts.map +1 -0
  53. package/dist/protocol.js +116 -0
  54. package/dist/protocol.js.map +1 -0
  55. package/package.json +87 -4
  56. package/src/build-extensions.ts +100 -0
  57. package/src/discovery.ts +89 -0
  58. package/src/entrypoint.ts +23 -0
  59. package/src/handler-runner.ts +500 -0
  60. package/src/index.ts +66 -0
  61. package/src/kindgi-index-main.ts +17 -0
  62. package/src/kindgi-index.ts +1605 -0
  63. package/src/pack-env.ts +148 -0
  64. package/src/pack-service/index.ts +17 -0
  65. package/src/pack-service/main.ts +246 -0
  66. package/src/pack-service/service.ts +478 -0
  67. package/src/pack-service/supervisor.ts +600 -0
  68. package/src/protocol.ts +214 -0
@@ -0,0 +1,424 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ /**
4
+ * The pack service as a local child process behind a stable front — how
5
+ * a development loop runs pack code: the same entrypoint and protocol as
6
+ * a deployment, on loopback, with a token only this process knows.
7
+ *
8
+ * The front is one HTTP listener for the supervisor's whole life: a fixed
9
+ * address, the session token. It forwards `POST /v1/invoke` and
10
+ * `GET /v1/info` to whichever child is serving and answers 503 while none
11
+ * is — a caller retries those, since the call provably did not run.
12
+ * `/healthz` answers 200 while the front listens; `/readyz` 200 only while
13
+ * a child serves. So a caller holds one URL and one token however often
14
+ * the code changes.
15
+ *
16
+ * `start(indexPath)` boots a child on that index (loopback, any port).
17
+ * Once the child listens (it prewarms every module first), new calls go to
18
+ * it; the previous child finishes its in-flight calls (SIGTERM drains) and
19
+ * stops. If a child fails to boot, the previous one keeps serving. A child
20
+ * that exits on its own is restarted on the same index.
21
+ *
22
+ * The child's environment is exactly `env()` plus the token and `PORT=0`
23
+ * — nothing of this process's own environment reaches pack code.
24
+ *
25
+ * Forwarding has two parts. The relay ({@link PackRelay}) takes a request
26
+ * body and the call's options — deadline, run and request ids, a cancel
27
+ * signal — and calls the serving child. The HTTP listener maps headers and
28
+ * a closed connection onto those options. Another listener (one that
29
+ * receives calls over a connection the pack side opened) can reuse the
30
+ * relay unchanged.
31
+ */
32
+ import { spawn } from 'node:child_process';
33
+ import { randomBytes, timingSafeEqual } from 'node:crypto';
34
+ import { createServer } from 'node:http';
35
+ import { createInterface } from 'node:readline';
36
+ import { PACK_HEADERS } from '../protocol.js';
37
+ import { PACK_SERVICE_DRAIN_MS } from './main.js';
38
+ const DEFAULT_HOST = '127.0.0.1';
39
+ const DEFAULT_BOOT_TIMEOUT_MS = 60_000;
40
+ const DEFAULT_STOP_GRACE_MS = PACK_SERVICE_DRAIN_MS + 2_000;
41
+ const DEFAULT_MAX_RESTARTS = 3;
42
+ const DEFAULT_RESTART_DELAY_MS = 500;
43
+ const DEFAULT_MAX_BODY_BYTES = 10 * 1024 * 1024;
44
+ /** A token a caller supplies: as long as a generated one (24 bytes, base64url). */
45
+ const PACK_SERVICE_TOKEN = /^[A-Za-z0-9_-]{32,}$/;
46
+ /** Headers of a child's answer that the front passes on. */
47
+ const ANSWER_HEADERS = [
48
+ 'content-type',
49
+ 'retry-after',
50
+ PACK_HEADERS.artifactVersion,
51
+ PACK_HEADERS.durationMs,
52
+ ];
53
+ export function createPackServiceSupervisor(options) {
54
+ if (options.token !== undefined && !PACK_SERVICE_TOKEN.test(options.token)) {
55
+ throw new Error('A pack service token is at least 32 URL-safe base64 characters.');
56
+ }
57
+ const token = options.token ?? randomBytes(24).toString('base64url');
58
+ const expectedToken = Buffer.from(token);
59
+ const emit = (event) => options.onEvent?.(event);
60
+ let serving;
61
+ let stopped = false;
62
+ let restarts = 0;
63
+ let front;
64
+ async function boot(indexPath) {
65
+ const env = { ...(await options.env()), KINDGI_PACK_SERVICE_TOKEN: token, PORT: '0' };
66
+ const [program, ...args] = options.command;
67
+ const child = spawn(program, [...args, '--index', indexPath, '--module-root', options.moduleRoot, '--host', DEFAULT_HOST], { env, stdio: ['ignore', 'pipe', 'pipe'] });
68
+ pipeLines(child.stdout, (line) => options.onLog?.(line, 'stdout'));
69
+ return listening(child, indexPath);
70
+ }
71
+ /** Resolves once the child listens, or with why it never will. */
72
+ function listening(child, indexPath) {
73
+ const bootTimeoutMs = options.bootTimeoutMs ?? DEFAULT_BOOT_TIMEOUT_MS;
74
+ return new Promise((resolve) => {
75
+ const problems = [];
76
+ // A promise settles once; later calls (an exit after listening) are no-ops.
77
+ const done = (outcome) => {
78
+ clearTimeout(timer);
79
+ resolve(outcome);
80
+ };
81
+ const fail = (reasons) => done({ kind: 'err', error: { problems: reasons } });
82
+ const timer = setTimeout(() => {
83
+ child.kill('SIGKILL');
84
+ fail([`The pack service did not listen within ${bootTimeoutMs} ms`]);
85
+ }, bootTimeoutMs);
86
+ pipeLines(child.stderr, (line) => {
87
+ const event = serviceEvent(line);
88
+ if (event === undefined) {
89
+ options.onLog?.(line, 'stderr');
90
+ }
91
+ else if (event.kind === 'listening' && typeof event.port === 'number') {
92
+ done({
93
+ kind: 'ok',
94
+ value: { process: child, port: event.port, indexPath, retiring: false },
95
+ });
96
+ }
97
+ else if (event.kind === 'boot-failed' || event.kind === 'config-invalid') {
98
+ problems.push(...problemsOf(event));
99
+ }
100
+ else {
101
+ emit({ kind: 'log', event });
102
+ }
103
+ });
104
+ child.once('error', (cause) => fail([cause.message]));
105
+ child.once('exit', (code, signal) => fail(problems.length > 0
106
+ ? problems
107
+ : [`The pack service exited (${signal ?? code}) before listening`]));
108
+ });
109
+ }
110
+ /** A serving child that exits on its own is restarted on the same index. */
111
+ function watch(child) {
112
+ child.process.once('exit', (code, signal) => {
113
+ if (child.retiring || stopped)
114
+ return;
115
+ emit({ kind: 'exited', code, signal });
116
+ if (serving === child)
117
+ serving = undefined;
118
+ void recover(child.indexPath);
119
+ });
120
+ }
121
+ async function recover(indexPath) {
122
+ while (!stopped &&
123
+ serving === undefined &&
124
+ restarts < (options.maxRestarts ?? DEFAULT_MAX_RESTARTS)) {
125
+ restarts += 1;
126
+ emit({ kind: 'restarting', attempt: restarts });
127
+ await new Promise((r) => setTimeout(r, options.restartDelayMs ?? DEFAULT_RESTART_DELAY_MS));
128
+ if (stopped || serving !== undefined)
129
+ return;
130
+ const booted = await start(indexPath);
131
+ if (booted.kind === 'ok')
132
+ return;
133
+ }
134
+ if (!stopped && serving === undefined)
135
+ emit({ kind: 'gave-up', attempts: restarts });
136
+ }
137
+ async function retire(child) {
138
+ if (child === undefined)
139
+ return;
140
+ child.retiring = true;
141
+ if (child.process.exitCode !== null || child.process.signalCode !== null)
142
+ return;
143
+ const exited = new Promise((done) => child.process.once('exit', () => done()));
144
+ child.process.kill('SIGTERM');
145
+ const grace = setTimeout(() => child.process.kill('SIGKILL'), options.stopGraceMs ?? DEFAULT_STOP_GRACE_MS);
146
+ await exited;
147
+ clearTimeout(grace);
148
+ }
149
+ async function start(indexPath) {
150
+ stopped = false;
151
+ const booted = await boot(indexPath);
152
+ if (booted.kind === 'err') {
153
+ emit({ kind: 'boot-failed', problems: booted.error.problems });
154
+ return booted;
155
+ }
156
+ const previous = serving;
157
+ serving = booted.value;
158
+ restarts = 0;
159
+ watch(booted.value);
160
+ emit({ kind: 'started', port: booted.value.port, indexPath });
161
+ await retire(previous);
162
+ return { kind: 'ok', value: { port: booted.value.port } };
163
+ }
164
+ async function stop() {
165
+ stopped = true;
166
+ const child = serving;
167
+ serving = undefined;
168
+ await retire(child);
169
+ }
170
+ const relay = {
171
+ serving: () => serving !== undefined,
172
+ forward: (call) => forwardToChild(serving?.port, token, call),
173
+ };
174
+ function authorized(req) {
175
+ const got = req.headers[PACK_HEADERS.token];
176
+ if (typeof got !== 'string')
177
+ return false;
178
+ const buf = Buffer.from(got);
179
+ return buf.length === expectedToken.length && timingSafeEqual(buf, expectedToken);
180
+ }
181
+ /** The HTTP listener: maps a request onto a relay call and the outcome onto a response. */
182
+ async function handle(req, res) {
183
+ const admitted = admit(req);
184
+ if (typeof admitted !== 'string') {
185
+ return sendJson(res, admitted.status, admitted.body, admitted.headers);
186
+ }
187
+ const body = admitted === 'invoke'
188
+ ? await readBody(req, options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES)
189
+ : undefined;
190
+ if (admitted === 'invoke' && body === undefined) {
191
+ return sendJson(res, 413, { error: 'Request body too large' });
192
+ }
193
+ // The caller gave up (closed the connection) before the answer: cancel the call.
194
+ const controller = new AbortController();
195
+ res.on('close', () => {
196
+ if (!res.writableEnded)
197
+ controller.abort();
198
+ });
199
+ const outcome = await relay.forward(relayCall(req, admitted, body, controller.signal));
200
+ if (!res.writableEnded && !res.destroyed)
201
+ writeOutcome(res, outcome);
202
+ }
203
+ /**
204
+ * The relay route for a request, or the front's own answer: an unknown
205
+ * route, a wrong method, a probe, a bad token.
206
+ */
207
+ function admit(req) {
208
+ const route = FRONT_ROUTES[(req.url ?? '/').split('?')[0] ?? ''];
209
+ if (route === undefined)
210
+ return { status: 404, body: { error: `No route ${req.url ?? '/'}` } };
211
+ if (req.method !== route.method)
212
+ return { status: 405, body: { error: `Use ${route.method}` } };
213
+ if (route.name === 'healthz' || route.name === 'readyz')
214
+ return probe(route.name);
215
+ if (!authorized(req))
216
+ return { status: 401, body: { error: 'Bad pack token' } };
217
+ return route.name;
218
+ }
219
+ /** `/healthz`: the front listens. `/readyz`: a child serves. Neither needs the token. */
220
+ function probe(name) {
221
+ if (name === 'healthz')
222
+ return { status: 200, body: { status: 'ok' } };
223
+ return relay.serving()
224
+ ? { status: 200, body: { status: 'ready' } }
225
+ : { status: 503, body: { error: 'no pack service' }, headers: RETRY_AFTER };
226
+ }
227
+ return {
228
+ token,
229
+ relay,
230
+ async listen() {
231
+ if (front !== undefined)
232
+ return { url: front.url, port: front.port };
233
+ const host = options.host ?? DEFAULT_HOST;
234
+ const server = createServer((req, res) => {
235
+ void handle(req, res).catch((cause) => {
236
+ if (!res.headersSent)
237
+ sendJson(res, 500, { error: describe(cause) });
238
+ else
239
+ res.destroy();
240
+ });
241
+ });
242
+ await new Promise((ready, failed) => {
243
+ server.once('error', failed);
244
+ server.listen(options.port ?? 0, host, () => {
245
+ server.off('error', failed);
246
+ ready();
247
+ });
248
+ });
249
+ const port = server.address().port;
250
+ front = { server, port, url: `http://${host.includes(':') ? `[${host}]` : host}:${port}` };
251
+ return { url: front.url, port };
252
+ },
253
+ start,
254
+ stop,
255
+ async close() {
256
+ await stop();
257
+ const closing = front;
258
+ front = undefined;
259
+ if (closing !== undefined) {
260
+ // No child serves any more; drop idle keep-alives and callers that went away.
261
+ const closed = new Promise((done) => closing.server.close(() => done()));
262
+ closing.server.closeAllConnections();
263
+ await closed;
264
+ }
265
+ },
266
+ };
267
+ }
268
+ /** Call the serving child on `port` with the session token. */
269
+ async function forwardToChild(port, token, call) {
270
+ if (port === undefined)
271
+ return { kind: 'unavailable', reason: 'no pack service' };
272
+ if (call.signal?.aborted)
273
+ return { kind: 'cancelled' };
274
+ let response;
275
+ try {
276
+ response = await fetch(`http://${DEFAULT_HOST}:${port}/v1/${call.route}`, {
277
+ method: call.route === 'invoke' ? 'POST' : 'GET',
278
+ headers: childHeaders(token, call),
279
+ ...(call.body !== undefined && { body: call.body }),
280
+ ...(call.signal !== undefined && { signal: call.signal }),
281
+ });
282
+ }
283
+ catch (cause) {
284
+ if (call.signal?.aborted)
285
+ return { kind: 'cancelled' };
286
+ return refused(cause)
287
+ ? { kind: 'unavailable', reason: 'the pack service refused the connection' }
288
+ : { kind: 'failed', reason: `the pack service did not answer: ${describe(cause)}` };
289
+ }
290
+ return answerFrom(response, call.signal);
291
+ }
292
+ function childHeaders(token, call) {
293
+ return {
294
+ [PACK_HEADERS.token]: token,
295
+ ...(call.body !== undefined && { 'content-type': 'application/json' }),
296
+ ...(call.timeoutMs !== undefined && { [PACK_HEADERS.timeoutMs]: String(call.timeoutMs) }),
297
+ ...(call.runId !== undefined && { [PACK_HEADERS.runId]: call.runId }),
298
+ ...(call.requestId !== undefined && { [PACK_HEADERS.requestId]: call.requestId }),
299
+ ...(call.protocol !== undefined && { [PACK_HEADERS.protocol]: call.protocol }),
300
+ };
301
+ }
302
+ async function answerFrom(response, signal) {
303
+ let body;
304
+ try {
305
+ body = await response.text();
306
+ }
307
+ catch (cause) {
308
+ if (signal?.aborted)
309
+ return { kind: 'cancelled' };
310
+ return { kind: 'failed', reason: `the pack service's answer broke off: ${describe(cause)}` };
311
+ }
312
+ const headers = {};
313
+ for (const name of ANSWER_HEADERS) {
314
+ const value = response.headers.get(name);
315
+ if (value !== null)
316
+ headers[name] = value;
317
+ }
318
+ return { kind: 'answer', status: response.status, headers, body };
319
+ }
320
+ /** The relay call for a front request. */
321
+ function relayCall(req, route, body, signal) {
322
+ const timeoutMs = Number(header(req, PACK_HEADERS.timeoutMs));
323
+ const runId = header(req, PACK_HEADERS.runId);
324
+ const requestId = header(req, PACK_HEADERS.requestId);
325
+ const protocol = header(req, PACK_HEADERS.protocol);
326
+ return {
327
+ route,
328
+ signal,
329
+ ...(body !== undefined && { body }),
330
+ ...(Number.isFinite(timeoutMs) && timeoutMs > 0 && { timeoutMs }),
331
+ ...(runId !== undefined && { runId }),
332
+ ...(requestId !== undefined && { requestId }),
333
+ ...(protocol !== undefined && { protocol }),
334
+ };
335
+ }
336
+ function writeOutcome(res, outcome) {
337
+ switch (outcome.kind) {
338
+ case 'answer':
339
+ res.writeHead(outcome.status, {
340
+ ...outcome.headers,
341
+ 'content-length': Buffer.byteLength(outcome.body),
342
+ });
343
+ res.end(outcome.body);
344
+ return;
345
+ case 'unavailable':
346
+ sendJson(res, 503, { error: outcome.reason }, RETRY_AFTER);
347
+ return;
348
+ case 'failed':
349
+ sendJson(res, 502, { error: outcome.reason });
350
+ return;
351
+ case 'cancelled':
352
+ res.destroy();
353
+ return;
354
+ }
355
+ }
356
+ const RETRY_AFTER = { 'retry-after': '1' };
357
+ const FRONT_ROUTES = {
358
+ '/v1/invoke': { name: 'invoke', method: 'POST' },
359
+ '/v1/info': { name: 'info', method: 'GET' },
360
+ '/healthz': { name: 'healthz', method: 'GET' },
361
+ '/readyz': { name: 'readyz', method: 'GET' },
362
+ };
363
+ /** A connection that never reached a listener: the call did not run. */
364
+ function refused(cause) {
365
+ const code = cause?.cause?.code;
366
+ return code === 'ECONNREFUSED';
367
+ }
368
+ function header(req, name) {
369
+ const value = req.headers[name];
370
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
371
+ }
372
+ /** The request body, or `undefined` past `limit` bytes. */
373
+ function readBody(req, limit) {
374
+ return new Promise((resolve, reject) => {
375
+ const chunks = [];
376
+ let size = 0;
377
+ let tooLarge = false;
378
+ req.on('data', (chunk) => {
379
+ size += chunk.length;
380
+ if (size > limit)
381
+ tooLarge = true;
382
+ else
383
+ chunks.push(chunk);
384
+ });
385
+ req.on('end', () => resolve(tooLarge ? undefined : Buffer.concat(chunks).toString('utf8')));
386
+ req.on('error', reject);
387
+ });
388
+ }
389
+ function sendJson(res, status, body, headers = {}) {
390
+ const text = JSON.stringify(body);
391
+ res.writeHead(status, {
392
+ 'content-type': 'application/json; charset=utf-8',
393
+ 'content-length': Buffer.byteLength(text),
394
+ ...headers,
395
+ });
396
+ res.end(text);
397
+ }
398
+ function pipeLines(stream, onLine) {
399
+ if (stream !== null)
400
+ createInterface({ input: stream }).on('line', onLine);
401
+ }
402
+ function problemsOf(event) {
403
+ return Array.isArray(event.problems) ? event.problems.map(String) : [];
404
+ }
405
+ /** The service's own log lines are JSON objects with a `kind`. */
406
+ function serviceEvent(line) {
407
+ if (!line.startsWith('{'))
408
+ return undefined;
409
+ try {
410
+ const parsed = JSON.parse(line);
411
+ return parsed !== null &&
412
+ typeof parsed === 'object' &&
413
+ typeof parsed.kind === 'string'
414
+ ? parsed
415
+ : undefined;
416
+ }
417
+ catch {
418
+ return undefined;
419
+ }
420
+ }
421
+ function describe(cause) {
422
+ return cause instanceof Error ? cause.message : String(cause);
423
+ }
424
+ //# sourceMappingURL=supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/pack-service/supervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Pack protocol v2 — the messages a runtime exchanges with a pack
3
+ * service (`./pack-service`) to run pack code: tool handlers and
4
+ * guardrail checks.
5
+ *
6
+ * A request names a tool or check by id; the pack service resolves it
7
+ * from its own `index.json`. The caller never chooses which module is
8
+ * imported, and the schemas that validate input and output are the
9
+ * ones the pack was built with.
10
+ *
11
+ * One request, one response. Every outcome of running pack code —
12
+ * success, a validation failure, a throw, a deadline, an unknown tool —
13
+ * is a response message. Transport problems (auth, overload, draining)
14
+ * are HTTP statuses, never messages.
15
+ */
16
+ /** Wire version of every v2 message. */
17
+ export declare const PACK_PROTOCOL_VERSION: 2;
18
+ export type PackProtocolVersion = typeof PACK_PROTOCOL_VERSION;
19
+ /** Per-call context a handler receives (serializable; no functions). */
20
+ export interface PackCallContext {
21
+ readonly tenantId: string;
22
+ /** The kernel run this call belongs to. */
23
+ readonly runId: string;
24
+ /** The individual call — e.g. the model's tool-call id. */
25
+ readonly requestId?: string;
26
+ readonly env?: Readonly<Record<string, unknown>>;
27
+ readonly secrets?: Readonly<Record<string, unknown>>;
28
+ readonly config?: Readonly<Record<string, unknown>>;
29
+ }
30
+ export interface ToolRef {
31
+ readonly id: string;
32
+ /** When set, the pack service refuses a different indexed version. */
33
+ readonly version?: string;
34
+ }
35
+ export interface CheckRef {
36
+ /** Guardrail check id (the indexed guardrail's `checkId`). */
37
+ readonly id: string;
38
+ }
39
+ export interface ToolInvokeMessage {
40
+ readonly v: PackProtocolVersion;
41
+ readonly kind: 'invoke';
42
+ readonly tool: ToolRef;
43
+ readonly input: unknown;
44
+ readonly ctx: PackCallContext;
45
+ }
46
+ export interface CheckInvokeMessage {
47
+ readonly v: PackProtocolVersion;
48
+ readonly kind: 'check-invoke';
49
+ readonly check: CheckRef;
50
+ readonly config: Readonly<Record<string, unknown>>;
51
+ readonly trace: unknown;
52
+ }
53
+ export interface ToolResultMessage {
54
+ readonly v: PackProtocolVersion;
55
+ readonly kind: 'result';
56
+ readonly output: unknown;
57
+ }
58
+ export interface CheckResultMessage {
59
+ readonly v: PackProtocolVersion;
60
+ readonly kind: 'check-result';
61
+ readonly result: unknown;
62
+ }
63
+ export type PackErrorCode = 'input-validation-failed' | 'output-validation-failed' | 'handler-import-failed' | 'handler-shape-invalid' | 'handler-throw' | 'check-shape-invalid' | 'malformed-message' | 'unknown-protocol-version' | 'unexpected-message-kind' | 'tool-not-in-pack' | 'check-not-in-pack' | 'tool-version-mismatch' | 'deadline-exceeded' | 'cancelled';
64
+ export interface PackErrorMessage {
65
+ readonly v: PackProtocolVersion;
66
+ readonly kind: 'error';
67
+ readonly code: PackErrorCode;
68
+ readonly message: string;
69
+ readonly toolId?: string;
70
+ readonly checkId?: string;
71
+ readonly cause?: unknown;
72
+ /** Schema-validation issues (Ajv-style), for the validation codes. */
73
+ readonly issues?: readonly unknown[];
74
+ }
75
+ export type PackRequest = ToolInvokeMessage | CheckInvokeMessage;
76
+ export type PackResponse = ToolResultMessage | CheckResultMessage | PackErrorMessage;
77
+ export type ParseOutcome<T> = {
78
+ readonly kind: 'ok';
79
+ readonly value: T;
80
+ } | {
81
+ readonly kind: 'err';
82
+ readonly error: PackErrorMessage;
83
+ };
84
+ export declare function packError(code: PackErrorCode, message: string, extra?: Omit<Partial<PackErrorMessage>, 'v' | 'kind' | 'code' | 'message'>): PackErrorMessage;
85
+ /** Parse a request body (already JSON-decoded) into a v2 request. */
86
+ export declare function parsePackRequest(value: unknown): ParseOutcome<PackRequest>;
87
+ /** Parse a response body (already JSON-decoded) into a v2 response. */
88
+ export declare function parsePackResponse(value: unknown): ParseOutcome<PackResponse>;
89
+ /**
90
+ * HTTP headers of the v2 transport. `Authorization` is deliberately not
91
+ * used: on platforms like Cloud Run it carries the platform's identity
92
+ * token, so the pack token travels separately.
93
+ */
94
+ export declare const PACK_HEADERS: {
95
+ readonly protocol: "kindgi-protocol";
96
+ readonly token: "kindgi-pack-token";
97
+ /** Relative deadline for the call, in milliseconds. */
98
+ readonly timeoutMs: "kindgi-timeout-ms";
99
+ readonly runId: "kindgi-run-id";
100
+ readonly requestId: "kindgi-request-id";
101
+ readonly artifactVersion: "kindgi-artifact-version";
102
+ readonly durationMs: "kindgi-duration-ms";
103
+ };
104
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}