iosm-cli 0.2.7 → 0.2.9

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 (149) hide show
  1. package/CHANGELOG.md +61 -1
  2. package/README.md +4 -4
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +12 -4
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/agent-profiles.d.ts.map +1 -1
  7. package/dist/core/agent-profiles.js +15 -2
  8. package/dist/core/agent-profiles.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +3 -0
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +214 -2
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/sdk.d.ts +2 -2
  14. package/dist/core/sdk.d.ts.map +1 -1
  15. package/dist/core/sdk.js +7 -4
  16. package/dist/core/sdk.js.map +1 -1
  17. package/dist/core/settings-manager.d.ts +57 -0
  18. package/dist/core/settings-manager.d.ts.map +1 -1
  19. package/dist/core/settings-manager.js +197 -0
  20. package/dist/core/settings-manager.js.map +1 -1
  21. package/dist/core/shadow-guard.d.ts.map +1 -1
  22. package/dist/core/shadow-guard.js +12 -1
  23. package/dist/core/shadow-guard.js.map +1 -1
  24. package/dist/core/system-prompt.d.ts.map +1 -1
  25. package/dist/core/system-prompt.js +109 -4
  26. package/dist/core/system-prompt.js.map +1 -1
  27. package/dist/core/tools/db-run.d.ts +84 -0
  28. package/dist/core/tools/db-run.d.ts.map +1 -0
  29. package/dist/core/tools/db-run.js +690 -0
  30. package/dist/core/tools/db-run.js.map +1 -0
  31. package/dist/core/tools/git-common.d.ts +45 -0
  32. package/dist/core/tools/git-common.d.ts.map +1 -0
  33. package/dist/core/tools/git-common.js +185 -0
  34. package/dist/core/tools/git-common.js.map +1 -0
  35. package/dist/core/tools/git-read.d.ts +15 -13
  36. package/dist/core/tools/git-read.d.ts.map +1 -1
  37. package/dist/core/tools/git-read.js +101 -153
  38. package/dist/core/tools/git-read.js.map +1 -1
  39. package/dist/core/tools/git-write.d.ts +75 -0
  40. package/dist/core/tools/git-write.d.ts.map +1 -0
  41. package/dist/core/tools/git-write.js +298 -0
  42. package/dist/core/tools/git-write.js.map +1 -0
  43. package/dist/core/tools/index.d.ts +91 -1
  44. package/dist/core/tools/index.d.ts.map +1 -1
  45. package/dist/core/tools/index.js +26 -0
  46. package/dist/core/tools/index.js.map +1 -1
  47. package/dist/core/tools/lint-run.d.ts +42 -0
  48. package/dist/core/tools/lint-run.d.ts.map +1 -0
  49. package/dist/core/tools/lint-run.js +276 -0
  50. package/dist/core/tools/lint-run.js.map +1 -0
  51. package/dist/core/tools/task.js +1 -1
  52. package/dist/core/tools/task.js.map +1 -1
  53. package/dist/core/tools/test-run.d.ts +36 -0
  54. package/dist/core/tools/test-run.d.ts.map +1 -0
  55. package/dist/core/tools/test-run.js +255 -0
  56. package/dist/core/tools/test-run.js.map +1 -0
  57. package/dist/core/tools/typecheck-run.d.ts +44 -0
  58. package/dist/core/tools/typecheck-run.d.ts.map +1 -0
  59. package/dist/core/tools/typecheck-run.js +343 -0
  60. package/dist/core/tools/typecheck-run.js.map +1 -0
  61. package/dist/core/tools/verification-runner.d.ts +53 -0
  62. package/dist/core/tools/verification-runner.d.ts.map +1 -0
  63. package/dist/core/tools/verification-runner.js +235 -0
  64. package/dist/core/tools/verification-runner.js.map +1 -0
  65. package/dist/core/tools/web-search.d.ts +72 -0
  66. package/dist/core/tools/web-search.d.ts.map +1 -0
  67. package/dist/core/tools/web-search.js +702 -0
  68. package/dist/core/tools/web-search.js.map +1 -0
  69. package/dist/index.d.ts +2 -2
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +1 -1
  72. package/dist/index.js.map +1 -1
  73. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  74. package/dist/modes/interactive/components/branch-summary-message.js +2 -1
  75. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  76. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  77. package/dist/modes/interactive/components/compaction-summary-message.js +2 -1
  78. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  79. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  80. package/dist/modes/interactive/components/config-selector.js +7 -2
  81. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  82. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  83. package/dist/modes/interactive/components/custom-message.js +2 -1
  84. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  85. package/dist/modes/interactive/components/mcp-selector.d.ts.map +1 -1
  86. package/dist/modes/interactive/components/mcp-selector.js +3 -1
  87. package/dist/modes/interactive/components/mcp-selector.js.map +1 -1
  88. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  89. package/dist/modes/interactive/components/model-selector.js +12 -2
  90. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  91. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  92. package/dist/modes/interactive/components/oauth-selector.js +11 -0
  93. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  94. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  95. package/dist/modes/interactive/components/scoped-models-selector.js +16 -5
  96. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  97. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  98. package/dist/modes/interactive/components/session-selector.js +4 -2
  99. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  100. package/dist/modes/interactive/components/settings-selector.d.ts +25 -0
  101. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  102. package/dist/modes/interactive/components/settings-selector.js +182 -2
  103. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  104. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  105. package/dist/modes/interactive/components/show-images-selector.js +7 -2
  106. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  107. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  108. package/dist/modes/interactive/components/skill-invocation-message.js +4 -2
  109. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  110. package/dist/modes/interactive/components/subagent-message.d.ts.map +1 -1
  111. package/dist/modes/interactive/components/subagent-message.js +3 -1
  112. package/dist/modes/interactive/components/subagent-message.js.map +1 -1
  113. package/dist/modes/interactive/components/task-plan-message.d.ts.map +1 -1
  114. package/dist/modes/interactive/components/task-plan-message.js +2 -1
  115. package/dist/modes/interactive/components/task-plan-message.js.map +1 -1
  116. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  117. package/dist/modes/interactive/components/theme-selector.js +7 -2
  118. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  119. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  120. package/dist/modes/interactive/components/thinking-selector.js +7 -2
  121. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  122. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  123. package/dist/modes/interactive/components/tool-execution.js +25 -7
  124. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  125. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  126. package/dist/modes/interactive/components/tree-selector.js +18 -3
  127. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  128. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  129. package/dist/modes/interactive/components/user-message-selector.js +8 -0
  130. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  131. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  132. package/dist/modes/interactive/components/user-message.js +2 -1
  133. package/dist/modes/interactive/components/user-message.js.map +1 -1
  134. package/dist/modes/interactive/interactive-mode.d.ts +8 -0
  135. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  136. package/dist/modes/interactive/interactive-mode.js +622 -11
  137. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  138. package/dist/modes/interactive/theme/dark.json +39 -38
  139. package/dist/modes/interactive/theme/light.json +29 -29
  140. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  141. package/dist/modes/interactive/theme/theme.js +16 -25
  142. package/dist/modes/interactive/theme/theme.js.map +1 -1
  143. package/dist/modes/interactive/theme/universal.json +85 -0
  144. package/docs/cli-reference.md +32 -2
  145. package/docs/configuration.md +86 -2
  146. package/docs/development-and-testing.md +1 -1
  147. package/docs/interactive-mode.md +8 -3
  148. package/docs/rpc-json-sdk.md +1 -1
  149. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-run.js","sourceRoot":"","sources":["../../../src/core/tools/db-run.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { AgentTool } from \"@mariozechner/pi-agent-core\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport { resolveToCwd } from \"./path-utils.js\";\nimport type { ToolPermissionGuard } from \"./permissions.js\";\nimport type { TruncationResult } from \"./truncate.js\";\nimport {\n\tcommandExists,\n\tdetectPackageManager,\n\tensureCommandOrThrow,\n\tformatVerificationOutput,\n\treadPackageJson,\n\tresolvePackageManagerRunInvocation,\n\trunVerificationCommand,\n\ttype RunVerificationCommandInput,\n\ttype VerificationCommandResult,\n} from \"./verification-runner.js\";\n\nconst dbRunSchema = Type.Object({\n\taction: Type.Optional(\n\t\tType.Union(\n\t\t\t[\n\t\t\t\tType.Literal(\"query\"),\n\t\t\t\tType.Literal(\"exec\"),\n\t\t\t\tType.Literal(\"schema\"),\n\t\t\t\tType.Literal(\"migrate\"),\n\t\t\t\tType.Literal(\"explain\"),\n\t\t\t],\n\t\t\t{ description: \"DB action: query | exec | schema | migrate | explain (default: query).\" },\n\t\t),\n\t),\n\tadapter: Type.Optional(\n\t\tType.Union(\n\t\t\t[\n\t\t\t\tType.Literal(\"auto\"),\n\t\t\t\tType.Literal(\"postgres\"),\n\t\t\t\tType.Literal(\"mysql\"),\n\t\t\t\tType.Literal(\"sqlite\"),\n\t\t\t\tType.Literal(\"mongodb\"),\n\t\t\t\tType.Literal(\"redis\"),\n\t\t\t],\n\t\t\t{ description: \"Database adapter: auto | postgres | mysql | sqlite | mongodb | redis\" },\n\t\t),\n\t),\n\tconnection: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Named dbTools connection profile. Defaults to dbTools.defaultConnection.\",\n\t\t}),\n\t),\n\tstatement: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Query/command statement for query/exec/explain (optional for schema with adapter defaults).\",\n\t\t}),\n\t),\n\tformat: Type.Optional(\n\t\tType.Union([Type.Literal(\"table\"), Type.Literal(\"json\"), Type.Literal(\"raw\")], {\n\t\t\tdescription: \"Output format hint: table | json | raw (default: table).\",\n\t\t}),\n\t),\n\tallow_write: Type.Optional(\n\t\tType.Boolean({\n\t\t\tdescription: \"Allow write actions (required for exec/migrate). Defaults to false.\",\n\t\t}),\n\t),\n\tmigrate_runner: Type.Optional(\n\t\tType.Union([Type.Literal(\"auto\"), Type.Literal(\"script\")], {\n\t\t\tdescription: \"Migrate mode: auto | script (default: auto).\",\n\t\t}),\n\t),\n\tscript: Type.Optional(\n\t\tType.String({\n\t\t\tdescription: \"Package script for migrate_runner=script/auto (default: db:migrate).\",\n\t\t}),\n\t),\n\targs: Type.Optional(\n\t\tType.Array(Type.String(), {\n\t\t\tdescription: \"Additional arguments forwarded to adapter CLI or migration script.\",\n\t\t}),\n\t),\n\tpath: Type.Optional(Type.String({ description: \"Working directory for db operations (default: current directory).\" })),\n\ttimeout: Type.Optional(Type.Number({ description: \"Timeout in seconds (default: 300).\" })),\n});\n\nexport type DbRunToolInput = Static<typeof dbRunSchema>;\nexport type DbRunAction = \"query\" | \"exec\" | \"schema\" | \"migrate\" | \"explain\";\nexport type DbRunAdapter = \"auto\" | \"postgres\" | \"mysql\" | \"sqlite\" | \"mongodb\" | \"redis\";\nexport type DbRunResolvedAdapter = Exclude<DbRunAdapter, \"auto\">;\nexport type DbRunFormat = \"table\" | \"json\" | \"raw\";\nexport type DbRunMigrateRunner = \"auto\" | \"script\";\nexport type DbRunStatus = \"passed\" | \"failed\" | \"error\";\n\nexport interface DbToolsMigrateConfig {\n\tscript?: string;\n\tcwd?: string;\n\targs?: string[];\n}\n\nexport interface DbToolsConnectionConfig {\n\tadapter?: DbRunResolvedAdapter;\n\tdsnEnv?: string;\n\tsqlitePath?: string;\n\tclientArgs?: string[];\n\tmigrate?: DbToolsMigrateConfig;\n}\n\nexport interface DbToolsRuntimeConfig {\n\tdefaultConnection?: string;\n\tconnections?: Record<string, DbToolsConnectionConfig>;\n}\n\nexport interface DbRunToolDetails {\n\taction: DbRunAction;\n\tadapter: DbRunResolvedAdapter;\n\tconnection: string;\n\tresolvedCommand: string;\n\tresolvedArgs: string[];\n\tcwd: string;\n\texitCode: number;\n\tstatus: DbRunStatus;\n\tdurationMs: number;\n\trowCount?: number;\n\taffectedCount?: number;\n\twriteRequested: boolean;\n\twriteAllowed: boolean;\n\tcaptureTruncated?: boolean;\n\ttruncation?: TruncationResult;\n}\n\ninterface ResolvedConnectionProfile {\n\tname: string;\n\tadapter: DbRunResolvedAdapter;\n\tdsnEnv?: string;\n\tsqlitePath?: string;\n\tclientArgs: string[];\n\tmigrate: {\n\t\tscript?: string;\n\t\tcwd?: string;\n\t\targs: string[];\n\t};\n}\n\ninterface ResolvedDbCommand {\n\tcommand: string;\n\targs: string[];\n\tenv?: NodeJS.ProcessEnv;\n\tstdin?: string;\n\tsecretValues: string[];\n}\n\ninterface DbRunOperations {\n\trunCommand: (input: RunVerificationCommandInput) => Promise<VerificationCommandResult>;\n\tcommandExists: (command: string) => boolean;\n}\n\nexport interface DbRunToolOptions {\n\tpermissionGuard?: ToolPermissionGuard;\n\tresolveRuntimeConfig?: () => Partial<DbToolsRuntimeConfig> | DbToolsRuntimeConfig;\n\toperations?: Partial<DbRunOperations>;\n}\n\nexport const DEFAULT_DB_RUN_TIMEOUT_SECONDS = 300;\n\nconst defaultOps: DbRunOperations = {\n\trunCommand: runVerificationCommand,\n\tcommandExists,\n};\n\nfunction normalizeTimeoutSeconds(raw: number | undefined): number {\n\tif (raw === undefined) return DEFAULT_DB_RUN_TIMEOUT_SECONDS;\n\tconst value = Math.floor(raw);\n\tif (!Number.isFinite(value) || value <= 0) {\n\t\tthrow new Error(\"timeout must be a positive number.\");\n\t}\n\treturn value;\n}\n\nfunction normalizeStringArray(raw: string[] | undefined): string[] {\n\treturn (raw ?? []).map((item) => String(item));\n}\n\nfunction normalizeAction(raw: DbRunAction | undefined): DbRunAction {\n\treturn raw ?? \"query\";\n}\n\nfunction normalizeFormat(raw: DbRunFormat | undefined): DbRunFormat {\n\treturn raw ?? \"table\";\n}\n\nfunction normalizeScriptName(raw: string | undefined): string | undefined {\n\tif (raw === undefined) return undefined;\n\tconst script = raw.trim();\n\tif (!script) {\n\t\tthrow new Error(\"script must not be empty.\");\n\t}\n\treturn script;\n}\n\nfunction normalizeConnectionName(raw: string | undefined): string | undefined {\n\tif (raw === undefined) return undefined;\n\tconst value = raw.trim();\n\tif (!value) {\n\t\tthrow new Error(\"connection must not be empty.\");\n\t}\n\treturn value;\n}\n\nfunction normalizeRuntimeConfig(raw: Partial<DbToolsRuntimeConfig> | DbToolsRuntimeConfig | undefined): {\n\tdefaultConnection?: string;\n\tconnections: Record<string, ResolvedConnectionProfile>;\n} {\n\tconst connections: Record<string, ResolvedConnectionProfile> = {};\n\tfor (const [name, connection] of Object.entries(raw?.connections ?? {})) {\n\t\tconst normalizedName = name.trim();\n\t\tif (!normalizedName) continue;\n\t\tconst adapter = connection?.adapter;\n\t\tif (\n\t\t\tadapter !== \"postgres\" &&\n\t\t\tadapter !== \"mysql\" &&\n\t\t\tadapter !== \"sqlite\" &&\n\t\t\tadapter !== \"mongodb\" &&\n\t\t\tadapter !== \"redis\"\n\t\t) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconnections[normalizedName] = {\n\t\t\tname: normalizedName,\n\t\t\tadapter,\n\t\t\tdsnEnv: connection?.dsnEnv?.trim() || undefined,\n\t\t\tsqlitePath: connection?.sqlitePath?.trim() || undefined,\n\t\t\tclientArgs: normalizeStringArray(connection?.clientArgs),\n\t\t\tmigrate: {\n\t\t\t\tscript: connection?.migrate?.script?.trim() || undefined,\n\t\t\t\tcwd: connection?.migrate?.cwd?.trim() || undefined,\n\t\t\t\targs: normalizeStringArray(connection?.migrate?.args),\n\t\t\t},\n\t\t};\n\t}\n\n\tconst defaultConnection = raw?.defaultConnection?.trim() || undefined;\n\treturn { defaultConnection, connections };\n}\n\nfunction isLikelyPathLikeConnection(value: string): boolean {\n\tconst normalized = value.trim();\n\tif (!normalized) return false;\n\tif (normalized.includes(\"/\") || normalized.includes(\"\\\\\") || normalized.startsWith(\".\") || normalized.startsWith(\"~\")) {\n\t\treturn true;\n\t}\n\treturn /\\.(sqlite|sqlite3|db)$/i.test(normalized) || normalized.includes(\":memory:\");\n}\n\nfunction buildDbToolsSetupHint(sqlitePathHint: string): string {\n\treturn [\n\t\t'Configure a named profile in \".iosm/settings.json\", for example:',\n\t\t\"{\",\n\t\t' \"dbTools\": {',\n\t\t' \"defaultConnection\": \"main\",',\n\t\t' \"connections\": {',\n\t\t` \"main\": { \"adapter\": \"sqlite\", \"sqlitePath\": \"${sqlitePathHint}\" }`,\n\t\t\" }\",\n\t\t\" }\",\n\t\t\"}\",\n\t\t'Then call db_run with connection=\"main\" (or omit connection when defaultConnection is set).',\n\t\t\"If you edited settings.json outside the current session, run /reload or restart the session before retrying.\",\n\t].join(\"\\n\");\n}\n\nfunction resolveConnectionProfile(input: {\n\truntimeConfig: { defaultConnection?: string; connections: Record<string, ResolvedConnectionProfile> };\n\tconnection?: string;\n\tadapter: DbRunAdapter;\n}): ResolvedConnectionProfile {\n\tconst effectiveConnection = normalizeConnectionName(input.connection) ?? input.runtimeConfig.defaultConnection;\n\tif (!effectiveConnection) {\n\t\tthrow new Error(\n\t\t\t[\n\t\t\t\t\"No db connection selected. Configure dbTools.defaultConnection or pass connection explicitly.\",\n\t\t\t\tbuildDbToolsSetupHint(\"./test_database.sqlite\"),\n\t\t\t].join(\"\\n\\n\"),\n\t\t);\n\t}\n\tconst profile = input.runtimeConfig.connections[effectiveConnection];\n\tif (!profile) {\n\t\tif (isLikelyPathLikeConnection(effectiveConnection)) {\n\t\t\tthrow new Error(\n\t\t\t\t[\n\t\t\t\t\t`Connection profile \"${effectiveConnection}\" is not defined in settings dbTools.connections.`,\n\t\t\t\t\t`The \"connection\" field expects a profile name, not a file path.`,\n\t\t\t\t\tbuildDbToolsSetupHint(effectiveConnection),\n\t\t\t\t].join(\"\\n\\n\"),\n\t\t\t);\n\t\t}\n\t\tthrow new Error(\n\t\t\t[\n\t\t\t\t`Connection profile \"${effectiveConnection}\" is not defined in settings dbTools.connections.`,\n\t\t\t\tbuildDbToolsSetupHint(\"./test_database.sqlite\"),\n\t\t\t].join(\"\\n\\n\"),\n\t\t);\n\t}\n\n\tif (input.adapter !== \"auto\" && input.adapter !== profile.adapter) {\n\t\tthrow new Error(\n\t\t\t`Adapter \"${input.adapter}\" does not match connection \"${effectiveConnection}\" adapter \"${profile.adapter}\".`,\n\t\t);\n\t}\n\n\tif (profile.adapter === \"sqlite\") {\n\t\tif (!profile.sqlitePath) {\n\t\t\tthrow new Error(`Connection \"${effectiveConnection}\" requires sqlitePath for sqlite adapter.`);\n\t\t}\n\t} else if (!profile.dsnEnv) {\n\t\tthrow new Error(`Connection \"${effectiveConnection}\" requires dsnEnv for ${profile.adapter} adapter.`);\n\t}\n\n\treturn profile;\n}\n\nfunction ensureWriteAllowed(action: DbRunAction, allowWrite: boolean): void {\n\tif ((action === \"exec\" || action === \"migrate\") && !allowWrite) {\n\t\tthrow new Error(`Action \"${action}\" requires allow_write=true.`);\n\t}\n}\n\nfunction normalizeStatement(statement: string | undefined): string | undefined {\n\tif (statement === undefined) return undefined;\n\tconst normalized = statement.trim();\n\tif (!normalized) {\n\t\tthrow new Error(\"statement must not be empty when provided.\");\n\t}\n\treturn normalized;\n}\n\nfunction isLikelyMutatingSql(statement: string): boolean {\n\treturn /\\b(insert|update|delete|drop|alter|create|truncate|replace|grant|revoke|merge|upsert)\\b/i.test(statement);\n}\n\nfunction isLikelyMutatingMongo(statement: string): boolean {\n\treturn /\\b(insert|update|delete|drop|create|rename|set|remove|replace|findOneAndUpdate|findAndModify)\\b/i.test(statement);\n}\n\nfunction isLikelyMutatingRedis(statement: string): boolean {\n\tconst firstToken = statement.trim().split(/\\s+/)[0]?.toUpperCase() ?? \"\";\n\tconst mutatingCommands = new Set([\n\t\t\"SET\",\n\t\t\"DEL\",\n\t\t\"HSET\",\n\t\t\"HDEL\",\n\t\t\"LPUSH\",\n\t\t\"RPUSH\",\n\t\t\"SADD\",\n\t\t\"SREM\",\n\t\t\"ZADD\",\n\t\t\"ZREM\",\n\t\t\"INCR\",\n\t\t\"DECR\",\n\t\t\"FLUSHDB\",\n\t\t\"FLUSHALL\",\n\t\t\"EXPIRE\",\n\t\t\"PERSIST\",\n\t]);\n\treturn mutatingCommands.has(firstToken);\n}\n\nfunction enforceReadFirstSafety(adapter: DbRunResolvedAdapter, action: DbRunAction, statement: string | undefined): void {\n\tif (action !== \"query\" || !statement) return;\n\tif (adapter === \"postgres\" || adapter === \"mysql\" || adapter === \"sqlite\") {\n\t\tif (isLikelyMutatingSql(statement)) {\n\t\t\tthrow new Error('Mutating statement detected for action=query. Use action=\"exec\" with allow_write=true.');\n\t\t}\n\t\treturn;\n\t}\n\tif (adapter === \"mongodb\" && isLikelyMutatingMongo(statement)) {\n\t\tthrow new Error('Mutating statement detected for action=query. Use action=\"exec\" with allow_write=true.');\n\t}\n\tif (adapter === \"redis\" && isLikelyMutatingRedis(statement)) {\n\t\tthrow new Error('Mutating statement detected for action=query. Use action=\"exec\" with allow_write=true.');\n\t}\n}\n\nfunction parseDsn(dsn: string, adapter: DbRunResolvedAdapter): URL {\n\ttry {\n\t\tconst parsed = new URL(dsn);\n\t\tconst protocol = parsed.protocol.replace(\":\", \"\");\n\t\tif (adapter === \"postgres\" && protocol !== \"postgres\" && protocol !== \"postgresql\") {\n\t\t\tthrow new Error(\"Expected postgres:// or postgresql:// DSN.\");\n\t\t}\n\t\tif (adapter === \"mysql\" && protocol !== \"mysql\" && protocol !== \"mariadb\") {\n\t\t\tthrow new Error(\"Expected mysql:// or mariadb:// DSN.\");\n\t\t}\n\t\tif (adapter === \"mongodb\" && protocol !== \"mongodb\" && protocol !== \"mongodb+srv\") {\n\t\t\tthrow new Error(\"Expected mongodb:// or mongodb+srv:// DSN.\");\n\t\t}\n\t\tif (adapter === \"redis\" && protocol !== \"redis\" && protocol !== \"rediss\") {\n\t\t\tthrow new Error(\"Expected redis:// or rediss:// DSN.\");\n\t\t}\n\t\treturn parsed;\n\t} catch (error) {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tthrow new Error(`Invalid DSN for ${adapter}: ${message}`);\n\t}\n}\n\nfunction resolveSqlStatement(adapter: \"postgres\" | \"mysql\" | \"sqlite\", action: DbRunAction, statement: string | undefined): string {\n\tconst schemaDefaults: Record<\"postgres\" | \"mysql\" | \"sqlite\", string> = {\n\t\tpostgres:\n\t\t\t\"SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog','information_schema') ORDER BY 1,2;\",\n\t\tmysql:\n\t\t\t\"SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema = DATABASE() ORDER BY 1,2;\",\n\t\tsqlite: \"SELECT name, type FROM sqlite_master WHERE type IN ('table','view') ORDER BY name;\",\n\t};\n\n\tif (action === \"schema\") {\n\t\treturn statement ?? schemaDefaults[adapter];\n\t}\n\tif (!statement) {\n\t\tthrow new Error(`Action \"${action}\" requires statement.`);\n\t}\n\tif (action === \"explain\") {\n\t\treturn /^\\s*explain\\b/i.test(statement) ? statement : `EXPLAIN ${statement}`;\n\t}\n\treturn statement;\n}\n\nfunction resolveMongoStatement(action: DbRunAction, statement: string | undefined): string {\n\tif (action === \"schema\") {\n\t\treturn statement ?? \"db.getCollectionInfos()\";\n\t}\n\tif (!statement) {\n\t\tthrow new Error(`Action \"${action}\" requires statement.`);\n\t}\n\tif (action === \"explain\") {\n\t\treturn statement;\n\t}\n\treturn statement;\n}\n\nfunction resolveRedisStatement(action: DbRunAction, statement: string | undefined): string {\n\tif (action === \"schema\") {\n\t\treturn statement ?? \"INFO keyspace\";\n\t}\n\tif (!statement) {\n\t\tthrow new Error(`Action \"${action}\" requires statement.`);\n\t}\n\treturn statement;\n}\n\nfunction ensureAdapterCommandAvailable(ops: DbRunOperations, command: string, hint: string): void {\n\tif (ops.commandExists(command)) {\n\t\treturn;\n\t}\n\tthrow new Error(hint);\n}\n\nfunction resolveSqlCommand(input: {\n\tops: DbRunOperations;\n\tadapter: \"postgres\" | \"mysql\" | \"sqlite\";\n\taction: DbRunAction;\n\tstatement?: string;\n\tformat: DbRunFormat;\n\texecutionCwd: string;\n\tconnection: ResolvedConnectionProfile;\n}): ResolvedDbCommand {\n\tconst statement = resolveSqlStatement(input.adapter, input.action, input.statement);\n\tif (input.adapter === \"postgres\") {\n\t\tensureAdapterCommandAvailable(input.ops, \"psql\", 'Command \"psql\" is required for postgres adapter.');\n\t\tconst dsnValue = process.env[input.connection.dsnEnv!];\n\t\tif (!dsnValue) {\n\t\t\tthrow new Error(`Environment variable \"${input.connection.dsnEnv}\" is required for connection \"${input.connection.name}\".`);\n\t\t}\n\t\tconst parsed = parseDsn(dsnValue, \"postgres\");\n\t\tconst env: NodeJS.ProcessEnv = {};\n\t\tif (parsed.hostname) env.PGHOST = parsed.hostname;\n\t\tif (parsed.port) env.PGPORT = parsed.port;\n\t\tif (parsed.username) env.PGUSER = decodeURIComponent(parsed.username);\n\t\tif (parsed.password) env.PGPASSWORD = decodeURIComponent(parsed.password);\n\t\tconst dbName = parsed.pathname.replace(/^\\//, \"\");\n\t\tif (dbName) env.PGDATABASE = decodeURIComponent(dbName);\n\t\tconst sslMode = parsed.searchParams.get(\"sslmode\");\n\t\tif (sslMode) env.PGSSLMODE = sslMode;\n\n\t\tconst args = [...input.connection.clientArgs];\n\t\tif (input.format === \"raw\" || input.format === \"json\") {\n\t\t\targs.push(\"-A\", \"-t\");\n\t\t}\n\t\targs.push(\"-c\", statement);\n\t\treturn {\n\t\t\tcommand: \"psql\",\n\t\t\targs,\n\t\t\tenv,\n\t\t\tsecretValues: [dsnValue, decodeURIComponent(parsed.password || \"\")].filter(Boolean),\n\t\t};\n\t}\n\n\tif (input.adapter === \"mysql\") {\n\t\tensureAdapterCommandAvailable(input.ops, \"mysql\", 'Command \"mysql\" is required for mysql adapter.');\n\t\tconst dsnValue = process.env[input.connection.dsnEnv!];\n\t\tif (!dsnValue) {\n\t\t\tthrow new Error(`Environment variable \"${input.connection.dsnEnv}\" is required for connection \"${input.connection.name}\".`);\n\t\t}\n\t\tconst parsed = parseDsn(dsnValue, \"mysql\");\n\t\tconst args = [...input.connection.clientArgs];\n\t\tif (parsed.hostname) args.push(\"--host\", parsed.hostname);\n\t\tif (parsed.port) args.push(\"--port\", parsed.port);\n\t\tif (parsed.username) args.push(\"--user\", decodeURIComponent(parsed.username));\n\t\tif (input.format === \"raw\" || input.format === \"json\") {\n\t\t\targs.push(\"--batch\", \"--raw\", \"--skip-column-names\");\n\t\t}\n\t\tconst dbName = parsed.pathname.replace(/^\\//, \"\");\n\t\tif (dbName) args.push(decodeURIComponent(dbName));\n\t\targs.push(\"-e\", statement);\n\t\tconst env: NodeJS.ProcessEnv = {};\n\t\tif (parsed.password) {\n\t\t\tenv.MYSQL_PWD = decodeURIComponent(parsed.password);\n\t\t}\n\t\treturn {\n\t\t\tcommand: \"mysql\",\n\t\t\targs,\n\t\t\tenv,\n\t\t\tsecretValues: [dsnValue, decodeURIComponent(parsed.password || \"\")].filter(Boolean),\n\t\t};\n\t}\n\n\tensureAdapterCommandAvailable(input.ops, \"sqlite3\", 'Command \"sqlite3\" is required for sqlite adapter.');\n\tconst sqlitePath = resolveToCwd(input.connection.sqlitePath!, input.executionCwd);\n\tconst sqliteDir = join(sqlitePath, \"..\");\n\tif (!existsSync(sqliteDir)) {\n\t\tthrow new Error(`sqlitePath parent directory does not exist: ${sqliteDir}`);\n\t}\n\tconst args = [...input.connection.clientArgs];\n\tif (input.format === \"raw\") {\n\t\targs.push(\"-noheader\");\n\t}\n\tif (input.format === \"json\") {\n\t\targs.push(\"-json\");\n\t}\n\targs.push(sqlitePath, statement);\n\treturn {\n\t\tcommand: \"sqlite3\",\n\t\targs,\n\t\tsecretValues: [],\n\t};\n}\n\nfunction resolveMongoCommand(input: {\n\tops: DbRunOperations;\n\taction: DbRunAction;\n\tstatement?: string;\n\tconnection: ResolvedConnectionProfile;\n}): ResolvedDbCommand {\n\tensureAdapterCommandAvailable(input.ops, \"mongosh\", 'Command \"mongosh\" is required for mongodb adapter.');\n\tconst dsnValue = process.env[input.connection.dsnEnv!];\n\tif (!dsnValue) {\n\t\tthrow new Error(`Environment variable \"${input.connection.dsnEnv}\" is required for connection \"${input.connection.name}\".`);\n\t}\n\tparseDsn(dsnValue, \"mongodb\");\n\tconst statement = resolveMongoStatement(input.action, input.statement);\n\tconst args = [...input.connection.clientArgs, dsnValue, \"--quiet\", \"--eval\", statement];\n\treturn {\n\t\tcommand: \"mongosh\",\n\t\targs,\n\t\tsecretValues: [dsnValue],\n\t};\n}\n\nfunction resolveRedisCommand(input: {\n\tops: DbRunOperations;\n\taction: DbRunAction;\n\tstatement?: string;\n\tformat: DbRunFormat;\n\tconnection: ResolvedConnectionProfile;\n}): ResolvedDbCommand {\n\tensureAdapterCommandAvailable(input.ops, \"redis-cli\", 'Command \"redis-cli\" is required for redis adapter.');\n\tconst dsnValue = process.env[input.connection.dsnEnv!];\n\tif (!dsnValue) {\n\t\tthrow new Error(`Environment variable \"${input.connection.dsnEnv}\" is required for connection \"${input.connection.name}\".`);\n\t}\n\tconst parsed = parseDsn(dsnValue, \"redis\");\n\tconst statement = resolveRedisStatement(input.action, input.statement);\n\tconst args = [...input.connection.clientArgs];\n\tif (parsed.protocol === \"rediss:\") {\n\t\targs.push(\"--tls\");\n\t}\n\tif (parsed.hostname) args.push(\"-h\", parsed.hostname);\n\tif (parsed.port) args.push(\"-p\", parsed.port);\n\tif (parsed.username) args.push(\"--user\", decodeURIComponent(parsed.username));\n\tconst dbName = parsed.pathname.replace(/^\\//, \"\");\n\tif (dbName) args.push(\"-n\", decodeURIComponent(dbName));\n\tif (input.format === \"raw\" || input.format === \"json\") {\n\t\targs.push(\"--raw\");\n\t}\n\tconst env: NodeJS.ProcessEnv = {};\n\tif (parsed.password) {\n\t\tenv.REDISCLI_AUTH = decodeURIComponent(parsed.password);\n\t}\n\treturn {\n\t\tcommand: \"redis-cli\",\n\t\targs,\n\t\tstdin: `${statement}\\n`,\n\t\tenv,\n\t\tsecretValues: [dsnValue, decodeURIComponent(parsed.password || \"\")].filter(Boolean),\n\t};\n}\n\nfunction resolveMigrateCommand(input: {\n\taction: DbRunAction;\n\tallowWrite: boolean;\n\texecutionCwd: string;\n\tmigrateRunner: DbRunMigrateRunner;\n\tconnection: ResolvedConnectionProfile;\n\tscript?: string;\n\targs: string[];\n}): { command: ResolvedDbCommand; cwd: string } {\n\tif (input.action !== \"migrate\") {\n\t\tthrow new Error(\"Internal error: resolveMigrateCommand called for non-migrate action.\");\n\t}\n\tensureWriteAllowed(\"migrate\", input.allowWrite);\n\n\tconst migrateCwd = resolveToCwd(input.connection.migrate.cwd ?? \".\", input.executionCwd);\n\tconst packageJson = readPackageJson(migrateCwd);\n\tif (!packageJson) {\n\t\tthrow new Error(\"package.json is required for migrate action.\");\n\t}\n\n\tconst scriptCandidates: string[] = [];\n\tif (input.script) scriptCandidates.push(input.script);\n\tif (input.connection.migrate.script) scriptCandidates.push(input.connection.migrate.script);\n\tif (input.migrateRunner === \"auto\") {\n\t\tscriptCandidates.push(\"db:migrate\", \"migrate\");\n\t}\n\tif (input.migrateRunner === \"script\" && scriptCandidates.length === 0) {\n\t\tscriptCandidates.push(\"db:migrate\");\n\t}\n\n\tconst selectedScript = scriptCandidates.find((candidate) => packageJson.scripts[candidate]);\n\tif (!selectedScript) {\n\t\tthrow new Error(\n\t\t\t`No migration script found. Checked: ${scriptCandidates.join(\", \")} in ${packageJson.path}.`,\n\t\t);\n\t}\n\n\tconst packageManager = detectPackageManager(migrateCwd);\n\tensureCommandOrThrow(packageManager, `Command \"${packageManager}\" is required for migrate action.`);\n\tconst invocation = resolvePackageManagerRunInvocation(packageManager, selectedScript, [\n\t\t...input.connection.migrate.args,\n\t\t...input.args,\n\t]);\n\treturn {\n\t\tcwd: migrateCwd,\n\t\tcommand: {\n\t\t\tcommand: invocation.command,\n\t\t\targs: invocation.args,\n\t\t\tsecretValues: [],\n\t\t},\n\t};\n}\n\nfunction mapDbStatus(exitCode: number): DbRunStatus {\n\tif (exitCode === 0) return \"passed\";\n\tif (exitCode === 1) return \"failed\";\n\treturn \"error\";\n}\n\nfunction redactArgs(args: string[], secrets: string[]): string[] {\n\tconst normalizedSecrets = secrets\n\t\t.map((secret) => secret.trim())\n\t\t.filter((secret) => secret.length > 0)\n\t\t.sort((a, b) => b.length - a.length);\n\n\treturn args.map((arg) => {\n\t\tlet sanitized = arg;\n\t\tfor (const secret of normalizedSecrets) {\n\t\t\tif (sanitized.includes(secret)) {\n\t\t\t\tsanitized = sanitized.replaceAll(secret, \"[REDACTED]\");\n\t\t\t}\n\t\t}\n\t\tif (/\\b(password|passwd|pwd|token|secret)=/i.test(sanitized)) {\n\t\t\treturn sanitized.replace(/=(.+)$/i, \"=[REDACTED]\");\n\t\t}\n\t\treturn sanitized;\n\t});\n}\n\nfunction parseCounts(output: string): { rowCount?: number; affectedCount?: number } {\n\tconst selectMatch = output.match(/\\bSELECT\\s+(\\d+)\\b/i);\n\tconst updateMatch = output.match(/\\b(?:UPDATE|DELETE)\\s+(\\d+)\\b/i);\n\tconst insertMatch = output.match(/\\bINSERT\\s+\\d+\\s+(\\d+)\\b/i);\n\tconst rowsInSetMatch = output.match(/\\b(\\d+)\\s+rows?\\s+in set\\b/i);\n\tconst mysqlChangedMatch = output.match(/\\bRows matched:\\s*(\\d+)\\s+Changed:\\s*(\\d+)\\b/i);\n\n\tconst rowCount = selectMatch?.[1]\n\t\t? Number.parseInt(selectMatch[1], 10)\n\t\t: rowsInSetMatch?.[1]\n\t\t\t? Number.parseInt(rowsInSetMatch[1], 10)\n\t\t\t: undefined;\n\tconst affectedCount = updateMatch?.[1]\n\t\t? Number.parseInt(updateMatch[1], 10)\n\t\t: insertMatch?.[1]\n\t\t\t? Number.parseInt(insertMatch[1], 10)\n\t\t\t: mysqlChangedMatch?.[2]\n\t\t\t\t? Number.parseInt(mysqlChangedMatch[2], 10)\n\t\t\t\t: undefined;\n\n\treturn {\n\t\trowCount: Number.isFinite(rowCount as number) ? rowCount : undefined,\n\t\taffectedCount: Number.isFinite(affectedCount as number) ? affectedCount : undefined,\n\t};\n}\n\nfunction renderSummary(details: DbRunToolDetails, output: string): string {\n\tconst argsText = details.resolvedArgs.length > 0 ? ` ${details.resolvedArgs.join(\" \")}` : \"\";\n\tconst lines = [\n\t\t`db_run status: ${details.status}`,\n\t\t`action: ${details.action}`,\n\t\t`adapter: ${details.adapter}`,\n\t\t`connection: ${details.connection}`,\n\t\t`command: ${details.resolvedCommand}${argsText}`,\n\t\t`cwd: ${details.cwd}`,\n\t\t`write_requested: ${details.writeRequested ? \"true\" : \"false\"}`,\n\t\t`write_allowed: ${details.writeAllowed ? \"true\" : \"false\"}`,\n\t\t`exit_code: ${details.exitCode}`,\n\t\t`duration_ms: ${details.durationMs}`,\n\t];\n\tif (details.rowCount !== undefined) {\n\t\tlines.push(`row_count: ${details.rowCount}`);\n\t}\n\tif (details.affectedCount !== undefined) {\n\t\tlines.push(`affected_count: ${details.affectedCount}`);\n\t}\n\tlines.push(\"\", output);\n\treturn lines.join(\"\\n\");\n}\n\nexport function createDbRunTool(cwd: string, options?: DbRunToolOptions): AgentTool<typeof dbRunSchema> {\n\tconst permissionGuard = options?.permissionGuard;\n\tconst ops: DbRunOperations = {\n\t\t...defaultOps,\n\t\t...(options?.operations ?? {}),\n\t};\n\n\treturn {\n\t\tname: \"db_run\",\n\t\tlabel: \"db_run\",\n\t\tdescription:\n\t\t\t\"Structured database operations across postgres/mysql/sqlite/mongodb/redis using named settings profiles with read-first safety and normalized status reporting.\",\n\t\tparameters: dbRunSchema,\n\t\texecute: async (_toolCallId: string, input: DbRunToolInput, signal?: AbortSignal) => {\n\t\t\tconst action = normalizeAction(input.action);\n\t\t\tconst requestedAdapter = input.adapter ?? \"auto\";\n\t\t\tconst format = normalizeFormat(input.format);\n\t\t\tconst allowWrite = input.allow_write === true;\n\t\t\tconst timeoutSeconds = normalizeTimeoutSeconds(input.timeout);\n\t\t\tconst statement = normalizeStatement(input.statement);\n\t\t\tconst args = normalizeStringArray(input.args);\n\t\t\tconst executionCwd = resolveToCwd(input.path || \".\", cwd);\n\t\t\tconst migrateRunner: DbRunMigrateRunner = input.migrate_runner ?? \"auto\";\n\t\t\tconst script = normalizeScriptName(input.script);\n\n\t\t\tconst runtimeConfig = normalizeRuntimeConfig(options?.resolveRuntimeConfig?.());\n\t\t\tconst connection = resolveConnectionProfile({\n\t\t\t\truntimeConfig,\n\t\t\t\tconnection: input.connection,\n\t\t\t\tadapter: requestedAdapter,\n\t\t\t});\n\t\t\tconst resolvedAdapter = requestedAdapter === \"auto\" ? connection.adapter : requestedAdapter;\n\t\t\tconst writeRequested = action === \"exec\" || action === \"migrate\";\n\t\t\tensureWriteAllowed(action, allowWrite);\n\t\t\tenforceReadFirstSafety(resolvedAdapter, action, statement);\n\n\t\t\tif (permissionGuard) {\n\t\t\t\tconst allowed = await permissionGuard({\n\t\t\t\t\ttoolName: \"db_run\",\n\t\t\t\t\tcwd: executionCwd,\n\t\t\t\t\tinput: {\n\t\t\t\t\t\taction,\n\t\t\t\t\t\tadapter: resolvedAdapter,\n\t\t\t\t\t\tconnection: connection.name,\n\t\t\t\t\t\tformat,\n\t\t\t\t\t\tallowWrite,\n\t\t\t\t\t\targs,\n\t\t\t\t\t},\n\t\t\t\t\tsummary: `${action} on ${connection.name} (${resolvedAdapter})`,\n\t\t\t\t});\n\t\t\t\tif (!allowed) {\n\t\t\t\t\tthrow new Error(\"Permission denied for db_run operation.\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet commandCwd = executionCwd;\n\t\t\tlet resolvedCommand: ResolvedDbCommand;\n\t\t\tif (action === \"migrate\") {\n\t\t\t\tconst migrated = resolveMigrateCommand({\n\t\t\t\t\taction,\n\t\t\t\t\tallowWrite,\n\t\t\t\t\texecutionCwd,\n\t\t\t\t\tmigrateRunner,\n\t\t\t\t\tconnection,\n\t\t\t\t\tscript,\n\t\t\t\t\targs,\n\t\t\t\t});\n\t\t\t\tresolvedCommand = migrated.command;\n\t\t\t\tcommandCwd = migrated.cwd;\n\t\t\t} else if (resolvedAdapter === \"postgres\" || resolvedAdapter === \"mysql\" || resolvedAdapter === \"sqlite\") {\n\t\t\t\tresolvedCommand = resolveSqlCommand({\n\t\t\t\t\tops,\n\t\t\t\t\tadapter: resolvedAdapter,\n\t\t\t\t\taction,\n\t\t\t\t\tstatement,\n\t\t\t\t\tformat,\n\t\t\t\t\texecutionCwd,\n\t\t\t\t\tconnection,\n\t\t\t\t});\n\t\t\t\tif (args.length > 0) {\n\t\t\t\t\tresolvedCommand.args = [...resolvedCommand.args, ...args];\n\t\t\t\t}\n\t\t\t} else if (resolvedAdapter === \"mongodb\") {\n\t\t\t\tresolvedCommand = resolveMongoCommand({\n\t\t\t\t\tops,\n\t\t\t\t\taction,\n\t\t\t\t\tstatement,\n\t\t\t\t\tconnection,\n\t\t\t\t});\n\t\t\t\tif (args.length > 0) {\n\t\t\t\t\tresolvedCommand.args = [...resolvedCommand.args, ...args];\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresolvedCommand = resolveRedisCommand({\n\t\t\t\t\tops,\n\t\t\t\t\taction,\n\t\t\t\t\tstatement,\n\t\t\t\t\tformat,\n\t\t\t\t\tconnection,\n\t\t\t\t});\n\t\t\t\tif (args.length > 0) {\n\t\t\t\t\tresolvedCommand.args = [...resolvedCommand.args, ...args];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst result = await ops.runCommand({\n\t\t\t\tcommand: resolvedCommand.command,\n\t\t\t\targs: resolvedCommand.args,\n\t\t\t\tcwd: commandCwd,\n\t\t\t\ttimeoutMs: timeoutSeconds * 1000,\n\t\t\t\tsignal,\n\t\t\t\tenv: resolvedCommand.env,\n\t\t\t\tstdin: resolvedCommand.stdin,\n\t\t\t});\n\n\t\t\tconst status = mapDbStatus(result.exitCode);\n\t\t\tconst formatted = formatVerificationOutput(\n\t\t\t\tresult.stdout,\n\t\t\t\tresult.stderr,\n\t\t\t\tresult.captureTruncated,\n\t\t\t\t\"No database output\",\n\t\t\t);\n\t\t\tconst counts = parseCounts(`${result.stdout}\\n${result.stderr}`);\n\t\t\tconst details: DbRunToolDetails = {\n\t\t\t\taction,\n\t\t\t\tadapter: resolvedAdapter,\n\t\t\t\tconnection: connection.name,\n\t\t\t\tresolvedCommand: resolvedCommand.command,\n\t\t\t\tresolvedArgs: redactArgs(resolvedCommand.args, resolvedCommand.secretValues),\n\t\t\t\tcwd: commandCwd,\n\t\t\t\texitCode: result.exitCode,\n\t\t\t\tstatus,\n\t\t\t\tdurationMs: result.durationMs,\n\t\t\t\trowCount: counts.rowCount,\n\t\t\t\taffectedCount: counts.affectedCount,\n\t\t\t\twriteRequested,\n\t\t\t\twriteAllowed: allowWrite,\n\t\t\t\tcaptureTruncated: result.captureTruncated || undefined,\n\t\t\t\ttruncation: formatted.truncation,\n\t\t\t};\n\n\t\t\treturn {\n\t\t\t\tcontent: [{ type: \"text\", text: renderSummary(details, formatted.text) }],\n\t\t\t\tdetails,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport const dbRunTool = createDbRunTool(process.cwd());\n"]}
