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,83 @@
|
|
|
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.getPidFilePath = getPidFilePath;
|
|
7
|
+
exports.readBoardPid = readBoardPid;
|
|
8
|
+
exports.isBoardRunning = isBoardRunning;
|
|
9
|
+
exports.removePidFile = removePidFile;
|
|
10
|
+
exports.spawnBoardDaemon = spawnBoardDaemon;
|
|
11
|
+
exports.killBoardProcess = killBoardProcess;
|
|
12
|
+
const fs_1 = __importDefault(require("fs"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
const child_process_1 = require("child_process");
|
|
15
|
+
const config_1 = require("../../db/config");
|
|
16
|
+
function getPidFilePath() {
|
|
17
|
+
return path_1.default.join(process.cwd(), (0, config_1.getDefaultDirName)(), 'board.pid');
|
|
18
|
+
}
|
|
19
|
+
function readBoardPid() {
|
|
20
|
+
const pidFile = getPidFilePath();
|
|
21
|
+
if (!fs_1.default.existsSync(pidFile))
|
|
22
|
+
return null;
|
|
23
|
+
const content = fs_1.default.readFileSync(pidFile, 'utf8').trim();
|
|
24
|
+
const pid = parseInt(content, 10);
|
|
25
|
+
return isNaN(pid) ? null : pid;
|
|
26
|
+
}
|
|
27
|
+
function isBoardRunning() {
|
|
28
|
+
const pid = readBoardPid();
|
|
29
|
+
if (pid === null)
|
|
30
|
+
return false;
|
|
31
|
+
try {
|
|
32
|
+
process.kill(pid, 0);
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function writePidFile(pid) {
|
|
40
|
+
const pidFile = getPidFilePath();
|
|
41
|
+
const dir = path_1.default.dirname(pidFile);
|
|
42
|
+
if (!fs_1.default.existsSync(dir)) {
|
|
43
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
44
|
+
}
|
|
45
|
+
fs_1.default.writeFileSync(pidFile, String(pid), { encoding: 'utf8', mode: 0o600 });
|
|
46
|
+
}
|
|
47
|
+
function removePidFile() {
|
|
48
|
+
const pidFile = getPidFilePath();
|
|
49
|
+
if (fs_1.default.existsSync(pidFile)) {
|
|
50
|
+
fs_1.default.unlinkSync(pidFile);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function spawnBoardDaemon(boardArgs) {
|
|
54
|
+
const child = (0, child_process_1.spawn)(process.argv[0], [process.argv[1], 'board', ...boardArgs], {
|
|
55
|
+
detached: true,
|
|
56
|
+
stdio: 'ignore',
|
|
57
|
+
});
|
|
58
|
+
child.unref();
|
|
59
|
+
if (child.pid === undefined) {
|
|
60
|
+
throw new Error('Failed to spawn board daemon: child process has no PID');
|
|
61
|
+
}
|
|
62
|
+
const pid = child.pid;
|
|
63
|
+
writePidFile(pid);
|
|
64
|
+
return pid;
|
|
65
|
+
}
|
|
66
|
+
function killBoardProcess() {
|
|
67
|
+
const pid = readBoardPid();
|
|
68
|
+
if (pid === null)
|
|
69
|
+
return false;
|
|
70
|
+
try {
|
|
71
|
+
process.kill(pid, 'SIGTERM');
|
|
72
|
+
removePidFile();
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
if (err.code === 'ESRCH') {
|
|
77
|
+
removePidFile();
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=board-daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board-daemon.js","sourceRoot":"","sources":["../../../src/cli/utils/board-daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQLite Storage Backend
|
|
3
|
+
*
|
|
4
|
+
* Implements the StorageBackend interface using better-sqlite3.
|
|
5
|
+
* All SQL logic is encapsulated here, keeping services SQL-independent.
|
|
6
|
+
*/
|
|
7
|
+
import Database from 'better-sqlite3';
|
|
8
|
+
import type { TaskRepository, TagRepository, TaskBlockRepository, TaskTagRepository, MetadataRepository, CommentRepository, RunLogRepository, StorageBackend } from '../types/repository';
|
|
9
|
+
/**
|
|
10
|
+
* SQLite implementation of StorageBackend
|
|
11
|
+
*/
|
|
12
|
+
export declare class SQLiteStorageBackend implements StorageBackend {
|
|
13
|
+
private db;
|
|
14
|
+
readonly tasks: TaskRepository;
|
|
15
|
+
readonly tags: TagRepository;
|
|
16
|
+
readonly blocks: TaskBlockRepository;
|
|
17
|
+
readonly taskTags: TaskTagRepository;
|
|
18
|
+
readonly metadata: MetadataRepository;
|
|
19
|
+
readonly comments: CommentRepository;
|
|
20
|
+
readonly runLogs: RunLogRepository;
|
|
21
|
+
constructor(db: Database.Database);
|
|
22
|
+
transaction<T>(fn: () => T): T;
|
|
23
|
+
updateTaskTimestamps(id: number, createdAt: string, updatedAt: string): void;
|
|
24
|
+
getBoardUpdatedAtSignature(): string | null;
|
|
25
|
+
close(): void;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=sqlite-storage-backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-storage-backend.d.ts","sourceRoot":"","sources":["../../../src/db/adapters/sqlite-storage-backend.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAEhB,cAAc,EAGf,MAAM,qBAAqB,CAAC;AAshB7B;;GAEG;AACH,qBAAa,oBAAqB,YAAW,cAAc;IAS7C,OAAO,CAAC,EAAE;IARtB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC;gBAEf,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAUzC,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC;IAI9B,oBAAoB,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAI5E,0BAA0B,IAAI,MAAM,GAAG,IAAI;IAoB3C,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,498 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SQLite Storage Backend
|
|
4
|
+
*
|
|
5
|
+
* Implements the StorageBackend interface using better-sqlite3.
|
|
6
|
+
* All SQL logic is encapsulated here, keeping services SQL-independent.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SQLiteStorageBackend = void 0;
|
|
10
|
+
/** SQL CASE expression for priority ordering */
|
|
11
|
+
const PRIORITY_ORDER_EXPR = `CASE priority WHEN 'critical' THEN 4 WHEN 'high' THEN 3 WHEN 'medium' THEN 2 WHEN 'low' THEN 1 ELSE 0 END`;
|
|
12
|
+
class SQLiteTaskRepository {
|
|
13
|
+
db;
|
|
14
|
+
constructor(db) {
|
|
15
|
+
this.db = db;
|
|
16
|
+
}
|
|
17
|
+
findById(id) {
|
|
18
|
+
const row = this.db.prepare('SELECT * FROM tasks WHERE id = ?').get(id);
|
|
19
|
+
return row ?? null;
|
|
20
|
+
}
|
|
21
|
+
findAll(filter, sort) {
|
|
22
|
+
const { query, params } = this.buildFindAllQuery(filter, sort);
|
|
23
|
+
return this.db.prepare(query).all(...params);
|
|
24
|
+
}
|
|
25
|
+
buildFindAllQuery(filter, sort) {
|
|
26
|
+
const params = [];
|
|
27
|
+
const hasTagFilter = !!(filter?.tagIds && filter.tagIds.length > 0);
|
|
28
|
+
const tablePrefix = hasTagFilter ? 'tasks.' : '';
|
|
29
|
+
let query = this.buildBaseQuery(filter, params);
|
|
30
|
+
query += this.buildFilterClauses(filter, tablePrefix, params);
|
|
31
|
+
query += this.buildOrderClause(sort, tablePrefix);
|
|
32
|
+
return { query, params };
|
|
33
|
+
}
|
|
34
|
+
buildBaseQuery(filter, params) {
|
|
35
|
+
if (filter?.tagIds && filter.tagIds.length > 0) {
|
|
36
|
+
const placeholders = filter.tagIds.map(() => '?').join(', ');
|
|
37
|
+
params.push(...filter.tagIds);
|
|
38
|
+
return `SELECT DISTINCT tasks.* FROM tasks INNER JOIN task_tags ON tasks.id = task_tags.task_id WHERE task_tags.tag_id IN (${placeholders})`;
|
|
39
|
+
}
|
|
40
|
+
return 'SELECT * FROM tasks WHERE 1=1';
|
|
41
|
+
}
|
|
42
|
+
buildFilterClauses(filter, tablePrefix, params) {
|
|
43
|
+
let clause = '';
|
|
44
|
+
if (filter?.status) {
|
|
45
|
+
const statuses = Array.isArray(filter.status) ? filter.status : [filter.status];
|
|
46
|
+
if (statuses.length > 0) {
|
|
47
|
+
clause += ` AND ${tablePrefix}status IN (${statuses.map(() => '?').join(', ')})`;
|
|
48
|
+
params.push(...statuses);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
if (filter?.author) {
|
|
52
|
+
clause += ` AND ${tablePrefix}author = ?`;
|
|
53
|
+
params.push(filter.author);
|
|
54
|
+
}
|
|
55
|
+
if (filter?.assignees) {
|
|
56
|
+
clause += ` AND ${tablePrefix}assignees LIKE ?`;
|
|
57
|
+
params.push(`%${filter.assignees}%`);
|
|
58
|
+
}
|
|
59
|
+
if (filter?.priority) {
|
|
60
|
+
const priorities = Array.isArray(filter.priority) ? filter.priority : [filter.priority];
|
|
61
|
+
if (priorities.length > 0) {
|
|
62
|
+
clause += ` AND ${tablePrefix}priority IN (${priorities.map(() => '?').join(', ')})`;
|
|
63
|
+
params.push(...priorities);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (filter?.search) {
|
|
67
|
+
clause += ` AND (${tablePrefix}title LIKE ? OR ${tablePrefix}body LIKE ?)`;
|
|
68
|
+
const pattern = `%${filter.search}%`;
|
|
69
|
+
params.push(pattern, pattern);
|
|
70
|
+
}
|
|
71
|
+
return clause;
|
|
72
|
+
}
|
|
73
|
+
buildOrderClause(sort, tablePrefix) {
|
|
74
|
+
const sortField = sort?.field ?? 'created_at';
|
|
75
|
+
const sortOrder = sort?.order === 'asc' ? 'ASC' : 'DESC';
|
|
76
|
+
if (sortField === 'priority') {
|
|
77
|
+
return ` ORDER BY ${PRIORITY_ORDER_EXPR} ${sortOrder}, ${tablePrefix}id ${sortOrder}`;
|
|
78
|
+
}
|
|
79
|
+
return ` ORDER BY ${tablePrefix}${sortField} ${sortOrder}, ${tablePrefix}id ${sortOrder}`;
|
|
80
|
+
}
|
|
81
|
+
create(input) {
|
|
82
|
+
const result = this.db
|
|
83
|
+
.prepare(`INSERT INTO tasks (title, body, author, assignees, status, priority, parent_id, created_at, updated_at)
|
|
84
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`)
|
|
85
|
+
.run(input.title, input.body ?? null, input.author ?? null, input.assignees ?? null, input.status, input.priority !== undefined ? input.priority : null, input.parent_id !== undefined ? input.parent_id : null, input.created_at, input.updated_at);
|
|
86
|
+
return this.findById(result.lastInsertRowid);
|
|
87
|
+
}
|
|
88
|
+
update(id, input) {
|
|
89
|
+
const { updates, params } = this.buildUpdateClauses(input);
|
|
90
|
+
if (updates.length === 0) {
|
|
91
|
+
return this.findById(id);
|
|
92
|
+
}
|
|
93
|
+
params.push(id);
|
|
94
|
+
this.db.prepare(`UPDATE tasks SET ${updates.join(', ')} WHERE id = ?`).run(...params);
|
|
95
|
+
return this.findById(id);
|
|
96
|
+
}
|
|
97
|
+
buildUpdateClauses(input) {
|
|
98
|
+
const fields = [
|
|
99
|
+
['title', 'title', (v) => v],
|
|
100
|
+
['body', 'body', (v) => v],
|
|
101
|
+
['author', 'author', (v) => v],
|
|
102
|
+
['assignees', 'assignees', (v) => v || null],
|
|
103
|
+
['status', 'status', (v) => v],
|
|
104
|
+
['priority', 'priority', (v) => v],
|
|
105
|
+
['parent_id', 'parent_id', (v) => v],
|
|
106
|
+
['updated_at', 'updated_at', (v) => v],
|
|
107
|
+
];
|
|
108
|
+
const updates = [];
|
|
109
|
+
const params = [];
|
|
110
|
+
for (const [col, key, transform] of fields) {
|
|
111
|
+
if (input[key] !== undefined) {
|
|
112
|
+
updates.push(`${col} = ?`);
|
|
113
|
+
params.push(transform(input[key]));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return { updates, params };
|
|
117
|
+
}
|
|
118
|
+
delete(id) {
|
|
119
|
+
const result = this.db.prepare('DELETE FROM tasks WHERE id = ?').run(id);
|
|
120
|
+
return result.changes > 0;
|
|
121
|
+
}
|
|
122
|
+
findChildren(parentId) {
|
|
123
|
+
return this.db
|
|
124
|
+
.prepare('SELECT * FROM tasks WHERE parent_id = ? ORDER BY created_at ASC')
|
|
125
|
+
.all(parentId);
|
|
126
|
+
}
|
|
127
|
+
countByStatus() {
|
|
128
|
+
const results = this.db.prepare('SELECT status, COUNT(*) as count FROM tasks GROUP BY status').all();
|
|
129
|
+
const countMap = {
|
|
130
|
+
icebox: 0,
|
|
131
|
+
backlog: 0,
|
|
132
|
+
ready: 0,
|
|
133
|
+
in_progress: 0,
|
|
134
|
+
review: 0,
|
|
135
|
+
done: 0,
|
|
136
|
+
closed: 0,
|
|
137
|
+
};
|
|
138
|
+
for (const row of results) {
|
|
139
|
+
countMap[row.status] = row.count;
|
|
140
|
+
}
|
|
141
|
+
return countMap;
|
|
142
|
+
}
|
|
143
|
+
findForPurge(beforeDate, statuses) {
|
|
144
|
+
if (statuses.length === 0)
|
|
145
|
+
return [];
|
|
146
|
+
const placeholders = statuses.map(() => '?').join(', ');
|
|
147
|
+
const query = `SELECT * FROM tasks WHERE status IN (${placeholders}) AND updated_at < ? ORDER BY updated_at ASC`;
|
|
148
|
+
return this.db.prepare(query).all(...statuses, beforeDate);
|
|
149
|
+
}
|
|
150
|
+
deleteMany(ids) {
|
|
151
|
+
if (ids.length === 0)
|
|
152
|
+
return 0;
|
|
153
|
+
const placeholders = ids.map(() => '?').join(', ');
|
|
154
|
+
const result = this.db.prepare(`DELETE FROM tasks WHERE id IN (${placeholders})`).run(...ids);
|
|
155
|
+
return result.changes;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
class SQLiteTagRepository {
|
|
159
|
+
db;
|
|
160
|
+
constructor(db) {
|
|
161
|
+
this.db = db;
|
|
162
|
+
}
|
|
163
|
+
findById(id) {
|
|
164
|
+
const row = this.db.prepare('SELECT * FROM tags WHERE id = ?').get(id);
|
|
165
|
+
return row ?? null;
|
|
166
|
+
}
|
|
167
|
+
findByName(name) {
|
|
168
|
+
const row = this.db.prepare('SELECT * FROM tags WHERE name = ?').get(name);
|
|
169
|
+
return row ?? null;
|
|
170
|
+
}
|
|
171
|
+
findAll() {
|
|
172
|
+
return this.db.prepare('SELECT * FROM tags ORDER BY created_at DESC, id DESC').all();
|
|
173
|
+
}
|
|
174
|
+
create(input) {
|
|
175
|
+
const result = this.db
|
|
176
|
+
.prepare('INSERT INTO tags (name, created_at) VALUES (?, ?)')
|
|
177
|
+
.run(input.name, input.created_at);
|
|
178
|
+
return this.findById(result.lastInsertRowid);
|
|
179
|
+
}
|
|
180
|
+
update(id, input) {
|
|
181
|
+
this.db.prepare('UPDATE tags SET name = COALESCE(?, name) WHERE id = ?').run(input.name ?? null, id);
|
|
182
|
+
return this.findById(id);
|
|
183
|
+
}
|
|
184
|
+
delete(id) {
|
|
185
|
+
const result = this.db.prepare('DELETE FROM tags WHERE id = ?').run(id);
|
|
186
|
+
return result.changes > 0;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
class SQLiteTaskBlockRepository {
|
|
190
|
+
db;
|
|
191
|
+
constructor(db) {
|
|
192
|
+
this.db = db;
|
|
193
|
+
}
|
|
194
|
+
create(input) {
|
|
195
|
+
const result = this.db
|
|
196
|
+
.prepare('INSERT INTO task_blocks (blocker_task_id, blocked_task_id, created_at) VALUES (?, ?, ?)')
|
|
197
|
+
.run(input.blocker_task_id, input.blocked_task_id, input.created_at);
|
|
198
|
+
return this.db
|
|
199
|
+
.prepare('SELECT * FROM task_blocks WHERE id = ?')
|
|
200
|
+
.get(result.lastInsertRowid);
|
|
201
|
+
}
|
|
202
|
+
delete(blockerId, blockedId) {
|
|
203
|
+
const result = this.db
|
|
204
|
+
.prepare('DELETE FROM task_blocks WHERE blocker_task_id = ? AND blocked_task_id = ?')
|
|
205
|
+
.run(blockerId, blockedId);
|
|
206
|
+
return result.changes > 0;
|
|
207
|
+
}
|
|
208
|
+
findBlockedTaskIds(blockerId) {
|
|
209
|
+
const rows = this.db
|
|
210
|
+
.prepare('SELECT blocked_task_id FROM task_blocks WHERE blocker_task_id = ?')
|
|
211
|
+
.all(blockerId);
|
|
212
|
+
return rows.map((r) => r.blocked_task_id);
|
|
213
|
+
}
|
|
214
|
+
findBlockerTaskIds(blockedId) {
|
|
215
|
+
const rows = this.db
|
|
216
|
+
.prepare('SELECT blocker_task_id FROM task_blocks WHERE blocked_task_id = ?')
|
|
217
|
+
.all(blockedId);
|
|
218
|
+
return rows.map((r) => r.blocker_task_id);
|
|
219
|
+
}
|
|
220
|
+
findAll() {
|
|
221
|
+
return this.db.prepare('SELECT blocker_task_id, blocked_task_id FROM task_blocks').all();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
class SQLiteTaskTagRepository {
|
|
225
|
+
db;
|
|
226
|
+
constructor(db) {
|
|
227
|
+
this.db = db;
|
|
228
|
+
}
|
|
229
|
+
create(input) {
|
|
230
|
+
const result = this.db
|
|
231
|
+
.prepare('INSERT INTO task_tags (task_id, tag_id, created_at) VALUES (?, ?, ?)')
|
|
232
|
+
.run(input.task_id, input.tag_id, input.created_at);
|
|
233
|
+
return this.db
|
|
234
|
+
.prepare('SELECT * FROM task_tags WHERE id = ?')
|
|
235
|
+
.get(result.lastInsertRowid);
|
|
236
|
+
}
|
|
237
|
+
delete(taskId, tagId) {
|
|
238
|
+
const result = this.db.prepare('DELETE FROM task_tags WHERE task_id = ? AND tag_id = ?').run(taskId, tagId);
|
|
239
|
+
return result.changes > 0;
|
|
240
|
+
}
|
|
241
|
+
exists(taskId, tagId) {
|
|
242
|
+
const row = this.db
|
|
243
|
+
.prepare('SELECT COUNT(*) as count FROM task_tags WHERE task_id = ? AND tag_id = ?')
|
|
244
|
+
.get(taskId, tagId);
|
|
245
|
+
return row.count > 0;
|
|
246
|
+
}
|
|
247
|
+
findTagIdsByTaskId(taskId) {
|
|
248
|
+
const rows = this.db
|
|
249
|
+
.prepare('SELECT tag_id FROM task_tags WHERE task_id = ? ORDER BY created_at ASC')
|
|
250
|
+
.all(taskId);
|
|
251
|
+
return rows.map((r) => r.tag_id);
|
|
252
|
+
}
|
|
253
|
+
findTagsByTaskId(taskId) {
|
|
254
|
+
return this.db
|
|
255
|
+
.prepare(`SELECT t.* FROM tags t
|
|
256
|
+
INNER JOIN task_tags tt ON t.id = tt.tag_id
|
|
257
|
+
WHERE tt.task_id = ?
|
|
258
|
+
ORDER BY tt.created_at ASC`)
|
|
259
|
+
.all(taskId);
|
|
260
|
+
}
|
|
261
|
+
findTaskIdsByTagId(tagId) {
|
|
262
|
+
const rows = this.db
|
|
263
|
+
.prepare('SELECT task_id FROM task_tags WHERE tag_id = ? ORDER BY created_at ASC')
|
|
264
|
+
.all(tagId);
|
|
265
|
+
return rows.map((r) => r.task_id);
|
|
266
|
+
}
|
|
267
|
+
findTasksByTagId(tagId) {
|
|
268
|
+
return this.db
|
|
269
|
+
.prepare(`SELECT t.* FROM tasks t
|
|
270
|
+
INNER JOIN task_tags tt ON t.id = tt.task_id
|
|
271
|
+
WHERE tt.tag_id = ?
|
|
272
|
+
ORDER BY tt.created_at ASC`)
|
|
273
|
+
.all(tagId);
|
|
274
|
+
}
|
|
275
|
+
findAllGroupedByTaskId() {
|
|
276
|
+
const rows = this.db
|
|
277
|
+
.prepare(`SELECT tt.task_id, t.*
|
|
278
|
+
FROM tags t
|
|
279
|
+
INNER JOIN task_tags tt ON t.id = tt.tag_id
|
|
280
|
+
ORDER BY tt.task_id, tt.created_at ASC`)
|
|
281
|
+
.all();
|
|
282
|
+
const result = new Map();
|
|
283
|
+
for (const row of rows) {
|
|
284
|
+
const taskId = row.task_id;
|
|
285
|
+
const tag = { id: row.id, name: row.name, created_at: row.created_at };
|
|
286
|
+
if (!result.has(taskId))
|
|
287
|
+
result.set(taskId, []);
|
|
288
|
+
result.get(taskId).push(tag);
|
|
289
|
+
}
|
|
290
|
+
return result;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
class SQLiteMetadataRepository {
|
|
294
|
+
db;
|
|
295
|
+
constructor(db) {
|
|
296
|
+
this.db = db;
|
|
297
|
+
}
|
|
298
|
+
set(input) {
|
|
299
|
+
const existing = this.findByKey(input.task_id, input.key);
|
|
300
|
+
if (existing) {
|
|
301
|
+
return this.update(input.task_id, input.key, input.value, input.updated_at);
|
|
302
|
+
}
|
|
303
|
+
this.db
|
|
304
|
+
.prepare('INSERT INTO task_metadata (task_id, key, value, created_at, updated_at) VALUES (?, ?, ?, ?, ?)')
|
|
305
|
+
.run(input.task_id, input.key, input.value, input.created_at, input.updated_at);
|
|
306
|
+
return this.findByKey(input.task_id, input.key);
|
|
307
|
+
}
|
|
308
|
+
findByKey(taskId, key) {
|
|
309
|
+
const row = this.db.prepare('SELECT * FROM task_metadata WHERE task_id = ? AND key = ?').get(taskId, key);
|
|
310
|
+
return row ?? null;
|
|
311
|
+
}
|
|
312
|
+
findByTaskId(taskId) {
|
|
313
|
+
return this.db
|
|
314
|
+
.prepare('SELECT * FROM task_metadata WHERE task_id = ? ORDER BY created_at DESC, id DESC')
|
|
315
|
+
.all(taskId);
|
|
316
|
+
}
|
|
317
|
+
delete(taskId, key) {
|
|
318
|
+
const result = this.db.prepare('DELETE FROM task_metadata WHERE task_id = ? AND key = ?').run(taskId, key);
|
|
319
|
+
return result.changes > 0;
|
|
320
|
+
}
|
|
321
|
+
deleteAllForTask(taskId) {
|
|
322
|
+
const result = this.db.prepare('DELETE FROM task_metadata WHERE task_id = ?').run(taskId);
|
|
323
|
+
return result.changes;
|
|
324
|
+
}
|
|
325
|
+
findAllGroupedByTaskId() {
|
|
326
|
+
const rows = this.db
|
|
327
|
+
.prepare('SELECT * FROM task_metadata ORDER BY task_id, created_at DESC, id DESC')
|
|
328
|
+
.all();
|
|
329
|
+
const result = new Map();
|
|
330
|
+
for (const row of rows) {
|
|
331
|
+
const taskId = row.task_id;
|
|
332
|
+
if (!result.has(taskId))
|
|
333
|
+
result.set(taskId, []);
|
|
334
|
+
result.get(taskId).push(row);
|
|
335
|
+
}
|
|
336
|
+
return result;
|
|
337
|
+
}
|
|
338
|
+
update(taskId, key, value, updatedAt) {
|
|
339
|
+
this.db
|
|
340
|
+
.prepare('UPDATE task_metadata SET value = ?, updated_at = ? WHERE task_id = ? AND key = ?')
|
|
341
|
+
.run(value, updatedAt, taskId, key);
|
|
342
|
+
return this.findByKey(taskId, key);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
class SQLiteCommentRepository {
|
|
346
|
+
db;
|
|
347
|
+
constructor(db) {
|
|
348
|
+
this.db = db;
|
|
349
|
+
}
|
|
350
|
+
create(input) {
|
|
351
|
+
const result = this.db
|
|
352
|
+
.prepare('INSERT INTO task_comments (task_id, author, content, created_at, updated_at) VALUES (?, ?, ?, ?, ?)')
|
|
353
|
+
.run(input.task_id, input.author ?? null, input.content, input.created_at, input.updated_at);
|
|
354
|
+
return this.findById(result.lastInsertRowid);
|
|
355
|
+
}
|
|
356
|
+
findById(id) {
|
|
357
|
+
const row = this.db.prepare('SELECT * FROM task_comments WHERE id = ?').get(id);
|
|
358
|
+
return row ?? null;
|
|
359
|
+
}
|
|
360
|
+
findByTaskId(taskId) {
|
|
361
|
+
return this.db
|
|
362
|
+
.prepare('SELECT * FROM task_comments WHERE task_id = ? ORDER BY created_at ASC')
|
|
363
|
+
.all(taskId);
|
|
364
|
+
}
|
|
365
|
+
delete(id) {
|
|
366
|
+
const result = this.db.prepare('DELETE FROM task_comments WHERE id = ?').run(id);
|
|
367
|
+
return result.changes > 0;
|
|
368
|
+
}
|
|
369
|
+
deleteAllForTask(taskId) {
|
|
370
|
+
const result = this.db.prepare('DELETE FROM task_comments WHERE task_id = ?').run(taskId);
|
|
371
|
+
return result.changes;
|
|
372
|
+
}
|
|
373
|
+
update(id, content, updatedAt) {
|
|
374
|
+
const result = this.db
|
|
375
|
+
.prepare('UPDATE task_comments SET content = ?, updated_at = ? WHERE id = ?')
|
|
376
|
+
.run(content, updatedAt, id);
|
|
377
|
+
if (result.changes === 0)
|
|
378
|
+
return null;
|
|
379
|
+
return this.findById(id);
|
|
380
|
+
}
|
|
381
|
+
findByTaskIds(taskIds) {
|
|
382
|
+
if (taskIds.length === 0)
|
|
383
|
+
return new Map();
|
|
384
|
+
const placeholders = taskIds.map(() => '?').join(', ');
|
|
385
|
+
const rows = this.db
|
|
386
|
+
.prepare(`SELECT * FROM task_comments WHERE task_id IN (${placeholders}) ORDER BY task_id, created_at ASC`)
|
|
387
|
+
.all(...taskIds);
|
|
388
|
+
const result = new Map();
|
|
389
|
+
for (const row of rows) {
|
|
390
|
+
const taskId = row.task_id;
|
|
391
|
+
if (!result.has(taskId))
|
|
392
|
+
result.set(taskId, []);
|
|
393
|
+
result.get(taskId).push(row);
|
|
394
|
+
}
|
|
395
|
+
return result;
|
|
396
|
+
}
|
|
397
|
+
updateTimestamps(id, createdAt, updatedAt) {
|
|
398
|
+
this.db
|
|
399
|
+
.prepare('UPDATE task_comments SET created_at = ?, updated_at = ? WHERE id = ?')
|
|
400
|
+
.run(createdAt, updatedAt, id);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
class SQLiteRunLogRepository {
|
|
404
|
+
db;
|
|
405
|
+
constructor(db) {
|
|
406
|
+
this.db = db;
|
|
407
|
+
}
|
|
408
|
+
create(taskId, startedAt) {
|
|
409
|
+
const result = this.db
|
|
410
|
+
.prepare(`INSERT INTO task_run_logs (task_id, started_at, finished_at, exit_code, events) VALUES (?, ?, NULL, NULL, '[]')`)
|
|
411
|
+
.run(taskId, startedAt);
|
|
412
|
+
return result.lastInsertRowid;
|
|
413
|
+
}
|
|
414
|
+
updateFinished(id, finishedAt, exitCode, events) {
|
|
415
|
+
this.db
|
|
416
|
+
.prepare(`UPDATE task_run_logs SET finished_at = ?, exit_code = ?, events = ? WHERE id = ?`)
|
|
417
|
+
.run(finishedAt, exitCode, events, id);
|
|
418
|
+
}
|
|
419
|
+
updateSessionId(id, sessionId) {
|
|
420
|
+
this.db.prepare(`UPDATE task_run_logs SET session_id = ? WHERE id = ?`).run(sessionId, id);
|
|
421
|
+
}
|
|
422
|
+
updateEvents(id, events) {
|
|
423
|
+
this.db.prepare(`UPDATE task_run_logs SET events = ? WHERE id = ?`).run(events, id);
|
|
424
|
+
}
|
|
425
|
+
findLatestByTaskId(taskId) {
|
|
426
|
+
const row = this.db
|
|
427
|
+
.prepare(`SELECT * FROM task_run_logs WHERE task_id = ? ORDER BY started_at DESC LIMIT 1`)
|
|
428
|
+
.get(taskId);
|
|
429
|
+
return row ?? null;
|
|
430
|
+
}
|
|
431
|
+
findByTaskId(taskId, limit) {
|
|
432
|
+
return this.db
|
|
433
|
+
.prepare(`SELECT * FROM task_run_logs WHERE task_id = ? ORDER BY started_at DESC LIMIT ?`)
|
|
434
|
+
.all(taskId, limit);
|
|
435
|
+
}
|
|
436
|
+
findIdsByTaskId(taskId) {
|
|
437
|
+
const rows = this.db
|
|
438
|
+
.prepare(`SELECT id FROM task_run_logs WHERE task_id = ? ORDER BY started_at DESC`)
|
|
439
|
+
.all(taskId);
|
|
440
|
+
return rows.map((r) => r.id);
|
|
441
|
+
}
|
|
442
|
+
deleteMany(ids) {
|
|
443
|
+
if (ids.length === 0)
|
|
444
|
+
return;
|
|
445
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
446
|
+
this.db.prepare(`DELETE FROM task_run_logs WHERE id IN (${placeholders})`).run(...ids);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
/**
|
|
450
|
+
* SQLite implementation of StorageBackend
|
|
451
|
+
*/
|
|
452
|
+
class SQLiteStorageBackend {
|
|
453
|
+
db;
|
|
454
|
+
tasks;
|
|
455
|
+
tags;
|
|
456
|
+
blocks;
|
|
457
|
+
taskTags;
|
|
458
|
+
metadata;
|
|
459
|
+
comments;
|
|
460
|
+
runLogs;
|
|
461
|
+
constructor(db) {
|
|
462
|
+
this.db = db;
|
|
463
|
+
this.tasks = new SQLiteTaskRepository(db);
|
|
464
|
+
this.tags = new SQLiteTagRepository(db);
|
|
465
|
+
this.blocks = new SQLiteTaskBlockRepository(db);
|
|
466
|
+
this.taskTags = new SQLiteTaskTagRepository(db);
|
|
467
|
+
this.metadata = new SQLiteMetadataRepository(db);
|
|
468
|
+
this.comments = new SQLiteCommentRepository(db);
|
|
469
|
+
this.runLogs = new SQLiteRunLogRepository(db);
|
|
470
|
+
}
|
|
471
|
+
transaction(fn) {
|
|
472
|
+
return this.db.transaction(fn)();
|
|
473
|
+
}
|
|
474
|
+
updateTaskTimestamps(id, createdAt, updatedAt) {
|
|
475
|
+
this.db.prepare('UPDATE tasks SET created_at = ?, updated_at = ? WHERE id = ?').run(createdAt, updatedAt, id);
|
|
476
|
+
}
|
|
477
|
+
getBoardUpdatedAtSignature() {
|
|
478
|
+
const baseRow = this.db
|
|
479
|
+
.prepare(`SELECT MAX(updated_at) as max_updated_at FROM (
|
|
480
|
+
SELECT updated_at FROM tasks UNION ALL SELECT updated_at FROM task_metadata
|
|
481
|
+
)`)
|
|
482
|
+
.get();
|
|
483
|
+
const tagsRow = this.db
|
|
484
|
+
.prepare('SELECT MAX(created_at) as max_created_at, COUNT(*) as count FROM task_tags')
|
|
485
|
+
.get();
|
|
486
|
+
const blocksRow = this.db
|
|
487
|
+
.prepare('SELECT MAX(created_at) as max_created_at, COUNT(*) as count FROM task_blocks')
|
|
488
|
+
.get();
|
|
489
|
+
if (baseRow.max_updated_at === null && tagsRow.max_created_at === null && blocksRow.max_created_at === null)
|
|
490
|
+
return null;
|
|
491
|
+
return `${baseRow.max_updated_at}|${tagsRow.max_created_at}|${tagsRow.count}|${blocksRow.max_created_at}|${blocksRow.count}`;
|
|
492
|
+
}
|
|
493
|
+
close() {
|
|
494
|
+
this.db.close();
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
exports.SQLiteStorageBackend = SQLiteStorageBackend;
|
|
498
|
+
//# sourceMappingURL=sqlite-storage-backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-storage-backend.js","sourceRoot":"","sources":["../../../src/db/adapters/sqlite-storage-backend.ts"],"names":[],"mappings":"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"}
|