@wrongstack/core 0.313.0 → 0.313.1
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/chronicle/index.js +84 -6391
- package/dist/chronicle/project-server.js +84 -4868
- package/dist/chunk-2BUUIMQB.js +225 -0
- package/dist/chunk-2FK4WTFF.js +207 -0
- package/dist/chunk-2FQL4PDC.js +292 -0
- package/dist/chunk-2KKODIQU.js +2256 -0
- package/dist/chunk-2YU4WVBW.js +134 -0
- package/dist/chunk-3E244UDA.js +356 -0
- package/dist/chunk-3XPVB7BA.js +135 -0
- package/dist/chunk-4LJJYBAU.js +388 -0
- package/dist/chunk-4VWO3ZXL.js +342 -0
- package/dist/chunk-4XV6IR37.js +187 -0
- package/dist/chunk-4ZHTKJHM.js +183 -0
- package/dist/chunk-52RTVH4M.js +361 -0
- package/dist/chunk-57GEWK5X.js +26 -0
- package/dist/chunk-5DSMEVA4.js +931 -0
- package/dist/chunk-5RP3QTRL.js +1223 -0
- package/dist/chunk-5S437PRC.js +50 -0
- package/dist/chunk-5XDUGTKN.js +511 -0
- package/dist/chunk-62V2AFVG.js +422 -0
- package/dist/chunk-65RDIOR2.js +2470 -0
- package/dist/chunk-6AKOTGLM.js +597 -0
- package/dist/chunk-7ZHZE5EO.js +28 -0
- package/dist/chunk-A455ATZB.js +140 -0
- package/dist/chunk-AD7ZFZCS.js +46 -0
- package/dist/chunk-AI4LLQ2U.js +856 -0
- package/dist/chunk-ASX6AW36.js +789 -0
- package/dist/chunk-AT4V4XGI.js +3522 -0
- package/dist/chunk-AWNQ6ED6.js +311 -0
- package/dist/chunk-B4AMLZPB.js +9 -0
- package/dist/chunk-BAKVJLEV.js +417 -0
- package/dist/chunk-BJHVULHO.js +55 -0
- package/dist/chunk-CB2HFKTP.js +9 -0
- package/dist/chunk-CE4ZOCOI.js +1640 -0
- package/dist/chunk-CQQL4ZOQ.js +151 -0
- package/dist/chunk-DEIQMBD2.js +65 -0
- package/dist/chunk-E6I5RXVK.js +58 -0
- package/dist/chunk-EFEHDQGY.js +1589 -0
- package/dist/chunk-EODDVJBM.js +82 -0
- package/dist/chunk-EPC3GZD4.js +308 -0
- package/dist/chunk-FAYRX2AD.js +13 -0
- package/dist/chunk-FFSX2QDQ.js +362 -0
- package/dist/chunk-FHAMQS7Q.js +5856 -0
- package/dist/chunk-FIV4IJL7.js +2263 -0
- package/dist/chunk-FNXVT7HF.js +52 -0
- package/dist/chunk-FSWCWSTS.js +395 -0
- package/dist/chunk-FW5LDDMJ.js +16464 -0
- package/dist/chunk-FXQLIX3K.js +211 -0
- package/dist/chunk-G5AAKEEZ.js +228 -0
- package/dist/chunk-G5S3S5ZN.js +38 -0
- package/dist/chunk-GAZEWQEZ.js +231 -0
- package/dist/chunk-GFJOMSHG.js +125 -0
- package/dist/chunk-GFXZTHNI.js +158 -0
- package/dist/chunk-GM54GJBU.js +960 -0
- package/dist/chunk-GPQ3NJPR.js +900 -0
- package/dist/chunk-GTCU6DZ3.js +1 -0
- package/dist/chunk-H5E77KUJ.js +15 -0
- package/dist/chunk-H72H4XDU.js +1023 -0
- package/dist/chunk-HA4ZYA6T.js +178 -0
- package/dist/chunk-I45KAW2N.js +5020 -0
- package/dist/chunk-IQ35HMQL.js +1396 -0
- package/dist/chunk-IYFBFX34.js +86 -0
- package/dist/chunk-JJPMWPB6.js +109 -0
- package/dist/chunk-JTHKOYWU.js +663 -0
- package/dist/chunk-JVGPR3TS.js +365 -0
- package/dist/chunk-JVKB2TBL.js +48 -0
- package/dist/chunk-JX7VBZDK.js +31 -0
- package/dist/chunk-K3G6JBUC.js +5232 -0
- package/dist/chunk-K4YUNKU7.js +589 -0
- package/dist/chunk-KBZGE6LN.js +710 -0
- package/dist/chunk-KDQJCT2J.js +45 -0
- package/dist/chunk-KI4L2DUL.js +560 -0
- package/dist/chunk-KJ2ZTQSL.js +47 -0
- package/dist/chunk-KSJ5UTP7.js +154 -0
- package/dist/chunk-LHOA5DWA.js +28 -0
- package/dist/chunk-LX5QWLBL.js +27 -0
- package/dist/chunk-LZDDLNCZ.js +279 -0
- package/dist/chunk-M2WF6AXG.js +115 -0
- package/dist/chunk-M7BS2K6U.js +1 -0
- package/dist/chunk-NDBIPFNY.js +102 -0
- package/dist/chunk-NEMIWEXC.js +1199 -0
- package/dist/chunk-NFAYHPRH.js +323 -0
- package/dist/chunk-O37BQ65S.js +21 -0
- package/dist/chunk-O74MJHXU.js +187 -0
- package/dist/chunk-OJZEX73F.js +112 -0
- package/dist/chunk-PAAWLLZX.js +74 -0
- package/dist/chunk-PFXFQQRT.js +339 -0
- package/dist/chunk-PFZO3C6H.js +14 -0
- package/dist/chunk-PHH7LD45.js +113 -0
- package/dist/chunk-QRTG4XTI.js +188 -0
- package/dist/chunk-QVOVMXJR.js +1351 -0
- package/dist/chunk-RCQYT2I4.js +757 -0
- package/dist/chunk-RD6DEE36.js +1178 -0
- package/dist/chunk-RJIZEJ42.js +30 -0
- package/dist/chunk-RPOA7IAE.js +150 -0
- package/dist/chunk-SN2DQRL6.js +1172 -0
- package/dist/chunk-SQJVFEBV.js +41 -0
- package/dist/chunk-SQP64RCS.js +5391 -0
- package/dist/chunk-SVT4RNTR.js +49 -0
- package/dist/chunk-SWUFN7XM.js +43 -0
- package/dist/chunk-SXMVYC5H.js +174 -0
- package/dist/chunk-SZ6AYUIZ.js +23 -0
- package/dist/chunk-T3KGZBU5.js +3171 -0
- package/dist/chunk-TBRL2RCC.js +9 -0
- package/dist/chunk-TRT2HRWZ.js +18 -0
- package/dist/chunk-TYW2GI5I.js +1077 -0
- package/dist/chunk-UIWONWVG.js +4959 -0
- package/dist/chunk-VB3H5WWB.js +151 -0
- package/dist/chunk-W4A6QA3D.js +258 -0
- package/dist/chunk-WBPVKEEE.js +227 -0
- package/dist/chunk-WEBMSQP2.js +123 -0
- package/dist/chunk-WOEZV3Q4.js +333 -0
- package/dist/chunk-WQQON3SV.js +473 -0
- package/dist/chunk-WQTOVMGV.js +119 -0
- package/dist/chunk-WZO23AWO.js +2779 -0
- package/dist/chunk-XBDP4QPW.js +7 -0
- package/dist/chunk-XEBHSJLT.js +103 -0
- package/dist/chunk-XQ2ECNK3.js +1 -0
- package/dist/chunk-XQ2XGIBF.js +2086 -0
- package/dist/chunk-Y2GE5TSI.js +355 -0
- package/dist/chunk-YBUJCZ57.js +351 -0
- package/dist/chunk-YNCVSFGF.js +149 -0
- package/dist/chunk-YUPMXOGP.js +282 -0
- package/dist/chunk-YY6APYUM.js +49 -0
- package/dist/chunk-Z2IJUO45.js +691 -0
- package/dist/chunk-ZEHUCJHY.js +129 -0
- package/dist/chunk-ZYU2YOJ6.js +1496 -0
- package/dist/chunk-ZZ4V3WIZ.js +163 -0
- package/dist/coordination/agents/index.js +145 -6260
- package/dist/coordination/index.js +365 -34324
- package/dist/coordination/mailbox-project-server.js +48 -3276
- package/dist/coordination/provider-status-tracker.d.ts +4 -0
- package/dist/core/agent.d.ts +14 -1
- package/dist/core/index.js +267 -12480
- package/dist/core/model-ref.js +5 -23
- package/dist/core/provider-runner.d.ts +36 -1
- package/dist/design/index.js +50 -1087
- package/dist/execution/index.d.ts +1 -1
- package/dist/execution/index.js +1599 -21888
- package/dist/execution/prompt-enhancer.js +16 -535
- package/dist/execution/retry-policy.d.ts +31 -1
- package/dist/extension/index.js +7 -311
- package/dist/goal/index.js +33 -3435
- package/dist/hooks/index.js +14 -1138
- package/dist/hq/index.js +112 -5139
- package/dist/hq/protocol.js +21 -668
- package/dist/index.js +1410 -92656
- package/dist/infrastructure/index.js +64 -4811
- package/dist/kernel/events/provider-events.d.ts +15 -0
- package/dist/kernel/index.js +14 -992
- package/dist/models/index.js +40 -1117
- package/dist/notifications/index.js +3 -108
- package/dist/observability/index.js +17 -279
- package/dist/plugin/index.js +584 -14835
- package/dist/prompts/index.js +14 -948
- package/dist/registry/index.js +9 -822
- package/dist/registry-R23UBE7H.js +14 -0
- package/dist/replay/index.js +6 -84
- package/dist/review-finding-store-DKAV3AS6.js +21 -0
- package/dist/review-report-store-OWY3EC3N.js +19 -0
- package/dist/security/index.js +114 -2202
- package/dist/session-catalog/index.js +36 -2103
- package/dist/session-catalog/project-server.js +42 -1435
- package/dist/skills/index.js +35 -1578
- package/dist/storage/index.js +182 -15600
- package/dist/tasking/index.js +10 -676
- package/dist/tools/index.js +52 -9590
- package/dist/types/config/autonomy.d.ts +5 -0
- package/dist/types/config/ui.d.ts +1 -1
- package/dist/types/errors.d.ts +18 -0
- package/dist/types/index.js +121 -1342
- package/dist/types/provider-runner.d.ts +8 -0
- package/dist/types/session-markers.js +8 -144
- package/dist/utils/error.js +3 -4
- package/dist/utils/expect-defined.js +3 -9
- package/dist/utils/heap-watchdog.js +6 -706
- package/dist/utils/index.js +269 -5685
- package/dist/utils/sage-output-block.js +5 -42
- package/dist/wiring/proxy-rewrite.d.ts +18 -0
- package/dist/wiring/proxy-rewrite.js +18 -121
- package/dist/worktree/index.js +6 -887
- package/package.json +4 -4
|
@@ -1,538 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
function readBundledInstructionText(relativePath) {
|
|
18
|
-
const cached = textCache.get(relativePath);
|
|
19
|
-
if (cached !== void 0) return cached;
|
|
20
|
-
let resolved = "";
|
|
21
|
-
for (const root of instructionRootCandidates()) {
|
|
22
|
-
try {
|
|
23
|
-
resolved = readFileSync(path.join(root, relativePath), "utf8").trimEnd();
|
|
24
|
-
break;
|
|
25
|
-
} catch {
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
textCache.set(relativePath, resolved);
|
|
29
|
-
return resolved;
|
|
30
|
-
}
|
|
31
|
-
function instructionRootCandidates() {
|
|
32
|
-
if (rootCandidates !== void 0) return rootCandidates;
|
|
33
|
-
const here = path.dirname(fileURLToPath(import.meta.url));
|
|
34
|
-
const candidates = [
|
|
35
|
-
path.resolve(here, "../../instructions"),
|
|
36
|
-
path.resolve(here, "../instructions"),
|
|
37
|
-
path.resolve(here, "instructions")
|
|
38
|
-
];
|
|
39
|
-
rootCandidates = candidates.sort((a, b) => Number(!isDirectory(a)) - Number(!isDirectory(b)));
|
|
40
|
-
return rootCandidates;
|
|
41
|
-
}
|
|
42
|
-
function isDirectory(candidate) {
|
|
43
|
-
try {
|
|
44
|
-
return statSync(candidate).isDirectory();
|
|
45
|
-
} catch {
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// src/execution/prompt-enhancer.ts
|
|
51
|
-
var ENHANCER_SYSTEM_PROMPT = readBundledInstructionText("llm/prompt-enhancer.md");
|
|
52
|
-
var AFFIRMATION_RE = /^(y|n|yes|no|yep|nope|ok|okay|sure|go|go ahead|continue|proceed|stop|cancel|done|next|skip|retry|again|please do|do it)\b[.! ]*$/i;
|
|
53
|
-
function shouldEnhance(text) {
|
|
54
|
-
const t = text.trim();
|
|
55
|
-
if (!t) return false;
|
|
56
|
-
if (t.startsWith("/")) return false;
|
|
57
|
-
if (t.length < 12) return false;
|
|
58
|
-
if (AFFIRMATION_RE.test(t)) return false;
|
|
59
|
-
if (/^[\d\s.,]+$/.test(t)) return false;
|
|
60
|
-
const words = t.split(/\s+/).filter(Boolean);
|
|
61
|
-
if (words.length < 3) return false;
|
|
62
|
-
return true;
|
|
63
|
-
}
|
|
64
|
-
var EFFORT_PREFERENCE = [
|
|
65
|
-
"low",
|
|
66
|
-
"minimal",
|
|
67
|
-
"medium",
|
|
68
|
-
"high",
|
|
69
|
-
"xhigh",
|
|
70
|
-
"max",
|
|
71
|
-
"none"
|
|
72
|
-
];
|
|
73
|
-
function gatedEnhancerReasoning(rc) {
|
|
74
|
-
if (!rc) return void 0;
|
|
75
|
-
if (rc.effortSupported && rc.effortLevels.length > 0) {
|
|
76
|
-
const lowest = EFFORT_PREFERENCE.find((e) => rc.effortLevels.includes(e)) ?? rc.effortLevels[0];
|
|
77
|
-
if (lowest) return { effort: lowest };
|
|
78
|
-
}
|
|
79
|
-
if (rc.disableSupported) return { enabled: false };
|
|
80
|
-
return void 0;
|
|
81
|
-
}
|
|
82
|
-
function normalizedEqual(a, b) {
|
|
83
|
-
const norm = (s) => s.trim().replace(/\s+/g, " ").toLowerCase();
|
|
84
|
-
return norm(a) === norm(b);
|
|
85
|
-
}
|
|
86
|
-
var ENGLISH_PROMPT_WORDS = /* @__PURE__ */ new Set([
|
|
87
|
-
"a",
|
|
88
|
-
"add",
|
|
89
|
-
"analyze",
|
|
90
|
-
"and",
|
|
91
|
-
"api",
|
|
92
|
-
"as",
|
|
93
|
-
"build",
|
|
94
|
-
"change",
|
|
95
|
-
"check",
|
|
96
|
-
"code",
|
|
97
|
-
"configure",
|
|
98
|
-
"create",
|
|
99
|
-
"delete",
|
|
100
|
-
"document",
|
|
101
|
-
"ensure",
|
|
102
|
-
"error",
|
|
103
|
-
"explain",
|
|
104
|
-
"failure",
|
|
105
|
-
"feature",
|
|
106
|
-
"file",
|
|
107
|
-
"fix",
|
|
108
|
-
"for",
|
|
109
|
-
"from",
|
|
110
|
-
"function",
|
|
111
|
-
"implement",
|
|
112
|
-
"improve",
|
|
113
|
-
"in",
|
|
114
|
-
"into",
|
|
115
|
-
"is",
|
|
116
|
-
"issue",
|
|
117
|
-
"it",
|
|
118
|
-
"keep",
|
|
119
|
-
"make",
|
|
120
|
-
"model",
|
|
121
|
-
"of",
|
|
122
|
-
"only",
|
|
123
|
-
"output",
|
|
124
|
-
"parser",
|
|
125
|
-
"preserve",
|
|
126
|
-
"prompt",
|
|
127
|
-
"race",
|
|
128
|
-
"refactor",
|
|
129
|
-
"remove",
|
|
130
|
-
"request",
|
|
131
|
-
"resolve",
|
|
132
|
-
"response",
|
|
133
|
-
"return",
|
|
134
|
-
"run",
|
|
135
|
-
"should",
|
|
136
|
-
"test",
|
|
137
|
-
"that",
|
|
138
|
-
"the",
|
|
139
|
-
"this",
|
|
140
|
-
"to",
|
|
141
|
-
"translate",
|
|
142
|
-
"update",
|
|
143
|
-
"use",
|
|
144
|
-
"validate",
|
|
145
|
-
"version",
|
|
146
|
-
"when",
|
|
147
|
-
"with",
|
|
148
|
-
"write",
|
|
149
|
-
"condition"
|
|
150
|
-
]);
|
|
151
|
-
var NON_ENGLISH_PROMPT_WORDS = /* @__PURE__ */ new Set([
|
|
152
|
-
// Turkish
|
|
153
|
-
"ama",
|
|
154
|
-
"bir",
|
|
155
|
-
"bu",
|
|
156
|
-
"de",
|
|
157
|
-
"d\xFCzelt",
|
|
158
|
-
"et",
|
|
159
|
-
"hata",
|
|
160
|
-
"hatas\u0131n\u0131",
|
|
161
|
-
"hatay\u0131",
|
|
162
|
-
"i\xE7in",
|
|
163
|
-
"ile",
|
|
164
|
-
"olarak",
|
|
165
|
-
"sadece",
|
|
166
|
-
"ve",
|
|
167
|
-
"yap",
|
|
168
|
-
"\u015Fu",
|
|
169
|
-
// Spanish / Portuguese
|
|
170
|
-
"con",
|
|
171
|
-
"corrige",
|
|
172
|
-
"debe",
|
|
173
|
-
"el",
|
|
174
|
-
"en",
|
|
175
|
-
"erro",
|
|
176
|
-
"la",
|
|
177
|
-
"para",
|
|
178
|
-
"que",
|
|
179
|
-
"sin",
|
|
180
|
-
"una",
|
|
181
|
-
// French
|
|
182
|
-
"avec",
|
|
183
|
-
"dans",
|
|
184
|
-
"des",
|
|
185
|
-
"doit",
|
|
186
|
-
"erreur",
|
|
187
|
-
"et",
|
|
188
|
-
"le",
|
|
189
|
-
"les",
|
|
190
|
-
"pour",
|
|
191
|
-
"sans",
|
|
192
|
-
"une",
|
|
193
|
-
// German
|
|
194
|
-
"das",
|
|
195
|
-
"den",
|
|
196
|
-
"der",
|
|
197
|
-
"die",
|
|
198
|
-
"ein",
|
|
199
|
-
"fehler",
|
|
200
|
-
"f\xFCr",
|
|
201
|
-
"mit",
|
|
202
|
-
"ohne",
|
|
203
|
-
"und"
|
|
204
|
-
]);
|
|
205
|
-
function languageWords(text) {
|
|
206
|
-
return text.replaceAll("\u0130", "i").toLowerCase().match(/\p{L}+/gu) ?? [];
|
|
207
|
-
}
|
|
208
|
-
function hasNonLatinScript(text) {
|
|
209
|
-
return /[\p{Script=Arabic}\p{Script=Cyrillic}\p{Script=Han}\p{Script=Hangul}\p{Script=Hiragana}\p{Script=Katakana}]/u.test(
|
|
210
|
-
text
|
|
211
|
-
);
|
|
212
|
-
}
|
|
213
|
-
function languageScores(text) {
|
|
214
|
-
const words = languageWords(text);
|
|
215
|
-
let english = 0;
|
|
216
|
-
let nonEnglish = 0;
|
|
217
|
-
for (const word of words) {
|
|
218
|
-
if (ENGLISH_PROMPT_WORDS.has(word)) english++;
|
|
219
|
-
if (NON_ENGLISH_PROMPT_WORDS.has(word)) nonEnglish++;
|
|
220
|
-
}
|
|
221
|
-
if (/[çğıöşüİı]/u.test(text)) nonEnglish += 2;
|
|
222
|
-
if (hasNonLatinScript(text)) nonEnglish += 3;
|
|
223
|
-
return { english, nonEnglish, words };
|
|
224
|
-
}
|
|
225
|
-
function isValidEnglishRefinement(text) {
|
|
226
|
-
const trimmed = text.trim();
|
|
227
|
-
if (!trimmed) return false;
|
|
228
|
-
const scores = languageScores(trimmed);
|
|
229
|
-
return scores.nonEnglish === 0 && scores.english > 0;
|
|
230
|
-
}
|
|
231
|
-
var VIBE_TAG_PATTERN = /\[vibe\]/iu;
|
|
232
|
-
function preserveVibeTag(original, candidate) {
|
|
233
|
-
if (!VIBE_TAG_PATTERN.test(original) || VIBE_TAG_PATTERN.test(candidate)) return candidate;
|
|
234
|
-
return `[VIBE] ${candidate}`;
|
|
235
|
-
}
|
|
236
|
-
function latestMessageLanguage(text) {
|
|
237
|
-
const scores = languageScores(text);
|
|
238
|
-
if (scores.nonEnglish > scores.english) return "non_english";
|
|
239
|
-
if (scores.english > scores.nonEnglish) return "english";
|
|
240
|
-
return "unknown";
|
|
241
|
-
}
|
|
242
|
-
function parseBilingualEnhancement(raw, original) {
|
|
243
|
-
const separator = /^[\t \u00a0\u200b-\u200d\ufeff]*---[\t \u00a0\u200b-\u200d\ufeff]*\r?$/gm;
|
|
244
|
-
const matches = [...raw.matchAll(separator)];
|
|
245
|
-
if (matches.length !== 1) return null;
|
|
246
|
-
const [match] = matches;
|
|
247
|
-
if (!match) return null;
|
|
248
|
-
const rawRefined = raw.slice(0, match.index).trim();
|
|
249
|
-
const rawEnglish = raw.slice(match.index + match[0].length).trim();
|
|
250
|
-
if (!rawRefined || !rawEnglish) return null;
|
|
251
|
-
const refined = preserveVibeTag(original, rawRefined);
|
|
252
|
-
const english = preserveVibeTag(original, rawEnglish);
|
|
253
|
-
if (!isValidEnglishRefinement(english)) return null;
|
|
254
|
-
const inputLanguage = latestMessageLanguage(original);
|
|
255
|
-
const refinedLanguage = latestMessageLanguage(refined);
|
|
256
|
-
if (inputLanguage === "non_english" && refinedLanguage === "english") return null;
|
|
257
|
-
if (inputLanguage === "unknown" && refinedLanguage === "unknown") return null;
|
|
258
|
-
return { refined, english };
|
|
259
|
-
}
|
|
260
|
-
var DEFAULT_REFINER_RETRY_FEEDBACK = "Make another pass that is sharper and more self-contained. Use the provided project memory, current session context, and recent conversation only to resolve references and preserve project vocabulary; keep the original scope unchanged.";
|
|
261
|
-
function buildRefinerInput(text, history, contextSections, previousRefinement, retryFeedback) {
|
|
262
|
-
const parts = [];
|
|
263
|
-
const renderedContext = renderRefinerContextSections(contextSections);
|
|
264
|
-
if (renderedContext) parts.push(renderedContext);
|
|
265
|
-
if (previousRefinement || retryFeedback) {
|
|
266
|
-
const retryLines = [
|
|
267
|
-
"Retry context (context only - the user asked for another refinement pass):"
|
|
268
|
-
];
|
|
269
|
-
if (previousRefinement?.refined) {
|
|
270
|
-
retryLines.push(`Previous refined version: ${compactText(previousRefinement.refined, 900)}`);
|
|
271
|
-
}
|
|
272
|
-
if (previousRefinement?.english && previousRefinement.english.trim() !== previousRefinement.refined.trim()) {
|
|
273
|
-
retryLines.push(`Previous English version: ${compactText(previousRefinement.english, 900)}`);
|
|
274
|
-
}
|
|
275
|
-
retryLines.push(`Retry instruction: ${retryFeedback ?? DEFAULT_REFINER_RETRY_FEEDBACK}`);
|
|
276
|
-
parts.push(retryLines.join("\n"));
|
|
277
|
-
}
|
|
278
|
-
if (history && history.length > 0) {
|
|
279
|
-
const lines = history.map((t) => `${t.role === "user" ? "User" : "Assistant"}: ${t.text}`);
|
|
280
|
-
parts.push(
|
|
281
|
-
[
|
|
282
|
-
"Recent conversation (context only - do not act on it):",
|
|
283
|
-
...lines
|
|
284
|
-
].join("\n")
|
|
285
|
-
);
|
|
286
|
-
}
|
|
287
|
-
if (parts.length === 0) return text;
|
|
288
|
-
return [
|
|
289
|
-
...parts,
|
|
290
|
-
"",
|
|
291
|
-
"Latest message to refine:",
|
|
292
|
-
text
|
|
293
|
-
].join("\n\n");
|
|
294
|
-
}
|
|
295
|
-
function renderRefinerContextSections(contextSections) {
|
|
296
|
-
const sections = (contextSections ?? []).map((section) => ({
|
|
297
|
-
title: section.title.trim(),
|
|
298
|
-
items: section.items.map((item) => compactText(item, 360)).filter(Boolean)
|
|
299
|
-
})).filter((section) => section.title && section.items.length > 0);
|
|
300
|
-
if (sections.length === 0) return void 0;
|
|
301
|
-
const lines = [
|
|
302
|
-
"Additional project/session context (context only - use to resolve references, conventions, and constraints; do not add new requirements):"
|
|
303
|
-
];
|
|
304
|
-
for (const section of sections) {
|
|
305
|
-
lines.push("", `${section.title}:`);
|
|
306
|
-
for (const item of section.items) lines.push(`- ${item}`);
|
|
307
|
-
}
|
|
308
|
-
return lines.join("\n");
|
|
309
|
-
}
|
|
310
|
-
function compactText(text, maxChars) {
|
|
311
|
-
const compacted = text.replace(/\s+/g, " ").trim();
|
|
312
|
-
if (compacted.length <= maxChars) return compacted;
|
|
313
|
-
return `${compacted.slice(0, Math.max(0, maxChars - 3)).trimEnd()}...`;
|
|
314
|
-
}
|
|
315
|
-
function unknownString(value) {
|
|
316
|
-
return typeof value === "string" && value.trim() ? value.trim() : void 0;
|
|
317
|
-
}
|
|
318
|
-
function iterableStrings(value) {
|
|
319
|
-
if (!value || typeof value === "string") return [];
|
|
320
|
-
if (Array.isArray(value)) {
|
|
321
|
-
return value.flatMap((item) => {
|
|
322
|
-
const text = unknownString(item);
|
|
323
|
-
return text ? [text] : [];
|
|
324
|
-
});
|
|
325
|
-
}
|
|
326
|
-
if (value instanceof Set) {
|
|
327
|
-
return [...value].flatMap((item) => {
|
|
328
|
-
const text = unknownString(item);
|
|
329
|
-
return text ? [text] : [];
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
if (typeof value === "object" && typeof value[Symbol.iterator] === "function") {
|
|
333
|
-
try {
|
|
334
|
-
return Array.from(value).flatMap((item) => {
|
|
335
|
-
const text = unknownString(item);
|
|
336
|
-
return text ? [text] : [];
|
|
337
|
-
});
|
|
338
|
-
} catch {
|
|
339
|
-
return [];
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
return [];
|
|
343
|
-
}
|
|
344
|
-
function lastItems(values, maxItems) {
|
|
345
|
-
return values.slice(Math.max(0, values.length - maxItems));
|
|
346
|
-
}
|
|
347
|
-
function todoLines(value, maxItems) {
|
|
348
|
-
if (!Array.isArray(value)) return [];
|
|
349
|
-
const open = value.filter((item) => {
|
|
350
|
-
if (!item || typeof item !== "object") return false;
|
|
351
|
-
const status = item["status"];
|
|
352
|
-
return status === "pending" || status === "in_progress";
|
|
353
|
-
});
|
|
354
|
-
return open.slice(0, maxItems).flatMap((todo) => {
|
|
355
|
-
const content = unknownString(todo["activeForm"]) ?? unknownString(todo["content"]);
|
|
356
|
-
if (!content) return [];
|
|
357
|
-
return [`open todo (${String(todo["status"])}): ${compactText(content, 220)}`];
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
function buildRefinerSessionContextSection(context) {
|
|
361
|
-
if (!context) return void 0;
|
|
362
|
-
const items = [];
|
|
363
|
-
const projectRoot = unknownString(context.projectRoot);
|
|
364
|
-
const workingDir = unknownString(context.workingDir) ?? unknownString(context.cwd);
|
|
365
|
-
if (projectRoot) items.push(`project root: ${projectRoot}`);
|
|
366
|
-
if (workingDir && workingDir !== projectRoot) items.push(`working dir: ${workingDir}`);
|
|
367
|
-
for (const file of lastItems(iterableStrings(context.readFiles), 6)) {
|
|
368
|
-
items.push(`recently read file: ${file}`);
|
|
369
|
-
}
|
|
370
|
-
for (const file of lastItems(iterableStrings(context.writtenFiles), 6)) {
|
|
371
|
-
items.push(`recently written file: ${file}`);
|
|
372
|
-
}
|
|
373
|
-
items.push(...todoLines(context.todos, 6));
|
|
374
|
-
return items.length > 0 ? { title: "Current session state", items } : void 0;
|
|
375
|
-
}
|
|
376
|
-
function formatMemoryEntry(entry) {
|
|
377
|
-
const meta = [entry.scope, entry.type, entry.priority].filter(Boolean).join("/");
|
|
378
|
-
const tags = entry.tags && entry.tags.length > 0 ? ` tags: ${entry.tags.slice(0, 5).join(", ")}` : "";
|
|
379
|
-
return `${meta ? `[${meta}] ` : ""}${compactText(entry.text, 260)}${tags}`;
|
|
380
|
-
}
|
|
381
|
-
async function collectMemoryEntries(memoryStore, text, scope, limit) {
|
|
382
|
-
const scored = memoryStore.scoreRelevant ? await memoryStore.scoreRelevant({ currentTask: text }, scope, limit).catch(() => []) : [];
|
|
383
|
-
if (scored.length > 0) return scored;
|
|
384
|
-
return memoryStore.search(text || "prompt refinement", scope, limit).catch(() => []);
|
|
385
|
-
}
|
|
386
|
-
async function buildRefinerMemoryContextSection(memoryStore, text) {
|
|
387
|
-
if (!memoryStore) return void 0;
|
|
388
|
-
const seen = /* @__PURE__ */ new Set();
|
|
389
|
-
const entries = [];
|
|
390
|
-
for (const scope of ["project-memory", "user-memory"]) {
|
|
391
|
-
const remaining = Math.max(0, 6 - entries.length);
|
|
392
|
-
if (remaining === 0) break;
|
|
393
|
-
for (const entry of await collectMemoryEntries(memoryStore, text.trim(), scope, remaining)) {
|
|
394
|
-
const key = `${entry.scope}:${entry.text}`;
|
|
395
|
-
if (seen.has(key)) continue;
|
|
396
|
-
seen.add(key);
|
|
397
|
-
entries.push(entry);
|
|
398
|
-
if (entries.length >= 6) break;
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
if (entries.length === 0) return void 0;
|
|
402
|
-
return { title: "Relevant project memory", items: entries.map(formatMemoryEntry) };
|
|
403
|
-
}
|
|
404
|
-
async function buildRefinerContextSections(opts) {
|
|
405
|
-
const sections = [];
|
|
406
|
-
const memory = await buildRefinerMemoryContextSection(opts.memoryStore, opts.text);
|
|
407
|
-
if (memory) sections.push(memory);
|
|
408
|
-
const session = buildRefinerSessionContextSection(opts.context);
|
|
409
|
-
if (session) sections.push(session);
|
|
410
|
-
return sections;
|
|
411
|
-
}
|
|
412
|
-
async function completeRefinerPass(input, opts) {
|
|
413
|
-
if (opts.oneShotOrchestrator) {
|
|
414
|
-
const result = await opts.oneShotOrchestrator.call({
|
|
415
|
-
system: ENHANCER_SYSTEM_PROMPT,
|
|
416
|
-
messages: [{ role: "user", content: input }],
|
|
417
|
-
maxTokens: opts.request.maxTokens,
|
|
418
|
-
timeoutMs: opts.timeoutMs,
|
|
419
|
-
signal: opts.signal
|
|
420
|
-
});
|
|
421
|
-
return result.error ? { text: "", error: result.error } : { text: result.text.trim() };
|
|
422
|
-
}
|
|
423
|
-
const response = await opts.provider.complete(
|
|
424
|
-
{ ...opts.request, messages: [{ role: "user", content: input }] },
|
|
425
|
-
{ signal: opts.signal }
|
|
426
|
-
);
|
|
427
|
-
return {
|
|
428
|
-
text: response.content.filter(isTextBlock).map((block) => block.text).join("\n").trim()
|
|
429
|
-
};
|
|
430
|
-
}
|
|
431
|
-
async function enhanceUserPrompt(opts) {
|
|
432
|
-
const { provider, model, text } = opts;
|
|
433
|
-
const timeoutMs = opts.timeoutMs ?? 9e4;
|
|
434
|
-
const maxTokens = opts.maxTokens ?? 2048;
|
|
435
|
-
const refinerInput = buildRefinerInput(
|
|
436
|
-
text,
|
|
437
|
-
opts.history,
|
|
438
|
-
opts.contextSections,
|
|
439
|
-
opts.previousRefinement,
|
|
440
|
-
opts.retryFeedback
|
|
441
|
-
);
|
|
442
|
-
const req = {
|
|
443
|
-
model,
|
|
444
|
-
system: [{ type: "text", text: ENHANCER_SYSTEM_PROMPT }],
|
|
445
|
-
messages: [{ role: "user", content: refinerInput }],
|
|
446
|
-
maxTokens,
|
|
447
|
-
// NOTE: deliberately NO `temperature`. The main agent loop never sets it,
|
|
448
|
-
// and reasoning models (DeepSeek reasoner, o1/o3, …) return HTTP 400 when
|
|
449
|
-
// `temperature` is present — which would make every refine call fail and
|
|
450
|
-
// silently fall back to the original (no panel shown).
|
|
451
|
-
//
|
|
452
|
-
// A reasoning hint is forwarded ONLY when the caller supplies one (it must
|
|
453
|
-
// already be gated to the model's advertised support — see
|
|
454
|
-
// `gatedEnhancerReasoning`). Absent it, no reasoning field is sent, which
|
|
455
|
-
// is identical to the original behavior.
|
|
456
|
-
...opts.reasoning ? { reasoning: opts.reasoning } : {}
|
|
457
|
-
};
|
|
458
|
-
let timedOut = false;
|
|
459
|
-
const runPass = async (input) => {
|
|
460
|
-
const timer = new AbortController();
|
|
461
|
-
const timeout = setTimeout(() => timer.abort(new Error("enhancer timeout")), timeoutMs);
|
|
462
|
-
const signal = opts.signal ? AbortSignal.any([opts.signal, timer.signal]) : timer.signal;
|
|
463
|
-
try {
|
|
464
|
-
return await completeRefinerPass(input, {
|
|
465
|
-
provider,
|
|
466
|
-
oneShotOrchestrator: opts.oneShotOrchestrator,
|
|
467
|
-
request: req,
|
|
468
|
-
signal,
|
|
469
|
-
timeoutMs
|
|
470
|
-
});
|
|
471
|
-
} catch (error) {
|
|
472
|
-
if (timer.signal.aborted && !opts.signal?.aborted) timedOut = true;
|
|
473
|
-
throw error;
|
|
474
|
-
} finally {
|
|
475
|
-
timer.abort();
|
|
476
|
-
clearTimeout(timeout);
|
|
477
|
-
}
|
|
478
|
-
};
|
|
479
|
-
try {
|
|
480
|
-
const first = await runPass(refinerInput);
|
|
481
|
-
if (first.error) {
|
|
482
|
-
opts.onError?.(first.error, "provider_error");
|
|
483
|
-
return null;
|
|
484
|
-
}
|
|
485
|
-
const parsed = parseBilingualEnhancement(first.text, text);
|
|
486
|
-
if (parsed) return parsed;
|
|
487
|
-
const correctionInput = [
|
|
488
|
-
"Your previous response did not satisfy the required bilingual output contract.",
|
|
489
|
-
'Return exactly two non-empty versions separated by one line containing only "---".',
|
|
490
|
-
"The first version must match the language of the latest message. The second version must be English.",
|
|
491
|
-
"Do not add labels, headings, fences, commentary, or additional separators.",
|
|
492
|
-
"",
|
|
493
|
-
`Latest message to refine:
|
|
494
|
-
${text}`,
|
|
495
|
-
"",
|
|
496
|
-
`Invalid previous response:
|
|
497
|
-
${compactText(first.text || "(empty response)", 1800)}`
|
|
498
|
-
].join("\n");
|
|
499
|
-
const corrected = await runPass(correctionInput);
|
|
500
|
-
if (corrected.error) {
|
|
501
|
-
opts.onError?.(corrected.error, "provider_error");
|
|
502
|
-
return null;
|
|
503
|
-
}
|
|
504
|
-
const correctedParsed = parseBilingualEnhancement(corrected.text, text);
|
|
505
|
-
if (correctedParsed) return correctedParsed;
|
|
506
|
-
opts.onError?.("model returned malformed bilingual output after one corrective retry", "empty");
|
|
507
|
-
return null;
|
|
508
|
-
} catch (err) {
|
|
509
|
-
if (opts.signal?.aborted) return null;
|
|
510
|
-
if (timedOut) {
|
|
511
|
-
opts.onError?.(`timed out after ${Math.round(timeoutMs / 1e3)}s`, "timeout");
|
|
512
|
-
return null;
|
|
513
|
-
}
|
|
514
|
-
opts.onError?.(toErrorMessage(err), "provider_error");
|
|
515
|
-
return null;
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
function messageText(content) {
|
|
519
|
-
if (typeof content === "string") return content;
|
|
520
|
-
return content.filter(isTextBlock).map((b) => b.text).join("\n").trim();
|
|
521
|
-
}
|
|
522
|
-
function recentTextTurns(messages, maxTurns = 6, maxChars = 1500) {
|
|
523
|
-
const turns = [];
|
|
524
|
-
for (let i = messages.length - 1; i >= 0 && turns.length < maxTurns; i--) {
|
|
525
|
-
const m = messages[i];
|
|
526
|
-
if (!m || m.role !== "user" && m.role !== "assistant") continue;
|
|
527
|
-
const text = messageText(m.content);
|
|
528
|
-
if (!text) continue;
|
|
529
|
-
turns.unshift({
|
|
530
|
-
role: m.role,
|
|
531
|
-
text: text.length > maxChars ? `${text.slice(0, maxChars - 1)}\u2026` : text
|
|
532
|
-
});
|
|
533
|
-
}
|
|
534
|
-
return turns;
|
|
535
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_REFINER_RETRY_FEEDBACK,
|
|
3
|
+
ENHANCER_SYSTEM_PROMPT,
|
|
4
|
+
buildRefinerContextSections,
|
|
5
|
+
completeRefinerPass,
|
|
6
|
+
enhanceUserPrompt,
|
|
7
|
+
gatedEnhancerReasoning,
|
|
8
|
+
isValidEnglishRefinement,
|
|
9
|
+
normalizedEqual,
|
|
10
|
+
parseBilingualEnhancement,
|
|
11
|
+
recentTextTurns,
|
|
12
|
+
shouldEnhance
|
|
13
|
+
} from "../chunk-5XDUGTKN.js";
|
|
14
|
+
import "../chunk-5S437PRC.js";
|
|
15
|
+
import "../chunk-O37BQ65S.js";
|
|
16
|
+
import "../chunk-TBRL2RCC.js";
|
|
536
17
|
export {
|
|
537
18
|
DEFAULT_REFINER_RETRY_FEEDBACK,
|
|
538
19
|
ENHANCER_SYSTEM_PROMPT,
|
|
@@ -27,6 +27,35 @@ import type { RetryPolicy } from '../types/retry-policy.js';
|
|
|
27
27
|
* kind IS fallback-worthy, so another provider gets tried immediately.
|
|
28
28
|
*/
|
|
29
29
|
export declare const MODEL_RETRIES = 3;
|
|
30
|
+
/**
|
|
31
|
+
* First-retry wait for the exponential schedule, in ms.
|
|
32
|
+
*
|
|
33
|
+
* The schedule is `RETRY_BASE_DELAY_MS * 2^attempt + jitter`, so with a
|
|
34
|
+
* base of 4s and {@link MODEL_RETRIES} attempts a struggling route waits
|
|
35
|
+
* 4s → 8s → 16s before the turn hands over to the fallback chain.
|
|
36
|
+
*
|
|
37
|
+
* It used to be 1000 (1s → 2s → 4s). That schedule was too eager for the
|
|
38
|
+
* failure it actually fires on: a provider that just refused a request
|
|
39
|
+
* because of a network blip, an overload, or a burst-rate window is
|
|
40
|
+
* almost never healthy again 1 second later, so the first two retries
|
|
41
|
+
* mostly bought another two failures — three requests hammered out inside
|
|
42
|
+
* ~7 seconds — and then reported the same error anyway. Starting at 4s
|
|
43
|
+
* gives the far side a realistic window to recover, and still exhausts
|
|
44
|
+
* all three in-place attempts in well under half a minute.
|
|
45
|
+
*
|
|
46
|
+
* NOTE: this is only the *fallback* schedule. A provider that sends a
|
|
47
|
+
* `Retry-After` still wins outright (see {@link DefaultRetryPolicy.delayMs}).
|
|
48
|
+
*/
|
|
49
|
+
export declare const RETRY_BASE_DELAY_MS = 4000;
|
|
50
|
+
/**
|
|
51
|
+
* Width of the uniform jitter added to every exponential wait, in ms.
|
|
52
|
+
*
|
|
53
|
+
* Deliberately decoupled from {@link RETRY_BASE_DELAY_MS}: jitter exists to
|
|
54
|
+
* de-synchronise concurrent agents retrying the same route, and one second
|
|
55
|
+
* of spread is plenty for that. Scaling it with the base would have turned
|
|
56
|
+
* the first retry into a 4–8s coin flip for no added benefit.
|
|
57
|
+
*/
|
|
58
|
+
export declare const RETRY_JITTER_MS = 1000;
|
|
30
59
|
export declare class DefaultRetryPolicy implements RetryPolicy {
|
|
31
60
|
shouldRetry(err: Error | ProviderError, attempt: number): boolean;
|
|
32
61
|
maxAttempts(err: Error | ProviderError): number;
|
|
@@ -39,7 +68,8 @@ export declare class DefaultRetryPolicy implements RetryPolicy {
|
|
|
39
68
|
* [0, MAX_RETRY_AFTER_MS]. The provider told us exactly when
|
|
40
69
|
* to come back; we should listen.
|
|
41
70
|
* 2. Otherwise fall through to the exponential-with-jitter
|
|
42
|
-
* schedule (`
|
|
71
|
+
* schedule (`RETRY_BASE_DELAY_MS * 2^attempt + jitter`, capped
|
|
72
|
+
* at 30s) — 4s → 8s → 16s for the three in-place attempts.
|
|
43
73
|
*
|
|
44
74
|
* `err` is optional for back-compat with the existing interface;
|
|
45
75
|
* callers should pass it whenever available.
|