@quantod/qq 0.1.4 → 0.1.6
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 +12 -8
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +23 -22
- package/dist/commands.js.map +1 -1
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +9 -1
- package/dist/db.js.map +1 -1
- package/dist/index.js +15 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/commands.ts +38 -27
- package/src/db.ts +6 -1
- package/src/index.ts +19 -9
package/dist/commands.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export interface Message {
|
|
|
8
8
|
claimed: boolean;
|
|
9
9
|
claimed_by: string | null;
|
|
10
10
|
seq: number;
|
|
11
|
+
priority: number;
|
|
11
12
|
created: number;
|
|
12
13
|
last_modified: number;
|
|
13
14
|
payload?: string | null;
|
|
@@ -22,19 +23,22 @@ export interface FilterOptions {
|
|
|
22
23
|
limit?: number;
|
|
23
24
|
offset?: number;
|
|
24
25
|
}
|
|
26
|
+
export declare function makeQueue(name?: string): string;
|
|
27
|
+
export declare function listQueues(): string[];
|
|
28
|
+
export declare function deleteQueue(queue: string): void;
|
|
29
|
+
export interface PushOptions {
|
|
30
|
+
payload?: string;
|
|
31
|
+
priority?: number;
|
|
32
|
+
}
|
|
33
|
+
export declare function push(path: string, id: string, { payload, priority }?: PushOptions): void;
|
|
34
|
+
export declare function claim(path: string, agentId?: string): Message | null;
|
|
25
35
|
export interface ReleaseOptions {
|
|
26
36
|
target?: string;
|
|
27
37
|
payload?: string;
|
|
28
38
|
replace?: boolean;
|
|
39
|
+
priority?: number;
|
|
29
40
|
}
|
|
30
|
-
export declare function
|
|
31
|
-
export declare function listQueues(): string[];
|
|
32
|
-
export declare function deleteQueue(queue: string): void;
|
|
33
|
-
export declare function push(path: string, id: string, payload?: string): void;
|
|
34
|
-
export declare function claim(path: string, options?: {
|
|
35
|
-
agentId?: string;
|
|
36
|
-
}): Message | null;
|
|
37
|
-
export declare function release(queue: string, id: string, options?: ReleaseOptions): void;
|
|
41
|
+
export declare function release(queue: string, id: string, { target, payload, replace, priority }?: ReleaseOptions): void;
|
|
38
42
|
export declare function batchRead(path: string, filters?: FilterOptions, includePayload?: boolean): Message[];
|
|
39
43
|
export declare function stats(queue: string): Record<string, {
|
|
40
44
|
total: number;
|
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,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,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;
|
|
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,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,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;AAqCD,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAU/C;AAID,wBAAgB,UAAU,IAAI,MAAM,EAAE,CAYrC;AAID,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE/C;AAID,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,QAAc,EAAE,GAAE,WAAgB,GAAG,IAAI,CAkBlG;AAID,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAwBpE;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,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAE,cAAmB,GAAG,IAAI,CA6BpH;AA8DD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,EAAE,cAAc,UAAO,GAAG,OAAO,EAAE,CAErG;AAID,wBAAgB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBvF;AAID,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAiB5D"}
|
package/dist/commands.js
CHANGED
|
@@ -77,6 +77,7 @@ function rowToMessage(row, includePayload) {
|
|
|
77
77
|
claimed: Boolean(row.claimed),
|
|
78
78
|
claimed_by: row.claimed_by ?? null,
|
|
79
79
|
seq: row.seq,
|
|
80
|
+
priority: row.priority ?? 0.0,
|
|
80
81
|
created: row.created,
|
|
81
82
|
last_modified: row.last_modified,
|
|
82
83
|
};
|
|
@@ -85,12 +86,13 @@ function rowToMessage(row, includePayload) {
|
|
|
85
86
|
return msg;
|
|
86
87
|
}
|
|
87
88
|
// ── makeQueue ─────────────────────────────────────────────────────────────────
|
|
88
|
-
function makeQueue(
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
89
|
+
function makeQueue(name) {
|
|
90
|
+
if (!name) {
|
|
91
|
+
const now = new Date();
|
|
92
|
+
const mm = String(now.getMonth() + 1).padStart(2, '0');
|
|
93
|
+
const dd = String(now.getDate()).padStart(2, '0');
|
|
94
|
+
name = `${mm}${dd}_${(0, node_crypto_1.randomBytes)(3).toString('hex')}`;
|
|
95
|
+
}
|
|
94
96
|
const db = (0, db_js_1.openDb)(name);
|
|
95
97
|
db.close();
|
|
96
98
|
return name;
|
|
@@ -114,8 +116,7 @@ function listQueues() {
|
|
|
114
116
|
function deleteQueue(queue) {
|
|
115
117
|
(0, node_fs_1.rmSync)((0, node_path_1.join)((0, db_js_1.dbRoot)(), `${queue}.db`), { force: true });
|
|
116
118
|
}
|
|
117
|
-
|
|
118
|
-
function push(path, id, payload) {
|
|
119
|
+
function push(path, id, { payload, priority = 0.0 } = {}) {
|
|
119
120
|
const { queue, subqueue } = parsePath(path);
|
|
120
121
|
if (!subqueue)
|
|
121
122
|
throw new QQError('path must include a subqueue: queue/subqueue');
|
|
@@ -127,7 +128,7 @@ function push(path, id, payload) {
|
|
|
127
128
|
throw new QQError(`duplicate id: ${id}`);
|
|
128
129
|
const seq = nextSeq(db);
|
|
129
130
|
const now = Date.now();
|
|
130
|
-
db.prepare('INSERT INTO messages (id, subqueue, claimed, seq, payload, created, last_modified) VALUES (?, ?, 0, ?, ?, ?, ?)').run(id, subqueue, seq, payload ?? null, now, now);
|
|
131
|
+
db.prepare('INSERT INTO messages (id, subqueue, claimed, seq, payload, priority, created, last_modified) VALUES (?, ?, 0, ?, ?, ?, ?, ?)').run(id, subqueue, seq, payload ?? null, priority, now, now);
|
|
131
132
|
});
|
|
132
133
|
}
|
|
133
134
|
finally {
|
|
@@ -135,7 +136,7 @@ function push(path, id, payload) {
|
|
|
135
136
|
}
|
|
136
137
|
}
|
|
137
138
|
// ── claim ─────────────────────────────────────────────────────────────────────
|
|
138
|
-
function claim(path,
|
|
139
|
+
function claim(path, agentId) {
|
|
139
140
|
const { queue, subqueue } = parsePath(path);
|
|
140
141
|
if (!subqueue)
|
|
141
142
|
throw new QQError('path must include a subqueue: queue/subqueue');
|
|
@@ -143,20 +144,19 @@ function claim(path, options = {}) {
|
|
|
143
144
|
try {
|
|
144
145
|
return (0, db_js_1.inTransaction)(db, () => {
|
|
145
146
|
const pattern = toGlob(subqueue);
|
|
146
|
-
const row = db.prepare('SELECT * FROM messages WHERE subqueue LIKE ? AND claimed = 0 ORDER BY seq ASC LIMIT 1').get(pattern);
|
|
147
|
+
const row = db.prepare('SELECT * FROM messages WHERE subqueue LIKE ? AND claimed = 0 ORDER BY priority DESC, seq ASC LIMIT 1').get(pattern);
|
|
147
148
|
if (!row)
|
|
148
149
|
return null;
|
|
149
150
|
const now = Date.now();
|
|
150
|
-
db.prepare('UPDATE messages SET claimed = 1, claimed_by = ?, last_modified = ? WHERE id = ?').run(
|
|
151
|
-
return rowToMessage({ ...row, claimed: 1, claimed_by:
|
|
151
|
+
db.prepare('UPDATE messages SET claimed = 1, claimed_by = ?, last_modified = ? WHERE id = ?').run(agentId ?? null, now, row.id);
|
|
152
|
+
return rowToMessage({ ...row, claimed: 1, claimed_by: agentId ?? null }, true);
|
|
152
153
|
});
|
|
153
154
|
}
|
|
154
155
|
finally {
|
|
155
156
|
db.close();
|
|
156
157
|
}
|
|
157
158
|
}
|
|
158
|
-
|
|
159
|
-
function release(queue, id, options = {}) {
|
|
159
|
+
function release(queue, id, { target, payload, replace, priority } = {}) {
|
|
160
160
|
const db = (0, db_js_1.openDb)(queue);
|
|
161
161
|
try {
|
|
162
162
|
(0, db_js_1.inTransaction)(db, () => {
|
|
@@ -164,20 +164,21 @@ function release(queue, id, options = {}) {
|
|
|
164
164
|
if (!row)
|
|
165
165
|
throw new QQError(`message not found: ${id}`);
|
|
166
166
|
if (!row.claimed)
|
|
167
|
-
throw new QQError(`
|
|
167
|
+
throw new QQError(`only claimed messages can be released: ${id}`);
|
|
168
168
|
const seq = nextSeq(db);
|
|
169
169
|
const now = Date.now();
|
|
170
|
-
const newSubqueue =
|
|
170
|
+
const newSubqueue = target ?? row.subqueue;
|
|
171
|
+
const newPriority = priority ?? row.priority ?? 0.0;
|
|
171
172
|
let newPayload;
|
|
172
|
-
if (
|
|
173
|
-
newPayload =
|
|
174
|
-
?
|
|
175
|
-
: [row.payload,
|
|
173
|
+
if (payload !== undefined) {
|
|
174
|
+
newPayload = replace
|
|
175
|
+
? payload
|
|
176
|
+
: [row.payload, payload].filter(Boolean).join('\n');
|
|
176
177
|
}
|
|
177
178
|
else {
|
|
178
179
|
newPayload = row.payload ?? null;
|
|
179
180
|
}
|
|
180
|
-
db.prepare('UPDATE messages SET claimed = 0, claimed_by = NULL, seq = ?, subqueue = ?, payload = ?, last_modified = ? WHERE id = ?').run(seq, newSubqueue, newPayload, now, id);
|
|
181
|
+
db.prepare('UPDATE messages SET claimed = 0, claimed_by = NULL, seq = ?, subqueue = ?, payload = ?, priority = ?, last_modified = ? WHERE id = ?').run(seq, newSubqueue, newPayload, newPriority, now, id);
|
|
181
182
|
});
|
|
182
183
|
}
|
|
183
184
|
finally {
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2EA,8BAUC;AAID,gCAYC;AAID,kCAEC;AASD,oBAkBC;AAID,sBAwBC;AAWD,0BA6BC;AA8DD,8BAEC;AAID,sBAiBC;AAID,oBAiBC;AApTD,qCAA8C;AAC9C,yCAAiC;AACjC,6CAA0C;AAE1C,mCAAwD;AAExD,gDAAgC;AAEhC,kFAAkF;AAElF,MAAa,OAAQ,SAAQ,KAAK;IAChC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;IACxB,CAAC;CACF;AALD,0BAKC;AA0BD,kFAAkF;AAElF,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC9D,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,SAAS,MAAM,CAAC,OAAe;IAC7B,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,OAAO,CAAC,EAAqB;IACpC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,GAAG,EAA0B,CAAC;IAC3F,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,GAA4B,EAAE,cAAuB;IACzE,MAAM,GAAG,GAAY;QACnB,EAAE,EAAE,GAAG,CAAC,EAAY;QACpB,QAAQ,EAAE,GAAG,CAAC,QAAkB;QAChC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QAC7B,UAAU,EAAG,GAAG,CAAC,UAA4B,IAAI,IAAI;QACrD,GAAG,EAAE,GAAG,CAAC,GAAa;QACtB,QAAQ,EAAG,GAAG,CAAC,QAAmB,IAAI,GAAG;QACzC,OAAO,EAAE,GAAG,CAAC,OAAiB;QAC9B,aAAa,EAAE,GAAG,CAAC,aAAuB;KAC3C,CAAC;IACF,IAAI,cAAc;QAAE,GAAG,CAAC,OAAO,GAAI,GAAG,CAAC,OAAyB,IAAI,IAAI,CAAC;IACzE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AAEjF,SAAgB,SAAS,CAAC,IAAa;IACrC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAClD,IAAI,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,IAAA,yBAAW,EAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,MAAM,EAAE,GAAG,IAAA,cAAM,EAAC,IAAI,CAAC,CAAC;IACxB,EAAE,CAAC,KAAK,EAAE,CAAC;IACX,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AAEjF,SAAgB,UAAU;IACxB,MAAM,GAAG,GAAG,IAAA,cAAM,GAAE,CAAC;IACrB,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,IAAA,qBAAW,EAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SACxB,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,iFAAiF;AAEjF,SAAgB,WAAW,CAAC,KAAa;IACvC,IAAA,gBAAM,EAAC,IAAA,gBAAI,EAAC,IAAA,cAAM,GAAE,EAAE,GAAG,KAAK,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACzD,CAAC;AASD,SAAgB,IAAI,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,OAAO,EAAE,QAAQ,GAAG,GAAG,KAAkB,EAAE;IAC1F,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,OAAO,CAAC,8CAA8C,CAAC,CAAC;IAEjF,MAAM,EAAE,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IACzB,IAAI,CAAC;QACH,IAAA,qBAAa,EAAC,EAAE,EAAE,GAAG,EAAE;YACrB,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5E,IAAI,QAAQ;gBAAE,MAAM,IAAI,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,EAAE,CAAC,OAAO,CACR,8HAA8H,CAC/H,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,IAAI,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAgB,KAAK,CAAC,IAAY,EAAE,OAAgB;IAClD,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,OAAO,CAAC,8CAA8C,CAAC,CAAC;IAEjF,MAAM,EAAE,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,IAAA,qBAAa,EAAC,EAAE,EAAE,GAAG,EAAE;YAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,sGAAsG,CACvG,CAAC,GAAG,CAAC,OAAO,CAAwC,CAAC;YAEtD,IAAI,CAAC,GAAG;gBAAE,OAAO,IAAI,CAAC;YAEtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,EAAE,CAAC,OAAO,CACR,iFAAiF,CAClF,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,EAAY,CAAC,CAAC;YAE9C,OAAO,YAAY,CAAC,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAWD,SAAgB,OAAO,CAAC,KAAa,EAAE,EAAU,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,KAAqB,EAAE;IAC5G,MAAM,EAAE,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IACzB,IAAI,CAAC;QACH,IAAA,qBAAa,EAAC,EAAE,EAAE,GAAG,EAAE;YACrB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAwC,CAAC;YAC7G,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,OAAO,CAAC,sBAAsB,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI,CAAC,GAAG,CAAC,OAAO;gBAAE,MAAM,IAAI,OAAO,CAAC,0CAA0C,EAAE,EAAE,CAAC,CAAC;YAEpF,MAAM,GAAG,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC;YACxB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,MAAM,IAAK,GAAG,CAAC,QAAmB,CAAC;YACvD,MAAM,WAAW,GAAG,QAAQ,IAAK,GAAG,CAAC,QAAmB,IAAI,GAAG,CAAC;YAEhE,IAAI,UAAyB,CAAC;YAC9B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,UAAU,GAAG,OAAO;oBAClB,CAAC,CAAC,OAAO;oBACT,CAAC,CAAC,CAAC,GAAG,CAAC,OAAwB,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzE,CAAC;iBAAM,CAAC;gBACN,UAAU,GAAI,GAAG,CAAC,OAAyB,IAAI,IAAI,CAAC;YACtD,CAAC;YAED,EAAE,CAAC,OAAO,CACR,sIAAsI,CACvI,CAAC,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAS,aAAa,CAAC,IAAY,EAAE,OAAsB,EAAE,cAAuB;IAClF,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,EAAE,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,MAAM,GAA+B,EAAE,CAAC;QAE9C,IAAI,QAAQ,EAAE,CAAC;YACb,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACrC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACpE,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QACD,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACxC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACzC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACtC,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACzC,UAAU,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,GAAG,GAAG,wBAAwB,CAAC;QACnC,IAAI,UAAU,CAAC,MAAM;YAAE,GAAG,IAAI,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnE,GAAG,IAAI,mBAAmB,CAAC;QAE3B,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAChC,GAAG,IAAI,UAAU,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;aAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACxC,GAAG,IAAI,WAAW,CAAC;QACrB,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,GAAG,IAAI,WAAW,CAAC;YACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAA8B,CAAC;QACzE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC;IACxD,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,SAAgB,SAAS,CAAC,IAAY,EAAE,UAAyB,EAAE,EAAE,cAAc,GAAG,IAAI;IACxF,OAAO,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;AACtD,CAAC;AAED,iFAAiF;AAEjF,SAAgB,KAAK,CAAC,KAAa;IACjC,MAAM,EAAE,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,sFAAsF,CACvF,CAAC,GAAG,EAA4D,CAAC;QAElE,MAAM,MAAM,GAAuD,EAAE,CAAC;QACtE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;YAC3E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC;YACxC,IAAI,GAAG,CAAC,OAAO;gBAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC;QAC7D,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,SAAgB,IAAI,CAAC,KAAa,EAAE,OAAgB;IAClD,MAAM,EAAE,GAAG,IAAA,cAAM,EAAC,KAAK,CAAC,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,IAAA,qBAAa,EAAC,EAAE,EAAE,GAAG,EAAE;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,OAAO;gBACpB,CAAC,CAAC,EAAE,CAAC,OAAO,CACR,4GAA4G,CAC7G,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC;gBACrB,CAAC,CAAC,EAAE,CAAC,OAAO,CACR,yFAAyF,CAC1F,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACf,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
|
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;AAoBtC,wBAAgB,MAAM,IAAI,MAAM,CAI/B;AAED,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAW3D;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAEtE"}
|
package/dist/db.js
CHANGED
|
@@ -18,9 +18,11 @@ CREATE TABLE IF NOT EXISTS messages (
|
|
|
18
18
|
payload TEXT,
|
|
19
19
|
claimed_by TEXT,
|
|
20
20
|
created INTEGER NOT NULL,
|
|
21
|
-
last_modified INTEGER NOT NULL
|
|
21
|
+
last_modified INTEGER NOT NULL,
|
|
22
|
+
priority REAL NOT NULL DEFAULT 0.0
|
|
22
23
|
);
|
|
23
24
|
CREATE INDEX IF NOT EXISTS idx_claim ON messages (subqueue, claimed, seq);
|
|
25
|
+
CREATE INDEX IF NOT EXISTS idx_claim_pri ON messages (subqueue, claimed, priority, seq);
|
|
24
26
|
`;
|
|
25
27
|
function dbRoot() {
|
|
26
28
|
const home = process.env.HOME;
|
|
@@ -35,6 +37,12 @@ function openDb(queueName) {
|
|
|
35
37
|
db.pragma('journal_mode = WAL');
|
|
36
38
|
db.pragma('busy_timeout = 5000');
|
|
37
39
|
db.exec(DDL);
|
|
40
|
+
// Migration: add priority column to databases created before this version
|
|
41
|
+
try {
|
|
42
|
+
db.exec('ALTER TABLE messages ADD COLUMN priority REAL NOT NULL DEFAULT 0.0');
|
|
43
|
+
}
|
|
44
|
+
catch { /* already exists */ }
|
|
45
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_claim_pri ON messages (subqueue, claimed, priority, seq)');
|
|
38
46
|
return db;
|
|
39
47
|
}
|
|
40
48
|
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":";;;;;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,SAAiB;IACtC,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,SAAS,KAAK,CAAC,CAAC,CAAC;IACtD,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
|
@@ -25,6 +25,12 @@ function parseIntArg(value) {
|
|
|
25
25
|
throw new commander_1.InvalidArgumentError('expected an integer');
|
|
26
26
|
return n;
|
|
27
27
|
}
|
|
28
|
+
function parseFloatArg(value) {
|
|
29
|
+
const n = parseFloat(value);
|
|
30
|
+
if (isNaN(n))
|
|
31
|
+
throw new commander_1.InvalidArgumentError('expected a number');
|
|
32
|
+
return n;
|
|
33
|
+
}
|
|
28
34
|
function collectFilters(opts) {
|
|
29
35
|
const f = {};
|
|
30
36
|
if (opts['claimed'] !== undefined)
|
|
@@ -60,7 +66,7 @@ const program = new commander_1.Command();
|
|
|
60
66
|
program.name('qq').description('Persistent queue for Claude agent pipelines');
|
|
61
67
|
program
|
|
62
68
|
.command('make-queue')
|
|
63
|
-
.option('--name <
|
|
69
|
+
.option('--name <name>')
|
|
64
70
|
.action((opts) => {
|
|
65
71
|
try {
|
|
66
72
|
out({ queue: (0, commands_js_1.makeQueue)(opts.name) });
|
|
@@ -91,9 +97,11 @@ program
|
|
|
91
97
|
});
|
|
92
98
|
program
|
|
93
99
|
.command('push <path> <id>')
|
|
94
|
-
.
|
|
100
|
+
.option('--priority <n>', 'message priority (higher = claimed first)', parseFloatArg, 0.0)
|
|
101
|
+
.action((path, id, opts) => {
|
|
95
102
|
try {
|
|
96
|
-
|
|
103
|
+
const o = { payload: readStdin() ?? undefined, priority: opts.priority };
|
|
104
|
+
(0, commands_js_1.push)(path, id, o);
|
|
97
105
|
out({ ok: true });
|
|
98
106
|
}
|
|
99
107
|
catch (e) {
|
|
@@ -105,7 +113,7 @@ program
|
|
|
105
113
|
.option('--agent-id <id>')
|
|
106
114
|
.action((path, opts) => {
|
|
107
115
|
try {
|
|
108
|
-
out((0, commands_js_1.claim)(path,
|
|
116
|
+
out((0, commands_js_1.claim)(path, opts.agentId) ?? { empty: true });
|
|
109
117
|
}
|
|
110
118
|
catch (e) {
|
|
111
119
|
fail(e instanceof Error ? e.message : String(e));
|
|
@@ -116,12 +124,11 @@ program
|
|
|
116
124
|
.option('--target <subqueue>')
|
|
117
125
|
.option('--payload', 'read payload from stdin')
|
|
118
126
|
.option('--replace')
|
|
127
|
+
.option('--priority <n>', 'update message priority', parseFloatArg)
|
|
119
128
|
.action((queue, id, opts) => {
|
|
120
129
|
try {
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
releaseOpts.payload = readStdin() ?? undefined;
|
|
124
|
-
(0, commands_js_1.release)(queue, id, releaseOpts);
|
|
130
|
+
const payload = opts.payload ? readStdin() ?? undefined : undefined;
|
|
131
|
+
(0, commands_js_1.release)(queue, id, { target: opts.target, payload, replace: opts.replace, priority: opts.priority });
|
|
125
132
|
out({ ok: true });
|
|
126
133
|
}
|
|
127
134
|
catch (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
|
@@ -21,6 +21,7 @@ export interface Message {
|
|
|
21
21
|
claimed: boolean;
|
|
22
22
|
claimed_by: string | null;
|
|
23
23
|
seq: number;
|
|
24
|
+
priority: number;
|
|
24
25
|
created: number;
|
|
25
26
|
last_modified: number;
|
|
26
27
|
payload?: string | null;
|
|
@@ -37,11 +38,6 @@ export interface FilterOptions {
|
|
|
37
38
|
offset?: number;
|
|
38
39
|
}
|
|
39
40
|
|
|
40
|
-
export interface ReleaseOptions {
|
|
41
|
-
target?: string;
|
|
42
|
-
payload?: string;
|
|
43
|
-
replace?: boolean;
|
|
44
|
-
}
|
|
45
41
|
|
|
46
42
|
// ── internal helpers ───────────────────────────────────────────────────────────
|
|
47
43
|
|
|
@@ -67,6 +63,7 @@ function rowToMessage(row: Record<string, unknown>, includePayload: boolean): Me
|
|
|
67
63
|
claimed: Boolean(row.claimed),
|
|
68
64
|
claimed_by: (row.claimed_by as string | null) ?? null,
|
|
69
65
|
seq: row.seq as number,
|
|
66
|
+
priority: (row.priority as number) ?? 0.0,
|
|
70
67
|
created: row.created as number,
|
|
71
68
|
last_modified: row.last_modified as number,
|
|
72
69
|
};
|
|
@@ -76,12 +73,13 @@ function rowToMessage(row: Record<string, unknown>, includePayload: boolean): Me
|
|
|
76
73
|
|
|
77
74
|
// ── makeQueue ─────────────────────────────────────────────────────────────────
|
|
78
75
|
|
|
79
|
-
export function makeQueue(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
76
|
+
export function makeQueue(name?: string): string {
|
|
77
|
+
if (!name) {
|
|
78
|
+
const now = new Date();
|
|
79
|
+
const mm = String(now.getMonth() + 1).padStart(2, '0');
|
|
80
|
+
const dd = String(now.getDate()).padStart(2, '0');
|
|
81
|
+
name = `${mm}${dd}_${randomBytes(3).toString('hex')}`;
|
|
82
|
+
}
|
|
85
83
|
const db = openDb(name);
|
|
86
84
|
db.close();
|
|
87
85
|
return name;
|
|
@@ -111,7 +109,12 @@ export function deleteQueue(queue: string): void {
|
|
|
111
109
|
|
|
112
110
|
// ── push ──────────────────────────────────────────────────────────────────────
|
|
113
111
|
|
|
114
|
-
export
|
|
112
|
+
export interface PushOptions {
|
|
113
|
+
payload?: string;
|
|
114
|
+
priority?: number;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function push(path: string, id: string, { payload, priority = 0.0 }: PushOptions = {}): void {
|
|
115
118
|
const { queue, subqueue } = parsePath(path);
|
|
116
119
|
if (!subqueue) throw new QQError('path must include a subqueue: queue/subqueue');
|
|
117
120
|
|
|
@@ -123,8 +126,8 @@ export function push(path: string, id: string, payload?: string): void {
|
|
|
123
126
|
const seq = nextSeq(db);
|
|
124
127
|
const now = Date.now();
|
|
125
128
|
db.prepare(
|
|
126
|
-
'INSERT INTO messages (id, subqueue, claimed, seq, payload, created, last_modified) VALUES (?, ?, 0, ?, ?, ?, ?)'
|
|
127
|
-
).run(id, subqueue, seq, payload ?? null, now, now);
|
|
129
|
+
'INSERT INTO messages (id, subqueue, claimed, seq, payload, priority, created, last_modified) VALUES (?, ?, 0, ?, ?, ?, ?, ?)'
|
|
130
|
+
).run(id, subqueue, seq, payload ?? null, priority, now, now);
|
|
128
131
|
});
|
|
129
132
|
} finally {
|
|
130
133
|
db.close();
|
|
@@ -133,7 +136,7 @@ export function push(path: string, id: string, payload?: string): void {
|
|
|
133
136
|
|
|
134
137
|
// ── claim ─────────────────────────────────────────────────────────────────────
|
|
135
138
|
|
|
136
|
-
export function claim(path: string,
|
|
139
|
+
export function claim(path: string, agentId?: string): Message | null {
|
|
137
140
|
const { queue, subqueue } = parsePath(path);
|
|
138
141
|
if (!subqueue) throw new QQError('path must include a subqueue: queue/subqueue');
|
|
139
142
|
|
|
@@ -142,7 +145,7 @@ export function claim(path: string, options: { agentId?: string } = {}): Message
|
|
|
142
145
|
return inTransaction(db, () => {
|
|
143
146
|
const pattern = toGlob(subqueue);
|
|
144
147
|
const row = db.prepare(
|
|
145
|
-
'SELECT * FROM messages WHERE subqueue LIKE ? AND claimed = 0 ORDER BY seq ASC LIMIT 1'
|
|
148
|
+
'SELECT * FROM messages WHERE subqueue LIKE ? AND claimed = 0 ORDER BY priority DESC, seq ASC LIMIT 1'
|
|
146
149
|
).get(pattern) as Record<string, unknown> | undefined;
|
|
147
150
|
|
|
148
151
|
if (!row) return null;
|
|
@@ -150,9 +153,9 @@ export function claim(path: string, options: { agentId?: string } = {}): Message
|
|
|
150
153
|
const now = Date.now();
|
|
151
154
|
db.prepare(
|
|
152
155
|
'UPDATE messages SET claimed = 1, claimed_by = ?, last_modified = ? WHERE id = ?'
|
|
153
|
-
).run(
|
|
156
|
+
).run(agentId ?? null, now, row.id as string);
|
|
154
157
|
|
|
155
|
-
return rowToMessage({ ...row, claimed: 1, claimed_by:
|
|
158
|
+
return rowToMessage({ ...row, claimed: 1, claimed_by: agentId ?? null }, true);
|
|
156
159
|
});
|
|
157
160
|
} finally {
|
|
158
161
|
db.close();
|
|
@@ -161,30 +164,38 @@ export function claim(path: string, options: { agentId?: string } = {}): Message
|
|
|
161
164
|
|
|
162
165
|
// ── release ───────────────────────────────────────────────────────────────────
|
|
163
166
|
|
|
164
|
-
export
|
|
167
|
+
export interface ReleaseOptions {
|
|
168
|
+
target?: string;
|
|
169
|
+
payload?: string;
|
|
170
|
+
replace?: boolean;
|
|
171
|
+
priority?: number;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export function release(queue: string, id: string, { target, payload, replace, priority }: ReleaseOptions = {}): void {
|
|
165
175
|
const db = openDb(queue);
|
|
166
176
|
try {
|
|
167
177
|
inTransaction(db, () => {
|
|
168
178
|
const row = db.prepare('SELECT * FROM messages WHERE id = ?').get(id) as Record<string, unknown> | undefined;
|
|
169
179
|
if (!row) throw new QQError(`message not found: ${id}`);
|
|
170
|
-
if (!row.claimed) throw new QQError(`
|
|
180
|
+
if (!row.claimed) throw new QQError(`only claimed messages can be released: ${id}`);
|
|
171
181
|
|
|
172
182
|
const seq = nextSeq(db);
|
|
173
183
|
const now = Date.now();
|
|
174
|
-
const newSubqueue =
|
|
184
|
+
const newSubqueue = target ?? (row.subqueue as string);
|
|
185
|
+
const newPriority = priority ?? (row.priority as number) ?? 0.0;
|
|
175
186
|
|
|
176
187
|
let newPayload: string | null;
|
|
177
|
-
if (
|
|
178
|
-
newPayload =
|
|
179
|
-
?
|
|
180
|
-
: [row.payload as string | null,
|
|
188
|
+
if (payload !== undefined) {
|
|
189
|
+
newPayload = replace
|
|
190
|
+
? payload
|
|
191
|
+
: [row.payload as string | null, payload].filter(Boolean).join('\n');
|
|
181
192
|
} else {
|
|
182
193
|
newPayload = (row.payload as string | null) ?? null;
|
|
183
194
|
}
|
|
184
195
|
|
|
185
196
|
db.prepare(
|
|
186
|
-
'UPDATE messages SET claimed = 0, claimed_by = NULL, seq = ?, subqueue = ?, payload = ?, last_modified = ? WHERE id = ?'
|
|
187
|
-
).run(seq, newSubqueue, newPayload, now, id);
|
|
197
|
+
'UPDATE messages SET claimed = 0, claimed_by = NULL, seq = ?, subqueue = ?, payload = ?, priority = ?, last_modified = ? WHERE id = ?'
|
|
198
|
+
).run(seq, newSubqueue, newPayload, newPriority, now, id);
|
|
188
199
|
});
|
|
189
200
|
} finally {
|
|
190
201
|
db.close();
|
package/src/db.ts
CHANGED
|
@@ -11,9 +11,11 @@ CREATE TABLE IF NOT EXISTS messages (
|
|
|
11
11
|
payload TEXT,
|
|
12
12
|
claimed_by TEXT,
|
|
13
13
|
created INTEGER NOT NULL,
|
|
14
|
-
last_modified INTEGER NOT NULL
|
|
14
|
+
last_modified INTEGER NOT NULL,
|
|
15
|
+
priority REAL NOT NULL DEFAULT 0.0
|
|
15
16
|
);
|
|
16
17
|
CREATE INDEX IF NOT EXISTS idx_claim ON messages (subqueue, claimed, seq);
|
|
18
|
+
CREATE INDEX IF NOT EXISTS idx_claim_pri ON messages (subqueue, claimed, priority, seq);
|
|
17
19
|
`;
|
|
18
20
|
|
|
19
21
|
export function dbRoot(): string {
|
|
@@ -29,6 +31,9 @@ export function openDb(queueName: string): Database.Database {
|
|
|
29
31
|
db.pragma('journal_mode = WAL');
|
|
30
32
|
db.pragma('busy_timeout = 5000');
|
|
31
33
|
db.exec(DDL);
|
|
34
|
+
// Migration: add priority column to databases created before this version
|
|
35
|
+
try { db.exec('ALTER TABLE messages ADD COLUMN priority REAL NOT NULL DEFAULT 0.0'); } catch { /* already exists */ }
|
|
36
|
+
db.exec('CREATE INDEX IF NOT EXISTS idx_claim_pri ON messages (subqueue, claimed, priority, seq)');
|
|
32
37
|
return db;
|
|
33
38
|
}
|
|
34
39
|
|
package/src/index.ts
CHANGED
|
@@ -6,7 +6,7 @@ import { dump } from 'js-yaml';
|
|
|
6
6
|
import {
|
|
7
7
|
makeQueue, listQueues, deleteQueue, push, claim, release,
|
|
8
8
|
batchRead, stats, reap, QQError,
|
|
9
|
-
type FilterOptions, type ReleaseOptions,
|
|
9
|
+
type FilterOptions, type PushOptions, type ReleaseOptions,
|
|
10
10
|
} from './commands.js';
|
|
11
11
|
|
|
12
12
|
function out(data: unknown): void {
|
|
@@ -30,6 +30,12 @@ function parseIntArg(value: string): number {
|
|
|
30
30
|
return n;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
function parseFloatArg(value: string): number {
|
|
34
|
+
const n = parseFloat(value);
|
|
35
|
+
if (isNaN(n)) throw new InvalidArgumentError('expected a number');
|
|
36
|
+
return n;
|
|
37
|
+
}
|
|
38
|
+
|
|
33
39
|
function collectFilters(opts: Record<string, unknown>): FilterOptions {
|
|
34
40
|
const f: FilterOptions = {};
|
|
35
41
|
if (opts['claimed'] !== undefined) f.claimed = opts['claimed'] === '1';
|
|
@@ -60,7 +66,7 @@ program.name('qq').description('Persistent queue for Claude agent pipelines');
|
|
|
60
66
|
|
|
61
67
|
program
|
|
62
68
|
.command('make-queue')
|
|
63
|
-
.option('--name <
|
|
69
|
+
.option('--name <name>')
|
|
64
70
|
.action((opts) => {
|
|
65
71
|
try { out({ queue: makeQueue(opts.name) }); }
|
|
66
72
|
catch (e) { fail(e instanceof Error ? e.message : String(e)); }
|
|
@@ -82,16 +88,20 @@ program
|
|
|
82
88
|
|
|
83
89
|
program
|
|
84
90
|
.command('push <path> <id>')
|
|
85
|
-
.
|
|
86
|
-
|
|
87
|
-
|
|
91
|
+
.option('--priority <n>', 'message priority (higher = claimed first)', parseFloatArg, 0.0)
|
|
92
|
+
.action((path, id, opts) => {
|
|
93
|
+
try {
|
|
94
|
+
const o: PushOptions = { payload: readStdin() ?? undefined, priority: opts.priority };
|
|
95
|
+
push(path, id, o);
|
|
96
|
+
out({ ok: true });
|
|
97
|
+
} catch (e) { e instanceof QQError ? fail(e.message) : fail(String(e)); }
|
|
88
98
|
});
|
|
89
99
|
|
|
90
100
|
program
|
|
91
101
|
.command('claim <path>')
|
|
92
102
|
.option('--agent-id <id>')
|
|
93
103
|
.action((path, opts) => {
|
|
94
|
-
try { out(claim(path,
|
|
104
|
+
try { out(claim(path, opts.agentId) ?? { empty: true }); }
|
|
95
105
|
catch (e) { fail(e instanceof Error ? e.message : String(e)); }
|
|
96
106
|
});
|
|
97
107
|
|
|
@@ -100,11 +110,11 @@ program
|
|
|
100
110
|
.option('--target <subqueue>')
|
|
101
111
|
.option('--payload', 'read payload from stdin')
|
|
102
112
|
.option('--replace')
|
|
113
|
+
.option('--priority <n>', 'update message priority', parseFloatArg)
|
|
103
114
|
.action((queue, id, opts) => {
|
|
104
115
|
try {
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
release(queue, id, releaseOpts);
|
|
116
|
+
const payload = opts.payload ? readStdin() ?? undefined : undefined;
|
|
117
|
+
release(queue, id, { target: opts.target, payload, replace: opts.replace, priority: opts.priority });
|
|
108
118
|
out({ ok: true });
|
|
109
119
|
} catch (e) { e instanceof QQError ? fail(e.message) : fail(String(e)); }
|
|
110
120
|
});
|