svn-agent-mcp 1.0.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 (165) hide show
  1. package/.editorconfig +12 -0
  2. package/.gitattributes +7 -0
  3. package/.github/workflows/ci.yml +39 -0
  4. package/.svn-mcp-policy.json +9 -0
  5. package/CHANGELOG.md +248 -0
  6. package/CONTRIBUTING.md +49 -0
  7. package/LICENSE +201 -0
  8. package/README.md +143 -0
  9. package/SECURITY.md +21 -0
  10. package/THIRD_PARTY_CHECKSUMS.txt +52 -0
  11. package/THIRD_PARTY_NOTICES.md +46 -0
  12. package/bin/SlikSvn-DB44-20-x64.dll +0 -0
  13. package/bin/SlikSvn-libapr-1.dll +0 -0
  14. package/bin/SlikSvn-libaprutil-1.dll +0 -0
  15. package/bin/SlikSvn-libcrypto-3-x64.dll +0 -0
  16. package/bin/SlikSvn-libintl.dll +0 -0
  17. package/bin/SlikSvn-libsasl21.dll +0 -0
  18. package/bin/SlikSvn-libssl-3-x64.dll +0 -0
  19. package/bin/SlikSvn-libsvn_client-1.dll +0 -0
  20. package/bin/SlikSvn-libsvn_delta-1.dll +0 -0
  21. package/bin/SlikSvn-libsvn_diff-1.dll +0 -0
  22. package/bin/SlikSvn-libsvn_fs-1.dll +0 -0
  23. package/bin/SlikSvn-libsvn_fs_base-1.dll +0 -0
  24. package/bin/SlikSvn-libsvn_fs_fs-1.dll +0 -0
  25. package/bin/SlikSvn-libsvn_fs_util-1.dll +0 -0
  26. package/bin/SlikSvn-libsvn_fs_x-1.dll +0 -0
  27. package/bin/SlikSvn-libsvn_ra-1.dll +0 -0
  28. package/bin/SlikSvn-libsvn_repos-1.dll +0 -0
  29. package/bin/SlikSvn-libsvn_subr-1.dll +0 -0
  30. package/bin/SlikSvn-libsvn_wc-1.dll +0 -0
  31. package/bin/System64/concrt140.dll +0 -0
  32. package/bin/System64/msvcp140.dll +0 -0
  33. package/bin/System64/msvcp140_1.dll +0 -0
  34. package/bin/System64/msvcp140_2.dll +0 -0
  35. package/bin/System64/msvcp140_atomic_wait.dll +0 -0
  36. package/bin/System64/msvcp140_codecvt_ids.dll +0 -0
  37. package/bin/System64/vccorlib140.dll +0 -0
  38. package/bin/System64/vcruntime140.dll +0 -0
  39. package/bin/System64/vcruntime140_1.dll +0 -0
  40. package/bin/dos2unix.exe +0 -0
  41. package/bin/engines/capi.dll +0 -0
  42. package/bin/libsvnjavahl-1.dll +0 -0
  43. package/bin/mac2unix.exe +0 -0
  44. package/bin/svn-populate-node-origins-index.exe +0 -0
  45. package/bin/svn.exe +0 -0
  46. package/bin/svnadmin.exe +0 -0
  47. package/bin/svnauthz-validate.exe +0 -0
  48. package/bin/svnauthz.exe +0 -0
  49. package/bin/svnbench.exe +0 -0
  50. package/bin/svndumpfilter.exe +0 -0
  51. package/bin/svnfsfs.exe +0 -0
  52. package/bin/svnlook.exe +0 -0
  53. package/bin/svnmucc.exe +0 -0
  54. package/bin/svnrdump.exe +0 -0
  55. package/bin/svnserve.exe +0 -0
  56. package/bin/svnsync.exe +0 -0
  57. package/bin/svnversion.exe +0 -0
  58. package/bin/unix2dos.exe +0 -0
  59. package/bin/unix2mac.exe +0 -0
  60. package/dist/envelope.d.ts +39 -0
  61. package/dist/envelope.d.ts.map +1 -0
  62. package/dist/envelope.js +137 -0
  63. package/dist/envelope.js.map +1 -0
  64. package/dist/eol.d.ts +15 -0
  65. package/dist/eol.d.ts.map +1 -0
  66. package/dist/eol.js +119 -0
  67. package/dist/eol.js.map +1 -0
  68. package/dist/guards.d.ts +26 -0
  69. package/dist/guards.d.ts.map +1 -0
  70. package/dist/guards.js +306 -0
  71. package/dist/guards.js.map +1 -0
  72. package/dist/index.d.ts +8 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +221 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/parse/commitText.d.ts +2 -0
  77. package/dist/parse/commitText.d.ts.map +1 -0
  78. package/dist/parse/commitText.js +9 -0
  79. package/dist/parse/commitText.js.map +1 -0
  80. package/dist/parse/diffText.d.ts +7 -0
  81. package/dist/parse/diffText.d.ts.map +1 -0
  82. package/dist/parse/diffText.js +55 -0
  83. package/dist/parse/diffText.js.map +1 -0
  84. package/dist/parse/infoXml.d.ts +3 -0
  85. package/dist/parse/infoXml.d.ts.map +1 -0
  86. package/dist/parse/infoXml.js +35 -0
  87. package/dist/parse/infoXml.js.map +1 -0
  88. package/dist/parse/logXml.d.ts +10 -0
  89. package/dist/parse/logXml.d.ts.map +1 -0
  90. package/dist/parse/logXml.js +39 -0
  91. package/dist/parse/logXml.js.map +1 -0
  92. package/dist/parse/statusXml.d.ts +6 -0
  93. package/dist/parse/statusXml.d.ts.map +1 -0
  94. package/dist/parse/statusXml.js +64 -0
  95. package/dist/parse/statusXml.js.map +1 -0
  96. package/dist/parse/updateText.d.ts +6 -0
  97. package/dist/parse/updateText.d.ts.map +1 -0
  98. package/dist/parse/updateText.js +67 -0
  99. package/dist/parse/updateText.js.map +1 -0
  100. package/dist/runner.d.ts +41 -0
  101. package/dist/runner.d.ts.map +1 -0
  102. package/dist/runner.js +270 -0
  103. package/dist/runner.js.map +1 -0
  104. package/dist/tools/composite.d.ts +15 -0
  105. package/dist/tools/composite.d.ts.map +1 -0
  106. package/dist/tools/composite.js +238 -0
  107. package/dist/tools/composite.js.map +1 -0
  108. package/dist/tools/diagnose.d.ts +6 -0
  109. package/dist/tools/diagnose.d.ts.map +1 -0
  110. package/dist/tools/diagnose.js +131 -0
  111. package/dist/tools/diagnose.js.map +1 -0
  112. package/dist/tools/mutating.d.ts +80 -0
  113. package/dist/tools/mutating.d.ts.map +1 -0
  114. package/dist/tools/mutating.js +558 -0
  115. package/dist/tools/mutating.js.map +1 -0
  116. package/dist/tools/readonly.d.ts +52 -0
  117. package/dist/tools/readonly.d.ts.map +1 -0
  118. package/dist/tools/readonly.js +638 -0
  119. package/dist/tools/readonly.js.map +1 -0
  120. package/dist/tools/selfcheck.d.ts +5 -0
  121. package/dist/tools/selfcheck.d.ts.map +1 -0
  122. package/dist/tools/selfcheck.js +91 -0
  123. package/dist/tools/selfcheck.js.map +1 -0
  124. package/dist/types.d.ts +66 -0
  125. package/dist/types.d.ts.map +1 -0
  126. package/dist/types.js +2 -0
  127. package/dist/types.js.map +1 -0
  128. package/docs/README.md +11 -0
  129. package/docs/SPEC.md +964 -0
  130. package/docs/decisions/ADR-001-use-spec-v1-architecture.md +25 -0
  131. package/docs/decisions/ADR-002-use-capability-based-generic-svn-policy.md +31 -0
  132. package/docs/decisions/ADR-003-use-plug-and-play-global-registration.md +39 -0
  133. package/docs/decisions/ADR-004-borrow-diagnostics-not-external-mcp-surface.md +39 -0
  134. package/docs/svnrules.md +84 -0
  135. package/docs/toolrules.md +34 -0
  136. package/jest.config.cjs +14 -0
  137. package/package.json +51 -0
  138. package/scripts/clean.mjs +27 -0
  139. package/scripts/prepare-release.mjs +84 -0
  140. package/src/envelope.ts +182 -0
  141. package/src/eol.ts +137 -0
  142. package/src/guards.ts +362 -0
  143. package/src/index.ts +364 -0
  144. package/src/parse/commitText.ts +9 -0
  145. package/src/parse/diffText.ts +66 -0
  146. package/src/parse/infoXml.ts +51 -0
  147. package/src/parse/logXml.ts +64 -0
  148. package/src/parse/statusXml.ts +87 -0
  149. package/src/parse/updateText.ts +76 -0
  150. package/src/runner.ts +344 -0
  151. package/src/tools/composite.ts +289 -0
  152. package/src/tools/diagnose.ts +150 -0
  153. package/src/tools/mutating.ts +694 -0
  154. package/src/tools/readonly.ts +786 -0
  155. package/src/tools/selfcheck.ts +97 -0
  156. package/src/types.ts +76 -0
  157. package/tests/README.md +9 -0
  158. package/tests/diff-redaction.test.ts +146 -0
  159. package/tests/entrypoint.test.ts +49 -0
  160. package/tests/guards-eol.test.ts +170 -0
  161. package/tests/integration-svn.test.ts +709 -0
  162. package/tests/parsers.test.ts +119 -0
  163. package/tests/runner.test.ts +159 -0
  164. package/tests/selfcheck.test.ts +22 -0
  165. package/tsconfig.json +30 -0
