- Rewrote bot/index.js using grammy (@grammyjs/auto-retry + runner) - Added deduplication.js (adapted from claudegram) - Added request-queue.js (per-chat sequential processing) - Added message-sender.js (chunking + Markdown fallback) - Wired all JS-shim services: tools, skills, agents, config, RTK - Added function calling support to ZAIProvider.chat() - Added dynamic command routing (tools, skills, agents, model, stats) - Added per-agent delegation commands (/agent_coder, /agent_architect, etc.) - Added dedup + queue patterns from claudegram's battle-tested codebase - Updated zcode.js to pass agents to initBot() - Updated README feature comparison table to reflect real capabilities
51 lines
1.3 KiB
JavaScript
51 lines
1.3 KiB
JavaScript
// Adapted from claudegram's request-queue.ts — per-chat sequential processing
|
|
const pendingQueues = new Map();
|
|
const processingFlags = new Map();
|
|
|
|
export function isProcessing(sessionKey) {
|
|
return processingFlags.get(sessionKey) === true;
|
|
}
|
|
|
|
export function getQueuePosition(sessionKey) {
|
|
const queue = pendingQueues.get(sessionKey);
|
|
return queue ? queue.length : 0;
|
|
}
|
|
|
|
export function clearQueue(sessionKey) {
|
|
pendingQueues.delete(sessionKey);
|
|
processingFlags.delete(sessionKey);
|
|
}
|
|
|
|
export async function queueRequest(sessionKey, message, handler) {
|
|
return new Promise((resolve, reject) => {
|
|
const request = { message, handler, resolve, reject };
|
|
let queue = pendingQueues.get(sessionKey);
|
|
if (!queue) {
|
|
queue = [];
|
|
pendingQueues.set(sessionKey, queue);
|
|
}
|
|
queue.push(request);
|
|
processQueue(sessionKey);
|
|
});
|
|
}
|
|
|
|
async function processQueue(sessionKey) {
|
|
if (processingFlags.get(sessionKey)) return;
|
|
processingFlags.set(sessionKey, true);
|
|
|
|
const queue = pendingQueues.get(sessionKey);
|
|
while (queue && queue.length > 0) {
|
|
const request = queue[0];
|
|
try {
|
|
const result = await request.handler();
|
|
request.resolve(result);
|
|
} catch (error) {
|
|
request.reject(error);
|
|
}
|
|
queue.shift();
|
|
}
|
|
|
|
processingFlags.delete(sessionKey);
|
|
pendingQueues.delete(sessionKey);
|
|
}
|