@jackchen_me/open-multi-agent 0.1.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 (133) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +280 -0
  3. package/dist/agent/agent.d.ts +121 -0
  4. package/dist/agent/agent.d.ts.map +1 -0
  5. package/dist/agent/agent.js +294 -0
  6. package/dist/agent/agent.js.map +1 -0
  7. package/dist/agent/pool.d.ts +128 -0
  8. package/dist/agent/pool.d.ts.map +1 -0
  9. package/dist/agent/pool.js +236 -0
  10. package/dist/agent/pool.js.map +1 -0
  11. package/dist/agent/runner.d.ts +120 -0
  12. package/dist/agent/runner.d.ts.map +1 -0
  13. package/dist/agent/runner.js +274 -0
  14. package/dist/agent/runner.js.map +1 -0
  15. package/dist/index.d.ts +73 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +87 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/llm/adapter.d.ts +38 -0
  20. package/dist/llm/adapter.d.ts.map +1 -0
  21. package/dist/llm/adapter.js +46 -0
  22. package/dist/llm/adapter.js.map +1 -0
  23. package/dist/llm/anthropic.d.ts +56 -0
  24. package/dist/llm/anthropic.d.ts.map +1 -0
  25. package/dist/llm/anthropic.js +307 -0
  26. package/dist/llm/anthropic.js.map +1 -0
  27. package/dist/llm/openai.d.ts +62 -0
  28. package/dist/llm/openai.d.ts.map +1 -0
  29. package/dist/llm/openai.js +424 -0
  30. package/dist/llm/openai.js.map +1 -0
  31. package/dist/memory/shared.d.ts +86 -0
  32. package/dist/memory/shared.d.ts.map +1 -0
  33. package/dist/memory/shared.js +155 -0
  34. package/dist/memory/shared.js.map +1 -0
  35. package/dist/memory/store.d.ts +64 -0
  36. package/dist/memory/store.d.ts.map +1 -0
  37. package/dist/memory/store.js +103 -0
  38. package/dist/memory/store.js.map +1 -0
  39. package/dist/orchestrator/orchestrator.d.ts +173 -0
  40. package/dist/orchestrator/orchestrator.d.ts.map +1 -0
  41. package/dist/orchestrator/orchestrator.js +698 -0
  42. package/dist/orchestrator/orchestrator.js.map +1 -0
  43. package/dist/orchestrator/scheduler.d.ts +112 -0
  44. package/dist/orchestrator/scheduler.d.ts.map +1 -0
  45. package/dist/orchestrator/scheduler.js +282 -0
  46. package/dist/orchestrator/scheduler.js.map +1 -0
  47. package/dist/task/queue.d.ts +160 -0
  48. package/dist/task/queue.d.ts.map +1 -0
  49. package/dist/task/queue.js +337 -0
  50. package/dist/task/queue.js.map +1 -0
  51. package/dist/task/task.d.ts +86 -0
  52. package/dist/task/task.d.ts.map +1 -0
  53. package/dist/task/task.js +201 -0
  54. package/dist/task/task.js.map +1 -0
  55. package/dist/team/messaging.d.ts +106 -0
  56. package/dist/team/messaging.d.ts.map +1 -0
  57. package/dist/team/messaging.js +182 -0
  58. package/dist/team/messaging.js.map +1 -0
  59. package/dist/team/team.d.ts +141 -0
  60. package/dist/team/team.d.ts.map +1 -0
  61. package/dist/team/team.js +282 -0
  62. package/dist/team/team.js.map +1 -0
  63. package/dist/tool/built-in/bash.d.ts +12 -0
  64. package/dist/tool/built-in/bash.d.ts.map +1 -0
  65. package/dist/tool/built-in/bash.js +133 -0
  66. package/dist/tool/built-in/bash.js.map +1 -0
  67. package/dist/tool/built-in/file-edit.d.ts +14 -0
  68. package/dist/tool/built-in/file-edit.d.ts.map +1 -0
  69. package/dist/tool/built-in/file-edit.js +130 -0
  70. package/dist/tool/built-in/file-edit.js.map +1 -0
  71. package/dist/tool/built-in/file-read.d.ts +12 -0
  72. package/dist/tool/built-in/file-read.d.ts.map +1 -0
  73. package/dist/tool/built-in/file-read.js +82 -0
  74. package/dist/tool/built-in/file-read.js.map +1 -0
  75. package/dist/tool/built-in/file-write.d.ts +11 -0
  76. package/dist/tool/built-in/file-write.d.ts.map +1 -0
  77. package/dist/tool/built-in/file-write.js +70 -0
  78. package/dist/tool/built-in/file-write.js.map +1 -0
  79. package/dist/tool/built-in/grep.d.ts +15 -0
  80. package/dist/tool/built-in/grep.d.ts.map +1 -0
  81. package/dist/tool/built-in/grep.js +287 -0
  82. package/dist/tool/built-in/grep.js.map +1 -0
  83. package/dist/tool/built-in/index.d.ts +36 -0
  84. package/dist/tool/built-in/index.d.ts.map +1 -0
  85. package/dist/tool/built-in/index.js +45 -0
  86. package/dist/tool/built-in/index.js.map +1 -0
  87. package/dist/tool/executor.d.ts +71 -0
  88. package/dist/tool/executor.d.ts.map +1 -0
  89. package/dist/tool/executor.js +116 -0
  90. package/dist/tool/executor.js.map +1 -0
  91. package/dist/tool/framework.d.ts +143 -0
  92. package/dist/tool/framework.d.ts.map +1 -0
  93. package/dist/tool/framework.js +371 -0
  94. package/dist/tool/framework.js.map +1 -0
  95. package/dist/types.d.ts +285 -0
  96. package/dist/types.d.ts.map +1 -0
  97. package/dist/types.js +8 -0
  98. package/dist/types.js.map +1 -0
  99. package/dist/utils/semaphore.d.ts +47 -0
  100. package/dist/utils/semaphore.d.ts.map +1 -0
  101. package/dist/utils/semaphore.js +85 -0
  102. package/dist/utils/semaphore.js.map +1 -0
  103. package/examples/01-single-agent.ts +131 -0
  104. package/examples/02-team-collaboration.ts +167 -0
  105. package/examples/03-task-pipeline.ts +201 -0
  106. package/examples/04-multi-model-team.ts +261 -0
  107. package/package.json +49 -0
  108. package/src/agent/agent.ts +364 -0
  109. package/src/agent/pool.ts +278 -0
  110. package/src/agent/runner.ts +413 -0
  111. package/src/index.ts +166 -0
  112. package/src/llm/adapter.ts +74 -0
  113. package/src/llm/anthropic.ts +388 -0
  114. package/src/llm/openai.ts +522 -0
  115. package/src/memory/shared.ts +181 -0
  116. package/src/memory/store.ts +124 -0
  117. package/src/orchestrator/orchestrator.ts +851 -0
  118. package/src/orchestrator/scheduler.ts +352 -0
  119. package/src/task/queue.ts +394 -0
  120. package/src/task/task.ts +232 -0
  121. package/src/team/messaging.ts +230 -0
  122. package/src/team/team.ts +334 -0
  123. package/src/tool/built-in/bash.ts +187 -0
  124. package/src/tool/built-in/file-edit.ts +154 -0
  125. package/src/tool/built-in/file-read.ts +105 -0
  126. package/src/tool/built-in/file-write.ts +81 -0
  127. package/src/tool/built-in/grep.ts +362 -0
  128. package/src/tool/built-in/index.ts +50 -0
  129. package/src/tool/executor.ts +178 -0
  130. package/src/tool/framework.ts +557 -0
  131. package/src/types.ts +362 -0
  132. package/src/utils/semaphore.ts +89 -0
  133. package/tsconfig.json +25 -0
