pilotswarm-sdk 0.5.36 → 0.5.38

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 (43) hide show
  1. package/dist/artifact-tools.d.ts.map +1 -1
  2. package/dist/artifact-tools.js +41 -6
  3. package/dist/artifact-tools.js.map +1 -1
  4. package/dist/canvas-app-manifest.d.ts +49 -0
  5. package/dist/canvas-app-manifest.d.ts.map +1 -0
  6. package/dist/canvas-app-manifest.js +206 -0
  7. package/dist/canvas-app-manifest.js.map +1 -0
  8. package/dist/cms-migrations.d.ts.map +1 -1
  9. package/dist/cms-migrations.js +200 -0
  10. package/dist/cms-migrations.js.map +1 -1
  11. package/dist/cms.d.ts +41 -0
  12. package/dist/cms.d.ts.map +1 -1
  13. package/dist/cms.js +55 -0
  14. package/dist/cms.js.map +1 -1
  15. package/dist/index.d.ts +2 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +4 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/managed-session.d.ts +20 -0
  20. package/dist/managed-session.d.ts.map +1 -1
  21. package/dist/managed-session.js +369 -72
  22. package/dist/managed-session.js.map +1 -1
  23. package/dist/management-client.d.ts.map +1 -1
  24. package/dist/management-client.js +8 -1
  25. package/dist/management-client.js.map +1 -1
  26. package/dist/model-providers.d.ts +142 -6
  27. package/dist/model-providers.d.ts.map +1 -1
  28. package/dist/model-providers.js +117 -1
  29. package/dist/model-providers.js.map +1 -1
  30. package/dist/session-manager.d.ts +13 -0
  31. package/dist/session-manager.d.ts.map +1 -1
  32. package/dist/session-manager.js +164 -11
  33. package/dist/session-manager.js.map +1 -1
  34. package/dist/session-proxy.d.ts +9 -10
  35. package/dist/session-proxy.d.ts.map +1 -1
  36. package/dist/session-proxy.js +372 -133
  37. package/dist/session-proxy.js.map +1 -1
  38. package/dist/types.d.ts +0 -7
  39. package/dist/types.d.ts.map +1 -1
  40. package/dist/types.js.map +1 -1
  41. package/package.json +3 -3
  42. package/plugins/system/agents/default.agent.md +94 -22
  43. package/plugins/system/skills/html-visuals/SKILL.md +215 -14
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-tools.d.ts","sourceRoot":"","sources":["../src/artifact-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAOH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA6DxD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACtC,SAAS,EAAE,aAAa,CAAC;CAC5B,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAoUd"}
1
+ {"version":3,"file":"artifact-tools.d.ts","sourceRoot":"","sources":["../src/artifact-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAQH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA6DxD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACtC,SAAS,EAAE,aAAa,CAAC;CAC5B,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAwWd"}
@@ -29,6 +29,7 @@ import crypto from "node:crypto";
29
29
  import fs from "node:fs";
30
30
  import os from "node:os";
31
31
  import path from "node:path";
32
+ import { extractCanvasAppManifest, normalizeCanvasResponseContract } from "./canvas-app-manifest.js";
32
33
  import { defineTool } from "@github/copilot-sdk";
33
34
  const INLINE_READ_DEFAULT_BYTES = 65_536;
34
35
  const INLINE_READ_MAX_BYTES = 262_144;
@@ -130,14 +131,14 @@ export function createArtifactTools(opts) {
130
131
  description: "Copy another session's artifact server-side (source 3 of 3). " +
131
132
  "Bytes move store-to-store.",
132
133
  properties: {
133
- sessionId: { type: "string", description: "Session that owns the source artifact." },
134
+ sessionId: { type: "string", description: "Session that owns the source artifact. Defaults to this session — the save-the-canvas recipe needs only a filename." },
134
135
  filename: { type: "string", description: "Source artifact filename." },
135
136
  expectedSha256: {
136
137
  type: "string",
137
- description: "Optional precondition: fail with SHA_MISMATCH if the copied bytes hash differently.",
138
+ description: "Optional precondition: fail with SHA_MISMATCH if the copied bytes hash differently (sha256 of the stored bytes, as reported by list_artifacts/read_artifact metaOnly).",
138
139
  },
139
140
  },
140
- required: ["sessionId", "filename"],
141
+ required: ["filename"],
141
142
  },
142
143
  contentType: {
143
144
  type: "string",
@@ -183,7 +184,10 @@ export function createArtifactTools(opts) {
183
184
  if (params.fromArtifact) {
184
185
  const from = params.fromArtifact;
185
186
  const filename = params.filename || path.basename(from.filename);
186
- const metadata = await blobStore.copyArtifact(from.sessionId, from.filename, sessionId, filename, { pinned });
187
+ // Source session defaults to self: the canonical save-as
188
+ // ("copy my canvas.html to apps/<name>.html") should not
189
+ // require the model to know its own session id.
190
+ const metadata = await blobStore.copyArtifact(from.sessionId || sessionId, from.filename, sessionId, filename, { pinned });
187
191
  if (from.expectedSha256 && metadata.sha256 !== from.expectedSha256) {
188
192
  await blobStore.deleteArtifact(sessionId, metadata.filename);
189
193
  return toolError("SHA_MISMATCH", `Copied bytes hash ${metadata.sha256}, expected ${from.expectedSha256}. The copy was deleted.`, "The source artifact is not the bytes you believed. Re-verify the source with read_artifact({metaOnly: true}).");
@@ -230,6 +234,12 @@ export function createArtifactTools(opts) {
230
234
  type: "boolean",
231
235
  description: "Return metadata only — no content transfer.",
232
236
  },
237
+ manifestOnly: {
238
+ type: "boolean",
239
+ description: "Return only the artifact's embedded CANVAS-APP-MANIFEST (name, description, "
240
+ + "responseContract, data/usage notes) — the cheap way to learn a stored canvas app's "
241
+ + "interface before draw_canvas({fromArtifact}). Never returns the document bytes.",
242
+ },
233
243
  toFile: {
234
244
  type: "string",
235
245
  description: "Write the artifact to this worker-local path instead of returning content. " +
@@ -252,10 +262,35 @@ export function createArtifactTools(opts) {
252
262
  required: ["sessionId", "filename"],
253
263
  },
254
264
  handler: async (params) => {
255
- if (params.metaOnly && params.toFile) {
256
- return toolError("EXCLUSIVE_MODE", "metaOnly and toFile are mutually exclusive.", "Use metaOnly for metadata, toFile to materialize bytes, or neither for inline content.");
265
+ if ([params.metaOnly, params.manifestOnly, params.toFile].filter(Boolean).length > 1) {
266
+ return toolError("EXCLUSIVE_MODE", "metaOnly, manifestOnly, and toFile are mutually exclusive.", "Use metaOnly for metadata, manifestOnly for a canvas app's interface card, toFile to materialize bytes, or none for inline content.");
257
267
  }
258
268
  try {
269
+ if (params.manifestOnly) {
270
+ const text = await blobStore.downloadArtifactText(params.sessionId, params.filename);
271
+ const extraction = extractCanvasAppManifest(text);
272
+ // Same discipline as every other card surface: the contract
273
+ // is returned POST-normalizer (4 KB cap) or not at all — a
274
+ // 40 KB "contract" must not ride the cheap read into context.
275
+ let manifest = extraction.manifest;
276
+ let contractError;
277
+ if (manifest?.responseContract !== undefined) {
278
+ const normalized = normalizeCanvasResponseContract(manifest.responseContract);
279
+ const { responseContract: _raw, ...rest } = manifest;
280
+ manifest = normalized.contract ? { ...rest, responseContract: normalized.contract } : rest;
281
+ if (normalized.error)
282
+ contractError = normalized.error;
283
+ }
284
+ return JSON.stringify({
285
+ success: true,
286
+ sessionId: params.sessionId,
287
+ filename: params.filename,
288
+ sizeBytes: Buffer.byteLength(text, "utf8"),
289
+ manifest,
290
+ ...(extraction.error ? { manifestError: extraction.error } : {}),
291
+ ...(contractError ? { manifestContractError: contractError } : {}),
292
+ });
293
+ }
259
294
  if (params.metaOnly) {
260
295
  const metadata = await blobStore.statArtifact(params.sessionId, params.filename);
261
296
  if (!metadata) {
@@ -1 +1 @@
1
- {"version":3,"file":"artifact-tools.js","sourceRoot":"","sources":["../src/artifact-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"artifact-tools.js","sourceRoot":"","sources":["../src/artifact-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Canvas app self-description: the CANVAS-APP-MANIFEST comment convention and
3
+ * the response-contract grammar, in one module because they are one grammar —
4
+ * a manifest's embedded contract passes through the SAME normalizer the
5
+ * draw_canvas tool argument does, so no app can smuggle a shape the browser
6
+ * would not enforce.
7
+ *
8
+ * A canvas app is a normal single-file HTML document whose first HTML comment
9
+ * (within the first 4 KB, by convention immediately after <!doctype html>) is:
10
+ *
11
+ * <!-- CANVAS-APP-MANIFEST
12
+ * { "manifestVersion": 1, "name": "...", "description": "...",
13
+ * "responseContract": { "actions": { ... } },
14
+ * "data": "tick shape notes", "notes": "usage notes" }
15
+ * -->
16
+ *
17
+ * Everything except responseContract is documentation for the loading LLM;
18
+ * only the contract is enforced (browser-side, default-closed, unchanged).
19
+ */
20
+ export declare function normalizeCanvasResponseContract(raw: unknown): {
21
+ contract?: Record<string, any>;
22
+ error?: string;
23
+ };
24
+ export interface CanvasAppManifest {
25
+ manifestVersion?: number;
26
+ name?: string;
27
+ version?: string;
28
+ description?: string;
29
+ data?: string;
30
+ notes?: string;
31
+ responseContract?: Record<string, any>;
32
+ }
33
+ /**
34
+ * Extract the embedded CANVAS-APP-MANIFEST from an HTML document.
35
+ *
36
+ * Distinguishes three outcomes on purpose:
37
+ * { manifest } — present and parseable
38
+ * { manifest: null } — no manifest (an ordinary canvas document)
39
+ * { manifest: null, error } — a manifest was ATTEMPTED and is broken; the
40
+ * draw path treats this as fail-closed when no
41
+ * explicit contract argument saves the draw.
42
+ */
43
+ export declare function extractCanvasAppManifest(html: string): {
44
+ manifest: CanvasAppManifest | null;
45
+ error?: string;
46
+ };
47
+ /** The compact "app card" fields returned to the drawing agent — never the html. */
48
+ export declare function canvasAppCard(manifest: CanvasAppManifest | null): Record<string, string | number> | undefined;
49
+ //# sourceMappingURL=canvas-app-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-app-manifest.d.ts","sourceRoot":"","sources":["../src/canvas-app-manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AASH,wBAAgB,+BAA+B,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAwDhH;AAQD,MAAM,WAAW,iBAAiB;IAC9B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC1C;AAeD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CA2D7G;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,CAS7G"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Canvas app self-description: the CANVAS-APP-MANIFEST comment convention and
3
+ * the response-contract grammar, in one module because they are one grammar —
4
+ * a manifest's embedded contract passes through the SAME normalizer the
5
+ * draw_canvas tool argument does, so no app can smuggle a shape the browser
6
+ * would not enforce.
7
+ *
8
+ * A canvas app is a normal single-file HTML document whose first HTML comment
9
+ * (within the first 4 KB, by convention immediately after <!doctype html>) is:
10
+ *
11
+ * <!-- CANVAS-APP-MANIFEST
12
+ * { "manifestVersion": 1, "name": "...", "description": "...",
13
+ * "responseContract": { "actions": { ... } },
14
+ * "data": "tick shape notes", "notes": "usage notes" }
15
+ * -->
16
+ *
17
+ * Everything except responseContract is documentation for the loading LLM;
18
+ * only the contract is enforced (browser-side, default-closed, unchanged).
19
+ */
20
+ const CANVAS_CONTRACT_NAME_RE = /^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/;
21
+ const CANVAS_CONTRACT_FIELD_TYPES = new Set(["string", "number", "boolean", "json"]);
22
+ const CANVAS_CONTRACT_MAX_ACTIONS = 16;
23
+ const CANVAS_CONTRACT_MAX_FIELDS = 16;
24
+ const CANVAS_CONTRACT_MAX_BYTES = 4096;
25
+ const CANVAS_CONTRACT_DATA_MAX_BYTES = 1024;
26
+ export function normalizeCanvasResponseContract(raw) {
27
+ if (raw === undefined || raw === null)
28
+ return {};
29
+ if (typeof raw !== "object" || Array.isArray(raw))
30
+ return { error: "responseContract must be an object" };
31
+ const actions = raw.actions;
32
+ if (typeof actions !== "object" || actions === null || Array.isArray(actions)) {
33
+ return { error: 'responseContract must be {"actions":{...}}' };
34
+ }
35
+ const names = Object.keys(actions);
36
+ if (names.length === 0)
37
+ return { error: "responseContract.actions is empty — omit the contract instead" };
38
+ if (names.length > CANVAS_CONTRACT_MAX_ACTIONS) {
39
+ return { error: `responseContract declares ${names.length} actions; the cap is ${CANVAS_CONTRACT_MAX_ACTIONS}` };
40
+ }
41
+ const normalized = {};
42
+ for (const name of names) {
43
+ if (!CANVAS_CONTRACT_NAME_RE.test(name))
44
+ return { error: `invalid action name ${JSON.stringify(name)}` };
45
+ const fields = actions[name];
46
+ if (typeof fields !== "object" || fields === null || Array.isArray(fields)) {
47
+ return { error: `action ${JSON.stringify(name)} must map field names to types` };
48
+ }
49
+ const fieldNames = Object.keys(fields);
50
+ if (fieldNames.length > CANVAS_CONTRACT_MAX_FIELDS) {
51
+ return { error: `action ${JSON.stringify(name)} declares ${fieldNames.length} fields; the cap is ${CANVAS_CONTRACT_MAX_FIELDS}` };
52
+ }
53
+ const normalizedFields = {};
54
+ for (const fieldName of fieldNames) {
55
+ if (!CANVAS_CONTRACT_NAME_RE.test(fieldName)) {
56
+ return { error: `invalid field name ${JSON.stringify(fieldName)} on action ${JSON.stringify(name)}` };
57
+ }
58
+ const declared = String(fields[fieldName] ?? "");
59
+ const baseType = declared.endsWith("?") ? declared.slice(0, -1) : declared;
60
+ if (!CANVAS_CONTRACT_FIELD_TYPES.has(baseType)) {
61
+ return { error: `field ${JSON.stringify(fieldName)} on action ${JSON.stringify(name)} has unknown type ${JSON.stringify(declared)}; use string, number, boolean, or json (append ? for optional)` };
62
+ }
63
+ normalizedFields[fieldName] = declared;
64
+ }
65
+ normalized[name] = normalizedFields;
66
+ }
67
+ // The optional data key documents the update_canvas tick shape (e.g.
68
+ // { example: {...} }). It rides the canonical contract into the draw
69
+ // event and back out of read_canvas(manifestOnly), which is what makes
70
+ // "re-read the contract before ticking so your payload never drifts" a
71
+ // real loop instead of doc fiction. Bounded so the card stays cheap.
72
+ let dataDoc;
73
+ if (raw.data !== undefined) {
74
+ dataDoc = raw.data;
75
+ const dataBytes = Buffer.byteLength(JSON.stringify(dataDoc) ?? "", "utf8");
76
+ if (!Number.isFinite(dataBytes) || dataBytes > CANVAS_CONTRACT_DATA_MAX_BYTES) {
77
+ return { error: `responseContract.data serializes to ${dataBytes} bytes; the cap is ${CANVAS_CONTRACT_DATA_MAX_BYTES} — it is a shape EXAMPLE, not a payload` };
78
+ }
79
+ }
80
+ const canonical = { actions: normalized, ...(dataDoc !== undefined ? { data: dataDoc } : {}) };
81
+ const bytes = Buffer.byteLength(JSON.stringify(canonical), "utf8");
82
+ if (bytes > CANVAS_CONTRACT_MAX_BYTES) {
83
+ return { error: `responseContract is ${bytes} bytes serialized; the cap is ${CANVAS_CONTRACT_MAX_BYTES}` };
84
+ }
85
+ return { contract: canonical };
86
+ }
87
+ /** The manifest comment must START within this many characters. */
88
+ const MANIFEST_SCAN_WINDOW = 4096;
89
+ /** Cap on each extracted prose field — the card must stay cheap in context. */
90
+ const MANIFEST_PROSE_CAP = 400;
91
+ const MANIFEST_MARKER = "CANVAS-APP-MANIFEST";
92
+ function clampProse(value) {
93
+ if (typeof value !== "string")
94
+ return undefined;
95
+ const trimmed = value.trim();
96
+ if (!trimmed)
97
+ return undefined;
98
+ if (trimmed.length <= MANIFEST_PROSE_CAP)
99
+ return trimmed;
100
+ let cut = trimmed.slice(0, MANIFEST_PROSE_CAP - 1);
101
+ // Never split a surrogate pair: a lone high surrogate is not well-formed
102
+ // JSON text and PG rejects it, which can silently drop the transcript
103
+ // event carrying the card.
104
+ if (/[\uD800-\uDBFF]$/.test(cut))
105
+ cut = cut.slice(0, -1);
106
+ return `${cut}…`;
107
+ }
108
+ /**
109
+ * Extract the embedded CANVAS-APP-MANIFEST from an HTML document.
110
+ *
111
+ * Distinguishes three outcomes on purpose:
112
+ * { manifest } — present and parseable
113
+ * { manifest: null } — no manifest (an ordinary canvas document)
114
+ * { manifest: null, error } — a manifest was ATTEMPTED and is broken; the
115
+ * draw path treats this as fail-closed when no
116
+ * explicit contract argument saves the draw.
117
+ */
118
+ export function extractCanvasAppManifest(html) {
119
+ const head = String(html ?? "").slice(0, MANIFEST_SCAN_WINDOW + 65_536);
120
+ // A manifest is a comment that OPENS with the marker: "<!--" followed by
121
+ // optional whitespace and CANVAS-APP-MANIFEST. Scanning comment OPENS
122
+ // (not marker occurrences) means neither prose, nor script strings, nor a
123
+ // header comment that merely MENTIONS the convention can shadow or
124
+ // impersonate the real manifest — both misreads used to fail perfectly
125
+ // valid fromArtifact draws closed.
126
+ let commentStart = -1;
127
+ let markerAt = -1;
128
+ let searchFrom = 0;
129
+ while (searchFrom <= MANIFEST_SCAN_WINDOW) {
130
+ const open = head.indexOf("<!--", searchFrom);
131
+ if (open < 0 || open > MANIFEST_SCAN_WINDOW)
132
+ break;
133
+ const afterOpen = open + 4;
134
+ const tokenMatch = /^[\s]*/.exec(head.slice(afterOpen, afterOpen + 64));
135
+ const tokenAt = afterOpen + (tokenMatch ? tokenMatch[0].length : 0);
136
+ if (head.startsWith(MANIFEST_MARKER, tokenAt)) {
137
+ commentStart = open;
138
+ markerAt = tokenAt;
139
+ break;
140
+ }
141
+ const close = head.indexOf("-->", afterOpen);
142
+ if (close < 0)
143
+ break;
144
+ searchFrom = close + 3;
145
+ }
146
+ if (commentStart < 0)
147
+ return { manifest: null };
148
+ const commentEnd = head.indexOf("-->", markerAt);
149
+ if (commentEnd < 0) {
150
+ return { manifest: null, error: "CANVAS-APP-MANIFEST comment is never closed (missing -->)" };
151
+ }
152
+ const jsonText = head.slice(markerAt + MANIFEST_MARKER.length, commentEnd).trim();
153
+ if (!jsonText)
154
+ return { manifest: null, error: "CANVAS-APP-MANIFEST comment contains no JSON" };
155
+ let parsed;
156
+ try {
157
+ parsed = JSON.parse(jsonText);
158
+ }
159
+ catch (err) {
160
+ return { manifest: null, error: `CANVAS-APP-MANIFEST is not valid JSON: ${err?.message || String(err)}` };
161
+ }
162
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
163
+ return { manifest: null, error: "CANVAS-APP-MANIFEST must be a JSON object" };
164
+ }
165
+ const raw = parsed;
166
+ const manifest = {};
167
+ if (Number.isFinite(Number(raw.manifestVersion)))
168
+ manifest.manifestVersion = Number(raw.manifestVersion);
169
+ const name = clampProse(raw.name);
170
+ if (name)
171
+ manifest.name = name;
172
+ const version = clampProse(raw.version);
173
+ if (version)
174
+ manifest.version = version;
175
+ const description = clampProse(raw.description);
176
+ if (description)
177
+ manifest.description = description;
178
+ const data = clampProse(raw.data);
179
+ if (data)
180
+ manifest.data = data;
181
+ const notes = clampProse(raw.notes);
182
+ if (notes)
183
+ manifest.notes = notes;
184
+ if (raw.responseContract !== undefined) {
185
+ manifest.responseContract = raw.responseContract;
186
+ }
187
+ return { manifest };
188
+ }
189
+ /** The compact "app card" fields returned to the drawing agent — never the html. */
190
+ export function canvasAppCard(manifest) {
191
+ if (!manifest)
192
+ return undefined;
193
+ const card = {};
194
+ if (manifest.name)
195
+ card.name = manifest.name;
196
+ if (manifest.version)
197
+ card.version = manifest.version;
198
+ if (manifest.description)
199
+ card.description = manifest.description;
200
+ if (manifest.data)
201
+ card.data = manifest.data;
202
+ if (manifest.notes)
203
+ card.notes = manifest.notes;
204
+ return Object.keys(card).length > 0 ? card : undefined;
205
+ }
206
+ //# sourceMappingURL=canvas-app-manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-app-manifest.js","sourceRoot":"","sources":["../src/canvas-app-manifest.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"cms-migrations.d.ts","sourceRoot":"","sources":["../src/cms-migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE,CA0N/D"}
1
+ {"version":3,"file":"cms-migrations.d.ts","sourceRoot":"","sources":["../src/cms-migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,EAAE,CAoO/D"}
@@ -227,8 +227,155 @@ export function CMS_MIGRATIONS(schema) {
227
227
  name: "agent_package_namespaces",
228
228
  sql: migration_0043_agent_package_namespaces(schema),
229
229
  },
230
+ {
231
+ version: "0044",
232
+ name: "list_sessions_page_ms_cursor",
233
+ sql: migration_0044_list_sessions_page_ms_cursor(schema),
234
+ },
235
+ {
236
+ version: "0045",
237
+ name: "session_canvases",
238
+ sql: migration_0045_session_canvases(schema),
239
+ },
230
240
  ];
231
241
  }
242
+ // ─── Migration 0044: ms-space keyset for session paging ──────────
243
+ //
244
+ // PG stores updated_at at MICROsecond precision; the wire cursor is a JS Date
245
+ // (milliseconds). Comparing an ms-truncated cursor against full-precision
246
+ // columns silently skipped every same-millisecond row that landed at a page
247
+ // boundary — cms-read-bounds is the detector, open since v0.5.31. Predicate
248
+ // and ORDER BY now both truncate to milliseconds, so (trunc_ms, session_id)
249
+ // is a total order the ms cursor addresses exactly. Function replace only —
250
+ // same signature, no table DDL, no lock exposure.
251
+ function migration_0044_list_sessions_page_ms_cursor(schema) {
252
+ const s = `"${schema}"`;
253
+ return `
254
+ -- 0044_list_sessions_page_ms_cursor: keyset comparisons in millisecond space.
255
+ CREATE OR REPLACE FUNCTION ${s}.cms_list_sessions_page(
256
+ p_limit INT DEFAULT 51,
257
+ p_cursor_updated_at TIMESTAMPTZ DEFAULT NULL,
258
+ p_cursor_session_id TEXT DEFAULT NULL,
259
+ p_include_deleted BOOL DEFAULT FALSE,
260
+ p_viewer_provider TEXT DEFAULT NULL,
261
+ p_viewer_subject TEXT DEFAULT NULL,
262
+ p_viewer_system_visible BOOL DEFAULT TRUE,
263
+ p_placement_provider TEXT DEFAULT NULL,
264
+ p_placement_subject TEXT DEFAULT NULL
265
+ ) RETURNS TABLE (
266
+ session_id TEXT,
267
+ orchestration_id TEXT,
268
+ title TEXT,
269
+ title_locked BOOLEAN,
270
+ state TEXT,
271
+ model TEXT,
272
+ reasoning_effort TEXT,
273
+ group_id TEXT,
274
+ short_summary TEXT,
275
+ summary_state JSONB,
276
+ summary_updated_at TIMESTAMPTZ,
277
+ created_at TIMESTAMPTZ,
278
+ updated_at TIMESTAMPTZ,
279
+ last_active_at TIMESTAMPTZ,
280
+ deleted_at TIMESTAMPTZ,
281
+ current_iteration INTEGER,
282
+ last_error TEXT,
283
+ parent_session_id TEXT,
284
+ wait_reason TEXT,
285
+ is_system BOOLEAN,
286
+ agent_id TEXT,
287
+ splash TEXT,
288
+ owner_provider TEXT,
289
+ owner_subject TEXT,
290
+ owner_email TEXT,
291
+ owner_display_name TEXT,
292
+ splash_mobile TEXT,
293
+ visibility TEXT,
294
+ root_session_id TEXT
295
+ ) AS $$
296
+ DECLARE
297
+ v_limit INT := GREATEST(1, LEAST(COALESCE(p_limit, 51), 201));
298
+ v_placement_user BIGINT;
299
+ BEGIN
300
+ IF p_placement_provider IS NOT NULL AND p_placement_subject IS NOT NULL THEN
301
+ SELECT u.user_id INTO v_placement_user
302
+ FROM ${s}.users u
303
+ WHERE u.provider = BTRIM(p_placement_provider) AND u.subject = BTRIM(p_placement_subject);
304
+ END IF;
305
+ RETURN QUERY
306
+ SELECT
307
+ sess.session_id,
308
+ sess.orchestration_id,
309
+ sess.title,
310
+ sess.title_locked,
311
+ sess.state,
312
+ sess.model,
313
+ sess.reasoning_effort,
314
+ usgp.group_id,
315
+ sess.short_summary,
316
+ sess.summary_state,
317
+ sess.summary_updated_at,
318
+ sess.created_at,
319
+ sess.updated_at,
320
+ sess.last_active_at,
321
+ sess.deleted_at,
322
+ sess.current_iteration,
323
+ sess.last_error,
324
+ sess.parent_session_id,
325
+ sess.wait_reason,
326
+ sess.is_system,
327
+ sess.agent_id,
328
+ sess.splash,
329
+ u.provider AS owner_provider,
330
+ u.subject AS owner_subject,
331
+ u.email AS owner_email,
332
+ u.display_name AS owner_display_name,
333
+ sess.splash_mobile,
334
+ sess.visibility,
335
+ sess.root_session_id
336
+ FROM ${s}.sessions sess
337
+ LEFT JOIN ${s}.session_owners so ON so.session_id = sess.session_id
338
+ LEFT JOIN ${s}.users u ON u.user_id = so.user_id
339
+ LEFT JOIN ${s}.user_session_group_placements usgp
340
+ ON usgp.user_id = v_placement_user AND usgp.root_session_id = sess.session_id
341
+ WHERE
342
+ (p_include_deleted OR sess.deleted_at IS NULL)
343
+ AND (
344
+ p_cursor_updated_at IS NULL
345
+ OR date_trunc('milliseconds', sess.updated_at) < date_trunc('milliseconds', p_cursor_updated_at)
346
+ OR (
347
+ date_trunc('milliseconds', sess.updated_at) = date_trunc('milliseconds', p_cursor_updated_at)
348
+ AND sess.session_id < p_cursor_session_id
349
+ )
350
+ )
351
+ AND (
352
+ p_viewer_provider IS NULL
353
+ OR EXISTS (
354
+ SELECT 1
355
+ FROM ${s}.sessions r
356
+ LEFT JOIN ${s}.session_owners rso ON rso.session_id = r.session_id
357
+ LEFT JOIN ${s}.users ru ON ru.user_id = rso.user_id
358
+ WHERE r.session_id = COALESCE(sess.root_session_id, sess.session_id)
359
+ AND (
360
+ (r.is_system AND p_viewer_system_visible)
361
+ OR (ru.provider = BTRIM(p_viewer_provider) AND ru.subject = BTRIM(p_viewer_subject))
362
+ OR COALESCE(r.visibility, 'private') IN ('shared_read', 'shared_write')
363
+ OR EXISTS (
364
+ SELECT 1 FROM ${s}.session_shares sh
365
+ JOIN ${s}.users vu ON vu.user_id = sh.user_id
366
+ WHERE sh.session_id = r.session_id
367
+ AND vu.provider = BTRIM(p_viewer_provider)
368
+ AND vu.subject = BTRIM(p_viewer_subject)
369
+ )
370
+ )
371
+ )
372
+ )
373
+ ORDER BY date_trunc('milliseconds', sess.updated_at) DESC, sess.session_id DESC
374
+ LIMIT v_limit;
375
+ END;
376
+ $$ LANGUAGE plpgsql;
377
+ `;
378
+ }
232
379
  // ─── Migration 0040: worker registry ─────────────────────────────
233
380
  //
234
381
  // docs/proposals/worker-registry.md (rev 4). Substrate-neutral, uniformly
@@ -8848,4 +8995,57 @@ RETURNS TABLE(
8848
8995
  $$ LANGUAGE sql;
8849
8996
  `;
8850
8997
  }
8998
+ /**
8999
+ * 0045 — session_canvases: one row per (session, slot).
9000
+ *
9001
+ * The canvas revision has always been DERIVED from the session.canvas_updated
9002
+ * event log by scanning a small trailing window. With one canvas per session
9003
+ * that window always contained the latest rev; with five interleaved slots it
9004
+ * does not — slot 2's latest draw falls outside the window after slot 1 draws
9005
+ * a few times. This table is the per-slot authority-cache: written on every
9006
+ * draw, read for the next rev, and joinable from the sessions list so a row
9007
+ * can say "this session has canvases" without replaying events.
9008
+ *
9009
+ * The event log REMAINS the durable source; a missed upsert self-heals on the
9010
+ * next draw via the event-scan fallback. Backfill seeds slot 1 (and any slot
9011
+ * already present in event data) from the latest valid event per slot.
9012
+ */
9013
+ function migration_0045_session_canvases(schema) {
9014
+ const s = `"${schema}"`;
9015
+ return `
9016
+ CREATE TABLE IF NOT EXISTS ${s}.session_canvases (
9017
+ session_id TEXT NOT NULL REFERENCES ${s}.sessions(session_id) ON DELETE CASCADE,
9018
+ slot SMALLINT NOT NULL CHECK (slot BETWEEN 1 AND 5),
9019
+ name TEXT NOT NULL DEFAULT '',
9020
+ latest_rev INTEGER NOT NULL DEFAULT 0,
9021
+ size_bytes INTEGER,
9022
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
9023
+ PRIMARY KEY (session_id, slot)
9024
+ );
9025
+
9026
+ INSERT INTO ${s}.session_canvases (session_id, slot, name, latest_rev, size_bytes, updated_at)
9027
+ SELECT e.session_id,
9028
+ e.slot,
9029
+ COALESCE(e.data->>'name', ''),
9030
+ (e.data->>'rev')::int,
9031
+ NULLIF(e.data->>'sizeBytes', '')::int,
9032
+ e.created_at
9033
+ FROM (
9034
+ SELECT DISTINCT ON (session_id, COALESCE(NULLIF(data->>'slot', '')::smallint, 1))
9035
+ session_id,
9036
+ COALESCE(NULLIF(data->>'slot', '')::smallint, 1) AS slot,
9037
+ data,
9038
+ created_at
9039
+ FROM ${s}.session_events
9040
+ WHERE event_type = 'session.canvas_updated'
9041
+ AND (data->>'rev') ~ '^[0-9]+$'
9042
+ AND COALESCE(NULLIF(data->>'slot', ''), '1') ~ '^[1-5]$'
9043
+ ORDER BY session_id,
9044
+ COALESCE(NULLIF(data->>'slot', '')::smallint, 1),
9045
+ (data->>'rev')::int DESC
9046
+ ) e
9047
+ WHERE EXISTS (SELECT 1 FROM ${s}.sessions ss WHERE ss.session_id = e.session_id)
9048
+ ON CONFLICT (session_id, slot) DO NOTHING;
9049
+ `;
9050
+ }
8851
9051
  //# sourceMappingURL=cms-migrations.js.map