@superdoc-dev/sdk 1.6.0-next.4 → 1.6.0-next.41

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.cjs CHANGED
@@ -159,6 +159,7 @@ exports.installSkill = skills.installSkill;
159
159
  exports.listSkills = skills.listSkills;
160
160
  exports.chooseTools = tools.chooseTools;
161
161
  exports.dispatchSuperDocTool = tools.dispatchSuperDocTool;
162
+ exports.getMcpPrompt = tools.getMcpPrompt;
162
163
  exports.getSystemPrompt = tools.getSystemPrompt;
163
164
  exports.getToolCatalog = tools.getToolCatalog;
164
165
  exports.listTools = tools.listTools;
package/dist/index.d.ts CHANGED
@@ -77,7 +77,7 @@ export declare class SuperDocClient {
77
77
  }
78
78
  export declare function createSuperDocClient(options?: SuperDocClientOptions): SuperDocClient;
79
79
  export { getSkill, installSkill, listSkills } from './skills.js';
80
- export { chooseTools, dispatchSuperDocTool, getSystemPrompt, getToolCatalog, listTools } from './tools.js';
80
+ export { chooseTools, dispatchSuperDocTool, getMcpPrompt, getSystemPrompt, getToolCatalog, listTools, } from './tools.js';
81
81
  export { dispatchIntentTool } from './generated/intent-dispatch.generated.js';
82
82
  export { SuperDocCliError } from './runtime/errors.js';
83
83
  export type { InvokeOptions, OperationSpec, OperationParamSpec, RuntimeInvoker, SuperDocClientOptions, } from './runtime/process.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,KAAK,cAAc,EACnB,KAAK,aAAa,IAAI,sBAAsB,EAC5C,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAO9B;;;;;GAKG;AACH,cAAM,YAAa,YAAW,cAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM;IAKjD,MAAM,CAAC,KAAK,GAAG,OAAO,EAC1B,SAAS,EAAE,aAAa,EACxB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EACpC,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,KAAK,CAAC;IAUjB,UAAU,IAAI,IAAI;CAGnB;AAMD;;;;GAIG;AACH,cAAM,oBAAoB;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAExC,gBAAgB;gBACJ,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc;IAQ5G,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,oEAAoE;IACpE,IAAI,UAAU,IAAI,aAAa,CAE9B;IAEK,IAAI,CAAC,MAAM,GAAE,kBAAuB,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAQ1F,KAAK,CAAC,MAAM,GAAE,mBAAwB,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;IAWnG,gBAAgB;IAChB,UAAU,IAAI,IAAI;CAGnB;AAED,KAAK,wBAAwB,GAAG,oBAAoB,GAAG,WAAW,CAAC;AAOnE,eAAO,MAAM,gBAAgB,EAAE,KAC7B,YAAY,EAAE,YAAY,EAC1B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,aAAa,EACzB,MAAM,EAAE,cAAc,KACnB,wBAKwB,CAAC;AAE9B,MAAM,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAMxD,MAAM,MAAM,aAAa,GAAG,sBAAsB,CAAC;AAEnD,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuC;gBAEnD,OAAO,GAAE,qBAA0B;IAKzC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;;;;;OAMG;IACG,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkB/E,QAAQ,CAAC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAIzF,eAAe,CAAC,MAAM,EAAE,wBAAwB,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC;IAI5F,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ9B,gBAAgB;IAChB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAGtC;AAED,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,cAAc,CAExF;AAED,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC3G,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EACV,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACjE,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -147,6 +147,6 @@ export function createSuperDocClient(options = {}) {
147
147
  return new SuperDocClient(options);
148
148
  }
149
149
  export { getSkill, installSkill, listSkills } from './skills.js';
150
- export { chooseTools, dispatchSuperDocTool, getSystemPrompt, getToolCatalog, listTools } from './tools.js';
150
+ export { chooseTools, dispatchSuperDocTool, getMcpPrompt, getSystemPrompt, getToolCatalog, listTools, } from './tools.js';
151
151
  export { dispatchIntentTool } from './generated/intent-dispatch.generated.js';
152
152
  export { SuperDocCliError } from './runtime/errors.js';
package/dist/tools.cjs CHANGED
@@ -15,9 +15,28 @@ const providerFileByName = {
15
15
  vercel: 'tools.vercel.json',
16
16
  generic: 'tools.generic.json',
17
17
  };
