@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.
Files changed (54) hide show
  1. package/AGENTS.md +2 -2
  2. package/CLAUDE.md +2 -2
  3. package/README.md +1 -1
  4. package/changelog/0.10.x/0.10.2.md +35 -0
  5. package/dist/core/context.d.ts +22 -0
  6. package/dist/core/context.d.ts.map +1 -1
  7. package/dist/core/context.js +12 -0
  8. package/dist/core/context.js.map +1 -1
  9. package/dist/linter/rules/enrichment-rules.d.ts +20 -0
  10. package/dist/linter/rules/enrichment-rules.d.ts.map +1 -1
  11. package/dist/linter/rules/enrichment-rules.js +74 -9
  12. package/dist/linter/rules/enrichment-rules.js.map +1 -1
  13. package/dist/linter/rules/index.d.ts +2 -2
  14. package/dist/linter/rules/index.d.ts.map +1 -1
  15. package/dist/linter/rules/index.js +2 -2
  16. package/dist/linter/rules/index.js.map +1 -1
  17. package/dist/linter/rules/schema-rules.d.ts +4 -0
  18. package/dist/linter/rules/schema-rules.d.ts.map +1 -1
  19. package/dist/linter/rules/schema-rules.js +13 -0
  20. package/dist/linter/rules/schema-rules.js.map +1 -1
  21. package/dist/linter/rules/tool-rules.d.ts +12 -0
  22. package/dist/linter/rules/tool-rules.d.ts.map +1 -1
  23. package/dist/linter/rules/tool-rules.js +48 -1
  24. package/dist/linter/rules/tool-rules.js.map +1 -1
  25. package/dist/linter/types.d.ts +17 -0
  26. package/dist/linter/types.d.ts.map +1 -1
  27. package/dist/linter/validate.d.ts.map +1 -1
  28. package/dist/linter/validate.js +55 -1
  29. package/dist/linter/validate.js.map +1 -1
  30. package/dist/logs/combined.log +4 -0
  31. package/dist/logs/error.log +2 -0
  32. package/dist/logs/interactions.log +0 -0
  33. package/dist/services/canvas/core/CanvasInstance.d.ts +1 -1
  34. package/dist/services/canvas/core/CanvasInstance.d.ts.map +1 -1
  35. package/dist/services/canvas/core/CanvasInstance.js +36 -11
  36. package/dist/services/canvas/core/CanvasInstance.js.map +1 -1
  37. package/dist/services/canvas/core/CanvasRegistry.d.ts +50 -3
  38. package/dist/services/canvas/core/CanvasRegistry.d.ts.map +1 -1
  39. package/dist/services/canvas/core/CanvasRegistry.js +163 -6
  40. package/dist/services/canvas/core/CanvasRegistry.js.map +1 -1
  41. package/dist/services/canvas/spillover.d.ts +6 -0
  42. package/dist/services/canvas/spillover.d.ts.map +1 -1
  43. package/dist/services/canvas/spillover.js +1 -0
  44. package/dist/services/canvas/spillover.js.map +1 -1
  45. package/dist/services/canvas/types.d.ts +21 -0
  46. package/dist/services/canvas/types.d.ts.map +1 -1
  47. package/package.json +6 -6
  48. package/skills/add-tool/SKILL.md +38 -1
  49. package/skills/api-canvas/SKILL.md +23 -3
  50. package/skills/api-context/SKILL.md +41 -1
  51. package/skills/api-linter/SKILL.md +77 -3
  52. package/skills/api-mirror/SKILL.md +30 -1
  53. package/skills/design-mcp-server/SKILL.md +2 -1
  54. 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). Public access is gated by {@link DataCanvas}.
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
- /** @internal Test/diagnostic hook — runs one sweep pass synchronously. */
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;CACpB;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,CAyE7B"}
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":"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"}
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":"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"}
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.1",
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.13",
181
- "@cloudflare/workers-types": "4.20260608.1",
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.0",
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.4",
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.24",
285
+ "hono": "^4.12.25",
286
286
  "jose": "^6.2.3",
287
287
  "pino": "^10.3.1",
288
288
  "zod": "^4.4.3"
@@ -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.13"
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.4"
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 | ⚠️ TTL is canvas-level today (a hot canvas keeps stale tables alive); per-table TTL is tracked in [#140](https://github.com/cyanheads/mcp-ts-core/issues/140). Backstop with `ctx.state` bookkeeping in the interim. |
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.6"
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
  ---