@imgly/codesign-mcp 0.1.7 → 0.1.8

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 (104) hide show
  1. package/assets/docs/api/index.d.ts +9 -3
  2. package/assets/docs/guide/SKILL.md +2 -2
  3. package/assets/docs/guide/api/node/classes/creativeengine.md +13 -13
  4. package/assets/docs/guide/edit-image/transform/scale.md +1 -3
  5. package/assets/docs/guide/filters-and-effects/duotone.md +1 -1
  6. package/assets/docs/guide/get-started/bun.md +0 -2
  7. package/assets/docs/guide/get-started/deno.md +0 -1
  8. package/assets/docs/guide/get-started/vanilla.md +0 -2
  9. package/assets/docs/guide/import-media/default-assets.md +20 -24
  10. package/assets/docs/guide/plugins/print-ready-pdf.md +0 -2
  11. package/assets/docs/guide/serve-assets.md +80 -23
  12. package/assets/docs/handbook/SKILL.md +6 -7
  13. package/dist/assets/inline.generated.js +12 -12
  14. package/dist/assets/inline.generated.js.map +1 -1
  15. package/dist/cli/http.d.ts.map +1 -1
  16. package/dist/cli/http.js +17 -3
  17. package/dist/cli/http.js.map +1 -1
  18. package/dist/cli/stdio.d.ts.map +1 -1
  19. package/dist/cli/stdio.js +44 -15
  20. package/dist/cli/stdio.js.map +1 -1
  21. package/dist/cli/trial-license.generated.d.ts +1 -1
  22. package/dist/cli/trial-license.generated.js +1 -1
  23. package/dist/cli/trial-license.generated.js.map +1 -1
  24. package/dist/config.d.ts +6 -0
  25. package/dist/config.d.ts.map +1 -1
  26. package/dist/config.js +8 -0
  27. package/dist/config.js.map +1 -1
  28. package/dist/diagnostics/bundle.d.ts +3 -0
  29. package/dist/diagnostics/bundle.d.ts.map +1 -1
  30. package/dist/diagnostics/bundle.js +25 -22
  31. package/dist/diagnostics/bundle.js.map +1 -1
  32. package/dist/diagnostics/prompt.d.ts +3 -0
  33. package/dist/diagnostics/prompt.d.ts.map +1 -0
  34. package/dist/diagnostics/prompt.js +21 -0
  35. package/dist/diagnostics/prompt.js.map +1 -0
  36. package/dist/diagnostics/router.d.ts +12 -0
  37. package/dist/diagnostics/router.d.ts.map +1 -0
  38. package/dist/diagnostics/router.js +64 -0
  39. package/dist/diagnostics/router.js.map +1 -0
  40. package/dist/diagnostics/spa-assets.generated.d.ts +2 -0
  41. package/dist/diagnostics/spa-assets.generated.d.ts.map +1 -0
  42. package/dist/diagnostics/spa-assets.generated.js +1231 -0
  43. package/dist/diagnostics/spa-assets.generated.js.map +1 -0
  44. package/dist/diagnostics/status.d.ts +38 -0
  45. package/dist/diagnostics/status.d.ts.map +1 -0
  46. package/dist/diagnostics/status.js +53 -0
  47. package/dist/diagnostics/status.js.map +1 -0
  48. package/dist/diagnostics/summary.d.ts +48 -0
  49. package/dist/diagnostics/summary.d.ts.map +1 -0
  50. package/dist/diagnostics/summary.js +116 -0
  51. package/dist/diagnostics/summary.js.map +1 -0
  52. package/dist/diagnostics/tool.d.ts +16 -0
  53. package/dist/diagnostics/tool.d.ts.map +1 -0
  54. package/dist/diagnostics/tool.js +90 -0
  55. package/dist/diagnostics/tool.js.map +1 -0
  56. package/dist/engine/asset-sources.d.ts +8 -0
  57. package/dist/engine/asset-sources.d.ts.map +1 -1
  58. package/dist/engine/asset-sources.js +9 -2
  59. package/dist/engine/asset-sources.js.map +1 -1
  60. package/dist/engine/uri-resolver.js.map +1 -1
  61. package/dist/server.d.ts +25 -0
  62. package/dist/server.d.ts.map +1 -1
  63. package/dist/server.js +24 -4
  64. package/dist/server.js.map +1 -1
  65. package/dist/tools/engine.d.ts +79 -14
  66. package/dist/tools/engine.d.ts.map +1 -1
  67. package/dist/tools/engine.js +119 -20
  68. package/dist/tools/engine.js.map +1 -1
  69. package/dist/tools/export.d.ts.map +1 -1
  70. package/dist/tools/export.js +34 -4
  71. package/dist/tools/export.js.map +1 -1
  72. package/dist/tools/index.js +2 -2
  73. package/dist/tools/index.js.map +1 -1
  74. package/dist/tools/load.d.ts.map +1 -1
  75. package/dist/tools/load.js +26 -19
  76. package/dist/tools/load.js.map +1 -1
  77. package/dist/tools/preview.d.ts.map +1 -1
  78. package/dist/tools/preview.js +60 -40
  79. package/dist/tools/preview.js.map +1 -1
  80. package/dist/tools/{open-editor.d.ts → view.d.ts} +3 -3
  81. package/dist/tools/view.d.ts.map +1 -0
  82. package/dist/tools/{open-editor.js → view.js} +20 -18
  83. package/dist/tools/view.js.map +1 -0
  84. package/dist/viewer/listener.d.ts +2 -0
  85. package/dist/viewer/listener.d.ts.map +1 -1
  86. package/dist/viewer/listener.js +2 -0
  87. package/dist/viewer/listener.js.map +1 -1
  88. package/dist/viewer/presigned-r2-url-builder.d.ts +1 -1
  89. package/dist/viewer/presigned-r2-url-builder.js +1 -1
  90. package/dist/viewer/presigned-r2-url-builder.js.map +1 -1
  91. package/dist/viewer/router.d.ts.map +1 -1
  92. package/dist/viewer/router.js +8 -17
  93. package/dist/viewer/router.js.map +1 -1
  94. package/dist/viewer/session-mount.js.map +1 -1
  95. package/dist/viewer/spa-assets.generated.d.ts.map +1 -1
  96. package/dist/viewer/spa-assets.generated.js +750 -869
  97. package/dist/viewer/spa-assets.generated.js.map +1 -1
  98. package/dist/viewer/url-builder.d.ts +4 -3
  99. package/dist/viewer/url-builder.d.ts.map +1 -1
  100. package/dist/viewer/url-builder.js +4 -4
  101. package/dist/viewer/url-builder.js.map +1 -1
  102. package/package.json +6 -5
  103. package/dist/tools/open-editor.d.ts.map +0 -1
  104. package/dist/tools/open-editor.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/diagnostics/bundle.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/diagnostics/bundle.ts\n//\n// Behind `codesign-mcp diagnose`: collect the rotated NDJSON, scrub raw text\n// (belt-and-suspenders over write-time redaction), add a non-secret meta.json,\n// and pack it all into a single zero-dependency STORE zip the user forwards.\n// No network. Works whether or not a server is running (it just reads disk;\n// the active file's incomplete trailing line is skipped).\nimport { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { arch, platform } from 'node:os';\nimport { createRequire } from 'node:module';\nimport { deflateRawSync } from 'node:zlib';\nimport type { Env } from '../config.js';\nimport { resolveDiagnosticsDir } from '../config.js';\nimport { redactText } from './redact.js';\n\nexport interface BundleFile {\n name: string;\n bytes: Buffer;\n}\n\nexport async function collectBundleFiles(\n dir: string,\n meta: Record<string, unknown>\n): Promise<BundleFile[]> {\n const names = (await readdir(dir).catch(() => [] as string[]))\n .filter((n) => /^diagnostics(\\.\\d+)?\\.ndjson$/.test(n))\n .sort();\n const files: BundleFile[] = [];\n for (const name of names) {\n const raw = await readFile(join(dir, name), 'utf8').catch(() => '');\n const scrubbed = scrubNdjson(raw);\n if (scrubbed.length > 0)\n files.push({ name, bytes: Buffer.from(scrubbed, 'utf8') });\n }\n files.push({\n name: 'meta.json',\n bytes: Buffer.from(redactText(JSON.stringify(meta, null, 2)), 'utf8')\n });\n return files;\n}\n\n/** Redact each COMPLETE line; drop an incomplete trailing line (mid-write). */\nfunction scrubNdjson(raw: string): string {\n if (raw.length === 0) return '';\n const endsClean = raw.endsWith('\\n');\n const lines = raw.split('\\n');\n if (!endsClean) lines.pop(); // partial trailing line\n return (\n lines\n .filter((l) => l.length > 0)\n .map((l) => redactText(l))\n .join('\\n') + '\\n'\n );\n}\n\nexport function buildBundleMeta(\n env: Env = process.env\n): Record<string, unknown> {\n const require = createRequire(import.meta.url);\n let cesdkVersion = 'unknown';\n try {\n cesdkVersion = (\n require('@cesdk/engine/package.json') as { version: string }\n ).version;\n } catch {\n // engine package layout may not expose package.json; leave 'unknown'\n }\n return {\n buildId: env.IMGLY_BUILD_ID ?? 'dev',\n os: platform(),\n arch: arch(),\n node: process.version,\n cesdkEngine: cesdkVersion,\n diagnosticsDir: resolveDiagnosticsDir(env)\n };\n}\n\nexport async function runDiagnose(env: Env = process.env): Promise<string> {\n const dir = resolveDiagnosticsDir(env);\n // Ensure the dir exists — on a fresh install there may be no logs yet but the\n // user still expects a zip (it will contain only meta.json).\n await mkdir(dir, { recursive: true });\n const files = await collectBundleFiles(dir, buildBundleMeta(env));\n // Timestamp is injected by the caller of Date.now at runtime — fine in product code.\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n const outPath = join(dir, `diagnostics-${stamp}.zip`);\n await writeStoreZip(files, outPath);\n return outPath;\n}\n\n// --- Minimal ZIP writer (deflate, zero deps) ---------------------------------\n// One local-file-header + data per entry, then a central directory. Enough for\n// any unzip tool to open; we deflate with node:zlib to keep bundles small.\nconst CRC_TABLE = (() => {\n const t = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n t[n] = c >>> 0;\n }\n return t;\n})();\n\nfunction crc32(buf: Buffer): number {\n let c = 0xffffffff;\n for (let i = 0; i < buf.length; i++)\n c = CRC_TABLE[(c ^ buf[i]) & 0xff] ^ (c >>> 8);\n return (c ^ 0xffffffff) >>> 0;\n}\n\nexport async function writeStoreZip(\n files: BundleFile[],\n outPath: string\n): Promise<void> {\n const chunks: Buffer[] = [];\n const central: Buffer[] = [];\n let offset = 0;\n\n for (const file of files) {\n const nameBuf = Buffer.from(file.name, 'utf8');\n const crc = crc32(file.bytes);\n const compressed = deflateRawSync(file.bytes);\n const local = Buffer.alloc(30);\n local.writeUInt32LE(0x04034b50, 0); // local file header signature\n local.writeUInt16LE(20, 4); // version needed\n local.writeUInt16LE(0, 6); // flags\n local.writeUInt16LE(8, 8); // method: deflate\n local.writeUInt16LE(0, 10); // mod time\n local.writeUInt16LE(0, 12); // mod date\n local.writeUInt32LE(crc, 14);\n local.writeUInt32LE(compressed.length, 18);\n local.writeUInt32LE(file.bytes.length, 22);\n local.writeUInt16LE(nameBuf.length, 26);\n local.writeUInt16LE(0, 28); // extra len\n chunks.push(local, nameBuf, compressed);\n\n const cd = Buffer.alloc(46);\n cd.writeUInt32LE(0x02014b50, 0); // central dir header signature\n cd.writeUInt16LE(20, 4); // version made by\n cd.writeUInt16LE(20, 6); // version needed\n cd.writeUInt16LE(0, 8); // flags\n cd.writeUInt16LE(8, 10); // method\n cd.writeUInt16LE(0, 12);\n cd.writeUInt16LE(0, 14);\n cd.writeUInt32LE(crc, 16);\n cd.writeUInt32LE(compressed.length, 20);\n cd.writeUInt32LE(file.bytes.length, 24);\n cd.writeUInt16LE(nameBuf.length, 28);\n cd.writeUInt16LE(0, 30); // extra\n cd.writeUInt16LE(0, 32); // comment\n cd.writeUInt16LE(0, 34); // disk #\n cd.writeUInt16LE(0, 36); // internal attrs\n cd.writeUInt32LE(0, 38); // external attrs\n cd.writeUInt32LE(offset, 42); // local header offset\n central.push(cd, nameBuf);\n\n offset += local.length + nameBuf.length + compressed.length;\n }\n\n const centralBuf = Buffer.concat(central);\n const end = Buffer.alloc(22);\n end.writeUInt32LE(0x06054b50, 0); // end of central dir signature\n end.writeUInt16LE(0, 4);\n end.writeUInt16LE(0, 6);\n end.writeUInt16LE(files.length, 8);\n end.writeUInt16LE(files.length, 10);\n end.writeUInt32LE(centralBuf.length, 12);\n end.writeUInt32LE(offset, 16);\n end.writeUInt16LE(0, 20);\n\n await writeFile(outPath, Buffer.concat([...chunks, centralBuf, end]));\n}\n"]}
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/diagnostics/bundle.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/diagnostics/bundle.ts\n//\n// Behind `codesign-mcp diagnose`: collect the rotated NDJSON, scrub raw text\n// (belt-and-suspenders over write-time redaction), add a non-secret meta.json,\n// and pack it all into a single zero-dependency STORE zip the user forwards.\n// No network. Works whether or not a server is running (it just reads disk;\n// the active file's incomplete trailing line is skipped).\nimport { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { arch, platform } from 'node:os';\nimport { createRequire } from 'node:module';\nimport { deflateRawSync } from 'node:zlib';\nimport type { Env } from '../config.js';\nimport { resolveDiagnosticsDir } from '../config.js';\nimport { redactText } from './redact.js';\n\nexport interface BundleFile {\n name: string;\n bytes: Buffer;\n}\n\nexport async function collectBundleFiles(\n dir: string,\n meta: Record<string, unknown>\n): Promise<BundleFile[]> {\n const names = (await readdir(dir).catch(() => [] as string[]))\n .filter((n) => /^diagnostics(\\.\\d+)?\\.ndjson$/.test(n))\n .sort();\n const files: BundleFile[] = [];\n for (const name of names) {\n const raw = await readFile(join(dir, name), 'utf8').catch(() => '');\n const scrubbed = scrubNdjson(raw);\n if (scrubbed.length > 0)\n files.push({ name, bytes: Buffer.from(scrubbed, 'utf8') });\n }\n files.push({\n name: 'meta.json',\n bytes: Buffer.from(redactText(JSON.stringify(meta, null, 2)), 'utf8')\n });\n return files;\n}\n\n/** Redact each COMPLETE line; drop an incomplete trailing line (mid-write). */\nexport function scrubNdjson(raw: string): string {\n if (raw.length === 0) return '';\n const endsClean = raw.endsWith('\\n');\n const lines = raw.split('\\n');\n if (!endsClean) lines.pop(); // partial trailing line\n return (\n lines\n .filter((l) => l.length > 0)\n .map((l) => redactText(l))\n .join('\\n') + '\\n'\n );\n}\n\nexport function buildBundleMeta(\n env: Env = process.env\n): Record<string, unknown> {\n const require = createRequire(import.meta.url);\n let cesdkVersion = 'unknown';\n try {\n cesdkVersion = (\n require('@cesdk/engine/package.json') as { version: string }\n ).version;\n } catch {\n // engine package layout may not expose package.json; leave 'unknown'\n }\n return {\n buildId: env.IMGLY_BUILD_ID ?? 'dev',\n os: platform(),\n arch: arch(),\n node: process.version,\n cesdkEngine: cesdkVersion,\n diagnosticsDir: resolveDiagnosticsDir(env)\n };\n}\n\nexport async function runDiagnose(env: Env = process.env): Promise<string> {\n const dir = resolveDiagnosticsDir(env);\n // Ensure the dir exists — on a fresh install there may be no logs yet but the\n // user still expects a zip (it will contain only meta.json).\n await mkdir(dir, { recursive: true });\n const files = await collectBundleFiles(dir, buildBundleMeta(env));\n // Timestamp is injected by the caller of Date.now at runtime — fine in product code.\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n const outPath = join(dir, `diagnostics-${stamp}.zip`);\n await writeStoreZip(files, outPath);\n return outPath;\n}\n\n// --- Minimal ZIP writer (deflate, zero deps) ---------------------------------\n// One local-file-header + data per entry, then a central directory. Enough for\n// any unzip tool to open; we deflate with node:zlib to keep bundles small.\nconst CRC_TABLE = (() => {\n const t = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;\n t[n] = c >>> 0;\n }\n return t;\n})();\n\nfunction crc32(buf: Buffer): number {\n let c = 0xffffffff;\n for (let i = 0; i < buf.length; i++)\n c = CRC_TABLE[(c ^ buf[i]) & 0xff] ^ (c >>> 8);\n return (c ^ 0xffffffff) >>> 0;\n}\n\nexport function packStoreZip(files: BundleFile[]): Buffer {\n const chunks: Buffer[] = [];\n const central: Buffer[] = [];\n let offset = 0;\n\n for (const file of files) {\n const nameBuf = Buffer.from(file.name, 'utf8');\n const crc = crc32(file.bytes);\n const compressed = deflateRawSync(file.bytes);\n const local = Buffer.alloc(30);\n local.writeUInt32LE(0x04034b50, 0);\n local.writeUInt16LE(20, 4);\n local.writeUInt16LE(0, 6);\n local.writeUInt16LE(8, 8);\n local.writeUInt16LE(0, 10);\n local.writeUInt16LE(0, 12);\n local.writeUInt32LE(crc, 14);\n local.writeUInt32LE(compressed.length, 18);\n local.writeUInt32LE(file.bytes.length, 22);\n local.writeUInt16LE(nameBuf.length, 26);\n local.writeUInt16LE(0, 28);\n chunks.push(local, nameBuf, compressed);\n\n const cd = Buffer.alloc(46);\n cd.writeUInt32LE(0x02014b50, 0);\n cd.writeUInt16LE(20, 4);\n cd.writeUInt16LE(20, 6);\n cd.writeUInt16LE(0, 8);\n cd.writeUInt16LE(8, 10);\n cd.writeUInt16LE(0, 12);\n cd.writeUInt16LE(0, 14);\n cd.writeUInt32LE(crc, 16);\n cd.writeUInt32LE(compressed.length, 20);\n cd.writeUInt32LE(file.bytes.length, 24);\n cd.writeUInt16LE(nameBuf.length, 28);\n cd.writeUInt16LE(0, 30);\n cd.writeUInt16LE(0, 32);\n cd.writeUInt16LE(0, 34);\n cd.writeUInt16LE(0, 36);\n cd.writeUInt32LE(0, 38);\n cd.writeUInt32LE(offset, 42);\n central.push(cd, nameBuf);\n\n offset += local.length + nameBuf.length + compressed.length;\n }\n\n const centralBuf = Buffer.concat(central);\n const end = Buffer.alloc(22);\n end.writeUInt32LE(0x06054b50, 0);\n end.writeUInt16LE(0, 4);\n end.writeUInt16LE(0, 6);\n end.writeUInt16LE(files.length, 8);\n end.writeUInt16LE(files.length, 10);\n end.writeUInt32LE(centralBuf.length, 12);\n end.writeUInt32LE(offset, 16);\n end.writeUInt16LE(0, 20);\n\n return Buffer.concat([...chunks, centralBuf, end]);\n}\n\nexport async function writeStoreZip(\n files: BundleFile[],\n outPath: string\n): Promise<void> {\n await writeFile(outPath, packStoreZip(files));\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { CodesignMcpPromptRegistration } from '../server.js';
2
+ export declare function createDiagnosticsPrompt(): CodesignMcpPromptRegistration;
3
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../src/diagnostics/prompt.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAElE,wBAAgB,uBAAuB,IAAI,6BAA6B,CAqBvE"}
@@ -0,0 +1,21 @@
1
+ export function createDiagnosticsPrompt() {
2
+ return {
3
+ name: 'diagnostics',
4
+ description: 'Show what this codesign MCP server is running and open the local diagnostics viewer.',
5
+ get: () => ({
6
+ description: 'Report versions and open the diagnostics viewer.',
7
+ messages: [
8
+ {
9
+ role: 'user',
10
+ content: {
11
+ type: 'text',
12
+ text: 'Call the `diagnostics` tool with action "status" and report the MCP build id and CE.SDK engine version. ' +
13
+ 'Then call `diagnostics` with action "open" and give me the clickable viewer URL — it has a Download-ZIP button ' +
14
+ 'to send diagnostics to IMG.LY.'
15
+ }
16
+ }
17
+ ]
18
+ })
19
+ };
20
+ }
21
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/diagnostics/prompt.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,WAAW,EACT,sFAAsF;QACxF,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YACV,WAAW,EAAE,kDAAkD;YAC/D,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE;wBACP,IAAI,EAAE,MAAM;wBACZ,IAAI,EACF,0GAA0G;4BAC1G,iHAAiH;4BACjH,gCAAgC;qBACnC;iBACF;aACF;SACF,CAAC;KACH,CAAC;AACJ,CAAC","sourcesContent":["// packages/codesign-mcp/src/diagnostics/prompt.ts\n//\n// The /codesign-diagnostics slash command (CODE-62). One MCP prompt that tells\n// the agent to self-report versions and hand the human the local viewer link.\n// stdio-only (its payload is \"open the viewer\", which is loopback-local).\nimport type { CodesignMcpPromptRegistration } from '../server.js';\n\nexport function createDiagnosticsPrompt(): CodesignMcpPromptRegistration {\n return {\n name: 'diagnostics',\n description:\n 'Show what this codesign MCP server is running and open the local diagnostics viewer.',\n get: () => ({\n description: 'Report versions and open the diagnostics viewer.',\n messages: [\n {\n role: 'user',\n content: {\n type: 'text',\n text:\n 'Call the `diagnostics` tool with action \"status\" and report the MCP build id and CE.SDK engine version. ' +\n 'Then call `diagnostics` with action \"open\" and give me the clickable viewer URL — it has a Download-ZIP button ' +\n 'to send diagnostics to IMG.LY.'\n }\n }\n ]\n })\n };\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import { Router } from 'express';
2
+ import type { Env } from '../config.js';
3
+ import type { DiagnosticsSink } from './events.js';
4
+ export interface CreateDiagnosticsRouterOptions {
5
+ /** The active diagnostics sink — only flush() is used, before reads. */
6
+ diag: DiagnosticsSink;
7
+ /** Diagnostics dir (always resolved; may contain no files yet). */
8
+ dir: string;
9
+ env: Env;
10
+ }
11
+ export declare function createDiagnosticsRouter(opts: CreateDiagnosticsRouterOptions): Router;
12
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../src/diagnostics/router.ts"],"names":[],"mappings":"AAMA,OAAO,EAIL,MAAM,EACP,MAAM,SAAS,CAAC;AAGjB,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AASnD,MAAM,WAAW,8BAA8B;IAC7C,wEAAwE;IACxE,IAAI,EAAE,eAAe,CAAC;IACtB,mEAAmE;IACnE,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,GAAG,CAAC;CACV;AAID,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,8BAA8B,GACnC,MAAM,CAyDR"}
@@ -0,0 +1,64 @@
1
+ // packages/codesign-mcp/src/diagnostics/router.ts
2
+ //
3
+ // Loopback-only routes for the served diagnostics viewer (CODE-62). Mounted on
4
+ // the SAME ephemeral 127.0.0.1 listener as the design viewer (stdio only). Reads
5
+ // the redacted on-disk stream; flushes the sink before every read so the newest
6
+ // events are visible. Never mounted on the hosted HTTP transport.
7
+ import { Router } from 'express';
8
+ import { readdir, readFile } from 'node:fs/promises';
9
+ import { join } from 'node:path';
10
+ import { buildBundleMeta, collectBundleFiles, packStoreZip, scrubNdjson } from './bundle.js';
11
+ import { SPA_ASSETS } from './spa-assets.generated.js';
12
+ const NDJSON_RE = /^diagnostics(\.\d+)?\.ndjson$/;
13
+ export function createDiagnosticsRouter(opts) {
14
+ const { diag, dir, env } = opts;
15
+ const router = Router();
16
+ router.get('/diagnostics', (_req, res) => {
17
+ // Root-absolute endpoints: on the stdio listener this router is mounted at
18
+ // root, so `/diagnostics/...` resolves correctly.
19
+ const inject = `window.__DIAGNOSTICS_STREAM__=${JSON.stringify('/diagnostics/stream.ndjson')};` +
20
+ `window.__DIAGNOSTICS_BUNDLE__=${JSON.stringify('/diagnostics/bundle.zip')};`;
21
+ const html = SPA_ASSETS['index.html'].replace('/*__DIAGNOSTICS_INJECT__*/', inject);
22
+ res.type('html').send(html);
23
+ });
24
+ router.get('/diagnostics/stream.ndjson', async (_req, res, next) => {
25
+ try {
26
+ await diag.flush?.();
27
+ const names = (await readdir(dir).catch(() => []))
28
+ .filter((n) => NDJSON_RE.test(n))
29
+ .sort();
30
+ let out = '';
31
+ for (const name of names) {
32
+ const raw = await readFile(join(dir, name), 'utf8').catch(() => '');
33
+ if (raw.length > 0)
34
+ out += scrubNdjson(raw);
35
+ }
36
+ res.type('application/x-ndjson').send(out);
37
+ }
38
+ catch (err) {
39
+ next(err);
40
+ }
41
+ });
42
+ router.get('/diagnostics/bundle.zip', async (_req, res, next) => {
43
+ try {
44
+ await diag.flush?.();
45
+ const files = await collectBundleFiles(dir, buildBundleMeta(env));
46
+ res
47
+ .type('application/zip')
48
+ .set('Content-Disposition', 'attachment; filename="diagnostics.zip"')
49
+ .send(packStoreZip(files));
50
+ }
51
+ catch (err) {
52
+ next(err);
53
+ }
54
+ });
55
+ // Sanitising error handler — fs error messages carry absolute paths. MUST be
56
+ // last and take all four args.
57
+ router.use((_err, _req, res, _next) => {
58
+ if (res.headersSent)
59
+ return;
60
+ res.status(500).type('text').send('internal error');
61
+ });
62
+ return router;
63
+ }
64
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/diagnostics/router.ts"],"names":[],"mappings":"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","sourcesContent":["// packages/codesign-mcp/src/diagnostics/router.ts\n//\n// Loopback-only routes for the served diagnostics viewer (CODE-62). Mounted on\n// the SAME ephemeral 127.0.0.1 listener as the design viewer (stdio only). Reads\n// the redacted on-disk stream; flushes the sink before every read so the newest\n// events are visible. Never mounted on the hosted HTTP transport.\nimport {\n type NextFunction,\n type Request,\n type Response,\n Router\n} from 'express';\nimport { readdir, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport type { Env } from '../config.js';\nimport type { DiagnosticsSink } from './events.js';\nimport {\n buildBundleMeta,\n collectBundleFiles,\n packStoreZip,\n scrubNdjson\n} from './bundle.js';\nimport { SPA_ASSETS } from './spa-assets.generated.js';\n\nexport interface CreateDiagnosticsRouterOptions {\n /** The active diagnostics sink — only flush() is used, before reads. */\n diag: DiagnosticsSink;\n /** Diagnostics dir (always resolved; may contain no files yet). */\n dir: string;\n env: Env;\n}\n\nconst NDJSON_RE = /^diagnostics(\\.\\d+)?\\.ndjson$/;\n\nexport function createDiagnosticsRouter(\n opts: CreateDiagnosticsRouterOptions\n): Router {\n const { diag, dir, env } = opts;\n const router = Router();\n\n router.get('/diagnostics', (_req, res) => {\n // Root-absolute endpoints: on the stdio listener this router is mounted at\n // root, so `/diagnostics/...` resolves correctly.\n const inject =\n `window.__DIAGNOSTICS_STREAM__=${JSON.stringify('/diagnostics/stream.ndjson')};` +\n `window.__DIAGNOSTICS_BUNDLE__=${JSON.stringify('/diagnostics/bundle.zip')};`;\n const html = SPA_ASSETS['index.html'].replace(\n '/*__DIAGNOSTICS_INJECT__*/',\n inject\n );\n res.type('html').send(html);\n });\n\n router.get('/diagnostics/stream.ndjson', async (_req, res, next) => {\n try {\n await diag.flush?.();\n const names = (await readdir(dir).catch(() => [] as string[]))\n .filter((n) => NDJSON_RE.test(n))\n .sort();\n let out = '';\n for (const name of names) {\n const raw = await readFile(join(dir, name), 'utf8').catch(() => '');\n if (raw.length > 0) out += scrubNdjson(raw);\n }\n res.type('application/x-ndjson').send(out);\n } catch (err) {\n next(err);\n }\n });\n\n router.get('/diagnostics/bundle.zip', async (_req, res, next) => {\n try {\n await diag.flush?.();\n const files = await collectBundleFiles(dir, buildBundleMeta(env));\n res\n .type('application/zip')\n .set('Content-Disposition', 'attachment; filename=\"diagnostics.zip\"')\n .send(packStoreZip(files));\n } catch (err) {\n next(err);\n }\n });\n\n // Sanitising error handler — fs error messages carry absolute paths. MUST be\n // last and take all four args.\n router.use(\n (_err: unknown, _req: Request, res: Response, _next: NextFunction) => {\n if (res.headersSent) return;\n res.status(500).type('text').send('internal error');\n }\n );\n\n return router;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const SPA_ASSETS: Record<string, string>;
2
+ //# sourceMappingURL=spa-assets.generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spa-assets.generated.d.ts","sourceRoot":"","sources":["../../src/diagnostics/spa-assets.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA4sC7C,CAAC"}