feat: Complete zCode CLI X with Telegram bot integration

- 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
This commit is contained in:
admin
2026-05-05 09:01:26 +00:00
Unverified
parent 4a7035dd92
commit 875c7f9b91
24688 changed files with 3224957 additions and 221 deletions

View File

@@ -0,0 +1,41 @@
import { fromHex } from "@smithy/util-hex-encoding";
export class EventSigningTransformStream extends TransformStream {
constructor(initialSignature, messageSigner, eventStreamCodec, systemClockOffsetProvider) {
let priorSignature = initialSignature;
super({
start() { },
async transform(chunk, controller) {
try {
const now = new Date(Date.now() + (await systemClockOffsetProvider()));
const dateHeader = {
":date": { type: "timestamp", value: now },
};
const signedMessage = await messageSigner.sign({
message: {
body: chunk,
headers: dateHeader,
},
priorSignature: priorSignature,
}, {
signingDate: now,
});
priorSignature = signedMessage.signature;
const serializedSigned = eventStreamCodec.encode({
headers: {
...dateHeader,
":chunk-signature": {
type: "binary",
value: fromHex(signedMessage.signature),
},
},
body: chunk,
});
controller.enqueue(serializedSigned);
}
catch (error) {
controller.error(error);
}
},
});
}
}

View File

@@ -0,0 +1,40 @@
import { EventStreamCodec } from "@smithy/eventstream-codec";
import { EventSigningTransformStream } from "./EventSigningTransformStream";
export class EventStreamPayloadHandler {
messageSigner;
eventStreamCodec;
systemClockOffsetProvider;
constructor(options) {
this.messageSigner = options.messageSigner;
this.eventStreamCodec = new EventStreamCodec(options.utf8Encoder, options.utf8Decoder);
this.systemClockOffsetProvider = async () => options.systemClockOffset ?? 0;
}
async handle(next, args, context = {}) {
const request = args.request;
const { body: payload, headers, query } = request;
if (!(payload instanceof ReadableStream)) {
throw new Error("Eventstream payload must be a ReadableStream.");
}
const placeHolderStream = new TransformStream();
request.body = placeHolderStream.readable;
const match = (headers?.authorization ?? "").match(/Signature=(\w+)$/);
let priorSignature = (match ?? [])[1] ?? (query && query["X-Amz-Signature"]) ?? "";
if (context.__staticSignature) {
priorSignature = "";
}
const signingStream = new EventSigningTransformStream(priorSignature, await this.messageSigner(), this.eventStreamCodec, this.systemClockOffsetProvider);
payload.pipeThrough(signingStream).pipeThrough(placeHolderStream);
let result;
try {
result = await next(args);
}
catch (e) {
const p = payload.cancel?.();
if (p instanceof Promise) {
p.catch(() => { });
}
throw e;
}
return result;
}
}

View File

@@ -0,0 +1,2 @@
import { EventStreamPayloadHandler } from "./EventStreamPayloadHandler";
export const eventStreamPayloadHandlerProvider = (options) => new EventStreamPayloadHandler(options);