@codesys/mcp-toolkit 1.5.8 → 2.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 (110) hide show
  1. package/CHANGELOG.md +153 -189
  2. package/LICENSE +21 -21
  3. package/README.md +269 -152
  4. package/dist/actions.d.ts +28 -0
  5. package/dist/actions.js +98 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/bridge/bridge.d.ts +105 -0
  8. package/dist/bridge/bridge.js +400 -0
  9. package/dist/bridge/bridge.js.map +1 -0
  10. package/dist/cli.d.ts +2 -0
  11. package/dist/cli.js +196 -0
  12. package/dist/cli.js.map +1 -0
  13. package/dist/codesys/cache.d.ts +48 -0
  14. package/dist/codesys/cache.js +82 -0
  15. package/dist/codesys/cache.js.map +1 -0
  16. package/dist/codesys/changes.d.ts +57 -0
  17. package/dist/codesys/changes.js +133 -0
  18. package/dist/codesys/changes.js.map +1 -0
  19. package/dist/codesys/decl.d.ts +45 -0
  20. package/dist/codesys/decl.js +251 -0
  21. package/dist/codesys/decl.js.map +1 -0
  22. package/dist/codesys/devices.d.ts +34 -0
  23. package/dist/codesys/devices.js +82 -0
  24. package/dist/codesys/devices.js.map +1 -0
  25. package/dist/codesys/diff.d.ts +13 -0
  26. package/dist/codesys/diff.js +61 -0
  27. package/dist/codesys/diff.js.map +1 -0
  28. package/dist/codesys/install.d.ts +40 -0
  29. package/dist/codesys/install.js +144 -0
  30. package/dist/codesys/install.js.map +1 -0
  31. package/dist/codesys/library-browse.d.ts +19 -0
  32. package/dist/codesys/library-browse.js +57 -0
  33. package/dist/codesys/library-browse.js.map +1 -0
  34. package/dist/codesys/outline.d.ts +32 -0
  35. package/dist/codesys/outline.js +219 -0
  36. package/dist/codesys/outline.js.map +1 -0
  37. package/dist/codesys/simulation.d.ts +34 -0
  38. package/dist/codesys/simulation.js +57 -0
  39. package/dist/codesys/simulation.js.map +1 -0
  40. package/dist/codesys/st.d.ts +36 -0
  41. package/dist/codesys/st.js +69 -0
  42. package/dist/codesys/st.js.map +1 -0
  43. package/dist/daemon.d.ts +46 -0
  44. package/dist/daemon.js +173 -0
  45. package/dist/daemon.js.map +1 -0
  46. package/dist/driver.d.ts +25 -0
  47. package/dist/driver.js +33 -0
  48. package/dist/driver.js.map +1 -0
  49. package/dist/panel/sim-panel.html +357 -0
  50. package/dist/panel/viewer.html +126 -0
  51. package/dist/panel-types.d.ts +20 -0
  52. package/dist/panel-types.js +3 -0
  53. package/dist/panel-types.js.map +1 -0
  54. package/dist/panel.d.ts +27 -0
  55. package/dist/panel.js +208 -0
  56. package/dist/panel.js.map +1 -0
  57. package/dist/server.d.ts +5 -0
  58. package/dist/server.js +33 -974
  59. package/dist/server.js.map +1 -0
  60. package/dist/tools.d.ts +103 -0
  61. package/dist/tools.js +793 -0
  62. package/dist/tools.js.map +1 -0
  63. package/dist/viewer.d.ts +14 -0
  64. package/dist/viewer.js +125 -0
  65. package/dist/viewer.js.map +1 -0
  66. package/package.json +66 -51
  67. package/watcher/mcp_compat.py +147 -0
  68. package/watcher/mcp_ops.py +1178 -0
  69. package/watcher/mcp_sim.py +246 -0
  70. package/watcher/watcher.py +255 -0
  71. package/.claude/settings.local.json +0 -29
  72. package/CLAUDE.md +0 -26
  73. package/CONTRIBUTING.md +0 -72
  74. package/README.md.enhanced +0 -155
  75. package/codesys-mcp-toolkit-1.2.0.tgz +0 -0
  76. package/codesys-mcp-toolkit-1.2.1.tgz +0 -0
  77. package/codesys-mcp-toolkit-1.5.7.tgz +0 -0
  78. package/codesys-mcp-toolkit-1.5.8.tgz +0 -0
  79. package/dist/bin.js +0 -75
  80. package/dist/check_session_paths.js +0 -149
  81. package/dist/codesys_interop.js +0 -435
  82. package/dist/direct_session_command.js +0 -293
  83. package/dist/scriptLoader.js +0 -165
  84. package/dist/scripts/check_status.py +0 -21
  85. package/dist/scripts/compile_project.py +0 -65
  86. package/dist/scripts/create_method.py +0 -80
  87. package/dist/scripts/create_pou.py +0 -102
  88. package/dist/scripts/create_project.py +0 -116
  89. package/dist/scripts/create_property.py +0 -78
  90. package/dist/scripts/ensure_project_open.py +0 -154
  91. package/dist/scripts/find_object_by_path.py +0 -111
  92. package/dist/scripts/get_pou_code.py +0 -91
  93. package/dist/scripts/get_project_structure.py +0 -72
  94. package/dist/scripts/open_project.py +0 -25
  95. package/dist/scripts/save_project.py +0 -29
  96. package/dist/scripts/session_status.py +0 -281
  97. package/dist/scripts/set_pou_code.py +0 -109
  98. package/dist/scripts/start_session.py +0 -809
  99. package/dist/scripts/stop_session.py +0 -324
  100. package/dist/sessionManager.js +0 -798
  101. package/docs/configuration.md +0 -141
  102. package/docs/index.md +0 -26
  103. package/docs/installation.md +0 -84
  104. package/docs/session_management.md +0 -110
  105. package/examples/README.md +0 -78
  106. package/examples/sample_config.json +0 -32
  107. package/replacements_session_status.txt +0 -16
  108. package/scriptDoc.txt +0 -8679
  109. package/scripts/build.js +0 -25
  110. package/scripts/fix_fstrings.py +0 -76
