aemeathcli 1.0.10 → 1.0.12

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 (184) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +66 -54
  3. package/dist/App-JQ622M66.js +4431 -0
  4. package/dist/App-JQ622M66.js.map +1 -0
  5. package/dist/agent-store/architect.md +32 -0
  6. package/dist/agent-store/debugger.md +32 -0
  7. package/dist/agent-store/developer.md +29 -0
  8. package/dist/agent-store/documenter.md +30 -0
  9. package/dist/agent-store/researcher.md +31 -0
  10. package/dist/agent-store/reviewer.md +28 -0
  11. package/dist/agent-store/supervisor.md +37 -0
  12. package/dist/agent-store/tester.md +30 -0
  13. package/dist/api-key-fallback-RJLPM3KH.js +11 -0
  14. package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-RJLPM3KH.js.map} +1 -1
  15. package/dist/auth-status-JQJOKUPF.js +13 -0
  16. package/dist/auth-status-JQJOKUPF.js.map +1 -0
  17. package/dist/{chunk-RWCNNAL7.js → chunk-2KMA5RBC.js} +25 -48
  18. package/dist/chunk-2KMA5RBC.js.map +1 -0
  19. package/dist/{chunk-CYQNBB25.js → chunk-2Y7TR6BS.js} +28 -5
  20. package/dist/chunk-2Y7TR6BS.js.map +1 -0
  21. package/dist/{chunk-DAHGLHNR.js → chunk-2ZYK5IJG.js} +6 -141
  22. package/dist/chunk-2ZYK5IJG.js.map +1 -0
  23. package/dist/chunk-36RXCZOV.js +88 -0
  24. package/dist/chunk-36RXCZOV.js.map +1 -0
  25. package/dist/{chunk-DMBPX3RG.js → chunk-7EBLXPL4.js} +9 -9
  26. package/dist/{chunk-DMBPX3RG.js.map → chunk-7EBLXPL4.js.map} +1 -1
  27. package/dist/chunk-BIMQL4AG.js +186 -0
  28. package/dist/chunk-BIMQL4AG.js.map +1 -0
  29. package/dist/{chunk-NBR3GHMT.js → chunk-D275MCIH.js} +39 -7
  30. package/dist/chunk-D275MCIH.js.map +1 -0
  31. package/dist/{chunk-Y5XVD2CD.js → chunk-FFS4T7BZ.js} +109 -82
  32. package/dist/chunk-FFS4T7BZ.js.map +1 -0
  33. package/dist/{chunk-CARHU3DO.js → chunk-GXAJGP2T.js} +64 -16
  34. package/dist/chunk-GXAJGP2T.js.map +1 -0
  35. package/dist/{chunk-I5PZ4JTS.js → chunk-HESQLCLU.js} +4 -4
  36. package/dist/{chunk-I5PZ4JTS.js.map → chunk-HESQLCLU.js.map} +1 -1
  37. package/dist/{chunk-JAXXTYID.js → chunk-IR5HLBMH.js} +2 -2
  38. package/dist/{chunk-JAXXTYID.js.map → chunk-IR5HLBMH.js.map} +1 -1
  39. package/dist/{chunk-MFBHNWGV.js → chunk-K2FCMRXH.js} +11 -19
  40. package/dist/chunk-K2FCMRXH.js.map +1 -0
  41. package/dist/{chunk-H66O5Z2V.js → chunk-KIC7UI5U.js} +41 -6
  42. package/dist/chunk-KIC7UI5U.js.map +1 -0
  43. package/dist/{chunk-MXZSI3AY.js → chunk-KMOAJRDE.js} +42 -10
  44. package/dist/chunk-KMOAJRDE.js.map +1 -0
  45. package/dist/chunk-LQBALETG.js +71 -0
  46. package/dist/chunk-LQBALETG.js.map +1 -0
  47. package/dist/chunk-M3FPQSRU.js +12 -0
  48. package/dist/chunk-M3FPQSRU.js.map +1 -0
  49. package/dist/chunk-NQEUK763.js +26 -0
  50. package/dist/chunk-NQEUK763.js.map +1 -0
  51. package/dist/chunk-OPWAFS6Y.js +38 -0
  52. package/dist/chunk-OPWAFS6Y.js.map +1 -0
  53. package/dist/{chunk-6PDJ45T4.js → chunk-PS4WEFW6.js} +50 -25
  54. package/dist/chunk-PS4WEFW6.js.map +1 -0
  55. package/dist/{chunk-HMJRPNPZ.js → chunk-QK7TKNHV.js} +93 -21
  56. package/dist/chunk-QK7TKNHV.js.map +1 -0
  57. package/dist/{chunk-LSOYPSAT.js → chunk-RADJSEG5.js} +4 -4
  58. package/dist/chunk-RADJSEG5.js.map +1 -0
  59. package/dist/{chunk-4IJD72YB.js → chunk-SNWPI6XJ.js} +7 -7
  60. package/dist/chunk-SNWPI6XJ.js.map +1 -0
  61. package/dist/{chunk-TEVZS4FA.js → chunk-UM7MSLOV.js} +16 -9
  62. package/dist/chunk-UM7MSLOV.js.map +1 -0
  63. package/dist/chunk-VNZ3YTQD.js +232 -0
  64. package/dist/chunk-VNZ3YTQD.js.map +1 -0
  65. package/dist/{chunk-IYW62KKR.js → chunk-WXIN65UG.js} +66 -23
  66. package/dist/chunk-WXIN65UG.js.map +1 -0
  67. package/dist/chunk-XEXWX7C7.js +241 -0
  68. package/dist/chunk-XEXWX7C7.js.map +1 -0
  69. package/dist/{chunk-CGEV3ARR.js → chunk-YCCYXDW7.js} +3 -3
  70. package/dist/chunk-YCCYXDW7.js.map +1 -0
  71. package/dist/chunk-YPQ2MLAV.js +140 -0
  72. package/dist/chunk-YPQ2MLAV.js.map +1 -0
  73. package/dist/chunk-ZCOVMVK4.js +26 -0
  74. package/dist/chunk-ZCOVMVK4.js.map +1 -0
  75. package/dist/{claude-login-5WELXPKT.js → claude-login-AIFIWTYF.js} +9 -9
  76. package/dist/{claude-login-5WELXPKT.js.map → claude-login-AIFIWTYF.js.map} +1 -1
  77. package/dist/cli.js +370 -171
  78. package/dist/cli.js.map +1 -1
  79. package/dist/{codex-login-GZIFXUWD.js → codex-login-LW5X7GAM.js} +10 -10
  80. package/dist/codex-login-LW5X7GAM.js.map +1 -0
  81. package/dist/config-store-NF56VHFU.js +7 -0
  82. package/dist/{config-store-W6FBCQAQ.js.map → config-store-NF56VHFU.js.map} +1 -1
  83. package/dist/conversation-store-7GRDQZD2.js +4 -0
  84. package/dist/conversation-store-7GRDQZD2.js.map +1 -0
  85. package/dist/detect-providers-QICJ5U3R.js +4 -0
  86. package/dist/detect-providers-QICJ5U3R.js.map +1 -0
  87. package/dist/executor-FTABX2AW.js +4 -0
  88. package/dist/{executor-6RIKIGXK.js.map → executor-FTABX2AW.js.map} +1 -1
  89. package/dist/first-run-ADROZVYF.js +230 -0
  90. package/dist/first-run-ADROZVYF.js.map +1 -0
  91. package/dist/{gemini-login-AZGL3CE7.js → gemini-login-TST454MX.js} +9 -9
  92. package/dist/{gemini-login-AZGL3CE7.js.map → gemini-login-TST454MX.js.map} +1 -1
  93. package/dist/index.d.ts +46 -70
  94. package/dist/index.js +79 -468
  95. package/dist/index.js.map +1 -1
  96. package/dist/input-history-BEICE7PT.js +57 -0
  97. package/dist/input-history-BEICE7PT.js.map +1 -0
  98. package/dist/kimi-adapter-7FYOAKOI.js +6 -0
  99. package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-7FYOAKOI.js.map} +1 -1
  100. package/dist/{kimi-login-6LUWB7P6.js → kimi-login-3IGVOBJI.js} +9 -9
  101. package/dist/{kimi-login-6LUWB7P6.js.map → kimi-login-3IGVOBJI.js.map} +1 -1
  102. package/dist/logger-KGHUQ4VE.js +3 -0
  103. package/dist/logger-KGHUQ4VE.js.map +1 -0
  104. package/dist/model-discovery-AAJDHRFO.js +6 -0
  105. package/dist/model-discovery-AAJDHRFO.js.map +1 -0
  106. package/dist/native-cli-adapters-CLONTZOA.js +8 -0
  107. package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-CLONTZOA.js.map} +1 -1
  108. package/dist/ollama-adapter-2N5OQIEV.js +5 -0
  109. package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-2N5OQIEV.js.map} +1 -1
  110. package/dist/pathResolver-UVAB2FCW.js +3 -0
  111. package/dist/pathResolver-UVAB2FCW.js.map +1 -0
  112. package/dist/profile-loader-EMLV4J7S.js +162 -0
  113. package/dist/profile-loader-EMLV4J7S.js.map +1 -0
  114. package/dist/registry-LRURZVUL.js +5 -0
  115. package/dist/{registry-AZ2LOHHJ.js.map → registry-LRURZVUL.js.map} +1 -1
  116. package/dist/registry-MVNSXCEF.js +6 -0
  117. package/dist/{registry-H7B3AHPQ.js.map → registry-MVNSXCEF.js.map} +1 -1
  118. package/dist/server-manager-THGZBBZB.js +5 -0
  119. package/dist/{server-manager-PTGBHCLS.js.map → server-manager-THGZBBZB.js.map} +1 -1
  120. package/dist/session-manager-X3DXT53M.js +12 -0
  121. package/dist/{session-manager-XOMDMC77.js.map → session-manager-X3DXT53M.js.map} +1 -1
  122. package/dist/skills/built-in/code-review/SKILL.md +85 -0
  123. package/dist/skills/built-in/commit/SKILL.md +83 -0
  124. package/dist/skills/built-in/debug/SKILL.md +119 -0
  125. package/dist/skills/built-in/plan/SKILL.md +123 -0
  126. package/dist/skills/built-in/refactor/SKILL.md +132 -0
  127. package/dist/skills/built-in/test/SKILL.md +128 -0
  128. package/dist/sqlite-store-7OECRTXM.js +5 -0
  129. package/dist/sqlite-store-7OECRTXM.js.map +1 -0
  130. package/dist/team-manager-2VSMALAA.js +11 -0
  131. package/dist/{team-manager-HC4XGCFY.js.map → team-manager-2VSMALAA.js.map} +1 -1
  132. package/dist/team-state-HZNVMQHT.js +3 -0
  133. package/dist/team-state-HZNVMQHT.js.map +1 -0
  134. package/dist/tmux-manager-57QCUVHU.js +6 -0
  135. package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-57QCUVHU.js.map} +1 -1
  136. package/dist/tools-KWFSYT56.js +6 -0
  137. package/dist/{tools-TSMXMHIF.js.map → tools-KWFSYT56.js.map} +1 -1
  138. package/package.json +11 -11
  139. package/dist/App-FKRSMFMB.js +0 -2789
  140. package/dist/App-FKRSMFMB.js.map +0 -1
  141. package/dist/api-key-fallback-YQQBOQIL.js +0 -11
  142. package/dist/chunk-4IJD72YB.js.map +0 -1
  143. package/dist/chunk-6PDJ45T4.js.map +0 -1
  144. package/dist/chunk-CARHU3DO.js.map +0 -1
  145. package/dist/chunk-CGEV3ARR.js.map +0 -1
  146. package/dist/chunk-CS5X3BWX.js +0 -27
  147. package/dist/chunk-CS5X3BWX.js.map +0 -1
  148. package/dist/chunk-CYQNBB25.js.map +0 -1
  149. package/dist/chunk-DAHGLHNR.js.map +0 -1
  150. package/dist/chunk-H66O5Z2V.js.map +0 -1
  151. package/dist/chunk-HMJRPNPZ.js.map +0 -1
  152. package/dist/chunk-IYW62KKR.js.map +0 -1
  153. package/dist/chunk-LSOYPSAT.js.map +0 -1
  154. package/dist/chunk-MFBHNWGV.js.map +0 -1
  155. package/dist/chunk-MXZSI3AY.js.map +0 -1
  156. package/dist/chunk-NBR3GHMT.js.map +0 -1
  157. package/dist/chunk-RWCNNAL7.js.map +0 -1
  158. package/dist/chunk-TEVZS4FA.js.map +0 -1
  159. package/dist/chunk-UY2SYSEZ.js +0 -211
  160. package/dist/chunk-UY2SYSEZ.js.map +0 -1
  161. package/dist/chunk-WAHVZH7V.js +0 -260
  162. package/dist/chunk-WAHVZH7V.js.map +0 -1
  163. package/dist/chunk-WPP3PEDE.js +0 -234
  164. package/dist/chunk-WPP3PEDE.js.map +0 -1
  165. package/dist/chunk-Y5XVD2CD.js.map +0 -1
  166. package/dist/claude-adapter-QMLFMSP3.js +0 -6
  167. package/dist/claude-adapter-QMLFMSP3.js.map +0 -1
  168. package/dist/codex-login-GZIFXUWD.js.map +0 -1
  169. package/dist/config-store-W6FBCQAQ.js +0 -6
  170. package/dist/executor-6RIKIGXK.js +0 -4
  171. package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
  172. package/dist/gemini-adapter-6JIHZ7WI.js.map +0 -1
  173. package/dist/kimi-adapter-JN4HFFHU.js +0 -6
  174. package/dist/native-cli-adapters-OLW3XX57.js +0 -6
  175. package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
  176. package/dist/openai-adapter-XU46EN7B.js +0 -6
  177. package/dist/openai-adapter-XU46EN7B.js.map +0 -1
  178. package/dist/registry-AZ2LOHHJ.js +0 -6
  179. package/dist/registry-H7B3AHPQ.js +0 -5
  180. package/dist/server-manager-PTGBHCLS.js +0 -5
  181. package/dist/session-manager-XOMDMC77.js +0 -12
  182. package/dist/team-manager-HC4XGCFY.js +0 -11
  183. package/dist/tmux-manager-GPYZ3WQH.js +0 -6
  184. package/dist/tools-TSMXMHIF.js +0 -6
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storage/migrations/001-initial.ts","../src/storage/sqlite-store.ts"],"names":[],"mappings":"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","file":"chunk-BIMQL4AG.js","sourcesContent":["/**\n * Initial database migration — PRD section 17.1\n * Creates all core tables and indexes for AemeathCLI persistence.\n *\n * SAFETY: All DDL is static SQL. No user input is interpolated.\n */\n\nimport type Database from \"better-sqlite3\";\n\nconst MIGRATION_ID = \"001-initial\";\n\nconst CREATE_CONVERSATIONS = `\nCREATE TABLE IF NOT EXISTS conversations (\n id TEXT PRIMARY KEY,\n project_root TEXT NOT NULL,\n default_model TEXT,\n created_at TEXT DEFAULT (datetime('now')),\n updated_at TEXT DEFAULT (datetime('now')),\n metadata TEXT DEFAULT '{}'\n)`;\n\nconst CREATE_MESSAGES = `\nCREATE TABLE IF NOT EXISTS messages (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,\n role TEXT NOT NULL,\n model TEXT,\n provider TEXT,\n content TEXT NOT NULL,\n tool_calls TEXT,\n token_usage TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n)`;\n\nconst CREATE_FILE_CONTEXT = `\nCREATE TABLE IF NOT EXISTS file_context (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,\n file_path TEXT NOT NULL,\n content_hash TEXT,\n token_count INTEGER,\n added_at TEXT DEFAULT (datetime('now'))\n)`;\n\nconst CREATE_COST_TRACKING = `\nCREATE TABLE IF NOT EXISTS cost_tracking (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,\n provider TEXT NOT NULL,\n model TEXT NOT NULL,\n role TEXT,\n input_tokens INTEGER,\n output_tokens INTEGER,\n cost_usd REAL,\n created_at TEXT DEFAULT (datetime('now'))\n)`;\n\nconst CREATE_TEAMS = `\nCREATE TABLE IF NOT EXISTS teams (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n status TEXT DEFAULT 'active',\n config TEXT,\n created_at TEXT DEFAULT (datetime('now'))\n)`;\n\nconst CREATE_INDEXES = [\n \"CREATE INDEX IF NOT EXISTS idx_messages_conversation ON messages(conversation_id)\",\n \"CREATE INDEX IF NOT EXISTS idx_cost_conversation ON cost_tracking(conversation_id)\",\n \"CREATE INDEX IF NOT EXISTS idx_cost_provider ON cost_tracking(provider)\",\n \"CREATE INDEX IF NOT EXISTS idx_file_context_conversation ON file_context(conversation_id)\",\n] as const;\n\nconst DROP_INDEXES = [\n \"DROP INDEX IF EXISTS idx_file_context_conversation\",\n \"DROP INDEX IF EXISTS idx_cost_provider\",\n \"DROP INDEX IF EXISTS idx_cost_conversation\",\n \"DROP INDEX IF EXISTS idx_messages_conversation\",\n] as const;\n\nconst DROP_TABLES = [\n \"DROP TABLE IF EXISTS cost_tracking\",\n \"DROP TABLE IF EXISTS file_context\",\n \"DROP TABLE IF EXISTS messages\",\n \"DROP TABLE IF EXISTS teams\",\n \"DROP TABLE IF EXISTS conversations\",\n] as const;\n\nexport function up(db: Database.Database): void {\n db.transaction(() => {\n db.exec(CREATE_CONVERSATIONS);\n db.exec(CREATE_MESSAGES);\n db.exec(CREATE_FILE_CONTEXT);\n db.exec(CREATE_COST_TRACKING);\n db.exec(CREATE_TEAMS);\n\n for (const sql of CREATE_INDEXES) {\n db.exec(sql);\n }\n })();\n}\n\nexport function down(db: Database.Database): void {\n db.transaction(() => {\n for (const sql of DROP_INDEXES) {\n db.exec(sql);\n }\n for (const sql of DROP_TABLES) {\n db.exec(sql);\n }\n })();\n}\n\nexport { MIGRATION_ID };\n","/**\n * SQLite database store — PRD section 17.1\n * Uses better-sqlite3 with WAL mode for concurrent reads.\n * Runs migrations on startup. Provides raw query interface.\n */\n\nimport Database from \"better-sqlite3\";\nimport { chmodSync } from \"node:fs\";\nimport { logger } from \"../utils/logger.js\";\nimport {\n getDatabasePath,\n getDatabaseDir,\n ensureDirectory,\n} from \"../utils/pathResolver.js\";\nimport { up as initialMigrationUp } from \"./migrations/001-initial.js\";\n\nconst MIGRATIONS_TABLE_DDL = `\nCREATE TABLE IF NOT EXISTS _migrations (\n id TEXT PRIMARY KEY,\n applied_at TEXT DEFAULT (datetime('now'))\n)`;\n\ninterface IMigration {\n readonly id: string;\n readonly up: (db: Database.Database) => void;\n}\n\nconst MIGRATIONS: readonly IMigration[] = [\n { id: \"001-initial\", up: initialMigrationUp },\n] as const;\n\nexport class SqliteStore {\n private db: Database.Database | undefined;\n private closed = false;\n\n get database(): Database.Database {\n if (this.closed || !this.db) {\n throw new Error(\"SqliteStore is closed or not initialized\");\n }\n return this.db;\n }\n\n open(dbPath?: string): void {\n if (this.db) {\n return;\n }\n\n const resolvedPath = dbPath ?? getDatabasePath();\n ensureDirectory(getDatabaseDir());\n\n logger.info({ path: resolvedPath }, \"Opening SQLite database\");\n\n this.db = new Database(resolvedPath);\n\n // WAL mode for concurrent reads (PRD section 17.1)\n this.db.pragma(\"journal_mode = WAL\");\n this.db.pragma(\"busy_timeout = 5000\");\n this.db.pragma(\"foreign_keys = ON\");\n this.db.pragma(\"synchronous = NORMAL\");\n\n // Secure file permissions (PRD section 14.1)\n try {\n chmodSync(resolvedPath, 0o600);\n } catch {\n logger.warn(\n { path: resolvedPath },\n \"Could not set database file permissions to 600\",\n );\n }\n\n this.runMigrations();\n this.registerCleanupHandlers();\n }\n\n private runMigrations(): void {\n const db = this.database;\n db.exec(MIGRATIONS_TABLE_DDL);\n\n const appliedStmt = db.prepare(\n \"SELECT id FROM _migrations WHERE id = ?\",\n );\n\n const insertStmt = db.prepare(\n \"INSERT INTO _migrations (id) VALUES (?)\",\n );\n\n for (const migration of MIGRATIONS) {\n const existing = appliedStmt.get(migration.id) as\n | { id: string }\n | undefined;\n\n if (!existing) {\n logger.info({ migrationId: migration.id }, \"Running migration\");\n db.transaction(() => {\n migration.up(db);\n insertStmt.run(migration.id);\n })();\n logger.info({ migrationId: migration.id }, \"Migration applied\");\n }\n }\n }\n\n prepare(sql: string): Database.Statement {\n return this.database.prepare(sql);\n }\n\n run(sql: string, ...params: readonly unknown[]): Database.RunResult {\n return this.database.prepare(sql).run(...params);\n }\n\n get(sql: string, ...params: unknown[]): unknown {\n return this.database.prepare(sql).get(...params);\n }\n\n all(sql: string, ...params: unknown[]): unknown[] {\n return this.database.prepare(sql).all(...params);\n }\n\n transaction<T>(fn: () => T): T {\n return this.database.transaction(fn)();\n }\n\n close(): void {\n if (this.closed || !this.db) {\n return;\n }\n\n logger.info(\"Closing SQLite database\");\n this.closed = true;\n\n try {\n this.db.pragma(\"wal_checkpoint(TRUNCATE)\");\n this.db.close();\n } catch (error: unknown) {\n const message =\n error instanceof Error ? error.message : String(error);\n logger.error({ error: message }, \"Error closing database\");\n }\n\n this.db = undefined;\n }\n\n private registerCleanupHandlers(): void {\n const cleanup = (): void => {\n this.close();\n };\n\n process.on(\"exit\", cleanup);\n process.on(\"SIGINT\", () => {\n cleanup();\n process.exit(130);\n });\n process.on(\"SIGTERM\", () => {\n cleanup();\n process.exit(143);\n });\n }\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { homedir } from 'os';
2
- import { join } from 'path';
1
+ import { homedir, tmpdir } from 'os';
2
+ import { join, dirname } from 'path';
3
3
  import { existsSync, mkdirSync } from 'fs';
