byterover-cli 2.3.2 → 2.3.3
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/agent/infra/llm/generators/ai-sdk-content-generator.d.ts +8 -0
- package/dist/agent/infra/llm/generators/ai-sdk-content-generator.js +39 -1
- package/dist/server/core/domain/errors/task-error.js +21 -1
- package/dist/server/utils/error-helpers.js +9 -1
- package/oclif.manifest.json +99 -99
- package/package.json +1 -1
|
@@ -31,3 +31,11 @@ export declare class AiSdkContentGenerator implements IContentGenerator {
|
|
|
31
31
|
generateContent(request: GenerateContentRequest): Promise<GenerateContentResponse>;
|
|
32
32
|
generateContentStream(request: GenerateContentRequest): AsyncGenerator<GenerateContentChunk>;
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Extract a human-readable message from an AI SDK stream error.
|
|
36
|
+
*
|
|
37
|
+
* The @ai-sdk/openai Responses API provider passes the raw SSE chunk
|
|
38
|
+
* object as the error value (not an Error instance). The actual message
|
|
39
|
+
* is nested at `.error.message`.
|
|
40
|
+
*/
|
|
41
|
+
export declare function extractStreamErrorMessage(error: unknown): string;
|
|
@@ -89,7 +89,7 @@ export class AiSdkContentGenerator {
|
|
|
89
89
|
// Throw the error so RetryableContentGenerator can catch and retry it.
|
|
90
90
|
// Yielding it as content would swallow the error and prevent retry logic
|
|
91
91
|
// from working (e.g., for 429 rate limit errors).
|
|
92
|
-
throw event.error instanceof Error ? event.error : new Error(
|
|
92
|
+
throw event.error instanceof Error ? event.error : new Error(extractStreamErrorMessage(event.error));
|
|
93
93
|
}
|
|
94
94
|
case 'finish-step': {
|
|
95
95
|
yield {
|
|
@@ -139,6 +139,44 @@ export class AiSdkContentGenerator {
|
|
|
139
139
|
}
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Extract a human-readable message from an AI SDK stream error.
|
|
144
|
+
*
|
|
145
|
+
* The @ai-sdk/openai Responses API provider passes the raw SSE chunk
|
|
146
|
+
* object as the error value (not an Error instance). The actual message
|
|
147
|
+
* is nested at `.error.message`.
|
|
148
|
+
*/
|
|
149
|
+
export function extractStreamErrorMessage(error) {
|
|
150
|
+
if (typeof error === 'string') {
|
|
151
|
+
return error;
|
|
152
|
+
}
|
|
153
|
+
if (error && typeof error === 'object') {
|
|
154
|
+
// OpenAI Responses API shape: { type: "error", error: { message: "..." } }
|
|
155
|
+
if ('error' in error) {
|
|
156
|
+
const nested = error.error;
|
|
157
|
+
if (nested && typeof nested === 'object' && 'message' in nested) {
|
|
158
|
+
const msg = nested.message;
|
|
159
|
+
if (typeof msg === 'string') {
|
|
160
|
+
return msg;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Direct message property: { message: "..." }
|
|
165
|
+
if ('message' in error) {
|
|
166
|
+
const msg = error.message;
|
|
167
|
+
if (typeof msg === 'string') {
|
|
168
|
+
return msg;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
return JSON.stringify(error);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
// circular reference or other stringify failure
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return String(error);
|
|
179
|
+
}
|
|
142
180
|
/**
|
|
143
181
|
* Map AI SDK finish reason to our finish reason format.
|
|
144
182
|
*/
|
|
@@ -82,7 +82,27 @@ export function serializeTaskError(error) {
|
|
|
82
82
|
name: error.name,
|
|
83
83
|
};
|
|
84
84
|
}
|
|
85
|
-
// Unknown error type
|
|
85
|
+
// Unknown error type — extract message if possible, JSON.stringify to avoid "[object Object]"
|
|
86
|
+
if (error && typeof error === 'object') {
|
|
87
|
+
if ('message' in error) {
|
|
88
|
+
const msg = error.message;
|
|
89
|
+
if (typeof msg === 'string') {
|
|
90
|
+
return {
|
|
91
|
+
message: msg,
|
|
92
|
+
name: 'Error',
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
return {
|
|
98
|
+
message: JSON.stringify(error),
|
|
99
|
+
name: 'Error',
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// circular reference — fall through
|
|
104
|
+
}
|
|
105
|
+
}
|
|
86
106
|
return {
|
|
87
107
|
message: String(error),
|
|
88
108
|
name: 'Error',
|
|
@@ -32,7 +32,15 @@ export function getErrorMessage(error) {
|
|
|
32
32
|
return message;
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
-
// Fallback for
|
|
35
|
+
// Fallback: JSON for objects (avoids "[object Object]"), String for primitives
|
|
36
|
+
if (error && typeof error === 'object') {
|
|
37
|
+
try {
|
|
38
|
+
return JSON.stringify(error);
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return String(error);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
36
44
|
return String(error);
|
|
37
45
|
}
|
|
38
46
|
/**
|
package/oclif.manifest.json
CHANGED
|
@@ -1083,104 +1083,6 @@
|
|
|
1083
1083
|
"switch.js"
|
|
1084
1084
|
]
|
|
1085
1085
|
},
|
|
1086
|
-
"space:list": {
|
|
1087
|
-
"aliases": [],
|
|
1088
|
-
"args": {},
|
|
1089
|
-
"description": "List all teams and spaces",
|
|
1090
|
-
"examples": [
|
|
1091
|
-
"<%= config.bin %> space list",
|
|
1092
|
-
"<%= config.bin %> space list --format json"
|
|
1093
|
-
],
|
|
1094
|
-
"flags": {
|
|
1095
|
-
"format": {
|
|
1096
|
-
"char": "f",
|
|
1097
|
-
"description": "Output format",
|
|
1098
|
-
"name": "format",
|
|
1099
|
-
"default": "text",
|
|
1100
|
-
"hasDynamicHelp": false,
|
|
1101
|
-
"multiple": false,
|
|
1102
|
-
"options": [
|
|
1103
|
-
"text",
|
|
1104
|
-
"json"
|
|
1105
|
-
],
|
|
1106
|
-
"type": "option"
|
|
1107
|
-
}
|
|
1108
|
-
},
|
|
1109
|
-
"hasDynamicHelp": false,
|
|
1110
|
-
"hiddenAliases": [],
|
|
1111
|
-
"id": "space:list",
|
|
1112
|
-
"pluginAlias": "byterover-cli",
|
|
1113
|
-
"pluginName": "byterover-cli",
|
|
1114
|
-
"pluginType": "core",
|
|
1115
|
-
"strict": true,
|
|
1116
|
-
"enableJsonFlag": false,
|
|
1117
|
-
"isESM": true,
|
|
1118
|
-
"relativePath": [
|
|
1119
|
-
"dist",
|
|
1120
|
-
"oclif",
|
|
1121
|
-
"commands",
|
|
1122
|
-
"space",
|
|
1123
|
-
"list.js"
|
|
1124
|
-
]
|
|
1125
|
-
},
|
|
1126
|
-
"space:switch": {
|
|
1127
|
-
"aliases": [],
|
|
1128
|
-
"args": {},
|
|
1129
|
-
"description": "Switch to a different space",
|
|
1130
|
-
"examples": [
|
|
1131
|
-
"<%= config.bin %> space switch --team acme --name my-space",
|
|
1132
|
-
"<%= config.bin %> space switch --team acme --name my-space --format json"
|
|
1133
|
-
],
|
|
1134
|
-
"flags": {
|
|
1135
|
-
"format": {
|
|
1136
|
-
"char": "f",
|
|
1137
|
-
"description": "Output format",
|
|
1138
|
-
"name": "format",
|
|
1139
|
-
"default": "text",
|
|
1140
|
-
"hasDynamicHelp": false,
|
|
1141
|
-
"multiple": false,
|
|
1142
|
-
"options": [
|
|
1143
|
-
"text",
|
|
1144
|
-
"json"
|
|
1145
|
-
],
|
|
1146
|
-
"type": "option"
|
|
1147
|
-
},
|
|
1148
|
-
"name": {
|
|
1149
|
-
"char": "n",
|
|
1150
|
-
"description": "Name of the space to switch to",
|
|
1151
|
-
"name": "name",
|
|
1152
|
-
"required": true,
|
|
1153
|
-
"hasDynamicHelp": false,
|
|
1154
|
-
"multiple": false,
|
|
1155
|
-
"type": "option"
|
|
1156
|
-
},
|
|
1157
|
-
"team": {
|
|
1158
|
-
"char": "t",
|
|
1159
|
-
"description": "Team name",
|
|
1160
|
-
"name": "team",
|
|
1161
|
-
"required": true,
|
|
1162
|
-
"hasDynamicHelp": false,
|
|
1163
|
-
"multiple": false,
|
|
1164
|
-
"type": "option"
|
|
1165
|
-
}
|
|
1166
|
-
},
|
|
1167
|
-
"hasDynamicHelp": false,
|
|
1168
|
-
"hiddenAliases": [],
|
|
1169
|
-
"id": "space:switch",
|
|
1170
|
-
"pluginAlias": "byterover-cli",
|
|
1171
|
-
"pluginName": "byterover-cli",
|
|
1172
|
-
"pluginType": "core",
|
|
1173
|
-
"strict": true,
|
|
1174
|
-
"enableJsonFlag": false,
|
|
1175
|
-
"isESM": true,
|
|
1176
|
-
"relativePath": [
|
|
1177
|
-
"dist",
|
|
1178
|
-
"oclif",
|
|
1179
|
-
"commands",
|
|
1180
|
-
"space",
|
|
1181
|
-
"switch.js"
|
|
1182
|
-
]
|
|
1183
|
-
},
|
|
1184
1086
|
"providers:connect": {
|
|
1185
1087
|
"aliases": [],
|
|
1186
1088
|
"args": {
|
|
@@ -1437,6 +1339,104 @@
|
|
|
1437
1339
|
"switch.js"
|
|
1438
1340
|
]
|
|
1439
1341
|
},
|
|
1342
|
+
"space:list": {
|
|
1343
|
+
"aliases": [],
|
|
1344
|
+
"args": {},
|
|
1345
|
+
"description": "List all teams and spaces",
|
|
1346
|
+
"examples": [
|
|
1347
|
+
"<%= config.bin %> space list",
|
|
1348
|
+
"<%= config.bin %> space list --format json"
|
|
1349
|
+
],
|
|
1350
|
+
"flags": {
|
|
1351
|
+
"format": {
|
|
1352
|
+
"char": "f",
|
|
1353
|
+
"description": "Output format",
|
|
1354
|
+
"name": "format",
|
|
1355
|
+
"default": "text",
|
|
1356
|
+
"hasDynamicHelp": false,
|
|
1357
|
+
"multiple": false,
|
|
1358
|
+
"options": [
|
|
1359
|
+
"text",
|
|
1360
|
+
"json"
|
|
1361
|
+
],
|
|
1362
|
+
"type": "option"
|
|
1363
|
+
}
|
|
1364
|
+
},
|
|
1365
|
+
"hasDynamicHelp": false,
|
|
1366
|
+
"hiddenAliases": [],
|
|
1367
|
+
"id": "space:list",
|
|
1368
|
+
"pluginAlias": "byterover-cli",
|
|
1369
|
+
"pluginName": "byterover-cli",
|
|
1370
|
+
"pluginType": "core",
|
|
1371
|
+
"strict": true,
|
|
1372
|
+
"enableJsonFlag": false,
|
|
1373
|
+
"isESM": true,
|
|
1374
|
+
"relativePath": [
|
|
1375
|
+
"dist",
|
|
1376
|
+
"oclif",
|
|
1377
|
+
"commands",
|
|
1378
|
+
"space",
|
|
1379
|
+
"list.js"
|
|
1380
|
+
]
|
|
1381
|
+
},
|
|
1382
|
+
"space:switch": {
|
|
1383
|
+
"aliases": [],
|
|
1384
|
+
"args": {},
|
|
1385
|
+
"description": "Switch to a different space",
|
|
1386
|
+
"examples": [
|
|
1387
|
+
"<%= config.bin %> space switch --team acme --name my-space",
|
|
1388
|
+
"<%= config.bin %> space switch --team acme --name my-space --format json"
|
|
1389
|
+
],
|
|
1390
|
+
"flags": {
|
|
1391
|
+
"format": {
|
|
1392
|
+
"char": "f",
|
|
1393
|
+
"description": "Output format",
|
|
1394
|
+
"name": "format",
|
|
1395
|
+
"default": "text",
|
|
1396
|
+
"hasDynamicHelp": false,
|
|
1397
|
+
"multiple": false,
|
|
1398
|
+
"options": [
|
|
1399
|
+
"text",
|
|
1400
|
+
"json"
|
|
1401
|
+
],
|
|
1402
|
+
"type": "option"
|
|
1403
|
+
},
|
|
1404
|
+
"name": {
|
|
1405
|
+
"char": "n",
|
|
1406
|
+
"description": "Name of the space to switch to",
|
|
1407
|
+
"name": "name",
|
|
1408
|
+
"required": true,
|
|
1409
|
+
"hasDynamicHelp": false,
|
|
1410
|
+
"multiple": false,
|
|
1411
|
+
"type": "option"
|
|
1412
|
+
},
|
|
1413
|
+
"team": {
|
|
1414
|
+
"char": "t",
|
|
1415
|
+
"description": "Team name",
|
|
1416
|
+
"name": "team",
|
|
1417
|
+
"required": true,
|
|
1418
|
+
"hasDynamicHelp": false,
|
|
1419
|
+
"multiple": false,
|
|
1420
|
+
"type": "option"
|
|
1421
|
+
}
|
|
1422
|
+
},
|
|
1423
|
+
"hasDynamicHelp": false,
|
|
1424
|
+
"hiddenAliases": [],
|
|
1425
|
+
"id": "space:switch",
|
|
1426
|
+
"pluginAlias": "byterover-cli",
|
|
1427
|
+
"pluginName": "byterover-cli",
|
|
1428
|
+
"pluginType": "core",
|
|
1429
|
+
"strict": true,
|
|
1430
|
+
"enableJsonFlag": false,
|
|
1431
|
+
"isESM": true,
|
|
1432
|
+
"relativePath": [
|
|
1433
|
+
"dist",
|
|
1434
|
+
"oclif",
|
|
1435
|
+
"commands",
|
|
1436
|
+
"space",
|
|
1437
|
+
"switch.js"
|
|
1438
|
+
]
|
|
1439
|
+
},
|
|
1440
1440
|
"hub:registry:add": {
|
|
1441
1441
|
"aliases": [],
|
|
1442
1442
|
"args": {
|
|
@@ -1636,5 +1636,5 @@
|
|
|
1636
1636
|
]
|
|
1637
1637
|
}
|
|
1638
1638
|
},
|
|
1639
|
-
"version": "2.3.
|
|
1639
|
+
"version": "2.3.3"
|
|
1640
1640
|
}
|