18
+ const STRIP_EMPTY_OPTIONAL_ARGS = new Set(['parentId', 'parentCommentId', 'id', 'status']);
18
19
  function isRecord(value) {
19
20
  return typeof value === 'object' && value != null && !Array.isArray(value);
20
21
  }
22
+ function isObviouslyCorruptedToolArgKey(key) {
23
+ const trimmed = key.trim();
24
+ return trimmed.length === 0 || !/[\p{L}\p{N}]/u.test(trimmed);
25
+ }
26
+ function stripCorruptedToolArgKeys(value) {
27
+ if (Array.isArray(value)) {
28
+ return value.map((item) => stripCorruptedToolArgKeys(item));
29
+ }
30
+ if (!isRecord(value))
31
+ return value;
32
+ const clean = {};
33
+ for (const [key, entryValue] of Object.entries(value)) {
34
+ if (isObviouslyCorruptedToolArgKey(key))
35
+ continue;
36
+ clean[key] = stripCorruptedToolArgKeys(entryValue);
37
+ }
38
+ return clean;
39
+ }
21
40
  async function readJson(fileName) {
22
41
  const filePath = path.join(toolsDir, fileName);
23
42
  let raw = '';
@@ -202,6 +221,13 @@ async function dispatchSuperDocTool(documentHandle, toolName, args = {}, invokeO
202
221
  details: { toolName },
203
222
  });
204
223
  }
224
+ const sanitizedArgs = stripCorruptedToolArgKeys(args);
225
+ if (!isRecord(sanitizedArgs)) {
226
+ throw new errors.SuperDocCliError(`Tool arguments for ${toolName} must be an object.`, {
227
+ code: 'INVALID_ARGUMENT',
228
+ details: { toolName },
229
+ });
230
+ }
205
231
  // Validate against the tool schema before dispatch.
206
232
  const catalog = await getCachedCatalog();
207
233
  const tool = catalog.tools.find((t) => t.toolName === toolName);
@@ -211,13 +237,12 @@ async function dispatchSuperDocTool(documentHandle, toolName, args = {}, invokeO
211
237
  details: { toolName },
212
238
  });
213
239
  }
214
- validateToolArgs(toolName, args, tool);
240
+ validateToolArgs(toolName, sanitizedArgs, tool);
215
241
  // Strip empty strings for known optional ID/enum params that LLMs fill with ""
216
242
  // instead of omitting. Only target params where "" is never a valid value.
217
- const STRIP_EMPTY = new Set(['parentId', 'parentCommentId', 'id', 'status']);
218
243
  const cleanArgs = {};
219
- for (const [key, value] of Object.entries(args)) {
220
- if (value === '' && STRIP_EMPTY.has(key))
244
+ for (const [key, value] of Object.entries(sanitizedArgs)) {
245
+ if (value === '' && STRIP_EMPTY_OPTIONAL_ARGS.has(key))
221
246
  continue;
222
247
  cleanArgs[key] = value;
223
248
  }
@@ -227,7 +252,11 @@ async function dispatchSuperDocTool(documentHandle, toolName, args = {}, invokeO
227
252
  });
228
253
  }
229
254
  /**
230
- * Read the bundled system prompt for intent tools.
255
+ * Read the bundled SDK system prompt for intent tools.
256
+ *
257
+ * This prompt includes a persona preamble ("You are a document editing assistant…")
258
+ * suitable for embedded LLM usage (OpenAI, Anthropic, Vercel APIs).
259
+ * For MCP server instructions, use {@link getMcpPrompt} instead.
231
260
  */
232
261
  async function getSystemPrompt() {
233
262
  const promptPath = path.join(toolsDir, 'system-prompt.md');
@@ -241,9 +270,28 @@ async function getSystemPrompt() {
241
270
  });
242
271
  }
243
272
  }
273
+ /**
274
+ * Read the bundled MCP system prompt for intent tools.
275
+ *
276
+ * This prompt omits the persona preamble and includes session lifecycle
277
+ * instructions (open/save/close) suitable for MCP server `instructions`.
278
+ */
279
+ async function getMcpPrompt() {
280
+ const promptPath = path.join(toolsDir, 'system-prompt-mcp.md');
281
+ try {
282
+ return await promises.readFile(promptPath, 'utf8');
283
+ }
284
+ catch {
285
+ throw new errors.SuperDocCliError('MCP system prompt not found.', {
286
+ code: 'TOOLS_ASSET_NOT_FOUND',
287
+ details: { filePath: promptPath },
288
+ });
289
+ }
290
+ }
244
291
 
