@askdkc/kiokuko 0.2.6 → 0.2.7

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 (167) hide show
  1. package/README.ja.md +31 -0
  2. package/README.ko.md +31 -0
  3. package/README.md +32 -0
  4. package/README.zh-CN.md +29 -0
  5. package/dist/akinator/agent-task.d.ts +3 -0
  6. package/dist/akinator/agent-task.d.ts.map +1 -1
  7. package/dist/akinator/agent-task.js +38 -4
  8. package/dist/akinator/agent-task.js.map +1 -1
  9. package/dist/cli.d.ts +4 -0
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +89 -8
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/doctor.d.ts +4 -0
  14. package/dist/commands/doctor.d.ts.map +1 -1
  15. package/dist/commands/doctor.js +43 -1
  16. package/dist/commands/doctor.js.map +1 -1
  17. package/dist/commands/embeddings.d.ts +19 -0
  18. package/dist/commands/embeddings.d.ts.map +1 -0
  19. package/dist/commands/embeddings.js +159 -0
  20. package/dist/commands/embeddings.js.map +1 -0
  21. package/dist/commands/import.d.ts.map +1 -1
  22. package/dist/commands/import.js +7 -0
  23. package/dist/commands/import.js.map +1 -1
  24. package/dist/commands/use.d.ts.map +1 -1
  25. package/dist/commands/use.js +22 -8
  26. package/dist/commands/use.js.map +1 -1
  27. package/dist/context/broker.d.ts +3 -1
  28. package/dist/context/broker.d.ts.map +1 -1
  29. package/dist/context/broker.js +11 -7
  30. package/dist/context/broker.js.map +1 -1
  31. package/dist/context/delivery.d.ts.map +1 -1
  32. package/dist/context/delivery.js +5 -3
  33. package/dist/context/delivery.js.map +1 -1
  34. package/dist/context/ranking.d.ts +1 -1
  35. package/dist/context/ranking.d.ts.map +1 -1
  36. package/dist/context/ranking.js +1 -0
  37. package/dist/context/ranking.js.map +1 -1
  38. package/dist/context/scoped-broker.d.ts +4 -3
  39. package/dist/context/scoped-broker.d.ts.map +1 -1
  40. package/dist/context/scoped-broker.js +45 -7
  41. package/dist/context/scoped-broker.js.map +1 -1
  42. package/dist/context/selection-state.d.ts +12 -0
  43. package/dist/context/selection-state.d.ts.map +1 -1
  44. package/dist/context/selection-state.js +117 -7
  45. package/dist/context/selection-state.js.map +1 -1
  46. package/dist/db/capabilities.d.ts +8 -0
  47. package/dist/db/capabilities.d.ts.map +1 -1
  48. package/dist/db/capabilities.js +14 -0
  49. package/dist/db/capabilities.js.map +1 -1
  50. package/dist/db/connection.d.ts +7 -0
  51. package/dist/db/connection.d.ts.map +1 -1
  52. package/dist/db/connection.js +56 -0
  53. package/dist/db/connection.js.map +1 -1
  54. package/dist/db/migrate.d.ts.map +1 -1
  55. package/dist/db/migrate.js +3 -0
  56. package/dist/db/migrate.js.map +1 -1
  57. package/dist/embedding/backend.d.ts +27 -0
  58. package/dist/embedding/backend.d.ts.map +1 -0
  59. package/dist/embedding/backend.js +51 -0
  60. package/dist/embedding/backend.js.map +1 -0
  61. package/dist/embedding/config.d.ts +7 -0
  62. package/dist/embedding/config.d.ts.map +1 -0
  63. package/dist/embedding/config.js +125 -0
  64. package/dist/embedding/config.js.map +1 -0
  65. package/dist/embedding/diagnostics.d.ts +34 -0
  66. package/dist/embedding/diagnostics.d.ts.map +1 -0
  67. package/dist/embedding/diagnostics.js +248 -0
  68. package/dist/embedding/diagnostics.js.map +1 -0
  69. package/dist/embedding/document.d.ts +15 -0
  70. package/dist/embedding/document.d.ts.map +1 -0
  71. package/dist/embedding/document.js +102 -0
  72. package/dist/embedding/document.js.map +1 -0
  73. package/dist/embedding/javascript-backend.d.ts +11 -0
  74. package/dist/embedding/javascript-backend.d.ts.map +1 -0
  75. package/dist/embedding/javascript-backend.js +164 -0
  76. package/dist/embedding/javascript-backend.js.map +1 -0
  77. package/dist/embedding/jobs.d.ts +67 -0
  78. package/dist/embedding/jobs.d.ts.map +1 -0
  79. package/dist/embedding/jobs.js +259 -0
  80. package/dist/embedding/jobs.js.map +1 -0
  81. package/dist/embedding/openai-compatible-provider.d.ts +24 -0
  82. package/dist/embedding/openai-compatible-provider.d.ts.map +1 -0
  83. package/dist/embedding/openai-compatible-provider.js +330 -0
  84. package/dist/embedding/openai-compatible-provider.js.map +1 -0
  85. package/dist/embedding/profile.d.ts +6 -0
  86. package/dist/embedding/profile.d.ts.map +1 -0
  87. package/dist/embedding/profile.js +31 -0
  88. package/dist/embedding/profile.js.map +1 -0
  89. package/dist/embedding/provider.d.ts +13 -0
  90. package/dist/embedding/provider.d.ts.map +1 -0
  91. package/dist/embedding/provider.js +17 -0
  92. package/dist/embedding/provider.js.map +1 -0
  93. package/dist/embedding/query-cache.d.ts +39 -0
  94. package/dist/embedding/query-cache.d.ts.map +1 -0
  95. package/dist/embedding/query-cache.js +160 -0
  96. package/dist/embedding/query-cache.js.map +1 -0
  97. package/dist/embedding/runtime.d.ts +13 -0
  98. package/dist/embedding/runtime.d.ts.map +1 -0
  99. package/dist/embedding/runtime.js +373 -0
  100. package/dist/embedding/runtime.js.map +1 -0
  101. package/dist/embedding/sqlite-vec-backend.d.ts +9 -0
  102. package/dist/embedding/sqlite-vec-backend.d.ts.map +1 -0
  103. package/dist/embedding/sqlite-vec-backend.js +106 -0
  104. package/dist/embedding/sqlite-vec-backend.js.map +1 -0
  105. package/dist/embedding/sqlite-vec-loader.d.ts +17 -0
  106. package/dist/embedding/sqlite-vec-loader.d.ts.map +1 -0
  107. package/dist/embedding/sqlite-vec-loader.js +51 -0
  108. package/dist/embedding/sqlite-vec-loader.js.map +1 -0
  109. package/dist/embedding/store.d.ts +64 -0
  110. package/dist/embedding/store.d.ts.map +1 -0
  111. package/dist/embedding/store.js +377 -0
  112. package/dist/embedding/store.js.map +1 -0
  113. package/dist/embedding/types.d.ts +97 -0
  114. package/dist/embedding/types.d.ts.map +1 -0
  115. package/dist/embedding/types.js +2 -0
  116. package/dist/embedding/types.js.map +1 -0
  117. package/dist/embedding/vector.d.ts +9 -0
  118. package/dist/embedding/vector.d.ts.map +1 -0
  119. package/dist/embedding/vector.js +90 -0
  120. package/dist/embedding/vector.js.map +1 -0
  121. package/dist/embedding/worker.d.ts +23 -0
  122. package/dist/embedding/worker.d.ts.map +1 -0
  123. package/dist/embedding/worker.js +84 -0
  124. package/dist/embedding/worker.js.map +1 -0
  125. package/dist/enno-oduno/schemas.d.ts +2 -2
  126. package/dist/ledger/checkpoint-contract.d.ts +2 -2
  127. package/dist/mcp/bounded-stdio-transport.d.ts +12 -2
  128. package/dist/mcp/bounded-stdio-transport.d.ts.map +1 -1
  129. package/dist/mcp/bounded-stdio-transport.js +103 -4
  130. package/dist/mcp/bounded-stdio-transport.js.map +1 -1
  131. package/dist/mcp/runtime-owner.d.ts +27 -0
  132. package/dist/mcp/runtime-owner.d.ts.map +1 -0
  133. package/dist/mcp/runtime-owner.js +130 -0
  134. package/dist/mcp/runtime-owner.js.map +1 -0
  135. package/dist/mcp/server.d.ts +9 -1
  136. package/dist/mcp/server.d.ts.map +1 -1
  137. package/dist/mcp/server.js +38 -5
  138. package/dist/mcp/server.js.map +1 -1
  139. package/dist/memory/checkpoint-contract.d.ts +3 -3
  140. package/dist/memory/entries.d.ts.map +1 -1
  141. package/dist/memory/entries.js +13 -0
  142. package/dist/memory/entries.js.map +1 -1
  143. package/dist/memory/federated-retrieval.d.ts +3 -2
  144. package/dist/memory/federated-retrieval.d.ts.map +1 -1
  145. package/dist/memory/federated-retrieval.js +112 -31
  146. package/dist/memory/federated-retrieval.js.map +1 -1
  147. package/dist/memory/hybrid-retrieval.d.ts +9 -2
  148. package/dist/memory/hybrid-retrieval.d.ts.map +1 -1
  149. package/dist/memory/hybrid-retrieval.js +60 -13
  150. package/dist/memory/hybrid-retrieval.js.map +1 -1
  151. package/dist/memory/retrieval.d.ts +4 -3
  152. package/dist/memory/retrieval.d.ts.map +1 -1
  153. package/dist/memory/retrieval.js +6 -6
  154. package/dist/memory/retrieval.js.map +1 -1
  155. package/dist/memory/scoped-memory.d.ts +2 -1
  156. package/dist/memory/scoped-memory.d.ts.map +1 -1
  157. package/dist/memory/scoped-memory.js +2 -2
  158. package/dist/memory/scoped-memory.js.map +1 -1
  159. package/dist/server/agent-application.js +1 -1
  160. package/dist/server/agent-application.js.map +1 -1
  161. package/dist/server/http.d.ts +17 -1
  162. package/dist/server/http.d.ts.map +1 -1
  163. package/dist/server/http.js +76 -13
  164. package/dist/server/http.js.map +1 -1
  165. package/migrations/021_semantic_embeddings.sql +122 -0
  166. package/migrations/down/021_semantic_embeddings.sql +17 -0
  167. package/package.json +7 -1
