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
package/dist/index.js CHANGED
@@ -1,449 +1,38 @@
1
- export { AgentProcess, MessageBus, PlanApproval, TaskStore, TeamManager } from './chunk-HMJRPNPZ.js';
2
- export { MCPClient, MCPServerManager } from './chunk-MFBHNWGV.js';
3
- export { SkillLoader, SkillRegistry } from './chunk-TEVZS4FA.js';
4
- export { ConfigStore } from './chunk-IYW62KKR.js';
5
- export { SkillExecutor } from './chunk-LSOYPSAT.js';
6
- export { ContextManager, CostTracker, ModelRouter, PermissionManager, TaskOrchestrator, createModelRouter } from './chunk-DAHGLHNR.js';
7
- export { ToolRegistry, createDefaultRegistry } from './chunk-Y5XVD2CD.js';
8
- export { ClaudeAdapter } from './chunk-WAHVZH7V.js';
9
- export { ClaudeNativeCLIAdapter, CodexNativeCLIAdapter, GeminiNativeCLIAdapter, KimiNativeCLIAdapter } from './chunk-6PDJ45T4.js';
10
- export { OpenAIAdapter } from './chunk-WPP3PEDE.js';
11
- export { GeminiAdapter } from './chunk-UY2SYSEZ.js';
12
- export { KimiAdapter } from './chunk-MXZSI3AY.js';
13
- export { OllamaAdapter } from './chunk-H66O5Z2V.js';
14
- export { ProviderRegistry } from './chunk-RWCNNAL7.js';
15
- export { LayoutEngine, TmuxManager } from './chunk-CARHU3DO.js';
1
+ export { SqliteStore } from './chunk-BIMQL4AG.js';
2
+ export { ConversationStore } from './chunk-XEXWX7C7.js';
3
+ export { LayoutEngine, TmuxManager } from './chunk-GXAJGP2T.js';
4
+ export { ContextManager, CostTracker, PermissionManager, TaskOrchestrator } from './chunk-2ZYK5IJG.js';
5
+ export { ToolRegistry, createDefaultRegistry } from './chunk-FFS4T7BZ.js';
6
+ export { AgentProcess, MessageBus, PlanApproval, TaskStore, TeamManager } from './chunk-QK7TKNHV.js';
16
7
  import { getEventBus } from './chunk-YL5XFHR3.js';
17
8
  export { getEventBus } from './chunk-YL5XFHR3.js';
