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.
- package/LICENSE +21 -0
- package/README.md +66 -54
- package/dist/App-JQ622M66.js +4431 -0
- package/dist/App-JQ622M66.js.map +1 -0
- package/dist/agent-store/architect.md +32 -0
- package/dist/agent-store/debugger.md +32 -0
- package/dist/agent-store/developer.md +29 -0
- package/dist/agent-store/documenter.md +30 -0
- package/dist/agent-store/researcher.md +31 -0
- package/dist/agent-store/reviewer.md +28 -0
- package/dist/agent-store/supervisor.md +37 -0
- package/dist/agent-store/tester.md +30 -0
- package/dist/api-key-fallback-RJLPM3KH.js +11 -0
- package/dist/{api-key-fallback-YQQBOQIL.js.map → api-key-fallback-RJLPM3KH.js.map} +1 -1
- package/dist/auth-status-JQJOKUPF.js +13 -0
- package/dist/auth-status-JQJOKUPF.js.map +1 -0
- package/dist/{chunk-RWCNNAL7.js → chunk-2KMA5RBC.js} +25 -48
- package/dist/chunk-2KMA5RBC.js.map +1 -0
- package/dist/{chunk-CYQNBB25.js → chunk-2Y7TR6BS.js} +28 -5
- package/dist/chunk-2Y7TR6BS.js.map +1 -0
- package/dist/{chunk-DAHGLHNR.js → chunk-2ZYK5IJG.js} +6 -141
- package/dist/chunk-2ZYK5IJG.js.map +1 -0
- package/dist/chunk-36RXCZOV.js +88 -0
- package/dist/chunk-36RXCZOV.js.map +1 -0
- package/dist/{chunk-DMBPX3RG.js → chunk-7EBLXPL4.js} +9 -9
- package/dist/{chunk-DMBPX3RG.js.map → chunk-7EBLXPL4.js.map} +1 -1
- package/dist/chunk-BIMQL4AG.js +186 -0
- package/dist/chunk-BIMQL4AG.js.map +1 -0
- package/dist/{chunk-NBR3GHMT.js → chunk-D275MCIH.js} +39 -7
- package/dist/chunk-D275MCIH.js.map +1 -0
- package/dist/{chunk-Y5XVD2CD.js → chunk-FFS4T7BZ.js} +109 -82
- package/dist/chunk-FFS4T7BZ.js.map +1 -0
- package/dist/{chunk-CARHU3DO.js → chunk-GXAJGP2T.js} +64 -16
- package/dist/chunk-GXAJGP2T.js.map +1 -0
- package/dist/{chunk-I5PZ4JTS.js → chunk-HESQLCLU.js} +4 -4
- package/dist/{chunk-I5PZ4JTS.js.map → chunk-HESQLCLU.js.map} +1 -1
- package/dist/{chunk-JAXXTYID.js → chunk-IR5HLBMH.js} +2 -2
- package/dist/{chunk-JAXXTYID.js.map → chunk-IR5HLBMH.js.map} +1 -1
- package/dist/{chunk-MFBHNWGV.js → chunk-K2FCMRXH.js} +11 -19
- package/dist/chunk-K2FCMRXH.js.map +1 -0
- package/dist/{chunk-H66O5Z2V.js → chunk-KIC7UI5U.js} +41 -6
- package/dist/chunk-KIC7UI5U.js.map +1 -0
- package/dist/{chunk-MXZSI3AY.js → chunk-KMOAJRDE.js} +42 -10
- package/dist/chunk-KMOAJRDE.js.map +1 -0
- package/dist/chunk-LQBALETG.js +71 -0
- package/dist/chunk-LQBALETG.js.map +1 -0
- package/dist/chunk-M3FPQSRU.js +12 -0
- package/dist/chunk-M3FPQSRU.js.map +1 -0
- package/dist/chunk-NQEUK763.js +26 -0
- package/dist/chunk-NQEUK763.js.map +1 -0
- package/dist/chunk-OPWAFS6Y.js +38 -0
- package/dist/chunk-OPWAFS6Y.js.map +1 -0
- package/dist/{chunk-6PDJ45T4.js → chunk-PS4WEFW6.js} +50 -25
- package/dist/chunk-PS4WEFW6.js.map +1 -0
- package/dist/{chunk-HMJRPNPZ.js → chunk-QK7TKNHV.js} +93 -21
- package/dist/chunk-QK7TKNHV.js.map +1 -0
- package/dist/{chunk-LSOYPSAT.js → chunk-RADJSEG5.js} +4 -4
- package/dist/chunk-RADJSEG5.js.map +1 -0
- package/dist/{chunk-4IJD72YB.js → chunk-SNWPI6XJ.js} +7 -7
- package/dist/chunk-SNWPI6XJ.js.map +1 -0
- package/dist/{chunk-TEVZS4FA.js → chunk-UM7MSLOV.js} +16 -9
- package/dist/chunk-UM7MSLOV.js.map +1 -0
- package/dist/chunk-VNZ3YTQD.js +232 -0
- package/dist/chunk-VNZ3YTQD.js.map +1 -0
- package/dist/{chunk-IYW62KKR.js → chunk-WXIN65UG.js} +66 -23
- package/dist/chunk-WXIN65UG.js.map +1 -0
- package/dist/chunk-XEXWX7C7.js +241 -0
- package/dist/chunk-XEXWX7C7.js.map +1 -0
- package/dist/{chunk-CGEV3ARR.js → chunk-YCCYXDW7.js} +3 -3
- package/dist/chunk-YCCYXDW7.js.map +1 -0
- package/dist/chunk-YPQ2MLAV.js +140 -0
- package/dist/chunk-YPQ2MLAV.js.map +1 -0
- package/dist/chunk-ZCOVMVK4.js +26 -0
- package/dist/chunk-ZCOVMVK4.js.map +1 -0
- package/dist/{claude-login-5WELXPKT.js → claude-login-AIFIWTYF.js} +9 -9
- package/dist/{claude-login-5WELXPKT.js.map → claude-login-AIFIWTYF.js.map} +1 -1
- package/dist/cli.js +370 -171
- package/dist/cli.js.map +1 -1
- package/dist/{codex-login-GZIFXUWD.js → codex-login-LW5X7GAM.js} +10 -10
- package/dist/codex-login-LW5X7GAM.js.map +1 -0
- package/dist/config-store-NF56VHFU.js +7 -0
- package/dist/{config-store-W6FBCQAQ.js.map → config-store-NF56VHFU.js.map} +1 -1
- package/dist/conversation-store-7GRDQZD2.js +4 -0
- package/dist/conversation-store-7GRDQZD2.js.map +1 -0
- package/dist/detect-providers-QICJ5U3R.js +4 -0
- package/dist/detect-providers-QICJ5U3R.js.map +1 -0
- package/dist/executor-FTABX2AW.js +4 -0
- package/dist/{executor-6RIKIGXK.js.map → executor-FTABX2AW.js.map} +1 -1
- package/dist/first-run-ADROZVYF.js +230 -0
- package/dist/first-run-ADROZVYF.js.map +1 -0
- package/dist/{gemini-login-AZGL3CE7.js → gemini-login-TST454MX.js} +9 -9
- package/dist/{gemini-login-AZGL3CE7.js.map → gemini-login-TST454MX.js.map} +1 -1
- package/dist/index.d.ts +46 -70
- package/dist/index.js +79 -468
- package/dist/index.js.map +1 -1
- package/dist/input-history-BEICE7PT.js +57 -0
- package/dist/input-history-BEICE7PT.js.map +1 -0
- package/dist/kimi-adapter-7FYOAKOI.js +6 -0
- package/dist/{kimi-adapter-JN4HFFHU.js.map → kimi-adapter-7FYOAKOI.js.map} +1 -1
- package/dist/{kimi-login-6LUWB7P6.js → kimi-login-3IGVOBJI.js} +9 -9
- package/dist/{kimi-login-6LUWB7P6.js.map → kimi-login-3IGVOBJI.js.map} +1 -1
- package/dist/logger-KGHUQ4VE.js +3 -0
- package/dist/logger-KGHUQ4VE.js.map +1 -0
- package/dist/model-discovery-AAJDHRFO.js +6 -0
- package/dist/model-discovery-AAJDHRFO.js.map +1 -0
- package/dist/native-cli-adapters-CLONTZOA.js +8 -0
- package/dist/{native-cli-adapters-OLW3XX57.js.map → native-cli-adapters-CLONTZOA.js.map} +1 -1
- package/dist/ollama-adapter-2N5OQIEV.js +5 -0
- package/dist/{ollama-adapter-OJQ3FKWK.js.map → ollama-adapter-2N5OQIEV.js.map} +1 -1
- package/dist/pathResolver-UVAB2FCW.js +3 -0
- package/dist/pathResolver-UVAB2FCW.js.map +1 -0
- package/dist/profile-loader-EMLV4J7S.js +162 -0
- package/dist/profile-loader-EMLV4J7S.js.map +1 -0
- package/dist/registry-LRURZVUL.js +5 -0
- package/dist/{registry-AZ2LOHHJ.js.map → registry-LRURZVUL.js.map} +1 -1
- package/dist/registry-MVNSXCEF.js +6 -0
- package/dist/{registry-H7B3AHPQ.js.map → registry-MVNSXCEF.js.map} +1 -1
- package/dist/server-manager-THGZBBZB.js +5 -0
- package/dist/{server-manager-PTGBHCLS.js.map → server-manager-THGZBBZB.js.map} +1 -1
- package/dist/session-manager-X3DXT53M.js +12 -0
- package/dist/{session-manager-XOMDMC77.js.map → session-manager-X3DXT53M.js.map} +1 -1
- package/dist/skills/built-in/code-review/SKILL.md +85 -0
- package/dist/skills/built-in/commit/SKILL.md +83 -0
- package/dist/skills/built-in/debug/SKILL.md +119 -0
- package/dist/skills/built-in/plan/SKILL.md +123 -0
- package/dist/skills/built-in/refactor/SKILL.md +132 -0
- package/dist/skills/built-in/test/SKILL.md +128 -0
- package/dist/sqlite-store-7OECRTXM.js +5 -0
- package/dist/sqlite-store-7OECRTXM.js.map +1 -0
- package/dist/team-manager-2VSMALAA.js +11 -0
- package/dist/{team-manager-HC4XGCFY.js.map → team-manager-2VSMALAA.js.map} +1 -1
- package/dist/team-state-HZNVMQHT.js +3 -0
- package/dist/team-state-HZNVMQHT.js.map +1 -0
- package/dist/tmux-manager-57QCUVHU.js +6 -0
- package/dist/{tmux-manager-GPYZ3WQH.js.map → tmux-manager-57QCUVHU.js.map} +1 -1
- package/dist/tools-KWFSYT56.js +6 -0
- package/dist/{tools-TSMXMHIF.js.map → tools-KWFSYT56.js.map} +1 -1
- package/package.json +11 -11
- package/dist/App-FKRSMFMB.js +0 -2789
- package/dist/App-FKRSMFMB.js.map +0 -1
- package/dist/api-key-fallback-YQQBOQIL.js +0 -11
- package/dist/chunk-4IJD72YB.js.map +0 -1
- package/dist/chunk-6PDJ45T4.js.map +0 -1
- package/dist/chunk-CARHU3DO.js.map +0 -1
- package/dist/chunk-CGEV3ARR.js.map +0 -1
- package/dist/chunk-CS5X3BWX.js +0 -27
- package/dist/chunk-CS5X3BWX.js.map +0 -1
- package/dist/chunk-CYQNBB25.js.map +0 -1
- package/dist/chunk-DAHGLHNR.js.map +0 -1
- package/dist/chunk-H66O5Z2V.js.map +0 -1
- package/dist/chunk-HMJRPNPZ.js.map +0 -1
- package/dist/chunk-IYW62KKR.js.map +0 -1
- package/dist/chunk-LSOYPSAT.js.map +0 -1
- package/dist/chunk-MFBHNWGV.js.map +0 -1
- package/dist/chunk-MXZSI3AY.js.map +0 -1
- package/dist/chunk-NBR3GHMT.js.map +0 -1
- package/dist/chunk-RWCNNAL7.js.map +0 -1
- package/dist/chunk-TEVZS4FA.js.map +0 -1
- package/dist/chunk-UY2SYSEZ.js +0 -211
- package/dist/chunk-UY2SYSEZ.js.map +0 -1
- package/dist/chunk-WAHVZH7V.js +0 -260
- package/dist/chunk-WAHVZH7V.js.map +0 -1
- package/dist/chunk-WPP3PEDE.js +0 -234
- package/dist/chunk-WPP3PEDE.js.map +0 -1
- package/dist/chunk-Y5XVD2CD.js.map +0 -1
- package/dist/claude-adapter-QMLFMSP3.js +0 -6
- package/dist/claude-adapter-QMLFMSP3.js.map +0 -1
- package/dist/codex-login-GZIFXUWD.js.map +0 -1
- package/dist/config-store-W6FBCQAQ.js +0 -6
- package/dist/executor-6RIKIGXK.js +0 -4
- package/dist/gemini-adapter-6JIHZ7WI.js +0 -6
- package/dist/gemini-adapter-6JIHZ7WI.js.map +0 -1
- package/dist/kimi-adapter-JN4HFFHU.js +0 -6
- package/dist/native-cli-adapters-OLW3XX57.js +0 -6
- package/dist/ollama-adapter-OJQ3FKWK.js +0 -6
- package/dist/openai-adapter-XU46EN7B.js +0 -6
- package/dist/openai-adapter-XU46EN7B.js.map +0 -1
- package/dist/registry-AZ2LOHHJ.js +0 -6
- package/dist/registry-H7B3AHPQ.js +0 -5
- package/dist/server-manager-PTGBHCLS.js +0 -5
- package/dist/session-manager-XOMDMC77.js +0 -12
- package/dist/team-manager-HC4XGCFY.js +0 -11
- package/dist/tmux-manager-GPYZ3WQH.js +0 -6
- package/dist/tools-TSMXMHIF.js +0 -6
package/dist/index.js
CHANGED
|
@@ -1,449 +1,38 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
4
|
-
export {
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
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 {
|
|
19
|
-
|
|
20
|
-
export {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
export {
|
|
26
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
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 {
|
|
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) =>
|
|
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,
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
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
|
-
|
|
784
|
-
|
|
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,
|
|
434
|
+
this.sendError(socket, requestId, RPC_AUTH_ERROR, "Authentication failed");
|
|
838
435
|
return void 0;
|
|
839
436
|
}
|
|
840
|
-
if (
|
|
841
|
-
this.sendError(socket,
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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
|
-
|
|
1042
|
-
if (this.disposed)
|
|
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
|
-
|
|
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: (
|
|
1403
|
-
return
|
|
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 {
|
|
1028
|
+
export { IPCHub, ITerm2Manager, MCPToolBridge, PaneProcess };
|
|
1418
1029
|
//# sourceMappingURL=index.js.map
|
|
1419
1030
|
//# sourceMappingURL=index.js.map
|