@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.
Files changed (76) hide show
  1. package/dist/chat/claude.d.ts +11 -0
  2. package/dist/chat/claude.d.ts.map +1 -1
  3. package/dist/chat/claude.js.map +1 -1
  4. package/dist/chat/claude_cli.d.ts.map +1 -1
  5. package/dist/chat/claude_cli.js +11 -2
  6. package/dist/chat/claude_cli.js.map +1 -1
  7. package/dist/chat/doctrine_digest.d.ts.map +1 -1
  8. package/dist/chat/doctrine_digest.js +11 -0
  9. package/dist/chat/doctrine_digest.js.map +1 -1
  10. package/dist/chat/panel.d.ts.map +1 -1
  11. package/dist/chat/panel.js +50 -24
  12. package/dist/chat/panel.js.map +1 -1
  13. package/dist/chat/server.d.ts.map +1 -1
  14. package/dist/chat/server.js +113 -16
  15. package/dist/chat/server.js.map +1 -1
  16. package/dist/chat/tools/config_write.d.ts +35 -0
  17. package/dist/chat/tools/config_write.d.ts.map +1 -0
  18. package/dist/chat/tools/config_write.js +381 -0
  19. package/dist/chat/tools/config_write.js.map +1 -0
  20. package/dist/chat/tools/db_query.d.ts +20 -0
  21. package/dist/chat/tools/db_query.d.ts.map +1 -1
  22. package/dist/chat/tools/db_query.js +3 -3
  23. package/dist/chat/tools/db_query.js.map +1 -1
  24. package/dist/chat/tools/nac3_invoke.d.ts.map +1 -1
  25. package/dist/chat/tools/nac3_invoke.js +19 -1
  26. package/dist/chat/tools/nac3_invoke.js.map +1 -1
  27. package/dist/chat/tools/orchestrator_write.d.ts +27 -0
  28. package/dist/chat/tools/orchestrator_write.d.ts.map +1 -0
  29. package/dist/chat/tools/orchestrator_write.js +481 -0
  30. package/dist/chat/tools/orchestrator_write.js.map +1 -0
  31. package/dist/chat/tools.d.ts.map +1 -1
  32. package/dist/chat/tools.js +28 -0
  33. package/dist/chat/tools.js.map +1 -1
  34. package/dist/commands/embed.d.ts +1 -0
  35. package/dist/commands/embed.d.ts.map +1 -1
  36. package/dist/commands/embed.js +5 -1
  37. package/dist/commands/embed.js.map +1 -1
  38. package/dist/core/config_formats.d.ts +45 -0
  39. package/dist/core/config_formats.d.ts.map +1 -0
  40. package/dist/core/config_formats.js +519 -0
  41. package/dist/core/config_formats.js.map +1 -0
  42. package/dist/core/db_write.d.ts +26 -0
  43. package/dist/core/db_write.d.ts.map +1 -0
  44. package/dist/core/db_write.js +262 -0
  45. package/dist/core/db_write.js.map +1 -0
  46. package/dist/core/forge_embed.d.ts +1 -0
  47. package/dist/core/forge_embed.d.ts.map +1 -1
  48. package/dist/core/forge_embed.js +132 -2
  49. package/dist/core/forge_embed.js.map +1 -1
  50. package/dist/core/forge_profile.d.ts +23 -0
  51. package/dist/core/forge_profile.d.ts.map +1 -1
  52. package/dist/core/forge_profile.js +56 -0
  53. package/dist/core/forge_profile.js.map +1 -1
  54. package/dist/core/operate_guard.d.ts +154 -0
  55. package/dist/core/operate_guard.d.ts.map +1 -0
  56. package/dist/core/operate_guard.js +542 -0
  57. package/dist/core/operate_guard.js.map +1 -0
  58. package/dist/core/projects.d.ts +10 -4
  59. package/dist/core/projects.d.ts.map +1 -1
  60. package/dist/core/projects.js +42 -2
  61. package/dist/core/projects.js.map +1 -1
  62. package/dist/docs/doctrine/operate-mode.md +118 -0
  63. package/dist/nac3/internal_manifest.d.ts.map +1 -1
  64. package/dist/nac3/internal_manifest.js +186 -0
  65. package/dist/nac3/internal_manifest.js.map +1 -1
  66. package/dist/nac3/manifest_lazy.d.ts +5 -0
  67. package/dist/nac3/manifest_lazy.d.ts.map +1 -1
  68. package/dist/nac3/manifest_lazy.js +3 -1
  69. package/dist/nac3/manifest_lazy.js.map +1 -1
  70. package/dist/pending/store.d.ts.map +1 -1
  71. package/dist/pending/store.js +9 -0
  72. package/dist/pending/store.js.map +1 -1
  73. package/dist/version.d.ts +1 -1
  74. package/dist/version.js +1 -1
  75. package/docs/doctrine/operate-mode.md +118 -0
  76. package/package.json +1 -1
