Files
zCode-CLI-X/src/bot/request-queue.js
admin cbe816a421 feat: full service exposure with grammy bot + claudegram patterns
- 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
2026-05-05 12:41:15 +00:00

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);
}