task-o-matic 0.0.21 → 0.0.22
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/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +150 -0
- package/dist/commands/prd.d.ts +5 -0
- package/dist/commands/prd.d.ts.map +1 -1
- package/dist/commands/prd.js +297 -189
- package/dist/commands/tasks/split.d.ts.map +1 -1
- package/dist/commands/tasks/split.js +129 -27
- package/dist/commands/utils/ai-parallel.d.ts +20 -0
- package/dist/commands/utils/ai-parallel.d.ts.map +1 -0
- package/dist/commands/utils/ai-parallel.js +115 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/lib/ai-service/gemini-proxy.d.ts +15 -0
- package/dist/lib/ai-service/gemini-proxy.d.ts.map +1 -0
- package/dist/lib/ai-service/gemini-proxy.js +90 -0
- package/dist/lib/ai-service/json-parser.d.ts +16 -4
- package/dist/lib/ai-service/json-parser.d.ts.map +1 -1
- package/dist/lib/ai-service/json-parser.js +93 -19
- package/dist/lib/ai-service/model-provider.d.ts.map +1 -1
- package/dist/lib/ai-service/model-provider.js +31 -2
- package/dist/lib/ai-service/prd-operations.d.ts.map +1 -1
- package/dist/lib/ai-service/prd-operations.js +21 -5
- package/dist/lib/ai-service/task-operations.d.ts.map +1 -1
- package/dist/lib/ai-service/task-operations.js +10 -2
- package/dist/lib/better-t-stack-cli.d.ts.map +1 -1
- package/dist/lib/better-t-stack-cli.js +6 -5
- package/dist/lib/config-validation.d.ts +9 -9
- package/dist/lib/config-validation.d.ts.map +1 -1
- package/dist/lib/config-validation.js +11 -3
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +11 -2
- package/dist/lib/provider-defaults.json +11 -1
- package/dist/services/tasks.d.ts.map +1 -1
- package/dist/services/tasks.js +25 -15
- package/dist/test/commands.test.js +10 -10
- package/dist/test/model-parsing.test.d.ts +2 -0
- package/dist/test/model-parsing.test.d.ts.map +1 -0
- package/dist/test/model-parsing.test.js +73 -0
- package/dist/types/cli-options.d.ts +2 -0
- package/dist/types/cli-options.d.ts.map +1 -1
- package/dist/types/index.d.ts +12 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +10 -0
- package/dist/utils/ai-operation-utility.d.ts.map +1 -1
- package/dist/utils/ai-operation-utility.js +26 -2
- package/dist/utils/metadata-utils.d.ts +1 -1
- package/dist/utils/streaming-utils.d.ts.map +1 -1
- package/dist/utils/streaming-utils.js +4 -0
- package/docs/agents/cli.md +19 -12
- package/package.json +1 -1
|
@@ -5,8 +5,12 @@ class JSONParser {
|
|
|
5
5
|
/**
|
|
6
6
|
* Extracts JSON from text that may contain markdown codeblocks or other formatting
|
|
7
7
|
*/
|
|
8
|
+
/**
|
|
9
|
+
* Extracts the first valid JSON object or array from text using a stack-based approach
|
|
10
|
+
* This is much more robust than regex for nested structures or text with multiple brace pairs
|
|
11
|
+
*/
|
|
8
12
|
extractJSONString(text) {
|
|
9
|
-
//
|
|
13
|
+
// 1. Try to extract from markdown codeblock first (most reliable)
|
|
10
14
|
const codeblockPatterns = [
|
|
11
15
|
/```json\s*([\s\S]*?)```/i,
|
|
12
16
|
/```JSON\s*([\s\S]*?)```/i,
|
|
@@ -15,26 +19,91 @@ class JSONParser {
|
|
|
15
19
|
for (const pattern of codeblockPatterns) {
|
|
16
20
|
const match = text.match(pattern);
|
|
17
21
|
if (match && match[1]) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
return match[1].trim();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// 2. Stack-based extraction for raw text
|
|
26
|
+
// Find all potential start indices ({ or [)
|
|
27
|
+
const candidates = [];
|
|
28
|
+
for (let i = 0; i < text.length; i++) {
|
|
29
|
+
if (text[i] === "{" || text[i] === "[") {
|
|
30
|
+
candidates.push({ start: i, char: text[i] });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
console.log(`[DEBUG] Found ${candidates.length} candidates for JSON extraction`);
|
|
34
|
+
// Try to extract a valid JSON from each candidate start
|
|
35
|
+
for (const candidate of candidates) {
|
|
36
|
+
const extracted = this.extractBalancedString(text, candidate.start, candidate.char);
|
|
37
|
+
if (extracted) {
|
|
38
|
+
// 1. Try raw parse first (safest if valid JSON)
|
|
39
|
+
try {
|
|
40
|
+
JSON.parse(extracted);
|
|
21
41
|
return extracted;
|
|
22
42
|
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
// Ignore, fall through to cleaning
|
|
45
|
+
}
|
|
46
|
+
// 2. Try cleaning (comments, trailing commas)
|
|
47
|
+
try {
|
|
48
|
+
const cleaned = this.cleanJSON(extracted);
|
|
49
|
+
JSON.parse(cleaned);
|
|
50
|
+
return cleaned;
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
console.error(`[DEBUG] JSON Parse failed for candidate at index ${candidate.start}:`, e);
|
|
54
|
+
// If parse fails, continue to next candidate
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
23
57
|
}
|
|
24
58
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Extracts a balanced string starting from a specific index
|
|
63
|
+
*/
|
|
64
|
+
extractBalancedString(text, startIndex, startChar) {
|
|
65
|
+
const endChar = startChar === "{" ? "}" : "]";
|
|
66
|
+
let balance = 0;
|
|
67
|
+
let inString = false;
|
|
68
|
+
let escaped = false;
|
|
69
|
+
for (let i = startIndex; i < text.length; i++) {
|
|
70
|
+
const char = text[i];
|
|
71
|
+
if (escaped) {
|
|
72
|
+
escaped = false;
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (char === "\\") {
|
|
76
|
+
escaped = true;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (char === '"') {
|
|
80
|
+
inString = !inString;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (!inString) {
|
|
84
|
+
if (char === startChar) {
|
|
85
|
+
balance++;
|
|
86
|
+
}
|
|
87
|
+
else if (char === endChar) {
|
|
88
|
+
balance--;
|
|
89
|
+
if (balance === 0) {
|
|
90
|
+
return text.substring(startIndex, i + 1);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
34
93
|
}
|
|
35
94
|
}
|
|
36
95
|
return null;
|
|
37
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Cleans JSON string by removing comments and trailing commas
|
|
99
|
+
* This handles "valid JS object" format that LLMs often output
|
|
100
|
+
*/
|
|
101
|
+
cleanJSON(text) {
|
|
102
|
+
return text
|
|
103
|
+
.replace(/\/\*[\s\S]*?\*\/|\/\/.*/g, "") // Remove comments
|
|
104
|
+
.replace(/,(\s*[}\]])/g, "$1") // Remove trailing commas
|
|
105
|
+
.trim();
|
|
106
|
+
}
|
|
38
107
|
/**
|
|
39
108
|
* Normalizes object keys to handle case variations (e.g., "Tasks" -> "tasks")
|
|
40
109
|
*/
|
|
@@ -60,23 +129,28 @@ class JSONParser {
|
|
|
60
129
|
* Parses JSON from AI text response with improved error handling
|
|
61
130
|
* Now supports:
|
|
62
131
|
* - Extracting from markdown codeblocks (```json, ```JSON, or ```)
|
|
63
|
-
* -
|
|
64
|
-
* -
|
|
65
|
-
*
|
|
66
|
-
* @deprecated Use generateObject instead for structured output
|
|
132
|
+
* - Stack-based extraction for robustness against surrounding text
|
|
133
|
+
* - Comment and trailing comma removal
|
|
134
|
+
* - Case-insensitive property names
|
|
67
135
|
*/
|
|
68
136
|
parseJSONFromResponse(text) {
|
|
137
|
+
// console.log(`[DEBUG] JSONParser received text (${text.length} chars)`);
|
|
138
|
+
// console.log(
|
|
139
|
+
// `[DEBUG] First 100 chars: ${JSON.stringify(text.substring(0, 100))}`
|
|
140
|
+
// );
|
|
141
|
+
// console.log(`[DEBUG] Last 100 chars: ${JSON.stringify(text.slice(-100))}`);
|
|
69
142
|
try {
|
|
70
|
-
// Try to extract JSON from the response
|
|
143
|
+
// Try to extract JSON from the response
|
|
71
144
|
const jsonStr = this.extractJSONString(text);
|
|
72
145
|
if (!jsonStr) {
|
|
146
|
+
console.error("[DEBUG] extractJSONString returned null");
|
|
73
147
|
return {
|
|
74
148
|
success: false,
|
|
75
149
|
error: "Could not extract JSON from AI response. No JSON object or codeblock found.",
|
|
76
150
|
rawText: text,
|
|
77
151
|
};
|
|
78
152
|
}
|
|
79
|
-
// Parse the JSON
|
|
153
|
+
// Parse the JSON (it should be clean now)
|
|
80
154
|
let parsed = JSON.parse(jsonStr);
|
|
81
155
|
// Normalize keys to handle case variations (Tasks -> tasks, etc.)
|
|
82
156
|
parsed = this.normalizeKeys(parsed);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-provider.d.ts","sourceRoot":"","sources":["../../../src/lib/ai-service/model-provider.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"model-provider.d.ts","sourceRoot":"","sources":["../../../src/lib/ai-service/model-provider.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAOvC,qBAAa,aAAa;IACjB,WAAW,IAAI,QAAQ;IAY9B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAqCpB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe;CA0H9C"}
|
|
@@ -5,6 +5,8 @@ const openai_1 = require("@ai-sdk/openai");
|
|
|
5
5
|
const anthropic_1 = require("@ai-sdk/anthropic");
|
|
6
6
|
const openai_compatible_1 = require("@ai-sdk/openai-compatible");
|
|
7
7
|
const ai_sdk_provider_1 = require("@openrouter/ai-sdk-provider");
|
|
8
|
+
// import { createGeminiProvider } from "ai-sdk-provider-gemini-cli";
|
|
9
|
+
const gemini_proxy_1 = require("./gemini-proxy");
|
|
8
10
|
const config_1 = require("../config");
|
|
9
11
|
const task_o_matic_error_1 = require("../../utils/task-o-matic-error");
|
|
10
12
|
class ModelProvider {
|
|
@@ -42,6 +44,9 @@ class ModelProvider {
|
|
|
42
44
|
anthropic: {
|
|
43
45
|
apiKey: getEnv("ANTHROPIC_API_KEY"),
|
|
44
46
|
},
|
|
47
|
+
zai: {
|
|
48
|
+
apiKey: getEnv("ZAI_API_KEY"),
|
|
49
|
+
},
|
|
45
50
|
openrouter: {
|
|
46
51
|
apiKey: getEnv("OPENROUTER_API_KEY"),
|
|
47
52
|
baseURL: "https://openrouter.ai/api/v1",
|
|
@@ -82,7 +87,13 @@ class ModelProvider {
|
|
|
82
87
|
"Run `task-o-matic config set-ai-key <key>`",
|
|
83
88
|
],
|
|
84
89
|
});
|
|
85
|
-
const openRouterProvider = (0, ai_sdk_provider_1.createOpenRouter)({
|
|
90
|
+
const openRouterProvider = (0, ai_sdk_provider_1.createOpenRouter)({
|
|
91
|
+
apiKey,
|
|
92
|
+
headers: {
|
|
93
|
+
"HTTP-Referer": "https://task-o-matic.dev",
|
|
94
|
+
"X-Title": "Task-O-Matic",
|
|
95
|
+
},
|
|
96
|
+
});
|
|
86
97
|
return openRouterProvider(model);
|
|
87
98
|
case "custom":
|
|
88
99
|
if (!apiKey)
|
|
@@ -105,10 +116,28 @@ class ModelProvider {
|
|
|
105
116
|
baseURL,
|
|
106
117
|
});
|
|
107
118
|
return customProvider(model);
|
|
119
|
+
case "gemini":
|
|
120
|
+
// Use Gemini CLI provider with OAuth via Proxy to handle lazy loading
|
|
121
|
+
return new gemini_proxy_1.GeminiProviderProxy(model, {
|
|
122
|
+
authType: "oauth-personal",
|
|
123
|
+
});
|
|
124
|
+
case "zai":
|
|
125
|
+
if (!apiKey)
|
|
126
|
+
throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.AI_CONFIGURATION_ERROR, "Z.AI Coding plan API key is required", {
|
|
127
|
+
suggestions: [
|
|
128
|
+
"Set the ZAI_API_KEY environment variable.",
|
|
129
|
+
"Run `task-o-matic config set-ai-key <key>`",
|
|
130
|
+
],
|
|
131
|
+
});
|
|
132
|
+
const zaiProvider = (0, anthropic_1.createAnthropic)({
|
|
133
|
+
baseURL: "https://api.z.ai/api/anthropic/v1",
|
|
134
|
+
apiKey,
|
|
135
|
+
});
|
|
136
|
+
return zaiProvider(model);
|
|
108
137
|
default:
|
|
109
138
|
throw (0, task_o_matic_error_1.createStandardError)(task_o_matic_error_1.TaskOMaticErrorCodes.AI_CONFIGURATION_ERROR, `Unsupported provider: ${provider}`, {
|
|
110
139
|
suggestions: [
|
|
111
|
-
"Use one of the supported providers: 'openai', 'anthropic', 'openrouter', 'custom'.",
|
|
140
|
+
"Use one of the supported providers: 'openai', 'anthropic', 'openrouter', 'custom', 'zai'.",
|
|
112
141
|
"Run `task-o-matic config set-ai-provider <provider>`",
|
|
113
142
|
],
|
|
114
143
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prd-operations.d.ts","sourceRoot":"","sources":["../../../src/lib/ai-service/prd-operations.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EAER,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EAIZ,MAAM,aAAa,CAAC;AAYrB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMnD,qBAAa,aAAc,SAAQ,cAAc;IACzC,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAClC,gBAAgB,CAAC,EAAE,MAAM,EACzB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CAAC,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"prd-operations.d.ts","sourceRoot":"","sources":["../../../src/lib/ai-service/prd-operations.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EAER,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EAIZ,MAAM,aAAa,CAAC;AAYrB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMnD,qBAAa,aAAc,SAAQ,cAAc;IACzC,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAClC,gBAAgB,CAAC,EAAE,MAAM,EACzB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CAAC,gBAAgB,CAAC;IA6MtB,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAClC,gBAAgB,CAAC,EAAE,MAAM,EACzB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CAAC,MAAM,CAAC;IA+GZ,oBAAoB,CACxB,UAAU,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAClC,gBAAgB,CAAC,EAAE,MAAM,EACzB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC;IA6Hd,kBAAkB,CACtB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EAAE,EACnB,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,WAAW,CAAC,EAAE;QACZ,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,kBAAkB,CAAC,EAAE,MAAM,CAAC;KAC7B,EACD,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IA8F5B,WAAW,CACf,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;IAqBZ,WAAW,CACf,IAAI,EAAE,MAAM,EAAE,EACd,mBAAmB,EAAE,MAAM,EAC3B,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;CA4BnB"}
|
|
@@ -145,7 +145,21 @@ Use these tools to understand the project structure, existing code patterns, and
|
|
|
145
145
|
});
|
|
146
146
|
}
|
|
147
147
|
const parsed = parseResult.data;
|
|
148
|
-
|
|
148
|
+
// Handle both { tasks: [...] } and [...] (array) formats
|
|
149
|
+
let tasksList = [];
|
|
150
|
+
let summary = "PRD parsed successfully";
|
|
151
|
+
let estimatedDuration = "Unknown";
|
|
152
|
+
let confidence = 0.7;
|
|
153
|
+
if (Array.isArray(parsed)) {
|
|
154
|
+
tasksList = parsed;
|
|
155
|
+
}
|
|
156
|
+
else if (parsed && typeof parsed === "object") {
|
|
157
|
+
tasksList = parsed.tasks || [];
|
|
158
|
+
summary = parsed.summary || summary;
|
|
159
|
+
estimatedDuration = parsed.estimatedDuration || estimatedDuration;
|
|
160
|
+
confidence = parsed.confidence || confidence;
|
|
161
|
+
}
|
|
162
|
+
const tasks = tasksList.map((task, index) => {
|
|
149
163
|
const taskId = task.id || (index + 1).toString();
|
|
150
164
|
const { title, description, content, effort, dependencies, ...extraData } = task;
|
|
151
165
|
let fullContent = "";
|
|
@@ -173,9 +187,9 @@ Use these tools to understand the project structure, existing code patterns, and
|
|
|
173
187
|
});
|
|
174
188
|
return {
|
|
175
189
|
tasks,
|
|
176
|
-
summary
|
|
177
|
-
estimatedDuration
|
|
178
|
-
confidence
|
|
190
|
+
summary,
|
|
191
|
+
estimatedDuration,
|
|
192
|
+
confidence,
|
|
179
193
|
};
|
|
180
194
|
}, retryConfig, "PRD parsing");
|
|
181
195
|
}
|
|
@@ -431,9 +445,11 @@ Use these tools to understand the current project structure, existing code patte
|
|
|
431
445
|
let userContent = userMessage;
|
|
432
446
|
if (!userContent) {
|
|
433
447
|
userContent = `Original Description:\n${originalDescription}\n\n`;
|
|
448
|
+
userContent += `<generated_prds>\n`;
|
|
434
449
|
prds.forEach((prd, index) => {
|
|
435
|
-
userContent +=
|
|
450
|
+
userContent += ` <prd id="${index + 1}">\n${prd}\n </prd>\n`;
|
|
436
451
|
});
|
|
452
|
+
userContent += `</generated_prds>\n`;
|
|
437
453
|
}
|
|
438
454
|
return this.streamText("", config, systemPrompt, userContent, streamingOptions, { maxAttempts: 1 });
|
|
439
455
|
}, retryConfig, "PRD combination");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-operations.d.ts","sourceRoot":"","sources":["../../../src/lib/ai-service/task-operations.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,gBAAgB,EAChB,WAAW,EAEZ,MAAM,aAAa,CAAC;AAUrB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOnD,qBAAa,cAAe,SAAQ,cAAc;IAChD,OAAO,CAAC,kBAAkB,CAA4B;IAChD,aAAa,CACjB,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAClC,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE,IAAI,EAAE,EACzB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CACR,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CACpE;
|
|
1
|
+
{"version":3,"file":"task-operations.d.ts","sourceRoot":"","sources":["../../../src/lib/ai-service/task-operations.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,gBAAgB,EAChB,WAAW,EAEZ,MAAM,aAAa,CAAC;AAUrB,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOnD,qBAAa,cAAe,SAAQ,cAAc;IAChD,OAAO,CAAC,kBAAkB,CAA4B;IAChD,aAAa,CACjB,IAAI,EAAE,IAAI,EACV,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAClC,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE,IAAI,EAAE,EACzB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CACR,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CACpE;IA4HK,WAAW,CACf,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,EACf,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;IA4FZ,QAAQ,CACZ,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,EAC1B,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,MAAM,EACpB,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,WAAW,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC;CAoEnB"}
|
|
@@ -75,9 +75,17 @@ Use these tools to understand the project structure, existing code, and dependen
|
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
77
|
const parsed = parseResult.data;
|
|
78
|
-
|
|
78
|
+
let subtasksList = [];
|
|
79
|
+
// Handle various output formats (Array, { subtasks: [] }, { tasks: [] })
|
|
80
|
+
if (Array.isArray(parsed)) {
|
|
81
|
+
subtasksList = parsed;
|
|
82
|
+
}
|
|
83
|
+
else if (parsed && typeof parsed === "object") {
|
|
84
|
+
subtasksList = parsed.subtasks || parsed.tasks || [];
|
|
85
|
+
}
|
|
86
|
+
return subtasksList.map((subtask) => ({
|
|
79
87
|
title: subtask.title,
|
|
80
|
-
content: subtask.description || "",
|
|
88
|
+
content: subtask.description || subtask.content || "",
|
|
81
89
|
estimatedEffort: subtask.effort,
|
|
82
90
|
}));
|
|
83
91
|
}, {
|
|
@@ -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,WAAW,EAAE,MAAM,UAAU,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,WAAW,EAAE,MAAM,UAAU,CAAC;AAM/D,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;YA+BZ,aAAa;YAiCb,mBAAmB;YAiCnB,iBAAiB;CA+ChC;AAGD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,UAAU,CAAsB;;IAMxC;;OAEG;IACH,OAAO,CAAC,cAAc;IAoBtB;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACG,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiFvE;;OAEG;YACW,4BAA4B;IA6C1C;;OAEG;YACW,eAAe;IAiC7B;;OAEG;YACW,eAAe;IA+B7B;;OAEG;YACW,kBAAkB;CAkCjC;AAGD,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,CAOtE"}
|
|
@@ -37,6 +37,7 @@ exports.BetterTStackIntegration = exports.BetterTStackService = void 0;
|
|
|
37
37
|
exports.runBetterTStackCLI = runBetterTStackCLI;
|
|
38
38
|
const config_1 = require("./config");
|
|
39
39
|
const fs_1 = require("fs");
|
|
40
|
+
const glob_1 = require("glob");
|
|
40
41
|
const path_1 = require("path");
|
|
41
42
|
class BetterTStackService {
|
|
42
43
|
async createProject(name, config, workingDirectory) {
|
|
@@ -147,21 +148,21 @@ class BetterTStackService {
|
|
|
147
148
|
(0, fs_1.writeFileSync)(stackConfigPath, configData);
|
|
148
149
|
}
|
|
149
150
|
async addCheckTypesScript(projectDir) {
|
|
150
|
-
const { glob } = await
|
|
151
|
-
const { readFileSync, writeFileSync } = await
|
|
151
|
+
// const { glob } = await import("glob");
|
|
152
|
+
// const { readFileSync, writeFileSync } = await import("fs");
|
|
152
153
|
console.log("🔍 Adding check-types scripts to packages...");
|
|
153
154
|
// Find all package.json files in apps and backend directories
|
|
154
|
-
const packageFiles = await glob(["apps/*/package.json", "backend/*/package.json"], { cwd: projectDir, absolute: true });
|
|
155
|
+
const packageFiles = await (0, glob_1.glob)(["apps/*/package.json", "backend/*/package.json"], { cwd: projectDir, absolute: true });
|
|
155
156
|
for (const file of packageFiles) {
|
|
156
157
|
try {
|
|
157
|
-
const content = JSON.parse(readFileSync(file, "utf-8"));
|
|
158
|
+
const content = JSON.parse((0, fs_1.readFileSync)(file, "utf-8"));
|
|
158
159
|
if (!content.scripts) {
|
|
159
160
|
content.scripts = {};
|
|
160
161
|
}
|
|
161
162
|
// Add check-types script if not present
|
|
162
163
|
if (!content.scripts["check-types"]) {
|
|
163
164
|
content.scripts["check-types"] = "tsc --noEmit";
|
|
164
|
-
writeFileSync(file, JSON.stringify(content, null, 2) + "\n");
|
|
165
|
+
(0, fs_1.writeFileSync)(file, JSON.stringify(content, null, 2) + "\n");
|
|
165
166
|
console.log(` ✓ Added check-types to ${file.split("/").slice(-3).join("/")}`);
|
|
166
167
|
}
|
|
167
168
|
}
|
|
@@ -2,12 +2,12 @@ import { z } from "zod";
|
|
|
2
2
|
/**
|
|
3
3
|
* Zod schema for AI Provider
|
|
4
4
|
*/
|
|
5
|
-
export declare const AIProviderSchema: z.ZodEnum<["openai", "anthropic", "openrouter", "custom"]>;
|
|
5
|
+
export declare const AIProviderSchema: z.ZodEnum<["openai", "anthropic", "openrouter", "custom", "gemini", "zai"]>;
|
|
6
6
|
/**
|
|
7
7
|
* Zod schema for AI Configuration
|
|
8
8
|
*/
|
|
9
9
|
export declare const AIConfigSchema: z.ZodObject<{
|
|
10
|
-
provider: z.ZodEnum<["openai", "anthropic", "openrouter", "custom"]>;
|
|
10
|
+
provider: z.ZodEnum<["openai", "anthropic", "openrouter", "custom", "gemini", "zai"]>;
|
|
11
11
|
model: z.ZodString;
|
|
12
12
|
apiKey: z.ZodOptional<z.ZodString>;
|
|
13
13
|
baseURL: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
|
|
@@ -22,7 +22,7 @@ export declare const AIConfigSchema: z.ZodObject<{
|
|
|
22
22
|
maxTokens?: number | undefined;
|
|
23
23
|
}>>;
|
|
24
24
|
}, "strip", z.ZodTypeAny, {
|
|
25
|
-
provider: "openai" | "anthropic" | "openrouter" | "custom";
|
|
25
|
+
provider: "openai" | "anthropic" | "openrouter" | "custom" | "gemini" | "zai";
|
|
26
26
|
model: string;
|
|
27
27
|
apiKey?: string | undefined;
|
|
28
28
|
baseURL?: string | undefined;
|
|
@@ -33,7 +33,7 @@ export declare const AIConfigSchema: z.ZodObject<{
|
|
|
33
33
|
maxTokens?: number | undefined;
|
|
34
34
|
} | undefined;
|
|
35
35
|
}, {
|
|
36
|
-
provider: "openai" | "anthropic" | "openrouter" | "custom";
|
|
36
|
+
provider: "openai" | "anthropic" | "openrouter" | "custom" | "gemini" | "zai";
|
|
37
37
|
model: string;
|
|
38
38
|
apiKey?: string | undefined;
|
|
39
39
|
baseURL?: string | undefined;
|
|
@@ -49,7 +49,7 @@ export declare const AIConfigSchema: z.ZodObject<{
|
|
|
49
49
|
*/
|
|
50
50
|
export declare const ConfigSchema: z.ZodObject<{
|
|
51
51
|
ai: z.ZodObject<{
|
|
52
|
-
provider: z.ZodEnum<["openai", "anthropic", "openrouter", "custom"]>;
|
|
52
|
+
provider: z.ZodEnum<["openai", "anthropic", "openrouter", "custom", "gemini", "zai"]>;
|
|
53
53
|
model: z.ZodString;
|
|
54
54
|
apiKey: z.ZodOptional<z.ZodString>;
|
|
55
55
|
baseURL: z.ZodUnion<[z.ZodOptional<z.ZodString>, z.ZodLiteral<"">]>;
|
|
@@ -64,7 +64,7 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
64
64
|
maxTokens?: number | undefined;
|
|
65
65
|
}>>;
|
|
66
66
|
}, "strip", z.ZodTypeAny, {
|
|
67
|
-
provider: "openai" | "anthropic" | "openrouter" | "custom";
|
|
67
|
+
provider: "openai" | "anthropic" | "openrouter" | "custom" | "gemini" | "zai";
|
|
68
68
|
model: string;
|
|
69
69
|
apiKey?: string | undefined;
|
|
70
70
|
baseURL?: string | undefined;
|
|
@@ -75,7 +75,7 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
75
75
|
maxTokens?: number | undefined;
|
|
76
76
|
} | undefined;
|
|
77
77
|
}, {
|
|
78
|
-
provider: "openai" | "anthropic" | "openrouter" | "custom";
|
|
78
|
+
provider: "openai" | "anthropic" | "openrouter" | "custom" | "gemini" | "zai";
|
|
79
79
|
model: string;
|
|
80
80
|
apiKey?: string | undefined;
|
|
81
81
|
baseURL?: string | undefined;
|
|
@@ -89,7 +89,7 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
89
89
|
workingDirectory: z.ZodOptional<z.ZodString>;
|
|
90
90
|
}, "strip", z.ZodTypeAny, {
|
|
91
91
|
ai: {
|
|
92
|
-
provider: "openai" | "anthropic" | "openrouter" | "custom";
|
|
92
|
+
provider: "openai" | "anthropic" | "openrouter" | "custom" | "gemini" | "zai";
|
|
93
93
|
model: string;
|
|
94
94
|
apiKey?: string | undefined;
|
|
95
95
|
baseURL?: string | undefined;
|
|
@@ -103,7 +103,7 @@ export declare const ConfigSchema: z.ZodObject<{
|
|
|
103
103
|
workingDirectory?: string | undefined;
|
|
104
104
|
}, {
|
|
105
105
|
ai: {
|
|
106
|
-
provider: "openai" | "anthropic" | "openrouter" | "custom";
|
|
106
|
+
provider: "openai" | "anthropic" | "openrouter" | "custom" | "gemini" | "zai";
|
|
107
107
|
model: string;
|
|
108
108
|
apiKey?: string | undefined;
|
|
109
109
|
baseURL?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-validation.d.ts","sourceRoot":"","sources":["../../src/lib/config-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"config-validation.d.ts","sourceRoot":"","sources":["../../src/lib/config-validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAWxB;;GAEG;AACH,eAAO,MAAM,gBAAgB,6EAI3B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BzB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGvB,CAAC;AAEH;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;CACJ;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,OAAO,GACd,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CA0BhC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAuB5E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,GACd,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC,CAiBhD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,GACd,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC,CAiBlD;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC,CAsBzC"}
|
|
@@ -11,9 +11,13 @@ const task_o_matic_error_1 = require("../utils/task-o-matic-error");
|
|
|
11
11
|
/**
|
|
12
12
|
* Zod schema for AI Provider
|
|
13
13
|
*/
|
|
14
|
-
|
|
14
|
+
const types_1 = require("../types");
|
|
15
|
+
/**
|
|
16
|
+
* Zod schema for AI Provider
|
|
17
|
+
*/
|
|
18
|
+
exports.AIProviderSchema = zod_1.z.enum(types_1.AI_PROVIDERS_LIST, {
|
|
15
19
|
errorMap: () => ({
|
|
16
|
-
message:
|
|
20
|
+
message: `Provider must be one of: ${types_1.AI_PROVIDERS_LIST.join(", ")}`,
|
|
17
21
|
}),
|
|
18
22
|
});
|
|
19
23
|
/**
|
|
@@ -23,7 +27,11 @@ exports.AIConfigSchema = zod_1.z.object({
|
|
|
23
27
|
provider: exports.AIProviderSchema,
|
|
24
28
|
model: zod_1.z.string().min(1, "Model name cannot be empty"),
|
|
25
29
|
apiKey: zod_1.z.string().optional(),
|
|
26
|
-
baseURL: zod_1.z
|
|
30
|
+
baseURL: zod_1.z
|
|
31
|
+
.string()
|
|
32
|
+
.url("Base URL must be a valid URL")
|
|
33
|
+
.optional()
|
|
34
|
+
.or(zod_1.z.literal("")),
|
|
27
35
|
maxTokens: zod_1.z
|
|
28
36
|
.number()
|
|
29
37
|
.int("Max tokens must be an integer")
|
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":"AAEA,OAAO,EAAE,QAAQ,EAA6C,MAAM,UAAU,CAAC;AAS/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;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAA6C,MAAM,UAAU,CAAC;AAS/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;AA0BD,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;IA6CvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAqB3B,SAAS,IAAI,MAAM;IAqBnB,WAAW,IAAI,QAAQ;IAIjB,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB7D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAK/B,iBAAiB,IAAI,MAAM;IAI3B;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG;QAC5C,KAAK,EAAE,OAAO,CAAC;QACf,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB;CAwEF;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC;AAEjD;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,aAA6B,GACrC,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
package/dist/lib/config.js
CHANGED
|
@@ -25,6 +25,8 @@ function getApiKeyFromEnv(provider, getEnv) {
|
|
|
25
25
|
return getEnv("OPENAI_API_KEY");
|
|
26
26
|
case "custom":
|
|
27
27
|
return getEnv("CUSTOM_API_KEY");
|
|
28
|
+
case "zai":
|
|
29
|
+
return getEnv("ZAI_API_KEY");
|
|
28
30
|
default:
|
|
29
31
|
return undefined;
|
|
30
32
|
}
|
|
@@ -224,8 +226,15 @@ class ConfigManager {
|
|
|
224
226
|
const { provider, model, apiKey, maxTokens, temperature } = config.ai;
|
|
225
227
|
// Validate provider
|
|
226
228
|
if (provider &&
|
|
227
|
-
![
|
|
228
|
-
|
|
229
|
+
![
|
|
230
|
+
"openrouter",
|
|
231
|
+
"anthropic",
|
|
232
|
+
"openai",
|
|
233
|
+
"custom",
|
|
234
|
+
"gemini",
|
|
235
|
+
"zai",
|
|
236
|
+
].includes(provider)) {
|
|
237
|
+
errors.push(`Invalid provider: ${provider}. Must be one of: openrouter, anthropic, openai, custom, gemini, zai`);
|
|
229
238
|
}
|
|
230
239
|
// Validate model
|
|
231
240
|
if (model !== undefined && typeof model !== "string") {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"openrouter": {
|
|
3
|
-
"model": "z-ai/glm-4.
|
|
3
|
+
"model": "z-ai/glm-4.7",
|
|
4
4
|
"maxTokens": 32768,
|
|
5
5
|
"temperature": 0.5
|
|
6
6
|
},
|
|
@@ -18,5 +18,15 @@
|
|
|
18
18
|
"model": "llama-3.3-70b",
|
|
19
19
|
"maxTokens": 32768,
|
|
20
20
|
"temperature": 0.5
|
|
21
|
+
},
|
|
22
|
+
"gemini": {
|
|
23
|
+
"model": "gemini-3-flash-preview",
|
|
24
|
+
"maxTokens": 32768,
|
|
25
|
+
"temperature": 0.5
|
|
26
|
+
},
|
|
27
|
+
"zai": {
|
|
28
|
+
"model": "glm-4.7",
|
|
29
|
+
"maxTokens": 32768,
|
|
30
|
+
"temperature": 0.5
|
|
21
31
|
}
|
|
22
32
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/services/tasks.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/services/tasks.ts"],"names":[],"mappings":"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"}
|
package/dist/services/tasks.js
CHANGED
|
@@ -699,21 +699,31 @@ class TaskService {
|
|
|
699
699
|
message: `Creating subtask ${i + 1}/${subtaskData.length}: ${subtask.title}`,
|
|
700
700
|
type: "progress",
|
|
701
701
|
});
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
702
|
+
// console.log(
|
|
703
|
+
// `[DEBUG] Creating subtask ${i + 1}:`,
|
|
704
|
+
// JSON.stringify(subtask, null, 2)
|
|
705
|
+
// );
|
|
706
|
+
try {
|
|
707
|
+
const result = await this.createTask({
|
|
708
|
+
title: subtask.title,
|
|
709
|
+
content: subtask.content,
|
|
710
|
+
effort: subtask.estimatedEffort,
|
|
711
|
+
parentId: taskId,
|
|
712
|
+
});
|
|
713
|
+
createdSubtasks.push(result.task);
|
|
714
|
+
// Save AI metadata for each subtask (Bug fix 2.3)
|
|
715
|
+
const subtaskMetadata = {
|
|
716
|
+
...(0, metadata_utils_1.createBaseAIMetadata)(result.task.id, aiConfig, promptOverride, "Split task into meaningful subtasks with full context and existing subtask awareness", 0.9),
|
|
717
|
+
splitAt: splitTimestamp,
|
|
718
|
+
parentTaskId: taskId,
|
|
719
|
+
subtaskIndex: i + 1,
|
|
720
|
+
};
|
|
721
|
+
await (0, ai_service_factory_1.getStorage)().saveTaskAIMetadata(subtaskMetadata);
|
|
722
|
+
}
|
|
723
|
+
catch (err) {
|
|
724
|
+
console.error(`[DEBUG] Failed to create subtask ${i + 1}:`, err);
|
|
725
|
+
throw err;
|
|
726
|
+
}
|
|
717
727
|
}
|
|
718
728
|
// Save AI metadata for parent task as well
|
|
719
729
|
const parentMetadata = {
|