@yu_robotics/remote-cli 1.1.27 → 1.1.35
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/dist/client/MessageHandler.d.ts +23 -55
- package/dist/client/MessageHandler.d.ts.map +1 -1
- package/dist/client/MessageHandler.js +289 -265
- package/dist/client/MessageHandler.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +22 -11
- package/dist/commands/start.js.map +1 -1
- package/dist/executor/ClaudePersistentExecutor.d.ts +1 -1
- package/dist/executor/ClaudePersistentExecutor.d.ts.map +1 -1
- package/dist/executor/ClaudePersistentExecutor.js +17 -6
- package/dist/executor/ClaudePersistentExecutor.js.map +1 -1
- package/dist/executor/GeminiExecutor.d.ts +6 -0
- package/dist/executor/GeminiExecutor.d.ts.map +1 -1
- package/dist/executor/GeminiExecutor.js +23 -1
- package/dist/executor/GeminiExecutor.js.map +1 -1
- package/dist/executor/acp/SessionManager.d.ts +8 -0
- package/dist/executor/acp/SessionManager.d.ts.map +1 -1
- package/dist/executor/acp/SessionManager.js +18 -0
- package/dist/executor/acp/SessionManager.js.map +1 -1
- package/dist/executor/index.d.ts +1 -1
- package/dist/executor/index.d.ts.map +1 -1
- package/dist/executor/index.js +3 -3
- package/dist/executor/index.js.map +1 -1
- package/dist/thread/ThreadExecutorPool.d.ts +57 -0
- package/dist/thread/ThreadExecutorPool.d.ts.map +1 -0
- package/dist/thread/ThreadExecutorPool.js +104 -0
- package/dist/thread/ThreadExecutorPool.js.map +1 -0
- package/dist/thread/ThreadManager.d.ts +65 -0
- package/dist/thread/ThreadManager.d.ts.map +1 -0
- package/dist/thread/ThreadManager.js +182 -0
- package/dist/thread/ThreadManager.js.map +1 -0
- package/dist/thread/index.d.ts +6 -0
- package/dist/thread/index.d.ts.map +1 -0
- package/dist/thread/index.js +12 -0
- package/dist/thread/index.js.map +1 -0
- package/dist/thread/types.d.ts +28 -0
- package/dist/thread/types.d.ts.map +1 -0
- package/dist/thread/types.js +11 -0
- package/dist/thread/types.js.map +1 -0
- package/dist/types/index.d.ts +12 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../../src/executor/acp/SessionManager.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;GAQG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,CAAC,EAAE,MAAM;IAK5B,OAAO,CAAC,QAAQ;IAIhB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAKzE;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAgB7C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAO9B,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAMhC"}
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../../src/executor/acp/SessionManager.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;GAQG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,CAAC,EAAE,MAAM;IAK5B,OAAO,CAAC,QAAQ;IAIhB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAKzE;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAgB7C,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAO9B;;;;;;OAMG;IACH,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAYtD,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAMhC"}
|
|
@@ -82,6 +82,24 @@ class SessionManager {
|
|
|
82
82
|
fs.writeFileSync(file, '', 'utf8');
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Truncate session history to the most recent `keepCount` entries.
|
|
87
|
+
* Used by GeminiExecutor's compactWhenFull to reduce context size while
|
|
88
|
+
* preserving recent conversation turns.
|
|
89
|
+
*
|
|
90
|
+
* @returns The number of entries removed.
|
|
91
|
+
*/
|
|
92
|
+
truncate(sessionId, keepCount) {
|
|
93
|
+
const file = this.filePath(sessionId);
|
|
94
|
+
if (!fs.existsSync(file))
|
|
95
|
+
return 0;
|
|
96
|
+
const lines = fs.readFileSync(file, 'utf8').trim().split('\n').filter(Boolean);
|
|
97
|
+
if (lines.length <= keepCount)
|
|
98
|
+
return 0;
|
|
99
|
+
const kept = lines.slice(lines.length - keepCount);
|
|
100
|
+
fs.writeFileSync(file, kept.join('\n') + '\n', 'utf8');
|
|
101
|
+
return lines.length - keepCount;
|
|
102
|
+
}
|
|
85
103
|
remove(sessionId) {
|
|
86
104
|
const file = this.filePath(sessionId);
|
|
87
105
|
if (fs.existsSync(file)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../../src/executor/acp/SessionManager.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AAQzB;;;;;;;;GAQG;AACH,MAAa,cAAc;IACjB,OAAO,CAAS;IAExB,YAAY,OAAgB;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,aAAa,EAAE,iBAAiB,CAAC,CAAC;QACpF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAEO,QAAQ,CAAC,SAAiB;QAChC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,SAAiB,EAAE,IAA0B,EAAE,IAAY;QAChE,MAAM,KAAK,GAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC3D,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IACpF,CAAC;IAED;;;OAGG;IACH,kBAAkB,CAAC,SAAiB;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAEpC,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAElC,MAAM,OAAO,GAAmB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAiB,CAAC,CAAC;QAEhF,MAAM,SAAS,GAAG,OAAO;aACtB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;aAChF,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,OAAO,kCAAkC,SAAS,yBAAyB,CAAC;IAC9E,CAAC;IAED,KAAK,CAAC,SAAiB;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,SAAiB;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"SessionManager.js","sourceRoot":"","sources":["../../../src/executor/acp/SessionManager.ts"],"names":[],"mappings":"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"}
|
package/dist/executor/index.d.ts
CHANGED
|
@@ -31,5 +31,5 @@ export declare function createClaudeExecutor(directoryGuard: DirectoryGuard, typ
|
|
|
31
31
|
* @param initialWorkingDirectory Optional initial working directory
|
|
32
32
|
* @returns IExecutor instance
|
|
33
33
|
*/
|
|
34
|
-
export declare function createExecutor(directoryGuard: DirectoryGuard, executorConfig?: ExecutorConfig, initialWorkingDirectory?: string): IExecutor;
|
|
34
|
+
export declare function createExecutor(directoryGuard: DirectoryGuard, executorConfig?: ExecutorConfig, initialWorkingDirectory?: string, threadId?: string): IExecutor;
|
|
35
35
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAClF,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAmB7C;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,cAAc,EAC9B,IAAI,GAAE,YAAqB,EAC3B,uBAAuB,CAAC,EAAE,MAAM,GAC/B,cAAc,GAAG,wBAAwB,CAiB3C;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,cAAc,EAAE,cAAc,EAC9B,cAAc,GAAE,cAAiC,EACjD,uBAAuB,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAClF,YAAY,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAClG,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAmB7C;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC;AAE3D;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,cAAc,EAC9B,IAAI,GAAE,YAAqB,EAC3B,uBAAuB,CAAC,EAAE,MAAM,GAC/B,cAAc,GAAG,wBAAwB,CAiB3C;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,cAAc,EAAE,cAAc,EAC9B,cAAc,GAAE,cAAiC,EACjD,uBAAuB,CAAC,EAAE,MAAM,EAChC,QAAQ,CAAC,EAAE,MAAM,GAChB,SAAS,CA6BX"}
|
package/dist/executor/index.js
CHANGED
|
@@ -59,7 +59,7 @@ function createClaudeExecutor(directoryGuard, type = 'auto', initialWorkingDirec
|
|
|
59
59
|
* @param initialWorkingDirectory Optional initial working directory
|
|
60
60
|
* @returns IExecutor instance
|
|
61
61
|
*/
|
|
62
|
-
function createExecutor(directoryGuard, executorConfig = { type: 'auto' }, initialWorkingDirectory) {
|
|
62
|
+
function createExecutor(directoryGuard, executorConfig = { type: 'auto' }, initialWorkingDirectory, threadId) {
|
|
63
63
|
switch (executorConfig.type) {
|
|
64
64
|
case 'gemini':
|
|
65
65
|
console.log('[ExecutorFactory] Using Gemini CLI executor (ACP)');
|
|
@@ -72,7 +72,7 @@ function createExecutor(directoryGuard, executorConfig = { type: 'auto' }, initi
|
|
|
72
72
|
});
|
|
73
73
|
case 'claude-persistent':
|
|
74
74
|
console.log('[ExecutorFactory] Using Claude persistent executor');
|
|
75
|
-
return new ClaudePersistentExecutor_1.ClaudePersistentExecutor(directoryGuard, initialWorkingDirectory);
|
|
75
|
+
return new ClaudePersistentExecutor_1.ClaudePersistentExecutor(directoryGuard, initialWorkingDirectory, threadId);
|
|
76
76
|
case 'claude-spawn':
|
|
77
77
|
console.log('[ExecutorFactory] Using Claude spawn executor');
|
|
78
78
|
return new ClaudeExecutor_1.ClaudeExecutor(directoryGuard);
|
|
@@ -83,7 +83,7 @@ function createExecutor(directoryGuard, executorConfig = { type: 'auto' }, initi
|
|
|
83
83
|
return new ClaudeExecutor_1.ClaudeExecutor(directoryGuard);
|
|
84
84
|
}
|
|
85
85
|
console.log('[ExecutorFactory] Using Claude persistent executor (auto)');
|
|
86
|
-
return new ClaudePersistentExecutor_1.ClaudePersistentExecutor(directoryGuard, initialWorkingDirectory);
|
|
86
|
+
return new ClaudePersistentExecutor_1.ClaudePersistentExecutor(directoryGuard, initialWorkingDirectory, threadId);
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":";;;AA4CA,oDAqBC;AAWD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/executor/index.ts"],"names":[],"mappings":";;;AA4CA,oDAqBC;AAWD,wCAkCC;AA7GD,qDAAkD;AAClD,yEAAsE;AACtE,qDAAkD;AAMlD,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,uEAAsE;AAA7D,oIAAA,wBAAwB,OAAA;AACjC,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AAGvB;;GAEG;AACH,SAAS,yBAAyB;IAChC,4CAA4C;IAC5C,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6BAA6B;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAOD;;;;;;;GAOG;AACH,SAAgB,oBAAoB,CAClC,cAA8B,EAC9B,OAAqB,MAAM,EAC3B,uBAAgC;IAEhC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,0FAA0F;QAC1F,IAAI,yBAAyB,EAAE,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;YACvF,OAAO,IAAI,+BAAc,CAAC,cAAc,CAAC,CAAC;QAC5C,CAAC;QACD,gCAAgC;QAChC,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAC;QAC9E,OAAO,IAAI,mDAAwB,CAAC,cAAc,EAAE,uBAAuB,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,OAAO,IAAI,mDAAwB,CAAC,cAAc,EAAE,uBAAuB,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,IAAI,+BAAc,CAAC,cAAc,CAAC,CAAC;AAC5C,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,cAAc,CAC5B,cAA8B,EAC9B,iBAAiC,EAAE,IAAI,EAAE,MAAM,EAAE,EACjD,uBAAgC,EAChC,QAAiB;IAEjB,QAAQ,cAAc,CAAC,IAAI,EAAE,CAAC;QAC5B,KAAK,QAAQ;YACX,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;YACjE,OAAO,IAAI,+BAAc,CAAC,cAAc,EAAE;gBACxC,KAAK,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK;gBACnC,WAAW,EAAE,cAAc,CAAC,MAAM,EAAE,WAAW,IAAI,IAAI;gBACvD,uBAAuB;gBACvB,aAAa,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO;gBAC7C,aAAa,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO;aAC9C,CAAC,CAAC;QAEL,KAAK,mBAAmB;YACtB,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;YAClE,OAAO,IAAI,mDAAwB,CAAC,cAAc,EAAE,uBAAuB,EAAE,QAAQ,CAAC,CAAC;QAEzF,KAAK,cAAc;YACjB,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO,IAAI,+BAAc,CAAC,cAAc,CAAC,CAAC;QAE5C,KAAK,MAAM,CAAC;QACZ;YACE,IAAI,yBAAyB,EAAE,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;gBACvF,OAAO,IAAI,+BAAc,CAAC,cAAc,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;YACzE,OAAO,IAAI,mDAAwB,CAAC,cAAc,EAAE,uBAAuB,EAAE,QAAQ,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { ThreadManager } from './ThreadManager';
|
|
2
|
+
import { ThreadSummary } from './types';
|
|
3
|
+
import type { IExecutor } from '../executor/IExecutor';
|
|
4
|
+
import type { DirectoryGuard } from '../security/DirectoryGuard';
|
|
5
|
+
import type { ExecutorConfig } from '../types/config';
|
|
6
|
+
/**
|
|
7
|
+
* Thread runtime status (not persisted — computed from locking state).
|
|
8
|
+
*/
|
|
9
|
+
type ThreadStatus = 'idle' | 'running' | 'error';
|
|
10
|
+
/**
|
|
11
|
+
* Factory function signature for creating executors (injectable for testing).
|
|
12
|
+
*/
|
|
13
|
+
export type ExecutorFactory = (directoryGuard: DirectoryGuard, config: ExecutorConfig, initialWorkingDirectory?: string, threadId?: string) => IExecutor;
|
|
14
|
+
/**
|
|
15
|
+
* Manages a pool of executor instances — one per thread.
|
|
16
|
+
* Executors are lazily created on first use.
|
|
17
|
+
* Each thread has its own per-thread busy lock and error flag.
|
|
18
|
+
*/
|
|
19
|
+
export declare class ThreadExecutorPool {
|
|
20
|
+
private executors;
|
|
21
|
+
private busy;
|
|
22
|
+
private errorFlag;
|
|
23
|
+
private executorConfig;
|
|
24
|
+
private readonly threadManager;
|
|
25
|
+
private readonly directoryGuard;
|
|
26
|
+
private readonly factory;
|
|
27
|
+
constructor(threadManager: ThreadManager, directoryGuard: DirectoryGuard, executorConfig: ExecutorConfig, factory?: ExecutorFactory);
|
|
28
|
+
/**
|
|
29
|
+
* Get (or lazily create) the executor for a thread.
|
|
30
|
+
* Throws if the threadId is unknown.
|
|
31
|
+
*/
|
|
32
|
+
getExecutor(threadId: string): IExecutor;
|
|
33
|
+
isThreadBusy(threadId: string): boolean;
|
|
34
|
+
setThreadBusy(threadId: string, busy: boolean): void;
|
|
35
|
+
setThreadError(threadId: string, hasError: boolean): void;
|
|
36
|
+
getStatus(threadId: string): ThreadStatus;
|
|
37
|
+
/**
|
|
38
|
+
* Get runtime summaries for all threads (id, name, status).
|
|
39
|
+
*/
|
|
40
|
+
getSummaries(): ThreadSummary[];
|
|
41
|
+
/**
|
|
42
|
+
* Destroy a single thread's executor and remove it from the pool.
|
|
43
|
+
* No-op if no executor has been created for this thread.
|
|
44
|
+
*/
|
|
45
|
+
destroyThread(threadId: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Destroy all executors in the pool.
|
|
48
|
+
*/
|
|
49
|
+
destroyAll(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Switch all threads to a new executor backend.
|
|
52
|
+
* Destroys all existing executors; new ones will be lazily created on next use.
|
|
53
|
+
*/
|
|
54
|
+
switchBackend(newConfig: ExecutorConfig): Promise<void>;
|
|
55
|
+
}
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=ThreadExecutorPool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThreadExecutorPool.d.ts","sourceRoot":"","sources":["../../src/thread/ThreadExecutorPool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD;;GAEG;AACH,KAAK,YAAY,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjD;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,cAAc,EAAE,cAAc,EAC9B,MAAM,EAAE,cAAc,EACtB,uBAAuB,CAAC,EAAE,MAAM,EAChC,QAAQ,CAAC,EAAE,MAAM,KACd,SAAS,CAAC;AAEf;;;;GAIG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,IAAI,CAA8B;IAC1C,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;gBAGxC,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE,eAAgC;IAQ3C;;;OAGG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS;IAmBxC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIvC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IAQpD,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,IAAI;IAOzD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY;IAQzC;;OAEG;IACH,YAAY,IAAI,aAAa,EAAE;IAU/B;;;OAGG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpD;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC;;;OAGG;IACG,aAAa,CAAC,SAAS,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAI9D"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ThreadExecutorPool = void 0;
|
|
4
|
+
const executor_1 = require("../executor");
|
|
5
|
+
/**
|
|
6
|
+
* Manages a pool of executor instances — one per thread.
|
|
7
|
+
* Executors are lazily created on first use.
|
|
8
|
+
* Each thread has its own per-thread busy lock and error flag.
|
|
9
|
+
*/
|
|
10
|
+
class ThreadExecutorPool {
|
|
11
|
+
executors = new Map();
|
|
12
|
+
busy = new Map();
|
|
13
|
+
errorFlag = new Map();
|
|
14
|
+
executorConfig;
|
|
15
|
+
threadManager;
|
|
16
|
+
directoryGuard;
|
|
17
|
+
factory;
|
|
18
|
+
constructor(threadManager, directoryGuard, executorConfig, factory = executor_1.createExecutor) {
|
|
19
|
+
this.threadManager = threadManager;
|
|
20
|
+
this.directoryGuard = directoryGuard;
|
|
21
|
+
this.executorConfig = executorConfig;
|
|
22
|
+
this.factory = factory;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get (or lazily create) the executor for a thread.
|
|
26
|
+
* Throws if the threadId is unknown.
|
|
27
|
+
*/
|
|
28
|
+
getExecutor(threadId) {
|
|
29
|
+
const thread = this.threadManager.getThread(threadId);
|
|
30
|
+
if (!thread)
|
|
31
|
+
throw new Error(`Thread not found: ${threadId}`);
|
|
32
|
+
let executor = this.executors.get(threadId);
|
|
33
|
+
if (!executor) {
|
|
34
|
+
executor = this.factory(this.directoryGuard, this.executorConfig, thread.workingDirectory || undefined, threadId);
|
|
35
|
+
this.executors.set(threadId, executor);
|
|
36
|
+
}
|
|
37
|
+
return executor;
|
|
38
|
+
}
|
|
39
|
+
// ── Per-thread locking ──────────────────────────────────────────────────
|
|
40
|
+
isThreadBusy(threadId) {
|
|
41
|
+
return this.busy.get(threadId) ?? false;
|
|
42
|
+
}
|
|
43
|
+
setThreadBusy(threadId, busy) {
|
|
44
|
+
this.busy.set(threadId, busy);
|
|
45
|
+
if (busy) {
|
|
46
|
+
// Clear error flag when thread starts running
|
|
47
|
+
this.errorFlag.set(threadId, false);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
setThreadError(threadId, hasError) {
|
|
51
|
+
this.errorFlag.set(threadId, hasError);
|
|
52
|
+
if (hasError) {
|
|
53
|
+
this.busy.set(threadId, false);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
getStatus(threadId) {
|
|
57
|
+
if (this.errorFlag.get(threadId))
|
|
58
|
+
return 'error';
|
|
59
|
+
if (this.busy.get(threadId))
|
|
60
|
+
return 'running';
|
|
61
|
+
return 'idle';
|
|
62
|
+
}
|
|
63
|
+
// ── Thread summaries ────────────────────────────────────────────────────
|
|
64
|
+
/**
|
|
65
|
+
* Get runtime summaries for all threads (id, name, status).
|
|
66
|
+
*/
|
|
67
|
+
getSummaries() {
|
|
68
|
+
return this.threadManager.listThreads().map(t => ({
|
|
69
|
+
id: t.id,
|
|
70
|
+
name: t.name,
|
|
71
|
+
status: this.getStatus(t.id),
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
// ── Lifecycle ───────────────────────────────────────────────────────────
|
|
75
|
+
/**
|
|
76
|
+
* Destroy a single thread's executor and remove it from the pool.
|
|
77
|
+
* No-op if no executor has been created for this thread.
|
|
78
|
+
*/
|
|
79
|
+
async destroyThread(threadId) {
|
|
80
|
+
const executor = this.executors.get(threadId);
|
|
81
|
+
if (executor) {
|
|
82
|
+
await executor.destroy();
|
|
83
|
+
this.executors.delete(threadId);
|
|
84
|
+
this.busy.delete(threadId);
|
|
85
|
+
this.errorFlag.delete(threadId);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Destroy all executors in the pool.
|
|
90
|
+
*/
|
|
91
|
+
async destroyAll() {
|
|
92
|
+
await Promise.all(Array.from(this.executors.keys()).map(id => this.destroyThread(id)));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Switch all threads to a new executor backend.
|
|
96
|
+
* Destroys all existing executors; new ones will be lazily created on next use.
|
|
97
|
+
*/
|
|
98
|
+
async switchBackend(newConfig) {
|
|
99
|
+
await this.destroyAll();
|
|
100
|
+
this.executorConfig = newConfig;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
exports.ThreadExecutorPool = ThreadExecutorPool;
|
|
104
|
+
//# sourceMappingURL=ThreadExecutorPool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThreadExecutorPool.js","sourceRoot":"","sources":["../../src/thread/ThreadExecutorPool.ts"],"names":[],"mappings":";;;AAKA,0CAA6C;AAiB7C;;;;GAIG;AACH,MAAa,kBAAkB;IACrB,SAAS,GAAG,IAAI,GAAG,EAAqB,CAAC;IACzC,IAAI,GAAG,IAAI,GAAG,EAAmB,CAAC;IAClC,SAAS,GAAG,IAAI,GAAG,EAAmB,CAAC;IACvC,cAAc,CAAiB;IACtB,aAAa,CAAgB;IAC7B,cAAc,CAAiB;IAC/B,OAAO,CAAkB;IAE1C,YACE,aAA4B,EAC5B,cAA8B,EAC9B,cAA8B,EAC9B,UAA2B,yBAAc;QAEzC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,QAAgB;QAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QAE9D,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,GAAG,IAAI,CAAC,OAAO,CACrB,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,cAAc,EACnB,MAAM,CAAC,gBAAgB,IAAI,SAAS,EACpC,QAAQ,CACT,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,2EAA2E;IAE3E,YAAY,CAAC,QAAgB;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;IAC1C,CAAC;IAED,aAAa,CAAC,QAAgB,EAAE,IAAa;QAC3C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,EAAE,CAAC;YACT,8CAA8C;YAC9C,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,cAAc,CAAC,QAAgB,EAAE,QAAiB;QAChD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,OAAO,CAAC;QACjD,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,SAAS,CAAC;QAC9C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,2EAA2E;IAE3E;;OAEG;IACH,YAAY;QACV,OAAO,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAChD,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7B,CAAC,CAAC,CAAC;IACN,CAAC;IAED,2EAA2E;IAE3E;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CACpE,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,aAAa,CAAC,SAAyB;QAC3C,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;IAClC,CAAC;CACF;AAnHD,gDAmHC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Thread } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Manages thread lifecycle: create, list, update, delete.
|
|
4
|
+
* Persists thread metadata to ~/.remote-cli/threads.json.
|
|
5
|
+
* Session files are stored at ~/.remote-cli/claude-sessions/<threadId>.jsonl
|
|
6
|
+
*/
|
|
7
|
+
export declare class ThreadManager {
|
|
8
|
+
private store;
|
|
9
|
+
private storePath;
|
|
10
|
+
private sessionsDir;
|
|
11
|
+
private constructor();
|
|
12
|
+
/**
|
|
13
|
+
* Initialize ThreadManager. Creates the default thread if no threads exist.
|
|
14
|
+
* Migrates from single-session mode if a legacy .claude-session file exists.
|
|
15
|
+
*
|
|
16
|
+
* @param configDir Base config directory (defaults to ~/.remote-cli)
|
|
17
|
+
*/
|
|
18
|
+
static initialize(configDir?: string): Promise<ThreadManager>;
|
|
19
|
+
/**
|
|
20
|
+
* Read legacy single-session ID from ~/.remote-cli/claude-session for migration.
|
|
21
|
+
*/
|
|
22
|
+
private readLegacySessionId;
|
|
23
|
+
/**
|
|
24
|
+
* Create a new thread.
|
|
25
|
+
* Throws if name already exists, name is invalid, or MAX_THREADS reached.
|
|
26
|
+
*/
|
|
27
|
+
createThread(name: string, workingDirectory: string): Promise<Thread>;
|
|
28
|
+
/**
|
|
29
|
+
* Get a thread by ID.
|
|
30
|
+
*/
|
|
31
|
+
getThread(id: string): Thread | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Get a thread by name.
|
|
34
|
+
*/
|
|
35
|
+
getThreadByName(name: string): Thread | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Get the default thread (always exists).
|
|
38
|
+
*/
|
|
39
|
+
getDefaultThread(): Thread;
|
|
40
|
+
/**
|
|
41
|
+
* Update mutable fields of a thread.
|
|
42
|
+
* Throws if thread not found.
|
|
43
|
+
*/
|
|
44
|
+
updateThread(id: string, updates: Partial<Pick<Thread, 'sessionId' | 'workingDirectory' | 'lastActiveAt'>>): Promise<Thread>;
|
|
45
|
+
/**
|
|
46
|
+
* Delete a thread.
|
|
47
|
+
* Cannot delete the default thread.
|
|
48
|
+
* Removes the thread's session file if it exists.
|
|
49
|
+
*/
|
|
50
|
+
deleteThread(id: string): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* List all threads sorted by createdAt ascending.
|
|
53
|
+
*/
|
|
54
|
+
listThreads(): Thread[];
|
|
55
|
+
/**
|
|
56
|
+
* Get the session file path for a thread.
|
|
57
|
+
* Session files are stored as ~/.remote-cli/claude-sessions/<threadId>.jsonl
|
|
58
|
+
*/
|
|
59
|
+
getSessionFilePath(threadId: string): string;
|
|
60
|
+
/**
|
|
61
|
+
* Persist store to disk.
|
|
62
|
+
*/
|
|
63
|
+
private persist;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=ThreadManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThreadManager.d.ts","sourceRoot":"","sources":["../../src/thread/ThreadManager.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,MAAM,EAKP,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO;IAMP;;;;;OAKG;WACU,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAwCnE;;OAEG;YACW,mBAAmB;IAUjC;;;OAGG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4B3E;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIzC;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIjD;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAM1B;;;OAGG;IACG,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,kBAAkB,GAAG,cAAc,CAAC,CAAC,GAChF,OAAO,CAAC,MAAM,CAAC;IAUlB;;;;OAIG;IACG,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB7C;;OAEG;IACH,WAAW,IAAI,MAAM,EAAE;IAIvB;;;OAGG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI5C;;OAEG;YACW,OAAO;CAGtB"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ThreadManager = void 0;
|
|
7
|
+
const fs_1 = require("fs");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const crypto_1 = require("crypto");
|
|
10
|
+
const types_1 = require("./types");
|
|
11
|
+
/**
|
|
12
|
+
* Manages thread lifecycle: create, list, update, delete.
|
|
13
|
+
* Persists thread metadata to ~/.remote-cli/threads.json.
|
|
14
|
+
* Session files are stored at ~/.remote-cli/claude-sessions/<threadId>.jsonl
|
|
15
|
+
*/
|
|
16
|
+
class ThreadManager {
|
|
17
|
+
store;
|
|
18
|
+
storePath;
|
|
19
|
+
sessionsDir;
|
|
20
|
+
constructor(storePath, sessionsDir, store) {
|
|
21
|
+
this.storePath = storePath;
|
|
22
|
+
this.sessionsDir = sessionsDir;
|
|
23
|
+
this.store = store;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Initialize ThreadManager. Creates the default thread if no threads exist.
|
|
27
|
+
* Migrates from single-session mode if a legacy .claude-session file exists.
|
|
28
|
+
*
|
|
29
|
+
* @param configDir Base config directory (defaults to ~/.remote-cli)
|
|
30
|
+
*/
|
|
31
|
+
static async initialize(configDir) {
|
|
32
|
+
const baseDir = configDir
|
|
33
|
+
? path_1.default.join(configDir, '.remote-cli')
|
|
34
|
+
: path_1.default.join(process.env.HOME || require('os').homedir(), '.remote-cli');
|
|
35
|
+
const storePath = path_1.default.join(baseDir, 'threads.json');
|
|
36
|
+
const sessionsDir = path_1.default.join(baseDir, 'claude-sessions');
|
|
37
|
+
await fs_1.promises.mkdir(baseDir, { recursive: true });
|
|
38
|
+
await fs_1.promises.mkdir(sessionsDir, { recursive: true });
|
|
39
|
+
let store = { threads: {} };
|
|
40
|
+
try {
|
|
41
|
+
const raw = await fs_1.promises.readFile(storePath, 'utf-8');
|
|
42
|
+
store = JSON.parse(raw);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// File does not exist or is invalid — start fresh
|
|
46
|
+
}
|
|
47
|
+
const manager = new ThreadManager(storePath, sessionsDir, store);
|
|
48
|
+
// Ensure default thread always exists
|
|
49
|
+
if (!manager.getThreadByName(types_1.DEFAULT_THREAD_NAME)) {
|
|
50
|
+
const sessionId = await manager.readLegacySessionId(baseDir);
|
|
51
|
+
const defaultThread = {
|
|
52
|
+
id: (0, crypto_1.randomUUID)(),
|
|
53
|
+
name: types_1.DEFAULT_THREAD_NAME,
|
|
54
|
+
sessionId,
|
|
55
|
+
workingDirectory: process.cwd(),
|
|
56
|
+
createdAt: Date.now(),
|
|
57
|
+
lastActiveAt: Date.now(),
|
|
58
|
+
};
|
|
59
|
+
store.threads[defaultThread.id] = defaultThread;
|
|
60
|
+
await manager.persist();
|
|
61
|
+
}
|
|
62
|
+
return manager;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Read legacy single-session ID from ~/.remote-cli/claude-session for migration.
|
|
66
|
+
*/
|
|
67
|
+
async readLegacySessionId(baseDir) {
|
|
68
|
+
try {
|
|
69
|
+
const legacyPath = path_1.default.join(baseDir, 'claude-session');
|
|
70
|
+
const content = await fs_1.promises.readFile(legacyPath, 'utf-8');
|
|
71
|
+
return content.trim() || null;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Create a new thread.
|
|
79
|
+
* Throws if name already exists, name is invalid, or MAX_THREADS reached.
|
|
80
|
+
*/
|
|
81
|
+
async createThread(name, workingDirectory) {
|
|
82
|
+
if (!name || !types_1.THREAD_NAME_REGEX.test(name)) {
|
|
83
|
+
throw new Error(`Invalid thread name: "${name}". Use alphanumeric characters and hyphens only (no leading/trailing hyphens).`);
|
|
84
|
+
}
|
|
85
|
+
if (this.getThreadByName(name)) {
|
|
86
|
+
throw new Error(`Thread "${name}" already exists.`);
|
|
87
|
+
}
|
|
88
|
+
const count = Object.keys(this.store.threads).length;
|
|
89
|
+
if (count >= types_1.MAX_THREADS) {
|
|
90
|
+
throw new Error(`Maximum ${types_1.MAX_THREADS} threads allowed. Delete an existing thread first.`);
|
|
91
|
+
}
|
|
92
|
+
const thread = {
|
|
93
|
+
id: (0, crypto_1.randomUUID)(),
|
|
94
|
+
name,
|
|
95
|
+
sessionId: null,
|
|
96
|
+
workingDirectory,
|
|
97
|
+
createdAt: Date.now(),
|
|
98
|
+
lastActiveAt: Date.now(),
|
|
99
|
+
};
|
|
100
|
+
this.store.threads[thread.id] = thread;
|
|
101
|
+
await this.persist();
|
|
102
|
+
return thread;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get a thread by ID.
|
|
106
|
+
*/
|
|
107
|
+
getThread(id) {
|
|
108
|
+
return this.store.threads[id];
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get a thread by name.
|
|
112
|
+
*/
|
|
113
|
+
getThreadByName(name) {
|
|
114
|
+
return Object.values(this.store.threads).find(t => t.name === name);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get the default thread (always exists).
|
|
118
|
+
*/
|
|
119
|
+
getDefaultThread() {
|
|
120
|
+
const def = this.getThreadByName(types_1.DEFAULT_THREAD_NAME);
|
|
121
|
+
if (!def)
|
|
122
|
+
throw new Error('Default thread missing — this should never happen');
|
|
123
|
+
return def;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Update mutable fields of a thread.
|
|
127
|
+
* Throws if thread not found.
|
|
128
|
+
*/
|
|
129
|
+
async updateThread(id, updates) {
|
|
130
|
+
const thread = this.store.threads[id];
|
|
131
|
+
if (!thread)
|
|
132
|
+
throw new Error(`Thread not found: ${id}`);
|
|
133
|
+
const updated = { ...thread, ...updates };
|
|
134
|
+
this.store.threads[id] = updated;
|
|
135
|
+
await this.persist();
|
|
136
|
+
return updated;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Delete a thread.
|
|
140
|
+
* Cannot delete the default thread.
|
|
141
|
+
* Removes the thread's session file if it exists.
|
|
142
|
+
*/
|
|
143
|
+
async deleteThread(id) {
|
|
144
|
+
const thread = this.store.threads[id];
|
|
145
|
+
if (!thread)
|
|
146
|
+
throw new Error(`Thread not found: ${id}`);
|
|
147
|
+
if (thread.name === types_1.DEFAULT_THREAD_NAME) {
|
|
148
|
+
throw new Error('Cannot delete the default thread.');
|
|
149
|
+
}
|
|
150
|
+
delete this.store.threads[id];
|
|
151
|
+
await this.persist();
|
|
152
|
+
// Remove session file
|
|
153
|
+
const sessionPath = this.getSessionFilePath(id);
|
|
154
|
+
try {
|
|
155
|
+
await fs_1.promises.unlink(sessionPath);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// File may not exist, that's fine
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* List all threads sorted by createdAt ascending.
|
|
163
|
+
*/
|
|
164
|
+
listThreads() {
|
|
165
|
+
return Object.values(this.store.threads).sort((a, b) => a.createdAt - b.createdAt);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Get the session file path for a thread.
|
|
169
|
+
* Session files are stored as ~/.remote-cli/claude-sessions/<threadId>.jsonl
|
|
170
|
+
*/
|
|
171
|
+
getSessionFilePath(threadId) {
|
|
172
|
+
return path_1.default.join(this.sessionsDir, `${threadId}.jsonl`);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Persist store to disk.
|
|
176
|
+
*/
|
|
177
|
+
async persist() {
|
|
178
|
+
await fs_1.promises.writeFile(this.storePath, JSON.stringify(this.store, null, 2), 'utf-8');
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
exports.ThreadManager = ThreadManager;
|
|
182
|
+
//# sourceMappingURL=ThreadManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThreadManager.js","sourceRoot":"","sources":["../../src/thread/ThreadManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { ThreadManager } from './ThreadManager';
|
|
2
|
+
export { ThreadExecutorPool } from './ThreadExecutorPool';
|
|
3
|
+
export type { ExecutorFactory } from './ThreadExecutorPool';
|
|
4
|
+
export type { Thread, ThreadStore, ThreadSummary } from './types';
|
|
5
|
+
export { MAX_THREADS, DEFAULT_THREAD_NAME, THREAD_NAME_REGEX } from './types';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/thread/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.THREAD_NAME_REGEX = exports.DEFAULT_THREAD_NAME = exports.MAX_THREADS = exports.ThreadExecutorPool = exports.ThreadManager = void 0;
|
|
4
|
+
var ThreadManager_1 = require("./ThreadManager");
|
|
5
|
+
Object.defineProperty(exports, "ThreadManager", { enumerable: true, get: function () { return ThreadManager_1.ThreadManager; } });
|
|
6
|
+
var ThreadExecutorPool_1 = require("./ThreadExecutorPool");
|
|
7
|
+
Object.defineProperty(exports, "ThreadExecutorPool", { enumerable: true, get: function () { return ThreadExecutorPool_1.ThreadExecutorPool; } });
|
|
8
|
+
var types_1 = require("./types");
|
|
9
|
+
Object.defineProperty(exports, "MAX_THREADS", { enumerable: true, get: function () { return types_1.MAX_THREADS; } });
|
|
10
|
+
Object.defineProperty(exports, "DEFAULT_THREAD_NAME", { enumerable: true, get: function () { return types_1.DEFAULT_THREAD_NAME; } });
|
|
11
|
+
Object.defineProperty(exports, "THREAD_NAME_REGEX", { enumerable: true, get: function () { return types_1.THREAD_NAME_REGEX; } });
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/thread/index.ts"],"names":[],"mappings":";;;AAAA,iDAAgD;AAAvC,8GAAA,aAAa,OAAA;AACtB,2DAA0D;AAAjD,wHAAA,kBAAkB,OAAA;AAG3B,iCAA8E;AAArE,oGAAA,WAAW,OAAA;AAAE,4GAAA,mBAAmB,OAAA;AAAE,0GAAA,iBAAiB,OAAA"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thread state model for true parallel execution.
|
|
3
|
+
* Each thread has its own independent executor process.
|
|
4
|
+
*/
|
|
5
|
+
export declare const MAX_THREADS = 5;
|
|
6
|
+
export declare const DEFAULT_THREAD_NAME = "default";
|
|
7
|
+
export declare const THREAD_NAME_REGEX: RegExp;
|
|
8
|
+
export interface Thread {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
sessionId: string | null;
|
|
12
|
+
workingDirectory: string;
|
|
13
|
+
createdAt: number;
|
|
14
|
+
lastActiveAt: number;
|
|
15
|
+
}
|
|
16
|
+
export interface ThreadStore {
|
|
17
|
+
threads: Record<string, Thread>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Lightweight thread summary for wire protocol and card display.
|
|
21
|
+
* Status is runtime-only (not persisted) — computed from ThreadExecutorPool.
|
|
22
|
+
*/
|
|
23
|
+
export interface ThreadSummary {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
status: 'idle' | 'running' | 'error';
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/thread/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAC7C,eAAO,MAAM,iBAAiB,QAA6D,CAAC;AAE5F,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;CACtC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Thread state model for true parallel execution.
|
|
4
|
+
* Each thread has its own independent executor process.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.THREAD_NAME_REGEX = exports.DEFAULT_THREAD_NAME = exports.MAX_THREADS = void 0;
|
|
8
|
+
exports.MAX_THREADS = 5;
|
|
9
|
+
exports.DEFAULT_THREAD_NAME = 'default';
|
|
10
|
+
exports.THREAD_NAME_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9-]{0,28}[a-zA-Z0-9]$|^[a-zA-Z0-9]$/;
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/thread/types.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEU,QAAA,WAAW,GAAG,CAAC,CAAC;AAChB,QAAA,mBAAmB,GAAG,SAAS,CAAC;AAChC,QAAA,iBAAiB,GAAG,0DAA0D,CAAC"}
|