@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.
Files changed (160) hide show
  1. package/LICENSE +202 -21
  2. package/NOTICE +2 -0
  3. package/README.md +47 -2
  4. package/dist/.tsbuildinfo +1 -1
  5. package/dist/cli/commands/edit.d.ts.map +1 -1
  6. package/dist/cli/commands/edit.js +2 -1
  7. package/dist/cli/commands/edit.js.map +1 -1
  8. package/dist/cli/commands/grep.d.ts.map +1 -1
  9. package/dist/cli/commands/grep.js +2 -1
  10. package/dist/cli/commands/grep.js.map +1 -1
  11. package/dist/cli/help.d.ts.map +1 -1
  12. package/dist/cli/help.js +1 -0
  13. package/dist/cli/help.js.map +1 -1
  14. package/dist/cli/tool_runner.d.ts +6 -0
  15. package/dist/cli/tool_runner.d.ts.map +1 -1
  16. package/dist/cli/tool_runner.js +10 -1
  17. package/dist/cli/tool_runner.js.map +1 -1
  18. package/dist/odf_loader.d.ts +2 -0
  19. package/dist/odf_loader.d.ts.map +1 -0
  20. package/dist/odf_loader.js +20 -0
  21. package/dist/odf_loader.js.map +1 -0
  22. package/dist/server.d.ts +8 -2
  23. package/dist/server.d.ts.map +1 -1
  24. package/dist/server.js +113 -4
  25. package/dist/server.js.map +1 -1
  26. package/dist/session/manager.d.ts +48 -2
  27. package/dist/session/manager.d.ts.map +1 -1
  28. package/dist/session/manager.js +175 -7
  29. package/dist/session/manager.js.map +1 -1
  30. package/dist/tool_catalog.d.ts +56 -12
  31. package/dist/tool_catalog.d.ts.map +1 -1
  32. package/dist/tool_catalog.js +69 -17
  33. package/dist/tool_catalog.js.map +1 -1
  34. package/dist/tools/accept_changes.js +1 -1
  35. package/dist/tools/accept_changes.js.map +1 -1
  36. package/dist/tools/add_comment.d.ts.map +1 -1
  37. package/dist/tools/add_comment.js +21 -5
  38. package/dist/tools/add_comment.js.map +1 -1
  39. package/dist/tools/add_footnote.d.ts.map +1 -1
  40. package/dist/tools/add_footnote.js +15 -3
  41. package/dist/tools/add_footnote.js.map +1 -1
  42. package/dist/tools/ai_revision_guard.d.ts +38 -0
  43. package/dist/tools/ai_revision_guard.d.ts.map +1 -0
  44. package/dist/tools/ai_revision_guard.js +115 -0
  45. package/dist/tools/ai_revision_guard.js.map +1 -0
  46. package/dist/tools/apply_plan.d.ts.map +1 -1
  47. package/dist/tools/apply_plan.js +55 -5
  48. package/dist/tools/apply_plan.js.map +1 -1
  49. package/dist/tools/clear_formatting.d.ts +2 -1
  50. package/dist/tools/clear_formatting.d.ts.map +1 -1
  51. package/dist/tools/clear_formatting.js +84 -61
  52. package/dist/tools/clear_formatting.js.map +1 -1
  53. package/dist/tools/compare_documents.d.ts.map +1 -1
  54. package/dist/tools/compare_documents.js +11 -2
  55. package/dist/tools/compare_documents.js.map +1 -1
  56. package/dist/tools/convert_to_odt.d.ts +20 -0
  57. package/dist/tools/convert_to_odt.d.ts.map +1 -0
  58. package/dist/tools/convert_to_odt.js +74 -0
  59. package/dist/tools/convert_to_odt.js.map +1 -0
  60. package/dist/tools/delete_comment.d.ts.map +1 -1
  61. package/dist/tools/delete_comment.js +12 -1
  62. package/dist/tools/delete_comment.js.map +1 -1
  63. package/dist/tools/delete_footnote.d.ts.map +1 -1
  64. package/dist/tools/delete_footnote.js +12 -1
  65. package/dist/tools/delete_footnote.js.map +1 -1
  66. package/dist/tools/export.d.ts +20 -0
  67. package/dist/tools/export.d.ts.map +1 -0
  68. package/dist/tools/export.js +96 -0
  69. package/dist/tools/export.js.map +1 -0
  70. package/dist/tools/format_layout.d.ts.map +1 -1
  71. package/dist/tools/format_layout.js +21 -3
  72. package/dist/tools/format_layout.js.map +1 -1
  73. package/dist/tools/get_comments.d.ts.map +1 -1
  74. package/dist/tools/get_comments.js +9 -0
  75. package/dist/tools/get_comments.js.map +1 -1
  76. package/dist/tools/grep.d.ts.map +1 -1
  77. package/dist/tools/grep.js +4 -115
  78. package/dist/tools/grep.js.map +1 -1
  79. package/dist/tools/grep_core.d.ts +49 -0
  80. package/dist/tools/grep_core.d.ts.map +1 -0
  81. package/dist/tools/grep_core.js +126 -0
  82. package/dist/tools/grep_core.js.map +1 -0
  83. package/dist/tools/insert_paragraph.d.ts +7 -1
  84. package/dist/tools/insert_paragraph.d.ts.map +1 -1
  85. package/dist/tools/insert_paragraph.js +39 -27
  86. package/dist/tools/insert_paragraph.js.map +1 -1
  87. package/dist/tools/odf/add_comment.d.ts +21 -0
  88. package/dist/tools/odf/add_comment.d.ts.map +1 -0
  89. package/dist/tools/odf/add_comment.js +64 -0
  90. package/dist/tools/odf/add_comment.js.map +1 -0
  91. package/dist/tools/odf/close_file.d.ts +4 -0
  92. package/dist/tools/odf/close_file.d.ts.map +1 -0
  93. package/dist/tools/odf/close_file.js +16 -0
  94. package/dist/tools/odf/close_file.js.map +1 -0
  95. package/dist/tools/odf/compare_documents.d.ts +39 -0
  96. package/dist/tools/odf/compare_documents.d.ts.map +1 -0
  97. package/dist/tools/odf/compare_documents.js +156 -0
  98. package/dist/tools/odf/compare_documents.js.map +1 -0
  99. package/dist/tools/odf/get_comments.d.ts +11 -0
  100. package/dist/tools/odf/get_comments.d.ts.map +1 -0
  101. package/dist/tools/odf/get_comments.js +32 -0
  102. package/dist/tools/odf/get_comments.js.map +1 -0
  103. package/dist/tools/odf/get_file_status.d.ts +4 -0
  104. package/dist/tools/odf/get_file_status.d.ts.map +1 -0
  105. package/dist/tools/odf/get_file_status.js +28 -0
  106. package/dist/tools/odf/get_file_status.js.map +1 -0
  107. package/dist/tools/odf/grep.d.ts +19 -0
  108. package/dist/tools/odf/grep.d.ts.map +1 -0
  109. package/dist/tools/odf/grep.js +81 -0
  110. package/dist/tools/odf/grep.js.map +1 -0
  111. package/dist/tools/odf/insert_paragraph.d.ts +19 -0
  112. package/dist/tools/odf/insert_paragraph.d.ts.map +1 -0
  113. package/dist/tools/odf/insert_paragraph.js +50 -0
  114. package/dist/tools/odf/insert_paragraph.js.map +1 -0
  115. package/dist/tools/odf/read_file.d.ts +9 -0
  116. package/dist/tools/odf/read_file.d.ts.map +1 -0
  117. package/dist/tools/odf/read_file.js +124 -0
  118. package/dist/tools/odf/read_file.js.map +1 -0
  119. package/dist/tools/odf/replace_text.d.ts +9 -0
  120. package/dist/tools/odf/replace_text.d.ts.map +1 -0
  121. package/dist/tools/odf/replace_text.js +41 -0
  122. package/dist/tools/odf/replace_text.js.map +1 -0
  123. package/dist/tools/odf/save.d.ts +7 -0
  124. package/dist/tools/odf/save.d.ts.map +1 -0
  125. package/dist/tools/odf/save.js +48 -0
  126. package/dist/tools/odf/save.js.map +1 -0
  127. package/dist/tools/open_document.d.ts.map +1 -1
  128. package/dist/tools/open_document.js +36 -4
  129. package/dist/tools/open_document.js.map +1 -1
  130. package/dist/tools/path_policy.d.ts +9 -0
  131. package/dist/tools/path_policy.d.ts.map +1 -1
  132. package/dist/tools/path_policy.js +66 -5
  133. package/dist/tools/path_policy.js.map +1 -1
  134. package/dist/tools/provider_guard.d.ts +1 -0
  135. package/dist/tools/provider_guard.d.ts.map +1 -1
  136. package/dist/tools/provider_guard.js +10 -0
  137. package/dist/tools/provider_guard.js.map +1 -1
  138. package/dist/tools/read_file.d.ts +3 -0
  139. package/dist/tools/read_file.d.ts.map +1 -1
  140. package/dist/tools/read_file.js +384 -52
  141. package/dist/tools/read_file.js.map +1 -1
  142. package/dist/tools/replace_text.d.ts +7 -1
  143. package/dist/tools/replace_text.d.ts.map +1 -1
  144. package/dist/tools/replace_text.js +74 -48
  145. package/dist/tools/replace_text.js.map +1 -1
  146. package/dist/tools/save.d.ts +19 -0
  147. package/dist/tools/save.d.ts.map +1 -1
  148. package/dist/tools/save.js +161 -13
  149. package/dist/tools/save.js.map +1 -1
  150. package/dist/tools/session_resolution.d.ts +25 -1
  151. package/dist/tools/session_resolution.d.ts.map +1 -1
  152. package/dist/tools/session_resolution.js +179 -2
  153. package/dist/tools/session_resolution.js.map +1 -1
  154. package/dist/tools/tag_parser.d.ts.map +1 -1
  155. package/dist/tools/tag_parser.js +69 -14
  156. package/dist/tools/tag_parser.js.map +1 -1
  157. package/dist/tools/update_footnote.d.ts.map +1 -1
  158. package/dist/tools/update_footnote.js +20 -7
  159. package/dist/tools/update_footnote.js.map +1 -1
  160. package/package.json +21 -16
