@tacuchi/agent-workflow-cli 22.4.2 → 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.
Files changed (295) hide show
  1. package/README.md +39 -3
  2. package/dist/adapters/git-cli.js +59 -17
  3. package/dist/adapters/git-cli.js.map +1 -1
  4. package/dist/adapters/node-file-system.js +55 -1
  5. package/dist/adapters/node-file-system.js.map +1 -1
  6. package/dist/adapters/postgres-readonly-tools.js +277 -0
  7. package/dist/adapters/postgres-readonly-tools.js.map +1 -0
  8. package/dist/application/artifacts-service.js +2 -2
  9. package/dist/application/artifacts-service.js.map +1 -1
  10. package/dist/application/capability/dispatcher.js +2 -2
  11. package/dist/application/capability/dispatcher.js.map +1 -1
  12. package/dist/application/capability/installed-inventory.js +2 -2
  13. package/dist/application/capability/installed-inventory.js.map +1 -1
  14. package/dist/application/capability/readiness.js +1 -1
  15. package/dist/application/capability/readiness.js.map +1 -1
  16. package/dist/application/check-branch-service.js +2 -2
  17. package/dist/application/check-branch-service.js.map +1 -1
  18. package/dist/application/checkpoint/files-touched.js +271 -0
  19. package/dist/application/checkpoint/files-touched.js.map +1 -0
  20. package/dist/application/checkpoint/markdown.js +61 -8
  21. package/dist/application/checkpoint/markdown.js.map +1 -1
  22. package/dist/application/checkpoint/state-reader.js +8 -2
  23. package/dist/application/checkpoint/state-reader.js.map +1 -1
  24. package/dist/application/checkpoint-write-service.js +16 -5
  25. package/dist/application/checkpoint-write-service.js.map +1 -1
  26. package/dist/application/claims-ledger.js +330 -0
  27. package/dist/application/claims-ledger.js.map +1 -0
  28. package/dist/application/claims-recovery.js +338 -0
  29. package/dist/application/claims-recovery.js.map +1 -0
  30. package/dist/application/database-mcp-server.js +168 -0
  31. package/dist/application/database-mcp-server.js.map +1 -0
  32. package/dist/application/database-mcp-stdio.js +137 -0
  33. package/dist/application/database-mcp-stdio.js.map +1 -0
  34. package/dist/application/database-tool-catalog.js +226 -0
  35. package/dist/application/database-tool-catalog.js.map +1 -0
  36. package/dist/application/dev-only-services.js +154 -44
  37. package/dist/application/dev-only-services.js.map +1 -1
  38. package/dist/application/dsn-reader-service.js +1 -1
  39. package/dist/application/elicitation-server.js +382 -0
  40. package/dist/application/elicitation-server.js.map +1 -0
  41. package/dist/application/elicitation-stdio.js +48 -0
  42. package/dist/application/elicitation-stdio.js.map +1 -0
  43. package/dist/application/flow/advance.js +86 -5
  44. package/dist/application/flow/advance.js.map +1 -1
  45. package/dist/application/flow/checkout-observation.js +152 -0
  46. package/dist/application/flow/checkout-observation.js.map +1 -0
  47. package/dist/application/flow/flow-service.js +72 -13
  48. package/dist/application/flow/flow-service.js.map +1 -1
  49. package/dist/application/flow/internal-actions.js +460 -1
  50. package/dist/application/flow/internal-actions.js.map +1 -1
  51. package/dist/application/flow/internal-drive.js +22 -9
  52. package/dist/application/flow/internal-drive.js.map +1 -1
  53. package/dist/application/flow/prove.js +205 -0
  54. package/dist/application/flow/prove.js.map +1 -0
  55. package/dist/application/flow/run-journey.js +15 -0
  56. package/dist/application/flow/run-journey.js.map +1 -0
  57. package/dist/application/flow/run-projection.js +15 -3
  58. package/dist/application/flow/run-projection.js.map +1 -1
  59. package/dist/application/flow/run-state-service.js +19 -4
  60. package/dist/application/flow/run-state-service.js.map +1 -1
  61. package/dist/application/flow/submit.js +250 -72
  62. package/dist/application/flow/submit.js.map +1 -1
  63. package/dist/application/generate-launch-service.js +4 -4
  64. package/dist/application/generate-launch-service.js.map +1 -1
  65. package/dist/application/git-flow-service.js +9 -0
  66. package/dist/application/git-flow-service.js.map +1 -1
  67. package/dist/application/local-proposal.js +9 -0
  68. package/dist/application/local-proposal.js.map +1 -1
  69. package/dist/application/lock-service.js +96 -28
  70. package/dist/application/lock-service.js.map +1 -1
  71. package/dist/application/logging/log-events.js +19 -3
  72. package/dist/application/logging/log-events.js.map +1 -1
  73. package/dist/application/logging/logger.js +2 -2
  74. package/dist/application/logging/logger.js.map +1 -1
  75. package/dist/application/mcp-connections-service.js +115 -41
  76. package/dist/application/mcp-connections-service.js.map +1 -1
  77. package/dist/application/mcp-doctor-service.js +98 -54
  78. package/dist/application/mcp-doctor-service.js.map +1 -1
  79. package/dist/application/mcp-entry-classification.js +60 -0
  80. package/dist/application/mcp-entry-classification.js.map +1 -0
  81. package/dist/application/mcp-host-reader.js +114 -81
  82. package/dist/application/mcp-host-reader.js.map +1 -1
  83. package/dist/application/mcp-host-receipt-service.js +399 -0
  84. package/dist/application/mcp-host-receipt-service.js.map +1 -0
  85. package/dist/application/mcp-host-receipt-store.js +122 -0
  86. package/dist/application/mcp-host-receipt-store.js.map +1 -0
  87. package/dist/application/mcp-host-receipts.js +28 -0
  88. package/dist/application/mcp-host-receipts.js.map +1 -0
  89. package/dist/application/mcp-host-writer.js +321 -126
  90. package/dist/application/mcp-host-writer.js.map +1 -1
  91. package/dist/application/mcp-launch-probe-service.js +142 -0
  92. package/dist/application/mcp-launch-probe-service.js.map +1 -0
  93. package/dist/application/mcp-migration-service.js +351 -0
  94. package/dist/application/mcp-migration-service.js.map +1 -0
  95. package/dist/application/mcp-native-host-check-service.js +154 -0
  96. package/dist/application/mcp-native-host-check-service.js.map +1 -0
  97. package/dist/application/mcp-receipt-registration-service.js +105 -0
  98. package/dist/application/mcp-receipt-registration-service.js.map +1 -0
  99. package/dist/application/mcp-receipt-removal-service.js +62 -0
  100. package/dist/application/mcp-receipt-removal-service.js.map +1 -0
  101. package/dist/application/mcp-remove-service.js +84 -21
  102. package/dist/application/mcp-remove-service.js.map +1 -1
  103. package/dist/application/mcp-scope-common.js +2 -4
  104. package/dist/application/mcp-scope-common.js.map +1 -1
  105. package/dist/application/mcp-setup-service.js +60 -21
  106. package/dist/application/mcp-setup-service.js.map +1 -1
  107. package/dist/application/mcp-stdio-probe.js +526 -0
  108. package/dist/application/mcp-stdio-probe.js.map +1 -0
  109. package/dist/application/mcp-test-connection-service.js +23 -50
  110. package/dist/application/mcp-test-connection-service.js.map +1 -1
  111. package/dist/application/merge-state-service.js +10 -16
  112. package/dist/application/merge-state-service.js.map +1 -1
  113. package/dist/application/multiroot/claude.js +34 -15
  114. package/dist/application/multiroot/claude.js.map +1 -1
  115. package/dist/application/multiroot/codex.js +9 -5
  116. package/dist/application/multiroot/codex.js.map +1 -1
  117. package/dist/application/multiroot-service.js +20 -11
  118. package/dist/application/multiroot-service.js.map +1 -1
  119. package/dist/application/parsers/project-block.js +25 -2
  120. package/dist/application/parsers/project-block.js.map +1 -1
  121. package/dist/application/paths-service.js +30 -31
  122. package/dist/application/paths-service.js.map +1 -1
  123. package/dist/application/plan-exec-batch-service.js +549 -0
  124. package/dist/application/plan-exec-batch-service.js.map +1 -0
  125. package/dist/application/plan-exec-decision-service.js +273 -0
  126. package/dist/application/plan-exec-decision-service.js.map +1 -0
  127. package/dist/application/project-md-service.js +2 -2
  128. package/dist/application/project-md-service.js.map +1 -1
  129. package/dist/application/project-md-upsert-service.js +4 -4
  130. package/dist/application/project-md-upsert-service.js.map +1 -1
  131. package/dist/application/project-tab-data.js +12 -7
  132. package/dist/application/project-tab-data.js.map +1 -1
  133. package/dist/application/release-data-service.js +2 -2
  134. package/dist/application/release-data-service.js.map +1 -1
  135. package/dist/application/resume-service.js +32 -11
  136. package/dist/application/resume-service.js.map +1 -1
  137. package/dist/application/retirement/apply.js +84 -0
  138. package/dist/application/retirement/apply.js.map +1 -1
  139. package/dist/application/retirement/attribution.js +31 -1
  140. package/dist/application/retirement/attribution.js.map +1 -1
  141. package/dist/application/retirement/graph.js +19 -1
  142. package/dist/application/retirement/graph.js.map +1 -1
  143. package/dist/application/retirement/journal.js +11 -0
  144. package/dist/application/retirement/journal.js.map +1 -1
  145. package/dist/application/retirement/prepare.js +89 -3
  146. package/dist/application/retirement/prepare.js.map +1 -1
  147. package/dist/application/retirement/preview.js +16 -0
  148. package/dist/application/retirement/preview.js.map +1 -1
  149. package/dist/application/retirement/resolve.js +65 -0
  150. package/dist/application/retirement/resolve.js.map +1 -1
  151. package/dist/application/self/host-states.js +2 -0
  152. package/dist/application/self/host-states.js.map +1 -1
  153. package/dist/application/self/install-skill.js +21 -17
  154. package/dist/application/self/install-skill.js.map +1 -1
  155. package/dist/application/self/mcp-config.js +392 -84
  156. package/dist/application/self/mcp-config.js.map +1 -1
  157. package/dist/application/self/mcp-via-state.js +62 -0
  158. package/dist/application/self/mcp-via-state.js.map +1 -0
  159. package/dist/application/self/uninstall.js +15 -5
  160. package/dist/application/self/uninstall.js.map +1 -1
  161. package/dist/application/session-close-service.js +24 -1
  162. package/dist/application/session-close-service.js.map +1 -1
  163. package/dist/application/session-create-service.js +7 -0
  164. package/dist/application/session-create-service.js.map +1 -1
  165. package/dist/application/session-resume-service.js +2 -2
  166. package/dist/application/session-resume-service.js.map +1 -1
  167. package/dist/application/sessions-service.js +2 -4
  168. package/dist/application/sessions-service.js.map +1 -1
  169. package/dist/application/skills-resolver-service.js +4 -4
  170. package/dist/application/skills-resolver-service.js.map +1 -1
  171. package/dist/application/source-boundary-policy.js +18 -7
  172. package/dist/application/source-boundary-policy.js.map +1 -1
  173. package/dist/application/source-remove-service.js +12 -1
  174. package/dist/application/source-remove-service.js.map +1 -1
  175. package/dist/application/sources-service.js +2 -2
  176. package/dist/application/sources-service.js.map +1 -1
  177. package/dist/application/status-service.js +4 -0
  178. package/dist/application/status-service.js.map +1 -1
  179. package/dist/application/visibility-doctor-service.js +1 -1
  180. package/dist/application/visibility-doctor-service.js.map +1 -1
  181. package/dist/application/workline-index-service.js +182 -27
  182. package/dist/application/workline-index-service.js.map +1 -1
  183. package/dist/application/workspace-init-service.js +89 -271
  184. package/dist/application/workspace-init-service.js.map +1 -1
  185. package/dist/application/workspace-materialization-service.js +300 -0
  186. package/dist/application/workspace-materialization-service.js.map +1 -0
  187. package/dist/application/worktree-service.js +32 -3
  188. package/dist/application/worktree-service.js.map +1 -1
  189. package/dist/cli/commands/capability.js +4 -7
  190. package/dist/cli/commands/capability.js.map +1 -1
  191. package/dist/cli/commands/claims.js +72 -0
  192. package/dist/cli/commands/claims.js.map +1 -0
  193. package/dist/cli/commands/dev-only.js +73 -25
  194. package/dist/cli/commands/dev-only.js.map +1 -1
  195. package/dist/cli/commands/flow.js +145 -42
  196. package/dist/cli/commands/flow.js.map +1 -1
  197. package/dist/cli/commands/index.js +4 -0
  198. package/dist/cli/commands/index.js.map +1 -1
  199. package/dist/cli/commands/mcp.js +752 -76
  200. package/dist/cli/commands/mcp.js.map +1 -1
  201. package/dist/cli/commands/multiroot.js +40 -7
  202. package/dist/cli/commands/multiroot.js.map +1 -1
  203. package/dist/cli/commands/resume.js +9 -3
  204. package/dist/cli/commands/resume.js.map +1 -1
  205. package/dist/cli/commands/retirement.js +9 -0
  206. package/dist/cli/commands/retirement.js.map +1 -1
  207. package/dist/cli/commands/session-create.js +1 -1
  208. package/dist/cli/commands/session-create.js.map +1 -1
  209. package/dist/cli/commands/skills.js +1 -1
  210. package/dist/cli/commands/skills.js.map +1 -1
  211. package/dist/cli/commands/status.js +72 -24
  212. package/dist/cli/commands/status.js.map +1 -1
  213. package/dist/cli/commands/tool.js +141 -0
  214. package/dist/cli/commands/tool.js.map +1 -0
  215. package/dist/cli/commands/workspace-init.js +5 -5
  216. package/dist/cli/commands/workspace-init.js.map +1 -1
  217. package/dist/cli/help-groups.js +6 -1
  218. package/dist/cli/help-groups.js.map +1 -1
  219. package/dist/cli/main.js +272 -67
  220. package/dist/cli/main.js.map +1 -1
  221. package/dist/cli/parser.js +8 -1
  222. package/dist/cli/parser.js.map +1 -1
  223. package/dist/cli/registry.js.map +1 -1
  224. package/dist/cli/render.js +15 -2
  225. package/dist/cli/render.js.map +1 -1
  226. package/dist/cli/tui/app.js +3 -2
  227. package/dist/cli/tui/app.js.map +1 -1
  228. package/dist/cli/tui/components/workspace-init-form.js +7 -7
  229. package/dist/cli/tui/components/workspace-init-form.js.map +1 -1
  230. package/dist/cli/tui/data/workflow-content.js +2 -2
  231. package/dist/cli/tui/data/workflow-content.js.map +1 -1
  232. package/dist/cli/tui/tabs/config-tab.js +4 -3
  233. package/dist/cli/tui/tabs/config-tab.js.map +1 -1
  234. package/dist/cli/tui/tabs/mcp-tab-helpers.js +72 -1
  235. package/dist/cli/tui/tabs/mcp-tab-helpers.js.map +1 -1
  236. package/dist/cli/tui/tabs/mcp-tab.js +101 -42
  237. package/dist/cli/tui/tabs/mcp-tab.js.map +1 -1
  238. package/dist/cli/tui/tabs/project-tab.js +18 -21
  239. package/dist/cli/tui/tabs/project-tab.js.map +1 -1
  240. package/dist/cli/tui/workspace-root.js +13 -0
  241. package/dist/cli/tui/workspace-root.js.map +1 -0
  242. package/dist/domain/capability/protocol.js +2 -2
  243. package/dist/domain/capability/protocol.js.map +1 -1
  244. package/dist/domain/database-tools.js +445 -0
  245. package/dist/domain/database-tools.js.map +1 -0
  246. package/dist/domain/degradation-notice.js +60 -0
  247. package/dist/domain/degradation-notice.js.map +1 -0
  248. package/dist/domain/elicitation.js +152 -0
  249. package/dist/domain/elicitation.js.map +1 -0
  250. package/dist/domain/flow/answer.js +173 -42
  251. package/dist/domain/flow/answer.js.map +1 -1
  252. package/dist/domain/flow/authority.js +184 -127
  253. package/dist/domain/flow/authority.js.map +1 -1
  254. package/dist/domain/flow/directive.js +47 -1
  255. package/dist/domain/flow/directive.js.map +1 -1
  256. package/dist/domain/flow/rules.js +7 -4
  257. package/dist/domain/flow/rules.js.map +1 -1
  258. package/dist/domain/flow/run-state.js +636 -31
  259. package/dist/domain/flow/run-state.js.map +1 -1
  260. package/dist/domain/harnesses.js +16 -0
  261. package/dist/domain/harnesses.js.map +1 -1
  262. package/dist/domain/mcp-entry.js +164 -28
  263. package/dist/domain/mcp-entry.js.map +1 -1
  264. package/dist/domain/postgres-object-search.js +320 -0
  265. package/dist/domain/postgres-object-search.js.map +1 -0
  266. package/dist/domain/redaction.js +47 -0
  267. package/dist/domain/redaction.js.map +1 -0
  268. package/dist/domain/retirement/proposal.js +1 -0
  269. package/dist/domain/retirement/proposal.js.map +1 -1
  270. package/dist/domain/structured-choice-stamp.js +32 -4
  271. package/dist/domain/structured-choice-stamp.js.map +1 -1
  272. package/dist/domain/workline-mcp-entry.js +34 -0
  273. package/dist/domain/workline-mcp-entry.js.map +1 -0
  274. package/dist/ports/postgres-tools.js +10 -0
  275. package/dist/ports/postgres-tools.js.map +1 -0
  276. package/dist/runtime/namespace-resolver.js +104 -18
  277. package/dist/runtime/namespace-resolver.js.map +1 -1
  278. package/package.json +5 -1
  279. package/skills/w/README.md +2 -2
  280. package/skills/w/SKILL.md +9 -10
  281. package/skills/w/artifacts/README.md +1 -1
  282. package/skills/w/commands/README.md +3 -3
  283. package/skills/w/commands/persist.md +3 -1
  284. package/skills/w/commands/resume.md +1 -1
  285. package/skills/w/commands/spec-new.md +2 -2
  286. package/skills/w/commands/status.md +1 -1
  287. package/skills/w/commands/workspace-init.md +9 -10
  288. package/skills/w/context/MANIFEST.json +1 -4
  289. package/skills/w/harness/HARNESS.md +1 -1
  290. package/skills/w/loops/quick-loop/LOOP.md +1 -1
  291. package/skills/w/modules/PROMPT-CONTINUITY.md +1 -1
  292. package/skills/w/modules/WORKSPACE-SCAFFOLD.md +17 -20
  293. package/skills/w/schemas/capability-descriptor.schema.json +1 -1
  294. package/dist/application/mcp-dbhub-launcher.js +0 -216
  295. package/dist/application/mcp-dbhub-launcher.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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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Lo que la persona lee cuando la vía nativa no rindió una elección.