@@ -0,0 +1,35 @@
1
+ import type { ToolContext, ToolResult } from '../tools.js';
2
+ import { type OperateConfig } from '../../core/operate_guard.js';
3
+ export interface ConfigFileSetArgs {
4
+ path?: string;
5
+ key?: string;
6
+ value?: unknown;
7
+ value_type?: string;
8
+ format?: string;
9
+ create_missing?: boolean;
10
+ reason?: string;
11
+ }
12
+ export declare function runConfigFileSet(args: ConfigFileSetArgs, ctx: ToolContext): Promise<ToolResult>;
13
+ export interface ConfigFileWriteArgs {
14
+ path?: string;
15
+ content?: string;
16
+ reason?: string;
17
+ create?: boolean;
18
+ }
19
+ export declare function runConfigFileWrite(args: ConfigFileWriteArgs, ctx: ToolContext): Promise<ToolResult>;
20
+ export interface ConfigFileRevertArgs {
21
+ backup_id?: string;
22
+ reason?: string;
23
+ }
24
+ export declare function runConfigFileRevert(args: ConfigFileRevertArgs, ctx: ToolContext): Promise<ToolResult>;
25
+ export interface ConfigTableSetArgs {
26
+ table?: string;
27
+ op?: string;
28
+ set?: Record<string, unknown>;
29
+ where?: Record<string, unknown>;
30
+ reason?: string;
31
+ }
32
+ /** Tables the orchestrator config contributes to the table allowlist. */
33
+ export declare function orchestratorTables(op: OperateConfig | null): string[];
34
+ export declare function runConfigTableSet(args: ConfigTableSetArgs, ctx: ToolContext): Promise<ToolResult>;
35
+ //# sourceMappingURL=config_write.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config_write.d.ts","sourceRoot":"","sources":["../../../src/chat/tools/config_write.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3D,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,6BAA6B,CAAC;AAsErC,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA8FrG;AAkBD,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAmDzG;AAID,MAAM,WAAW,oBAAoB;IAAG,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AAE7E,wBAAsB,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAsC3G;AAID,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,yEAAyE;AACzE,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,EAAE,CAOrE;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAsDvG"}
@@ -0,0 +1,381 @@
1
+ /**
2
+ * Operate-mode CONFIGURATION verbs for the Forge Embedded assistant
3
+ * (Pablo 2026-10-10):
4
+ *
5
+ * yujin.config.file-set -- change ONE value in a configuration data file
6
+ * yujin.config.file-write -- replace a configuration file wholesale
7
+ * yujin.config.file-revert -- restore a journal backup
8
+ * yujin.config.table-set -- structured write on a configuration TABLE
9
+ *
10
+ * All four refuse unless the deployment profile declares an operate block
11
+ * (nac3_invoke already rejects them profile-wide when operate is off; these
12
+ * checks are the second line, so a direct handler call is equally bounded).
13
+ * The scope itself -- which files, which tables, never software, never data
14
+ * tables -- lives in core/operate_guard.ts.
15
+ *
16
+ * Every mutation: BACKUP (files) or BEFORE-IMAGE (rows) -> write -> VERIFY by
17
+ * reading back -> JOURNAL. A file whose read-back does not match is restored
18
+ * from its backup and reported as failed: the assistant never claims a change
19
+ * it did not actually make.
20
+ *
21
+ * ASCII-only.
22
+ */
23
+ import { promises as fs } from 'node:fs';
24
+ import path from 'node:path';
25
+ import { operateConfig } from '../../core/forge_profile.js';
26
+ import { backupFile, findBackup, guardColumnMap, guardConfigFile, guardConfigSize, guardConfigTable, journalChange, journalDirShown, maxRows, shortHash, } from '../../core/operate_guard.js';
27
+ import { configGet, configSet, detectFormat } from '../../core/config_formats.js';
28
+ import { execConfigTableWrite } from '../../core/db_write.js';
29
+ const OFF = 'operate mode is OFF for this deployment: configuration changes are not allowed. '
30
+ + 'Diagnose and emit the precise instruction for the operator instead.';
31
+ function err(tool, msg) {
32
+ return { tool, is_error: true, result: { error: msg }, display: tool + ' <- ' + msg.slice(0, 70) };
33
+ }
34
+ function ok(tool, result, display) {
35
+ return { tool, is_error: false, result, display };
36
+ }
37
+ /**
38
+ * Accept only scalars as a configuration value, and give the written value the
39
+ * RIGHT TYPE. The brain sends text (the manifest declares value as a string,
40
+ * because a schema property cannot be a type union), so "auto" -- the default
41
+ * -- types the new value like the one already in the file: a JSON number stays
42
+ * a number, a boolean stays a boolean. value_type forces it when there is no
43
+ * current value to learn from.
44
+ */
45
+ function asConfigValue(v, valueType, current) {
46
+ if (v === null)
47
+ return { ok: true, value: null };
48
+ const t = typeof v;
49
+ if (t === 'number') {
50
+ if (!Number.isFinite(v))
51
+ return { ok: false, reason: 'value is not a finite number.' };
52
+ return { ok: true, value: v };
53
+ }
54
+ if (t === 'boolean')
55
+ return { ok: true, value: v };
56
+ if (t !== 'string') {
57
+ return { ok: false, reason: 'value must be a scalar (string, number, boolean or null). '
58
+ + 'To write a whole object or array, use yujin.config.file-write with the full content.' };
59
+ }
60
+ const s = v;
61
+ if (s.length > 65535)
62
+ return { ok: false, reason: 'value too long (max 65535 chars).' };
63
+ if (s.indexOf('\u0000') >= 0)
64
+ return { ok: false, reason: 'value contains a NUL byte.' };
65
+ let want = String(valueType || 'auto').trim().toLowerCase();
66
+ if (want === 'auto' || !want) {
67
+ want = typeof current === 'number' ? 'number'
68
+ : typeof current === 'boolean' ? 'boolean'
69
+ : 'string';
70
+ }
71
+ if (want === 'string')
72
+ return { ok: true, value: s };
73
+ if (want === 'null')
74
+ return { ok: true, value: null };
75
+ if (want === 'number') {
76
+ if (!/^-?\d+(\.\d+)?$/.test(s.trim())) {
77
+ return { ok: false, reason: 'the current value is a number but "' + s + '" is not numeric. '
78
+ + 'Pass value_type:"string" if the setting really becomes text.' };
79
+ }
80
+ return { ok: true, value: Number(s.trim()) };
81
+ }
82
+ if (want === 'boolean') {
83
+ const low = s.trim().toLowerCase();
84
+ if (low === 'true' || low === '1' || low === 'yes')
85
+ return { ok: true, value: true };
86
+ if (low === 'false' || low === '0' || low === 'no')
87
+ return { ok: true, value: false };
88
+ return { ok: false, reason: 'the current value is a boolean but "' + s + '" is not true/false. '
89
+ + 'Pass value_type:"string" if the setting really becomes text.' };
90
+ }
91
+ return { ok: false, reason: 'unknown value_type "' + valueType + '" (auto|string|number|boolean|null).' };
92
+ }
93
+ const FORMATS = ['json', 'ini', 'env', 'properties', 'yaml', 'xml'];
94
+ export async function runConfigFileSet(args, ctx) {
95
+ const TOOL = 'yujin.config.file-set';
96
+ const op = operateConfig();
97
+ if (!op)
98
+ return err(TOOL, OFF);
99
+ const gate = guardConfigFile(ctx.projectRoot, op, String(args.path || ''));
100
+ if (!gate.ok)
101
+ return err(TOOL, gate.reason);
102
+ const abs = gate.abs;
103
+ const key = String(args.key || '').trim();
104
+ if (!key) {
105
+ return err(TOOL, 'key is required: the path of the setting inside the file '
106
+ + '(json "a.b.c", ini "section.key", env "KEY", xml "root/child" or "root/child@attr").');
107
+ }
108
+ let content = '';
109
+ try {
110
+ content = await fs.readFile(abs, 'utf8');
111
+ }
112
+ catch {
113
+ return err(TOOL, 'cannot read "' + gate.shown + '": the file does not exist or is not readable. '
114
+ + 'file-set CHANGES an existing configuration file; to create one, use yujin.config.file-write.');
115
+ }
116
+ const requested = String(args.format || '').trim().toLowerCase();
117
+ if (requested && FORMATS.indexOf(requested) < 0) {
118
+ return err(TOOL, 'unknown format "' + requested + '" (use one of: ' + FORMATS.join(', ') + ').');
119
+ }
120
+ const format = requested || detectFormat(abs);
121
+ if (format === 'unknown') {
122
+ return err(TOOL, 'cannot tell the format of "' + gate.shown + '". Pass format explicitly ('
123
+ + FORMATS.join(' | ') + ') or use yujin.config.file-write with the full new content.');
124
+ }
125
+ /* the CURRENT value types the new one (see asConfigValue) and is what the
126
+ * user gets reported as "before" */
127
+ const currentRead = configGet(format, content, key);
128
+ const current = currentRead.ok && currentRead.found ? currentRead.value : undefined;
129
+ const val = asConfigValue(args.value, String(args.value_type || 'auto'), current);
130
+ if (!val.ok)
131
+ return err(TOOL, val.reason);
132
+ const edit = configSet(format, content, key, val.value, args.create_missing === true);
133
+ if (!edit.ok)
134
+ return err(TOOL, edit.reason);
135
+ const newContent = edit.content;
136
+ if (newContent === content) {
137
+ return ok(TOOL, {
138
+ changed: false, path: gate.shown, key, value: val.value,
139
+ note: 'the file already had this exact value: nothing was written.',
140
+ }, TOOL + ' -> sin cambios (ya estaba en ese valor)');
141
+ }
142
+ const size = guardConfigSize(op, newContent);
143
+ if (!size.ok)
144
+ return err(TOOL, size.reason);
145
+ /* backup -> write -> verify -> journal */
146
+ const bak = await backupFile(ctx.projectRoot, op, abs);
147
+ try {
148
+ await fs.writeFile(abs, newContent, 'utf8');
149
+ }
150
+ catch (e) {
151
+ return err(TOOL, 'write failed: ' + (e instanceof Error ? e.message : String(e)).slice(0, 200));
152
+ }
153
+ const check = await verifyValue(abs, format, key, val.value);
154
+ if (!check.ok) {
155
+ let restored = false;
156
+ if (bak) {
157
+ try {
158
+ await fs.writeFile(abs, bak.before, 'utf8');
159
+ restored = true;
160
+ }
161
+ catch {
162
+ restored = false;
163
+ }
164
+ }
165
+ await journalChange(ctx.projectRoot, op, {
166
+ kind: 'config_file', verb: TOOL, target: gate.shown,
167
+ reason: String(args.reason || ''),
168
+ detail: { abs, key, format, failed_verify: check.reason, restored },
169
+ backup_id: bak?.backup_id,
170
+ });
171
+ return err(TOOL, 'the write did not verify (' + check.reason + '). '
172
+ + (restored ? 'The file was RESTORED from its backup; nothing changed.' : 'The backup is at ' + (bak?.backup_path || 'n/a') + ' -- restore it by hand.'));
173
+ }
174
+ const journal = await journalChange(ctx.projectRoot, op, {
175
+ kind: 'config_file', verb: TOOL, target: gate.shown,
176
+ reason: String(args.reason || ''),
177
+ detail: { abs, key, format, before: edit.before === undefined ? null : edit.before, after: val.value },
178
+ backup_id: bak?.backup_id,
179
+ before_hash: shortHash(content), after_hash: shortHash(newContent),
180
+ });
181
+ return ok(TOOL, {
182
+ changed: true,
183
+ path: gate.shown, key, format,
184
+ before: edit.before === undefined ? null : edit.before,
185
+ after: val.value,
186
+ verified: true,
187
+ backup_id: bak?.backup_id || null,
188
+ journal: journalDirShown(ctx.projectRoot, op) + '/changes.jsonl',
189
+ note: 'the file is updated and re-read. Tell the user whether the system picks it up '
190
+ + 'automatically or needs a reload/restart -- a restart is the operator decision, give them the command.',
191
+ }, TOOL + ' -> ' + gate.shown + ' [' + key + '] ' + JSON.stringify(edit.before === undefined ? null : edit.before)
192
+ + ' -> ' + JSON.stringify(val.value));
193
+ }
194
+ async function verifyValue(abs, format, key, expected) {
195
+ let text = '';
196
+ try {
197
+ text = await fs.readFile(abs, 'utf8');
198
+ }
199
+ catch {
200
+ return { ok: false, reason: 'the file could not be re-read' };
201
+ }
202
+ const got = configGet(format, text, key);
203
+ if (!got.ok)
204
+ return { ok: false, reason: got.reason || 'the value could not be re-read' };
205
+ if (!got.found)
206
+ return { ok: false, reason: 'the key is not in the file after the write' };
207
+ const a = got.value === null ? 'null' : String(got.value);
208
+ const b = expected === null ? 'null' : String(expected);
209
+ if (a !== b)
210
+ return { ok: false, reason: 'read back "' + a + '" instead of "' + b + '"' };
211
+ return { ok: true };
212
+ }
213
+ export async function runConfigFileWrite(args, ctx) {
214
+ const TOOL = 'yujin.config.file-write';
215
+ const op = operateConfig();
216
+ if (!op)
217
+ return err(TOOL, OFF);
218
+ const gate = guardConfigFile(ctx.projectRoot, op, String(args.path || ''));
219
+ if (!gate.ok)
220
+ return err(TOOL, gate.reason);
221
+ const abs = gate.abs;
222
+ if (typeof args.content !== 'string') {
223
+ return err(TOOL, 'content is required (the FULL new text of the file). '
224
+ + 'Read the file first -- a reconstructed-from-memory config file loses settings.');
225
+ }
226
+ const size = guardConfigSize(op, args.content);
227
+ if (!size.ok)
228
+ return err(TOOL, size.reason);
229
+ const bak = await backupFile(ctx.projectRoot, op, abs);
230
+ if (!bak && args.create !== true) {
231
+ return err(TOOL, '"' + gate.shown + '" does not exist yet. Pass create:true if this deployment '
232
+ + 'really needs a NEW configuration file (and say so to the user).');
233
+ }
234
+ if (bak && bak.before === args.content) {
235
+ return ok(TOOL, { changed: false, path: gate.shown, note: 'the content is identical: nothing was written.' }, TOOL + ' -> sin cambios');
236
+ }
237
+ try {
238
+ await fs.mkdir(path.dirname(abs), { recursive: true });
239
+ await fs.writeFile(abs, args.content, 'utf8');
240
+ }
241
+ catch (e) {
242
+ return err(TOOL, 'write failed: ' + (e instanceof Error ? e.message : String(e)).slice(0, 200));
243
+ }
244
+ let readBack = '';
245
+ try {
246
+ readBack = await fs.readFile(abs, 'utf8');
247
+ }
248
+ catch {
249
+ readBack = '';
250
+ }
251
+ const verified = readBack === args.content;
252
+ await journalChange(ctx.projectRoot, op, {
253
+ kind: 'config_file', verb: TOOL, target: gate.shown,
254
+ reason: String(args.reason || ''),
255
+ detail: {
256
+ abs, created: !bak, verified,
257
+ bytes_before: bak ? Buffer.byteLength(bak.before, 'utf8') : 0,
258
+ bytes_after: Buffer.byteLength(args.content, 'utf8'),
259
+ },
260
+ backup_id: bak?.backup_id,
261
+ before_hash: bak ? shortHash(bak.before) : '', after_hash: shortHash(args.content),
262
+ });
263
+ return ok(TOOL, {
264
+ changed: true, path: gate.shown, created: !bak, verified,
265
+ backup_id: bak?.backup_id || null,
266
+ journal: journalDirShown(ctx.projectRoot, op) + '/changes.jsonl',
267
+ note: 'full-file write. Re-read it and check the settings you did NOT mean to touch are still there.',
268
+ }, TOOL + ' -> ' + gate.shown + (bak ? ' (backup ' + bak.backup_id + ')' : ' (nuevo)'));
269
+ }
270
+ export async function runConfigFileRevert(args, ctx) {
271
+ const TOOL = 'yujin.config.file-revert';
272
+ const op = operateConfig();
273
+ if (!op)
274
+ return err(TOOL, OFF);
275
+ const found = await findBackup(ctx.projectRoot, op, String(args.backup_id || ''));
276
+ if (!found) {
277
+ return err(TOOL, 'no backup with id "' + String(args.backup_id || '') + '" under '
278
+ + journalDirShown(ctx.projectRoot, op) + '/backups. List the journal to get the right id.');
279
+ }
280
+ const target = String((found.rec.detail && found.rec.detail.abs) || found.rec.target || '');
281
+ if (!target)
282
+ return err(TOOL, 'the journal entry for this backup has no target path: restore it by hand.');
283
+ const gate = guardConfigFile(ctx.projectRoot, op, target);
284
+ if (!gate.ok)
285
+ return err(TOOL, 'refusing to revert into "' + target + '": ' + gate.reason);
286
+ const abs = gate.abs;
287
+ let content = '';
288
+ try {
289
+ content = await fs.readFile(found.backup_path, 'utf8');
290
+ }
291
+ catch {
292
+ return err(TOOL, 'the backup file could not be read: ' + found.backup_path);
293
+ }
294
+ const bak = await backupFile(ctx.projectRoot, op, abs);
295
+ try {
296
+ await fs.writeFile(abs, content, 'utf8');
297
+ }
298
+ catch (e) {
299
+ return err(TOOL, 'revert failed: ' + (e instanceof Error ? e.message : String(e)).slice(0, 200));
300
+ }
301
+ await journalChange(ctx.projectRoot, op, {
302
+ kind: 'revert', verb: TOOL, target: gate.shown,
303
+ reason: String(args.reason || ''),
304
+ detail: { abs, restored_from: String(args.backup_id || ''), previous_backup: bak?.backup_id || null },
305
+ backup_id: bak?.backup_id,
306
+ after_hash: shortHash(content),
307
+ });
308
+ return ok(TOOL, {
309
+ reverted: true, path: gate.shown, restored_from: String(args.backup_id || ''),
310
+ previous_backup: bak?.backup_id || null,
311
+ note: 'the previous content was backed up too, so the revert itself is reversible. '
312
+ + 'Say whether the system needs a reload to pick it up.',
313
+ }, TOOL + ' -> ' + gate.shown + ' restaurado');
314
+ }
315
+ /** Tables the orchestrator config contributes to the table allowlist. */
316
+ export function orchestratorTables(op) {
317
+ const o = op?.orchestrator;
318
+ if (!o || o.kind !== 'db_table')
319
+ return [];
320
+ const out = [];
321
+ if (o.process_table)
322
+ out.push(String(o.process_table));
323
+ if (o.schedule_table)
324
+ out.push(String(o.schedule_table));
325
+ return out;
326
+ }
327
+ export async function runConfigTableSet(args, ctx) {
328
+ const TOOL = 'yujin.config.table-set';
329
+ const op = operateConfig();
330
+ if (!op)
331
+ return err(TOOL, OFF);
332
+ const table = String(args.table || '').trim();
333
+ const rawOp = String(args.op || 'update').trim().toLowerCase();
334
+ if (rawOp !== 'update' && rawOp !== 'insert' && rawOp !== 'delete') {
335
+ return err(TOOL, 'op must be "update", "insert" or "delete".');
336
+ }
337
+ const gate = guardConfigTable(op, table, rawOp, { extraAllow: orchestratorTables(op) });
338
+ if (!gate.ok)
339
+ return err(TOOL, gate.reason);
340
+ let set = {};
341
+ if (rawOp !== 'delete') {
342
+ const sc = guardColumnMap(op, args.set, 'set');
343
+ if (!sc.ok)
344
+ return err(TOOL, sc.reason);
345
+ set = sc.clean;
346
+ }
347
+ let where = {};
348
+ if (rawOp !== 'insert') {
349
+ const wc = guardColumnMap(op, args.where, 'where');
350
+ if (!wc.ok) {
351
+ return err(TOOL, wc.reason + ' A WHERE is mandatory for ' + rawOp.toUpperCase()
352
+ + ': find the row first with yujin.db.query.');
353
+ }
354
+ where = wc.clean;
355
+ }
356
+ const outcome = await execConfigTableWrite(ctx.projectRoot, {
357
+ table, op: rawOp, set, where, maxRows: maxRows(op),
358
+ });
359
+ if (!outcome.ok)
360
+ return err(TOOL, outcome.reason);
361
+ await journalChange(ctx.projectRoot, op, {
362
+ kind: 'config_table', verb: TOOL, target: table,
363
+ reason: String(args.reason || ''),
364
+ detail: {
365
+ op: rawOp, engine: outcome.engine, sql: outcome.sql, affected: outcome.affected,
366
+ where, set, before_rows: outcome.before_rows, after_rows: outcome.after_rows,
367
+ insert_id: outcome.insert_id ?? null, rollback_sql: outcome.rollback_sql,
368
+ },
369
+ });
370
+ return ok(TOOL, {
371
+ changed: true, table, op: rawOp, affected: outcome.affected,
372
+ before_rows: outcome.before_rows, after_rows: outcome.after_rows,
373
+ insert_id: outcome.insert_id ?? null,
374
+ rollback_sql: outcome.rollback_sql,
375
+ journal: journalDirShown(ctx.projectRoot, op) + '/changes.jsonl',
376
+ note: 'report the before -> after to the user. Many systems cache configuration in memory: '
377
+ + 'say whether it needs a reload/restart (the command is the operator decision), and '
378
+ + 'verify with yujin.db.query when the system re-reads it.',
379
+ }, TOOL + ' -> ' + rawOp.toUpperCase() + ' ' + table + ' (' + (outcome.affected ?? 0) + ' fila/s)');
380
+ }
381
+ //# sourceMappingURL=config_write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config_write.js","sourceRoot":"","sources":["../../../src/chat/tools/config_write.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,24 @@
1
1
  import type { ToolContext, ToolResult } from '../tools.js';
