- Add full Telegram bot functionality with Z.AI API integration
- Implement 4 tools: Bash, FileEdit, WebSearch, Git
- Add 3 agents: Code Reviewer, Architect, DevOps Engineer
- Add 6 skills for common coding tasks
- Add systemd service file for 24/7 operation
- Add nginx configuration for HTTPS webhook
- Add comprehensive documentation
- Implement WebSocket server for real-time updates
- Add logging system with Winston
- Add environment validation
🤖 zCode CLI X - Agentic coder with Z.AI + Telegram integration
61 lines
1.7 KiB
JavaScript
61 lines
1.7 KiB
JavaScript
export function memoizeChain(providers, treatAsExpired) {
|
|
const chain = internalCreateChain(providers);
|
|
let activeLock;
|
|
let passiveLock;
|
|
let credentials;
|
|
const provider = async (options) => {
|
|
if (options?.forceRefresh) {
|
|
return await chain(options);
|
|
}
|
|
if (credentials?.expiration) {
|
|
if (credentials?.expiration?.getTime() < Date.now()) {
|
|
credentials = undefined;
|
|
}
|
|
}
|
|
if (activeLock) {
|
|
await activeLock;
|
|
}
|
|
else if (!credentials || treatAsExpired?.(credentials)) {
|
|
if (credentials) {
|
|
if (!passiveLock) {
|
|
passiveLock = chain(options)
|
|
.then((c) => {
|
|
credentials = c;
|
|
})
|
|
.finally(() => {
|
|
passiveLock = undefined;
|
|
});
|
|
}
|
|
}
|
|
else {
|
|
activeLock = chain(options)
|
|
.then((c) => {
|
|
credentials = c;
|
|
})
|
|
.finally(() => {
|
|
activeLock = undefined;
|
|
});
|
|
return provider(options);
|
|
}
|
|
}
|
|
return credentials;
|
|
};
|
|
return provider;
|
|
}
|
|
export const internalCreateChain = (providers) => async (awsIdentityProperties) => {
|
|
let lastProviderError;
|
|
for (const provider of providers) {
|
|
try {
|
|
return await provider(awsIdentityProperties);
|
|
}
|
|
catch (err) {
|
|
lastProviderError = err;
|
|
if (err?.tryNextLink) {
|
|
continue;
|
|
}
|
|
throw err;
|
|
}
|
|
}
|
|
throw lastProviderError;
|
|
};
|