@@ -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"}
@@ -0,0 +1,81 @@
1
+ import { errorMessage } from '../../error_utils.js';
2
+ import { err, ok } from '../types.js';
3
+ import { searchParagraphsCore, searchRawXmlCore } from '../grep_core.js';
4
+ /**
5
+ * ODF (.odt) `grep`. Session-mode only — the dispatcher resolves the ODF session by
6
+ * `.odt` `file_path` before calling here (multi-file `file_paths` stays on the DOCX
7
+ * lane). ODF paragraphs carry no list-label / header context, so those fields are
8
+ * empty. Output shape mirrors the DOCX grep session response.
9
+ */
10
+ export async function odfGrep(manager, session, params, metadata) {
11
+ try {
12
+ let patterns = params.patterns ?? [];
13
+ if (patterns.length === 0 && typeof params.pattern === 'string') {
14
+ patterns = [params.pattern];
15
+ }
16
+ if (patterns.length === 0) {
17
+ return err('MISSING_PATTERN', 'No search patterns provided.', 'Pass patterns: ["your search term"] (array of regex strings).');
18
+ }
19
+ const caseSensitive = params.case_sensitive ?? false;
20
+ const wholeWord = params.whole_word ?? false;
21
+ const maxResults = params.max_results ?? 100;
22
+ const contextChars = params.context_chars ?? 50;
23
+ const dedupeByParagraph = params.dedupe_by_paragraph ?? true;
24
+ const searchXml = params.search_xml ?? false;
25
+ const patternStr = wholeWord ? `\\b(${patterns.join('|')})\\b` : `(${patterns.join('|')})`;
26
+ let re;
27
+ try {
28
+ re = new RegExp(patternStr, caseSensitive ? 'g' : 'gi');
29
+ }
30
+ catch (e) {
31
+ return ok({
32
+ file_path: session.originalPath,
33
+ provider: 'odf',
34
+ patterns,
35
+ total_matches: 0,
36
+ matches: [],
37
+ error: `Invalid regex pattern: ${errorMessage(e)}`,
38
+ ...metadata,
39
+ });
40
+ }
41
+ if (searchXml) {
42
+ const xmlResult = searchRawXmlCore(session.doc.toXml(), re, { maxResults, contextChars });
43
+ return ok({
44
+ file_path: session.originalPath,
45
+ provider: 'odf',
46
+ patterns,
47
+ search_xml: true,
48
+ total_matches: xmlResult.totalMatches,
49
+ matches: xmlResult.matches,
50
+ matches_returned: xmlResult.matches.length,
51
+ matches_truncated: xmlResult.matchesTruncated,
52
+ ...metadata,
53
+ });
54
+ }
55
+ const paragraphs = session.doc.getParagraphs();
56
+ const result = searchParagraphsCore(paragraphs, re, { maxResults, contextChars, dedupeByParagraph }, null);
57
+ const response = {
58
+ file_path: session.originalPath,
59
+ provider: 'odf',
60
+ patterns,
61
+ dedupe_by_paragraph: dedupeByParagraph,
62
+ total_matches: result.totalMatches,
63
+ paragraphs_with_matches: result.paragraphsWithMatches,
64
+ matches: result.matches,
65
+ matches_returned: result.matches.length,
66
+ max_results_applied: maxResults,
67
+ matches_truncated: result.matchesTruncated,
68
+ ...metadata,
69
+ };
70
+ if (result.matchesTruncated) {
71
+ response.truncation_note = dedupeByParagraph
72
+ ? 'max_results limits returned rows to matching paragraphs while total_matches counts all regex hits. Increase max_results or set dedupe_by_paragraph=false for per-match rows.'
73
+ : 'max_results limits returned rows to individual matches while total_matches counts all regex hits. Increase max_results to see more matches.';
74
+ }
75
+ return ok(response);
76
+ }
77
+ catch (e) {
78
+ return err('SEARCH_ERROR', `Failed to search ODF document: ${errorMessage(e)}`, 'Check patterns are valid regex and try again.');
79
+ }
80
+ }
81
+ //# sourceMappingURL=grep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grep.js","sourceRoot":"","sources":["../../../src/tools/odf/grep.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type OdfSession, SessionManager } from '../../session/manager.js';
2
+ import { type ToolResponse } from '../types.js';
3
+ /**
4
+ * ODF (.odt) `insert_paragraph`. Inserts plain-text paragraph(s) BEFORE/AFTER an anchor.
5
+ * `new_string` is split on blank lines into separate paragraphs; single newlines become
6
+ * line breaks (parity with the DOCX tool). DOCX run-formatting tags are not yet supported
7
+ * for ODF and are stripped.
8
+ *
9
+ * IMPORTANT: ODF paragraph IDs are positional ordinals, so inserting shifts every ID at or
10
+ * after the insertion point. The response carries machine-actionable invalidation fields so
11
+ * the agent re-reads before its next edit.
12
+ */
13
+ export declare function odfInsertParagraph(manager: SessionManager, session: OdfSession, params: {
14
+ positional_anchor_node_id: string;
15
+ new_string: string;
16
+ instruction: string;
17
+ position?: string;
18
+ }, metadata: Record<string, unknown>): Promise<ToolResponse>;
19
+ //# sourceMappingURL=insert_paragraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert_paragraph.d.ts","sourceRoot":"","sources":["../../../src/tools/odf/insert_paragraph.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG3E,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE;IAAE,yBAAyB,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EACzG,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,YAAY,CAAC,CAqCvB"}
@@ -0,0 +1,50 @@
1
+ import { stripAllInlineTags } from '@usejunior/docx-core';
2
+ import { errorMessage } from '../../error_utils.js';
3
+ import { RESULT_PREVIEW_CHARS, previewText } from '../preview.js';
4
+ import { err, ok } from '../types.js';
5
+ /**
6
+ * ODF (.odt) `insert_paragraph`. Inserts plain-text paragraph(s) BEFORE/AFTER an anchor.
7
+ * `new_string` is split on blank lines into separate paragraphs; single newlines become
8
+ * line breaks (parity with the DOCX tool). DOCX run-formatting tags are not yet supported
9
+ * for ODF and are stripped.
10
+ *
11
+ * IMPORTANT: ODF paragraph IDs are positional ordinals, so inserting shifts every ID at or
12
+ * after the insertion point. The response carries machine-actionable invalidation fields so
13
+ * the agent re-reads before its next edit.
14
+ */
15
+ export async function odfInsertParagraph(manager, session, params, metadata) {
16
+ try {
17
+ const anchorId = params.positional_anchor_node_id;
18
+ const positionUpper = (params.position ?? 'AFTER').toUpperCase();
19
+ if (positionUpper !== 'BEFORE' && positionUpper !== 'AFTER') {
20
+ return err('INVALID_POSITION', `Invalid position: ${params.position}. Must be 'BEFORE' or 'AFTER'.`);
21
+ }
22
+ const text = stripAllInlineTags(params.new_string ?? '');
23
+ const result = session.doc.insertParagraph(anchorId, text, positionUpper);
24
+ if (!result.ok) {
25
+ return err(result.code, result.message);
26
+ }
27
+ manager.markEdited(session);
28
+ const newIds = result.newIds;
29
+ return ok({
30
+ success: true,
31
+ file_path: session.originalPath,
32
+ provider: 'odf',
33
+ edit_count: session.editCount,
34
+ anchor_paragraph_id: anchorId,
35
+ new_paragraph_id: newIds[0] ?? null,
36
+ new_paragraph_ids: newIds,
37
+ position: positionUpper,
38
+ inserted_text: previewText(text, RESULT_PREVIEW_CHARS),
39
+ // ODF IDs are positional; everything at/after the insertion point has shifted.
40
+ invalidates_paragraph_ids_after: anchorId,
41
+ requires_reread_before_next_edit: true,
42
+ ids_note: 'ODF paragraph IDs are positional and have shifted after this insertion. Call read_file or grep again to get current IDs before your next edit.',
43
+ ...metadata,
44
+ });
45
+ }
46
+ catch (e) {
47
+ return err('INSERT_ERROR', `Failed to insert paragraph into ODF document: ${errorMessage(e)}`);
48
+ }
49
+ }
50
+ //# sourceMappingURL=insert_paragraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert_paragraph.js","sourceRoot":"","sources":["../../../src/tools/odf/insert_paragraph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAqB,MAAM,aAAa,CAAC;AAEzD;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAuB,EACvB,OAAmB,EACnB,MAAyG,EACzG,QAAiC;IAEjC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,CAAC,yBAAyB,CAAC;QAClD,MAAM,aAAa,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACjE,IAAI,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,OAAO,EAAE,CAAC;YAC5D,OAAO,GAAG,CAAC,kBAAkB,EAAE,qBAAqB,MAAM,CAAC,QAAQ,gCAAgC,CAAC,CAAC;QACvG,CAAC;QAED,MAAM,IAAI,GAAG,kBAAkB,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAEzD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,aAAmC,CAAC,CAAC;QAChG,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,OAAO,EAAE,CAAC;YACR,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,OAAO,CAAC,YAAY;YAC/B,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,mBAAmB,EAAE,QAAQ;YAC7B,gBAAgB,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI;YACnC,iBAAiB,EAAE,MAAM;YACzB,QAAQ,EAAE,aAAa;YACvB,aAAa,EAAE,WAAW,CAAC,IAAI,EAAE,oBAAoB,CAAC;YACtD,+EAA+E;YAC/E,+BAA+B,EAAE,QAAQ;YACzC,gCAAgC,EAAE,IAAI;YACtC,QAAQ,EACN,gJAAgJ;YAClJ,GAAG,QAAQ;SACZ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,GAAG,CAAC,cAAc,EAAE,iDAAiD,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACjG,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { type OdfSession, SessionManager } from '../../session/manager.js';
2
+ import { type ToolResponse } from '../types.js';
3
+ export declare function odfReadFile(_manager: SessionManager, session: OdfSession, params: {
4
+ offset?: number;
5
+ limit?: number;
6
+ node_ids?: string[];
7
+ format?: string;
8
+ }, metadata: Record<string, unknown>): Promise<ToolResponse>;
9
+ //# sourceMappingURL=read_file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read_file.d.ts","sourceRoot":"","sources":["../../../src/tools/odf/read_file.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAuCzD,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EACjF,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,YAAY,CAAC,CA6DvB"}
@@ -0,0 +1,124 @@
1
+ import { formatToonDataLine, renderToon, } from '@usejunior/docx-core';
2
+ import { err, ok } from '../types.js';
3
+ import { buildPaginationMeta, DEFAULT_CONTENT_TOKEN_BUDGET, estimateTokens } from '../pagination.js';
4
+ import { READ_SIMPLE_PREVIEW_CHARS, previewText } from '../preview.js';
5
+ function odfParagraphsToDocumentViewNodes(session) {
6
+ return session.doc.getParagraphs().map((paragraph) => ({
7
+ id: paragraph.id,
8
+ list_label: '',
9
+ header: '',
10
+ style: 'body',
11
+ text: paragraph.text,
12
+ clean_text: paragraph.text,
13
+ tagged_text: paragraph.text,
14
+ list_metadata: {
15
+ list_level: -1,
16
+ label_type: null,
17
+ label_string: '',
18
+ header_text: null,
19
+ header_style: null,
20
+ header_formatting: null,
21
+ is_auto_numbered: false,
22
+ },
23
+ style_fingerprint: {
24
+ list_level: -1,
25
+ left_indent_pt: 0,
26
+ first_line_indent_pt: 0,
27
+ style_name: 'body',
28
+ alignment: 'LEFT',
29
+ },
30
+ paragraph_style_id: null,
31
+ paragraph_style_name: 'body',
32
+ paragraph_alignment: 'LEFT',
33
+ paragraph_indents_pt: { left: 0, first_line: 0 },
34
+ numbering: { num_id: null, ilvl: null, is_auto_numbered: false },
35
+ header_formatting: null,
36
+ body_run_formatting: null,
37
+ }));
38
+ }
39
+ export async function odfReadFile(_manager, session, params, metadata) {
40
+ try {
41
+ const format = (params.format ?? 'toon').toLowerCase();
42
+ if (format !== 'toon' && format !== 'json' && format !== 'simple') {
43
+ return err('INVALID_FORMAT', `Invalid format: ${params.format}`, "Use 'toon' (default), 'json', or 'simple'.");
44
+ }
45
+ const nodes = odfParagraphsToDocumentViewNodes(session);
46
+ const totalParagraphs = nodes.length;
47
+ const hasExplicitLimit = typeof params.limit === 'number';
48
+ const hasExplicitOffset = typeof params.offset === 'number';
49
+ const hasNodeIds = params.node_ids != null && params.node_ids.length > 0;
50
+ const budgetActive = !hasExplicitLimit && !hasExplicitOffset && !hasNodeIds;
51
+ let filtered = nodes;
52
+ let startIdx = 0;
53
+ if (hasNodeIds) {
54
+ const set = new Set(params.node_ids);
55
+ filtered = nodes.filter((n) => set.has(n.id));
56
+ }
57
+ else {
58
+ if (hasExplicitOffset) {
59
+ if (params.offset > 0)
60
+ startIdx = Math.max(0, params.offset - 1);
61
+ if (params.offset < 0)
62
+ startIdx = Math.max(0, totalParagraphs + params.offset);
63
+ }
64
+ const endIdx = hasExplicitLimit ? Math.min(totalParagraphs, startIdx + params.limit) : totalParagraphs;
65
+ filtered = nodes.slice(startIdx, endIdx);
66
+ }
67
+ let content;
68
+ let paragraphsReturned;
69
+ if (!budgetActive) {
70
+ if (format === 'json') {
71
+ content = JSON.stringify(filtered, null, 2);
72
+ }
73
+ else if (format === 'simple') {
74
+ content = renderSimpleOdf(filtered);
75
+ }
76
+ else {
77
+ content = renderToon(filtered);
78
+ }
79
+ paragraphsReturned = filtered.length;
80
+ }
81
+ else {
82
+ const result = renderToonWithBudgetOdf(filtered, DEFAULT_CONTENT_TOKEN_BUDGET);
83
+ content = result.content;
84
+ paragraphsReturned = result.count;
85
+ }
86
+ const paginationMeta = buildPaginationMeta(totalParagraphs, paragraphsReturned, startIdx);
87
+ return ok({
88
+ file_path: session.originalPath,
89
+ provider: 'odf',
90
+ content,
91
+ total_paragraphs: totalParagraphs,
92
+ paragraphs_returned: paragraphsReturned,
93
+ ...paginationMeta,
94
+ ...metadata,
95
+ });
96
+ }
97
+ catch (e) {
98
+ return err('READ_ERROR', e instanceof Error ? e.message : String(e), 'Check session status and try again.');
99
+ }
100
+ }
101
+ function renderSimpleOdf(nodes) {
102
+ const lines = ['#TOON id | text'];
103
+ for (const n of nodes) {
104
+ lines.push(`${n.id} | ${previewText(n.clean_text, READ_SIMPLE_PREVIEW_CHARS)}`);
105
+ }
106
+ return lines.join('\n');
107
+ }
108
+ // ODF Phase 1 flattens table cells to body paragraphs, so nodes never carry
109
+ // `table_context`. The budget renderer therefore has no table-marker handling
110
+ // (unlike the DOCX/gdocs renderers) — keeping it free of structurally-unreachable
111
+ // branches.
112
+ function renderToonWithBudgetOdf(nodes, budget) {
113
+ let accumulated = '#SCHEMA id | list_label | header | style | text';
114
+ let count = 0;
115
+ for (const node of nodes) {
116
+ const candidate = accumulated + '\n' + formatToonDataLine(node);
117
+ if (count > 0 && estimateTokens(candidate) > budget)
118
+ break;
119
+ accumulated = candidate;
120
+ count++;
121
+ }
122
+ return { content: accumulated, count };
123
+ }
124
+ //# sourceMappingURL=read_file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read_file.js","sourceRoot":"","sources":["../../../src/tools/odf/read_file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type OdfSession, SessionManager } from '../../session/manager.js';
2
+ import { type ToolResponse } from '../types.js';
3
+ export declare function odfReplaceText(manager: SessionManager, session: OdfSession, params: {
4
+ target_paragraph_id: string;
5
+ old_string: string;
6
+ new_string: string;
7
+ instruction: string;
8
+ }, metadata: Record<string, unknown>): Promise<ToolResponse>;
9
+ //# sourceMappingURL=replace_text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace_text.d.ts","sourceRoot":"","sources":["../../../src/tools/odf/replace_text.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,wBAAsB,cAAc,CAClC,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE;IAAE,mBAAmB,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACpG,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,YAAY,CAAC,CAoCvB"}
@@ -0,0 +1,41 @@
1
+ import { stripAllInlineTags } from '@usejunior/docx-core';
2
+ import { RESULT_PREVIEW_CHARS, previewText } from '../preview.js';
3
+ import { err, ok } from '../types.js';
4
+ export async function odfReplaceText(manager, session, params, metadata) {
5
+ try {
6
+ const pid = params.target_paragraph_id;
7
+ const oldStr = stripAllInlineTags(params.old_string);
8
+ const newStr = stripAllInlineTags(params.new_string);
9
+ const beforeText = session.doc.getParagraphTextById(pid);
10
+ if (beforeText === null) {
11
+ return err('ANCHOR_NOT_FOUND', `Paragraph ID ${pid} not found in document`);
12
+ }
13
+ const result = session.doc.replaceTextById(pid, oldStr, newStr);
14
+ if (!result.ok) {
15
+ return err(result.code, result.message);
16
+ }
17
+ manager.markEdited(session);
18
+ const afterText = session.doc.getParagraphTextById(pid) ?? '';
19
+ return ok({
20
+ file_path: session.originalPath,
21
+ provider: 'odf',
22
+ edit_count: session.editCount,
23
+ target_paragraph_id: pid,
24
+ replacements_made: 1,
25
+ before_text: previewText(beforeText.trim(), RESULT_PREVIEW_CHARS),
26
+ after_text: previewText(afterText.trim(), RESULT_PREVIEW_CHARS),
27
+ ...metadata,
28
+ });
29
+ }
30
+ catch (e) {
31
+ const msg = e instanceof Error ? e.message : String(e);
32
+ if (msg.includes('ANCHOR_NOT_FOUND'))
33
+ return err('ANCHOR_NOT_FOUND', msg);
34
+ if (msg.includes('TEXT_NOT_FOUND'))
35
+ return err('TEXT_NOT_FOUND', msg);
36
+ if (msg.includes('MATCH_SPANS_MULTIPLE_NODES'))
37
+ return err('MATCH_SPANS_MULTIPLE_NODES', msg);
38
+ return err('EDIT_ERROR', `Failed to edit ODF document: ${msg}`);
39
+ }
40
+ }
41
+ //# sourceMappingURL=replace_text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replace_text.js","sourceRoot":"","sources":["../../../src/tools/odf/replace_text.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAqB,MAAM,aAAa,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAuB,EACvB,OAAmB,EACnB,MAAoG,EACpG,QAAiC;IAEjC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,CAAC,mBAAmB,CAAC;QACvC,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACrD,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAErD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QACzD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC,kBAAkB,EAAE,gBAAgB,GAAG,wBAAwB,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAE5B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAE9D,OAAO,EAAE,CAAC;YACR,SAAS,EAAE,OAAO,CAAC,YAAY;YAC/B,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,OAAO,CAAC,SAAS;YAC7B,mBAAmB,EAAE,GAAG;YACxB,iBAAiB,EAAE,CAAC;YACpB,WAAW,EAAE,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,oBAAoB,CAAC;YACjE,UAAU,EAAE,WAAW,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,oBAAoB,CAAC;YAC/D,GAAG,QAAQ;SACZ,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC;YAAE,OAAO,GAAG,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;QAC1E,IAAI,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YAAE,OAAO,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;QACtE,IAAI,GAAG,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YAAE,OAAO,GAAG,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAC;QAC9F,OAAO,GAAG,CAAC,YAAY,EAAE,gCAAgC,GAAG,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { type OdfSession, SessionManager } from '../../session/manager.js';
2
+ import { type ToolResponse } from '../types.js';
3
+ export declare function odfSave(manager: SessionManager, session: OdfSession, params: {
4
+ save_to_local_path?: string;
5
+ allow_overwrite?: boolean;
6
+ }, metadata: Record<string, unknown>): Promise<ToolResponse>;
7
+ //# sourceMappingURL=save.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.d.ts","sourceRoot":"","sources":["../../../src/tools/odf/save.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG3E,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAMzD,wBAAsB,OAAO,CAC3B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE;IAAE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,OAAO,CAAA;CAAE,EAClE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,YAAY,CAAC,CA4CvB"}
@@ -0,0 +1,48 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs/promises';
3
+ import { errorCode, errorMessage } from '../../error_utils.js';
4
+ import { enforceWritePathPolicy, resolvesToSamePath } from '../path_policy.js';
5
+ import { err, ok } from '../types.js';
6
+ function expandPath(inputPath) {
7
+ return inputPath.startsWith('~') ? path.join(process.env.HOME || '', inputPath.slice(1)) : inputPath;
8
+ }
9
+ export async function odfSave(manager, session, params, metadata) {
10
+ const rawSavePath = typeof params.save_to_local_path === 'string' ? params.save_to_local_path.trim() : '';
11
+ if (!rawSavePath) {
12
+ return err('MISSING_SAVE_PATH', 'save requires save_to_local_path for ODF files.', 'Provide a writable .odt output path.');
13
+ }
14
+ try {
15
+ const savePath = expandPath(rawSavePath);
16
+ const allowOverwrite = params.allow_overwrite ?? false;
17
+ if (!allowOverwrite && await resolvesToSamePath(savePath, session.originalPath)) {
18
+ return err('OVERWRITE_BLOCKED', `Refusing to overwrite original file: ${savePath}`, 'Save to a different path, or set allow_overwrite=true if you explicitly want in-place overwrite.');
19
+ }
20
+ const writePolicy = await enforceWritePathPolicy(savePath);
21
+ if (!writePolicy.ok)
22
+ return writePolicy.response;
23
+ await fs.mkdir(path.dirname(savePath), { recursive: true });
24
+ const buffer = await manager.saveOdfTo(session, savePath);
25
+ manager.touch(session);
26
+ return ok({
27
+ file_path: manager.normalizePath(session.originalPath),
28
+ provider: 'odf',
29
+ original_filename: session.filename,
30
+ edit_count: session.editCount,
31
+ edit_revision: session.editRevision,
32
+ saved_to: savePath,
33
+ size_bytes: buffer.length,
34
+ save_format: 'odt',
35
+ returned_variants: ['odt'],
36
+ message: `ODF document saved to ${savePath}`,
37
+ ...metadata,
38
+ });
39
+ }
40
+ catch (e) {
41
+ const msg = errorMessage(e);
42
+ if (String(errorCode(e) ?? '').toUpperCase() === 'EACCES') {
43
+ return err('PERMISSION_DENIED', `Cannot write to: ${rawSavePath}`, 'Try saving to ~/Downloads/ or ~/Documents/ instead.');
44
+ }
45
+ return err('SAVE_ERROR', `Failed to save ODF document: ${msg}`, 'Check the path is valid and writable.');
46
+ }
47
+ }
48
+ //# sourceMappingURL=save.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"save.js","sourceRoot":"","sources":["../../../src/tools/odf/save.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"open_document.d.ts","sourceRoot":"","sources":["../../src/tools/open_document.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAqCxD,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1D,OAAO,CAAC,YAAY,CAAC,CAiEvB"}
1
+ {"version":3,"file":"open_document.d.ts","sourceRoot":"","sources":["../../src/tools/open_document.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAsCxD,wBAAsB,YAAY,CAChC,OAAO,EAAE,cAAc,EACvB,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAAE,GAC1D,OAAO,CAAC,YAAY,CAAC,CAsGvB"}