@astral-mcp/projection 0.5.0 → 0.5.1

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/dist/index.d.mts CHANGED
@@ -326,7 +326,7 @@ declare function openBlob(blob: string, options: OpenBlobOptions): BlobPayload;
326
326
  * CI instead of silently minting blobs with a stale version stamp.
327
327
  */
328
328
  /** `@astral-mcp/projection` package version (must match packages/projection/package.json). */
329
- declare const LIB_VERSION = "0.5.0";
329
+ declare const LIB_VERSION = "0.5.1";
330
330
  /** Pinned XState version (must match the exact pin in package.json — D2). */
331
331
  declare const XSTATE_VERSION = "5.32.5";
332
332
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/blob/sealer.ts","../src/blob/versions.ts","../src/mrtr/protocol.ts","../src/mrtr/adapter.ts","../src/mrtr/discover.ts","../src/wrap.ts","../src/apps/dashboard.ts","../src/prompts/workflow-prompts.ts","../src/errors.ts","../src/introspector/introspector.ts","../src/typegen/generate.ts","../src/typegen/json-schema.ts","../src/text-safety.ts","../src/policy/decision.ts","../src/policy/elicitation.ts","../src/sandbox/session.ts","../src/machine-host/host.ts","../src/machine-host/contract.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/types.ts","../src/blob/sealer.ts","../src/blob/versions.ts","../src/mrtr/protocol.ts","../src/mrtr/adapter.ts","../src/mrtr/discover.ts","../src/wrap.ts","../src/apps/dashboard.ts","../src/prompts/workflow-prompts.ts","../src/errors.ts","../src/introspector/introspector.ts","../src/typegen/generate.ts","../src/typegen/json-schema.ts","../src/text-safety.ts","../src/policy/decision.ts","../src/policy/elicitation.ts","../src/sandbox/session.ts","../src/machine-host/host.ts","../src/machine-host/contract.ts"],"mappings":";;;;;;;;;;;;;KAcY;cAEC,sBAAsB;;UAGlB;EACf;EACA;EACA;EACA;;UAGe;;EAEf;EACA;;EAEA,aAAa;;EAEb,eAAe;EACf,cAAc;;UAGC;;EAEf,SAAS,IAAI,aAAa;;UAGX;EACf,OAAO;;EAEP;;EAEA;EACA,OAAO;;;;;;;;;;iBAmBO,SAAS,SAAS,eAAe,eAAe;;iBAahD,SAAS,iBAAiB,SAAS;;UAKlC;EACf,SACE,OAAO,aACP,cACA,MAAM,0BACL,QAAQ;;KAGD;EACR;EAAU;;EAAsB;EAAW;IAAS;IAAiB;;;KAM7D;UAEK;;GAEd,mBAAmB;;;UAQL;;EAEf;EACA;EACA,MAAM;;EAEN;;;KAIU;EACN;EAAqB;EAAgB;;EACrC;EAAoB;EAAgB;IAAS;IAAiB;;;EAC9D;EAAqB;EAAgB;;KAM/B;UASK;EACf;;EAEA;EACA;;UAGe;EACf,OAAO;EACP;EACA,aAAa;;EAEb;EACA,MAAM;;KAGI;UAEK;EACf,OAAO;EACP;;EAEA;;EAEA;;UAOe;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;cAGW,cAAc;cAad,UAAU;;iBAmCP,UAAU,WAAW,QAAQ,gBAAgB;cAehD;UAEI;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA,SAAS,eAAe;;;;;;;;EAQxB,OAAO;;EAEP;;EAEA;;EAEA;;EAEA;;UAGe;;EAEf,KAAK;;EAEL,eAAe;;EAEf;;EAEA;;;KAQU;EAAoB;;EAAuB;EAAkB;;;KAG7D;EAEN;;EAEA;;EAEA,OAAO;EACP,MAAM;;EAGN;;EAEA,SAAS,eAAe;;EAExB;EACA;EACA,OAAO;EACP,MAAM;;EAGN;EACA,OAAO;;UAGI;EACf;EACA;EACA,MAAM;EACN;EACA;;UAOe;;;;;GAKd,kBAAkB,MAAM,0BAA0B;;UAGpC;;EAEf,OAAO,QAAQ;;EAEf,SAAS;;EAET,MAAM;;EAEN,SAAS;;EAET;;;;;cCtSW;;cAGA;;cAGA;;iBA8MG,SAAS;UAIR;;EAEf;;EAEA;;EAEA;;EAEA,SAAS,eAAe;;EAExB,QAAQ;;EAER;;EAEA;;EAEA;;;;;;iBAOc,iBAAiB,OAAO,wBAAwB;;;;;;;;;iBA2BhD,SAAS,SAAS,aAAa,QAAQ;UA2BtC;;EAEf;;EAEA;EACA,QAAQ;;EAER;;;;;;;;;;;;;;;;;iBAkBc,SAAS,cAAc,SAAS,kBAAkB;;;;;;;;;;;;;;;cCxXrD;;cAGA;;;;;;;;KC0BD,iBAAiB;;;;;;;;;;;;;UAcZ;;EAEf;;EAEA,iBAAiB,mBAAiB;;;;;;;;;;;cAgBvB,iBAAiB;;;;;;;;;;;cAqBjB;;;;;;;;;;;iBAYG,aAAa,KAAK;;;UCpEjB,2BAA2B;;EAE1C;EACA;;EAEA;;UAGe;EACf,SAAS;EACT;EACA,UAAU;EACV,MAAM;EACN,OAAO,QAAQ;EACf,SAAS;EACT,SAAS;;;;;;EAMT,cAAc;;;;;;;;;;;;;EAad;;;;;;;;;iBAUoB,eACpB,MAAM,oBACN,MAAM,qBACL,QAAQ;;;;cCvEE;;;;;;;UAQI;EACf;EACA;EACA;EACA;EACA;;EAEA,QAAQ;;cAGG;cA8BA;;iBA8CG,eAAe,SAAS,eAAe,cAAc;;;;;iBAkDrD,aAAa,SAAS,eAAe,mBAAmB;;;;;cA+B3D;iBAEG,kBAAkB,SAAS,eAAe;;;UCnIzC;;EAEf,MAAM;;EAEN,OAAO,QAAQ;;EAEf,SAAS;;EAET,SAAS;;EAET;;EAEA;;;;;;;;IAQE;;;EAGF,aAAa;;;UAIE;;;;;;EAMf,MAAM;;UAGS;;WAEN,SAAS;;WAET;;WAEA;;WAEA,WAAW;;;;;;WAMX,eAAe;;EAGxB,eAAe,MAAM,oBAAoB,MAAM,cAAc,QAAQ;;EAErE,gBAAgB;;EAEhB,aAAa,MAAM,kBAAkB;;EAErC,WAAW,QAAQ,WAAW,UAAU;;EAExC,SAAS;;;;;;iBAeW,cACpB,QAAQ,YAAY,QACpB,SAAS,cACR,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cCjHE;;cAGA;cAEA;;;UCaI;EACf;EACA;EACA;;EAEA,MAAM;IAAiB;IAAqB;;EAC5C,MAAM,MAAM,oCAAoC,SAAS;;cAG9C,sBAAsB;cAkDtB,2BAA2B;cAuC3B,2BAA2B;;;;;;cC5I3B,wBAAwB;WAC1B,OAAO;WACP,aAAa;WACb;EACT,MAAM;EAGJ,YAAA,OAAO,YACP,iBACA;IAAW,cAAc;IAAc;IAAe,OAAO;IAAY;;EAU3E,gBAAgB;;;iBAYF,kBAAkB,cAAc,OAAM,aAAkB;;;;KCE5D,eAAe,YAAY;;;;;;KAO3B,sBAAsB,OAAO,aAAa;;;;;;cAmJzC,wBAAwB;;UAI5B;SAKM,OAAO,SAAS,sBAAsB,QAAQ;;MAgEvD,WAAW;;EAKT,WAAW,QAAQ;;;;;;;;;;;;EAsBnB,SACJ,OAAO,aACP,cACA,MAAM,0BACL,QAAQ;;;;;EAyCL,SAAS;;;;;;;iBAWK,mBAAmB,SAAS,sBAAsB,QAAQ;;;;;;;cCpUnE;;;;;;;;;;;;;;;;;;;;;cAsBA;;UAGI;;EAEf;;EAEA;;EAEA;;;;;;;;;iBAsPc,kBAAkB,SAAS,cAAc,gBAAgB;;;;;;;;;;iBC/DzD,eAAe,iBAAiB;;;;;iBAQhC,mBAAmB;;;;;;;;;;;;;;;;;;;;;iBClNnB,uBACd,cACA;EAAW;;;iBAMG,UAAU,cAAc;;;;;;;;;;;;;;;;iBCTxB,aAAa,OAAO,kBAAkB,YAAY,kBAAkB;;KAaxE;EACN;EAAU,UAAU;EAAgB,OAAO;;EAC3C;EAAW,OAAO;;;;;;;;;;;iBAWR,kBACd,MAAM,iBACN,SAAS,eACT,YAAY,kBACX;;;;;;cAyBU;;;;;;iBAOG,mBAAmB;;;;UChElB;;EAEf;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;UAGe;;EAEf,SAAS;;EAET;;;;;;;;;iBAsBc,qBACd,MAAM,iBACN,OAAO,kBACP,UAAS,yBACR;;;;UChDc;EACf;EACA,MAAM;;;;;;;;;;;KAYI,0BAA0B,MAAM,8BAA8B;UAEzD;;EAEf;;EAEA;;EAEA,OAAO,QAAQ;;;;;;EAMf;;EAEA,YAAY;;EAEZ;;;;;;;;UASe;;WAEN,MAAM;;WAEN;;;;;;EAMT,SAAS,iBAAiB;;EAE1B,WAAW;;EAEX,WAAW;;;;;;;iBA6OS,qBACpB,SAAS,wBACR,QAAQ;;;UCrRM;;EAEf;EACA;;EAEA;;EAEA,SAAS;;EAET;;EAEA,UAAU;;EAEV,OAAO,QAAQ;;EAEf,SAAS;;EAET;;;;;;EAMA;IACE;;IAEA,SAAS,eAAe;;IAExB,UAAU,eAAe;;IAEzB,QAAQ;;IAER;;;;;;;;;;;;;;;iBAgBkB,WAAW,SAAS,oBAAoB,QAAQ;;;;;;;cCUzD"}
package/dist/index.mjs CHANGED
@@ -240,12 +240,15 @@ const DASHBOARD_HTML = `<!doctype html>
240
240
  */
241
241
  /**
242
242
  * C0 control characters (incl. ESC and, unless `allowNewline`, `\n`), DEL, C1
243
- * controls (which `JSON.stringify` does NOT escape), the bidi override marks
244
- * (LRM/RLM/LRE/RLE/PDF/LRO/RLO), and the directional isolates (LRI/RLI/FSI/
245
- * PDI).
243
+ * controls (which `JSON.stringify` does NOT escape), U+2028/U+2029
244
+ * (LINE/PARAGRAPH SEPARATOR — ECMAScript LineTerminators that
245
+ * `JSON.stringify` also leaves raw, so unescaped they would terminate a `//`
246
+ * comment in evaluated generated source), the bidi format/override marks
247
+ * (ALM, LRM/RLM, LRE/RLE/PDF/LRO/RLO), and the directional isolates
248
+ * (LRI/RLI/FSI/PDI).
246
249
  */