245
292
  exports.chooseTools = chooseTools;
246
293
  exports.dispatchSuperDocTool = dispatchSuperDocTool;
294
+ exports.getMcpPrompt = getMcpPrompt;
247
295
  exports.getSystemPrompt = getSystemPrompt;
248
296
  exports.getToolCatalog = getToolCatalog;
249
297
  exports.listTools = listTools;
package/dist/tools.d.ts CHANGED
@@ -50,8 +50,19 @@ export declare function chooseTools(input: ToolChooserInput): Promise<{
50
50
  */
51
51
  export declare function dispatchSuperDocTool(documentHandle: BoundDocApi, toolName: string, args?: Record<string, unknown>, invokeOptions?: InvokeOptions): Promise<unknown>;
52
52
  /**
53
- * Read the bundled system prompt for intent tools.
53
+ * Read the bundled SDK system prompt for intent tools.
54
+ *
55
+ * This prompt includes a persona preamble ("You are a document editing assistant…")
56
+ * suitable for embedded LLM usage (OpenAI, Anthropic, Vercel APIs).
57
+ * For MCP server instructions, use {@link getMcpPrompt} instead.
54
58
  */
55
59
  export declare function getSystemPrompt(): Promise<string>;
60
+ /**
61
+ * Read the bundled MCP system prompt for intent tools.
62
+ *
63
+ * This prompt omits the persona preamble and includes session lifecycle
64
+ * instructions (open/save/close) suitable for MCP server `instructions`.
65
+ */
66
+ export declare function getMcpPrompt(): Promise<string>;
56
67
  export {};
57
68
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAWzE,MAAM,MAAM,WAAW,GAAG;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;CAC5B,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B,CAAC;AA6CF,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAE3D;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAU1E;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,IAAI,EAAE;QACJ,QAAQ,EAAE,YAAY,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,CAAC,CAWD;AAiID;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,WAAW,EAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,OAAO,CAAC,CAgClB;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAUvD"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAWzE,MAAM,MAAM,WAAW,GAAG;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;CAC5B,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,cAAc,EAAE,CAAC;CAC9B,CAAC;AAmEF,wBAAsB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC,CAE3D;AAED,wBAAsB,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAU1E;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,IAAI,EAAE;QACJ,QAAQ,EAAE,YAAY,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH,CAAC,CAWD;AAiID;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,cAAc,EAAE,WAAW,EAC3B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,OAAO,CAAC,CAuClB;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAUvD;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAUpD"}
package/dist/tools.js CHANGED
@@ -11,9 +11,28 @@ const providerFileByName = {
11
11
  vercel: 'tools.vercel.json',
12
12
  generic: 'tools.generic.json',
13
13
  };
14
+ const STRIP_EMPTY_OPTIONAL_ARGS = new Set(['parentId', 'parentCommentId', 'id', 'status']);
14
15
  function isRecord(value) {
15
16
  return typeof value === 'object' && value != null && !Array.isArray(value);
16
17
  }
18
+ function isObviouslyCorruptedToolArgKey(key) {
19
+ const trimmed = key.trim();
20
+ return trimmed.length === 0 || !/[\p{L}\p{N}]/u.test(trimmed);
21
+ }
22
+ function stripCorruptedToolArgKeys(value) {
23
+ if (Array.isArray(value)) {
24
+ return value.map((item) => stripCorruptedToolArgKeys(item));
25
+ }
26
+ if (!isRecord(value))
27
+ return value;
28
+ const clean = {};
29
+ for (const [key, entryValue] of Object.entries(value)) {
30
+ if (isObviouslyCorruptedToolArgKey(key))
31
+ continue;
32
+ clean[key] = stripCorruptedToolArgKeys(entryValue);
33
+ }
34
+ return clean;
35
+ }
17
36
  async function readJson(fileName) {
18
37
  const filePath = path.join(toolsDir, fileName);
19
38
  let raw = '';
@@ -198,6 +217,13 @@ export async function dispatchSuperDocTool(documentHandle, toolName, args = {},
198
217
  details: { toolName },
199
218
  });
200
219
  }
