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