task-o-matic 0.0.9 → 0.0.11
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.
- package/dist/cli/display/progress.d.ts +1 -1
- package/dist/cli/display/progress.d.ts.map +1 -1
- package/dist/cli/display/progress.js +16 -13
- package/dist/commands/benchmark.js +70 -2
- package/dist/commands/init.js +48 -27
- package/dist/commands/prd.d.ts.map +1 -1
- package/dist/commands/prd.js +201 -0
- package/dist/commands/tasks/execute-loop.d.ts.map +1 -1
- package/dist/commands/tasks/execute-loop.js +10 -0
- package/dist/commands/tasks/execute.d.ts.map +1 -1
- package/dist/commands/tasks/execute.js +4 -0
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +56 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/lib/ai-service/ai-operations.d.ts +13 -10
- package/dist/lib/ai-service/ai-operations.d.ts.map +1 -1
- package/dist/lib/ai-service/ai-operations.js +35 -995
- package/dist/lib/ai-service/base-operations.d.ts +13 -0
- package/dist/lib/ai-service/base-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/base-operations.js +79 -0
- package/dist/lib/ai-service/documentation-operations.d.ts +18 -0
- package/dist/lib/ai-service/documentation-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/documentation-operations.js +291 -0
- package/dist/lib/ai-service/prd-operations.d.ts +14 -0
- package/dist/lib/ai-service/prd-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/prd-operations.js +405 -0
- package/dist/lib/ai-service/task-operations.d.ts +12 -0
- package/dist/lib/ai-service/task-operations.d.ts.map +1 -0
- package/dist/lib/ai-service/task-operations.js +225 -0
- package/dist/lib/benchmark/registry.d.ts.map +1 -1
- package/dist/lib/benchmark/registry.js +127 -0
- package/dist/lib/better-t-stack-cli.d.ts +4 -1
- package/dist/lib/better-t-stack-cli.d.ts.map +1 -1
- package/dist/lib/better-t-stack-cli.js +126 -5
- package/dist/lib/config.d.ts +13 -6
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +90 -48
- package/dist/lib/context-builder.d.ts +13 -1
- package/dist/lib/context-builder.d.ts.map +1 -1
- package/dist/lib/context-builder.js +68 -36
- package/dist/lib/executors/claude-code-executor.d.ts +5 -2
- package/dist/lib/executors/claude-code-executor.d.ts.map +1 -1
- package/dist/lib/executors/claude-code-executor.js +30 -3
- package/dist/lib/executors/codex-executor.d.ts +5 -2
- package/dist/lib/executors/codex-executor.d.ts.map +1 -1
- package/dist/lib/executors/codex-executor.js +30 -3
- package/dist/lib/executors/executor-factory.d.ts +2 -2
- package/dist/lib/executors/executor-factory.d.ts.map +1 -1
- package/dist/lib/executors/executor-factory.js +5 -5
- package/dist/lib/executors/gemini-executor.d.ts +5 -2
- package/dist/lib/executors/gemini-executor.d.ts.map +1 -1
- package/dist/lib/executors/gemini-executor.js +30 -3
- package/dist/lib/executors/opencode-executor.d.ts +5 -2
- package/dist/lib/executors/opencode-executor.d.ts.map +1 -1
- package/dist/lib/executors/opencode-executor.js +30 -7
- package/dist/lib/index.d.ts +5 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +7 -1
- package/dist/lib/prompt-builder.d.ts.map +1 -1
- package/dist/lib/prompt-builder.js +1 -0
- package/dist/lib/storage/file-system.d.ts +3 -7
- package/dist/lib/storage/file-system.d.ts.map +1 -1
- package/dist/lib/storage/file-system.js +50 -230
- package/dist/lib/storage/storage-callbacks.d.ts +17 -0
- package/dist/lib/storage/storage-callbacks.d.ts.map +1 -0
- package/dist/lib/storage/storage-callbacks.js +94 -0
- package/dist/lib/task-execution.d.ts.map +1 -1
- package/dist/lib/task-execution.js +16 -9
- package/dist/lib/task-loop-execution.d.ts.map +1 -1
- package/dist/lib/task-loop-execution.js +207 -8
- package/dist/prompts/index.d.ts +2 -0
- package/dist/prompts/index.d.ts.map +1 -1
- package/dist/prompts/index.js +2 -0
- package/dist/prompts/prd-combination.d.ts +2 -0
- package/dist/prompts/prd-combination.d.ts.map +1 -0
- package/dist/prompts/prd-combination.js +35 -0
- package/dist/prompts/prd-generation.d.ts +2 -0
- package/dist/prompts/prd-generation.d.ts.map +1 -0
- package/dist/prompts/prd-generation.js +49 -0
- package/dist/services/prd.d.ts +43 -0
- package/dist/services/prd.d.ts.map +1 -1
- package/dist/services/prd.js +121 -0
- package/dist/services/workflow-ai-assistant.d.ts.map +1 -1
- package/dist/services/workflow-ai-assistant.js +1 -40
- package/dist/services/workflow.d.ts +10 -0
- package/dist/services/workflow.d.ts.map +1 -1
- package/dist/services/workflow.js +118 -40
- package/dist/test/hooks.test.js +19 -10
- package/dist/test/integration/callbacks.test.d.ts +2 -0
- package/dist/test/integration/callbacks.test.d.ts.map +1 -0
- package/dist/test/integration/callbacks.test.js +64 -0
- package/dist/test/task-loop-git.test.js +33 -0
- package/dist/test/validation.test.d.ts +2 -0
- package/dist/test/validation.test.d.ts.map +1 -0
- package/dist/test/validation.test.js +22 -0
- package/dist/types/callbacks.d.ts +9 -6
- package/dist/types/callbacks.d.ts.map +1 -1
- package/dist/types/index.d.ts +17 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/workflow-options.d.ts +7 -0
- package/dist/types/workflow-options.d.ts.map +1 -1
- package/dist/utils/ai-service-factory.d.ts +15 -1
- package/dist/utils/ai-service-factory.d.ts.map +1 -1
- package/dist/utils/ai-service-factory.js +29 -1
- package/dist/utils/streaming-options.d.ts +1 -1
- package/dist/utils/streaming-options.d.ts.map +1 -1
- package/dist/utils/streaming-options.js +31 -18
- package/docs/agents/cli.md +191 -0
- package/package.json +3 -2
|
@@ -83,6 +83,133 @@ class BenchmarkRegistry {
|
|
|
83
83
|
return await workflow_benchmark_1.workflowBenchmarkService.executeWorkflow(input, aiOptions, streamingOptions);
|
|
84
84
|
},
|
|
85
85
|
});
|
|
86
|
+
// Task Create with AI Enhancement
|
|
87
|
+
this.register({
|
|
88
|
+
id: "task-create",
|
|
89
|
+
name: "Task Creation (AI-Enhanced)",
|
|
90
|
+
description: "Create a new task with AI enhancement using Context7 documentation",
|
|
91
|
+
validateInput: (input) => typeof input.title === "string" && input.title.length > 0,
|
|
92
|
+
execute: async (input, aiOptions, streamingOptions) => {
|
|
93
|
+
return await taskService.createTask({
|
|
94
|
+
title: input.title,
|
|
95
|
+
content: input.content,
|
|
96
|
+
parentId: input.parentId,
|
|
97
|
+
effort: input.effort,
|
|
98
|
+
aiEnhance: true, // Always use AI enhancement for benchmarking
|
|
99
|
+
aiOptions,
|
|
100
|
+
streamingOptions,
|
|
101
|
+
});
|
|
102
|
+
},
|
|
103
|
+
});
|
|
104
|
+
// Task Enhancement
|
|
105
|
+
this.register({
|
|
106
|
+
id: "task-enhance",
|
|
107
|
+
name: "Task Enhancement",
|
|
108
|
+
description: "Enhance an existing task with AI using Context7 documentation",
|
|
109
|
+
validateInput: (input) => typeof input.taskId === "string",
|
|
110
|
+
execute: async (input, aiOptions, streamingOptions) => {
|
|
111
|
+
return await taskService.enhanceTask(input.taskId, aiOptions, streamingOptions);
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
// Task Planning
|
|
115
|
+
this.register({
|
|
116
|
+
id: "task-plan",
|
|
117
|
+
name: "Task Planning",
|
|
118
|
+
description: "Create a detailed implementation plan for a task",
|
|
119
|
+
validateInput: (input) => typeof input.taskId === "string",
|
|
120
|
+
execute: async (input, aiOptions, streamingOptions) => {
|
|
121
|
+
return await taskService.planTask(input.taskId, aiOptions, streamingOptions);
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
// Task Documentation
|
|
125
|
+
this.register({
|
|
126
|
+
id: "task-document",
|
|
127
|
+
name: "Task Documentation",
|
|
128
|
+
description: "Analyze and generate documentation for a task",
|
|
129
|
+
validateInput: (input) => typeof input.taskId === "string",
|
|
130
|
+
execute: async (input, aiOptions, streamingOptions) => {
|
|
131
|
+
return await taskService.documentTask(input.taskId, input.force || false, aiOptions, streamingOptions);
|
|
132
|
+
},
|
|
133
|
+
});
|
|
134
|
+
// PRD Creation
|
|
135
|
+
this.register({
|
|
136
|
+
id: "prd-create",
|
|
137
|
+
name: "PRD Creation",
|
|
138
|
+
description: "Generate a Product Requirements Document from a description",
|
|
139
|
+
validateInput: (input) => typeof input.description === "string" && input.description.length > 0,
|
|
140
|
+
execute: async (input, aiOptions, streamingOptions) => {
|
|
141
|
+
return await prd_1.prdService.generatePRD({
|
|
142
|
+
description: input.description,
|
|
143
|
+
outputDir: input.outputDir,
|
|
144
|
+
filename: input.filename,
|
|
145
|
+
aiOptions,
|
|
146
|
+
streamingOptions,
|
|
147
|
+
callbacks: {},
|
|
148
|
+
});
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
// PRD Combine
|
|
152
|
+
this.register({
|
|
153
|
+
id: "prd-combine",
|
|
154
|
+
name: "PRD Combination",
|
|
155
|
+
description: "Combine multiple PRD files into a single master PRD",
|
|
156
|
+
validateInput: (input) => Array.isArray(input.prds) &&
|
|
157
|
+
input.prds.length > 0 &&
|
|
158
|
+
typeof input.originalDescription === "string",
|
|
159
|
+
execute: async (input, aiOptions, streamingOptions) => {
|
|
160
|
+
return await prd_1.prdService.combinePRDs({
|
|
161
|
+
prds: input.prds,
|
|
162
|
+
originalDescription: input.originalDescription,
|
|
163
|
+
outputDir: input.outputDir,
|
|
164
|
+
filename: input.filename,
|
|
165
|
+
aiOptions,
|
|
166
|
+
streamingOptions,
|
|
167
|
+
callbacks: {},
|
|
168
|
+
});
|
|
169
|
+
},
|
|
170
|
+
});
|
|
171
|
+
// PRD Question Generation
|
|
172
|
+
this.register({
|
|
173
|
+
id: "prd-question",
|
|
174
|
+
name: "PRD Question Generation",
|
|
175
|
+
description: "Generate clarifying questions for a PRD",
|
|
176
|
+
validateInput: (input) => typeof input.file === "string" && input.file.length > 0,
|
|
177
|
+
execute: async (input, aiOptions, streamingOptions) => {
|
|
178
|
+
return await prd_1.prdService.generateQuestions({
|
|
179
|
+
file: input.file,
|
|
180
|
+
workingDirectory: input.workingDirectory,
|
|
181
|
+
enableFilesystemTools: input.tools,
|
|
182
|
+
promptOverride: input.prompt,
|
|
183
|
+
messageOverride: input.message,
|
|
184
|
+
aiOptions,
|
|
185
|
+
streamingOptions,
|
|
186
|
+
callbacks: {},
|
|
187
|
+
});
|
|
188
|
+
},
|
|
189
|
+
});
|
|
190
|
+
// PRD Refinement
|
|
191
|
+
this.register({
|
|
192
|
+
id: "prd-refine",
|
|
193
|
+
name: "PRD Refinement",
|
|
194
|
+
description: "Refine a PRD by generating questions and incorporating answers",
|
|
195
|
+
validateInput: (input) => typeof input.file === "string" &&
|
|
196
|
+
input.file.length > 0 &&
|
|
197
|
+
typeof input.questionMode === "string" &&
|
|
198
|
+
(input.questionMode === "user" || input.questionMode === "ai"),
|
|
199
|
+
execute: async (input, aiOptions, streamingOptions) => {
|
|
200
|
+
return await prd_1.prdService.refinePRDWithQuestions({
|
|
201
|
+
file: input.file,
|
|
202
|
+
questionMode: input.questionMode,
|
|
203
|
+
answers: input.answers,
|
|
204
|
+
questionAIOptions: input.questionAIOptions,
|
|
205
|
+
workingDirectory: input.workingDirectory,
|
|
206
|
+
enableFilesystemTools: input.tools,
|
|
207
|
+
aiOptions,
|
|
208
|
+
streamingOptions,
|
|
209
|
+
callbacks: {},
|
|
210
|
+
});
|
|
211
|
+
},
|
|
212
|
+
});
|
|
86
213
|
}
|
|
87
214
|
}
|
|
88
215
|
exports.BenchmarkRegistry = BenchmarkRegistry;
|
|
@@ -7,6 +7,8 @@ export declare class BetterTStackService {
|
|
|
7
7
|
}>;
|
|
8
8
|
private convertToAPIConfig;
|
|
9
9
|
private saveBTSConfig;
|
|
10
|
+
private addCheckTypesScript;
|
|
11
|
+
private copyDocumentation;
|
|
10
12
|
}
|
|
11
13
|
export interface InitOptions {
|
|
12
14
|
projectName?: string;
|
|
@@ -18,7 +20,7 @@ export interface InitOptions {
|
|
|
18
20
|
addons?: string[];
|
|
19
21
|
runtime?: string;
|
|
20
22
|
api?: string;
|
|
21
|
-
|
|
23
|
+
payment?: string;
|
|
22
24
|
orm?: string;
|
|
23
25
|
dbSetup?: string;
|
|
24
26
|
packageManager?: string;
|
|
@@ -27,6 +29,7 @@ export interface InitOptions {
|
|
|
27
29
|
serverDeploy?: string;
|
|
28
30
|
noInstall?: boolean;
|
|
29
31
|
examples?: string[];
|
|
32
|
+
includeDocs?: boolean;
|
|
30
33
|
}
|
|
31
34
|
export declare function runBetterTStackCLI(options: InitOptions, workingDirectory?: string): Promise<{
|
|
32
35
|
success: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"better-t-stack-cli.d.ts","sourceRoot":"","sources":["../../src/lib/better-t-stack-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAKrC,qBAAa,mBAAmB;IACxB,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,EACjB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;
|
|
1
|
+
{"version":3,"file":"better-t-stack-cli.d.ts","sourceRoot":"","sources":["../../src/lib/better-t-stack-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAKrC,qBAAa,mBAAmB;IACxB,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,EACjB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAqEF,OAAO,CAAC,kBAAkB;YA0BZ,aAAa;YAiCb,mBAAmB;YAiCnB,iBAAiB;CA+ChC;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,WAAW,EACpB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwCtE"}
|
|
@@ -1,4 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.BetterTStackService = void 0;
|
|
4
37
|
exports.runBetterTStackCLI = runBetterTStackCLI;
|
|
@@ -28,7 +61,21 @@ class BetterTStackService {
|
|
|
28
61
|
}
|
|
29
62
|
if (result.success) {
|
|
30
63
|
// Save configuration
|
|
31
|
-
await this.saveBTSConfig(name, config);
|
|
64
|
+
await this.saveBTSConfig(name, config, result.projectDirectory);
|
|
65
|
+
// Post-bootstrap enhancements
|
|
66
|
+
try {
|
|
67
|
+
const projectDir = result.projectDirectory;
|
|
68
|
+
// 1. Add check-types script to packages
|
|
69
|
+
await this.addCheckTypesScript(projectDir);
|
|
70
|
+
// 2. Copy documentation if requested
|
|
71
|
+
if (config.includeDocs) {
|
|
72
|
+
await this.copyDocumentation(projectDir);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error("⚠ Post-bootstrap enhancements failed:", error);
|
|
77
|
+
// Don't fail the whole process, just log warning
|
|
78
|
+
}
|
|
32
79
|
return {
|
|
33
80
|
success: true,
|
|
34
81
|
projectPath: result.relativePath,
|
|
@@ -72,10 +119,17 @@ class BetterTStackService {
|
|
|
72
119
|
? config.examples
|
|
73
120
|
: undefined,
|
|
74
121
|
disableAnalytics: true,
|
|
122
|
+
payments: config.payments,
|
|
75
123
|
};
|
|
76
124
|
}
|
|
77
|
-
async saveBTSConfig(name, config) {
|
|
78
|
-
const taskOMaticDir =
|
|
125
|
+
async saveBTSConfig(name, config, projectPath) {
|
|
126
|
+
const taskOMaticDir = projectPath
|
|
127
|
+
? (0, path_1.join)(projectPath, ".task-o-matic")
|
|
128
|
+
: config_1.configManager.getTaskOMaticDir();
|
|
129
|
+
// Ensure directory exists if we're using a specific project path
|
|
130
|
+
if (projectPath && !require("fs").existsSync(taskOMaticDir)) {
|
|
131
|
+
require("fs").mkdirSync(taskOMaticDir, { recursive: true });
|
|
132
|
+
}
|
|
79
133
|
const configData = JSON.stringify({
|
|
80
134
|
...config,
|
|
81
135
|
projectName: config.projectName || name,
|
|
@@ -88,6 +142,72 @@ class BetterTStackService {
|
|
|
88
142
|
const stackConfigPath = (0, path_1.join)(taskOMaticDir, "stack.json");
|
|
89
143
|
(0, fs_1.writeFileSync)(stackConfigPath, configData);
|
|
90
144
|
}
|
|
145
|
+
async addCheckTypesScript(projectDir) {
|
|
146
|
+
const { glob } = await Promise.resolve().then(() => __importStar(require("glob")));
|
|
147
|
+
const { readFileSync, writeFileSync } = await Promise.resolve().then(() => __importStar(require("fs")));
|
|
148
|
+
console.log("🔍 Adding check-types scripts to packages...");
|
|
149
|
+
// Find all package.json files in apps and backend directories
|
|
150
|
+
const packageFiles = await glob(["apps/*/package.json", "backend/*/package.json"], { cwd: projectDir, absolute: true });
|
|
151
|
+
for (const file of packageFiles) {
|
|
152
|
+
try {
|
|
153
|
+
const content = JSON.parse(readFileSync(file, "utf-8"));
|
|
154
|
+
if (!content.scripts) {
|
|
155
|
+
content.scripts = {};
|
|
156
|
+
}
|
|
157
|
+
// Add check-types script if not present
|
|
158
|
+
if (!content.scripts["check-types"]) {
|
|
159
|
+
content.scripts["check-types"] = "tsc --noEmit";
|
|
160
|
+
writeFileSync(file, JSON.stringify(content, null, 2) + "\n");
|
|
161
|
+
console.log(` ✓ Added check-types to ${file.split("/").slice(-3).join("/")}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (err) {
|
|
165
|
+
console.warn(` ⚠ Failed to update ${file}:`, err);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
async copyDocumentation(projectDir) {
|
|
170
|
+
const { copyFileSync, mkdirSync, existsSync } = await Promise.resolve().then(() => __importStar(require("fs")));
|
|
171
|
+
const { resolve, dirname } = await Promise.resolve().then(() => __importStar(require("path")));
|
|
172
|
+
console.log("📚 Copying documentation...");
|
|
173
|
+
try {
|
|
174
|
+
// Source: docs/agents/cli.md in the current package
|
|
175
|
+
// We need to find where the package is installed or running from
|
|
176
|
+
// Assuming we are running from dist/lib/better-t-stack-cli.js or similar
|
|
177
|
+
// The docs should be in ../../docs/agents/cli.md relative to this file's location in source
|
|
178
|
+
// Or in the package root if installed
|
|
179
|
+
let sourcePath = resolve(__dirname, "../../../docs/agents/cli.md");
|
|
180
|
+
// Check if we're in dist
|
|
181
|
+
if (!existsSync(sourcePath)) {
|
|
182
|
+
// Try to find it relative to package root (cwd when running dev)
|
|
183
|
+
sourcePath = resolve(process.cwd(), "docs/agents/cli.md");
|
|
184
|
+
}
|
|
185
|
+
if (!existsSync(sourcePath)) {
|
|
186
|
+
// Try to find it in node_modules if installed as dependency
|
|
187
|
+
try {
|
|
188
|
+
sourcePath = require.resolve("task-o-matic/docs/agents/cli.md");
|
|
189
|
+
}
|
|
190
|
+
catch (e) {
|
|
191
|
+
// Ignore
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (existsSync(sourcePath)) {
|
|
195
|
+
const destPath = (0, path_1.join)(projectDir, "docs/task-o-matic.md");
|
|
196
|
+
const destDir = dirname(destPath);
|
|
197
|
+
if (!existsSync(destDir)) {
|
|
198
|
+
mkdirSync(destDir, { recursive: true });
|
|
199
|
+
}
|
|
200
|
+
copyFileSync(sourcePath, destPath);
|
|
201
|
+
console.log(` ✓ Copied documentation to docs/task-o-matic.md`);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
console.warn(" ⚠ Could not locate source documentation file");
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
console.warn(" ⚠ Failed to copy documentation:", err);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
91
211
|
}
|
|
92
212
|
exports.BetterTStackService = BetterTStackService;
|
|
93
213
|
async function runBetterTStackCLI(options, workingDirectory) {
|
|
@@ -103,9 +223,9 @@ async function runBetterTStackCLI(options, workingDirectory) {
|
|
|
103
223
|
: options.database || "sqlite",
|
|
104
224
|
auth: options.noAuth ? "none" : "better-auth",
|
|
105
225
|
addons: options.addons || ["turborepo"],
|
|
106
|
-
runtime: isConvex ? "none" : options.runtime || "node",
|
|
226
|
+
runtime: isConvex || backend === "self" ? "none" : options.runtime || "node",
|
|
107
227
|
api: options.api || "none",
|
|
108
|
-
payments: options.
|
|
228
|
+
payments: options.payment || "none",
|
|
109
229
|
orm: isConvex ? "none" : options.orm || "drizzle",
|
|
110
230
|
dbSetup: isConvex ? "none" : options.dbSetup || "none",
|
|
111
231
|
packageManager: options.packageManager || "npm",
|
|
@@ -114,6 +234,7 @@ async function runBetterTStackCLI(options, workingDirectory) {
|
|
|
114
234
|
serverDeploy: options.serverDeploy || "none",
|
|
115
235
|
install: !options.noInstall,
|
|
116
236
|
examples: options.examples || [],
|
|
237
|
+
includeDocs: options.includeDocs,
|
|
117
238
|
};
|
|
118
239
|
const result = await btsService.createProject(options.projectName || options.name || "", btsConfig, workingDirectory);
|
|
119
240
|
return {
|
package/dist/lib/config.d.ts
CHANGED
|
@@ -3,21 +3,28 @@ export interface Config {
|
|
|
3
3
|
ai: AIConfig;
|
|
4
4
|
workingDirectory?: string;
|
|
5
5
|
}
|
|
6
|
+
export interface ConfigCallbacks {
|
|
7
|
+
read: (key: string) => Promise<string | null>;
|
|
8
|
+
write: (key: string, value: string) => Promise<void>;
|
|
9
|
+
getEnv: (key: string) => string | undefined;
|
|
10
|
+
}
|
|
11
|
+
export declare function createDefaultConfigCallbacks(workingDir?: string): ConfigCallbacks;
|
|
6
12
|
export declare class ConfigManager {
|
|
7
13
|
private config;
|
|
8
14
|
private customWorkingDir;
|
|
9
|
-
|
|
15
|
+
private callbacks;
|
|
16
|
+
constructor(callbacks?: ConfigCallbacks, workingDirectory?: string);
|
|
10
17
|
setWorkingDirectory(dir: string): void;
|
|
18
|
+
setCallbacks(callbacks: ConfigCallbacks): void;
|
|
11
19
|
getWorkingDirectory(): string;
|
|
12
|
-
|
|
20
|
+
getTaskOMaticDir(): string;
|
|
13
21
|
private loadEnvConfig;
|
|
14
|
-
load(): Config
|
|
15
|
-
save(): void
|
|
22
|
+
load(): Promise<Config>;
|
|
23
|
+
save(): Promise<void>;
|
|
16
24
|
getConfig(): Config;
|
|
17
25
|
getAIConfig(): AIConfig;
|
|
18
|
-
setAIConfig(aiConfig: Partial<AIConfig>): void
|
|
26
|
+
setAIConfig(aiConfig: Partial<AIConfig>): Promise<void>;
|
|
19
27
|
setConfig(config: Config): void;
|
|
20
|
-
getTaskOMaticDir(): string;
|
|
21
28
|
getConfigFilePath(): string;
|
|
22
29
|
}
|
|
23
30
|
export declare const configManager: ConfigManager;
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAA6C,MAAM,UAAU,CAAC;AAI/E,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,QAAQ,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7C;AA4CD,wBAAgB,4BAA4B,CAC1C,UAAU,GAAE,MAAc,GACzB,eAAe,CA+BjB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,SAAS,CAAkB;gBAEvB,SAAS,CAAC,EAAE,eAAe,EAAE,gBAAgB,CAAC,EAAE,MAAM;IAiBlE,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQtC,YAAY,CAAC,SAAS,EAAE,eAAe,GAAG,IAAI;IAK9C,mBAAmB,IAAI,MAAM;IAI7B,gBAAgB,IAAI,MAAM;IAI1B,OAAO,CAAC,aAAa;IAoBf,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAsCvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAe3B,SAAS,IAAI,MAAM;IAanB,WAAW,IAAI,QAAQ;IAIjB,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,iBAAiB,IAAI,MAAM;CAG5B;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
package/dist/lib/config.js
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.configManager = exports.ConfigManager = void 0;
|
|
4
|
-
|
|
5
|
-
const process_1 = require("process");
|
|
4
|
+
exports.createDefaultConfigCallbacks = createDefaultConfigCallbacks;
|
|
6
5
|
const path_1 = require("path");
|
|
6
|
+
const process_1 = require("process");
|
|
7
|
+
const fs_1 = require("fs");
|
|
7
8
|
const dotenv_1 = require("dotenv");
|
|
8
9
|
// Provider-specific sensible defaults for 2025
|
|
9
10
|
const PROVIDER_DEFAULTS = {
|
|
@@ -28,61 +29,101 @@ const PROVIDER_DEFAULTS = {
|
|
|
28
29
|
temperature: 0.5,
|
|
29
30
|
},
|
|
30
31
|
};
|
|
31
|
-
function getApiKeyFromEnv(provider) {
|
|
32
|
+
function getApiKeyFromEnv(provider, getEnv) {
|
|
32
33
|
switch (provider) {
|
|
33
34
|
case "openrouter":
|
|
34
|
-
return
|
|
35
|
+
return getEnv("OPENROUTER_API_KEY");
|
|
35
36
|
case "anthropic":
|
|
36
|
-
return
|
|
37
|
+
return getEnv("ANTHROPIC_API_KEY");
|
|
37
38
|
case "openai":
|
|
38
|
-
return
|
|
39
|
+
return getEnv("OPENAI_API_KEY");
|
|
39
40
|
case "custom":
|
|
40
|
-
return
|
|
41
|
+
return getEnv("CUSTOM_API_KEY");
|
|
41
42
|
default:
|
|
42
43
|
return undefined;
|
|
43
44
|
}
|
|
44
45
|
}
|
|
46
|
+
function createDefaultConfigCallbacks(workingDir = (0, process_1.cwd)()) {
|
|
47
|
+
// Ensure dotenv is loaded for the default callbacks
|
|
48
|
+
const envPath = (0, path_1.join)(workingDir, ".env");
|
|
49
|
+
if ((0, fs_1.existsSync)(envPath)) {
|
|
50
|
+
(0, dotenv_1.config)({ path: envPath });
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
read: async (key) => {
|
|
54
|
+
// If key is relative, assume it's in .task-o-matic dir relative to workingDir
|
|
55
|
+
// But ConfigManager usually passes "config.json"
|
|
56
|
+
// We need to resolve it.
|
|
57
|
+
// For default callbacks, we replicate the original behavior:
|
|
58
|
+
// .task-o-matic/config.json in workingDir
|
|
59
|
+
const configPath = (0, path_1.join)(workingDir, ".task-o-matic", key);
|
|
60
|
+
if ((0, fs_1.existsSync)(configPath)) {
|
|
61
|
+
return (0, fs_1.readFileSync)(configPath, "utf-8");
|
|
62
|
+
}
|
|
63
|
+
return null;
|
|
64
|
+
},
|
|
65
|
+
write: async (key, value) => {
|
|
66
|
+
const taskOMaticDir = (0, path_1.join)(workingDir, ".task-o-matic");
|
|
67
|
+
if (!(0, fs_1.existsSync)(taskOMaticDir)) {
|
|
68
|
+
(0, fs_1.mkdirSync)(taskOMaticDir, { recursive: true });
|
|
69
|
+
}
|
|
70
|
+
const configPath = (0, path_1.join)(taskOMaticDir, key);
|
|
71
|
+
(0, fs_1.writeFileSync)(configPath, value, "utf-8");
|
|
72
|
+
},
|
|
73
|
+
getEnv: (key) => process.env[key],
|
|
74
|
+
};
|
|
75
|
+
}
|
|
45
76
|
class ConfigManager {
|
|
46
77
|
config = null;
|
|
47
78
|
customWorkingDir = null;
|
|
48
|
-
|
|
79
|
+
callbacks;
|
|
80
|
+
constructor(callbacks, workingDirectory) {
|
|
49
81
|
if (workingDirectory) {
|
|
50
|
-
this.
|
|
82
|
+
this.customWorkingDir = (0, path_1.resolve)(workingDirectory);
|
|
51
83
|
}
|
|
52
|
-
|
|
84
|
+
// If callbacks not provided, create defaults using the working directory
|
|
85
|
+
this.callbacks =
|
|
86
|
+
callbacks || createDefaultConfigCallbacks(this.getWorkingDirectory());
|
|
87
|
+
// We cannot await in constructor.
|
|
88
|
+
// Consumers MUST call load() or ensure it's loaded before accessing config.
|
|
89
|
+
// For backward compatibility in CLI (where sync access was common),
|
|
90
|
+
// we might need a way to force sync load if using default callbacks?
|
|
91
|
+
// But we want to support async callbacks.
|
|
92
|
+
// So we enforce async initialization pattern.
|
|
53
93
|
}
|
|
54
94
|
setWorkingDirectory(dir) {
|
|
55
95
|
this.customWorkingDir = (0, path_1.resolve)(dir);
|
|
56
|
-
//
|
|
57
|
-
this.
|
|
96
|
+
// Re-create default callbacks to point to new dir
|
|
97
|
+
this.callbacks = createDefaultConfigCallbacks(this.getWorkingDirectory());
|
|
98
|
+
// Invalidate config so next access requires reload
|
|
99
|
+
this.config = null;
|
|
100
|
+
}
|
|
101
|
+
setCallbacks(callbacks) {
|
|
102
|
+
this.callbacks = callbacks;
|
|
103
|
+
this.config = null;
|
|
58
104
|
}
|
|
59
105
|
getWorkingDirectory() {
|
|
60
106
|
return this.customWorkingDir || (0, process_1.cwd)();
|
|
61
107
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (!(0, fs_1.existsSync)(taskOMaticDir)) {
|
|
65
|
-
(0, fs_1.mkdirSync)(taskOMaticDir, { recursive: true });
|
|
66
|
-
}
|
|
108
|
+
getTaskOMaticDir() {
|
|
109
|
+
return (0, path_1.join)(this.getWorkingDirectory(), ".task-o-matic");
|
|
67
110
|
}
|
|
68
111
|
loadEnvConfig() {
|
|
69
|
-
const
|
|
70
|
-
|
|
112
|
+
const provider = this.callbacks.getEnv("AI_PROVIDER")?.toLowerCase() ||
|
|
113
|
+
"openrouter";
|
|
71
114
|
const defaults = PROVIDER_DEFAULTS[provider] || PROVIDER_DEFAULTS.openrouter;
|
|
115
|
+
const maxTokensStr = this.callbacks.getEnv("AI_MAX_TOKENS");
|
|
116
|
+
const tempStr = this.callbacks.getEnv("AI_TEMPERATURE");
|
|
117
|
+
const modelStr = this.callbacks.getEnv("AI_MODEL");
|
|
72
118
|
return {
|
|
73
119
|
provider,
|
|
74
|
-
model:
|
|
75
|
-
maxTokens:
|
|
76
|
-
temperature:
|
|
77
|
-
apiKey: getApiKeyFromEnv(provider),
|
|
120
|
+
model: modelStr || defaults.model,
|
|
121
|
+
maxTokens: maxTokensStr ? parseInt(maxTokensStr) : defaults.maxTokens,
|
|
122
|
+
temperature: tempStr ? parseFloat(tempStr) : defaults.temperature,
|
|
123
|
+
apiKey: getApiKeyFromEnv(provider, this.callbacks.getEnv),
|
|
78
124
|
};
|
|
79
125
|
}
|
|
80
|
-
load() {
|
|
81
|
-
const workingDir = this.getWorkingDirectory();
|
|
82
|
-
const envPath = (0, path_1.join)(workingDir, '.env');
|
|
83
|
-
if ((0, fs_1.existsSync)(envPath)) {
|
|
84
|
-
(0, dotenv_1.config)({ path: envPath });
|
|
85
|
-
}
|
|
126
|
+
async load() {
|
|
86
127
|
const envConfig = this.loadEnvConfig();
|
|
87
128
|
const defaultConfig = {
|
|
88
129
|
ai: {
|
|
@@ -93,65 +134,66 @@ class ConfigManager {
|
|
|
93
134
|
...envConfig,
|
|
94
135
|
},
|
|
95
136
|
};
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
137
|
+
try {
|
|
138
|
+
// Use relative path "config.json" - callbacks handle resolution
|
|
139
|
+
const configData = await this.callbacks.read("config.json");
|
|
140
|
+
if (configData) {
|
|
100
141
|
const fileConfig = JSON.parse(configData);
|
|
101
142
|
this.config = {
|
|
102
143
|
...defaultConfig,
|
|
103
144
|
...fileConfig,
|
|
104
|
-
ai: { ...defaultConfig.ai, ...fileConfig.ai, ...envConfig }
|
|
145
|
+
ai: { ...defaultConfig.ai, ...fileConfig.ai, ...envConfig },
|
|
105
146
|
};
|
|
106
147
|
if (this.config && this.config.workingDirectory) {
|
|
107
148
|
this.customWorkingDir = this.config.workingDirectory;
|
|
108
149
|
}
|
|
109
150
|
}
|
|
110
|
-
|
|
111
|
-
console.warn("Failed to read config file, using defaults:", error);
|
|
151
|
+
else {
|
|
112
152
|
this.config = defaultConfig;
|
|
113
153
|
}
|
|
114
154
|
}
|
|
115
|
-
|
|
155
|
+
catch (error) {
|
|
156
|
+
console.warn("Failed to read config, using defaults:", error);
|
|
116
157
|
this.config = defaultConfig;
|
|
117
158
|
}
|
|
118
159
|
return this.config;
|
|
119
160
|
}
|
|
120
|
-
save() {
|
|
161
|
+
async save() {
|
|
121
162
|
if (!this.config) {
|
|
122
163
|
throw new Error("Config not loaded, cannot save.");
|
|
123
164
|
}
|
|
124
|
-
this.ensureTaskOMaticDir();
|
|
125
165
|
try {
|
|
126
|
-
|
|
127
|
-
(0, fs_1.writeFileSync)(configFilePath, JSON.stringify(this.config, null, 2));
|
|
166
|
+
await this.callbacks.write("config.json", JSON.stringify(this.config, null, 2));
|
|
128
167
|
}
|
|
129
168
|
catch (error) {
|
|
130
169
|
console.error("Failed to save config:", error);
|
|
170
|
+
throw error;
|
|
131
171
|
}
|
|
132
172
|
}
|
|
133
173
|
getConfig() {
|
|
134
174
|
if (!this.config) {
|
|
135
|
-
|
|
175
|
+
// If we are here, it means load() wasn't called or hasn't finished.
|
|
176
|
+
// Since we can't be async here, we must throw or return defaults.
|
|
177
|
+
// Returning defaults might hide issues.
|
|
178
|
+
// Throwing forces users to await load().
|
|
179
|
+
throw new Error("Config not loaded. Call await configManager.load() first.");
|
|
136
180
|
}
|
|
137
181
|
return this.config;
|
|
138
182
|
}
|
|
139
183
|
getAIConfig() {
|
|
140
184
|
return this.getConfig().ai;
|
|
141
185
|
}
|
|
142
|
-
setAIConfig(aiConfig) {
|
|
186
|
+
async setAIConfig(aiConfig) {
|
|
143
187
|
if (!this.config) {
|
|
144
|
-
this.load();
|
|
188
|
+
await this.load();
|
|
145
189
|
}
|
|
146
190
|
this.config.ai = { ...this.config.ai, ...aiConfig };
|
|
147
|
-
this.save();
|
|
191
|
+
await this.save();
|
|
148
192
|
}
|
|
149
193
|
setConfig(config) {
|
|
150
194
|
this.config = config;
|
|
151
195
|
}
|
|
152
|
-
|
|
153
|
-
return (0, path_1.join)(this.getWorkingDirectory(), ".task-o-matic");
|
|
154
|
-
}
|
|
196
|
+
// Helper for legacy code that might need path (deprecated for direct use)
|
|
155
197
|
getConfigFilePath() {
|
|
156
198
|
return (0, path_1.join)(this.getTaskOMaticDir(), "config.json");
|
|
157
199
|
}
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
import { TaskContext, TaskDocumentation } from "../types";
|
|
2
2
|
import { TaskRepository } from "./storage/types";
|
|
3
|
+
export interface FileStats {
|
|
4
|
+
mtime: number;
|
|
5
|
+
isDirectory: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface ContextCallbacks {
|
|
8
|
+
readFile: (path: string) => Promise<string | null>;
|
|
9
|
+
fileExists: (path: string) => Promise<boolean>;
|
|
10
|
+
listFiles: (dir: string) => Promise<string[]>;
|
|
11
|
+
stat: (path: string) => Promise<FileStats | null>;
|
|
12
|
+
}
|
|
13
|
+
export declare function createDefaultContextCallbacks(): ContextCallbacks;
|
|
3
14
|
export declare class ContextBuilder {
|
|
4
15
|
private storage;
|
|
16
|
+
private callbacks;
|
|
5
17
|
private taskOMatic;
|
|
6
18
|
private initialized;
|
|
7
|
-
constructor(storage: TaskRepository);
|
|
19
|
+
constructor(storage: TaskRepository, callbacks?: ContextCallbacks);
|
|
8
20
|
private ensureInitialized;
|
|
9
21
|
/**
|
|
10
22
|
* Build comprehensive context for AI operations
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/lib/context-builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context-builder.d.ts","sourceRoot":"","sources":["../../src/lib/context-builder.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,WAAW,EAAa,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAIjD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACnD,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CACnD;AAED,wBAAgB,6BAA6B,IAAI,gBAAgB,CA4BhE;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,gBAAgB;IAKjE,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAsCxD;;OAEG;IACG,sBAAsB,CAC1B,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,WAAW,CAAC;IAsBvB;;OAEG;YACW,cAAc;IA8C5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;OAEG;YACW,kBAAkB;IAiBhC;;OAEG;YACW,qBAAqB;IAmBnC;;OAEG;IACH,oBAAoB,CAAC,aAAa,EAAE,iBAAiB,GAAG,OAAO;IAK/D;;OAEG;IACH,oBAAoB,CAAC,aAAa,EAAE,iBAAiB,GAAG,OAAO;IAK/D;;OAEG;YACW,aAAa;IAkB3B;;OAEG;YACW,qBAAqB;IAqDnC;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM;CAmDjD"}
|