@agent-native/core 0.28.2 → 0.28.4

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 (35) hide show
  1. package/dist/cli/connect.js +1 -1
  2. package/dist/cli/connect.js.map +1 -1
  3. package/dist/cli/mcp-config-writers.d.ts +2 -1
  4. package/dist/cli/mcp-config-writers.d.ts.map +1 -1
  5. package/dist/cli/mcp-config-writers.js +5 -1
  6. package/dist/cli/mcp-config-writers.js.map +1 -1
  7. package/dist/cli/mcp.d.ts.map +1 -1
  8. package/dist/cli/mcp.js +3 -0
  9. package/dist/cli/mcp.js.map +1 -1
  10. package/dist/cli/skills.d.ts.map +1 -1
  11. package/dist/cli/skills.js +44 -2
  12. package/dist/cli/skills.js.map +1 -1
  13. package/dist/client/mcp-app-host.d.ts +1 -0
  14. package/dist/client/mcp-app-host.d.ts.map +1 -1
  15. package/dist/client/mcp-app-host.js +12 -1
  16. package/dist/client/mcp-app-host.js.map +1 -1
  17. package/dist/mcp/embed-app.d.ts.map +1 -1
  18. package/dist/mcp/embed-app.js +13 -9
  19. package/dist/mcp/embed-app.js.map +1 -1
  20. package/dist/observability/feedback.d.ts.map +1 -1
  21. package/dist/observability/feedback.js +4 -1
  22. package/dist/observability/feedback.js.map +1 -1
  23. package/dist/scripts/db/exec.d.ts.map +1 -1
  24. package/dist/scripts/db/exec.js +18 -7
  25. package/dist/scripts/db/exec.js.map +1 -1
  26. package/dist/scripts/db/patch.d.ts.map +1 -1
  27. package/dist/scripts/db/patch.js +16 -1
  28. package/dist/scripts/db/patch.js.map +1 -1
  29. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  30. package/dist/server/agent-chat-plugin.js +9 -3
  31. package/dist/server/agent-chat-plugin.js.map +1 -1
  32. package/dist/templates/default/AGENTS.md +1 -0
  33. package/docs/content/security.md +34 -15
  34. package/package.json +2 -1
  35. package/src/templates/default/AGENTS.md +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../../src/scripts/db/patch.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Core script: db-patch\n *\n * Surgical search-and-replace on a text column in any SQL table. Instead of\n * re-sending the full column value (as `db-exec UPDATE` would require), the\n * agent sends one or more `{find, replace}` pairs. The script reads the row,\n * applies the edits in memory, and writes the result back in a single UPDATE.\n *\n * ## When to use which tool\n *\n * Large text field, small slice to change → db-patch (this)\n * e.g. fix one paragraph in a 50KB document, tweak one key in a dashboard\n * JSON blob, rename a label in a slide HTML string.\n *\n * Short field, set outright → db-exec UPDATE\n * e.g. `UPDATE forms SET status = 'published' WHERE id = '...'`.\n *\n * Multiple columns / computed values → db-exec UPDATE\n * e.g. `UPDATE meals SET calories = calories + 50, ...`.\n *\n * Domain-specific action exists → use that action\n * e.g. `edit-document` or `update-slide` — they also push live Yjs\n * updates to any open collaborative editor. db-patch is the generic\n * fallback for tables without a bespoke action.\n *\n * ## Why it's faster\n *\n * The agent only has to transmit the diff (the `find` + `replace`\n * strings), not the full new value. For large text fields — multi-kilobyte\n * markdown documents, slide HTML, dashboard/form JSON — this dramatically\n * reduces tokens per edit and keeps concurrent edits composable.\n *\n * ## Security\n *\n * In production mode, the same per-user / per-org temp view scoping that\n * `db-exec` uses applies here: the SELECT and UPDATE both go through the\n * scoped view, so you can never read or write rows outside the current\n * user's data. The WHERE clause is validated against a keyword denylist\n * (no ;, no chained statements, no DDL).\n *\n * ## Usage\n *\n * pnpm action db-patch --table <t> --column <c> --where \"<clause>\" \\\n * --find \"old\" --replace \"new\"\n *\n * pnpm action db-patch --table decks --column data --where \"id='d1'\" \\\n * --edits '[{\"find\":\"Q3\",\"replace\":\"Q4\"},{\"find\":\"$1M\",\"replace\":\"$1.2M\"}]'\n */\n\nimport path from \"path\";\nimport { getDatabaseUrl } from \"../../db/client.js\";\nimport { parseArgs, fail } from \"../utils.js\";\nimport {\n assertNoRawDbAccessControlPatchTarget,\n assertNoSensitiveFrameworkTables,\n} from \"./safety.js\";\nimport { buildScopingPostgres, buildScopingSqlite } from \"./scoping.js\";\nimport { createSqliteScriptClient } from \"./sqlite-client.js\";\n\ninterface TextEdit {\n find: string;\n replace: string;\n}\n\n/**\n * JSON patch operation — a subset of RFC 6902 plus a convenience `move-before`\n * that's rare in the spec but common for list reordering. The agent ends up\n * needing this all the time (reordering dashboard panels, form fields, slide\n * layers) and without it has to do multi-step string surgery.\n */\ninterface JsonOp {\n op: \"set\" | \"replace\" | \"remove\" | \"move\" | \"move-before\" | \"insert\";\n /** JSON Pointer-style path, e.g. \"/panels/3/title\". \"\" = root. */\n path?: string;\n /** For move / move-before: source path. */\n from?: string;\n /** For set / replace / insert: value to write. */\n value?: unknown;\n}\n\ninterface EditResult {\n index: number;\n status: \"replaced\" | \"deleted\" | \"not-found\";\n detail: string;\n occurrences: number;\n}\n\ninterface PatchOutput {\n table: string;\n column: string;\n applied: number;\n total: number;\n bytesBefore: number;\n bytesAfter: number;\n results: EditResult[];\n}\n\nfunction isPostgresUrl(url: string): boolean {\n return url.startsWith(\"postgres://\") || url.startsWith(\"postgresql://\");\n}\n\n/** Only unquoted [A-Za-z_][A-Za-z0-9_]* identifiers are allowed — no spaces,\n * no quoting, no dotted names. This is deliberately strict: it stops the\n * agent from sneaking SQL into the table/column slots. */\nfunction isValidIdentifier(s: string): boolean {\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(s);\n}\n\n/** Reject WHERE clauses that could chain statements or hide DDL. This isn't\n * a full SQL parser — just a keyword/character denylist to keep the surface\n * area equivalent to what db-exec already allows. */\nfunction validateWhere(where: string): void {\n if (where.includes(\";\")) {\n fail(\"--where must not contain ';' (no statement chaining)\");\n }\n // Strip inline strings before keyword scanning so \"WHERE name = 'DROP TABLE'\"\n // doesn't trip the denylist.\n const stripped = where\n .replace(/'(?:''|[^'])*'/g, \"''\")\n .replace(/\"(?:\"\"|[^\"])*\"/g, '\"\"')\n .toUpperCase();\n\n const blocked = [\n \" INSERT \",\n \" UPDATE \",\n \" DELETE \",\n \" DROP \",\n \" ALTER \",\n \" CREATE \",\n \" ATTACH \",\n \" DETACH \",\n \" PRAGMA \",\n \" VACUUM \",\n \"--\",\n \"/*\",\n ];\n const padded = \" \" + stripped + \" \";\n for (const kw of blocked) {\n if (padded.includes(kw)) {\n fail(`--where must not contain \"${kw.trim()}\"`);\n }\n }\n}\n\nfunction parseEdits(parsed: Record<string, string>): TextEdit[] {\n let edits: TextEdit[];\n\n if (parsed.edits) {\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(parsed.edits);\n } catch (e: any) {\n fail(`Invalid --edits JSON: ${e.message}`);\n }\n if (!Array.isArray(parsedJson) || parsedJson.length === 0) {\n fail(\"--edits must be a non-empty JSON array of {find, replace} objects\");\n }\n edits = parsedJson as TextEdit[];\n } else if (parsed.find !== undefined) {\n if (parsed.find === \"\") fail(\"--find cannot be empty\");\n edits = [{ find: parsed.find, replace: parsed.replace ?? \"\" }];\n } else {\n fail(\"Either --find/--replace or --edits is required\");\n }\n\n for (const edit of edits!) {\n if (typeof edit.find !== \"string\" || edit.find === \"\") {\n fail(\"Each edit must have a non-empty 'find' string\");\n }\n if (edit.replace === undefined || edit.replace === null) {\n edit.replace = \"\";\n }\n if (typeof edit.replace !== \"string\") {\n fail(\"Each edit's 'replace' field must be a string\");\n }\n }\n\n return edits!;\n}\n\nfunction preview(s: string): string {\n const max = 60;\n const trimmed = s.replace(/\\s+/g, \" \");\n return trimmed.length > max ? trimmed.slice(0, max) + \"...\" : trimmed;\n}\n\n// ─── JSON patch helpers ─────────────────────────────────────────────────────\n\n/** Parse a JSON Pointer (\"/panels/3/title\") into path segments. \"\" = root. */\nfunction parsePointer(pointer: string): string[] {\n if (pointer === \"\" || pointer === \"/\") return [];\n if (!pointer.startsWith(\"/\")) {\n fail(`JSON path must start with '/' (got: ${pointer})`);\n }\n return pointer\n .slice(1)\n .split(\"/\")\n .map((s) => s.replace(/~1/g, \"/\").replace(/~0/g, \"~\"));\n}\n\n/** Walk to the parent container of the given path. Returns [parent, lastKey]. */\nfunction resolveParent(\n root: unknown,\n segments: string[],\n): [any, string | number] {\n if (segments.length === 0) {\n fail(\"Root path is not supported for this operation\");\n }\n let node: any = root;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n if (Array.isArray(node)) {\n const idx = parseInt(seg, 10);\n if (isNaN(idx) || idx < 0 || idx >= node.length) {\n fail(\n `Path segment \"${seg}\" is out of bounds for array of length ${node.length}`,\n );\n }\n node = node[idx];\n } else if (node && typeof node === \"object\") {\n if (!(seg in node)) {\n fail(`Path segment \"${seg}\" not found in object`);\n }\n node = node[seg];\n } else {\n fail(`Cannot descend into ${typeof node} at segment \"${seg}\"`);\n }\n }\n const last = segments[segments.length - 1];\n if (Array.isArray(node)) {\n const idx = last === \"-\" ? node.length : parseInt(last, 10);\n if (isNaN(idx)) fail(`Expected numeric index, got \"${last}\"`);\n return [node, idx];\n }\n return [node, last];\n}\n\n/** Apply one JSON op, mutating `root` in place. Returns a short detail string. */\nfunction applyJsonOp(root: any, op: JsonOp): string {\n switch (op.op) {\n case \"set\":\n case \"replace\": {\n if (op.path === undefined) fail(`${op.op} requires 'path'`);\n const [parent, key] = resolveParent(root, parsePointer(op.path));\n parent[key as any] = op.value;\n return `${op.op} ${op.path}`;\n }\n case \"remove\": {\n if (op.path === undefined) fail(\"remove requires 'path'\");\n const [parent, key] = resolveParent(root, parsePointer(op.path));\n if (Array.isArray(parent)) {\n parent.splice(key as number, 1);\n } else {\n delete parent[key as string];\n }\n return `remove ${op.path}`;\n }\n case \"insert\": {\n if (op.path === undefined) fail(\"insert requires 'path'\");\n const [parent, key] = resolveParent(root, parsePointer(op.path));\n if (!Array.isArray(parent)) fail(`insert target must be an array`);\n parent.splice(key as number, 0, op.value);\n return `insert at ${op.path}`;\n }\n case \"move\":\n case \"move-before\": {\n if (!op.from || op.path === undefined) {\n fail(`${op.op} requires 'from' and 'path'`);\n }\n const fromSeg = parsePointer(op.from);\n const toSeg = parsePointer(op.path);\n const [fromParent, fromKey] = resolveParent(root, fromSeg);\n // Extract the value\n let value: unknown;\n if (Array.isArray(fromParent)) {\n value = fromParent[fromKey as number];\n fromParent.splice(fromKey as number, 1);\n } else {\n value = fromParent[fromKey as string];\n delete fromParent[fromKey as string];\n }\n // For array moves where the destination is in the same array and\n // after the removed index, shift the target index down by one so\n // \"move /panels/7 to /panels/3\" lands exactly at index 3 even after\n // the earlier splice shifted indices.\n let [toParent, toKey] = resolveParent(root, toSeg);\n if (\n Array.isArray(toParent) &&\n Array.isArray(fromParent) &&\n toParent === fromParent\n ) {\n const fromIdx = fromKey as number;\n const toIdx = toKey as number;\n if (toIdx > fromIdx) {\n toKey = toIdx - 1;\n }\n }\n if (Array.isArray(toParent)) {\n toParent.splice(toKey as number, 0, value);\n } else {\n toParent[toKey as string] = value;\n }\n return `${op.op} ${op.from} → ${op.path}`;\n }\n default:\n fail(`Unknown JSON op: ${(op as any).op}`);\n }\n return \"\";\n}\n\nfunction parseJsonOps(parsed: Record<string, string>): JsonOp[] | null {\n if (!parsed.jsonOps && !parsed[\"json-ops\"]) return null;\n const raw = parsed.jsonOps ?? parsed[\"json-ops\"];\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(raw);\n } catch (e: any) {\n fail(`Invalid --json-ops JSON: ${e.message}`);\n }\n if (!Array.isArray(parsedJson) || parsedJson.length === 0) {\n fail(\"--json-ops must be a non-empty JSON array\");\n }\n for (const op of parsedJson as any[]) {\n if (!op || typeof op !== \"object\" || typeof op.op !== \"string\") {\n fail(\"Each op must be an object with an 'op' field\");\n }\n }\n return parsedJson as JsonOp[];\n}\n\nfunction countOccurrences(haystack: string, needle: string): number {\n if (!needle) return 0;\n let count = 0;\n let idx = 0;\n while ((idx = haystack.indexOf(needle, idx)) !== -1) {\n count++;\n idx += needle.length;\n }\n return count;\n}\n\n/** Find all match positions (up to a cap so we don't explode memory). */\nfunction findAll(haystack: string, needle: string, cap = 10): number[] {\n const out: number[] = [];\n if (!needle) return out;\n let idx = 0;\n while ((idx = haystack.indexOf(needle, idx)) !== -1 && out.length < cap) {\n out.push(idx);\n idx += needle.length;\n }\n return out;\n}\n\n/** Format a single match with ~40 chars of surrounding context so the agent\n * can widen its `find` string to disambiguate ambiguous matches. */\nfunction formatContext(\n content: string,\n matchIdx: number,\n matchLen: number,\n radius = 40,\n): string {\n const start = Math.max(0, matchIdx - radius);\n const end = Math.min(content.length, matchIdx + matchLen + radius);\n const before = content.slice(start, matchIdx).replace(/\\s+/g, \" \");\n const middle = content\n .slice(matchIdx, matchIdx + matchLen)\n .replace(/\\s+/g, \" \");\n const after = content.slice(matchIdx + matchLen, end).replace(/\\s+/g, \" \");\n const prefix = start > 0 ? \"…\" : \"\";\n const suffix = end < content.length ? \"…\" : \"\";\n return `${prefix}${before}⟨${middle}⟩${after}${suffix}`;\n}\n\n/** Build a \"string not unique\" error message showing each match in\n * context — matches Claude Code's Edit-tool UX so the agent can\n * widen the find string and retry. */\nfunction buildAmbiguousMessage(\n findStr: string,\n content: string,\n count: number,\n): string {\n const positions = findAll(content, findStr, 6);\n const lines = [\n `Found ${count} occurrences of the 'find' string — db-patch requires exactly one match by default.`,\n `Widen 'find' with unique surrounding context, or pass --all to replace every occurrence.`,\n `'find' preview: \"${preview(findStr)}\"`,\n \"Matches:\",\n ];\n for (let i = 0; i < positions.length; i++) {\n lines.push(\n ` [${i + 1}] ${formatContext(content, positions[i], findStr.length)}`,\n );\n }\n if (count > positions.length) {\n lines.push(` … and ${count - positions.length} more`);\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Apply edits sequentially.\n *\n * Default behavior matches Claude Code's Edit tool: the `find` string must\n * match exactly one occurrence. If 0 → \"not found\". If >1 → error with\n * surrounding context for each match so the agent can widen `find` and\n * retry. Pass `replaceAll` (`--all`) to allow replacing every occurrence.\n *\n * This strict-uniqueness default is a deliberate reliability upgrade — 9×\n * fewer silent wrong-match bugs at the cost of slightly more verbose finds.\n */\nfunction applyEdits(\n content: string,\n edits: TextEdit[],\n replaceAll: boolean,\n): { content: string; results: EditResult[]; applied: number } {\n let out = content;\n const results: EditResult[] = [];\n let applied = 0;\n\n for (let i = 0; i < edits.length; i++) {\n const edit = edits[i];\n const occurrences = countOccurrences(out, edit.find);\n\n if (occurrences === 0) {\n results.push({\n index: i,\n status: \"not-found\",\n detail: `NOT FOUND: \"${preview(edit.find)}\"`,\n occurrences: 0,\n });\n continue;\n }\n\n if (replaceAll) {\n // Literal replaceAll via split/join — no regex, no special chars.\n out = out.split(edit.find).join(edit.replace);\n applied++;\n results.push({\n index: i,\n status: edit.replace === \"\" ? \"deleted\" : \"replaced\",\n detail: `${edit.replace === \"\" ? \"deleted\" : \"replaced\"} ${occurrences}×: \"${preview(edit.find)}\"`,\n occurrences,\n });\n } else if (occurrences > 1) {\n results.push({\n index: i,\n status: \"not-found\",\n detail: buildAmbiguousMessage(edit.find, out, occurrences),\n occurrences,\n });\n } else {\n const idx = out.indexOf(edit.find);\n out =\n out.slice(0, idx) + edit.replace + out.slice(idx + edit.find.length);\n applied++;\n results.push({\n index: i,\n status: edit.replace === \"\" ? \"deleted\" : \"replaced\",\n detail: `${edit.replace === \"\" ? \"deleted\" : \"replaced\"}: \"${preview(edit.find)}\"`,\n occurrences: 1,\n });\n }\n }\n\n return { content: out, results, applied };\n}\n\nfunction printResult(out: PatchOutput, format?: string): void {\n if (format === \"json\") {\n console.log(JSON.stringify(out, null, 2));\n return;\n }\n console.log(`db-patch: ${out.table}.${out.column}`);\n console.log(` Applied: ${out.applied}/${out.total}`);\n console.log(` Bytes: ${out.bytesBefore} → ${out.bytesAfter}`);\n for (const r of out.results) {\n console.log(` - ${r.detail}`);\n }\n}\n\ninterface RunOpts {\n url: string;\n table: string;\n column: string;\n where: string;\n edits: TextEdit[];\n jsonOps?: JsonOp[];\n replaceAll: boolean;\n format?: string;\n}\n\nfunction applyEither(\n original: string,\n opts: RunOpts,\n): {\n content: string;\n results: EditResult[];\n applied: number;\n total: number;\n} {\n if (opts.jsonOps && opts.jsonOps.length > 0) {\n let root: unknown;\n try {\n root = JSON.parse(original);\n } catch (e: any) {\n fail(\n `--json-ops requires the column value to be valid JSON. Parse failed: ${e.message}`,\n );\n }\n const results: EditResult[] = [];\n let applied = 0;\n for (let i = 0; i < opts.jsonOps.length; i++) {\n const op = opts.jsonOps[i];\n try {\n const detail = applyJsonOp(root, op);\n results.push({\n index: i,\n status: \"replaced\",\n detail,\n occurrences: 1,\n });\n applied++;\n } catch (e: any) {\n results.push({\n index: i,\n status: \"not-found\",\n detail: `FAILED: ${e?.message ?? String(e)}`,\n occurrences: 0,\n });\n }\n }\n return {\n content: JSON.stringify(root),\n results,\n applied,\n total: opts.jsonOps.length,\n };\n }\n const out = applyEdits(original, opts.edits, opts.replaceAll);\n return { ...out, total: opts.edits.length };\n}\n\n// ─── Postgres path ──────────────────────────────────────────────────────────\n\nasync function runPostgres(opts: RunOpts): Promise<void> {\n const { default: pg } = await import(\"postgres\");\n const pgSql = pg(opts.url);\n try {\n let result:\n | {\n table: string;\n column: string;\n applied: number;\n total: number;\n bytesBefore: number;\n bytesAfter: number;\n results: EditResult[];\n }\n | undefined;\n\n await pgSql.begin(async (tx: any) => {\n // Same temp-view scoping db-exec uses — SELECT and UPDATE both go\n // through the scoped view. Keep setup and teardown transaction-local\n // so pooled Postgres backends never retain the temp views.\n const scoping = await buildScopingPostgres(tx);\n try {\n for (const stmt of scoping.setup) {\n await tx.unsafe(stmt);\n }\n\n const selectSql = `SELECT \"${opts.column}\" AS __val FROM \"${opts.table}\" WHERE ${opts.where}`;\n const selected: any[] = Array.from(await tx.unsafe(selectSql));\n\n if (selected.length === 0) {\n fail(\n `No rows matched: ${opts.table} WHERE ${opts.where}. ` +\n `(In production, data scoping filters results to the current user — the row may exist but be owned by someone else.)`,\n );\n }\n if (selected.length > 1) {\n fail(\n `WHERE matched ${selected.length} rows in ${opts.table}. db-patch expects exactly one row — narrow the WHERE clause (usually by primary key).`,\n );\n }\n\n const original = (selected[0].__val ?? \"\") as string;\n if (typeof original !== \"string\") {\n fail(\n `Column ${opts.table}.${opts.column} is not a text column (got ${typeof original}).`,\n );\n }\n\n const { content, results, applied, total } = applyEither(\n original,\n opts,\n );\n\n if (applied > 0) {\n await tx.unsafe(\n `UPDATE \"${opts.table}\" SET \"${opts.column}\" = $1 WHERE ${opts.where}`,\n [content],\n );\n }\n\n result = {\n table: opts.table,\n column: opts.column,\n applied,\n total,\n bytesBefore: original.length,\n bytesAfter: content.length,\n results,\n };\n } finally {\n for (const stmt of scoping.teardown) {\n await tx.unsafe(stmt).catch(() => {});\n }\n }\n });\n\n if (result) {\n printResult(result, opts.format);\n }\n } finally {\n await pgSql.end();\n }\n}\n\n// ─── SQLite / libSQL path ───────────────────────────────────────────────────\n\nasync function runSqlite(opts: RunOpts): Promise<void> {\n const client = await createSqliteScriptClient(opts.url);\n try {\n const scoping = await buildScopingSqlite(client);\n for (const stmt of scoping.setup) {\n await client.execute(stmt);\n }\n\n const selectSql = `SELECT \"${opts.column}\" AS __val FROM \"${opts.table}\" WHERE ${opts.where}`;\n const selectRes = await client.execute(selectSql);\n\n if (selectRes.rows.length === 0) {\n fail(\n `No rows matched: ${opts.table} WHERE ${opts.where}. ` +\n `(In production, data scoping filters results to the current user — the row may exist but be owned by someone else.)`,\n );\n }\n if (selectRes.rows.length > 1) {\n fail(\n `WHERE matched ${selectRes.rows.length} rows in ${opts.table}. db-patch expects exactly one row — narrow the WHERE clause (usually by primary key).`,\n );\n }\n\n const row = selectRes.rows[0] as any;\n const original = (row.__val ?? row[0] ?? \"\") as string;\n if (typeof original !== \"string\") {\n fail(\n `Column ${opts.table}.${opts.column} is not a text column (got ${typeof original}).`,\n );\n }\n\n const { content, results, applied, total } = applyEither(original, opts);\n\n if (applied > 0) {\n await client.execute({\n sql: `UPDATE \"${opts.table}\" SET \"${opts.column}\" = ? WHERE ${opts.where}`,\n args: [content],\n });\n }\n\n printResult(\n {\n table: opts.table,\n column: opts.column,\n applied,\n total,\n bytesBefore: original.length,\n bytesAfter: content.length,\n results,\n },\n opts.format,\n );\n\n for (const stmt of scoping.teardown) {\n await client.execute(stmt).catch(() => {});\n }\n } finally {\n client.close();\n }\n}\n\n// ─── Entry point ────────────────────────────────────────────────────────────\n\nexport default async function dbPatch(args: string[]): Promise<void> {\n const parsed = parseArgs(args);\n\n if (parsed.help === \"true\") {\n console.log(`Usage: pnpm action db-patch --table <t> --column <c> --where \"<clause>\" [edit flags]\n\nSurgical search-and-replace on a text column. Avoids re-sending the full\ncolumn value — ideal for large strings (documents, slides, dashboards, JSON).\n\nRequired:\n --table <name> Target table (identifier; no quoting)\n --column <name> Target text column (identifier; no quoting)\n --where \"<clause>\" SQL WHERE clause that matches exactly one row\n\nEdit mode (pick one):\n --find <text> Text to find (single edit; default replace = \"\")\n --replace <text> Replacement text (used with --find)\n --edits <json> Batch: JSON array of {find, replace} objects\n --json-ops <json> Structural JSON edits on a JSON column — array of ops:\n { op: \"set\", path, value } → set/replace at path\n { op: \"remove\", path } → delete at path\n { op: \"insert\", path, value } → insert into array\n { op: \"move\", from, path } → move node\n { op: \"move-before\", from, path } → move, stable indexing\n Paths use JSON Pointer (\"/panels/3/title\").\n Much safer than string patches for JSON columns\n (dashboards, forms, slide decks).\n\nOptions:\n --all Replace every occurrence of each 'find' (default: first only)\n --format json Output as JSON\n --help Show this help\n\nExamples:\n # Fix a typo in one document\n pnpm action db-patch --table documents --column content \\\\\n --where \"id='abc'\" --find \"teh\" --replace \"the\"\n\n # Batch edits on a deck's JSON blob\n pnpm action db-patch --table decks --column data --where \"id='d1'\" \\\\\n --edits '[{\"find\":\"\\\\\"Q3\\\\\"\",\"replace\":\"\\\\\"Q4\\\\\"\"},{\"find\":\"$1M\",\"replace\":\"$1.2M\"}]'\n\nWhen to use db-patch vs other tools:\n Large text field, small edit → db-patch (this)\n Short field or multi-column set → db-exec UPDATE\n Domain action exists (edit-document, ...) → use that action (syncs live\n to open collaborative editors)\n`);\n return;\n }\n\n const table = parsed.table;\n const column = parsed.column;\n const where = parsed.where;\n\n if (!table) fail(\"--table is required\");\n if (!column) fail(\"--column is required\");\n if (!where) fail(\"--where is required\");\n if (!isValidIdentifier(table))\n fail(\n `Invalid --table: \"${table}\". Must be a plain identifier (letters, digits, underscore).`,\n );\n if (!isValidIdentifier(column))\n fail(\n `Invalid --column: \"${column}\". Must be a plain identifier (letters, digits, underscore).`,\n );\n assertNoSensitiveFrameworkTables(table, \"patch\");\n assertNoRawDbAccessControlPatchTarget(table, column);\n assertNoSensitiveFrameworkTables(where, \"read\");\n validateWhere(where);\n\n const jsonOps = parseJsonOps(parsed);\n // Edit parsing only runs when json-ops isn't provided — otherwise the\n // find/replace args are irrelevant and would error if missing.\n const edits = jsonOps ? [] : parseEdits(parsed);\n const replaceAll = parsed.all === \"true\";\n\n // Resolve database URL: --db flag → DATABASE_URL env → default file path\n let url: string;\n if (parsed.db) {\n url = \"file:\" + path.resolve(parsed.db);\n } else if (getDatabaseUrl()) {\n url = getDatabaseUrl();\n } else {\n url = \"file:\" + path.resolve(process.cwd(), \"data\", \"app.db\");\n }\n\n if (isPostgresUrl(url)) {\n await runPostgres({\n url,\n table,\n column,\n where,\n edits,\n jsonOps: jsonOps ?? undefined,\n replaceAll,\n format: parsed.format,\n });\n } else {\n await runSqlite({\n url,\n table,\n column,\n where,\n edits,\n jsonOps: jsonOps ?? undefined,\n replaceAll,\n format: parsed.format,\n });\n }\n}\n"]}