package/src/types.ts ADDED
@@ -0,0 +1,362 @@
1
+ /**
2
+ * @fileoverview Core type definitions for the open-multi-agent orchestration framework.
3
+ *
4
+ * All public types are exported from this single module. Downstream modules
5
+ * import only what they need, keeping the dependency graph acyclic.
6
+ */
7
+
8
+ import type { ZodSchema } from 'zod'
9
+
10
+ // ---------------------------------------------------------------------------
11
+ // Content blocks
12
+ // ---------------------------------------------------------------------------
13
+
14
+ /** Plain-text content produced by a model or supplied by the user. */
15
+ export interface TextBlock {
16
+ readonly type: 'text'
17
+ readonly text: string
18
+ }
19
+
20
+ /**
21
+ * A request by the model to invoke a named tool with a structured input.
22
+ * The `id` is unique per turn and is referenced by {@link ToolResultBlock}.
23
+ */
24
+ export interface ToolUseBlock {
25
+ readonly type: 'tool_use'
26
+ readonly id: string
27
+ readonly name: string
28
+ readonly input: Record<string, unknown>
29
+ }
30
+
31
+ /**
32
+ * The result of executing a tool, keyed back to the originating
33
+ * {@link ToolUseBlock} via `tool_use_id`.
34
+ */
35
+ export interface ToolResultBlock {
36
+ readonly type: 'tool_result'
37
+ readonly tool_use_id: string
38
+ readonly content: string
39
+ readonly is_error?: boolean
40
+ }
41
+
42
+ /** A base64-encoded image passed to or returned from a model. */
43
+ export interface ImageBlock {
44
+ readonly type: 'image'
45
+ readonly source: {
46
+ readonly type: 'base64'
47
+ readonly media_type: string
48
+ readonly data: string
49
+ }
50
+ }
51
+
52
+ /** Union of all content block variants that may appear in a message. */
53
+ export type ContentBlock = TextBlock | ToolUseBlock | ToolResultBlock | ImageBlock
54
+
55
+ // ---------------------------------------------------------------------------
56
+ // LLM messages & responses
57
+ // ---------------------------------------------------------------------------
58
+
59
+ /**
60
+ * A single message in a conversation thread.
61
+ * System messages are passed separately via {@link LLMChatOptions.systemPrompt}.
62
+ */
63
+ export interface LLMMessage {
64
+ readonly role: 'user' | 'assistant'
65
+ readonly content: ContentBlock[]
66
+ }
67
+
68
+ /** Token accounting for a single API call. */
69
+ export interface TokenUsage {
70
+ readonly input_tokens: number
71
+ readonly output_tokens: number
72
+ }
73
+
74
+ /** Normalised response returned by every {@link LLMAdapter} implementation. */
75
+ export interface LLMResponse {
76
+ readonly id: string
77
+ readonly content: ContentBlock[]
78
+ readonly model: string
79
+ readonly stop_reason: string
80
+ readonly usage: TokenUsage
81
+ }
82
+
83
+ // ---------------------------------------------------------------------------
84
+ // Streaming
85
+ // ---------------------------------------------------------------------------
86
+
87
+ /**
88
+ * A discrete event emitted during streaming generation.
89
+ *
90
+ * - `text` — incremental text delta
91
+ * - `tool_use` — the model has begun or completed a tool-use block
92
+ * - `tool_result` — a tool result has been appended to the stream
93
+ * - `done` — the stream has ended; `data` is the final {@link LLMResponse}
94
+ * - `error` — an unrecoverable error occurred; `data` is an `Error`
95
+ */
96
+ export interface StreamEvent {
97
+ readonly type: 'text' | 'tool_use' | 'tool_result' | 'done' | 'error'
98
+ readonly data: unknown
99
+ }
100
+
101
+ // ---------------------------------------------------------------------------
102
+ // Tool definitions
103
+ // ---------------------------------------------------------------------------
104
+
105
+ /** The serialisable tool schema sent to the LLM provider. */
106
+ export interface LLMToolDef {
107
+ readonly name: string
108
+ readonly description: string
109
+ /** JSON Schema object describing the tool's `input` parameter. */
110
+ readonly inputSchema: Record<string, unknown>
111
+ }
112
+
113
+ /**
114
+ * Context injected into every tool execution.
115
+ *
116
+ * Both `abortSignal` and `abortController` are provided so that tools and the
117
+ * executor can choose the most ergonomic API for their use-case:
118
+ *
119
+ * - Long-running shell commands that need to kill a child process can use
120
+ * `abortController.signal` directly.
121
+ * - Simple cancellation checks can read `abortSignal?.aborted`.
122
+ *
123
+ * When constructing a context, set `abortController` and derive `abortSignal`
124
+ * from it, or provide both independently.
125
+ */
126
+ export interface ToolUseContext {
127
+ /** High-level description of the agent invoking this tool. */
128
+ readonly agent: AgentInfo
129
+ /** Team context, present when the tool runs inside a multi-agent team. */
130
+ readonly team?: TeamInfo
131
+ /**
132
+ * Convenience reference to the abort signal.
133
+ * Equivalent to `abortController?.signal` when an `abortController` is set.
134
+ */
135
+ readonly abortSignal?: AbortSignal
136
+ /**
137
+ * Full abort controller, available when the caller needs to inspect or
138
+ * programmatically abort the signal.
139
+ * Tools should prefer `abortSignal` for simple cancellation checks.
140
+ */
141
+ readonly abortController?: AbortController
142
+ /** Working directory hint for file-system tools. */
143
+ readonly cwd?: string
144
+ /** Arbitrary caller-supplied metadata (session ID, request ID, etc.). */
145
+ readonly metadata?: Readonly<Record<string, unknown>>
146
+ }
147
+
148
+ /** Minimal descriptor for the agent that is invoking a tool. */
149
+ export interface AgentInfo {
150
+ readonly name: string
151
+ readonly role: string
152
+ readonly model: string
153
+ }
154
+
155
+ /** Descriptor for a team of agents with shared memory. */
156
+ export interface TeamInfo {
157
+ readonly name: string
158
+ readonly agents: readonly string[]
159
+ readonly sharedMemory: MemoryStore
160
+ }
161
+
162
+ /** Value returned by a tool's `execute` function. */
163
+ export interface ToolResult {
164
+ readonly data: string
165
+ readonly isError?: boolean
166
+ }
167
+
168
+ /**
169
+ * A tool registered with the framework.
170
+ *
171
+ * `inputSchema` is a Zod schema used for validation before `execute` is called.
172
+ * At API call time it is converted to JSON Schema via {@link LLMToolDef}.
173
+ */
174
+ export interface ToolDefinition<TInput = Record<string, unknown>> {
175
+ readonly name: string
176
+ readonly description: string
177
+ readonly inputSchema: ZodSchema<TInput>
178
+ execute(input: TInput, context: ToolUseContext): Promise<ToolResult>
179
+ }
180
+
181
+ // ---------------------------------------------------------------------------
182
+ // Agent
183
+ // ---------------------------------------------------------------------------
184
+
185
+ /** Static configuration for a single agent. */
186
+ export interface AgentConfig {
187
+ readonly name: string
188
+ readonly model: string
189
+ readonly provider?: 'anthropic' | 'openai'
190
+ readonly systemPrompt?: string
191
+ /** Names of tools (from the tool registry) available to this agent. */
192
+ readonly tools?: readonly string[]
193
+ readonly maxTurns?: number
194
+ readonly maxTokens?: number
195
+ readonly temperature?: number
196
+ }
197
+
198
+ /** Lifecycle state tracked during an agent run. */
199
+ export interface AgentState {
200
+ status: 'idle' | 'running' | 'completed' | 'error'
201
+ messages: LLMMessage[]
202
+ tokenUsage: TokenUsage
203
+ error?: Error
204
+ }
205
+
206
+ /** A single recorded tool invocation within a run. */
207
+ export interface ToolCallRecord {
208
+ readonly toolName: string
209
+ readonly input: Record<string, unknown>
210
+ readonly output: string
211
+ /** Wall-clock duration in milliseconds. */
212
+ readonly duration: number
213
+ }
214
+
215
+ /** The final result produced when an agent run completes (or fails). */
216
+ export interface AgentRunResult {
217
+ readonly success: boolean
218
+ readonly output: string
219
+ readonly messages: LLMMessage[]
220
+ readonly tokenUsage: TokenUsage
221
+ readonly toolCalls: ToolCallRecord[]
222
+ }
223
+
224
+ // ---------------------------------------------------------------------------
225
+ // Team
226
+ // ---------------------------------------------------------------------------
227
+
228
+ /** Static configuration for a team of cooperating agents. */
229
+ export interface TeamConfig {
230
+ readonly name: string
231
+ readonly agents: readonly AgentConfig[]
232
+ readonly sharedMemory?: boolean
233
+ readonly maxConcurrency?: number
234
+ }
235
+
236
+ /** Aggregated result for a full team run. */
237
+ export interface TeamRunResult {
238
+ readonly success: boolean
239
+ /** Keyed by agent name. */
240
+ readonly agentResults: Map<string, AgentRunResult>
241
+ readonly totalTokenUsage: TokenUsage
242
+ }
243
+
244
+ // ---------------------------------------------------------------------------
245
+ // Task
246
+ // ---------------------------------------------------------------------------
247
+
248
+ /** Valid states for a {@link Task}. */
249
+ export type TaskStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'blocked'
250
+
251
+ /** A discrete unit of work tracked by the orchestrator. */
252
+ export interface Task {
253
+ readonly id: string
254
+ readonly title: string
255
+ readonly description: string
256
+ status: TaskStatus
257
+ /** Agent name responsible for executing this task. */
258
+ assignee?: string
259
+ /** IDs of tasks that must complete before this one can start. */
260
+ dependsOn?: readonly string[]
261
+ result?: string
262
+ readonly createdAt: Date
263
+ updatedAt: Date
264
+ }
265
+
266
+ // ---------------------------------------------------------------------------
267
+ // Orchestrator
268
+ // ---------------------------------------------------------------------------
269
+
270
+ /** Progress event emitted by the orchestrator during a run. */
271
+ export interface OrchestratorEvent {
272
+ readonly type:
273
+ | 'agent_start'
274
+ | 'agent_complete'
275
+ | 'task_start'
276
+ | 'task_complete'
277
+ | 'message'
278
+ | 'error'
279
+ readonly agent?: string
280
+ readonly task?: string
281
+ readonly data?: unknown
282
+ }
283
+
284
+ /** Top-level configuration for the orchestrator. */
285
+ export interface OrchestratorConfig {
286
+ readonly maxConcurrency?: number
287
+ readonly defaultModel?: string
288
+ readonly defaultProvider?: 'anthropic' | 'openai'
289
+ onProgress?: (event: OrchestratorEvent) => void
290
+ }
291
+
292
+ // ---------------------------------------------------------------------------
293
+ // Memory
294
+ // ---------------------------------------------------------------------------
295
+
296
+ /** A single key-value record stored in a {@link MemoryStore}. */
297
+ export interface MemoryEntry {
298
+ readonly key: string
299
+ readonly value: string
300
+ readonly metadata?: Readonly<Record<string, unknown>>
301
+ readonly createdAt: Date
302
+ }
303
+
304
+ /**
305
+ * Persistent (or in-memory) key-value store shared across agents.
306
+ * Implementations may be backed by Redis, SQLite, or plain objects.
307
+ */
308
+ export interface MemoryStore {
309
+ get(key: string): Promise<MemoryEntry | null>
310
+ set(key: string, value: string, metadata?: Record<string, unknown>): Promise<void>
311
+ list(): Promise<MemoryEntry[]>
312
+ delete(key: string): Promise<void>
313
+ clear(): Promise<void>
314
+ }
315
+
316
+ // ---------------------------------------------------------------------------
317
+ // LLM adapter
318
+ // ---------------------------------------------------------------------------
319
+
320
+ /** Options shared by both chat and streaming calls. */
321
+ export interface LLMChatOptions {
322
+ readonly model: string
323
+ readonly tools?: readonly LLMToolDef[]
324
+ readonly maxTokens?: number
325
+ readonly temperature?: number
326
+ readonly systemPrompt?: string
327
+ readonly abortSignal?: AbortSignal
328
+ }
329
+
330
+ /**
331
+ * Options for streaming calls.
332
+ * Extends {@link LLMChatOptions} without additional fields — the separation
333
+ * exists so callers can type-narrow and implementations can diverge later.
334
+ */
335
+ export interface LLMStreamOptions extends LLMChatOptions {}
336
+
337
+ /**
338
+ * Provider-agnostic interface that every LLM backend must implement.
339
+ *
340
+ * @example
341
+ * ```ts
342
+ * const adapter: LLMAdapter = createAdapter('anthropic')
343
+ * const response = await adapter.chat(messages, { model: 'claude-opus-4-6' })
344
+ * ```
345
+ */
346
+ export interface LLMAdapter {
347
+ /** Human-readable provider name, e.g. `'anthropic'` or `'openai'`. */
348
+ readonly name: string
349
+
350
+ /**
351
+ * Send a chat request and return the complete response.
352
+ * Throws on non-retryable API errors.
353
+ */
354
+ chat(messages: LLMMessage[], options: LLMChatOptions): Promise<LLMResponse>
355
+
356
+ /**
357
+ * Send a chat request and yield {@link StreamEvent}s incrementally.
358
+ * The final event in the sequence always has `type === 'done'` on success,
359
+ * or `type === 'error'` on failure.
360
+ */
361
+ stream(messages: LLMMessage[], options: LLMStreamOptions): AsyncIterable<StreamEvent>
362
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * @fileoverview Shared counting semaphore for concurrency control.
3
+ *
4
+ * Used by both {@link ToolExecutor} and {@link AgentPool} to cap the number of
5
+ * concurrent async operations without requiring any third-party dependencies.
6
+ *
7
+ * This is intentionally self-contained and tuned for Promise/async use —
8
+ * not a general OS-semaphore replacement.
9
+ */
10
+
11
+ // ---------------------------------------------------------------------------
12
+ // Semaphore
13
+ // ---------------------------------------------------------------------------
14
+
15
+ /**
16
+ * Classic counting semaphore for concurrency control.
17
+ *
18
+ * `acquire()` resolves immediately if a slot is free, otherwise queues the
19
+ * caller. `release()` unblocks the next waiter in FIFO order.
20
+ *
21
+ * Node.js is single-threaded, so this is safe without atomics or mutex
22
+ * primitives — the semaphore gates concurrent async operations, not CPU threads.
23
+ */
24
+ export class Semaphore {
25
+ private current = 0
26
+ private readonly queue: Array<() => void> = []
27
+
28
+ /**
29
+ * @param max - Maximum number of concurrent holders. Must be >= 1.
30
+ */
31
+ constructor(private readonly max: number) {
32
+ if (max < 1) {
33
+ throw new RangeError(`Semaphore max must be at least 1, got ${max}`)
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Acquire a slot. Resolves immediately when one is free, or waits until a
39
+ * holder calls `release()`.
40
+ */
41
+ acquire(): Promise<void> {
42
+ if (this.current < this.max) {
43
+ this.current++
44
+ return Promise.resolve()
45
+ }
46
+
47
+ return new Promise<void>(resolve => {
48
+ this.queue.push(resolve)
49
+ })
50
+ }
51
+
52
+ /**
53
+ * Release a previously acquired slot.
54
+ * If callers are queued, the next one is unblocked synchronously.
55
+ */
56
+ release(): void {
57
+ const next = this.queue.shift()
58
+ if (next !== undefined) {
59
+ // A queued caller is waiting — hand the slot directly to it.
60
+ // `current` stays the same: we consumed the slot immediately.
61
+ next()
62
+ } else {
63
+ this.current--
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Run `fn` while holding one slot, automatically releasing it afterward
69
+ * even if `fn` throws.
70
+ */
71
+ async run<T>(fn: () => Promise<T>): Promise<T> {
72
+ await this.acquire()
73
+ try {
74
+ return await fn()
75
+ } finally {
76
+ this.release()
77
+ }
78
+ }
79
+
80
+ /** Number of slots currently in use. */
81
+ get active(): number {
82
+ return this.current
83
+ }
84
+
85
+ /** Number of callers waiting for a slot. */
86
+ get pending(): number {
87
+ return this.queue.length
88
+ }
89
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "lib": ["ES2022"],
7
+ "outDir": "dist",
8
+ "rootDir": "src",
9
+ "declaration": true,
10
+ "declarationMap": true,
11
+ "sourceMap": true,
12
+ "strict": true,
13
+ "esModuleInterop": true,
14
+ "skipLibCheck": true,
15
+ "forceConsistentCasingInFileNames": true,
16
+ "resolveJsonModule": true,
17
+ "isolatedModules": true,
18
+ "noUnusedLocals": false,
19
+ "noUnusedParameters": false,
20
+ "noImplicitReturns": true,
21
+ "noFallthroughCasesInSwitch": true
22
+ },
23
+ "include": ["src/**/*"],
24
+ "exclude": ["node_modules", "dist", "examples", "tests"]
25
+ }