task-o-matic 0.0.21 → 0.0.23

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 (51) hide show
  1. package/dist/commands/install.d.ts +3 -0
  2. package/dist/commands/install.d.ts.map +1 -0
  3. package/dist/commands/install.js +150 -0
  4. package/dist/commands/prd.d.ts +5 -0
  5. package/dist/commands/prd.d.ts.map +1 -1
  6. package/dist/commands/prd.js +297 -189
  7. package/dist/commands/tasks/split.d.ts.map +1 -1
  8. package/dist/commands/tasks/split.js +129 -27
  9. package/dist/commands/utils/ai-parallel.d.ts +20 -0
  10. package/dist/commands/utils/ai-parallel.d.ts.map +1 -0
  11. package/dist/commands/utils/ai-parallel.js +115 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +3 -1
  14. package/dist/lib/ai-service/gemini-proxy.d.ts +15 -0
  15. package/dist/lib/ai-service/gemini-proxy.d.ts.map +1 -0
  16. package/dist/lib/ai-service/gemini-proxy.js +90 -0
  17. package/dist/lib/ai-service/json-parser.d.ts +16 -4
  18. package/dist/lib/ai-service/json-parser.d.ts.map +1 -1
  19. package/dist/lib/ai-service/json-parser.js +93 -19
  20. package/dist/lib/ai-service/model-provider.d.ts.map +1 -1
  21. package/dist/lib/ai-service/model-provider.js +31 -2
  22. package/dist/lib/ai-service/prd-operations.d.ts.map +1 -1
  23. package/dist/lib/ai-service/prd-operations.js +21 -5
  24. package/dist/lib/ai-service/task-operations.d.ts.map +1 -1
  25. package/dist/lib/ai-service/task-operations.js +10 -2
  26. package/dist/lib/better-t-stack-cli.d.ts.map +1 -1
  27. package/dist/lib/better-t-stack-cli.js +6 -5
  28. package/dist/lib/config-validation.d.ts +9 -9
  29. package/dist/lib/config-validation.d.ts.map +1 -1
  30. package/dist/lib/config-validation.js +11 -3
  31. package/dist/lib/config.d.ts.map +1 -1
  32. package/dist/lib/config.js +11 -2
  33. package/dist/lib/provider-defaults.json +11 -1
  34. package/dist/services/tasks.d.ts.map +1 -1
  35. package/dist/services/tasks.js +25 -15
  36. package/dist/test/commands.test.js +10 -10
  37. package/dist/test/model-parsing.test.d.ts +2 -0
  38. package/dist/test/model-parsing.test.d.ts.map +1 -0
  39. package/dist/test/model-parsing.test.js +73 -0
  40. package/dist/types/cli-options.d.ts +2 -0
  41. package/dist/types/cli-options.d.ts.map +1 -1
  42. package/dist/types/index.d.ts +12 -1
  43. package/dist/types/index.d.ts.map +1 -1
  44. package/dist/types/index.js +10 -0
  45. package/dist/utils/ai-operation-utility.d.ts.map +1 -1
  46. package/dist/utils/ai-operation-utility.js +26 -2
  47. package/dist/utils/metadata-utils.d.ts +1 -1
  48. package/dist/utils/streaming-utils.d.ts.map +1 -1
  49. package/dist/utils/streaming-utils.js +4 -0
  50. package/docs/agents/cli.md +19 -12
  51. 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
- // Strategy 1: Try to extract from markdown codeblock (```json ... ``` or ``` ... ```)
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
- const extracted = match[1].trim();
19
- // Verify it looks like JSON (starts with { or [)
20
- if (extracted.startsWith("{") || extracted.startsWith("[")) {
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
- // Strategy 2: Try to extract JSON object/array directly
26
- const directPatterns = [
27
- /\{[\s\S]*\}/, // Object
28
- /\[[\s\S]*\]/, // Array
29
- ];
30
- for (const pattern of directPatterns) {
31
- const match = text.match(pattern);
32
- if (match) {
33
- return match[0];
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
- * - Case-insensitive property names (Tasks -> tasks, Summary -> summary)
64
- * - Multiple extraction strategies
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 (handle various formats)
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":"AAIA,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;IAkCpB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,eAAe;CA0F9C"}
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)({ apiKey });
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;IA2LtB,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;CA0BnB"}
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
- const tasks = (parsed?.tasks || []).map((task, index) => {
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: parsed?.summary || "PRD parsed successfully",
177
- estimatedDuration: parsed?.estimatedDuration || "Unknown",
178
- confidence: parsed?.confidence || 0.7,
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 += `--- PRD ${index + 1} ---\n${prd}\n\n`;
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;IAmHK,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"}
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
- return (parsed?.subtasks || []).map((subtask) => ({
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;AAK/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"}
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 Promise.resolve().then(() => __importStar(require("glob")));
151
- const { readFileSync, writeFileSync } = await Promise.resolve().then(() => __importStar(require("fs")));
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;AAGxB;;GAEG;AACH,eAAO,MAAM,gBAAgB,4DAI3B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BzB,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,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CA0BhF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAuB5E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC,CAiBlG;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC,CAiBtG;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC,CAsBzC"}
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
- exports.AIProviderSchema = zod_1.z.enum(["openai", "anthropic", "openrouter", "custom"], {
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: "Provider must be one of: openai, anthropic, openrouter, custom",
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.string().url("Base URL must be a valid URL").optional().or(zod_1.z.literal("")),
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")
@@ -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;AAwBD,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;CAiEF;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"}
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"}
@@ -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
- !["openrouter", "anthropic", "openai", "custom"].includes(provider)) {
228
- errors.push(`Invalid provider: ${provider}. Must be one of: openrouter, anthropic, openai, custom`);
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.6",
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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"}
@@ -699,21 +699,31 @@ class TaskService {
699
699
  message: `Creating subtask ${i + 1}/${subtaskData.length}: ${subtask.title}`,
700
700
  type: "progress",
701
701
  });
702
- const result = await this.createTask({
703
- title: subtask.title,
704
- content: subtask.content,
705
- effort: subtask.estimatedEffort,
706
- parentId: taskId,
707
- });
708
- createdSubtasks.push(result.task);
709
- // Save AI metadata for each subtask (Bug fix 2.3)
710
- const subtaskMetadata = {
711
- ...(0, metadata_utils_1.createBaseAIMetadata)(result.task.id, aiConfig, promptOverride, "Split task into meaningful subtasks with full context and existing subtask awareness", 0.9),
712
- splitAt: splitTimestamp,
713
- parentTaskId: taskId,
714
- subtaskIndex: i + 1,
715
- };
716
- await (0, ai_service_factory_1.getStorage)().saveTaskAIMetadata(subtaskMetadata);
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 = {