@tacuchi/agent-workflow-cli 23.0.0 → 24.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -1
- package/dist/adapters/postgres-readonly-tools.js +277 -0
- package/dist/adapters/postgres-readonly-tools.js.map +1 -0
- package/dist/application/database-mcp-server.js +168 -0
- package/dist/application/database-mcp-server.js.map +1 -0
- package/dist/application/database-mcp-stdio.js +137 -0
- package/dist/application/database-mcp-stdio.js.map +1 -0
- package/dist/application/database-tool-catalog.js +226 -0
- package/dist/application/database-tool-catalog.js.map +1 -0
- package/dist/application/dsn-reader-service.js +1 -1
- package/dist/application/lock-service.js +96 -31
- package/dist/application/lock-service.js.map +1 -1
- package/dist/application/logging/log-events.js +19 -3
- package/dist/application/logging/log-events.js.map +1 -1
- package/dist/application/logging/logger.js +2 -2
- package/dist/application/logging/logger.js.map +1 -1
- package/dist/application/mcp-connections-service.js +115 -41
- package/dist/application/mcp-connections-service.js.map +1 -1
- package/dist/application/mcp-doctor-service.js +98 -54
- package/dist/application/mcp-doctor-service.js.map +1 -1
- package/dist/application/mcp-entry-classification.js +60 -0
- package/dist/application/mcp-entry-classification.js.map +1 -0
- package/dist/application/mcp-host-reader.js +102 -86
- package/dist/application/mcp-host-reader.js.map +1 -1
- package/dist/application/mcp-host-receipt-service.js +399 -0
- package/dist/application/mcp-host-receipt-service.js.map +1 -0
- package/dist/application/mcp-host-receipt-store.js +122 -0
- package/dist/application/mcp-host-receipt-store.js.map +1 -0
- package/dist/application/mcp-host-receipts.js +28 -0
- package/dist/application/mcp-host-receipts.js.map +1 -0
- package/dist/application/mcp-host-writer.js +209 -38
- package/dist/application/mcp-host-writer.js.map +1 -1
- package/dist/application/mcp-launch-probe-service.js +142 -0
- package/dist/application/mcp-launch-probe-service.js.map +1 -0
- package/dist/application/mcp-migration-service.js +351 -0
- package/dist/application/mcp-migration-service.js.map +1 -0
- package/dist/application/mcp-native-host-check-service.js +154 -0
- package/dist/application/mcp-native-host-check-service.js.map +1 -0
- package/dist/application/mcp-receipt-registration-service.js +105 -0
- package/dist/application/mcp-receipt-registration-service.js.map +1 -0
- package/dist/application/mcp-receipt-removal-service.js +62 -0
- package/dist/application/mcp-receipt-removal-service.js.map +1 -0
- package/dist/application/mcp-remove-service.js +83 -24
- package/dist/application/mcp-remove-service.js.map +1 -1
- package/dist/application/mcp-scope-common.js +1 -1
- package/dist/application/mcp-scope-common.js.map +1 -1
- package/dist/application/mcp-setup-service.js +59 -24
- package/dist/application/mcp-setup-service.js.map +1 -1
- package/dist/application/mcp-stdio-probe.js +526 -0
- package/dist/application/mcp-stdio-probe.js.map +1 -0
- package/dist/application/mcp-test-connection-service.js +23 -50
- package/dist/application/mcp-test-connection-service.js.map +1 -1
- package/dist/application/self/host-states.js.map +1 -1
- package/dist/application/self/install-skill.js +4 -34
- package/dist/application/self/install-skill.js.map +1 -1
- package/dist/application/self/mcp-config.js +369 -59
- package/dist/application/self/mcp-config.js.map +1 -1
- package/dist/application/self/mcp-via-state.js +9 -6
- package/dist/application/self/mcp-via-state.js.map +1 -1
- package/dist/application/self/uninstall-skill.js +3 -18
- package/dist/application/self/uninstall-skill.js.map +1 -1
- package/dist/application/self/uninstall.js +4 -23
- package/dist/application/self/uninstall.js.map +1 -1
- package/dist/application/workspace-init-service.js +4 -6
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/mcp.js +642 -55
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/tool.js +141 -0
- package/dist/cli/commands/tool.js.map +1 -0
- package/dist/cli/help-groups.js +1 -1
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/main.js +189 -57
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/parser.js +5 -1
- package/dist/cli/parser.js.map +1 -1
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli/render.js +15 -2
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/tui/components/host-admin-section.js +2 -46
- package/dist/cli/tui/components/host-admin-section.js.map +1 -1
- package/dist/cli/tui/tabs/mcp-tab-helpers.js +71 -0
- package/dist/cli/tui/tabs/mcp-tab-helpers.js.map +1 -1
- package/dist/cli/tui/tabs/mcp-tab.js +101 -42
- package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
- package/dist/domain/database-tools.js +445 -0
- package/dist/domain/database-tools.js.map +1 -0
- package/dist/domain/flow/authority.js +4 -0
- package/dist/domain/flow/authority.js.map +1 -1
- package/dist/domain/mcp-entry.js +131 -17
- package/dist/domain/mcp-entry.js.map +1 -1
- package/dist/domain/postgres-object-search.js +320 -0
- package/dist/domain/postgres-object-search.js.map +1 -0
- package/dist/domain/redaction.js +47 -0
- package/dist/domain/redaction.js.map +1 -0
- package/dist/domain/workline-mcp-entry.js +6 -9
- package/dist/domain/workline-mcp-entry.js.map +1 -1
- package/dist/ports/postgres-tools.js +10 -0
- package/dist/ports/postgres-tools.js.map +1 -0
- package/package.json +5 -1
- package/dist/application/mcp-dbhub-launcher.js +0 -216
- package/dist/application/mcp-dbhub-launcher.js.map +0 -1
- package/dist/application/self/mcp-offer.js +0 -96
- package/dist/application/self/mcp-offer.js.map +0 -1
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
/** Transport-neutral contract for the PostgreSQL tools exposed by CLI and MCP. */
|
|
2
|
+
export const MAX_TOOL_INPUT_BYTES = 1024 * 1024;
|
|
3
|
+
/** JSON-RPC framing adds a small envelope around the canonical tool input. */
|
|
4
|
+
export const MAX_TOOL_TRANSPORT_INPUT_BYTES = MAX_TOOL_INPUT_BYTES + 64 * 1024;
|
|
5
|
+
export const MAX_TOOL_RESULT_BYTES = 4 * 1024 * 1024;
|
|
6
|
+
export const MAX_TOOL_ROWS = 1000;
|
|
7
|
+
export const DATABASE_TOOL_NAMES = ["execute_sql", "search_objects"];
|
|
8
|
+
export const SEARCH_OBJECT_TYPES = [
|
|
9
|
+
"schema",
|
|
10
|
+
"table",
|
|
11
|
+
"view",
|
|
12
|
+
"column",
|
|
13
|
+
"procedure",
|
|
14
|
+
"function",
|
|
15
|
+
"index",
|
|
16
|
+
];
|
|
17
|
+
export const SEARCH_DETAIL_LEVELS = ["names", "summary", "full"];
|
|
18
|
+
export const DATABASE_TOOL_DESCRIPTORS = [
|
|
19
|
+
{
|
|
20
|
+
name: "execute_sql",
|
|
21
|
+
description: "Ejecuta una única consulta PostgreSQL de lectura en una transacción de solo lectura.",
|
|
22
|
+
inputSchema: {
|
|
23
|
+
type: "object",
|
|
24
|
+
additionalProperties: false,
|
|
25
|
+
required: ["sql"],
|
|
26
|
+
properties: {
|
|
27
|
+
sql: { type: "string", minLength: 1, description: "Una única sentencia de lectura." },
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: "search_objects",
|
|
33
|
+
description: "Busca objetos PostgreSQL con filtros y orden determinista.",
|
|
34
|
+
inputSchema: {
|
|
35
|
+
type: "object",
|
|
36
|
+
additionalProperties: false,
|
|
37
|
+
required: ["object_type"],
|
|
38
|
+
properties: {
|
|
39
|
+
object_type: { enum: [...SEARCH_OBJECT_TYPES] },
|
|
40
|
+
pattern: { type: "string", default: "%" },
|
|
41
|
+
detail_level: { enum: [...SEARCH_DETAIL_LEVELS], default: "names" },
|
|
42
|
+
limit: { type: "integer", minimum: 1, maximum: MAX_TOOL_ROWS, default: 100 },
|
|
43
|
+
schema: { type: "string" },
|
|
44
|
+
table: { type: "string" },
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
];
|
|
49
|
+
export function isDatabaseToolName(value) {
|
|
50
|
+
return DATABASE_TOOL_NAMES.includes(value);
|
|
51
|
+
}
|
|
52
|
+
export function toolSuccess(data) {
|
|
53
|
+
return { success: true, data };
|
|
54
|
+
}
|
|
55
|
+
export function toolFailure(code, error, details) {
|
|
56
|
+
return {
|
|
57
|
+
success: false,
|
|
58
|
+
error,
|
|
59
|
+
code,
|
|
60
|
+
...(details === undefined ? {} : { details }),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** The one encoder used by both direct CLI and MCP tool responses. */
|
|
64
|
+
export function encodeToolResponse(response) {
|
|
65
|
+
return JSON.stringify(response);
|
|
66
|
+
}
|
|
67
|
+
export function parseDatabaseToolInput(name, value) {
|
|
68
|
+
if (serializedBytes(value) > MAX_TOOL_INPUT_BYTES) {
|
|
69
|
+
return { ok: false, response: toolFailure("INPUT_TOO_LARGE", "La entrada supera 1 MiB.") };
|
|
70
|
+
}
|
|
71
|
+
if (name === "execute_sql")
|
|
72
|
+
return parseExecuteSqlInput(value);
|
|
73
|
+
return parseSearchObjectsInput(value);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* The database transaction is the final protection. This lexical policy fails
|
|
77
|
+
* closed before opening a connection for clear mutation and multi-statement
|
|
78
|
+
* forms, while preserving comments and quoted strings correctly enough not to
|
|
79
|
+
* mistake their contents for SQL keywords.
|
|
80
|
+
*/
|
|
81
|
+
export function validateReadOnlySql(sql) {
|
|
82
|
+
const scan = scanSql(sql);
|
|
83
|
+
if (!scan.ok || scan.tokens.length === 0) {
|
|
84
|
+
return {
|
|
85
|
+
ok: false,
|
|
86
|
+
response: toolFailure("INVALID_SQL", "La consulta debe contener SQL legible."),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (scan.semicolons > 1 || (scan.semicolons === 1 && scan.contentAfterSemicolon)) {
|
|
90
|
+
return {
|
|
91
|
+
ok: false,
|
|
92
|
+
response: toolFailure("MULTI_STATEMENT_UNSUPPORTED", "execute_sql acepta una sola sentencia."),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
const first = scan.tokens[0];
|
|
96
|
+
if (first === undefined || !["SELECT", "WITH", "EXPLAIN", "SHOW", "VALUES"].includes(first)) {
|
|
97
|
+
return {
|
|
98
|
+
ok: false,
|
|
99
|
+
response: toolFailure("READ_ONLY_POLICY", "execute_sql sólo permite consultas de lectura."),
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const forbidden = new Set([
|
|
103
|
+
"INSERT",
|
|
104
|
+
"UPDATE",
|
|
105
|
+
"DELETE",
|
|
106
|
+
"MERGE",
|
|
107
|
+
"CREATE",
|
|
108
|
+
"ALTER",
|
|
109
|
+
"DROP",
|
|
110
|
+
"TRUNCATE",
|
|
111
|
+
"GRANT",
|
|
112
|
+
"REVOKE",
|
|
113
|
+
"INTO",
|
|
114
|
+
"COPY",
|
|
115
|
+
"CALL",
|
|
116
|
+
"DO",
|
|
117
|
+
"VACUUM",
|
|
118
|
+
"ANALYZE",
|
|
119
|
+
"LOCK",
|
|
120
|
+
"BEGIN",
|
|
121
|
+
"COMMIT",
|
|
122
|
+
"ROLLBACK",
|
|
123
|
+
"SET",
|
|
124
|
+
"SET_CONFIG",
|
|
125
|
+
]);
|
|
126
|
+
if (scan.tokens.some((token) => forbidden.has(token))) {
|
|
127
|
+
return {
|
|
128
|
+
ok: false,
|
|
129
|
+
response: toolFailure("READ_ONLY_POLICY", "La consulta contiene una operación no permitida."),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
return { ok: true };
|
|
133
|
+
}
|
|
134
|
+
function parseExecuteSqlInput(value) {
|
|
135
|
+
const record = objectWithOnly(value, ["sql"]);
|
|
136
|
+
if (record === null || typeof record.sql !== "string" || record.sql.trim().length === 0) {
|
|
137
|
+
return {
|
|
138
|
+
ok: false,
|
|
139
|
+
response: toolFailure("INVALID_INPUT", "execute_sql requiere un objeto con sql no vacío."),
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
return { ok: true, value: { sql: record.sql } };
|
|
143
|
+
}
|
|
144
|
+
function parseSearchObjectsInput(value) {
|
|
145
|
+
const record = objectWithOnly(value, [
|
|
146
|
+
"object_type",
|
|
147
|
+
"pattern",
|
|
148
|
+
"detail_level",
|
|
149
|
+
"limit",
|
|
150
|
+
"schema",
|
|
151
|
+
"table",
|
|
152
|
+
]);
|
|
153
|
+
const base = parseSearchBase(record);
|
|
154
|
+
if (!base.ok)
|
|
155
|
+
return base;
|
|
156
|
+
const filters = parseSearchFilters(record);
|
|
157
|
+
if (!filters.ok)
|
|
158
|
+
return filters;
|
|
159
|
+
const constraint = validateSearchFilters(base.value.object_type, filters.value);
|
|
160
|
+
if (constraint !== undefined)
|
|
161
|
+
return { ok: false, response: constraint };
|
|
162
|
+
return {
|
|
163
|
+
ok: true,
|
|
164
|
+
value: {
|
|
165
|
+
...base.value,
|
|
166
|
+
...filters.value,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function parseSearchBase(record) {
|
|
171
|
+
if (record === null || typeof record.object_type !== "string") {
|
|
172
|
+
return failureSearchInput("search_objects requiere object_type.");
|
|
173
|
+
}
|
|
174
|
+
if (!SEARCH_OBJECT_TYPES.includes(record.object_type)) {
|
|
175
|
+
return failureSearchInput("object_type no es uno de los valores permitidos.");
|
|
176
|
+
}
|
|
177
|
+
const pattern = record.pattern ?? "%";
|
|
178
|
+
if (typeof pattern !== "string" || pattern.length === 0) {
|
|
179
|
+
return failureSearchInput("pattern debe ser un texto no vacío.");
|
|
180
|
+
}
|
|
181
|
+
const detailLevel = record.detail_level ?? "names";
|
|
182
|
+
if (typeof detailLevel !== "string" ||
|
|
183
|
+
!SEARCH_DETAIL_LEVELS.includes(detailLevel)) {
|
|
184
|
+
return failureSearchInput("detail_level no es uno de los valores permitidos.");
|
|
185
|
+
}
|
|
186
|
+
const limit = record.limit ?? 100;
|
|
187
|
+
if (!isSearchLimit(limit))
|
|
188
|
+
return failureSearchInput(`limit debe estar entre 1 y ${MAX_TOOL_ROWS}.`);
|
|
189
|
+
return {
|
|
190
|
+
ok: true,
|
|
191
|
+
value: {
|
|
192
|
+
object_type: record.object_type,
|
|
193
|
+
pattern,
|
|
194
|
+
detail_level: detailLevel,
|
|
195
|
+
limit,
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
function parseSearchFilters(record) {
|
|
200
|
+
if (record === null)
|
|
201
|
+
return failureSearchInput("search_objects requiere object_type.");
|
|
202
|
+
const schema = optionalNonEmptyString(record.schema);
|
|
203
|
+
const table = optionalNonEmptyString(record.table);
|
|
204
|
+
if (schema === false || table === false) {
|
|
205
|
+
return failureSearchInput("schema y table deben ser textos no vacíos.");
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
ok: true,
|
|
209
|
+
value: {
|
|
210
|
+
...(schema === undefined ? {} : { schema }),
|
|
211
|
+
...(table === undefined ? {} : { table }),
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
function validateSearchFilters(type, filters) {
|
|
216
|
+
if (filters.table !== undefined && type !== "column" && type !== "index") {
|
|
217
|
+
return toolFailure("INVALID_INPUT", "table sólo aplica a column e index.");
|
|
218
|
+
}
|
|
219
|
+
if (filters.schema !== undefined && type === "schema") {
|
|
220
|
+
return toolFailure("INVALID_INPUT", "schema no aplica al tipo schema; usá pattern.");
|
|
221
|
+
}
|
|
222
|
+
if (filters.table !== undefined && filters.schema === undefined) {
|
|
223
|
+
return toolFailure("INVALID_INPUT", "table requiere el filtro schema.");
|
|
224
|
+
}
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
function isSearchLimit(value) {
|
|
228
|
+
return (typeof value === "number" && Number.isInteger(value) && value >= 1 && value <= MAX_TOOL_ROWS);
|
|
229
|
+
}
|
|
230
|
+
function failureSearchInput(message) {
|
|
231
|
+
return { ok: false, response: toolFailure("INVALID_INPUT", message) };
|
|
232
|
+
}
|
|
233
|
+
function objectWithOnly(value, allowed) {
|
|
234
|
+
if (value === null || typeof value !== "object" || Array.isArray(value))
|
|
235
|
+
return null;
|
|
236
|
+
const record = value;
|
|
237
|
+
if (Object.keys(record).some((key) => !allowed.includes(key)))
|
|
238
|
+
return null;
|
|
239
|
+
return record;
|
|
240
|
+
}
|
|
241
|
+
function optionalNonEmptyString(value) {
|
|
242
|
+
if (value === undefined)
|
|
243
|
+
return undefined;
|
|
244
|
+
if (typeof value !== "string" || value.trim().length === 0)
|
|
245
|
+
return false;
|
|
246
|
+
return value;
|
|
247
|
+
}
|
|
248
|
+
function serializedBytes(value) {
|
|
249
|
+
try {
|
|
250
|
+
return new TextEncoder().encode(JSON.stringify(value)).byteLength;
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
return MAX_TOOL_INPUT_BYTES + 1;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
function scanSql(sql) {
|
|
257
|
+
const state = createSqlScanState();
|
|
258
|
+
while (state.index < sql.length) {
|
|
259
|
+
if (!scanSqlCharacter(sql, state))
|
|
260
|
+
return { ok: false };
|
|
261
|
+
}
|
|
262
|
+
flushSqlToken(state);
|
|
263
|
+
return state.blockCommentDepth === 0
|
|
264
|
+
? {
|
|
265
|
+
ok: true,
|
|
266
|
+
tokens: state.tokens,
|
|
267
|
+
semicolons: state.semicolons,
|
|
268
|
+
contentAfterSemicolon: state.contentAfterSemicolon,
|
|
269
|
+
}
|
|
270
|
+
: { ok: false };
|
|
271
|
+
}
|
|
272
|
+
function createSqlScanState() {
|
|
273
|
+
return {
|
|
274
|
+
tokens: [],
|
|
275
|
+
index: 0,
|
|
276
|
+
semicolons: 0,
|
|
277
|
+
contentAfterSemicolon: false,
|
|
278
|
+
token: "",
|
|
279
|
+
blockCommentDepth: 0,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
function scanSqlCharacter(sql, state) {
|
|
283
|
+
if (state.blockCommentDepth > 0) {
|
|
284
|
+
consumeBlockComment(sql, state);
|
|
285
|
+
return true;
|
|
286
|
+
}
|
|
287
|
+
const char = sql[state.index] ?? "";
|
|
288
|
+
const next = sql[state.index + 1] ?? "";
|
|
289
|
+
if (consumeSqlComment(sql, state, char, next))
|
|
290
|
+
return true;
|
|
291
|
+
markContentAfterSemicolon(state, char, next);
|
|
292
|
+
const literal = consumeSqlLiteral(sql, state, char);
|
|
293
|
+
if (literal !== undefined)
|
|
294
|
+
return literal;
|
|
295
|
+
consumePlainSqlCharacter(state, char);
|
|
296
|
+
state.index += 1;
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
function consumeSqlComment(sql, state, char, next) {
|
|
300
|
+
if (char === "-" && next === "-") {
|
|
301
|
+
consumeLineComment(sql, state);
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
if (char !== "/" || next !== "*")
|
|
305
|
+
return false;
|
|
306
|
+
flushSqlToken(state);
|
|
307
|
+
state.blockCommentDepth = 1;
|
|
308
|
+
state.index += 2;
|
|
309
|
+
return true;
|
|
310
|
+
}
|
|
311
|
+
/** Returns undefined when the current byte remains regular SQL punctuation. */
|
|
312
|
+
function consumeSqlLiteral(sql, state, char) {
|
|
313
|
+
if (char === "'" || char === '"')
|
|
314
|
+
return consumeQuotedSql(sql, state, char);
|
|
315
|
+
if (char !== "$" || !canOpenDollarQuoted(sql, state))
|
|
316
|
+
return undefined;
|
|
317
|
+
const dollarQuoted = consumeDollarQuotedSql(sql, state);
|
|
318
|
+
if (dollarQuoted === "consumed")
|
|
319
|
+
return true;
|
|
320
|
+
return dollarQuoted === "unterminated" ? false : undefined;
|
|
321
|
+
}
|
|
322
|
+
function consumePlainSqlCharacter(state, char) {
|
|
323
|
+
if (char === ";") {
|
|
324
|
+
flushSqlToken(state);
|
|
325
|
+
state.semicolons += 1;
|
|
326
|
+
}
|
|
327
|
+
else if (/[A-Za-z0-9_]/.test(char)) {
|
|
328
|
+
state.token += char;
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
flushSqlToken(state);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
function consumeBlockComment(sql, state) {
|
|
335
|
+
const char = sql[state.index] ?? "";
|
|
336
|
+
const next = sql[state.index + 1] ?? "";
|
|
337
|
+
if (char === "/" && next === "*") {
|
|
338
|
+
state.blockCommentDepth += 1;
|
|
339
|
+
state.index += 2;
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
if (char === "*" && next === "/") {
|
|
343
|
+
state.blockCommentDepth -= 1;
|
|
344
|
+
state.index += 2;
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
347
|
+
state.index += 1;
|
|
348
|
+
}
|
|
349
|
+
function consumeLineComment(sql, state) {
|
|
350
|
+
flushSqlToken(state);
|
|
351
|
+
state.index += 2;
|
|
352
|
+
while (state.index < sql.length && sql[state.index] !== "\n" && sql[state.index] !== "\r") {
|
|
353
|
+
state.index += 1;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
function markContentAfterSemicolon(state, char, next) {
|
|
357
|
+
if (state.semicolons === 0 || /\s/.test(char) || char === ";")
|
|
358
|
+
return;
|
|
359
|
+
if ((char === "-" && next === "-") || (char === "/" && next === "*"))
|
|
360
|
+
return;
|
|
361
|
+
state.contentAfterSemicolon = true;
|
|
362
|
+
}
|
|
363
|
+
function consumeQuotedSql(sql, state, quote) {
|
|
364
|
+
// PostgreSQL's ordinary string literals and quoted identifiers escape a
|
|
365
|
+
// quote by doubling it. Backslashes escape only E'...' strings under the
|
|
366
|
+
// default standard_conforming_strings setting, so treating every backslash
|
|
367
|
+
// as an escape could hide a closing quote and a second statement.
|
|
368
|
+
const allowsBackslashEscapes = quote === "'" && state.token.toUpperCase() === "E";
|
|
369
|
+
flushSqlToken(state);
|
|
370
|
+
const next = skipQuoted(sql, state.index, quote, allowsBackslashEscapes);
|
|
371
|
+
if (next < 0)
|
|
372
|
+
return false;
|
|
373
|
+
state.index = next;
|
|
374
|
+
return true;
|
|
375
|
+
}
|
|
376
|
+
function consumeDollarQuotedSql(sql, state) {
|
|
377
|
+
const opener = readDollarTag(sql, state.index);
|
|
378
|
+
if (opener === undefined)
|
|
379
|
+
return "not-dollar-quoted";
|
|
380
|
+
flushSqlToken(state);
|
|
381
|
+
// An opener without its own closer is invalid PostgreSQL. Refuse it at the
|
|
382
|
+
// first one rather than resuming at each subsequent `$tag$`; otherwise many
|
|
383
|
+
// distinct unterminated tags make repeated suffix scans quadratic below the
|
|
384
|
+
// 1 MiB input cap.
|
|
385
|
+
const close = sql.indexOf(opener.tag, opener.afterOpen);
|
|
386
|
+
if (close < 0)
|
|
387
|
+
return "unterminated";
|
|
388
|
+
state.index = close + opener.tag.length;
|
|
389
|
+
return "consumed";
|
|
390
|
+
}
|
|
391
|
+
/** PostgreSQL requires a delimiter after an identifier to be whitespace-separated. */
|
|
392
|
+
function canOpenDollarQuoted(sql, state) {
|
|
393
|
+
if (state.token.length > 0)
|
|
394
|
+
return false;
|
|
395
|
+
const previous = state.index === 0 ? undefined : sql[state.index - 1];
|
|
396
|
+
// A quoted identifier is also an identifier even though it was intentionally
|
|
397
|
+
// omitted from `tokens`; without this fence `"name$tag$` could hide the
|
|
398
|
+
// remainder from the single-statement scan.
|
|
399
|
+
return previous === undefined || (previous !== '"' && !isIdentifierContinuation(previous));
|
|
400
|
+
}
|
|
401
|
+
function isIdentifierContinuation(char) {
|
|
402
|
+
return /[A-Za-z0-9_$]/.test(char) || char.charCodeAt(0) >= 0x80;
|
|
403
|
+
}
|
|
404
|
+
function flushSqlToken(state) {
|
|
405
|
+
if (state.token.length === 0)
|
|
406
|
+
return;
|
|
407
|
+
state.tokens.push(state.token.toUpperCase());
|
|
408
|
+
state.token = "";
|
|
409
|
+
}
|
|
410
|
+
function skipQuoted(sql, start, quote, allowsBackslashEscapes) {
|
|
411
|
+
let index = start + 1;
|
|
412
|
+
while (index < sql.length) {
|
|
413
|
+
if (sql[index] === quote) {
|
|
414
|
+
if (sql[index + 1] === quote) {
|
|
415
|
+
index += 2;
|
|
416
|
+
continue;
|
|
417
|
+
}
|
|
418
|
+
return index + 1;
|
|
419
|
+
}
|
|
420
|
+
if (allowsBackslashEscapes && sql[index] === "\\") {
|
|
421
|
+
index += 2;
|
|
422
|
+
}
|
|
423
|
+
else {
|
|
424
|
+
index += 1;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
return -1;
|
|
428
|
+
}
|
|
429
|
+
function readDollarTag(sql, start) {
|
|
430
|
+
if (sql[start] !== "$")
|
|
431
|
+
return undefined;
|
|
432
|
+
const next = sql[start + 1];
|
|
433
|
+
if (next === "$")
|
|
434
|
+
return { tag: "$$", afterOpen: start + 2 };
|
|
435
|
+
if (next === undefined || !/[A-Za-z_]/.test(next))
|
|
436
|
+
return undefined;
|
|
437
|
+
let end = start + 2;
|
|
438
|
+
while (end < sql.length && /[A-Za-z0-9_]/.test(sql[end] ?? ""))
|
|
439
|
+
end += 1;
|
|
440
|
+
if (sql[end] !== "$")
|
|
441
|
+
return undefined;
|
|
442
|
+
const tag = sql.slice(start, end + 1);
|
|
443
|
+
return { tag, afterOpen: end + 1 };
|
|
444
|
+
}
|
|
445
|
+
//# sourceMappingURL=database-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-tools.js","sourceRoot":"","sources":["../../src/domain/database-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -2806,6 +2806,10 @@ export const COMMAND_EXCLUSIONS = [
|
|
|
2806
2806
|
{ command: "release-data", reason: "datos de release del paquete" },
|
|
2807
2807
|
{ command: "hook", reason: "punto de entrada de los hooks del host" },
|
|
2808
2808
|
{ command: "mcp", reason: "configuración de servidores MCP" },
|
|
2809
|
+
{
|
|
2810
|
+
command: "tool",
|
|
2811
|
+
reason: "ejecutor directo de tools registradas: valida y llama el catálogo sin abrir un recorrido",
|
|
2812
|
+
},
|
|
2809
2813
|
{ command: "self", reason: "instalación y mantenimiento del propio CLI" },
|
|
2810
2814
|
{ command: "harness", reason: "dev-only: inspección del harness" },
|
|
2811
2815
|
{ command: "profiles", reason: "dev-only: perfiles de ejecución" },
|