@usejunior/docx-mcp 0.9.0 → 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.
Files changed (143) hide show
  1. package/README.md +46 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/cli/commands/edit.d.ts.map +1 -1
  4. package/dist/cli/commands/edit.js +2 -1
  5. package/dist/cli/commands/edit.js.map +1 -1
  6. package/dist/cli/commands/grep.d.ts.map +1 -1
  7. package/dist/cli/commands/grep.js +2 -1
  8. package/dist/cli/commands/grep.js.map +1 -1
  9. package/dist/cli/tool_runner.d.ts +6 -0
  10. package/dist/cli/tool_runner.d.ts.map +1 -1
  11. package/dist/cli/tool_runner.js +10 -1
  12. package/dist/cli/tool_runner.js.map +1 -1
  13. package/dist/odf_loader.d.ts +2 -0
  14. package/dist/odf_loader.d.ts.map +1 -0
  15. package/dist/odf_loader.js +19 -0
  16. package/dist/odf_loader.js.map +1 -0
  17. package/dist/server.d.ts +5 -2
  18. package/dist/server.d.ts.map +1 -1
  19. package/dist/server.js +110 -4
  20. package/dist/server.js.map +1 -1
  21. package/dist/session/manager.d.ts +44 -2
  22. package/dist/session/manager.d.ts.map +1 -1
  23. package/dist/session/manager.js +212 -2
  24. package/dist/session/manager.js.map +1 -1
  25. package/dist/tool_catalog.d.ts +40 -12
  26. package/dist/tool_catalog.d.ts.map +1 -1
  27. package/dist/tool_catalog.js +49 -17
  28. package/dist/tool_catalog.js.map +1 -1
  29. package/dist/tools/accept_changes.js +1 -1
  30. package/dist/tools/accept_changes.js.map +1 -1
  31. package/dist/tools/add_comment.d.ts.map +1 -1
  32. package/dist/tools/add_comment.js +4 -2
  33. package/dist/tools/add_comment.js.map +1 -1
  34. package/dist/tools/add_footnote.d.ts.map +1 -1
  35. package/dist/tools/add_footnote.js +3 -1
  36. package/dist/tools/add_footnote.js.map +1 -1
  37. package/dist/tools/apply_plan.d.ts.map +1 -1
  38. package/dist/tools/apply_plan.js +6 -4
  39. package/dist/tools/apply_plan.js.map +1 -1
  40. package/dist/tools/clear_formatting.d.ts +2 -1
  41. package/dist/tools/clear_formatting.d.ts.map +1 -1
  42. package/dist/tools/clear_formatting.js +62 -49
  43. package/dist/tools/clear_formatting.js.map +1 -1
  44. package/dist/tools/compare_documents.d.ts.map +1 -1
  45. package/dist/tools/compare_documents.js +11 -2
  46. package/dist/tools/compare_documents.js.map +1 -1
  47. package/dist/tools/delete_comment.d.ts.map +1 -1
  48. package/dist/tools/delete_comment.js +3 -1
  49. package/dist/tools/delete_comment.js.map +1 -1
  50. package/dist/tools/delete_footnote.d.ts.map +1 -1
  51. package/dist/tools/delete_footnote.js +3 -1
  52. package/dist/tools/delete_footnote.js.map +1 -1
  53. package/dist/tools/export.d.ts +20 -0
  54. package/dist/tools/export.d.ts.map +1 -0
  55. package/dist/tools/export.js +96 -0
  56. package/dist/tools/export.js.map +1 -0
  57. package/dist/tools/format_layout.d.ts.map +1 -1
  58. package/dist/tools/format_layout.js +5 -3
  59. package/dist/tools/format_layout.js.map +1 -1
  60. package/dist/tools/grep.d.ts.map +1 -1
  61. package/dist/tools/grep.js +4 -115
  62. package/dist/tools/grep.js.map +1 -1
  63. package/dist/tools/grep_core.d.ts +49 -0
  64. package/dist/tools/grep_core.d.ts.map +1 -0
  65. package/dist/tools/grep_core.js +126 -0
  66. package/dist/tools/grep_core.js.map +1 -0
  67. package/dist/tools/insert_paragraph.d.ts +2 -1
  68. package/dist/tools/insert_paragraph.d.ts.map +1 -1
  69. package/dist/tools/insert_paragraph.js +4 -2
  70. package/dist/tools/insert_paragraph.js.map +1 -1
  71. package/dist/tools/odf/add_comment.d.ts +21 -0
  72. package/dist/tools/odf/add_comment.d.ts.map +1 -0
  73. package/dist/tools/odf/add_comment.js +64 -0
  74. package/dist/tools/odf/add_comment.js.map +1 -0
  75. package/dist/tools/odf/close_file.d.ts +4 -0
  76. package/dist/tools/odf/close_file.d.ts.map +1 -0
  77. package/dist/tools/odf/close_file.js +16 -0
  78. package/dist/tools/odf/close_file.js.map +1 -0
  79. package/dist/tools/odf/compare_documents.d.ts +39 -0
  80. package/dist/tools/odf/compare_documents.d.ts.map +1 -0
  81. package/dist/tools/odf/compare_documents.js +156 -0
  82. package/dist/tools/odf/compare_documents.js.map +1 -0
  83. package/dist/tools/odf/get_comments.d.ts +11 -0
  84. package/dist/tools/odf/get_comments.d.ts.map +1 -0
  85. package/dist/tools/odf/get_comments.js +32 -0
  86. package/dist/tools/odf/get_comments.js.map +1 -0
  87. package/dist/tools/odf/get_file_status.d.ts +4 -0
  88. package/dist/tools/odf/get_file_status.d.ts.map +1 -0
  89. package/dist/tools/odf/get_file_status.js +28 -0
  90. package/dist/tools/odf/get_file_status.js.map +1 -0
  91. package/dist/tools/odf/grep.d.ts +19 -0
  92. package/dist/tools/odf/grep.d.ts.map +1 -0
  93. package/dist/tools/odf/grep.js +81 -0
  94. package/dist/tools/odf/grep.js.map +1 -0
  95. package/dist/tools/odf/insert_paragraph.d.ts +19 -0
  96. package/dist/tools/odf/insert_paragraph.d.ts.map +1 -0
  97. package/dist/tools/odf/insert_paragraph.js +50 -0
  98. package/dist/tools/odf/insert_paragraph.js.map +1 -0
  99. package/dist/tools/odf/read_file.d.ts +9 -0
  100. package/dist/tools/odf/read_file.d.ts.map +1 -0
  101. package/dist/tools/odf/read_file.js +124 -0
  102. package/dist/tools/odf/read_file.js.map +1 -0
  103. package/dist/tools/odf/replace_text.d.ts +9 -0
  104. package/dist/tools/odf/replace_text.d.ts.map +1 -0
  105. package/dist/tools/odf/replace_text.js +41 -0
  106. package/dist/tools/odf/replace_text.js.map +1 -0
  107. package/dist/tools/odf/save.d.ts +7 -0
  108. package/dist/tools/odf/save.d.ts.map +1 -0
  109. package/dist/tools/odf/save.js +48 -0
  110. package/dist/tools/odf/save.js.map +1 -0
  111. package/dist/tools/open_document.d.ts.map +1 -1
  112. package/dist/tools/open_document.js +39 -3
  113. package/dist/tools/open_document.js.map +1 -1
  114. package/dist/tools/path_policy.d.ts +9 -0
  115. package/dist/tools/path_policy.d.ts.map +1 -1
  116. package/dist/tools/path_policy.js +66 -5
  117. package/dist/tools/path_policy.js.map +1 -1
  118. package/dist/tools/provider_guard.d.ts +1 -0
  119. package/dist/tools/provider_guard.d.ts.map +1 -1
  120. package/dist/tools/provider_guard.js +10 -0
  121. package/dist/tools/provider_guard.js.map +1 -1
  122. package/dist/tools/read_file.d.ts +2 -0
  123. package/dist/tools/read_file.d.ts.map +1 -1
  124. package/dist/tools/read_file.js +370 -31
  125. package/dist/tools/read_file.js.map +1 -1
  126. package/dist/tools/replace_text.d.ts +2 -1
  127. package/dist/tools/replace_text.d.ts.map +1 -1
  128. package/dist/tools/replace_text.js +26 -5
  129. package/dist/tools/replace_text.js.map +1 -1
  130. package/dist/tools/save.d.ts.map +1 -1
  131. package/dist/tools/save.js +55 -8
  132. package/dist/tools/save.js.map +1 -1
  133. package/dist/tools/session_resolution.d.ts +25 -1
  134. package/dist/tools/session_resolution.d.ts.map +1 -1
  135. package/dist/tools/session_resolution.js +179 -2
  136. package/dist/tools/session_resolution.js.map +1 -1
  137. package/dist/tools/tag_parser.d.ts.map +1 -1
  138. package/dist/tools/tag_parser.js +69 -14
  139. package/dist/tools/tag_parser.js.map +1 -1
  140. package/dist/tools/update_footnote.d.ts.map +1 -1
  141. package/dist/tools/update_footnote.js +3 -1
  142. package/dist/tools/update_footnote.js.map +1 -1
  143. package/package.json +18 -13
