@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,262 @@
1
+ /**
2
+ * db_write -- STRUCTURED, allowlisted writes to the attended system's
3
+ * CONFIGURATION tables (Forge Embedded operate mode, Pablo 2026-10-10).
4
+ *
5
+ * Design rule: the brain never writes SQL. There is NO verb in this build that
6
+ * executes an arbitrary mutating statement -- the assistant passes
7
+ * {table, set, where} and this module composes the statement itself, from
8
+ * validated identifiers and literal-only values. That is what makes "never
9
+ * touch the system's DATA tables" enforceable instead of hopeful:
10
+ *
11
+ * - the table must be allowlisted in the deployment profile (operate_guard),
12
+ * - identifiers are [A-Za-z_][A-Za-z0-9_$]* (no expressions, no subqueries),
13
+ * - values are scalars, escaped (mysql) or bound (sqlite),
14
+ * - UPDATE / DELETE need a WHERE, and the affected rows are PREFLIGHTED
15
+ * (0 rows -> refuse as a no-op; more than max_rows -> refuse as too broad),
16
+ * - the BEFORE image of every touched row is captured for the journal, with
17
+ * a rollback statement the operator can paste.
18
+ *
19
+ * Connection comes from <root>/.forge/db.json (same file yujin.db.query uses).
20
+ * sqlite goes through better-sqlite3 (bound params); mysql / mariadb through
21
+ * the installed client CLI, password via MYSQL_PWD, like the reader.
22
+ *
23
+ * ASCII-only.
24
+ */
25
+ import { isAbsolute, join } from 'node:path';
26
+ import { loadDbConfig, parseTsv, runMysqlCli } from '../chat/tools/db_query.js';
27
+ function fail(reason) { return { ok: false, reason }; }
28
+ /* ----------------------------- composition ----------------------------- */
29
+ function quoteIdent(name, engine) {
30
+ /* identifiers are already validated by operate_guard.guardIdentifier */
31
+ const parts = name.split('.');
32
+ const q = engine === 'sqlite' ? '"' : '`';
33
+ return parts.map((p) => q + p + q).join('.');
34
+ }
35
+ /** MySQL/MariaDB string literal. NUL is rejected upstream. */
36
+ function mysqlLiteral(v) {
37
+ if (v === null)
38
+ return 'NULL';
39
+ if (typeof v === 'number')
40
+ return String(v);
41
+ if (typeof v === 'boolean')
42
+ return v ? '1' : '0';
43
+ const s = String(v)
44
+ .replace(/\\/g, '\\\\')
45
+ .replace(/'/g, "\\'")
46
+ .replace(/"/g, '\\"')
47
+ .replace(/\n/g, '\\n')
48
+ .replace(/\r/g, '\\r')
49
+ .replace(/\u001a/g, '\\Z');
50
+ return "'" + s + "'";
51
+ }
52
+ function whereSqlMysql(where, engine) {
53
+ return Object.entries(where)
54
+ .map(([c, v]) => quoteIdent(c, engine) + (v === null ? ' IS NULL' : ' = ' + mysqlLiteral(v)))
55
+ .join(' AND ');
56
+ }
57
+ function whereSqlBound(where, engine) {
58
+ const parts = [];
59
+ const params = [];
60
+ for (const [c, v] of Object.entries(where)) {
61
+ if (v === null) {
62
+ parts.push(quoteIdent(c, engine) + ' IS NULL');
63
+ continue;
64
+ }
65
+ parts.push(quoteIdent(c, engine) + ' = ?');
66
+ params.push(typeof v === 'boolean' ? (v ? 1 : 0) : v);
67
+ }
68
+ return { sql: parts.join(' AND '), params };
69
+ }
70
+ /** Build the operator-pasteable rollback statement(s) from a before image. */
71
+ function rollbackFor(table, engine, op, setCols, beforeRows, where) {
72
+ const t = quoteIdent(table, engine);
73
+ if (op === 'insert') {
74
+ return ['-- rollback: DELETE FROM ' + t + ' WHERE <the row this INSERT created> (see insert_id / the values above)'];
75
+ }
76
+ if (beforeRows.length === 0)
77
+ return [];
78
+ const out = [];
79
+ for (const row of beforeRows) {
80
+ const keyCol = Object.prototype.hasOwnProperty.call(row, 'id') ? 'id' : '';
81
+ const selector = keyCol
82
+ ? quoteIdent(keyCol, engine) + ' = ' + mysqlLiteral(row[keyCol])
83
+ : whereSqlMysql(where, engine);
84
+ if (op === 'delete') {
85
+ const cols = Object.keys(row);
86
+ out.push('INSERT INTO ' + t + ' (' + cols.map((c) => quoteIdent(c, engine)).join(', ') + ') VALUES ('
87
+ + cols.map((c) => mysqlLiteral(row[c])).join(', ') + ');');
88
+ }
89
+ else {
90
+ const sets = setCols
91
+ .filter((c) => Object.prototype.hasOwnProperty.call(row, c))
92
+ .map((c) => quoteIdent(c, engine) + ' = ' + mysqlLiteral(row[c]));
93
+ if (sets.length === 0)
94
+ continue;
95
+ out.push('UPDATE ' + t + ' SET ' + sets.join(', ') + ' WHERE ' + selector + ';');
96
+ }
97
+ }
98
+ return out;
99
+ }
100
+ /* -------------------------------- sqlite -------------------------------- */
101
+ async function execSqlite(root, cfg, req) {
102
+ const file = cfg.sqlite_path
103
+ ? (isAbsolute(cfg.sqlite_path) ? cfg.sqlite_path : join(root, cfg.sqlite_path))
104
+ : '';
105
+ if (!file)
106
+ return fail('sqlite engine needs "sqlite_path" in .forge/db.json');
107
+ const { default: Database } = await import('better-sqlite3');
108
+ const db = new Database(file, { fileMustExist: true });
109
+ try {
110
+ const t = quoteIdent(req.table, 'sqlite');
111
+ let before = [];
112
+ if (req.op !== 'insert') {
113
+ const w = whereSqlBound(req.where, 'sqlite');
114
+ before = db.prepare('SELECT * FROM ' + t + ' WHERE ' + w.sql + ' LIMIT ' + (req.maxRows + 1))
115
+ .all(...w.params);
116
+ if (before.length === 0) {
117
+ return fail('the WHERE matched NO rows: nothing was changed. Re-check the selector with yujin.db.query first.');
118
+ }
119
+ if (before.length > req.maxRows) {
120
+ return fail('the WHERE matches more than ' + req.maxRows + ' rows (max_rows): refusing a broad change. '
121
+ + 'Narrow the selector, one configuration row at a time.');
122
+ }
123
+ }
124
+ let sql = '';
125
+ let affected = 0;
126
+ let insertId = null;
127
+ if (req.op === 'insert') {
128
+ const cols = Object.keys(req.set);
129
+ const vals = cols.map((c) => {
130
+ const v = req.set[c];
131
+ return typeof v === 'boolean' ? (v ? 1 : 0) : v;
132
+ });
133
+ sql = 'INSERT INTO ' + t + ' (' + cols.map((c) => quoteIdent(c, 'sqlite')).join(', ') + ') VALUES ('
134
+ + cols.map(() => '?').join(', ') + ')';
135
+ const info = db.prepare(sql).run(...vals);
136
+ affected = Number(info.changes || 0);
137
+ insertId = typeof info.lastInsertRowid === 'bigint' ? Number(info.lastInsertRowid) : info.lastInsertRowid;
138
+ }
139
+ else if (req.op === 'update') {
140
+ const cols = Object.keys(req.set);
141
+ const w = whereSqlBound(req.where, 'sqlite');
142
+ sql = 'UPDATE ' + t + ' SET ' + cols.map((c) => quoteIdent(c, 'sqlite') + ' = ?').join(', ')
143
+ + ' WHERE ' + w.sql;
144
+ const params = cols.map((c) => {
145
+ const v = req.set[c];
146
+ return typeof v === 'boolean' ? (v ? 1 : 0) : v;
147
+ }).concat(w.params);
148
+ affected = Number(db.prepare(sql).run(...params).changes || 0);
149
+ }
150
+ else {
151
+ const w = whereSqlBound(req.where, 'sqlite');
152
+ sql = 'DELETE FROM ' + t + ' WHERE ' + w.sql;
153
+ affected = Number(db.prepare(sql).run(...w.params).changes || 0);
154
+ }
155
+ let after = [];
156
+ if (req.op === 'update') {
157
+ const w = whereSqlBound(req.where, 'sqlite');
158
+ after = db.prepare('SELECT * FROM ' + t + ' WHERE ' + w.sql + ' LIMIT ' + req.maxRows)
159
+ .all(...w.params);
160
+ }
161
+ return {
162
+ ok: true, engine: 'sqlite', sql, affected, before_rows: before, after_rows: after,
163
+ insert_id: insertId,
164
+ rollback_sql: rollbackFor(req.table, 'sqlite', req.op, Object.keys(req.set || {}), before, req.where || {}),
165
+ };
166
+ }
167
+ finally {
168
+ db.close();
169
+ }
170
+ }
171
+ /* ----------------------------- mysql/mariadb ---------------------------- */
172
+ async function execMysql(cfg, req) {
173
+ const engine = String(cfg.engine || 'mysql').toLowerCase();
174
+ const t = quoteIdent(req.table, engine);
175
+ let before = [];
176
+ if (req.op !== 'insert') {
177
+ const sel = 'SELECT * FROM ' + t + ' WHERE ' + whereSqlMysql(req.where, engine)
178
+ + ' LIMIT ' + (req.maxRows + 1) + ';';
179
+ const r = await runMysqlCli(cfg, sel);
180
+ if (r.code !== 0) {
181
+ return fail('preflight SELECT failed: ' + (r.stderr || 'exit ' + r.code).split('\n')[0]?.slice(0, 200));
182
+ }
183
+ before = parseTsv(r.stdout).rows;
184
+ if (before.length === 0) {
185
+ return fail('the WHERE matched NO rows: nothing was changed. Re-check the selector with yujin.db.query first.');
186
+ }
187
+ if (before.length > req.maxRows) {
188
+ return fail('the WHERE matches more than ' + req.maxRows + ' rows (max_rows): refusing a broad change. '
189
+ + 'Narrow the selector, one configuration row at a time.');
190
+ }
191
+ }
192
+ let sql = '';
193
+ if (req.op === 'insert') {
194
+ const cols = Object.keys(req.set);
195
+ sql = 'INSERT INTO ' + t + ' (' + cols.map((c) => quoteIdent(c, engine)).join(', ') + ') VALUES ('
196
+ + cols.map((c) => mysqlLiteral(req.set[c])).join(', ') + ');';
197
+ }
198
+ else if (req.op === 'update') {
199
+ const sets = Object.entries(req.set)
200
+ .map(([c, v]) => quoteIdent(c, engine) + ' = ' + mysqlLiteral(v));
201
+ sql = 'UPDATE ' + t + ' SET ' + sets.join(', ')
202
+ + ' WHERE ' + whereSqlMysql(req.where, engine)
203
+ + ' LIMIT ' + req.maxRows + ';';
204
+ }
205
+ else {
206
+ sql = 'DELETE FROM ' + t + ' WHERE ' + whereSqlMysql(req.where, engine)
207
+ + ' LIMIT ' + req.maxRows + ';';
208
+ }
209
+ /* one round trip: the statement + the affected-row count (and the insert id
210
+ * when it applies), so the result reports what really happened. */
211
+ const probe = req.op === 'insert'
212
+ ? ' SELECT ROW_COUNT() AS affected, LAST_INSERT_ID() AS insert_id;'
213
+ : ' SELECT ROW_COUNT() AS affected;';
214
+ const r = await runMysqlCli(cfg, sql + probe);
215
+ if (r.code !== 0) {
216
+ return fail('write failed (nothing was committed by Forge beyond what the error says): '
217
+ + (r.stderr || 'exit ' + r.code).split('\n')[0]?.slice(0, 240));
218
+ }
219
+ const parsed = parseTsv(r.stdout);
220
+ const row = parsed.rows[parsed.rows.length - 1] || {};
221
+ const affected = Number(row.affected || 0);
222
+ const insertId = row.insert_id ?? null;
223
+ let after = [];
224
+ if (req.op === 'update') {
225
+ const r2 = await runMysqlCli(cfg, 'SELECT * FROM ' + t + ' WHERE '
226
+ + whereSqlMysql(req.where, engine) + ' LIMIT ' + req.maxRows + ';');
227
+ if (r2.code === 0)
228
+ after = parseTsv(r2.stdout).rows;
229
+ }
230
+ return {
231
+ ok: true, engine, sql, affected, before_rows: before, after_rows: after,
232
+ insert_id: insertId,
233
+ rollback_sql: rollbackFor(req.table, engine, req.op, Object.keys(req.set || {}), before, req.where || {}),
234
+ };
235
+ }
236
+ /* -------------------------------- entry -------------------------------- */
237
+ /** Run one structured, pre-validated configuration write. */
238
+ export async function execConfigTableWrite(root, req) {
239
+ const cfg = loadDbConfig(root);
240
+ if (!cfg) {
241
+ return fail('no .forge/db.json in this project -- cannot connect. Ask the operator to configure it '
242
+ + '{engine,host,port,database,user,password_env,sqlite_path}.');
243
+ }
244
+ if (req.op !== 'insert' && (!req.where || Object.keys(req.where).length === 0)) {
245
+ return fail('a WHERE is mandatory for ' + req.op.toUpperCase() + ': refusing to touch a whole table.');
246
+ }
247
+ if (req.op !== 'delete' && (!req.set || Object.keys(req.set).length === 0)) {
248
+ return fail('set must name at least one column.');
249
+ }
250
+ const engine = String(cfg.engine || '').toLowerCase();
251
+ try {
252
+ if (engine === 'sqlite')
253
+ return await execSqlite(root, cfg, req);
254
+ if (engine === 'mysql' || engine === 'mariadb')
255
+ return await execMysql(cfg, req);
256
+ return fail('unsupported engine "' + engine + '" in .forge/db.json (use mariadb | mysql | sqlite)');
257
+ }
258
+ catch (e) {
259
+ return fail('write failed: ' + (e instanceof Error ? e.message : String(e)).slice(0, 240));
260
+ }
261
+ }
262
+ //# sourceMappingURL=db_write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db_write.js","sourceRoot":"","sources":["../../src/core/db_write.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ export interface EmbedOptions {
4
4
  dbEngine?: 'mariadb' | 'mysql' | 'sqlite';
5
5
  portProd?: number;
6
6
  portUat?: number;
7
+ portOps?: number;
7
8
  force?: boolean;
8
9
  /** Overwrite even the user-content files (mission.md, profiles). Off by
9
10
  * default so a plain --force refreshes only the mechanical files and can
@@ -1 +1 @@
1
- {"version":3,"file":"forge_embed.d.ts","sourceRoot":"","sources":["../../src/core/forge_embed.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;+DAE2D;IAC3D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AAwI7E,kFAAkF;AAClF,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CA+BpF"}
1
+ {"version":3,"file":"forge_embed.d.ts","sourceRoot":"","sources":["../../src/core/forge_embed.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;+DAE2D;IAC3D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;AA8P7E,kFAAkF;AAClF,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAuCpF"}
@@ -23,6 +23,49 @@ const PROFILE_UAT = {
23
23
  mission_file: '.forge/mission.md',
24
24
  tickets_api: { base_url: 'CHANGE_ME/api/v1', api_key_env: 'TICKETS_API_KEY' },
25
25
  };
26
+ /* OPERATE profile (Pablo 2026-10-10) -- the bounded exit from read-only for a
27
+ * PROD deployment: still diagnostic (read_only keeps every other mutation
28
+ * blocked), but authorised to CONFIGURE the system through its config files,
29
+ * its config tables and its orchestrator. It ships with EMPTY allowlists on
30
+ * purpose: with nothing declared the verbs refuse, so the operator (or the
31
+ * assistant, from its own system map) fills in exactly what this system
32
+ * considers configuration. Data tables and software are refused whatever is
33
+ * written here. */
34
+ const PROFILE_OPS = {
35
+ version: 1, name: 'ops', read_only: true, pinned_root: true,
36
+ mission_file: '.forge/mission.md', allow_report_dirs: ['docs', '.forge/diagnostics'],
37
+ tickets_api: { base_url: 'CHANGE_ME/api/v1', api_key_env: 'TICKETS_API_KEY' },
38
+ operate: {
39
+ enabled: true,
40
+ require_approval: true,
41
+ journal_dir: '.forge/changes',
42
+ config_files: {
43
+ /* globs, project-relative or absolute. EMPTY = nothing is writable. */
44
+ allow: [],
45
+ deny: [],
46
+ max_bytes: 524288,
47
+ },
48
+ config_tables: {
49
+ /* ONLY configuration tables. Never a data table. EMPTY = none. */
50
+ allow: [],
51
+ deny: [],
52
+ immutable_columns: ['id', 'created_at'],
53
+ max_rows: 5,
54
+ allow_insert: true,
55
+ allow_delete: false,
56
+ },
57
+ orchestrator: {
58
+ /* kind: db_table | http | cron_file -- see .forge/deploy/README.md */
59
+ kind: 'db_table',
60
+ process_table: '',
61
+ process_columns: { name: '', command: '', description: '', enabled: '' },
62
+ process_defaults: {},
63
+ schedule_table: '',
64
+ schedule_columns: { name: '', cron: '', enabled: '' },
65
+ schedule_defaults: {},
66
+ },
67
+ },
68
+ };
26
69
  function dbExample(engine) {
27
70
  if (engine === 'sqlite')
28
71
  return { engine: 'sqlite', sqlite_path: 'app.db' };
@@ -104,7 +147,7 @@ function serviceUnit(name, env, port, deployDir) {
104
147
  '',
105
148
  ].join('\n');
106
149
  }
107
- function deployReadme(name, portProd, portUat) {
150
+ function deployReadme(name, portProd, portUat, portOps) {
108
151
  return [
109
152
  '# Forge Embedded -- ' + name,
110
153
  '',
@@ -116,6 +159,7 @@ function deployReadme(name, portProd, portUat) {
116
159
  '2. Copy the units + set User/PATH/WorkingDirectory:',
117
160
  ' sudo cp .forge/deploy/forge-' + name + '-prod.service /etc/systemd/system/',
118
161
  ' sudo cp .forge/deploy/forge-' + name + '-uat.service /etc/systemd/system/',
162
+ ' sudo cp .forge/deploy/forge-' + name + '-ops.service /etc/systemd/system/ # operate mode (opcional)',
119
163
  '3. Configure the DB connection: copy .forge/db.json.example to .forge/db.json',
120
164
  ' and fill it (password via the env var named in password_env).',
121
165
  '4. Enable: sudo systemctl enable --now forge-' + name + '-prod forge-' + name + '-uat',
@@ -126,12 +170,90 @@ function deployReadme(name, portProd, portUat) {
126
170
  '- PROD (YF_ENV=prod, :' + portProd + '): READ-ONLY diagnostic. Reads code/config,',
127
171
  ' runs SELECT-only queries (yujin.db.query), tells you what to change -- never',
128
172
  ' touches the system. Reports land in docs/ or .forge/diagnostics/.',
173
+ '- OPS (YF_ENV=ops, :' + portOps + '): diagnostic + CONFIGURATION (operate mode).',
174
+ ' Same guardrails as PROD, plus the authority to change what you declare as',
175
+ ' configuration. See the next section -- it does NOTHING until you declare it.',
129
176
  '- UAT (YF_ENV=uat, :' + portUat + '): permissive. Applies + verifies changes.',
130
177
  '',
131
178
  'On a developer machine (no YF_ENV) Forge runs with FULL capabilities as usual.',
132
179
  '',
180
+ '## OPERATE MODE (.forge/profile.ops.json -> "operate")',
181
+ '',
182
+ 'The ops profile lets the resident assistant CONFIGURE this system -- and only',
183
+ 'configure it. Three surfaces, each default-deny: with empty allowlists the',
184
+ 'verbs refuse, so nothing is writable until you declare it here.',
185
+ '',
186
+ '1. config_files.allow -- globs of the configuration DATA FILES it may change',
187
+ ' (project-relative or absolute), e.g. ["config/*.json", "config/**/*.xml",',
188
+ ' "/etc/' + name + '/app.ini"]. deny excludes paths inside those globs.',
189
+ ' Verbs: yujin.config.file-set (one value, verified + backed up),',
190
+ ' file-write (full content), file-revert (restore a backup).',
191
+ '2. config_tables.allow -- the CONFIGURATION tables it may change, e.g.',
192
+ ' ["cfg_parametros", "cfg_endpoints"]. NEVER list a data table here.',
193
+ ' max_rows caps a single statement; allow_delete is false by default.',
194
+ ' Verb: yujin.config.table-set {table, op, set, where} (no raw SQL exists).',
195
+ '3. orchestrator -- how new processes are registered + scheduled. Pick one:',
196
+ ' kind "db_table": process_table + process_columns (logical -> real column',
197
+ ' names: name/command/description/target_kind/target_slug/params/enabled),',
198
+ ' schedule_table + schedule_columns (name/cron/enabled/context), and',
199
+ ' optional *_defaults applied to every row it creates.',
200
+ ' kind "http": base_url + process_path + schedule_path + api_key_env',
201
+ ' (+ auth_header, default X-API-Key). Preferred when the system validates',
202
+ ' and hot-reloads its own schedules -- a raw row INSERT would not take',
203
+ ' effect in an engine that hydrates its catalog in memory at boot.',
204
+ ' kind "cron_file": cron_dir + cron_user + cron_prefix + command_template',
205
+ ' (e.g. "/usr/bin/python3 /opt/' + name + '/run.py --proc {name}").',
206
+ ' The service user needs write permission on cron_dir.',
207
+ ' Verbs: yujin.orchestrator.process-create / schedule-set (5-field cron,',
208
+ ' validated).',
209
+ '',
210
+ 'ALWAYS refused, whatever you put in the allowlists: the system SOFTWARE',
211
+ '(source, binaries, units, build/dependency files), the DB system schemas,',
212
+ 'the OS config under /etc, /usr, /boot..., and .forge/ itself. Data tables are',
213
+ 'refused by omission: only what you allowlist can change.',
214
+ '',
215
+ 'Every change is journaled in .forge/changes/changes.jsonl with a file backup',
216
+ 'or the row before-image plus a rollback statement. require_approval (default',
217
+ 'true) shows the change in the panel modal before it is applied; set it to',
218
+ 'false only if you want the assistant to apply configuration unattended.',
219
+ '',
220
+ 'Tip: boot the ops service with empty allowlists, ask the assistant to build',
221
+ 'its system map and PROPOSE the operate block from what it found, then review',
222
+ 'and commit that block yourself. It cannot widen its own scope: .forge/ is',
223
+ 'off limits to it.',
224
+ '',
133
225
  ].join('\n');
134
226
  }
227
+ /** Add .forge/changes/ to the project .gitignore (idempotent). The operate-mode
228
+ * journal keeps backups of real config files -- possibly with credentials in
229
+ * them -- so they must never ride along in a commit. */
230
+ async function ignoreChangeJournal(root) {
231
+ const rel = '.gitignore';
232
+ const abs = path.join(root, rel);
233
+ let current = '';
234
+ try {
235
+ current = await fs.readFile(abs, 'utf8');
236
+ }
237
+ catch {
238
+ current = '';
239
+ }
240
+ if (/^\s*\.forge\/changes\/?\s*$/m.test(current)) {
241
+ /* same reason string as every other skipped file: the scaffold contract
242
+ * is "written:false + exists" on a second run. */
243
+ return { rel, written: false, reason: 'exists' };
244
+ }
245
+ const block = [
246
+ '',
247
+ '# Forge Embedded operate mode: journal + backups of the config files the',
248
+ '# resident assistant changed. Local operator material (may contain',
249
+ '# credentials copied from a real config file) -- never repo content.',
250
+ '.forge/changes/',
251
+ '',
252
+ ].join('\n');
253
+ const sep = current && !current.endsWith('\n') ? '\n' : '';
254
+ await fs.writeFile(abs, current + sep + block, 'utf8');
255
+ return { rel, written: true };
256
+ }
135
257
  async function writeIfAbsent(root, rel, content, force) {
136
258
  const abs = path.join(root, rel);
137
259
  await fs.mkdir(path.dirname(abs), { recursive: true });
@@ -152,6 +274,7 @@ export async function generateEmbedScaffold(opts) {
152
274
  const engine = opts.dbEngine || 'mariadb';
153
275
  const portProd = opts.portProd ?? 4901;
154
276
  const portUat = opts.portUat ?? 4902;
277
+ const portOps = opts.portOps ?? 4903;
155
278
  const force = opts.force === true;
156
279
  /* User-content files (the human/brain fills these in): a plain --force must
157
280
  * NEVER clobber them -- that ate an enriched mission.md once. They only get
@@ -168,13 +291,20 @@ export async function generateEmbedScaffold(opts) {
168
291
  const out = [];
169
292
  out.push(await protectedWrite('.forge/profile.prod.json', JSON.stringify(PROFILE_PROD, null, 2) + '\n'));
170
293
  out.push(await protectedWrite('.forge/profile.uat.json', JSON.stringify(PROFILE_UAT, null, 2) + '\n'));
294
+ out.push(await protectedWrite('.forge/profile.ops.json', JSON.stringify(PROFILE_OPS, null, 2) + '\n'));
171
295
  out.push(await protectedWrite('.forge/mission.md', missionTemplate(name, opts.missionSeed)));
172
296
  out.push(await writeIfAbsent(opts.root, '.forge/db.json.example', JSON.stringify(dbExample(engine), null, 2) + '\n', force));
173
297
  out.push(await writeIfAbsent(opts.root, '.forge/deploy/forge-' + name + '-prod.service', serviceUnit(name, 'prod', portProd, '/opt/' + name), force));
174
298
  out.push(await writeIfAbsent(opts.root, '.forge/deploy/forge-' + name + '-uat.service', serviceUnit(name, 'uat', portUat, '/opt/' + name + '-uat'), force));
175
- out.push(await writeIfAbsent(opts.root, '.forge/deploy/README.md', deployReadme(name, portProd, portUat), force));
299
+ out.push(await writeIfAbsent(opts.root, '.forge/deploy/forge-' + name + '-ops.service', serviceUnit(name, 'ops', portOps, '/opt/' + name), force));
300
+ out.push(await writeIfAbsent(opts.root, '.forge/deploy/README.md', deployReadme(name, portProd, portUat, portOps), force));
176
301
  /* keep the report dir in git so PROD can write into it */
177
302
  out.push(await writeIfAbsent(opts.root, '.forge/diagnostics/.gitkeep', '', force));
303
+ /* operate mode keeps BACKUPS of the config files it changes, and a config
304
+ * file can hold credentials (a vault, a connection string). Those backups
305
+ * are local operator material, never repo content -- ignore them so nobody
306
+ * commits a secret by accident. */
307
+ out.push(await ignoreChangeJournal(opts.root));
178
308
  return out;
179
309
  }
180
310
  //# sourceMappingURL=forge_embed.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"forge_embed.js","sourceRoot":"","sources":["../../src/core/forge_embed.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"forge_embed.js","sourceRoot":"","sources":["../../src/core/forge_embed.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { OperateConfig } from './operate_guard.js';
1
2
  export interface ForgeProfile {
2
3
  version?: number;
3
4
  name?: string;
@@ -24,6 +25,17 @@ export interface ForgeProfile {
24
25
  base_url?: string;
25
26
  api_key_env?: string;
26
27
  };
28
+ /** OPERATE MODE (Pablo 2026-10-10) -- the bounded exit from read-only. When
29
+ * enabled, the resident assistant may CONFIGURE the attended system:
30
+ * configuration data files, configuration tables, and processes +
31
+ * schedules in its orchestrator. Never the system's DATA tables, never its
32
+ * SOFTWARE (operate_guard enforces both, allowlist-first). Absent /
33
+ * enabled=false -> the assistant stays strictly diagnostic. */
34
+ operate?: OperateConfig;
35
+ /** Legacy shorthand some deployments already carry: full_config: true means
36
+ * "this deployment may configure the system" == operate.enabled. It still
37
+ * needs the operate allowlists to be able to do anything. */
38
+ full_config?: boolean;
27
39
  }
28
40
  /** Default report dirs for a read_only profile with no explicit config. */
29
41
  export declare const DEFAULT_REPORT_DIRS: readonly ["docs", ".forge/diagnostics"];
@@ -53,6 +65,17 @@ export declare function initProfile(projectRoot: string): ForgeProfile | null;
53
65
  /** For tests. */
54
66
  export declare function _resetProfileForTest(): void;
55
67
  export declare function activeProfile(): ForgeProfile | null;
68
+ /**
69
+ * The effective OPERATE config for this deployment (null when operate mode is
70
+ * off or there is no profile). `full_config: true` is honoured as the legacy
71
+ * shorthand for operate.enabled -- a deployment that carries it still needs
72
+ * the allowlists to be able to change anything.
73
+ */
74
+ export declare function operateConfig(): OperateConfig | null;
75
+ /** True when operate mode is active for this deployment. */
76
+ export declare function operateEnabled(): boolean;
77
+ /** Verb families that exist ONLY to serve operate mode. */
78
+ export declare function isOperateVerb(verbId: string): boolean;
56
79
  /** System-prompt lines for the active profile (empty array when none).
57
80
  * Mission text first (operator voice), then -- when read_only -- the
58
81
  * diagnostic posture. The identity invariant is NOT replaceable. */
@@ -1 +1 @@
1
- {"version":3,"file":"forge_profile.d.ts","sourceRoot":"","sources":["../../src/core/forge_profile.ts"],"names":[],"mappings":"AAoCA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;4EAGwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;4EAEwE;IACxE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;2CAGuC;IACvC,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3D;AAED,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,yCAA0C,CAAC;AAE3E,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,CAQpD;AAmBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAgBpE;AAED;8EAC8E;AAC9E,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAuBpE;AAED,iBAAiB;AACjB,wBAAgB,oBAAoB,IAAI,IAAI,CAAyF;AAErI,wBAAgB,aAAa,IAAI,YAAY,GAAG,IAAI,CAA2B;AAE/E;;qEAEqE;AACrE,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CA0G7C;AAyBD,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAeD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,mBAAmB,CA2BrB;AAED,qEAAqE;AACrE,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAIxC"}
1
+ {"version":3,"file":"forge_profile.d.ts","sourceRoot":"","sources":["../../src/core/forge_profile.ts"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;4EAGwE;IACxE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;4EAEwE;IACxE,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;2CAGuC;IACvC,WAAW,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1D;;;;;oEAKgE;IAChE,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB;;kEAE8D;IAC9D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,2EAA2E;AAC3E,eAAO,MAAM,mBAAmB,yCAA0C,CAAC;AAE3E,6EAA6E;AAC7E,wBAAgB,UAAU,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,CAQpD;AAmBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAgBpE;AAED;8EAC8E;AAC9E,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAuBpE;AAED,iBAAiB;AACjB,wBAAgB,oBAAoB,IAAI,IAAI,CAAyF;AAErI,wBAAgB,aAAa,IAAI,YAAY,GAAG,IAAI,CAA2B;AAE/E;;;;;GAKG;AACH,wBAAgB,aAAa,IAAI,aAAa,GAAG,IAAI,CAMpD;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,IAAI,OAAO,CAAqC;AAE9E,2DAA2D;AAC3D,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;qEAEqE;AACrE,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CA4K7C;AAyBD,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAErE,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAeD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,mBAAmB,CA4CrB;AAED,qEAAqE;AACrE,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAIxC"}