@usejunior/docx-mcp 0.0.1 → 0.1.2
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/LICENSE +21 -0
- package/README.md +208 -28
- package/dist/.tsbuildinfo +1 -0
- package/dist/cli/commands/compare.d.ts +20 -0
- package/dist/cli/commands/compare.d.ts.map +1 -0
- package/dist/cli/commands/compare.js +54 -0
- package/dist/cli/commands/compare.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +2 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +5 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/index.d.ts +13 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +145 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +8 -0
- package/dist/cli.js.map +1 -0
- package/dist/conformance/harness.d.ts +73 -0
- package/dist/conformance/harness.d.ts.map +1 -0
- package/dist/conformance/harness.js +609 -0
- package/dist/conformance/harness.js.map +1 -0
- package/dist/error_utils.d.ts +3 -0
- package/dist/error_utils.d.ts.map +1 -0
- package/dist/error_utils.js +19 -0
- package/dist/error_utils.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +80 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +112 -0
- package/dist/server.js.map +1 -0
- package/dist/session/manager.d.ts +84 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +155 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/tool_catalog.d.ts +439 -0
- package/dist/tool_catalog.d.ts.map +1 -0
- package/dist/tool_catalog.js +314 -0
- package/dist/tool_catalog.js.map +1 -0
- package/dist/tools/accept_changes.d.ts +7 -0
- package/dist/tools/accept_changes.d.ts.map +1 -0
- package/dist/tools/accept_changes.js +21 -0
- package/dist/tools/accept_changes.js.map +1 -0
- package/dist/tools/add_comment.d.ts +13 -0
- package/dist/tools/add_comment.d.ts.map +1 -0
- package/dist/tools/add_comment.js +77 -0
- package/dist/tools/add_comment.js.map +1 -0
- package/dist/tools/add_footnote.d.ts +10 -0
- package/dist/tools/add_footnote.d.ts.map +1 -0
- package/dist/tools/add_footnote.js +45 -0
- package/dist/tools/add_footnote.js.map +1 -0
- package/dist/tools/apply_plan.d.ts +9 -0
- package/dist/tools/apply_plan.d.ts.map +1 -0
- package/dist/tools/apply_plan.js +346 -0
- package/dist/tools/apply_plan.js.map +1 -0
- package/dist/tools/clear_session.d.ts +9 -0
- package/dist/tools/clear_session.d.ts.map +1 -0
- package/dist/tools/clear_session.js +66 -0
- package/dist/tools/clear_session.js.map +1 -0
- package/dist/tools/compare_documents.d.ts +12 -0
- package/dist/tools/compare_documents.d.ts.map +1 -0
- package/dist/tools/compare_documents.js +121 -0
- package/dist/tools/compare_documents.js.map +1 -0
- package/dist/tools/comparison_defaults.d.ts +9 -0
- package/dist/tools/comparison_defaults.d.ts.map +1 -0
- package/dist/tools/comparison_defaults.js +8 -0
- package/dist/tools/comparison_defaults.js.map +1 -0
- package/dist/tools/delete_comment.d.ts +8 -0
- package/dist/tools/delete_comment.d.ts.map +1 -0
- package/dist/tools/delete_comment.js +28 -0
- package/dist/tools/delete_comment.js.map +1 -0
- package/dist/tools/delete_footnote.d.ts +8 -0
- package/dist/tools/delete_footnote.d.ts.map +1 -0
- package/dist/tools/delete_footnote.js +34 -0
- package/dist/tools/delete_footnote.js.map +1 -0
- package/dist/tools/docx_archive_guard.d.ts +9 -0
- package/dist/tools/docx_archive_guard.d.ts.map +1 -0
- package/dist/tools/docx_archive_guard.js +64 -0
- package/dist/tools/docx_archive_guard.js.map +1 -0
- package/dist/tools/download.d.ts +20 -0
- package/dist/tools/download.d.ts.map +1 -0
- package/dist/tools/download.js +252 -0
- package/dist/tools/download.js.map +1 -0
- package/dist/tools/duplicate_document.d.ts +8 -0
- package/dist/tools/duplicate_document.d.ts.map +1 -0
- package/dist/tools/duplicate_document.js +90 -0
- package/dist/tools/duplicate_document.js.map +1 -0
- package/dist/tools/extract_revisions.d.ts +9 -0
- package/dist/tools/extract_revisions.d.ts.map +1 -0
- package/dist/tools/extract_revisions.js +52 -0
- package/dist/tools/extract_revisions.js.map +1 -0
- package/dist/tools/format_layout.d.ts +35 -0
- package/dist/tools/format_layout.d.ts.map +1 -0
- package/dist/tools/format_layout.js +332 -0
- package/dist/tools/format_layout.js.map +1 -0
- package/dist/tools/get_comments.d.ts +7 -0
- package/dist/tools/get_comments.d.ts.map +1 -0
- package/dist/tools/get_comments.js +32 -0
- package/dist/tools/get_comments.js.map +1 -0
- package/dist/tools/get_footnotes.d.ts +7 -0
- package/dist/tools/get_footnotes.d.ts.map +1 -0
- package/dist/tools/get_footnotes.js +25 -0
- package/dist/tools/get_footnotes.js.map +1 -0
- package/dist/tools/get_session_status.d.ts +7 -0
- package/dist/tools/get_session_status.d.ts.map +1 -0
- package/dist/tools/get_session_status.js +41 -0
- package/dist/tools/get_session_status.js.map +1 -0
- package/dist/tools/grep.d.ts +13 -0
- package/dist/tools/grep.d.ts.map +1 -0
- package/dist/tools/grep.js +129 -0
- package/dist/tools/grep.js.map +1 -0
- package/dist/tools/has_tracked_changes.d.ts +7 -0
- package/dist/tools/has_tracked_changes.d.ts.map +1 -0
- package/dist/tools/has_tracked_changes.js +74 -0
- package/dist/tools/has_tracked_changes.js.map +1 -0
- package/dist/tools/init_plan.d.ts +9 -0
- package/dist/tools/init_plan.d.ts.map +1 -0
- package/dist/tools/init_plan.js +44 -0
- package/dist/tools/init_plan.js.map +1 -0
- package/dist/tools/insert_paragraph.d.ts +12 -0
- package/dist/tools/insert_paragraph.d.ts.map +1 -0
- package/dist/tools/insert_paragraph.js +514 -0
- package/dist/tools/insert_paragraph.js.map +1 -0
- package/dist/tools/merge_plans.d.ts +7 -0
- package/dist/tools/merge_plans.d.ts.map +1 -0
- package/dist/tools/merge_plans.js +408 -0
- package/dist/tools/merge_plans.js.map +1 -0
- package/dist/tools/open_document.d.ts +7 -0
- package/dist/tools/open_document.d.ts.map +1 -0
- package/dist/tools/open_document.js +102 -0
- package/dist/tools/open_document.js.map +1 -0
- package/dist/tools/path_policy.d.ts +13 -0
- package/dist/tools/path_policy.d.ts.map +1 -0
- package/dist/tools/path_policy.js +109 -0
- package/dist/tools/path_policy.js.map +1 -0
- package/dist/tools/preview.d.ts +5 -0
- package/dist/tools/preview.d.ts.map +1 -0
- package/dist/tools/preview.js +11 -0
- package/dist/tools/preview.js.map +1 -0
- package/dist/tools/read_file.d.ts +12 -0
- package/dist/tools/read_file.d.ts.map +1 -0
- package/dist/tools/read_file.js +113 -0
- package/dist/tools/read_file.js.map +1 -0
- package/dist/tools/replace_text.d.ts +13 -0
- package/dist/tools/replace_text.d.ts.map +1 -0
- package/dist/tools/replace_text.js +628 -0
- package/dist/tools/replace_text.js.map +1 -0
- package/dist/tools/session_resolution.d.ts +29 -0
- package/dist/tools/session_resolution.d.ts.map +1 -0
- package/dist/tools/session_resolution.js +158 -0
- package/dist/tools/session_resolution.js.map +1 -0
- package/dist/tools/types.d.ts +15 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +7 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/update_footnote.d.ts +9 -0
- package/dist/tools/update_footnote.d.ts.map +1 -0
- package/dist/tools/update_footnote.js +39 -0
- package/dist/tools/update_footnote.js.map +1 -0
- package/package.json +74 -6
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import { errorMessage } from "../error_utils.js";
|
|
3
|
+
import os from 'node:os';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { err } from './types.js';
|
|
6
|
+
function expandPath(inputPath) {
|
|
7
|
+
return inputPath.startsWith('~') ? path.join(process.env.HOME || '', inputPath.slice(1)) : inputPath;
|
|
8
|
+
}
|
|
9
|
+
function normalizePath(inputPath) {
|
|
10
|
+
return path.resolve(expandPath(inputPath));
|
|
11
|
+
}
|
|
12
|
+
async function canonicalizePath(inputPath) {
|
|
13
|
+
const normalized = normalizePath(inputPath);
|
|
14
|
+
try {
|
|
15
|
+
return await fs.realpath(normalized);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return normalized;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async function resolveAllowedRoots() {
|
|
22
|
+
const configured = process.env.SAFE_DOCX_ALLOWED_ROOTS;
|
|
23
|
+
const fromEnv = configured
|
|
24
|
+
? configured
|
|
25
|
+
.split(path.delimiter)
|
|
26
|
+
.map((entry) => entry.trim())
|
|
27
|
+
.filter((entry) => entry.length > 0)
|
|
28
|
+
: [];
|
|
29
|
+
const defaults = fromEnv.length > 0
|
|
30
|
+
? fromEnv
|
|
31
|
+
: [process.env.HOME ?? '', os.tmpdir()].filter((entry) => entry.length > 0);
|
|
32
|
+
const out = [];
|
|
33
|
+
const seen = new Set();
|
|
34
|
+
for (const rawRoot of defaults) {
|
|
35
|
+
const canonical = await canonicalizePath(rawRoot);
|
|
36
|
+
if (!seen.has(canonical)) {
|
|
37
|
+
seen.add(canonical);
|
|
38
|
+
out.push(canonical);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
function isWithinRoot(targetPath, rootPath) {
|
|
44
|
+
const rel = path.relative(rootPath, targetPath);
|
|
45
|
+
return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
|
|
46
|
+
}
|
|
47
|
+
function policyError(type, inputPath, resolvedPath, allowedRoots) {
|
|
48
|
+
return err('PATH_NOT_ALLOWED', `Refusing to ${type} path outside allowed roots: ${inputPath} -> ${resolvedPath}`, `Allowed roots: ${allowedRoots.join(', ')}. Configure SAFE_DOCX_ALLOWED_ROOTS if needed.`);
|
|
49
|
+
}
|
|
50
|
+
async function resolveWritePathWithExistingAncestor(normalizedPath) {
|
|
51
|
+
let probe = path.dirname(normalizedPath);
|
|
52
|
+
while (true) {
|
|
53
|
+
try {
|
|
54
|
+
const realAncestor = await fs.realpath(probe);
|
|
55
|
+
const tail = path.relative(probe, normalizedPath);
|
|
56
|
+
return path.join(realAncestor, tail);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
const parent = path.dirname(probe);
|
|
60
|
+
if (parent === probe) {
|
|
61
|
+
throw new Error(`No existing ancestor found for path: ${normalizedPath}`);
|
|
62
|
+
}
|
|
63
|
+
probe = parent;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function enforceReadPathPolicy(inputPath) {
|
|
68
|
+
const normalizedPath = normalizePath(inputPath);
|
|
69
|
+
let resolvedPath;
|
|
70
|
+
try {
|
|
71
|
+
resolvedPath = await fs.realpath(normalizedPath);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
return {
|
|
75
|
+
ok: false,
|
|
76
|
+
response: err('PATH_RESOLUTION_ERROR', `Failed to resolve path: ${errorMessage(e)}`),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
const allowedRoots = await resolveAllowedRoots();
|
|
80
|
+
if (!allowedRoots.some((root) => isWithinRoot(resolvedPath, root))) {
|
|
81
|
+
return {
|
|
82
|
+
ok: false,
|
|
83
|
+
response: policyError('read', inputPath, resolvedPath, allowedRoots),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return { ok: true, normalizedPath, resolvedPath, allowedRoots };
|
|
87
|
+
}
|
|
88
|
+
export async function enforceWritePathPolicy(inputPath) {
|
|
89
|
+
const normalizedPath = normalizePath(inputPath);
|
|
90
|
+
let resolvedPath;
|
|
91
|
+
try {
|
|
92
|
+
resolvedPath = await resolveWritePathWithExistingAncestor(normalizedPath);
|
|
93
|
+
}
|
|
94
|
+
catch (e) {
|
|
95
|
+
return {
|
|
96
|
+
ok: false,
|
|
97
|
+
response: err('PATH_RESOLUTION_ERROR', `Failed to resolve output path: ${errorMessage(e)}`),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
const allowedRoots = await resolveAllowedRoots();
|
|
101
|
+
if (!allowedRoots.some((root) => isWithinRoot(resolvedPath, root))) {
|
|
102
|
+
return {
|
|
103
|
+
ok: false,
|
|
104
|
+
response: policyError('write', inputPath, resolvedPath, allowedRoots),
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return { ok: true, normalizedPath, resolvedPath, allowedRoots };
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=path_policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path_policy.js","sourceRoot":"","sources":["../../src/tools/path_policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const ERROR_PREVIEW_CHARS = 50;
|
|
2
|
+
export declare const RESULT_PREVIEW_CHARS = 5000;
|
|
3
|
+
export declare const READ_SIMPLE_PREVIEW_CHARS = 5000;
|
|
4
|
+
export declare function previewText(text: string, maxChars: number, suffix?: string): string;
|
|
5
|
+
//# sourceMappingURL=preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../src/tools/preview.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mBAAmB,KAAK,CAAC;AACtC,eAAO,MAAM,oBAAoB,OAAO,CAAC;AACzC,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,SAAQ,GAAG,MAAM,CAIlF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const ERROR_PREVIEW_CHARS = 50;
|
|
2
|
+
export const RESULT_PREVIEW_CHARS = 5000;
|
|
3
|
+
export const READ_SIMPLE_PREVIEW_CHARS = 5000;
|
|
4
|
+
export function previewText(text, maxChars, suffix = '...') {
|
|
5
|
+
if (maxChars < 0)
|
|
6
|
+
return '';
|
|
7
|
+
if (text.length <= maxChars)
|
|
8
|
+
return text;
|
|
9
|
+
return `${text.slice(0, maxChars)}${suffix}`;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/tools/preview.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AACtC,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AACzC,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAE9C,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,QAAgB,EAAE,MAAM,GAAG,KAAK;IACxE,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5B,IAAI,IAAI,CAAC,MAAM,IAAI,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,MAAM,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SessionManager } from '../session/manager.js';
|
|
2
|
+
import { type ToolResponse } from './types.js';
|
|
3
|
+
export declare function readFile(manager: SessionManager, params: {
|
|
4
|
+
session_id?: string;
|
|
5
|
+
file_path?: string;
|
|
6
|
+
offset?: number;
|
|
7
|
+
limit?: number;
|
|
8
|
+
node_ids?: string[];
|
|
9
|
+
format?: string;
|
|
10
|
+
show_formatting?: boolean;
|
|
11
|
+
}): Promise<ToolResponse>;
|
|
12
|
+
//# sourceMappingURL=read_file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read_file.d.ts","sourceRoot":"","sources":["../../src/tools/read_file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AA2BxD,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,GACpJ,OAAO,CAAC,YAAY,CAAC,CAoFvB"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { errorMessage } from "../error_utils.js";
|
|
2
|
+
import { err, ok } from './types.js';
|
|
3
|
+
import { OOXML, W, renderToon } from '@usejunior/docx-core';
|
|
4
|
+
import { READ_SIMPLE_PREVIEW_CHARS, previewText } from './preview.js';
|
|
5
|
+
import { mergeSessionResolutionMetadata, resolveSessionForTool } from './session_resolution.js';
|
|
6
|
+
function getWAttr(el, localName) {
|
|
7
|
+
return el.getAttributeNS(OOXML.W_NS, localName) ?? el.getAttribute(`w:${localName}`) ?? el.getAttribute(localName);
|
|
8
|
+
}
|
|
9
|
+
function collectFootnoteMarkerSuffix(paragraphEl, displayNumberById) {
|
|
10
|
+
const markers = [];
|
|
11
|
+
const refs = paragraphEl.getElementsByTagNameNS(OOXML.W_NS, W.footnoteReference);
|
|
12
|
+
for (let i = 0; i < refs.length; i++) {
|
|
13
|
+
const ref = refs.item(i);
|
|
14
|
+
const rawId = getWAttr(ref, 'id');
|
|
15
|
+
if (!rawId)
|
|
16
|
+
continue;
|
|
17
|
+
const numericId = Number.parseInt(rawId, 10);
|
|
18
|
+
if (Number.isNaN(numericId))
|
|
19
|
+
continue;
|
|
20
|
+
const display = displayNumberById.get(numericId) ?? numericId;
|
|
21
|
+
markers.push(`[^${display}]`);
|
|
22
|
+
}
|
|
23
|
+
return markers.join('');
|
|
24
|
+
}
|
|
25
|
+
export async function readFile(manager, params) {
|
|
26
|
+
try {
|
|
27
|
+
const resolved = await resolveSessionForTool(manager, params, { toolName: 'read_file' });
|
|
28
|
+
if (!resolved.ok)
|
|
29
|
+
return resolved.response;
|
|
30
|
+
const { session, metadata } = resolved;
|
|
31
|
+
const format = (params.format ?? 'toon').toLowerCase();
|
|
32
|
+
if (format !== 'toon' && format !== 'json' && format !== 'simple') {
|
|
33
|
+
return err('INVALID_FORMAT', `Invalid format: ${params.format}`, "Use 'toon' (default), 'json', or 'simple'.");
|
|
34
|
+
}
|
|
35
|
+
const showFormatting = params.show_formatting ?? true;
|
|
36
|
+
const { nodes } = session.doc.buildDocumentView({
|
|
37
|
+
includeSemanticTags: showFormatting,
|
|
38
|
+
showFormatting,
|
|
39
|
+
});
|
|
40
|
+
const totalParagraphs = nodes.length;
|
|
41
|
+
let filtered = nodes;
|
|
42
|
+
if (params.node_ids && params.node_ids.length > 0) {
|
|
43
|
+
const set = new Set(params.node_ids);
|
|
44
|
+
filtered = nodes.filter((n) => set.has(n.id));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
let startIdx = 0;
|
|
48
|
+
if (typeof params.offset === 'number') {
|
|
49
|
+
if (params.offset > 0)
|
|
50
|
+
startIdx = Math.max(0, params.offset - 1);
|
|
51
|
+
if (params.offset < 0)
|
|
52
|
+
startIdx = Math.max(0, totalParagraphs + params.offset);
|
|
53
|
+
}
|
|
54
|
+
const endIdx = typeof params.limit === 'number' ? Math.min(totalParagraphs, startIdx + params.limit) : totalParagraphs;
|
|
55
|
+
filtered = nodes.slice(startIdx, endIdx);
|
|
56
|
+
}
|
|
57
|
+
const paraIds = filtered.map((n) => n.id);
|
|
58
|
+
let enriched = filtered;
|
|
59
|
+
try {
|
|
60
|
+
const footnotes = await session.doc.getFootnotes();
|
|
61
|
+
if (footnotes.length > 0) {
|
|
62
|
+
const displayById = new Map();
|
|
63
|
+
for (const note of footnotes) {
|
|
64
|
+
displayById.set(note.id, note.displayNumber > 0 ? note.displayNumber : note.id);
|
|
65
|
+
}
|
|
66
|
+
enriched = filtered.map((node) => {
|
|
67
|
+
const paragraphEl = session.doc.getParagraphElementById(node.id);
|
|
68
|
+
if (!paragraphEl)
|
|
69
|
+
return node;
|
|
70
|
+
const markerSuffix = collectFootnoteMarkerSuffix(paragraphEl, displayById);
|
|
71
|
+
if (!markerSuffix)
|
|
72
|
+
return node;
|
|
73
|
+
return {
|
|
74
|
+
...node,
|
|
75
|
+
clean_text: `${node.clean_text}${markerSuffix}`,
|
|
76
|
+
tagged_text: `${node.tagged_text}${markerSuffix}`,
|
|
77
|
+
text: `${node.text}${markerSuffix}`,
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
enriched = filtered;
|
|
84
|
+
}
|
|
85
|
+
let content;
|
|
86
|
+
if (format === 'json') {
|
|
87
|
+
content = JSON.stringify(enriched, null, 2);
|
|
88
|
+
}
|
|
89
|
+
else if (format === 'simple') {
|
|
90
|
+
const lines = ['#TOON id | text'];
|
|
91
|
+
for (const n of enriched) {
|
|
92
|
+
const text = previewText(n.clean_text, READ_SIMPLE_PREVIEW_CHARS);
|
|
93
|
+
lines.push(`${n.id} | ${text}`);
|
|
94
|
+
}
|
|
95
|
+
content = lines.join('\n');
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
content = renderToon(enriched);
|
|
99
|
+
}
|
|
100
|
+
return ok(mergeSessionResolutionMetadata({
|
|
101
|
+
session_id: session.sessionId,
|
|
102
|
+
content,
|
|
103
|
+
total_paragraphs: totalParagraphs,
|
|
104
|
+
paragraphs_returned: enriched.length,
|
|
105
|
+
paragraph_ids: paraIds,
|
|
106
|
+
}, metadata));
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
const msg = errorMessage(e);
|
|
110
|
+
return err('READ_ERROR', msg, 'Check session status and try again.');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=read_file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read_file.js","sourceRoot":"","sources":["../../src/tools/read_file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SessionManager } from '../session/manager.js';
|
|
2
|
+
import { type ToolResponse } from './types.js';
|
|
3
|
+
export declare function stripSearchTags(text: string): string;
|
|
4
|
+
export declare function replaceText(manager: SessionManager, params: {
|
|
5
|
+
session_id?: string;
|
|
6
|
+
file_path?: string;
|
|
7
|
+
target_paragraph_id: string;
|
|
8
|
+
old_string: string;
|
|
9
|
+
new_string: string;
|
|
10
|
+
instruction: string;
|
|
11
|
+
normalize_first?: boolean;
|
|
12
|
+
}): Promise<ToolResponse>;
|
|
13
|
+
//# sourceMappingURL=replace_text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replace_text.d.ts","sourceRoot":"","sources":["../../src/tools/replace_text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAgB,MAAM,uBAAuB,CAAC;AAErE,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAgTxD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOpD;AAqND,wBAAsB,WAAW,CAC/B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE;IACN,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GACA,OAAO,CAAC,YAAY,CAAC,CAuLvB"}
|