@@ -0,0 +1,45 @@
1
+ import { type TruncationResult } from "./truncate.js";
2
+ export declare const DEFAULT_GIT_TIMEOUT_SECONDS = 30;
3
+ export declare const MAX_GIT_CAPTURE_BYTES: number;
4
+ export interface RunGitCommandResult {
5
+ stdout: string;
6
+ stderr: string;
7
+ exitCode: number;
8
+ captureTruncated: boolean;
9
+ }
10
+ export interface GitCommandExecutionOptions {
11
+ env?: NodeJS.ProcessEnv;
12
+ }
13
+ export type GitCommandExists = (command: string) => boolean;
14
+ export type RunGitCommand = (args: string[], cwd: string, timeoutMs: number, signal?: AbortSignal, executionOptions?: GitCommandExecutionOptions) => Promise<RunGitCommandResult>;
15
+ export interface GitCommandOptions {
16
+ commandExists?: GitCommandExists;
17
+ runCommand?: RunGitCommand;
18
+ }
19
+ export interface GitRunSummary {
20
+ output: string;
21
+ captureTruncated: boolean;
22
+ truncation?: TruncationResult;
23
+ exitCode: number;
24
+ }
25
+ export interface GitRunParams {
26
+ toolName: string;
27
+ action: string;
28
+ args: string[];
29
+ cwd: string;
30
+ timeoutSeconds: number;
31
+ runCommand: RunGitCommand;
32
+ signal?: AbortSignal;
33
+ env?: NodeJS.ProcessEnv;
34
+ }
35
+ export declare function resolveGitCommandOptions(options?: GitCommandOptions): {
36
+ hasCommand: GitCommandExists;
37
+ runCommand: RunGitCommand;
38
+ };
39
+ export declare function normalizePositiveInt(raw: number | undefined, fallback: number, field: string): number;
40
+ export declare function normalizeRefLike(raw: string | undefined, field: string): string | undefined;
41
+ export declare function requireRefLike(raw: string | undefined, field: string): string;
42
+ export declare function normalizeRequiredString(raw: string | undefined, field: string): string;
43
+ export declare function normalizeFiles(files: string[] | undefined, field: string): string[];
44
+ export declare function runGitAndFormatOutput(params: GitRunParams): Promise<GitRunSummary>;
45
+ //# sourceMappingURL=git-common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-common.d.ts","sourceRoot":"","sources":["../../../src/core/tools/git-common.ts"],"names":[],"mappings":"AACA,OAAO,EAIN,KAAK,gBAAgB,EAErB,MAAM,eAAe,CAAC;AAEvB,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,qBAAqB,QAAa,CAAC;AAEhD,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA0B;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;AAE5D,MAAM,MAAM,aAAa,GAAG,CAC3B,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,EACpB,gBAAgB,CAAC,EAAE,0BAA0B,KACzC,OAAO,CAAC,mBAAmB,CAAC,CAAC;AAElC,MAAM,WAAW,iBAAiB;IACjC,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,UAAU,CAAC,EAAE,aAAa,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,aAAa,CAAC;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAuHD,wBAAgB,wBAAwB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG;IACtE,UAAU,EAAE,gBAAgB,CAAC;IAC7B,UAAU,EAAE,aAAa,CAAC;CAC1B,CAKA;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAOrG;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAU3F;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAM7E;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMtF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAWnF;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAsCxF"}
@@ -0,0 +1,185 @@
1
+ import { spawn, spawnSync } from "node:child_process";
2
+ import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, truncateHead, } from "./truncate.js";
3
+ export const DEFAULT_GIT_TIMEOUT_SECONDS = 30;
4
+ export const MAX_GIT_CAPTURE_BYTES = 512 * 1024;
5
+ function commandExists(command) {
6
+ try {
7
+ const result = spawnSync(command, ["--version"], { stdio: "pipe" });
8
+ const err = result.error;
9
+ return !err || err.code !== "ENOENT";
10
+ }
11
+ catch {
12
+ return false;
13
+ }
14
+ }
15
+ function runGitCommand(args, cwd, timeoutMs, signal, executionOptions) {
16
+ return new Promise((resolve, reject) => {
17
+ if (signal?.aborted) {
18
+ reject(new Error("Operation aborted"));
19
+ return;
20
+ }
21
+ const child = spawn("git", args, {
22
+ cwd,
23
+ stdio: ["ignore", "pipe", "pipe"],
24
+ env: executionOptions?.env ? { ...process.env, ...executionOptions.env } : process.env,
25
+ });
26
+ const stdoutChunks = [];
27
+ const stderrChunks = [];
28
+ let stdoutBytes = 0;
29
+ let stderrBytes = 0;
30
+ let captureTruncated = false;
31
+ let timedOut = false;
32
+ let aborted = false;
33
+ let settled = false;
34
+ const settle = (fn) => {
35
+ if (!settled) {
36
+ settled = true;
37
+ fn();
38
+ }
39
+ };
40
+ const captureChunk = (chunk, chunks, currentBytes) => {
41
+ if (currentBytes >= MAX_GIT_CAPTURE_BYTES) {
42
+ return { nextBytes: currentBytes, truncated: true };
43
+ }
44
+ const remaining = MAX_GIT_CAPTURE_BYTES - currentBytes;
45
+ if (chunk.length <= remaining) {
46
+ chunks.push(chunk);
47
+ return { nextBytes: currentBytes + chunk.length, truncated: false };
48
+ }
49
+ chunks.push(chunk.subarray(0, remaining));
50
+ return { nextBytes: MAX_GIT_CAPTURE_BYTES, truncated: true };
51
+ };
52
+ const timeoutHandle = setTimeout(() => {
53
+ timedOut = true;
54
+ child.kill("SIGTERM");
55
+ }, Math.max(1000, timeoutMs));
56
+ const onAbort = () => {
57
+ aborted = true;
58
+ child.kill("SIGTERM");
59
+ };
60
+ signal?.addEventListener("abort", onAbort, { once: true });
61
+ const cleanup = () => {
62
+ clearTimeout(timeoutHandle);
63
+ signal?.removeEventListener("abort", onAbort);
64
+ };
65
+ child.stdout.on("data", (chunk) => {
66
+ const captured = captureChunk(chunk, stdoutChunks, stdoutBytes);
67
+ stdoutBytes = captured.nextBytes;
68
+ captureTruncated = captureTruncated || captured.truncated;
69
+ });
70
+ child.stderr.on("data", (chunk) => {
71
+ const captured = captureChunk(chunk, stderrChunks, stderrBytes);
72
+ stderrBytes = captured.nextBytes;
73
+ captureTruncated = captureTruncated || captured.truncated;
74
+ });
75
+ child.on("error", (error) => {
76
+ cleanup();
77
+ settle(() => reject(new Error(`Failed to run git: ${error.message}`)));
78
+ });
79
+ child.on("close", (code) => {
80
+ cleanup();
81
+ if (aborted) {
82
+ settle(() => reject(new Error("Operation aborted")));
83
+ return;
84
+ }
85
+ if (timedOut) {
86
+ settle(() => reject(new Error(`Command timed out after ${Math.round(timeoutMs / 1000)}s`)));
87
+ return;
88
+ }
89
+ settle(() => resolve({
90
+ stdout: Buffer.concat(stdoutChunks).toString("utf-8"),
91
+ stderr: Buffer.concat(stderrChunks).toString("utf-8"),
92
+ exitCode: code ?? -1,
93
+ captureTruncated,
94
+ }));
95
+ });
96
+ });
97
+ }
98
+ export function resolveGitCommandOptions(options) {
99
+ return {
100
+ hasCommand: options?.commandExists ?? commandExists,
101
+ runCommand: options?.runCommand ?? runGitCommand,
102
+ };
103
+ }
104
+ export function normalizePositiveInt(raw, fallback, field) {
105
+ if (raw === undefined)
106
+ return fallback;
107
+ const value = Math.floor(raw);
108
+ if (!Number.isFinite(value) || value <= 0) {
109
+ throw new Error(`${field} must be a positive number.`);
110
+ }
111
+ return value;
112
+ }
113
+ export function normalizeRefLike(raw, field) {
114
+ if (raw === undefined)
115
+ return undefined;
116
+ const normalized = raw.trim();
117
+ if (normalized.length === 0) {
118
+ throw new Error(`${field} must not be empty.`);
119
+ }
120
+ if (normalized.startsWith("-")) {
121
+ throw new Error(`${field} must not start with '-'.`);
122
+ }
123
+ return normalized;
124
+ }
125
+ export function requireRefLike(raw, field) {
126
+ const normalized = normalizeRefLike(raw, field);
127
+ if (!normalized) {
128
+ throw new Error(`${field} is required.`);
129
+ }
130
+ return normalized;
131
+ }
132
+ export function normalizeRequiredString(raw, field) {
133
+ const value = raw?.trim();
134
+ if (!value) {
135
+ throw new Error(`${field} is required.`);
136
+ }
137
+ return value;
138
+ }
139
+ export function normalizeFiles(files, field) {
140
+ if (!files || files.length === 0) {
141
+ throw new Error(`${field} is required.`);
142
+ }
143
+ const normalized = files
144
+ .map((file) => file.trim())
145
+ .filter((file) => file.length > 0);
146
+ if (normalized.length === 0) {
147
+ throw new Error(`${field} must include at least one non-empty path.`);
148
+ }
149
+ return normalized;
150
+ }
151
+ export async function runGitAndFormatOutput(params) {
152
+ const result = await params.runCommand(params.args, params.cwd, params.timeoutSeconds * 1000, params.signal, {
153
+ env: params.env,
154
+ });
155
+ if (result.exitCode !== 0) {
156
+ const errorText = result.stderr.trim() || result.stdout.trim() || `${params.toolName} ${params.action} failed with exit code ${result.exitCode}`;
157
+ throw new Error(errorText);
158
+ }
159
+ let output = result.stdout.trimEnd();
160
+ if (!output && result.stderr.trim().length > 0) {
161
+ output = result.stderr.trimEnd();
162
+ }
163
+ if (!output) {
164
+ output = "No output";
165
+ }
166
+ const truncation = truncateHead(output);
167
+ let finalOutput = truncation.content;
168
+ const notices = [];
169
+ if (truncation.truncated) {
170
+ notices.push(`${formatSize(DEFAULT_MAX_BYTES)} output limit reached`);
171
+ }
172
+ if (result.captureTruncated) {
173
+ notices.push(`capture limit reached (${formatSize(MAX_GIT_CAPTURE_BYTES)})`);
174
+ }
175
+ if (notices.length > 0) {
176
+ finalOutput += `\n\n[${notices.join(". ")} · showing up to ${DEFAULT_MAX_LINES} lines]`;
177
+ }
178
+ return {
179
+ output: finalOutput,
180
+ captureTruncated: result.captureTruncated,
181
+ truncation: truncation.truncated ? truncation : undefined,
182
+ exitCode: result.exitCode,
183
+ };
184
+ }
185
+ //# sourceMappingURL=git-common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-common.js","sourceRoot":"","sources":["../../../src/core/tools/git-common.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, spawnSync } from \"node:child_process\";\nimport {\n\tDEFAULT_MAX_BYTES,\n\tDEFAULT_MAX_LINES,\n\tformatSize,\n\ttype TruncationResult,\n\ttruncateHead,\n} from \"./truncate.js\";\n\nexport const DEFAULT_GIT_TIMEOUT_SECONDS = 30;\nexport const MAX_GIT_CAPTURE_BYTES = 512 * 1024;\n\nexport interface RunGitCommandResult {\n\tstdout: string;\n\tstderr: string;\n\texitCode: number;\n\tcaptureTruncated: boolean;\n}\n\nexport interface GitCommandExecutionOptions {\n\tenv?: NodeJS.ProcessEnv;\n}\n\nexport type GitCommandExists = (command: string) => boolean;\n\nexport type RunGitCommand = (\n\targs: string[],\n\tcwd: string,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n\texecutionOptions?: GitCommandExecutionOptions,\n) => Promise<RunGitCommandResult>;\n\nexport interface GitCommandOptions {\n\tcommandExists?: GitCommandExists;\n\trunCommand?: RunGitCommand;\n}\n\nexport interface GitRunSummary {\n\toutput: string;\n\tcaptureTruncated: boolean;\n\ttruncation?: TruncationResult;\n\texitCode: number;\n}\n\nexport interface GitRunParams {\n\ttoolName: string;\n\taction: string;\n\targs: string[];\n\tcwd: string;\n\ttimeoutSeconds: number;\n\trunCommand: RunGitCommand;\n\tsignal?: AbortSignal;\n\tenv?: NodeJS.ProcessEnv;\n}\n\nfunction commandExists(command: string): boolean {\n\ttry {\n\t\tconst result = spawnSync(command, [\"--version\"], { stdio: \"pipe\" });\n\t\tconst err = result.error as NodeJS.ErrnoException | undefined;\n\t\treturn !err || err.code !== \"ENOENT\";\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction runGitCommand(\n\targs: string[],\n\tcwd: string,\n\ttimeoutMs: number,\n\tsignal?: AbortSignal,\n\texecutionOptions?: GitCommandExecutionOptions,\n): Promise<RunGitCommandResult> {\n\treturn new Promise((resolve, reject) => {\n\t\tif (signal?.aborted) {\n\t\t\treject(new Error(\"Operation aborted\"));\n\t\t\treturn;\n\t\t}\n\n\t\tconst child = spawn(\"git\", args, {\n\t\t\tcwd,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"pipe\"],\n\t\t\tenv: executionOptions?.env ? { ...process.env, ...executionOptions.env } : process.env,\n\t\t});\n\n\t\tconst stdoutChunks: Buffer[] = [];\n\t\tconst stderrChunks: Buffer[] = [];\n\t\tlet stdoutBytes = 0;\n\t\tlet stderrBytes = 0;\n\t\tlet captureTruncated = false;\n\t\tlet timedOut = false;\n\t\tlet aborted = false;\n\t\tlet settled = false;\n\n\t\tconst settle = (fn: () => void) => {\n\t\t\tif (!settled) {\n\t\t\t\tsettled = true;\n\t\t\t\tfn();\n\t\t\t}\n\t\t};\n\n\t\tconst captureChunk = (\n\t\t\tchunk: Buffer,\n\t\t\tchunks: Buffer[],\n\t\t\tcurrentBytes: number,\n\t\t): { nextBytes: number; truncated: boolean } => {\n\t\t\tif (currentBytes >= MAX_GIT_CAPTURE_BYTES) {\n\t\t\t\treturn { nextBytes: currentBytes, truncated: true };\n\t\t\t}\n\t\t\tconst remaining = MAX_GIT_CAPTURE_BYTES - currentBytes;\n\t\t\tif (chunk.length <= remaining) {\n\t\t\t\tchunks.push(chunk);\n\t\t\t\treturn { nextBytes: currentBytes + chunk.length, truncated: false };\n\t\t\t}\n\t\t\tchunks.push(chunk.subarray(0, remaining));\n\t\t\treturn { nextBytes: MAX_GIT_CAPTURE_BYTES, truncated: true };\n\t\t};\n\n\t\tconst timeoutHandle = setTimeout(() => {\n\t\t\ttimedOut = true;\n\t\t\tchild.kill(\"SIGTERM\");\n\t\t}, Math.max(1000, timeoutMs));\n\n\t\tconst onAbort = () => {\n\t\t\taborted = true;\n\t\t\tchild.kill(\"SIGTERM\");\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", onAbort, { once: true });\n\n\t\tconst cleanup = () => {\n\t\t\tclearTimeout(timeoutHandle);\n\t\t\tsignal?.removeEventListener(\"abort\", onAbort);\n\t\t};\n\n\t\tchild.stdout.on(\"data\", (chunk: Buffer) => {\n\t\t\tconst captured = captureChunk(chunk, stdoutChunks, stdoutBytes);\n\t\t\tstdoutBytes = captured.nextBytes;\n\t\t\tcaptureTruncated = captureTruncated || captured.truncated;\n\t\t});\n\n\t\tchild.stderr.on(\"data\", (chunk: Buffer) => {\n\t\t\tconst captured = captureChunk(chunk, stderrChunks, stderrBytes);\n\t\t\tstderrBytes = captured.nextBytes;\n\t\t\tcaptureTruncated = captureTruncated || captured.truncated;\n\t\t});\n\n\t\tchild.on(\"error\", (error) => {\n\t\t\tcleanup();\n\t\t\tsettle(() => reject(new Error(`Failed to run git: ${error.message}`)));\n\t\t});\n\n\t\tchild.on(\"close\", (code) => {\n\t\t\tcleanup();\n\t\t\tif (aborted) {\n\t\t\t\tsettle(() => reject(new Error(\"Operation aborted\")));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (timedOut) {\n\t\t\t\tsettle(() => reject(new Error(`Command timed out after ${Math.round(timeoutMs / 1000)}s`)));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tsettle(() =>\n\t\t\t\tresolve({\n\t\t\t\t\tstdout: Buffer.concat(stdoutChunks).toString(\"utf-8\"),\n\t\t\t\t\tstderr: Buffer.concat(stderrChunks).toString(\"utf-8\"),\n\t\t\t\t\texitCode: code ?? -1,\n\t\t\t\t\tcaptureTruncated,\n\t\t\t\t}),\n\t\t\t);\n\t\t});\n\t});\n}\n\nexport function resolveGitCommandOptions(options?: GitCommandOptions): {\n\thasCommand: GitCommandExists;\n\trunCommand: RunGitCommand;\n} {\n\treturn {\n\t\thasCommand: options?.commandExists ?? commandExists,\n\t\trunCommand: options?.runCommand ?? runGitCommand,\n\t};\n}\n\nexport function normalizePositiveInt(raw: number | undefined, fallback: number, field: string): number {\n\tif (raw === undefined) return fallback;\n\tconst value = Math.floor(raw);\n\tif (!Number.isFinite(value) || value <= 0) {\n\t\tthrow new Error(`${field} must be a positive number.`);\n\t}\n\treturn value;\n}\n\nexport function normalizeRefLike(raw: string | undefined, field: string): string | undefined {\n\tif (raw === undefined) return undefined;\n\tconst normalized = raw.trim();\n\tif (normalized.length === 0) {\n\t\tthrow new Error(`${field} must not be empty.`);\n\t}\n\tif (normalized.startsWith(\"-\")) {\n\t\tthrow new Error(`${field} must not start with '-'.`);\n\t}\n\treturn normalized;\n}\n\nexport function requireRefLike(raw: string | undefined, field: string): string {\n\tconst normalized = normalizeRefLike(raw, field);\n\tif (!normalized) {\n\t\tthrow new Error(`${field} is required.`);\n\t}\n\treturn normalized;\n}\n\nexport function normalizeRequiredString(raw: string | undefined, field: string): string {\n\tconst value = raw?.trim();\n\tif (!value) {\n\t\tthrow new Error(`${field} is required.`);\n\t}\n\treturn value;\n}\n\nexport function normalizeFiles(files: string[] | undefined, field: string): string[] {\n\tif (!files || files.length === 0) {\n\t\tthrow new Error(`${field} is required.`);\n\t}\n\tconst normalized = files\n\t\t.map((file) => file.trim())\n\t\t.filter((file) => file.length > 0);\n\tif (normalized.length === 0) {\n\t\tthrow new Error(`${field} must include at least one non-empty path.`);\n\t}\n\treturn normalized;\n}\n\nexport async function runGitAndFormatOutput(params: GitRunParams): Promise<GitRunSummary> {\n\tconst result = await params.runCommand(params.args, params.cwd, params.timeoutSeconds * 1000, params.signal, {\n\t\tenv: params.env,\n\t});\n\n\tif (result.exitCode !== 0) {\n\t\tconst errorText = result.stderr.trim() || result.stdout.trim() || `${params.toolName} ${params.action} failed with exit code ${result.exitCode}`;\n\t\tthrow new Error(errorText);\n\t}\n\n\tlet output = result.stdout.trimEnd();\n\tif (!output && result.stderr.trim().length > 0) {\n\t\toutput = result.stderr.trimEnd();\n\t}\n\tif (!output) {\n\t\toutput = \"No output\";\n\t}\n\n\tconst truncation = truncateHead(output);\n\tlet finalOutput = truncation.content;\n\tconst notices: string[] = [];\n\n\tif (truncation.truncated) {\n\t\tnotices.push(`${formatSize(DEFAULT_MAX_BYTES)} output limit reached`);\n\t}\n\tif (result.captureTruncated) {\n\t\tnotices.push(`capture limit reached (${formatSize(MAX_GIT_CAPTURE_BYTES)})`);\n\t}\n\tif (notices.length > 0) {\n\t\tfinalOutput += `\\n\\n[${notices.join(\". \")} · showing up to ${DEFAULT_MAX_LINES} lines]`;\n\t}\n\n\treturn {\n\t\toutput: finalOutput,\n\t\tcaptureTruncated: result.captureTruncated,\n\t\ttruncation: truncation.truncated ? truncation : undefined,\n\t\texitCode: result.exitCode,\n\t};\n}\n"]}
@@ -1,8 +1,9 @@
1
1
  import type { AgentTool } from "@mariozechner/pi-agent-core";
