@usejunior/docx-mcp 0.0.1 → 0.1.1

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 (164) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +208 -28
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/cli/commands/compare.d.ts +20 -0
  5. package/dist/cli/commands/compare.d.ts.map +1 -0
  6. package/dist/cli/commands/compare.js +54 -0
  7. package/dist/cli/commands/compare.js.map +1 -0
  8. package/dist/cli/commands/serve.d.ts +2 -0
  9. package/dist/cli/commands/serve.d.ts.map +1 -0
  10. package/dist/cli/commands/serve.js +5 -0
  11. package/dist/cli/commands/serve.js.map +1 -0
  12. package/dist/cli/index.d.ts +13 -0
  13. package/dist/cli/index.d.ts.map +1 -0
  14. package/dist/cli/index.js +145 -0
  15. package/dist/cli/index.js.map +1 -0
  16. package/dist/cli.d.ts +3 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +8 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/conformance/harness.d.ts +73 -0
  21. package/dist/conformance/harness.d.ts.map +1 -0
  22. package/dist/conformance/harness.js +609 -0
  23. package/dist/conformance/harness.js.map +1 -0
  24. package/dist/error_utils.d.ts +3 -0
  25. package/dist/error_utils.d.ts.map +1 -0
  26. package/dist/error_utils.js +19 -0
  27. package/dist/error_utils.js.map +1 -0
  28. package/dist/index.d.ts +3 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/dist/index.js +3 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/server.d.ts +80 -0
  33. package/dist/server.d.ts.map +1 -0
  34. package/dist/server.js +112 -0
  35. package/dist/server.js.map +1 -0
  36. package/dist/session/manager.d.ts +84 -0
  37. package/dist/session/manager.d.ts.map +1 -0
  38. package/dist/session/manager.js +155 -0
  39. package/dist/session/manager.js.map +1 -0
  40. package/dist/tool_catalog.d.ts +439 -0
  41. package/dist/tool_catalog.d.ts.map +1 -0
  42. package/dist/tool_catalog.js +314 -0
  43. package/dist/tool_catalog.js.map +1 -0
  44. package/dist/tools/accept_changes.d.ts +7 -0
  45. package/dist/tools/accept_changes.d.ts.map +1 -0
  46. package/dist/tools/accept_changes.js +21 -0
  47. package/dist/tools/accept_changes.js.map +1 -0
  48. package/dist/tools/add_comment.d.ts +13 -0
  49. package/dist/tools/add_comment.d.ts.map +1 -0
  50. package/dist/tools/add_comment.js +77 -0
  51. package/dist/tools/add_comment.js.map +1 -0
  52. package/dist/tools/add_footnote.d.ts +10 -0
  53. package/dist/tools/add_footnote.d.ts.map +1 -0
  54. package/dist/tools/add_footnote.js +45 -0
  55. package/dist/tools/add_footnote.js.map +1 -0
  56. package/dist/tools/apply_plan.d.ts +9 -0
  57. package/dist/tools/apply_plan.d.ts.map +1 -0
  58. package/dist/tools/apply_plan.js +346 -0
  59. package/dist/tools/apply_plan.js.map +1 -0
  60. package/dist/tools/clear_session.d.ts +9 -0
  61. package/dist/tools/clear_session.d.ts.map +1 -0
  62. package/dist/tools/clear_session.js +66 -0
  63. package/dist/tools/clear_session.js.map +1 -0
  64. package/dist/tools/compare_documents.d.ts +12 -0
  65. package/dist/tools/compare_documents.d.ts.map +1 -0
  66. package/dist/tools/compare_documents.js +121 -0
  67. package/dist/tools/compare_documents.js.map +1 -0
  68. package/dist/tools/comparison_defaults.d.ts +9 -0
  69. package/dist/tools/comparison_defaults.d.ts.map +1 -0
  70. package/dist/tools/comparison_defaults.js +8 -0
  71. package/dist/tools/comparison_defaults.js.map +1 -0
  72. package/dist/tools/delete_comment.d.ts +8 -0
  73. package/dist/tools/delete_comment.d.ts.map +1 -0
  74. package/dist/tools/delete_comment.js +28 -0
  75. package/dist/tools/delete_comment.js.map +1 -0
  76. package/dist/tools/delete_footnote.d.ts +8 -0
  77. package/dist/tools/delete_footnote.d.ts.map +1 -0
  78. package/dist/tools/delete_footnote.js +34 -0
  79. package/dist/tools/delete_footnote.js.map +1 -0
  80. package/dist/tools/docx_archive_guard.d.ts +9 -0
  81. package/dist/tools/docx_archive_guard.d.ts.map +1 -0
  82. package/dist/tools/docx_archive_guard.js +64 -0
  83. package/dist/tools/docx_archive_guard.js.map +1 -0
  84. package/dist/tools/download.d.ts +20 -0
  85. package/dist/tools/download.d.ts.map +1 -0
  86. package/dist/tools/download.js +252 -0
  87. package/dist/tools/download.js.map +1 -0
  88. package/dist/tools/duplicate_document.d.ts +8 -0
  89. package/dist/tools/duplicate_document.d.ts.map +1 -0
  90. package/dist/tools/duplicate_document.js +90 -0
  91. package/dist/tools/duplicate_document.js.map +1 -0
  92. package/dist/tools/extract_revisions.d.ts +9 -0
  93. package/dist/tools/extract_revisions.d.ts.map +1 -0
  94. package/dist/tools/extract_revisions.js +52 -0
  95. package/dist/tools/extract_revisions.js.map +1 -0
  96. package/dist/tools/format_layout.d.ts +35 -0
  97. package/dist/tools/format_layout.d.ts.map +1 -0
  98. package/dist/tools/format_layout.js +332 -0
  99. package/dist/tools/format_layout.js.map +1 -0
  100. package/dist/tools/get_comments.d.ts +7 -0
  101. package/dist/tools/get_comments.d.ts.map +1 -0
  102. package/dist/tools/get_comments.js +32 -0
  103. package/dist/tools/get_comments.js.map +1 -0
  104. package/dist/tools/get_footnotes.d.ts +7 -0
  105. package/dist/tools/get_footnotes.d.ts.map +1 -0
  106. package/dist/tools/get_footnotes.js +25 -0
  107. package/dist/tools/get_footnotes.js.map +1 -0
  108. package/dist/tools/get_session_status.d.ts +7 -0
  109. package/dist/tools/get_session_status.d.ts.map +1 -0
  110. package/dist/tools/get_session_status.js +41 -0
  111. package/dist/tools/get_session_status.js.map +1 -0
  112. package/dist/tools/grep.d.ts +13 -0
  113. package/dist/tools/grep.d.ts.map +1 -0
  114. package/dist/tools/grep.js +129 -0
  115. package/dist/tools/grep.js.map +1 -0
  116. package/dist/tools/has_tracked_changes.d.ts +7 -0
  117. package/dist/tools/has_tracked_changes.d.ts.map +1 -0
  118. package/dist/tools/has_tracked_changes.js +74 -0
  119. package/dist/tools/has_tracked_changes.js.map +1 -0
  120. package/dist/tools/init_plan.d.ts +9 -0
  121. package/dist/tools/init_plan.d.ts.map +1 -0
  122. package/dist/tools/init_plan.js +44 -0
  123. package/dist/tools/init_plan.js.map +1 -0
  124. package/dist/tools/insert_paragraph.d.ts +12 -0
  125. package/dist/tools/insert_paragraph.d.ts.map +1 -0
  126. package/dist/tools/insert_paragraph.js +514 -0
  127. package/dist/tools/insert_paragraph.js.map +1 -0
  128. package/dist/tools/merge_plans.d.ts +7 -0
  129. package/dist/tools/merge_plans.d.ts.map +1 -0
  130. package/dist/tools/merge_plans.js +408 -0
  131. package/dist/tools/merge_plans.js.map +1 -0
  132. package/dist/tools/open_document.d.ts +7 -0
  133. package/dist/tools/open_document.d.ts.map +1 -0
  134. package/dist/tools/open_document.js +102 -0
  135. package/dist/tools/open_document.js.map +1 -0
  136. package/dist/tools/path_policy.d.ts +13 -0
  137. package/dist/tools/path_policy.d.ts.map +1 -0
  138. package/dist/tools/path_policy.js +109 -0
  139. package/dist/tools/path_policy.js.map +1 -0
  140. package/dist/tools/preview.d.ts +5 -0
  141. package/dist/tools/preview.d.ts.map +1 -0
  142. package/dist/tools/preview.js +11 -0
  143. package/dist/tools/preview.js.map +1 -0
  144. package/dist/tools/read_file.d.ts +12 -0
  145. package/dist/tools/read_file.d.ts.map +1 -0
  146. package/dist/tools/read_file.js +113 -0
  147. package/dist/tools/read_file.js.map +1 -0
  148. package/dist/tools/replace_text.d.ts +13 -0
  149. package/dist/tools/replace_text.d.ts.map +1 -0
  150. package/dist/tools/replace_text.js +628 -0
  151. package/dist/tools/replace_text.js.map +1 -0
  152. package/dist/tools/session_resolution.d.ts +29 -0
  153. package/dist/tools/session_resolution.d.ts.map +1 -0
  154. package/dist/tools/session_resolution.js +158 -0
  155. package/dist/tools/session_resolution.js.map +1 -0
  156. package/dist/tools/types.d.ts +15 -0
  157. package/dist/tools/types.d.ts.map +1 -0
  158. package/dist/tools/types.js +7 -0
  159. package/dist/tools/types.js.map +1 -0
  160. package/dist/tools/update_footnote.d.ts +9 -0
  161. package/dist/tools/update_footnote.d.ts.map +1 -0
  162. package/dist/tools/update_footnote.js +39 -0
  163. package/dist/tools/update_footnote.js.map +1 -0
  164. package/package.json +74 -6
