@usejunior/docx-mcp 0.9.1 → 0.11.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/LICENSE +202 -21
- package/NOTICE +2 -0
- package/README.md +47 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/cli/commands/edit.d.ts.map +1 -1
- package/dist/cli/commands/edit.js +2 -1
- package/dist/cli/commands/edit.js.map +1 -1
- package/dist/cli/commands/grep.d.ts.map +1 -1
- package/dist/cli/commands/grep.js +2 -1
- package/dist/cli/commands/grep.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/tool_runner.d.ts +6 -0
- package/dist/cli/tool_runner.d.ts.map +1 -1
- package/dist/cli/tool_runner.js +10 -1
- package/dist/cli/tool_runner.js.map +1 -1
- package/dist/odf_loader.d.ts +2 -0
- package/dist/odf_loader.d.ts.map +1 -0
- package/dist/odf_loader.js +20 -0
- package/dist/odf_loader.js.map +1 -0
- package/dist/server.d.ts +8 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +113 -4
- package/dist/server.js.map +1 -1
- package/dist/session/manager.d.ts +48 -2
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +175 -7
- package/dist/session/manager.js.map +1 -1
- package/dist/tool_catalog.d.ts +56 -12
- package/dist/tool_catalog.d.ts.map +1 -1
- package/dist/tool_catalog.js +69 -17
- package/dist/tool_catalog.js.map +1 -1
- package/dist/tools/accept_changes.js +1 -1
- package/dist/tools/accept_changes.js.map +1 -1
- package/dist/tools/add_comment.d.ts.map +1 -1
- package/dist/tools/add_comment.js +21 -5
- package/dist/tools/add_comment.js.map +1 -1
- package/dist/tools/add_footnote.d.ts.map +1 -1
- package/dist/tools/add_footnote.js +15 -3
- package/dist/tools/add_footnote.js.map +1 -1
- package/dist/tools/ai_revision_guard.d.ts +38 -0
- package/dist/tools/ai_revision_guard.d.ts.map +1 -0
- package/dist/tools/ai_revision_guard.js +115 -0
- package/dist/tools/ai_revision_guard.js.map +1 -0
- package/dist/tools/apply_plan.d.ts.map +1 -1
- package/dist/tools/apply_plan.js +55 -5
- package/dist/tools/apply_plan.js.map +1 -1
- package/dist/tools/clear_formatting.d.ts +2 -1
- package/dist/tools/clear_formatting.d.ts.map +1 -1
- package/dist/tools/clear_formatting.js +84 -61
- package/dist/tools/clear_formatting.js.map +1 -1
- package/dist/tools/compare_documents.d.ts.map +1 -1
- package/dist/tools/compare_documents.js +11 -2
- package/dist/tools/compare_documents.js.map +1 -1
- package/dist/tools/convert_to_odt.d.ts +20 -0
- package/dist/tools/convert_to_odt.d.ts.map +1 -0
- package/dist/tools/convert_to_odt.js +74 -0
- package/dist/tools/convert_to_odt.js.map +1 -0
- package/dist/tools/delete_comment.d.ts.map +1 -1
- package/dist/tools/delete_comment.js +12 -1
- package/dist/tools/delete_comment.js.map +1 -1
- package/dist/tools/delete_footnote.d.ts.map +1 -1
- package/dist/tools/delete_footnote.js +12 -1
- package/dist/tools/delete_footnote.js.map +1 -1
- package/dist/tools/export.d.ts +20 -0
- package/dist/tools/export.d.ts.map +1 -0
- package/dist/tools/export.js +96 -0
- package/dist/tools/export.js.map +1 -0
- package/dist/tools/format_layout.d.ts.map +1 -1
- package/dist/tools/format_layout.js +21 -3
- package/dist/tools/format_layout.js.map +1 -1
- package/dist/tools/get_comments.d.ts.map +1 -1
- package/dist/tools/get_comments.js +9 -0
- package/dist/tools/get_comments.js.map +1 -1
- package/dist/tools/grep.d.ts.map +1 -1
- package/dist/tools/grep.js +4 -115
- package/dist/tools/grep.js.map +1 -1
- package/dist/tools/grep_core.d.ts +49 -0
- package/dist/tools/grep_core.d.ts.map +1 -0
- package/dist/tools/grep_core.js +126 -0
- package/dist/tools/grep_core.js.map +1 -0
- package/dist/tools/insert_paragraph.d.ts +7 -1
- package/dist/tools/insert_paragraph.d.ts.map +1 -1
- package/dist/tools/insert_paragraph.js +39 -27
- package/dist/tools/insert_paragraph.js.map +1 -1
- package/dist/tools/odf/add_comment.d.ts +21 -0
- package/dist/tools/odf/add_comment.d.ts.map +1 -0
- package/dist/tools/odf/add_comment.js +64 -0
- package/dist/tools/odf/add_comment.js.map +1 -0
- package/dist/tools/odf/close_file.d.ts +4 -0
- package/dist/tools/odf/close_file.d.ts.map +1 -0
- package/dist/tools/odf/close_file.js +16 -0
- package/dist/tools/odf/close_file.js.map +1 -0
- package/dist/tools/odf/compare_documents.d.ts +39 -0
- package/dist/tools/odf/compare_documents.d.ts.map +1 -0
- package/dist/tools/odf/compare_documents.js +156 -0
- package/dist/tools/odf/compare_documents.js.map +1 -0
- package/dist/tools/odf/get_comments.d.ts +11 -0
- package/dist/tools/odf/get_comments.d.ts.map +1 -0
- package/dist/tools/odf/get_comments.js +32 -0
- package/dist/tools/odf/get_comments.js.map +1 -0
- package/dist/tools/odf/get_file_status.d.ts +4 -0
- package/dist/tools/odf/get_file_status.d.ts.map +1 -0
- package/dist/tools/odf/get_file_status.js +28 -0
- package/dist/tools/odf/get_file_status.js.map +1 -0
- package/dist/tools/odf/grep.d.ts +19 -0
- package/dist/tools/odf/grep.d.ts.map +1 -0
- package/dist/tools/odf/grep.js +81 -0
- package/dist/tools/odf/grep.js.map +1 -0
- package/dist/tools/odf/insert_paragraph.d.ts +19 -0
- package/dist/tools/odf/insert_paragraph.d.ts.map +1 -0
- package/dist/tools/odf/insert_paragraph.js +50 -0
- package/dist/tools/odf/insert_paragraph.js.map +1 -0
- package/dist/tools/odf/read_file.d.ts +9 -0
- package/dist/tools/odf/read_file.d.ts.map +1 -0
- package/dist/tools/odf/read_file.js +124 -0
- package/dist/tools/odf/read_file.js.map +1 -0
- package/dist/tools/odf/replace_text.d.ts +9 -0
- package/dist/tools/odf/replace_text.d.ts.map +1 -0
- package/dist/tools/odf/replace_text.js +41 -0
- package/dist/tools/odf/replace_text.js.map +1 -0
- package/dist/tools/odf/save.d.ts +7 -0
- package/dist/tools/odf/save.d.ts.map +1 -0
- package/dist/tools/odf/save.js +48 -0
- package/dist/tools/odf/save.js.map +1 -0
- package/dist/tools/open_document.d.ts.map +1 -1
- package/dist/tools/open_document.js +36 -4
- package/dist/tools/open_document.js.map +1 -1
- package/dist/tools/path_policy.d.ts +9 -0
- package/dist/tools/path_policy.d.ts.map +1 -1
- package/dist/tools/path_policy.js +66 -5
- package/dist/tools/path_policy.js.map +1 -1
- package/dist/tools/provider_guard.d.ts +1 -0
- package/dist/tools/provider_guard.d.ts.map +1 -1
- package/dist/tools/provider_guard.js +10 -0
- package/dist/tools/provider_guard.js.map +1 -1
- package/dist/tools/read_file.d.ts +3 -0
- package/dist/tools/read_file.d.ts.map +1 -1
- package/dist/tools/read_file.js +384 -52
- package/dist/tools/read_file.js.map +1 -1
- package/dist/tools/replace_text.d.ts +7 -1
- package/dist/tools/replace_text.d.ts.map +1 -1
- package/dist/tools/replace_text.js +74 -48
- package/dist/tools/replace_text.js.map +1 -1
- package/dist/tools/save.d.ts +19 -0
- package/dist/tools/save.d.ts.map +1 -1
- package/dist/tools/save.js +161 -13
- package/dist/tools/save.js.map +1 -1
- package/dist/tools/session_resolution.d.ts +25 -1
- package/dist/tools/session_resolution.d.ts.map +1 -1
- package/dist/tools/session_resolution.js +179 -2
- package/dist/tools/session_resolution.js.map +1 -1
- package/dist/tools/tag_parser.d.ts.map +1 -1
- package/dist/tools/tag_parser.js +69 -14
- package/dist/tools/tag_parser.js.map +1 -1
- package/dist/tools/update_footnote.d.ts.map +1 -1
- package/dist/tools/update_footnote.js +20 -7
- package/dist/tools/update_footnote.js.map +1 -1
- package/package.json +21 -16
|
@@ -5,6 +5,7 @@ import { err, ok } from './types.js';
|
|
|
5
5
|
import { enforceReadPathPolicy } from './path_policy.js';
|
|
6
6
|
import { validateDocxArchiveSafety } from './docx_archive_guard.js';
|
|
7
7
|
import { SAFE_DOCX_MCP_TOOLS } from '../tool_catalog.js';
|
|
8
|
+
import { loadOdfCore } from '../odf_loader.js';
|
|
8
9
|
function getAvailableToolsSchema() {
|
|
9
10
|
const toolDefaultsByName = {
|
|
10
11
|
grep: { dedupe_by_paragraph: true },
|
|
@@ -38,10 +39,10 @@ export async function openDocument(manager, params) {
|
|
|
38
39
|
return err('FILE_NOT_FOUND', `File not found: ${filePath}`, 'Copy the file to ~/Downloads/ or ~/Documents/ first, then pass that path.');
|
|
39
40
|
}
|
|
40
41
|
const extension = path.extname(expanded).toLowerCase();
|
|
41
|
-
if (extension !== '.docx') {
|
|
42
|
+
if (extension !== '.docx' && extension !== '.odt') {
|
|
42
43
|
const hint = extension === '.dotx'
|
|
43
|
-
? 'Only .docx files are supported in the local runtime. Convert the .dotx template to .docx before opening it.'
|
|
44
|
-
: 'Only .docx files are supported.';
|
|
44
|
+
? 'Only .docx and .odt files are supported in the local runtime. Convert the .dotx template to .docx before opening it.'
|
|
45
|
+
: 'Only .docx and .odt files are supported.';
|
|
45
46
|
return err('INVALID_FILE_TYPE', `Invalid file type: ${extension}`, hint);
|
|
46
47
|
}
|
|
47
48
|
const policy = await enforceReadPathPolicy(filePath);
|
|
@@ -50,7 +51,38 @@ export async function openDocument(manager, params) {
|
|
|
50
51
|
const safePath = policy.normalizedPath;
|
|
51
52
|
const content = await fs.readFile(safePath);
|
|
52
53
|
if (content.length > 50 * 1024 * 1024) {
|
|
53
|
-
return err('VALIDATION_ERROR', 'File too large', 'Check file type (.docx only) and size (max 50MB).');
|
|
54
|
+
return err('VALIDATION_ERROR', 'File too large', 'Check file type (.docx or .odt only) and size (max 50MB).');
|
|
55
|
+
}
|
|
56
|
+
if (extension === '.odt') {
|
|
57
|
+
const odf = await loadOdfCore();
|
|
58
|
+
if (!odf) {
|
|
59
|
+
return err('MISSING_DEPENDENCY', 'ODF (.odt) support requires @usejunior/odf-core.', 'Install @usejunior/odf-core to enable ODF editing.');
|
|
60
|
+
}
|
|
61
|
+
const archiveGuard = await odf.validateOdfArchiveSafety(content);
|
|
62
|
+
if (!archiveGuard.ok)
|
|
63
|
+
return err(archiveGuard.code, archiveGuard.message, archiveGuard.hint);
|
|
64
|
+
const filename = path.basename(safePath);
|
|
65
|
+
const archive = await odf.OdfArchive.load(content);
|
|
66
|
+
const doc = odf.OdfDocument.fromContentXml(await archive.getContentXml());
|
|
67
|
+
const session = await manager.createOdfSession(content, filename, safePath, archive, doc);
|
|
68
|
+
const paragraphCount = session.doc.getParagraphs().length;
|
|
69
|
+
return ok({
|
|
70
|
+
file_path: manager.normalizePath(session.originalPath),
|
|
71
|
+
provider: 'odf',
|
|
72
|
+
expires_at: session.expiresAt.toISOString(),
|
|
73
|
+
document: {
|
|
74
|
+
filename,
|
|
75
|
+
paragraphs: paragraphCount,
|
|
76
|
+
size_bytes: content.length,
|
|
77
|
+
},
|
|
78
|
+
normalization: { runs_merged: 0, redlines_simplified: 0, double_elevations_fixed: 0, normalization_skipped: true },
|
|
79
|
+
save_defaults: {
|
|
80
|
+
default_variants: ['odt'],
|
|
81
|
+
default_save_format: 'odt',
|
|
82
|
+
supports_variant_override: false,
|
|
83
|
+
},
|
|
84
|
+
tools: getAvailableToolsSchema(),
|
|
85
|
+
});
|
|
54
86
|
}
|
|
55
87
|
const archiveGuard = await validateDocxArchiveSafety(content);
|
|
56
88
|
if (!archiveGuard.ok)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"open_document.js","sourceRoot":"","sources":["../../src/tools/open_document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAa,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,GAAG,EAAE,EAAE,EAAqB,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"open_document.js","sourceRoot":"","sources":["../../src/tools/open_document.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,15 @@ export type PathPolicyOutcome = {
|
|
|
8
8
|
ok: false;
|
|
9
9
|
response: ToolResponse;
|
|
10
10
|
};
|
|
11
|
+
export declare function canonicalizePath(inputPath: string): Promise<string>;
|
|
12
|
+
/**
|
|
13
|
+
* True when two paths resolve to the same filesystem location. Canonicalizes both via realpath (with a
|
|
14
|
+
* lexical fallback for paths that do not exist yet) so a symlink can't disguise a clobber of an input
|
|
15
|
+
* document behind a different-looking output path. Shared source-clobber guard for the write tools
|
|
16
|
+
* (issue #313); folded out of the export-local guard so all write tools enforce it identically.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolvesToSamePath(a: string, b: string): Promise<boolean>;
|
|
19
|
+
export declare function getPlatformTempDefaults(platform?: NodeJS.Platform): string[];
|
|
11
20
|
export declare function enforceReadPathPolicy(inputPath: string): Promise<PathPolicyOutcome>;
|
|
12
21
|
export declare function enforceWritePathPolicy(inputPath: string): Promise<PathPolicyOutcome>;
|
|
13
22
|
//# sourceMappingURL=path_policy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path_policy.d.ts","sourceRoot":"","sources":["../../src/tools/path_policy.ts"],"names":[],"mappings":"AAIA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,iBAAiB,GACzB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC;
|
|
1
|
+
{"version":3,"file":"path_policy.d.ts","sourceRoot":"","sources":["../../src/tools/path_policy.ts"],"names":[],"mappings":"AAIA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAEpD,MAAM,MAAM,iBAAiB,GACzB;IACE,EAAE,EAAE,IAAI,CAAC;IACT,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB,GACD;IACE,EAAE,EAAE,KAAK,CAAC;IACV,QAAQ,EAAE,YAAY,CAAC;CACxB,CAAC;AAUN,wBAAsB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOzE;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE/E;AAQD,wBAAgB,uBAAuB,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,EAAE,CAI9F;AAoGD,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoBzF;AAED,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoB1F"}
|
|
@@ -9,7 +9,7 @@ function expandPath(inputPath) {
|
|
|
9
9
|
function normalizePath(inputPath) {
|
|
10
10
|
return path.resolve(expandPath(inputPath));
|
|
11
11
|
}
|
|
12
|
-
async function canonicalizePath(inputPath) {
|
|
12
|
+
export async function canonicalizePath(inputPath) {
|
|
13
13
|
const normalized = normalizePath(inputPath);
|
|
14
14
|
try {
|
|
15
15
|
return await fs.realpath(normalized);
|
|
@@ -18,6 +18,28 @@ async function canonicalizePath(inputPath) {
|
|
|
18
18
|
return normalized;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* True when two paths resolve to the same filesystem location. Canonicalizes both via realpath (with a
|
|
23
|
+
* lexical fallback for paths that do not exist yet) so a symlink can't disguise a clobber of an input
|
|
24
|
+
* document behind a different-looking output path. Shared source-clobber guard for the write tools
|
|
25
|
+
* (issue #313); folded out of the export-local guard so all write tools enforce it identically.
|
|
26
|
+
*/
|
|
27
|
+
export async function resolvesToSamePath(a, b) {
|
|
28
|
+
return (await canonicalizePath(a)) === (await canonicalizePath(b));
|
|
29
|
+
}
|
|
30
|
+
// On Linux `/private/tmp` does not exist by default. If we listed it as a root,
|
|
31
|
+
// `canonicalizePath`'s realpath-fallback would leave it as a ghost entry whose
|
|
32
|
+
// subpaths `resolveWritePathWithExistingAncestor` would still match (walking up
|
|
33
|
+
// to `/` as the existing ancestor), silently allowing writes the user never
|
|
34
|
+
// opted into. Restrict `/private/tmp` to darwin where it is the canonical form
|
|
35
|
+
// of `/tmp`. Windows already covers `%TEMP%/%TMP%` via `os.tmpdir()`.
|
|
36
|
+
export function getPlatformTempDefaults(platform = process.platform) {
|
|
37
|
+
if (platform === 'darwin')
|
|
38
|
+
return ['/tmp', '/private/tmp'];
|
|
39
|
+
if (platform === 'win32')
|
|
40
|
+
return [];
|
|
41
|
+
return ['/tmp'];
|
|
42
|
+
}
|
|
21
43
|
async function resolveAllowedRoots() {
|
|
22
44
|
const configured = process.env.SAFE_DOCX_ALLOWED_ROOTS;
|
|
23
45
|
const fromEnv = configured
|
|
@@ -28,7 +50,7 @@ async function resolveAllowedRoots() {
|
|
|
28
50
|
: [];
|
|
29
51
|
const defaults = fromEnv.length > 0
|
|
30
52
|
? fromEnv
|
|
31
|
-
: [process.env.HOME ?? '', os.tmpdir()].filter((entry) => entry.length > 0);
|
|
53
|
+
: [process.env.HOME ?? '', os.tmpdir(), ...getPlatformTempDefaults()].filter((entry) => entry.length > 0);
|
|
32
54
|
const out = [];
|
|
33
55
|
const seen = new Set();
|
|
34
56
|
for (const rawRoot of defaults) {
|
|
@@ -45,9 +67,48 @@ function isWithinRoot(targetPath, rootPath) {
|
|
|
45
67
|
return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
|
|
46
68
|
}
|
|
47
69
|
function policyError(type, inputPath, resolvedPath, allowedRoots) {
|
|
48
|
-
|
|
70
|
+
const suggestedRoot = path.dirname(resolvedPath);
|
|
71
|
+
const exampleEnv = process.env.SAFE_DOCX_ALLOWED_ROOTS
|
|
72
|
+
? `SAFE_DOCX_ALLOWED_ROOTS="$SAFE_DOCX_ALLOWED_ROOTS${path.delimiter}${suggestedRoot}"`
|
|
73
|
+
: `SAFE_DOCX_ALLOWED_ROOTS="${suggestedRoot}"`;
|
|
74
|
+
return err('PATH_NOT_ALLOWED', `Refusing to ${type} path outside allowed roots: ${inputPath} -> ${resolvedPath}`, [
|
|
75
|
+
`Allowed roots: ${allowedRoots.join(', ')}.`,
|
|
76
|
+
`To allow this path, restart the MCP server with ${exampleEnv}.`,
|
|
77
|
+
].join(' '));
|
|
49
78
|
}
|
|
50
|
-
|
|
79
|
+
// Canonicalize a *write* target. Unlike a read, the final component may not exist yet, so we cannot
|
|
80
|
+
// simply `realpath` the whole path. The crux of the symlink-escape fix (issue #313) is that we must
|
|
81
|
+
// still resolve the final component when it *does* exist — including a dangling symlink — so the policy
|
|
82
|
+
// check judges where `fs.writeFile` will actually write, not where the link happens to live.
|
|
83
|
+
async function resolveWritePathCanonical(normalizedPath, seen = new Set()) {
|
|
84
|
+
// 1. Final component exists (regular file, directory, or symlink to an existing target): realpath
|
|
85
|
+
// resolves it fully — symmetric with enforceReadPathPolicy.
|
|
86
|
+
try {
|
|
87
|
+
return await fs.realpath(normalizedPath);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Fall through: the final component does not currently resolve.
|
|
91
|
+
}
|
|
92
|
+
// 2. Dangling final component that is itself a symlink. `realpath` throws here, but `fs.writeFile`
|
|
93
|
+
// would happily follow the broken link and create its target. Follow it ourselves so the policy
|
|
94
|
+
// check lands on the real write destination rather than the link's (in-root) location.
|
|
95
|
+
let linkStat = null;
|
|
96
|
+
try {
|
|
97
|
+
linkStat = await fs.lstat(normalizedPath);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Genuinely missing (not even a link): fall through to ancestor resolution.
|
|
101
|
+
}
|
|
102
|
+
if (linkStat?.isSymbolicLink()) {
|
|
103
|
+
if (seen.has(normalizedPath)) {
|
|
104
|
+
throw new Error(`Symlink cycle detected resolving: ${normalizedPath}`);
|
|
105
|
+
}
|
|
106
|
+
seen.add(normalizedPath);
|
|
107
|
+
const target = path.resolve(path.dirname(normalizedPath), await fs.readlink(normalizedPath));
|
|
108
|
+
return resolveWritePathCanonical(target, seen);
|
|
109
|
+
}
|
|
110
|
+
// 3. Genuinely-missing new file: resolve against the first existing ancestor (this also follows a
|
|
111
|
+
// symlinked parent directory via `realpath`). Preserves writing new files into existing dirs.
|
|
51
112
|
let probe = path.dirname(normalizedPath);
|
|
52
113
|
while (true) {
|
|
53
114
|
try {
|
|
@@ -89,7 +150,7 @@ export async function enforceWritePathPolicy(inputPath) {
|
|
|
89
150
|
const normalizedPath = normalizePath(inputPath);
|
|
90
151
|
let resolvedPath;
|
|
91
152
|
try {
|
|
92
|
-
resolvedPath = await
|
|
153
|
+
resolvedPath = await resolveWritePathCanonical(normalizedPath);
|
|
93
154
|
}
|
|
94
155
|
catch (e) {
|
|
95
156
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"path_policy.js","sourceRoot":"","sources":["../../src/tools/path_policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,
|
|
1
|
+
{"version":3,"file":"path_policy.js","sourceRoot":"","sources":["../../src/tools/path_policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider_guard.d.ts","sourceRoot":"","sources":["../../src/tools/provider_guard.ts"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"provider_guard.d.ts","sourceRoot":"","sources":["../../src/tools/provider_guard.ts"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAYpD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CASvE;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CASrE"}
|
|
@@ -3,10 +3,20 @@ const GDOCS_SUPPORTED_TOOLS = new Set([
|
|
|
3
3
|
'read_file', 'replace_text', 'insert_paragraph', 'grep', 'save',
|
|
4
4
|
'format_layout', 'get_file_status', 'close_file',
|
|
5
5
|
]);
|
|
6
|
+
const ODF_SUPPORTED_TOOLS = new Set([
|
|
7
|
+
'read_file', 'replace_text', 'grep', 'insert_paragraph', 'add_comment', 'get_comments',
|
|
8
|
+
'compare_documents', 'save', 'get_file_status', 'close_file',
|
|
9
|
+
]);
|
|
6
10
|
export function checkGDocsSupport(toolName) {
|
|
7
11
|
if (!GDOCS_SUPPORTED_TOOLS.has(toolName)) {
|
|
8
12
|
return err('UNSUPPORTED_FOR_PROVIDER', `'${toolName}' is not supported for Google Docs.`, 'This tool is only available for DOCX files.');
|
|
9
13
|
}
|
|
10
14
|
return null;
|
|
11
15
|
}
|
|
16
|
+
export function checkOdfSupport(toolName) {
|
|
17
|
+
if (!ODF_SUPPORTED_TOOLS.has(toolName)) {
|
|
18
|
+
return err('UNSUPPORTED_FOR_ODF', `'${toolName}' is not supported for ODF (.odt) files.`, 'Use read_file, replace_text, grep, insert_paragraph, add_comment, get_comments, compare_documents, save, get_file_status, or close_file for .odt files.');
|
|
19
|
+
}
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
12
22
|
//# sourceMappingURL=provider_guard.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider_guard.js","sourceRoot":"","sources":["../../src/tools/provider_guard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAqB,MAAM,YAAY,CAAC;AAEpD,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM;IAC/D,eAAe,EAAE,iBAAiB,EAAE,YAAY;CACjD,CAAC,CAAC;AAEH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,OAAO,GAAG,CACR,0BAA0B,EAC1B,IAAI,QAAQ,qCAAqC,EACjD,6CAA6C,CAC9C,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
1
|
+
{"version":3,"file":"provider_guard.js","sourceRoot":"","sources":["../../src/tools/provider_guard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAqB,MAAM,YAAY,CAAC;AAEpD,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAC;IACpC,WAAW,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM;IAC/D,eAAe,EAAE,iBAAiB,EAAE,YAAY;CACjD,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,WAAW,EAAE,cAAc,EAAE,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc;IACtF,mBAAmB,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY;CAC7D,CAAC,CAAC;AAEH,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzC,OAAO,GAAG,CACR,0BAA0B,EAC1B,IAAI,QAAQ,qCAAqC,EACjD,6CAA6C,CAC9C,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvC,OAAO,GAAG,CACR,qBAAqB,EACrB,IAAI,QAAQ,0CAA0C,EACtD,yJAAyJ,CAC1J,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -7,5 +7,8 @@ export declare function readFile(manager: SessionManager, params: {
|
|
|
7
7
|
node_ids?: string[];
|
|
8
8
|
format?: string;
|
|
9
9
|
show_formatting?: boolean;
|
|
10
|
+
comment_rendering?: string;
|
|
11
|
+
include_fingerprint?: boolean;
|
|
12
|
+
include_footnotes?: boolean;
|
|
10
13
|
}): Promise<ToolResponse>;
|
|
11
14
|
//# sourceMappingURL=read_file.d.ts.map
|
|
@@ -1 +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;
|
|
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;AA6RxD,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE;IACN,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GACA,OAAO,CAAC,YAAY,CAAC,CAkMvB"}
|