@usejunior/docx-mcp 0.9.1 → 0.10.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 +46 -1
- 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/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 +19 -0
- package/dist/odf_loader.js.map +1 -0
- package/dist/server.d.ts +5 -2
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +110 -4
- package/dist/server.js.map +1 -1
- package/dist/session/manager.d.ts +44 -2
- package/dist/session/manager.d.ts.map +1 -1
- package/dist/session/manager.js +212 -2
- package/dist/session/manager.js.map +1 -1
- package/dist/tool_catalog.d.ts +40 -12
- package/dist/tool_catalog.d.ts.map +1 -1
- package/dist/tool_catalog.js +49 -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 +4 -2
- 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 +3 -1
- package/dist/tools/add_footnote.js.map +1 -1
- package/dist/tools/apply_plan.d.ts.map +1 -1
- package/dist/tools/apply_plan.js +6 -4
- 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 +62 -49
- 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/delete_comment.d.ts.map +1 -1
- package/dist/tools/delete_comment.js +3 -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 +3 -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 +5 -3
- package/dist/tools/format_layout.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 +2 -1
- package/dist/tools/insert_paragraph.d.ts.map +1 -1
- package/dist/tools/insert_paragraph.js +4 -2
- 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 +2 -0
- package/dist/tools/read_file.d.ts.map +1 -1
- package/dist/tools/read_file.js +370 -31
- package/dist/tools/read_file.js.map +1 -1
- package/dist/tools/replace_text.d.ts +2 -1
- package/dist/tools/replace_text.d.ts.map +1 -1
- package/dist/tools/replace_text.js +26 -5
- package/dist/tools/replace_text.js.map +1 -1
- package/dist/tools/save.d.ts.map +1 -1
- package/dist/tools/save.js +55 -8
- 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 +3 -1
- package/dist/tools/update_footnote.js.map +1 -1
- package/package.json +18 -14
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type RevisionContext } from '@usejunior/docx-core';
|
|
1
2
|
import { SessionManager } from '../session/manager.js';
|
|
2
3
|
import { type ToolResponse } from './types.js';
|
|
3
4
|
export declare function insertParagraph(manager: SessionManager, params: {
|
|
@@ -8,5 +9,5 @@ export declare function insertParagraph(manager: SessionManager, params: {
|
|
|
8
9
|
position?: string;
|
|
9
10
|
style_source_id?: string;
|
|
10
11
|
target_style?: string;
|
|
11
|
-
}): Promise<ToolResponse>;
|
|
12
|
+
}, ctx?: RevisionContext): Promise<ToolResponse>;
|
|
12
13
|
//# sourceMappingURL=insert_paragraph.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insert_paragraph.d.ts","sourceRoot":"","sources":["../../src/tools/insert_paragraph.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"insert_paragraph.d.ts","sourceRoot":"","sources":["../../src/tools/insert_paragraph.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EAIrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAkD,MAAM,uBAAuB,CAAC;AAEvG,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAsGxD,wBAAsB,eAAe,CACnC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE;IACN,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB,EAAE,MAAM,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,EACD,GAAG,CAAC,EAAE,eAAe,GACpB,OAAO,CAAC,YAAY,CAAC,CA8FvB"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getParagraphRuns, hasHyperlinkTags, stripHyperlinkTags, stripAllInlineTags, } from '@usejunior/docx-core';
|
|
2
|
+
import { getRevisionContextForSession } from '../session/manager.js';
|
|
2
3
|
import { errorMessage } from "../error_utils.js";
|
|
3
4
|
import { err, ok } from './types.js';
|
|
4
5
|
import { RESULT_PREVIEW_CHARS, previewText } from './preview.js';
|
|
@@ -85,12 +86,13 @@ function buildReplacementPartsForInsert(segments, templateRun, headerAddProps) {
|
|
|
85
86
|
}
|
|
86
87
|
return parts.some((p) => !!p.addRunProps) ? parts : null;
|
|
87
88
|
}
|
|
88
|
-
export async function insertParagraph(manager, params) {
|
|
89
|
+
export async function insertParagraph(manager, params, ctx) {
|
|
89
90
|
try {
|
|
90
91
|
const resolved = await resolveSessionForTool(manager, params, { toolName: 'insert_paragraph' });
|
|
91
92
|
if (!resolved.ok)
|
|
92
93
|
return resolved.response;
|
|
93
94
|
const { session, metadata } = resolved;
|
|
95
|
+
const revisionCtx = ctx ?? await getRevisionContextForSession(session);
|
|
94
96
|
const positionUpper = (params.position ?? 'AFTER').toUpperCase();
|
|
95
97
|
if (positionUpper !== 'BEFORE' && positionUpper !== 'AFTER') {
|
|
96
98
|
return err('INVALID_POSITION', `Invalid position: ${params.position}. Must be 'BEFORE' or 'AFTER'.`);
|
|
@@ -136,7 +138,7 @@ export async function insertParagraph(manager, params) {
|
|
|
136
138
|
relativePosition: positionUpper,
|
|
137
139
|
newText: plainParagraphs.join('\n\n'),
|
|
138
140
|
styleSourceId: styleSourceId,
|
|
139
|
-
});
|
|
141
|
+
}, revisionCtx);
|
|
140
142
|
const needsHeaderRoleModel = parsedParagraphs.some((segs) => segs.some((s) => s.header));
|
|
141
143
|
const headerAddProps = needsHeaderRoleModel
|
|
142
144
|
? findHeaderRoleModelAddRunProps(session, params.positional_anchor_node_id)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"insert_paragraph.js","sourceRoot":"","sources":["../../src/tools/insert_paragraph.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"insert_paragraph.js","sourceRoot":"","sources":["../../src/tools/insert_paragraph.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type OdfSession, SessionManager } from '../../session/manager.js';
|
|
2
|
+
import { type ToolResponse } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* ODF (.odt) `add_comment`. Inserts an `office:annotation` either over the whole anchor paragraph
|
|
5
|
+
* (no `anchor_text`) or bracketing a substring (`anchor_text`). Mirrors the DOCX tool's param and
|
|
6
|
+
* response shapes.
|
|
7
|
+
*
|
|
8
|
+
* Replies (`parent_comment_id`) are NOT supported for ODF — ODF has no first-class reply graph, so a
|
|
9
|
+
* reply request returns `UNSUPPORTED_FOR_ODF` (a documented Phase-2b limitation). Annotations are
|
|
10
|
+
* inline children, so positional paragraph IDs do not shift; no ID-invalidation fields are emitted.
|
|
11
|
+
*/
|
|
12
|
+
export declare function odfAddComment(manager: SessionManager, session: OdfSession, params: {
|
|
13
|
+
file_path?: string;
|
|
14
|
+
target_paragraph_id?: string;
|
|
15
|
+
anchor_text?: string;
|
|
16
|
+
parent_comment_id?: number;
|
|
17
|
+
author: string;
|
|
18
|
+
text: string;
|
|
19
|
+
initials?: string;
|
|
20
|
+
}, metadata: Record<string, unknown>): Promise<ToolResponse>;
|
|
21
|
+
//# sourceMappingURL=add_comment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add_comment.d.ts","sourceRoot":"","sources":["../../../src/tools/odf/add_comment.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE;IACN,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,EACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,YAAY,CAAC,CA0EvB"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { findUniqueSubstringMatch } from '@usejunior/docx-core';
|
|
2
|
+
import { errorMessage } from '../../error_utils.js';
|
|
3
|
+
import { err, ok } from '../types.js';
|
|
4
|
+
/**
|
|
5
|
+
* ODF (.odt) `add_comment`. Inserts an `office:annotation` either over the whole anchor paragraph
|
|
6
|
+
* (no `anchor_text`) or bracketing a substring (`anchor_text`). Mirrors the DOCX tool's param and
|
|
7
|
+
* response shapes.
|
|
8
|
+
*
|
|
9
|
+
* Replies (`parent_comment_id`) are NOT supported for ODF — ODF has no first-class reply graph, so a
|
|
10
|
+
* reply request returns `UNSUPPORTED_FOR_ODF` (a documented Phase-2b limitation). Annotations are
|
|
11
|
+
* inline children, so positional paragraph IDs do not shift; no ID-invalidation fields are emitted.
|
|
12
|
+
*/
|
|
13
|
+
export async function odfAddComment(manager, session, params, metadata) {
|
|
14
|
+
try {
|
|
15
|
+
if (params.parent_comment_id != null) {
|
|
16
|
+
return err('UNSUPPORTED_FOR_ODF', 'Comment replies are not supported for ODF (.odt) files.', 'ODF has no first-class reply graph; add a new root comment with target_paragraph_id instead.');
|
|
17
|
+
}
|
|
18
|
+
if (!params.target_paragraph_id) {
|
|
19
|
+
return err('MISSING_PARAMETER', 'target_paragraph_id is required for ODF comments.', 'Provide target_paragraph_id (and optional anchor_text) to anchor the comment.');
|
|
20
|
+
}
|
|
21
|
+
const pid = params.target_paragraph_id;
|
|
22
|
+
const paraText = session.doc.getParagraphTextById(pid);
|
|
23
|
+
if (paraText == null) {
|
|
24
|
+
return err('ANCHOR_NOT_FOUND', `Paragraph ID ${pid} not found in document`, 'Use grep or read_file to find valid paragraph IDs.');
|
|
25
|
+
}
|
|
26
|
+
let range = {};
|
|
27
|
+
if (params.anchor_text) {
|
|
28
|
+
const match = findUniqueSubstringMatch(paraText, params.anchor_text);
|
|
29
|
+
if (match.status === 'not_found') {
|
|
30
|
+
return err('TEXT_NOT_FOUND', `anchor_text '${params.anchor_text}' not found in paragraph ${pid}`, 'Verify anchor_text is present in the target paragraph.');
|
|
31
|
+
}
|
|
32
|
+
if (match.status === 'multiple') {
|
|
33
|
+
return err('MULTIPLE_MATCHES', `Found ${match.matchCount} matches for anchor_text in paragraph ${pid}`, 'Provide more specific anchor_text for a unique match.');
|
|
34
|
+
}
|
|
35
|
+
range = { start: match.start, end: match.end };
|
|
36
|
+
}
|
|
37
|
+
const result = session.doc.addComment({
|
|
38
|
+
paragraphId: pid,
|
|
39
|
+
...range,
|
|
40
|
+
author: params.author,
|
|
41
|
+
text: params.text,
|
|
42
|
+
initials: params.initials,
|
|
43
|
+
});
|
|
44
|
+
if (!result.ok) {
|
|
45
|
+
return err(result.code, result.message);
|
|
46
|
+
}
|
|
47
|
+
manager.markEdited(session);
|
|
48
|
+
return ok({
|
|
49
|
+
success: true,
|
|
50
|
+
comment_id: result.commentId,
|
|
51
|
+
anchor_paragraph_id: pid,
|
|
52
|
+
anchor_text: params.anchor_text ?? null,
|
|
53
|
+
mode: 'root',
|
|
54
|
+
provider: 'odf',
|
|
55
|
+
file_path: session.originalPath,
|
|
56
|
+
edit_count: session.editCount,
|
|
57
|
+
...metadata,
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
catch (e) {
|
|
61
|
+
return err('COMMENT_ERROR', `Failed to add comment to ODF document: ${errorMessage(e)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=add_comment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add_comment.js","sourceRoot":"","sources":["../../../src/tools/odf/add_comment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type OdfSession, SessionManager } from '../../session/manager.js';
|
|
2
|
+
import { type ToolResponse } from '../types.js';
|
|
3
|
+
export declare function odfCloseFile(manager: SessionManager, session: OdfSession, _params: Record<string, unknown>, _metadata: Record<string, unknown>): Promise<ToolResponse>;
|
|
4
|
+
//# sourceMappingURL=close_file.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close_file.d.ts","sourceRoot":"","sources":["../../../src/tools/odf/close_file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,YAAY,CAAC,CAYvB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { err, ok } from '../types.js';
|
|
2
|
+
export async function odfCloseFile(manager, session, _params, _metadata) {
|
|
3
|
+
try {
|
|
4
|
+
const cleared = await manager.clearSessionByPath(session.originalPath);
|
|
5
|
+
return ok({
|
|
6
|
+
clear_mode: 'file_path',
|
|
7
|
+
file_path: cleared ?? session.originalPath,
|
|
8
|
+
cleared_file_paths: cleared ? [cleared] : [],
|
|
9
|
+
cleared_count: cleared ? 1 : 0,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
catch (e) {
|
|
13
|
+
return err('CLOSE_FILE_ERROR', `Failed to close ODF session: ${e instanceof Error ? e.message : String(e)}`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=close_file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close_file.js","sourceRoot":"","sources":["../../../src/tools/odf/close_file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAqB,MAAM,aAAa,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAuB,EACvB,OAAmB,EACnB,OAAgC,EAChC,SAAkC;IAElC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACvE,OAAO,EAAE,CAAC;YACR,UAAU,EAAE,WAAW;YACvB,SAAS,EAAE,OAAO,IAAI,OAAO,CAAC,YAAY;YAC1C,kBAAkB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;YAC5C,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAC/B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,kBAAkB,EAAE,gCAAgC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/G,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type OdfSession, SessionManager } from '../../session/manager.js';
|
|
2
|
+
import { type ToolResponse } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* ODF `compare_documents` — inline granularity (issue #356), TWO-FILE mode.
|
|
5
|
+
*
|
|
6
|
+
* Stateless (mirrors the DOCX `compareDocuments_tool`): it does its own loading and takes no
|
|
7
|
+
* resolved session, because two-file compare carries no `file_path` and so cannot route through
|
|
8
|
+
* `resolveOdfSessionForTool` (which requires one). Session-mode `.odt` compare routes through
|
|
9
|
+
* `dispatchOdf` to `odfCompareDocumentsSession` below.
|
|
10
|
+
*/
|
|
11
|
+
export declare function odfCompareDocuments(manager: SessionManager, params: {
|
|
12
|
+
original_file_path?: string;
|
|
13
|
+
revised_file_path?: string;
|
|
14
|
+
file_path?: string;
|
|
15
|
+
save_to_local_path?: string;
|
|
16
|
+
author?: string;
|
|
17
|
+
}): Promise<ToolResponse>;
|
|
18
|
+
/**
|
|
19
|
+
* ODF `compare_documents` — SESSION mode: redline the live session's edits against the original
|
|
20
|
+
* the session was opened from.
|
|
21
|
+
*
|
|
22
|
+
* Both the baseline and the redline package come from a FRESH archive loaded off
|
|
23
|
+
* `session.originalBuffer`, never from `session.archive`: `SessionManager.saveOdfTo` stamps the
|
|
24
|
+
* live archive's `content.xml` with the edited state on every save (so it is not a valid baseline
|
|
25
|
+
* source), and writing redline markup into it would poison the session. The raw original
|
|
26
|
+
* `content.xml` needs no normalization as a baseline because `compareOdf` diffs per-block visible
|
|
27
|
+
* text, which a parse→serialize round-trip does not alter.
|
|
28
|
+
*
|
|
29
|
+
* Packaging the redline on the original package is valid under a CURRENT invariant: ODF session
|
|
30
|
+
* edit tools mutate `content.xml` only (the same premise `saveOdfTo` rests on). If a future ODF
|
|
31
|
+
* tool mutates non-content parts (styles.xml, manifest, …), session compare must switch to a
|
|
32
|
+
* revised-session package baseline or copy those modified parts.
|
|
33
|
+
*/
|
|
34
|
+
export declare function odfCompareDocumentsSession(manager: SessionManager, session: OdfSession, params: {
|
|
35
|
+
file_path?: string;
|
|
36
|
+
save_to_local_path?: string;
|
|
37
|
+
author?: string;
|
|
38
|
+
}, metadata: Record<string, unknown>): Promise<ToolResponse>;
|
|
39
|
+
//# sourceMappingURL=compare_documents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare_documents.d.ts","sourceRoot":"","sources":["../../../src/tools/odf/compare_documents.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAK3E,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAczD;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE;IACN,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,OAAO,CAAC,YAAY,CAAC,CA+EvB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE;IACN,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,EACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,YAAY,CAAC,CAgEvB"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import { errorCode, errorMessage } from '../../error_utils.js';
|
|
4
|
+
import { loadOdfCore } from '../../odf_loader.js';
|
|
5
|
+
import { enforceWritePathPolicy, resolvesToSamePath } from '../path_policy.js';
|
|
6
|
+
import { validateAndLoadOdfFromPath } from '../session_resolution.js';
|
|
7
|
+
import { err, ok } from '../types.js';
|
|
8
|
+
function expandPath(inputPath) {
|
|
9
|
+
return inputPath.startsWith('~') ? path.join(process.env.HOME || '', inputPath.slice(1)) : inputPath;
|
|
10
|
+
}
|
|
11
|
+
/** Default change author for ODF comparison: the env-configured AI author, else `SafeDocX`. */
|
|
12
|
+
function resolveAuthor(explicit) {
|
|
13
|
+
const trimmed = typeof explicit === 'string' ? explicit.trim() : '';
|
|
14
|
+
if (trimmed)
|
|
15
|
+
return trimmed;
|
|
16
|
+
const env = process.env.SAFE_DOCX_AI_AUTHOR;
|
|
17
|
+
return env && env.trim() ? env.trim() : 'SafeDocX';
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* ODF `compare_documents` — inline granularity (issue #356), TWO-FILE mode.
|
|
21
|
+
*
|
|
22
|
+
* Stateless (mirrors the DOCX `compareDocuments_tool`): it does its own loading and takes no
|
|
23
|
+
* resolved session, because two-file compare carries no `file_path` and so cannot route through
|
|
24
|
+
* `resolveOdfSessionForTool` (which requires one). Session-mode `.odt` compare routes through
|
|
25
|
+
* `dispatchOdf` to `odfCompareDocumentsSession` below.
|
|
26
|
+
*/
|
|
27
|
+
export async function odfCompareDocuments(manager, params) {
|
|
28
|
+
try {
|
|
29
|
+
const hasOriginal = typeof params.original_file_path === 'string' && params.original_file_path.trim().length > 0;
|
|
30
|
+
const hasRevised = typeof params.revised_file_path === 'string' && params.revised_file_path.trim().length > 0;
|
|
31
|
+
if (!hasOriginal || !hasRevised) {
|
|
32
|
+
return err('MISSING_PARAMS', 'ODF comparison requires both original_file_path and revised_file_path.', 'Provide two .odt files, or pass file_path alone to compare a session against its original.');
|
|
33
|
+
}
|
|
34
|
+
const rawSavePath = typeof params.save_to_local_path === 'string' ? params.save_to_local_path.trim() : '';
|
|
35
|
+
if (!rawSavePath) {
|
|
36
|
+
return err('MISSING_SAVE_PATH', 'compare_documents requires save_to_local_path.', 'Provide a writable .odt output path.');
|
|
37
|
+
}
|
|
38
|
+
const originalLoaded = await validateAndLoadOdfFromPath(manager, params.original_file_path);
|
|
39
|
+
if (!originalLoaded.ok)
|
|
40
|
+
return originalLoaded.response;
|
|
41
|
+
const revisedLoaded = await validateAndLoadOdfFromPath(manager, params.revised_file_path);
|
|
42
|
+
if (!revisedLoaded.ok)
|
|
43
|
+
return revisedLoaded.response;
|
|
44
|
+
// Refuse to clobber either source via the output path (parity with the DOCX tool, issue #313).
|
|
45
|
+
const savePath = expandPath(rawSavePath);
|
|
46
|
+
for (const source of [originalLoaded.normalizedPath, revisedLoaded.normalizedPath]) {
|
|
47
|
+
if (await resolvesToSamePath(savePath, source)) {
|
|
48
|
+
return err('OVERWRITE_BLOCKED', `Refusing to overwrite a source document: ${source}`, 'Choose a different save_to_local_path.');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const odf = await loadOdfCore();
|
|
52
|
+
if (!odf) {
|
|
53
|
+
return err('MISSING_DEPENDENCY', 'ODF (.odt) support requires @usejunior/odf-core.', 'Install @usejunior/odf-core to enable ODF comparison.');
|
|
54
|
+
}
|
|
55
|
+
const author = resolveAuthor(params.author);
|
|
56
|
+
const originalXml = await originalLoaded.archive.getContentXml();
|
|
57
|
+
const revisedXml = await revisedLoaded.archive.getContentXml();
|
|
58
|
+
const result = odf.compareOdf(originalXml, revisedXml, { author });
|
|
59
|
+
// Build the redline on the revised package (its styles/manifest/untouched parts are preserved).
|
|
60
|
+
const writePolicy = await enforceWritePathPolicy(savePath);
|
|
61
|
+
if (!writePolicy.ok)
|
|
62
|
+
return writePolicy.response;
|
|
63
|
+
revisedLoaded.archive.setContentXml(result.contentXml);
|
|
64
|
+
const buffer = await revisedLoaded.archive.save();
|
|
65
|
+
await fs.mkdir(path.dirname(savePath), { recursive: true });
|
|
66
|
+
await fs.writeFile(savePath, new Uint8Array(buffer));
|
|
67
|
+
return ok({
|
|
68
|
+
mode: 'two_file',
|
|
69
|
+
provider: 'odf',
|
|
70
|
+
original_file_path: originalLoaded.normalizedPath,
|
|
71
|
+
revised_file_path: revisedLoaded.normalizedPath,
|
|
72
|
+
saved_to: savePath,
|
|
73
|
+
size_bytes: buffer.length,
|
|
74
|
+
author,
|
|
75
|
+
granularity: 'inline',
|
|
76
|
+
stats: result.stats,
|
|
77
|
+
message: `Redline comparing '${originalLoaded.filename}' vs '${revisedLoaded.filename}' saved to ${savePath}. ` +
|
|
78
|
+
'Stats count changed-regions: a modified paragraph counts once in modifications with each ' +
|
|
79
|
+
'changed span inside it counted in insertions/deletions; added or removed paragraphs count one each.',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
if (String(errorCode(e) ?? '').toUpperCase() === 'EACCES') {
|
|
84
|
+
return err('PERMISSION_DENIED', `Cannot write to: ${params.save_to_local_path}`, 'Try saving to ~/Downloads/ or ~/Documents/ instead.');
|
|
85
|
+
}
|
|
86
|
+
return err('COMPARE_ERROR', `ODF comparison failed: ${errorMessage(e)}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* ODF `compare_documents` — SESSION mode: redline the live session's edits against the original
|
|
91
|
+
* the session was opened from.
|
|
92
|
+
*
|
|
93
|
+
* Both the baseline and the redline package come from a FRESH archive loaded off
|
|
94
|
+
* `session.originalBuffer`, never from `session.archive`: `SessionManager.saveOdfTo` stamps the
|
|
95
|
+
* live archive's `content.xml` with the edited state on every save (so it is not a valid baseline
|
|
96
|
+
* source), and writing redline markup into it would poison the session. The raw original
|
|
97
|
+
* `content.xml` needs no normalization as a baseline because `compareOdf` diffs per-block visible
|
|
98
|
+
* text, which a parse→serialize round-trip does not alter.
|
|
99
|
+
*
|
|
100
|
+
* Packaging the redline on the original package is valid under a CURRENT invariant: ODF session
|
|
101
|
+
* edit tools mutate `content.xml` only (the same premise `saveOdfTo` rests on). If a future ODF
|
|
102
|
+
* tool mutates non-content parts (styles.xml, manifest, …), session compare must switch to a
|
|
103
|
+
* revised-session package baseline or copy those modified parts.
|
|
104
|
+
*/
|
|
105
|
+
export async function odfCompareDocumentsSession(manager, session, params, metadata) {
|
|
106
|
+
try {
|
|
107
|
+
const rawSavePath = typeof params.save_to_local_path === 'string' ? params.save_to_local_path.trim() : '';
|
|
108
|
+
if (!rawSavePath) {
|
|
109
|
+
return err('MISSING_SAVE_PATH', 'compare_documents requires save_to_local_path.', 'Provide a writable .odt output path.');
|
|
110
|
+
}
|
|
111
|
+
// Refuse to clobber the comparison input via the output path (parity with two-file mode and
|
|
112
|
+
// the DOCX tool, issue #313). No allow_overwrite escape: the original is an input here.
|
|
113
|
+
const savePath = expandPath(rawSavePath);
|
|
114
|
+
if (await resolvesToSamePath(savePath, session.originalPath)) {
|
|
115
|
+
return err('OVERWRITE_BLOCKED', `Refusing to overwrite a source document: ${manager.normalizePath(session.originalPath)}`, 'Choose a different save_to_local_path.');
|
|
116
|
+
}
|
|
117
|
+
const odf = await loadOdfCore();
|
|
118
|
+
if (!odf) {
|
|
119
|
+
return err('MISSING_DEPENDENCY', 'ODF (.odt) support requires @usejunior/odf-core.', 'Install @usejunior/odf-core to enable ODF comparison.');
|
|
120
|
+
}
|
|
121
|
+
const author = resolveAuthor(params.author);
|
|
122
|
+
const originalArchive = await odf.OdfArchive.load(session.originalBuffer);
|
|
123
|
+
const originalXml = await originalArchive.getContentXml();
|
|
124
|
+
const revisedXml = session.doc.toXml();
|
|
125
|
+
const result = odf.compareOdf(originalXml, revisedXml, { author });
|
|
126
|
+
const writePolicy = await enforceWritePathPolicy(savePath);
|
|
127
|
+
if (!writePolicy.ok)
|
|
128
|
+
return writePolicy.response;
|
|
129
|
+
originalArchive.setContentXml(result.contentXml);
|
|
130
|
+
const buffer = await originalArchive.save();
|
|
131
|
+
await fs.mkdir(path.dirname(savePath), { recursive: true });
|
|
132
|
+
await fs.writeFile(savePath, new Uint8Array(buffer));
|
|
133
|
+
manager.touch(session);
|
|
134
|
+
return ok({
|
|
135
|
+
mode: 'session',
|
|
136
|
+
provider: 'odf',
|
|
137
|
+
original_file_path: manager.normalizePath(session.originalPath),
|
|
138
|
+
saved_to: savePath,
|
|
139
|
+
size_bytes: buffer.length,
|
|
140
|
+
author,
|
|
141
|
+
granularity: 'inline',
|
|
142
|
+
stats: result.stats,
|
|
143
|
+
message: `Redline of session edits to '${session.filename}' saved to ${savePath}. ` +
|
|
144
|
+
'Stats count changed-regions: a modified paragraph counts once in modifications with each ' +
|
|
145
|
+
'changed span inside it counted in insertions/deletions; added or removed paragraphs count one each.',
|
|
146
|
+
...metadata,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
catch (e) {
|
|
150
|
+
if (String(errorCode(e) ?? '').toUpperCase() === 'EACCES') {
|
|
151
|
+
return err('PERMISSION_DENIED', `Cannot write to: ${params.save_to_local_path}`, 'Try saving to ~/Downloads/ or ~/Documents/ instead.');
|
|
152
|
+
}
|
|
153
|
+
return err('COMPARE_ERROR', `ODF comparison failed: ${errorMessage(e)}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=compare_documents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare_documents.js","sourceRoot":"","sources":["../../../src/tools/odf/compare_documents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type OdfSession, SessionManager } from '../../session/manager.js';
|
|
2
|
+
import { type ToolResponse } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* ODF (.odt) `get_comments`. Walks `content.xml` for `office:annotation` elements and returns them
|
|
5
|
+
* in document order in the same shape as the DOCX tool. ODF has no reply graph, so `replies` is
|
|
6
|
+
* always empty.
|
|
7
|
+
*/
|
|
8
|
+
export declare function odfGetComments(_manager: SessionManager, session: OdfSession, _params: {
|
|
9
|
+
file_path?: string;
|
|
10
|
+
}, metadata: Record<string, unknown>): Promise<ToolResponse>;
|
|
11
|
+
//# sourceMappingURL=get_comments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get_comments.d.ts","sourceRoot":"","sources":["../../../src/tools/odf/get_comments.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAYzD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,YAAY,CAAC,CA6BvB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { errorMessage } from '../../error_utils.js';
|
|
2
|
+
import { err, ok } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* ODF (.odt) `get_comments`. Walks `content.xml` for `office:annotation` elements and returns them
|
|
5
|
+
* in document order in the same shape as the DOCX tool. ODF has no reply graph, so `replies` is
|
|
6
|
+
* always empty.
|
|
7
|
+
*/
|
|
8
|
+
export async function odfGetComments(_manager, session, _params, metadata) {
|
|
9
|
+
try {
|
|
10
|
+
const comments = session.doc.getComments();
|
|
11
|
+
const mapped = comments.map((c) => ({
|
|
12
|
+
id: c.id,
|
|
13
|
+
author: c.author,
|
|
14
|
+
date: c.date || null,
|
|
15
|
+
initials: c.initials,
|
|
16
|
+
text: c.text,
|
|
17
|
+
anchored_paragraph_id: c.anchoredParagraphId,
|
|
18
|
+
replies: [],
|
|
19
|
+
}));
|
|
20
|
+
return ok({
|
|
21
|
+
success: true,
|
|
22
|
+
comments: mapped,
|
|
23
|
+
provider: 'odf',
|
|
24
|
+
file_path: session.originalPath,
|
|
25
|
+
...metadata,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
return err('COMMENT_ERROR', `Failed to read comments from ODF document: ${errorMessage(e)}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=get_comments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get_comments.js","sourceRoot":"","sources":["../../../src/tools/odf/get_comments.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,GAAG,EAAE,EAAE,EAAqB,MAAM,aAAa,CAAC;AAYzD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAwB,EACxB,OAAmB,EACnB,OAA+B,EAC/B,QAAiC;IAEjC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAOtC,CAAC;QACH,MAAM,MAAM,GAAiB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChD,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,qBAAqB,EAAE,CAAC,CAAC,mBAAmB;YAC5C,OAAO,EAAE,EAAE;SACZ,CAAC,CAAC,CAAC;QACJ,OAAO,EAAE,CAAC;YACR,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,OAAO,CAAC,YAAY;YAC/B,GAAG,QAAQ;SACZ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,eAAe,EAAE,8CAA8C,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type OdfSession, SessionManager } from '../../session/manager.js';
|
|
2
|
+
import { type ToolResponse } from '../types.js';
|
|
3
|
+
export declare function odfGetFileStatus(_manager: SessionManager, session: OdfSession, _params: Record<string, unknown>, metadata: Record<string, unknown>): Promise<ToolResponse>;
|
|
4
|
+
//# sourceMappingURL=get_file_status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get_file_status.d.ts","sourceRoot":"","sources":["../../../src/tools/odf/get_file_status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,YAAY,CAAC,CAwBvB"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { err, ok } from '../types.js';
|
|
2
|
+
export async function odfGetFileStatus(_manager, session, _params, metadata) {
|
|
3
|
+
try {
|
|
4
|
+
return ok({
|
|
5
|
+
file_path: session.originalPath,
|
|
6
|
+
provider: 'odf',
|
|
7
|
+
created_at: session.createdAt.toISOString(),
|
|
8
|
+
expires_at: session.expiresAt.toISOString(),
|
|
9
|
+
last_activity: session.lastAccessedAt.toISOString(),
|
|
10
|
+
edit_count: session.editCount,
|
|
11
|
+
edit_revision: session.editRevision,
|
|
12
|
+
document: {
|
|
13
|
+
filename: session.filename,
|
|
14
|
+
paragraphs: session.doc.getParagraphs().length,
|
|
15
|
+
},
|
|
16
|
+
save_defaults: {
|
|
17
|
+
default_save_format: 'odt',
|
|
18
|
+
returned_variants: ['odt'],
|
|
19
|
+
supports_variant_override: false,
|
|
20
|
+
},
|
|
21
|
+
...metadata,
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
catch (e) {
|
|
25
|
+
return err('STATUS_ERROR', e instanceof Error ? e.message : String(e));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=get_file_status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get_file_status.js","sourceRoot":"","sources":["../../../src/tools/odf/get_file_status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,EAAE,EAAqB,MAAM,aAAa,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAwB,EACxB,OAAmB,EACnB,OAAgC,EAChC,QAAiC;IAEjC,IAAI,CAAC;QACH,OAAO,EAAE,CAAC;YACR,SAAS,EAAE,OAAO,CAAC,YAAY;YAC/B,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;YAC3C,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,WAAW,EAAE;YAC3C,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,WAAW,EAAE;YACnD,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,aAAa,EAAE,OAAO,CAAC,YAAY;YACnC,QAAQ,EAAE;gBACR,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,MAAM;aAC/C;YACD,aAAa,EAAE;gBACb,mBAAmB,EAAE,KAAK;gBAC1B,iBAAiB,EAAE,CAAC,KAAK,CAAC;gBAC1B,yBAAyB,EAAE,KAAK;aACjC;YACD,GAAG,QAAQ;SACZ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,cAAc,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type OdfSession, SessionManager } from '../../session/manager.js';
|
|
2
|
+
import { type ToolResponse } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* ODF (.odt) `grep`. Session-mode only — the dispatcher resolves the ODF session by
|
|
5
|
+
* `.odt` `file_path` before calling here (multi-file `file_paths` stays on the DOCX
|
|
6
|
+
* lane). ODF paragraphs carry no list-label / header context, so those fields are
|
|
7
|
+
* empty. Output shape mirrors the DOCX grep session response.
|
|
8
|
+
*/
|
|
9
|
+
export declare function odfGrep(manager: SessionManager, session: OdfSession, params: {
|
|
10
|
+
patterns?: string[];
|
|
11
|
+
pattern?: string;
|
|
12
|
+
case_sensitive?: boolean;
|
|
13
|
+
whole_word?: boolean;
|
|
14
|
+
max_results?: number;
|
|
15
|
+
context_chars?: number;
|
|
16
|
+
dedupe_by_paragraph?: boolean;
|
|
17
|
+
search_xml?: boolean;
|
|
18
|
+
}, metadata: Record<string, unknown>): Promise<ToolResponse>;
|
|
19
|
+
//# sourceMappingURL=grep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../../src/tools/odf/grep.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAGzD;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE;IACN,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,EACD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,YAAY,CAAC,CAkFvB"}
|