pybao-cli 1.5.7 → 1.5.9

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 (169) hide show
  1. package/dist/REPL-FDBOFOZN.js +50 -0
  2. package/dist/{acp-2LMTSBAU.js → acp-TKO6ZSSV.js} +54 -36
  3. package/dist/acp-TKO6ZSSV.js.map +7 -0
  4. package/dist/{agentsValidate-YQSHYCYC.js → agentsValidate-RDNLI7GA.js} +7 -7
  5. package/dist/{ask-4Z4LH5IS.js → ask-KTXMYPIA.js} +60 -34
  6. package/dist/ask-KTXMYPIA.js.map +7 -0
  7. package/dist/{autoUpdater-UTX7ZX2N.js → autoUpdater-53BZ6QWD.js} +3 -3
  8. package/dist/{chunk-OY6SB5B3.js → chunk-276RV4DQ.js} +4 -4
  9. package/dist/{chunk-7FFBXWS3.js → chunk-35X2VS4L.js} +3 -3
  10. package/dist/{chunk-VZDDKAL2.js → chunk-4C2CGHBI.js} +2 -2
  11. package/dist/{chunk-Y2RSIF7P.js → chunk-4KPVE4K7.js} +1 -1
  12. package/dist/{chunk-SDKYJZWD.js → chunk-57GJQMFS.js} +2 -2
  13. package/dist/{chunk-3JH34RBY.js → chunk-6PXEXL7C.js} +2 -2
  14. package/dist/{chunk-IKMMFSNJ.js → chunk-AMQ6XZOU.js} +1 -1
  15. package/dist/{chunk-W4PXRGP3.js → chunk-AWRDD6BG.js} +18 -1
  16. package/dist/chunk-AWRDD6BG.js.map +7 -0
  17. package/dist/{chunk-5JKCAVMI.js → chunk-BZGQQ4WZ.js} +3 -3
  18. package/dist/{chunk-4BFEUSKN.js → chunk-CATWZQ3R.js} +2 -2
  19. package/dist/{chunk-EGJRWKZ6.js → chunk-CPLMSZ63.js} +4 -4
  20. package/dist/{chunk-PI5RBPFA.js → chunk-DA6NJEFI.js} +2 -2
  21. package/dist/{chunk-IFC2PLAM.js → chunk-E35YJNX2.js} +4 -4
  22. package/dist/{chunk-TIMEEE5U.js → chunk-G7DKRXDS.js} +1 -4
  23. package/dist/{chunk-5F6IQJHF.js → chunk-HIJYNCCN.js} +1 -1
  24. package/dist/{chunk-F7HYDAWW.js → chunk-JE43CQYI.js} +3 -3
  25. package/dist/{chunk-JEAXJP2E.js → chunk-JLC2I3EY.js} +1 -1
  26. package/dist/chunk-JRMAK4PK.js +926 -0
  27. package/dist/chunk-JRMAK4PK.js.map +7 -0
  28. package/dist/{chunk-KLD4WAB6.js → chunk-KNLP4UO6.js} +4 -4
  29. package/dist/chunk-L3R7MPZU.js +81 -0
  30. package/dist/{chunk-ZD6NMP33.js.map → chunk-L3R7MPZU.js.map} +1 -1
  31. package/dist/{chunk-PMYMUSB4.js → chunk-LEYWQQ7V.js} +3 -3
  32. package/dist/{chunk-EN7L7JWN.js → chunk-LIOZM4KE.js} +1 -1
  33. package/dist/chunk-OC5CZWBQ.js.map +7 -0
  34. package/dist/{chunk-SWNNPHFY.js → chunk-PH6DPTO3.js} +2025 -1321
  35. package/dist/chunk-PH6DPTO3.js.map +7 -0
  36. package/dist/{chunk-CJ2YYIJN.js → chunk-PPFVOBEG.js} +144 -76
  37. package/dist/chunk-PPFVOBEG.js.map +7 -0
  38. package/dist/{chunk-4R7NUADF.js → chunk-Q5EZLUFC.js} +1 -1
  39. package/dist/{chunk-LYMH46VN.js → chunk-QMN64ICT.js} +3 -3
  40. package/dist/{chunk-VBV5RHIK.js → chunk-R4ZEH3KJ.js} +1 -1
  41. package/dist/{chunk-TKEWBSVM.js → chunk-SNASBZ2C.js} +3 -3
  42. package/dist/chunk-T7P3SSAQ.js +78 -0
  43. package/dist/chunk-T7P3SSAQ.js.map +7 -0
  44. package/dist/{chunk-T7UTA73F.js → chunk-TLZS274Y.js} +3 -3
  45. package/dist/{chunk-IOP3VA4X.js → chunk-YSL5H7NJ.js} +2 -2
  46. package/dist/{chunk-HFVRQO2J.js → chunk-YTEQEQ56.js} +48 -40
  47. package/dist/chunk-YTEQEQ56.js.map +7 -0
  48. package/dist/{cli-N3Q4D4BW.js → cli-LYWCNPC6.js} +131 -102
  49. package/dist/cli-LYWCNPC6.js.map +7 -0
  50. package/dist/commands-DYXAWJO6.js +54 -0
  51. package/dist/{config-GZXNPIIG.js → config-66BMMOES.js} +4 -4
  52. package/dist/{context-TUO5CUR3.js → context-PG7YTQCJ.js} +6 -6
  53. package/dist/conversationPersistence-DB6IUU2I.js +13 -0
  54. package/dist/{conversationTracker-APB6PR5Z.js → conversationTracker-WG3J56PX.js} +4 -3
  55. package/dist/{customCommands-J4DV6OI5.js → customCommands-XDKUVT73.js} +4 -4
  56. package/dist/{env-YBYEMHYQ.js → env-FW74XJHK.js} +2 -2
  57. package/dist/{file-KIBY6XZX.js → file-U2NXQ6RC.js} +4 -4
  58. package/dist/index.js +3 -3
  59. package/dist/{llm-T7C6QJWB.js → llm-6VJMMPDO.js} +416 -49
  60. package/dist/llm-6VJMMPDO.js.map +7 -0
  61. package/dist/{llmLazy-FDVUCPDQ.js → llmLazy-LYGZWC7G.js} +1 -1
  62. package/dist/{loader-QCHS455W.js → loader-DMZVU2XJ.js} +4 -4
  63. package/dist/{lsp-TE2SQ6CO.js → lsp-6LNF5DQB.js} +6 -6
  64. package/dist/{lspAnchor-IZ7YQJ64.js → lspAnchor-SF5Y7ZJT.js} +6 -6
  65. package/dist/{mcp-PLAWUZOQ.js → mcp-NLDX3RQE.js} +7 -7
  66. package/dist/{mentionProcessor-2O3AMZHB.js → mentionProcessor-BMX6VGRH.js} +5 -5
  67. package/dist/{messages-ZHFZ2OOG.js → messages-OTQ6IJM5.js} +9 -5
  68. package/dist/{model-GBC2PBVJ.js → model-KWGEASLY.js} +5 -5
  69. package/dist/{openai-2V2J23AE.js → openai-XIRWQY5H.js} +5 -5
  70. package/dist/{outputStyles-WD4VD4GZ.js → outputStyles-HKYM5C76.js} +4 -4
  71. package/dist/{pluginRuntime-WNZS26EV.js → pluginRuntime-25Y2MVIN.js} +6 -6
  72. package/dist/{pluginValidation-YP7MW35I.js → pluginValidation-CIJIQKGB.js} +6 -6
  73. package/dist/prompts-WH3VEHH6.js +56 -0
  74. package/dist/{pybAgentSessionLoad-YABCHELS.js → pybAgentSessionLoad-TF3BFX4S.js} +4 -4
  75. package/dist/{pybAgentSessionResume-C3LNSFQL.js → pybAgentSessionResume-Y5JO4GLH.js} +4 -4
  76. package/dist/{pybAgentStreamJsonSession-DFOGLEOB.js → pybAgentStreamJsonSession-46VLF4QN.js} +4 -3
  77. package/dist/pybAgentStreamJsonSession-46VLF4QN.js.map +7 -0
  78. package/dist/{pybHooks-LGGIB5PJ.js → pybHooks-LZPU4EF6.js} +4 -4
  79. package/dist/query-4B3GTPBN.js +58 -0
  80. package/dist/{registry-EYMCKHRG.js → registry-6LUE7ZWC.js} +5 -5
  81. package/dist/{ripgrep-JZN2MVSK.js → ripgrep-KVB55D22.js} +3 -3
  82. package/dist/{skillMarketplace-ETYXMAXF.js → skillMarketplace-2IVEPC2E.js} +3 -3
  83. package/dist/{state-MAVHRDNE.js → state-OGBESWFS.js} +2 -2
  84. package/dist/{theme-AUEZ6SNA.js → theme-QQ2SCFEK.js} +5 -5
  85. package/dist/{toolPermissionSettings-7JZYBUZC.js → toolPermissionSettings-ZGGPBK6S.js} +6 -6
  86. package/dist/tools-UXPFIHD4.js +55 -0
  87. package/dist/tools-UXPFIHD4.js.map +7 -0
  88. package/dist/{userInput-V6RU4BEQ.js → userInput-75VCTJDE.js} +76 -49
  89. package/dist/userInput-75VCTJDE.js.map +7 -0
  90. package/package.json +18 -1
  91. package/dist/REPL-YW6AH5YU.js +0 -49
  92. package/dist/acp-2LMTSBAU.js.map +0 -7
  93. package/dist/ask-4Z4LH5IS.js.map +0 -7
  94. package/dist/chunk-CJ2YYIJN.js.map +0 -7
  95. package/dist/chunk-HFVRQO2J.js.map +0 -7
  96. package/dist/chunk-O6DTZU7F.js.map +0 -7
  97. package/dist/chunk-SWNNPHFY.js.map +0 -7
  98. package/dist/chunk-W4PXRGP3.js.map +0 -7
  99. package/dist/chunk-YNGGZILT.js +0 -516
  100. package/dist/chunk-YNGGZILT.js.map +0 -7
  101. package/dist/chunk-ZD6NMP33.js +0 -240
  102. package/dist/cli-N3Q4D4BW.js.map +0 -7
  103. package/dist/commands-OOINF26E.js +0 -53
  104. package/dist/llm-T7C6QJWB.js.map +0 -7
  105. package/dist/prompts-QPYUI6SX.js +0 -55
  106. package/dist/pybAgentStreamJsonSession-DFOGLEOB.js.map +0 -7
  107. package/dist/query-EC6HGBDS.js +0 -57
  108. package/dist/tools-3JFVDDSZ.js +0 -54
  109. package/dist/userInput-V6RU4BEQ.js.map +0 -7
  110. /package/dist/{REPL-YW6AH5YU.js.map → REPL-FDBOFOZN.js.map} +0 -0
  111. /package/dist/{agentsValidate-YQSHYCYC.js.map → agentsValidate-RDNLI7GA.js.map} +0 -0
  112. /package/dist/{autoUpdater-UTX7ZX2N.js.map → autoUpdater-53BZ6QWD.js.map} +0 -0
  113. /package/dist/{chunk-OY6SB5B3.js.map → chunk-276RV4DQ.js.map} +0 -0
  114. /package/dist/{chunk-7FFBXWS3.js.map → chunk-35X2VS4L.js.map} +0 -0
  115. /package/dist/{chunk-VZDDKAL2.js.map → chunk-4C2CGHBI.js.map} +0 -0
  116. /package/dist/{chunk-Y2RSIF7P.js.map → chunk-4KPVE4K7.js.map} +0 -0
  117. /package/dist/{chunk-SDKYJZWD.js.map → chunk-57GJQMFS.js.map} +0 -0
  118. /package/dist/{chunk-3JH34RBY.js.map → chunk-6PXEXL7C.js.map} +0 -0
  119. /package/dist/{chunk-IKMMFSNJ.js.map → chunk-AMQ6XZOU.js.map} +0 -0
  120. /package/dist/{chunk-5JKCAVMI.js.map → chunk-BZGQQ4WZ.js.map} +0 -0
  121. /package/dist/{chunk-4BFEUSKN.js.map → chunk-CATWZQ3R.js.map} +0 -0
  122. /package/dist/{chunk-EGJRWKZ6.js.map → chunk-CPLMSZ63.js.map} +0 -0
  123. /package/dist/{chunk-PI5RBPFA.js.map → chunk-DA6NJEFI.js.map} +0 -0
  124. /package/dist/{chunk-IFC2PLAM.js.map → chunk-E35YJNX2.js.map} +0 -0
  125. /package/dist/{chunk-TIMEEE5U.js.map → chunk-G7DKRXDS.js.map} +0 -0
  126. /package/dist/{chunk-5F6IQJHF.js.map → chunk-HIJYNCCN.js.map} +0 -0
  127. /package/dist/{chunk-F7HYDAWW.js.map → chunk-JE43CQYI.js.map} +0 -0
  128. /package/dist/{chunk-JEAXJP2E.js.map → chunk-JLC2I3EY.js.map} +0 -0
  129. /package/dist/{chunk-KLD4WAB6.js.map → chunk-KNLP4UO6.js.map} +0 -0
  130. /package/dist/{chunk-PMYMUSB4.js.map → chunk-LEYWQQ7V.js.map} +0 -0
  131. /package/dist/{chunk-EN7L7JWN.js.map → chunk-LIOZM4KE.js.map} +0 -0
  132. /package/dist/{chunk-O6DTZU7F.js → chunk-OC5CZWBQ.js} +0 -0
  133. /package/dist/{chunk-4R7NUADF.js.map → chunk-Q5EZLUFC.js.map} +0 -0
  134. /package/dist/{chunk-LYMH46VN.js.map → chunk-QMN64ICT.js.map} +0 -0
  135. /package/dist/{chunk-VBV5RHIK.js.map → chunk-R4ZEH3KJ.js.map} +0 -0
  136. /package/dist/{chunk-TKEWBSVM.js.map → chunk-SNASBZ2C.js.map} +0 -0
  137. /package/dist/{chunk-T7UTA73F.js.map → chunk-TLZS274Y.js.map} +0 -0
  138. /package/dist/{chunk-IOP3VA4X.js.map → chunk-YSL5H7NJ.js.map} +0 -0
  139. /package/dist/{commands-OOINF26E.js.map → commands-DYXAWJO6.js.map} +0 -0
  140. /package/dist/{config-GZXNPIIG.js.map → config-66BMMOES.js.map} +0 -0
  141. /package/dist/{context-TUO5CUR3.js.map → context-PG7YTQCJ.js.map} +0 -0
  142. /package/dist/{conversationTracker-APB6PR5Z.js.map → conversationPersistence-DB6IUU2I.js.map} +0 -0
  143. /package/dist/{customCommands-J4DV6OI5.js.map → conversationTracker-WG3J56PX.js.map} +0 -0
  144. /package/dist/{env-YBYEMHYQ.js.map → customCommands-XDKUVT73.js.map} +0 -0
  145. /package/dist/{file-KIBY6XZX.js.map → env-FW74XJHK.js.map} +0 -0
  146. /package/dist/{llmLazy-FDVUCPDQ.js.map → file-U2NXQ6RC.js.map} +0 -0
  147. /package/dist/{loader-QCHS455W.js.map → llmLazy-LYGZWC7G.js.map} +0 -0
  148. /package/dist/{lsp-TE2SQ6CO.js.map → loader-DMZVU2XJ.js.map} +0 -0
  149. /package/dist/{mcp-PLAWUZOQ.js.map → lsp-6LNF5DQB.js.map} +0 -0
  150. /package/dist/{lspAnchor-IZ7YQJ64.js.map → lspAnchor-SF5Y7ZJT.js.map} +0 -0
  151. /package/dist/{messages-ZHFZ2OOG.js.map → mcp-NLDX3RQE.js.map} +0 -0
  152. /package/dist/{mentionProcessor-2O3AMZHB.js.map → mentionProcessor-BMX6VGRH.js.map} +0 -0
  153. /package/dist/{model-GBC2PBVJ.js.map → messages-OTQ6IJM5.js.map} +0 -0
  154. /package/dist/{openai-2V2J23AE.js.map → model-KWGEASLY.js.map} +0 -0
  155. /package/dist/{outputStyles-WD4VD4GZ.js.map → openai-XIRWQY5H.js.map} +0 -0
  156. /package/dist/{pluginValidation-YP7MW35I.js.map → outputStyles-HKYM5C76.js.map} +0 -0
  157. /package/dist/{pluginRuntime-WNZS26EV.js.map → pluginRuntime-25Y2MVIN.js.map} +0 -0
  158. /package/dist/{prompts-QPYUI6SX.js.map → pluginValidation-CIJIQKGB.js.map} +0 -0
  159. /package/dist/{pybAgentSessionLoad-YABCHELS.js.map → prompts-WH3VEHH6.js.map} +0 -0
  160. /package/dist/{pybAgentSessionResume-C3LNSFQL.js.map → pybAgentSessionLoad-TF3BFX4S.js.map} +0 -0
  161. /package/dist/{pybHooks-LGGIB5PJ.js.map → pybAgentSessionResume-Y5JO4GLH.js.map} +0 -0
  162. /package/dist/{query-EC6HGBDS.js.map → pybHooks-LZPU4EF6.js.map} +0 -0
  163. /package/dist/{registry-EYMCKHRG.js.map → query-4B3GTPBN.js.map} +0 -0
  164. /package/dist/{ripgrep-JZN2MVSK.js.map → registry-6LUE7ZWC.js.map} +0 -0
  165. /package/dist/{skillMarketplace-ETYXMAXF.js.map → ripgrep-KVB55D22.js.map} +0 -0
  166. /package/dist/{state-MAVHRDNE.js.map → skillMarketplace-2IVEPC2E.js.map} +0 -0
  167. /package/dist/{theme-AUEZ6SNA.js.map → state-OGBESWFS.js.map} +0 -0
  168. /package/dist/{toolPermissionSettings-7JZYBUZC.js.map → theme-QQ2SCFEK.js.map} +0 -0
  169. /package/dist/{tools-3JFVDDSZ.js.map → toolPermissionSettings-ZGGPBK6S.js.map} +0 -0
