@cyanheads/mcp-ts-core 0.10.1 → 0.10.2
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/AGENTS.md +2 -2
- package/CLAUDE.md +2 -2
- package/README.md +1 -1
- package/changelog/0.10.x/0.10.2.md +35 -0
- package/dist/core/context.d.ts +22 -0
- package/dist/core/context.d.ts.map +1 -1
- package/dist/core/context.js +12 -0
- package/dist/core/context.js.map +1 -1
- package/dist/linter/rules/enrichment-rules.d.ts +20 -0
- package/dist/linter/rules/enrichment-rules.d.ts.map +1 -1
- package/dist/linter/rules/enrichment-rules.js +74 -9
- package/dist/linter/rules/enrichment-rules.js.map +1 -1
- package/dist/linter/rules/index.d.ts +2 -2
- package/dist/linter/rules/index.d.ts.map +1 -1
- package/dist/linter/rules/index.js +2 -2
- package/dist/linter/rules/index.js.map +1 -1
- package/dist/linter/rules/schema-rules.d.ts +4 -0
- package/dist/linter/rules/schema-rules.d.ts.map +1 -1
- package/dist/linter/rules/schema-rules.js +13 -0
- package/dist/linter/rules/schema-rules.js.map +1 -1
- package/dist/linter/rules/tool-rules.d.ts +12 -0
- package/dist/linter/rules/tool-rules.d.ts.map +1 -1
- package/dist/linter/rules/tool-rules.js +48 -1
- package/dist/linter/rules/tool-rules.js.map +1 -1
- package/dist/linter/types.d.ts +17 -0
- package/dist/linter/types.d.ts.map +1 -1
- package/dist/linter/validate.d.ts.map +1 -1
- package/dist/linter/validate.js +55 -1
- package/dist/linter/validate.js.map +1 -1
- package/dist/logs/combined.log +4 -0
- package/dist/logs/error.log +2 -0
- package/dist/logs/interactions.log +0 -0
- package/dist/services/canvas/core/CanvasInstance.d.ts +1 -1
- package/dist/services/canvas/core/CanvasInstance.d.ts.map +1 -1
- package/dist/services/canvas/core/CanvasInstance.js +36 -11
- package/dist/services/canvas/core/CanvasInstance.js.map +1 -1
- package/dist/services/canvas/core/CanvasRegistry.d.ts +50 -3
- package/dist/services/canvas/core/CanvasRegistry.d.ts.map +1 -1
- package/dist/services/canvas/core/CanvasRegistry.js +163 -6
- package/dist/services/canvas/core/CanvasRegistry.js.map +1 -1
- package/dist/services/canvas/spillover.d.ts +6 -0
- package/dist/services/canvas/spillover.d.ts.map +1 -1
- package/dist/services/canvas/spillover.js +1 -0
- package/dist/services/canvas/spillover.js.map +1 -1
- package/dist/services/canvas/types.d.ts +21 -0
- package/dist/services/canvas/types.d.ts.map +1 -1
- package/package.json +6 -6
- package/skills/add-tool/SKILL.md +38 -1
- package/skills/api-canvas/SKILL.md +23 -3
- package/skills/api-context/SKILL.md +41 -1
- package/skills/api-linter/SKILL.md +77 -3
- package/skills/api-mirror/SKILL.md +30 -1
- package/skills/design-mcp-server/SKILL.md +2 -1
- package/templates/Dockerfile +17 -0
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
* @fileoverview Canvas lifecycle registry. Keys canvases by (tenantId, canvasId),
|
|
3
3
|
* generates crypto-secure 10-char URL-safe IDs, enforces a sliding 24h TTL
|
|
4
4
|
* with a 7-day absolute cap, runs a periodic sweeper, and caps active canvases
|
|
5
|
-
* per tenant (default 100).
|
|
5
|
+
* per tenant (default 100). Also tracks per-table TTLs; the sweep loop drops
|
|
6
|
+
* expired tables before evaluating canvas-level expiry. Public access is gated
|
|
7
|
+
* by {@link DataCanvas}.
|
|
6
8
|
* @module src/services/canvas/core/CanvasRegistry
|
|
7
9
|
*/
|
|
8
10
|
import { conflict, notFound, rateLimited } from '../../../types-global/errors.js';
|
|
@@ -89,6 +91,7 @@ export class CanvasRegistry {
|
|
|
89
91
|
createdAt: now,
|
|
90
92
|
lastAccessedAt: now,
|
|
91
93
|
expiresAt: now + this.options.ttlMs,
|
|
94
|
+
tableTtl: new Map(),
|
|
92
95
|
};
|
|
93
96
|
this.canvases.set(canvasId, record);
|
|
94
97
|
this.indexByTenant(tenantId, canvasId);
|
|
@@ -109,7 +112,7 @@ export class CanvasRegistry {
|
|
|
109
112
|
/**
|
|
110
113
|
* Validate that `canvasId` belongs to `tenantId` and is not expired, then
|
|
111
114
|
* extend its TTL and return the resolved expiry. Used by {@link CanvasInstance}
|
|
112
|
-
* before every op so individual operations slide the window.
|
|
115
|
+
* before every op so individual operations slide the canvas window.
|
|
113
116
|
*/
|
|
114
117
|
touchOrThrow(canvasId, tenantId) {
|
|
115
118
|
const record = this.lookup(canvasId, tenantId);
|
|
@@ -119,6 +122,91 @@ export class CanvasRegistry {
|
|
|
119
122
|
this.touch(record);
|
|
120
123
|
return new Date(record.expiresAt).toISOString();
|
|
121
124
|
}
|
|
125
|
+
/**
|
|
126
|
+
* Slide the canvas TTL **and** the per-table TTL for `tableName` (if it has
|
|
127
|
+
* one). Throws `NotFound` when the canvas is gone or expired. Used by
|
|
128
|
+
* {@link CanvasInstance} on table-scoped ops (`registerTable`, `query`).
|
|
129
|
+
*/
|
|
130
|
+
touchWithTable(canvasId, tenantId, tableName) {
|
|
131
|
+
const record = this.lookup(canvasId, tenantId);
|
|
132
|
+
if (!record) {
|
|
133
|
+
throw notFound('Canvas not found or expired.', { canvasId });
|
|
134
|
+
}
|
|
135
|
+
this.touch(record);
|
|
136
|
+
this.touchTableRecord(record, tableName);
|
|
137
|
+
return new Date(record.expiresAt).toISOString();
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Slide per-table TTLs for every table name that appears as a word-boundary
|
|
141
|
+
* match in `sqlText`, in addition to the canvas-level touch and an explicit
|
|
142
|
+
* `primaryTable` slide. Used by `query()` to slide all tables referenced in
|
|
143
|
+
* the SQL, not just the `registerAs` target.
|
|
144
|
+
*/
|
|
145
|
+
touchWithSqlTables(canvasId, tenantId, primaryTable, sqlText) {
|
|
146
|
+
const record = this.lookup(canvasId, tenantId);
|
|
147
|
+
if (!record) {
|
|
148
|
+
throw notFound('Canvas not found or expired.', { canvasId });
|
|
149
|
+
}
|
|
150
|
+
this.touch(record);
|
|
151
|
+
if (primaryTable !== undefined) {
|
|
152
|
+
this.touchTableRecord(record, primaryTable);
|
|
153
|
+
}
|
|
154
|
+
for (const tableName of record.tableTtl.keys()) {
|
|
155
|
+
if (tableName !== primaryTable && wordBoundaryMatch(sqlText, tableName)) {
|
|
156
|
+
this.touchTableRecord(record, tableName);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return new Date(record.expiresAt).toISOString();
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Register (or replace) a per-table TTL entry. Called by {@link CanvasInstance}
|
|
163
|
+
* after a successful `registerTable` with `ttlMs` set.
|
|
164
|
+
*/
|
|
165
|
+
registerTableTtl(canvasId, tenantId, tableName, ttlMs) {
|
|
166
|
+
const record = this.lookup(canvasId, tenantId);
|
|
167
|
+
if (!record)
|
|
168
|
+
return; // canvas gone between registerTable and this call — no-op
|
|
169
|
+
const now = this.clock();
|
|
170
|
+
record.tableTtl.set(tableName, { ttlMs, expiresAt: now + ttlMs });
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Remove per-table TTL bookkeeping for `tableName`. Called when a table is
|
|
174
|
+
* explicitly dropped via {@link CanvasInstance.drop} so the sweep loop does
|
|
175
|
+
* not attempt to drop a table that no longer exists.
|
|
176
|
+
*/
|
|
177
|
+
dropTableBookkeeping(canvasId, tenantId, tableName) {
|
|
178
|
+
const record = this.lookup(canvasId, tenantId);
|
|
179
|
+
if (!record)
|
|
180
|
+
return;
|
|
181
|
+
record.tableTtl.delete(tableName);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Clear all per-table TTL bookkeeping for a canvas. Called when
|
|
185
|
+
* {@link CanvasInstance.clear} drops all tables so stale entries don't
|
|
186
|
+
* accumulate in the map.
|
|
187
|
+
*/
|
|
188
|
+
clearTableBookkeeping(canvasId, tenantId) {
|
|
189
|
+
const record = this.lookup(canvasId, tenantId);
|
|
190
|
+
if (!record)
|
|
191
|
+
return;
|
|
192
|
+
record.tableTtl.clear();
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Merge per-table `expiresAt` annotations into a `TableInfo[]` array
|
|
196
|
+
* returned by the provider's `describe()`. Tables without a per-table TTL
|
|
197
|
+
* are returned as-is; tables with one get an `expiresAt` field injected.
|
|
198
|
+
*/
|
|
199
|
+
annotateDescribeResult(canvasId, tenantId, tables) {
|
|
200
|
+
const record = this.lookup(canvasId, tenantId);
|
|
201
|
+
if (!record || record.tableTtl.size === 0)
|
|
202
|
+
return tables;
|
|
203
|
+
return tables.map((t) => {
|
|
204
|
+
const entry = record.tableTtl.get(t.name);
|
|
205
|
+
if (!entry)
|
|
206
|
+
return t;
|
|
207
|
+
return { ...t, expiresAt: new Date(entry.expiresAt).toISOString() };
|
|
208
|
+
});
|
|
209
|
+
}
|
|
122
210
|
/**
|
|
123
211
|
* Drop a canvas explicitly (e.g. tenant-initiated cleanup). Returns true
|
|
124
212
|
* when the canvas existed and was destroyed.
|
|
@@ -151,11 +239,58 @@ export class CanvasRegistry {
|
|
|
151
239
|
await Promise.allSettled(records.map((r) => this.destroy(r, context)));
|
|
152
240
|
await this.provider.shutdown();
|
|
153
241
|
}
|
|
154
|
-
/**
|
|
242
|
+
/**
|
|
243
|
+
* Run one sweep pass. Per-table expiry is checked first: expired tables are
|
|
244
|
+
* dropped via `provider.drop()` and their bookkeeping cleared. Then the
|
|
245
|
+
* existing canvas-level check runs — the two clocks are fully independent;
|
|
246
|
+
* a canvas survives a table drop as long as its own window is still live.
|
|
247
|
+
*
|
|
248
|
+
* @internal Test/diagnostic hook — also called by the periodic sweeper timer.
|
|
249
|
+
*/
|
|
155
250
|
async sweep() {
|
|
156
251
|
if (this.isShuttingDown)
|
|
157
252
|
return;
|
|
158
253
|
const now = this.clock();
|
|
254
|
+
const sweepContext = requestContextService.createRequestContext({
|
|
255
|
+
operation: 'CanvasRegistry.sweep',
|
|
256
|
+
});
|
|
257
|
+
// --- Pass 1: per-table expiry ---
|
|
258
|
+
// Collect expired entries before mutating the map to avoid iterator skips.
|
|
259
|
+
const expiredTables = [];
|
|
260
|
+
for (const record of this.canvases.values()) {
|
|
261
|
+
for (const [tableName, entry] of record.tableTtl) {
|
|
262
|
+
if (now >= entry.expiresAt) {
|
|
263
|
+
expiredTables.push({ canvasId: record.canvasId, tableName });
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
let droppedTableCount = 0;
|
|
268
|
+
for (const { canvasId, tableName } of expiredTables) {
|
|
269
|
+
const record = this.canvases.get(canvasId);
|
|
270
|
+
if (!record)
|
|
271
|
+
continue; // canvas already destroyed by an earlier iteration
|
|
272
|
+
try {
|
|
273
|
+
await this.provider.drop(canvasId, tableName, sweepContext);
|
|
274
|
+
record.tableTtl.delete(tableName);
|
|
275
|
+
droppedTableCount += 1;
|
|
276
|
+
}
|
|
277
|
+
catch (err) {
|
|
278
|
+
// Bookkeeping is kept so the next sweep pass retries the drop.
|
|
279
|
+
logger.warning('Provider drop failed during per-table sweep.', {
|
|
280
|
+
...sweepContext,
|
|
281
|
+
canvasId,
|
|
282
|
+
tableName,
|
|
283
|
+
error: err instanceof Error ? err.message : String(err),
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
if (droppedTableCount > 0) {
|
|
288
|
+
logger.debug('Canvas sweeper dropped expired tables.', {
|
|
289
|
+
...sweepContext,
|
|
290
|
+
droppedTableCount,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
// --- Pass 2: canvas-level expiry (unchanged semantics) ---
|
|
159
294
|
const expired = [];
|
|
160
295
|
for (const record of this.canvases.values()) {
|
|
161
296
|
if (now >= record.expiresAt || now - record.createdAt >= this.options.absoluteCapMs) {
|
|
@@ -164,9 +299,6 @@ export class CanvasRegistry {
|
|
|
164
299
|
}
|
|
165
300
|
if (expired.length === 0)
|
|
166
301
|
return;
|
|
167
|
-
const sweepContext = requestContextService.createRequestContext({
|
|
168
|
-
operation: 'CanvasRegistry.sweep',
|
|
169
|
-
});
|
|
170
302
|
await Promise.allSettled(expired.map((r) => this.destroy(r, sweepContext)));
|
|
171
303
|
logger.debug('Canvas sweeper destroyed expired canvases.', {
|
|
172
304
|
...sweepContext,
|
|
@@ -197,6 +329,12 @@ export class CanvasRegistry {
|
|
|
197
329
|
const absoluteExpiry = record.createdAt + this.options.absoluteCapMs;
|
|
198
330
|
record.expiresAt = Math.min(slidingExpiry, absoluteExpiry);
|
|
199
331
|
}
|
|
332
|
+
touchTableRecord(record, tableName) {
|
|
333
|
+
const entry = record.tableTtl.get(tableName);
|
|
334
|
+
if (!entry)
|
|
335
|
+
return;
|
|
336
|
+
entry.expiresAt = this.clock() + entry.ttlMs;
|
|
337
|
+
}
|
|
200
338
|
enforceTenantCap(tenantId) {
|
|
201
339
|
const count = this.byTenant.get(tenantId)?.size ?? 0;
|
|
202
340
|
if (count >= this.options.maxCanvasesPerTenant) {
|
|
@@ -221,6 +359,8 @@ export class CanvasRegistry {
|
|
|
221
359
|
}
|
|
222
360
|
async destroy(record, context) {
|
|
223
361
|
this.canvases.delete(record.canvasId);
|
|
362
|
+
// Clear per-table bookkeeping so stale entries don't survive a re-use.
|
|
363
|
+
record.tableTtl.clear();
|
|
224
364
|
const set = this.byTenant.get(record.tenantId);
|
|
225
365
|
if (set) {
|
|
226
366
|
set.delete(record.canvasId);
|
|
@@ -239,4 +379,21 @@ export class CanvasRegistry {
|
|
|
239
379
|
}
|
|
240
380
|
}
|
|
241
381
|
}
|
|
382
|
+
// ---------------------------------------------------------------------------
|
|
383
|
+
// Module-level helpers
|
|
384
|
+
// ---------------------------------------------------------------------------
|
|
385
|
+
/**
|
|
386
|
+
* Return true when `tableName` appears in `sqlText` as a whole word (i.e.
|
|
387
|
+
* surrounded by non-identifier characters or at text boundaries). A false
|
|
388
|
+
* positive (a name appearing inside a string literal) merely slides the table
|
|
389
|
+
* TTL unnecessarily — harmless. A SQL parser is not warranted.
|
|
390
|
+
*/
|
|
391
|
+
function wordBoundaryMatch(sqlText, tableName) {
|
|
392
|
+
// Word characters for SQL identifiers: letters, digits, underscore.
|
|
393
|
+
const pattern = new RegExp(`(?<![A-Za-z0-9_])${escapeRegExp(tableName)}(?![A-Za-z0-9_])`);
|
|
394
|
+
return pattern.test(sqlText);
|
|
395
|
+
}
|
|
396
|
+
function escapeRegExp(s) {
|
|
397
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
398
|
+
}
|
|
242
399
|
//# sourceMappingURL=CanvasRegistry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CanvasRegistry.js","sourceRoot":"","sources":["../../../../src/services/canvas/core/CanvasRegistry.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CanvasRegistry.js","sourceRoot":"","sources":["../../../../src/services/canvas/core/CanvasRegistry.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,6 +53,12 @@ export interface SpilloverOptions<T extends Row> {
|
|
|
53
53
|
* before any draining begins.
|
|
54
54
|
*/
|
|
55
55
|
tableName?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Per-table sliding TTL forwarded to {@link CanvasInstance.registerTable}.
|
|
58
|
+
* When set, the spilled table ages independently of the canvas; the TTL
|
|
59
|
+
* window slides on reads or writes against this specific table.
|
|
60
|
+
*/
|
|
61
|
+
ttlMs?: number;
|
|
56
62
|
}
|
|
57
63
|
/** Return value when the source fit inside the preview budget. No canvas call was made. */
|
|
58
64
|
export interface SpilloverFitResult<T> {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spillover.d.ts","sourceRoot":"","sources":["../../../src/services/canvas/spillover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEpE,sDAAsD;AACtD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnC,qCAAqC;AACrC,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,GAAG;IAC7C,uDAAuD;IACvD,MAAM,EAAE,cAAc,CAAC;IACvB,6CAA6C;IAC7C,IAAI,CAAC,EAAE;QACL;;;;WAIG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF;;;;;;;OAOG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,6DAA6D;IAC7D,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"spillover.d.ts","sourceRoot":"","sources":["../../../src/services/canvas/spillover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG/D,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEpE,sDAAsD;AACtD,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnC,qCAAqC;AACrC,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,GAAG;IAC7C,uDAAuD;IACvD,MAAM,EAAE,cAAc,CAAC;IACvB,6CAA6C;IAC7C,IAAI,CAAC,EAAE;QACL;;;;WAIG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF;;;;;;;OAOG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,6DAA6D;IAC7D,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACvC;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,2FAA2F;AAC3F,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,WAAW,EAAE,CAAC,EAAE,CAAC;IACjB,OAAO,EAAE,KAAK,CAAC;CAChB;AAED,kGAAkG;AAClG,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,+EAA+E;IAC/E,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,EAAE,CAAC,EAAE,CAAC;IACjB,OAAO,EAAE,IAAI,CAAC;IACd;;;;OAIG;IACH,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wDAAwD;AACxD,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,CAAC;AAMjF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAsB,SAAS,CAAC,CAAC,SAAS,GAAG,EAC3C,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CA0E7B"}
|
|
@@ -105,6 +105,7 @@ export async function spillover(opts) {
|
|
|
105
105
|
handle = await opts.canvas.registerTable(tableName, merged, {
|
|
106
106
|
schema,
|
|
107
107
|
...(opts.signal !== undefined && { signal: opts.signal }),
|
|
108
|
+
...(opts.ttlMs !== undefined && { ttlMs: opts.ttlMs }),
|
|
108
109
|
});
|
|
109
110
|
}
|
|
110
111
|
catch (err) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spillover.js","sourceRoot":"","sources":["../../../src/services/canvas/spillover.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"spillover.js","sourceRoot":"","sources":["../../../src/services/canvas/spillover.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,12 @@ export interface TableInfo {
|
|
|
27
27
|
approxSizeBytes?: number;
|
|
28
28
|
/** Resolved schema for the table or view. */
|
|
29
29
|
columns: ColumnSchema[];
|
|
30
|
+
/**
|
|
31
|
+
* ISO 8601 wall-clock expiry for this table's per-table TTL. Present only
|
|
32
|
+
* when the table was registered with a `ttlMs` option. When absent, the
|
|
33
|
+
* table inherits the canvas lifecycle (no independent expiry).
|
|
34
|
+
*/
|
|
35
|
+
expiresAt?: string;
|
|
30
36
|
/** Whether this entry is a base table or a registered view. */
|
|
31
37
|
kind: CanvasObjectKind;
|
|
32
38
|
/** Canvas-local name. */
|
|
@@ -48,6 +54,15 @@ export interface RegisterTableOptions {
|
|
|
48
54
|
schema?: ColumnSchema[];
|
|
49
55
|
/** Cancellation signal forwarded to the provider. */
|
|
50
56
|
signal?: AbortSignal;
|
|
57
|
+
/**
|
|
58
|
+
* Per-table sliding TTL in milliseconds. When set, this table expires
|
|
59
|
+
* independently of the canvas — the sliding window is extended on any read
|
|
60
|
+
* or write against this specific table. The sweep loop drops the table and
|
|
61
|
+
* clears its bookkeeping when it expires; the canvas itself is unaffected
|
|
62
|
+
* unless its own expiry fires independently. When omitted, the table
|
|
63
|
+
* inherits the canvas lifecycle (no independent expiry).
|
|
64
|
+
*/
|
|
65
|
+
ttlMs?: number;
|
|
51
66
|
}
|
|
52
67
|
/** Result of a successful {@link CanvasInstance.registerTable} call. */
|
|
53
68
|
export interface RegisterTableResult {
|
|
@@ -80,6 +95,12 @@ export interface QueryOptions {
|
|
|
80
95
|
rowLimit?: number;
|
|
81
96
|
/** Cancellation signal — interrupts the underlying connection. */
|
|
82
97
|
signal?: AbortSignal;
|
|
98
|
+
/**
|
|
99
|
+
* Per-table sliding TTL for the table materialized via `registerAs`.
|
|
100
|
+
* Ignored when `registerAs` is not set. Semantics match
|
|
101
|
+
* {@link RegisterTableOptions.ttlMs}.
|
|
102
|
+
*/
|
|
103
|
+
ttlMs?: number;
|
|
83
104
|
}
|
|
84
105
|
/** Result of a successful {@link CanvasInstance.query} call. */
|
|
85
106
|
export interface QueryResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/canvas/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAClB,SAAS,GACT,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,WAAW,GACX,MAAM,GACN,MAAM,GACN,MAAM,CAAC;AAEX,6DAA6D;AAC7D,MAAM,WAAW,YAAY;IAC3B,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB;IACvB,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,yFAAyF;AACzF,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhD,4DAA4D;AAC5D,MAAM,WAAW,SAAS;IACxB,2EAA2E;IAC3E,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6CAA6C;IAC7C,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,+DAA+D;IAC/D,IAAI,EAAE,gBAAgB,CAAC;IACvB,yBAAyB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wDAAwD;AACxD,MAAM,WAAW,oBAAoB;IACnC;;;;;OAKG;IACH,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,qDAAqD;IACrD,MAAM,CAAC,EAAE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/canvas/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyanheads/mcp-ts-core",
|
|
3
|
-
"version": "0.10.
|
|
3
|
+
"version": "0.10.2",
|
|
4
4
|
"mcpName": "io.github.cyanheads/mcp-ts-core",
|
|
5
5
|
"description": "Agent-native TypeScript framework for building MCP servers. Declarative definitions with auth, multi-backend storage, OpenTelemetry, and first-class support for Bun/Node/Cloudflare Workers.",
|
|
6
6
|
"main": "dist/core/index.js",
|
|
@@ -177,8 +177,8 @@
|
|
|
177
177
|
},
|
|
178
178
|
"devDependencies": {
|
|
179
179
|
"@biomejs/biome": "2.4.16",
|
|
180
|
-
"@cloudflare/vitest-pool-workers": "^0.16.
|
|
181
|
-
"@cloudflare/workers-types": "4.
|
|
180
|
+
"@cloudflare/vitest-pool-workers": "^0.16.14",
|
|
181
|
+
"@cloudflare/workers-types": "4.20260610.1",
|
|
182
182
|
"@duckdb/node-api": "^1.5.3-r.3",
|
|
183
183
|
"@hono/otel": "^1.1.2",
|
|
184
184
|
"@opentelemetry/exporter-metrics-otlp-http": "^0.218.0",
|
|
@@ -190,7 +190,7 @@
|
|
|
190
190
|
"@opentelemetry/sdk-node": "^0.218.0",
|
|
191
191
|
"@opentelemetry/sdk-trace-node": "^2.7.1",
|
|
192
192
|
"@opentelemetry/semantic-conventions": "^1.41.1",
|
|
193
|
-
"@supabase/supabase-js": "^2.108.
|
|
193
|
+
"@supabase/supabase-js": "^2.108.1",
|
|
194
194
|
"@types/bun": "^1.3.14",
|
|
195
195
|
"@types/js-yaml": "^4.0.9",
|
|
196
196
|
"@types/node": "^25.9.2",
|
|
@@ -218,7 +218,7 @@
|
|
|
218
218
|
"pdf-lib": "^1.17.1",
|
|
219
219
|
"pino-pretty": "^13.1.3",
|
|
220
220
|
"repomix": "^1.14.1",
|
|
221
|
-
"sanitize-html": "^2.17.
|
|
221
|
+
"sanitize-html": "^2.17.5",
|
|
222
222
|
"tsc-alias": "^1.8.17",
|
|
223
223
|
"typedoc": "^0.28.19",
|
|
224
224
|
"typescript": "^6.0.3",
|
|
@@ -282,7 +282,7 @@
|
|
|
282
282
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
283
283
|
"@opentelemetry/api": "^1.9.1",
|
|
284
284
|
"dotenv": "^17.4.2",
|
|
285
|
-
"hono": "^4.12.
|
|
285
|
+
"hono": "^4.12.25",
|
|
286
286
|
"jose": "^6.2.3",
|
|
287
287
|
"pino": "^10.3.1",
|
|
288
288
|
"zod": "^4.4.3"
|
package/skills/add-tool/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: >
|
|
|
4
4
|
Scaffold a new MCP tool definition. Use when the user asks to add a tool, create a new tool, or implement a new capability for the server.
|
|
5
5
|
metadata:
|
|
6
6
|
author: cyanheads
|
|
7
|
-
version: "2.
|
|
7
|
+
version: "2.14"
|
|
8
8
|
audience: external
|
|
9
9
|
type: reference
|
|
10
10
|
---
|
|
@@ -252,6 +252,43 @@ enrichmentTrailer: {
|
|
|
252
252
|
|
|
253
253
|
`structuredContent` always keeps the full structured value; `enrichmentTrailer` only controls the human-facing `content[]` line.
|
|
254
254
|
|
|
255
|
+
### Capped lists must disclose truncation
|
|
256
|
+
|
|
257
|
+
When a tool accepts a cap-like input (`limit`, `per_page`, `page_size`, `max_results`, `max_items`) and returns an array, disclose when the cap was hit — the agent otherwise treats a partial set as complete.
|
|
258
|
+
|
|
259
|
+
The one-liner: `ctx.enrich.truncated({ shown, cap })`. Declare the fields in the `enrichment` block:
|
|
260
|
+
|
|
261
|
+
```ts
|
|
262
|
+
enrichment: {
|
|
263
|
+
truncated: z.boolean().describe('True when the list was capped at the limit.'),
|
|
264
|
+
shown: z.number().describe('Number of items returned.'),
|
|
265
|
+
cap: z.number().describe('The limit that was applied.'),
|
|
266
|
+
},
|
|
267
|
+
async handler(input, ctx) {
|
|
268
|
+
const items = await fetchItems(input.limit);
|
|
269
|
+
if (items.length >= input.limit) {
|
|
270
|
+
ctx.enrich.truncated({ shown: items.length, cap: input.limit });
|
|
271
|
+
}
|
|
272
|
+
return { items };
|
|
273
|
+
},
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
Alternatively, if the upstream total is known, `ctx.enrich.total(n)` (writes `totalCount`) also satisfies the lint rule.
|
|
277
|
+
|
|
278
|
+
**Threshold bound** — when the upstream total is unknowable but the list is sorted by the cap key, the smallest shown value is a rigorous upper bound on all omitted items (Fagin Threshold Algorithm). Pass it as `ceiling`:
|
|
279
|
+
|
|
280
|
+
```ts
|
|
281
|
+
// items is sorted descending by count; anything hidden has count ≤ items.at(-1).count
|
|
282
|
+
ctx.enrich.truncated({
|
|
283
|
+
shown: items.length,
|
|
284
|
+
cap: input.limit,
|
|
285
|
+
ceiling: items.at(-1)?.count,
|
|
286
|
+
guidance: 'Narrow with filters or raise per_page (max 200).',
|
|
287
|
+
});
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
Declare `truncationCeiling: z.number().optional()` in the `enrichment` block to surface it. The `capped-list-no-truncation` lint rule warns when this disclosure is absent — see `api-linter`.
|
|
291
|
+
|
|
255
292
|
### Communicate filtering and exclusions
|
|
256
293
|
|
|
257
294
|
If the tool omitted, truncated, or filtered anything, say what and how to get it back. Silent omission is invisible to the agent — it can't act on what it doesn't know about.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: api-canvas
|
|
3
3
|
description: >
|
|
4
|
-
DataCanvas primitive reference — a Tier 3 SQL/analytical workspace for tabular MCP servers, backed by DuckDB. Use when registering tables from upstream APIs, running ad-hoc SQL across them, and exporting results. Covers the acquire → register → query → export flow, the token-sharing pattern for multi-agent collaboration, env config, and Cloudflare Workers fail-closed behavior.
|
|
4
|
+
DataCanvas primitive reference — a Tier 3 SQL/analytical workspace for tabular MCP servers, backed by DuckDB. Use when registering tables from upstream APIs, running ad-hoc SQL across them, and exporting results. Covers the acquire → register → query → export flow, per-table TTL, the token-sharing pattern for multi-agent collaboration, env config, and Cloudflare Workers fail-closed behavior.
|
|
5
5
|
metadata:
|
|
6
6
|
author: cyanheads
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.5"
|
|
8
8
|
audience: external
|
|
9
9
|
type: reference
|
|
10
10
|
---
|
|
@@ -129,10 +129,21 @@ await instance.registerTable('big_dataset', asyncRows, {
|
|
|
129
129
|
{ name: 'label', type: 'VARCHAR', nullable: true },
|
|
130
130
|
],
|
|
131
131
|
});
|
|
132
|
+
|
|
133
|
+
// Per-table TTL — this table ages on its own clock (30 min sliding window).
|
|
134
|
+
// The canvas itself is unaffected; other tables on the same canvas are not touched.
|
|
135
|
+
await instance.registerTable('recent_fetch', rows, { ttlMs: 30 * 60 * 1000 });
|
|
132
136
|
```
|
|
133
137
|
|
|
134
138
|
**Schema inference** when `schema` is omitted: sniffer materializes the first 100 rows, unions JS-side types per column, and maps to DuckDB types. Fall-backs to `VARCHAR` for ambiguous unions (string mixed with numerics). Numeric widening: `INTEGER + DOUBLE → DOUBLE`, `INTEGER + BIGINT → BIGINT`. Column ordering follows first-appearance.
|
|
135
139
|
|
|
140
|
+
**Per-table TTL (`ttlMs`)** — optional sliding TTL for this table specifically. When set:
|
|
141
|
+
- The sweep loop drops the table (and clears its bookkeeping) when its window expires.
|
|
142
|
+
- The TTL slides on any read or write against this table: on `registerTable` (initial set), on `query()` (both when the table appears in the SQL text and when it is the `registerAs` target).
|
|
143
|
+
- The canvas itself is unaffected — canvas-level expiry is independent.
|
|
144
|
+
- Tables registered without `ttlMs` inherit the canvas lifecycle exactly as before (no change to default behavior).
|
|
145
|
+
- `instance.describe()` surfaces `TableInfo.expiresAt` (ISO 8601) for tables that have a per-table TTL; absent otherwise.
|
|
146
|
+
|
|
136
147
|
### `instance.query(sql, options?)`
|
|
137
148
|
|
|
138
149
|
Run SQL across registered tables. Returns at most `rowLimit` rows (default 10 000). For full result sets, pass `registerAs` — the result is materialized as a new canvas table; the response carries a `preview` slice plus the table reference.
|
|
@@ -149,10 +160,18 @@ const joined = await instance.query(`
|
|
|
149
160
|
FROM germplasm g JOIN observations o ON g.germplasmDbId = o.germplasmDbId
|
|
150
161
|
`, { registerAs: 'g_with_obs', preview: 10 });
|
|
151
162
|
// joined.tableName === 'g_with_obs'; joined.rows.length === 10; joined.rowCount === <full count>
|
|
163
|
+
|
|
164
|
+
// Materialize with a per-table TTL so the chained result ages independently.
|
|
165
|
+
const chained = await instance.query(
|
|
166
|
+
'SELECT * FROM recent_fetch WHERE score > 0.8',
|
|
167
|
+
{ registerAs: 'high_score', ttlMs: 15 * 60 * 1000 },
|
|
168
|
+
);
|
|
152
169
|
```
|
|
153
170
|
|
|
154
171
|
`registerAs` rejects with `ValidationError` (`data.reason: 'register_as_clash'`) if the target name already exists — drop it first.
|
|
155
172
|
|
|
173
|
+
`ttlMs` on `query({ registerAs })` assigns a per-table TTL to the materialized table — the same sliding semantics as `registerTable({ ttlMs })`. The SQL text is also scanned for referenced table names; any tracked per-table TTL entry found is slid on each `query()` call.
|
|
174
|
+
|
|
156
175
|
**Read-only enforcement** (four layers):
|
|
157
176
|
1. Text-level deny-list — pre-parse scan for file/HTTP-reading table functions (`read_csv*`, `read_json*`, `read_parquet*`, `read_text`, `read_blob`, `glob`, `iceberg_scan`, `delta_scan`, `postgres_scan`, `mysql_scan`, `sqlite_scan`, plus pre-staged spatial ones).
|
|
158
177
|
2. Statement count (must be 1) via `extractStatements`.
|
|
@@ -354,7 +373,7 @@ export const dataframeQuery = tool('dataframe_query', {
|
|
|
354
373
|
| Underlying data is publicly accessible | ✅ |
|
|
355
374
|
| Single-user deployment (stdio, or HTTP with one user) | ✅ — no cross-user surface regardless of data sensitivity |
|
|
356
375
|
| Use case is research / analytics, not multi-tenant SaaS | ✅ |
|
|
357
|
-
| Dataframes must age individually |
|
|
376
|
+
| Dataframes must age individually | ✅ Use `registerTable({ ttlMs })` or `query({ registerAs, ttlMs })` — per-table TTL is independent of canvas-level expiry. The sweep loop drops expired tables while keeping the canvas (and other tables) alive. |
|
|
358
377
|
| Per-user row visibility matters in a multi-user deployment | ❌ — add session/tenant scoping at the server level |
|
|
359
378
|
|
|
360
379
|
The germplasm-flavored [consumer tool template](#consumer-tool-template) below is the same pattern with domain-specific naming.
|
|
@@ -421,6 +440,7 @@ const result = await spillover({
|
|
|
421
440
|
previewChars: 100_000, // ≈ 25k tokens of inline rows
|
|
422
441
|
caps: { maxRows: 50_000 }, // hard upper bound on registered rows
|
|
423
442
|
signal: ctx.signal,
|
|
443
|
+
ttlMs: 30 * 60 * 1000, // optional: per-table TTL forwarded to registerTable
|
|
424
444
|
});
|
|
425
445
|
|
|
426
446
|
if (result.spilled) {
|
|
@@ -4,7 +4,7 @@ description: >
|
|
|
4
4
|
Canonical reference for the unified `Context` object passed to every tool and resource handler in `@cyanheads/mcp-ts-core`. Covers the full interface, all sub-APIs (`ctx.log`, `ctx.state`, `ctx.elicit`, `ctx.sample`, `ctx.progress`, `ctx.enrich`), and when to use each.
|
|
5
5
|
metadata:
|
|
6
6
|
author: cyanheads
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.7"
|
|
8
8
|
audience: external
|
|
9
9
|
type: reference
|
|
10
10
|
---
|
|
@@ -591,6 +591,11 @@ ctx.enrich.notice(text: string): void // writes `notice` → blockq
|
|
|
591
591
|
ctx.enrich.total(count: number): void // writes `totalCount` → "N total"
|
|
592
592
|
ctx.enrich.echo(query: string): void // writes `effectiveQuery` → "Query: …"
|
|
593
593
|
ctx.enrich.delta({ field, before, after }): void // writes `{before, after}` → "field: before → after"
|
|
594
|
+
|
|
595
|
+
// Truncation disclosure — for capped lists:
|
|
596
|
+
ctx.enrich.truncated({ shown, cap, ceiling?, guidance? }): void
|
|
597
|
+
// writes: truncated=true, shown, cap, truncationCeiling? (if ceiling provided)
|
|
598
|
+
// also writes notice via guidance or a generated default (last-wins with other notice calls)
|
|
594
599
|
```
|
|
595
600
|
|
|
596
601
|
### Behavior
|
|
@@ -606,6 +611,41 @@ ctx.enrich.delta({ field, before, after }): void // writes `{before, after}`
|
|
|
606
611
|
| `format-parity` | Enrichment lives outside `output`, so the `format-parity` lint never requires it in `format()`. |
|
|
607
612
|
| Trailer rendering | Per field: kind-tag if set (notice/total/echo/delta), else the definition's `enrichmentTrailer.render`/`label`, else `**key:** value` (objects/arrays `JSON.stringify`'d). A structured field with no `render` errors under `enrichment-trailer-render` — supply one so it renders as markdown; `structuredContent` keeps the full value regardless. |
|
|
608
613
|
|
|
614
|
+
### `ctx.enrich.truncated()` — capped-list disclosure
|
|
615
|
+
|
|
616
|
+
For tools that cap a list (i.e. have a `limit`/`per_page`/`page_size`/`max_results`/`max_items` input), call `truncated()` when the cap was actually hit:
|
|
617
|
+
|
|
618
|
+
```ts
|
|
619
|
+
enrichment: {
|
|
620
|
+
truncated: z.boolean().describe('True when the list was capped.'),
|
|
621
|
+
shown: z.number().describe('Number of items returned.'),
|
|
622
|
+
cap: z.number().describe('The limit that was applied.'),
|
|
623
|
+
truncationCeiling: z.number().optional().describe('Upper bound for omitted items (threshold bound).'),
|
|
624
|
+
},
|
|
625
|
+
async handler(input, ctx) {
|
|
626
|
+
const items = await fetch(input.limit);
|
|
627
|
+
if (items.length >= input.limit) {
|
|
628
|
+
ctx.enrich.truncated({
|
|
629
|
+
shown: items.length,
|
|
630
|
+
cap: input.limit,
|
|
631
|
+
ceiling: items.at(-1)?.count, // optional — only when list sorted by cap key
|
|
632
|
+
guidance: 'Narrow with filters or raise per_page (max 200).',
|
|
633
|
+
});
|
|
634
|
+
}
|
|
635
|
+
return { items };
|
|
636
|
+
},
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
| Field written | Key | Notes |
|
|
640
|
+
|:---|:---|:---|
|
|
641
|
+
| `truncated` | `true` | Always |
|
|
642
|
+
| `shown` | `number` | Always |
|
|
643
|
+
| `cap` | `number` | Always |
|
|
644
|
+
| `truncationCeiling` | `number` | Only when `ceiling` is passed |
|
|
645
|
+
| `notice` | `string` | Via `guidance` or a generated default; **last-wins** — a handler with multiple notice sources (e.g. both truncation and empty-result) should compose them into one string passed as `guidance`, or call `truncated()` after the other notice calls. |
|
|
646
|
+
|
|
647
|
+
The `capped-list-no-truncation` lint rule fires when a cap-like input + array output shape is present without any of: `truncated` or `totalCount` in the declared `enrichment`, or `truncated` or `totalCount` in `output`. Using `ctx.enrich.total(n)` (writes `totalCount`) is also recognized as honest disclosure.
|
|
648
|
+
|
|
609
649
|
See `add-tool`'s **Tool Response Design** and `skills/api-linter` (`enrichment-*` rules) for the full pattern. Test enrichment with `getEnrichment(ctx)` from `@cyanheads/mcp-ts-core/testing`.
|
|
610
650
|
|
|
611
651
|
---
|