@quantod/qq 0.1.7 → 0.1.9
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 +11 -11
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +42 -58
- package/dist/commands.js.map +1 -1
- package/dist/db.d.ts +1 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +2 -2
- package/dist/db.js.map +1 -1
- package/dist/index.js +30 -32
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/commands.ts +41 -56
- package/src/db.ts +2 -2
- package/src/index.ts +31 -33
package/dist/commands.d.ts
CHANGED
|
@@ -2,9 +2,9 @@ export * as yaml from 'js-yaml';
|
|
|
2
2
|
export declare class QQError extends Error {
|
|
3
3
|
constructor(message: string);
|
|
4
4
|
}
|
|
5
|
-
export interface
|
|
5
|
+
export interface Item {
|
|
6
6
|
id: string;
|
|
7
|
-
|
|
7
|
+
stage: string;
|
|
8
8
|
claimed: boolean;
|
|
9
9
|
claimed_by: string | null;
|
|
10
10
|
seq: number;
|
|
@@ -23,26 +23,26 @@ export interface FilterOptions {
|
|
|
23
23
|
limit?: number;
|
|
24
24
|
offset?: number;
|
|
25
25
|
}
|
|
26
|
-
export declare function
|
|
27
|
-
export declare function
|
|
28
|
-
export declare function
|
|
26
|
+
export declare function makePipeline(name?: string): string;
|
|
27
|
+
export declare function listPipelines(): string[];
|
|
28
|
+
export declare function deletePipeline(pipeline: string): void;
|
|
29
29
|
export interface PushOptions {
|
|
30
30
|
payload?: string;
|
|
31
31
|
priority?: number;
|
|
32
32
|
}
|
|
33
|
-
export declare function push(
|
|
34
|
-
export declare function claim(
|
|
33
|
+
export declare function push(pipeline: string, stage: string, id?: string, { payload, priority }?: PushOptions): string;
|
|
34
|
+
export declare function claim(pipeline: string, stage: string, agentId?: string): Item | null;
|
|
35
35
|
export interface ReleaseOptions {
|
|
36
36
|
target?: string;
|
|
37
37
|
payload?: string;
|
|
38
38
|
replace?: boolean;
|
|
39
39
|
priority?: number;
|
|
40
40
|
}
|
|
41
|
-
export declare function release(
|
|
42
|
-
export declare function batchRead(
|
|
43
|
-
export declare function stats(
|
|
41
|
+
export declare function release(pipeline: string, id: string, { target, payload, replace, priority }?: ReleaseOptions): void;
|
|
42
|
+
export declare function batchRead(pipeline: string, stage: string, filters?: FilterOptions, includePayload?: boolean): Item[];
|
|
43
|
+
export declare function stats(pipeline: string): Record<string, {
|
|
44
44
|
total: number;
|
|
45
45
|
claimed: number;
|
|
46
46
|
}>;
|
|
47
|
-
export declare function reap(
|
|
47
|
+
export declare function reap(pipeline: string, agentId?: string): number;
|
|
48
48
|
//# 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":"AAMA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAIhC,qBAAa,OAAQ,SAAQ,KAAK;gBACpB,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"AAMA,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,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,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,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,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;AAgCD,wBAAgB,YAAY,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAUlD;AAID,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAYxC;AAID,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAErD;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,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAoBpF;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;AAyDD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,EAAE,cAAc,UAAO,GAAG,IAAI,EAAE,CAErH;AAID,wBAAgB,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAiB1F;AAID,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAiB/D"}
|
package/dist/commands.js
CHANGED
|
@@ -34,9 +34,9 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.QQError = exports.yaml = void 0;
|
|
37
|
-
exports.
|
|
38
|
-
exports.
|
|
39
|
-
exports.
|
|
37
|
+
exports.makePipeline = makePipeline;
|
|
38
|
+
exports.listPipelines = listPipelines;
|
|
39
|
+
exports.deletePipeline = deletePipeline;
|
|
40
40
|
exports.push = push;
|
|
41
41
|
exports.claim = claim;
|
|
42
42
|
exports.release = release;
|
|
@@ -57,12 +57,6 @@ class QQError extends Error {
|
|
|
57
57
|
}
|
|
58
58
|
exports.QQError = QQError;
|
|
59
59
|
// ── internal helpers ───────────────────────────────────────────────────────────
|
|
60
|
-
function parsePath(path) {
|
|
61
|
-
const slash = path.indexOf('/');
|
|
62
|
-
if (slash === -1)
|
|
63
|
-
return { queue: path, subqueue: undefined };
|
|
64
|
-
return { queue: path.slice(0, slash), subqueue: path.slice(slash + 1) };
|
|
65
|
-
}
|
|
66
60
|
function toGlob(pattern) {
|
|
67
61
|
return pattern.replace(/\*/g, '%').replace(/\?/g, '_');
|
|
68
62
|
}
|
|
@@ -70,10 +64,10 @@ function nextSeq(db) {
|
|
|
70
64
|
const row = db.prepare('SELECT MAX(seq) as m FROM messages').get();
|
|
71
65
|
return (row.m ?? 0) + 1;
|
|
72
66
|
}
|
|
73
|
-
function
|
|
67
|
+
function rowToItem(row, includePayload) {
|
|
74
68
|
const msg = {
|
|
75
69
|
id: row.id,
|
|
76
|
-
|
|
70
|
+
stage: row.subqueue,
|
|
77
71
|
claimed: Boolean(row.claimed),
|
|
78
72
|
claimed_by: row.claimed_by ?? null,
|
|
79
73
|
seq: row.seq,
|
|
@@ -85,8 +79,8 @@ function rowToMessage(row, includePayload) {
|
|
|
85
79
|
msg.payload = row.payload ?? null;
|
|
86
80
|
return msg;
|
|
87
81
|
}
|
|
88
|
-
// ──
|
|
89
|
-
function
|
|
82
|
+
// ── makePipeline ──────────────────────────────────────────────────────────────
|
|
83
|
+
function makePipeline(name) {
|
|
90
84
|
if (!name) {
|
|
91
85
|
const now = new Date();
|
|
92
86
|
const mm = String(now.getMonth() + 1).padStart(2, '0');
|
|
@@ -97,8 +91,8 @@ function makeQueue(name) {
|
|
|
97
91
|
db.close();
|
|
98
92
|
return name;
|
|
99
93
|
}
|
|
100
|
-
// ──
|
|
101
|
-
function
|
|
94
|
+
// ── listPipelines ─────────────────────────────────────────────────────────────
|
|
95
|
+
function listPipelines() {
|
|
102
96
|
const dir = (0, db_js_1.dbRoot)();
|
|
103
97
|
let entries;
|
|
104
98
|
try {
|
|
@@ -112,23 +106,22 @@ function listQueues() {
|
|
|
112
106
|
.map(f => f.slice(0, -3))
|
|
113
107
|
.sort();
|
|
114
108
|
}
|
|
115
|
-
// ──
|
|
116
|
-
function
|
|
117
|
-
(0, node_fs_1.rmSync)((0, node_path_1.join)((0, db_js_1.dbRoot)(), `${
|
|
109
|
+
// ── deletePipeline ────────────────────────────────────────────────────────────
|
|
110
|
+
function deletePipeline(pipeline) {
|
|
111
|
+
(0, node_fs_1.rmSync)((0, node_path_1.join)((0, db_js_1.dbRoot)(), `${pipeline}.db`), { force: true });
|
|
118
112
|
}
|
|
119
|
-
function push(
|
|
120
|
-
const
|
|
121
|
-
if (!subqueue)
|
|
122
|
-
throw new QQError('path must include a subqueue: queue/subqueue');
|
|
123
|
-
const db = (0, db_js_1.openDb)(queue);
|
|
113
|
+
function push(pipeline, stage, id, { payload, priority = 0.0 } = {}) {
|
|
114
|
+
const db = (0, db_js_1.openDb)(pipeline);
|
|
124
115
|
try {
|
|
125
|
-
(0, db_js_1.inTransaction)(db, () => {
|
|
126
|
-
const existing = db.prepare('SELECT id FROM messages WHERE id = ?').get(id);
|
|
127
|
-
if (existing)
|
|
128
|
-
throw new QQError(`duplicate id: ${id}`);
|
|
116
|
+
return (0, db_js_1.inTransaction)(db, () => {
|
|
129
117
|
const seq = nextSeq(db);
|
|
118
|
+
const actualId = id ?? String(seq);
|
|
119
|
+
const existing = db.prepare('SELECT id FROM messages WHERE id = ?').get(actualId);
|
|
120
|
+
if (existing)
|
|
121
|
+
throw new QQError(`duplicate id: ${actualId}`);
|
|
130
122
|
const now = Date.now();
|
|
131
|
-
db.prepare('INSERT INTO messages (id, subqueue, claimed, seq, payload, priority, created, last_modified) VALUES (?, ?, 0, ?, ?, ?, ?, ?)').run(
|
|
123
|
+
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);
|
|
124
|
+
return actualId;
|
|
132
125
|
});
|
|
133
126
|
}
|
|
134
127
|
finally {
|
|
@@ -136,38 +129,34 @@ function push(path, id, { payload, priority = 0.0 } = {}) {
|
|
|
136
129
|
}
|
|
137
130
|
}
|
|
138
131
|
// ── claim ─────────────────────────────────────────────────────────────────────
|
|
139
|
-
function claim(
|
|
140
|
-
const
|
|
141
|
-
if (!subqueue)
|
|
142
|
-
throw new QQError('path must include a subqueue: queue/subqueue');
|
|
143
|
-
const db = (0, db_js_1.openDb)(queue);
|
|
132
|
+
function claim(pipeline, stage, agentId) {
|
|
133
|
+
const db = (0, db_js_1.openDb)(pipeline);
|
|
144
134
|
try {
|
|
145
135
|
return (0, db_js_1.inTransaction)(db, () => {
|
|
146
|
-
const
|
|
147
|
-
const row = db.prepare('SELECT * FROM messages WHERE subqueue LIKE ? AND claimed = 0 ORDER BY priority DESC, seq ASC LIMIT 1').get(pattern);
|
|
136
|
+
const row = db.prepare('SELECT * FROM messages WHERE subqueue LIKE ? AND claimed = 0 ORDER BY priority DESC, seq ASC LIMIT 1').get(toGlob(stage));
|
|
148
137
|
if (!row)
|
|
149
138
|
return null;
|
|
150
139
|
const now = Date.now();
|
|
151
140
|
db.prepare('UPDATE messages SET claimed = 1, claimed_by = ?, last_modified = ? WHERE id = ?').run(agentId ?? null, now, row.id);
|
|
152
|
-
return
|
|
141
|
+
return rowToItem({ ...row, claimed: 1, claimed_by: agentId ?? null }, true);
|
|
153
142
|
});
|
|
154
143
|
}
|
|
155
144
|
finally {
|
|
156
145
|
db.close();
|
|
157
146
|
}
|
|
158
147
|
}
|
|
159
|
-
function release(
|
|
160
|
-
const db = (0, db_js_1.openDb)(
|
|
148
|
+
function release(pipeline, id, { target, payload, replace, priority } = {}) {
|
|
149
|
+
const db = (0, db_js_1.openDb)(pipeline);
|
|
161
150
|
try {
|
|
162
151
|
(0, db_js_1.inTransaction)(db, () => {
|
|
163
152
|
const row = db.prepare('SELECT * FROM messages WHERE id = ?').get(id);
|
|
164
153
|
if (!row)
|
|
165
|
-
throw new QQError(`
|
|
154
|
+
throw new QQError(`item not found: ${id}`);
|
|
166
155
|
if (!row.claimed)
|
|
167
|
-
throw new QQError(`only claimed
|
|
156
|
+
throw new QQError(`only claimed items can be released: ${id}`);
|
|
168
157
|
const seq = nextSeq(db);
|
|
169
158
|
const now = Date.now();
|
|
170
|
-
const
|
|
159
|
+
const newStage = target ?? row.subqueue;
|
|
171
160
|
const newPriority = priority ?? row.priority ?? 0.0;
|
|
172
161
|
let newPayload;
|
|
173
162
|
if (payload !== undefined) {
|
|
@@ -178,7 +167,7 @@ function release(queue, id, { target, payload, replace, priority } = {}) {
|
|
|
178
167
|
else {
|
|
179
168
|
newPayload = row.payload ?? null;
|
|
180
169
|
}
|
|
181
|
-
db.prepare('UPDATE messages SET claimed = 0, claimed_by = NULL, seq = ?, subqueue = ?, payload = ?, priority = ?, last_modified = ? WHERE id = ?').run(seq,
|
|
170
|
+
db.prepare('UPDATE messages SET claimed = 0, claimed_by = NULL, seq = ?, subqueue = ?, payload = ?, priority = ?, last_modified = ? WHERE id = ?').run(seq, newStage, newPayload, newPriority, now, id);
|
|
182
171
|
});
|
|
183
172
|
}
|
|
184
173
|
finally {
|
|
@@ -186,16 +175,11 @@ function release(queue, id, { target, payload, replace, priority } = {}) {
|
|
|
186
175
|
}
|
|
187
176
|
}
|
|
188
177
|
// ── list / batchRead ──────────────────────────────────────────────────────────
|
|
189
|
-
function
|
|
190
|
-
const
|
|
191
|
-
const db = (0, db_js_1.openDb)(queue);
|
|
178
|
+
function queryItems(pipeline, stage, filters, includePayload) {
|
|
179
|
+
const db = (0, db_js_1.openDb)(pipeline);
|
|
192
180
|
try {
|
|
193
|
-
const conditions = [];
|
|
194
|
-
const params = [];
|
|
195
|
-
if (subqueue) {
|
|
196
|
-
conditions.push('subqueue LIKE ?');
|
|
197
|
-
params.push(toGlob(subqueue));
|
|
198
|
-
}
|
|
181
|
+
const conditions = ['subqueue LIKE ?'];
|
|
182
|
+
const params = [toGlob(stage)];
|
|
199
183
|
if (filters.claimed !== undefined) {
|
|
200
184
|
conditions.push('claimed = ?');
|
|
201
185
|
params.push(filters.claimed ? 1 : 0);
|
|
@@ -236,18 +220,18 @@ function queryMessages(path, filters, includePayload) {
|
|
|
236
220
|
params.push(filters.offset);
|
|
237
221
|
}
|
|
238
222
|
const rows = db.prepare(sql).all(...params);
|
|
239
|
-
return rows.map(r =>
|
|
223
|
+
return rows.map(r => rowToItem(r, includePayload));
|
|
240
224
|
}
|
|
241
225
|
finally {
|
|
242
226
|
db.close();
|
|
243
227
|
}
|
|
244
228
|
}
|
|
245
|
-
function batchRead(
|
|
246
|
-
return
|
|
229
|
+
function batchRead(pipeline, stage, filters = {}, includePayload = true) {
|
|
230
|
+
return queryItems(pipeline, stage, filters, includePayload);
|
|
247
231
|
}
|
|
248
232
|
// ── stats ─────────────────────────────────────────────────────────────────────
|
|
249
|
-
function stats(
|
|
250
|
-
const db = (0, db_js_1.openDb)(
|
|
233
|
+
function stats(pipeline) {
|
|
234
|
+
const db = (0, db_js_1.openDb)(pipeline);
|
|
251
235
|
try {
|
|
252
236
|
const rows = db.prepare('SELECT subqueue, claimed, COUNT(*) as count FROM messages GROUP BY subqueue, claimed').all();
|
|
253
237
|
const result = {};
|
|
@@ -265,8 +249,8 @@ function stats(queue) {
|
|
|
265
249
|
}
|
|
266
250
|
}
|
|
267
251
|
// ── reap ──────────────────────────────────────────────────────────────────────
|
|
268
|
-
function reap(
|
|
269
|
-
const db = (0, db_js_1.openDb)(
|
|
252
|
+
function reap(pipeline, agentId) {
|
|
253
|
+
const db = (0, db_js_1.openDb)(pipeline);
|
|
270
254
|
try {
|
|
271
255
|
return (0, db_js_1.inTransaction)(db, () => {
|
|
272
256
|
const now = Date.now();
|
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,5 @@
|
|
|
1
1
|
import Database from 'better-sqlite3';
|
|
2
2
|
export declare function dbRoot(): string;
|
|
3
|
-
export declare function openDb(
|
|
3
|
+
export declare function openDb(name: string): Database.Database;
|
|
4
4
|
export declare function inTransaction<T>(db: Database.Database, fn: () => T): T;
|
|
5
5
|
//# 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;AAoBtC,wBAAgB,MAAM,IAAI,MAAM,CAI/B;AAED,wBAAgB,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAoBtC,wBAAgB,MAAM,IAAI,MAAM,CAI/B;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAWtD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEtE"}
|
package/dist/db.js
CHANGED
|
@@ -30,10 +30,10 @@ function dbRoot() {
|
|
|
30
30
|
return (0, node_path_1.join)(home, '.claude', 'qq');
|
|
31
31
|
return (0, node_path_1.join)(process.cwd(), '.claude', 'qq');
|
|
32
32
|
}
|
|
33
|
-
function openDb(
|
|
33
|
+
function openDb(name) {
|
|
34
34
|
const dir = dbRoot();
|
|
35
35
|
(0, node_fs_1.mkdirSync)(dir, { recursive: true });
|
|
36
|
-
const db = new better_sqlite3_1.default((0, node_path_1.join)(dir, `${
|
|
36
|
+
const db = new better_sqlite3_1.default((0, node_path_1.join)(dir, `${name}.db`));
|
|
37
37
|
db.pragma('journal_mode = WAL');
|
|
38
38
|
db.pragma('busy_timeout = 5000');
|
|
39
39
|
db.exec(DDL);
|
package/dist/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":";;;;;AAoBA,wBAIC;AAED,wBAWC;AAED,sCAEC;AAzCD,oEAAsC;AACtC,qCAAoC;AACpC,yCAAiC;AAEjC,MAAM,GAAG,GAAG;;;;;;;;;;;;;;CAcX,CAAC;AAEF,SAAgB,MAAM;IACpB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B,IAAI,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAA,gBAAI,EAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACtE,OAAO,IAAA,gBAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,SAAgB,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":";;;;;AAoBA,wBAIC;AAED,wBAWC;AAED,sCAEC;AAzCD,oEAAsC;AACtC,qCAAoC;AACpC,yCAAiC;AAEjC,MAAM,GAAG,GAAG;;;;;;;;;;;;;;CAcX,CAAC;AAEF,SAAgB,MAAM;IACpB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B,IAAI,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,IAAA,gBAAI,EAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IACtE,OAAO,IAAA,gBAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,SAAgB,MAAM,CAAC,IAAY;IACjC,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,IAAA,mBAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,IAAI,wBAAQ,CAAC,IAAA,gBAAI,EAAC,GAAG,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC;IACjD,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;IAChC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACjC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,0EAA0E;IAC1E,IAAI,CAAC;QAAC,EAAE,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACrH,EAAE,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC;IACnG,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
|
@@ -63,106 +63,104 @@ function addFilterOptions(cmd) {
|
|
|
63
63
|
.option('--offset <n>', '', parseIntArg);
|
|
64
64
|
}
|
|
65
65
|
const program = new commander_1.Command();
|
|
66
|
-
program.name('qq').description('Persistent
|
|
66
|
+
program.name('qq').description('Persistent pipeline for Claude agent workflows');
|
|
67
67
|
program
|
|
68
|
-
.command('make-
|
|
68
|
+
.command('make-pipeline')
|
|
69
69
|
.option('--name <name>')
|
|
70
70
|
.action((opts) => {
|
|
71
71
|
try {
|
|
72
|
-
out({
|
|
72
|
+
out({ pipeline: (0, commands_js_1.makePipeline)(opts.name) });
|
|
73
73
|
}
|
|
74
74
|
catch (e) {
|
|
75
75
|
fail(e instanceof Error ? e.message : String(e));
|
|
76
76
|
}
|
|
77
77
|
});
|
|
78
78
|
program
|
|
79
|
-
.command('list-
|
|
79
|
+
.command('list-pipelines')
|
|
80
80
|
.action(() => {
|
|
81
81
|
try {
|
|
82
|
-
out((0, commands_js_1.
|
|
82
|
+
out((0, commands_js_1.listPipelines)());
|
|
83
83
|
}
|
|
84
84
|
catch (e) {
|
|
85
85
|
fail(e instanceof Error ? e.message : String(e));
|
|
86
86
|
}
|
|
87
87
|
});
|
|
88
88
|
program
|
|
89
|
-
.command('delete-
|
|
90
|
-
.action((
|
|
89
|
+
.command('delete-pipeline <pipeline>')
|
|
90
|
+
.action((pipeline) => {
|
|
91
91
|
try {
|
|
92
|
-
(0, commands_js_1.
|
|
92
|
+
(0, commands_js_1.deletePipeline)(pipeline);
|
|
93
93
|
}
|
|
94
94
|
catch (e) {
|
|
95
95
|
fail(e instanceof Error ? e.message : String(e));
|
|
96
96
|
}
|
|
97
97
|
});
|
|
98
98
|
program
|
|
99
|
-
.command('push <
|
|
100
|
-
.option('--priority <n>', '
|
|
101
|
-
.action((
|
|
99
|
+
.command('push <pipeline> <stage> [id]')
|
|
100
|
+
.option('--priority <n>', 'item priority (higher = claimed first)', parseFloatArg, 0.0)
|
|
101
|
+
.action((pipeline, stage, id, opts) => {
|
|
102
102
|
try {
|
|
103
103
|
const o = { payload: readStdin() ?? undefined, priority: opts.priority };
|
|
104
|
-
(0, commands_js_1.push)(
|
|
105
|
-
out({ ok: true });
|
|
104
|
+
out({ id: (0, commands_js_1.push)(pipeline, stage, id, o) });
|
|
106
105
|
}
|
|
107
106
|
catch (e) {
|
|
108
107
|
e instanceof commands_js_1.QQError ? fail(e.message) : fail(String(e));
|
|
109
108
|
}
|
|
110
109
|
});
|
|
111
110
|
program
|
|
112
|
-
.command('claim <
|
|
111
|
+
.command('claim <pipeline> <stage>')
|
|
113
112
|
.option('--agent-id <id>')
|
|
114
|
-
.action((
|
|
113
|
+
.action((pipeline, stage, opts) => {
|
|
115
114
|
try {
|
|
116
|
-
out((0, commands_js_1.claim)(
|
|
115
|
+
out((0, commands_js_1.claim)(pipeline, stage, opts.agentId) ?? { empty: true });
|
|
117
116
|
}
|
|
118
117
|
catch (e) {
|
|
119
118
|
fail(e instanceof Error ? e.message : String(e));
|
|
120
119
|
}
|
|
121
120
|
});
|
|
122
121
|
program
|
|
123
|
-
.command('release <
|
|
124
|
-
.option('--target <
|
|
125
|
-
.option('--payload', 'read payload from stdin')
|
|
122
|
+
.command('release <pipeline> <id>')
|
|
123
|
+
.option('--target <stage>')
|
|
126
124
|
.option('--replace')
|
|
127
|
-
.option('--priority <n>', 'update
|
|
128
|
-
.action((
|
|
125
|
+
.option('--priority <n>', 'update item priority', parseFloatArg)
|
|
126
|
+
.action((pipeline, id, opts) => {
|
|
129
127
|
try {
|
|
130
|
-
const payload =
|
|
131
|
-
(0, commands_js_1.release)(
|
|
128
|
+
const payload = readStdin() ?? undefined;
|
|
129
|
+
(0, commands_js_1.release)(pipeline, id, { target: opts.target, payload, replace: opts.replace, priority: opts.priority });
|
|
132
130
|
out({ ok: true });
|
|
133
131
|
}
|
|
134
132
|
catch (e) {
|
|
135
133
|
e instanceof commands_js_1.QQError ? fail(e.message) : fail(String(e));
|
|
136
134
|
}
|
|
137
135
|
});
|
|
138
|
-
addFilterOptions(program.command('batch-read <
|
|
136
|
+
addFilterOptions(program.command('batch-read <pipeline> <stage>'))
|
|
139
137
|
.option('--payload', 'include payload in output')
|
|
140
|
-
.action((
|
|
138
|
+
.action((pipeline, stage, opts) => {
|
|
141
139
|
try {
|
|
142
140
|
const filters = collectFilters(opts);
|
|
143
141
|
if (filters.claimed === undefined)
|
|
144
142
|
filters.claimed = false;
|
|
145
|
-
out((0, commands_js_1.batchRead)(
|
|
143
|
+
out((0, commands_js_1.batchRead)(pipeline, stage, filters, opts.payload ?? false));
|
|
146
144
|
}
|
|
147
145
|
catch (e) {
|
|
148
146
|
fail(e instanceof Error ? e.message : String(e));
|
|
149
147
|
}
|
|
150
148
|
});
|
|
151
149
|
program
|
|
152
|
-
.command('stats <
|
|
153
|
-
.action((
|
|
150
|
+
.command('stats <pipeline>')
|
|
151
|
+
.action((pipeline) => {
|
|
154
152
|
try {
|
|
155
|
-
out((0, commands_js_1.stats)(
|
|
153
|
+
out((0, commands_js_1.stats)(pipeline));
|
|
156
154
|
}
|
|
157
155
|
catch (e) {
|
|
158
156
|
fail(e instanceof Error ? e.message : String(e));
|
|
159
157
|
}
|
|
160
158
|
});
|
|
161
159
|
program
|
|
162
|
-
.command('reap <
|
|
163
|
-
.action((
|
|
160
|
+
.command('reap <pipeline> [agent-id]')
|
|
161
|
+
.action((pipeline, agentId) => {
|
|
164
162
|
try {
|
|
165
|
-
out({ reaped: (0, commands_js_1.reap)(
|
|
163
|
+
out({ reaped: (0, commands_js_1.reap)(pipeline, agentId) });
|
|
166
164
|
}
|
|
167
165
|
catch (e) {
|
|
168
166
|
fail(e instanceof Error ? e.message : String(e));
|
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":"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"}
|
package/package.json
CHANGED
package/src/commands.ts
CHANGED
|
@@ -15,9 +15,9 @@ export class QQError extends Error {
|
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export interface
|
|
18
|
+
export interface Item {
|
|
19
19
|
id: string;
|
|
20
|
-
|
|
20
|
+
stage: string;
|
|
21
21
|
claimed: boolean;
|
|
22
22
|
claimed_by: string | null;
|
|
23
23
|
seq: number;
|
|
@@ -41,11 +41,6 @@ export interface FilterOptions {
|
|
|
41
41
|
|
|
42
42
|
// ── internal helpers ───────────────────────────────────────────────────────────
|
|
43
43
|
|
|
44
|
-
function parsePath(path: string): { queue: string; subqueue: string | undefined } {
|
|
45
|
-
const slash = path.indexOf('/');
|
|
46
|
-
if (slash === -1) return { queue: path, subqueue: undefined };
|
|
47
|
-
return { queue: path.slice(0, slash), subqueue: path.slice(slash + 1) };
|
|
48
|
-
}
|
|
49
44
|
|
|
50
45
|
function toGlob(pattern: string): string {
|
|
51
46
|
return pattern.replace(/\*/g, '%').replace(/\?/g, '_');
|
|
@@ -56,10 +51,10 @@ function nextSeq(db: Database.Database): number {
|
|
|
56
51
|
return (row.m ?? 0) + 1;
|
|
57
52
|
}
|
|
58
53
|
|
|
59
|
-
function
|
|
60
|
-
const msg:
|
|
54
|
+
function rowToItem(row: Record<string, unknown>, includePayload: boolean): Item {
|
|
55
|
+
const msg: Item = {
|
|
61
56
|
id: row.id as string,
|
|
62
|
-
|
|
57
|
+
stage: row.subqueue as string,
|
|
63
58
|
claimed: Boolean(row.claimed),
|
|
64
59
|
claimed_by: (row.claimed_by as string | null) ?? null,
|
|
65
60
|
seq: row.seq as number,
|
|
@@ -71,9 +66,9 @@ function rowToMessage(row: Record<string, unknown>, includePayload: boolean): Me
|
|
|
71
66
|
return msg;
|
|
72
67
|
}
|
|
73
68
|
|
|
74
|
-
// ──
|
|
69
|
+
// ── makePipeline ──────────────────────────────────────────────────────────────
|
|
75
70
|
|
|
76
|
-
export function
|
|
71
|
+
export function makePipeline(name?: string): string {
|
|
77
72
|
if (!name) {
|
|
78
73
|
const now = new Date();
|
|
79
74
|
const mm = String(now.getMonth() + 1).padStart(2, '0');
|
|
@@ -85,9 +80,9 @@ export function makeQueue(name?: string): string {
|
|
|
85
80
|
return name;
|
|
86
81
|
}
|
|
87
82
|
|
|
88
|
-
// ──
|
|
83
|
+
// ── listPipelines ─────────────────────────────────────────────────────────────
|
|
89
84
|
|
|
90
|
-
export function
|
|
85
|
+
export function listPipelines(): string[] {
|
|
91
86
|
const dir = dbRoot();
|
|
92
87
|
let entries: string[];
|
|
93
88
|
try {
|
|
@@ -101,10 +96,10 @@ export function listQueues(): string[] {
|
|
|
101
96
|
.sort();
|
|
102
97
|
}
|
|
103
98
|
|
|
104
|
-
// ──
|
|
99
|
+
// ── deletePipeline ────────────────────────────────────────────────────────────
|
|
105
100
|
|
|
106
|
-
export function
|
|
107
|
-
rmSync(join(dbRoot(), `${
|
|
101
|
+
export function deletePipeline(pipeline: string): void {
|
|
102
|
+
rmSync(join(dbRoot(), `${pipeline}.db`), { force: true });
|
|
108
103
|
}
|
|
109
104
|
|
|
110
105
|
// ── push ──────────────────────────────────────────────────────────────────────
|
|
@@ -114,20 +109,19 @@ export interface PushOptions {
|
|
|
114
109
|
priority?: number;
|
|
115
110
|
}
|
|
116
111
|
|
|
117
|
-
export function push(
|
|
118
|
-
const
|
|
119
|
-
if (!subqueue) throw new QQError('path must include a subqueue: queue/subqueue');
|
|
120
|
-
|
|
121
|
-
const db = openDb(queue);
|
|
112
|
+
export function push(pipeline: string, stage: string, id?: string, { payload, priority = 0.0 }: PushOptions = {}): string {
|
|
113
|
+
const db = openDb(pipeline);
|
|
122
114
|
try {
|
|
123
|
-
inTransaction(db, () => {
|
|
124
|
-
const existing = db.prepare('SELECT id FROM messages WHERE id = ?').get(id);
|
|
125
|
-
if (existing) throw new QQError(`duplicate id: ${id}`);
|
|
115
|
+
return inTransaction(db, () => {
|
|
126
116
|
const seq = nextSeq(db);
|
|
117
|
+
const actualId = id ?? String(seq);
|
|
118
|
+
const existing = db.prepare('SELECT id FROM messages WHERE id = ?').get(actualId);
|
|
119
|
+
if (existing) throw new QQError(`duplicate id: ${actualId}`);
|
|
127
120
|
const now = Date.now();
|
|
128
121
|
db.prepare(
|
|
129
122
|
'INSERT INTO messages (id, subqueue, claimed, seq, payload, priority, created, last_modified) VALUES (?, ?, 0, ?, ?, ?, ?, ?)'
|
|
130
|
-
).run(
|
|
123
|
+
).run(actualId, stage, seq, payload ?? null, priority, now, now);
|
|
124
|
+
return actualId;
|
|
131
125
|
});
|
|
132
126
|
} finally {
|
|
133
127
|
db.close();
|
|
@@ -136,17 +130,13 @@ export function push(path: string, id: string, { payload, priority = 0.0 }: Push
|
|
|
136
130
|
|
|
137
131
|
// ── claim ─────────────────────────────────────────────────────────────────────
|
|
138
132
|
|
|
139
|
-
export function claim(
|
|
140
|
-
const
|
|
141
|
-
if (!subqueue) throw new QQError('path must include a subqueue: queue/subqueue');
|
|
142
|
-
|
|
143
|
-
const db = openDb(queue);
|
|
133
|
+
export function claim(pipeline: string, stage: string, agentId?: string): Item | null {
|
|
134
|
+
const db = openDb(pipeline);
|
|
144
135
|
try {
|
|
145
136
|
return inTransaction(db, () => {
|
|
146
|
-
const pattern = toGlob(subqueue);
|
|
147
137
|
const row = db.prepare(
|
|
148
138
|
'SELECT * FROM messages WHERE subqueue LIKE ? AND claimed = 0 ORDER BY priority DESC, seq ASC LIMIT 1'
|
|
149
|
-
).get(
|
|
139
|
+
).get(toGlob(stage)) as Record<string, unknown> | undefined;
|
|
150
140
|
|
|
151
141
|
if (!row) return null;
|
|
152
142
|
|
|
@@ -155,7 +145,7 @@ export function claim(path: string, agentId?: string): Message | null {
|
|
|
155
145
|
'UPDATE messages SET claimed = 1, claimed_by = ?, last_modified = ? WHERE id = ?'
|
|
156
146
|
).run(agentId ?? null, now, row.id as string);
|
|
157
147
|
|
|
158
|
-
return
|
|
148
|
+
return rowToItem({ ...row, claimed: 1, claimed_by: agentId ?? null }, true);
|
|
159
149
|
});
|
|
160
150
|
} finally {
|
|
161
151
|
db.close();
|
|
@@ -171,17 +161,17 @@ export interface ReleaseOptions {
|
|
|
171
161
|
priority?: number;
|
|
172
162
|
}
|
|
173
163
|
|
|
174
|
-
export function release(
|
|
175
|
-
const db = openDb(
|
|
164
|
+
export function release(pipeline: string, id: string, { target, payload, replace, priority }: ReleaseOptions = {}): void {
|
|
165
|
+
const db = openDb(pipeline);
|
|
176
166
|
try {
|
|
177
167
|
inTransaction(db, () => {
|
|
178
168
|
const row = db.prepare('SELECT * FROM messages WHERE id = ?').get(id) as Record<string, unknown> | undefined;
|
|
179
|
-
if (!row) throw new QQError(`
|
|
180
|
-
if (!row.claimed) throw new QQError(`only claimed
|
|
169
|
+
if (!row) throw new QQError(`item not found: ${id}`);
|
|
170
|
+
if (!row.claimed) throw new QQError(`only claimed items can be released: ${id}`);
|
|
181
171
|
|
|
182
172
|
const seq = nextSeq(db);
|
|
183
173
|
const now = Date.now();
|
|
184
|
-
const
|
|
174
|
+
const newStage = target ?? (row.subqueue as string);
|
|
185
175
|
const newPriority = priority ?? (row.priority as number) ?? 0.0;
|
|
186
176
|
|
|
187
177
|
let newPayload: string | null;
|
|
@@ -195,7 +185,7 @@ export function release(queue: string, id: string, { target, payload, replace, p
|
|
|
195
185
|
|
|
196
186
|
db.prepare(
|
|
197
187
|
'UPDATE messages SET claimed = 0, claimed_by = NULL, seq = ?, subqueue = ?, payload = ?, priority = ?, last_modified = ? WHERE id = ?'
|
|
198
|
-
).run(seq,
|
|
188
|
+
).run(seq, newStage, newPayload, newPriority, now, id);
|
|
199
189
|
});
|
|
200
190
|
} finally {
|
|
201
191
|
db.close();
|
|
@@ -204,17 +194,12 @@ export function release(queue: string, id: string, { target, payload, replace, p
|
|
|
204
194
|
|
|
205
195
|
// ── list / batchRead ──────────────────────────────────────────────────────────
|
|
206
196
|
|
|
207
|
-
function
|
|
208
|
-
const
|
|
209
|
-
const db = openDb(queue);
|
|
197
|
+
function queryItems(pipeline: string, stage: string, filters: FilterOptions, includePayload: boolean): Item[] {
|
|
198
|
+
const db = openDb(pipeline);
|
|
210
199
|
try {
|
|
211
|
-
const conditions: string[] = [];
|
|
212
|
-
const params: (string | number | null)[] = [];
|
|
200
|
+
const conditions: string[] = ['subqueue LIKE ?'];
|
|
201
|
+
const params: (string | number | null)[] = [toGlob(stage)];
|
|
213
202
|
|
|
214
|
-
if (subqueue) {
|
|
215
|
-
conditions.push('subqueue LIKE ?');
|
|
216
|
-
params.push(toGlob(subqueue));
|
|
217
|
-
}
|
|
218
203
|
if (filters.claimed !== undefined) {
|
|
219
204
|
conditions.push('claimed = ?');
|
|
220
205
|
params.push(filters.claimed ? 1 : 0);
|
|
@@ -256,20 +241,20 @@ function queryMessages(path: string, filters: FilterOptions, includePayload: boo
|
|
|
256
241
|
}
|
|
257
242
|
|
|
258
243
|
const rows = db.prepare(sql).all(...params) as Record<string, unknown>[];
|
|
259
|
-
return rows.map(r =>
|
|
244
|
+
return rows.map(r => rowToItem(r, includePayload));
|
|
260
245
|
} finally {
|
|
261
246
|
db.close();
|
|
262
247
|
}
|
|
263
248
|
}
|
|
264
249
|
|
|
265
|
-
export function batchRead(
|
|
266
|
-
return
|
|
250
|
+
export function batchRead(pipeline: string, stage: string, filters: FilterOptions = {}, includePayload = true): Item[] {
|
|
251
|
+
return queryItems(pipeline, stage, filters, includePayload);
|
|
267
252
|
}
|
|
268
253
|
|
|
269
254
|
// ── stats ─────────────────────────────────────────────────────────────────────
|
|
270
255
|
|
|
271
|
-
export function stats(
|
|
272
|
-
const db = openDb(
|
|
256
|
+
export function stats(pipeline: string): Record<string, { total: number; claimed: number }> {
|
|
257
|
+
const db = openDb(pipeline);
|
|
273
258
|
try {
|
|
274
259
|
const rows = db.prepare(
|
|
275
260
|
'SELECT subqueue, claimed, COUNT(*) as count FROM messages GROUP BY subqueue, claimed'
|
|
@@ -289,8 +274,8 @@ export function stats(queue: string): Record<string, { total: number; claimed: n
|
|
|
289
274
|
|
|
290
275
|
// ── reap ──────────────────────────────────────────────────────────────────────
|
|
291
276
|
|
|
292
|
-
export function reap(
|
|
293
|
-
const db = openDb(
|
|
277
|
+
export function reap(pipeline: string, agentId?: string): number {
|
|
278
|
+
const db = openDb(pipeline);
|
|
294
279
|
try {
|
|
295
280
|
return inTransaction(db, () => {
|
|
296
281
|
const now = Date.now();
|
package/src/db.ts
CHANGED
|
@@ -24,10 +24,10 @@ export function dbRoot(): string {
|
|
|
24
24
|
return join(process.cwd(), '.claude', 'qq');
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
export function openDb(
|
|
27
|
+
export function openDb(name: string): Database.Database {
|
|
28
28
|
const dir = dbRoot();
|
|
29
29
|
mkdirSync(dir, { recursive: true });
|
|
30
|
-
const db = new Database(join(dir, `${
|
|
30
|
+
const db = new Database(join(dir, `${name}.db`));
|
|
31
31
|
db.pragma('journal_mode = WAL');
|
|
32
32
|
db.pragma('busy_timeout = 5000');
|
|
33
33
|
db.exec(DDL);
|
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
|
-
|
|
7
|
+
makePipeline, listPipelines, deletePipeline, push, claim, release,
|
|
8
8
|
batchRead, stats, reap, QQError,
|
|
9
9
|
type FilterOptions, type PushOptions, type ReleaseOptions,
|
|
10
10
|
} from './commands.js';
|
|
@@ -62,85 +62,83 @@ function addFilterOptions(cmd: Command): Command {
|
|
|
62
62
|
}
|
|
63
63
|
|
|
64
64
|
const program = new Command();
|
|
65
|
-
program.name('qq').description('Persistent
|
|
65
|
+
program.name('qq').description('Persistent pipeline for Claude agent workflows');
|
|
66
66
|
|
|
67
67
|
program
|
|
68
|
-
.command('make-
|
|
68
|
+
.command('make-pipeline')
|
|
69
69
|
.option('--name <name>')
|
|
70
70
|
.action((opts) => {
|
|
71
|
-
try { out({
|
|
71
|
+
try { out({ pipeline: makePipeline(opts.name) }); }
|
|
72
72
|
catch (e) { fail(e instanceof Error ? e.message : String(e)); }
|
|
73
73
|
});
|
|
74
74
|
|
|
75
75
|
program
|
|
76
|
-
.command('list-
|
|
76
|
+
.command('list-pipelines')
|
|
77
77
|
.action(() => {
|
|
78
|
-
try { out(
|
|
78
|
+
try { out(listPipelines()); }
|
|
79
79
|
catch (e) { fail(e instanceof Error ? e.message : String(e)); }
|
|
80
80
|
});
|
|
81
81
|
|
|
82
82
|
program
|
|
83
|
-
.command('delete-
|
|
84
|
-
.action((
|
|
85
|
-
try {
|
|
83
|
+
.command('delete-pipeline <pipeline>')
|
|
84
|
+
.action((pipeline) => {
|
|
85
|
+
try { deletePipeline(pipeline); }
|
|
86
86
|
catch (e) { fail(e instanceof Error ? e.message : String(e)); }
|
|
87
87
|
});
|
|
88
88
|
|
|
89
89
|
program
|
|
90
|
-
.command('push <
|
|
91
|
-
.option('--priority <n>', '
|
|
92
|
-
.action((
|
|
90
|
+
.command('push <pipeline> <stage> [id]')
|
|
91
|
+
.option('--priority <n>', 'item priority (higher = claimed first)', parseFloatArg, 0.0)
|
|
92
|
+
.action((pipeline, stage, id, opts) => {
|
|
93
93
|
try {
|
|
94
94
|
const o: PushOptions = { payload: readStdin() ?? undefined, priority: opts.priority };
|
|
95
|
-
push(
|
|
96
|
-
out({ ok: true });
|
|
95
|
+
out({ id: push(pipeline, stage, id, o) });
|
|
97
96
|
} catch (e) { e instanceof QQError ? fail(e.message) : fail(String(e)); }
|
|
98
97
|
});
|
|
99
98
|
|
|
100
99
|
program
|
|
101
|
-
.command('claim <
|
|
100
|
+
.command('claim <pipeline> <stage>')
|
|
102
101
|
.option('--agent-id <id>')
|
|
103
|
-
.action((
|
|
104
|
-
try { out(claim(
|
|
102
|
+
.action((pipeline, stage, opts) => {
|
|
103
|
+
try { out(claim(pipeline, stage, opts.agentId) ?? { empty: true }); }
|
|
105
104
|
catch (e) { fail(e instanceof Error ? e.message : String(e)); }
|
|
106
105
|
});
|
|
107
106
|
|
|
108
107
|
program
|
|
109
|
-
.command('release <
|
|
110
|
-
.option('--target <
|
|
111
|
-
.option('--payload', 'read payload from stdin')
|
|
108
|
+
.command('release <pipeline> <id>')
|
|
109
|
+
.option('--target <stage>')
|
|
112
110
|
.option('--replace')
|
|
113
|
-
.option('--priority <n>', 'update
|
|
114
|
-
.action((
|
|
111
|
+
.option('--priority <n>', 'update item priority', parseFloatArg)
|
|
112
|
+
.action((pipeline, id, opts) => {
|
|
115
113
|
try {
|
|
116
|
-
const payload =
|
|
117
|
-
release(
|
|
114
|
+
const payload = readStdin() ?? undefined;
|
|
115
|
+
release(pipeline, id, { target: opts.target, payload, replace: opts.replace, priority: opts.priority });
|
|
118
116
|
out({ ok: true });
|
|
119
117
|
} catch (e) { e instanceof QQError ? fail(e.message) : fail(String(e)); }
|
|
120
118
|
});
|
|
121
119
|
|
|
122
|
-
addFilterOptions(program.command('batch-read <
|
|
120
|
+
addFilterOptions(program.command('batch-read <pipeline> <stage>'))
|
|
123
121
|
.option('--payload', 'include payload in output')
|
|
124
|
-
.action((
|
|
122
|
+
.action((pipeline, stage, opts) => {
|
|
125
123
|
try {
|
|
126
124
|
const filters = collectFilters(opts);
|
|
127
125
|
if (filters.claimed === undefined) filters.claimed = false;
|
|
128
|
-
out(batchRead(
|
|
126
|
+
out(batchRead(pipeline, stage, filters, opts.payload ?? false));
|
|
129
127
|
}
|
|
130
128
|
catch (e) { fail(e instanceof Error ? e.message : String(e)); }
|
|
131
129
|
});
|
|
132
130
|
|
|
133
131
|
program
|
|
134
|
-
.command('stats <
|
|
135
|
-
.action((
|
|
136
|
-
try { out(stats(
|
|
132
|
+
.command('stats <pipeline>')
|
|
133
|
+
.action((pipeline) => {
|
|
134
|
+
try { out(stats(pipeline)); }
|
|
137
135
|
catch (e) { fail(e instanceof Error ? e.message : String(e)); }
|
|
138
136
|
});
|
|
139
137
|
|
|
140
138
|
program
|
|
141
|
-
.command('reap <
|
|
142
|
-
.action((
|
|
143
|
-
try { out({ reaped: reap(
|
|
139
|
+
.command('reap <pipeline> [agent-id]')
|
|
140
|
+
.action((pipeline, agentId) => {
|
|
141
|
+
try { out({ reaped: reap(pipeline, agentId) }); }
|
|
144
142
|
catch (e) { fail(e instanceof Error ? e.message : String(e)); }
|
|
145
143
|
});
|
|
146
144
|
|