@4399ywkf/editor-mcp 0.3.4 → 0.4.0
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/README.md +61 -7
- package/bin/hub.mjs +10 -5
- package/dist/chunk-DBNN3NAP.js +748 -0
- package/dist/chunk-DBNN3NAP.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/tools.d.ts +5 -1
- package/dist/tools.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-V3M4D5XE.js +0 -318
- package/dist/chunk-V3M4D5XE.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tools.ts"],"names":[],"mappings":"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","file":"chunk-DBNN3NAP.js","sourcesContent":["/**\n * 工具面:doc 10 个 + sheet 12 个工具的 name / description / JSON Schema。\n *\n * **这里没有任何传输**。是 MCP、是 HTTP、还是像 jizhi_ai 那样 agent loop 直接调\n * executor,都由上层决定 —— 想自己接的只 import 这个模块就够了:\n *\n * ```ts\n * import { DOC_TOOLS, SHEET_TOOLS, SLIDE_TOOLS, ALL_TOOLS } from \"@4399ywkf/editor-mcp/tools\"\n * ```\n *\n * 为什么这么少:参照系是 BlockNote AI 的 3 个工具,和把 tiptap 每个 command\n * 都包成工具的 `tiptap-apcore`(79 个,GitHub 1 star)。工具面大了模型反而选不准。\n * `doc_stats` 那类对账工具刻意不在这里 —— 它是给人调试用的,`DocRuntime.call`\n * 支持,但不该占模型的注意力。\n *\n * 8 个读写工具 + 2 个导入导出。后两个之所以够格占位置:没有它们,模型能把文档\n * 改好却交付不出去 —— 「改完了,然后呢」是个死胡同。\n */\nimport { FORMATTABLE, MARK_TAG, NODE_TAG, READONLY_TAGS } from \"@4399ywkf/editor/doc-runtime\"\n\nexport interface DocToolSchema {\n type: \"object\"\n properties: Record<string, unknown>\n required?: string[]\n additionalProperties?: boolean\n}\n\nexport interface DocTool {\n name: string\n description: string\n inputSchema: DocToolSchema\n}\n\n/**\n * 定位纪律。写进 description 而不是 README —— 和实现同生共死,不会漂。\n *\n * 后半句是必需的:模型带着 Google Docs / 腾讯文档那套 API 的条件反射\n * (改一处就失效一次索引),不明说它会自作聪明地倒序处理、反复重读。\n */\nconst ADDRESSING_NOTE =\n \"定位一律用 node id(读工具返回的 id 属性),逐字复制。\" +\n \"注意:与 Google Docs / 腾讯文档那类 API 不同,本工具面的定位在执行的那一瞬间才解析,\" +\n \"所以你不需要从文档尾部往前处理,也不需要每改一处就重新读一遍。\"\n\n/**\n * 可用标签清单从 doc-runtime 的标签表**生成**,不是手抄的。\n * 编辑器加一个节点类型,这段 description 自动跟着变。\n */\nconst BLOCK_TAGS = [...new Set(Object.values(NODE_TAG))]\n .filter((t) => !READONLY_TAGS.has(t))\n .sort()\n .join(\" \")\nconst INLINE_TAGS = Object.values(MARK_TAG).join(\" \")\n\nexport const DOC_TOOLS: readonly DocTool[] = [\n {\n name: \"doc_read\",\n description:\n \"读取整篇文档,返回 LiteXML(每个块带稳定 id)。要编辑之前必须先调它拿 id。\" +\n ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n format: {\n type: \"string\",\n enum: [\"xml\", \"json\", \"both\"],\n description:\n \"默认 xml。json 是 ProseMirror 原生结构(无损但费 token,约 1.5-2.8 倍),\" +\n \"只在你怀疑 LiteXML 丢了信息时才用。\",\n },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"doc_schema\",\n description:\n \"返回本编辑器支持的全部节点类型 / 标记类型 / LiteXML 标签映射 / 哪些类型带稳定 id。\" +\n \"不确定某个结构能不能写、该用什么标签时先查它。这份数据是从运行时 schema 反射出来的,\" +\n \"永远不会和实现漂移。\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"doc_find\",\n description:\n \"全文检索,返回可直接回填给写工具的地址:{nodeId, nodeType, contextBefore, match, contextAfter}。\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"要查找的文本(字面量,不是正则)\" },\n limit: { type: \"number\", description: \"最多返回几条,默认 20\" },\n },\n required: [\"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"doc_get_selection\",\n description:\n \"读取用户此刻在编辑器里选中了什么。返回 selection:null 时表示本轮无选区,不得沿用历史选区。\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"doc_replace_text\",\n description:\n \"块内文本替换,最推荐的细粒度改法。只改命中的那一段,块内其余的格式、链接、\" +\n \"mention 都会保住。可用 nodeIds 限定只在某些块里替换。\" +\n ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n searchText: { type: \"string\" },\n newText: { type: \"string\" },\n nodeIds: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"限定生效范围;省略则全文\",\n },\n replaceAll: {\n type: \"boolean\",\n description: \"默认 false,只替换文档里第一处\",\n },\n },\n required: [\"searchText\", \"newText\"],\n additionalProperties: false,\n },\n },\n {\n name: \"doc_format_text\",\n description:\n \"给某个块里的一段文字加/去格式(加粗、斜体、下划线、删除线、行内代码、上下标)。\" +\n \"**要改格式请优先用它,不要用 doc_modify_nodes 整块重写** —— \" +\n \"整块重写要求你重述整块内容,你没看见的属性和内联节点会在重述中丢失。\\n\" +\n \"先用 doc_read / doc_find 拿到块的 id 和它的文本,再指定要施加格式的那段文字。\",\n inputSchema: {\n type: \"object\",\n properties: {\n nodeId: { type: \"string\", description: \"目标块的 id\" },\n searchText: { type: \"string\", description: \"块内要施加格式的那段文字(精确匹配)\" },\n marks: {\n type: \"array\",\n items: { type: \"string\", enum: [...FORMATTABLE] },\n description: \"要施加的标记,可多个\",\n },\n remove: { type: \"boolean\", description: \"true 则移除这些标记而不是施加,默认 false\" },\n occurrence: { type: \"number\", description: \"块内第几处匹配,从 1 开始,默认 1\" },\n },\n required: [\"nodeId\", \"searchText\", \"marks\"],\n additionalProperties: false,\n },\n },\n {\n name: \"doc_modify_nodes\",\n description:\n \"结构化编辑:一次提交多个 insert / remove / modify 操作。\" +\n \"批量写入优先用它,不要拆成很多次单点调用。\\n\" +\n `LiteXML 块标签:${BLOCK_TAGS} h1-h9;未知节点用 <node type=\"x\"/>。\\n` +\n '标题自动编号:<h2 seq=\"auto\"> 按位置自动编号,seq=\"3\" 表示从 3 开始;编号由编辑器算,别把「1.2」写进标题文字。\\n' +\n '文件:<file src=\"…\" name=\"a.pdf\" viewType=\"card|preview\"/>,preview 是在文档里直接预览;文字里的文件用 <node type=\"fileInline\" src=\"…\" name=\"…\"/>。\\n' +\n '网页卡片:<bookmark url=\"https://…\"/>,标题、摘要、封面由编辑器抓取,不用写。\\n' +\n '按钮(行内):<node type=\"inlineButton\" text=\"去报名\" action=\"OpenLink\" href=\"https://…\" color=\"light-blue\"/>,color 取 light-/deep- 加 red|origin|green|wathet|blue|carmine|purple|neutral。\\n' +\n '日期提醒(行内):<node type=\"reminder\" expireTime=\"毫秒时间戳\" isWholeDay=\"true|false\" shouldNotify=\"true|false\" notifyTime=\"毫秒时间戳\"/>,全天的 expireTime 取当天 23:59:59;显示文字(今天 / 明天 / 本周X…)由编辑器算。\\n' +\n '会议议程:<agenda><agenda-item duration=\"1200\"><agenda-title>开场</agenda-title><agenda-content><p>…</p></agenda-content></agenda-item></agenda>,duration 单位秒(0 = 不限时),每条议程必须是「标题 + 内容」两段。\\n' +\n '投票:<node type=\"poll\" title=\"…\" pollType=\"single|multiple\" options=\\'[{\"id\":\"a\",\"text\":\"…\"}]\\'/>,由用户在文档里发布,不要写 published。\\n' +\n '文本绘图(Mermaid):<mermaid>flowchart TD\\n A --> B</mermaid>,代码原样写在标签里(会渲染成图);```mermaid 代码块也会自动变成它。\\n' +\n '流程图:<diagram data=\\'{\"nodes\":[{\"id\":\"n1\",\"shape\":\"terminator|process|decision|data\",\"label\":\"开始\",\"x\":0,\"y\":0}],\"edges\":[{\"id\":\"e1\",\"source\":\"n1\",\"target\":\"n2\",\"label\":\"是\"}]}\\'/>,坐标单位 px,纵向排布时 y 每层约 110。\\n' +\n `内联:${INLINE_TAGS} a[href] mark[color] color[v] br。\\n` +\n '例:<code lang=\"ts\">…</code>、<img src=\"…\"/>、<tasks><task checked=\"true\">…</task></tasks>。\\n' +\n \"modify 的 litexml 必须带上要改的那个块的 id 属性。\" +\n \"你没写进 XML 的属性会以原节点为底保留下来(不会被抹掉),所以不必重述你没看见的状态。\" +\n ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n operations: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n action: { type: \"string\", enum: [\"insert\", \"remove\", \"modify\"] },\n afterId: { type: \"string\", description: \"insert:插到这个块之后\" },\n beforeId: { type: \"string\", description: \"insert:插到这个块之前\" },\n id: { type: \"string\", description: \"remove:要删除的块 id\" },\n litexml: {\n type: \"string\",\n description: \"insert/modify 的内容。modify 时必须带 id 属性\",\n },\n },\n required: [\"action\"],\n },\n },\n },\n required: [\"operations\"],\n additionalProperties: false,\n },\n },\n {\n name: \"doc_table_edit\",\n description:\n \"表格的**结构性**改动(增删行列、合并拆分、切表头)和批量写值。\" +\n \"用 (tableId, row, col) 这种结构坐标定位,row/col 都是 0-based,表头是第 0 行。\\n\" +\n \"注意:单元格里的段落是有 id 的,所以「只改某个格子的文字」直接用 \" +\n \"doc_replace_text / doc_format_text 打那个段落的 id 通常更简单。\",\n inputSchema: {\n type: \"object\",\n properties: {\n tableId: { type: \"string\" },\n action: {\n type: \"string\",\n enum: [\n \"set_cells\",\n \"insert_row_after\",\n \"insert_row_before\",\n \"insert_col_after\",\n \"insert_col_before\",\n \"delete_row\",\n \"delete_col\",\n \"toggle_header_row\",\n \"merge_cells\",\n \"split_cell\",\n ],\n },\n row: {\n type: \"number\",\n description: \"0-based 行号(表头是第 0 行)。除 set_cells 外**必填**,作为锚点单元格\",\n },\n col: { type: \"number\", description: \"0-based 列号。除 set_cells 外**必填**\" },\n values: {\n type: \"array\",\n description: \"set_cells 用:[{row, col, text}]\",\n items: {\n type: \"object\",\n properties: {\n row: { type: \"number\" },\n col: { type: \"number\" },\n text: { type: \"string\" },\n },\n required: [\"row\", \"col\", \"text\"],\n },\n },\n },\n required: [\"tableId\", \"action\"],\n additionalProperties: false,\n },\n },\n\n /* ---------------------------- 导入 / 导出 ---------------------------- *\n * 这两个工具的返回值和参数里**不出现文件内容**。docx 是二进制,一份带图的\n * 动辄几 MB,base64 进上下文会直接把窗口撑爆。所以约定:模型只说路径,\n * 字节在 hub ↔ 浏览器之间走,不经过模型。\n * ------------------------------------------------------------------ */\n {\n name: \"doc_export_docx\",\n description:\n \"把当前文档导出成 .docx 落到磁盘,返回文件路径与导出统计。\" +\n \"文件写在 hub 的输出目录下(启动时 --out-dir 指定,默认 hub 的工作目录),\" +\n \"只接受文件名、不接受路径 —— 想放别处请让用户改 hub 的 --out-dir。\\n\" +\n \"会一并写回导入时保留的页眉页脚与页面设置(前提是这篇文档是本次会话里用 \" +\n \"doc_import_docx 或界面导入进来的)。返回的 warnings 是**导出时丢了什么**,\" +\n \"非空就如实转述给用户,别当成功报。\",\n inputSchema: {\n type: \"object\",\n properties: {\n filename: {\n type: \"string\",\n description: \"文件名,如 `报告.docx`。省略则用 document.docx。不要带目录\",\n },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"doc_import_docx\",\n description:\n \"读一份 .docx 灌进编辑器,**整篇替换**当前内容(不是追加,也不可撤销 —— \" +\n \"文档里已有内容时先跟用户确认)。path 相对 hub 的输出目录解析。\\n\" +\n \"返回 recovered(各类样式各救回多少项)和 warnings。导入完要接着编辑的话,\" +\n \"先调 doc_read 拿新的 id —— 旧 id 全部失效。\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"docx 文件名或相对 hub 输出目录的路径\",\n },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n]\n\nexport const DOC_TOOL_NAMES: readonly string[] = DOC_TOOLS.map((t) => t.name)\n\n/** 单个工具的定义,找不到返回 undefined。 */\nexport function getDocTool(name: string): DocTool | undefined {\n return DOC_TOOLS.find((t) => t.name === name)\n}\n\n/* ================================ sheet ================================ */\n\n/**\n * 表格工具面。执行体是 `@4399ywkf/editor/sheet-runtime` 的 `SheetRuntime`,\n * 和 doc 工具面同一套纪律:面尽量小(12 个)、导出不给模型看字节、\n * 丢失/降级如实进 warnings。\n *\n * 定位用 A1 引用而不是 node id —— 表格的坐标系本来就是稳定的,\n * 不需要 doc 那套「读了才有 id」的仪式;但**写之前先 sheet_read 看清现状**\n * 这条纪律不变:盲写会覆盖你没看见的数据。\n */\nconst SHEET_ADDRESSING_NOTE =\n \"定位一律用 A1 引用(如 B2、A1:D20),行列都从 A/1 开始数。\" +\n \"写之前先用 sheet_read 看清目标区域现状 —— 盲写会覆盖你没看见的数据。\"\n\nexport const SHEET_TOOLS: readonly DocTool[] = [\n {\n name: \"sheet_read\",\n description:\n \"读取工作簿概览(每张表的名字和已用范围)+ 指定表的单元格内容(CSV 文本)与公式清单。\" +\n \"要写之前必须先调它。区域超过 300×100 会截断并提示,用 range 分段读。\" +\n '日期格读出来是 Excel 序列号;返回里带 dateSystem: \"date1904\" 时序列号从 1904-01-01 起算。' +\n \"要看格式时加 include(styles / merges / freeze / filter / conditional_formats),不加则只读值。\" +\n SHEET_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n sheet: { type: \"string\", description: \"工作表 id 或表名,省略用活动表\" },\n range: { type: \"string\", description: 'A1 区域(如 \"B2:F40\"),省略读整个已用范围' },\n includeFormulas: { type: \"boolean\", description: \"是否附带公式清单,默认 true\" },\n include: {\n type: \"array\",\n items: {\n type: \"string\",\n enum: [\"styles\", \"merges\", \"freeze\", \"filter\", \"conditional_formats\"],\n },\n description:\n \"附带格式信息,不给则输出与不带时完全一样。styles:读取范围内显式设置的样式,字段名同 sheet_format_range\" +\n \"(边框读出来是逐边的只读 borders),相同样式的相邻格合并成 {range, style},最多 100 条、超出带 styles_truncated;\" +\n \"merges:本表全部合并区域;freeze:{rows, cols};filter:{range, columns: [{column, values, include_blank?}]} 或 null\" +\n \"(不支持的筛选方式标 unsupported);conditional_formats:[{id, ranges, rule, style?}],\" +\n '按优先级从高到低,加上 action: \"update\" 可原样传回 sheet_conditional_format(不支持的类型 rule 为 {type: \"unsupported\", kind})',\n },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_find\",\n description:\n \"全簿检索(单元格的值和公式都搜,大小写不敏感),返回 {sheet, ref, value, formula?},\" +\n \"ref 可直接回填给写工具。\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"要查找的文本(字面量,不是正则)\" },\n limit: { type: \"number\", description: \"最多返回几条,默认 20\" },\n },\n required: [\"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_set_values\",\n description:\n \"从 start 起写入一块二维值,批量写入首选(不要拆成很多次单格调用)。\" +\n '以 \"=\" 开头的字符串按公式写入(如 \"=SUM(A1:A9)\"),null 清空该格,' +\n \"各行必须等长 —— 整块区域会被覆盖,不想动的格子请缩小区域分多次写。\" +\n SHEET_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n sheet: { type: \"string\", description: \"工作表 id 或表名,省略用活动表\" },\n start: { type: \"string\", description: '写入区域左上角,单格 A1 形式(如 \"B2\")' },\n values: {\n type: \"array\",\n description: \"二维数组,外层是行。元素:字符串/数字/布尔/null\",\n items: {\n type: \"array\",\n items: { type: [\"string\", \"number\", \"boolean\", \"null\"] },\n },\n },\n },\n required: [\"start\", \"values\"],\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_edit_rows_cols\",\n description:\n \"插入 / 删除整行整列。index 是 0-based:insert 在该位置**之前**插入,\" +\n \"delete 从该位置开始删 count 个。删除不可撤销地移除数据 —— 删之前先 sheet_read 确认内容。\",\n inputSchema: {\n type: \"object\",\n properties: {\n sheet: { type: \"string\", description: \"工作表 id 或表名,省略用活动表\" },\n action: {\n type: \"string\",\n enum: [\"insert_rows\", \"delete_rows\", \"insert_cols\", \"delete_cols\"],\n },\n index: { type: \"number\", description: \"0-based 行号/列号\" },\n count: { type: \"number\", description: \"行数/列数,默认 1\" },\n },\n required: [\"action\", \"index\"],\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_manage_sheets\",\n description:\n \"工作表管理:add(新建)/ rename(重命名)/ delete(删除,**整表数据一并消失**,\" +\n \"必须显式指定 sheet,删之前先跟用户确认)/ activate(切活动表)。返回最新的表清单。\",\n inputSchema: {\n type: \"object\",\n properties: {\n action: { type: \"string\", enum: [\"add\", \"rename\", \"delete\", \"activate\"] },\n sheet: { type: \"string\", description: \"rename/delete/activate 的目标(id 或表名)\" },\n name: { type: \"string\", description: \"add 的表名 / rename 的新名\" },\n },\n required: [\"action\"],\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_export_xlsx\",\n description:\n \"把当前工作簿导出成 .xlsx 落到磁盘,返回文件路径与导出统计。\" +\n \"文件写在 hub 的输出目录下,只接受文件名、不接受路径。\" +\n \"返回的 warnings 是**导出时丢了什么**(图片、条件格式等插件数据),\" +\n \"非空就如实转述给用户,别当成功报。\",\n inputSchema: {\n type: \"object\",\n properties: {\n filename: {\n type: \"string\",\n description: \"文件名,如 `报表.xlsx`。省略则用 工作簿.xlsx。不要带目录\",\n },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_format_range\",\n description:\n \"设置区域格式:style 只写要改的字段,没写的保持原样 —— bold / italic / underline / strike、\" +\n \"size(字号 pt)、color(文字色)、font(字体)、fill(填充色,null 清除)、align(left|center|right)、\" +\n 'valign(top|middle|bottom)、wrap(自动换行)、numberFormat(Excel 格式串,如 \"#,##0.00\"、\"0%\"、\"yyyy-mm-dd\")、' +\n \"border({edges: all|outside|inside|top|bottom|left|right|none, style: thin|medium|thick, color})。\" +\n \"clear: true 先清掉区域内单元格自身的样式(字体、填充、对齐、边框、数字格式;合并与条件格式不动)再应用 style。颜色只收 #RRGGBB。\" +\n \"一次调用最多两步撤销(单元格样式一步、边框一步)。\" +\n \"区域里(设边框时还包括区域外紧邻的一圈)若有看起来像数字或 TRUE/FALSE 的文本格且不是文本格式,会报错并点名;\" +\n '因为 Univer 改样式会把它们转成数字,丢失前导 0 或第 16 位起的数字。先只对点名的格设 numberFormat \"@\" 再重试。' +\n 'numberFormat 设为 \"@\" 会把区域里已有的数字、日期、布尔转成文本(123 变 \"123\"),SUM / 排序随之按文本处理;只对需要保持文本的格用。' +\n SHEET_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n sheet: { type: \"string\", description: \"工作表 id 或表名,省略用活动表\" },\n range: { type: \"string\", description: 'A1 区域,如 \"A1:F1\"' },\n style: {\n type: \"object\",\n description: \"要设置的样式字段;没给的保持原样\",\n properties: {\n bold: { type: \"boolean\" },\n italic: { type: \"boolean\" },\n underline: { type: \"boolean\" },\n strike: { type: \"boolean\" },\n size: { type: \"number\", description: \"字号 pt,1~409\" },\n color: { type: \"string\", description: \"文字颜色 #RRGGBB\" },\n font: { type: \"string\", description: \"字体名,如 微软雅黑\" },\n fill: { type: [\"string\", \"null\"], description: \"填充色 #RRGGBB,null 清除填充\" },\n align: { type: \"string\", enum: [\"left\", \"center\", \"right\"] },\n valign: { type: \"string\", enum: [\"top\", \"middle\", \"bottom\"] },\n wrap: { type: \"boolean\", description: \"自动换行\" },\n numberFormat: {\n type: \"string\",\n description: 'Excel 数字格式,如 \"#,##0.00\"、\"0%\"、\"yyyy-mm-dd\"、\"@\"(文本)',\n },\n border: {\n type: \"object\",\n properties: {\n edges: {\n type: \"string\",\n enum: [\"all\", \"outside\", \"inside\", \"top\", \"bottom\", \"left\", \"right\", \"none\"],\n },\n style: { type: \"string\", enum: [\"thin\", \"medium\", \"thick\"], description: \"默认 thin\" },\n color: { type: \"string\", description: \"#RRGGBB,默认 #000000\" },\n },\n required: [\"edges\"],\n additionalProperties: false,\n },\n },\n additionalProperties: false,\n },\n clear: { type: \"boolean\", description: \"先清掉区域内单元格自身的样式(再应用 style);合并与条件格式不动\" },\n },\n required: [\"range\"],\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_merge\",\n description:\n \"合并 / 拆分单元格:merge 合并整块,merge_across 每行各自合并,unmerge 拆开与区域相交的全部合并。\" +\n \"合并后每块只保留第一个有值的格(按行从左到右,放到左上角):其余格有值时默认报错并说明会清掉哪几格,\" +\n \"确认丢弃再传 discard_values: true;与已有合并重叠也报错(先 unmerge)。一步撤销。\" +\n SHEET_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n sheet: { type: \"string\", description: \"工作表 id 或表名,省略用活动表\" },\n range: { type: \"string\", description: 'A1 区域,如 \"A1:D1\"' },\n action: { type: \"string\", enum: [\"merge\", \"merge_across\", \"unmerge\"] },\n discard_values: {\n type: \"boolean\",\n description: \"合并会清掉其他格的值时,传 true 表示确认丢弃\",\n },\n },\n required: [\"range\", \"action\"],\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_sort\",\n description:\n \"按列排序区域,整行一起移动:by 的先后即主次关键字,column 是列字母且须在 range 内,ascending 默认 true。\" +\n \"range 含表头时传 has_header: true,首行留在原位。区域里有合并单元格时报错;被筛选隐藏的行不参与排序。一步撤销。\" +\n SHEET_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n sheet: { type: \"string\", description: \"工作表 id 或表名,省略用活动表\" },\n range: { type: \"string\", description: 'A1 区域,如 \"A1:F40\"' },\n by: {\n type: \"array\",\n description: \"排序关键字,先后即主次\",\n items: {\n type: \"object\",\n properties: {\n column: { type: \"string\", description: '列字母,如 \"C\"' },\n ascending: { type: \"boolean\", description: \"默认 true(升序)\" },\n },\n required: [\"column\"],\n additionalProperties: false,\n },\n },\n has_header: { type: \"boolean\", description: \"range 首行是表头、不参与排序,默认 false\" },\n },\n required: [\"range\", \"by\"],\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_filter\",\n description:\n \"筛选(只隐藏行,不改数据)。set:在 column 上设「只显示这些值」—— 本表没有筛选时在 range 上新建\" +\n \"(range 首行是表头),values 按单元格显示出来的文本匹配,include_blank 表示也显示空格;\" +\n \"已有筛选且给了不同的 range 会报错(先 remove)。clear:清 column 的条件,省略 column 清全部;remove:删除整个筛选。\" +\n \"新建筛选 + 设条件是两步撤销,清全部条件每列一步。\" +\n SHEET_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n sheet: { type: \"string\", description: \"工作表 id 或表名,省略用活动表\" },\n action: { type: \"string\", enum: [\"set\", \"clear\", \"remove\"] },\n range: { type: \"string\", description: \"set 且本表还没有筛选时必填:含表头的整块区域\" },\n column: { type: \"string\", description: '列字母,如 \"B\"' },\n values: {\n type: \"array\",\n items: { type: [\"string\", \"number\"] },\n description: \"set:只显示这些值(显示出来的文本)\",\n },\n include_blank: { type: \"boolean\", description: \"set:也显示空格\" },\n },\n required: [\"action\"],\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_freeze\",\n description:\n \"冻结窗格:冻结顶部 rows 行、左侧 cols 列(都是个数,从表的第一行 / 第一列算起),rows: 0, cols: 0 取消冻结。\" +\n \"改之前先用 sheet_read 看清表头占几行。一步撤销。\",\n inputSchema: {\n type: \"object\",\n properties: {\n sheet: { type: \"string\", description: \"工作表 id 或表名,省略用活动表\" },\n rows: { type: \"number\", description: \"冻结顶部几行,0 表示不冻结行\" },\n cols: { type: \"number\", description: \"冻结左侧几列,0 表示不冻结列\" },\n },\n required: [\"rows\", \"cols\"],\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_conditional_format\",\n description:\n \"条件格式:add 新增(返回 id,新规则优先级最高)/ update 按 id 替换给出的 range / rule / style(没给的保持原样)/ delete 按 id 删除。\" +\n \"rule.type:number(operator gt|gte|lt|lte|eq|neq|between|not_between,value 数字或 [下限, 上限])、\" +\n \"text(operator contains|not_contains|begins_with|ends_with,value 文本,区分大小写)、duplicate / unique、\" +\n \"top / bottom(count,percent: true 表示百分比)、color_scale(colors 2 或 3 个 #RRGGBB:最小值 /(50 分位)/ 最大值)、\" +\n \"data_bar(color,渐变)。前六类是高亮,必须带 style(color fill bold italic underline strike);色阶和数据条不收 style。\" +\n '已有规则先用 sheet_read 的 include: [\"conditional_formats\"] 看 id,读出的条目加上 action: \"update\" 可原样传回。每次一步撤销。' +\n SHEET_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n sheet: { type: \"string\", description: \"工作表 id 或表名,省略用活动表\" },\n action: { type: \"string\", enum: [\"add\", \"update\", \"delete\"] },\n id: { type: \"string\", description: \"update / delete 的目标规则 id\" },\n range: {\n type: [\"string\", \"array\"],\n items: { type: \"string\" },\n description: 'A1 区域或区域数组,如 \"C2:C20\" 或 [\"C2:C20\", \"E2:E20\"]',\n },\n ranges: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"同 range(sheet_read 读出的字段名),与 range 二选一\",\n },\n rule: {\n type: \"object\",\n description:\n \"number:operator + value;text:operator + value;duplicate / unique 无参数;top / bottom:count、percent?;\" +\n \"color_scale:colors,可选 points 改阈值;data_bar:color,可选 min / max 改阈值。\" +\n \"points / min / max 的元素形如 {type: min|max|num|percent|percentile, value?},缺省为最小值 /(50 分位)/ 最大值\",\n properties: {\n type: {\n type: \"string\",\n enum: [\"number\", \"text\", \"duplicate\", \"unique\", \"top\", \"bottom\", \"color_scale\", \"data_bar\"],\n },\n operator: { type: \"string\" },\n value: { description: \"number 规则是数字或 [下限, 上限];text 规则是文本\" },\n count: { type: \"number\" },\n percent: { type: \"boolean\" },\n colors: { type: \"array\", items: { type: \"string\" } },\n color: { type: \"string\" },\n points: { type: \"array\", items: { type: \"object\" } },\n min: { type: \"object\" },\n max: { type: \"object\" },\n },\n required: [\"type\"],\n },\n style: {\n type: \"object\",\n description: \"高亮样式(高亮类规则必填;色阶和数据条不收)\",\n properties: {\n color: { type: \"string\", description: \"文字色 #RRGGBB\" },\n fill: { type: \"string\", description: \"填充色 #RRGGBB\" },\n bold: { type: \"boolean\" },\n italic: { type: \"boolean\" },\n underline: { type: \"boolean\" },\n strike: { type: \"boolean\" },\n },\n additionalProperties: false,\n },\n },\n required: [\"action\"],\n additionalProperties: false,\n },\n },\n]\n\nexport const SHEET_TOOL_NAMES: readonly string[] = SHEET_TOOLS.map((t) => t.name)\n\n/** 单个 sheet 工具的定义,找不到返回 undefined。 */\nexport function getSheetTool(name: string): DocTool | undefined {\n return SHEET_TOOLS.find((t) => t.name === name)\n}\n\n/* ============================== slide ============================== */\n\nconst SLIDE_ADDRESSING_NOTE =\n \" 页码从 1 开始;shape_id 用 slide_read 返回的 id;长度单位 pt(宽屏 16:9 一页约 960×540,4:3 约 720×540),颜色 #RRGGBB。\"\n\nexport const SLIDE_TOOLS: readonly DocTool[] = [\n {\n name: \"slide_read\",\n description:\n \"读演示文稿的结构化视图(只读 XML):每页的版式、形状(sp 文本 / pic 图片 / table 表格 / group 分组)及其 id、名称、占位符类型、位置尺寸。\" +\n \"改之前必须先调它看清 id。inherited=\\\"1\\\" 表示位置继承自版式;readonly=\\\"1\\\" 的对象(图表、SmartArt、分组内形状)本期不能改;分组内形状不能改位置和属性,但其中的文字可以用 slide_replace_text 的查找替换修改。\" +\n \"要看现有文字格式时传 include_format: true。\" +\n SLIDE_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n slides: { type: \"array\", items: { type: \"number\" }, description: \"要读的页码列表,省略读全部\" },\n include_notes: { type: \"boolean\", description: \"是否带上演讲者备注,默认 false\" },\n include_format: {\n type: \"boolean\",\n description:\n \"段落按片段输出文字自己设的格式(b i u s sz color font font-ea hl link;继承自版式/母版的不显示),默认 false。\" +\n \"color / hl 的值是 #RRGGBB、主题色名,或 complex(渐变等其他填充或带深浅 / 透明度调整的颜色,读不出确切色值);\" +\n \"link 的值是网址、slide:N(跳到第 N 页)、slide:?(目标页已不存在)或 ?(无法解析,如动作按钮)\",\n },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"slide_find\",\n description:\n \"全文检索(形状文本与表格单元格,大小写不敏感),返回 {slide, shape_id, cell?, text},可直接回填给写工具。\" +\n SLIDE_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"要找的文本\" },\n regex: { type: \"boolean\", description: \"query 按正则解释,默认 false\" },\n limit: { type: \"number\", description: \"最多返回几条,默认 50\" },\n },\n required: [\"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"slide_replace_text\",\n description:\n \"改文字,两种用法:① {slide, shape_id, text} 整体替换一个文本形状的内容,\\\\n 分段,沿用第一个文字片段的格式,保留原有字体字号颜色与链接(不想要链接就用 slide_format_text 的 link: null 清掉);\" +\n \"② {find, replace, slides?} 全文查找替换,replace 必填(传 \\\"\\\" 才是删除命中的文字),区分大小写(和 slide_find 不同),也覆盖表格单元格和分组内的文字;\" +\n \"只替换落在同一个格式片段里的命中,跨格式片段的命中会在 unreplaced 里列出,请改用 ①。整格改写表格请用 slide_table_edit。两种用法不能混用。\" +\n SLIDE_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n slide: { type: \"number\", description: \"① 页码\" },\n shape_id: { type: \"number\", description: \"① 文本形状 id\" },\n text: { type: \"string\", description: \"① 新文本,\\\\n 分段\" },\n find: { type: \"string\", description: \"② 要查找的文本(字面量)\" },\n replace: { type: \"string\", description: \"② 替换成的文本\" },\n slides: { type: \"array\", items: { type: \"number\" }, description: \"② 限定页码,省略为全部\" },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"slide_format_text\",\n description:\n \"设置形状或表格单元格里文字的格式、段落对齐与超链接。定位:shape_id(表格还要 cells),可选 paragraphs 只改某几段、\" +\n \"match 只改匹配到的文字(字面量、区分大小写,跨格式片段也行)、occurrence 只改第几处。\" +\n \"occurrence 按文档顺序数:paragraphs 去重后从小到大,多个单元格按 cells 给出的顺序,重复的格子只算一次。\" +\n \"format 可设 bold / italic / underline / strike(true 或 false)、size(pt,1~400)、color(#RRGGBB 或主题色 accent1~6 / tx1 / tx2 / bg1 / bg2 / hlink)、\" +\n \"font(中西文一起设)、highlight(#RRGGBB)、link({url} 网址或 {slide} 跳到某页);size / color / font / highlight / link 传 null 表示清除、恢复继承。\" +\n \"align 设段落对齐(left / center / right / justify),给了 match 时作用于命中所在段落。match 一处都没找到会报错;可先用 slide_read 的 include_format 看现有格式。\" +\n \"给 format 时目标里必须已有文字,没有会报错:文本形状请先用 slide_replace_text 写入,表格单元格请先用 slide_table_edit 的 set_cells 填入;只设 align 时空段落也可以。\" +\n SLIDE_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n slide: { type: \"number\" },\n shape_id: { type: \"number\", description: \"文本形状或表格的 shape_id\" },\n cells: {\n type: \"array\",\n items: { type: \"array\", items: { type: \"number\" }, minItems: 2, maxItems: 2 },\n description: \"表格时必填:[[行, 列], …],从 1 开始\",\n },\n paragraphs: { type: \"array\", items: { type: \"number\" }, description: \"只改这几段(从 1 开始;表格时在每个单元格内各自计数),省略为全部\" },\n match: { type: \"string\", description: \"只改匹配到的文字(字面量、区分大小写)\" },\n occurrence: { type: \"number\", description: \"只改第几处匹配(从 1 开始),省略为全部\" },\n format: {\n type: \"object\",\n properties: {\n bold: { type: \"boolean\" },\n italic: { type: \"boolean\" },\n underline: { type: \"boolean\" },\n strike: { type: \"boolean\" },\n size: { type: [\"number\", \"null\"], description: \"字号 pt,1~400;null 清除\" },\n color: { type: [\"string\", \"null\"], description: \"#RRGGBB 或主题色名;null 清除\" },\n font: { type: [\"string\", \"null\"], description: \"字体名,中西文一起设;null 清除\" },\n highlight: { type: [\"string\", \"null\"], description: \"#RRGGBB;null 清除\" },\n link: {\n description: \"超链接:{url}(http:// https:// mailto: 开头)或 {slide};null 清除\",\n anyOf: [\n { type: \"null\" },\n { type: \"object\", properties: { url: { type: \"string\" } }, required: [\"url\"], additionalProperties: false },\n { type: \"object\", properties: { slide: { type: \"number\" } }, required: [\"slide\"], additionalProperties: false },\n ],\n },\n },\n additionalProperties: false,\n },\n align: { type: \"string\", enum: [\"left\", \"center\", \"right\", \"justify\"] },\n },\n required: [\"slide\", \"shape_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"slide_manage_slides\",\n description:\n \"增删、复制、移动页。add:在第 slide 页之后新增(slide=0 插到最前),默认沿用该页版式,可用 layout 指定版式名,新页带空占位符;\" +\n \"delete:删除第 slide 页(连同其备注);duplicate:复制第 slide 页,默认放在它后面,给 to 则新页落在第 to 页(含图表 / SmartArt 的页不能复制);\" +\n \"move:把第 slide 页移到第 to 页。分节会同步调整。\" +\n SLIDE_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n action: { type: \"string\", enum: [\"add\", \"delete\", \"duplicate\", \"move\"] },\n slide: { type: \"number\", description: \"目标页码(add 时表示插在它之后)\" },\n to: { type: \"number\", description: \"move / duplicate 的目标页码\" },\n layout: { type: \"string\", description: \"add 用的版式名(见 slide_read 的 layout 属性)\" },\n },\n required: [\"action\", \"slide\"],\n additionalProperties: false,\n },\n },\n {\n name: \"slide_add_element\",\n description:\n \"在某页新增文本框(type=text)、图片(type=image,path 指向 hub 输出目录里的 png/jpeg/gif)或形状(type=shape,geometry 用 OOXML 预设名如 rect、roundRect、ellipse,fill 默认 #4472C4)。\" +\n \"返回新 shape_id。新元素位于最上层。\" +\n SLIDE_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n slide: { type: \"number\" },\n type: { type: \"string\", enum: [\"text\", \"image\", \"shape\"] },\n x: { type: \"number\", description: \"左上角 x(pt)\" },\n y: { type: \"number\", description: \"左上角 y(pt)\" },\n w: { type: \"number\", description: \"宽(pt)\" },\n h: { type: \"number\", description: \"高(pt)\" },\n text: { type: \"string\", description: \"text / shape 的文字,\\\\n 分段\" },\n path: { type: \"string\", description: \"image 的图片路径(相对 hub 输出目录)\" },\n geometry: { type: \"string\", description: \"shape 的预设几何名,默认 rect\" },\n fill: { type: \"string\", description: \"shape 的填充色 #RRGGBB\" },\n },\n required: [\"slide\", \"type\", \"x\", \"y\", \"w\", \"h\"],\n additionalProperties: false,\n },\n },\n {\n name: \"slide_modify_shapes\",\n description:\n \"批量修改一页上的形状:位置尺寸(x/y/w/h)、旋转(度)、填充(#RRGGBB 或 none)、边框({color, width} 或 none),或 delete:true 删除。\" +\n \"只给 x 时其余分量保持不变(占位符取继承值);表格 / 图表只能移动;带动画的形状(含组内形状带动画的分组)不能删除,可改为移出画面或清空文字。\" +\n \"任何一个 shape_id 或参数无效,整次调用都不生效。\" +\n \"文本形状还可设 wrap(换行)与 autofit(自适应),只对已有文字的文本框有效,还没有文字请先用 slide_replace_text 写入。\" +\n SLIDE_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n slide: { type: \"number\" },\n shapes: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n shape_id: { type: \"number\" },\n x: { type: \"number\" },\n y: { type: \"number\" },\n w: { type: \"number\" },\n h: { type: \"number\" },\n rotation: { type: \"number\", description: \"顺时针角度\" },\n fill: { type: \"string\", description: \"#RRGGBB 或 none\" },\n line: {\n description: \"边框:{color?, width?(pt)} 或 \\\"none\\\"\",\n anyOf: [\n { type: \"string\", enum: [\"none\"] },\n { type: \"object\", properties: { color: { type: \"string\" }, width: { type: \"number\" } }, additionalProperties: false },\n ],\n },\n wrap: { type: \"boolean\", description: \"文本框是否自动换行\" },\n autofit: {\n type: \"string\",\n enum: [\"none\", \"shrink\", \"resize\"],\n description:\n \"none 不自动调整;shrink 溢出时缩小字号;resize 形状随文字变。\" +\n \"重复设成当前已有的模式会保留 PowerPoint 已算好的缩放(如已缩小的框再设 shrink,缩放比例不变)\",\n },\n delete: { type: \"boolean\" },\n },\n required: [\"shape_id\"],\n additionalProperties: false,\n },\n },\n },\n required: [\"slide\", \"shapes\"],\n additionalProperties: false,\n },\n },\n {\n name: \"slide_table_edit\",\n description:\n \"编辑表格(行列从 1 开始):set_cells 批量写单元格文字;insert_rows / insert_cols 在第 index 行(列)之前插 count 行(列),index=总数+1 表示追加,样式复制相邻行(列);\" +\n \"delete_rows / delete_cols 从第 index 行(列)起删 count 行(列)。合并单元格只能改文字,涉及合并区域的增删会报错。\" +\n \"注意:新列沿用相邻列宽,表格会随之变宽,可能超出页面(本期不能调列宽),插列前先看 slide_read 里表格的 x、w 与页面宽度。\" +\n SLIDE_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n slide: { type: \"number\" },\n shape_id: { type: \"number\", description: \"表格的 shape_id\" },\n action: { type: \"string\", enum: [\"set_cells\", \"insert_rows\", \"delete_rows\", \"insert_cols\", \"delete_cols\"] },\n cells: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: { row: { type: \"number\" }, col: { type: \"number\" }, text: { type: \"string\" } },\n required: [\"row\", \"col\", \"text\"],\n additionalProperties: false,\n },\n description: \"set_cells 用\",\n },\n index: { type: \"number\", description: \"增删行列的位置\" },\n count: { type: \"number\", description: \"增删几行(列),默认 1\" },\n },\n required: [\"slide\", \"shape_id\", \"action\"],\n additionalProperties: false,\n },\n },\n {\n name: \"slide_set_notes\",\n description: \"写某页的演讲者备注(整体替换,\\\\n 分段);该页还没有备注时自动新建。\" + SLIDE_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: { slide: { type: \"number\" }, text: { type: \"string\" } },\n required: [\"slide\", \"text\"],\n additionalProperties: false,\n },\n },\n {\n name: \"slide_undo\",\n description: \"撤销最近一次 AI 编辑(只撤 slide_* 写工具造成的修改),返回被撤销的是哪一步。可连续调用。\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"slide_import_pptx\",\n description: \"用 hub 输出目录里的一份 .pptx 替换当前打开的演示文稿(撤销记录会清空)。只给路径,文件内容由 hub 读取。\",\n inputSchema: {\n type: \"object\",\n properties: { path: { type: \"string\", description: \"相对 hub 输出目录的 .pptx 路径\" } },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"slide_export_pptx\",\n description: \"把当前演示文稿导出成 .pptx 存到 hub 输出目录,返回保存路径。未改动的部分与原文件逐字节一致。\",\n inputSchema: {\n type: \"object\",\n properties: { filename: { type: \"string\", description: \"文件名,如 `汇报.pptx`。省略则用 演示文稿.pptx。不要带目录\" } },\n additionalProperties: false,\n },\n },\n]\n\nexport const SLIDE_TOOL_NAMES: readonly string[] = SLIDE_TOOLS.map((t) => t.name)\n\n/** 单个 slide 工具的定义,找不到返回 undefined。 */\nexport function getSlideTool(name: string): DocTool | undefined {\n return SLIDE_TOOLS.find((t) => t.name === name)\n}\n\n/** 全量工具面:宿主同时挂了 DocRuntime 和 SheetRuntime 时用它注册。 */\nexport const ALL_TOOLS: readonly DocTool[] = [...DOC_TOOLS, ...SHEET_TOOLS, ...SLIDE_TOOLS]\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { AttachBridgeOptions, BridgeStatus, BridgeTarget, attachBridge, composeRuntimes } from './bridge.js';
|
|
2
|
-
export { ALL_TOOLS, DOC_TOOLS, DOC_TOOL_NAMES, DocTool, DocToolSchema, SHEET_TOOLS, SHEET_TOOL_NAMES, getDocTool, getSheetTool } from './tools.js';
|
|
2
|
+
export { ALL_TOOLS, DOC_TOOLS, DOC_TOOL_NAMES, DocTool, DocToolSchema, SHEET_TOOLS, SHEET_TOOL_NAMES, SLIDE_TOOLS, SLIDE_TOOL_NAMES, getDocTool, getSheetTool, getSlideTool } from './tools.js';
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { ALL_TOOLS, DOC_TOOLS, DOC_TOOL_NAMES, SHEET_TOOLS, SHEET_TOOL_NAMES, getDocTool, getSheetTool } from './chunk-
|
|
1
|
+
export { ALL_TOOLS, DOC_TOOLS, DOC_TOOL_NAMES, SHEET_TOOLS, SHEET_TOOL_NAMES, SLIDE_TOOLS, SLIDE_TOOL_NAMES, getDocTool, getSheetTool, getSlideTool } from './chunk-DBNN3NAP.js';
|
|
2
2
|
export { attachBridge, composeRuntimes } from './chunk-AHF24VXT.js';
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/tools.d.ts
CHANGED
|
@@ -17,7 +17,11 @@ declare const SHEET_TOOLS: readonly DocTool[];
|
|
|
17
17
|
declare const SHEET_TOOL_NAMES: readonly string[];
|
|
18
18
|
/** 单个 sheet 工具的定义,找不到返回 undefined。 */
|
|
19
19
|
declare function getSheetTool(name: string): DocTool | undefined;
|
|
20
|
+
declare const SLIDE_TOOLS: readonly DocTool[];
|
|
21
|
+
declare const SLIDE_TOOL_NAMES: readonly string[];
|
|
22
|
+
/** 单个 slide 工具的定义,找不到返回 undefined。 */
|
|
23
|
+
declare function getSlideTool(name: string): DocTool | undefined;
|
|
20
24
|
/** 全量工具面:宿主同时挂了 DocRuntime 和 SheetRuntime 时用它注册。 */
|
|
21
25
|
declare const ALL_TOOLS: readonly DocTool[];
|
|
22
26
|
|
|
23
|
-
export { ALL_TOOLS, DOC_TOOLS, DOC_TOOL_NAMES, type DocTool, type DocToolSchema, SHEET_TOOLS, SHEET_TOOL_NAMES, getDocTool, getSheetTool };
|
|
27
|
+
export { ALL_TOOLS, DOC_TOOLS, DOC_TOOL_NAMES, type DocTool, type DocToolSchema, SHEET_TOOLS, SHEET_TOOL_NAMES, SLIDE_TOOLS, SLIDE_TOOL_NAMES, getDocTool, getSheetTool, getSlideTool };
|
package/dist/tools.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { ALL_TOOLS, DOC_TOOLS, DOC_TOOL_NAMES, SHEET_TOOLS, SHEET_TOOL_NAMES, getDocTool, getSheetTool } from './chunk-
|
|
1
|
+
export { ALL_TOOLS, DOC_TOOLS, DOC_TOOL_NAMES, SHEET_TOOLS, SHEET_TOOL_NAMES, SLIDE_TOOLS, SLIDE_TOOL_NAMES, getDocTool, getSheetTool, getSlideTool } from './chunk-DBNN3NAP.js';
|
|
2
2
|
//# sourceMappingURL=tools.js.map
|
|
3
3
|
//# sourceMappingURL=tools.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@4399ywkf/editor-mcp",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "把 @4399ywkf/editor 的结构化编辑面接出去:工具定义(transport 无关)+ 浏览器桥 + hub + stdio MCP server",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
33
33
|
"ws": "^8.21.3",
|
|
34
|
-
"@4399ywkf/editor": "^0.
|
|
34
|
+
"@4399ywkf/editor": "^0.10.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "^22.10.0",
|
package/dist/chunk-V3M4D5XE.js
DELETED
|
@@ -1,318 +0,0 @@
|
|
|
1
|
-
import { NODE_TAG, READONLY_TAGS, MARK_TAG, FORMATTABLE } from '@4399ywkf/editor/doc-runtime';
|
|
2
|
-
|
|
3
|
-
// src/tools.ts
|
|
4
|
-
var ADDRESSING_NOTE = "定位一律用 node id(读工具返回的 id 属性),逐字复制。注意:与 Google Docs / 腾讯文档那类 API 不同,本工具面的定位在执行的那一瞬间才解析,所以你不需要从文档尾部往前处理,也不需要每改一处就重新读一遍。";
|
|
5
|
-
var BLOCK_TAGS = [...new Set(Object.values(NODE_TAG))].filter((t) => !READONLY_TAGS.has(t)).sort().join(" ");
|
|
6
|
-
var INLINE_TAGS = Object.values(MARK_TAG).join(" ");
|
|
7
|
-
var DOC_TOOLS = [
|
|
8
|
-
{
|
|
9
|
-
name: "doc_read",
|
|
10
|
-
description: "读取整篇文档,返回 LiteXML(每个块带稳定 id)。要编辑之前必须先调它拿 id。" + ADDRESSING_NOTE,
|
|
11
|
-
inputSchema: {
|
|
12
|
-
type: "object",
|
|
13
|
-
properties: {
|
|
14
|
-
format: {
|
|
15
|
-
type: "string",
|
|
16
|
-
enum: ["xml", "json", "both"],
|
|
17
|
-
description: "默认 xml。json 是 ProseMirror 原生结构(无损但费 token,约 1.5-2.8 倍),只在你怀疑 LiteXML 丢了信息时才用。"
|
|
18
|
-
}
|
|
19
|
-
},
|
|
20
|
-
additionalProperties: false
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
name: "doc_schema",
|
|
25
|
-
description: "返回本编辑器支持的全部节点类型 / 标记类型 / LiteXML 标签映射 / 哪些类型带稳定 id。不确定某个结构能不能写、该用什么标签时先查它。这份数据是从运行时 schema 反射出来的,永远不会和实现漂移。",
|
|
26
|
-
inputSchema: { type: "object", properties: {}, additionalProperties: false }
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
name: "doc_find",
|
|
30
|
-
description: "全文检索,返回可直接回填给写工具的地址:{nodeId, nodeType, contextBefore, match, contextAfter}。",
|
|
31
|
-
inputSchema: {
|
|
32
|
-
type: "object",
|
|
33
|
-
properties: {
|
|
34
|
-
query: { type: "string", description: "要查找的文本(字面量,不是正则)" },
|
|
35
|
-
limit: { type: "number", description: "最多返回几条,默认 20" }
|
|
36
|
-
},
|
|
37
|
-
required: ["query"],
|
|
38
|
-
additionalProperties: false
|
|
39
|
-
}
|
|
40
|
-
},
|
|
41
|
-
{
|
|
42
|
-
name: "doc_get_selection",
|
|
43
|
-
description: "读取用户此刻在编辑器里选中了什么。返回 selection:null 时表示本轮无选区,不得沿用历史选区。",
|
|
44
|
-
inputSchema: { type: "object", properties: {}, additionalProperties: false }
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
name: "doc_replace_text",
|
|
48
|
-
description: "块内文本替换,最推荐的细粒度改法。只改命中的那一段,块内其余的格式、链接、mention 都会保住。可用 nodeIds 限定只在某些块里替换。" + ADDRESSING_NOTE,
|
|
49
|
-
inputSchema: {
|
|
50
|
-
type: "object",
|
|
51
|
-
properties: {
|
|
52
|
-
searchText: { type: "string" },
|
|
53
|
-
newText: { type: "string" },
|
|
54
|
-
nodeIds: {
|
|
55
|
-
type: "array",
|
|
56
|
-
items: { type: "string" },
|
|
57
|
-
description: "限定生效范围;省略则全文"
|
|
58
|
-
},
|
|
59
|
-
replaceAll: {
|
|
60
|
-
type: "boolean",
|
|
61
|
-
description: "默认 false,只替换文档里第一处"
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
required: ["searchText", "newText"],
|
|
65
|
-
additionalProperties: false
|
|
66
|
-
}
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
name: "doc_format_text",
|
|
70
|
-
description: "给某个块里的一段文字加/去格式(加粗、斜体、下划线、删除线、行内代码、上下标)。**要改格式请优先用它,不要用 doc_modify_nodes 整块重写** —— 整块重写要求你重述整块内容,你没看见的属性和内联节点会在重述中丢失。\n先用 doc_read / doc_find 拿到块的 id 和它的文本,再指定要施加格式的那段文字。",
|
|
71
|
-
inputSchema: {
|
|
72
|
-
type: "object",
|
|
73
|
-
properties: {
|
|
74
|
-
nodeId: { type: "string", description: "目标块的 id" },
|
|
75
|
-
searchText: { type: "string", description: "块内要施加格式的那段文字(精确匹配)" },
|
|
76
|
-
marks: {
|
|
77
|
-
type: "array",
|
|
78
|
-
items: { type: "string", enum: [...FORMATTABLE] },
|
|
79
|
-
description: "要施加的标记,可多个"
|
|
80
|
-
},
|
|
81
|
-
remove: { type: "boolean", description: "true 则移除这些标记而不是施加,默认 false" },
|
|
82
|
-
occurrence: { type: "number", description: "块内第几处匹配,从 1 开始,默认 1" }
|
|
83
|
-
},
|
|
84
|
-
required: ["nodeId", "searchText", "marks"],
|
|
85
|
-
additionalProperties: false
|
|
86
|
-
}
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
name: "doc_modify_nodes",
|
|
90
|
-
description: `结构化编辑:一次提交多个 insert / remove / modify 操作。批量写入优先用它,不要拆成很多次单点调用。
|
|
91
|
-
LiteXML 块标签:${BLOCK_TAGS} h1-h9;未知节点用 <node type="x"/>。
|
|
92
|
-
标题自动编号:<h2 seq="auto"> 按位置自动编号,seq="3" 表示从 3 开始;编号由编辑器算,别把「1.2」写进标题文字。
|
|
93
|
-
文件:<file src="…" name="a.pdf" viewType="card|preview"/>,preview 是在文档里直接预览;文字里的文件用 <node type="fileInline" src="…" name="…"/>。
|
|
94
|
-
网页卡片:<bookmark url="https://…"/>,标题、摘要、封面由编辑器抓取,不用写。
|
|
95
|
-
按钮(行内):<node type="inlineButton" text="去报名" action="OpenLink" href="https://…" color="light-blue"/>,color 取 light-/deep- 加 red|origin|green|wathet|blue|carmine|purple|neutral。
|
|
96
|
-
日期提醒(行内):<node type="reminder" expireTime="毫秒时间戳" isWholeDay="true|false" shouldNotify="true|false" notifyTime="毫秒时间戳"/>,全天的 expireTime 取当天 23:59:59;显示文字(今天 / 明天 / 本周X…)由编辑器算。
|
|
97
|
-
会议议程:<agenda><agenda-item duration="1200"><agenda-title>开场</agenda-title><agenda-content><p>…</p></agenda-content></agenda-item></agenda>,duration 单位秒(0 = 不限时),每条议程必须是「标题 + 内容」两段。
|
|
98
|
-
投票:<node type="poll" title="…" pollType="single|multiple" options='[{"id":"a","text":"…"}]'/>,由用户在文档里发布,不要写 published。
|
|
99
|
-
文本绘图(Mermaid):<mermaid>flowchart TD
|
|
100
|
-
A --> B</mermaid>,代码原样写在标签里(会渲染成图);\`\`\`mermaid 代码块也会自动变成它。
|
|
101
|
-
流程图:<diagram data='{"nodes":[{"id":"n1","shape":"terminator|process|decision|data","label":"开始","x":0,"y":0}],"edges":[{"id":"e1","source":"n1","target":"n2","label":"是"}]}'/>,坐标单位 px,纵向排布时 y 每层约 110。
|
|
102
|
-
内联:${INLINE_TAGS} a[href] mark[color] color[v] br。
|
|
103
|
-
例:<code lang="ts">…</code>、<img src="…"/>、<tasks><task checked="true">…</task></tasks>。
|
|
104
|
-
modify 的 litexml 必须带上要改的那个块的 id 属性。你没写进 XML 的属性会以原节点为底保留下来(不会被抹掉),所以不必重述你没看见的状态。` + ADDRESSING_NOTE,
|
|
105
|
-
inputSchema: {
|
|
106
|
-
type: "object",
|
|
107
|
-
properties: {
|
|
108
|
-
operations: {
|
|
109
|
-
type: "array",
|
|
110
|
-
items: {
|
|
111
|
-
type: "object",
|
|
112
|
-
properties: {
|
|
113
|
-
action: { type: "string", enum: ["insert", "remove", "modify"] },
|
|
114
|
-
afterId: { type: "string", description: "insert:插到这个块之后" },
|
|
115
|
-
beforeId: { type: "string", description: "insert:插到这个块之前" },
|
|
116
|
-
id: { type: "string", description: "remove:要删除的块 id" },
|
|
117
|
-
litexml: {
|
|
118
|
-
type: "string",
|
|
119
|
-
description: "insert/modify 的内容。modify 时必须带 id 属性"
|
|
120
|
-
}
|
|
121
|
-
},
|
|
122
|
-
required: ["action"]
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
},
|
|
126
|
-
required: ["operations"],
|
|
127
|
-
additionalProperties: false
|
|
128
|
-
}
|
|
129
|
-
},
|
|
130
|
-
{
|
|
131
|
-
name: "doc_table_edit",
|
|
132
|
-
description: "表格的**结构性**改动(增删行列、合并拆分、切表头)和批量写值。用 (tableId, row, col) 这种结构坐标定位,row/col 都是 0-based,表头是第 0 行。\n注意:单元格里的段落是有 id 的,所以「只改某个格子的文字」直接用 doc_replace_text / doc_format_text 打那个段落的 id 通常更简单。",
|
|
133
|
-
inputSchema: {
|
|
134
|
-
type: "object",
|
|
135
|
-
properties: {
|
|
136
|
-
tableId: { type: "string" },
|
|
137
|
-
action: {
|
|
138
|
-
type: "string",
|
|
139
|
-
enum: [
|
|
140
|
-
"set_cells",
|
|
141
|
-
"insert_row_after",
|
|
142
|
-
"insert_row_before",
|
|
143
|
-
"insert_col_after",
|
|
144
|
-
"insert_col_before",
|
|
145
|
-
"delete_row",
|
|
146
|
-
"delete_col",
|
|
147
|
-
"toggle_header_row",
|
|
148
|
-
"merge_cells",
|
|
149
|
-
"split_cell"
|
|
150
|
-
]
|
|
151
|
-
},
|
|
152
|
-
row: {
|
|
153
|
-
type: "number",
|
|
154
|
-
description: "0-based 行号(表头是第 0 行)。除 set_cells 外**必填**,作为锚点单元格"
|
|
155
|
-
},
|
|
156
|
-
col: { type: "number", description: "0-based 列号。除 set_cells 外**必填**" },
|
|
157
|
-
values: {
|
|
158
|
-
type: "array",
|
|
159
|
-
description: "set_cells 用:[{row, col, text}]",
|
|
160
|
-
items: {
|
|
161
|
-
type: "object",
|
|
162
|
-
properties: {
|
|
163
|
-
row: { type: "number" },
|
|
164
|
-
col: { type: "number" },
|
|
165
|
-
text: { type: "string" }
|
|
166
|
-
},
|
|
167
|
-
required: ["row", "col", "text"]
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
},
|
|
171
|
-
required: ["tableId", "action"],
|
|
172
|
-
additionalProperties: false
|
|
173
|
-
}
|
|
174
|
-
},
|
|
175
|
-
/* ---------------------------- 导入 / 导出 ---------------------------- *
|
|
176
|
-
* 这两个工具的返回值和参数里**不出现文件内容**。docx 是二进制,一份带图的
|
|
177
|
-
* 动辄几 MB,base64 进上下文会直接把窗口撑爆。所以约定:模型只说路径,
|
|
178
|
-
* 字节在 hub ↔ 浏览器之间走,不经过模型。
|
|
179
|
-
* ------------------------------------------------------------------ */
|
|
180
|
-
{
|
|
181
|
-
name: "doc_export_docx",
|
|
182
|
-
description: "把当前文档导出成 .docx 落到磁盘,返回文件路径与导出统计。文件写在 hub 的输出目录下(启动时 --out-dir 指定,默认 hub 的工作目录),只接受文件名、不接受路径 —— 想放别处请让用户改 hub 的 --out-dir。\n会一并写回导入时保留的页眉页脚与页面设置(前提是这篇文档是本次会话里用 doc_import_docx 或界面导入进来的)。返回的 warnings 是**导出时丢了什么**,非空就如实转述给用户,别当成功报。",
|
|
183
|
-
inputSchema: {
|
|
184
|
-
type: "object",
|
|
185
|
-
properties: {
|
|
186
|
-
filename: {
|
|
187
|
-
type: "string",
|
|
188
|
-
description: "文件名,如 `报告.docx`。省略则用 document.docx。不要带目录"
|
|
189
|
-
}
|
|
190
|
-
},
|
|
191
|
-
additionalProperties: false
|
|
192
|
-
}
|
|
193
|
-
},
|
|
194
|
-
{
|
|
195
|
-
name: "doc_import_docx",
|
|
196
|
-
description: "读一份 .docx 灌进编辑器,**整篇替换**当前内容(不是追加,也不可撤销 —— 文档里已有内容时先跟用户确认)。path 相对 hub 的输出目录解析。\n返回 recovered(各类样式各救回多少项)和 warnings。导入完要接着编辑的话,先调 doc_read 拿新的 id —— 旧 id 全部失效。",
|
|
197
|
-
inputSchema: {
|
|
198
|
-
type: "object",
|
|
199
|
-
properties: {
|
|
200
|
-
path: {
|
|
201
|
-
type: "string",
|
|
202
|
-
description: "docx 文件名或相对 hub 输出目录的路径"
|
|
203
|
-
}
|
|
204
|
-
},
|
|
205
|
-
required: ["path"],
|
|
206
|
-
additionalProperties: false
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
];
|
|
210
|
-
var DOC_TOOL_NAMES = DOC_TOOLS.map((t) => t.name);
|
|
211
|
-
function getDocTool(name) {
|
|
212
|
-
return DOC_TOOLS.find((t) => t.name === name);
|
|
213
|
-
}
|
|
214
|
-
var SHEET_ADDRESSING_NOTE = "定位一律用 A1 引用(如 B2、A1:D20),行列都从 A/1 开始数。写之前先用 sheet_read 看清目标区域现状 —— 盲写会覆盖你没看见的数据。";
|
|
215
|
-
var SHEET_TOOLS = [
|
|
216
|
-
{
|
|
217
|
-
name: "sheet_read",
|
|
218
|
-
description: '读取工作簿概览(每张表的名字和已用范围)+ 指定表的单元格内容(CSV 文本)与公式清单。要写之前必须先调它。区域超过 300×100 会截断并提示,用 range 分段读。日期格读出来是 Excel 序列号;返回里带 dateSystem: "date1904" 时序列号从 1904-01-01 起算。' + SHEET_ADDRESSING_NOTE,
|
|
219
|
-
inputSchema: {
|
|
220
|
-
type: "object",
|
|
221
|
-
properties: {
|
|
222
|
-
sheet: { type: "string", description: "工作表 id 或表名,省略用活动表" },
|
|
223
|
-
range: { type: "string", description: 'A1 区域(如 "B2:F40"),省略读整个已用范围' },
|
|
224
|
-
includeFormulas: { type: "boolean", description: "是否附带公式清单,默认 true" }
|
|
225
|
-
},
|
|
226
|
-
additionalProperties: false
|
|
227
|
-
}
|
|
228
|
-
},
|
|
229
|
-
{
|
|
230
|
-
name: "sheet_find",
|
|
231
|
-
description: "全簿检索(单元格的值和公式都搜,大小写不敏感),返回 {sheet, ref, value, formula?},ref 可直接回填给写工具。",
|
|
232
|
-
inputSchema: {
|
|
233
|
-
type: "object",
|
|
234
|
-
properties: {
|
|
235
|
-
query: { type: "string", description: "要查找的文本(字面量,不是正则)" },
|
|
236
|
-
limit: { type: "number", description: "最多返回几条,默认 20" }
|
|
237
|
-
},
|
|
238
|
-
required: ["query"],
|
|
239
|
-
additionalProperties: false
|
|
240
|
-
}
|
|
241
|
-
},
|
|
242
|
-
{
|
|
243
|
-
name: "sheet_set_values",
|
|
244
|
-
description: '从 start 起写入一块二维值,批量写入首选(不要拆成很多次单格调用)。以 "=" 开头的字符串按公式写入(如 "=SUM(A1:A9)"),null 清空该格,各行必须等长 —— 整块区域会被覆盖,不想动的格子请缩小区域分多次写。' + SHEET_ADDRESSING_NOTE,
|
|
245
|
-
inputSchema: {
|
|
246
|
-
type: "object",
|
|
247
|
-
properties: {
|
|
248
|
-
sheet: { type: "string", description: "工作表 id 或表名,省略用活动表" },
|
|
249
|
-
start: { type: "string", description: '写入区域左上角,单格 A1 形式(如 "B2")' },
|
|
250
|
-
values: {
|
|
251
|
-
type: "array",
|
|
252
|
-
description: "二维数组,外层是行。元素:字符串/数字/布尔/null",
|
|
253
|
-
items: {
|
|
254
|
-
type: "array",
|
|
255
|
-
items: { type: ["string", "number", "boolean", "null"] }
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
},
|
|
259
|
-
required: ["start", "values"],
|
|
260
|
-
additionalProperties: false
|
|
261
|
-
}
|
|
262
|
-
},
|
|
263
|
-
{
|
|
264
|
-
name: "sheet_edit_rows_cols",
|
|
265
|
-
description: "插入 / 删除整行整列。index 是 0-based:insert 在该位置**之前**插入,delete 从该位置开始删 count 个。删除不可撤销地移除数据 —— 删之前先 sheet_read 确认内容。",
|
|
266
|
-
inputSchema: {
|
|
267
|
-
type: "object",
|
|
268
|
-
properties: {
|
|
269
|
-
sheet: { type: "string", description: "工作表 id 或表名,省略用活动表" },
|
|
270
|
-
action: {
|
|
271
|
-
type: "string",
|
|
272
|
-
enum: ["insert_rows", "delete_rows", "insert_cols", "delete_cols"]
|
|
273
|
-
},
|
|
274
|
-
index: { type: "number", description: "0-based 行号/列号" },
|
|
275
|
-
count: { type: "number", description: "行数/列数,默认 1" }
|
|
276
|
-
},
|
|
277
|
-
required: ["action", "index"],
|
|
278
|
-
additionalProperties: false
|
|
279
|
-
}
|
|
280
|
-
},
|
|
281
|
-
{
|
|
282
|
-
name: "sheet_manage_sheets",
|
|
283
|
-
description: "工作表管理:add(新建)/ rename(重命名)/ delete(删除,**整表数据一并消失**,必须显式指定 sheet,删之前先跟用户确认)/ activate(切活动表)。返回最新的表清单。",
|
|
284
|
-
inputSchema: {
|
|
285
|
-
type: "object",
|
|
286
|
-
properties: {
|
|
287
|
-
action: { type: "string", enum: ["add", "rename", "delete", "activate"] },
|
|
288
|
-
sheet: { type: "string", description: "rename/delete/activate 的目标(id 或表名)" },
|
|
289
|
-
name: { type: "string", description: "add 的表名 / rename 的新名" }
|
|
290
|
-
},
|
|
291
|
-
required: ["action"],
|
|
292
|
-
additionalProperties: false
|
|
293
|
-
}
|
|
294
|
-
},
|
|
295
|
-
{
|
|
296
|
-
name: "sheet_export_xlsx",
|
|
297
|
-
description: "把当前工作簿导出成 .xlsx 落到磁盘,返回文件路径与导出统计。文件写在 hub 的输出目录下,只接受文件名、不接受路径。返回的 warnings 是**导出时丢了什么**(图片、条件格式等插件数据),非空就如实转述给用户,别当成功报。",
|
|
298
|
-
inputSchema: {
|
|
299
|
-
type: "object",
|
|
300
|
-
properties: {
|
|
301
|
-
filename: {
|
|
302
|
-
type: "string",
|
|
303
|
-
description: "文件名,如 `报表.xlsx`。省略则用 工作簿.xlsx。不要带目录"
|
|
304
|
-
}
|
|
305
|
-
},
|
|
306
|
-
additionalProperties: false
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
];
|
|
310
|
-
var SHEET_TOOL_NAMES = SHEET_TOOLS.map((t) => t.name);
|
|
311
|
-
function getSheetTool(name) {
|
|
312
|
-
return SHEET_TOOLS.find((t) => t.name === name);
|
|
313
|
-
}
|
|
314
|
-
var ALL_TOOLS = [...DOC_TOOLS, ...SHEET_TOOLS];
|
|
315
|
-
|
|
316
|
-
export { ALL_TOOLS, DOC_TOOLS, DOC_TOOL_NAMES, SHEET_TOOLS, SHEET_TOOL_NAMES, getDocTool, getSheetTool };
|
|
317
|
-
//# sourceMappingURL=chunk-V3M4D5XE.js.map
|
|
318
|
-
//# sourceMappingURL=chunk-V3M4D5XE.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tools.ts"],"names":[],"mappings":"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","file":"chunk-V3M4D5XE.js","sourcesContent":["/**\n * 工具面:doc 10 个 + sheet 6 个工具的 name / description / JSON Schema。\n *\n * **这里没有任何传输**。是 MCP、是 HTTP、还是像 jizhi_ai 那样 agent loop 直接调\n * executor,都由上层决定 —— 想自己接的只 import 这个模块就够了:\n *\n * ```ts\n * import { DOC_TOOLS, SHEET_TOOLS, ALL_TOOLS } from \"@4399ywkf/editor-mcp/tools\"\n * ```\n *\n * 为什么这么少:参照系是 BlockNote AI 的 3 个工具,和把 tiptap 每个 command\n * 都包成工具的 `tiptap-apcore`(79 个,GitHub 1 star)。工具面大了模型反而选不准。\n * `doc_stats` 那类对账工具刻意不在这里 —— 它是给人调试用的,`DocRuntime.call`\n * 支持,但不该占模型的注意力。\n *\n * 8 个读写工具 + 2 个导入导出。后两个之所以够格占位置:没有它们,模型能把文档\n * 改好却交付不出去 —— 「改完了,然后呢」是个死胡同。\n */\nimport { FORMATTABLE, MARK_TAG, NODE_TAG, READONLY_TAGS } from \"@4399ywkf/editor/doc-runtime\"\n\nexport interface DocToolSchema {\n type: \"object\"\n properties: Record<string, unknown>\n required?: string[]\n additionalProperties?: boolean\n}\n\nexport interface DocTool {\n name: string\n description: string\n inputSchema: DocToolSchema\n}\n\n/**\n * 定位纪律。写进 description 而不是 README —— 和实现同生共死,不会漂。\n *\n * 后半句是必需的:模型带着 Google Docs / 腾讯文档那套 API 的条件反射\n * (改一处就失效一次索引),不明说它会自作聪明地倒序处理、反复重读。\n */\nconst ADDRESSING_NOTE =\n \"定位一律用 node id(读工具返回的 id 属性),逐字复制。\" +\n \"注意:与 Google Docs / 腾讯文档那类 API 不同,本工具面的定位在执行的那一瞬间才解析,\" +\n \"所以你不需要从文档尾部往前处理,也不需要每改一处就重新读一遍。\"\n\n/**\n * 可用标签清单从 doc-runtime 的标签表**生成**,不是手抄的。\n * 编辑器加一个节点类型,这段 description 自动跟着变。\n */\nconst BLOCK_TAGS = [...new Set(Object.values(NODE_TAG))]\n .filter((t) => !READONLY_TAGS.has(t))\n .sort()\n .join(\" \")\nconst INLINE_TAGS = Object.values(MARK_TAG).join(\" \")\n\nexport const DOC_TOOLS: readonly DocTool[] = [\n {\n name: \"doc_read\",\n description:\n \"读取整篇文档,返回 LiteXML(每个块带稳定 id)。要编辑之前必须先调它拿 id。\" +\n ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n format: {\n type: \"string\",\n enum: [\"xml\", \"json\", \"both\"],\n description:\n \"默认 xml。json 是 ProseMirror 原生结构(无损但费 token,约 1.5-2.8 倍),\" +\n \"只在你怀疑 LiteXML 丢了信息时才用。\",\n },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"doc_schema\",\n description:\n \"返回本编辑器支持的全部节点类型 / 标记类型 / LiteXML 标签映射 / 哪些类型带稳定 id。\" +\n \"不确定某个结构能不能写、该用什么标签时先查它。这份数据是从运行时 schema 反射出来的,\" +\n \"永远不会和实现漂移。\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"doc_find\",\n description:\n \"全文检索,返回可直接回填给写工具的地址:{nodeId, nodeType, contextBefore, match, contextAfter}。\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"要查找的文本(字面量,不是正则)\" },\n limit: { type: \"number\", description: \"最多返回几条,默认 20\" },\n },\n required: [\"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"doc_get_selection\",\n description:\n \"读取用户此刻在编辑器里选中了什么。返回 selection:null 时表示本轮无选区,不得沿用历史选区。\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"doc_replace_text\",\n description:\n \"块内文本替换,最推荐的细粒度改法。只改命中的那一段,块内其余的格式、链接、\" +\n \"mention 都会保住。可用 nodeIds 限定只在某些块里替换。\" +\n ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n searchText: { type: \"string\" },\n newText: { type: \"string\" },\n nodeIds: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"限定生效范围;省略则全文\",\n },\n replaceAll: {\n type: \"boolean\",\n description: \"默认 false,只替换文档里第一处\",\n },\n },\n required: [\"searchText\", \"newText\"],\n additionalProperties: false,\n },\n },\n {\n name: \"doc_format_text\",\n description:\n \"给某个块里的一段文字加/去格式(加粗、斜体、下划线、删除线、行内代码、上下标)。\" +\n \"**要改格式请优先用它,不要用 doc_modify_nodes 整块重写** —— \" +\n \"整块重写要求你重述整块内容,你没看见的属性和内联节点会在重述中丢失。\\n\" +\n \"先用 doc_read / doc_find 拿到块的 id 和它的文本,再指定要施加格式的那段文字。\",\n inputSchema: {\n type: \"object\",\n properties: {\n nodeId: { type: \"string\", description: \"目标块的 id\" },\n searchText: { type: \"string\", description: \"块内要施加格式的那段文字(精确匹配)\" },\n marks: {\n type: \"array\",\n items: { type: \"string\", enum: [...FORMATTABLE] },\n description: \"要施加的标记,可多个\",\n },\n remove: { type: \"boolean\", description: \"true 则移除这些标记而不是施加,默认 false\" },\n occurrence: { type: \"number\", description: \"块内第几处匹配,从 1 开始,默认 1\" },\n },\n required: [\"nodeId\", \"searchText\", \"marks\"],\n additionalProperties: false,\n },\n },\n {\n name: \"doc_modify_nodes\",\n description:\n \"结构化编辑:一次提交多个 insert / remove / modify 操作。\" +\n \"批量写入优先用它,不要拆成很多次单点调用。\\n\" +\n `LiteXML 块标签:${BLOCK_TAGS} h1-h9;未知节点用 <node type=\"x\"/>。\\n` +\n '标题自动编号:<h2 seq=\"auto\"> 按位置自动编号,seq=\"3\" 表示从 3 开始;编号由编辑器算,别把「1.2」写进标题文字。\\n' +\n '文件:<file src=\"…\" name=\"a.pdf\" viewType=\"card|preview\"/>,preview 是在文档里直接预览;文字里的文件用 <node type=\"fileInline\" src=\"…\" name=\"…\"/>。\\n' +\n '网页卡片:<bookmark url=\"https://…\"/>,标题、摘要、封面由编辑器抓取,不用写。\\n' +\n '按钮(行内):<node type=\"inlineButton\" text=\"去报名\" action=\"OpenLink\" href=\"https://…\" color=\"light-blue\"/>,color 取 light-/deep- 加 red|origin|green|wathet|blue|carmine|purple|neutral。\\n' +\n '日期提醒(行内):<node type=\"reminder\" expireTime=\"毫秒时间戳\" isWholeDay=\"true|false\" shouldNotify=\"true|false\" notifyTime=\"毫秒时间戳\"/>,全天的 expireTime 取当天 23:59:59;显示文字(今天 / 明天 / 本周X…)由编辑器算。\\n' +\n '会议议程:<agenda><agenda-item duration=\"1200\"><agenda-title>开场</agenda-title><agenda-content><p>…</p></agenda-content></agenda-item></agenda>,duration 单位秒(0 = 不限时),每条议程必须是「标题 + 内容」两段。\\n' +\n '投票:<node type=\"poll\" title=\"…\" pollType=\"single|multiple\" options=\\'[{\"id\":\"a\",\"text\":\"…\"}]\\'/>,由用户在文档里发布,不要写 published。\\n' +\n '文本绘图(Mermaid):<mermaid>flowchart TD\\n A --> B</mermaid>,代码原样写在标签里(会渲染成图);```mermaid 代码块也会自动变成它。\\n' +\n '流程图:<diagram data=\\'{\"nodes\":[{\"id\":\"n1\",\"shape\":\"terminator|process|decision|data\",\"label\":\"开始\",\"x\":0,\"y\":0}],\"edges\":[{\"id\":\"e1\",\"source\":\"n1\",\"target\":\"n2\",\"label\":\"是\"}]}\\'/>,坐标单位 px,纵向排布时 y 每层约 110。\\n' +\n `内联:${INLINE_TAGS} a[href] mark[color] color[v] br。\\n` +\n '例:<code lang=\"ts\">…</code>、<img src=\"…\"/>、<tasks><task checked=\"true\">…</task></tasks>。\\n' +\n \"modify 的 litexml 必须带上要改的那个块的 id 属性。\" +\n \"你没写进 XML 的属性会以原节点为底保留下来(不会被抹掉),所以不必重述你没看见的状态。\" +\n ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n operations: {\n type: \"array\",\n items: {\n type: \"object\",\n properties: {\n action: { type: \"string\", enum: [\"insert\", \"remove\", \"modify\"] },\n afterId: { type: \"string\", description: \"insert:插到这个块之后\" },\n beforeId: { type: \"string\", description: \"insert:插到这个块之前\" },\n id: { type: \"string\", description: \"remove:要删除的块 id\" },\n litexml: {\n type: \"string\",\n description: \"insert/modify 的内容。modify 时必须带 id 属性\",\n },\n },\n required: [\"action\"],\n },\n },\n },\n required: [\"operations\"],\n additionalProperties: false,\n },\n },\n {\n name: \"doc_table_edit\",\n description:\n \"表格的**结构性**改动(增删行列、合并拆分、切表头)和批量写值。\" +\n \"用 (tableId, row, col) 这种结构坐标定位,row/col 都是 0-based,表头是第 0 行。\\n\" +\n \"注意:单元格里的段落是有 id 的,所以「只改某个格子的文字」直接用 \" +\n \"doc_replace_text / doc_format_text 打那个段落的 id 通常更简单。\",\n inputSchema: {\n type: \"object\",\n properties: {\n tableId: { type: \"string\" },\n action: {\n type: \"string\",\n enum: [\n \"set_cells\",\n \"insert_row_after\",\n \"insert_row_before\",\n \"insert_col_after\",\n \"insert_col_before\",\n \"delete_row\",\n \"delete_col\",\n \"toggle_header_row\",\n \"merge_cells\",\n \"split_cell\",\n ],\n },\n row: {\n type: \"number\",\n description: \"0-based 行号(表头是第 0 行)。除 set_cells 外**必填**,作为锚点单元格\",\n },\n col: { type: \"number\", description: \"0-based 列号。除 set_cells 外**必填**\" },\n values: {\n type: \"array\",\n description: \"set_cells 用:[{row, col, text}]\",\n items: {\n type: \"object\",\n properties: {\n row: { type: \"number\" },\n col: { type: \"number\" },\n text: { type: \"string\" },\n },\n required: [\"row\", \"col\", \"text\"],\n },\n },\n },\n required: [\"tableId\", \"action\"],\n additionalProperties: false,\n },\n },\n\n /* ---------------------------- 导入 / 导出 ---------------------------- *\n * 这两个工具的返回值和参数里**不出现文件内容**。docx 是二进制,一份带图的\n * 动辄几 MB,base64 进上下文会直接把窗口撑爆。所以约定:模型只说路径,\n * 字节在 hub ↔ 浏览器之间走,不经过模型。\n * ------------------------------------------------------------------ */\n {\n name: \"doc_export_docx\",\n description:\n \"把当前文档导出成 .docx 落到磁盘,返回文件路径与导出统计。\" +\n \"文件写在 hub 的输出目录下(启动时 --out-dir 指定,默认 hub 的工作目录),\" +\n \"只接受文件名、不接受路径 —— 想放别处请让用户改 hub 的 --out-dir。\\n\" +\n \"会一并写回导入时保留的页眉页脚与页面设置(前提是这篇文档是本次会话里用 \" +\n \"doc_import_docx 或界面导入进来的)。返回的 warnings 是**导出时丢了什么**,\" +\n \"非空就如实转述给用户,别当成功报。\",\n inputSchema: {\n type: \"object\",\n properties: {\n filename: {\n type: \"string\",\n description: \"文件名,如 `报告.docx`。省略则用 document.docx。不要带目录\",\n },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"doc_import_docx\",\n description:\n \"读一份 .docx 灌进编辑器,**整篇替换**当前内容(不是追加,也不可撤销 —— \" +\n \"文档里已有内容时先跟用户确认)。path 相对 hub 的输出目录解析。\\n\" +\n \"返回 recovered(各类样式各救回多少项)和 warnings。导入完要接着编辑的话,\" +\n \"先调 doc_read 拿新的 id —— 旧 id 全部失效。\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: {\n type: \"string\",\n description: \"docx 文件名或相对 hub 输出目录的路径\",\n },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n]\n\nexport const DOC_TOOL_NAMES: readonly string[] = DOC_TOOLS.map((t) => t.name)\n\n/** 单个工具的定义,找不到返回 undefined。 */\nexport function getDocTool(name: string): DocTool | undefined {\n return DOC_TOOLS.find((t) => t.name === name)\n}\n\n/* ================================ sheet ================================ */\n\n/**\n * 表格工具面。执行体是 `@4399ywkf/editor/sheet-runtime` 的 `SheetRuntime`,\n * 和 doc 工具面同一套纪律:面刻意小(6 个)、导出不给模型看字节、\n * 丢失/降级如实进 warnings。\n *\n * 定位用 A1 引用而不是 node id —— 表格的坐标系本来就是稳定的,\n * 不需要 doc 那套「读了才有 id」的仪式;但**写之前先 sheet_read 看清现状**\n * 这条纪律不变:盲写会覆盖你没看见的数据。\n */\nconst SHEET_ADDRESSING_NOTE =\n \"定位一律用 A1 引用(如 B2、A1:D20),行列都从 A/1 开始数。\" +\n \"写之前先用 sheet_read 看清目标区域现状 —— 盲写会覆盖你没看见的数据。\"\n\nexport const SHEET_TOOLS: readonly DocTool[] = [\n {\n name: \"sheet_read\",\n description:\n \"读取工作簿概览(每张表的名字和已用范围)+ 指定表的单元格内容(CSV 文本)与公式清单。\" +\n \"要写之前必须先调它。区域超过 300×100 会截断并提示,用 range 分段读。\" +\n '日期格读出来是 Excel 序列号;返回里带 dateSystem: \"date1904\" 时序列号从 1904-01-01 起算。' +\n SHEET_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n sheet: { type: \"string\", description: \"工作表 id 或表名,省略用活动表\" },\n range: { type: \"string\", description: 'A1 区域(如 \"B2:F40\"),省略读整个已用范围' },\n includeFormulas: { type: \"boolean\", description: \"是否附带公式清单,默认 true\" },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_find\",\n description:\n \"全簿检索(单元格的值和公式都搜,大小写不敏感),返回 {sheet, ref, value, formula?},\" +\n \"ref 可直接回填给写工具。\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"要查找的文本(字面量,不是正则)\" },\n limit: { type: \"number\", description: \"最多返回几条,默认 20\" },\n },\n required: [\"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_set_values\",\n description:\n \"从 start 起写入一块二维值,批量写入首选(不要拆成很多次单格调用)。\" +\n '以 \"=\" 开头的字符串按公式写入(如 \"=SUM(A1:A9)\"),null 清空该格,' +\n \"各行必须等长 —— 整块区域会被覆盖,不想动的格子请缩小区域分多次写。\" +\n SHEET_ADDRESSING_NOTE,\n inputSchema: {\n type: \"object\",\n properties: {\n sheet: { type: \"string\", description: \"工作表 id 或表名,省略用活动表\" },\n start: { type: \"string\", description: '写入区域左上角,单格 A1 形式(如 \"B2\")' },\n values: {\n type: \"array\",\n description: \"二维数组,外层是行。元素:字符串/数字/布尔/null\",\n items: {\n type: \"array\",\n items: { type: [\"string\", \"number\", \"boolean\", \"null\"] },\n },\n },\n },\n required: [\"start\", \"values\"],\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_edit_rows_cols\",\n description:\n \"插入 / 删除整行整列。index 是 0-based:insert 在该位置**之前**插入,\" +\n \"delete 从该位置开始删 count 个。删除不可撤销地移除数据 —— 删之前先 sheet_read 确认内容。\",\n inputSchema: {\n type: \"object\",\n properties: {\n sheet: { type: \"string\", description: \"工作表 id 或表名,省略用活动表\" },\n action: {\n type: \"string\",\n enum: [\"insert_rows\", \"delete_rows\", \"insert_cols\", \"delete_cols\"],\n },\n index: { type: \"number\", description: \"0-based 行号/列号\" },\n count: { type: \"number\", description: \"行数/列数,默认 1\" },\n },\n required: [\"action\", \"index\"],\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_manage_sheets\",\n description:\n \"工作表管理:add(新建)/ rename(重命名)/ delete(删除,**整表数据一并消失**,\" +\n \"必须显式指定 sheet,删之前先跟用户确认)/ activate(切活动表)。返回最新的表清单。\",\n inputSchema: {\n type: \"object\",\n properties: {\n action: { type: \"string\", enum: [\"add\", \"rename\", \"delete\", \"activate\"] },\n sheet: { type: \"string\", description: \"rename/delete/activate 的目标(id 或表名)\" },\n name: { type: \"string\", description: \"add 的表名 / rename 的新名\" },\n },\n required: [\"action\"],\n additionalProperties: false,\n },\n },\n {\n name: \"sheet_export_xlsx\",\n description:\n \"把当前工作簿导出成 .xlsx 落到磁盘,返回文件路径与导出统计。\" +\n \"文件写在 hub 的输出目录下,只接受文件名、不接受路径。\" +\n \"返回的 warnings 是**导出时丢了什么**(图片、条件格式等插件数据),\" +\n \"非空就如实转述给用户,别当成功报。\",\n inputSchema: {\n type: \"object\",\n properties: {\n filename: {\n type: \"string\",\n description: \"文件名,如 `报表.xlsx`。省略则用 工作簿.xlsx。不要带目录\",\n },\n },\n additionalProperties: false,\n },\n },\n]\n\nexport const SHEET_TOOL_NAMES: readonly string[] = SHEET_TOOLS.map((t) => t.name)\n\n/** 单个 sheet 工具的定义,找不到返回 undefined。 */\nexport function getSheetTool(name: string): DocTool | undefined {\n return SHEET_TOOLS.find((t) => t.name === name)\n}\n\n/** 全量工具面:宿主同时挂了 DocRuntime 和 SheetRuntime 时用它注册。 */\nexport const ALL_TOOLS: readonly DocTool[] = [...DOC_TOOLS, ...SHEET_TOOLS]\n"]}
|