Initial implementation of Telegram AI customer support bot

Cloudflare Workers + Hono + D1 + KV + R2 stack with 4 specialized AI agents
(onboarding, troubleshoot, asset, billing), OpenAI function calling with
7 tool definitions, human escalation, pending action approval workflow,
feedback collection, audit logging, i18n (ko/en), and Workers AI fallback.

43 source files, 45 tests passing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
kappa
2026-02-11 13:21:38 +09:00
commit 1d6b64c9e4
58 changed files with 12857 additions and 0 deletions

View File

@@ -0,0 +1,51 @@
import { describe, it, expect } from 'vitest';
import { createLogger, Logger, maskUserId } from '../../src/utils/logger';
describe('Logger', () => {
it('createLogger returns a Logger instance', () => {
const logger = createLogger('test-service');
expect(logger).toBeInstanceOf(Logger);
});
it('info() does not throw', () => {
const logger = createLogger('test-service');
expect(() => logger.info('test message')).not.toThrow();
expect(() => logger.info('with context', { key: 'value' })).not.toThrow();
});
it('warn() does not throw', () => {
const logger = createLogger('test-service');
expect(() => logger.warn('warning message')).not.toThrow();
expect(() => logger.warn('with context', { count: 42 })).not.toThrow();
});
it('error() does not throw', () => {
const logger = createLogger('test-service');
expect(() => logger.error('error message')).not.toThrow();
expect(() => logger.error('with error', new Error('boom'))).not.toThrow();
expect(() => logger.error('full', new Error('boom'), { extra: true })).not.toThrow();
});
});
describe('maskUserId', () => {
it('masks a normal user ID correctly', () => {
expect(maskUserId('821596605')).toBe('8215****');
});
it('masks a short ID (<=4 chars) as all asterisks', () => {
expect(maskUserId('1234')).toBe('****');
expect(maskUserId('abc')).toBe('****');
});
it('returns "unknown" for undefined', () => {
expect(maskUserId(undefined)).toBe('unknown');
});
it('returns "unknown" for empty string', () => {
expect(maskUserId('')).toBe('unknown');
});
it('handles numeric input', () => {
expect(maskUserId(821596605)).toBe('8215****');
});
});