agkan 3.0.1 → 3.2.0
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/README.ja.md +6 -6
- package/README.md +6 -6
- package/dist/board/boardRenderer.d.ts +7 -5
- package/dist/board/boardRenderer.d.ts.map +1 -1
- package/dist/board/boardRenderer.js +17 -59
- package/dist/board/boardRenderer.js.map +1 -1
- package/dist/board/boardRoutes.d.ts.map +1 -1
- package/dist/board/boardRoutes.js +115 -10
- package/dist/board/boardRoutes.js.map +1 -1
- package/dist/board/client/board.js +61 -7
- package/dist/cli/commands/task/add.d.ts.map +1 -1
- package/dist/cli/commands/task/add.js +3 -3
- package/dist/cli/commands/task/add.js.map +1 -1
- package/dist/cli/commands/task/archive.d.ts +6 -0
- package/dist/cli/commands/task/archive.d.ts.map +1 -0
- package/dist/cli/commands/task/archive.js +120 -0
- package/dist/cli/commands/task/archive.js.map +1 -0
- package/dist/cli/commands/task/copy.js +2 -2
- package/dist/cli/commands/task/copy.js.map +1 -1
- package/dist/cli/commands/task/find.js +2 -2
- package/dist/cli/commands/task/find.js.map +1 -1
- package/dist/cli/commands/task/get.d.ts.map +1 -1
- package/dist/cli/commands/task/get.js +4 -0
- package/dist/cli/commands/task/get.js.map +1 -1
- package/dist/cli/commands/task/list.d.ts.map +1 -1
- package/dist/cli/commands/task/list.js +4 -2
- package/dist/cli/commands/task/list.js.map +1 -1
- package/dist/cli/commands/task/purge.d.ts.map +1 -1
- package/dist/cli/commands/task/purge.js +2 -9
- package/dist/cli/commands/task/purge.js.map +1 -1
- package/dist/cli/commands/task/unarchive.d.ts +6 -0
- package/dist/cli/commands/task/unarchive.d.ts.map +1 -0
- package/dist/cli/commands/task/unarchive.js +86 -0
- package/dist/cli/commands/task/unarchive.js.map +1 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/db/adapters/sqlite-storage-backend.d.ts.map +1 -1
- package/dist/db/adapters/sqlite-storage-backend.js +29 -3
- package/dist/db/adapters/sqlite-storage-backend.js.map +1 -1
- package/dist/db/config.d.ts +5 -0
- package/dist/db/config.d.ts.map +1 -1
- package/dist/db/config.js +12 -1
- package/dist/db/config.js.map +1 -1
- package/dist/db/migrations/20260412000000_add_archive_status.d.ts +3 -0
- package/dist/db/migrations/20260412000000_add_archive_status.d.ts.map +1 -0
- package/dist/db/migrations/20260412000000_add_archive_status.js +10 -0
- package/dist/db/migrations/20260412000000_add_archive_status.js.map +1 -0
- package/dist/db/migrations/20260412000000_add_is_archived_to_tasks.d.ts +3 -0
- package/dist/db/migrations/20260412000000_add_is_archived_to_tasks.d.ts.map +1 -0
- package/dist/db/migrations/20260412000000_add_is_archived_to_tasks.js +10 -0
- package/dist/db/migrations/20260412000000_add_is_archived_to_tasks.js.map +1 -0
- package/dist/db/migrations/index.d.ts.map +1 -1
- package/dist/db/migrations/index.js +6 -0
- package/dist/db/migrations/index.js.map +1 -1
- package/dist/db/reset.d.ts +3 -2
- package/dist/db/reset.d.ts.map +1 -1
- package/dist/db/reset.js +22 -21
- package/dist/db/reset.js.map +1 -1
- package/dist/db/types/repository.d.ts +6 -0
- package/dist/db/types/repository.d.ts.map +1 -1
- package/dist/models/Task.d.ts +1 -0
- package/dist/models/Task.d.ts.map +1 -1
- package/dist/services/CodexProcessService.d.ts +44 -0
- package/dist/services/CodexProcessService.d.ts.map +1 -0
- package/dist/services/CodexProcessService.js +257 -0
- package/dist/services/CodexProcessService.js.map +1 -0
- package/dist/services/FileService.d.ts.map +1 -1
- package/dist/services/FileService.js +3 -1
- package/dist/services/FileService.js.map +1 -1
- package/dist/services/IProcessService.d.ts +44 -0
- package/dist/services/IProcessService.d.ts.map +1 -0
- package/dist/services/IProcessService.js +3 -0
- package/dist/services/IProcessService.js.map +1 -0
- package/dist/services/ProcessServiceFactory.d.ts +18 -0
- package/dist/services/ProcessServiceFactory.d.ts.map +1 -0
- package/dist/services/ProcessServiceFactory.js +27 -0
- package/dist/services/ProcessServiceFactory.js.map +1 -0
- package/dist/services/TaskService.d.ts +17 -1
- package/dist/services/TaskService.d.ts.map +1 -1
- package/dist/services/TaskService.js +40 -7
- package/dist/services/TaskService.js.map +1 -1
- package/dist/utils/date.d.ts +10 -0
- package/dist/utils/date.d.ts.map +1 -0
- package/dist/utils/date.js +17 -0
- package/dist/utils/date.js.map +1 -0
- package/package.json +3 -3
- package/dist/board/boardScript.d.ts +0 -2
- package/dist/board/boardScript.d.ts.map +0 -1
- package/dist/board/boardScript.js +0 -1202
- package/dist/board/boardScript.js.map +0 -1
- package/dist/cli/utils/response-formatter.d.ts +0 -19
- package/dist/cli/utils/response-formatter.d.ts.map +0 -1
- package/dist/cli/utils/response-formatter.js +0 -43
- package/dist/cli/utils/response-formatter.js.map +0 -1
- package/dist/services/ProcessService.d.ts +0 -54
- package/dist/services/ProcessService.d.ts.map +0 -1
- package/dist/services/ProcessService.js +0 -147
- package/dist/services/ProcessService.js.map +0 -1
- package/dist/services/TmuxService.d.ts +0 -2
- package/dist/services/TmuxService.d.ts.map +0 -1
- package/dist/services/TmuxService.js +0 -7
- package/dist/services/TmuxService.js.map +0 -1
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.migrations = void 0;
|
|
4
4
|
const _20260328000000_initial_schema_1 = require("./20260328000000_initial_schema");
|
|
5
5
|
const _20260329000000_add_session_id_to_task_run_logs_1 = require("./20260329000000_add_session_id_to_task_run_logs");
|
|
6
|
+
const _20260412000000_add_is_archived_to_tasks_1 = require("./20260412000000_add_is_archived_to_tasks");
|
|
6
7
|
exports.migrations = [
|
|
7
8
|
{
|
|
8
9
|
version: '20260328000000',
|
|
@@ -14,5 +15,10 @@ exports.migrations = [
|
|
|
14
15
|
description: 'add_session_id_to_task_run_logs',
|
|
15
16
|
up: _20260329000000_add_session_id_to_task_run_logs_1.up,
|
|
16
17
|
},
|
|
18
|
+
{
|
|
19
|
+
version: '20260412000000',
|
|
20
|
+
description: 'add_is_archived_to_tasks',
|
|
21
|
+
up: _20260412000000_add_is_archived_to_tasks_1.up,
|
|
22
|
+
},
|
|
17
23
|
];
|
|
18
24
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":";;;AAGA,oFAAsE;AACtE,sHAAsF;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/migrations/index.ts"],"names":[],"mappings":";;;AAGA,oFAAsE;AACtE,sHAAsF;AACtF,wGAAgF;AAEnE,QAAA,UAAU,GAAgB;IACrC;QACE,OAAO,EAAE,gBAAgB;QACzB,WAAW,EAAE,gBAAgB;QAC7B,EAAE,EAAE,mCAAa;KAClB;IACD;QACE,OAAO,EAAE,gBAAgB;QACzB,WAAW,EAAE,iCAAiC;QAC9C,EAAE,EAAE,oDAAY;KACjB;IACD;QACE,OAAO,EAAE,gBAAgB;QACzB,WAAW,EAAE,0BAA0B;QACvC,EAAE,EAAE,6CAAa;KAClB;CACF,CAAC"}
|
package/dist/db/reset.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Reset the database
|
|
3
|
-
*
|
|
2
|
+
* Reset the database by deleting all rows in every data table.
|
|
3
|
+
* Reuses the existing connection to avoid file I/O overhead.
|
|
4
|
+
* Ensures a clean state by calling before test execution.
|
|
4
5
|
*
|
|
5
6
|
* @throws Error if called outside of test mode (NODE_ENV=test)
|
|
6
7
|
*/
|
package/dist/db/reset.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/db/reset.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../src/db/reset.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wBAAgB,aAAa,IAAI,IAAI,CA6BpC"}
|
package/dist/db/reset.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.resetDatabase = resetDatabase;
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
4
|
const config_1 = require("./config");
|
|
9
5
|
const connection_1 = require("./connection");
|
|
10
6
|
/**
|
|
11
|
-
* Reset the database
|
|
12
|
-
*
|
|
7
|
+
* Reset the database by deleting all rows in every data table.
|
|
8
|
+
* Reuses the existing connection to avoid file I/O overhead.
|
|
9
|
+
* Ensures a clean state by calling before test execution.
|
|
13
10
|
*
|
|
14
11
|
* @throws Error if called outside of test mode (NODE_ENV=test)
|
|
15
12
|
*/
|
|
@@ -19,20 +16,24 @@ function resetDatabase() {
|
|
|
19
16
|
throw new Error('resetDatabase() must only be called in test mode (NODE_ENV=test). ' +
|
|
20
17
|
'Calling this outside test mode risks deleting the production database.');
|
|
21
18
|
}
|
|
22
|
-
//
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
//
|
|
27
|
-
//
|
|
28
|
-
//
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
19
|
+
// Get or lazily initialize the database connection.
|
|
20
|
+
// Avoids closing/reopening the connection and eliminates file I/O.
|
|
21
|
+
const db = connection_1.DatabaseConnection.getRawDatabase();
|
|
22
|
+
// Clear all data tables without file I/O.
|
|
23
|
+
// Disabling foreign keys allows deleting in any order without constraint
|
|
24
|
+
// violations. Clearing sqlite_sequence resets AUTOINCREMENT counters so
|
|
25
|
+
// that IDs start from 1, consistent with a freshly created database.
|
|
26
|
+
db.exec(`
|
|
27
|
+
PRAGMA foreign_keys = OFF;
|
|
28
|
+
DELETE FROM task_run_logs;
|
|
29
|
+
DELETE FROM task_comments;
|
|
30
|
+
DELETE FROM task_metadata;
|
|
31
|
+
DELETE FROM task_tags;
|
|
32
|
+
DELETE FROM task_blocks;
|
|
33
|
+
DELETE FROM tasks;
|
|
34
|
+
DELETE FROM tags;
|
|
35
|
+
DELETE FROM sqlite_sequence;
|
|
36
|
+
PRAGMA foreign_keys = ON;
|
|
37
|
+
`);
|
|
37
38
|
}
|
|
38
39
|
//# sourceMappingURL=reset.js.map
|
package/dist/db/reset.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/db/reset.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reset.js","sourceRoot":"","sources":["../../src/db/reset.ts"],"names":[],"mappings":";;AAUA,sCA6BC;AAvCD,qCAAsC;AACtC,6CAAkD;AAElD;;;;;;GAMG;AACH,SAAgB,aAAa;IAC3B,uDAAuD;IACvD,IAAI,CAAC,IAAA,mBAAU,GAAE,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,oEAAoE;YAClE,wEAAwE,CAC3E,CAAC;IACJ,CAAC;IAED,oDAAoD;IACpD,mEAAmE;IACnE,MAAM,EAAE,GAAG,+BAAkB,CAAC,cAAc,EAAE,CAAC;IAE/C,0CAA0C;IAC1C,yEAAyE;IACzE,wEAAwE;IACxE,qEAAqE;IACrE,EAAE,CAAC,IAAI,CAAC;;;;;;;;;;;GAWP,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -20,6 +20,8 @@ export interface TaskFilter {
|
|
|
20
20
|
tagIds?: number[];
|
|
21
21
|
priority?: Priority | Priority[];
|
|
22
22
|
search?: string;
|
|
23
|
+
/** If true, include archived tasks (is_archived=1). Default: false (exclude archived) */
|
|
24
|
+
includeArchived?: boolean;
|
|
23
25
|
}
|
|
24
26
|
/** Sort options for task listing */
|
|
25
27
|
export interface TaskSortOptions {
|
|
@@ -54,6 +56,10 @@ export interface TaskRepository {
|
|
|
54
56
|
findForPurge(beforeDate: string, statuses: TaskStatus[]): Task[];
|
|
55
57
|
/** Delete multiple tasks by IDs */
|
|
56
58
|
deleteMany(ids: number[]): number;
|
|
59
|
+
/** Set is_archived=1 on multiple tasks by IDs */
|
|
60
|
+
archiveMany(ids: number[]): number;
|
|
61
|
+
/** Set is_archived=0 on multiple tasks by IDs */
|
|
62
|
+
unarchiveMany(ids: number[]): number;
|
|
57
63
|
}
|
|
58
64
|
/**
|
|
59
65
|
* Repository for Tag entity data access
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/db/types/repository.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,IAAI,EACJ,eAAe,EACf,eAAe,EACf,UAAU,EACV,GAAG,EACH,cAAc,EACd,cAAc,EACd,SAAS,EACT,oBAAoB,EACpB,OAAO,EACP,kBAAkB,EAClB,YAAY,EACZ,uBAAuB,EACvB,WAAW,EACX,sBAAsB,EACvB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,sCAAsC;AACtC,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,UAAU,GAAG,UAAU,EAAE,CAAC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,GAAG,QAAQ,EAAE,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/db/types/repository.ts"],"names":[],"mappings":"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"}
|
package/dist/models/Task.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Task.d.ts","sourceRoot":"","sources":["../../src/models/Task.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvG;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"Task.d.ts","sourceRoot":"","sources":["../../src/models/Task.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvG;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { StorageBackend } from '../db/types/repository';
|
|
2
|
+
import type { IProcessService } from './IProcessService';
|
|
3
|
+
import type { RunLog, SubscribeCallback } from './ClaudeProcessService';
|
|
4
|
+
/**
|
|
5
|
+
* CodexProcessService
|
|
6
|
+
* Manages codex CLI processes running in JSON mode.
|
|
7
|
+
* Parses JSONL output from codex and converts to OutputEvent format.
|
|
8
|
+
* Implements IProcessService for use with ProcessServiceFactory.
|
|
9
|
+
*/
|
|
10
|
+
export declare class CodexProcessService implements IProcessService {
|
|
11
|
+
private processes;
|
|
12
|
+
private db;
|
|
13
|
+
constructor(db?: StorageBackend | null);
|
|
14
|
+
/**
|
|
15
|
+
* Start a codex process for the given taskId and prompt.
|
|
16
|
+
* Prevents duplicate processes for the same taskId.
|
|
17
|
+
*/
|
|
18
|
+
startProcess(taskId: number, prompt: string, command?: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Stop the process for the given taskId.
|
|
21
|
+
* Returns true if the process was found and signalled, false otherwise.
|
|
22
|
+
*/
|
|
23
|
+
stopProcess(taskId: number): boolean;
|
|
24
|
+
/**
|
|
25
|
+
* List all currently running tasks with their command type.
|
|
26
|
+
*/
|
|
27
|
+
listRunningTasks(): {
|
|
28
|
+
taskId: number;
|
|
29
|
+
command: string;
|
|
30
|
+
}[];
|
|
31
|
+
/**
|
|
32
|
+
* Subscribe to output events for a given taskId.
|
|
33
|
+
* If process is running: replay past events and subscribe to future events.
|
|
34
|
+
* If no process but DB available: replay last saved log from DB.
|
|
35
|
+
* Returns an unsubscribe function.
|
|
36
|
+
*/
|
|
37
|
+
subscribeOutput(taskId: number, callback: SubscribeCallback): () => void;
|
|
38
|
+
/**
|
|
39
|
+
* Get saved run logs for a task from DB (most recent first, up to 5).
|
|
40
|
+
*/
|
|
41
|
+
getRunLogs(taskId: number): RunLog[];
|
|
42
|
+
private _notifySubscribers;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=CodexProcessService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexProcessService.d.ts","sourceRoot":"","sources":["../../src/services/CodexProcessService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAI7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAe,MAAM,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AA8BrF;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,eAAe;IACzD,OAAO,CAAC,SAAS,CAAuC;IACxD,OAAO,CAAC,EAAE,CAAwB;gBAEtB,EAAE,CAAC,EAAE,cAAc,GAAG,IAAI;IAItC;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,GAAG,IAAI;IA2J3E;;;OAGG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAapC;;OAEG;IACH,gBAAgB,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE;IAIzD;;;;;OAKG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI;IA4BxE;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAgBpC,OAAO,CAAC,kBAAkB;CA+B3B"}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CodexProcessService = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const logger_1 = require("../utils/logger");
|
|
6
|
+
const errors_1 = require("../errors");
|
|
7
|
+
/**
|
|
8
|
+
* CodexProcessService
|
|
9
|
+
* Manages codex CLI processes running in JSON mode.
|
|
10
|
+
* Parses JSONL output from codex and converts to OutputEvent format.
|
|
11
|
+
* Implements IProcessService for use with ProcessServiceFactory.
|
|
12
|
+
*/
|
|
13
|
+
class CodexProcessService {
|
|
14
|
+
processes = new Map();
|
|
15
|
+
db;
|
|
16
|
+
constructor(db) {
|
|
17
|
+
this.db = db ?? null;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Start a codex process for the given taskId and prompt.
|
|
21
|
+
* Prevents duplicate processes for the same taskId.
|
|
22
|
+
*/
|
|
23
|
+
startProcess(taskId, prompt, command = 'run') {
|
|
24
|
+
if (this.processes.has(taskId)) {
|
|
25
|
+
const existing = this.processes.get(taskId);
|
|
26
|
+
const pid = existing.process.pid;
|
|
27
|
+
const killed = existing.process.killed;
|
|
28
|
+
const exitCode = existing.process.exitCode;
|
|
29
|
+
const signalCode = existing.process.signalCode;
|
|
30
|
+
const aliveMs = Date.now() - existing.startedAt.getTime();
|
|
31
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] startProcess DUPLICATE taskId=${taskId} existing pid=${pid} killed=${killed} exitCode=${exitCode} signalCode=${signalCode} aliveMs=${aliveMs} command=${existing.command}`);
|
|
32
|
+
throw new errors_1.ConflictError(`Process for taskId ${taskId} is already running`);
|
|
33
|
+
}
|
|
34
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] startProcess taskId=${taskId} command=${command}`);
|
|
35
|
+
const child = (0, child_process_1.spawn)('codex', ['exec', '--json', '--dangerously-bypass-approvals-and-sandbox', prompt], {
|
|
36
|
+
cwd: process.cwd(),
|
|
37
|
+
env: process.env,
|
|
38
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
39
|
+
});
|
|
40
|
+
const info = {
|
|
41
|
+
taskId,
|
|
42
|
+
command,
|
|
43
|
+
process: child,
|
|
44
|
+
startedAt: new Date(),
|
|
45
|
+
status: 'running',
|
|
46
|
+
outputBuffer: [],
|
|
47
|
+
processedEvents: [],
|
|
48
|
+
subscribers: new Set(),
|
|
49
|
+
runLogId: null,
|
|
50
|
+
sessionId: null,
|
|
51
|
+
};
|
|
52
|
+
this.processes.set(taskId, info);
|
|
53
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] process added to map taskId=${taskId} total=${this.processes.size}`);
|
|
54
|
+
if (this.db) {
|
|
55
|
+
info.runLogId = this.db.runLogs.create(info.taskId, info.startedAt.toISOString());
|
|
56
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] run log created id=${info.runLogId} taskId=${taskId}`);
|
|
57
|
+
}
|
|
58
|
+
let lineBuffer = '';
|
|
59
|
+
let spawnError = false;
|
|
60
|
+
child.on('error', (err) => {
|
|
61
|
+
spawnError = true;
|
|
62
|
+
const message = err.code === 'ENOENT' ? 'codex CLI not found in PATH' : err.message;
|
|
63
|
+
console.error(`[CodexProcessService] spawn error for taskId=${taskId}: ${message}`, err);
|
|
64
|
+
const errorEvent = { kind: 'error', message };
|
|
65
|
+
info.processedEvents.push(errorEvent);
|
|
66
|
+
info.subscribers.forEach((cb) => cb(errorEvent));
|
|
67
|
+
const doneEvent = { kind: 'done', exitCode: 1 };
|
|
68
|
+
info.subscribers.forEach((cb) => cb(doneEvent));
|
|
69
|
+
if (this.db && info.runLogId) {
|
|
70
|
+
const finishedAt = new Date().toISOString();
|
|
71
|
+
this.db.runLogs.updateFinished(info.runLogId, finishedAt, 1, JSON.stringify(info.processedEvents));
|
|
72
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] run log updated (error) id=${info.runLogId} taskId=${taskId}`);
|
|
73
|
+
}
|
|
74
|
+
if (this.processes.get(taskId) === info) {
|
|
75
|
+
this.processes.delete(taskId);
|
|
76
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] process removed from map (error) taskId=${taskId} total=${this.processes.size}`);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] process error skipped map delete (stale entry) taskId=${taskId}`);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
child.stdout?.on('data', (chunk) => {
|
|
83
|
+
lineBuffer += chunk.toString();
|
|
84
|
+
const lines = lineBuffer.split('\n');
|
|
85
|
+
// Keep the last (potentially incomplete) line in the buffer
|
|
86
|
+
lineBuffer = lines.pop() ?? '';
|
|
87
|
+
for (const line of lines) {
|
|
88
|
+
const trimmed = line.trim();
|
|
89
|
+
if (!trimmed)
|
|
90
|
+
continue;
|
|
91
|
+
let parsed;
|
|
92
|
+
try {
|
|
93
|
+
parsed = JSON.parse(trimmed);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Skip non-JSON lines
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
info.outputBuffer.push(parsed);
|
|
100
|
+
this._notifySubscribers(info, parsed);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
let stderrBuffer = '';
|
|
104
|
+
child.stderr?.on('data', (chunk) => {
|
|
105
|
+
stderrBuffer += chunk.toString();
|
|
106
|
+
});
|
|
107
|
+
child.on('close', (code) => {
|
|
108
|
+
if (spawnError)
|
|
109
|
+
return;
|
|
110
|
+
// Process any remaining buffered line
|
|
111
|
+
const remaining = lineBuffer.trim();
|
|
112
|
+
if (remaining) {
|
|
113
|
+
try {
|
|
114
|
+
const parsed = JSON.parse(remaining);
|
|
115
|
+
info.outputBuffer.push(parsed);
|
|
116
|
+
this._notifySubscribers(info, parsed);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// Ignore
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (stderrBuffer) {
|
|
123
|
+
console.error(`[CodexProcessService] stderr for taskId=${taskId}:\n${stderrBuffer}`);
|
|
124
|
+
const errorEvent = { kind: 'error', message: stderrBuffer };
|
|
125
|
+
info.processedEvents.push(errorEvent);
|
|
126
|
+
info.subscribers.forEach((cb) => cb(errorEvent));
|
|
127
|
+
}
|
|
128
|
+
const exitCode = code ?? 0;
|
|
129
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] process close taskId=${taskId} exitCode=${exitCode}`);
|
|
130
|
+
if (exitCode !== 0) {
|
|
131
|
+
console.error(`[CodexProcessService] process exited with code ${exitCode} for taskId=${taskId}`);
|
|
132
|
+
}
|
|
133
|
+
const doneEvent = { kind: 'done', exitCode };
|
|
134
|
+
info.subscribers.forEach((cb) => cb(doneEvent));
|
|
135
|
+
// Finalize log in DB before removing process
|
|
136
|
+
if (this.db && info.runLogId) {
|
|
137
|
+
const finishedAt = new Date().toISOString();
|
|
138
|
+
this.db.runLogs.updateFinished(info.runLogId, finishedAt, exitCode, JSON.stringify(info.processedEvents));
|
|
139
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] run log finalized id=${info.runLogId} taskId=${taskId} exitCode=${exitCode}`);
|
|
140
|
+
// Rotate: keep only latest 5 per task
|
|
141
|
+
const ids = this.db.runLogs.findIdsByTaskId(info.taskId);
|
|
142
|
+
if (ids.length > 5) {
|
|
143
|
+
const toDelete = ids.slice(5);
|
|
144
|
+
this.db.runLogs.deleteMany(toDelete);
|
|
145
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] rotated run logs taskId=${taskId} deleted=${toDelete.length}`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (this.processes.get(taskId) === info) {
|
|
149
|
+
this.processes.delete(taskId);
|
|
150
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] process removed from map (close) taskId=${taskId} total=${this.processes.size}`);
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] process close skipped map delete (stale entry) taskId=${taskId}`);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Stop the process for the given taskId.
|
|
159
|
+
* Returns true if the process was found and signalled, false otherwise.
|
|
160
|
+
*/
|
|
161
|
+
stopProcess(taskId) {
|
|
162
|
+
const info = this.processes.get(taskId);
|
|
163
|
+
if (!info) {
|
|
164
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] stopProcess taskId=${taskId} not found`);
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
167
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] stopProcess taskId=${taskId} sending SIGTERM`);
|
|
168
|
+
info.process.kill('SIGTERM');
|
|
169
|
+
this.processes.delete(taskId);
|
|
170
|
+
(0, logger_1.verboseLog)(`[CodexProcessService] process removed from map (stop) taskId=${taskId} total=${this.processes.size}`);
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* List all currently running tasks with their command type.
|
|
175
|
+
*/
|
|
176
|
+
listRunningTasks() {
|
|
177
|
+
return Array.from(this.processes.values()).map((info) => ({ taskId: info.taskId, command: info.command }));
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Subscribe to output events for a given taskId.
|
|
181
|
+
* If process is running: replay past events and subscribe to future events.
|
|
182
|
+
* If no process but DB available: replay last saved log from DB.
|
|
183
|
+
* Returns an unsubscribe function.
|
|
184
|
+
*/
|
|
185
|
+
subscribeOutput(taskId, callback) {
|
|
186
|
+
const info = this.processes.get(taskId);
|
|
187
|
+
if (!info) {
|
|
188
|
+
// Try to replay from DB
|
|
189
|
+
if (this.db) {
|
|
190
|
+
const row = this.db.runLogs.findLatestByTaskId(taskId);
|
|
191
|
+
if (row) {
|
|
192
|
+
const events = JSON.parse(row.events);
|
|
193
|
+
events.forEach((evt) => callback(evt));
|
|
194
|
+
callback({ kind: 'done', exitCode: row.exit_code ?? 0 });
|
|
195
|
+
return () => { };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// No process and no log found — emit error
|
|
199
|
+
callback({ kind: 'error', message: `No running process for taskId ${taskId}` });
|
|
200
|
+
return () => { };
|
|
201
|
+
}
|
|
202
|
+
// Replay past events to the new subscriber before registering
|
|
203
|
+
info.processedEvents.forEach((evt) => callback(evt));
|
|
204
|
+
info.subscribers.add(callback);
|
|
205
|
+
return () => {
|
|
206
|
+
info.subscribers.delete(callback);
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get saved run logs for a task from DB (most recent first, up to 5).
|
|
211
|
+
*/
|
|
212
|
+
getRunLogs(taskId) {
|
|
213
|
+
if (!this.db)
|
|
214
|
+
return [];
|
|
215
|
+
const rows = this.db.runLogs.findByTaskId(taskId, 5);
|
|
216
|
+
return rows.map((r) => ({
|
|
217
|
+
id: r.id,
|
|
218
|
+
task_id: r.task_id,
|
|
219
|
+
started_at: r.started_at,
|
|
220
|
+
finished_at: r.finished_at,
|
|
221
|
+
exit_code: r.exit_code,
|
|
222
|
+
session_id: r.session_id,
|
|
223
|
+
events: JSON.parse(r.events),
|
|
224
|
+
}));
|
|
225
|
+
}
|
|
226
|
+
// ---- Private helpers ----
|
|
227
|
+
_notifySubscribers(info, event) {
|
|
228
|
+
// Map Codex events to OutputEvent format
|
|
229
|
+
if (event.type === 'thread.started') {
|
|
230
|
+
// Extract thread_id as session_id
|
|
231
|
+
const threadId = event.thread_id;
|
|
232
|
+
if (threadId && !info.sessionId) {
|
|
233
|
+
info.sessionId = threadId;
|
|
234
|
+
if (this.db && info.runLogId) {
|
|
235
|
+
this.db.runLogs.updateSessionId(info.runLogId, info.sessionId);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (event.type === 'item.completed') {
|
|
240
|
+
const itemEvent = event;
|
|
241
|
+
const item = itemEvent.item;
|
|
242
|
+
// Treat agent_message items as text output
|
|
243
|
+
if (item.type === 'agent_message' && item.content) {
|
|
244
|
+
const outputEvent = { kind: 'text', text: String(item.content) };
|
|
245
|
+
info.processedEvents.push(outputEvent);
|
|
246
|
+
info.subscribers.forEach((cb) => cb(outputEvent));
|
|
247
|
+
if (this.db && info.runLogId) {
|
|
248
|
+
this.db.runLogs.updateEvents(info.runLogId, JSON.stringify(info.processedEvents));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// 'turn.completed' events are buffered but not forwarded as OutputEvents
|
|
253
|
+
// (done/error are sent on process close)
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.CodexProcessService = CodexProcessService;
|
|
257
|
+
//# sourceMappingURL=CodexProcessService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexProcessService.js","sourceRoot":"","sources":["../../src/services/CodexProcessService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileService.d.ts","sourceRoot":"","sources":["../../src/services/FileService.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FileService.d.ts","sourceRoot":"","sources":["../../src/services/FileService.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,qBAAa,WAAW;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IA4BtF;;;;;OAKG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAY1C;;;;OAIG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAYtC"}
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.FileService = void 0;
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const config_1 = require("../db/config");
|
|
9
10
|
const security_1 = require("../utils/security");
|
|
10
11
|
/**
|
|
11
12
|
* File Service
|
|
@@ -27,7 +28,8 @@ class FileService {
|
|
|
27
28
|
// Get file name
|
|
28
29
|
const fileName = path_1.default.basename(sourceFile);
|
|
29
30
|
// Create destination directory (attachments/<task_id>/)
|
|
30
|
-
const
|
|
31
|
+
const attachmentsRoot = `attachments${(0, config_1.getWorkerSuffix)()}`;
|
|
32
|
+
const attachmentDir = path_1.default.join(process.cwd(), attachmentsRoot, taskId.toString());
|
|
31
33
|
fs_1.default.mkdirSync(attachmentDir, { recursive: true });
|
|
32
34
|
// Generate filename with timestamp
|
|
33
35
|
const timestamp = Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileService.js","sourceRoot":"","sources":["../../src/services/FileService.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,gDAA+C;AAE/C;;;GAGG;AACH,MAAa,WAAW;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,UAAkB,EAAE,MAAc;QACzC,uBAAuB;QACvB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,gBAAgB;QAChB,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAE3C,wDAAwD;QACxD,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"FileService.js","sourceRoot":"","sources":["../../src/services/FileService.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AACpB,gDAAwB;AACxB,yCAA+C;AAC/C,gDAA+C;AAE/C;;;GAGG;AACH,MAAa,WAAW;IACtB;;;;;;OAMG;IACH,QAAQ,CAAC,UAAkB,EAAE,MAAc;QACzC,uBAAuB;QACvB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,gBAAgB;QAChB,MAAM,QAAQ,GAAG,cAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAE3C,wDAAwD;QACxD,MAAM,eAAe,GAAG,cAAc,IAAA,wBAAe,GAAE,EAAE,CAAC;QAC1D,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnF,YAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjD,mCAAmC;QACnC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAC;QAChD,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;QAExD,YAAY;QACZ,YAAE,CAAC,YAAY,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEtC,OAAO;YACL,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,QAAQ;SACpB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,QAAgB;QAC/B,IAAI,CAAC,IAAA,qBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,YAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,QAAgB;QACzB,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,CAAC;YACH,YAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,EAAE,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;CACF;AAvED,kCAuEC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { OutputEvent, RunLog } from './ClaudeProcessService';
|
|
2
|
+
export type SubscribeCallback = (event: OutputEvent) => void;
|
|
3
|
+
/**
|
|
4
|
+
* IProcessService
|
|
5
|
+
* Common interface for managing LLM processes (Claude, Codex, etc.)
|
|
6
|
+
* Abstracts the details of process spawning, output parsing, and event streaming.
|
|
7
|
+
*/
|
|
8
|
+
export interface IProcessService {
|
|
9
|
+
/**
|
|
10
|
+
* Start a process for the given taskId with the provided prompt.
|
|
11
|
+
* @param taskId Unique task identifier
|
|
12
|
+
* @param prompt The input prompt for the LLM
|
|
13
|
+
* @param command Type of command (run, planning, pr, etc.)
|
|
14
|
+
* @throws ConflictError if a process is already running for this taskId
|
|
15
|
+
*/
|
|
16
|
+
startProcess(taskId: number, prompt: string, command?: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Stop the process for the given taskId.
|
|
19
|
+
* @param taskId Unique task identifier
|
|
20
|
+
* @returns true if the process was found and stopped, false if no process was running
|
|
21
|
+
*/
|
|
22
|
+
stopProcess(taskId: number): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* List all currently running tasks with their command type.
|
|
25
|
+
*/
|
|
26
|
+
listRunningTasks(): {
|
|
27
|
+
taskId: number;
|
|
28
|
+
command: string;
|
|
29
|
+
}[];
|
|
30
|
+
/**
|
|
31
|
+
* Subscribe to output events for a given taskId.
|
|
32
|
+
* If process is running: replays past events and subscribes to future events.
|
|
33
|
+
* If no process but storage available: replays last saved log from storage.
|
|
34
|
+
* @param taskId Unique task identifier
|
|
35
|
+
* @param callback Function called for each output event
|
|
36
|
+
* @returns Unsubscribe function
|
|
37
|
+
*/
|
|
38
|
+
subscribeOutput(taskId: number, callback: SubscribeCallback): () => void;
|
|
39
|
+
/**
|
|
40
|
+
* Get saved run logs for a task from storage (most recent first, up to 5).
|
|
41
|
+
*/
|
|
42
|
+
getRunLogs(taskId: number): RunLog[];
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=IProcessService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IProcessService.d.ts","sourceRoot":"","sources":["../../src/services/IProcessService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAGlE,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;AAE7D;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;;OAMG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAErE;;;;OAIG;IACH,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAErC;;OAEG;IACH,gBAAgB,IAAI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAE1D;;;;;;;OAOG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,MAAM,IAAI,CAAC;IAEzE;;OAEG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IProcessService.js","sourceRoot":"","sources":["../../src/services/IProcessService.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { LlmPreference } from '../board/boardConfig';
|
|
2
|
+
import type { StorageBackend } from '../db/types/repository';
|
|
3
|
+
import type { IProcessService } from './IProcessService';
|
|
4
|
+
/**
|
|
5
|
+
* ProcessServiceFactory
|
|
6
|
+
* Creates the appropriate IProcessService implementation based on LlmPreference.
|
|
7
|
+
* Defaults to ClaudeProcessService if llm is invalid or undefined.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ProcessServiceFactory {
|
|
10
|
+
/**
|
|
11
|
+
* Create a process service for the given LLM preference.
|
|
12
|
+
* @param llm The LLM preference ('claude' or 'codex')
|
|
13
|
+
* @param db Optional database backend for persisting run logs
|
|
14
|
+
* @returns An IProcessService implementation
|
|
15
|
+
*/
|
|
16
|
+
static create(llm: LlmPreference | undefined, db?: StorageBackend | null): IProcessService;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=ProcessServiceFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProcessServiceFactory.d.ts","sourceRoot":"","sources":["../../src/services/ProcessServiceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIzD;;;;GAIG;AACH,qBAAa,qBAAqB;IAChC;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,EAAE,EAAE,CAAC,EAAE,cAAc,GAAG,IAAI,GAAG,eAAe;CAO3F"}
|