2
2
  import { type Static } from "@sinclair/typebox";
3
- import { type TruncationResult } from "./truncate.js";
3
+ import { type GitCommandOptions } from "./git-common.js";
4
+ import type { TruncationResult } from "./truncate.js";
4
5
  declare const gitReadSchema: import("@sinclair/typebox").TObject<{
5
- action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"status">, import("@sinclair/typebox").TLiteral<"diff">, import("@sinclair/typebox").TLiteral<"log">, import("@sinclair/typebox").TLiteral<"blame">]>;
6
+ action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"status">, import("@sinclair/typebox").TLiteral<"diff">, import("@sinclair/typebox").TLiteral<"log">, import("@sinclair/typebox").TLiteral<"blame">, import("@sinclair/typebox").TLiteral<"show">, import("@sinclair/typebox").TLiteral<"branch_list">, import("@sinclair/typebox").TLiteral<"remote_list">, import("@sinclair/typebox").TLiteral<"rev_parse">]>;
6
7
  path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
7
8
  file: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
8
9
  base: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
@@ -16,17 +17,16 @@ declare const gitReadSchema: import("@sinclair/typebox").TObject<{
16
17
  ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
17
18
  line_start: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
18
19
  line_end: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
20
+ all: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
21
+ verbose: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
22
+ target: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
23
+ short: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
19
24
  timeout: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
20
25
  }>;