4
4
 
5
5
  // src/utils/pathResolver.ts
@@ -25,9 +25,15 @@ function getLogDir() {
25
25
  function getCredentialsPath() {
26
26
  return join(getAemeathHome(), "credentials.enc");
27
27
  }
28
+ function getMCPConfigPath() {
29
+ return join(getAemeathHome(), "mcp.json");
30
+ }
28
31
  function getUserSkillsDir() {
29
32
  return join(getAemeathHome(), "skills");
30
33
  }
34
+ function getUniversalUserSkillsDir() {
35
+ return join(homedir(), ".agents", "skills");
36
+ }
31
37
  function getTeamsDir() {
32
38
  return join(getAemeathHome(), "teams");
33
39
  }
@@ -43,9 +49,19 @@ function getProjectConfigPath(projectRoot) {
43
49
  function getProjectSkillsDir(projectRoot) {
44
50
  return join(getProjectConfigDir(projectRoot), "skills");
45
51
  }
52
+ function getUniversalProjectSkillsDir(projectRoot) {
53
+ return join(projectRoot, ".agents", "skills");
54
+ }
55
+ function getProjectMCPConfigPath(projectRoot) {
56
+ return join(getProjectConfigDir(projectRoot), "mcp.json");
57
+ }
58
+ function getProjectAgentsPath(projectRoot) {
59
+ return join(getProjectConfigDir(projectRoot), "AGENTS.md");
60
+ }
46
61
  function getIPCSocketDir() {
47
- const tmpDir = process.env["TMPDIR"] ?? "/tmp";
48
- return join(tmpDir, `aemeathcli-${process.getuid?.() ?? "user"}`);
62
+ const tmp = process.env["TMPDIR"] ?? tmpdir();
63
+ const uid = process.platform === "win32" ? process.env["USERNAME"] ?? "user" : String(process.getuid?.() ?? "user");
64
+ return join(tmp, `aemeathcli-${uid}`);
49
65
  }
50
66
  function getIPCSocketPath(sessionId) {
51
67
  return join(getIPCSocketDir(), `${sessionId}.sock`);
@@ -66,7 +82,23 @@ function initializeDirectories() {
66
82
  ensureDirectory(getTeamsDir());
67
83
  ensureDirectory(getTasksDir());
68
84
  }
85
+ function findProjectRoot(startDir) {
86
+ let currentDir = startDir ?? process.cwd();
87
+ while (currentDir !== dirname(currentDir)) {
88
+ if (existsSync(join(currentDir, ".git"))) {
89
+ return currentDir;
90
+ }
91
+ if (existsSync(join(currentDir, ".aemeathcli"))) {
92
+ return currentDir;
93
+ }
94
+ if (existsSync(join(currentDir, "package.json"))) {
95
+ return currentDir;
96
+ }
97
+ currentDir = dirname(currentDir);
98
+ }
99
+ return process.cwd();
100
+ }
69
101
 
70
- export { ensureDirectory, ensureSecureDirectory, getAemeathHome, getConfigPath, getCredentialsPath, getDatabaseDir, getDatabasePath, getIPCSocketDir, getIPCSocketPath, getProjectConfigPath, getProjectSkillsDir, getTasksDir, getTeamsDir, getUserSkillsDir, initializeDirectories };
71
- //# sourceMappingURL=chunk-NBR3GHMT.js.map
72
- //# sourceMappingURL=chunk-NBR3GHMT.js.map
102
+ export { ensureDirectory, ensureSecureDirectory, findProjectRoot, getAemeathHome, getConfigDir, getConfigPath, getCredentialsPath, getDatabaseDir, getDatabasePath, getIPCSocketDir, getIPCSocketPath, getLogDir, getMCPConfigPath, getProjectAgentsPath, getProjectConfigDir, getProjectConfigPath, getProjectMCPConfigPath, getProjectSkillsDir, getTasksDir, getTeamsDir, getUniversalProjectSkillsDir, getUniversalUserSkillsDir, getUserSkillsDir, initializeDirectories };
103
+ //# sourceMappingURL=chunk-D275MCIH.js.map
104
+ //# sourceMappingURL=chunk-D275MCIH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/pathResolver.ts"],"names":[],"mappings":";;;;;AAWA,IAAM,eAAA,GAAkB,IAAA,CAAK,OAAA,EAAQ,EAAG,aAAa,CAAA;AAE9C,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAA,IAAK,eAAA;AAC3C;AAEO,SAAS,YAAA,GAAuB;AACrC,EAAA,OAAO,cAAA,EAAe;AACxB;AAEO,SAAS,aAAA,GAAwB;AACtC,EAAA,OAAO,IAAA,CAAK,YAAA,EAAa,EAAG,aAAa,CAAA;AAC3C;AAEO,SAAS,cAAA,GAAyB;AACvC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,IAAI,CAAA;AACpC;AAEO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,eAAe,CAAA;AAC/C;AAEO,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,MAAM,CAAA;AACtC;AAEO,SAAS,kBAAA,GAA6B;AAC3C,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,iBAAiB,CAAA;AACjD;AAEO,SAAS,gBAAA,GAA2B;AACzC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,UAAU,CAAA;AAC1C;AAEO,SAAS,gBAAA,GAA2B;AACzC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,QAAQ,CAAA;AACxC;AAGO,SAAS,yBAAA,GAAoC;AAClD,EAAA,OAAO,IAAA,CAAK,OAAA,EAAQ,EAAG,SAAA,EAAW,QAAQ,CAAA;AAC5C;AAEO,SAAS,WAAA,GAAsB;AACpC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,OAAO,CAAA;AACvC;AAEO,SAAS,WAAA,GAAsB;AACpC,EAAA,OAAO,IAAA,CAAK,cAAA,EAAe,EAAG,OAAO,CAAA;AACvC;AAIO,SAAS,oBAAoB,WAAA,EAA6B;AAC/D,EAAA,OAAO,IAAA,CAAK,aAAa,aAAa,CAAA;AACxC;AAEO,SAAS,qBAAqB,WAAA,EAA6B;AAChE,EAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,WAAW,CAAA,EAAG,aAAa,CAAA;AAC7D;AAEO,SAAS,oBAAoB,WAAA,EAA6B;AAC/D,EAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,WAAW,CAAA,EAAG,QAAQ,CAAA;AACxD;AAGO,SAAS,6BAA6B,WAAA,EAA6B;AACxE,EAAA,OAAO,IAAA,CAAK,WAAA,EAAa,SAAA,EAAW,QAAQ,CAAA;AAC9C;AAEO,SAAS,wBAAwB,WAAA,EAA6B;AACnE,EAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,WAAW,CAAA,EAAG,UAAU,CAAA;AAC1D;AAEO,SAAS,qBAAqB,WAAA,EAA6B;AAChE,EAAA,OAAO,IAAA,CAAK,mBAAA,CAAoB,WAAW,CAAA,EAAG,WAAW,CAAA;AAC3D;AAIO,SAAS,eAAA,GAA0B;AACxC,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,KAAK,MAAA,EAAO;AAC5C,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,QAAA,KAAa,OAAA,GAC5B,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,IAAK,MAAA,GAC5B,MAAA,CAAO,OAAA,CAAQ,MAAA,QAAc,MAAM,CAAA;AACvC,EAAA,OAAO,IAAA,CAAK,GAAA,EAAK,CAAA,WAAA,EAAc,GAAG,CAAA,CAAE,CAAA;AACtC;AAEO,SAAS,iBAAiB,SAAA,EAA2B;AAC1D,EAAA,OAAO,IAAA,CAAK,eAAA,EAAgB,EAAG,CAAA,EAAG,SAAS,CAAA,KAAA,CAAO,CAAA;AACpD;AAIO,SAAS,eAAA,CAAgB,SAAiB,IAAA,EAAqB;AACpE,EAAA,IAAI,CAAC,UAAA,CAAW,OAAO,CAAA,EAAG;AACxB,IAAA,SAAA,CAAU,SAAS,EAAE,SAAA,EAAW,MAAM,IAAA,EAAM,IAAA,IAAQ,KAAO,CAAA;AAAA,EAC7D;AACF;AAEO,SAAS,sBAAsB,OAAA,EAAuB;AAC3D,EAAA,eAAA,CAAgB,SAAS,GAAK,CAAA;AAChC;AAEO,SAAS,qBAAA,GAA8B;AAC5C,EAAA,qBAAA,CAAsB,gBAAgB,CAAA;AACtC,EAAA,eAAA,CAAgB,gBAAgB,CAAA;AAChC,EAAA,qBAAA,CAAsB,WAAW,CAAA;AACjC,EAAA,eAAA,CAAgB,kBAAkB,CAAA;AAClC,EAAA,eAAA,CAAgB,aAAa,CAAA;AAC7B,EAAA,eAAA,CAAgB,aAAa,CAAA;AAC/B;AAIO,SAAS,gBAAgB,QAAA,EAA2B;AACzD,EAAA,IAAI,UAAA,GAAa,QAAA,IAAY,OAAA,CAAQ,GAAA,EAAI;AAEzC,EAAA,OAAO,UAAA,KAAe,OAAA,CAAQ,UAAU,CAAA,EAAG;AACzC,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,UAAA,EAAY,MAAM,CAAC,CAAA,EAAG;AACxC,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,UAAA,EAAY,aAAa,CAAC,CAAA,EAAG;AAC/C,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,IAAI,UAAA,CAAW,IAAA,CAAK,UAAA,EAAY,cAAc,CAAC,CAAA,EAAG;AAChD,MAAA,OAAO,UAAA;AAAA,IACT;AACA,IAAA,UAAA,GAAa,QAAQ,UAAU,CAAA;AAAA,EACjC;AAGA,EAAA,OAAO,QAAQ,GAAA,EAAI;AACrB","file":"chunk-D275MCIH.js","sourcesContent":["/**\n * Safe path handling per PRD section 15.7 item 5\n * NO hardcoded paths — use path.join(), os.homedir(), XDG Base Directory\n */\n\nimport { homedir, tmpdir } from \"node:os\";\nimport { join, dirname } from \"node:path\";\nimport { existsSync, mkdirSync } from \"node:fs\";\n\n// ── XDG-inspired directory layout ────────────────────────────────────────\n\nconst AEMEATHCLI_HOME = join(homedir(), \".aemeathcli\");\n\nexport function getAemeathHome(): string {\n return process.env[\"AEMEATHCLI_HOME\"] ?? AEMEATHCLI_HOME;\n}\n\nexport function getConfigDir(): string {\n return getAemeathHome();\n}\n\nexport function getConfigPath(): string {\n return join(getConfigDir(), \"config.json\");\n}\n\nexport function getDatabaseDir(): string {\n return join(getAemeathHome(), \"db\");\n}\n\nexport function getDatabasePath(): string {\n return join(getDatabaseDir(), \"aemeathcli.db\");\n}\n\nexport function getLogDir(): string {\n return join(getAemeathHome(), \"logs\");\n}\n\nexport function getCredentialsPath(): string {\n return join(getAemeathHome(), \"credentials.enc\");\n}\n\nexport function getMCPConfigPath(): string {\n return join(getAemeathHome(), \"mcp.json\");\n}\n\nexport function getUserSkillsDir(): string {\n return join(getAemeathHome(), \"skills\");\n}\n\n/** Universal user-level skills directory: ~/.agents/skills/ */\nexport function getUniversalUserSkillsDir(): string {\n return join(homedir(), \".agents\", \"skills\");\n}\n\nexport function getTeamsDir(): string {\n return join(getAemeathHome(), \"teams\");\n}\n\nexport function getTasksDir(): string {\n return join(getAemeathHome(), \"tasks\");\n}\n\n// ── Project-level paths ──────────────────────────────────────────────────\n\nexport function getProjectConfigDir(projectRoot: string): string {\n return join(projectRoot, \".aemeathcli\");\n}\n\nexport function getProjectConfigPath(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"config.json\");\n}\n\nexport function getProjectSkillsDir(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"skills\");\n}\n\n/** Universal project-level skills directory: <projectRoot>/.agents/skills/ */\nexport function getUniversalProjectSkillsDir(projectRoot: string): string {\n return join(projectRoot, \".agents\", \"skills\");\n}\n\nexport function getProjectMCPConfigPath(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"mcp.json\");\n}\n\nexport function getProjectAgentsPath(projectRoot: string): string {\n return join(getProjectConfigDir(projectRoot), \"AGENTS.md\");\n}\n\n// ── Socket paths (PRD section 14.5) ──────────────────────────────────────\n\nexport function getIPCSocketDir(): string {\n const tmp = process.env[\"TMPDIR\"] ?? tmpdir();\n const uid = process.platform === \"win32\"\n ? (process.env[\"USERNAME\"] ?? \"user\")\n : String(process.getuid?.() ?? \"user\");\n return join(tmp, `aemeathcli-${uid}`);\n}\n\nexport function getIPCSocketPath(sessionId: string): string {\n return join(getIPCSocketDir(), `${sessionId}.sock`);\n}\n\n// ── Directory Initialization ─────────────────────────────────────────────\n\nexport function ensureDirectory(dirPath: string, mode?: number): void {\n if (!existsSync(dirPath)) {\n mkdirSync(dirPath, { recursive: true, mode: mode ?? 0o755 });\n }\n}\n\nexport function ensureSecureDirectory(dirPath: string): void {\n ensureDirectory(dirPath, 0o700);\n}\n\nexport function initializeDirectories(): void {\n ensureSecureDirectory(getAemeathHome());\n ensureDirectory(getDatabaseDir());\n ensureSecureDirectory(getLogDir());\n ensureDirectory(getUserSkillsDir());\n ensureDirectory(getTeamsDir());\n ensureDirectory(getTasksDir());\n}\n\n// ── Project Root Detection ───────────────────────────────────────────────\n\nexport function findProjectRoot(startDir?: string): string {\n let currentDir = startDir ?? process.cwd();\n\n while (currentDir !== dirname(currentDir)) {\n if (existsSync(join(currentDir, \".git\"))) {\n return currentDir;\n }\n if (existsSync(join(currentDir, \".aemeathcli\"))) {\n return currentDir;\n }\n if (existsSync(join(currentDir, \"package.json\"))) {\n return currentDir;\n }\n currentDir = dirname(currentDir);\n }\n\n // Fallback to cwd\n return process.cwd();\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { validatePath, isCommandBlocked, redactSecrets } from './chunk-CS5X3BWX.js';
1
+ import { validatePath, isPathAllowed, isCommandBlocked, redactSecrets } from './chunk-OPWAFS6Y.js';
2
2
  import { FileNotFoundError, ExecutionTimeoutError } from './chunk-ZGOHARPV.js';
3
- import { logger } from './chunk-JAXXTYID.js';
3
+ import { logger } from './chunk-IR5HLBMH.js';
4
4
  import { stat, readFile, mkdir, writeFile } from 'fs/promises';
5
5
  import { dirname, resolve, extname } from 'path';
6
6
  import fg from 'fast-glob';
@@ -72,7 +72,7 @@ var ToolRegistry = class {
72
72
  isError: true
73
73
  };
74
74
  }
75
- if (tool.requiresApproval(context.permissionMode, call.arguments)) {
75
+ if (tool.requiresApproval(context, call.arguments)) {
76
76
  return {
77
77
  toolCallId: call.id,
78
78
  name: call.name,
@@ -82,7 +82,7 @@ var ToolRegistry = class {
82
82
  }
83
83
  try {
84
84
  logger.debug({ toolName: call.name, args: redactToolArgs(call.arguments) }, "Executing tool");
85
- const result = await tool.execute(call.arguments);
85
+ const result = await tool.execute(call.arguments, context);
86
86
  return {
87
87
  ...result,
88
88
  toolCallId: call.id,
@@ -168,10 +168,6 @@ function formatWithLineNumbers(content, offset, limit) {
168
168
  return `${lineNum} ${truncated}`;
169
169
  }).join("\n");
170
170
  }
171
- var projectRoot = process.cwd();
172
- function setReadProjectRoot(root) {
173
- projectRoot = root;
174
- }
175
171
  function createReadTool() {
176
172
  return {
177
173
  definition: {
@@ -201,10 +197,10 @@ function createReadTool() {
201
197
  ]
202
198
  },
203
199
  category: "file",
204
- requiresApproval: (_mode, _args) => {
200
+ requiresApproval: (_context, _args) => {
205
201
  return false;
206
202
  },
207
- execute: async (args) => {
203
+ execute: async (args, context) => {
208
204
  const filePath = args["file_path"];
209
205
  if (typeof filePath !== "string" || filePath.length === 0) {
210
206
  return {
@@ -214,6 +210,8 @@ function createReadTool() {
214
210
  isError: true
215
211
  };
216
212
  }
213
+ const projectRoot = context.projectRoot;
214
+ const allowedPaths = context.allowedPaths;
217
215
  let resolvedPath;
218
216
  try {
219
217
  resolvedPath = validatePath(filePath, projectRoot);
@@ -221,6 +219,14 @@ function createReadTool() {
221
219
  const msg = err instanceof Error ? err.message : "Path validation failed";
222
220
  return { toolCallId: "", name: "read", content: msg, isError: true };
223
221
  }
222
+ if (!isPathAllowed(resolvedPath, allowedPaths, projectRoot)) {
223
+ return {
224
+ toolCallId: "",
225
+ name: "read",
226
+ content: `Access denied: ${resolvedPath} is outside the configured allowed paths.`,
227
+ isError: true
228
+ };
229
+ }
224
230
  let fileStat;
225
231
  try {
226
232
  fileStat = await stat(resolvedPath);
@@ -300,10 +306,6 @@ function isConfigFile(filePath) {
300
306
  const base = filePath.split("/").pop() ?? "";
301
307
  return CONFIG_EXTENSIONS.has(ext) || SENSITIVE_FILENAMES.has(base);
302
308
  }
303
- var projectRoot2 = process.cwd();
304
- function setWriteProjectRoot(root) {
305
- projectRoot2 = root;
306
- }
307
309
  function createWriteTool() {
308
310
  return {
309
311
  definition: {
@@ -325,10 +327,10 @@ function createWriteTool() {
325
327
  ]
326
328
  },
327
329
  category: "file",
328
- requiresApproval: (mode, _args) => {
329
- return mode === "strict" || mode === "standard";
330
+ requiresApproval: (context, _args) => {
331
+ return context.permissionMode === "strict" || context.permissionMode === "standard";
330
332
  },
331
- execute: async (args) => {
333
+ execute: async (args, context) => {
332
334
  const filePath = args["file_path"];
333
335
  const content = args["content"];
334
336
  if (typeof filePath !== "string" || filePath.length === 0) {
@@ -347,13 +349,23 @@ function createWriteTool() {
347
349
  isError: true
348
350
  };
349
351
  }
352
+ const projectRoot = context.projectRoot;
353
+ const allowedPaths = context.allowedPaths;
350
354
  let resolvedPath;
351
355
  try {
352
- resolvedPath = validatePath(filePath, projectRoot2);
356
+ resolvedPath = validatePath(filePath, projectRoot);
353
357
  } catch (err) {
354
358
  const msg = err instanceof Error ? err.message : "Path validation failed";
355
359
  return { toolCallId: "", name: "write", content: msg, isError: true };
356
360
  }
361
+ if (!isPathAllowed(resolvedPath, allowedPaths, projectRoot)) {
362
+ return {
363
+ toolCallId: "",
364
+ name: "write",
365
+ content: `Access denied: ${resolvedPath} is outside the configured allowed paths.`,
366
+ isError: true
367
+ };
368
+ }
357
369
  const parentDir = dirname(resolvedPath);
358
370
  try {
359
371
  await mkdir(parentDir, { recursive: true });
@@ -399,10 +411,6 @@ function createWriteTool() {
399
411
  }
400
412
  };
401
413
  }
402
- var projectRoot3 = process.cwd();
403
- function setEditProjectRoot(root) {
404
- projectRoot3 = root;
405
- }
406
414
  function createEditTool() {
407
415
  return {
408
416
  definition: {
@@ -437,10 +445,10 @@ function createEditTool() {
437
445
  ]
438
446
  },
439
447
  category: "file",
440
- requiresApproval: (mode, _args) => {
441
- return mode === "strict" || mode === "standard";
448
+ requiresApproval: (context, _args) => {
449
+ return context.permissionMode === "strict" || context.permissionMode === "standard";
442
450
  },
443
- execute: async (args) => {
451
+ execute: async (args, context) => {
444
452
  const filePath = args["file_path"];
445
453
  const oldString = args["old_string"];
446
454
  const newString = args["new_string"];
@@ -477,13 +485,23 @@ function createEditTool() {
477
485
  isError: true
478
486
  };
479
487
  }
488
+ const projectRoot = context.projectRoot;
489
+ const allowedPaths = context.allowedPaths;
480
490
  let resolvedPath;
481
491
  try {
482
- resolvedPath = validatePath(filePath, projectRoot3);
492
+ resolvedPath = validatePath(filePath, projectRoot);
483
493
  } catch (err) {
484
494
  const msg = err instanceof Error ? err.message : "Path validation failed";
485
495
  return { toolCallId: "", name: "edit", content: msg, isError: true };
486
496
  }
497
+ if (!isPathAllowed(resolvedPath, allowedPaths, projectRoot)) {
498
+ return {
499
+ toolCallId: "",
500
+ name: "edit",
501
+ content: `Access denied: ${resolvedPath} is outside the configured allowed paths.`,
502
+ isError: true
503
+ };
504
+ }
487
505
  try {
488
506
  const fileStat = await stat(resolvedPath);
489
507
  if (!fileStat.isFile()) {
@@ -545,10 +563,6 @@ function createEditTool() {
545
563
  };
546
564
  }
547
565
  var MAX_RESULTS = 1e3;
548
- var projectRoot4 = process.cwd();
549
- function setGlobProjectRoot(root) {
550
- projectRoot4 = root;
551
- }
552
566
  function createGlobTool() {
553
567
  return {
554
568
  definition: {
@@ -570,10 +584,10 @@ function createGlobTool() {
570
584
  ]
571
585
  },
572
586
  category: "search",
573
- requiresApproval: (_mode, _args) => {
587
+ requiresApproval: (_context, _args) => {
574
588
  return false;
575
589
  },
576
- execute: async (args) => {
590
+ execute: async (args, context) => {
577
591
  const pattern = args["pattern"];
578
592
  if (typeof pattern !== "string" || pattern.length === 0) {
579
593
  return {
@@ -583,12 +597,22 @@ function createGlobTool() {
583
597
  isError: true
584
598
  };
585
599
  }
600
+ const projectRoot = context.projectRoot;
601
+ const allowedPaths = context.allowedPaths;
586
602
  let searchPath;
587
603
  if (typeof args["path"] === "string" && args["path"].length > 0) {
588
- const resolved = resolve(projectRoot4, args["path"]);
589
- searchPath = validatePath(resolved, projectRoot4);
604
+ const resolved = resolve(projectRoot, args["path"]);
605
+ searchPath = validatePath(resolved, projectRoot);
590
606
  } else {
591
- searchPath = projectRoot4;
607
+ searchPath = projectRoot;
608
+ }
609
+ if (!isPathAllowed(searchPath, allowedPaths, projectRoot)) {
610
+ return {
611
+ toolCallId: "",
612
+ name: "glob",
613
+ content: `Access denied: ${searchPath} is outside the configured allowed paths.`,
614
+ isError: true
615
+ };
592
616
  }
593
617
  let matchedPaths;
594
618
  try {
@@ -742,10 +766,6 @@ function applyLimits(output, headLimit, offset) {
742
766
  }
743
767
  return result;
744
768
  }
745
- var projectRoot5 = process.cwd();
746
- function setGrepProjectRoot(root) {
747
- projectRoot5 = root;
748
- }
749
769
  function createGrepTool() {
750
770
  return {
751
771
  definition: {
@@ -833,10 +853,10 @@ function createGrepTool() {
833
853
  ]
834
854
  },
835
855
  category: "search",
836
- requiresApproval: (_mode, _args) => {
856
+ requiresApproval: (_context, _args) => {
837
857
  return false;
838
858
  },
839
- execute: async (args) => {
859
+ execute: async (args, context) => {
840
860
  const pattern = args["pattern"];
841
861
  if (typeof pattern !== "string" || pattern.length === 0) {
842
862
  return {
@@ -846,12 +866,22 @@ function createGrepTool() {
846
866
  isError: true
847
867
  };
848
868
  }
869
+ const projectRoot = context.projectRoot;
870
+ const allowedPaths = context.allowedPaths;
849
871
  let searchPath;
850
872
  if (typeof args["path"] === "string" && args["path"].length > 0) {
851
- const resolved = resolve(projectRoot5, args["path"]);
852
- searchPath = validatePath(resolved, projectRoot5);
873
+ const resolved = resolve(projectRoot, args["path"]);
874
+ searchPath = validatePath(resolved, projectRoot);
853
875
  } else {
854
- searchPath = projectRoot5;
876
+ searchPath = projectRoot;
877
+ }
878
+ if (!isPathAllowed(searchPath, allowedPaths, projectRoot)) {
879
+ return {
880
+ toolCallId: "",
881
+ name: "grep",
882
+ content: `Access denied: ${searchPath} is outside the configured allowed paths.`,
883
+ isError: true
884
+ };
855
885
  }
856
886
  const outputMode = args["output_mode"] === "content" || args["output_mode"] === "count" ? args["output_mode"] : "files_with_matches";
857
887
  const headLimit = typeof args["head_limit"] === "number" ? args["head_limit"] : DEFAULT_HEAD_LIMIT;
@@ -984,14 +1014,6 @@ function truncateOutput(output) {
984
1014
  }
985
1015
  return output.substring(0, MAX_OUTPUT_LENGTH2) + "\n...(truncated)";
986
1016
  }
987
- var workingDirectory = process.cwd();
988
- var blockedCommands = [];
989
- function setBashWorkingDirectory(dir) {
990
- workingDirectory = dir;
991
- }
992
- function setBashBlockedCommands(commands) {
993
- blockedCommands = commands;
994
- }
995
1017
  function createBashTool() {
996
1018
  return {
997
1019
  definition: {
@@ -1020,17 +1042,18 @@ function createBashTool() {
1020
1042
  ]
1021
1043
  },
1022
1044
  category: "shell",
1023
- requiresApproval: (mode, args) => {
1045
+ requiresApproval: (context, args) => {
1024
1046
  const command = typeof args["command"] === "string" ? args["command"] : "";
1047
+ const blockedCommands = context.blockedCommands;
1025
1048
  if (isDangerousCommand(command) || isCommandBlocked(command, blockedCommands)) {
1026
1049
  return true;
1027
1050
  }
1028
- if (mode === "strict") {
1051
+ if (context.permissionMode === "strict") {
1029
1052
  return true;
1030
1053
  }
1031
1054
  return false;
1032
1055
  },
1033
- execute: async (args) => {
1056
+ execute: async (args, context) => {
1034
1057
  const command = args["command"];
1035
1058
  if (typeof command !== "string" || command.length === 0) {
1036
1059
  return {
@@ -1040,6 +1063,10 @@ function createBashTool() {
1040
1063
  isError: true
1041
1064
  };
1042
1065
  }
1066
+ const workingDirectory = context.workingDirectory;
1067
+ const blockedCommands = context.blockedCommands;
1068
+ const allowedPaths = context.allowedPaths;
1069
+ const projectRoot = context.projectRoot;
1043
1070
  const lowerCommand = command.toLowerCase().trim();
1044
1071
  for (const pattern of DANGEROUS_PATTERNS) {
1045
1072
  if (lowerCommand.includes(pattern)) {
@@ -1059,6 +1086,14 @@ function createBashTool() {
1059
1086
  isError: true
1060
1087
  };
1061
1088
  }
1089
+ if (!isPathAllowed(workingDirectory, allowedPaths, projectRoot)) {
1090
+ return {
1091
+ toolCallId: "",
1092
+ name: "bash",
1093
+ content: `Access denied: working directory ${workingDirectory} is outside the configured allowed paths.`,
1094
+ isError: true
1095
+ };
1096
+ }
1062
1097
  let timeoutMs = DEFAULT_TIMEOUT_MS;
1063
1098
  if (typeof args["timeout"] === "number") {
1064
1099
  timeoutMs = Math.max(1e3, Math.min(args["timeout"], MAX_TIMEOUT_MS));
@@ -1149,7 +1184,7 @@ function createWebSearchTool() {
1149
1184
  ]
1150
1185
  },
1151
1186
  category: "web",
1152
- requiresApproval: (_mode, _args) => {
1187
+ requiresApproval: (_context, _args) => {
1153
1188
  return false;
1154
1189
  },
1155
1190
  execute: async (args) => {
@@ -1237,6 +1272,9 @@ function isPrivateHostname(hostname) {
1237
1272
  const ipMatch = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(hostname);
1238
1273
  if (ipMatch) {
1239
1274
  const [, a, b] = ipMatch;
1275
+ if (a === void 0 || b === void 0) {
1276
+ return false;
1277
+ }
1240
1278
  const first = parseInt(a, 10);
1241
1279
  const second = parseInt(b, 10);
1242
1280
  if (first === 127) return true;
@@ -1304,9 +1342,7 @@ function createWebFetchTool() {
1304
1342
  ]
1305
1343
  },
1306
1344
  category: "web",
1307
- requiresApproval: (_mode, _args) => {
1308
- return false;
1309
- },
1345
+ requiresApproval: (_context, _args) => false,
1310
1346
  execute: async (args) => {
1311
1347
  const rawUrl = args["url"];
1312
1348
  if (typeof rawUrl !== "string" || rawUrl.length === 0) {
@@ -1332,7 +1368,9 @@ function createWebFetchTool() {
1332
1368
  }
1333
1369
  logger.debug({ url, timeout: timeoutMs }, "Fetching URL");
1334
1370
  const controller = new AbortController();
1335
- const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
1371
+ const timeoutId = setTimeout(() => {
1372
+ controller.abort();
1373
+ }, timeoutMs);
1336
1374
  try {
1337
1375
  const response = await fetch(url, {
1338
1376
  signal: controller.signal,
@@ -1463,10 +1501,6 @@ function truncateOutput2(output) {
1463
1501
  }
1464
1502
  return output.substring(0, MAX_OUTPUT_LENGTH3) + "\n...(truncated)";
1465
1503
  }
1466
- var workingDirectory2 = process.cwd();
1467
- function setGitWorkingDirectory(dir) {
1468
- workingDirectory2 = dir;
1469
- }
1470
1504
  function createGitTool() {
1471
1505
  return {
1472
1506
  definition: {
@@ -1482,7 +1516,7 @@ function createGitTool() {
1482
1516
  ]
1483
1517
  },
1484
1518
  category: "git",
1485
- requiresApproval: (mode, args) => {
1519
+ requiresApproval: (context, args) => {
1486
1520
  const command = typeof args["command"] === "string" ? args["command"] : "";
1487
1521
  const subcommand = parseGitSubcommand(command);
1488
1522
  if (hasDangerousFlags(command)) {
@@ -1491,15 +1525,15 @@ function createGitTool() {
1491
1525
  if (subcommand && READ_ONLY_SUBCOMMANDS.has(subcommand)) {
1492
1526
  return false;
1493
1527
  }
1494
- if (mode === "strict") {
1528
+ if (context.permissionMode === "strict") {
1495
1529
  return true;
1496
1530
  }
1497
- if (subcommand === "push" && mode === "standard") {
1531
+ if (subcommand === "push" && context.permissionMode === "standard") {
1498
1532
  return true;
1499
1533
  }
1500
1534
  return false;
1501
1535
  },
1502
- execute: async (args) => {
1536
+ execute: async (args, context) => {
1503
1537
  const command = args["command"];
1504
1538
  if (typeof command !== "string" || command.length === 0) {
1505
1539
  return {
@@ -1509,6 +1543,7 @@ function createGitTool() {
1509
1543
  isError: true
1510
1544
  };
1511
1545
  }
1546
+ const workingDirectory = context.workingDirectory;
1512
1547
  const trimmedCommand = command.trim();
1513
1548
  if (!trimmedCommand.startsWith("git ")) {
1514
1549
  return {
@@ -1536,10 +1571,10 @@ function createGitTool() {
1536
1571
  isError: true
1537
1572
  };
1538
1573
  }
1539
- logger.debug({ command: trimmedCommand, subcommand, cwd: workingDirectory2 }, "Executing git command");
1574
+ logger.debug({ command: trimmedCommand, subcommand, cwd: workingDirectory }, "Executing git command");
1540
1575
  try {
1541
1576
  const result = await execaCommand(trimmedCommand, {
1542
- cwd: workingDirectory2,
1577
+ cwd: workingDirectory,
1543
1578
  timeout: GIT_TIMEOUT_MS,
1544
1579
  reject: false,
1545
1580
  env: {
@@ -1583,15 +1618,7 @@ function createGitTool() {
1583
1618
  }
1584
1619
 
1585
1620
  // src/tools/index.ts
1586
- function createDefaultRegistry(context) {
1587
- setReadProjectRoot(context.projectRoot);
1588
- setWriteProjectRoot(context.projectRoot);
1589
- setEditProjectRoot(context.projectRoot);
1590
- setGlobProjectRoot(context.projectRoot);
1591
- setGrepProjectRoot(context.projectRoot);
1592
- setBashWorkingDirectory(context.workingDirectory);
1593
- setBashBlockedCommands(context.blockedCommands);
1594
- setGitWorkingDirectory(context.workingDirectory);
1621
+ function createDefaultRegistry(_context) {
1595
1622
  const registry = new ToolRegistry();
1596
1623
  registry.register(createReadTool());
1597
1624
  registry.register(createWriteTool());
@@ -1605,6 +1632,6 @@ function createDefaultRegistry(context) {
1605
1632
  return registry;
1606
1633
  }
1607
1634
 
1608
- export { ToolRegistry, createBashTool, createDefaultRegistry, createEditTool, createGitTool, createGlobTool, createGrepTool, createReadTool, createWebFetchTool, createWebSearchTool, createWriteTool, setBashBlockedCommands, setBashWorkingDirectory, setEditProjectRoot, setGitWorkingDirectory, setGlobProjectRoot, setGrepProjectRoot, setReadProjectRoot, setWebSearchProvider, setWriteProjectRoot };
1609
- //# sourceMappingURL=chunk-Y5XVD2CD.js.map
1610
- //# sourceMappingURL=chunk-Y5XVD2CD.js.map
1635
+ export { ToolRegistry, createBashTool, createDefaultRegistry, createEditTool, createGitTool, createGlobTool, createGrepTool, createReadTool, createWebFetchTool, createWebSearchTool, createWriteTool, setWebSearchProvider };
1636
+ //# sourceMappingURL=chunk-FFS4T7BZ.js.map
1637
+ //# sourceMappingURL=chunk-FFS4T7BZ.js.map