@@ -0,0 +1,90 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { KiokukoError } from '../errors.js';
3
+ export const MIN_VECTOR_DIMENSIONS = 2;
4
+ export const MAX_VECTOR_DIMENSIONS = 8_192;
5
+ function invalid(message) {
6
+ throw new KiokukoError('VALIDATION_ERROR', message);
7
+ }
8
+ function dimensionsValue(dimensions) {
9
+ if (!Number.isSafeInteger(dimensions) || dimensions < MIN_VECTOR_DIMENSIONS || dimensions > MAX_VECTOR_DIMENSIONS) {
10
+ invalid('Vector dimensions are invalid');
11
+ }
12
+ return dimensions;
13
+ }
14
+ function validateFiniteVector(vector, expectedDimensions) {
15
+ const dimensions = dimensionsValue(expectedDimensions ?? vector.length);
16
+ if (vector.length !== dimensions)
17
+ invalid('Vector dimensions do not match');
18
+ let normSquared = 0;
19
+ for (const value of vector) {
20
+ if (!Number.isFinite(value))
21
+ invalid('Vector contains a non-finite value');
22
+ normSquared += value * value;
23
+ }
24
+ if (!Number.isFinite(normSquared) || normSquared === 0)
25
+ invalid('Vector norm must be non-zero');
26
+ return vector;
27
+ }
28
+ export function normalizeVector(input, expectedDimensions) {
29
+ const vector = input instanceof Float32Array ? new Float32Array(input) : new Float32Array(input);
30
+ return validateFiniteVector(vector, expectedDimensions);
31
+ }
32
+ export function encodeVector(input, expectedDimensions) {
33
+ const vector = normalizeVector(input, expectedDimensions);
34
+ const bytes = new Uint8Array(vector.byteLength);
35
+ const view = new DataView(bytes.buffer);
36
+ for (let index = 0; index < vector.length; index += 1) {
37
+ view.setFloat32(index * 4, vector[index], true);
38
+ }
39
+ return bytes;
40
+ }
41
+ function blobBytes(blob) {
42
+ if (blob instanceof Uint8Array)
43
+ return new Uint8Array(blob);
44
+ if (ArrayBuffer.isView(blob))
45
+ return new Uint8Array(blob.buffer.slice(blob.byteOffset, blob.byteOffset + blob.byteLength));
46
+ if (blob instanceof ArrayBuffer)
47
+ return new Uint8Array(blob.slice(0));
48
+ invalid('Vector BLOB is invalid');
49
+ }
50
+ export function decodeVector(blob, dimensions, expectedHash) {
51
+ const validDimensions = dimensionsValue(dimensions);
52
+ const bytes = blobBytes(blob);
53
+ if (bytes.byteLength !== validDimensions * 4)
54
+ invalid('Vector BLOB length does not match dimensions');
55
+ if (expectedHash !== undefined && hashVectorBytes(bytes) !== expectedHash) {
56
+ throw new KiokukoError('INTEGRITY_ERROR', 'Vector hash does not match its BLOB');
57
+ }
58
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
59
+ const vector = new Float32Array(validDimensions);
60
+ for (let index = 0; index < validDimensions; index += 1)
61
+ vector[index] = view.getFloat32(index * 4, true);
62
+ return validateFiniteVector(vector, validDimensions);
63
+ }
64
+ export function hashVectorBytes(bytes) {
65
+ return createHash('sha256').update(bytes).digest('hex');
66
+ }
67
+ export function hashVector(input) {
68
+ return hashVectorBytes(encodeVector(input));
69
+ }
70
+ export function cosineDistance(left, right) {
71
+ if (left.length !== right.length)
72
+ invalid('Vectors must have matching dimensions');
73
+ const first = validateFiniteVector(left);
74
+ const second = validateFiniteVector(right, first.length);
75
+ let dot = 0;
76
+ let leftNorm = 0;
77
+ let rightNorm = 0;
78
+ for (let index = 0; index < first.length; index += 1) {
79
+ const leftValue = first[index];
80
+ const rightValue = second[index];
81
+ dot += leftValue * rightValue;
82
+ leftNorm += leftValue * leftValue;
83
+ rightNorm += rightValue * rightValue;
84
+ }
85
+ const similarity = dot / Math.sqrt(leftNorm * rightNorm);
86
+ if (!Number.isFinite(similarity))
87
+ invalid('Vector cosine distance is invalid');
88
+ return Math.min(2, Math.max(0, 1 - similarity));
89
+ }
90
+ //# sourceMappingURL=vector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector.js","sourceRoot":"","sources":["../../src/embedding/vector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { EmbeddingDrainResult, EmbeddingRuntime } from './types.js';
2
+ export declare const DEFAULT_EMBEDDING_WORKER_INTERVAL_MS = 5000;
3
+ export declare const DEFAULT_EMBEDDING_WORKER_MAX_JOBS = 64;
4
+ export declare const DEFAULT_EMBEDDING_WORKER_DEADLINE_MS = 120000;
5
+ export interface EmbeddingWorkerOptions {
6
+ readonly runtime: EmbeddingRuntime;
7
+ readonly intervalMs?: number;
8
+ readonly maxJobs?: number;
9
+ readonly deadlineMs?: number;
10
+ readonly setTimeout?: typeof setTimeout;
11
+ readonly clearTimeout?: typeof clearTimeout;
12
+ readonly onDrain?: (result: EmbeddingDrainResult) => void | PromiseLike<void>;
13
+ readonly onError?: (error: unknown) => void | PromiseLike<void>;
14
+ }
15
+ export interface EmbeddingWorker {
16
+ readonly running: boolean;
17
+ start(): void;
18
+ stop(): void;
19
+ close(): Promise<void>;
20
+ }
21
+ /** Run bounded embedding drains without overlapping provider calls or timers. */
22
+ export declare function createEmbeddingWorker(options: EmbeddingWorkerOptions): EmbeddingWorker;
23
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/embedding/worker.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEzE,eAAO,MAAM,oCAAoC,OAAQ,CAAC;AAC1D,eAAO,MAAM,iCAAiC,KAAK,CAAC;AACpD,eAAO,MAAM,oCAAoC,SAAU,CAAC;AAE5D,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,UAAU,CAAC;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,YAAY,CAAC;IAC5C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,KAAK,IAAI,IAAI,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;IACb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAOD,iFAAiF;AACjF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,sBAAsB,GAAG,eAAe,CAqEtF"}
@@ -0,0 +1,84 @@
1
+ export const DEFAULT_EMBEDDING_WORKER_INTERVAL_MS = 5_000;
2
+ export const DEFAULT_EMBEDDING_WORKER_MAX_JOBS = 64;
3
+ export const DEFAULT_EMBEDDING_WORKER_DEADLINE_MS = 120_000;
4
+ function positiveInteger(value, label) {
5
+ if (!Number.isSafeInteger(value) || value < 1)
6
+ throw new TypeError(`${label} must be a positive integer`);
7
+ return value;
8
+ }
9
+ /** Run bounded embedding drains without overlapping provider calls or timers. */
10
+ export function createEmbeddingWorker(options) {
11
+ const intervalMs = positiveInteger(options.intervalMs ?? DEFAULT_EMBEDDING_WORKER_INTERVAL_MS, 'intervalMs');
12
+ const maxJobs = positiveInteger(options.maxJobs ?? DEFAULT_EMBEDDING_WORKER_MAX_JOBS, 'maxJobs');
13
+ const deadlineMs = positiveInteger(options.deadlineMs ?? DEFAULT_EMBEDDING_WORKER_DEADLINE_MS, 'deadlineMs');
14
+ const setTimer = options.setTimeout ?? setTimeout;
15
+ const clearTimer = options.clearTimeout ?? clearTimeout;
16
+ let started = false;
17
+ let closing = false;
18
+ let timer;
19
+ let active;
20
+ const schedule = (delay) => {
21
+ if (!started || closing || timer !== undefined)
22
+ return;
23
+ timer = setTimer(() => {
24
+ timer = undefined;
25
+ void run();
26
+ }, delay);
27
+ };
28
+ const run = async () => {
29
+ if (!started || closing || active !== undefined)
30
+ return;
31
+ const operation = (async () => {
32
+ try {
33
+ const result = await options.runtime.drain({ maxJobs, deadlineMs });
34
+ await options.onDrain?.(result);
35
+ }
36
+ catch (error) {
37
+ try {
38
+ await options.onError?.(error);
39
+ }
40
+ catch {
41
+ // A background observer must not create an unhandled rejection.
42
+ }
43
+ }
44
+ })();
45
+ active = operation;
46
+ try {
47
+ await operation;
48
+ }
49
+ finally {
50
+ if (active === operation)
51
+ active = undefined;
52
+ schedule(intervalMs);
53
+ }
54
+ };
55
+ const stop = () => {
56
+ if (closing)
57
+ return;
58
+ closing = true;
59
+ started = false;
60
+ if (timer !== undefined) {
61
+ clearTimer(timer);
62
+ timer = undefined;
63
+ }
64
+ };
65
+ const worker = {
66
+ get running() {
67
+ return started && !closing;
68
+ },
69
+ start() {
70
+ if (started || closing)
71
+ return;
72
+ started = true;
73
+ schedule(0);
74
+ },
75
+ stop,
76
+ async close() {
77
+ stop();
78
+ await options.runtime.close();
79
+ await active;
80
+ },
81
+ };
82
+ return Object.freeze(worker);
83
+ }
84
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/embedding/worker.ts"],"names":[],"mappings":"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"}
@@ -229,11 +229,11 @@ export declare const advisoryContributionSchemaPublic: z.ZodUnion<readonly [z.Zo
229
229
  failed: "failed";
230
230
  }>;
