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
This commit is contained in:
50
src/bot/request-queue.js
Normal file
50
src/bot/request-queue.js
Normal file
@@ -0,0 +1,50 @@
|
||||
// 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);
|
||||
}
|
||||
Reference in New Issue
Block a user