220
+ const sanitizedArgs = stripCorruptedToolArgKeys(args);
221
+ if (!isRecord(sanitizedArgs)) {
222
+ throw new SuperDocCliError(`Tool arguments for ${toolName} must be an object.`, {
223
+ code: 'INVALID_ARGUMENT',
224
+ details: { toolName },
225
+ });
226
+ }
201
227
  // Validate against the tool schema before dispatch.
202
228
  const catalog = await getCachedCatalog();
203
229
  const tool = catalog.tools.find((t) => t.toolName === toolName);
@@ -207,13 +233,12 @@ export async function dispatchSuperDocTool(documentHandle, toolName, args = {},
207
233
  details: { toolName },
208
234
  });
209
235
  }
210
- validateToolArgs(toolName, args, tool);
236
+ validateToolArgs(toolName, sanitizedArgs, tool);
211
237
  // Strip empty strings for known optional ID/enum params that LLMs fill with ""
212
238
  // instead of omitting. Only target params where "" is never a valid value.
213
- const STRIP_EMPTY = new Set(['parentId', 'parentCommentId', 'id', 'status']);
214
239
  const cleanArgs = {};
215
- for (const [key, value] of Object.entries(args)) {
216
- if (value === '' && STRIP_EMPTY.has(key))
240
+ for (const [key, value] of Object.entries(sanitizedArgs)) {
241
+ if (value === '' && STRIP_EMPTY_OPTIONAL_ARGS.has(key))
217
242
  continue;
218
243
  cleanArgs[key] = value;
219
244
  }
@@ -223,7 +248,11 @@ export async function dispatchSuperDocTool(documentHandle, toolName, args = {},
223
248
  });
224
249
  }
225
250
  /**
226
- * Read the bundled system prompt for intent tools.
251
+ * Read the bundled SDK system prompt for intent tools.
252
+ *
253
+ * This prompt includes a persona preamble ("You are a document editing assistant…")
254
+ * suitable for embedded LLM usage (OpenAI, Anthropic, Vercel APIs).
255
+ * For MCP server instructions, use {@link getMcpPrompt} instead.
227
256
  */
228
257
  export async function getSystemPrompt() {
229
258
  const promptPath = path.join(toolsDir, 'system-prompt.md');
@@ -237,3 +266,21 @@ export async function getSystemPrompt() {
237
266
  });
238
267
  }
239
268
  }
269
+ /**
270
+ * Read the bundled MCP system prompt for intent tools.
271
+ *
272
+ * This prompt omits the persona preamble and includes session lifecycle
273
+ * instructions (open/save/close) suitable for MCP server `instructions`.
274
+ */
275
+ export async function getMcpPrompt() {
276
+ const promptPath = path.join(toolsDir, 'system-prompt-mcp.md');
277
+ try {
278
+ return await readFile(promptPath, 'utf8');
279
+ }
280
+ catch {
281
+ throw new SuperDocCliError('MCP system prompt not found.', {
282
+ code: 'TOOLS_ASSET_NOT_FOUND',
283
+ details: { filePath: promptPath },
284
+ });
285
+ }
286
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superdoc-dev/sdk",
3
- "version": "1.6.0-next.4",
3
+ "version": "1.6.0-next.41",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -26,11 +26,11 @@
26
26
  "typescript": "^5.9.2"
27
27
  },
28
28
  "optionalDependencies": {
29
- "@superdoc-dev/sdk-darwin-arm64": "1.6.0-next.4",
30
- "@superdoc-dev/sdk-darwin-x64": "1.6.0-next.4",
31
- "@superdoc-dev/sdk-linux-x64": "1.6.0-next.4",
32
- "@superdoc-dev/sdk-linux-arm64": "1.6.0-next.4",
33
- "@superdoc-dev/sdk-windows-x64": "1.6.0-next.4"
29
+ "@superdoc-dev/sdk-darwin-x64": "1.6.0-next.41",
30
+ "@superdoc-dev/sdk-linux-x64": "1.6.0-next.41",
31
+ "@superdoc-dev/sdk-linux-arm64": "1.6.0-next.41",
32
+ "@superdoc-dev/sdk-windows-x64": "1.6.0-next.41",
33
+ "@superdoc-dev/sdk-darwin-arm64": "1.6.0-next.41"
34
34
  },
35
35
  "publishConfig": {
36
36
  "access": "public"