@@ -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,CA6DvB"}
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"}
@@ -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 },
@@ -37,8 +38,12 @@ export async function openDocument(manager, params) {
37
38
  if (!stat || !stat.isFile()) {
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
- if (path.extname(expanded).toLowerCase() !== '.docx') {
41
- return err('INVALID_FILE_TYPE', `Invalid file type: ${path.extname(expanded)}`, 'Only .docx files are supported.');
41
+ const extension = path.extname(expanded).toLowerCase();
42
+ if (extension !== '.docx' && extension !== '.odt') {
43
+ const hint = extension === '.dotx'
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.';
46
+ return err('INVALID_FILE_TYPE', `Invalid file type: ${extension}`, hint);
42
47
  }
43
48
  const policy = await enforceReadPathPolicy(filePath);
44
49
  if (!policy.ok)
@@ -46,7 +51,38 @@ export async function openDocument(manager, params) {
46
51
  const safePath = policy.normalizedPath;
47
52
  const content = await fs.readFile(safePath);
48
53
  if (content.length > 50 * 1024 * 1024) {
49
- 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
+ });
50
86
  }
51
87
  const archiveGuard = await validateDocxArchiveSafety(content);
52
88
  if (!archiveGuard.ok)
@@ -1 +1 @@
1
- {"version":3,"file":"open_document.js","sourceRoot":"","sources":["../../src/tools/open_document.ts"],"names":[],"mappings":"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"}
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;AA8EN,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"}
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"}