18
- export { SessionManager } from './chunk-DMBPX3RG.js';
19
- import './chunk-I5PZ4JTS.js';
20
- export { CredentialStore } from './chunk-4IJD72YB.js';
21
- import { withRetry, sleep } from './chunk-CGEV3ARR.js';
22
- export { DEFAULT_CONFIG } from './chunk-CYQNBB25.js';
23
- import { getDatabasePath, ensureDirectory, getDatabaseDir, getIPCSocketPath, ensureSecureDirectory, getIPCSocketDir } from './chunk-NBR3GHMT.js';
24
- import './chunk-CS5X3BWX.js';
25
- export { DEFAULT_MODEL_ID, SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
26
- import { AgentSpawnError, IPCError, ToolCallError } from './chunk-ZGOHARPV.js';
9
+ export { MCPClient, MCPServerManager } from './chunk-K2FCMRXH.js';
10
+ export { SkillLoader, SkillRegistry } from './chunk-UM7MSLOV.js';
11
+ export { SkillExecutor } from './chunk-RADJSEG5.js';
12
+ export { ClaudeNativeCLIAdapter, CodexNativeCLIAdapter, GeminiNativeCLIAdapter, KimiNativeCLIAdapter } from './chunk-PS4WEFW6.js';
13
+ import './chunk-VNZ3YTQD.js';
14
+ export { KimiAdapter } from './chunk-KMOAJRDE.js';
15
+ export { OllamaAdapter } from './chunk-KIC7UI5U.js';
16
+ export { ModelRouter, createModelRouter } from './chunk-YPQ2MLAV.js';
17
+ export { SessionManager } from './chunk-7EBLXPL4.js';
18
+ export { ProviderRegistry } from './chunk-2KMA5RBC.js';
19
+ export { ConfigStore } from './chunk-WXIN65UG.js';
20
+ import './chunk-M3FPQSRU.js';
21
+ import './chunk-HESQLCLU.js';
22
+ export { CredentialStore } from './chunk-SNWPI6XJ.js';
23
+ import { withRetry, sleep } from './chunk-YCCYXDW7.js';
24
+ import './chunk-OPWAFS6Y.js';
25
+ import { IPCError, AgentSpawnError, ToolCallError } from './chunk-ZGOHARPV.js';
27
26
  export { AemeathError, AgentSpawnError, AuthenticationError, ContextOverflowError, ExecutionTimeoutError, FileNotFoundError, IPCError, InvalidConfigError, MissingConfigError, ModelNotFoundError, PermissionDeniedError, RateLimitError, ServerConnectionError, ToolCallError } from './chunk-ZGOHARPV.js';
28
- import { logger } from './chunk-JAXXTYID.js';
29
- import Database from 'better-sqlite3';
30
- import { chmodSync } from 'fs';
31
- import { randomUUID, randomBytes, createHmac, timingSafeEqual } from 'crypto';
27
+ export { DEFAULT_MODEL_ID, SUPPORTED_MODELS } from './chunk-HCIHOHLX.js';
28
+ export { DEFAULT_CONFIG } from './chunk-2Y7TR6BS.js';
29
+ import { logger } from './chunk-IR5HLBMH.js';
30
+ import { getIPCSocketPath, ensureSecureDirectory, getIPCSocketDir } from './chunk-D275MCIH.js';
32
31
  import { execa } from 'execa';
33
- import { createServer, connect } from 'net';
32
+ import { connect, createServer } from 'net';
33
+ import { createHmac, randomBytes, timingSafeEqual } from 'crypto';
34
34
  import { chmod, unlink } from 'fs/promises';
35
35
 
36
- // src/storage/migrations/001-initial.ts
37
- var CREATE_CONVERSATIONS = `
38
- CREATE TABLE IF NOT EXISTS conversations (
39
- id TEXT PRIMARY KEY,
40
- project_root TEXT NOT NULL,
41
- default_model TEXT,
42
- created_at TEXT DEFAULT (datetime('now')),
43
- updated_at TEXT DEFAULT (datetime('now')),
44
- metadata TEXT DEFAULT '{}'
45
- )`;
46
- var CREATE_MESSAGES = `
47
- CREATE TABLE IF NOT EXISTS messages (
48
- id INTEGER PRIMARY KEY AUTOINCREMENT,
49
- conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
50
- role TEXT NOT NULL,
51
- model TEXT,
52
- provider TEXT,
53
- content TEXT NOT NULL,
54
- tool_calls TEXT,
55
- token_usage TEXT,
56
- created_at TEXT DEFAULT (datetime('now'))
57
- )`;
58
- var CREATE_FILE_CONTEXT = `
59
- CREATE TABLE IF NOT EXISTS file_context (
60
- id INTEGER PRIMARY KEY AUTOINCREMENT,
61
- conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
62
- file_path TEXT NOT NULL,
63
- content_hash TEXT,
64
- token_count INTEGER,
65
- added_at TEXT DEFAULT (datetime('now'))
66
- )`;
67
- var CREATE_COST_TRACKING = `
68
- CREATE TABLE IF NOT EXISTS cost_tracking (
69
- id INTEGER PRIMARY KEY AUTOINCREMENT,
70
- conversation_id TEXT NOT NULL REFERENCES conversations(id) ON DELETE CASCADE,
71
- provider TEXT NOT NULL,
72
- model TEXT NOT NULL,
73
- role TEXT,
74
- input_tokens INTEGER,
75
- output_tokens INTEGER,
76
- cost_usd REAL,
77
- created_at TEXT DEFAULT (datetime('now'))
78
- )`;
79
- var CREATE_TEAMS = `
80
- CREATE TABLE IF NOT EXISTS teams (
81
- id TEXT PRIMARY KEY,
82
- name TEXT NOT NULL,
83
- status TEXT DEFAULT 'active',
84
- config TEXT,
85
- created_at TEXT DEFAULT (datetime('now'))
86
- )`;
87
- var CREATE_INDEXES = [
88
- "CREATE INDEX IF NOT EXISTS idx_messages_conversation ON messages(conversation_id)",
89
- "CREATE INDEX IF NOT EXISTS idx_cost_conversation ON cost_tracking(conversation_id)",
90
- "CREATE INDEX IF NOT EXISTS idx_cost_provider ON cost_tracking(provider)",
91
- "CREATE INDEX IF NOT EXISTS idx_file_context_conversation ON file_context(conversation_id)"
92
- ];
93
- function up(db) {
94
- db.transaction(() => {
95
- db.exec(CREATE_CONVERSATIONS);
96
- db.exec(CREATE_MESSAGES);
97
- db.exec(CREATE_FILE_CONTEXT);
98
- db.exec(CREATE_COST_TRACKING);
99
- db.exec(CREATE_TEAMS);
100
- for (const sql of CREATE_INDEXES) {
101
- db.exec(sql);
102
- }
103
- })();
104
- }
105
-
106
- // src/storage/sqlite-store.ts
107
- var MIGRATIONS_TABLE_DDL = `
108
- CREATE TABLE IF NOT EXISTS _migrations (
109
- id TEXT PRIMARY KEY,
110
- applied_at TEXT DEFAULT (datetime('now'))
111
- )`;
112
- var MIGRATIONS = [
113
- { id: "001-initial", up }
114
- ];
115
- var SqliteStore = class {
116
- db;
117
- closed = false;
118
- get database() {
119
- if (this.closed || !this.db) {
120
- throw new Error("SqliteStore is closed or not initialized");
121
- }
122
- return this.db;
123
- }
124
- open(dbPath) {
125
- if (this.db) {
126
- return;
127
- }
128
- const resolvedPath = dbPath ?? getDatabasePath();
129
- ensureDirectory(getDatabaseDir());
130
- logger.info({ path: resolvedPath }, "Opening SQLite database");
131
- this.db = new Database(resolvedPath);
132
- this.db.pragma("journal_mode = WAL");
133
- this.db.pragma("busy_timeout = 5000");
134
- this.db.pragma("foreign_keys = ON");
135
- this.db.pragma("synchronous = NORMAL");
136
- try {
137
- chmodSync(resolvedPath, 384);
138
- } catch {
139
- logger.warn(
140
- { path: resolvedPath },
141
- "Could not set database file permissions to 600"
142
- );
143
- }
144
- this.runMigrations();
145
- this.registerCleanupHandlers();
146
- }
147
- runMigrations() {
148
- const db = this.database;
149
- db.exec(MIGRATIONS_TABLE_DDL);
150
- const appliedStmt = db.prepare(
151
- "SELECT id FROM _migrations WHERE id = ?"
152
- );
153
- const insertStmt = db.prepare(
154
- "INSERT INTO _migrations (id) VALUES (?)"
155
- );
156
- for (const migration of MIGRATIONS) {
157
- const existing = appliedStmt.get(migration.id);
158
- if (!existing) {
159
- logger.info({ migrationId: migration.id }, "Running migration");
160
- db.transaction(() => {
161
- migration.up(db);
162
- insertStmt.run(migration.id);
163
- })();
164
- logger.info({ migrationId: migration.id }, "Migration applied");
165
- }
166
- }
167
- }
168
- prepare(sql) {
169
- return this.database.prepare(sql);
170
- }
171
- run(sql, ...params) {
172
- return this.database.prepare(sql).run(...params);
173
- }
174
- get(sql, ...params) {
175
- return this.database.prepare(sql).get(...params);
176
- }
177
- all(sql, ...params) {
178
- return this.database.prepare(sql).all(...params);
179
- }
180
- transaction(fn) {
181
- return this.database.transaction(fn)();
182
- }
183
- close() {
184
- if (this.closed || !this.db) {
185
- return;
186
- }
187
- logger.info("Closing SQLite database");
188
- this.closed = true;
189
- try {
190
- this.db.pragma("wal_checkpoint(TRUNCATE)");
191
- this.db.close();
192
- } catch (error) {
193
- const message = error instanceof Error ? error.message : String(error);
194
- logger.error({ error: message }, "Error closing database");
195
- }
196
- this.db = void 0;
197
- }
198
- registerCleanupHandlers() {
199
- const cleanup = () => {
200
- this.close();
201
- };
202
- process.on("exit", cleanup);
203
- process.on("SIGINT", () => {
204
- cleanup();
205
- process.exit(130);
206
- });
207
- process.on("SIGTERM", () => {
208
- cleanup();
209
- process.exit(143);
210
- });
211
- }
212
- };
213
- var ConversationStore = class {
214
- store;
215
- constructor(store) {
216
- this.store = store;
217
- }
218
- createConversation(projectRoot, defaultModel, metadata) {
219
- const id = randomUUID();
220
- const metadataJson = JSON.stringify(metadata ?? {});
221
- this.store.run(
222
- `INSERT INTO conversations (id, project_root, default_model, metadata)
223
- VALUES (?, ?, ?, ?)`,
224
- id,
225
- projectRoot,
226
- defaultModel ?? null,
227
- metadataJson
228
- );
229
- logger.info({ conversationId: id, projectRoot }, "Conversation created");
230
- const row = this.store.get(
231
- "SELECT * FROM conversations WHERE id = ?",
232
- id
233
- );
234
- if (!row) {
235
- throw new Error(`Failed to retrieve created conversation: ${id}`);
236
- }
237
- return this.mapConversationRow(row);
238
- }
239
- getConversation(id) {
240
- const row = this.store.get(
241
- "SELECT * FROM conversations WHERE id = ?",
242
- id
243
- );
244
- return row ? this.mapConversationRow(row) : void 0;
245
- }
246
- listConversations(projectRoot) {
247
- const rows = projectRoot ? this.store.all(
248
- "SELECT * FROM conversations WHERE project_root = ? ORDER BY updated_at DESC",
249
- projectRoot
250
- ) : this.store.all(
251
- "SELECT * FROM conversations ORDER BY updated_at DESC"
252
- );
253
- return rows.map((row) => this.mapConversationRow(row));
254
- }
255
- deleteConversation(id) {
256
- this.store.run("DELETE FROM conversations WHERE id = ?", id);
257
- logger.info({ conversationId: id }, "Conversation deleted");
258
- }
259
- addMessage(params) {
260
- const toolCallsJson = params.toolCalls ? JSON.stringify(params.toolCalls) : null;
261
- const tokenUsageJson = params.tokenUsage ? JSON.stringify(params.tokenUsage) : null;
262
- const result = this.store.run(
263
- `INSERT INTO messages
264
- (conversation_id, role, model, provider, content, tool_calls, token_usage)
265
- VALUES (?, ?, ?, ?, ?, ?, ?)`,
266
- params.conversationId,
267
- params.role,
268
- params.model ?? null,
269
- params.provider ?? null,
270
- params.content,
271
- toolCallsJson,
272
- tokenUsageJson
273
- );
274
- this.store.run(
275
- "UPDATE conversations SET updated_at = datetime('now') WHERE id = ?",
276
- params.conversationId
277
- );
278
- const row = this.store.get(
279
- "SELECT * FROM messages WHERE id = ?",
280
- result.lastInsertRowid
281
- );
282
- if (!row) {
283
- throw new Error("Failed to retrieve created message");
284
- }
285
- return this.mapMessageRow(row);
286
- }
287
- getMessages(conversationId, pagination) {
288
- const limit = pagination?.limit ?? 100;
289
- const offset = pagination?.offset ?? 0;
290
- const rows = this.store.all(
291
- `SELECT * FROM messages
292
- WHERE conversation_id = ?
293
- ORDER BY created_at ASC
294
- LIMIT ? OFFSET ?`,
295
- conversationId,
296
- limit,
297
- offset
298
- );
299
- return rows.map((row) => this.mapMessageRow(row));
300
- }
301
- getMessageCount(conversationId) {
302
- const result = this.store.get(
303
- "SELECT COUNT(*) as count FROM messages WHERE conversation_id = ?",
304
- conversationId
305
- );
306
- return result?.count ?? 0;
307
- }
308
- addFileContext(params) {
309
- const result = this.store.run(
310
- `INSERT INTO file_context
311
- (conversation_id, file_path, content_hash, token_count)
312
- VALUES (?, ?, ?, ?)`,
313
- params.conversationId,
314
- params.filePath,
315
- params.contentHash ?? null,
316
- params.tokenCount ?? null
317
- );
318
- const row = this.store.get(
319
- "SELECT * FROM file_context WHERE id = ?",
320
- result.lastInsertRowid
321
- );
322
- if (!row) {
323
- throw new Error("Failed to retrieve created file context");
324
- }
325
- return this.mapFileContextRow(row);
326
- }
327
- getFileContext(conversationId) {
328
- const rows = this.store.all(
329
- "SELECT * FROM file_context WHERE conversation_id = ? ORDER BY added_at DESC",
330
- conversationId
331
- );
332
- return rows.map((row) => this.mapFileContextRow(row));
333
- }
334
- removeFileContext(conversationId, filePath) {
335
- this.store.run(
336
- "DELETE FROM file_context WHERE conversation_id = ? AND file_path = ?",
337
- conversationId,
338
- filePath
339
- );
340
- }
341
- addCost(params) {
342
- const result = this.store.run(
343
- `INSERT INTO cost_tracking
344
- (conversation_id, provider, model, role, input_tokens, output_tokens, cost_usd)
345
- VALUES (?, ?, ?, ?, ?, ?, ?)`,
346
- params.conversationId,
347
- params.provider,
348
- params.model,
349
- params.role ?? null,
350
- params.inputTokens ?? null,
351
- params.outputTokens ?? null,
352
- params.costUsd ?? null
353
- );
354
- const row = this.store.get(
355
- "SELECT * FROM cost_tracking WHERE id = ?",
356
- result.lastInsertRowid
357
- );
358
- if (!row) {
359
- throw new Error("Failed to retrieve created cost entry");
360
- }
361
- return this.mapCostRow(row);
362
- }
363
- getConversationCost(conversationId) {
364
- const result = this.store.get(
365
- "SELECT SUM(cost_usd) as total FROM cost_tracking WHERE conversation_id = ?",
366
- conversationId
367
- );
368
- return result?.total ?? 0;
369
- }
370
- getCostBreakdown(conversationId) {
371
- const rows = this.store.all(
372
- "SELECT * FROM cost_tracking WHERE conversation_id = ? ORDER BY created_at ASC",
373
- conversationId
374
- );
375
- return rows.map((row) => this.mapCostRow(row));
376
- }
377
- // ── Private row mappers ─────────────────────────────────────────────
378
- mapConversationRow(row) {
379
- let metadata = {};
380
- try {
381
- metadata = JSON.parse(row.metadata);
382
- } catch {
383
- metadata = {};
384
- }
385
- return {
386
- id: row.id,
387
- projectRoot: row.project_root,
388
- defaultModel: row.default_model,
389
- createdAt: row.created_at,
390
- updatedAt: row.updated_at,
391
- metadata
392
- };
393
- }
394
- mapMessageRow(row) {
395
- let toolCalls = null;
396
- if (row.tool_calls) {
397
- try {
398
- toolCalls = JSON.parse(row.tool_calls);
399
- } catch {
400
- toolCalls = null;
401
- }
402
- }
403
- let tokenUsage = null;
404
- if (row.token_usage) {
405
- try {
406
- tokenUsage = JSON.parse(row.token_usage);
407
- } catch {
408
- tokenUsage = null;
409
- }
410
- }
411
- return {
412
- id: row.id,
413
- conversationId: row.conversation_id,
414
- role: row.role,
415
- model: row.model,
416
- provider: row.provider,
417
- content: row.content,
418
- toolCalls,
419
- tokenUsage,
420
- createdAt: row.created_at
421
- };
422
- }
423
- mapFileContextRow(row) {
424
- return {
425
- id: row.id,
426
- conversationId: row.conversation_id,
427
- filePath: row.file_path,
428
- contentHash: row.content_hash,
429
- tokenCount: row.token_count,
430
- addedAt: row.added_at
431
- };
432
- }
433
- mapCostRow(row) {
434
- return {
435
- id: row.id,
436
- conversationId: row.conversation_id,
437
- provider: row.provider,
438
- model: row.model,
439
- role: row.role,
440
- inputTokens: row.input_tokens,
441
- outputTokens: row.output_tokens,
442
- costUsd: row.cost_usd,
443
- createdAt: row.created_at
444
- };
445
- }
446
- };
447
36
  var ROLE_PROFILES = {
448
37
  planning: { backgroundColor: "#1a1a2e", badgeText: "Planner" },
449
38
  coding: { backgroundColor: "#162447", badgeText: "Coder" },
@@ -725,19 +314,23 @@ var IPCHub = class {
725
314
  ensureSecureDirectory(getIPCSocketDir());
726
315
  await this.removeStaleSocket();
727
316
  return new Promise((resolve, reject) => {
728
- this.server = createServer((socket) => this.handleConnection(socket));
317
+ this.server = createServer((socket) => {
318
+ this.handleConnection(socket);
319
+ });
729
320
  this.server.on("error", (err) => {
730
321
  logger.error({ error: err.message }, "IPC server error");
731
322
  reject(new IPCError(`Server error: ${err.message}`));
732
323
  });
733
- this.server.listen(this.socketPath, async () => {
734
- try {
735
- await chmod(this.socketPath, SOCKET_PERMS);
736
- } catch {
737
- }
738
- logger.info({ socketPath: this.socketPath }, "IPC hub listening");
739
- this.setupProcessCleanup();
740
- resolve();
324
+ this.server.listen(this.socketPath, () => {
325
+ void (async () => {
326
+ try {
327
+ await chmod(this.socketPath, SOCKET_PERMS);
328
+ } catch {
329
+ }
330
+ logger.info({ socketPath: this.socketPath }, "IPC hub listening");
331
+ this.setupProcessCleanup();
332
+ resolve();
333
+ })();
741
334
  });
742
335
  });
743
336
  }
@@ -780,8 +373,11 @@ var IPCHub = class {
780
373
  }
781
374
  this.clients.clear();
782
375
  if (this.server) {
783
- await new Promise((r) => {
784
- this.server.close(() => r());
376
+ const server = this.server;
377
+ await new Promise((resolve) => {
378
+ server.close(() => {
379
+ resolve();
380
+ });
785
381
  });
786
382
  this.server = void 0;
787
383
  }
@@ -833,12 +429,13 @@ var IPCHub = class {
833
429
  return void 0;
834
430
  }
835
431
  const { message, hmac } = parsed;
432
+ const requestId = this.getRequestId(message);
836
433
  if (!this.verifyHmac(message, hmac)) {
837
- this.sendError(socket, message.id, RPC_AUTH_ERROR, "Authentication failed");
434
+ this.sendError(socket, requestId, RPC_AUTH_ERROR, "Authentication failed");
838
435
  return void 0;
839
436
  }
840
- if (message.jsonrpc !== "2.0" || !message.method) {
841
- this.sendError(socket, message.id, RPC_INVALID_REQ, "Invalid JSON-RPC 2.0");
437
+ if (!this.isIPCMessage(message)) {
438
+ this.sendError(socket, requestId, RPC_INVALID_REQ, "Invalid JSON-RPC 2.0");
842
439
  return void 0;
843
440
  }
844
441
  const handler = this.handlers.get(message.method);
@@ -858,7 +455,7 @@ var IPCHub = class {
858
455
  }
859
456
  // ── Default Handlers ──────────────────────────────────────────────
860
457
  registerDefaultHandlers() {
861
- this.handlers.set("agent.register", async (_cid, params, _id, socket) => {
458
+ this.handlers.set("agent.register", (_cid, params, _id, socket) => {
862
459
  const agentId = params["agentId"];
863
460
  const agentName = params["agentName"];
864
461
  if (!agentId || !agentName) throw new IPCError("agent.register requires agentId and agentName");
@@ -866,20 +463,20 @@ var IPCHub = class {
866
463
  logger.info({ agentId, agentName }, "Agent registered");
867
464
  return { registered: true, agentId };
868
465
  });
869
- this.handlers.set("agent.streamChunk", async (_cid, params) => {
466
+ this.handlers.set("agent.streamChunk", (_cid, params) => {
870
467
  getEventBus().emit("model:stream:chunk", {
871
468
  model: params["model"] ?? "unknown",
872
469
  content: params["content"] ?? ""
873
470
  });
874
471
  return { received: true };
875
472
  });
876
- this.handlers.set("agent.taskUpdate", async (_cid, params) => {
473
+ this.handlers.set("agent.taskUpdate", (_cid, params) => {
877
474
  const taskId = params["taskId"];
878
475
  const status = params["status"];
879
476
  if (taskId && status) getEventBus().emit("task:updated", { taskId, status });
880
477
  return { received: true };
881
478
  });
882
- this.handlers.set("agent.message", async (_cid, params) => {
479
+ this.handlers.set("agent.message", (_cid, params) => {
883
480
  const to = params["to"];
884
481
  const content = params["content"];
885
482
  const from = params["from"];
@@ -892,7 +489,7 @@ var IPCHub = class {
892
489
  }
893
490
  return { delivered: this.clients.has(to ?? "") };
894
491
  });
895
- this.handlers.set("hub.taskAssign", async (_cid, params) => {
492
+ this.handlers.set("hub.taskAssign", (_cid, params) => {
896
493
  const agentId = params["agentId"];
897
494
  const taskId = params["taskId"];
898
495
  if (agentId && taskId) {
@@ -901,7 +498,7 @@ var IPCHub = class {
901
498
  }
902
499
  return { assigned: this.clients.has(agentId ?? "") };
903
500
  });
904
- this.handlers.set("hub.shutdown", async (_cid, params) => {
501
+ this.handlers.set("hub.shutdown", (_cid, params) => {
905
502
  const agentId = params["agentId"];
906
503
  if (agentId) {
907
504
  const target = this.clients.get(agentId);
@@ -927,6 +524,16 @@ var IPCHub = class {
927
524
  const o = v;
928
525
  return typeof o["hmac"] === "string" && typeof o["message"] === "object" && o["message"] !== null;
929
526
  }
527
+ isIPCMessage(v) {
528
+ if (typeof v !== "object" || v === null) return false;
529
+ const o = v;
530
+ return o["jsonrpc"] === "2.0" && typeof o["method"] === "string" && typeof o["params"] === "object" && o["params"] !== null;
531
+ }
532
+ getRequestId(v) {
533
+ if (typeof v !== "object" || v === null) return void 0;
534
+ const o = v;
535
+ return typeof o["id"] === "number" ? o["id"] : void 0;
536
+ }
930
537
  // ── I/O ───────────────────────────────────────────────────────────
931
538
  write(socket, msg) {
932
539
  if (!socket.destroyed) socket.write(JSON.stringify(msg) + "\n");
@@ -961,7 +568,8 @@ var DEFAULT_HEARTBEAT_MS = 15e3;
961
568
  var DEFAULT_RECONNECT_RETRIES = 5;
962
569
  var REQUEST_TIMEOUT_MS = 3e4;
963
570
  var NEWLINE2 = 10;
964
- var PaneProcess = class {
571
+ var PaneProcess = class _PaneProcess {
572
+ static resolvedPromise = Promise.resolve();
965
573
  agentId;
966
574
  agentName;
967
575
  socketPath;
@@ -1038,8 +646,10 @@ var PaneProcess = class {
1038
646
  return this.connected && !this.disposed;
1039
647
  }
1040
648
  /** Gracefully disconnect from the hub. */
1041
- async disconnect() {
1042
- if (this.disposed) return;
649
+ disconnect() {
650
+ if (this.disposed) {
651
+ return _PaneProcess.resolvedPromise;
652
+ }
1043
653
  this.disposed = true;
1044
654
  this.stopHeartbeat();
1045
655
  this.rejectAll();
@@ -1049,6 +659,7 @@ var PaneProcess = class {
1049
659
  }
1050
660
  this.connected = false;
1051
661
  logger.info({ agentId: this.agentId }, "PaneProcess disconnected");
662
+ return _PaneProcess.resolvedPromise;
1052
663
  }
1053
664
  // ── Connection ────────────────────────────────────────────────────
1054
665
  async establish() {
@@ -1081,7 +692,7 @@ var PaneProcess = class {
1081
692
  this.connected = false;
1082
693
  if (!this.disposed) {
1083
694
  logger.warn({ agentId: this.agentId }, "Connection lost, reconnecting");
1084
- this.attemptReconnect();
695
+ void this.attemptReconnect();
1085
696
  }
1086
697
  });
1087
698
  socket.on("error", (err) => {
@@ -1150,7 +761,7 @@ var PaneProcess = class {
1150
761
  this.notify("agent.streamChunk", { content: "", model: "heartbeat", heartbeat: true });
1151
762
  }
1152
763
  }, this.heartbeatMs);
1153
- if (this.heartbeatTimer.unref) this.heartbeatTimer.unref();
764
+ this.heartbeatTimer.unref();
1154
765
  }
1155
766
  stopHeartbeat() {
1156
767
  if (this.heartbeatTimer) {
@@ -1399,8 +1010,8 @@ var MCPToolBridge = class {
1399
1010
  return {
1400
1011
  definition,
1401
1012
  category: MCP_CATEGORY,
1402
- requiresApproval: (mode, _args) => {
1403
- return mode === "strict";
1013
+ requiresApproval: (context, _args) => {
1014
+ return context.permissionMode === "strict";
1404
1015
  },
1405
1016
  execute: async (args) => {
1406
1017
  const call = {
@@ -1414,6 +1025,6 @@ var MCPToolBridge = class {
1414
1025
  }
1415
1026
  };
1416
1027
 
1417
- export { ConversationStore, IPCHub, ITerm2Manager, MCPToolBridge, PaneProcess, SqliteStore };
1028
+ export { IPCHub, ITerm2Manager, MCPToolBridge, PaneProcess };
1418
1029
  //# sourceMappingURL=index.js.map
1419
1030
  //# sourceMappingURL=index.js.map