@quantod/qq 0.1.14 → 0.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/dist/commands.d.ts +3 -4
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +50 -49
- package/dist/commands.js.map +1 -1
- package/dist/db.d.ts +1 -2
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +18 -18
- package/dist/db.js.map +1 -1
- package/dist/index.js +1 -11
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/commands.ts +54 -56
- package/src/db.ts +18 -13
- package/src/index.ts +2 -9
package/dist/commands.d.ts
CHANGED
|
@@ -21,8 +21,7 @@ export interface FilterOptions {
|
|
|
21
21
|
limit?: number;
|
|
22
22
|
offset?: number;
|
|
23
23
|
}
|
|
24
|
-
export declare function makePipeline(
|
|
25
|
-
export declare function listPipelines(): string[];
|
|
24
|
+
export declare function makePipeline(customName?: string): string;
|
|
26
25
|
export declare function deletePipeline(pipeline: string): void;
|
|
27
26
|
export interface PushOptions {
|
|
28
27
|
payload?: string;
|
|
@@ -38,9 +37,9 @@ export interface ReleaseOptions {
|
|
|
38
37
|
}
|
|
39
38
|
export declare function release(pipeline: string, id: string, { target, payload, replace, priority }?: ReleaseOptions): void;
|
|
40
39
|
export declare function batchRead(pipeline: string, stage?: string, filters?: FilterOptions, includePayload?: boolean): Item[];
|
|
41
|
-
export declare function stats(pipeline
|
|
40
|
+
export declare function stats(pipeline?: string): Record<string, Record<string, {
|
|
42
41
|
total: number;
|
|
43
42
|
claimed: number;
|
|
44
|
-
}
|
|
43
|
+
}>>;
|
|
45
44
|
export declare function unclaim(pipeline: string, stage?: string, filters?: FilterOptions): number;
|
|
46
45
|
//# sourceMappingURL=commands.d.ts.map
|
package/dist/commands.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAIhC,qBAAa,OAAQ,SAAQ,KAAK;gBACpB,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA+BD,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAmBxD;AAKD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOrD;AAID,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,QAAc,EAAE,GAAE,WAAgB,GAAG,MAAM,CAiBxH;AAID,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAoBlE;AAID,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAE,cAAmB,GAAG,IAAI,CA6BvH;AA6BD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAM,EAAE,OAAO,GAAE,aAAkB,EAAE,cAAc,UAAO,GAAG,IAAI,EAAE,CA4BnH;AAID,wBAAgB,KAAK,CAAC,QAAQ,SAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAkBxG;AAID,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAa1F"}
|
package/dist/commands.js
CHANGED
|
@@ -35,7 +35,6 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.QQError = exports.yaml = void 0;
|
|
37
37
|
exports.makePipeline = makePipeline;
|
|
38
|
-
exports.listPipelines = listPipelines;
|
|
39
38
|
exports.deletePipeline = deletePipeline;
|
|
40
39
|
exports.push = push;
|
|
41
40
|
exports.claim = claim;
|
|
@@ -43,8 +42,6 @@ exports.release = release;
|
|
|
43
42
|
exports.batchRead = batchRead;
|
|
44
43
|
exports.stats = stats;
|
|
45
44
|
exports.unclaim = unclaim;
|
|
46
|
-
const node_fs_1 = require("node:fs");
|
|
47
|
-
const node_path_1 = require("node:path");
|
|
48
45
|
const node_crypto_1 = require("node:crypto");
|
|
49
46
|
const db_js_1 = require("./db.js");
|
|
50
47
|
exports.yaml = __importStar(require("js-yaml"));
|
|
@@ -60,8 +57,8 @@ exports.QQError = QQError;
|
|
|
60
57
|
function toGlob(pattern) {
|
|
61
58
|
return pattern.replace(/\*/g, '%').replace(/\?/g, '_');
|
|
62
59
|
}
|
|
63
|
-
function nextSeq(db) {
|
|
64
|
-
const row = db.prepare('SELECT MAX(seq) as m FROM messages').get();
|
|
60
|
+
function nextSeq(db, pipeline) {
|
|
61
|
+
const row = db.prepare('SELECT MAX(seq) as m FROM messages WHERE pipeline = ?').get(pipeline);
|
|
65
62
|
return (row.m ?? 0) + 1;
|
|
66
63
|
}
|
|
67
64
|
function rowToItem(row, includePayload) {
|
|
@@ -79,47 +76,49 @@ function rowToItem(row, includePayload) {
|
|
|
79
76
|
return msg;
|
|
80
77
|
}
|
|
81
78
|
// ── makePipeline ──────────────────────────────────────────────────────────────
|
|
82
|
-
function makePipeline(
|
|
83
|
-
if (!
|
|
79
|
+
function makePipeline(customName) {
|
|
80
|
+
if (!customName) {
|
|
84
81
|
const now = new Date();
|
|
85
82
|
const mm = String(now.getMonth() + 1).padStart(2, '0');
|
|
86
83
|
const dd = String(now.getDate()).padStart(2, '0');
|
|
87
|
-
|
|
84
|
+
customName = `${mm}${dd}_${(0, node_crypto_1.randomBytes)(3).toString('hex')}`;
|
|
88
85
|
}
|
|
89
|
-
const
|
|
90
|
-
db.
|
|
91
|
-
return name;
|
|
92
|
-
}
|
|
93
|
-
// ── listPipelines ─────────────────────────────────────────────────────────────
|
|
94
|
-
function listPipelines() {
|
|
95
|
-
const dir = (0, db_js_1.dbRoot)();
|
|
96
|
-
let entries;
|
|
86
|
+
const name = customName;
|
|
87
|
+
const db = (0, db_js_1.openDb)();
|
|
97
88
|
try {
|
|
98
|
-
|
|
89
|
+
(0, db_js_1.inTransaction)(db, () => {
|
|
90
|
+
const existing = db.prepare('SELECT id FROM pipelines WHERE id = ?').get(name);
|
|
91
|
+
if (existing)
|
|
92
|
+
throw new QQError(`pipeline already exists: ${name}`);
|
|
93
|
+
db.prepare('INSERT INTO pipelines (id, created) VALUES (?, ?)').run(name, Date.now());
|
|
94
|
+
});
|
|
99
95
|
}
|
|
100
|
-
|
|
101
|
-
|
|
96
|
+
finally {
|
|
97
|
+
db.close();
|
|
102
98
|
}
|
|
103
|
-
return
|
|
104
|
-
.filter(f => f.endsWith('.db'))
|
|
105
|
-
.map(f => f.slice(0, -3))
|
|
106
|
-
.sort();
|
|
99
|
+
return name;
|
|
107
100
|
}
|
|
108
101
|
// ── deletePipeline ────────────────────────────────────────────────────────────
|
|
109
102
|
function deletePipeline(pipeline) {
|
|
110
|
-
|
|
103
|
+
const db = (0, db_js_1.openDb)();
|
|
104
|
+
try {
|
|
105
|
+
db.prepare('DELETE FROM pipelines WHERE id = ?').run(pipeline);
|
|
106
|
+
}
|
|
107
|
+
finally {
|
|
108
|
+
db.close();
|
|
109
|
+
}
|
|
111
110
|
}
|
|
112
111
|
function push(pipeline, stage, id, { payload, priority = 0.0 } = {}) {
|
|
113
|
-
const db = (0, db_js_1.openDb)(
|
|
112
|
+
const db = (0, db_js_1.openDb)();
|
|
114
113
|
try {
|
|
115
114
|
return (0, db_js_1.inTransaction)(db, () => {
|
|
116
|
-
const seq = nextSeq(db);
|
|
115
|
+
const seq = nextSeq(db, pipeline);
|
|
117
116
|
const actualId = id ?? String(seq);
|
|
118
|
-
const existing = db.prepare('SELECT id FROM messages WHERE id = ?').get(actualId);
|
|
117
|
+
const existing = db.prepare('SELECT id FROM messages WHERE pipeline = ? AND id = ?').get(pipeline, actualId);
|
|
119
118
|
if (existing)
|
|
120
119
|
throw new QQError(`duplicate id: ${actualId}`);
|
|
121
120
|
const now = Date.now();
|
|
122
|
-
db.prepare('INSERT INTO messages (id, subqueue, claimed, seq, payload, priority, created, last_modified) VALUES (?, ?, 0, ?, ?, ?, ?, ?)').run(actualId, stage, seq, payload ?? null, priority, now, now);
|
|
121
|
+
db.prepare('INSERT INTO messages (pipeline, id, subqueue, claimed, seq, payload, priority, created, last_modified) VALUES (?, ?, ?, 0, ?, ?, ?, ?, ?)').run(pipeline, actualId, stage, seq, payload ?? null, priority, now, now);
|
|
123
122
|
return actualId;
|
|
124
123
|
});
|
|
125
124
|
}
|
|
@@ -129,14 +128,14 @@ function push(pipeline, stage, id, { payload, priority = 0.0 } = {}) {
|
|
|
129
128
|
}
|
|
130
129
|
// ── claim ─────────────────────────────────────────────────────────────────────
|
|
131
130
|
function claim(pipeline, stage) {
|
|
132
|
-
const db = (0, db_js_1.openDb)(
|
|
131
|
+
const db = (0, db_js_1.openDb)();
|
|
133
132
|
try {
|
|
134
133
|
return (0, db_js_1.inTransaction)(db, () => {
|
|
135
|
-
const row = db.prepare('SELECT * FROM messages WHERE subqueue LIKE ? AND claimed = 0 ORDER BY priority DESC, seq ASC LIMIT 1').get(toGlob(stage));
|
|
134
|
+
const row = db.prepare('SELECT * FROM messages WHERE pipeline = ? AND subqueue LIKE ? AND claimed = 0 ORDER BY priority DESC, seq ASC LIMIT 1').get(pipeline, toGlob(stage));
|
|
136
135
|
if (!row)
|
|
137
136
|
return null;
|
|
138
137
|
const now = Date.now();
|
|
139
|
-
db.prepare('UPDATE messages SET claimed = 1, last_modified = ? WHERE id = ?').run(now, row.id);
|
|
138
|
+
db.prepare('UPDATE messages SET claimed = 1, last_modified = ? WHERE pipeline = ? AND id = ?').run(now, pipeline, row.id);
|
|
140
139
|
return rowToItem({ ...row, claimed: 1 }, true);
|
|
141
140
|
});
|
|
142
141
|
}
|
|
@@ -145,15 +144,15 @@ function claim(pipeline, stage) {
|
|
|
145
144
|
}
|
|
146
145
|
}
|
|
147
146
|
function release(pipeline, id, { target, payload, replace, priority } = {}) {
|
|
148
|
-
const db = (0, db_js_1.openDb)(
|
|
147
|
+
const db = (0, db_js_1.openDb)();
|
|
149
148
|
try {
|
|
150
149
|
(0, db_js_1.inTransaction)(db, () => {
|
|
151
|
-
const row = db.prepare('SELECT * FROM messages WHERE id = ?').get(id);
|
|
150
|
+
const row = db.prepare('SELECT * FROM messages WHERE pipeline = ? AND id = ?').get(pipeline, id);
|
|
152
151
|
if (!row)
|
|
153
152
|
throw new QQError(`item not found: ${id}`);
|
|
154
153
|
if (!row.claimed)
|
|
155
154
|
throw new QQError(`only claimed items can be released: ${id}`);
|
|
156
|
-
const seq = nextSeq(db);
|
|
155
|
+
const seq = nextSeq(db, pipeline);
|
|
157
156
|
const now = Date.now();
|
|
158
157
|
const newStage = target ?? row.subqueue;
|
|
159
158
|
const newPriority = priority ?? row.priority ?? 0.0;
|
|
@@ -166,7 +165,7 @@ function release(pipeline, id, { target, payload, replace, priority } = {}) {
|
|
|
166
165
|
else {
|
|
167
166
|
newPayload = row.payload ?? null;
|
|
168
167
|
}
|
|
169
|
-
db.prepare('UPDATE messages SET claimed = 0, seq = ?, subqueue = ?, payload = ?, priority = ?, last_modified = ? WHERE id = ?').run(seq, newStage, newPayload, newPriority, now, id);
|
|
168
|
+
db.prepare('UPDATE messages SET claimed = 0, seq = ?, subqueue = ?, payload = ?, priority = ?, last_modified = ? WHERE pipeline = ? AND id = ?').run(seq, newStage, newPayload, newPriority, now, pipeline, id);
|
|
170
169
|
});
|
|
171
170
|
}
|
|
172
171
|
finally {
|
|
@@ -174,9 +173,9 @@ function release(pipeline, id, { target, payload, replace, priority } = {}) {
|
|
|
174
173
|
}
|
|
175
174
|
}
|
|
176
175
|
// ── shared filter builder ─────────────────────────────────────────────────────
|
|
177
|
-
function buildFilterConditions(stage, filters) {
|
|
178
|
-
const conditions = ['subqueue LIKE ?'];
|
|
179
|
-
const params = [toGlob(stage)];
|
|
176
|
+
function buildFilterConditions(pipeline, stage, filters) {
|
|
177
|
+
const conditions = ['pipeline = ?', 'subqueue LIKE ?'];
|
|
178
|
+
const params = [pipeline, toGlob(stage)];
|
|
180
179
|
if (filters.ids?.length) {
|
|
181
180
|
conditions.push(`id IN (${filters.ids.map(() => '?').join(', ')})`);
|
|
182
181
|
params.push(...filters.ids);
|
|
@@ -197,9 +196,9 @@ function buildFilterConditions(stage, filters) {
|
|
|
197
196
|
}
|
|
198
197
|
// ── batchRead ─────────────────────────────────────────────────────────────────
|
|
199
198
|
function batchRead(pipeline, stage = '*', filters = {}, includePayload = true) {
|
|
200
|
-
const db = (0, db_js_1.openDb)(
|
|
199
|
+
const db = (0, db_js_1.openDb)();
|
|
201
200
|
try {
|
|
202
|
-
const { conditions, params } = buildFilterConditions(stage, filters);
|
|
201
|
+
const { conditions, params } = buildFilterConditions(pipeline, stage, filters);
|
|
203
202
|
if (filters.claimed !== undefined) {
|
|
204
203
|
conditions.push('claimed = ?');
|
|
205
204
|
params.push(filters.claimed ? 1 : 0);
|
|
@@ -224,17 +223,19 @@ function batchRead(pipeline, stage = '*', filters = {}, includePayload = true) {
|
|
|
224
223
|
}
|
|
225
224
|
}
|
|
226
225
|
// ── stats ─────────────────────────────────────────────────────────────────────
|
|
227
|
-
function stats(pipeline) {
|
|
228
|
-
const db = (0, db_js_1.openDb)(
|
|
226
|
+
function stats(pipeline = '*') {
|
|
227
|
+
const db = (0, db_js_1.openDb)();
|
|
229
228
|
try {
|
|
230
|
-
const rows = db.prepare('SELECT subqueue, claimed, COUNT(*) as count FROM messages GROUP BY subqueue, claimed').all();
|
|
229
|
+
const rows = db.prepare('SELECT pipeline, subqueue, claimed, COUNT(*) as count FROM messages WHERE pipeline LIKE ? GROUP BY pipeline, subqueue, claimed').all(toGlob(pipeline));
|
|
231
230
|
const result = {};
|
|
232
231
|
for (const row of rows) {
|
|
233
|
-
if (!result[row.
|
|
234
|
-
result[row.
|
|
235
|
-
result[row.
|
|
232
|
+
if (!result[row.pipeline])
|
|
233
|
+
result[row.pipeline] = {};
|
|
234
|
+
if (!result[row.pipeline][row.subqueue])
|
|
235
|
+
result[row.pipeline][row.subqueue] = { total: 0, claimed: 0 };
|
|
236
|
+
result[row.pipeline][row.subqueue].total += row.count;
|
|
236
237
|
if (row.claimed)
|
|
237
|
-
result[row.subqueue].claimed += row.count;
|
|
238
|
+
result[row.pipeline][row.subqueue].claimed += row.count;
|
|
238
239
|
}
|
|
239
240
|
return result;
|
|
240
241
|
}
|
|
@@ -244,11 +245,11 @@ function stats(pipeline) {
|
|
|
244
245
|
}
|
|
245
246
|
// ── unclaim ───────────────────────────────────────────────────────────────────
|
|
246
247
|
function unclaim(pipeline, stage = '*', filters = {}) {
|
|
247
|
-
const db = (0, db_js_1.openDb)(
|
|
248
|
+
const db = (0, db_js_1.openDb)();
|
|
248
249
|
try {
|
|
249
250
|
return (0, db_js_1.inTransaction)(db, () => {
|
|
250
251
|
const now = Date.now();
|
|
251
|
-
const { conditions, params } = buildFilterConditions(stage, filters);
|
|
252
|
+
const { conditions, params } = buildFilterConditions(pipeline, stage, filters);
|
|
252
253
|
conditions.push('claimed = 1');
|
|
253
254
|
const sql = `UPDATE messages SET claimed = 0, last_modified = ? WHERE ${conditions.join(' AND ')}`;
|
|
254
255
|
return db.prepare(sql).run(now, ...params).changes;
|
package/dist/commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/db.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import Database from 'better-sqlite3';
|
|
2
|
-
export declare function
|
|
3
|
-
export declare function openDb(name: string): Database.Database;
|
|
2
|
+
export declare function openDb(): Database.Database;
|
|
4
3
|
export declare function inTransaction<T>(db: Database.Database, fn: () => T): T;
|
|
5
4
|
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAgCtC,wBAAgB,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAS1C;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEtE"}
|
package/dist/db.js
CHANGED
|
@@ -3,45 +3,45 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.dbRoot = dbRoot;
|
|
7
6
|
exports.openDb = openDb;
|
|
8
7
|
exports.inTransaction = inTransaction;
|
|
9
8
|
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
10
9
|
const node_fs_1 = require("node:fs");
|
|
11
10
|
const node_path_1 = require("node:path");
|
|
12
11
|
const DDL = `
|
|
12
|
+
CREATE TABLE IF NOT EXISTS pipelines (
|
|
13
|
+
id TEXT PRIMARY KEY,
|
|
14
|
+
created INTEGER NOT NULL
|
|
15
|
+
);
|
|
13
16
|
CREATE TABLE IF NOT EXISTS messages (
|
|
14
|
-
id TEXT
|
|
17
|
+
id TEXT NOT NULL,
|
|
18
|
+
pipeline TEXT NOT NULL REFERENCES pipelines(id) ON DELETE CASCADE,
|
|
15
19
|
subqueue TEXT NOT NULL,
|
|
16
20
|
claimed INTEGER NOT NULL DEFAULT 0,
|
|
17
21
|
seq INTEGER NOT NULL,
|
|
18
22
|
payload TEXT,
|
|
19
23
|
created INTEGER NOT NULL,
|
|
20
24
|
last_modified INTEGER NOT NULL,
|
|
21
|
-
priority REAL NOT NULL DEFAULT 0.0
|
|
25
|
+
priority REAL NOT NULL DEFAULT 0.0,
|
|
26
|
+
PRIMARY KEY (pipeline, id)
|
|
22
27
|
);
|
|
23
|
-
CREATE INDEX IF NOT EXISTS idx_claim
|
|
24
|
-
CREATE INDEX IF NOT EXISTS idx_claim_pri ON messages (subqueue, claimed, priority, seq);
|
|
28
|
+
CREATE INDEX IF NOT EXISTS idx_claim ON messages (pipeline, subqueue, claimed, seq);
|
|
29
|
+
CREATE INDEX IF NOT EXISTS idx_claim_pri ON messages (pipeline, subqueue, claimed, priority, seq);
|
|
25
30
|
`;
|
|
26
|
-
function
|
|
31
|
+
function dbDir() {
|
|
27
32
|
const home = process.env.HOME;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
return home?.startsWith('/sessions')
|
|
34
|
+
? (0, node_path_1.join)(home, '.claude', 'qq')
|
|
35
|
+
: (0, node_path_1.join)(process.cwd(), '.claude', 'qq');
|
|
31
36
|
}
|
|
32
|
-
function openDb(
|
|
33
|
-
const dir =
|
|
37
|
+
function openDb() {
|
|
38
|
+
const dir = dbDir();
|
|
34
39
|
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
35
|
-
const db = new better_sqlite3_1.default((0, node_path_1.join)(dir,
|
|
40
|
+
const db = new better_sqlite3_1.default((0, node_path_1.join)(dir, 'qq.db'));
|
|
36
41
|
db.pragma('journal_mode = WAL');
|
|
37
42
|
db.pragma('busy_timeout = 5000');
|
|
43
|
+
db.pragma('foreign_keys = ON');
|
|
38
44
|
db.exec(DDL);
|
|
39
|
-
// Migration: add priority column to databases created before this version
|
|
40
|
-
try {
|
|
41
|
-
db.exec('ALTER TABLE messages ADD COLUMN priority REAL NOT NULL DEFAULT 0.0');
|
|
42
|
-
}
|
|
43
|
-
catch { /* already exists */ }
|
|
44
|
-
db.exec('CREATE INDEX IF NOT EXISTS idx_claim_pri ON messages (subqueue, claimed, priority, seq)');
|
|
45
45
|
return db;
|
|
46
46
|
}
|
|
47
47
|
function inTransaction(db, fn) {
|
package/dist/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":";;;;;AAgCA,wBASC;AAED,sCAEC;AA7CD,oEAAsC;AACtC,qCAAoC;AACpC,yCAAiC;AAEjC,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;CAmBX,CAAC;AAEF,SAAS,KAAK;IACZ,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B,OAAO,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC;QAClC,CAAC,CAAC,IAAA,gBAAI,EAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC;QAC7B,CAAC,CAAC,IAAA,gBAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,SAAgB,MAAM;IACpB,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC;IACpB,IAAA,mBAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjC,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC/B,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,aAAa,CAAI,EAAqB,EAAE,EAAW;IACjE,OAAO,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;AACxC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -79,16 +79,6 @@ program
|
|
|
79
79
|
fail(e instanceof Error ? e.message : String(e));
|
|
80
80
|
}
|
|
81
81
|
});
|
|
82
|
-
program
|
|
83
|
-
.command('list-pipelines')
|
|
84
|
-
.action(() => {
|
|
85
|
-
try {
|
|
86
|
-
out((0, commands_js_1.listPipelines)());
|
|
87
|
-
}
|
|
88
|
-
catch (e) {
|
|
89
|
-
fail(e instanceof Error ? e.message : String(e));
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
82
|
program
|
|
93
83
|
.command('delete-pipeline <pipeline>')
|
|
94
84
|
.action((pipeline) => {
|
|
@@ -155,7 +145,7 @@ addFilterOptions(program.command('batch-read <pipeline> [stage]'))
|
|
|
155
145
|
}
|
|
156
146
|
});
|
|
157
147
|
program
|
|
158
|
-
.command('stats
|
|
148
|
+
.command('stats [pipeline]')
|
|
159
149
|
.action((pipeline) => {
|
|
160
150
|
try {
|
|
161
151
|
out((0, commands_js_1.stats)(pipeline));
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAAA,yCAA0D;AAC1D,2DAA+C;AAC/C,qCAAuC;AACvC,yCAA0C;AAC1C,qCAA+B;AAC/B,+CAIuB;AAEvB,SAAS,GAAG,CAAC,IAAa;IACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAA,cAAI,EAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,IAAI,CAAC,OAAe;IAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,IAAI,CAAC,CAAC;IAC5C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,SAAS;IAChB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,GAAG,GAAG,IAAA,sBAAY,EAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,OAAO,GAAG,IAAI,IAAI,CAAC;AACrB,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9B,IAAI,KAAK,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,gCAAoB,CAAC,qBAAqB,CAAC,CAAC;IACpE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,KAAK,CAAC,CAAC,CAAC;QAAE,MAAM,IAAI,gCAAoB,CAAC,mBAAmB,CAAC,CAAC;IAClE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,cAAc,CAAC,IAA6B;IACnD,MAAM,CAAC,GAAkB,EAAE,CAAC;IAC5B,IAAI,IAAI,CAAC,SAAS,CAAC,KAAK,SAAS;QAAE,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC;IACvE,IAAI,IAAI,CAAC,KAAK,CAAC;QAAE,CAAC,CAAC,GAAG,GAAI,IAAI,CAAC,KAAK,CAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5D,IAAI,IAAI,CAAC,cAAc,CAAC;QAAE,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,CAAW,CAAC;IAC3E,IAAI,IAAI,CAAC,eAAe,CAAC;QAAE,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAW,CAAC;IAC9E,IAAI,IAAI,CAAC,eAAe,CAAC;QAAE,CAAC,CAAC,cAAc,GAAG,IAAI,CAAC,eAAe,CAAW,CAAC;IAC9E,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS;QAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAW,CAAC;IACnE,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,SAAS;QAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAW,CAAC;IACtE,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,gBAAgB,CAAC,GAAY;IACpC,OAAO,GAAG;SACP,MAAM,CAAC,iBAAiB,CAAC;SACzB,MAAM,CAAC,qBAAqB,CAAC;SAC7B,MAAM,CAAC,yBAAyB,EAAE,EAAE,EAAE,WAAW,CAAC;SAClD,MAAM,CAAC,0BAA0B,EAAE,EAAE,EAAE,WAAW,CAAC;SACnD,MAAM,CAAC,0BAA0B,EAAE,EAAE,EAAE,WAAW,CAAC;SACnD,MAAM,CAAC,aAAa,EAAE,EAAE,EAAE,WAAW,CAAC;SACtC,MAAM,CAAC,cAAc,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,oBAAoB,CAAC,GAAY;IACxC,OAAO,GAAG;SACP,MAAM,CAAC,qBAAqB,CAAC;SAC7B,MAAM,CAAC,yBAAyB,EAAE,EAAE,EAAE,WAAW,CAAC;SAClD,MAAM,CAAC,0BAA0B,EAAE,EAAE,EAAE,WAAW,CAAC;SACnD,MAAM,CAAC,0BAA0B,EAAE,EAAE,EAAE,WAAW,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAC9B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,gDAAgD,CAAC,CAAC;AAEjF,OAAO;KACJ,OAAO,CAAC,eAAe,CAAC;KACxB,MAAM,CAAC,eAAe,CAAC;KACvB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;IACf,IAAI,CAAC;QAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,IAAA,0BAAY,EAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IACnD,OAAO,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,4BAA4B,CAAC;KACrC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;IACnB,IAAI,CAAC;QAAC,IAAA,4BAAc,EAAC,QAAQ,CAAC,CAAC;IAAC,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,8BAA8B,CAAC;KACvC,MAAM,CAAC,gBAAgB,EAAE,wCAAwC,EAAE,aAAa,EAAE,GAAG,CAAC;KACtF,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;IACpC,IAAI,CAAC;QACH,MAAM,CAAC,GAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtF,GAAG,CAAC,EAAE,EAAE,EAAE,IAAA,kBAAI,EAAC,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QAAC,CAAC,YAAY,qBAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,0BAA0B,CAAC;KACnC,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,EAAE;IAC1B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAA,mBAAK,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,yBAAyB,CAAC;KAClC,MAAM,CAAC,kBAAkB,CAAC;KAC1B,MAAM,CAAC,WAAW,CAAC;KACnB,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,EAAE,aAAa,CAAC;KAC/D,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE;IAC7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,SAAS,EAAE,IAAI,SAAS,CAAC;QACzC,IAAA,qBAAO,EAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACxG,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IACpB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QAAC,CAAC,YAAY,qBAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;AAC3E,CAAC,CAAC,CAAC;AAEL,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;KAC/D,MAAM,CAAC,WAAW,EAAE,2BAA2B,CAAC;KAChD,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;IAChC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,OAAO,GAAG,KAAK,CAAC;QAC3D,GAAG,CAAC,IAAA,uBAAS,EAAC,QAAQ,EAAE,KAAK,IAAI,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;IACnB,IAAI,CAAC;QAAC,GAAG,CAAC,IAAA,mBAAK,EAAC,QAAQ,CAAC,CAAC,CAAC;IAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEL,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;KAChE,MAAM,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;IAChC,IAAI,CAAC;QAAC,GAAG,CAAC,EAAE,SAAS,EAAE,IAAA,qBAAO,EAAC,QAAQ,EAAE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IAC3E,OAAO,CAAC,EAAE,CAAC;QAAC,IAAI,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;AACjE,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,cAAc,CAAC;KACvB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;IACjB,wDAAwD;IACxD,MAAM,WAAW,GAAG,IAAA,gBAAI,EAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IACvE,MAAM,MAAM,GAAG,IAAA,8BAAS,EAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAA,mBAAO,EAAC,MAAM,CAAC,CAAC,EAAE;QAC5D,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE;KAC7C,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
package/package.json
CHANGED
package/src/commands.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { rmSync, readdirSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
1
|
import { randomBytes } from 'node:crypto';
|
|
4
2
|
import type Database from 'better-sqlite3';
|
|
5
|
-
import { openDb, inTransaction
|
|
3
|
+
import { openDb, inTransaction } from './db.js';
|
|
6
4
|
|
|
7
5
|
export * as yaml from 'js-yaml';
|
|
8
6
|
|
|
@@ -44,8 +42,8 @@ function toGlob(pattern: string): string {
|
|
|
44
42
|
return pattern.replace(/\*/g, '%').replace(/\?/g, '_');
|
|
45
43
|
}
|
|
46
44
|
|
|
47
|
-
function nextSeq(db: Database.Database): number {
|
|
48
|
-
const row = db.prepare('SELECT MAX(seq) as m FROM messages').get() as { m: number | null };
|
|
45
|
+
function nextSeq(db: Database.Database, pipeline: string): number {
|
|
46
|
+
const row = db.prepare('SELECT MAX(seq) as m FROM messages WHERE pipeline = ?').get(pipeline) as { m: number | null };
|
|
49
47
|
return (row.m ?? 0) + 1;
|
|
50
48
|
}
|
|
51
49
|
|
|
@@ -65,38 +63,37 @@ function rowToItem(row: Record<string, unknown>, includePayload: boolean): Item
|
|
|
65
63
|
|
|
66
64
|
// ── makePipeline ──────────────────────────────────────────────────────────────
|
|
67
65
|
|
|
68
|
-
export function makePipeline(
|
|
69
|
-
if (!
|
|
66
|
+
export function makePipeline(customName?: string): string {
|
|
67
|
+
if (!customName) {
|
|
70
68
|
const now = new Date();
|
|
71
69
|
const mm = String(now.getMonth() + 1).padStart(2, '0');
|
|
72
70
|
const dd = String(now.getDate()).padStart(2, '0');
|
|
73
|
-
|
|
71
|
+
customName = `${mm}${dd}_${randomBytes(3).toString('hex')}`;
|
|
74
72
|
}
|
|
75
|
-
const
|
|
76
|
-
db
|
|
77
|
-
return name;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// ── listPipelines ─────────────────────────────────────────────────────────────
|
|
81
|
-
|
|
82
|
-
export function listPipelines(): string[] {
|
|
83
|
-
const dir = dbRoot();
|
|
84
|
-
let entries: string[];
|
|
73
|
+
const name = customName;
|
|
74
|
+
const db = openDb();
|
|
85
75
|
try {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
76
|
+
inTransaction(db, () => {
|
|
77
|
+
const existing = db.prepare('SELECT id FROM pipelines WHERE id = ?').get(name);
|
|
78
|
+
if (existing) throw new QQError(`pipeline already exists: ${name}`);
|
|
79
|
+
db.prepare('INSERT INTO pipelines (id, created) VALUES (?, ?)').run(name, Date.now());
|
|
80
|
+
});
|
|
81
|
+
} finally {
|
|
82
|
+
db.close();
|
|
89
83
|
}
|
|
90
|
-
return
|
|
91
|
-
.filter(f => f.endsWith('.db'))
|
|
92
|
-
.map(f => f.slice(0, -3))
|
|
93
|
-
.sort();
|
|
84
|
+
return name;
|
|
94
85
|
}
|
|
95
86
|
|
|
87
|
+
|
|
96
88
|
// ── deletePipeline ────────────────────────────────────────────────────────────
|
|
97
89
|
|
|
98
90
|
export function deletePipeline(pipeline: string): void {
|
|
99
|
-
|
|
91
|
+
const db = openDb();
|
|
92
|
+
try {
|
|
93
|
+
db.prepare('DELETE FROM pipelines WHERE id = ?').run(pipeline);
|
|
94
|
+
} finally {
|
|
95
|
+
db.close();
|
|
96
|
+
}
|
|
100
97
|
}
|
|
101
98
|
|
|
102
99
|
// ── push ──────────────────────────────────────────────────────────────────────
|
|
@@ -107,17 +104,17 @@ export interface PushOptions {
|
|
|
107
104
|
}
|
|
108
105
|
|
|
109
106
|
export function push(pipeline: string, stage: string, id?: string, { payload, priority = 0.0 }: PushOptions = {}): string {
|
|
110
|
-
const db = openDb(
|
|
107
|
+
const db = openDb();
|
|
111
108
|
try {
|
|
112
109
|
return inTransaction(db, () => {
|
|
113
|
-
const seq = nextSeq(db);
|
|
110
|
+
const seq = nextSeq(db, pipeline);
|
|
114
111
|
const actualId = id ?? String(seq);
|
|
115
|
-
const existing = db.prepare('SELECT id FROM messages WHERE id = ?').get(actualId);
|
|
112
|
+
const existing = db.prepare('SELECT id FROM messages WHERE pipeline = ? AND id = ?').get(pipeline, actualId);
|
|
116
113
|
if (existing) throw new QQError(`duplicate id: ${actualId}`);
|
|
117
114
|
const now = Date.now();
|
|
118
115
|
db.prepare(
|
|
119
|
-
'INSERT INTO messages (id, subqueue, claimed, seq, payload, priority, created, last_modified) VALUES (?, ?, 0, ?, ?, ?, ?, ?)'
|
|
120
|
-
).run(actualId, stage, seq, payload ?? null, priority, now, now);
|
|
116
|
+
'INSERT INTO messages (pipeline, id, subqueue, claimed, seq, payload, priority, created, last_modified) VALUES (?, ?, ?, 0, ?, ?, ?, ?, ?)'
|
|
117
|
+
).run(pipeline, actualId, stage, seq, payload ?? null, priority, now, now);
|
|
121
118
|
return actualId;
|
|
122
119
|
});
|
|
123
120
|
} finally {
|
|
@@ -128,19 +125,19 @@ export function push(pipeline: string, stage: string, id?: string, { payload, pr
|
|
|
128
125
|
// ── claim ─────────────────────────────────────────────────────────────────────
|
|
129
126
|
|
|
130
127
|
export function claim(pipeline: string, stage: string): Item | null {
|
|
131
|
-
const db = openDb(
|
|
128
|
+
const db = openDb();
|
|
132
129
|
try {
|
|
133
130
|
return inTransaction(db, () => {
|
|
134
131
|
const row = db.prepare(
|
|
135
|
-
'SELECT * FROM messages WHERE subqueue LIKE ? AND claimed = 0 ORDER BY priority DESC, seq ASC LIMIT 1'
|
|
136
|
-
).get(toGlob(stage)) as Record<string, unknown> | undefined;
|
|
132
|
+
'SELECT * FROM messages WHERE pipeline = ? AND subqueue LIKE ? AND claimed = 0 ORDER BY priority DESC, seq ASC LIMIT 1'
|
|
133
|
+
).get(pipeline, toGlob(stage)) as Record<string, unknown> | undefined;
|
|
137
134
|
|
|
138
135
|
if (!row) return null;
|
|
139
136
|
|
|
140
137
|
const now = Date.now();
|
|
141
138
|
db.prepare(
|
|
142
|
-
'UPDATE messages SET claimed = 1, last_modified = ? WHERE id = ?'
|
|
143
|
-
).run(now, row.id as string);
|
|
139
|
+
'UPDATE messages SET claimed = 1, last_modified = ? WHERE pipeline = ? AND id = ?'
|
|
140
|
+
).run(now, pipeline, row.id as string);
|
|
144
141
|
|
|
145
142
|
return rowToItem({ ...row, claimed: 1 }, true);
|
|
146
143
|
});
|
|
@@ -159,14 +156,14 @@ export interface ReleaseOptions {
|
|
|
159
156
|
}
|
|
160
157
|
|
|
161
158
|
export function release(pipeline: string, id: string, { target, payload, replace, priority }: ReleaseOptions = {}): void {
|
|
162
|
-
const db = openDb(
|
|
159
|
+
const db = openDb();
|
|
163
160
|
try {
|
|
164
161
|
inTransaction(db, () => {
|
|
165
|
-
const row = db.prepare('SELECT * FROM messages WHERE id = ?').get(id) as Record<string, unknown> | undefined;
|
|
162
|
+
const row = db.prepare('SELECT * FROM messages WHERE pipeline = ? AND id = ?').get(pipeline, id) as Record<string, unknown> | undefined;
|
|
166
163
|
if (!row) throw new QQError(`item not found: ${id}`);
|
|
167
164
|
if (!row.claimed) throw new QQError(`only claimed items can be released: ${id}`);
|
|
168
165
|
|
|
169
|
-
const seq = nextSeq(db);
|
|
166
|
+
const seq = nextSeq(db, pipeline);
|
|
170
167
|
const now = Date.now();
|
|
171
168
|
const newStage = target ?? (row.subqueue as string);
|
|
172
169
|
const newPriority = priority ?? (row.priority as number) ?? 0.0;
|
|
@@ -181,8 +178,8 @@ export function release(pipeline: string, id: string, { target, payload, replace
|
|
|
181
178
|
}
|
|
182
179
|
|
|
183
180
|
db.prepare(
|
|
184
|
-
'UPDATE messages SET claimed = 0, seq = ?, subqueue = ?, payload = ?, priority = ?, last_modified = ? WHERE id = ?'
|
|
185
|
-
).run(seq, newStage, newPayload, newPriority, now, id);
|
|
181
|
+
'UPDATE messages SET claimed = 0, seq = ?, subqueue = ?, payload = ?, priority = ?, last_modified = ? WHERE pipeline = ? AND id = ?'
|
|
182
|
+
).run(seq, newStage, newPayload, newPriority, now, pipeline, id);
|
|
186
183
|
});
|
|
187
184
|
} finally {
|
|
188
185
|
db.close();
|
|
@@ -191,9 +188,9 @@ export function release(pipeline: string, id: string, { target, payload, replace
|
|
|
191
188
|
|
|
192
189
|
// ── shared filter builder ─────────────────────────────────────────────────────
|
|
193
190
|
|
|
194
|
-
function buildFilterConditions(stage: string, filters: FilterOptions): { conditions: string[]; params: (string | number | null)[] } {
|
|
195
|
-
const conditions: string[] = ['subqueue LIKE ?'];
|
|
196
|
-
const params: (string | number | null)[] = [toGlob(stage)];
|
|
191
|
+
function buildFilterConditions(pipeline: string, stage: string, filters: FilterOptions): { conditions: string[]; params: (string | number | null)[] } {
|
|
192
|
+
const conditions: string[] = ['pipeline = ?', 'subqueue LIKE ?'];
|
|
193
|
+
const params: (string | number | null)[] = [pipeline, toGlob(stage)];
|
|
197
194
|
|
|
198
195
|
if (filters.ids?.length) {
|
|
199
196
|
conditions.push(`id IN (${filters.ids.map(() => '?').join(', ')})`);
|
|
@@ -217,9 +214,9 @@ function buildFilterConditions(stage: string, filters: FilterOptions): { conditi
|
|
|
217
214
|
// ── batchRead ─────────────────────────────────────────────────────────────────
|
|
218
215
|
|
|
219
216
|
export function batchRead(pipeline: string, stage = '*', filters: FilterOptions = {}, includePayload = true): Item[] {
|
|
220
|
-
const db = openDb(
|
|
217
|
+
const db = openDb();
|
|
221
218
|
try {
|
|
222
|
-
const { conditions, params } = buildFilterConditions(stage, filters);
|
|
219
|
+
const { conditions, params } = buildFilterConditions(pipeline, stage, filters);
|
|
223
220
|
|
|
224
221
|
if (filters.claimed !== undefined) {
|
|
225
222
|
conditions.push('claimed = ?');
|
|
@@ -248,18 +245,19 @@ export function batchRead(pipeline: string, stage = '*', filters: FilterOptions
|
|
|
248
245
|
|
|
249
246
|
// ── stats ─────────────────────────────────────────────────────────────────────
|
|
250
247
|
|
|
251
|
-
export function stats(pipeline
|
|
252
|
-
const db = openDb(
|
|
248
|
+
export function stats(pipeline = '*'): Record<string, Record<string, { total: number; claimed: number }>> {
|
|
249
|
+
const db = openDb();
|
|
253
250
|
try {
|
|
254
251
|
const rows = db.prepare(
|
|
255
|
-
'SELECT subqueue, claimed, COUNT(*) as count FROM messages GROUP BY subqueue, claimed'
|
|
256
|
-
).all() as { subqueue: string; claimed: number; count: number }[];
|
|
252
|
+
'SELECT pipeline, subqueue, claimed, COUNT(*) as count FROM messages WHERE pipeline LIKE ? GROUP BY pipeline, subqueue, claimed'
|
|
253
|
+
).all(toGlob(pipeline)) as { pipeline: string; subqueue: string; claimed: number; count: number }[];
|
|
257
254
|
|
|
258
|
-
const result: Record<string, { total: number; claimed: number }
|
|
255
|
+
const result: Record<string, Record<string, { total: number; claimed: number }>> = {};
|
|
259
256
|
for (const row of rows) {
|
|
260
|
-
if (!result[row.
|
|
261
|
-
result[row.subqueue].total
|
|
262
|
-
|
|
257
|
+
if (!result[row.pipeline]) result[row.pipeline] = {};
|
|
258
|
+
if (!result[row.pipeline][row.subqueue]) result[row.pipeline][row.subqueue] = { total: 0, claimed: 0 };
|
|
259
|
+
result[row.pipeline][row.subqueue].total += row.count;
|
|
260
|
+
if (row.claimed) result[row.pipeline][row.subqueue].claimed += row.count;
|
|
263
261
|
}
|
|
264
262
|
return result;
|
|
265
263
|
} finally {
|
|
@@ -270,11 +268,11 @@ export function stats(pipeline: string): Record<string, { total: number; claimed
|
|
|
270
268
|
// ── unclaim ───────────────────────────────────────────────────────────────────
|
|
271
269
|
|
|
272
270
|
export function unclaim(pipeline: string, stage = '*', filters: FilterOptions = {}): number {
|
|
273
|
-
const db = openDb(
|
|
271
|
+
const db = openDb();
|
|
274
272
|
try {
|
|
275
273
|
return inTransaction(db, () => {
|
|
276
274
|
const now = Date.now();
|
|
277
|
-
const { conditions, params } = buildFilterConditions(stage, filters);
|
|
275
|
+
const { conditions, params } = buildFilterConditions(pipeline, stage, filters);
|
|
278
276
|
conditions.push('claimed = 1');
|
|
279
277
|
const sql = `UPDATE messages SET claimed = 0, last_modified = ? WHERE ${conditions.join(' AND ')}`;
|
|
280
278
|
return db.prepare(sql).run(now, ...params).changes;
|
package/src/db.ts
CHANGED
|
@@ -3,36 +3,41 @@ import { mkdirSync } from 'node:fs';
|
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
|
|
5
5
|
const DDL = `
|
|
6
|
+
CREATE TABLE IF NOT EXISTS pipelines (
|
|
7
|
+
id TEXT PRIMARY KEY,
|
|
8
|
+
created INTEGER NOT NULL
|
|
9
|
+
);
|
|
6
10
|
CREATE TABLE IF NOT EXISTS messages (
|
|
7
|
-
id TEXT
|
|
11
|
+
id TEXT NOT NULL,
|
|
12
|
+
pipeline TEXT NOT NULL REFERENCES pipelines(id) ON DELETE CASCADE,
|
|
8
13
|
subqueue TEXT NOT NULL,
|
|
9
14
|
claimed INTEGER NOT NULL DEFAULT 0,
|
|
10
15
|
seq INTEGER NOT NULL,
|
|
11
16
|
payload TEXT,
|
|
12
17
|
created INTEGER NOT NULL,
|
|
13
18
|
last_modified INTEGER NOT NULL,
|
|
14
|
-
priority REAL NOT NULL DEFAULT 0.0
|
|
19
|
+
priority REAL NOT NULL DEFAULT 0.0,
|
|
20
|
+
PRIMARY KEY (pipeline, id)
|
|
15
21
|
);
|
|
16
|
-
CREATE INDEX IF NOT EXISTS idx_claim
|
|
17
|
-
CREATE INDEX IF NOT EXISTS idx_claim_pri ON messages (subqueue, claimed, priority, seq);
|
|
22
|
+
CREATE INDEX IF NOT EXISTS idx_claim ON messages (pipeline, subqueue, claimed, seq);
|
|
23
|
+
CREATE INDEX IF NOT EXISTS idx_claim_pri ON messages (pipeline, subqueue, claimed, priority, seq);
|
|
18
24
|
`;
|
|
19
25
|
|
|
20
|
-
|
|
26
|
+
function dbDir(): string {
|
|
21
27
|
const home = process.env.HOME;
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
return home?.startsWith('/sessions')
|
|
29
|
+
? join(home, '.claude', 'qq')
|
|
30
|
+
: join(process.cwd(), '.claude', 'qq');
|
|
24
31
|
}
|
|
25
32
|
|
|
26
|
-
export function openDb(
|
|
27
|
-
const dir =
|
|
33
|
+
export function openDb(): Database.Database {
|
|
34
|
+
const dir = dbDir();
|
|
28
35
|
mkdirSync(dir, { recursive: true });
|
|
29
|
-
const db = new Database(join(dir,
|
|
36
|
+
const db = new Database(join(dir, 'qq.db'));
|
|
30
37
|
db.pragma('journal_mode = WAL');
|
|
31
38
|
db.pragma('busy_timeout = 5000');
|
|
39
|
+
db.pragma('foreign_keys = ON');
|
|
32
40
|
db.exec(DDL);
|
|
33
|
-
// Migration: add priority column to databases created before this version
|
|
34
|
-
try { db.exec('ALTER TABLE messages ADD COLUMN priority REAL NOT NULL DEFAULT 0.0'); } catch { /* already exists */ }
|
|
35
|
-
db.exec('CREATE INDEX IF NOT EXISTS idx_claim_pri ON messages (subqueue, claimed, priority, seq)');
|
|
36
41
|
return db;
|
|
37
42
|
}
|
|
38
43
|
|
package/src/index.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { readFileSync } from 'node:fs';
|
|
|
4
4
|
import { resolve, join } from 'node:path';
|
|
5
5
|
import { dump } from 'js-yaml';
|
|
6
6
|
import {
|
|
7
|
-
makePipeline,
|
|
7
|
+
makePipeline, deletePipeline, push, claim, release,
|
|
8
8
|
batchRead, stats, unclaim, QQError,
|
|
9
9
|
type FilterOptions, type PushOptions, type ReleaseOptions,
|
|
10
10
|
} from './commands.js';
|
|
@@ -78,13 +78,6 @@ program
|
|
|
78
78
|
catch (e) { fail(e instanceof Error ? e.message : String(e)); }
|
|
79
79
|
});
|
|
80
80
|
|
|
81
|
-
program
|
|
82
|
-
.command('list-pipelines')
|
|
83
|
-
.action(() => {
|
|
84
|
-
try { out(listPipelines()); }
|
|
85
|
-
catch (e) { fail(e instanceof Error ? e.message : String(e)); }
|
|
86
|
-
});
|
|
87
|
-
|
|
88
81
|
program
|
|
89
82
|
.command('delete-pipeline <pipeline>')
|
|
90
83
|
.action((pipeline) => {
|
|
@@ -141,7 +134,7 @@ addFilterOptions(program.command('batch-read <pipeline> [stage]'))
|
|
|
141
134
|
});
|
|
142
135
|
|
|
143
136
|
program
|
|
144
|
-
.command('stats
|
|
137
|
+
.command('stats [pipeline]')
|
|
145
138
|
.action((pipeline) => {
|
|
146
139
|
try { out(stats(pipeline)); }
|
|
147
140
|
catch (e) { fail(e instanceof Error ? e.message : String(e)); }
|