2
+ export interface DbConfig {
3
+ engine?: string;
4
+ host?: string;
5
+ port?: number;
6
+ database?: string;
7
+ user?: string;
8
+ password_env?: string;
9
+ sqlite_path?: string;
10
+ }
11
+ export declare function loadDbConfig(projectRoot: string): DbConfig | null;
12
+ /** Parse mysql --batch (TSV) output into columns + rows. NULL literal -> null. */
13
+ export declare function parseTsv(out: string): {
14
+ columns: string[];
15
+ rows: Array<Record<string, string | null>>;
16
+ };
17
+ export declare function runMysqlCli(cfg: DbConfig, sql: string): Promise<{
18
+ code: number;
19
+ stdout: string;
20
+ stderr: string;
21
+ }>;
2
22
  export declare function runDbQuery(args: {
3
23
  sql?: string;
4
24
  limit?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"db_query.d.ts","sourceRoot":"","sources":["../../../src/chat/tools/db_query.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA4D3D,wBAAsB,UAAU,CAC9B,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACtC,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAyCrB"}
1
+ {"version":3,"file":"db_query.d.ts","sourceRoot":"","sources":["../../../src/chat/tools/db_query.ts"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG3D,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAKjE;AAMD,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAA;CAAE,CAWvG;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBjH;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EACtC,GAAG,EAAE,WAAW,GACf,OAAO,CAAC,UAAU,CAAC,CAyCrB"}
@@ -30,7 +30,7 @@ import { isReadOnlySql } from '../../core/shell_classifier.js';
30
30
  const DEFAULT_LIMIT = 500;
31
31
  const HARD_CAP = 5000;
32
32
  const QUERY_TIMEOUT_MS = 15000;
33
- function loadDbConfig(projectRoot) {
33
+ export function loadDbConfig(projectRoot) {
34
34
  try {
35
35
  const raw = JSON.parse(readFileSync(join(projectRoot, '.forge', 'db.json'), 'utf8'));
36
36
  return raw && typeof raw === 'object' ? raw : null;
@@ -43,7 +43,7 @@ function err(msg) {
43
43
  return { tool: 'db_query', is_error: true, result: { error: msg }, display: 'db_query <- ' + msg.slice(0, 60) };
44
44
  }
45
45
  /** Parse mysql --batch (TSV) output into columns + rows. NULL literal -> null. */
46
- function parseTsv(out) {
46
+ export function parseTsv(out) {
47
47
  const lines = out.replace(/\r\n/g, '\n').split('\n').filter((l) => l.length > 0);
48
48
  if (lines.length === 0)
49
49
  return { columns: [], rows: [] };
@@ -56,7 +56,7 @@ function parseTsv(out) {
56
56
  });
57
57
  return { columns, rows };
58
58
  }
59
- function runMysqlCli(cfg, sql) {
59
+ export function runMysqlCli(cfg, sql) {
60
60
  return new Promise((resolve) => {
61
61
  const client = cfg.engine === 'mariadb' ? 'mariadb' : 'mysql';
62
62
  const argv = ['--batch', '--raw'];
@@ -1 +1 @@
1
- {"version":3,"file":"db_query.js","sourceRoot":"","sources":["../../../src/chat/tools/db_query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"db_query.js","sourceRoot":"","sources":["../../../src/chat/tools/db_query.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"nac3_invoke.d.ts","sourceRoot":"","sources":["../../../src/chat/tools/nac3_invoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAmBrE,eAAO,MAAM,gBAAgB,EAAE,QAoC9B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;sEAGsE;AACtE,KAAK,aAAa,GAAG,CACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,WAAW,KACb,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;sDAEkD;IAClD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;8DAG0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,UAAU,CAAC,CA68BrB"}
1
+ {"version":3,"file":"nac3_invoke.d.ts","sourceRoot":"","sources":["../../../src/chat/tools/nac3_invoke.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAmBrE,eAAO,MAAM,gBAAgB,EAAE,QAoC9B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;sEAGsE;AACtE,KAAK,aAAa,GAAG,CACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,WAAW,KACb,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,aAAa,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;sDAEkD;IAClD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;8DAG0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,oBAAoB,GACzB,OAAO,CAAC,UAAU,CAAC,CA69BrB"}
@@ -728,6 +728,23 @@ export async function runNac3Invoke(rawArgs, ctx, opts) {
728
728
  * destructive still hit it. Before, invoking the shell at all forced
729
729
  * approval even for read-only commands.
730
730
  */
731
+ /* Operate mode (Pablo 2026-10-10): a configuration change opens the R8 modal
732
+ * by DEFAULT -- the operator sees exactly what is about to change before it
733
+ * happens. A deployment that wants the assistant to apply changes without
734
+ * the modal says so explicitly in its profile
735
+ * (operate.require_approval: false); it is journaled either way. */
736
+ let operateApprovalBypass = false;
737
+ if (!opts.approval_bypass && !agentAutoApprove) {
738
+ try {
739
+ const { isOperateVerb, operateConfig } = await import('../../core/forge_profile.js');
740
+ if (isOperateVerb(verb.id)) {
741
+ const oc = operateConfig();
742
+ if (oc && oc.require_approval === false)
743
+ operateApprovalBypass = true;
744
+ }
745
+ }
746
+ catch { /* keep the modal (fail safe) */ }
747
+ }
731
748
  let shellSafeBypass = false;
732
749
  if (verb.id === 'yujin.shell.exec' && !opts.approval_bypass && !agentAutoApprove) {
733
750
  try {
@@ -743,7 +760,8 @@ export async function runNac3Invoke(rawArgs, ctx, opts) {
743
760
  && verb.handler_side === 'server'
744
761
  && !opts.approval_bypass
745
762
  && !agentAutoApprove
746
- && !shellSafeBypass) {
763
+ && !shellSafeBypass
764
+ && !operateApprovalBypass) {
747
765
  /* alpha.59d -- Danger Zone master toggle. When ON, the
748
766
  * modal is skipped + the call proceeds with approval_mode=
749
767
  * 'danger_zone_bypass' so the audit log still records the