@nac3/forge-cli 1.8.5 → 1.9.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.
- package/dist/chat/claude.d.ts +11 -0
- package/dist/chat/claude.d.ts.map +1 -1
- package/dist/chat/claude.js.map +1 -1
- package/dist/chat/claude_cli.d.ts.map +1 -1
- package/dist/chat/claude_cli.js +11 -2
- package/dist/chat/claude_cli.js.map +1 -1
- package/dist/chat/doctrine_digest.d.ts.map +1 -1
- package/dist/chat/doctrine_digest.js +11 -0
- package/dist/chat/doctrine_digest.js.map +1 -1
- package/dist/chat/panel.d.ts.map +1 -1
- package/dist/chat/panel.js +50 -24
- package/dist/chat/panel.js.map +1 -1
- package/dist/chat/server.d.ts.map +1 -1
- package/dist/chat/server.js +113 -16
- package/dist/chat/server.js.map +1 -1
- package/dist/chat/tools/config_write.d.ts +35 -0
- package/dist/chat/tools/config_write.d.ts.map +1 -0
- package/dist/chat/tools/config_write.js +381 -0
- package/dist/chat/tools/config_write.js.map +1 -0
- package/dist/chat/tools/db_query.d.ts +20 -0
- package/dist/chat/tools/db_query.d.ts.map +1 -1
- package/dist/chat/tools/db_query.js +3 -3
- package/dist/chat/tools/db_query.js.map +1 -1
- package/dist/chat/tools/nac3_invoke.d.ts.map +1 -1
- package/dist/chat/tools/nac3_invoke.js +19 -1
- package/dist/chat/tools/nac3_invoke.js.map +1 -1
- package/dist/chat/tools/orchestrator_write.d.ts +27 -0
- package/dist/chat/tools/orchestrator_write.d.ts.map +1 -0
- package/dist/chat/tools/orchestrator_write.js +481 -0
- package/dist/chat/tools/orchestrator_write.js.map +1 -0
- package/dist/chat/tools.d.ts.map +1 -1
- package/dist/chat/tools.js +28 -0
- package/dist/chat/tools.js.map +1 -1
- package/dist/commands/embed.d.ts +1 -0
- package/dist/commands/embed.d.ts.map +1 -1
- package/dist/commands/embed.js +5 -1
- package/dist/commands/embed.js.map +1 -1
- package/dist/core/config_formats.d.ts +45 -0
- package/dist/core/config_formats.d.ts.map +1 -0
- package/dist/core/config_formats.js +519 -0
- package/dist/core/config_formats.js.map +1 -0
- package/dist/core/db_write.d.ts +26 -0
- package/dist/core/db_write.d.ts.map +1 -0
- package/dist/core/db_write.js +262 -0
- package/dist/core/db_write.js.map +1 -0
- package/dist/core/forge_embed.d.ts +1 -0
- package/dist/core/forge_embed.d.ts.map +1 -1
- package/dist/core/forge_embed.js +132 -2
- package/dist/core/forge_embed.js.map +1 -1
- package/dist/core/forge_profile.d.ts +23 -0
- package/dist/core/forge_profile.d.ts.map +1 -1
- package/dist/core/forge_profile.js +56 -0
- package/dist/core/forge_profile.js.map +1 -1
- package/dist/core/operate_guard.d.ts +154 -0
- package/dist/core/operate_guard.d.ts.map +1 -0
- package/dist/core/operate_guard.js +542 -0
- package/dist/core/operate_guard.js.map +1 -0
- package/dist/core/projects.d.ts +10 -4
- package/dist/core/projects.d.ts.map +1 -1
- package/dist/core/projects.js +42 -2
- package/dist/core/projects.js.map +1 -1
- package/dist/docs/doctrine/operate-mode.md +118 -0
- package/dist/nac3/internal_manifest.d.ts.map +1 -1
- package/dist/nac3/internal_manifest.js +186 -0
- package/dist/nac3/internal_manifest.js.map +1 -1
- package/dist/nac3/manifest_lazy.d.ts +5 -0
- package/dist/nac3/manifest_lazy.d.ts.map +1 -1
- package/dist/nac3/manifest_lazy.js +3 -1
- package/dist/nac3/manifest_lazy.js.map +1 -1
- package/dist/pending/store.d.ts.map +1 -1
- package/dist/pending/store.js +9 -0
- package/dist/pending/store.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/docs/doctrine/operate-mode.md +118 -0
- package/package.json +1 -1
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* config_formats -- targeted GET/SET of a single value inside a configuration
|
|
3
|
+
* file, for the Forge Embedded OPERATE mode (Pablo 2026-10-10).
|
|
4
|
+
*
|
|
5
|
+
* Why targeted instead of "rewrite the file": the assistant changes ONE
|
|
6
|
+
* setting at a time. Rewriting a whole file from a brain's reconstruction is
|
|
7
|
+
* how comments, ordering and unrelated keys get silently lost. These editors
|
|
8
|
+
* touch the value and leave the rest of the bytes alone, and every setter has
|
|
9
|
+
* a matching getter so the handler can VERIFY the write by reading it back
|
|
10
|
+
* (and restore the backup when the read-back disagrees).
|
|
11
|
+
*
|
|
12
|
+
* Formats: json / ini (+env, properties) / yaml (flat + nested by
|
|
13
|
+
* indentation) / xml (element text or attribute). Anything else -> the handler
|
|
14
|
+
* falls back to the explicit full-content writer.
|
|
15
|
+
*
|
|
16
|
+
* ASCII-only.
|
|
17
|
+
*/
|
|
18
|
+
/** Guess the format from the file name. */
|
|
19
|
+
export function detectFormat(filePath) {
|
|
20
|
+
const base = String(filePath || '').replace(/\\/g, '/').split('/').pop() || '';
|
|
21
|
+
const lower = base.toLowerCase();
|
|
22
|
+
if (lower.indexOf('.env') === 0 || /\.env$/.test(lower) || /\.env\./.test(lower))
|
|
23
|
+
return 'env';
|
|
24
|
+
const dot = lower.lastIndexOf('.');
|
|
25
|
+
const ext = dot > 0 ? lower.slice(dot + 1) : '';
|
|
26
|
+
switch (ext) {
|
|
27
|
+
case 'json':
|
|
28
|
+
case 'jsonc':
|
|
29
|
+
case 'json5': return 'json';
|
|
30
|
+
case 'ini':
|
|
31
|
+
case 'cfg':
|
|
32
|
+
case 'conf':
|
|
33
|
+
case 'config':
|
|
34
|
+
case 'settings': return 'ini';
|
|
35
|
+
case 'properties':
|
|
36
|
+
case 'props':
|
|
37
|
+
case 'prop': return 'properties';
|
|
38
|
+
case 'yaml':
|
|
39
|
+
case 'yml': return 'yaml';
|
|
40
|
+
case 'xml':
|
|
41
|
+
case 'plist': return 'xml';
|
|
42
|
+
case 'env': return 'env';
|
|
43
|
+
default: return 'unknown';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/* ================================= JSON ================================= */
|
|
47
|
+
/** Split a dotted path, accepting both a.b[0].c and a.b.0.c. */
|
|
48
|
+
function jsonPathParts(key) {
|
|
49
|
+
const out = [];
|
|
50
|
+
for (const raw of String(key || '').split('.')) {
|
|
51
|
+
if (!raw)
|
|
52
|
+
continue;
|
|
53
|
+
let seg = raw;
|
|
54
|
+
const idx = [];
|
|
55
|
+
const m = seg.match(/^([^[]*)((?:\[\d+\])+)$/);
|
|
56
|
+
if (m) {
|
|
57
|
+
seg = m[1];
|
|
58
|
+
for (const b of m[2].match(/\d+/g) || [])
|
|
59
|
+
idx.push(b);
|
|
60
|
+
}
|
|
61
|
+
if (seg)
|
|
62
|
+
out.push(seg);
|
|
63
|
+
for (const i of idx)
|
|
64
|
+
out.push(i);
|
|
65
|
+
}
|
|
66
|
+
return out;
|
|
67
|
+
}
|
|
68
|
+
/** Detect the indent (spaces) used by a JSON document; default 2. */
|
|
69
|
+
function jsonIndent(text) {
|
|
70
|
+
const m = text.match(/\n([ \t]+)"/);
|
|
71
|
+
if (!m)
|
|
72
|
+
return 2;
|
|
73
|
+
const s = m[1];
|
|
74
|
+
return s.charAt(0) === '\t' ? 1 : s.length;
|
|
75
|
+
}
|
|
76
|
+
function isIndexKey(k) { return /^\d+$/.test(k); }
|
|
77
|
+
export function jsonGet(content, key) {
|
|
78
|
+
let doc;
|
|
79
|
+
try {
|
|
80
|
+
doc = JSON.parse(content);
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
return { ok: false, reason: 'the file is not valid JSON (' + (e instanceof Error ? e.message : 'parse error') + ').' };
|
|
84
|
+
}
|
|
85
|
+
const parts = jsonPathParts(key);
|
|
86
|
+
if (parts.length === 0)
|
|
87
|
+
return { ok: false, reason: 'key is required (dotted path, e.g. "server.port").' };
|
|
88
|
+
let cur = doc;
|
|
89
|
+
for (const p of parts) {
|
|
90
|
+
if (cur === null || typeof cur !== 'object')
|
|
91
|
+
return { ok: true, found: false };
|
|
92
|
+
const container = cur;
|
|
93
|
+
if (!(p in container))
|
|
94
|
+
return { ok: true, found: false };
|
|
95
|
+
cur = container[p];
|
|
96
|
+
}
|
|
97
|
+
if (cur !== null && typeof cur === 'object') {
|
|
98
|
+
return { ok: false, reason: 'key "' + key + '" points at an object/array, not a scalar value.' };
|
|
99
|
+
}
|
|
100
|
+
return { ok: true, found: true, value: cur };
|
|
101
|
+
}
|
|
102
|
+
export function jsonSet(content, key, value, createMissing) {
|
|
103
|
+
let doc;
|
|
104
|
+
const text = content && content.trim() ? content : '{}';
|
|
105
|
+
try {
|
|
106
|
+
doc = JSON.parse(text);
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
return { ok: false, reason: 'the file is not valid JSON (' + (e instanceof Error ? e.message : 'parse error') + '); '
|
|
110
|
+
+ 'refusing to rewrite it blind. Read it, fix it with the explicit writer, or ask the operator.' };
|
|
111
|
+
}
|
|
112
|
+
if (doc === null || typeof doc !== 'object') {
|
|
113
|
+
return { ok: false, reason: 'the JSON root is not an object/array.' };
|
|
114
|
+
}
|
|
115
|
+
const parts = jsonPathParts(key);
|
|
116
|
+
if (parts.length === 0)
|
|
117
|
+
return { ok: false, reason: 'key is required (dotted path, e.g. "server.port").' };
|
|
118
|
+
const before = jsonGet(content, key);
|
|
119
|
+
let cur = doc;
|
|
120
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
121
|
+
const p = parts[i];
|
|
122
|
+
const nxt = cur[p];
|
|
123
|
+
if (nxt === undefined || nxt === null) {
|
|
124
|
+
if (!createMissing) {
|
|
125
|
+
return { ok: false, reason: 'path "' + parts.slice(0, i + 1).join('.') + '" does not exist. '
|
|
126
|
+
+ 'Pass create_missing:true only when the system really expects a new key.' };
|
|
127
|
+
}
|
|
128
|
+
const child = isIndexKey(parts[i + 1]) ? [] : {};
|
|
129
|
+
cur[p] = child;
|
|
130
|
+
cur = child;
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (typeof nxt !== 'object') {
|
|
134
|
+
return { ok: false, reason: 'path "' + parts.slice(0, i + 1).join('.') + '" is a scalar, not a container.' };
|
|
135
|
+
}
|
|
136
|
+
cur = nxt;
|
|
137
|
+
}
|
|
138
|
+
const last = parts[parts.length - 1];
|
|
139
|
+
const existed = Object.prototype.hasOwnProperty.call(cur, last);
|
|
140
|
+
if (!existed && !createMissing) {
|
|
141
|
+
return { ok: false, reason: 'key "' + key + '" does not exist in the file. '
|
|
142
|
+
+ 'Pass create_missing:true only when the system really expects a new key.' };
|
|
143
|
+
}
|
|
144
|
+
cur[last] = value;
|
|
145
|
+
const out = JSON.stringify(doc, null, jsonIndent(text)) + (content.endsWith('\n') || !content ? '\n' : '');
|
|
146
|
+
return { ok: true, content: out, before: before.ok ? before.value : undefined };
|
|
147
|
+
}
|
|
148
|
+
/* =========================== INI / ENV / PROPS =========================== */
|
|
149
|
+
/**
|
|
150
|
+
* One engine for the three line-oriented formats. `key` is "section.key" for
|
|
151
|
+
* ini (or plain "key" for the global section / env / properties). Comments,
|
|
152
|
+
* blank lines, ordering and quoting style are preserved.
|
|
153
|
+
*/
|
|
154
|
+
function splitIniKey(key, format) {
|
|
155
|
+
const k = String(key || '').trim();
|
|
156
|
+
if (!k)
|
|
157
|
+
return null;
|
|
158
|
+
if (format !== 'ini')
|
|
159
|
+
return { section: '', name: k };
|
|
160
|
+
const dot = k.lastIndexOf('.');
|
|
161
|
+
if (dot <= 0)
|
|
162
|
+
return { section: '', name: k };
|
|
163
|
+
return { section: k.slice(0, dot), name: k.slice(dot + 1) };
|
|
164
|
+
}
|
|
165
|
+
const KV_RE = /^(\s*)([A-Za-z_][A-Za-z0-9_.-]*)(\s*[=:]\s*)(.*)$/;
|
|
166
|
+
function unquote(raw) {
|
|
167
|
+
const v = raw.trim();
|
|
168
|
+
if (v.length >= 2 && ((v.charAt(0) === '"' && v.endsWith('"')) || (v.charAt(0) === "'" && v.endsWith("'")))) {
|
|
169
|
+
return { value: v.slice(1, -1), quote: v.charAt(0) };
|
|
170
|
+
}
|
|
171
|
+
return { value: v, quote: '' };
|
|
172
|
+
}
|
|
173
|
+
/** Strip a trailing ' # comment' / ' ; comment' from an ini/properties value. */
|
|
174
|
+
function splitComment(raw) {
|
|
175
|
+
const m = raw.match(/^(.*?)(\s+[#;].*)$/);
|
|
176
|
+
if (m && m[1].indexOf('"') < 0 && m[1].indexOf("'") < 0) {
|
|
177
|
+
return { value: m[1], comment: m[2] };
|
|
178
|
+
}
|
|
179
|
+
return { value: raw, comment: '' };
|
|
180
|
+
}
|
|
181
|
+
export function iniGet(content, key, format) {
|
|
182
|
+
const parsed = splitIniKey(key, format);
|
|
183
|
+
if (!parsed)
|
|
184
|
+
return { ok: false, reason: 'key is required.' };
|
|
185
|
+
const lines = String(content || '').split('\n');
|
|
186
|
+
let section = '';
|
|
187
|
+
for (const line of lines) {
|
|
188
|
+
const sm = line.match(/^\s*\[([^\]]+)\]\s*$/);
|
|
189
|
+
if (sm) {
|
|
190
|
+
section = sm[1].trim();
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
if (/^\s*[#;]/.test(line))
|
|
194
|
+
continue;
|
|
195
|
+
const m = line.match(KV_RE);
|
|
196
|
+
if (!m)
|
|
197
|
+
continue;
|
|
198
|
+
if (section.toLowerCase() !== parsed.section.toLowerCase())
|
|
199
|
+
continue;
|
|
200
|
+
if (m[2] !== parsed.name)
|
|
201
|
+
continue;
|
|
202
|
+
const { value } = splitComment(m[4]);
|
|
203
|
+
return { ok: true, found: true, value: unquote(value).value };
|
|
204
|
+
}
|
|
205
|
+
return { ok: true, found: false };
|
|
206
|
+
}
|
|
207
|
+
export function iniSet(content, key, value, createMissing, format) {
|
|
208
|
+
const parsed = splitIniKey(key, format);
|
|
209
|
+
if (!parsed)
|
|
210
|
+
return { ok: false, reason: 'key is required.' };
|
|
211
|
+
const text = String(content || '');
|
|
212
|
+
const eol = text.indexOf('\r\n') >= 0 ? '\r\n' : '\n';
|
|
213
|
+
const lines = text.split(/\r?\n/);
|
|
214
|
+
const literal = value === null ? '' : String(value);
|
|
215
|
+
let section = '';
|
|
216
|
+
let sectionSeen = parsed.section === '';
|
|
217
|
+
let lastSectionLine = -1;
|
|
218
|
+
let before;
|
|
219
|
+
for (let i = 0; i < lines.length; i++) {
|
|
220
|
+
const line = lines[i];
|
|
221
|
+
const sm = line.match(/^\s*\[([^\]]+)\]\s*$/);
|
|
222
|
+
if (sm) {
|
|
223
|
+
section = sm[1].trim();
|
|
224
|
+
if (section.toLowerCase() === parsed.section.toLowerCase()) {
|
|
225
|
+
sectionSeen = true;
|
|
226
|
+
lastSectionLine = i;
|
|
227
|
+
}
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
if (/^\s*[#;]/.test(line))
|
|
231
|
+
continue;
|
|
232
|
+
const m = line.match(KV_RE);
|
|
233
|
+
if (!m)
|
|
234
|
+
continue;
|
|
235
|
+
if (section.toLowerCase() !== parsed.section.toLowerCase())
|
|
236
|
+
continue;
|
|
237
|
+
if (lastSectionLine >= 0 || parsed.section === '')
|
|
238
|
+
lastSectionLine = i;
|
|
239
|
+
if (m[2] !== parsed.name)
|
|
240
|
+
continue;
|
|
241
|
+
const split = splitComment(m[4]);
|
|
242
|
+
const q = unquote(split.value).quote;
|
|
243
|
+
before = unquote(split.value).value;
|
|
244
|
+
lines[i] = m[1] + m[2] + m[3]
|
|
245
|
+
+ (q ? q + literal + q : literal) + split.comment;
|
|
246
|
+
return { ok: true, content: lines.join(eol), before };
|
|
247
|
+
}
|
|
248
|
+
if (!createMissing) {
|
|
249
|
+
return { ok: false, reason: 'key "' + key + '" was not found in the file. '
|
|
250
|
+
+ 'Pass create_missing:true only when the system really expects a new key.' };
|
|
251
|
+
}
|
|
252
|
+
const newLine = parsed.name + (format === 'env' ? '=' : ' = ') + literal;
|
|
253
|
+
if (!sectionSeen) {
|
|
254
|
+
if (lines.length && lines[lines.length - 1].trim() !== '')
|
|
255
|
+
lines.push('');
|
|
256
|
+
lines.push('[' + parsed.section + ']');
|
|
257
|
+
lines.push(newLine);
|
|
258
|
+
}
|
|
259
|
+
else if (lastSectionLine >= 0) {
|
|
260
|
+
lines.splice(lastSectionLine + 1, 0, newLine);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
lines.push(newLine);
|
|
264
|
+
}
|
|
265
|
+
return { ok: true, content: lines.join(eol), before: undefined };
|
|
266
|
+
}
|
|
267
|
+
/* ================================= YAML ================================= */
|
|
268
|
+
/**
|
|
269
|
+
* Nested-by-indentation setter for the common "key: value" shape. It does NOT
|
|
270
|
+
* parse YAML: it walks the dotted path by indentation and rewrites the scalar
|
|
271
|
+
* after the colon, preserving comments. Lists / anchors / multi-line blocks
|
|
272
|
+
* are refused (use the explicit writer for those).
|
|
273
|
+
*/
|
|
274
|
+
function yamlFind(lines, parts) {
|
|
275
|
+
let depth = 0;
|
|
276
|
+
let from = 0;
|
|
277
|
+
let to = lines.length;
|
|
278
|
+
let parentIndent = -1;
|
|
279
|
+
for (let p = 0; p < parts.length; p++) {
|
|
280
|
+
const want = parts[p];
|
|
281
|
+
let found = -1;
|
|
282
|
+
for (let i = from; i < to; i++) {
|
|
283
|
+
const line = lines[i];
|
|
284
|
+
if (!line.trim() || /^\s*#/.test(line))
|
|
285
|
+
continue;
|
|
286
|
+
const m = line.match(/^(\s*)([^\s#:][^:]*):(.*)$/);
|
|
287
|
+
if (!m)
|
|
288
|
+
continue;
|
|
289
|
+
const indent = m[1].length;
|
|
290
|
+
if (indent <= parentIndent && p > 0) {
|
|
291
|
+
to = i;
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
if (p === 0 && indent !== 0)
|
|
295
|
+
continue;
|
|
296
|
+
if (p > 0 && indent <= parentIndent) {
|
|
297
|
+
to = i;
|
|
298
|
+
break;
|
|
299
|
+
}
|
|
300
|
+
if (m[2].trim() !== want)
|
|
301
|
+
continue;
|
|
302
|
+
found = i;
|
|
303
|
+
parentIndent = indent;
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
if (found < 0)
|
|
307
|
+
return null;
|
|
308
|
+
depth = parentIndent;
|
|
309
|
+
from = found + 1;
|
|
310
|
+
if (p === parts.length - 1)
|
|
311
|
+
return { line: found, indent: depth };
|
|
312
|
+
}
|
|
313
|
+
return null;
|
|
314
|
+
}
|
|
315
|
+
export function yamlGet(content, key) {
|
|
316
|
+
const parts = String(key || '').split('.').filter((s) => s.length > 0);
|
|
317
|
+
if (parts.length === 0)
|
|
318
|
+
return { ok: false, reason: 'key is required.' };
|
|
319
|
+
const lines = String(content || '').split(/\r?\n/);
|
|
320
|
+
const hit = yamlFind(lines, parts);
|
|
321
|
+
if (!hit)
|
|
322
|
+
return { ok: true, found: false };
|
|
323
|
+
const m = lines[hit.line].match(/^(\s*)([^:]+):(.*)$/);
|
|
324
|
+
if (!m)
|
|
325
|
+
return { ok: true, found: false };
|
|
326
|
+
const rest = splitComment(m[3]).value.trim();
|
|
327
|
+
if (!rest)
|
|
328
|
+
return { ok: false, reason: 'key "' + key + '" has a nested block or empty value, not a scalar.' };
|
|
329
|
+
return { ok: true, found: true, value: unquote(rest).value };
|
|
330
|
+
}
|
|
331
|
+
export function yamlSet(content, key, value) {
|
|
332
|
+
const parts = String(key || '').split('.').filter((s) => s.length > 0);
|
|
333
|
+
if (parts.length === 0)
|
|
334
|
+
return { ok: false, reason: 'key is required.' };
|
|
335
|
+
const text = String(content || '');
|
|
336
|
+
const eol = text.indexOf('\r\n') >= 0 ? '\r\n' : '\n';
|
|
337
|
+
const lines = text.split(/\r?\n/);
|
|
338
|
+
const hit = yamlFind(lines, parts);
|
|
339
|
+
if (!hit) {
|
|
340
|
+
return { ok: false, reason: 'key "' + key + '" was not found in the YAML file. '
|
|
341
|
+
+ 'Creating YAML keys blind is refused -- read the file and use the explicit writer, '
|
|
342
|
+
+ 'or give the operator the instruction.' };
|
|
343
|
+
}
|
|
344
|
+
const line = lines[hit.line];
|
|
345
|
+
const m = line.match(/^(\s*)([^:]+):(.*)$/);
|
|
346
|
+
if (!m)
|
|
347
|
+
return { ok: false, reason: 'could not parse the line for "' + key + '".' };
|
|
348
|
+
const split = splitComment(m[3]);
|
|
349
|
+
const cur = split.value.trim();
|
|
350
|
+
if (!cur) {
|
|
351
|
+
return { ok: false, reason: 'key "' + key + '" opens a nested block (no inline value): '
|
|
352
|
+
+ 'set the specific leaf key instead.' };
|
|
353
|
+
}
|
|
354
|
+
if (cur.charAt(0) === '&' || cur.charAt(0) === '*' || cur === '|' || cur === '>') {
|
|
355
|
+
return { ok: false, reason: 'key "' + key + '" uses an anchor or block scalar: not supported by the targeted setter.' };
|
|
356
|
+
}
|
|
357
|
+
const q = unquote(cur).quote;
|
|
358
|
+
const before = unquote(cur).value;
|
|
359
|
+
const literal = value === null ? 'null' : String(value);
|
|
360
|
+
lines[hit.line] = m[1] + m[2] + ': ' + (q ? q + literal + q : literal) + split.comment;
|
|
361
|
+
return { ok: true, content: lines.join(eol), before };
|
|
362
|
+
}
|
|
363
|
+
/* ================================== XML ================================== */
|
|
364
|
+
/** Find the span of element `tag` inside [from, to), honouring same-name
|
|
365
|
+
* nesting. Returns the open-tag span and the inner-content span. */
|
|
366
|
+
function xmlFindElement(text, tag, from, to) {
|
|
367
|
+
const openRe = new RegExp('<' + tag.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '(\\s[^>]*?)?(/)?>', 'g');
|
|
368
|
+
openRe.lastIndex = from;
|
|
369
|
+
const m = openRe.exec(text);
|
|
370
|
+
if (!m || m.index >= to)
|
|
371
|
+
return null;
|
|
372
|
+
const openStart = m.index;
|
|
373
|
+
const openEnd = m.index + m[0].length;
|
|
374
|
+
if (m[2] === '/') {
|
|
375
|
+
return { openStart, openEnd, innerStart: openEnd, innerEnd: openEnd, selfClosing: true };
|
|
376
|
+
}
|
|
377
|
+
/* walk to the matching close, counting nested same-name opens */
|
|
378
|
+
const scan = new RegExp('<(/)?' + tag.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '(\\s[^>]*?)?(/)?>', 'g');
|
|
379
|
+
scan.lastIndex = openEnd;
|
|
380
|
+
let depth = 1;
|
|
381
|
+
let mm;
|
|
382
|
+
while ((mm = scan.exec(text)) !== null) {
|
|
383
|
+
if (mm[3] === '/')
|
|
384
|
+
continue; /* self-closing nested */
|
|
385
|
+
if (mm[1] === '/') {
|
|
386
|
+
depth--;
|
|
387
|
+
if (depth === 0) {
|
|
388
|
+
return { openStart, openEnd, innerStart: openEnd, innerEnd: mm.index, selfClosing: false };
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
depth++;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
/** Parse "a/b/c" or "a/b@attr" into {path[], attr?}. */
|
|
398
|
+
function xmlParseKey(key) {
|
|
399
|
+
const k = String(key || '').trim();
|
|
400
|
+
if (!k)
|
|
401
|
+
return null;
|
|
402
|
+
const at = k.indexOf('@');
|
|
403
|
+
const attr = at >= 0 ? k.slice(at + 1).trim() : '';
|
|
404
|
+
const p = (at >= 0 ? k.slice(0, at) : k).split('/').map((s) => s.trim()).filter((s) => s.length > 0);
|
|
405
|
+
if (p.length === 0)
|
|
406
|
+
return null;
|
|
407
|
+
for (const seg of p)
|
|
408
|
+
if (!/^[A-Za-z_][A-Za-z0-9_.:-]*$/.test(seg))
|
|
409
|
+
return null;
|
|
410
|
+
if (attr && !/^[A-Za-z_][A-Za-z0-9_.:-]*$/.test(attr))
|
|
411
|
+
return null;
|
|
412
|
+
return { path: p, attr };
|
|
413
|
+
}
|
|
414
|
+
function xmlEscape(v) {
|
|
415
|
+
return v.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"');
|
|
416
|
+
}
|
|
417
|
+
function xmlUnescape(v) {
|
|
418
|
+
return v.replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"')
|
|
419
|
+
.replace(/'/g, "'").replace(/&/g, '&');
|
|
420
|
+
}
|
|
421
|
+
function xmlLocate(text, parts) {
|
|
422
|
+
let from = 0;
|
|
423
|
+
let to = text.length;
|
|
424
|
+
let span = null;
|
|
425
|
+
for (const seg of parts) {
|
|
426
|
+
span = xmlFindElement(text, seg, from, to);
|
|
427
|
+
if (!span)
|
|
428
|
+
return null;
|
|
429
|
+
from = span.innerStart;
|
|
430
|
+
to = span.innerEnd;
|
|
431
|
+
}
|
|
432
|
+
return span ? { innerStart: span.innerStart, innerEnd: span.innerEnd, openStart: span.openStart, openEnd: span.openEnd } : null;
|
|
433
|
+
}
|
|
434
|
+
export function xmlGet(content, key) {
|
|
435
|
+
const parsed = xmlParseKey(key);
|
|
436
|
+
if (!parsed)
|
|
437
|
+
return { ok: false, reason: 'key must be an element path like "config/server/port" or an attribute like "config/server@port".' };
|
|
438
|
+
const text = String(content || '');
|
|
439
|
+
const span = xmlLocate(text, parsed.path);
|
|
440
|
+
if (!span)
|
|
441
|
+
return { ok: true, found: false };
|
|
442
|
+
if (parsed.attr) {
|
|
443
|
+
const open = text.slice(span.openStart, span.openEnd);
|
|
444
|
+
const am = open.match(new RegExp('\\s' + parsed.attr + '\\s*=\\s*"([^"]*)"'));
|
|
445
|
+
if (!am)
|
|
446
|
+
return { ok: true, found: false };
|
|
447
|
+
return { ok: true, found: true, value: xmlUnescape(am[1]) };
|
|
448
|
+
}
|
|
449
|
+
const inner = text.slice(span.innerStart, span.innerEnd);
|
|
450
|
+
if (inner.indexOf('<') >= 0) {
|
|
451
|
+
return { ok: false, reason: 'element "' + key + '" contains child elements, not a text value.' };
|
|
452
|
+
}
|
|
453
|
+
return { ok: true, found: true, value: xmlUnescape(inner.trim()) };
|
|
454
|
+
}
|
|
455
|
+
export function xmlSet(content, key, value) {
|
|
456
|
+
const parsed = xmlParseKey(key);
|
|
457
|
+
if (!parsed)
|
|
458
|
+
return { ok: false, reason: 'key must be an element path like "config/server/port" or an attribute like "config/server@port".' };
|
|
459
|
+
const text = String(content || '');
|
|
460
|
+
const span = xmlLocate(text, parsed.path);
|
|
461
|
+
if (!span) {
|
|
462
|
+
return { ok: false, reason: 'element path "' + parsed.path.join('/') + '" was not found. '
|
|
463
|
+
+ 'Creating XML nodes blind is refused -- read the file and use the explicit writer, '
|
|
464
|
+
+ 'or give the operator the instruction.' };
|
|
465
|
+
}
|
|
466
|
+
const literal = xmlEscape(value === null ? '' : String(value));
|
|
467
|
+
if (parsed.attr) {
|
|
468
|
+
const open = text.slice(span.openStart, span.openEnd);
|
|
469
|
+
const re = new RegExp('(\\s' + parsed.attr + '\\s*=\\s*")([^"]*)(")');
|
|
470
|
+
const am = open.match(re);
|
|
471
|
+
if (!am) {
|
|
472
|
+
return { ok: false, reason: 'attribute "' + parsed.attr + '" does not exist on <' + parsed.path[parsed.path.length - 1] + '>. '
|
|
473
|
+
+ 'Adding attributes blind is refused.' };
|
|
474
|
+
}
|
|
475
|
+
const before = xmlUnescape(am[2]);
|
|
476
|
+
const newOpen = open.replace(re, '$1' + literal.replace(/\$/g, '$$$$') + '$3');
|
|
477
|
+
return { ok: true, content: text.slice(0, span.openStart) + newOpen + text.slice(span.openEnd), before };
|
|
478
|
+
}
|
|
479
|
+
const inner = text.slice(span.innerStart, span.innerEnd);
|
|
480
|
+
if (inner.indexOf('<') >= 0) {
|
|
481
|
+
return { ok: false, reason: 'element "' + parsed.path.join('/') + '" has child elements: '
|
|
482
|
+
+ 'point the key at the leaf element that holds the value.' };
|
|
483
|
+
}
|
|
484
|
+
const before = xmlUnescape(inner.trim());
|
|
485
|
+
/* keep the surrounding whitespace of the original text node */
|
|
486
|
+
const lead = (inner.match(/^\s*/) || [''])[0];
|
|
487
|
+
const tail = (inner.match(/\s*$/) || [''])[0];
|
|
488
|
+
return {
|
|
489
|
+
ok: true,
|
|
490
|
+
before,
|
|
491
|
+
content: text.slice(0, span.innerStart) + lead + literal + tail + text.slice(span.innerEnd),
|
|
492
|
+
};
|
|
493
|
+
}
|
|
494
|
+
/* =============================== dispatch =============================== */
|
|
495
|
+
export function configGet(format, content, key) {
|
|
496
|
+
switch (format) {
|
|
497
|
+
case 'json': return jsonGet(content, key);
|
|
498
|
+
case 'ini':
|
|
499
|
+
case 'env':
|
|
500
|
+
case 'properties': return iniGet(content, key, format);
|
|
501
|
+
case 'yaml': return yamlGet(content, key);
|
|
502
|
+
case 'xml': return xmlGet(content, key);
|
|
503
|
+
default: return { ok: false, reason: 'no targeted editor for this format: use the explicit content writer.' };
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
export function configSet(format, content, key, value, createMissing) {
|
|
507
|
+
switch (format) {
|
|
508
|
+
case 'json': return jsonSet(content, key, value, createMissing);
|
|
509
|
+
case 'ini':
|
|
510
|
+
case 'env':
|
|
511
|
+
case 'properties': return iniSet(content, key, value, createMissing, format);
|
|
512
|
+
case 'yaml': return yamlSet(content, key, value);
|
|
513
|
+
case 'xml': return xmlSet(content, key, value);
|
|
514
|
+
default:
|
|
515
|
+
return { ok: false, reason: 'no targeted editor for "' + format + '": read the file and use '
|
|
516
|
+
+ 'yujin.config.file-write with the full new content (it keeps a backup too).' };
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
//# sourceMappingURL=config_formats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config_formats.js","sourceRoot":"","sources":["../../src/core/config_formats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { SqlScalar } from './operate_guard.js';
|
|
2
|
+
export type DbWriteOp = 'update' | 'insert' | 'delete';
|
|
3
|
+
export interface DbWriteRequest {
|
|
4
|
+
table: string;
|
|
5
|
+
op: DbWriteOp;
|
|
6
|
+
/** Columns to write (update / insert). */
|
|
7
|
+
set?: Record<string, SqlScalar>;
|
|
8
|
+
/** Row selector (update / delete). Equality only -- AND of the pairs. */
|
|
9
|
+
where?: Record<string, SqlScalar>;
|
|
10
|
+
/** Max rows the statement may affect (from the profile). */
|
|
11
|
+
maxRows: number;
|
|
12
|
+
}
|
|
13
|
+
export interface DbWriteOutcome {
|
|
14
|
+
ok: boolean;
|
|
15
|
+
reason?: string;
|
|
16
|
+
engine?: string;
|
|
17
|
+
sql?: string;
|
|
18
|
+
affected?: number;
|
|
19
|
+
before_rows?: Array<Record<string, unknown>>;
|
|
20
|
+
after_rows?: Array<Record<string, unknown>>;
|
|
21
|
+
rollback_sql?: string[];
|
|
22
|
+
insert_id?: number | string | null;
|
|
23
|
+
}
|
|
24
|
+
/** Run one structured, pre-validated configuration write. */
|
|
25
|
+
export declare function execConfigTableWrite(root: string, req: DbWriteRequest): Promise<DbWriteOutcome>;
|
|
26
|
+
//# sourceMappingURL=db_write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db_write.d.ts","sourceRoot":"","sources":["../../src/core/db_write.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,SAAS,CAAC;IACd,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChC,yEAAyE;IACzE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAClC,4DAA4D;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,UAAU,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CACpC;AAuND,6DAA6D;AAC7D,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAoBrG"}
|