3
+ *
4
+ * La degradación dejó de ser un aviso de pérdida y pasó a ser accionable, y eso
5
+ * son dos cosas distintas que este módulo produce juntas: la CAUSA —dicha sin
6
+ * atribuirle a nadie una decisión que no tomó— y la frontera ENTERA en markdown
7
+ * etiquetado, sin perder una sola alternativa.
8
+ *
9
+ * Que el markdown se genere del MISMO dato que la solicitud nativa es la garantía
10
+ * de AC-02: si se redactara aparte, las dos presentaciones podrían diferir y la
11
+ * degradada sería la que pierde algo. Acá degrada el mecanismo y nunca el contenido.
12
+ */
13
+ import { orderedOptions } from "./elicitation.js";
14
+ /**
15
+ * La frontera entera, en el piso universal.
16
+ *
17
+ * Cada alternativa con su consecuencia, la recomendada primera y el control de
18
+ * flujo entre las opciones — el mismo orden que la vía nativa, porque sale de la
19
+ * misma función que lo ordena.
20
+ */
21
+ export function renderLabeledMarkdown(questions) {
22
+ const lines = [];
23
+ for (const question of questions) {
24
+ lines.push(`**${question.header} — ${question.question}**`, "");
25
+ for (const option of orderedOptions(question)) {
26
+ const mark = option.recommended === true ? " _(recomendada)_" : "";
27
+ lines.push(`- ${option.label} — ${option.consequence}${mark}`);
28
+ }
29
+ lines.push("");
30
+ }
31
+ lines.push("Answer by label, or with `Aceptar recomendaciones` to take every first option.");
32
+ return lines.join("\n");
33
+ }
34
+ /**
35
+ * Por qué no hubo elección, dicho para el AGENTE que lo va a presentar.
36
+ *
37
+ * En inglés como el resto del catálogo y del estampado, y no en el idioma de la
38
+ * persona, porque esto es dato de protocolo que el agente relaya: quien traduce a
39
+ * la persona es él, y mezclar los dos idiomas a mitad de oración —que es lo que
40
+ * pasaba al componer castellano alrededor de campos ingleses del catálogo— se lee
41
+ * peor que cualquiera de los dos. Las etiquetas de las alternativas siguen viniendo
42
+ * de quien llama, así que ésas ya están en el idioma de la persona.
43
+ *
44
+ * El protocolo no prueba si una negativa o cancelación vino de una política del
45
+ * host o de una persona. Los dos casos quedan sin atribuir, y ninguno avanza la
46
+ * frontera.
47
+ */
48
+ export function degradationNotice(outcome) {
49
+ switch (outcome) {
50
+ case "declined":
51
+ return "The selector reported a decline, so the boundary stays pending and no transition was applied. Present it below so it can be answered explicitly.";
52
+ case "cancelled":
53
+ return "The selector reported a cancellation without a choice, so the boundary stays pending. Present it below.";
54
+ case "empty":
55
+ return "The selector came back with neither a choice nor any text, so the boundary stays pending. Present it below.";
56
+ default:
57
+ return "";
58
+ }
59
+ }
60
+ //# sourceMappingURL=degradation-notice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"degradation-notice.js","sourceRoot":"","sources":["../../src/domain/degradation-notice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAkD,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElG;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,SAAsC;IAC1E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,MAAM,MAAM,QAAQ,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC,CAAC;QAChE,KAAK,MAAM,MAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,KAAK,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,WAAW,GAAG,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;IAC7F,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAmC;IACnE,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,UAAU;YACb,OAAO,kJAAkJ,CAAC;QAC5J,KAAK,WAAW;YACd,OAAO,yGAAyG,CAAC;QACnH,KAAK,OAAO;YACV,OAAO,6GAA6G,CAAC;QACvH;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}