@@ -0,0 +1,251 @@
1
+ /**
2
+ * A tolerant parser for CODESYS ST declarations: headers (kind, name,
3
+ * EXTENDS / IMPLEMENTS, return type, modifiers), variable sections with
4
+ * names, types, initial values, AT addresses and comments, enum members and
5
+ * struct fields. Used for the outline and the I/O list; it never rejects
6
+ * input, it just extracts what it recognises.
7
+ */
8
+ const SECTION_RE = /^(VAR_INPUT|VAR_OUTPUT|VAR_IN_OUT|VAR_GLOBAL|VAR_EXTERNAL|VAR_CONFIG|VAR_TEMP|VAR_STAT|VAR_INST|VAR)\b(.*)$/i;
9
+ const MODIFIERS = new Set(["PUBLIC", "PRIVATE", "PROTECTED", "INTERNAL", "ABSTRACT", "FINAL"]);
10
+ /** Split text into statements ending in `;` outside brackets, strings and comments; keep the trailing line comment. */
11
+ function statements(text) {
12
+ const out = [];
13
+ let cur = "";
14
+ let depth = 0;
15
+ let pendingComment;
16
+ let i = 0;
17
+ const push = () => {
18
+ const body = cur.replace(/\s+/g, " ").trim();
19
+ if (body)
20
+ out.push({ body, ...(pendingComment ? { comment: pendingComment } : {}) });
21
+ cur = "";
22
+ pendingComment = undefined;
23
+ };
24
+ while (i < text.length) {
25
+ const c = text[i];
26
+ const two = text.slice(i, i + 2);
27
+ if (two === "//") {
28
+ const end = text.indexOf("\n", i);
29
+ const comment = text.slice(i + 2, end < 0 ? undefined : end).trim();
30
+ // A comment right after `;` on the same line belongs to the previous statement.
31
+ const last = out.at(-1);
32
+ if (!cur.trim() && last && !last.comment && comment)
33
+ last.comment = comment;
34
+ else if (comment)
35
+ pendingComment ??= comment;
36
+ i = end < 0 ? text.length : end;
37
+ continue;
38
+ }
39
+ if (two === "(*" || two === "/*") {
40
+ const close = two === "(*" ? "*)" : "*/";
41
+ const end = text.indexOf(close, i + 2);
42
+ const comment = text.slice(i + 2, end < 0 ? undefined : end).trim();
43
+ const last = out.at(-1);
44
+ if (!cur.trim() && last && !last.comment && comment && !comment.includes("\n"))
45
+ last.comment = comment;
46
+ i = end < 0 ? text.length : end + 2;
47
+ continue;
48
+ }
49
+ if (c === "{") {
50
+ const end = text.indexOf("}", i);
51
+ cur += text.slice(i, end < 0 ? undefined : end + 1);
52
+ i = end < 0 ? text.length : end + 1;
53
+ continue;
54
+ }
55
+ if (c === "'" || c === '"') {
56
+ let j = i + 1;
57
+ while (j < text.length && text[j] !== c)
58
+ j += text[j] === "$" ? 2 : 1;
59
+ cur += text.slice(i, j + 1);
60
+ i = j + 1;
61
+ continue;
62
+ }
63
+ if (c === "(" || c === "[")
64
+ depth++;
65
+ if (c === ")" || c === "]")
66
+ depth = Math.max(0, depth - 1);
67
+ if (c === ";" && depth === 0) {
68
+ push();
69
+ i++;
70
+ continue;
71
+ }
72
+ if (c === "\n" && depth === 0) {
73
+ // Section keywords and headers have no `;`: end them at the line break.
74
+ const t = cur.trim();
75
+ // `TYPE X :` continues on the next line (the enum list or STRUCT).
76
+ if (/^(\{[^}]*\}\s*)*TYPE\b[^;]*:\s*$/i.test(t))
77
+ cur += " ";
78
+ else if (/^(\{[^}]*\}\s*)*(VAR\w*|END_VAR|END_STRUCT|END_UNION|END_TYPE|STRUCT|UNION|(PROGRAM|FUNCTION_BLOCK|FUNCTION|METHOD|PROPERTY|INTERFACE|TYPE)\b.*)(\s+\w+)*$/i.test(t) && !/:=/.test(t.replace(/^TYPE\b.*/i, "")))
79
+ push();
80
+ else
81
+ cur += " ";
82
+ i++;
83
+ continue;
84
+ }
85
+ cur += c;
86
+ i++;
87
+ }
88
+ push();
89
+ return out;
90
+ }
91
+ const splitList = (s) => s
92
+ .split(",")
93
+ .map((x) => x.trim())
94
+ .filter(Boolean);
95
+ function parseHeader(stmt) {
96
+ const attributes = [...stmt.matchAll(/\{\s*attribute\s+'([^']+)'(?:\s*:=\s*'[^']*')?\s*\}/gi)].map((m) => m[1]);
97
+ const s = stmt.replace(/\{[^}]*\}/g, " ").replace(/\s+/g, " ").trim();
98
+ const m = /^(PROGRAM|FUNCTION_BLOCK|FUNCTION|METHOD|PROPERTY|INTERFACE|TYPE|VAR_GLOBAL|TEST_PROGRAM|TEST_FUNCTION_BLOCK)\b\s*(.*)$/i.exec(s);
99
+ if (!m)
100
+ return { keyword: "", modifiers: [], attributes };
101
+ const keyword = m[1].toUpperCase();
102
+ let rest = m[2];
103
+ const modifiers = [];
104
+ for (;;) {
105
+ const w = /^(\w+)\s*/.exec(rest);
106
+ if (w && MODIFIERS.has(w[1].toUpperCase())) {
107
+ modifiers.push(w[1].toUpperCase());
108
+ rest = rest.slice(w[0].length);
109
+ }
110
+ else
111
+ break;
112
+ }
113
+ const h = { keyword, modifiers, attributes };
114
+ const name = /^([A-Za-z_]\w*)/.exec(rest);
115
+ if (name) {
116
+ h.name = name[1];
117
+ rest = rest.slice(name[0].length).trim();
118
+ }
119
+ const ret = /^:\s*(.+?)(?=\s+(EXTENDS|IMPLEMENTS)\b|$)/i.exec(rest);
120
+ if (ret && keyword !== "TYPE")
121
+ h.returnType = ret[1].trim();
122
+ const ext = /\bEXTENDS\s+(.+?)(?=\s+IMPLEMENTS\b|$)/i.exec(rest);
123
+ if (ext)
124
+ h.extends = splitList(ext[1]);
125
+ const imp = /\bIMPLEMENTS\s+(.+)$/i.exec(rest);
126
+ if (imp)
127
+ h.implements = splitList(imp[1]);
128
+ return h;
129
+ }
130
+ function parseVar(body, section, flags, comment) {
131
+ const s = body.replace(/\{[^}]*\}/g, " ").trim();
132
+ const m = /^([A-Za-z_][\w\s,]*?)(?:\s+AT\s+(%\S+))?\s*:\s*([\s\S]+)$/i.exec(s);
133
+ if (!m)
134
+ return [];
135
+ let type = m[3].trim();
136
+ let init;
137
+ // `:=` at top level separates type and initial value.
138
+ let depth = 0;
139
+ for (let i = 0; i < type.length - 1; i++) {
140
+ const c = type[i];
141
+ if (c === "(" || c === "[")
142
+ depth++;
143
+ else if (c === ")" || c === "]")
144
+ depth--;
145
+ else if (depth === 0 && c === ":" && type[i + 1] === "=") {
146
+ init = type.slice(i + 2).trim();
147
+ type = type.slice(0, i).trim();
148
+ break;
149
+ }
150
+ }
151
+ return splitList(m[1]).map((name) => ({
152
+ name,
153
+ type,
154
+ section,
155
+ ...(init !== undefined ? { init } : {}),
156
+ ...(m[2] ? { at: m[2] } : {}),
157
+ ...(comment ? { comment } : {}),
158
+ ...(flags.constant ? { constant: true } : {}),
159
+ ...(flags.retain ? { retain: true } : {}),
160
+ ...(flags.persistent ? { persistent: true } : {}),
161
+ }));
162
+ }
163
+ export function parseDeclaration(decl) {
164
+ const stmts = statements(decl ?? "");
165
+ const result = { header: { keyword: "", modifiers: [], attributes: [] }, vars: [] };
166
+ let section;
167
+ let flags = { constant: false, retain: false, persistent: false };
168
+ let inStruct;
169
+ for (let k = 0; k < stmts.length; k++) {
170
+ const { body, comment } = stmts[k];
171
+ const plain = body.replace(/\{[^}]*\}/g, " ").trim();
172
+ if (!result.header.keyword) {
173
+ const h = parseHeader(body);
174
+ if (h.keyword) {
175
+ result.header = h;
176
+ if (h.keyword === "VAR_GLOBAL") {
177
+ section = "VAR_GLOBAL";
178
+ flags = { constant: /\bCONSTANT\b/i.test(body), retain: /\bRETAIN\b/i.test(body), persistent: /\bPERSISTENT\b/i.test(body) };
179
+ }
180
+ if (h.keyword === "TYPE") {
181
+ // TYPE Name : (A := 0, B) INT | TYPE Name : STRUCT | TYPE Name : INT
182
+ const t = /^TYPE\s+\w+\s*(?:EXTENDS\s+[\w.]+\s*)?:\s*([\s\S]*)$/i.exec(plain)?.[1]?.trim() ?? "";
183
+ if (t.startsWith("(")) {
184
+ const close = t.lastIndexOf(")");
185
+ result.dutKind = "enum";
186
+ result.enumMembers = splitList(t.slice(1, close)).map((x) => {
187
+ const [n, v] = x.split(":=").map((y) => y.trim());
188
+ return v !== undefined ? { name: n, value: v } : { name: n };
189
+ });
190
+ const base = t.slice(close + 1).trim();
191
+ if (base)
192
+ result.baseType = base;
193
+ }
194
+ else if (/^STRUCT\b/i.test(t)) {
195
+ result.dutKind = "struct";
196
+ inStruct = "struct";
197
+ result.fields = [];
198
+ }
199
+ else if (/^UNION\b/i.test(t)) {
200
+ result.dutKind = "union";
201
+ inStruct = "union";
202
+ result.fields = [];
203
+ }
204
+ else if (t) {
205
+ result.dutKind = "alias";
206
+ result.baseType = t;
207
+ }
208
+ }
209
+ continue;
210
+ }
211
+ }
212
+ const sec = SECTION_RE.exec(plain);
213
+ if (sec) {
214
+ section = sec[1].toUpperCase();
215
+ flags = { constant: /\bCONSTANT\b/i.test(sec[2]), retain: /\bRETAIN\b/i.test(sec[2]), persistent: /\bPERSISTENT\b/i.test(sec[2]) };
216
+ continue;
217
+ }
218
+ if (/^END_VAR\b/i.test(plain)) {
219
+ section = undefined;
220
+ continue;
221
+ }
222
+ if (/^(STRUCT|UNION)\b/i.test(plain) && result.header.keyword === "TYPE") {
223
+ inStruct = /^STRUCT/i.test(plain) ? "struct" : "union";
224
+ result.dutKind ??= inStruct;
225
+ result.fields ??= [];
226
+ continue;
227
+ }
228
+ if (/^END_(STRUCT|UNION|TYPE)\b/i.test(plain)) {
229
+ inStruct = undefined;
230
+ continue;
231
+ }
232
+ if (inStruct) {
233
+ result.fields.push(...parseVar(body, "VAR", { constant: false, retain: false, persistent: false }, comment));
234
+ continue;
235
+ }
236
+ if (section)
237
+ result.vars.push(...parseVar(body, section, flags, comment));
238
+ }
239
+ return result;
240
+ }
241
+ /** One-line signature, e.g. `METHOD Reset(bHard : BOOL) : BOOL`. */
242
+ export function signature(p, name) {
243
+ const h = p.header;
244
+ const ins = p.vars.filter((v) => v.section === "VAR_INPUT" || v.section === "VAR_IN_OUT").map((v) => `${v.section === "VAR_IN_OUT" ? "VAR_IN_OUT " : ""}${v.name} : ${v.type}`);
245
+ const outs = p.vars.filter((v) => v.section === "VAR_OUTPUT").map((v) => `${v.name} : ${v.type}`);
246
+ let s = `${name ?? h.name ?? "?"}(${ins.join(", ")}${outs.length ? `; out ${outs.join(", ")}` : ""})`;
247
+ if (h.returnType)
248
+ s += ` : ${h.returnType}`;
249
+ return s;
250
+ }
251
+ //# sourceMappingURL=decl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decl.js","sourceRoot":"","sources":["../../src/codesys/decl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /** The device tree and its I/O mapping, as CODESYS exports it. Pure: parsing and formatting only. */
2
+ export interface DeviceInfo {
3
+ /** Path from the project root, e.g. "Device/Plc Logic/..." or "PLCWinNT/EtherCAT_Master/EL1008". */
4
+ path: string;
5
+ name: string;
6
+ depth: number;
7
+ type?: number | null;
8
+ id?: string;
9
+ version?: string;
10
+ enabled?: boolean | null;
11
+ /** The device's I/O mapping in CODESYS's CSV export format (only when it has channels). */
12
+ io_csv?: string;
13
+ io_error?: string;
14
+ }
15
+ export interface IoChannel {
16
+ /** The mapped variable, e.g. "Application.GVL_IO.xValve"; empty when nothing is mapped. */
17
+ variable: string;
18
+ /** "Parameter name @ counter in device", e.g. "Input@1" or "Bit0@3". */
19
+ parameter: string;
20
+ unit: string;
21
+ description: string;
22
+ /** IEC address, e.g. "%IX0.0". */
23
+ address: string;
24
+ device: string;
25
+ }
26
+ /**
27
+ * Parse CODESYS's I/O mapping export ("//CoDeSys Mapping Export V1.2"): comment lines start
28
+ * with "//"; the column header names "Mapped variable", "Parameter name @ counter in device",
29
+ * "Unit", "Description", "IEC address", "Device name". The separator is taken from that header.
30
+ */
31
+ export declare function parseIoMappingCsv(text: string): IoChannel[];
32
+ /** "Application.GVL_IO.xValve" -> "GVL_IO.xValve" (the toolkit's paths are relative to the application). */
33
+ export declare const shortVariable: (v: string) => string;
34
+ export declare function describeDevices(devices: DeviceInfo[]): string;
@@ -0,0 +1,82 @@
1
+ /** The device tree and its I/O mapping, as CODESYS exports it. Pure: parsing and formatting only. */
2
+ /** Split one CSV line, honouring double quotes. */
3
+ function splitCsv(line, sep) {
4
+ const out = [];
5
+ let cur = "";
6
+ let quoted = false;
7
+ for (let i = 0; i < line.length; i++) {
8
+ const c = line[i];
9
+ if (c === '"') {
10
+ if (quoted && line[i + 1] === '"') {
11
+ cur += '"';
12
+ i++;
13
+ }
14
+ else
15
+ quoted = !quoted;
16
+ }
17
+ else if (c === sep && !quoted) {
18
+ out.push(cur);
19
+ cur = "";
20
+ }
21
+ else
22
+ cur += c;
23
+ }
24
+ out.push(cur);
25
+ return out.map((s) => s.trim());
26
+ }
27
+ /**
28
+ * Parse CODESYS's I/O mapping export ("//CoDeSys Mapping Export V1.2"): comment lines start
29
+ * with "//"; the column header names "Mapped variable", "Parameter name @ counter in device",
30
+ * "Unit", "Description", "IEC address", "Device name". The separator is taken from that header.
31
+ */
32
+ export function parseIoMappingCsv(text) {
33
+ const lines = text.split(/\r?\n/);
34
+ const header = lines.find((l) => /mapped variable/i.test(l)) ?? "";
35
+ const sep = [";", "\t", ","].find((s) => header.includes(s)) ?? ",";
36
+ const names = splitCsv(header, sep).map((h) => h.replace(/^\/\//, "").trim().toLowerCase());
37
+ const col = (re, fallback) => {
38
+ const i = names.findIndex((n) => re.test(n));
39
+ return i >= 0 ? i : fallback;
40
+ };
41
+ const at = {
42
+ variable: col(/^mapped variable/, 0),
43
+ parameter: col(/^parameter/, 1),
44
+ unit: col(/^unit/, 2),
45
+ description: col(/^description/, 3),
46
+ address: col(/address$/, 4),
47
+ device: col(/^device/, 5),
48
+ };
49
+ const out = [];
50
+ for (const l of lines) {
51
+ if (!l.trim() || l.startsWith("//"))
52
+ continue;
53
+ const c = splitCsv(l, sep);
54
+ out.push({
55
+ variable: c[at.variable] ?? "",
56
+ parameter: c[at.parameter] ?? "",
57
+ unit: c[at.unit] ?? "",
58
+ description: c[at.description] ?? "",
59
+ address: c[at.address] ?? "",
60
+ device: c[at.device] ?? "",
61
+ });
62
+ }
63
+ return out;
64
+ }
65
+ /** "Application.GVL_IO.xValve" -> "GVL_IO.xValve" (the toolkit's paths are relative to the application). */
66
+ export const shortVariable = (v) => v.replace(/^[A-Za-z_][A-Za-z0-9_]*\.(?=[A-Za-z_][A-Za-z0-9_]*\.)/, "");
67
+ export function describeDevices(devices) {
68
+ if (!devices.length)
69
+ return "No devices in the project.";
70
+ const lines = [];
71
+ for (const d of devices) {
72
+ const ident = d.id ? ` (type ${d.type ?? "?"}, id ${d.id}, version ${d.version ?? "?"})` : "";
73
+ const channels = d.io_csv ? parseIoMappingCsv(d.io_csv) : [];
74
+ const mapped = channels.filter((c) => c.variable).length;
75
+ lines.push(`${" ".repeat(d.depth)}${d.name}${ident}${d.enabled === false ? " [disabled]" : ""}${channels.length ? `: ${channels.length} channel(s), ${mapped} mapped` : ""}${d.io_error ? ` (I/O mapping not readable: ${d.io_error})` : ""}`);
76
+ for (const c of channels) {
77
+ lines.push(`${" ".repeat(d.depth + 1)}${(c.address || "-").padEnd(10)} ${c.parameter}${c.description ? ` ${c.description}` : ""}${c.unit ? ` [${c.unit}]` : ""} -> ${c.variable ? shortVariable(c.variable) : "(not mapped)"}`);
78
+ }
79
+ }
80
+ return lines.join("\n");
81
+ }
82
+ //# sourceMappingURL=devices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/codesys/devices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** Line diff (LCS) and unified-style formatting. Pure: also bundled into the panel. */
2
+ export type DiffOp = {
3
+ op: " " | "+" | "-";
4
+ text: string;
5
+ };
6
+ /** Line diff (LCS). Falls back to remove-all/add-all for very large inputs. */
7
+ export declare function lineDiff(a: string, b: string): DiffOp[];
8
+ export declare const countDiff: (ops: DiffOp[]) => {
9
+ plus: number;
10
+ minus: number;
11
+ };
12
+ /** Unified-style hunks with line numbers of the new text and `context` lines around changes. */
13
+ export declare function formatDiff(ops: DiffOp[], context?: number): string[];
@@ -0,0 +1,61 @@
1
+ /** Line diff (LCS) and unified-style formatting. Pure: also bundled into the panel. */
2
+ /** Line diff (LCS). Falls back to remove-all/add-all for very large inputs. */
3
+ export function lineDiff(a, b) {
4
+ const x = a ? a.split("\n") : [];
5
+ const y = b ? b.split("\n") : [];
6
+ if (x.length * y.length > 4_000_000)
7
+ return [...x.map((t) => ({ op: "-", text: t })), ...y.map((t) => ({ op: "+", text: t }))];
8
+ const n = x.length;
9
+ const m = y.length;
10
+ const L = Array.from({ length: n + 1 }, () => new Uint32Array(m + 1));
11
+ for (let i = n - 1; i >= 0; i--)
12
+ for (let j = m - 1; j >= 0; j--)
13
+ L[i][j] = x[i] === y[j] ? L[i + 1][j + 1] + 1 : Math.max(L[i + 1][j], L[i][j + 1]);
14
+ const ops = [];
15
+ let i = 0;
16
+ let j = 0;
17
+ while (i < n && j < m) {
18
+ if (x[i] === y[j]) {
19
+ ops.push({ op: " ", text: x[i] });
20
+ i++;
21
+ j++;
22
+ }
23
+ else if (L[i + 1][j] >= L[i][j + 1])
24
+ ops.push({ op: "-", text: x[i++] });
25
+ else
26
+ ops.push({ op: "+", text: y[j++] });
27
+ }
28
+ while (i < n)
29
+ ops.push({ op: "-", text: x[i++] });
30
+ while (j < m)
31
+ ops.push({ op: "+", text: y[j++] });
32
+ return ops;
33
+ }
34
+ export const countDiff = (ops) => ({ plus: ops.filter((o) => o.op === "+").length, minus: ops.filter((o) => o.op === "-").length });
35
+ /** Unified-style hunks with line numbers of the new text and `context` lines around changes. */
36
+ export function formatDiff(ops, context = 2) {
37
+ const out = [];
38
+ let newLine = 0;
39
+ const numbered = ops.map((o) => {
40
+ if (o.op !== "-")
41
+ newLine++;
42
+ return { ...o, line: o.op === "-" ? undefined : newLine };
43
+ });
44
+ const keep = new Set();
45
+ numbered.forEach((o, k) => {
46
+ if (o.op !== " ")
47
+ for (let d = -context; d <= context; d++)
48
+ keep.add(k + d);
49
+ });
50
+ let last = -2;
51
+ numbered.forEach((o, k) => {
52
+ if (!keep.has(k))
53
+ return;
54
+ if (k !== last + 1 && out.length)
55
+ out.push(" ...");
56
+ out.push(`${o.op} ${o.line !== undefined ? String(o.line).padStart(4) : " "} | ${o.text}`);
57
+ last = k;
58
+ });
59
+ return out;
60
+ }
61
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/codesys/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ export interface CodesysInstall {
2
+ /** Full path to CODESYS.exe */
3
+ exe: string;
4
+ /** Profile names found in the Profiles folder, newest first. */
5
+ profiles: string[];
6
+ /** Templates folder (holds Standard.project), if present. */
7
+ templatesDir?: string;
8
+ /** Install folder name, e.g. "CODESYS 3.5.21.0". */
9
+ label: string;
10
+ /** Add-on folder passed as --additionalfolder (SP22 and later). */
11
+ additionalFolder?: string;
12
+ }
13
+ /** The workspace folder: created when missing, with a clear error when it can't be used. */
14
+ export declare function ensureWorkspace(dir: string, log: (m: string) => void): string;
15
+ /**
16
+ * The add-on folder CODESYS's own shortcuts start this install with
17
+ * (`--additionalfolder`). SP22 installs add-ons such as Scripting there:
18
+ * `<CODESYS>\AdditionalFolders\Default`, or the only folder in AdditionalFolders.
19
+ */
20
+ export declare function findAdditionalFolder(base: string): string | undefined;
21
+ export declare function describeInstall(exe: string, additionalFolder?: string): CodesysInstall;
22
+ /** Scan Program Files for CODESYS installs (Windows only). */
23
+ export declare function findInstalls(): CodesysInstall[];
24
+ /** "CODESYS V3.5 SP22 Patch 1" -> a key that sorts numerically (SP9 < SP21 < SP22 < SP22 Patch 1). */
25
+ export declare function profileKey(name: string): string;
26
+ /** Newest profile first; names without a version last, alphabetically. */
27
+ export declare function compareProfiles(a: string, b: string): number;
28
+ export interface ResolvedCodesys {
29
+ exe: string;
30
+ profile: string;
31
+ install: CodesysInstall;
32
+ /** Why this install was picked, for the log. */
33
+ reason: string;
34
+ /** Something to log about the profile, when it couldn't be confirmed. */
35
+ warning?: string;
36
+ }
37
+ /** Pick the CODESYS exe + profile from options, falling back to the newest install. */
38
+ export declare function resolveCodesys(exe?: string, profile?: string, additionalFolder?: string): ResolvedCodesys;
39
+ /** "newest of 2 installs found (CODESYS 3.5.22.40, CODESYS 3.5.21.0); --codesys-path picks another" */
40
+ export declare function pickedNewest(labels: string[]): string;