@@ -0,0 +1,3 @@
1
+ export { runServer } from './server.js';
2
+ export { createProgram, runCli } from './cli/index.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { runServer } from './server.js';
2
+ export { createProgram, runCli } from './cli/index.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,80 @@
1
+ import { SessionManager } from './session/manager.js';
2
+ export declare const MCP_TRANSPORT: "stdio";
3
+ export declare const MCP_TOOLS: {
4
+ name: "read_file" | "grep" | "init_plan" | "merge_plans" | "apply_plan" | "replace_text" | "insert_paragraph" | "download" | "format_layout" | "accept_changes" | "has_tracked_changes" | "get_session_status" | "clear_session" | "duplicate_document" | "add_comment" | "get_comments" | "delete_comment" | "compare_documents" | "get_footnotes" | "add_footnote" | "update_footnote" | "delete_footnote" | "extract_revisions";
5
+ description: "Read document content with paragraph IDs. Accepts session_id or file_path." | "Search paragraphs with regex. Accepts session_id or file_path." | "Initialize revision-bound context metadata for coordinated multi-agent planning. Accepts session_id or file_path." | "Deterministically merge multiple sub-agent plans and detect hard conflicts before apply." | "Validate and apply a batch of edit steps (replace_text, insert_paragraph) to a session document in one call. Validates all steps first; applies only if all pass. Accepts inline steps or a plan_file_path. Compatible with merge_plans output." | "Replace text in a paragraph by _bk_* id, preserving formatting. Accepts session_id or file_path." | "Insert a paragraph before/after an anchor paragraph by _bk_* id. Accepts session_id or file_path." | "Save clean and/or tracked changes output back to the user filesystem. Defaults to both clean and tracked outputs when no format override is provided. Accepts session_id or file_path." | "Apply deterministic OOXML layout controls (paragraph spacing, table row height, cell padding). Accepts session_id or file_path." | "Accept all tracked changes in the document body, producing a clean document with no revision markup. Returns acceptance stats." | "Check whether the document body contains tracked-change markers (insertions, deletions, moves, and property-change records). Read-only." | "Get session metadata. Accepts session_id or file_path." | "Clear one session, all sessions for a file path, or all sessions with explicit confirmation." | "Duplicate a source .docx and auto-open a fresh editing session for the duplicate." | "Add a comment or threaded reply to a document. Provide target_paragraph_id + anchor_text for root comments, or parent_comment_id for replies." | "Get all comments from the document with IDs, authors, dates, text, and anchored paragraph IDs. Includes threaded replies. Read-only." | "Delete a comment and all its threaded replies from the document. Cascade-deletes all descendants." | "Compare two DOCX documents and produce a tracked-changes output document. Provide original_file_path + revised_file_path for standalone comparison, or session_id/file_path to compare session edits against the original." | "Get all footnotes from the document with IDs, display numbers, text, and anchored paragraph IDs. Read-only." | "Add a footnote anchored to a paragraph. Optionally position the reference after specific text using after_text. Note: [^N] markers in read_file output are display-only and not part of the editable text used by replace_text." | "Update the text content of an existing footnote." | "Delete a footnote and its reference from the document." | "Extract tracked changes as structured JSON with before/after text per paragraph, revision details, and comments. Supports pagination via offset and limit. Read-only - does not modify the document.";
6
+ inputSchema: Record<string, unknown>;
7
+ annotations: {
8
+ readonly readOnlyHint: true;
9
+ readonly destructiveHint: false;
10
+ } | {
11
+ readonly readOnlyHint: true;
12
+ readonly destructiveHint: false;
13
+ } | {
14
+ readonly readOnlyHint: true;
15
+ readonly destructiveHint: false;
16
+ } | {
17
+ readonly readOnlyHint: true;
18
+ readonly destructiveHint: false;
19
+ } | {
20
+ readonly readOnlyHint: false;
21
+ readonly destructiveHint: true;
22
+ } | {
23
+ readonly readOnlyHint: false;
24
+ readonly destructiveHint: true;
25
+ } | {
26
+ readonly readOnlyHint: false;
27
+ readonly destructiveHint: true;
28
+ } | {
29
+ readonly readOnlyHint: false;
30
+ readonly destructiveHint: true;
31
+ } | {
32
+ readonly readOnlyHint: false;
33
+ readonly destructiveHint: true;
34
+ } | {
35
+ readonly readOnlyHint: false;
36
+ readonly destructiveHint: true;
37
+ } | {
38
+ readonly readOnlyHint: true;
39
+ readonly destructiveHint: false;
40
+ } | {
41
+ readonly readOnlyHint: true;
42
+ readonly destructiveHint: false;
43
+ } | {
44
+ readonly readOnlyHint: false;
45
+ readonly destructiveHint: true;
46
+ } | {
47
+ readonly readOnlyHint: false;
48
+ readonly destructiveHint: true;
49
+ } | {
50
+ readonly readOnlyHint: false;
51
+ readonly destructiveHint: true;
52
+ } | {
53
+ readonly readOnlyHint: true;
54
+ readonly destructiveHint: false;
55
+ } | {
56
+ readonly readOnlyHint: false;
57
+ readonly destructiveHint: true;
58
+ } | {
59
+ readonly readOnlyHint: true;
60
+ readonly destructiveHint: false;
61
+ } | {
62
+ readonly readOnlyHint: true;
63
+ readonly destructiveHint: false;
64
+ } | {
65
+ readonly readOnlyHint: false;
66
+ readonly destructiveHint: true;
67
+ } | {
68
+ readonly readOnlyHint: false;
69
+ readonly destructiveHint: true;
70
+ } | {
71
+ readonly readOnlyHint: false;
72
+ readonly destructiveHint: true;
73
+ } | {
74
+ readonly readOnlyHint: true;
75
+ readonly destructiveHint: false;
76
+ };
77
+ }[];
78
+ export declare function dispatchToolCall(sessions: SessionManager, name: string, args: Record<string, unknown>): Promise<Record<string, unknown>>;
79
+ export declare function runServer(): Promise<void>;
80
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AA0BtD,eAAO,MAAM,aAAa,EAAG,OAAgB,CAAC;AAE9C,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAsB,CAAC;AAE7C,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA0DlC;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CA6B/C"}
package/dist/server.js ADDED
@@ -0,0 +1,112 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';
4
+ import { SessionManager } from './session/manager.js';
5
+ import { SAFE_DOCX_MCP_TOOLS } from './tool_catalog.js';
6
+ import { readFile } from './tools/read_file.js';
7
+ import { grep } from './tools/grep.js';
8
+ import { initPlan } from './tools/init_plan.js';
9
+ import { replaceText } from './tools/replace_text.js';
10
+ import { insertParagraph } from './tools/insert_paragraph.js';
11
+ import { mergePlans } from './tools/merge_plans.js';
12
+ import { applyPlan } from './tools/apply_plan.js';
13
+ import { download } from './tools/download.js';
14
+ import { getSessionStatus } from './tools/get_session_status.js';
15
+ import { hasTrackedChanges_tool } from './tools/has_tracked_changes.js';
16
+ import { clearSession } from './tools/clear_session.js';
17
+ import { duplicateDocument } from './tools/duplicate_document.js';
18
+ import { formatLayout } from './tools/format_layout.js';
19
+ import { acceptChanges } from './tools/accept_changes.js';
20
+ import { addComment } from './tools/add_comment.js';
21
+ import { getComments } from './tools/get_comments.js';
22
+ import { deleteComment } from './tools/delete_comment.js';
23
+ import { getFootnotes } from './tools/get_footnotes.js';
24
+ import { addFootnote } from './tools/add_footnote.js';
25
+ import { updateFootnote } from './tools/update_footnote.js';
26
+ import { deleteFootnote } from './tools/delete_footnote.js';
27
+ import { compareDocuments_tool } from './tools/compare_documents.js';
28
+ import { extractRevisions_tool } from './tools/extract_revisions.js';
29
+ export const MCP_TRANSPORT = 'stdio';
30
+ export const MCP_TOOLS = SAFE_DOCX_MCP_TOOLS;
31
+ export async function dispatchToolCall(sessions, name, args) {
32
+ switch (name) {
33
+ case 'read_file':
34
+ return await readFile(sessions, args);
35
+ case 'grep':
36
+ return await grep(sessions, args);
37
+ case 'init_plan':
38
+ return await initPlan(sessions, args);
39
+ case 'merge_plans':
40
+ return await mergePlans(args);
41
+ case 'apply_plan':
42
+ return await applyPlan(sessions, args);
43
+ case 'replace_text':
44
+ return await replaceText(sessions, args);
45
+ case 'insert_paragraph':
46
+ return await insertParagraph(sessions, args);
47
+ case 'download':
48
+ return await download(sessions, args);
49
+ case 'format_layout':
50
+ return await formatLayout(sessions, args);
51
+ case 'accept_changes':
52
+ return await acceptChanges(sessions, args);
53
+ case 'has_tracked_changes':
54
+ return await hasTrackedChanges_tool(sessions, args);
55
+ case 'get_session_status':
56
+ return await getSessionStatus(sessions, args);
57
+ case 'clear_session':
58
+ return await clearSession(sessions, args);
59
+ case 'duplicate_document':
60
+ return await duplicateDocument(sessions, args);
61
+ case 'add_comment':
62
+ return await addComment(sessions, args);
63
+ case 'get_comments':
64
+ return await getComments(sessions, args);
65
+ case 'delete_comment':
66
+ return await deleteComment(sessions, args);
67
+ case 'compare_documents':
68
+ return await compareDocuments_tool(sessions, args);
69
+ case 'get_footnotes':
70
+ return await getFootnotes(sessions, args);
71
+ case 'add_footnote':
72
+ return await addFootnote(sessions, args);
73
+ case 'update_footnote':
74
+ return await updateFootnote(sessions, args);
75
+ case 'delete_footnote':
76
+ return await deleteFootnote(sessions, args);
77
+ case 'extract_revisions':
78
+ return await extractRevisions_tool(sessions, args);
79
+ default:
80
+ return {
81
+ success: false,
82
+ error: {
83
+ code: 'UNKNOWN_TOOL',
84
+ message: `Unknown tool: ${name}`,
85
+ hint: 'Use file-first tools: read_file, grep, replace_text, insert_paragraph, download, get_session_status.',
86
+ },
87
+ };
88
+ }
89
+ }
90
+ export async function runServer() {
91
+ const server = new Server({ name: 'safe-docx', version: '0.1.0' }, {
92
+ capabilities: {
93
+ tools: {},
94
+ },
95
+ });
96
+ const sessions = new SessionManager();
97
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
98
+ return { tools: MCP_TOOLS };
99
+ });
100
+ server.setRequestHandler(CallToolRequestSchema, async (req) => {
101
+ const { name } = req.params;
102
+ const args = (req.params.arguments ?? {});
103
+ const result = await dispatchToolCall(sessions, name, args);
104
+ // MCP SDK expects tool results as content blocks.
105
+ return {
106
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
107
+ };
108
+ });
109
+ const transport = new StdioServerTransport();
110
+ await server.connect(transport);
111
+ }
112
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ import { DocxDocument, type NormalizationResult, type ParagraphRevision, type ReconstructionMode, type ReconstructionFallbackReason, type ReconstructionFallbackDiagnostics } from '@usejunior/docx-core';
2
+ export type DownloadFormat = 'clean' | 'tracked' | 'both';
3
+ export type TrackedChangesStats = {
4
+ insertions: number;
5
+ deletions: number;
6
+ modifications: number;
7
+ };
8
+ export type DownloadCacheEntry = {
9
+ cacheKey: string;
10
+ revision: number;
11
+ format: DownloadFormat;
12
+ cleanBookmarks: boolean;
13
+ trackedEngine: 'auto' | 'atomizer' | 'diffmatch';
14
+ trackedAuthor: string;
15
+ revisedBuffer: Buffer;
16
+ trackedBuffer: Buffer | null;
17
+ trackedStats: TrackedChangesStats | null;
18
+ trackedReconstructionMode?: ReconstructionMode;
19
+ trackedFallbackReason?: ReconstructionFallbackReason;
20
+ trackedFallbackDiagnostics?: ReconstructionFallbackDiagnostics;
21
+ bookmarksRemoved: number;
22
+ exportedAtUtc: string;
23
+ cachedAtIso: string;
24
+ };
25
+ export type ExtractionCacheEntry = {
26
+ revision: number;
27
+ changes: ParagraphRevision[];
28
+ };
29
+ export type Session = {
30
+ sessionId: string;
31
+ filename: string;
32
+ tmpPath: string;
33
+ originalPath: string;
34
+ originalBuffer: Buffer;
35
+ /**
36
+ * Post-normalization + bookmark-cleaned buffer used as comparison baseline for tracked output.
37
+ * Comparing against this instead of originalBuffer prevents normalization artifacts from
38
+ * appearing as false tracked changes. Set during open_document after normalization.
39
+ */
40
+ comparisonBaseline: Buffer | null;
41
+ /**
42
+ * Post-normalization buffer WITH bookmarks, used as comparison baseline for
43
+ * compare_documents tool (which uses cleanBookmarks: false).
44
+ */
45
+ comparisonBaselineWithBookmarks: Buffer | null;
46
+ doc: DocxDocument;
47
+ editCount: number;
48
+ editRevision: number;
49
+ downloadCache: Map<string, DownloadCacheEntry>;
50
+ extractionCache: ExtractionCacheEntry | null;
51
+ createdAt: Date;
52
+ lastAccessedAt: Date;
53
+ expiresAt: Date;
54
+ normalizationStats: NormalizationResult | null;
55
+ };
56
+ export declare class SessionManager {
57
+ private sessions;
58
+ private ttlMs;
59
+ private static readonly SESSION_ID_PATTERN;
60
+ constructor(opts?: {
61
+ ttlMs?: number;
62
+ });
63
+ private expandPath;
64
+ normalizePath(inputPath: string): string;
65
+ private newSessionId;
66
+ createSession(documentContent: Buffer, filename: string, originalPath: string): Promise<Session>;
67
+ getSession(sessionId: string): Session;
68
+ private listActiveSessionsForPath;
69
+ getMostRecentlyUsedSessionForPath(normalizedPath: string): Session | null;
70
+ private cleanupSessionArtifacts;
71
+ clearSessionById(sessionId: string): Promise<Session>;
72
+ clearSessionsByPath(normalizedPath: string): Promise<string[]>;
73
+ clearAllSessions(): Promise<string[]>;
74
+ touch(session: Session): void;
75
+ markEdited(session: Session): void;
76
+ getDownloadCache(session: Session, cacheKey: string): DownloadCacheEntry | null;
77
+ setDownloadCache(session: Session, entry: DownloadCacheEntry): void;
78
+ getExtractionCache(session: Session): ExtractionCacheEntry | null;
79
+ setExtractionCache(session: Session, changes: ParagraphRevision[]): void;
80
+ saveTo(session: Session, savePath: string, opts?: {
81
+ cleanBookmarks?: boolean;
82
+ }): Promise<void>;
83
+ }
84
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import path from 'node:path';
3
+ import os from 'node:os';
4
+ import fs from 'node:fs/promises';
5
+ import { DocxDocument, } from '@usejunior/docx-core';
6
+ export class SessionManager {
7
+ sessions = new Map();
8
+ ttlMs;
9
+ static SESSION_ID_PATTERN = /^ses_[A-Za-z0-9]{12}$/;
10
+ constructor(opts) {
11
+ this.ttlMs = opts?.ttlMs ?? 60 * 60 * 1000;
12
+ }
13
+ expandPath(inputPath) {
14
+ return inputPath.startsWith('~')
15
+ ? path.join(process.env.HOME || '', inputPath.slice(1))
16
+ : inputPath;
17
+ }
18
+ normalizePath(inputPath) {
19
+ return path.resolve(this.expandPath(inputPath));
20
+ }
21
+ newSessionId() {
22
+ // Format: ses_[12 alphanumeric] (close enough: base64url chars).
23
+ const alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
24
+ const bytes = randomBytes(12);
25
+ let out = '';
26
+ for (let i = 0; i < 12; i++) {
27
+ out += alphabet[bytes[i] % alphabet.length];
28
+ }
29
+ return `ses_${out}`;
30
+ }
31
+ async createSession(documentContent, filename, originalPath) {
32
+ const sessionId = this.newSessionId();
33
+ const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'safe-docx-'));
34
+ const tmpPath = path.join(dir, filename);
35
+ // Ensure we pass an ArrayBufferView to satisfy Node's type signature across TS lib setups.
36
+ await fs.writeFile(tmpPath, new Uint8Array(documentContent));
37
+ const doc = await DocxDocument.load(documentContent);
38
+ const now = new Date();
39
+ const expiresAt = new Date(now.getTime() + this.ttlMs);
40
+ const session = {
41
+ sessionId,
42
+ filename,
43
+ tmpPath,
44
+ originalPath,
45
+ originalBuffer: Buffer.from(documentContent),
46
+ comparisonBaseline: null,
47
+ comparisonBaselineWithBookmarks: null,
48
+ doc,
49
+ editCount: 0,
50
+ editRevision: 0,
51
+ downloadCache: new Map(),
52
+ extractionCache: null,
53
+ createdAt: now,
54
+ lastAccessedAt: now,
55
+ expiresAt,
56
+ normalizationStats: null,
57
+ };
58
+ this.sessions.set(sessionId, session);
59
+ return session;
60
+ }
61
+ getSession(sessionId) {
62
+ if (!SessionManager.SESSION_ID_PATTERN.test(sessionId)) {
63
+ throw new Error(`INVALID_SESSION_ID:${sessionId}`);
64
+ }
65
+ const ses = this.sessions.get(sessionId);
66
+ if (!ses)
67
+ throw new Error(`SESSION_NOT_FOUND:${sessionId}`);
68
+ const now = Date.now();
69
+ if (ses.expiresAt.getTime() < now) {
70
+ this.sessions.delete(sessionId);
71
+ throw new Error(`SESSION_EXPIRED:${sessionId}`);
72
+ }
73
+ return ses;
74
+ }
75
+ listActiveSessionsForPath(normalizedPath) {
76
+ const now = Date.now();
77
+ const out = [];
78
+ for (const [sessionId, session] of this.sessions.entries()) {
79
+ if (session.expiresAt.getTime() < now) {
80
+ this.sessions.delete(sessionId);
81
+ continue;
82
+ }
83
+ if (this.normalizePath(session.originalPath) !== normalizedPath)
84
+ continue;
85
+ out.push(session);
86
+ }
87
+ out.sort((a, b) => b.lastAccessedAt.getTime() - a.lastAccessedAt.getTime());
88
+ return out;
89
+ }
90
+ getMostRecentlyUsedSessionForPath(normalizedPath) {
91
+ const sessionsForPath = this.listActiveSessionsForPath(normalizedPath);
92
+ return sessionsForPath[0] ?? null;
93
+ }
94
+ async cleanupSessionArtifacts(session) {
95
+ const tmpDir = path.dirname(session.tmpPath);
96
+ await fs.rm(tmpDir, { recursive: true, force: true }).catch(() => undefined);
97
+ }
98
+ async clearSessionById(sessionId) {
99
+ const session = this.getSession(sessionId);
100
+ this.sessions.delete(sessionId);
101
+ await this.cleanupSessionArtifacts(session);
102
+ return session;
103
+ }
104
+ async clearSessionsByPath(normalizedPath) {
105
+ const sessionsForPath = this.listActiveSessionsForPath(normalizedPath);
106
+ for (const session of sessionsForPath) {
107
+ this.sessions.delete(session.sessionId);
108
+ }
109
+ await Promise.all(sessionsForPath.map((session) => this.cleanupSessionArtifacts(session)));
110
+ return sessionsForPath.map((session) => session.sessionId);
111
+ }
112
+ async clearAllSessions() {
113
+ const allSessions = [...this.sessions.values()];
114
+ const clearedIds = allSessions.map((session) => session.sessionId);
115
+ this.sessions.clear();
116
+ await Promise.all(allSessions.map((session) => this.cleanupSessionArtifacts(session)));
117
+ return clearedIds;
118
+ }
119
+ touch(session) {
120
+ const now = new Date();
121
+ session.lastAccessedAt = now;
122
+ session.expiresAt = new Date(now.getTime() + this.ttlMs);
123
+ }
124
+ markEdited(session) {
125
+ session.editCount += 1;
126
+ session.editRevision += 1;
127
+ // Any edit creates a new canonical revision; previously generated artifacts
128
+ // are no longer current and should not be reused by default.
129
+ session.downloadCache.clear();
130
+ session.extractionCache = null;
131
+ }
132
+ getDownloadCache(session, cacheKey) {
133
+ return session.downloadCache.get(cacheKey) ?? null;
134
+ }
135
+ setDownloadCache(session, entry) {
136
+ session.downloadCache.set(entry.cacheKey, entry);
137
+ }
138
+ getExtractionCache(session) {
139
+ if (!session.extractionCache)
140
+ return null;
141
+ if (session.extractionCache.revision !== session.editRevision) {
142
+ session.extractionCache = null;
143
+ return null;
144
+ }
145
+ return session.extractionCache;
146
+ }
147
+ setExtractionCache(session, changes) {
148
+ session.extractionCache = { revision: session.editRevision, changes };
149
+ }
150
+ async saveTo(session, savePath, opts) {
151
+ const { buffer } = await session.doc.toBuffer({ cleanBookmarks: opts?.cleanBookmarks ?? true });
152
+ await fs.writeFile(savePath, new Uint8Array(buffer));
153
+ }
154
+ }
155
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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"}