@ahkohd/yagami 0.1.2

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 (81) hide show
  1. package/.beads/.beads-credential-key +1 -0
  2. package/.beads/README.md +81 -0
  3. package/.beads/config.yaml +54 -0
  4. package/.beads/hooks/post-checkout +24 -0
  5. package/.beads/hooks/post-merge +24 -0
  6. package/.beads/hooks/pre-commit +24 -0
  7. package/.beads/hooks/pre-push +24 -0
  8. package/.beads/hooks/prepare-commit-msg +24 -0
  9. package/.beads/metadata.json +7 -0
  10. package/.github/workflows/ci.yml +43 -0
  11. package/.github/workflows/release.yml +115 -0
  12. package/AGENTS.md +150 -0
  13. package/README.md +210 -0
  14. package/biome.json +36 -0
  15. package/config/mcporter.json +8 -0
  16. package/dist/cli/theme.js +202 -0
  17. package/dist/cli/theme.js.map +1 -0
  18. package/dist/cli.js +1883 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/config.js +223 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/daemon.js +745 -0
  23. package/dist/daemon.js.map +1 -0
  24. package/dist/engine/constants.js +131 -0
  25. package/dist/engine/constants.js.map +1 -0
  26. package/dist/engine/deep-research.js +167 -0
  27. package/dist/engine/deep-research.js.map +1 -0
  28. package/dist/engine/defuddle-utils.js +57 -0
  29. package/dist/engine/defuddle-utils.js.map +1 -0
  30. package/dist/engine/github-fetch.js +232 -0
  31. package/dist/engine/github-fetch.js.map +1 -0
  32. package/dist/engine/helpers.js +372 -0
  33. package/dist/engine/helpers.js.map +1 -0
  34. package/dist/engine/limiter.js +75 -0
  35. package/dist/engine/limiter.js.map +1 -0
  36. package/dist/engine/policy.js +313 -0
  37. package/dist/engine/policy.js.map +1 -0
  38. package/dist/engine/runtime-utils.js +65 -0
  39. package/dist/engine/runtime-utils.js.map +1 -0
  40. package/dist/engine/search-discovery.js +275 -0
  41. package/dist/engine/search-discovery.js.map +1 -0
  42. package/dist/engine/url-utils.js +72 -0
  43. package/dist/engine/url-utils.js.map +1 -0
  44. package/dist/engine.js +2030 -0
  45. package/dist/engine.js.map +1 -0
  46. package/dist/mcp.js +282 -0
  47. package/dist/mcp.js.map +1 -0
  48. package/dist/types/cli.js +2 -0
  49. package/dist/types/cli.js.map +1 -0
  50. package/dist/types/config.js +2 -0
  51. package/dist/types/config.js.map +1 -0
  52. package/dist/types/daemon.js +2 -0
  53. package/dist/types/daemon.js.map +1 -0
  54. package/dist/types/engine.js +2 -0
  55. package/dist/types/engine.js.map +1 -0
  56. package/package.json +66 -0
  57. package/packages/pi-yagami-search/README.md +39 -0
  58. package/packages/pi-yagami-search/extensions/yagami-search.ts +273 -0
  59. package/packages/pi-yagami-search/package.json +41 -0
  60. package/src/cli/theme.ts +260 -0
  61. package/src/cli.ts +2226 -0
  62. package/src/config.ts +250 -0
  63. package/src/daemon.ts +990 -0
  64. package/src/engine/constants.ts +147 -0
  65. package/src/engine/deep-research.ts +207 -0
  66. package/src/engine/defuddle-utils.ts +75 -0
  67. package/src/engine/github-fetch.ts +265 -0
  68. package/src/engine/helpers.ts +394 -0
  69. package/src/engine/limiter.ts +97 -0
  70. package/src/engine/policy.ts +392 -0
  71. package/src/engine/runtime-utils.ts +79 -0
  72. package/src/engine/search-discovery.ts +351 -0
  73. package/src/engine/url-utils.ts +86 -0
  74. package/src/engine.ts +2516 -0
  75. package/src/mcp.ts +337 -0
  76. package/src/shims-cli.d.ts +3 -0
  77. package/src/types/cli.ts +7 -0
  78. package/src/types/config.ts +53 -0
  79. package/src/types/daemon.ts +22 -0
  80. package/src/types/engine.ts +194 -0
  81. package/tsconfig.json +18 -0