package/dist/index.js ADDED
@@ -0,0 +1,221 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import fs from "node:fs";
5
+ import { pathToFileURL } from "node:url";
6
+ import * as z from "zod/v4";
7
+ import { toToolResult } from "./envelope.js";
8
+ import { readonlyMode as isReadonlyMode } from "./guards.js";
9
+ import { startupProbe } from "./runner.js";
10
+ import { eolFixVerified, svnPrecommit } from "./tools/composite.js";
11
+ import { svnDiagnose } from "./tools/diagnose.js";
12
+ import { eolCheck, svnDiff, svnInfo, svnLog, svnPropget, svnStatus } from "./tools/readonly.js";
13
+ import { svnSelfCheck } from "./tools/selfcheck.js";
14
+ import { svnAdd, svnCleanup, svnCommit, svnCopy, svnExport, svnImport, svnMove, svnPropset, svnPropsetEolStyle, svnRename, svnResolved, svnRevert, svnUpdate } from "./tools/mutating.js";
15
+ export const serverName = "svn";
16
+ export const serverVersion = "1.0.0";
17
+ export const readonlyMode = isReadonlyMode();
18
+ export function createServer() {
19
+ const server = new McpServer({
20
+ name: serverName,
21
+ version: serverVersion
22
+ });
23
+ const cwd = z.string().optional().describe("Absolute working directory. If omitted, absolute paths identify their SVN working copy; relative paths require explicit cwd.");
24
+ const paths = z.array(z.string()).describe("Explicit paths relative to cwd or absolute paths inside one SVN working copy.");
25
+ const optionalPaths = z.array(z.string()).optional().describe("Optional paths relative to cwd or absolute paths inside one SVN working copy.");
26
+ const revision = z.string().regex(/^(?:\d+|HEAD|BASE|COMMITTED|PREV|\{[^}\r\n]+\})$/i).optional();
27
+ const propertyName = z.string().regex(/^[A-Za-z_][A-Za-z0-9_.:-]{0,127}$/);
28
+ server.registerTool("svn_self_check", {
29
+ description: "Report MCP release pointer, bundled runtime payload counts, startup probe, and packaging script health.",
30
+ inputSchema: { cwd }
31
+ }, async (args) => toToolResult(await svnSelfCheck(compactArgs(args))));
32
+ server.registerTool("svn_diagnose", {
33
+ description: "Read-only working-copy diagnostics for local status, remote status, HEAD info, and latest log reachability.",
34
+ inputSchema: { cwd, paths: optionalPaths }
35
+ }, async (args) => toToolResult(await svnDiagnose(compactArgs(args))));
36
+ server.registerTool("svn_status", {
37
+ description: "Run scoped svn status and return structured changed paths and conflicts.",
38
+ inputSchema: { cwd, paths: optionalPaths, includeIgnored: z.boolean().optional(), hideNoise: z.boolean().optional() }
39
+ }, async (args) => toToolResult(await svnStatus(compactArgs(args))));
40
+ server.registerTool("svn_info", {
41
+ description: "Run svn info and detect mixed-revision working-copy state.",
42
+ inputSchema: { cwd, paths: optionalPaths }
43
+ }, async (args) => toToolResult(await svnInfo(compactArgs(args))));
44
+ server.registerTool("svn_diff", {
45
+ description: "Run scoped svn diff; ignore-EOL is enabled by default with internal diff and returns per-file counts.",
46
+ inputSchema: {
47
+ cwd,
48
+ paths,
49
+ ignoreEol: z.boolean().optional(),
50
+ lineLimit: z.number().int().positive().optional()
51
+ }
52
+ }, async (args) => toToolResult(await svnDiff(compactArgs(args))));
53
+ server.registerTool("svn_log", {
54
+ description: "Run svn log and return structured log entries.",
55
+ inputSchema: {
56
+ cwd,
57
+ paths: optionalPaths,
58
+ limit: z.number().int().positive().optional(),
59
+ verbose: z.boolean().optional()
60
+ }
61
+ }, async (args) => toToolResult(await svnLog(compactArgs(args))));
62
+ server.registerTool("eol_check", {
63
+ description: "Inspect EOL kind, BOM, and svn:eol-style for explicit files.",
64
+ inputSchema: { cwd, paths }
65
+ }, async (args) => toToolResult(await eolCheck(compactArgs(args))));
66
+ server.registerTool("svn_propget", {
67
+ description: "Read one working-copy property from explicit paths.",
68
+ inputSchema: {
69
+ cwd,
70
+ paths,
71
+ name: propertyName
72
+ }
73
+ }, async (args) => toToolResult(await svnPropget(compactArgs(args))));
74
+ server.registerTool("svn_precommit", {
75
+ description: "Composite read-only precommit check: status, ignore-EOL diff, EOL check, guard dry-run, and mixed-revision warning.",
76
+ inputSchema: {
77
+ cwd,
78
+ paths,
79
+ lineLimit: z.number().int().positive().optional()
80
+ }
81
+ }, async (args) => toToolResult(await svnPrecommit(compactArgs(args))));
82
+ server.registerTool("eol_fix_verified", {
83
+ description: "Convert one file's EOL with unix2dos/dos2unix inferred from svn:eol-style, then verify the ignored-EOL diff.",
84
+ inputSchema: {
85
+ cwd,
86
+ path: z.string(),
87
+ target: z.enum(["crlf", "lf"]).optional(),
88
+ removeBom: z.boolean().optional(),
89
+ dryRun: z.boolean().optional(),
90
+ allowLarge: z.boolean().optional()
91
+ }
92
+ }, async (args) => toToolResult(await eolFixVerified(compactArgs(args))));
93
+ server.registerTool("svn_add", {
94
+ description: "Guarded svn add for explicit files, adding needed parent directories, or explicitly recursive directories.",
95
+ inputSchema: { cwd, paths, allowRecursive: z.boolean().optional() }
96
+ }, async (args) => toToolResult(await svnAdd(compactArgs(args))));
97
+ server.registerTool("svn_commit", {
98
+ description: "Guarded svn commit using a temp -F message file and explicit paths.",
99
+ inputSchema: {
100
+ cwd,
101
+ paths,
102
+ message: z.string(),
103
+ riskAck: z.boolean().optional()
104
+ }
105
+ }, async (args) => toToolResult(await svnCommit(compactArgs(args))));
106
+ server.registerTool("svn_move", {
107
+ description: "Guarded working-copy svn move with parent directory creation.",
108
+ inputSchema: { cwd, src: z.string(), dest: z.string() }
109
+ }, async (args) => toToolResult(await svnMove(compactArgs(args))));
110
+ server.registerTool("svn_rename", {
111
+ description: "Alias for guarded working-copy svn move/rename with parent directory creation.",
112
+ inputSchema: { cwd, src: z.string(), dest: z.string() }
113
+ }, async (args) => toToolResult(await svnRename(compactArgs(args))));
114
+ server.registerTool("svn_copy", {
115
+ description: "Guarded working-copy svn copy with parent directory creation.",
116
+ inputSchema: { cwd, src: z.string(), dest: z.string() }
117
+ }, async (args) => toToolResult(await svnCopy(compactArgs(args))));
118
+ server.registerTool("svn_update", {
119
+ description: "Guarded svn update with --accept postpone.",
120
+ inputSchema: { cwd, paths: optionalPaths, updateAll: z.boolean().optional() }
121
+ }, async (args) => toToolResult(await svnUpdate(compactArgs(args))));
122
+ server.registerTool("svn_revert", {
123
+ description: "Preview or perform guarded svn revert for explicit paths.",
124
+ inputSchema: {
125
+ cwd,
126
+ paths,
127
+ allowRecursive: z.boolean().optional(),
128
+ dryRun: z.boolean().optional()
129
+ }
130
+ }, async (args) => toToolResult(await svnRevert(compactArgs(args))));
131
+ server.registerTool("svn_resolved", {
132
+ description: "Resolve one conflicted path with an explicit accept mode.",
133
+ inputSchema: {
134
+ cwd,
135
+ path: z.string(),
136
+ accept: z.enum(["working", "mine-full", "theirs-full", "base"])
137
+ }
138
+ }, async (args) => toToolResult(await svnResolved(compactArgs(args))));
139
+ server.registerTool("svn_cleanup", {
140
+ description: "Run svn cleanup without destructive cleanup flags.",
141
+ inputSchema: { cwd, path: z.string().optional() }
142
+ }, async (args) => toToolResult(await svnCleanup(compactArgs(args))));
143
+ server.registerTool("svn_propset_eol_style", {
144
+ description: "Set svn:eol-style only for explicit files whose property is missing or mismatched.",
145
+ inputSchema: {
146
+ cwd,
147
+ paths,
148
+ style: z.enum(["native", "LF", "CRLF"]).optional()
149
+ }
150
+ }, async (args) => toToolResult(await svnPropsetEolStyle(compactArgs(args))));
151
+ server.registerTool("svn_propset", {
152
+ description: "Guarded working-copy svn propset for explicit paths.",
153
+ inputSchema: {
154
+ cwd,
155
+ paths,
156
+ name: propertyName,
157
+ value: z.string().max(16000),
158
+ riskAck: z.boolean().optional()
159
+ }
160
+ }, async (args) => toToolResult(await svnPropset(compactArgs(args))));
161
+ server.registerTool("svn_export", {
162
+ description: "Run explicit svn export.",
163
+ inputSchema: {
164
+ cwd,
165
+ src: z.string(),
166
+ dest: z.string(),
167
+ revision
168
+ }
169
+ }, async (args) => toToolResult(await svnExport(compactArgs(args))));
170
+ server.registerTool("svn_import", {
171
+ description: "Run svn import with a temp -F message file.",
172
+ inputSchema: {
173
+ cwd,
174
+ src: z.string(),
175
+ url: z.string(),
176
+ message: z.string()
177
+ }
178
+ }, async (args) => toToolResult(await svnImport(compactArgs(args))));
179
+ return server;
180
+ }
181
+ function compactArgs(args) {
182
+ return Object.fromEntries(Object.entries(args).filter(([, value]) => value !== undefined));
183
+ }
184
+ export async function main() {
185
+ const probe = await startupProbe();
186
+ if (!probe.svn.ok) {
187
+ console.error(`svn-agent starting with unavailable svn: ${probe.svn.note}`);
188
+ }
189
+ if (!probe.dos2unix.ok || !probe.unix2dos.ok) {
190
+ console.error("svn-agent starting with unavailable EOL converter; eol_fix_verified may fail");
191
+ }
192
+ const server = createServer();
193
+ await server.connect(new StdioServerTransport());
194
+ console.error(`svn MCP ${serverVersion} running on stdio${isReadonlyMode() ? " (READONLY)" : ""}`);
195
+ }
196
+ // Node resolves the ESM entry module through junctions/symlinks, so when the
197
+ // server is launched via the documented `current` junction, import.meta.url
198
+ // points at releases\v<version>\... while argv[1] keeps the junction path.
199
+ // Compare real paths so both launch forms start the server.
200
+ const launchedDirectly = (() => {
201
+ const entry = process.argv[1];
202
+ if (entry === undefined) {
203
+ return false;
204
+ }
205
+ if (import.meta.url === pathToFileURL(entry).href) {
206
+ return true;
207
+ }
208
+ try {
209
+ return import.meta.url === pathToFileURL(fs.realpathSync.native(entry)).href;
210
+ }
211
+ catch {
212
+ return false;
213
+ }
214
+ })();
215
+ if (launchedDirectly) {
216
+ main().catch((error) => {
217
+ console.error(error instanceof Error ? error.stack ?? error.message : String(error));
218
+ process.exit(1);
219
+ });
220
+ }
221
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function parseCommittedRevision(text: string): number | null;
2
+ //# sourceMappingURL=commitText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commitText.d.ts","sourceRoot":"","sources":["../../src/parse/commitText.ts"],"names":[],"mappings":"AAAA,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQlE"}
@@ -0,0 +1,9 @@
1
+ export function parseCommittedRevision(text) {
2
+ const match = /Committed revision (\d+)\./i.exec(text);
3
+ if (!match) {
4
+ return null;
5
+ }
6
+ const revision = Number.parseInt(match[1] ?? "", 10);
7
+ return Number.isFinite(revision) ? revision : null;
8
+ }
9
+ //# sourceMappingURL=commitText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commitText.js","sourceRoot":"","sources":["../../src/parse/commitText.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,KAAK,GAAG,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IACrD,OAAO,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { DiffSummary } from "../types.js";
2
+ export declare function parseDiffText(text: string, lineLimit: number): DiffSummary;
3
+ export declare function createDiffAccumulator(lineLimit: number): {
4
+ pushLine: (line: string) => void;
5
+ summary: () => DiffSummary;
6
+ };
7
+ //# sourceMappingURL=diffText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diffText.d.ts","sourceRoot":"","sources":["../../src/parse/diffText.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,aAAa,CAAC;AAEhE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CAU1E;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG;IACxD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,EAAE,MAAM,WAAW,CAAC;CAC5B,CAgDA"}
@@ -0,0 +1,55 @@
1
+ export function parseDiffText(text, lineLimit) {
2
+ const normalized = text.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
3
+ const lines = normalized ? normalized.split("\n") : [];
4
+ const accumulator = createDiffAccumulator(lineLimit);
5
+ for (const line of lines) {
6
+ accumulator.pushLine(line);
7
+ }
8
+ return accumulator.summary();
9
+ }
10
+ export function createDiffAccumulator(lineLimit) {
11
+ const perFile = new Map();
12
+ let current = null;
13
+ const excerptLines = [];
14
+ let totalLines = 0;
15
+ return {
16
+ pushLine(line) {
17
+ totalLines += 1;
18
+ if (excerptLines.length < lineLimit) {
19
+ excerptLines.push(line);
20
+ }
21
+ const indexMatch = /^Index: (.+)$/.exec(line);
22
+ if (indexMatch) {
23
+ current = {
24
+ path: indexMatch[1] ?? "",
25
+ added: 0,
26
+ removed: 0,
27
+ binary: false
28
+ };
29
+ perFile.set(current.path, current);
30
+ return;
31
+ }
32
+ if (!current) {
33
+ return;
34
+ }
35
+ if (/^(?:Cannot display: file marked as a binary type\.|Binary files differ\.)$/i.test(line)) {
36
+ current.binary = true;
37
+ return;
38
+ }
39
+ if (line.startsWith("+") && !line.startsWith("+++")) {
40
+ current.added += 1;
41
+ }
42
+ else if (line.startsWith("-") && !line.startsWith("---")) {
43
+ current.removed += 1;
44
+ }
45
+ },
46
+ summary() {
47
+ return {
48
+ per_file: [...perFile.values()],
49
+ diff_excerpt: excerptLines.join("\n"),
50
+ truncated: totalLines > lineLimit
51
+ };
52
+ }
53
+ };
54
+ }
55
+ //# sourceMappingURL=diffText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diffText.js","sourceRoot":"","sources":["../../src/parse/diffText.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,SAAiB;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpE,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,WAAW,GAAG,qBAAqB,CAAC,SAAS,CAAC,CAAC;IAErD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO,WAAW,CAAC,OAAO,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAAiB;IAIrD,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;IACnD,IAAI,OAAO,GAA2B,IAAI,CAAC;IAC3C,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,OAAO;QACL,QAAQ,CAAC,IAAY;YACnB,UAAU,IAAI,CAAC,CAAC;YAChB,IAAI,YAAY,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;gBACpC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YAED,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,GAAG;oBACR,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE;oBACzB,KAAK,EAAE,CAAC;oBACR,OAAO,EAAE,CAAC;oBACV,MAAM,EAAE,KAAK;iBACd,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBACnC,OAAO;YACT,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YAED,IAAI,6EAA6E,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7F,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;gBACtB,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpD,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;YACrB,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3D,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QACD,OAAO;YACL,OAAO;gBACL,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC/B,YAAY,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;gBACrC,SAAS,EAAE,UAAU,GAAG,SAAS;aAClC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { WcInfo } from "../types.js";
2
+ export declare function parseInfoXml(xml: string): WcInfo[];
3
+ //# sourceMappingURL=infoXml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infoXml.d.ts","sourceRoot":"","sources":["../../src/parse/infoXml.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAQ1C,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BlD"}
@@ -0,0 +1,35 @@
1
+ import { XMLParser } from "fast-xml-parser";
2
+ const parser = new XMLParser({
3
+ ignoreAttributes: false,
4
+ attributeNamePrefix: "",
5
+ textNodeName: "text"
6
+ });
7
+ export function parseInfoXml(xml) {
8
+ if (!xml.trim()) {
9
+ return [];
10
+ }
11
+ const parsed = parser.parse(xml);
12
+ return asArray(parsed.info?.entry).map((entry) => {
13
+ const entryObj = entry;
14
+ return {
15
+ url: entryObj.url ?? null,
16
+ repo_root: entryObj.repository?.root ?? null,
17
+ wc_root: entryObj["wc-info"]?.["wcroot-abspath"] ?? null,
18
+ revision: parseRevision(entryObj.revision)
19
+ };
20
+ });
21
+ }
22
+ function parseRevision(value) {
23
+ if (value === undefined) {
24
+ return null;
25
+ }
26
+ const parsed = Number.parseInt(String(value), 10);
27
+ return Number.isFinite(parsed) ? parsed : null;
28
+ }
29
+ function asArray(value) {
30
+ if (value === undefined) {
31
+ return [];
32
+ }
33
+ return Array.isArray(value) ? value : [value];
34
+ }
35
+ //# sourceMappingURL=infoXml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infoXml.js","sourceRoot":"","sources":["../../src/parse/infoXml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,gBAAgB,EAAE,KAAK;IACvB,mBAAmB,EAAE,EAAE;IACvB,YAAY,EAAE,MAAM;CACrB,CAAC,CAAC;AAEH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAI9B,CAAC;IAEF,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/C,MAAM,QAAQ,GAAG,KAKhB,CAAC;QAEF,OAAO;YACL,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,IAAI;YACzB,SAAS,EAAE,QAAQ,CAAC,UAAU,EAAE,IAAI,IAAI,IAAI;YAC5C,OAAO,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,gBAAgB,CAAC,IAAI,IAAI;YACxD,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;SAC3C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,KAAkC;IACvD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,SAAS,OAAO,CAAI,KAA0B;IAC5C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ChangedPath } from "../types.js";
2
+ export interface LogEntry {
3
+ rev: number;
4
+ author: string;
5
+ date: string;
6
+ msg: string;
7
+ changed_paths: ChangedPath[];
8
+ }
9
+ export declare function parseLogXml(xml: string): LogEntry[];
10
+ //# sourceMappingURL=logXml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logXml.d.ts","sourceRoot":"","sources":["../../src/parse/logXml.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAQ/C,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,WAAW,EAAE,CAAC;CAC9B;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,EAAE,CAkCnD"}
@@ -0,0 +1,39 @@
1
+ import { XMLParser } from "fast-xml-parser";
2
+ const parser = new XMLParser({
3
+ ignoreAttributes: false,
4
+ attributeNamePrefix: "",
5
+ textNodeName: "text"
6
+ });
7
+ export function parseLogXml(xml) {
8
+ if (!xml.trim()) {
9
+ return [];
10
+ }
11
+ const parsed = parser.parse(xml);
12
+ return asArray(parsed.log?.logentry).map((entry) => {
13
+ const entryObj = entry;
14
+ return {
15
+ rev: parseNumber(entryObj.revision),
16
+ author: entryObj.author ?? "",
17
+ date: entryObj.date ?? "",
18
+ msg: entryObj.msg ?? "",
19
+ changed_paths: asArray(entryObj.paths?.path).map((pathEntry) => {
20
+ const pathObj = pathEntry;
21
+ return {
22
+ status: pathObj.action ?? "",
23
+ path: pathObj.text ?? ""
24
+ };
25
+ })
26
+ };
27
+ });
28
+ }
29
+ function parseNumber(value) {
30
+ const parsed = Number.parseInt(String(value ?? "0"), 10);
31
+ return Number.isFinite(parsed) ? parsed : 0;
32
+ }
33
+ function asArray(value) {
34
+ if (value === undefined) {
35
+ return [];
36
+ }
37
+ return Array.isArray(value) ? value : [value];
38
+ }
39
+ //# sourceMappingURL=logXml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logXml.js","sourceRoot":"","sources":["../../src/parse/logXml.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,gBAAgB,EAAE,KAAK;IACvB,mBAAmB,EAAE,EAAE;IACvB,YAAY,EAAE,MAAM;CACrB,CAAC,CAAC;AAUH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAChB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAI9B,CAAC;IAEF,OAAO,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACjD,MAAM,QAAQ,GAAG,KAMhB,CAAC;QAEF,OAAO;YACL,GAAG,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACnC,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,EAAE;YAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;YACzB,GAAG,EAAE,QAAQ,CAAC,GAAG,IAAI,EAAE;YACvB,aAAa,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;gBAC7D,MAAM,OAAO,GAAG,SAA+C,CAAC;gBAChE,OAAO;oBACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;oBAC5B,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;iBACzB,CAAC;YACJ,CAAC,CAAC;SACH,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,KAAkC;IACrD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,OAAO,CAAI,KAA0B;IAC5C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ChangedPath, Conflict } from "../types.js";
2
+ export declare function parseStatusXml(xml: string): {
3
+ changed_paths: ChangedPath[];
4
+ conflicts: Conflict[];
5
+ };
6
+ //# sourceMappingURL=statusXml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusXml.d.ts","sourceRoot":"","sources":["../../src/parse/statusXml.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAsBzD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;CAAE,CAwDnG"}
@@ -0,0 +1,64 @@
1
+ import { XMLParser } from "fast-xml-parser";
2
+ const parser = new XMLParser({
3
+ ignoreAttributes: false,
4
+ attributeNamePrefix: "",
5
+ textNodeName: "text"
6
+ });
7
+ const statusMap = {
8
+ modified: "M",
9
+ added: "A",
10
+ deleted: "D",
11
+ replaced: "R",
12
+ conflicted: "C",
13
+ unversioned: "?",
14
+ missing: "!",
15
+ incomplete: "!",
16
+ obstructed: "~",
17
+ normal: "",
18
+ none: ""
19
+ };
20
+ export function parseStatusXml(xml) {
21
+ if (!xml.trim()) {
22
+ return { changed_paths: [], conflicts: [] };
23
+ }
24
+ const parsed = parser.parse(xml);
25
+ const targets = asArray(parsed.status?.target);
26
+ const changed_paths = [];
27
+ const conflicts = [];
28
+ for (const target of targets) {
29
+ const targetObj = target;
30
+ for (const entry of asArray(targetObj.entry)) {
31
+ const entryObj = entry;
32
+ const item = entryObj["wc-status"]?.item ?? "";
33
+ const props = entryObj["wc-status"]?.props ?? "";
34
+ let status = statusMap[item] ?? item.slice(0, 1).toUpperCase();
35
+ const path = entryObj.path ?? "";
36
+ if (!status && props === "modified") {
37
+ status = "_M";
38
+ }
39
+ if (props === "conflicted") {
40
+ status = status || "C";
41
+ }
42
+ if (status) {
43
+ changed_paths.push({ status, path });
44
+ }
45
+ if (item === "conflicted") {
46
+ conflicts.push({ path, type: "text" });
47
+ }
48
+ if (props === "conflicted") {
49
+ conflicts.push({ path, type: "prop" });
50
+ }
51
+ if (entryObj["wc-status"]?.["tree-conflicted"] === "true" || entryObj["wc-status"]?.["tree-conflicted"] === true) {
52
+ conflicts.push({ path, type: "tree" });
53
+ }
54
+ }
55
+ }
56
+ return { changed_paths, conflicts };
57
+ }
58
+ function asArray(value) {
59
+ if (value === undefined) {
60
+ return [];
61
+ }
62
+ return Array.isArray(value) ? value : [value];
63
+ }
64
+ //# sourceMappingURL=statusXml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusXml.js","sourceRoot":"","sources":["../../src/parse/statusXml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ChangedPath, Conflict } from "../types.js";
2
+ export declare function parseUpdateText(text: string): {
3
+ changed_paths: ChangedPath[];
4
+ conflicts: Conflict[];
5
+ };
6
+ //# sourceMappingURL=updateText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateText.d.ts","sourceRoot":"","sources":["../../src/parse/updateText.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEzD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,WAAW,EAAE,CAAC;IAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;CAAE,CAgDrG"}
@@ -0,0 +1,67 @@
1
+ export function parseUpdateText(text) {
2
+ const changed_paths = [];
3
+ const conflicts = [];
4
+ let treeConflictSummaryCount = 0;
5
+ for (const rawLine of text.replace(/\r\n/g, "\n").split("\n")) {
6
+ const line = rawLine.trimEnd();
7
+ if (!line) {
8
+ continue;
9
+ }
10
+ const summaryMatch = /^\s*Tree conflicts:\s*(\d+)/i.exec(line);
11
+ if (summaryMatch) {
12
+ treeConflictSummaryCount = Number.parseInt(summaryMatch[1] ?? "0", 10);
13
+ continue;
14
+ }
15
+ const columns = line.slice(0, 5).padEnd(5, " ");
16
+ const path = line.slice(5).trim();
17
+ if (!isUpdateStatusColumns(columns)) {
18
+ continue;
19
+ }
20
+ const contentStatus = columns[0] ?? " ";
21
+ const propStatus = columns[1] ?? " ";
22
+ const treeStatus = columns[3] ?? " ";
23
+ const status = firstStatus([contentStatus, propStatus, treeStatus]);
24
+ if (!status || !path) {
25
+ continue;
26
+ }
27
+ changed_paths.push({ status, path });
28
+ if (contentStatus === "C") {
29
+ conflicts.push({ path, type: "text" });
30
+ }
31
+ if (propStatus === "C") {
32
+ conflicts.push({ path, type: "prop" });
33
+ }
34
+ if (treeStatus === "C") {
35
+ conflicts.push({ path, type: "tree" });
36
+ }
37
+ }
38
+ const detailedTreeConflicts = conflicts.filter((conflict) => conflict.type === "tree").length;
39
+ for (let index = detailedTreeConflicts; index < treeConflictSummaryCount; index += 1) {
40
+ conflicts.push({ path: "", type: "tree" });
41
+ }
42
+ return { changed_paths, conflicts };
43
+ }
44
+ // Real update-status lines use four status columns plus a separator space
45
+ // before the path. Informational lines ("Updated to revision 42.",
46
+ // "Updating '.':", "At revision 42.") fail this shape and must not become
47
+ // phantom changed paths.
48
+ function isUpdateStatusColumns(columns) {
49
+ if ((columns[4] ?? " ") !== " ") {
50
+ return false;
51
+ }
52
+ for (let index = 0; index < 4; index += 1) {
53
+ if (!/^[UGCEADMRB~! ]$/.test(columns[index] ?? " ")) {
54
+ return false;
55
+ }
56
+ }
57
+ return true;
58
+ }
59
+ function firstStatus(columns) {
60
+ for (const status of columns) {
61
+ if (/^[UGCEADMR~!]$/.test(status)) {
62
+ return status;
63
+ }
64
+ }
65
+ return null;
66
+ }
67
+ //# sourceMappingURL=updateText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateText.js","sourceRoot":"","sources":["../../src/parse/updateText.ts"],"names":[],"mappings":"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"}