247
- const HOSTILE_INLINE = /[\u0000-\u001f\u007f-\u009f\u200e\u200f\u202a-\u202e\u2066-\u2069]/g;
248
- const HOSTILE_BLOCK = /[\u0000-\u0009\u000b-\u001f\u007f-\u009f\u200e\u200f\u202a-\u202e\u2066-\u2069]/g;
250
+ const HOSTILE_INLINE = /[\u0000-\u001f\u007f-\u009f\u061c\u200e\u200f\u2028-\u202e\u2066-\u2069]/g;
251
+ const HOSTILE_BLOCK = /[\u0000-\u0009\u000b-\u001f\u007f-\u009f\u061c\u200e\u200f\u2028-\u202e\u2066-\u2069]/g;
249
252
  /**
250
253
  * Replace control and bidi characters with the replacement character.
251
254
  * `allowNewline` keeps `\n` (for multi-line blocks whose formatting newlines
@@ -258,6 +261,15 @@ function neutralizeControlChars(text, options = {}) {
258
261
  function capLength(text, maxChars) {
259
262
  return text.length <= maxChars ? text : `${text.slice(0, maxChars)}…`;
260
263
  }
264
+ /**
265
+ * Render an untrusted server identity inert for single-line embedding:
266
+ * neutralized, length-capped, and emitted as a JSON string literal — the
267
+ * literal supplies its own quotes, so surrounding copy reads it as
268
+ * unambiguous quoted data.
269
+ */
270
+ function inertIdentity$1(identity) {
271
+ return JSON.stringify(neutralizeControlChars(capLength(identity, 200)));
272
+ }
261
273
  //#endregion
