@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 +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +35 -21
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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.
|
|
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
|
package/dist/index.d.mts.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;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;;;;
|
|
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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"}
|
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),
|
|
244
|
-
* (
|
|
245
|
-
*
|
|
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\
|
|
248
|
-
const HOSTILE_BLOCK = /[\u0000-\u0009\u000b-\u001f\u007f-\u009f\u200e\u200f\
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
-
* `
|
|
2972
|
-
*
|
|
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
|
|
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)
|
|
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) {
|