@@ -0,0 +1,926 @@
1
+ import { createRequire as __pybCreateRequire } from "node:module";
2
+ const require = __pybCreateRequire(import.meta.url);
3
+
4
+ // src/utils/messages/core.ts
5
+ import { createHash, randomUUID } from "crypto";
6
+ import { last, memoize } from "lodash-es";
7
+
8
+ // src/services/ai/llmConstants.ts
9
+ var API_ERROR_MESSAGE_PREFIX = "API Error";
10
+ var PROMPT_TOO_LONG_ERROR_MESSAGE = "Prompt is too long";
11
+ var CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE = "Credit balance is too low";
12
+ var INVALID_API_KEY_ERROR_MESSAGE = "Invalid API key \xB7 Please run /login";
13
+ var NO_CONTENT_MESSAGE = "(no content)";
14
+ var MAIN_QUERY_TEMPERATURE = 1;
15
+
16
+ // src/services/telemetry/eventBus.ts
17
+ var listeners = /* @__PURE__ */ new Map();
18
+ function registerTelemetryListener(listenerId, listener) {
19
+ listeners.set(listenerId, listener);
20
+ }
21
+ function emitTelemetryEvent(event) {
22
+ for (const listener of listeners.values()) {
23
+ listener(event);
24
+ }
25
+ }
26
+
27
+ // src/utils/session/autoCompactMetrics.ts
28
+ function safeDivide(numerator, denominator) {
29
+ if (denominator <= 0) return 0;
30
+ return numerator / denominator;
31
+ }
32
+ function computeAutoCompactMetrics(events) {
33
+ const failedEvents = events.filter((event) => event.phase === "AUTO_COMPACT_FAILED");
34
+ const retryEvents = events.filter((event) => event.phase === "AUTO_COMPACT_RETRY");
35
+ const fallbackEvents = events.filter((event) => event.phase === "AUTO_COMPACT_FALLBACK");
36
+ const invalidShapeFailures = failedEvents.filter(
37
+ (event) => event.data?.failureType === "invalid_content_shape"
38
+ ).length;
39
+ const compact_invalid_shape_rate = safeDivide(
40
+ invalidShapeFailures,
41
+ failedEvents.length
42
+ );
43
+ const retrySuccessSignals = fallbackEvents.length;
44
+ const compact_retry_success_rate = safeDivide(
45
+ retrySuccessSignals,
46
+ retryEvents.length + fallbackEvents.length
47
+ );
48
+ const transformAppliedEvents = events.filter(
49
+ (event) => event.phase === "MESSAGE_TRANSFORM_APPLIED"
50
+ );
51
+ const thinkingFirstCount = transformAppliedEvents.filter((event) => {
52
+ const stats = event.data?.outputBlockStats || {};
53
+ const thinking = Number(stats.thinking ?? 0);
54
+ const text = Number(stats.text ?? 0);
55
+ return thinking > 0 && text > 0;
56
+ }).length;
57
+ const thinking_first_ratio = safeDivide(
58
+ thinkingFirstCount,
59
+ transformAppliedEvents.length
60
+ );
61
+ const crossReplayTagged = events.filter(
62
+ (event) => event.phase === "AUTO_COMPACT_FAILED" || event.phase === "AUTO_COMPACT_RETRY" || event.phase === "AUTO_COMPACT_FALLBACK"
63
+ );
64
+ const crossReplayErrors = crossReplayTagged.filter(
65
+ (event) => event.data?.crossModelReplay === true && event.phase === "AUTO_COMPACT_FAILED"
66
+ ).length;
67
+ const crossReplayTotal = crossReplayTagged.filter(
68
+ (event) => event.data?.crossModelReplay === true
69
+ ).length;
70
+ const cross_model_replay_error_rate = safeDivide(
71
+ crossReplayErrors,
72
+ crossReplayTotal
73
+ );
74
+ const sessionTypedPathEvents = events.filter(
75
+ (event) => event.phase === "SESSION_TYPED_PATH_APPLIED"
76
+ );
77
+ const sessionFallbackEvents = events.filter(
78
+ (event) => event.phase === "SESSION_CANONICAL_FALLBACK_APPLIED"
79
+ );
80
+ const sessionTypedConsistencyFailedEvents = events.filter(
81
+ (event) => event.phase === "SESSION_TYPED_PATH_CONSISTENCY_FAILED"
82
+ );
83
+ const typedPathDecisionEventsCount = sessionTypedPathEvents.length + sessionFallbackEvents.length + sessionTypedConsistencyFailedEvents.length;
84
+ const typed_primary_path_rate = sessionTypedPathEvents.length + sessionFallbackEvents.length > 0 ? safeDivide(
85
+ sessionTypedPathEvents.length,
86
+ sessionTypedPathEvents.length + sessionFallbackEvents.length
87
+ ) : void 0;
88
+ const typed_contract_fail_rate = typedPathDecisionEventsCount > 0 ? safeDivide(
89
+ sessionTypedConsistencyFailedEvents.length,
90
+ typedPathDecisionEventsCount
91
+ ) : void 0;
92
+ const recoverable_failure_rate = failedEvents.length + retryEvents.length > 0 ? safeDivide(retryEvents.length, failedEvents.length + retryEvents.length) : void 0;
93
+ const retry_exhausted_rate = failedEvents.length > 0 ? safeDivide(
94
+ failedEvents.filter(
95
+ (event) => Number.isFinite(Number(event.data?.attempts)) && Number(event.data?.attempts) >= 2
96
+ ).length,
97
+ failedEvents.length
98
+ ) : void 0;
99
+ const boundaryEvents = events.filter(
100
+ (event) => event.phase === "COMPACTION_BOUNDARY_APPLIED"
101
+ );
102
+ const compaction_boundary_hit_rate = boundaryEvents.length > 0 ? safeDivide(
103
+ boundaryEvents.filter((event) => event.data?.applied === true).length,
104
+ boundaryEvents.length
105
+ ) : void 0;
106
+ const replayOutcomeEvents = boundaryEvents.filter(
107
+ (event) => ["replayed_latest_user_task", "synthetic_continue_prompt"].includes(
108
+ String(event.data?.replayMode ?? "")
109
+ )
110
+ );
111
+ const overflow_replay_success_rate = replayOutcomeEvents.length > 0 ? safeDivide(
112
+ replayOutcomeEvents.filter(
113
+ (event) => event.data?.replayMode === "replayed_latest_user_task"
114
+ ).length,
115
+ replayOutcomeEvents.length
116
+ ) : void 0;
117
+ const compaction_reentry_success_rate = overflow_replay_success_rate;
118
+ const pruneCoverageSamples = boundaryEvents.filter(
119
+ (event) => typeof event.data?.pruneMarkerConsumed === "boolean"
120
+ );
121
+ const prune_marker_coverage_rate = pruneCoverageSamples.length > 0 ? safeDivide(
122
+ pruneCoverageSamples.filter(
123
+ (event) => event.data?.pruneMarkerConsumed === true
124
+ ).length,
125
+ pruneCoverageSamples.length
126
+ ) : void 0;
127
+ const indexIntegritySamples = boundaryEvents.filter(
128
+ (event) => event.data?.indexValidationKnown === true
129
+ );
130
+ const compacted_index_integrity_rate = indexIntegritySamples.length > 0 ? safeDivide(
131
+ indexIntegritySamples.filter(
132
+ (event) => event.data?.indexValidationValid === true
133
+ ).length,
134
+ indexIntegritySamples.length
135
+ ) : void 0;
136
+ const lifecycleEvents = events.filter(
137
+ (event) => event.phase === "TOOL_OUTPUT_LIFECYCLE_APPLIED"
138
+ );
139
+ const lifecycleAppliedEvents = lifecycleEvents.filter(
140
+ (event) => event.data?.applied !== false
141
+ );
142
+ const lifecycleAgedTotal = lifecycleAppliedEvents.reduce(
143
+ (sum, event) => sum + Number(event.data?.agedBlocks ?? 0),
144
+ 0
145
+ );
146
+ const lifecycleToolResultBeforeTotal = lifecycleAppliedEvents.reduce(
147
+ (sum, event) => sum + Number(event.data?.totalToolResultBlocksBefore ?? 0),
148
+ 0
149
+ );
150
+ const lifecyclePlaceholderTotal = lifecycleAppliedEvents.reduce(
151
+ (sum, event) => sum + Number(event.data?.l2Blocks ?? 0) + Number(event.data?.l3Blocks ?? 0),
152
+ 0
153
+ );
154
+ const lifecycleBeforeTokensTotal = lifecycleAppliedEvents.reduce(
155
+ (sum, event) => sum + Number(event.data?.beforeTokens ?? 0),
156
+ 0
157
+ );
158
+ const lifecycleTokenDeltaTotal = lifecycleAppliedEvents.reduce(
159
+ (sum, event) => sum + Number(event.data?.tokenDelta ?? 0),
160
+ 0
161
+ );
162
+ const danglingDetectedTotal = lifecycleAppliedEvents.reduce(
163
+ (sum, event) => sum + Number(event.data?.danglingDetected ?? 0),
164
+ 0
165
+ );
166
+ const danglingClosedTotal = lifecycleAppliedEvents.reduce(
167
+ (sum, event) => sum + Number(event.data?.danglingClosed ?? 0),
168
+ 0
169
+ );
170
+ const tool_output_aging_hit_rate = lifecycleToolResultBeforeTotal > 0 ? safeDivide(lifecycleAgedTotal, lifecycleToolResultBeforeTotal) : void 0;
171
+ const tool_output_placeholder_hit_rate = lifecycleAgedTotal > 0 ? safeDivide(lifecyclePlaceholderTotal, lifecycleAgedTotal) : void 0;
172
+ const tool_output_token_reduction_rate = lifecycleBeforeTokensTotal > 0 ? safeDivide(lifecycleTokenDeltaTotal, lifecycleBeforeTokensTotal) : void 0;
173
+ const dangling_tool_closure_rate = danglingDetectedTotal > 0 ? safeDivide(danglingClosedTotal, danglingDetectedTotal) : void 0;
174
+ const status_compensation_failure_rate = danglingDetectedTotal > 0 ? safeDivide(
175
+ Math.max(0, danglingDetectedTotal - danglingClosedTotal),
176
+ danglingDetectedTotal
177
+ ) : void 0;
178
+ const lifecycleDraftEvents = events.filter(
179
+ (event) => event.phase === "TOOL_OUTPUT_LIFECYCLE_PRE_GATE_METRICS_DRAFT"
180
+ );
181
+ const latestLifecycleDraft = lifecycleDraftEvents.length > 0 ? lifecycleDraftEvents[lifecycleDraftEvents.length - 1] : void 0;
182
+ const w11_sample_pass_rate = Number.isFinite(
183
+ Number(latestLifecycleDraft?.data?.w11_sample_pass_rate)
184
+ ) ? Number(latestLifecycleDraft?.data?.w11_sample_pass_rate) : void 0;
185
+ const w14_sample_pass_rate = Number.isFinite(
186
+ Number(latestLifecycleDraft?.data?.w14_sample_pass_rate)
187
+ ) ? Number(latestLifecycleDraft?.data?.w14_sample_pass_rate) : void 0;
188
+ const postPruneNoiseSamples = lifecycleEvents.filter(
189
+ (event) => Number.isFinite(Number(event.data?.beforeTokens)) && Number(event.data?.beforeTokens) > 0 && Number.isFinite(Number(event.data?.afterTokens))
190
+ );
191
+ const post_prune_noise_ratio = postPruneNoiseSamples.length > 0 ? postPruneNoiseSamples.reduce((sum, event) => {
192
+ const before = Number(event.data?.beforeTokens);
193
+ const after = Number(event.data?.afterTokens);
194
+ return sum + Math.max(0, Math.min(1, safeDivide(after, before)));
195
+ }, 0) / postPruneNoiseSamples.length : void 0;
196
+ const sanitizerEvents = events.filter(
197
+ (event) => event.phase === "AUTO_COMPACT_SANITIZER_APPLIED"
198
+ );
199
+ const removedNoiseTotal = sanitizerEvents.reduce(
200
+ (sum, event) => sum + Number(event.data?.removedReminderTags ?? 0) + Number(event.data?.removedToolProgressTags ?? 0),
201
+ 0
202
+ );
203
+ const changedMessagesTotal = sanitizerEvents.reduce(
204
+ (sum, event) => sum + Number(event.data?.changedMessages ?? 0),
205
+ 0
206
+ );
207
+ const noise_ratio_after_compaction = changedMessagesTotal > 0 ? Math.max(
208
+ 0,
209
+ Math.min(1, 1 - safeDivide(removedNoiseTotal, changedMessagesTotal * 2))
210
+ ) : void 0;
211
+ const summaryInputPathEvents = events.filter(
212
+ (event) => event.phase === "AUTO_COMPACT_SUMMARY_INPUT_PATH_APPLIED"
213
+ );
214
+ const structuredPrimaryPathEvents = summaryInputPathEvents.filter(
215
+ (event) => event.data?.mode === "structured_primary"
216
+ );
217
+ const structured_primary_path_rate = summaryInputPathEvents.length > 0 ? safeDivide(structuredPrimaryPathEvents.length, summaryInputPathEvents.length) : void 0;
218
+ const structured_semantic_coverage_rate = structured_primary_path_rate;
219
+ const qualityEvents = events.filter(
220
+ (event) => event.phase === "AUTO_COMPACT_SUMMARY_QUALITY"
221
+ );
222
+ const goalSamples = qualityEvents.filter(
223
+ (event) => typeof event.data?.taskGoalRetained === "boolean"
224
+ );
225
+ const resultSamples = qualityEvents.filter(
226
+ (event) => typeof event.data?.hasResultInput === "boolean"
227
+ );
228
+ const errorSamples = qualityEvents.filter(
229
+ (event) => typeof event.data?.hasErrorInput === "boolean"
230
+ );
231
+ const task_goal_retention_rate = goalSamples.length > 0 ? safeDivide(
232
+ goalSamples.filter((event) => event.data?.taskGoalRetained === true).length,
233
+ goalSamples.length
234
+ ) : void 0;
235
+ const result_fidelity_rate = resultSamples.length > 0 ? safeDivide(
236
+ resultSamples.filter((event) => {
237
+ if (event.data?.hasResultInput !== true) return true;
238
+ return event.data?.hasResultSummary === true;
239
+ }).length,
240
+ resultSamples.length
241
+ ) : void 0;
242
+ const error_fidelity_rate = errorSamples.length > 0 ? safeDivide(
243
+ errorSamples.filter((event) => {
244
+ if (event.data?.hasErrorInput !== true) return true;
245
+ return event.data?.hasErrorSummary === true;
246
+ }).length,
247
+ errorSamples.length
248
+ ) : void 0;
249
+ const first_turn_drift_rate = task_goal_retention_rate === void 0 ? void 0 : 1 - task_goal_retention_rate;
250
+ const restoreIntegrityEvents = events.filter(
251
+ (event) => event.phase === "TRACKER_RESTORE_INTEGRITY_CHECK"
252
+ );
253
+ const restoreIntegrityIssueCount = restoreIntegrityEvents.filter((event) => {
254
+ const isConsistent = event.data?.isConsistent;
255
+ if (typeof isConsistent === "boolean") return isConsistent === false;
256
+ return Number(event.data?.droppedCount ?? 0) > 0;
257
+ }).length;
258
+ const tracker_restore_integrity_issue_rate = restoreIntegrityEvents.length > 0 ? safeDivide(restoreIntegrityIssueCount, restoreIntegrityEvents.length) : void 0;
259
+ const userContentAdaptedEvents = events.filter(
260
+ (event) => event.phase === "MESSAGE_USER_CONTENT_ADAPTED"
261
+ );
262
+ const stringInputPathNumerator = userContentAdaptedEvents.reduce((sum, event) => {
263
+ const eventTotal = Number(event.data?.totalUserContentCount ?? 0);
264
+ const eventString = Number(event.data?.userStringContentCount ?? 0);
265
+ if (!Number.isFinite(eventTotal) || eventTotal <= 0) return sum;
266
+ if (!Number.isFinite(eventString) || eventString < 0) return sum;
267
+ return sum + Math.min(eventTotal, eventString);
268
+ }, 0);
269
+ const stringInputPathDenominator = userContentAdaptedEvents.reduce((sum, event) => {
270
+ const eventTotal = Number(event.data?.totalUserContentCount ?? 0);
271
+ if (!Number.isFinite(eventTotal) || eventTotal <= 0) return sum;
272
+ return sum + eventTotal;
273
+ }, 0);
274
+ const string_input_path_usage_rate = stringInputPathDenominator > 0 ? safeDivide(stringInputPathNumerator, stringInputPathDenominator) : void 0;
275
+ return {
276
+ compact_invalid_shape_rate,
277
+ compact_retry_success_rate,
278
+ thinking_first_ratio,
279
+ cross_model_replay_error_rate,
280
+ structured_primary_path_rate,
281
+ structured_semantic_coverage_rate,
282
+ typed_primary_path_rate,
283
+ typed_contract_fail_rate,
284
+ recoverable_failure_rate,
285
+ retry_exhausted_rate,
286
+ status_compensation_failure_rate,
287
+ compaction_boundary_hit_rate,
288
+ overflow_replay_success_rate,
289
+ compaction_reentry_success_rate,
290
+ noise_ratio_after_compaction,
291
+ task_goal_retention_rate,
292
+ result_fidelity_rate,
293
+ error_fidelity_rate,
294
+ first_turn_drift_rate,
295
+ tracker_restore_integrity_issue_rate,
296
+ string_input_path_usage_rate,
297
+ prune_marker_coverage_rate,
298
+ compacted_index_integrity_rate,
299
+ post_prune_noise_ratio,
300
+ tool_output_aging_hit_rate,
301
+ tool_output_placeholder_hit_rate,
302
+ tool_output_token_reduction_rate,
303
+ dangling_tool_closure_rate,
304
+ w11_sample_pass_rate,
305
+ w14_sample_pass_rate
306
+ };
307
+ }
308
+
309
+ // src/utils/session/autoCompactMetricsSink.ts
310
+ function createAutoCompactMetricsSink() {
311
+ const events = [];
312
+ return {
313
+ push(event) {
314
+ events.push(event);
315
+ },
316
+ snapshot() {
317
+ return {
318
+ eventCount: events.length,
319
+ metrics: computeAutoCompactMetrics(events)
320
+ };
321
+ },
322
+ clear() {
323
+ events.length = 0;
324
+ }
325
+ };
326
+ }
327
+
328
+ // src/services/telemetry/autoCompactTelemetry.ts
329
+ var AUTO_COMPACT_TELEMETRY_PHASES = /* @__PURE__ */ new Set([
330
+ "AUTO_COMPACT_FAILED",
331
+ "AUTO_COMPACT_RETRY",
332
+ "AUTO_COMPACT_FALLBACK",
333
+ "MESSAGE_TRANSFORM_APPLIED",
334
+ "AUTO_COMPACT_SUMMARY_INPUT_PATH_APPLIED",
335
+ "AUTO_COMPACT_SUMMARY_QUALITY",
336
+ "AUTO_COMPACT_BUDGET_APPLIED",
337
+ "AUTO_COMPACT_POST_PERSIST_CHECK",
338
+ "TRACKER_RESTORE_INTEGRITY_CHECK",
339
+ "COMPACTION_BOUNDARY_APPLIED",
340
+ "TOOL_OUTPUT_LIFECYCLE_APPLIED",
341
+ "SESSION_TYPED_PATH_APPLIED",
342
+ "SESSION_CANONICAL_FALLBACK_APPLIED",
343
+ "SESSION_TYPED_PATH_CONSISTENCY_FAILED",
344
+ "SESSION_TYPED_PATH_POLICY_APPLIED",
345
+ "SESSION_TYPED_PATH_AUTO_DEGRADED",
346
+ "MESSAGE_USER_CONTENT_ADAPTED",
347
+ "AUTO_COMPACT_TASK_NODE_CREATED",
348
+ "AUTO_COMPACT_TASK_NODE_TRANSITION",
349
+ "AUTO_COMPACT_TASK_NODE_FAILED",
350
+ "AUTO_COMPACT_OVERFLOW_JOINT_DECISION_DRAFT"
351
+ ]);
352
+ var AUTO_COMPACT_SINK_LISTENER_ID = "auto-compact-metrics-sink";
353
+ var autoCompactSink = createAutoCompactMetricsSink();
354
+ var sinkRegistered = false;
355
+ function ensureAutoCompactTelemetryRegistered() {
356
+ if (sinkRegistered) return;
357
+ registerTelemetryListener(AUTO_COMPACT_SINK_LISTENER_ID, (event) => {
358
+ if (!AUTO_COMPACT_TELEMETRY_PHASES.has(event.phase)) return;
359
+ autoCompactSink.push({
360
+ phase: event.phase,
361
+ data: event.data
362
+ });
363
+ });
364
+ sinkRegistered = true;
365
+ }
366
+ function emitAutoCompactTelemetryEvent(phase, data) {
367
+ ensureAutoCompactTelemetryRegistered();
368
+ emitTelemetryEvent({
369
+ channel: "auto_compact",
370
+ phase,
371
+ data,
372
+ timestamp: Date.now()
373
+ });
374
+ }
375
+ function getAutoCompactMetricsSnapshot() {
376
+ ensureAutoCompactTelemetryRegistered();
377
+ return autoCompactSink.snapshot();
378
+ }
379
+ function resetAutoCompactTelemetry() {
380
+ autoCompactSink.clear();
381
+ }
382
+ ensureAutoCompactTelemetryRegistered();
383
+
384
+ // src/utils/messages/core.ts
385
+ var INTERRUPT_MESSAGE = "[Request interrupted by user]";
386
+ var INTERRUPT_MESSAGE_FOR_TOOL_USE = "[Request interrupted by user for tool use]";
387
+ var CANCEL_MESSAGE = "The user doesn't want to take this action right now. STOP what you are doing and wait for the user to tell you how to proceed.";
388
+ var REJECT_MESSAGE = "The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). STOP what you are doing and wait for the user to tell you how to proceed.";
389
+ var REJECT_MESSAGE_WITH_FEEDBACK_PREFIX = `The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). To tell you how to proceed, the user said:
390
+ `;
391
+ var REJECTED_PLAN_PREFIX = `The agent proposed a plan that was rejected by the user. The user chose to stay in plan mode rather than proceed with implementation.
392
+
393
+ Rejected plan:
394
+ `;
395
+ var NO_RESPONSE_REQUESTED = "No response requested.";
396
+ var SYNTHETIC_ASSISTANT_MESSAGES = /* @__PURE__ */ new Set([
397
+ INTERRUPT_MESSAGE,
398
+ INTERRUPT_MESSAGE_FOR_TOOL_USE,
399
+ CANCEL_MESSAGE,
400
+ REJECT_MESSAGE,
401
+ NO_RESPONSE_REQUESTED
402
+ ]);
403
+ function stableUuidFromSeed(seed) {
404
+ const hex = createHash("sha256").update(seed).digest("hex").slice(0, 32);
405
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
406
+ }
407
+ function baseCreateAssistantMessage(content, extra) {
408
+ return {
409
+ type: "assistant",
410
+ costUSD: 0,
411
+ durationMs: 0,
412
+ uuid: randomUUID(),
413
+ message: {
414
+ id: randomUUID(),
415
+ model: "<synthetic>",
416
+ role: "assistant",
417
+ stop_reason: "stop_sequence",
418
+ stop_sequence: "",
419
+ type: "message",
420
+ usage: {
421
+ input_tokens: 0,
422
+ output_tokens: 0,
423
+ cache_creation_input_tokens: 0,
424
+ cache_read_input_tokens: 0
425
+ },
426
+ content
427
+ },
428
+ ...extra
429
+ };
430
+ }
431
+ function createAssistantMessage(content) {
432
+ return baseCreateAssistantMessage([
433
+ {
434
+ type: "text",
435
+ text: content === "" ? NO_CONTENT_MESSAGE : content,
436
+ citations: []
437
+ }
438
+ ]);
439
+ }
440
+ function createAssistantAPIErrorMessage(content) {
441
+ return baseCreateAssistantMessage(
442
+ [
443
+ {
444
+ type: "text",
445
+ text: content === "" ? NO_CONTENT_MESSAGE : content,
446
+ citations: []
447
+ }
448
+ ],
449
+ { isApiErrorMessage: true }
450
+ );
451
+ }
452
+ function createUserTextBlocks(content) {
453
+ return [{ type: "text", text: content }];
454
+ }
455
+ function createUserMessageFromBlocks(content, toolUseResult) {
456
+ const m = {
457
+ type: "user",
458
+ message: {
459
+ role: "user",
460
+ content
461
+ },
462
+ uuid: randomUUID(),
463
+ toolUseResult,
464
+ options: {
465
+ contentInputPath: "blocks"
466
+ }
467
+ };
468
+ return m;
469
+ }
470
+ function createUserMessageFromText(content, toolUseResult) {
471
+ const m = {
472
+ type: "user",
473
+ message: {
474
+ role: "user",
475
+ content: createUserTextBlocks(content)
476
+ },
477
+ uuid: randomUUID(),
478
+ toolUseResult,
479
+ options: {
480
+ contentInputPath: "blocks"
481
+ }
482
+ };
483
+ return m;
484
+ }
485
+ function generateQueryId() {
486
+ return randomUUID();
487
+ }
488
+ function createUserTurnMessageFromBlocks(content, toolUseResult) {
489
+ const m = createUserMessageFromBlocks(content, toolUseResult);
490
+ m.queryId = generateQueryId();
491
+ return m;
492
+ }
493
+ function createUserTurnMessageFromText(content, toolUseResult) {
494
+ const m = createUserMessageFromText(content, toolUseResult);
495
+ m.queryId = generateQueryId();
496
+ return m;
497
+ }
498
+ function createProgressMessage(toolUseID, siblingToolUseIDs, content, normalizedMessages, tools, meta) {
499
+ return {
500
+ type: "progress",
501
+ content,
502
+ normalizedMessages,
503
+ siblingToolUseIDs,
504
+ tools,
505
+ toolUseID,
506
+ progressState: meta?.progressState ?? "unknown",
507
+ uuid: randomUUID()
508
+ };
509
+ }
510
+ function filterProgressMessagesForTools(messages, toolNames) {
511
+ const toolUseIds = /* @__PURE__ */ new Set();
512
+ for (const message of messages) {
513
+ if (message.type !== "assistant") continue;
514
+ const block = message.message.content[0];
515
+ if (!isToolUseLikeBlockParam(block)) continue;
516
+ if (toolNames.has(block.name)) {
517
+ toolUseIds.add(block.id);
518
+ }
519
+ }
520
+ if (toolUseIds.size === 0) return messages;
521
+ return messages.filter(
522
+ (message) => message.type !== "progress" || !toolUseIds.has(message.toolUseID)
523
+ );
524
+ }
525
+ function createToolResultStopMessage(toolUseID) {
526
+ return {
527
+ type: "tool_result",
528
+ content: CANCEL_MESSAGE,
529
+ is_error: true,
530
+ tool_use_id: toolUseID
531
+ };
532
+ }
533
+ function extractTagFromMessage(message, tagName) {
534
+ if (message.type === "progress") {
535
+ return null;
536
+ }
537
+ if (typeof message.message.content !== "string") {
538
+ return null;
539
+ }
540
+ return extractTag(message.message.content, tagName);
541
+ }
542
+ function extractTag(html, tagName) {
543
+ if (!html.trim() || !tagName.trim()) {
544
+ return null;
545
+ }
546
+ const escapedTag = tagName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
547
+ const pattern = new RegExp(
548
+ `<${escapedTag}(?:\\s+[^>]*)?>([\\s\\S]*?)<\\/${escapedTag}>`,
549
+ "gi"
550
+ );
551
+ let match;
552
+ let depth = 0;
553
+ let lastIndex = 0;
554
+ const openingTag = new RegExp(`<${escapedTag}(?:\\s+[^>]*?)?>`, "gi");
555
+ const closingTag = new RegExp(`<\\/${escapedTag}>`, "gi");
556
+ while ((match = pattern.exec(html)) !== null) {
557
+ const content = match[1];
558
+ const beforeMatch = html.slice(lastIndex, match.index);
559
+ depth = 0;
560
+ openingTag.lastIndex = 0;
561
+ while (openingTag.exec(beforeMatch) !== null) {
562
+ depth++;
563
+ }
564
+ closingTag.lastIndex = 0;
565
+ while (closingTag.exec(beforeMatch) !== null) {
566
+ depth--;
567
+ }
568
+ if (depth === 0 && content) {
569
+ return content;
570
+ }
571
+ lastIndex = match.index + match[0].length;
572
+ }
573
+ return null;
574
+ }
575
+ function isNotEmptyMessage(message) {
576
+ if (message.type === "progress") {
577
+ return true;
578
+ }
579
+ if (typeof message.message.content === "string") {
580
+ return message.message.content.trim().length > 0;
581
+ }
582
+ if (message.message.content.length === 0) {
583
+ return false;
584
+ }
585
+ if (message.message.content.length > 1) {
586
+ return true;
587
+ }
588
+ if (message.message.content[0].type !== "text") {
589
+ return true;
590
+ }
591
+ return message.message.content[0].text.trim().length > 0 && message.message.content[0].text !== NO_CONTENT_MESSAGE && message.message.content[0].text !== INTERRUPT_MESSAGE_FOR_TOOL_USE;
592
+ }
593
+ function normalizeMessages(messages) {
594
+ return messages.flatMap((message) => {
595
+ if (message.type === "progress") {
596
+ return [message];
597
+ }
598
+ if (typeof message.message.content === "string") {
599
+ return [message];
600
+ }
601
+ const contentBlocks = message.message.content.filter(
602
+ (block) => !(block.type === "thinking" && (typeof block.thinking !== "string" || block.thinking.trim().length === 0))
603
+ );
604
+ return contentBlocks.map((block, blockIndex) => {
605
+ switch (message.type) {
606
+ case "assistant":
607
+ const baseSeed = String(
608
+ message.uuid ?? message.message?.id ?? randomUUID()
609
+ );
610
+ return {
611
+ type: "assistant",
612
+ uuid: stableUuidFromSeed(`${baseSeed}:${blockIndex}`),
613
+ message: {
614
+ ...message.message,
615
+ content: [block]
616
+ },
617
+ costUSD: message.costUSD / contentBlocks.length,
618
+ durationMs: message.durationMs
619
+ };
620
+ case "user":
621
+ return message;
622
+ }
623
+ });
624
+ });
625
+ }
626
+ function isToolUseLikeBlockParam(block) {
627
+ return block && typeof block === "object" && (block.type === "tool_use" || block.type === "server_tool_use" || block.type === "mcp_tool_use") && typeof block.id === "string";
628
+ }
629
+ function isToolUseRequestMessage(message) {
630
+ return message.type === "assistant" && "costUSD" in message && message.message.content.some(isToolUseLikeBlockParam);
631
+ }
632
+ function reorderMessages(messages) {
633
+ const ms = [];
634
+ const toolUseMessages = [];
635
+ for (const message of messages) {
636
+ if (isToolUseRequestMessage(message)) {
637
+ toolUseMessages.push(message);
638
+ }
639
+ if (message.type === "progress") {
640
+ const existingProgressMessage = ms.find(
641
+ (_) => _.type === "progress" && _.toolUseID === message.toolUseID
642
+ );
643
+ if (existingProgressMessage) {
644
+ ms[ms.indexOf(existingProgressMessage)] = message;
645
+ continue;
646
+ }
647
+ const toolUseMessage = toolUseMessages.find(
648
+ (_) => _.message.content[0]?.id === message.toolUseID
649
+ );
650
+ if (toolUseMessage) {
651
+ ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message);
652
+ continue;
653
+ }
654
+ }
655
+ if (message.type === "user" && Array.isArray(message.message.content) && message.message.content[0]?.type === "tool_result") {
656
+ const toolUseID = message.message.content[0]?.tool_use_id;
657
+ const lastProgressMessage = ms.find(
658
+ (_) => _.type === "progress" && _.toolUseID === toolUseID
659
+ );
660
+ if (lastProgressMessage) {
661
+ ms.splice(ms.indexOf(lastProgressMessage) + 1, 0, message);
662
+ continue;
663
+ }
664
+ const toolUseMessage = toolUseMessages.find(
665
+ (_) => _.message.content[0]?.id === toolUseID
666
+ );
667
+ if (toolUseMessage) {
668
+ ms.splice(ms.indexOf(toolUseMessage) + 1, 0, message);
669
+ continue;
670
+ }
671
+ } else {
672
+ ms.push(message);
673
+ }
674
+ }
675
+ return ms;
676
+ }
677
+ var getToolResultIDs = memoize(
678
+ (normalizedMessages) => Object.fromEntries(
679
+ normalizedMessages.flatMap(
680
+ (_) => _.type === "user" && _.message.content[0]?.type === "tool_result" ? [
681
+ [
682
+ _.message.content[0].tool_use_id,
683
+ _.message.content[0].is_error ?? false
684
+ ]
685
+ ] : []
686
+ )
687
+ )
688
+ );
689
+ function getUnresolvedToolUseIDs(normalizedMessages) {
690
+ const toolResults = getToolResultIDs(normalizedMessages);
691
+ return new Set(
692
+ normalizedMessages.filter(
693
+ (_) => _.type === "assistant" && Array.isArray(_.message.content) && isToolUseLikeBlockParam(_.message.content[0]) && !(_.message.content[0].id in toolResults)
694
+ ).map((_) => _.message.content[0].id)
695
+ );
696
+ }
697
+ function getInProgressToolUseIDs(normalizedMessages) {
698
+ const unresolvedToolUseIDs = getUnresolvedToolUseIDs(normalizedMessages);
699
+ function isQueuedWaitingProgressMessage(message) {
700
+ if (message.type !== "progress") return false;
701
+ if (message.progressState === "queued_waiting") return true;
702
+ return false;
703
+ }
704
+ const toolUseIDsThatHaveProgressMessages = new Set(
705
+ normalizedMessages.filter(
706
+ (_) => _.type === "progress" && !isQueuedWaitingProgressMessage(_)
707
+ ).map((_) => _.toolUseID)
708
+ );
709
+ return new Set(
710
+ normalizedMessages.filter((_) => {
711
+ if (_.type !== "assistant") {
712
+ return false;
713
+ }
714
+ const firstBlock = _.message.content[0];
715
+ if (!isToolUseLikeBlockParam(firstBlock)) return false;
716
+ const toolUseID = firstBlock.id;
717
+ if (toolUseID === unresolvedToolUseIDs.values().next().value) {
718
+ return true;
719
+ }
720
+ if (toolUseIDsThatHaveProgressMessages.has(toolUseID) && unresolvedToolUseIDs.has(toolUseID)) {
721
+ return true;
722
+ }
723
+ return false;
724
+ }).map((_) => _.message.content[0].id)
725
+ );
726
+ }
727
+ function getErroredToolUseMessages(normalizedMessages) {
728
+ const toolResults = getToolResultIDs(normalizedMessages);
729
+ return normalizedMessages.filter(
730
+ (_) => _.type === "assistant" && Array.isArray(_.message.content) && isToolUseLikeBlockParam(_.message.content[0]) && _.message.content[0].id in toolResults && toolResults[_.message.content[0].id]
731
+ );
732
+ }
733
+ function normalizeMessagesForAPI(messages) {
734
+ function isSyntheticApiErrorMessage(message) {
735
+ return message.type === "assistant" && message.isApiErrorMessage === true && message.message.model === "<synthetic>";
736
+ }
737
+ function normalizeUserContent(content) {
738
+ if (typeof content === "string") {
739
+ return [{ type: "text", text: content }];
740
+ }
741
+ return content;
742
+ }
743
+ function toolResultsFirst(content) {
744
+ const toolResults = [];
745
+ const rest = [];
746
+ for (const block of content) {
747
+ if (block.type === "tool_result") {
748
+ toolResults.push(block);
749
+ } else {
750
+ rest.push(block);
751
+ }
752
+ }
753
+ return [...toolResults, ...rest];
754
+ }
755
+ function mergeUserMessages(base, next) {
756
+ const baseBlocks = normalizeUserContent(base.message.content);
757
+ const nextBlocks = normalizeUserContent(next.message.content);
758
+ return {
759
+ ...base,
760
+ message: {
761
+ ...base.message,
762
+ content: toolResultsFirst([...baseBlocks, ...nextBlocks])
763
+ }
764
+ };
765
+ }
766
+ function isUserToolResultMessage(message) {
767
+ if (message.type !== "user") return false;
768
+ if (!Array.isArray(message.message.content)) return false;
769
+ return message.message.content.some((block) => block.type === "tool_result");
770
+ }
771
+ const result = [];
772
+ let userStringContentCount = 0;
773
+ let totalUserContentCount = 0;
774
+ for (const message of messages) {
775
+ if (message.type === "progress") continue;
776
+ if (isSyntheticApiErrorMessage(message)) continue;
777
+ switch (message.type) {
778
+ case "user": {
779
+ totalUserContentCount += 1;
780
+ if (typeof message.message.content === "string") {
781
+ userStringContentCount += 1;
782
+ }
783
+ const prev = last(result);
784
+ if (prev?.type === "user") {
785
+ result[result.indexOf(prev)] = mergeUserMessages(prev, message);
786
+ } else {
787
+ result.push(message);
788
+ }
789
+ break;
790
+ }
791
+ case "assistant": {
792
+ let merged = false;
793
+ for (let i = result.length - 1; i >= 0; i--) {
794
+ const prev = result[i];
795
+ if (prev.type !== "assistant" && !isUserToolResultMessage(prev)) {
796
+ break;
797
+ }
798
+ if (prev.type === "assistant") {
799
+ if (prev.message.id === message.message.id) {
800
+ result[i] = {
801
+ ...prev,
802
+ message: {
803
+ ...prev.message,
804
+ content: [
805
+ ...Array.isArray(prev.message.content) ? prev.message.content : [],
806
+ ...Array.isArray(message.message.content) ? message.message.content : []
807
+ ]
808
+ }
809
+ };
810
+ merged = true;
811
+ }
812
+ break;
813
+ }
814
+ }
815
+ if (!merged) {
816
+ result.push(message);
817
+ }
818
+ break;
819
+ }
820
+ }
821
+ }
822
+ emitAutoCompactTelemetryEvent("MESSAGE_USER_CONTENT_ADAPTED", {
823
+ totalUserContentCount,
824
+ userStringContentCount,
825
+ string_input_path_usage_rate: totalUserContentCount > 0 ? userStringContentCount / totalUserContentCount : 0
826
+ });
827
+ return result;
828
+ }
829
+ function normalizeContentFromAPI(content) {
830
+ const filteredContent = content.filter(
831
+ (_) => _.type !== "text" || _.text.trim().length > 0
832
+ );
833
+ if (filteredContent.length === 0) {
834
+ return [{ type: "text", text: NO_CONTENT_MESSAGE, citations: [] }];
835
+ }
836
+ return filteredContent;
837
+ }
838
+ function isEmptyMessageText(text) {
839
+ return stripSystemMessages(text).trim() === "" || text.trim() === NO_CONTENT_MESSAGE;
840
+ }
841
+ var STRIPPED_TAGS = [
842
+ "commit_analysis",
843
+ "context",
844
+ "function_analysis",
845
+ "pr_analysis"
846
+ ];
847
+ function stripSystemMessages(content) {
848
+ const regex = new RegExp(`<(${STRIPPED_TAGS.join("|")})>.*?</\\1>
849
+ ?`, "gs");
850
+ return content.replace(regex, "").trim();
851
+ }
852
+ function getToolUseID(message) {
853
+ switch (message.type) {
854
+ case "assistant":
855
+ return isToolUseLikeBlockParam(message.message.content[0]) ? message.message.content[0].id : null;
856
+ case "user":
857
+ if (message.message.content[0]?.type !== "tool_result") {
858
+ return null;
859
+ }
860
+ return message.message.content[0].tool_use_id;
861
+ case "progress":
862
+ return message.toolUseID;
863
+ }
864
+ }
865
+ function getLastAssistantMessageId(messages) {
866
+ for (let i = messages.length - 1; i >= 0; i--) {
867
+ const message = messages[i];
868
+ if (message && message.type === "assistant") {
869
+ return message.message.id;
870
+ }
871
+ }
872
+ return void 0;
873
+ }
874
+
875
+ // src/utils/messages/index.ts
876
+ async function processUserInput(input, mode, setToolJSX, context, pastedImages) {
877
+ const impl = await import("./userInput-75VCTJDE.js");
878
+ return impl.processUserInput(input, mode, setToolJSX, context, pastedImages);
879
+ }
880
+
881
+ export {
882
+ API_ERROR_MESSAGE_PREFIX,
883
+ PROMPT_TOO_LONG_ERROR_MESSAGE,
884
+ CREDIT_BALANCE_TOO_LOW_ERROR_MESSAGE,
885
+ INVALID_API_KEY_ERROR_MESSAGE,
886
+ NO_CONTENT_MESSAGE,
887
+ MAIN_QUERY_TEMPERATURE,
888
+ registerTelemetryListener,
889
+ emitTelemetryEvent,
890
+ emitAutoCompactTelemetryEvent,
891
+ getAutoCompactMetricsSnapshot,
892
+ resetAutoCompactTelemetry,
893
+ INTERRUPT_MESSAGE,
894
+ INTERRUPT_MESSAGE_FOR_TOOL_USE,
895
+ CANCEL_MESSAGE,
896
+ REJECT_MESSAGE,
897
+ REJECT_MESSAGE_WITH_FEEDBACK_PREFIX,
898
+ REJECTED_PLAN_PREFIX,
899
+ NO_RESPONSE_REQUESTED,
900
+ SYNTHETIC_ASSISTANT_MESSAGES,
901
+ createAssistantMessage,
902
+ createAssistantAPIErrorMessage,
903
+ createUserMessageFromBlocks,
904
+ createUserMessageFromText,
905
+ generateQueryId,
906
+ createUserTurnMessageFromBlocks,
907
+ createUserTurnMessageFromText,
908
+ createProgressMessage,
909
+ filterProgressMessagesForTools,
910
+ createToolResultStopMessage,
911
+ extractTagFromMessage,
912
+ extractTag,
913
+ isNotEmptyMessage,
914
+ normalizeMessages,
915
+ reorderMessages,
916
+ getUnresolvedToolUseIDs,
917
+ getInProgressToolUseIDs,
918
+ getErroredToolUseMessages,
919
+ normalizeMessagesForAPI,
920
+ normalizeContentFromAPI,
921
+ isEmptyMessageText,
922
+ stripSystemMessages,
923
+ getToolUseID,
924
+ getLastAssistantMessageId,
925
+ processUserInput
926
+ };