agkan 2.14.3 → 3.0.1
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 +62 -238
- package/README.md +48 -241
- package/dist/board/boardFavicon.d.ts +2 -0
- package/dist/board/boardFavicon.d.ts.map +1 -0
- package/dist/board/boardFavicon.js +5 -0
- package/dist/board/boardFavicon.js.map +1 -0
- package/dist/board/boardRenderer.d.ts +22 -6
- package/dist/board/boardRenderer.d.ts.map +1 -1
- package/dist/board/boardRenderer.js +67 -26
- package/dist/board/boardRenderer.js.map +1 -1
- package/dist/board/boardRoutes.d.ts +4 -2
- package/dist/board/boardRoutes.d.ts.map +1 -1
- package/dist/board/boardRoutes.js +140 -13
- package/dist/board/boardRoutes.js.map +1 -1
- package/dist/board/boardStyles.d.ts +1 -1
- package/dist/board/boardStyles.d.ts.map +1 -1
- package/dist/board/boardStyles.js +62 -8
- package/dist/board/boardStyles.js.map +1 -1
- package/dist/board/client/board.js +1007 -29
- package/dist/board/server.d.ts +3 -2
- package/dist/board/server.d.ts.map +1 -1
- package/dist/board/server.js +9 -7
- package/dist/board/server.js.map +1 -1
- package/dist/cli/commands/agent-guide.d.ts.map +1 -1
- package/dist/cli/commands/agent-guide.js +6 -0
- package/dist/cli/commands/agent-guide.js.map +1 -1
- package/dist/cli/commands/board.d.ts.map +1 -1
- package/dist/cli/commands/board.js +202 -15
- package/dist/cli/commands/board.js.map +1 -1
- package/dist/cli/commands/ps.d.ts +7 -0
- package/dist/cli/commands/ps.d.ts.map +1 -0
- package/dist/cli/commands/ps.js +83 -0
- package/dist/cli/commands/ps.js.map +1 -0
- package/dist/cli/commands/tag/add.d.ts.map +1 -1
- package/dist/cli/commands/tag/add.js +10 -11
- package/dist/cli/commands/tag/add.js.map +1 -1
- package/dist/cli/commands/tag/attach.d.ts.map +1 -1
- package/dist/cli/commands/tag/attach.js +10 -11
- package/dist/cli/commands/tag/attach.js.map +1 -1
- package/dist/cli/commands/tag/rename.d.ts.map +1 -1
- package/dist/cli/commands/tag/rename.js +10 -11
- package/dist/cli/commands/tag/rename.js.map +1 -1
- package/dist/cli/commands/task/add.js +1 -1
- package/dist/cli/commands/task/add.js.map +1 -1
- package/dist/cli/commands/task/copy.d.ts +6 -0
- package/dist/cli/commands/task/copy.d.ts.map +1 -0
- package/dist/cli/commands/task/copy.js +118 -0
- package/dist/cli/commands/task/copy.js.map +1 -0
- package/dist/cli/commands/task/list.d.ts.map +1 -1
- package/dist/cli/commands/task/list.js +37 -17
- package/dist/cli/commands/task/list.js.map +1 -1
- package/dist/cli/commands/task/update-parent.d.ts.map +1 -1
- package/dist/cli/commands/task/update-parent.js +10 -11
- package/dist/cli/commands/task/update-parent.js.map +1 -1
- package/dist/cli/index.js +6 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/board-daemon.d.ts +7 -0
- package/dist/cli/utils/board-daemon.d.ts.map +1 -0
- package/dist/cli/utils/board-daemon.js +83 -0
- package/dist/cli/utils/board-daemon.js.map +1 -0
- package/dist/db/adapters/sqlite-storage-backend.d.ts +27 -0
- package/dist/db/adapters/sqlite-storage-backend.d.ts.map +1 -0
- package/dist/db/adapters/sqlite-storage-backend.js +498 -0
- package/dist/db/adapters/sqlite-storage-backend.js.map +1 -0
- package/dist/db/connection.d.ts +19 -0
- package/dist/db/connection.d.ts.map +1 -1
- package/dist/db/connection.js +37 -2
- package/dist/db/connection.js.map +1 -1
- package/dist/db/migrations/20260328000000_initial_schema.d.ts +3 -0
- package/dist/db/migrations/20260328000000_initial_schema.d.ts.map +1 -0
- package/dist/db/migrations/20260328000000_initial_schema.js +218 -0
- package/dist/db/migrations/20260328000000_initial_schema.js.map +1 -0
- package/dist/db/migrations/20260329000000_add_session_id_to_task_run_logs.d.ts +3 -0
- package/dist/db/migrations/20260329000000_add_session_id_to_task_run_logs.d.ts.map +1 -0
- package/dist/db/migrations/20260329000000_add_session_id_to_task_run_logs.js +7 -0
- package/dist/db/migrations/20260329000000_add_session_id_to_task_run_logs.js.map +1 -0
- package/dist/db/migrations/index.d.ts +4 -0
- package/dist/db/migrations/index.d.ts.map +1 -0
- package/dist/db/migrations/index.js +18 -0
- package/dist/db/migrations/index.js.map +1 -0
- package/dist/db/migrations/types.d.ts +17 -0
- package/dist/db/migrations/types.d.ts.map +1 -0
- package/dist/{board/client → db/migrations}/types.js +0 -1
- package/dist/db/migrations/types.js.map +1 -0
- package/dist/db/reset.d.ts.map +1 -1
- package/dist/db/reset.js +8 -3
- package/dist/db/reset.js.map +1 -1
- package/dist/db/schema.d.ts +4 -4
- package/dist/db/schema.d.ts.map +1 -1
- package/dist/db/schema.js +22 -207
- package/dist/db/schema.js.map +1 -1
- package/dist/db/types/repository.d.ts +226 -0
- package/dist/db/types/repository.d.ts.map +1 -0
- package/dist/db/types/repository.js +15 -0
- package/dist/db/types/repository.js.map +1 -0
- package/dist/errors.d.ts +27 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +51 -0
- package/dist/errors.js.map +1 -0
- package/dist/models/Task.d.ts +2 -0
- package/dist/models/Task.d.ts.map +1 -1
- package/dist/services/ClaudeProcessService.d.ts +100 -0
- package/dist/services/ClaudeProcessService.d.ts.map +1 -0
- package/dist/services/ClaudeProcessService.js +279 -0
- package/dist/services/ClaudeProcessService.js.map +1 -0
- package/dist/services/CommentService.d.ts +3 -3
- package/dist/services/CommentService.d.ts.map +1 -1
- package/dist/services/CommentService.js +13 -72
- package/dist/services/CommentService.js.map +1 -1
- package/dist/services/ExportImportService.d.ts +3 -3
- package/dist/services/ExportImportService.d.ts.map +1 -1
- package/dist/services/ExportImportService.js +29 -31
- package/dist/services/ExportImportService.js.map +1 -1
- package/dist/services/MetadataService.d.ts +3 -3
- package/dist/services/MetadataService.d.ts.map +1 -1
- package/dist/services/MetadataService.js +9 -69
- package/dist/services/MetadataService.js.map +1 -1
- package/dist/services/ProcessService.d.ts +54 -0
- package/dist/services/ProcessService.d.ts.map +1 -0
- package/dist/services/ProcessService.js +147 -0
- package/dist/services/ProcessService.js.map +1 -0
- package/dist/services/TagService.d.ts +3 -3
- package/dist/services/TagService.d.ts.map +1 -1
- package/dist/services/TagService.js +16 -41
- package/dist/services/TagService.js.map +1 -1
- package/dist/services/TaskBlockService.d.ts +3 -3
- package/dist/services/TaskBlockService.d.ts.map +1 -1
- package/dist/services/TaskBlockService.js +14 -40
- package/dist/services/TaskBlockService.js.map +1 -1
- package/dist/services/TaskService.d.ts +5 -23
- package/dist/services/TaskService.d.ts.map +1 -1
- package/dist/services/TaskService.js +57 -191
- package/dist/services/TaskService.js.map +1 -1
- package/dist/services/TaskTagService.d.ts +3 -3
- package/dist/services/TaskTagService.d.ts.map +1 -1
- package/dist/services/TaskTagService.js +23 -86
- package/dist/services/TaskTagService.js.map +1 -1
- package/dist/services/TmuxService.d.ts +2 -0
- package/dist/services/TmuxService.d.ts.map +1 -0
- package/dist/services/TmuxService.js +7 -0
- package/dist/services/TmuxService.js.map +1 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +3 -1
- package/dist/services/index.js.map +1 -1
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +18 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +12 -5
- package/dist/board/client/addTaskModal.d.ts +0 -2
- package/dist/board/client/addTaskModal.d.ts.map +0 -1
- package/dist/board/client/addTaskModal.js +0 -64
- package/dist/board/client/addTaskModal.js.map +0 -1
- package/dist/board/client/autoScroll.d.ts +0 -4
- package/dist/board/client/autoScroll.d.ts.map +0 -1
- package/dist/board/client/autoScroll.js +0 -59
- package/dist/board/client/autoScroll.js.map +0 -1
- package/dist/board/client/boardPolling.d.ts +0 -15
- package/dist/board/client/boardPolling.d.ts.map +0 -1
- package/dist/board/client/boardPolling.js +0 -144
- package/dist/board/client/boardPolling.js.map +0 -1
- package/dist/board/client/burgerMenu.d.ts +0 -2
- package/dist/board/client/burgerMenu.d.ts.map +0 -1
- package/dist/board/client/burgerMenu.js +0 -80
- package/dist/board/client/burgerMenu.js.map +0 -1
- package/dist/board/client/contextMenu.d.ts +0 -2
- package/dist/board/client/contextMenu.d.ts.map +0 -1
- package/dist/board/client/contextMenu.js +0 -52
- package/dist/board/client/contextMenu.js.map +0 -1
- package/dist/board/client/detailPanel.d.ts +0 -8
- package/dist/board/client/detailPanel.d.ts.map +0 -1
- package/dist/board/client/detailPanel.js +0 -565
- package/dist/board/client/detailPanel.js.map +0 -1
- package/dist/board/client/dragDrop.d.ts +0 -6
- package/dist/board/client/dragDrop.d.ts.map +0 -1
- package/dist/board/client/dragDrop.js +0 -82
- package/dist/board/client/dragDrop.js.map +0 -1
- package/dist/board/client/filters.d.ts +0 -6
- package/dist/board/client/filters.d.ts.map +0 -1
- package/dist/board/client/filters.js +0 -167
- package/dist/board/client/filters.js.map +0 -1
- package/dist/board/client/main.d.ts +0 -2
- package/dist/board/client/main.d.ts.map +0 -1
- package/dist/board/client/main.js +0 -20
- package/dist/board/client/main.js.map +0 -1
- package/dist/board/client/tags.d.ts +0 -6
- package/dist/board/client/tags.d.ts.map +0 -1
- package/dist/board/client/tags.js +0 -198
- package/dist/board/client/tags.js.map +0 -1
- package/dist/board/client/types.d.ts +0 -48
- package/dist/board/client/types.d.ts.map +0 -1
- package/dist/board/client/types.js.map +0 -1
- package/dist/board/client/utils.d.ts +0 -4
- package/dist/board/client/utils.d.ts.map +0 -1
- package/dist/board/client/utils.js +0 -44
- package/dist/board/client/utils.js.map +0 -1
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { StorageBackend } from '../db/types/repository';
|
|
2
|
+
export type ClaudeStreamEvent = {
|
|
3
|
+
type: 'system';
|
|
4
|
+
subtype: string;
|
|
5
|
+
session_id?: string;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
} | {
|
|
8
|
+
type: 'assistant';
|
|
9
|
+
message: {
|
|
10
|
+
content: Array<{
|
|
11
|
+
type: 'text';
|
|
12
|
+
text: string;
|
|
13
|
+
} | {
|
|
14
|
+
type: 'tool_use';
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
input: Record<string, unknown>;
|
|
18
|
+
}>;
|
|
19
|
+
[key: string]: unknown;
|
|
20
|
+
};
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
} | {
|
|
23
|
+
type: 'result';
|
|
24
|
+
subtype: string;
|
|
25
|
+
result?: string;
|
|
26
|
+
duration_ms?: number;
|
|
27
|
+
[key: string]: unknown;
|
|
28
|
+
} | {
|
|
29
|
+
type: string;
|
|
30
|
+
[key: string]: unknown;
|
|
31
|
+
};
|
|
32
|
+
export type OutputEvent = {
|
|
33
|
+
kind: 'text';
|
|
34
|
+
text: string;
|
|
35
|
+
} | {
|
|
36
|
+
kind: 'tool_use';
|
|
37
|
+
name: string;
|
|
38
|
+
input: Record<string, unknown>;
|
|
39
|
+
} | {
|
|
40
|
+
kind: 'done';
|
|
41
|
+
exitCode: number;
|
|
42
|
+
} | {
|
|
43
|
+
kind: 'error';
|
|
44
|
+
message: string;
|
|
45
|
+
};
|
|
46
|
+
export type SubscribeCallback = (event: OutputEvent) => void;
|
|
47
|
+
export interface RunLog {
|
|
48
|
+
id: number;
|
|
49
|
+
task_id: number;
|
|
50
|
+
started_at: string;
|
|
51
|
+
finished_at: string | null;
|
|
52
|
+
exit_code: number | null;
|
|
53
|
+
session_id: string | null;
|
|
54
|
+
events: OutputEvent[];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* ClaudeProcessService
|
|
58
|
+
* Manages claude CLI processes running in stream-json mode.
|
|
59
|
+
* Keyed by taskId, supports start/stop/subscribe/list operations.
|
|
60
|
+
*/
|
|
61
|
+
export declare class ClaudeProcessService {
|
|
62
|
+
private processes;
|
|
63
|
+
private db;
|
|
64
|
+
constructor(db?: StorageBackend | null);
|
|
65
|
+
/**
|
|
66
|
+
* Start a claude process for the given taskId and prompt.
|
|
67
|
+
* Prevents duplicate processes for the same taskId.
|
|
68
|
+
*/
|
|
69
|
+
startProcess(taskId: number, prompt: string, command?: string): void;
|
|
70
|
+
/**
|
|
71
|
+
* Stop the process for the given taskId.
|
|
72
|
+
* Returns true if the process was found and signalled, false otherwise.
|
|
73
|
+
*/
|
|
74
|
+
stopProcess(taskId: number): boolean;
|
|
75
|
+
/**
|
|
76
|
+
* List all currently running tasks with their command type.
|
|
77
|
+
*/
|
|
78
|
+
listRunningTasks(): {
|
|
79
|
+
taskId: number;
|
|
80
|
+
command: string;
|
|
81
|
+
}[];
|
|
82
|
+
/**
|
|
83
|
+
* Subscribe to output events for a given taskId.
|
|
84
|
+
* If process is running: replay past events and subscribe to future events.
|
|
85
|
+
* If no process but DB available: replay last saved log from DB.
|
|
86
|
+
* Returns an unsubscribe function.
|
|
87
|
+
*/
|
|
88
|
+
subscribeOutput(taskId: number, callback: SubscribeCallback): () => void;
|
|
89
|
+
/**
|
|
90
|
+
* Get the buffered output events for a taskId.
|
|
91
|
+
* Useful for late subscribers who missed earlier events.
|
|
92
|
+
*/
|
|
93
|
+
getOutputBuffer(taskId: number): ClaudeStreamEvent[];
|
|
94
|
+
/**
|
|
95
|
+
* Get saved run logs for a task from DB (most recent first, up to 5).
|
|
96
|
+
*/
|
|
97
|
+
getRunLogs(taskId: number): RunLog[];
|
|
98
|
+
private _notifySubscribers;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=ClaudeProcessService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeProcessService.d.ts","sourceRoot":"","sources":["../../src/services/ClaudeProcessService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClaudeProcessService = void 0;
|
|
4
|
+
const child_process_1 = require("child_process");
|
|
5
|
+
const logger_1 = require("../utils/logger");
|
|
6
|
+
const errors_1 = require("../errors");
|
|
7
|
+
function resolveClaudePath() {
|
|
8
|
+
try {
|
|
9
|
+
const path = (0, child_process_1.execSync)('which claude', { env: process.env }).toString().trim();
|
|
10
|
+
if (path)
|
|
11
|
+
return path;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// which failed, fall through
|
|
15
|
+
}
|
|
16
|
+
return 'claude';
|
|
17
|
+
}
|
|
18
|
+
const CLAUDE_BIN = resolveClaudePath();
|
|
19
|
+
// ---- ClaudeProcessService ----
|
|
20
|
+
/**
|
|
21
|
+
* ClaudeProcessService
|
|
22
|
+
* Manages claude CLI processes running in stream-json mode.
|
|
23
|
+
* Keyed by taskId, supports start/stop/subscribe/list operations.
|
|
24
|
+
*/
|
|
25
|
+
class ClaudeProcessService {
|
|
26
|
+
processes = new Map();
|
|
27
|
+
db;
|
|
28
|
+
constructor(db) {
|
|
29
|
+
this.db = db ?? null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Start a claude process for the given taskId and prompt.
|
|
33
|
+
* Prevents duplicate processes for the same taskId.
|
|
34
|
+
*/
|
|
35
|
+
startProcess(taskId, prompt, command = 'run') {
|
|
36
|
+
if (this.processes.has(taskId)) {
|
|
37
|
+
const existing = this.processes.get(taskId);
|
|
38
|
+
const pid = existing.process.pid;
|
|
39
|
+
const killed = existing.process.killed;
|
|
40
|
+
const exitCode = existing.process.exitCode;
|
|
41
|
+
const signalCode = existing.process.signalCode;
|
|
42
|
+
const aliveMs = Date.now() - existing.startedAt.getTime();
|
|
43
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] startProcess DUPLICATE taskId=${taskId} existing pid=${pid} killed=${killed} exitCode=${exitCode} signalCode=${signalCode} aliveMs=${aliveMs} command=${existing.command}`);
|
|
44
|
+
throw new errors_1.ConflictError(`Process for taskId ${taskId} is already running`);
|
|
45
|
+
}
|
|
46
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] startProcess taskId=${taskId} command=${command}`);
|
|
47
|
+
const child = (0, child_process_1.spawn)(CLAUDE_BIN, ['--output-format', 'stream-json', '--verbose', '--dangerously-skip-permissions', '-p', prompt], {
|
|
48
|
+
cwd: process.cwd(),
|
|
49
|
+
env: process.env,
|
|
50
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
51
|
+
});
|
|
52
|
+
const info = {
|
|
53
|
+
taskId,
|
|
54
|
+
command,
|
|
55
|
+
process: child,
|
|
56
|
+
startedAt: new Date(),
|
|
57
|
+
status: 'running',
|
|
58
|
+
outputBuffer: [],
|
|
59
|
+
processedEvents: [],
|
|
60
|
+
subscribers: new Set(),
|
|
61
|
+
runLogId: null,
|
|
62
|
+
sessionId: null,
|
|
63
|
+
};
|
|
64
|
+
this.processes.set(taskId, info);
|
|
65
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] process added to map taskId=${taskId} total=${this.processes.size}`);
|
|
66
|
+
if (this.db) {
|
|
67
|
+
info.runLogId = this.db.runLogs.create(info.taskId, info.startedAt.toISOString());
|
|
68
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] run log created id=${info.runLogId} taskId=${taskId}`);
|
|
69
|
+
}
|
|
70
|
+
let lineBuffer = '';
|
|
71
|
+
let spawnError = false;
|
|
72
|
+
child.on('error', (err) => {
|
|
73
|
+
spawnError = true;
|
|
74
|
+
const message = err.code === 'ENOENT' ? 'claude CLI not found in PATH' : err.message;
|
|
75
|
+
console.error(`[ClaudeProcessService] spawn error for taskId=${taskId}: ${message}`, err);
|
|
76
|
+
const errorEvent = { kind: 'error', message };
|
|
77
|
+
info.processedEvents.push(errorEvent);
|
|
78
|
+
info.subscribers.forEach((cb) => cb(errorEvent));
|
|
79
|
+
const doneEvent = { kind: 'done', exitCode: 1 };
|
|
80
|
+
info.subscribers.forEach((cb) => cb(doneEvent));
|
|
81
|
+
if (this.db && info.runLogId) {
|
|
82
|
+
const finishedAt = new Date().toISOString();
|
|
83
|
+
this.db.runLogs.updateFinished(info.runLogId, finishedAt, 1, JSON.stringify(info.processedEvents));
|
|
84
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] run log updated (error) id=${info.runLogId} taskId=${taskId}`);
|
|
85
|
+
}
|
|
86
|
+
if (this.processes.get(taskId) === info) {
|
|
87
|
+
this.processes.delete(taskId);
|
|
88
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] process removed from map (error) taskId=${taskId} total=${this.processes.size}`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] process error skipped map delete (stale entry) taskId=${taskId}`);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
child.stdout?.on('data', (chunk) => {
|
|
95
|
+
lineBuffer += chunk.toString();
|
|
96
|
+
const lines = lineBuffer.split('\n');
|
|
97
|
+
// Keep the last (potentially incomplete) line in the buffer
|
|
98
|
+
lineBuffer = lines.pop() ?? '';
|
|
99
|
+
for (const line of lines) {
|
|
100
|
+
const trimmed = line.trim();
|
|
101
|
+
if (!trimmed)
|
|
102
|
+
continue;
|
|
103
|
+
let parsed;
|
|
104
|
+
try {
|
|
105
|
+
parsed = JSON.parse(trimmed);
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
// Skip non-JSON lines
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
info.outputBuffer.push(parsed);
|
|
112
|
+
this._notifySubscribers(info, parsed);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
let stderrBuffer = '';
|
|
116
|
+
child.stderr?.on('data', (chunk) => {
|
|
117
|
+
stderrBuffer += chunk.toString();
|
|
118
|
+
});
|
|
119
|
+
child.on('close', (code) => {
|
|
120
|
+
if (spawnError)
|
|
121
|
+
return;
|
|
122
|
+
// Process any remaining buffered line
|
|
123
|
+
const remaining = lineBuffer.trim();
|
|
124
|
+
if (remaining) {
|
|
125
|
+
try {
|
|
126
|
+
const parsed = JSON.parse(remaining);
|
|
127
|
+
info.outputBuffer.push(parsed);
|
|
128
|
+
this._notifySubscribers(info, parsed);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// Ignore
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
if (stderrBuffer) {
|
|
135
|
+
console.error(`[ClaudeProcessService] stderr for taskId=${taskId}:\n${stderrBuffer}`);
|
|
136
|
+
const errorEvent = { kind: 'error', message: stderrBuffer };
|
|
137
|
+
info.processedEvents.push(errorEvent);
|
|
138
|
+
info.subscribers.forEach((cb) => cb(errorEvent));
|
|
139
|
+
}
|
|
140
|
+
const exitCode = code ?? 0;
|
|
141
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] process close taskId=${taskId} exitCode=${exitCode}`);
|
|
142
|
+
if (exitCode !== 0) {
|
|
143
|
+
console.error(`[ClaudeProcessService] process exited with code ${exitCode} for taskId=${taskId}`);
|
|
144
|
+
}
|
|
145
|
+
const doneEvent = { kind: 'done', exitCode };
|
|
146
|
+
info.subscribers.forEach((cb) => cb(doneEvent));
|
|
147
|
+
// Finalize log in DB before removing process
|
|
148
|
+
if (this.db && info.runLogId) {
|
|
149
|
+
const finishedAt = new Date().toISOString();
|
|
150
|
+
this.db.runLogs.updateFinished(info.runLogId, finishedAt, exitCode, JSON.stringify(info.processedEvents));
|
|
151
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] run log finalized id=${info.runLogId} taskId=${taskId} exitCode=${exitCode}`);
|
|
152
|
+
// Rotate: keep only latest 5 per task
|
|
153
|
+
const ids = this.db.runLogs.findIdsByTaskId(info.taskId);
|
|
154
|
+
if (ids.length > 5) {
|
|
155
|
+
const toDelete = ids.slice(5);
|
|
156
|
+
this.db.runLogs.deleteMany(toDelete);
|
|
157
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] rotated run logs taskId=${taskId} deleted=${toDelete.length}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (this.processes.get(taskId) === info) {
|
|
161
|
+
this.processes.delete(taskId);
|
|
162
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] process removed from map (close) taskId=${taskId} total=${this.processes.size}`);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] process close skipped map delete (stale entry) taskId=${taskId}`);
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Stop the process for the given taskId.
|
|
171
|
+
* Returns true if the process was found and signalled, false otherwise.
|
|
172
|
+
*/
|
|
173
|
+
stopProcess(taskId) {
|
|
174
|
+
const info = this.processes.get(taskId);
|
|
175
|
+
if (!info) {
|
|
176
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] stopProcess taskId=${taskId} not found`);
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] stopProcess taskId=${taskId} sending SIGTERM`);
|
|
180
|
+
info.process.kill('SIGTERM');
|
|
181
|
+
this.processes.delete(taskId);
|
|
182
|
+
(0, logger_1.verboseLog)(`[ClaudeProcessService] process removed from map (stop) taskId=${taskId} total=${this.processes.size}`);
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* List all currently running tasks with their command type.
|
|
187
|
+
*/
|
|
188
|
+
listRunningTasks() {
|
|
189
|
+
return Array.from(this.processes.values()).map((info) => ({ taskId: info.taskId, command: info.command }));
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Subscribe to output events for a given taskId.
|
|
193
|
+
* If process is running: replay past events and subscribe to future events.
|
|
194
|
+
* If no process but DB available: replay last saved log from DB.
|
|
195
|
+
* Returns an unsubscribe function.
|
|
196
|
+
*/
|
|
197
|
+
subscribeOutput(taskId, callback) {
|
|
198
|
+
const info = this.processes.get(taskId);
|
|
199
|
+
if (!info) {
|
|
200
|
+
// Try to replay from DB
|
|
201
|
+
if (this.db) {
|
|
202
|
+
const row = this.db.runLogs.findLatestByTaskId(taskId);
|
|
203
|
+
if (row) {
|
|
204
|
+
const events = JSON.parse(row.events);
|
|
205
|
+
events.forEach((evt) => callback(evt));
|
|
206
|
+
callback({ kind: 'done', exitCode: row.exit_code ?? 0 });
|
|
207
|
+
return () => { };
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// No process and no log found — emit error
|
|
211
|
+
callback({ kind: 'error', message: `No running process for taskId ${taskId}` });
|
|
212
|
+
return () => { };
|
|
213
|
+
}
|
|
214
|
+
// Replay past events to the new subscriber before registering
|
|
215
|
+
info.processedEvents.forEach((evt) => callback(evt));
|
|
216
|
+
info.subscribers.add(callback);
|
|
217
|
+
return () => {
|
|
218
|
+
info.subscribers.delete(callback);
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get the buffered output events for a taskId.
|
|
223
|
+
* Useful for late subscribers who missed earlier events.
|
|
224
|
+
*/
|
|
225
|
+
getOutputBuffer(taskId) {
|
|
226
|
+
return this.processes.get(taskId)?.outputBuffer ?? [];
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get saved run logs for a task from DB (most recent first, up to 5).
|
|
230
|
+
*/
|
|
231
|
+
getRunLogs(taskId) {
|
|
232
|
+
if (!this.db)
|
|
233
|
+
return [];
|
|
234
|
+
const rows = this.db.runLogs.findByTaskId(taskId, 5);
|
|
235
|
+
return rows.map((r) => ({
|
|
236
|
+
id: r.id,
|
|
237
|
+
task_id: r.task_id,
|
|
238
|
+
started_at: r.started_at,
|
|
239
|
+
finished_at: r.finished_at,
|
|
240
|
+
exit_code: r.exit_code,
|
|
241
|
+
session_id: r.session_id,
|
|
242
|
+
events: JSON.parse(r.events),
|
|
243
|
+
}));
|
|
244
|
+
}
|
|
245
|
+
// ---- Private helpers ----
|
|
246
|
+
_notifySubscribers(info, event) {
|
|
247
|
+
if (event.type === 'system' && event.session_id && !info.sessionId) {
|
|
248
|
+
info.sessionId = event.session_id;
|
|
249
|
+
if (this.db && info.runLogId) {
|
|
250
|
+
this.db.runLogs.updateSessionId(info.runLogId, info.sessionId);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
if (event.type === 'assistant') {
|
|
254
|
+
const assistantEvent = event;
|
|
255
|
+
let added = false;
|
|
256
|
+
for (const content of assistantEvent.message.content) {
|
|
257
|
+
if (content.type === 'text') {
|
|
258
|
+
const outputEvent = { kind: 'text', text: content.text };
|
|
259
|
+
info.processedEvents.push(outputEvent);
|
|
260
|
+
info.subscribers.forEach((cb) => cb(outputEvent));
|
|
261
|
+
added = true;
|
|
262
|
+
}
|
|
263
|
+
else if (content.type === 'tool_use') {
|
|
264
|
+
const outputEvent = { kind: 'tool_use', name: content.name, input: content.input };
|
|
265
|
+
info.processedEvents.push(outputEvent);
|
|
266
|
+
info.subscribers.forEach((cb) => cb(outputEvent));
|
|
267
|
+
added = true;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (added && this.db && info.runLogId) {
|
|
271
|
+
this.db.runLogs.updateEvents(info.runLogId, JSON.stringify(info.processedEvents));
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// 'result' and 'system' events are buffered but not forwarded as OutputEvents
|
|
275
|
+
// (done/error are sent on process close)
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
exports.ClaudeProcessService = ClaudeProcessService;
|
|
279
|
+
//# sourceMappingURL=ClaudeProcessService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeProcessService.js","sourceRoot":"","sources":["../../src/services/ClaudeProcessService.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { TaskComment, CreateTaskCommentInput } from '../models';
|
|
2
|
-
import {
|
|
2
|
+
import { StorageBackend } from '../db/types/repository';
|
|
3
3
|
/**
|
|
4
4
|
* Comment Service
|
|
5
5
|
* Manages creation, retrieval, and deletion of task comments
|
|
6
6
|
*/
|
|
7
7
|
export declare class CommentService {
|
|
8
|
-
private
|
|
9
|
-
constructor(
|
|
8
|
+
private backend;
|
|
9
|
+
constructor(backend?: StorageBackend);
|
|
10
10
|
/**
|
|
11
11
|
* Add a comment to a task
|
|
12
12
|
* @param input - Comment creation input
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommentService.d.ts","sourceRoot":"","sources":["../../src/services/CommentService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEhE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"CommentService.d.ts","sourceRoot":"","sources":["../../src/services/CommentService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAIxD;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAiB;gBAEpB,OAAO,CAAC,EAAE,cAAc;IAIpC;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,sBAAsB,GAAG,WAAW;IAUtD;;;;OAIG;IACH,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAI1C;;;;OAIG;IACH,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE;IAI3C;;;;OAIG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIlC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAU9D;;;;OAIG;IACH,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIzC;;;;;OAKG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;CAGnE"}
|
|
@@ -3,14 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.CommentService = void 0;
|
|
4
4
|
const connection_1 = require("../db/connection");
|
|
5
5
|
const input_validators_1 = require("../utils/input-validators");
|
|
6
|
+
const errors_1 = require("../errors");
|
|
6
7
|
/**
|
|
7
8
|
* Comment Service
|
|
8
9
|
* Manages creation, retrieval, and deletion of task comments
|
|
9
10
|
*/
|
|
10
11
|
class CommentService {
|
|
11
|
-
|
|
12
|
-
constructor(
|
|
13
|
-
this.
|
|
12
|
+
backend;
|
|
13
|
+
constructor(backend) {
|
|
14
|
+
this.backend = backend ?? (0, connection_1.getStorageBackend)();
|
|
14
15
|
}
|
|
15
16
|
/**
|
|
16
17
|
* Add a comment to a task
|
|
@@ -18,18 +19,12 @@ class CommentService {
|
|
|
18
19
|
* @returns Created comment object
|
|
19
20
|
*/
|
|
20
21
|
addComment(input) {
|
|
21
|
-
const db = this.db;
|
|
22
22
|
const errors = (0, input_validators_1.validateCommentInput)(input);
|
|
23
23
|
if (errors.length > 0) {
|
|
24
|
-
throw new
|
|
24
|
+
throw new errors_1.ValidationError(errors[0].message);
|
|
25
25
|
}
|
|
26
26
|
const now = new Date().toISOString();
|
|
27
|
-
|
|
28
|
-
INSERT INTO task_comments (task_id, author, content, created_at, updated_at)
|
|
29
|
-
VALUES (?, ?, ?, ?, ?)
|
|
30
|
-
`);
|
|
31
|
-
const result = stmt.run(input.task_id, input.author ?? null, input.content, now, now);
|
|
32
|
-
return this.getComment(result.lastInsertRowid);
|
|
27
|
+
return this.backend.comments.create({ ...input, created_at: now, updated_at: now });
|
|
33
28
|
}
|
|
34
29
|
/**
|
|
35
30
|
* Get a comment by ID
|
|
@@ -37,13 +32,7 @@ class CommentService {
|
|
|
37
32
|
* @returns Comment object or null if not found
|
|
38
33
|
*/
|
|
39
34
|
getComment(id) {
|
|
40
|
-
|
|
41
|
-
const stmt = db.prepare(`
|
|
42
|
-
SELECT * FROM task_comments
|
|
43
|
-
WHERE id = ?
|
|
44
|
-
`);
|
|
45
|
-
const result = stmt.get(id);
|
|
46
|
-
return result ? result : null;
|
|
35
|
+
return this.backend.comments.findById(id);
|
|
47
36
|
}
|
|
48
37
|
/**
|
|
49
38
|
* List comments for a task
|
|
@@ -51,14 +40,7 @@ class CommentService {
|
|
|
51
40
|
* @returns Array of comment objects ordered by created_at ASC
|
|
52
41
|
*/
|
|
53
42
|
listComments(taskId) {
|
|
54
|
-
|
|
55
|
-
const stmt = db.prepare(`
|
|
56
|
-
SELECT * FROM task_comments
|
|
57
|
-
WHERE task_id = ?
|
|
58
|
-
ORDER BY created_at ASC
|
|
59
|
-
`);
|
|
60
|
-
const results = stmt.all(taskId);
|
|
61
|
-
return results;
|
|
43
|
+
return this.backend.comments.findByTaskId(taskId);
|
|
62
44
|
}
|
|
63
45
|
/**
|
|
64
46
|
* Delete a comment by ID
|
|
@@ -66,13 +48,7 @@ class CommentService {
|
|
|
66
48
|
* @returns True if deletion succeeded, false if comment not found
|
|
67
49
|
*/
|
|
68
50
|
deleteComment(id) {
|
|
69
|
-
|
|
70
|
-
const stmt = db.prepare(`
|
|
71
|
-
DELETE FROM task_comments
|
|
72
|
-
WHERE id = ?
|
|
73
|
-
`);
|
|
74
|
-
const result = stmt.run(id);
|
|
75
|
-
return result.changes > 0;
|
|
51
|
+
return this.backend.comments.delete(id);
|
|
76
52
|
}
|
|
77
53
|
/**
|
|
78
54
|
* Update a comment's content
|
|
@@ -83,20 +59,10 @@ class CommentService {
|
|
|
83
59
|
updateComment(id, content) {
|
|
84
60
|
const errors = (0, input_validators_1.validateCommentInput)({ task_id: 0, content });
|
|
85
61
|
if (errors.length > 0) {
|
|
86
|
-
throw new
|
|
62
|
+
throw new errors_1.ValidationError(errors[0].message);
|
|
87
63
|
}
|
|
88
|
-
const db = this.db;
|
|
89
64
|
const now = new Date().toISOString();
|
|
90
|
-
|
|
91
|
-
UPDATE task_comments
|
|
92
|
-
SET content = ?, updated_at = ?
|
|
93
|
-
WHERE id = ?
|
|
94
|
-
`);
|
|
95
|
-
const result = stmt.run(content, now, id);
|
|
96
|
-
if (result.changes === 0) {
|
|
97
|
-
return null;
|
|
98
|
-
}
|
|
99
|
-
return this.getComment(id);
|
|
65
|
+
return this.backend.comments.update(id, content, now);
|
|
100
66
|
}
|
|
101
67
|
/**
|
|
102
68
|
* Delete all comments for a task
|
|
@@ -104,13 +70,7 @@ class CommentService {
|
|
|
104
70
|
* @returns Number of deleted comments
|
|
105
71
|
*/
|
|
106
72
|
deleteAllComments(taskId) {
|
|
107
|
-
|
|
108
|
-
const stmt = db.prepare(`
|
|
109
|
-
DELETE FROM task_comments
|
|
110
|
-
WHERE task_id = ?
|
|
111
|
-
`);
|
|
112
|
-
const result = stmt.run(taskId);
|
|
113
|
-
return result.changes;
|
|
73
|
+
return this.backend.comments.deleteAllForTask(taskId);
|
|
114
74
|
}
|
|
115
75
|
/**
|
|
116
76
|
* Get all comments for multiple tasks at once
|
|
@@ -119,26 +79,7 @@ class CommentService {
|
|
|
119
79
|
* @returns Map<task_id, TaskComment[]>
|
|
120
80
|
*/
|
|
121
81
|
getCommentsForTasks(taskIds) {
|
|
122
|
-
|
|
123
|
-
if (taskIds.length === 0) {
|
|
124
|
-
return new Map();
|
|
125
|
-
}
|
|
126
|
-
const placeholders = taskIds.map(() => '?').join(', ');
|
|
127
|
-
const stmt = db.prepare(`
|
|
128
|
-
SELECT * FROM task_comments
|
|
129
|
-
WHERE task_id IN (${placeholders})
|
|
130
|
-
ORDER BY task_id, created_at ASC
|
|
131
|
-
`);
|
|
132
|
-
const results = stmt.all(...taskIds);
|
|
133
|
-
const commentsMap = new Map();
|
|
134
|
-
for (const row of results) {
|
|
135
|
-
const taskId = row.task_id;
|
|
136
|
-
if (!commentsMap.has(taskId)) {
|
|
137
|
-
commentsMap.set(taskId, []);
|
|
138
|
-
}
|
|
139
|
-
commentsMap.get(taskId).push(row);
|
|
140
|
-
}
|
|
141
|
-
return commentsMap;
|
|
82
|
+
return this.backend.comments.findByTaskIds(taskIds);
|
|
142
83
|
}
|
|
143
84
|
}
|
|
144
85
|
exports.CommentService = CommentService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommentService.js","sourceRoot":"","sources":["../../src/services/CommentService.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"CommentService.js","sourceRoot":"","sources":["../../src/services/CommentService.ts"],"names":[],"mappings":";;;AACA,iDAAqD;AAErD,gEAAiE;AACjE,sCAA4C;AAE5C;;;GAGG;AACH,MAAa,cAAc;IACjB,OAAO,CAAiB;IAEhC,YAAY,OAAwB;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,IAAA,8BAAiB,GAAE,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,KAA6B;QACtC,MAAM,MAAM,GAAG,IAAA,uCAAoB,EAAC,KAAK,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,wBAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;IACtF,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACH,YAAY,CAAC,MAAc;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,aAAa,CAAC,EAAU;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,aAAa,CAAC,EAAU,EAAE,OAAe;QACvC,MAAM,MAAM,GAAG,IAAA,uCAAoB,EAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,wBAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,MAAc;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAED;;;;;OAKG;IACH,mBAAmB,CAAC,OAAiB;QACnC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;CACF;AAnFD,wCAmFC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { StorageBackend } from '../db/types/repository';
|
|
2
2
|
export interface ExportedComment {
|
|
3
3
|
author: string | null;
|
|
4
4
|
content: string;
|
|
@@ -34,14 +34,14 @@ export interface ImportResult {
|
|
|
34
34
|
* Handles JSON bulk export and import of tasks with all related data
|
|
35
35
|
*/
|
|
36
36
|
export declare class ExportImportService {
|
|
37
|
-
private
|
|
37
|
+
private backend;
|
|
38
38
|
private taskService;
|
|
39
39
|
private tagService;
|
|
40
40
|
private taskTagService;
|
|
41
41
|
private metadataService;
|
|
42
42
|
private commentService;
|
|
43
43
|
private taskBlockService;
|
|
44
|
-
constructor(
|
|
44
|
+
constructor(backend?: StorageBackend);
|
|
45
45
|
/**
|
|
46
46
|
* Build a map from task_id to list of blocker task IDs
|
|
47
47
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExportImportService.d.ts","sourceRoot":"","sources":["../../src/services/ExportImportService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ExportImportService.d.ts","sourceRoot":"","sources":["../../src/services/ExportImportService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAQxD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,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,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,gBAAgB,CAAmB;gBAE/B,OAAO,CAAC,EAAE,cAAc;IAUpC;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;;OAGG;IACH,UAAU,IAAI,UAAU;IA8CxB;;OAEG;IACH,OAAO,CAAC,UAAU;IAkBlB;;OAEG;IACH,OAAO,CAAC,cAAc;IActB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAoBhC;;;;;;;OAOG;IACH,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY;IA2B1C;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA2B1B"}
|