@witqq/agent-sdk 0.6.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/README.md +539 -6
  2. package/dist/{types-BvwNzZCj.d.cts → agent-CW9XbmG_.d.ts} +148 -95
  3. package/dist/{types-BvwNzZCj.d.ts → agent-DxY68NZL.d.cts} +148 -95
  4. package/dist/auth/index.cjs +260 -2
  5. package/dist/auth/index.cjs.map +1 -1
  6. package/dist/auth/index.d.cts +21 -138
  7. package/dist/auth/index.d.ts +21 -138
  8. package/dist/auth/index.js +260 -3
  9. package/dist/auth/index.js.map +1 -1
  10. package/dist/backends/claude.cjs +653 -140
  11. package/dist/backends/claude.cjs.map +1 -1
  12. package/dist/backends/claude.d.cts +4 -1
  13. package/dist/backends/claude.d.ts +4 -1
  14. package/dist/backends/claude.js +653 -140
  15. package/dist/backends/claude.js.map +1 -1
  16. package/dist/backends/copilot.cjs +428 -88
  17. package/dist/backends/copilot.cjs.map +1 -1
  18. package/dist/backends/copilot.d.cts +13 -4
  19. package/dist/backends/copilot.d.ts +13 -4
  20. package/dist/backends/copilot.js +428 -88
  21. package/dist/backends/copilot.js.map +1 -1
  22. package/dist/backends/vercel-ai.cjs +349 -77
  23. package/dist/backends/vercel-ai.cjs.map +1 -1
  24. package/dist/backends/vercel-ai.d.cts +3 -1
  25. package/dist/backends/vercel-ai.d.ts +3 -1
  26. package/dist/backends/vercel-ai.js +349 -77
  27. package/dist/backends/vercel-ai.js.map +1 -1
  28. package/dist/backends-BSrsBYFn.d.cts +39 -0
  29. package/dist/backends-BSrsBYFn.d.ts +39 -0
  30. package/dist/chat/accumulator.cjs +147 -0
  31. package/dist/chat/accumulator.cjs.map +1 -0
  32. package/dist/chat/accumulator.d.cts +64 -0
  33. package/dist/chat/accumulator.d.ts +64 -0
  34. package/dist/chat/accumulator.js +145 -0
  35. package/dist/chat/accumulator.js.map +1 -0
  36. package/dist/chat/backends.cjs +3524 -0
  37. package/dist/chat/backends.cjs.map +1 -0
  38. package/dist/chat/backends.d.cts +66 -0
  39. package/dist/chat/backends.d.ts +66 -0
  40. package/dist/chat/backends.js +3512 -0
  41. package/dist/chat/backends.js.map +1 -0
  42. package/dist/chat/context.cjs +280 -0
  43. package/dist/chat/context.cjs.map +1 -0
  44. package/dist/chat/context.d.cts +191 -0
  45. package/dist/chat/context.d.ts +191 -0
  46. package/dist/chat/context.js +277 -0
  47. package/dist/chat/context.js.map +1 -0
  48. package/dist/chat/core.cjs +305 -0
  49. package/dist/chat/core.cjs.map +1 -0
  50. package/dist/chat/core.d.cts +84 -0
  51. package/dist/chat/core.d.ts +84 -0
  52. package/dist/chat/core.js +282 -0
  53. package/dist/chat/core.js.map +1 -0
  54. package/dist/chat/errors.cjs +273 -0
  55. package/dist/chat/errors.cjs.map +1 -0
  56. package/dist/chat/errors.d.cts +97 -0
  57. package/dist/chat/errors.d.ts +97 -0
  58. package/dist/chat/errors.js +266 -0
  59. package/dist/chat/errors.js.map +1 -0
  60. package/dist/chat/events.cjs +203 -0
  61. package/dist/chat/events.cjs.map +1 -0
  62. package/dist/chat/events.d.cts +245 -0
  63. package/dist/chat/events.d.ts +245 -0
  64. package/dist/chat/events.js +196 -0
  65. package/dist/chat/events.js.map +1 -0
  66. package/dist/chat/index.cjs +5550 -0
  67. package/dist/chat/index.cjs.map +1 -0
  68. package/dist/chat/index.d.cts +77 -0
  69. package/dist/chat/index.d.ts +77 -0
  70. package/dist/chat/index.js +5505 -0
  71. package/dist/chat/index.js.map +1 -0
  72. package/dist/chat/react/theme.css +2517 -0
  73. package/dist/chat/react.cjs +3589 -0
  74. package/dist/chat/react.cjs.map +1 -0
  75. package/dist/chat/react.d.cts +1088 -0
  76. package/dist/chat/react.d.ts +1088 -0
  77. package/dist/chat/react.js +3547 -0
  78. package/dist/chat/react.js.map +1 -0
  79. package/dist/chat/runtime.cjs +1245 -0
  80. package/dist/chat/runtime.cjs.map +1 -0
  81. package/dist/chat/runtime.d.cts +182 -0
  82. package/dist/chat/runtime.d.ts +182 -0
  83. package/dist/chat/runtime.js +1243 -0
  84. package/dist/chat/runtime.js.map +1 -0
  85. package/dist/chat/server.cjs +2668 -0
  86. package/dist/chat/server.cjs.map +1 -0
  87. package/dist/chat/server.d.cts +648 -0
  88. package/dist/chat/server.d.ts +648 -0
  89. package/dist/chat/server.js +2628 -0
  90. package/dist/chat/server.js.map +1 -0
  91. package/dist/chat/sessions.cjs +380 -0
  92. package/dist/chat/sessions.cjs.map +1 -0
  93. package/dist/chat/sessions.d.cts +158 -0
  94. package/dist/chat/sessions.d.ts +158 -0
  95. package/dist/chat/sessions.js +376 -0
  96. package/dist/chat/sessions.js.map +1 -0
  97. package/dist/chat/sqlite.cjs +441 -0
  98. package/dist/chat/sqlite.cjs.map +1 -0
  99. package/dist/chat/sqlite.d.cts +128 -0
  100. package/dist/chat/sqlite.d.ts +128 -0
  101. package/dist/chat/sqlite.js +435 -0
  102. package/dist/chat/sqlite.js.map +1 -0
  103. package/dist/chat/state.cjs +190 -0
  104. package/dist/chat/state.cjs.map +1 -0
  105. package/dist/chat/state.d.cts +95 -0
  106. package/dist/chat/state.d.ts +95 -0
  107. package/dist/chat/state.js +180 -0
  108. package/dist/chat/state.js.map +1 -0
  109. package/dist/chat/storage.cjs +249 -0
  110. package/dist/chat/storage.cjs.map +1 -0
  111. package/dist/chat/storage.d.cts +197 -0
  112. package/dist/chat/storage.d.ts +197 -0
  113. package/dist/chat/storage.js +245 -0
  114. package/dist/chat/storage.js.map +1 -0
  115. package/dist/errors-C-so0M4t.d.cts +33 -0
  116. package/dist/errors-C-so0M4t.d.ts +33 -0
  117. package/dist/errors-CmVvczxZ.d.cts +28 -0
  118. package/dist/errors-CmVvczxZ.d.ts +28 -0
  119. package/dist/in-process-transport-C1JnJGVR.d.ts +228 -0
  120. package/dist/in-process-transport-C7DSqPyX.d.cts +228 -0
  121. package/dist/index.cjs +365 -59
  122. package/dist/index.cjs.map +1 -1
  123. package/dist/index.d.cts +322 -125
  124. package/dist/index.d.ts +322 -125
  125. package/dist/index.js +359 -60
  126. package/dist/index.js.map +1 -1
  127. package/dist/provider-types-PTSlRPNB.d.cts +39 -0
  128. package/dist/provider-types-PTSlRPNB.d.ts +39 -0
  129. package/dist/refresh-manager-B81PpYBr.d.cts +153 -0
  130. package/dist/refresh-manager-Dlv_iNZi.d.ts +153 -0
  131. package/dist/testing.cjs +383 -0
  132. package/dist/testing.cjs.map +1 -0
  133. package/dist/testing.d.cts +132 -0
  134. package/dist/testing.d.ts +132 -0
  135. package/dist/testing.js +377 -0
  136. package/dist/testing.js.map +1 -0
  137. package/dist/token-store-CSUBgYwn.d.ts +48 -0
  138. package/dist/token-store-CuC4hB9Z.d.cts +48 -0
  139. package/dist/transport-Cdh3M0tS.d.cts +68 -0
  140. package/dist/transport-Ciap4PWK.d.ts +68 -0
  141. package/dist/types-4vbcmPTp.d.cts +143 -0
  142. package/dist/types-BxggH0Yh.d.ts +143 -0
  143. package/dist/types-DRgd_9R7.d.cts +363 -0
  144. package/dist/types-ajANVzf7.d.ts +363 -0
  145. package/package.json +178 -6
