v2: make v2 the main entry point, move v1 to src/v1/
- Move all v1 files (index, router, container-runner, db, ipc, types, logger, channels/registry, and all utilities) to src/v1/ as a fully self-contained archive with no shared dependencies - Rename v2 files to remove -v2 suffix (index-v2.ts → index.ts, etc.) - Update all imports across v2 source, tests, and setup files - Migrate shared utilities (config, env, container-runtime, mount-security, timezone, group-folder) from pino logger to v2 log module - Migrate setup/ files from logger to log with argument order swap - Container agent-runner: move v1 entry to v1/, rename v2 to index.ts - Update setup skill to offer all 13 v2 channels - Install all Chat SDK adapter packages - dist/index.js now runs v2; dist/v1/index.js runs v1 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
38
src/v1/channels/registry.test.ts
Normal file
38
src/v1/channels/registry.test.ts
Normal file
@@ -0,0 +1,38 @@
|
||||
import { describe, it, expect } from 'vitest';
|
||||
|
||||
import { registerChannel, getChannelFactory, getRegisteredChannelNames } from './registry.js';
|
||||
|
||||
// The registry is module-level state, so we need a fresh module per test.
|
||||
// We use dynamic import with cache-busting to isolate tests.
|
||||
// However, since vitest runs each file in its own context and we control
|
||||
// registration order, we can test the public API directly.
|
||||
|
||||
describe('channel registry', () => {
|
||||
// Note: registry is shared module state across tests in this file.
|
||||
// Tests are ordered to account for cumulative registrations.
|
||||
|
||||
it('getChannelFactory returns undefined for unknown channel', () => {
|
||||
expect(getChannelFactory('nonexistent')).toBeUndefined();
|
||||
});
|
||||
|
||||
it('registerChannel and getChannelFactory round-trip', () => {
|
||||
const factory = () => null;
|
||||
registerChannel('test-channel', factory);
|
||||
expect(getChannelFactory('test-channel')).toBe(factory);
|
||||
});
|
||||
|
||||
it('getRegisteredChannelNames includes registered channels', () => {
|
||||
registerChannel('another-channel', () => null);
|
||||
const names = getRegisteredChannelNames();
|
||||
expect(names).toContain('test-channel');
|
||||
expect(names).toContain('another-channel');
|
||||
});
|
||||
|
||||
it('later registration overwrites earlier one', () => {
|
||||
const factory1 = () => null;
|
||||
const factory2 = () => null;
|
||||
registerChannel('overwrite-test', factory1);
|
||||
registerChannel('overwrite-test', factory2);
|
||||
expect(getChannelFactory('overwrite-test')).toBe(factory2);
|
||||
});
|
||||
});
|
||||
23
src/v1/channels/registry.ts
Normal file
23
src/v1/channels/registry.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { Channel, OnInboundMessage, OnChatMetadata, RegisteredGroup } from '../types.js';
|
||||
|
||||
export interface ChannelOpts {
|
||||
onMessage: OnInboundMessage;
|
||||
onChatMetadata: OnChatMetadata;
|
||||
registeredGroups: () => Record<string, RegisteredGroup>;
|
||||
}
|
||||
|
||||
export type ChannelFactory = (opts: ChannelOpts) => Channel | null;
|
||||
|
||||
const registry = new Map<string, ChannelFactory>();
|
||||
|
||||
export function registerChannel(name: string, factory: ChannelFactory): void {
|
||||
registry.set(name, factory);
|
||||
}
|
||||
|
||||
export function getChannelFactory(name: string): ChannelFactory | undefined {
|
||||
return registry.get(name);
|
||||
}
|
||||
|
||||
export function getRegisteredChannelNames(): string[] {
|
||||
return [...registry.keys()];
|
||||
}
|
||||
Reference in New Issue
Block a user