231
231
  reasonCode: z.ZodEnum<{
232
+ invalid_response: "invalid_response";
232
233
  unsafe_output: "unsafe_output";
233
234
  host_read_only_unavailable: "host_read_only_unavailable";
234
235
  host_execution_failed: "host_execution_failed";
235
236
  host_timeout: "host_timeout";
236
- invalid_response: "invalid_response";
237
237
  }>;
238
238
  }, z.core.$strict>]>;
239
239
  export declare const adviceSubmissionSchema: z.ZodObject<{
@@ -373,11 +373,11 @@ export declare const adviceSubmissionSchema: z.ZodObject<{
373
373
  failed: "failed";
374
374
  }>;
375
375
  reasonCode: z.ZodEnum<{
376
+ invalid_response: "invalid_response";
376
377
  unsafe_output: "unsafe_output";
377
378
  host_read_only_unavailable: "host_read_only_unavailable";
378
379
  host_execution_failed: "host_execution_failed";
379
380
  host_timeout: "host_timeout";
380
- invalid_response: "invalid_response";
381
381
  }>;
382
382
  }, z.core.$strict>]>>;
383
383
  }, z.core.$strict>;
@@ -92,8 +92,8 @@ export declare const checkpointTestEvidenceSchema: z.ZodObject<{
92
92
  export declare const checkpointVerificationSchema: z.ZodObject<{
93
93
  outcome: z.ZodEnum<{
94
94
  unknown: "unknown";
95
- stale: "stale";
96
95
  failed: "failed";
96
+ stale: "stale";
97
97
  fresh: "fresh";
98
98
  }>;
99
99
  }, z.core.$strict>;
@@ -124,8 +124,8 @@ export declare const checkpointEvidenceSchema: z.ZodObject<{
124
124
  verification: z.ZodOptional<z.ZodObject<{
125
125
  outcome: z.ZodEnum<{
126
126
  unknown: "unknown";
127
- stale: "stale";
128
127
  failed: "failed";
128
+ stale: "stale";
129
129
  fresh: "fresh";
130
130
  }>;
131
131
  }, z.core.$strict>>;
@@ -1,20 +1,30 @@
1
1
  import type { Readable, Writable } from 'node:stream';
2
- import type { JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
2
+ import { type JSONRPCMessage } from '@modelcontextprotocol/sdk/types.js';
3
3
  import type { Transport, TransportSendOptions } from '@modelcontextprotocol/sdk/shared/transport.js';
4
4
  export declare const MAX_STDIO_JSON_RPC_MESSAGE_BYTES: number;
5
+ export declare const DEFAULT_MCP_REQUEST_TIMEOUT_MS = 55000;
6
+ export declare const MIN_MCP_REQUEST_TIMEOUT_MS = 10;
7
+ export declare const MAX_MCP_REQUEST_TIMEOUT_MS: number;
5
8
  export declare class BoundedStdioServerTransport implements Transport {
6
9
  private readonly input;
7
10
  private readonly output;
8
11
  private readonly maxMessageBytes;
12
+ private readonly requestTimeoutMs;
9
13
  onclose?: () => void;
10
14
  onerror?: (error: Error) => void;
11
15
  onmessage?: <T extends JSONRPCMessage>(message: T) => void;
12
16
  private buffer;
13
17
  private discardingOversizedLine;
18
+ private readonly requestDeadlines;
14
19
  private started;
15
- constructor(input?: Readable, output?: Writable, maxMessageBytes?: number);
20
+ private closed;
21
+ constructor(input?: Readable, output?: Writable, maxMessageBytes?: number, requestTimeoutMs?: number);
22
+ private clearRequestDeadline;
23
+ private startRequestDeadline;
24
+ private trackIncomingMessage;
16
25
  private readonly onData;
17
26
  private readonly onInputError;
27
+ private readonly onInputEnd;
18
28
  private writeOversizedMessageError;
19
29
  start(): Promise<void>;
20
30
  close(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"bounded-stdio-transport.d.ts","sourceRoot":"","sources":["../../src/mcp/bounded-stdio-transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAGrG,eAAO,MAAM,gCAAgC,QAAkB,CAAC;AAUhE,qBAAa,2BAA4B,YAAW,SAAS;IAUzD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAXlC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,cAAc,EAAE,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;IAE3D,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,OAAO,CAAS;gBAGL,KAAK,GAAE,QAAwB,EAC/B,MAAM,GAAE,QAAyB,EACjC,eAAe,SAAmC;IAOrE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAsCrB;IAEF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAE3B;IAEF,OAAO,CAAC,0BAA0B;IAM5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CAU9E"}
1
+ {"version":3,"file":"bounded-stdio-transport.d.ts","sourceRoot":"","sources":["../../src/mcp/bounded-stdio-transport.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAa,KAAK,cAAc,EAAkB,MAAM,oCAAoC,CAAC;AACpG,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AAGrG,eAAO,MAAM,gCAAgC,QAAkB,CAAC;AAChE,eAAO,MAAM,8BAA8B,QAAS,CAAC;AACrD,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAC7C,eAAO,MAAM,0BAA0B,QAAiB,CAAC;AA8BzD,qBAAa,2BAA4B,YAAW,SAAS;IAYzD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAdnC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,CAAC,CAAC,SAAS,cAAc,EAAE,OAAO,EAAE,CAAC,KAAK,IAAI,CAAC;IAE3D,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,uBAAuB,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuD;IACxF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAGJ,KAAK,GAAE,QAAwB,EAC/B,MAAM,GAAE,QAAyB,EACjC,eAAe,SAAmC,EAClD,gBAAgB,SAAiC;IAYpE,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,oBAAoB;IA4B5B,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAwCrB;IAEF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAE3B;IAEF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAEzB;IAEF,OAAO,CAAC,0BAA0B;IAM5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;CAc9E"}
@@ -1,6 +1,10 @@
1
1
  import process from 'node:process';
2
+ import { ErrorCode } from '@modelcontextprotocol/sdk/types.js';
2
3
  import { deserializeMessage, serializeMessage } from '@modelcontextprotocol/sdk/shared/stdio.js';
3
4
  export const MAX_STDIO_JSON_RPC_MESSAGE_BYTES = 8 * 1024 * 1024;
5
+ export const DEFAULT_MCP_REQUEST_TIMEOUT_MS = 55_000;
6
+ export const MIN_MCP_REQUEST_TIMEOUT_MS = 10;
7
+ export const MAX_MCP_REQUEST_TIMEOUT_MS = 5 * 60 * 1_000;
4
8
  const MESSAGE_TOO_LARGE = Object.freeze({
5
9
  jsonrpc: '2.0',
6
10
  error: {
@@ -8,23 +12,99 @@ const MESSAGE_TOO_LARGE = Object.freeze({
8
12
  message: 'JSON-RPC message exceeds the configured transport limit.',
9
13
  },
10
14
  });
15
+ function requestIdOf(message) {
16
+ if (!('id' in message))
17
+ return undefined;
18
+ return typeof message.id === 'string' || typeof message.id === 'number' ? message.id : undefined;
19
+ }
20
+ function isRequest(message) {
21
+ return 'method' in message && requestIdOf(message) !== undefined;
22
+ }
23
+ function isResponse(message) {
24
+ return !('method' in message) && requestIdOf(message) !== undefined;
25
+ }
26
+ function cancelledRequestId(message) {
27
+ if (!('method' in message) || message.method !== 'notifications/cancelled' || !('params' in message))
28
+ return undefined;
29
+ const params = message.params;
30
+ if (typeof params !== 'object' || params === null || !('requestId' in params))
31
+ return undefined;
32
+ return typeof params.requestId === 'string' || typeof params.requestId === 'number' ? params.requestId : undefined;
33
+ }
11
34
  export class BoundedStdioServerTransport {
12
35
  input;
13
36
  output;
14
37
  maxMessageBytes;
38
+ requestTimeoutMs;
15
39
  onclose;
16
40
  onerror;
17
41
  onmessage;
18
42
  buffer;
19
43
  discardingOversizedLine = false;
44
+ requestDeadlines = new Map();
20
45
  started = false;
21
- constructor(input = process.stdin, output = process.stdout, maxMessageBytes = MAX_STDIO_JSON_RPC_MESSAGE_BYTES) {
46
+ closed = false;
47
+ constructor(input = process.stdin, output = process.stdout, maxMessageBytes = MAX_STDIO_JSON_RPC_MESSAGE_BYTES, requestTimeoutMs = DEFAULT_MCP_REQUEST_TIMEOUT_MS) {
22
48
  this.input = input;
23
49
  this.output = output;
24
50
  this.maxMessageBytes = maxMessageBytes;
51
+ this.requestTimeoutMs = requestTimeoutMs;
25
52
  if (!Number.isSafeInteger(maxMessageBytes) || maxMessageBytes < 1) {
26
53
  throw new Error('Stdio message limit must be a positive integer');
27
54
  }
55
+ if (!Number.isSafeInteger(requestTimeoutMs)
56
+ || requestTimeoutMs < MIN_MCP_REQUEST_TIMEOUT_MS
57
+ || requestTimeoutMs > MAX_MCP_REQUEST_TIMEOUT_MS) {
58
+ throw new Error(`MCP request timeout must be an integer between ${MIN_MCP_REQUEST_TIMEOUT_MS} and ${MAX_MCP_REQUEST_TIMEOUT_MS} milliseconds`);
59
+ }
60
+ }
61
+ clearRequestDeadline(requestId) {
62
+ const deadline = this.requestDeadlines.get(requestId);
63
+ if (deadline === undefined)
64
+ return;
65
+ clearTimeout(deadline);
66
+ this.requestDeadlines.delete(requestId);
67
+ }
68
+ startRequestDeadline(requestId) {
69
+ this.clearRequestDeadline(requestId);
70
+ const deadline = setTimeout(() => {
71
+ if (!this.requestDeadlines.delete(requestId))
72
+ return;
73
+ try {
74
+ this.onmessage?.({
75
+ jsonrpc: '2.0',
76
+ method: 'notifications/cancelled',
77
+ params: { requestId, reason: 'Server request deadline exceeded' },
78
+ });
79
+ }
80
+ catch (error) {
81
+ this.onerror?.(error instanceof Error ? error : new Error('Failed to cancel timed out MCP request'));
82
+ }
83
+ void this.send({
84
+ jsonrpc: '2.0',
85
+ id: requestId,
86
+ error: {
87
+ code: ErrorCode.RequestTimeout,
88
+ message: 'MCP request exceeded the server deadline.',
89
+ data: { timeoutMs: this.requestTimeoutMs, cancelled: true },
90
+ },
91
+ }).catch((error) => {
92
+ this.onerror?.(error instanceof Error ? error : new Error('Failed to write MCP request timeout'));
93
+ });
94
+ }, this.requestTimeoutMs);
95
+ this.requestDeadlines.set(requestId, deadline);
96
+ }
97
+ trackIncomingMessage(message) {
98
+ const cancelledId = cancelledRequestId(message);
99
+ if (cancelledId !== undefined) {
100
+ this.clearRequestDeadline(cancelledId);
101
+ return;
102
+ }
103
+ if (!isRequest(message))
104
+ return;
105
+ const requestId = requestIdOf(message);
106
+ if (requestId !== undefined)
107
+ this.startRequestDeadline(requestId);
28
108
  }
29
109
  onData = (value) => {
30
110
  const chunk = Buffer.isBuffer(value) ? value : Buffer.from(value);
@@ -59,7 +139,9 @@ export class BoundedStdioServerTransport {
59
139
  this.buffer = undefined;
60
140
  try {
61
141
  const text = line.toString('utf8').replace(/\r$/u, '');
62
- this.onmessage?.(deserializeMessage(text));
142
+ const message = deserializeMessage(text);
143
+ this.trackIncomingMessage(message);
144
+ this.onmessage?.(message);
63
145
  }
64
146
  catch (error) {
65
147
  this.onerror?.(error instanceof Error ? error : new Error('Invalid JSON-RPC stdio message'));
@@ -71,28 +153,45 @@ export class BoundedStdioServerTransport {
71
153
  onInputError = (error) => {
72
154
  this.onerror?.(error);
73
155
  };
156
+ onInputEnd = () => {
157
+ void this.close();
158
+ };
74
159
  writeOversizedMessageError() {
75
160
  void this.send(MESSAGE_TOO_LARGE).catch((error) => {
76
161
  this.onerror?.(error instanceof Error ? error : new Error('Failed to write JSON-RPC transport error'));
77
162
  });
78
163
  }
79
164
  async start() {
80
- if (this.started)
81
- throw new Error('BoundedStdioServerTransport already started');
165
+ if (this.started || this.closed)
166
+ throw new Error('BoundedStdioServerTransport cannot be started again');
82
167
  this.started = true;
83
168
  this.input.on('data', this.onData);
84
169
  this.input.on('error', this.onInputError);
170
+ this.input.on('end', this.onInputEnd);
85
171
  }
86
172
  async close() {
173
+ if (this.closed)
174
+ return;
175
+ this.closed = true;
176
+ this.started = false;
87
177
  this.input.off('data', this.onData);
88
178
  this.input.off('error', this.onInputError);
179
+ this.input.off('end', this.onInputEnd);
89
180
  if (this.input.listenerCount('data') === 0)
90
181
  this.input.pause();
91
182
  this.buffer = undefined;
92
183
  this.discardingOversizedLine = false;
184
+ for (const deadline of this.requestDeadlines.values())
185
+ clearTimeout(deadline);
186
+ this.requestDeadlines.clear();
93
187
  this.onclose?.();
94
188
  }
95
189
  send(message, _options) {
190
+ if (isResponse(message)) {
191
+ const requestId = requestIdOf(message);
192
+ if (requestId !== undefined)
193
+ this.clearRequestDeadline(requestId);
194
+ }
96
195
  return new Promise((resolve, reject) => {
97
196
  try {
98
197
  if (this.output.write(serializeMessage(message)))
@@ -1 +1 @@
1
- {"version":3,"file":"bounded-stdio-transport.js","sourceRoot":"","sources":["../../src/mcp/bounded-stdio-transport.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,cAAc,CAAC;AAInC,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAEjG,MAAM,CAAC,MAAM,gCAAgC,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEhE,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,KAAc;IACvB,KAAK,EAAE;QACL,IAAI,EAAE,CAAC,KAAK;QACZ,OAAO,EAAE,0DAA0D;KACpE;CACF,CAAC,CAAC;AAEH,MAAM,OAAO,2BAA2B;IAUnB;IACA;IACA;IAXnB,OAAO,CAAc;IACrB,OAAO,CAA0B;IACjC,SAAS,CAAkD;IAEnD,MAAM,CAAqB;IAC3B,uBAAuB,GAAG,KAAK,CAAC;IAChC,OAAO,GAAG,KAAK,CAAC;IAExB,YACmB,QAAkB,OAAO,CAAC,KAAK,EAC/B,SAAmB,OAAO,CAAC,MAAM,EACjC,kBAAkB,gCAAgC;QAFlD,UAAK,GAAL,KAAK,CAA0B;QAC/B,WAAM,GAAN,MAAM,CAA2B;QACjC,oBAAe,GAAf,eAAe,CAAmC;QAEnE,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IAEgB,MAAM,GAAG,CAAC,KAAsB,EAAQ,EAAE;QACzD,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClE,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC5C,IAAI,OAAO,KAAK,CAAC,CAAC;oBAAE,OAAO;gBAC3B,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;gBACrC,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;gBACrB,SAAS;YACX,CAAC;YAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;YACpD,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC;YAC/C,IAAI,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC1D,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;gBACxB,IAAI,CAAC,0BAA0B,EAAE,CAAC;gBAClC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;oBACnB,IAAI,CAAC,uBAAuB,GAAG,IAAI,CAAC;oBACpC,OAAO;gBACT,CAAC;YACH,CAAC;iBAAM,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBACvG,OAAO;YACT,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;gBACzF,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;gBACxB,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBACvD,IAAI,CAAC,SAAS,EAAE,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC7C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;gBAC/F,CAAC;YACH,CAAC;YACD,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEe,YAAY,GAAG,CAAC,KAAY,EAAQ,EAAE;QACrD,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC;IAEM,0BAA0B;QAChC,KAAK,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACzD,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACzG,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/D,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,uBAAuB,GAAG,KAAK,CAAC;QACrC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,OAAuB,EAAE,QAA+B;QAC3D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC;gBACH,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;oBAAE,OAAO,EAAE,CAAC;;oBACvD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC,CAAC;YAC/F,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"bounded-stdio-transport.js","sourceRoot":"","sources":["../../src/mcp/bounded-stdio-transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type InitOptions } from '../commands/init.js';
2
+ import { type PathEnvironment } from '../config/paths.js';
3
+ import type { SqliteDatabase } from '../db/adapter.js';
4
+ import { type EmbeddingDatabaseOpener } from '../embedding/backend.js';
5
+ import type { EmbeddingConfig, EmbeddingProvider, EmbeddingRuntime, VectorSearchBackend } from '../embedding/types.js';
6
+ export interface McpRuntimeOwnerOptions extends PathEnvironment {
7
+ readonly databasePath?: string;
8
+ readonly migrationsDirectory?: string;
9
+ readonly initializeDatabase?: (options: InitOptions) => unknown | PromiseLike<unknown>;
10
+ readonly openDatabase?: EmbeddingDatabaseOpener;
11
+ readonly embeddingConfig?: EmbeddingConfig;
12
+ readonly embeddingProvider?: EmbeddingProvider;
13
+ readonly embeddingBackend?: VectorSearchBackend;
14
+ }
15
+ export type McpDatabaseOperation<T> = (database: SqliteDatabase, runtime: EmbeddingRuntime) => Promise<T> | T;
16
+ export interface McpDatabaseOwner {
17
+ withDatabase<T>(operation: McpDatabaseOperation<T>): Promise<T>;
18
+ close(): Promise<void>;
19
+ }
20
+ /** Own one MCP-process database/runtime instead of opening a connection per tool call. */
21
+ export declare class McpRuntimeOwner implements McpDatabaseOwner {
22
+ #private;
23
+ constructor(options?: McpRuntimeOwnerOptions);
24
+ withDatabase<T>(operation: McpDatabaseOperation<T>): Promise<T>;
25
+ close(): Promise<void>;
26
+ }
27
+ //# sourceMappingURL=runtime-owner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-owner.d.ts","sourceRoot":"","sources":["../../src/mcp/runtime-owner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAC3E,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEjF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAyB,KAAK,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAE9F,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAIvH,MAAM,WAAW,sBAAuB,SAAQ,eAAe;IAC7D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACvF,QAAQ,CAAC,YAAY,CAAC,EAAE,uBAAuB,CAAC;IAChD,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IAC/C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;CACjD;AAED,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI,CACpC,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,gBAAgB,KACtB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AASD,0FAA0F;AAC1F,qBAAa,eAAgB,YAAW,gBAAgB;;gBAQ1C,OAAO,GAAE,sBAA2B;IA0D1C,YAAY,CAAC,CAAC,EAAE,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAK/D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAuC7B"}