package/src/mcp.ts ADDED
@@ -0,0 +1,337 @@
1
+ import type { YagamiEngine } from "./engine.js";
2
+
3
+ export type JsonObject = Record<string, unknown>;
4
+
5
+ export const MCP_DEFAULT_PROTOCOL_VERSION = "2025-06-18";
6
+
7
+ export const MCP_SUPPORTED_PROTOCOL_VERSIONS = new Set<string>([MCP_DEFAULT_PROTOCOL_VERSION, "2025-03-26"]);
8
+
9
+ export type McpToolContent = {
10
+ type: "text";
11
+ text: string;
12
+ };
13
+
14
+ export type McpToolCallResult = {
15
+ content: McpToolContent[];
16
+ structuredContent?: unknown;
17
+ isError?: boolean;
18
+ };
19
+
20
+ export type McpToolDefinition = {
21
+ name: string;
22
+ title: string;
23
+ description: string;
24
+ inputSchema: JsonObject;
25
+ };
26
+
27
+ export const MCP_TOOL_DEFINITIONS: McpToolDefinition[] = [
28
+ {
29
+ name: "web_search",
30
+ title: "Yagami Search",
31
+ description: "Search the web for any topic and get clean, ready-to-use content. Returns collated source content.",
32
+ inputSchema: {
33
+ type: "object",
34
+ properties: {
35
+ query: {
36
+ type: "string",
37
+ description: "Web search query",
38
+ },
39
+ },
40
+ required: ["query"],
41
+ additionalProperties: false,
42
+ },
43
+ },
44
+ {
45
+ name: "get_code_context",
46
+ title: "Yagami Code Search",
47
+ description:
48
+ "Find code examples, documentation, and programming solutions from sources like GitHub, Stack Overflow, and official docs.",
49
+ inputSchema: {
50
+ type: "object",
51
+ properties: {
52
+ query: {
53
+ type: "string",
54
+ description: "Search query for code context",
55
+ },
56
+ },
57
+ required: ["query"],
58
+ additionalProperties: false,
59
+ },
60
+ },
61
+ {
62
+ name: "fetch_content",
63
+ title: "Yagami Fetch",
64
+ description: "Fetch and extract full content from a specific URL.",
65
+ inputSchema: {
66
+ type: "object",
67
+ properties: {
68
+ url: {
69
+ type: "string",
70
+ description: "URL to crawl and extract content from",
71
+ },
72
+ maxCharacters: {
73
+ type: "number",
74
+ description: "Maximum characters to extract (default: 3000)",
75
+ },
76
+ },
77
+ required: ["url"],
78
+ additionalProperties: false,
79
+ },
80
+ },
81
+ {
82
+ name: "company_research",
83
+ title: "Yagami Company Research",
84
+ description: "Research a company using Yagami's company-search mode.",
85
+ inputSchema: {
86
+ type: "object",
87
+ properties: {
88
+ companyName: {
89
+ type: "string",
90
+ description: "Name of the company to research",
91
+ },
92
+ },
93
+ required: ["companyName"],
94
+ additionalProperties: false,
95
+ },
96
+ },
97
+ {
98
+ name: "web_search_advanced",
99
+ title: "Yagami Advanced Search",
100
+ description: "Advanced web search with optional domain and category filtering.",
101
+ inputSchema: {
102
+ type: "object",
103
+ properties: {
104
+ query: {
105
+ type: "string",
106
+ description: "Search query",
107
+ },
108
+ includeDomains: {
109
+ type: "array",
110
+ items: { type: "string" },
111
+ description: "Only include results from these domains",
112
+ },
113
+ excludeDomains: {
114
+ type: "array",
115
+ items: { type: "string" },
116
+ description: "Exclude results from these domains",
117
+ },
118
+ category: {
119
+ type: "string",
120
+ description: "Filter results to a specific category",
121
+ },
122
+ },
123
+ required: ["query"],
124
+ additionalProperties: false,
125
+ },
126
+ },
127
+ {
128
+ name: "find_similar",
129
+ title: "Yagami Similar",
130
+ description: "Find pages similar to a given URL.",
131
+ inputSchema: {
132
+ type: "object",
133
+ properties: {
134
+ url: {
135
+ type: "string",
136
+ description: "URL to find similar pages for",
137
+ },
138
+ },
139
+ required: ["url"],
140
+ additionalProperties: false,
141
+ },
142
+ },
143
+ {
144
+ name: "deep_research_start",
145
+ title: "Yagami Deep Research Start",
146
+ description: "Start an async deep research task.",
147
+ inputSchema: {
148
+ type: "object",
149
+ properties: {
150
+ instructions: {
151
+ type: "string",
152
+ description: "Complex research question or detailed instructions",
153
+ },
154
+ effort: {
155
+ type: "string",
156
+ enum: ["fast", "balanced", "thorough"],
157
+ description: "Research effort level",
158
+ },
159
+ },
160
+ required: ["instructions"],
161
+ additionalProperties: false,
162
+ },
163
+ },
164
+ {
165
+ name: "deep_research_check",
166
+ title: "Yagami Deep Research Check",
167
+ description: "Check status and result of a deep research task.",
168
+ inputSchema: {
169
+ type: "object",
170
+ properties: {
171
+ researchId: {
172
+ type: "string",
173
+ description: "Research ID returned by deep_research_start",
174
+ },
175
+ },
176
+ required: ["researchId"],
177
+ additionalProperties: false,
178
+ },
179
+ },
180
+ ];
181
+
182
+ function asObject(value: unknown): JsonObject {
183
+ return typeof value === "object" && value !== null ? (value as JsonObject) : {};
184
+ }
185
+
186
+ function getTrimmedString(value: unknown): string {
187
+ return String(value ?? "").trim();
188
+ }
189
+
190
+ function normalizeStringArray(value: unknown): string[] {
191
+ if (!Array.isArray(value)) return [];
192
+
193
+ return value.map((entry) => String(entry ?? "").trim()).filter(Boolean);
194
+ }
195
+
196
+ function formatToolTextResult(result: unknown): string {
197
+ if (typeof result === "string") return result;
198
+
199
+ const obj = asObject(result);
200
+ if (typeof obj.answer === "string") return obj.answer;
201
+ if (typeof obj.text === "string") return obj.text;
202
+
203
+ return JSON.stringify(result, null, 2);
204
+ }
205
+
206
+ function toMcpToolResult(result: unknown): McpToolCallResult {
207
+ const payload: McpToolCallResult = {
208
+ content: [{ type: "text", text: formatToolTextResult(result) }],
209
+ };
210
+
211
+ if (typeof result === "object" && result !== null) {
212
+ payload.structuredContent = result;
213
+ }
214
+
215
+ return payload;
216
+ }
217
+
218
+ function defaultFindSimilarQuery(url: string): string {
219
+ return `Find web pages similar to ${url}. Focus on same product category, target users, and use-case overlap. Avoid dictionary/synonym pages.`;
220
+ }
221
+
222
+ function assertRequiredString(value: unknown, fieldName: string): string {
223
+ const normalized = getTrimmedString(value);
224
+ if (!normalized) {
225
+ throw new Error(`Missing required field: ${fieldName}`);
226
+ }
227
+ return normalized;
228
+ }
229
+
230
+ export async function executeMcpTool(
231
+ engine: YagamiEngine,
232
+ toolName: string,
233
+ rawArgs: unknown,
234
+ ): Promise<McpToolCallResult> {
235
+ const args = asObject(rawArgs);
236
+
237
+ switch (toolName) {
238
+ case "web_search": {
239
+ const query = assertRequiredString(args.query, "query");
240
+ const result = await engine.enqueueQuery(query, {});
241
+ return toMcpToolResult(result);
242
+ }
243
+
244
+ case "web_search_advanced": {
245
+ const query = assertRequiredString(args.query, "query");
246
+ const result = await engine.enqueueQuery(query, {
247
+ researchPolicy: args,
248
+ });
249
+ return toMcpToolResult(result);
250
+ }
251
+
252
+ case "get_code_context": {
253
+ const query = assertRequiredString(args.query, "query");
254
+ const result = await engine.enqueueQuery(query, {
255
+ researchPolicy: {
256
+ mode: "code",
257
+ ...args,
258
+ },
259
+ });
260
+ return toMcpToolResult(result);
261
+ }
262
+
263
+ case "fetch_content": {
264
+ const url = assertRequiredString(args.url, "url");
265
+ const result = await engine.enqueueOperation(() =>
266
+ engine.fetchContent(url, {
267
+ maxCharacters: args.maxCharacters,
268
+ noCache: args.noCache,
269
+ }),
270
+ );
271
+ return toMcpToolResult(result);
272
+ }
273
+
274
+ case "company_research": {
275
+ const companyName = assertRequiredString(args.companyName ?? args.query, "companyName");
276
+ const query = getTrimmedString(args.query || companyName);
277
+
278
+ const result = await engine.enqueueQuery(query, {
279
+ researchPolicy: {
280
+ mode: "company",
281
+ ...args,
282
+ companyName,
283
+ },
284
+ });
285
+ return toMcpToolResult(result);
286
+ }
287
+
288
+ case "find_similar": {
289
+ const url = assertRequiredString(args.url, "url");
290
+ const query = getTrimmedString(args.query || defaultFindSimilarQuery(url));
291
+ const seedUrls = [url, ...normalizeStringArray(args.seedUrls)];
292
+
293
+ const result = await engine.enqueueQuery(query, {
294
+ researchPolicy: {
295
+ mode: "similar",
296
+ ...args,
297
+ seedUrls,
298
+ },
299
+ });
300
+ return toMcpToolResult(result);
301
+ }
302
+
303
+ case "deep_research_start": {
304
+ const instructions = assertRequiredString(args.instructions, "instructions");
305
+
306
+ if (args.model !== undefined) {
307
+ throw new Error("Field 'model' has been removed. Use 'effort' (fast|balanced|thorough).");
308
+ }
309
+
310
+ const result = await engine.deepResearchStart(instructions, {
311
+ effort: args.effort,
312
+ });
313
+
314
+ return {
315
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
316
+ structuredContent: result,
317
+ };
318
+ }
319
+
320
+ case "deep_research_check": {
321
+ const researchId = assertRequiredString(args.researchId, "researchId");
322
+ const result = await engine.deepResearchCheck(researchId);
323
+
324
+ return {
325
+ content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
326
+ structuredContent: result,
327
+ };
328
+ }
329
+
330
+ default:
331
+ throw new Error(`Unknown tool: ${toolName}`);
332
+ }
333
+ }
334
+
335
+ export function isKnownMcpTool(toolName: string): boolean {
336
+ return MCP_TOOL_DEFINITIONS.some((tool) => tool.name === toolName);
337
+ }
@@ -0,0 +1,3 @@
1
+ declare module "cli-markdown" {
2
+ export default function cliMarkdown(markdown: string, options?: { width?: number }): string;
3
+ }
@@ -0,0 +1,7 @@
1
+ export interface ThemePreviewJson {
2
+ theme: string;
3
+ configFile: string;
4
+ overrides: Record<string, string>;
5
+ resolvedTokens: Record<string, string>;
6
+ samples: Record<string, string>;
7
+ }
@@ -0,0 +1,53 @@
1
+ export type ThemeName = "ansi" | "none";
2
+
3
+ export type ThemeTokenName = "domain" | "title" | "duration" | "error" | "dim" | "cyan" | "bold";
4
+
5
+ export type ToolExecutionMode = "sequential" | "parallel";
6
+
7
+ export type LlmApi = "openai-completions" | "anthropic-messages";
8
+
9
+ export type SearchEnginePreset = "duckduckgo" | "bing" | "google" | "brave" | "custom";
10
+
11
+ export interface RuntimeConfig {
12
+ runtimeDir: string;
13
+ configFile: string;
14
+ host: string;
15
+ port: number;
16
+ daemonUrl: string;
17
+
18
+ pidFile: string;
19
+ logFile: string;
20
+
21
+ llmApi: LlmApi;
22
+ llmBaseUrl: string;
23
+ llmApiKey: string;
24
+ llmModel: string;
25
+
26
+ searchEngine: SearchEnginePreset;
27
+ searchEngineUrlTemplate: string;
28
+
29
+ lightpandaCdpUrl: string;
30
+ lightpandaHost: string;
31
+ lightpandaPort: number;
32
+ lightpandaAutoStart: boolean;
33
+ lightpandaAutoStop: boolean;
34
+
35
+ browseLinkTimeoutMs: number;
36
+ queryTimeoutMs: number;
37
+
38
+ cacheTtlMs: number;
39
+ maxHtmlChars: number;
40
+ maxMarkdownChars: number;
41
+ maxDocuments: number;
42
+
43
+ operationConcurrency: number;
44
+ browseConcurrency: number;
45
+
46
+ researchMaxPages: number;
47
+ researchMaxHops: number;
48
+ researchSameDomainOnly: boolean;
49
+
50
+ toolExecutionMode: ToolExecutionMode;
51
+ theme: ThemeName;
52
+ themeTokens: Record<string, string>;
53
+ }
@@ -0,0 +1,22 @@
1
+ export interface NdjsonStart {
2
+ type: "start";
3
+ pid: number;
4
+ startedAt: number;
5
+ }
6
+
7
+ export interface NdjsonProgress {
8
+ type: "progress";
9
+ event: Record<string, unknown>;
10
+ }
11
+
12
+ export interface NdjsonResult {
13
+ type: "result";
14
+ result: Record<string, unknown>;
15
+ }
16
+
17
+ export interface NdjsonError {
18
+ type: "error";
19
+ error: string;
20
+ }
21
+
22
+ export type NdjsonEvent = NdjsonStart | NdjsonProgress | NdjsonResult | NdjsonError;
@@ -0,0 +1,194 @@
1
+ export type ProgressEventType =
2
+ | "query_start"
3
+ | "turn_start"
4
+ | "first_token"
5
+ | "assistant_delta"
6
+ | "tool_start"
7
+ | "tool_end"
8
+ | "turn_end"
9
+ | "query_end";
10
+
11
+ export interface ProgressEventBase {
12
+ type: ProgressEventType;
13
+ timestamp?: number;
14
+ }
15
+
16
+ export interface AssistantDeltaProgressEvent extends ProgressEventBase {
17
+ type: "assistant_delta";
18
+ turn: number;
19
+ message: number;
20
+ delta: string;
21
+ }
22
+
23
+ export interface QueryResult {
24
+ query: string;
25
+ answer: string;
26
+ findings?: SearchResultEntry[];
27
+ citations: string[];
28
+ durationMs: number;
29
+ model: string;
30
+ createdAt?: string;
31
+ }
32
+
33
+ export interface DeepResearchStartResult {
34
+ success: true;
35
+ researchId: string;
36
+ effort: "fast" | "balanced" | "thorough";
37
+ status: "pending";
38
+ message: string;
39
+ }
40
+
41
+ export interface DeepResearchCheckResult {
42
+ success?: boolean;
43
+ status: "pending" | "running" | "completed" | "failed";
44
+ effort: "fast" | "balanced" | "thorough";
45
+ report?: string;
46
+ citations?: string[];
47
+ costDollars?: number;
48
+ durationMs?: number;
49
+ error?: string;
50
+ message?: string;
51
+ }
52
+
53
+ export type DeepEffort = "fast" | "balanced" | "thorough";
54
+
55
+ export type ResearchMode = "general" | "code" | "company" | "similar" | "deep";
56
+
57
+ export type RetrievalType = "auto" | "fast" | "neural";
58
+
59
+ export type LivecrawlMode = "never" | "fallback" | "always" | "preferred";
60
+
61
+ export type SearchCategory =
62
+ | "company"
63
+ | "research paper"
64
+ | "news"
65
+ | "pdf"
66
+ | "github"
67
+ | "tweet"
68
+ | "personal site"
69
+ | "people"
70
+ | "financial report";
71
+
72
+ export interface RawResearchPolicy {
73
+ mode?: unknown;
74
+ type?: unknown;
75
+ livecrawl?: unknown;
76
+ category?: unknown;
77
+ country?: unknown;
78
+ includeDomains?: unknown;
79
+ excludeDomains?: unknown;
80
+ includeText?: unknown;
81
+ excludeText?: unknown;
82
+ preferredDomains?: unknown;
83
+ seedUrls?: unknown;
84
+ customInstruction?: unknown;
85
+ instructions?: unknown;
86
+ instruction?: unknown;
87
+ numResults?: unknown;
88
+ maxHops?: unknown;
89
+ startPublishedDate?: unknown;
90
+ endPublishedDate?: unknown;
91
+ sites?: unknown;
92
+ companyName?: unknown;
93
+ query?: unknown;
94
+ [key: string]: unknown;
95
+ }
96
+
97
+ export interface CountryProfile {
98
+ label: string;
99
+ domains: string[];
100
+ seedUrls: (query: string) => string[];
101
+ }
102
+
103
+ export interface CategoryProfile {
104
+ queryHint: string;
105
+ includeDomains: string[];
106
+ includeText: string[];
107
+ }
108
+
109
+ export interface NormalizedResearchPolicy {
110
+ advanced: boolean;
111
+ mode: ResearchMode;
112
+ type: RetrievalType;
113
+ livecrawl: LivecrawlMode;
114
+ category: string | null;
115
+ country: string | null;
116
+ countryLabel: string | null;
117
+ includeDomains: string[];
118
+ excludeDomains: string[];
119
+ includeText: string[];
120
+ excludeText: string[];
121
+ preferredDomains: string[];
122
+ seedUrls: string[];
123
+ customInstruction: string | null;
124
+ requestedResults: number;
125
+ requestedMaxPages: number | null;
126
+ requestedMaxHops: number | null;
127
+ startPublishedDate: string | null;
128
+ endPublishedDate: string | null;
129
+ startDate: Date | null;
130
+ endDate: Date | null;
131
+ }
132
+
133
+ export interface EngineResearchConfig {
134
+ researchMaxPages: number;
135
+ researchMaxHops: number;
136
+ researchSameDomainOnly: boolean;
137
+ }
138
+
139
+ export interface ResearchPlan {
140
+ maxPages: number;
141
+ maxHops: number;
142
+ sameDomainOnly: boolean;
143
+ seedUrls: string[];
144
+ seedHosts: Set<string>;
145
+ policy: NormalizedResearchPolicy;
146
+ }
147
+
148
+ export interface SearchResultEntry {
149
+ url: string;
150
+ title?: string;
151
+ snippet?: string;
152
+ author?: string;
153
+ published?: string;
154
+ content?: string;
155
+ wordCount?: number;
156
+ status?: number;
157
+ cache?: Record<string, unknown>;
158
+ rank?: number;
159
+ domain?: string;
160
+ error?: string;
161
+ }
162
+
163
+ export interface WebSearchLikeResult {
164
+ results: SearchResultEntry[];
165
+ [key: string]: unknown;
166
+ }
167
+
168
+ export type AgentThinkingLevel = "off" | "minimal" | "low" | "medium" | "high" | "xhigh";
169
+
170
+ export interface DeepEffortProfile {
171
+ numResults: number;
172
+ maxHops: number;
173
+ refinementPasses: number;
174
+ minPrimarySources: number;
175
+ thinkingLevel: AgentThinkingLevel;
176
+ queryTimeoutMs: number;
177
+ textMaxCharacters: number;
178
+ contextMaxCharacters: number;
179
+ }
180
+
181
+ export interface DeepResearchTaskRecord {
182
+ researchId: string;
183
+ status: "pending" | "running" | "completed" | "failed";
184
+ instructions: string;
185
+ effort: DeepEffort;
186
+ createdAt: string;
187
+ startedAt: string | null;
188
+ completedAt: string | null;
189
+ durationMs: number | null;
190
+ report: string | null;
191
+ citations: string[];
192
+ error: string | null;
193
+ costDollars: number;
194
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,18 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "lib": ["ES2022"],
7
+ "strict": true,
8
+ "skipLibCheck": true,
9
+ "noEmitOnError": true,
10
+ "sourceMap": true,
11
+ "declaration": false,
12
+ "outDir": "dist",
13
+ "rootDir": "src",
14
+ "types": ["node"],
15
+ "resolveJsonModule": true
16
+ },
17
+ "include": ["src/**/*.ts", "src/**/*.d.ts"]
18
+ }