21
26
  export type GitReadToolInput = Static<typeof gitReadSchema>;
22
- interface RunCommandResult {
23
- stdout: string;
24
- stderr: string;
25
- exitCode: number;
26
- captureTruncated: boolean;
27
- }
27
+ type GitReadAction = GitReadToolInput["action"];
28
28
  export interface GitReadToolDetails {
29
- action: "status" | "diff" | "log" | "blame";
29
+ action: GitReadAction;
30
30
  command: string;
31
31
  args: string[];
32
32
  cwd: string;
@@ -34,13 +34,11 @@ export interface GitReadToolDetails {
34
34
  captureTruncated?: boolean;
35
35
  truncation?: TruncationResult;
36
36
  }
37
- export interface GitReadToolOptions {
38
- commandExists?: (command: string) => boolean;
39
- runCommand?: (args: string[], cwd: string, timeoutMs: number, signal?: AbortSignal) => Promise<RunCommandResult>;
37
+ export interface GitReadToolOptions extends GitCommandOptions {
40
38
  }
41
39
  export declare function createGitReadTool(cwd: string, options?: GitReadToolOptions): AgentTool<typeof gitReadSchema>;
42
40
  export declare const gitReadTool: AgentTool<import("@sinclair/typebox").TObject<{
43
- action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"status">, import("@sinclair/typebox").TLiteral<"diff">, import("@sinclair/typebox").TLiteral<"log">, import("@sinclair/typebox").TLiteral<"blame">]>;
41
+ action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"status">, import("@sinclair/typebox").TLiteral<"diff">, import("@sinclair/typebox").TLiteral<"log">, import("@sinclair/typebox").TLiteral<"blame">, import("@sinclair/typebox").TLiteral<"show">, import("@sinclair/typebox").TLiteral<"branch_list">, import("@sinclair/typebox").TLiteral<"remote_list">, import("@sinclair/typebox").TLiteral<"rev_parse">]>;
44
42
  path: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
45
43
  file: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
46
44
  base: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
@@ -54,6 +52,10 @@ export declare const gitReadTool: AgentTool<import("@sinclair/typebox").TObject<
54
52
  ref: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
55
53
  line_start: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
56
54
  line_end: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
55
+ all: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
56
+ verbose: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
57
+ target: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
58
+ short: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
57
59
  timeout: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
58
60
  }>, any>;
59
61
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"git-read.d.ts","sourceRoot":"","sources":["../../../src/core/tools/git-read.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAIN,KAAK,gBAAgB,EAErB,MAAM,eAAe,CAAC;AAEvB,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;EAuBjB,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AAO5D,UAAU,gBAAgB;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IAClC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7C,UAAU,CAAC,EAAE,CACZ,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,WAAW,KAChB,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAC/B;AAiND,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC,OAAO,aAAa,CAAC,CAgE5G;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;QAAmC,CAAC"}
1
+ {"version":3,"file":"git-read.d.ts","sourceRoot":"","sources":["../../../src/core/tools/git-read.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,mBAAmB,CAAC;AAEtD,OAAO,EAON,KAAK,iBAAiB,EACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;EAwCjB,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,aAAa,CAAC,CAAC;AAK5D,KAAK,aAAa,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AAEhD,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;CAAG;AAiJhE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC,OAAO,aAAa,CAAC,CA2C5G;AAED,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;QAAmC,CAAC"}