262
274
  //#region src/errors.ts
263
275
  /**
@@ -1780,7 +1792,7 @@ function describeState(value) {
1780
1792
  * CI instead of silently minting blobs with a stale version stamp.
1781
1793
  */
1782
1794
  /** `@astral-mcp/projection` package version (must match packages/projection/package.json). */
1783
- const LIB_VERSION = "0.5.0";
1795
+ const LIB_VERSION = "0.5.1";
1784
1796
  /** Pinned XState version (must match the exact pin in package.json — D2). */
1785
1797
  const XSTATE_VERSION = "5.32.5";
1786
1798
  //#endregion
@@ -2006,7 +2018,7 @@ function openBlob(blob, options) {
2006
2018
  }
2007
2019
  if (!isRecord(payload)) throw verificationError("blob payload malformed: not a JSON object", HINT_CORRUPT);
2008
2020
  if (payload["v"] !== 1) throw verificationError(`unknown blob schema version ${JSON.stringify(payload["v"])} (this library expects 1)`, HINT_VERSION);
2009
- if (payload["libv"] !== "0.5.0") throw verificationError(`library version mismatch: blob was sealed by @astral-mcp/projection ${JSON.stringify(payload["libv"])}, this instance runs ${LIB_VERSION}`, HINT_VERSION);
2021
+ if (payload["libv"] !== "0.5.1") throw verificationError(`library version mismatch: blob was sealed by @astral-mcp/projection ${JSON.stringify(payload["libv"])}, this instance runs ${LIB_VERSION}`, HINT_VERSION);
2010
2022
  if (payload["xstatev"] !== "5.32.5") throw verificationError(`xstate version mismatch: blob snapshot was produced under xstate ${JSON.stringify(payload["xstatev"])}, this instance runs ${XSTATE_VERSION}`, HINT_VERSION);