1
+ {"version":3,"file":"patch.js","sourceRoot":"","sources":["../../../src/scripts/db/patch.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Core script: db-patch\n *\n * Surgical search-and-replace on a text column in any SQL table. Instead of\n * re-sending the full column value (as `db-exec UPDATE` would require), the\n * agent sends one or more `{find, replace}` pairs. The script reads the row,\n * applies the edits in memory, and writes the result back in a single UPDATE.\n *\n * ## When to use which tool\n *\n * Large text field, small slice to change → db-patch (this)\n * e.g. fix one paragraph in a 50KB document, tweak one key in a dashboard\n * JSON blob, rename a label in a slide HTML string.\n *\n * Short field, set outright → db-exec UPDATE\n * e.g. `UPDATE forms SET status = 'published' WHERE id = '...'`.\n *\n * Multiple columns / computed values → db-exec UPDATE\n * e.g. `UPDATE meals SET calories = calories + 50, ...`.\n *\n * Domain-specific action exists → use that action\n * e.g. `edit-document` or `update-slide` — they also push live Yjs\n * updates to any open collaborative editor. db-patch is the generic\n * fallback for tables without a bespoke action.\n *\n * ## Why it's faster\n *\n * The agent only has to transmit the diff (the `find` + `replace`\n * strings), not the full new value. For large text fields — multi-kilobyte\n * markdown documents, slide HTML, dashboard/form JSON — this dramatically\n * reduces tokens per edit and keeps concurrent edits composable.\n *\n * ## Security\n *\n * In production mode, the same per-user / per-org temp view scoping that\n * `db-exec` uses applies here: the SELECT and UPDATE both go through the\n * scoped view, so you can never read or write rows outside the current\n * user's data. The WHERE clause is validated against a keyword denylist\n * (no ;, no chained statements, no DDL).\n *\n * ## Usage\n *\n * pnpm action db-patch --table <t> --column <c> --where \"<clause>\" \\\n * --find \"old\" --replace \"new\"\n *\n * pnpm action db-patch --table decks --column data --where \"id='d1'\" \\\n * --edits '[{\"find\":\"Q3\",\"replace\":\"Q4\"},{\"find\":\"$1M\",\"replace\":\"$1.2M\"}]'\n */\n\nimport path from \"path\";\nimport { getDatabaseUrl } from \"../../db/client.js\";\nimport { parseArgs, fail } from \"../utils.js\";\nimport {\n assertNoRawDbAccessControlPatchTarget,\n assertNoSensitiveFrameworkTables,\n} from \"./safety.js\";\nimport { buildScopingPostgres, buildScopingSqlite } from \"./scoping.js\";\nimport { createSqliteScriptClient } from \"./sqlite-client.js\";\n\ninterface TextEdit {\n find: string;\n replace: string;\n}\n\n/**\n * JSON patch operation — a subset of RFC 6902 plus a convenience `move-before`\n * that's rare in the spec but common for list reordering. The agent ends up\n * needing this all the time (reordering dashboard panels, form fields, slide\n * layers) and without it has to do multi-step string surgery.\n */\ninterface JsonOp {\n op: \"set\" | \"replace\" | \"remove\" | \"move\" | \"move-before\" | \"insert\";\n /** JSON Pointer-style path, e.g. \"/panels/3/title\". \"\" = root. */\n path?: string;\n /** For move / move-before: source path. */\n from?: string;\n /** For set / replace / insert: value to write. */\n value?: unknown;\n}\n\ninterface EditResult {\n index: number;\n status: \"replaced\" | \"deleted\" | \"not-found\";\n detail: string;\n occurrences: number;\n}\n\ninterface PatchOutput {\n table: string;\n column: string;\n applied: number;\n total: number;\n bytesBefore: number;\n bytesAfter: number;\n results: EditResult[];\n}\n\nfunction isPostgresUrl(url: string): boolean {\n return url.startsWith(\"postgres://\") || url.startsWith(\"postgresql://\");\n}\n\n/** Only unquoted [A-Za-z_][A-Za-z0-9_]* identifiers are allowed — no spaces,\n * no quoting, no dotted names. This is deliberately strict: it stops the\n * agent from sneaking SQL into the table/column slots. */\nfunction isValidIdentifier(s: string): boolean {\n return /^[A-Za-z_][A-Za-z0-9_]*$/.test(s);\n}\n\n/** Reject WHERE clauses that could chain statements or hide DDL. This isn't\n * a full SQL parser — just a keyword/character denylist to keep the surface\n * area equivalent to what db-exec already allows. */\nfunction validateWhere(where: string): void {\n if (where.includes(\";\")) {\n fail(\"--where must not contain ';' (no statement chaining)\");\n }\n // Strip inline strings before keyword scanning so \"WHERE name = 'DROP TABLE'\"\n // doesn't trip the denylist.\n const stripped = where\n .replace(/'(?:''|[^'])*'/g, \"''\")\n .replace(/\"(?:\"\"|[^\"])*\"/g, '\"\"')\n .toUpperCase();\n\n const blocked = [\n \" INSERT \",\n \" UPDATE \",\n \" DELETE \",\n \" DROP \",\n \" ALTER \",\n \" CREATE \",\n \" ATTACH \",\n \" DETACH \",\n \" PRAGMA \",\n \" VACUUM \",\n \"--\",\n \"/*\",\n ];\n const padded = \" \" + stripped + \" \";\n for (const kw of blocked) {\n if (padded.includes(kw)) {\n fail(`--where must not contain \"${kw.trim()}\"`);\n }\n }\n}\n\nfunction parseEdits(parsed: Record<string, string>): TextEdit[] {\n let edits: TextEdit[];\n\n if (parsed.edits) {\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(parsed.edits);\n } catch (e: any) {\n fail(`Invalid --edits JSON: ${e.message}`);\n }\n if (!Array.isArray(parsedJson) || parsedJson.length === 0) {\n fail(\"--edits must be a non-empty JSON array of {find, replace} objects\");\n }\n edits = parsedJson as TextEdit[];\n } else if (parsed.find !== undefined) {\n if (parsed.find === \"\") fail(\"--find cannot be empty\");\n edits = [{ find: parsed.find, replace: parsed.replace ?? \"\" }];\n } else {\n fail(\"Either --find/--replace or --edits is required\");\n }\n\n for (const edit of edits!) {\n if (typeof edit.find !== \"string\" || edit.find === \"\") {\n fail(\"Each edit must have a non-empty 'find' string\");\n }\n if (edit.replace === undefined || edit.replace === null) {\n edit.replace = \"\";\n }\n if (typeof edit.replace !== \"string\") {\n fail(\"Each edit's 'replace' field must be a string\");\n }\n }\n\n return edits!;\n}\n\nfunction preview(s: string): string {\n const max = 60;\n const trimmed = s.replace(/\\s+/g, \" \");\n return trimmed.length > max ? trimmed.slice(0, max) + \"...\" : trimmed;\n}\n\n// ─── JSON patch helpers ─────────────────────────────────────────────────────\n\n/** Parse a JSON Pointer (\"/panels/3/title\") into path segments. \"\" = root. */\nfunction parsePointer(pointer: string): string[] {\n if (pointer === \"\" || pointer === \"/\") return [];\n if (!pointer.startsWith(\"/\")) {\n fail(`JSON path must start with '/' (got: ${pointer})`);\n }\n return pointer\n .slice(1)\n .split(\"/\")\n .map((s) => s.replace(/~1/g, \"/\").replace(/~0/g, \"~\"));\n}\n\n/** Walk to the parent container of the given path. Returns [parent, lastKey]. */\nfunction resolveParent(\n root: unknown,\n segments: string[],\n): [any, string | number] {\n if (segments.length === 0) {\n fail(\"Root path is not supported for this operation\");\n }\n let node: any = root;\n for (let i = 0; i < segments.length - 1; i++) {\n const seg = segments[i];\n if (Array.isArray(node)) {\n const idx = parseInt(seg, 10);\n if (isNaN(idx) || idx < 0 || idx >= node.length) {\n fail(\n `Path segment \"${seg}\" is out of bounds for array of length ${node.length}`,\n );\n }\n node = node[idx];\n } else if (node && typeof node === \"object\") {\n if (!(seg in node)) {\n fail(`Path segment \"${seg}\" not found in object`);\n }\n node = node[seg];\n } else {\n fail(`Cannot descend into ${typeof node} at segment \"${seg}\"`);\n }\n }\n const last = segments[segments.length - 1];\n if (Array.isArray(node)) {\n const idx = last === \"-\" ? node.length : parseInt(last, 10);\n if (isNaN(idx)) fail(`Expected numeric index, got \"${last}\"`);\n return [node, idx];\n }\n return [node, last];\n}\n\n/** Apply one JSON op, mutating `root` in place. Returns a short detail string. */\nfunction applyJsonOp(root: any, op: JsonOp): string {\n switch (op.op) {\n case \"set\":\n case \"replace\": {\n if (op.path === undefined) fail(`${op.op} requires 'path'`);\n const [parent, key] = resolveParent(root, parsePointer(op.path));\n parent[key as any] = op.value;\n return `${op.op} ${op.path}`;\n }\n case \"remove\": {\n if (op.path === undefined) fail(\"remove requires 'path'\");\n const [parent, key] = resolveParent(root, parsePointer(op.path));\n if (Array.isArray(parent)) {\n parent.splice(key as number, 1);\n } else {\n delete parent[key as string];\n }\n return `remove ${op.path}`;\n }\n case \"insert\": {\n if (op.path === undefined) fail(\"insert requires 'path'\");\n const [parent, key] = resolveParent(root, parsePointer(op.path));\n if (!Array.isArray(parent)) fail(`insert target must be an array`);\n parent.splice(key as number, 0, op.value);\n return `insert at ${op.path}`;\n }\n case \"move\":\n case \"move-before\": {\n if (!op.from || op.path === undefined) {\n fail(`${op.op} requires 'from' and 'path'`);\n }\n const fromSeg = parsePointer(op.from);\n const toSeg = parsePointer(op.path);\n const [fromParent, fromKey] = resolveParent(root, fromSeg);\n // Extract the value\n let value: unknown;\n if (Array.isArray(fromParent)) {\n value = fromParent[fromKey as number];\n fromParent.splice(fromKey as number, 1);\n } else {\n value = fromParent[fromKey as string];\n delete fromParent[fromKey as string];\n }\n // For array moves where the destination is in the same array and\n // after the removed index, shift the target index down by one so\n // \"move /panels/7 to /panels/3\" lands exactly at index 3 even after\n // the earlier splice shifted indices.\n let [toParent, toKey] = resolveParent(root, toSeg);\n if (\n Array.isArray(toParent) &&\n Array.isArray(fromParent) &&\n toParent === fromParent\n ) {\n const fromIdx = fromKey as number;\n const toIdx = toKey as number;\n if (toIdx > fromIdx) {\n toKey = toIdx - 1;\n }\n }\n if (Array.isArray(toParent)) {\n toParent.splice(toKey as number, 0, value);\n } else {\n toParent[toKey as string] = value;\n }\n return `${op.op} ${op.from} → ${op.path}`;\n }\n default:\n fail(`Unknown JSON op: ${(op as any).op}`);\n }\n return \"\";\n}\n\nfunction parseJsonOps(parsed: Record<string, string>): JsonOp[] | null {\n if (!parsed.jsonOps && !parsed[\"json-ops\"]) return null;\n const raw = parsed.jsonOps ?? parsed[\"json-ops\"];\n let parsedJson: unknown;\n try {\n parsedJson = JSON.parse(raw);\n } catch (e: any) {\n fail(`Invalid --json-ops JSON: ${e.message}`);\n }\n if (!Array.isArray(parsedJson) || parsedJson.length === 0) {\n fail(\"--json-ops must be a non-empty JSON array\");\n }\n for (const op of parsedJson as any[]) {\n if (!op || typeof op !== \"object\" || typeof op.op !== \"string\") {\n fail(\"Each op must be an object with an 'op' field\");\n }\n }\n return parsedJson as JsonOp[];\n}\n\nfunction countOccurrences(haystack: string, needle: string): number {\n if (!needle) return 0;\n let count = 0;\n let idx = 0;\n while ((idx = haystack.indexOf(needle, idx)) !== -1) {\n count++;\n idx += needle.length;\n }\n return count;\n}\n\n/** Find all match positions (up to a cap so we don't explode memory). */\nfunction findAll(haystack: string, needle: string, cap = 10): number[] {\n const out: number[] = [];\n if (!needle) return out;\n let idx = 0;\n while ((idx = haystack.indexOf(needle, idx)) !== -1 && out.length < cap) {\n out.push(idx);\n idx += needle.length;\n }\n return out;\n}\n\n/** Format a single match with ~40 chars of surrounding context so the agent\n * can widen its `find` string to disambiguate ambiguous matches. */\nfunction formatContext(\n content: string,\n matchIdx: number,\n matchLen: number,\n radius = 40,\n): string {\n const start = Math.max(0, matchIdx - radius);\n const end = Math.min(content.length, matchIdx + matchLen + radius);\n const before = content.slice(start, matchIdx).replace(/\\s+/g, \" \");\n const middle = content\n .slice(matchIdx, matchIdx + matchLen)\n .replace(/\\s+/g, \" \");\n const after = content.slice(matchIdx + matchLen, end).replace(/\\s+/g, \" \");\n const prefix = start > 0 ? \"…\" : \"\";\n const suffix = end < content.length ? \"…\" : \"\";\n return `${prefix}${before}⟨${middle}⟩${after}${suffix}`;\n}\n\n/** Build a \"string not unique\" error message showing each match in\n * context — matches Claude Code's Edit-tool UX so the agent can\n * widen the find string and retry. */\nfunction buildAmbiguousMessage(\n findStr: string,\n content: string,\n count: number,\n): string {\n const positions = findAll(content, findStr, 6);\n const lines = [\n `Found ${count} occurrences of the 'find' string — db-patch requires exactly one match by default.`,\n `Widen 'find' with unique surrounding context, or pass --all to replace every occurrence.`,\n `'find' preview: \"${preview(findStr)}\"`,\n \"Matches:\",\n ];\n for (let i = 0; i < positions.length; i++) {\n lines.push(\n ` [${i + 1}] ${formatContext(content, positions[i], findStr.length)}`,\n );\n }\n if (count > positions.length) {\n lines.push(` … and ${count - positions.length} more`);\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Apply edits sequentially.\n *\n * Default behavior matches Claude Code's Edit tool: the `find` string must\n * match exactly one occurrence. If 0 → \"not found\". If >1 → error with\n * surrounding context for each match so the agent can widen `find` and\n * retry. Pass `replaceAll` (`--all`) to allow replacing every occurrence.\n *\n * This strict-uniqueness default is a deliberate reliability upgrade — 9×\n * fewer silent wrong-match bugs at the cost of slightly more verbose finds.\n */\nfunction applyEdits(\n content: string,\n edits: TextEdit[],\n replaceAll: boolean,\n): { content: string; results: EditResult[]; applied: number } {\n let out = content;\n const results: EditResult[] = [];\n let applied = 0;\n\n for (let i = 0; i < edits.length; i++) {\n const edit = edits[i];\n const occurrences = countOccurrences(out, edit.find);\n\n if (occurrences === 0) {\n results.push({\n index: i,\n status: \"not-found\",\n detail: `NOT FOUND: \"${preview(edit.find)}\"`,\n occurrences: 0,\n });\n continue;\n }\n\n if (replaceAll) {\n // Literal replaceAll via split/join — no regex, no special chars.\n out = out.split(edit.find).join(edit.replace);\n applied++;\n results.push({\n index: i,\n status: edit.replace === \"\" ? \"deleted\" : \"replaced\",\n detail: `${edit.replace === \"\" ? \"deleted\" : \"replaced\"} ${occurrences}×: \"${preview(edit.find)}\"`,\n occurrences,\n });\n } else if (occurrences > 1) {\n results.push({\n index: i,\n status: \"not-found\",\n detail: buildAmbiguousMessage(edit.find, out, occurrences),\n occurrences,\n });\n } else {\n const idx = out.indexOf(edit.find);\n out =\n out.slice(0, idx) + edit.replace + out.slice(idx + edit.find.length);\n applied++;\n results.push({\n index: i,\n status: edit.replace === \"\" ? \"deleted\" : \"replaced\",\n detail: `${edit.replace === \"\" ? \"deleted\" : \"replaced\"}: \"${preview(edit.find)}\"`,\n occurrences: 1,\n });\n }\n }\n\n return { content: out, results, applied };\n}\n\nfunction printResult(out: PatchOutput, format?: string): void {\n if (format === \"json\") {\n console.log(JSON.stringify(out, null, 2));\n return;\n }\n console.log(`db-patch: ${out.table}.${out.column}`);\n console.log(` Applied: ${out.applied}/${out.total}`);\n console.log(` Bytes: ${out.bytesBefore} → ${out.bytesAfter}`);\n for (const r of out.results) {\n console.log(` - ${r.detail}`);\n }\n}\n\ninterface RunOpts {\n url: string;\n table: string;\n column: string;\n where: string;\n edits: TextEdit[];\n jsonOps?: JsonOp[];\n replaceAll: boolean;\n format?: string;\n}\n\nfunction applyEither(\n original: string,\n opts: RunOpts,\n): {\n content: string;\n results: EditResult[];\n applied: number;\n total: number;\n} {\n if (opts.jsonOps && opts.jsonOps.length > 0) {\n let root: unknown;\n try {\n root = JSON.parse(original);\n } catch (e: any) {\n fail(\n `--json-ops requires the column value to be valid JSON. Parse failed: ${e.message}`,\n );\n }\n const results: EditResult[] = [];\n let applied = 0;\n for (let i = 0; i < opts.jsonOps.length; i++) {\n const op = opts.jsonOps[i];\n try {\n const detail = applyJsonOp(root, op);\n results.push({\n index: i,\n status: \"replaced\",\n detail,\n occurrences: 1,\n });\n applied++;\n } catch (e: any) {\n results.push({\n index: i,\n status: \"not-found\",\n detail: `FAILED: ${e?.message ?? String(e)}`,\n occurrences: 0,\n });\n }\n }\n return {\n content: JSON.stringify(root),\n results,\n applied,\n total: opts.jsonOps.length,\n };\n }\n const out = applyEdits(original, opts.edits, opts.replaceAll);\n return { ...out, total: opts.edits.length };\n}\n\n// ─── Postgres path ──────────────────────────────────────────────────────────\n\nasync function runPostgres(opts: RunOpts): Promise<void> {\n const { default: pg } = await import(\"postgres\");\n const pgSql = pg(opts.url);\n try {\n let result:\n | {\n table: string;\n column: string;\n applied: number;\n total: number;\n bytesBefore: number;\n bytesAfter: number;\n results: EditResult[];\n }\n | undefined;\n\n await pgSql.begin(async (tx: any) => {\n // Same temp-view scoping db-exec uses — SELECT and UPDATE both go\n // through the scoped view. Keep setup and teardown transaction-local\n // so pooled Postgres backends never retain the temp views.\n const scoping = await buildScopingPostgres(tx);\n try {\n for (const stmt of scoping.setup) {\n await tx.unsafe(stmt);\n }\n\n const selectSql = `SELECT \"${opts.column}\" AS __val FROM \"${opts.table}\" WHERE ${opts.where}`;\n const selected: any[] = Array.from(await tx.unsafe(selectSql));\n\n if (selected.length === 0) {\n fail(\n `No rows matched: ${opts.table} WHERE ${opts.where}. ` +\n `(In production, data scoping filters results to the current user — the row may exist but be owned by someone else.)`,\n );\n }\n if (selected.length > 1) {\n fail(\n `WHERE matched ${selected.length} rows in ${opts.table}. db-patch expects exactly one row — narrow the WHERE clause (usually by primary key).`,\n );\n }\n\n const original = (selected[0].__val ?? \"\") as string;\n if (typeof original !== \"string\") {\n fail(\n `Column ${opts.table}.${opts.column} is not a text column (got ${typeof original}).`,\n );\n }\n\n const { content, results, applied, total } = applyEither(\n original,\n opts,\n );\n\n if (applied > 0) {\n await tx.unsafe(\n `UPDATE \"${opts.table}\" SET \"${opts.column}\" = $1 WHERE ${opts.where}`,\n [content],\n );\n }\n\n result = {\n table: opts.table,\n column: opts.column,\n applied,\n total,\n bytesBefore: original.length,\n bytesAfter: content.length,\n results,\n };\n } finally {\n for (const stmt of scoping.teardown) {\n await tx.unsafe(stmt).catch(() => {});\n }\n }\n });\n\n if (result) {\n printResult(result, opts.format);\n }\n } finally {\n await pgSql.end();\n }\n}\n\n// ─── SQLite / libSQL path ───────────────────────────────────────────────────\n\nasync function runSqlite(opts: RunOpts): Promise<void> {\n const client = await createSqliteScriptClient(opts.url);\n try {\n const scoping = await buildScopingSqlite(client);\n for (const stmt of scoping.setup) {\n await client.execute(stmt);\n }\n\n const selectSql = `SELECT \"${opts.column}\" AS __val FROM \"${opts.table}\" WHERE ${opts.where}`;\n const selectRes = await client.execute(selectSql);\n\n if (selectRes.rows.length === 0) {\n fail(\n `No rows matched: ${opts.table} WHERE ${opts.where}. ` +\n `(In production, data scoping filters results to the current user — the row may exist but be owned by someone else.)`,\n );\n }\n if (selectRes.rows.length > 1) {\n fail(\n `WHERE matched ${selectRes.rows.length} rows in ${opts.table}. db-patch expects exactly one row — narrow the WHERE clause (usually by primary key).`,\n );\n }\n\n const row = selectRes.rows[0] as any;\n const original = (row.__val ?? row[0] ?? \"\") as string;\n if (typeof original !== \"string\") {\n fail(\n `Column ${opts.table}.${opts.column} is not a text column (got ${typeof original}).`,\n );\n }\n\n const { content, results, applied, total } = applyEither(original, opts);\n\n if (applied > 0) {\n // SQLite views are not updatable, so the scoped temp view we read through\n // above cannot be the write target — the UPDATE must hit the real table\n // in the `main` schema. Re-apply the exact predicate the scoping view\n // uses (db-exec performs the identical rewrite) so the write can never\n // reach a row the scoped SELECT couldn't see. Falls back to the bare name\n // only when scoping is inactive (e.g. a database with no tables).\n const predicate = scoping.active\n ? scoping.tablePredicates.get(opts.table)\n : undefined;\n const target = predicate\n ? `main.\"${opts.table.replace(/\"/g, '\"\"')}\"`\n : `\"${opts.table}\"`;\n const whereClause = predicate\n ? `${predicate} AND (${opts.where})`\n : opts.where;\n await client.execute({\n sql: `UPDATE ${target} SET \"${opts.column}\" = ? WHERE ${whereClause}`,\n args: [content],\n });\n }\n\n printResult(\n {\n table: opts.table,\n column: opts.column,\n applied,\n total,\n bytesBefore: original.length,\n bytesAfter: content.length,\n results,\n },\n opts.format,\n );\n\n for (const stmt of scoping.teardown) {\n await client.execute(stmt).catch(() => {});\n }\n } finally {\n client.close();\n }\n}\n\n// ─── Entry point ────────────────────────────────────────────────────────────\n\nexport default async function dbPatch(args: string[]): Promise<void> {\n const parsed = parseArgs(args);\n\n if (parsed.help === \"true\") {\n console.log(`Usage: pnpm action db-patch --table <t> --column <c> --where \"<clause>\" [edit flags]\n\nSurgical search-and-replace on a text column. Avoids re-sending the full\ncolumn value — ideal for large strings (documents, slides, dashboards, JSON).\n\nRequired:\n --table <name> Target table (identifier; no quoting)\n --column <name> Target text column (identifier; no quoting)\n --where \"<clause>\" SQL WHERE clause that matches exactly one row\n\nEdit mode (pick one):\n --find <text> Text to find (single edit; default replace = \"\")\n --replace <text> Replacement text (used with --find)\n --edits <json> Batch: JSON array of {find, replace} objects\n --json-ops <json> Structural JSON edits on a JSON column — array of ops:\n { op: \"set\", path, value } → set/replace at path\n { op: \"remove\", path } → delete at path\n { op: \"insert\", path, value } → insert into array\n { op: \"move\", from, path } → move node\n { op: \"move-before\", from, path } → move, stable indexing\n Paths use JSON Pointer (\"/panels/3/title\").\n Much safer than string patches for JSON columns\n (dashboards, forms, slide decks).\n\nOptions:\n --all Replace every occurrence of each 'find' (default: first only)\n --format json Output as JSON\n --help Show this help\n\nExamples:\n # Fix a typo in one document\n pnpm action db-patch --table documents --column content \\\\\n --where \"id='abc'\" --find \"teh\" --replace \"the\"\n\n # Batch edits on a deck's JSON blob\n pnpm action db-patch --table decks --column data --where \"id='d1'\" \\\\\n --edits '[{\"find\":\"\\\\\"Q3\\\\\"\",\"replace\":\"\\\\\"Q4\\\\\"\"},{\"find\":\"$1M\",\"replace\":\"$1.2M\"}]'\n\nWhen to use db-patch vs other tools:\n Large text field, small edit → db-patch (this)\n Short field or multi-column set → db-exec UPDATE\n Domain action exists (edit-document, ...) → use that action (syncs live\n to open collaborative editors)\n`);\n return;\n }\n\n const table = parsed.table;\n const column = parsed.column;\n const where = parsed.where;\n\n if (!table) fail(\"--table is required\");\n if (!column) fail(\"--column is required\");\n if (!where) fail(\"--where is required\");\n if (!isValidIdentifier(table))\n fail(\n `Invalid --table: \"${table}\". Must be a plain identifier (letters, digits, underscore).`,\n );\n if (!isValidIdentifier(column))\n fail(\n `Invalid --column: \"${column}\". Must be a plain identifier (letters, digits, underscore).`,\n );\n assertNoSensitiveFrameworkTables(table, \"patch\");\n assertNoRawDbAccessControlPatchTarget(table, column);\n assertNoSensitiveFrameworkTables(where, \"read\");\n validateWhere(where);\n\n const jsonOps = parseJsonOps(parsed);\n // Edit parsing only runs when json-ops isn't provided — otherwise the\n // find/replace args are irrelevant and would error if missing.\n const edits = jsonOps ? [] : parseEdits(parsed);\n const replaceAll = parsed.all === \"true\";\n\n // Resolve database URL: --db flag → DATABASE_URL env → default file path\n let url: string;\n if (parsed.db) {\n url = \"file:\" + path.resolve(parsed.db);\n } else if (getDatabaseUrl()) {\n url = getDatabaseUrl();\n } else {\n url = \"file:\" + path.resolve(process.cwd(), \"data\", \"app.db\");\n }\n\n if (isPostgresUrl(url)) {\n await runPostgres({\n url,\n table,\n column,\n where,\n edits,\n jsonOps: jsonOps ?? undefined,\n replaceAll,\n format: parsed.format,\n });\n } else {\n await runSqlite({\n url,\n table,\n column,\n where,\n edits,\n jsonOps: jsonOps ?? undefined,\n replaceAll,\n format: parsed.format,\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"agent-chat-plugin.d.ts","sourceRoot":"","sources":["../../src/server/agent-chat-plugin.ts"],"names":[],"mappings":"AAcA,OAAO,EAQL,KAAK,WAAW,EACjB,MAAM,8BAA8B,CAAC;AAqBtC,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAElB,eAAe,EAEhB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,gBAAgB,EAcjB,MAAM,wBAAwB,CAAC;AAgEhC,OAAO,EAGL,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EAC1B,MAAM,6BAA6B,CAAC;AAiUrC,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GACnC,KAAK,CAAC;IACP,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC,aAAa,CAAC,CAAC;CACzC,CAAC,CASD;AAmBD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,cAAc,EAAE,EACjC,WAAW,EAAE,SAAS,oBAAoB,EAAE,EAC5C,OAAO,GAAE,0BAA0B,GAAG;IAAE,KAAK,CAAC,EAAE,GAAG,CAAA;CAAO,GACzD;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAO7C;AAy2CD,KAAK,cAAc,GAAG,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9D,MAAM,WAAW,sBAAsB;IACrC,+DAA+D;IAC/D,OAAO,CAAC,EACJ,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAC3B,CAAC,MACG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC9C,wCAAwC;IACxC,OAAO,CAAC,EACJ,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAC3B,CAAC,MACG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC9C,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qDAAqD;IACrD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;sDAGkD;IAClD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,MAAM,CAAC,EACH,OAAO,0BAA0B,EAAE,WAAW,GAC9C,MAAM,GACN;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IACtD,qDAAqD;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,gBAAgB,CAAC,EACb,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAC/B,CAAC,MACG,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAC/B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IAClD,kFAAkF;IAClF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,aAAa,CAAC,EAAE;QACd,mEAAmE;QACnE,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,uEAAuE;QACvE,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,gFAAgF;QAChF,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,gFAAgF;QAChF,KAAK,CAAC,EAAE,KAAK,CAAC;YACZ,GAAG,EAAE,MAAM,CAAC;YACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;YACjB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;SAC1B,CAAC,CAAC;KACJ,CAAC;IACF;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACtE;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxE;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;;;;;;;;;;;;OAcG;IACH,YAAY,CAAC,EAAE,CACb,KAAK,EAAE,GAAG,EACV,KAAK,EAAE,MAAM,KACV,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5C;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,8BAA8B,EAAE,2BAA2B,CAAC;IACxF;;;;OAIG;IACH,cAAc,CAAC,EAAE,CAAC,OAAO,EAAE;QACzB,KAAK,EAAE,GAAG,CAAC;QACX,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,EAAE,mBAAmB,EAAE,CAAC;QACnC,UAAU,EAAE,kBAAkB,EAAE,CAAC;QACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;KACtB,KACG,IAAI,GACJ;QACE,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACrC,GACD,OAAO,CAAC,IAAI,GAAG;QACb,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;KACrC,CAAC,CAAC;IACP;;;;;;;;;;;;;;OAcG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;;;;;;;;OAaG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;;;;;;;;;;;;;;;;OAkBG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE;QAC7B,OAAO,EAAE,OAAO,iBAAiB,EAAE,OAAO,CAAC;QAC3C,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,OAAO,iBAAiB,EAAE,iBAAiB,CAAC;QACrD,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;KAC/B,KACG,OAAO,iBAAiB,EAAE,OAAO,GACjC,MAAM,GACN,IAAI,GACJ,SAAS,GACT,OAAO,CAAC,OAAO,iBAAiB,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;CAC5E;AA4iBD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,OAAO,UAAQ,EACf,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CA8KjB;AA6ND,wBAAgB,sCAAsC,CAAC,KAAK,EAAE;IAC5D,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB,GAAG,OAAO,CA2BV;AAED,wBAAgB,qBAAqB,CACnC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,cAAc,CA65GhB;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,EAAE,cAAwC,CAAC;AAa9E,yEAAyE;AACzE,wBAAgB,mBAAmB,IAAI,gBAAgB,GAAG,IAAI,CAE7D"}
1
+ {"version":3,"file":"agent-chat-plugin.d.ts","sourceRoot":"","sources":["../../src/server/agent-chat-plugin.ts"],"names":[],"mappings":"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"}
@@ -3587,11 +3587,17 @@ export function createAgentChatPlugin(options) {
3587
3587
  ...toolActions,
3588
3588
  });
3589
3589
  const anonymousReadOnlyActions = attachToolSearch(filterReadOnlyActions(templateScripts));
3590
+ // Full-database admin tools. Gated on NODE_ENV=development to match the
3591
+ // DB-admin UI + HTTP routes (which gate on the environment, not the
3592
+ // Code-mode toggle), so the agent has the same DB-admin capability the UI
3593
+ // does whenever it is available — true agent/UI parity, in App or Code mode.
3594
+ const dbAdminScripts = process.env.NODE_ENV === "development" ? createDbAdminAgentTools() : {};
3590
3595
  const prodActions = attachToolSearch({
3591
3596
  ...templateScripts,
3592
3597
  ...resourceScripts,
3593
3598
  ...docsScripts,
3594
3599
  ...dbScripts,
3600
+ ...dbAdminScripts,
3595
3601
  ...refreshScreenTool,
3596
3602
  ...(lazyContext ? frameworkContextTool : {}),
3597
3603
  ...urlTools,
@@ -3815,9 +3821,9 @@ Non-code requests are still fine on this surface: read data, navigate the UI, su
3815
3821
  ...browserTools,
3816
3822
  ...mcpActionEntries,
3817
3823
  ...(await createDevScriptRegistry()),
3818
- // Dev-only full-database admin tools (gated to dev+localhost
3819
- // by the surrounding `canToggle` block never in prodActions).
3820
- ...createDbAdminAgentTools(),
3824
+ // Full-database admin tools (NODE_ENV=development gate — see
3825
+ // dbAdminScripts; also in prodActions so App mode has them too).
3826
+ ...dbAdminScripts,
3821
3827
  });
3822
3828
  // Keep dev action dict in sync with runtime MCP additions. When
3823
3829
  // native-actions mode is on (lean or `nativeActionsInDev`), devActions