@@ -0,0 +1,132 @@
1
+ import { M as ModelInfo, V as ValidationResult, a as MessageContent, R as RunOptions, b as AgentResult, A as AgentEvent, I as IAgentService } from './agent-DxY68NZL.cjs';
2
+ import { IChatRuntime, IChatClient } from './chat/runtime.cjs';
3
+ import { g as ChatSession, f as ChatIdLike, h as RuntimeSendOptions, a as ChatEvent, S as SendMessageOptions, p as MessagePart, c as ChatMessage, j as ChatSessionConfig } from './types-DRgd_9R7.cjs';
4
+ import { P as ProviderConfig } from './provider-types-PTSlRPNB.cjs';
5
+ import 'zod';
6
+ import './errors-C-so0M4t.cjs';
7
+ import './chat/sessions.cjs';
8
+ import './chat/storage.cjs';
9
+ import './errors-CmVvczxZ.cjs';
10
+ import './types-4vbcmPTp.cjs';
11
+ import './chat/context.cjs';
12
+
13
+ /**
14
+ * Mock IAgentService factory for testing.
15
+ */
16
+
17
+ /** Options for createMockAgentService. */
18
+ interface MockAgentServiceOptions {
19
+ /** Service name. Default: "mock". */
20
+ name?: string;
21
+ /** Models to return from listModels(). */
22
+ models?: ModelInfo[];
23
+ /** Custom validation result. Default: { valid: true, errors: [] }. */
24
+ validationResult?: ValidationResult;
25
+ /** Custom run handler. Default: returns "Mock response". */
26
+ onRun?: (prompt: MessageContent, options?: RunOptions) => Promise<AgentResult>;
27
+ /** Custom stream handler. Default: yields text_delta + result events. */
28
+ onStream?: (prompt: MessageContent, options?: RunOptions) => AsyncIterable<AgentEvent>;
29
+ }
30
+ /**
31
+ * Create a mock IAgentService for testing agent-level code.
32
+ *
33
+ * ```ts
34
+ * const service = createMockAgentService({ name: "test" });
35
+ * const agent = service.createAgent({ model: "gpt-5-mini" });
36
+ * const result = await agent.run("Hello");
37
+ * ```
38
+ */
39
+ declare function createMockAgentService(options?: MockAgentServiceOptions): IAgentService;
40
+
41
+ /**
42
+ * Mock IChatRuntime factory for testing chat runtime consumers.
43
+ */
44
+
45
+ /** Options for createMockRuntime. */
46
+ interface MockRuntimeOptions {
47
+ /** Default backend name. Default: "mock". */
48
+ defaultBackend?: string;
49
+ /** Default model. */
50
+ defaultModel?: string;
51
+ /** Pre-seeded sessions. */
52
+ sessions?: ChatSession[];
53
+ /** Models to return from listModels(). */
54
+ models?: ModelInfo[];
55
+ /** Custom send handler. When not provided, yields a single text_delta + done event. */
56
+ onSend?: (sessionId: ChatIdLike, message: string, options?: RuntimeSendOptions) => AsyncIterable<ChatEvent>;
57
+ }
58
+ /**
59
+ * Create a mock IChatRuntime for testing chat UI hooks and components.
60
+ *
61
+ * ```ts
62
+ * const runtime = createMockRuntime({ defaultModel: "gpt-5-mini" });
63
+ * const session = await runtime.createSession({});
64
+ * ```
65
+ */
66
+ declare function createMockRuntime(options?: MockRuntimeOptions): IChatRuntime;
67
+
68
+ /**
69
+ * Mock IChatClient factory for testing remote chat client consumers.
70
+ */
71
+
72
+ /** Options for createMockChatClient. */
73
+ interface MockChatClientOptions {
74
+ /** Pre-seeded sessions. */
75
+ sessions?: ChatSession[];
76
+ /** Models to return from listModels(). */
77
+ models?: ModelInfo[];
78
+ /** Providers to return from listProviders(). */
79
+ providers?: ProviderConfig[];
80
+ /** Custom send handler. */
81
+ onSend?: (sessionId: ChatIdLike, message: string, options?: SendMessageOptions) => AsyncIterable<ChatEvent>;
82
+ }
83
+ /**
84
+ * Create a mock IChatClient for testing React hooks that talk to RemoteChatClient.
85
+ *
86
+ * ```ts
87
+ * const client = createMockChatClient({ providers: [{ id: "p1", backend: "copilot", model: "gpt-5-mini", label: "GPT Mini", createdAt: "" }] });
88
+ * const providers = await client.listProviders();
89
+ * ```
90
+ */
91
+ declare function createMockChatClient(options?: MockChatClientOptions): IChatClient;
92
+
93
+ /**
94
+ * Mock data factories for creating test ChatSession and ChatMessage instances.
95
+ */
96
+
97
+ /** Options for createMockSession. */
98
+ interface MockSessionOptions {
99
+ id?: string;
100
+ title?: string;
101
+ messages?: ChatMessage[];
102
+ config?: Partial<ChatSessionConfig>;
103
+ metadata?: Record<string, unknown>;
104
+ status?: "active";
105
+ }
106
+ /** Options for createMockMessage. */
107
+ interface MockMessageOptions {
108
+ id?: string;
109
+ role?: "user" | "assistant" | "system";
110
+ text?: string;
111
+ parts?: MessagePart[];
112
+ status?: "pending" | "streaming" | "complete" | "error";
113
+ metadata?: Record<string, unknown>;
114
+ }
115
+ /**
116
+ * Create a mock ChatSession for testing.
117
+ *
118
+ * ```ts
119
+ * const session = createMockSession({ title: "Test chat" });
120
+ * ```
121
+ */
122
+ declare function createMockSession(options?: MockSessionOptions): ChatSession;
123
+ /**
124
+ * Create a mock ChatMessage for testing.
125
+ *
126
+ * ```ts
127
+ * const msg = createMockMessage({ role: "user", text: "Hello" });
128
+ * ```
129
+ */
130
+ declare function createMockMessage(options?: MockMessageOptions): ChatMessage;
131
+
132
+ export { type MockAgentServiceOptions, type MockChatClientOptions, type MockMessageOptions, type MockRuntimeOptions, type MockSessionOptions, createMockAgentService, createMockChatClient, createMockMessage, createMockRuntime, createMockSession };
@@ -0,0 +1,132 @@
1
+ import { M as ModelInfo, V as ValidationResult, a as MessageContent, R as RunOptions, b as AgentResult, A as AgentEvent, I as IAgentService } from './agent-CW9XbmG_.js';
2
+ import { IChatRuntime, IChatClient } from './chat/runtime.js';
3
+ import { g as ChatSession, f as ChatIdLike, h as RuntimeSendOptions, a as ChatEvent, S as SendMessageOptions, p as MessagePart, c as ChatMessage, j as ChatSessionConfig } from './types-ajANVzf7.js';
4
+ import { P as ProviderConfig } from './provider-types-PTSlRPNB.js';
5
+ import 'zod';
6
+ import './errors-C-so0M4t.js';
7
+ import './chat/sessions.js';
8
+ import './chat/storage.js';
9
+ import './errors-CmVvczxZ.js';
10
+ import './types-BxggH0Yh.js';
11
+ import './chat/context.js';
12
+
13
+ /**
14
+ * Mock IAgentService factory for testing.
15
+ */
16
+
17
+ /** Options for createMockAgentService. */
18
+ interface MockAgentServiceOptions {
19
+ /** Service name. Default: "mock". */
20
+ name?: string;
21
+ /** Models to return from listModels(). */
22
+ models?: ModelInfo[];
23
+ /** Custom validation result. Default: { valid: true, errors: [] }. */
24
+ validationResult?: ValidationResult;
25
+ /** Custom run handler. Default: returns "Mock response". */
26
+ onRun?: (prompt: MessageContent, options?: RunOptions) => Promise<AgentResult>;
27
+ /** Custom stream handler. Default: yields text_delta + result events. */
28
+ onStream?: (prompt: MessageContent, options?: RunOptions) => AsyncIterable<AgentEvent>;
29
+ }
30
+ /**
31
+ * Create a mock IAgentService for testing agent-level code.
32
+ *
33
+ * ```ts
34
+ * const service = createMockAgentService({ name: "test" });
35
+ * const agent = service.createAgent({ model: "gpt-5-mini" });
36
+ * const result = await agent.run("Hello");
37
+ * ```
38
+ */
39
+ declare function createMockAgentService(options?: MockAgentServiceOptions): IAgentService;
40
+
41
+ /**
42
+ * Mock IChatRuntime factory for testing chat runtime consumers.
43
+ */
44
+
45
+ /** Options for createMockRuntime. */
46
+ interface MockRuntimeOptions {
47
+ /** Default backend name. Default: "mock". */
48
+ defaultBackend?: string;
49
+ /** Default model. */
50
+ defaultModel?: string;
51
+ /** Pre-seeded sessions. */
52
+ sessions?: ChatSession[];
53
+ /** Models to return from listModels(). */
54
+ models?: ModelInfo[];
55
+ /** Custom send handler. When not provided, yields a single text_delta + done event. */
56
+ onSend?: (sessionId: ChatIdLike, message: string, options?: RuntimeSendOptions) => AsyncIterable<ChatEvent>;
57
+ }
58
+ /**
59
+ * Create a mock IChatRuntime for testing chat UI hooks and components.
60
+ *
61
+ * ```ts
62
+ * const runtime = createMockRuntime({ defaultModel: "gpt-5-mini" });
63
+ * const session = await runtime.createSession({});
64
+ * ```
65
+ */
66
+ declare function createMockRuntime(options?: MockRuntimeOptions): IChatRuntime;
67
+
68
+ /**
69
+ * Mock IChatClient factory for testing remote chat client consumers.
70
+ */
71
+
72
+ /** Options for createMockChatClient. */
73
+ interface MockChatClientOptions {
74
+ /** Pre-seeded sessions. */
75
+ sessions?: ChatSession[];
76
+ /** Models to return from listModels(). */
77
+ models?: ModelInfo[];
78
+ /** Providers to return from listProviders(). */
79
+ providers?: ProviderConfig[];
80
+ /** Custom send handler. */
81
+ onSend?: (sessionId: ChatIdLike, message: string, options?: SendMessageOptions) => AsyncIterable<ChatEvent>;
82
+ }
83
+ /**
84
+ * Create a mock IChatClient for testing React hooks that talk to RemoteChatClient.
85
+ *
86
+ * ```ts
87
+ * const client = createMockChatClient({ providers: [{ id: "p1", backend: "copilot", model: "gpt-5-mini", label: "GPT Mini", createdAt: "" }] });
88
+ * const providers = await client.listProviders();
89
+ * ```
90
+ */
91
+ declare function createMockChatClient(options?: MockChatClientOptions): IChatClient;
92
+
93
+ /**
94
+ * Mock data factories for creating test ChatSession and ChatMessage instances.
95
+ */
96
+
97
+ /** Options for createMockSession. */
98
+ interface MockSessionOptions {
99
+ id?: string;
100
+ title?: string;
101
+ messages?: ChatMessage[];
102
+ config?: Partial<ChatSessionConfig>;
103
+ metadata?: Record<string, unknown>;
104
+ status?: "active";
105
+ }
106
+ /** Options for createMockMessage. */
107
+ interface MockMessageOptions {
108
+ id?: string;
109
+ role?: "user" | "assistant" | "system";
110
+ text?: string;
111
+ parts?: MessagePart[];
112
+ status?: "pending" | "streaming" | "complete" | "error";
113
+ metadata?: Record<string, unknown>;
114
+ }
115
+ /**
116
+ * Create a mock ChatSession for testing.
117
+ *
118
+ * ```ts
119
+ * const session = createMockSession({ title: "Test chat" });
120
+ * ```
121
+ */
122
+ declare function createMockSession(options?: MockSessionOptions): ChatSession;
123
+ /**
124
+ * Create a mock ChatMessage for testing.
125
+ *
126
+ * ```ts
127
+ * const msg = createMockMessage({ role: "user", text: "Hello" });
128
+ * ```
129
+ */
130
+ declare function createMockMessage(options?: MockMessageOptions): ChatMessage;
131
+
132
+ export { type MockAgentServiceOptions, type MockChatClientOptions, type MockMessageOptions, type MockRuntimeOptions, type MockSessionOptions, createMockAgentService, createMockChatClient, createMockMessage, createMockRuntime, createMockSession };
@@ -0,0 +1,377 @@
1
+ // src/testing/mock-agent-service.ts
2
+ var MockAgent = class {
3
+ sessionId = void 0;
4
+ _state = "idle";
5
+ _config;
6
+ _onRun;
7
+ _onStream;
8
+ constructor(config, options) {
9
+ this._config = config;
10
+ this._onRun = options?.onRun;
11
+ this._onStream = options?.onStream;
12
+ }
13
+ async run(prompt, options) {
14
+ if (this._onRun) return this._onRun(prompt, options);
15
+ return { output: "Mock response", structuredOutput: void 0, toolCalls: [], messages: [], usage: { promptTokens: 10, completionTokens: 5 } };
16
+ }
17
+ async runWithContext(messages, options) {
18
+ const lastMsg = messages[messages.length - 1];
19
+ const text = typeof lastMsg?.content === "string" ? lastMsg.content : "context";
20
+ return this.run(text, options);
21
+ }
22
+ async runStructured(prompt, _schema, options) {
23
+ const base = await this.run(prompt, options);
24
+ return { ...base, structuredOutput: void 0 };
25
+ }
26
+ async *stream(prompt, options) {
27
+ if (this._onStream) {
28
+ yield* this._onStream(prompt, options);
29
+ return;
30
+ }
31
+ yield { type: "text_delta", text: "Mock " };
32
+ yield { type: "text_delta", text: "response" };
33
+ yield { type: "done", finalOutput: "Mock response" };
34
+ }
35
+ async *streamWithContext(messages, options) {
36
+ const lastMsg = messages[messages.length - 1];
37
+ const text = typeof lastMsg?.content === "string" ? lastMsg.content : "context";
38
+ yield* this.stream(text, options);
39
+ }
40
+ abort() {
41
+ this._state = "idle";
42
+ }
43
+ async interrupt() {
44
+ this._state = "idle";
45
+ }
46
+ getState() {
47
+ return this._state;
48
+ }
49
+ getConfig() {
50
+ return this._config;
51
+ }
52
+ dispose() {
53
+ this._state = "disposed";
54
+ }
55
+ };
56
+ function createMockAgentService(options = {}) {
57
+ const name = options.name ?? "mock";
58
+ return {
59
+ name,
60
+ createAgent(config) {
61
+ return new MockAgent(config, options);
62
+ },
63
+ async listModels() {
64
+ return options.models ?? [
65
+ { id: "mock-model-1", name: "Mock Model 1" },
66
+ { id: "mock-model-2", name: "Mock Model 2" }
67
+ ];
68
+ },
69
+ async validate() {
70
+ return options.validationResult ?? { valid: true, errors: [] };
71
+ },
72
+ async dispose() {
73
+ }
74
+ };
75
+ }
76
+
77
+ // src/chat/types.ts
78
+ function createChatId() {
79
+ return crypto.randomUUID();
80
+ }
81
+ var UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
82
+ function toChatId(value) {
83
+ if (!UUID_RE.test(value)) {
84
+ throw new TypeError(`Invalid ChatId: "${value}" is not a valid UUID`);
85
+ }
86
+ return value;
87
+ }
88
+
89
+ // src/testing/mock-data.ts
90
+ function createMockSession(options = {}) {
91
+ const id = options.id ?? createChatId();
92
+ const now = (/* @__PURE__ */ new Date()).toISOString();
93
+ return {
94
+ id,
95
+ title: options.title ?? "Test Session",
96
+ messages: options.messages ?? [],
97
+ config: {
98
+ model: options.config?.model ?? "test-model",
99
+ backend: options.config?.backend ?? "test-backend",
100
+ systemPrompt: options.config?.systemPrompt ?? ""
101
+ },
102
+ metadata: {
103
+ messageCount: options.messages?.length ?? 0,
104
+ totalTokens: 0,
105
+ custom: options.metadata ?? {}
106
+ },
107
+ status: options.status ?? "active",
108
+ createdAt: now,
109
+ updatedAt: now
110
+ };
111
+ }
112
+ function createMockMessage(options = {}) {
113
+ const id = createChatId();
114
+ const parts = options.parts ?? (options.text ? [{ type: "text", text: options.text, status: "complete" }] : [{ type: "text", text: "Test message", status: "complete" }]);
115
+ const now = (/* @__PURE__ */ new Date()).toISOString();
116
+ return {
117
+ id,
118
+ role: options.role ?? "user",
119
+ parts,
120
+ status: options.status ?? "complete",
121
+ createdAt: now,
122
+ metadata: options.metadata ?? {}
123
+ };
124
+ }
125
+
126
+ // src/testing/mock-runtime.ts
127
+ function createMockRuntime(options = {}) {
128
+ const sessions = /* @__PURE__ */ new Map();
129
+ const tools = /* @__PURE__ */ new Map();
130
+ const sessionListeners = /* @__PURE__ */ new Set();
131
+ let currentBackend = options.defaultBackend ?? "mock";
132
+ let status = "idle";
133
+ for (const s of options.sessions ?? []) {
134
+ sessions.set(s.id, s);
135
+ }
136
+ function notifySessionChange() {
137
+ for (const cb of sessionListeners) {
138
+ try {
139
+ cb();
140
+ } catch {
141
+ }
142
+ }
143
+ }
144
+ const runtime = {
145
+ get status() {
146
+ return status;
147
+ },
148
+ get registeredTools() {
149
+ return tools;
150
+ },
151
+ async createSession(opts) {
152
+ const session = createMockSession({
153
+ title: opts.title,
154
+ config: {
155
+ model: opts.config?.model ?? "mock-model",
156
+ backend: opts.config?.backend ?? currentBackend,
157
+ systemPrompt: opts.config?.systemPrompt
158
+ },
159
+ metadata: opts.custom
160
+ });
161
+ sessions.set(session.id, session);
162
+ notifySessionChange();
163
+ return session;
164
+ },
165
+ async getSession(id) {
166
+ return sessions.get(toChatId(String(id))) ?? null;
167
+ },
168
+ async listSessions(_opts) {
169
+ return [...sessions.values()];
170
+ },
171
+ async deleteSession(id) {
172
+ sessions.delete(toChatId(String(id)));
173
+ notifySessionChange();
174
+ },
175
+ send(sessionId, message, sendOpts) {
176
+ if (options.onSend) return options.onSend(sessionId, message, sendOpts);
177
+ async function* defaultStream() {
178
+ const msgId = createChatId();
179
+ yield { type: "message:start", messageId: msgId };
180
+ yield { type: "message:delta", text: "Mock reply" };
181
+ yield { type: "message:complete", messageId: msgId };
182
+ yield { type: "done", finalOutput: "Mock reply" };
183
+ const session = sessions.get(toChatId(String(sessionId)));
184
+ if (session) {
185
+ session.messages.push(createMockMessage({ role: "assistant", text: "Mock reply" }));
186
+ session.metadata.messageCount = session.messages.length;
187
+ }
188
+ notifySessionChange();
189
+ }
190
+ return defaultStream();
191
+ },
192
+ abort() {
193
+ },
194
+ async listModels() {
195
+ return options.models ?? [{ id: "mock-model", name: "Mock Model" }];
196
+ },
197
+ async listBackends() {
198
+ return [{ name: currentBackend }];
199
+ },
200
+ onSessionChange(callback) {
201
+ sessionListeners.add(callback);
202
+ return () => {
203
+ sessionListeners.delete(callback);
204
+ };
205
+ },
206
+ registerTool(tool) {
207
+ tools.set(tool.name, tool);
208
+ },
209
+ removeTool(name) {
210
+ tools.delete(name);
211
+ },
212
+ use(mw) {
213
+ },
214
+ removeMiddleware(mw) {
215
+ },
216
+ async getContextStats(_sessionId) {
217
+ return null;
218
+ },
219
+ async dispose() {
220
+ status = "disposed";
221
+ sessions.clear();
222
+ tools.clear();
223
+ sessionListeners.clear();
224
+ }
225
+ };
226
+ return runtime;
227
+ }
228
+
229
+ // src/testing/mock-chat-client.ts
230
+ function createMockChatClient(options = {}) {
231
+ const sessions = /* @__PURE__ */ new Map();
232
+ const providers = /* @__PURE__ */ new Map();
233
+ const sessionListeners = /* @__PURE__ */ new Set();
234
+ const selectionListeners = /* @__PURE__ */ new Set();
235
+ let activeSessionId = null;
236
+ let selectedProviderId = null;
237
+ let status = "idle";
238
+ for (const s of options.sessions ?? []) {
239
+ sessions.set(s.id, s);
240
+ }
241
+ for (const p of options.providers ?? []) {
242
+ providers.set(p.id, p);
243
+ }
244
+ function notifySessionChange() {
245
+ for (const cb of sessionListeners) {
246
+ try {
247
+ cb();
248
+ } catch {
249
+ }
250
+ }
251
+ }
252
+ const client = {
253
+ get status() {
254
+ return status;
255
+ },
256
+ get activeSessionId() {
257
+ return activeSessionId;
258
+ },
259
+ async createSession(opts) {
260
+ const session = createMockSession({
261
+ title: opts.title,
262
+ config: {
263
+ model: opts.config?.model ?? "mock-model",
264
+ backend: opts.config?.backend ?? "mock",
265
+ systemPrompt: opts.config?.systemPrompt
266
+ }
267
+ });
268
+ sessions.set(session.id, session);
269
+ activeSessionId = session.id;
270
+ notifySessionChange();
271
+ return session;
272
+ },
273
+ async getSession(id) {
274
+ return sessions.get(toChatId(String(id))) ?? null;
275
+ },
276
+ async listSessions(_opts) {
277
+ return [...sessions.values()];
278
+ },
279
+ async deleteSession(id) {
280
+ sessions.delete(toChatId(String(id)));
281
+ if (activeSessionId === String(id)) activeSessionId = null;
282
+ notifySessionChange();
283
+ },
284
+ async switchSession(id) {
285
+ const session = sessions.get(toChatId(String(id)));
286
+ if (!session) throw new Error(`Session ${id} not found`);
287
+ activeSessionId = session.id;
288
+ return session;
289
+ },
290
+ send(sessionId, message, sendOpts) {
291
+ if (options.onSend) return options.onSend(sessionId, message, sendOpts);
292
+ async function* defaultStream() {
293
+ const msgId = createChatId();
294
+ yield { type: "message:start", messageId: msgId };
295
+ yield { type: "message:delta", text: "Mock reply" };
296
+ yield { type: "message:complete", messageId: msgId };
297
+ yield { type: "done", finalOutput: "Mock reply" };
298
+ const session = sessions.get(toChatId(String(sessionId)));
299
+ if (session) {
300
+ session.messages.push(createMockMessage({ role: "assistant", text: "Mock reply" }));
301
+ session.metadata.messageCount = session.messages.length;
302
+ }
303
+ notifySessionChange();
304
+ }
305
+ return defaultStream();
306
+ },
307
+ abort() {
308
+ },
309
+ // ── Provider Selection ──
310
+ get selectedProviderId() {
311
+ return selectedProviderId;
312
+ },
313
+ selectProvider(providerId) {
314
+ selectedProviderId = providerId;
315
+ for (const cb of selectionListeners) {
316
+ try {
317
+ cb(providerId);
318
+ } catch {
319
+ }
320
+ }
321
+ },
322
+ onSelectionChange(callback) {
323
+ selectionListeners.add(callback);
324
+ return () => {
325
+ selectionListeners.delete(callback);
326
+ };
327
+ },
328
+ async listModels() {
329
+ return options.models ?? [{ id: "mock-model", name: "Mock Model" }];
330
+ },
331
+ async listBackends() {
332
+ return [{ name: "mock" }];
333
+ },
334
+ onSessionChange(callback) {
335
+ sessionListeners.add(callback);
336
+ return () => {
337
+ sessionListeners.delete(callback);
338
+ };
339
+ },
340
+ async getContextStats(_sessionId) {
341
+ return null;
342
+ },
343
+ // ── Provider CRUD ──
344
+ async listProviders() {
345
+ return [...providers.values()];
346
+ },
347
+ async createProvider(config) {
348
+ const provider = {
349
+ ...config,
350
+ id: createChatId(),
351
+ createdAt: Date.now()
352
+ };
353
+ providers.set(provider.id, provider);
354
+ return provider;
355
+ },
356
+ async updateProvider(id, changes) {
357
+ const existing = providers.get(id);
358
+ if (!existing) throw new Error(`Provider ${id} not found`);
359
+ providers.set(id, { ...existing, ...changes });
360
+ },
361
+ async deleteProvider(id) {
362
+ providers.delete(id);
363
+ },
364
+ async dispose() {
365
+ status = "disposed";
366
+ sessions.clear();
367
+ providers.clear();
368
+ sessionListeners.clear();
369
+ selectionListeners.clear();
370
+ }
371
+ };
372
+ return client;
373
+ }
374
+
375
+ export { createMockAgentService, createMockChatClient, createMockMessage, createMockRuntime, createMockSession };
376
+ //# sourceMappingURL=testing.js.map
377
+ //# sourceMappingURL=testing.js.map