2011
2023
  assertPayloadShape(payload);
2012
2024
  const verified = payload;
@@ -2112,7 +2124,7 @@ function buildResources(catalog, dts) {
2112
2124
  {
2113
2125
  uri: RESOURCE_URIS.toolTypes,
2114
2126
  name: "tools.d.ts",
2115
- description: `TypeScript definitions for the tools of ${catalog.identity}.`,
2127
+ description: `TypeScript definitions for the tools of ${inertIdentity$1(catalog.identity)}.`,
2116
2128
  mimeType: "text/plain",
2117
2129
  text: dts
2118
2130
  },
@@ -2153,7 +2165,7 @@ function buildResources(catalog, dts) {
2153
2165
  */
2154
2166
  function discoverApis(catalog, overview) {
2155
2167
  const inline = [
2156
- `Projection code mode over "${catalog.identity}".`,
2168
+ `Projection code mode over ${inertIdentity$1(catalog.identity)}.`,
2157
2169
  "",
2158
2170
  `XState version: ${XSTATE_VERSION} (pinned). Importable modules: 'xstate', '@astral-mcp/tools'. Nothing else resolves; there is no network and no filesystem.`,
2159
2171
  "",
@@ -2218,7 +2230,7 @@ function inertArg(value, fallback) {
2218
2230
  * its own quotes.
2219
2231
  */
2220
2232
  function inertIdentity(catalog) {
2221
- return JSON.stringify(neutralizeControlChars(capLength(catalog.identity, 200)));
2233
+ return inertIdentity$1(catalog.identity);
2222
2234
  }
2223
2235
  const SAVE_WORKFLOW_PROMPT = {
2224
2236
  name: "save-workflow",
@@ -2952,12 +2964,7 @@ const TOOLS_MODULE_SPECIFIER = "@astral-mcp/tools";
2952
2964
  const TOOL_CALL_HOST_GLOBAL = "__projection_toolcall";
2953
2965
  const PASCAL_FALLBACK = "Tool";
2954
2966
  /**
2955
- * Longest catalog-supplied identity rendered into generated artifacts.
2956
- * A hostile wrapped server controls this string (S5).
2957
- */
2958
- const MAX_IDENTITY_CHARS = 200;
2959
- /**
2960
- * Render an untrusted catalog string for safe inclusion in a `//` line
2967
+ * Render the untrusted server identity for safe inclusion in a `//` line
2961
2968
  * comment of generated source.
2962
2969
  *
2963
2970
  * The bridge source is EVALUATED (mounted at `@astral-mcp/tools` and imported
@@ -2968,11 +2975,14 @@ const MAX_IDENTITY_CHARS = 200;
2968
2975
  * authored (S1/S5). The same string lands in the `.d.ts` header the model
2969
2976
  * reads as authoritative guidance.
2970
2977
  *
2971
- * `JSON.stringify` escapes newlines and quotes; the control/bidi pass covers
2972
- * the separators JSON leaves raw, and the length cap bounds the artifact.
2978
+ * `inertIdentity` emits a JSON string literal: `JSON.stringify` escapes
2979
+ * newlines and quotes, the control/bidi pass covers the characters JSON
2980
+ * leaves raw (C1 controls, the U+2028/U+2029 LineTerminators that would
2981
+ * otherwise end the comment, bidi marks), and the length cap bounds the
2982
+ * artifact.
2973
2983
  */
2974
2984
  function commentSafe(text) {
2975
- return JSON.stringify(neutralizeControlChars(capLength(text, MAX_IDENTITY_CHARS)));
2985
+ return inertIdentity$1(text);
2976
2986
  }
2977
2987
  /** Derive a unique PascalCase type-name base from a tool name. */
2978
2988
  function pascalBase(toolName, taken) {
@@ -3085,9 +3095,13 @@ function firstLine(text) {
3085
3095
  return line.length > 100 ? `${line.slice(0, 97)}...` : line;
3086
3096
  }
3087
3097
  function generateOverview(server) {
3088
- const lines = [`Tools (server: ${server.identity}):`];
3098
+ const lines = [`Tools (server: ${inertIdentity$1(server.identity)}):`];
3089
3099
  if (server.tools.length === 0) lines.push(" (none)");
3090
- for (const tool of server.tools) lines.push(`- ${tool.name} ${overviewFlags(tool)} — ${firstLine(tool.description)}`);
3100
+ for (const tool of server.tools) {
3101
+ const name = capLength(neutralizeControlChars(tool.name), 200);
3102
+ const description = neutralizeControlChars(firstLine(tool.description));
3103
+ lines.push(`- ${name} ${overviewFlags(tool)} — ${description}`);
3104
+ }
3091
3105
  return `${lines.join("\n")}\n`;
3092
3106
  }
3093
3107
  function resolveSingleServer(catalog) {