pybao-cli 1.5.37 → 1.5.38

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 (174) hide show
  1. package/dist/REPL-EOGX5USK.js +51 -0
  2. package/dist/{acp-JW3TIYAD.js → acp-JTVVQGX6.js} +30 -30
  3. package/dist/{agentsValidate-SBWTSOTC.js → agentsValidate-T552HEU3.js} +7 -7
  4. package/dist/{ask-REOHQELX.js → ask-JT2UVHOU.js} +30 -30
  5. package/dist/{autoUpdater-QOASKMIL.js → autoUpdater-ZBN46KEI.js} +3 -3
  6. package/dist/{chunk-BV4JBKPK.js → chunk-2P4E3ZNA.js} +3 -3
  7. package/dist/{chunk-HKC3XNTU.js → chunk-34KB4DEZ.js} +4 -4
  8. package/dist/{chunk-A4MELTXR.js → chunk-3L5QLWHQ.js} +1 -1
  9. package/dist/{chunk-2OX2HGKH.js → chunk-45CYYYU7.js} +2 -2
  10. package/dist/{chunk-HS72NWQM.js → chunk-5AM65D7G.js} +1 -1
  11. package/dist/{chunk-T5T43XFI.js → chunk-A33Z7A54.js} +5 -5
  12. package/dist/{chunk-T5T43XFI.js.map → chunk-A33Z7A54.js.map} +1 -1
  13. package/dist/chunk-BKCAVW2G.js.map +7 -0
  14. package/dist/{chunk-TM2IQSS6.js → chunk-DXS27TBK.js} +3 -3
  15. package/dist/{chunk-JRCCJJTK.js → chunk-FGAQGENO.js} +5 -4
  16. package/dist/chunk-FGAQGENO.js.map +7 -0
  17. package/dist/{chunk-Q6ADAH2V.js → chunk-GLNNII3K.js} +3 -3
  18. package/dist/{chunk-LQ3YSDHE.js → chunk-HKDUNAZU.js} +1 -1
  19. package/dist/{chunk-UBR4EMJG.js → chunk-HPHRVBGM.js} +3 -3
  20. package/dist/{chunk-66IQQBOM.js → chunk-JQW3XPSA.js} +1 -1
  21. package/dist/{chunk-CWEWMSYK.js → chunk-JQXGDP2G.js} +2 -2
  22. package/dist/{chunk-PKMXJDHS.js → chunk-LGWP73N3.js} +1 -1
  23. package/dist/{chunk-DNJ2EUI4.js → chunk-M3XZZUER.js} +2 -2
  24. package/dist/{chunk-X2LEA5WZ.js → chunk-MPW3OMAB.js} +4 -4
  25. package/dist/{chunk-37VT7CBN.js → chunk-MQ56NHZY.js} +3 -3
  26. package/dist/{chunk-66GPSPHJ.js → chunk-ODHAKZLW.js} +3 -3
  27. package/dist/{chunk-VNJSOVCS.js → chunk-OONY2XEJ.js} +3 -20
  28. package/dist/chunk-OONY2XEJ.js.map +7 -0
  29. package/dist/{chunk-SFFHKLKV.js → chunk-OQ7GMNEA.js} +1 -1
  30. package/dist/{chunk-K53ERJZE.js → chunk-PPTR7ECF.js} +1 -1
  31. package/dist/{chunk-XYD26HOU.js → chunk-QLLHQ4NC.js} +1 -1
  32. package/dist/{chunk-GAHOCTVO.js → chunk-R357FMHE.js} +1 -1
  33. package/dist/{chunk-6EUA3JLK.js → chunk-REIICUCF.js} +6 -6
  34. package/dist/{chunk-6EUA3JLK.js.map → chunk-REIICUCF.js.map} +1 -1
  35. package/dist/{chunk-PJMRV734.js → chunk-RKTBVJGG.js} +2 -2
  36. package/dist/{chunk-T3NFIJVE.js → chunk-T4YXQTDG.js} +3 -3
  37. package/dist/{chunk-EXOVGTTX.js → chunk-TW7VYZCV.js} +3 -3
  38. package/dist/{chunk-ORTVYWVH.js → chunk-TYK67RSX.js} +4 -4
  39. package/dist/{chunk-6UJ2IX6O.js → chunk-USNKNXS4.js} +1 -1
  40. package/dist/{chunk-GBRPRP4C.js → chunk-X7II6NLY.js} +3 -3
  41. package/dist/{chunk-GBRPRP4C.js.map → chunk-X7II6NLY.js.map} +1 -1
  42. package/dist/{chunk-T5VIUVWS.js → chunk-XGFLQLPP.js} +436 -410
  43. package/dist/chunk-XGFLQLPP.js.map +7 -0
  44. package/dist/{cli-ILXOOGOB.js → cli-GW2RLZKS.js} +91 -91
  45. package/dist/commands-OMEB6ZPR.js +55 -0
  46. package/dist/{config-HVU5BUJR.js → config-7YD4R22V.js} +4 -4
  47. package/dist/{context-Z3QI3FNI.js → context-4EG6BLW4.js} +6 -6
  48. package/dist/{conversationPersistence-FKNK4HLK.js → conversationPersistence-XSJ7MFZQ.js} +3 -3
  49. package/dist/{conversationTracker-2LFSHPJQ.js → conversationTracker-VXYBDUQD.js} +4 -4
  50. package/dist/{customCommands-JC4SMHEG.js → customCommands-CEGHI3EI.js} +4 -4
  51. package/dist/{env-C4DAPLWY.js → env-SFBXDZAW.js} +2 -2
  52. package/dist/{file-V2C5K5KH.js → file-TKPF7WPK.js} +4 -4
  53. package/dist/index.js +3 -3
  54. package/dist/{llm-YTSS25IN.js → llm-UPZIAGPI.js} +32 -32
  55. package/dist/{llmLazy-TFIRXTKR.js → llmLazy-AH4Z4W4G.js} +1 -1
  56. package/dist/{loader-GTHCSRZZ.js → loader-KR2G4MZH.js} +4 -4
  57. package/dist/{lsp-GS74PXYZ.js → lsp-4BXZN54S.js} +6 -6
  58. package/dist/{lspAnchor-ACLDKRMF.js → lspAnchor-J7X23CTJ.js} +6 -6
  59. package/dist/{mcp-WULQ66CY.js → mcp-PQ7E5V6N.js} +7 -7
  60. package/dist/{mentionProcessor-GWPPEFEF.js → mentionProcessor-OBZEHVOK.js} +5 -5
  61. package/dist/{messages-OGPCOESK.js → messages-Y45VMQJM.js} +1 -1
  62. package/dist/{model-URPSX5FV.js → model-PLE3KNNX.js} +5 -5
  63. package/dist/{openai-6W76QZ5A.js → openai-2R2NDBUU.js} +5 -5
  64. package/dist/{outputStyles-IUWSV34Z.js → outputStyles-XXPDKDY2.js} +4 -4
  65. package/dist/{pluginRuntime-7ZEORM4F.js → pluginRuntime-SROFDMKU.js} +6 -6
  66. package/dist/{pluginValidation-OJES7FNG.js → pluginValidation-WRO2DZTR.js} +6 -6
  67. package/dist/prompts-5Q6CSNXC.js +57 -0
  68. package/dist/{pybAgentSessionLoad-HQOBJLOU.js → pybAgentSessionLoad-FQQRBPKP.js} +4 -4
  69. package/dist/{pybAgentSessionResume-XDKORGD2.js → pybAgentSessionResume-P3UHSOY6.js} +4 -4
  70. package/dist/{pybAgentStreamJsonSession-FTCT4HKD.js → pybAgentStreamJsonSession-SIHHDMP6.js} +1 -1
  71. package/dist/{pybHooks-FKA2AQ47.js → pybHooks-J6EDF4HT.js} +4 -4
  72. package/dist/query-CADGN75M.js +55 -0
  73. package/dist/{registry-GT6NBBK5.js → registry-FWP3Q2GA.js} +5 -5
  74. package/dist/{ripgrep-GHL736ND.js → ripgrep-MRW3JRSV.js} +3 -3
  75. package/dist/{skillMarketplace-2IXTVWA6.js → skillMarketplace-I6WS3AB4.js} +3 -3
  76. package/dist/{state-M7627Z3G.js → state-FFCKZLBN.js} +2 -2
  77. package/dist/{theme-NDLGHEH5.js → theme-ALYM3CFD.js} +5 -5
  78. package/dist/{toolPermissionSettings-KVBN66MO.js → toolPermissionSettings-6TUFSTN3.js} +6 -6
  79. package/dist/tools-IEYQ4SAS.js +55 -0
  80. package/dist/{userInput-GU6FNIO4.js → userInput-4MUAKMGX.js} +32 -32
  81. package/package.json +3 -20
  82. package/resources/output-styles/accessibility-champion.md +66 -0
  83. package/resources/output-styles/api-designer.md +88 -0
  84. package/resources/output-styles/concise-engineer.md +32 -0
  85. package/resources/output-styles/critical-code-reviewer.md +36 -0
  86. package/resources/output-styles/data-engineer.md +104 -0
  87. package/resources/output-styles/defensive-programmer.md +81 -0
  88. package/resources/output-styles/devil-advocate.md +43 -0
  89. package/resources/output-styles/devops-automator.md +118 -0
  90. package/resources/output-styles/distributed-systems-architect.md +77 -0
  91. package/resources/output-styles/documentation-writer.md +47 -0
  92. package/resources/output-styles/evan-king-system-design-reviewer.md +45 -0
  93. package/resources/output-styles/functional-purist.md +84 -0
  94. package/resources/output-styles/performance-optimizer.md +49 -0
  95. package/resources/output-styles/refactoring-expert.md +118 -0
  96. package/resources/output-styles/security-auditor.md +49 -0
  97. package/resources/output-styles/startup-pragmatist.md +58 -0
  98. package/resources/output-styles/test-driven-developer.md +48 -0
  99. package/dist/REPL-N755RAFU.js +0 -51
  100. package/dist/chunk-2DKSGO53.js.map +0 -7
  101. package/dist/chunk-JRCCJJTK.js.map +0 -7
  102. package/dist/chunk-T5VIUVWS.js.map +0 -7
  103. package/dist/chunk-VNJSOVCS.js.map +0 -7
  104. package/dist/commands-EMWY7YKA.js +0 -55
  105. package/dist/prompts-XOIWSFPX.js +0 -57
  106. package/dist/query-FMWLAT3K.js +0 -55
  107. package/dist/tools-LHTT7WYX.js +0 -55
  108. /package/dist/{REPL-N755RAFU.js.map → REPL-EOGX5USK.js.map} +0 -0
  109. /package/dist/{acp-JW3TIYAD.js.map → acp-JTVVQGX6.js.map} +0 -0
  110. /package/dist/{agentsValidate-SBWTSOTC.js.map → agentsValidate-T552HEU3.js.map} +0 -0
  111. /package/dist/{ask-REOHQELX.js.map → ask-JT2UVHOU.js.map} +0 -0
  112. /package/dist/{autoUpdater-QOASKMIL.js.map → autoUpdater-ZBN46KEI.js.map} +0 -0
  113. /package/dist/{chunk-BV4JBKPK.js.map → chunk-2P4E3ZNA.js.map} +0 -0
  114. /package/dist/{chunk-HKC3XNTU.js.map → chunk-34KB4DEZ.js.map} +0 -0
  115. /package/dist/{chunk-A4MELTXR.js.map → chunk-3L5QLWHQ.js.map} +0 -0
  116. /package/dist/{chunk-2OX2HGKH.js.map → chunk-45CYYYU7.js.map} +0 -0
  117. /package/dist/{chunk-HS72NWQM.js.map → chunk-5AM65D7G.js.map} +0 -0
  118. /package/dist/{chunk-2DKSGO53.js → chunk-BKCAVW2G.js} +0 -0
  119. /package/dist/{chunk-TM2IQSS6.js.map → chunk-DXS27TBK.js.map} +0 -0
  120. /package/dist/{chunk-Q6ADAH2V.js.map → chunk-GLNNII3K.js.map} +0 -0
  121. /package/dist/{chunk-LQ3YSDHE.js.map → chunk-HKDUNAZU.js.map} +0 -0
  122. /package/dist/{chunk-UBR4EMJG.js.map → chunk-HPHRVBGM.js.map} +0 -0
  123. /package/dist/{chunk-66IQQBOM.js.map → chunk-JQW3XPSA.js.map} +0 -0
  124. /package/dist/{chunk-CWEWMSYK.js.map → chunk-JQXGDP2G.js.map} +0 -0
  125. /package/dist/{chunk-PKMXJDHS.js.map → chunk-LGWP73N3.js.map} +0 -0
  126. /package/dist/{chunk-DNJ2EUI4.js.map → chunk-M3XZZUER.js.map} +0 -0
  127. /package/dist/{chunk-X2LEA5WZ.js.map → chunk-MPW3OMAB.js.map} +0 -0
  128. /package/dist/{chunk-37VT7CBN.js.map → chunk-MQ56NHZY.js.map} +0 -0
  129. /package/dist/{chunk-66GPSPHJ.js.map → chunk-ODHAKZLW.js.map} +0 -0
  130. /package/dist/{chunk-SFFHKLKV.js.map → chunk-OQ7GMNEA.js.map} +0 -0
  131. /package/dist/{chunk-K53ERJZE.js.map → chunk-PPTR7ECF.js.map} +0 -0
  132. /package/dist/{chunk-XYD26HOU.js.map → chunk-QLLHQ4NC.js.map} +0 -0
  133. /package/dist/{chunk-GAHOCTVO.js.map → chunk-R357FMHE.js.map} +0 -0
  134. /package/dist/{chunk-PJMRV734.js.map → chunk-RKTBVJGG.js.map} +0 -0
  135. /package/dist/{chunk-T3NFIJVE.js.map → chunk-T4YXQTDG.js.map} +0 -0
  136. /package/dist/{chunk-EXOVGTTX.js.map → chunk-TW7VYZCV.js.map} +0 -0
  137. /package/dist/{chunk-ORTVYWVH.js.map → chunk-TYK67RSX.js.map} +0 -0
  138. /package/dist/{chunk-6UJ2IX6O.js.map → chunk-USNKNXS4.js.map} +0 -0
  139. /package/dist/{cli-ILXOOGOB.js.map → cli-GW2RLZKS.js.map} +0 -0
  140. /package/dist/{commands-EMWY7YKA.js.map → commands-OMEB6ZPR.js.map} +0 -0
  141. /package/dist/{config-HVU5BUJR.js.map → config-7YD4R22V.js.map} +0 -0
  142. /package/dist/{context-Z3QI3FNI.js.map → context-4EG6BLW4.js.map} +0 -0
  143. /package/dist/{conversationPersistence-FKNK4HLK.js.map → conversationPersistence-XSJ7MFZQ.js.map} +0 -0
  144. /package/dist/{conversationTracker-2LFSHPJQ.js.map → conversationTracker-VXYBDUQD.js.map} +0 -0
  145. /package/dist/{customCommands-JC4SMHEG.js.map → customCommands-CEGHI3EI.js.map} +0 -0
  146. /package/dist/{env-C4DAPLWY.js.map → env-SFBXDZAW.js.map} +0 -0
  147. /package/dist/{file-V2C5K5KH.js.map → file-TKPF7WPK.js.map} +0 -0
  148. /package/dist/{llm-YTSS25IN.js.map → llm-UPZIAGPI.js.map} +0 -0
  149. /package/dist/{llmLazy-TFIRXTKR.js.map → llmLazy-AH4Z4W4G.js.map} +0 -0
  150. /package/dist/{loader-GTHCSRZZ.js.map → loader-KR2G4MZH.js.map} +0 -0
  151. /package/dist/{lsp-GS74PXYZ.js.map → lsp-4BXZN54S.js.map} +0 -0
  152. /package/dist/{lspAnchor-ACLDKRMF.js.map → lspAnchor-J7X23CTJ.js.map} +0 -0
  153. /package/dist/{mcp-WULQ66CY.js.map → mcp-PQ7E5V6N.js.map} +0 -0
  154. /package/dist/{mentionProcessor-GWPPEFEF.js.map → mentionProcessor-OBZEHVOK.js.map} +0 -0
  155. /package/dist/{messages-OGPCOESK.js.map → messages-Y45VMQJM.js.map} +0 -0
  156. /package/dist/{model-URPSX5FV.js.map → model-PLE3KNNX.js.map} +0 -0
  157. /package/dist/{openai-6W76QZ5A.js.map → openai-2R2NDBUU.js.map} +0 -0
  158. /package/dist/{outputStyles-IUWSV34Z.js.map → outputStyles-XXPDKDY2.js.map} +0 -0
  159. /package/dist/{pluginRuntime-7ZEORM4F.js.map → pluginRuntime-SROFDMKU.js.map} +0 -0
  160. /package/dist/{pluginValidation-OJES7FNG.js.map → pluginValidation-WRO2DZTR.js.map} +0 -0
  161. /package/dist/{prompts-XOIWSFPX.js.map → prompts-5Q6CSNXC.js.map} +0 -0
  162. /package/dist/{pybAgentSessionLoad-HQOBJLOU.js.map → pybAgentSessionLoad-FQQRBPKP.js.map} +0 -0
  163. /package/dist/{pybAgentSessionResume-XDKORGD2.js.map → pybAgentSessionResume-P3UHSOY6.js.map} +0 -0
  164. /package/dist/{pybAgentStreamJsonSession-FTCT4HKD.js.map → pybAgentStreamJsonSession-SIHHDMP6.js.map} +0 -0
  165. /package/dist/{pybHooks-FKA2AQ47.js.map → pybHooks-J6EDF4HT.js.map} +0 -0
  166. /package/dist/{query-FMWLAT3K.js.map → query-CADGN75M.js.map} +0 -0
  167. /package/dist/{registry-GT6NBBK5.js.map → registry-FWP3Q2GA.js.map} +0 -0
  168. /package/dist/{ripgrep-GHL736ND.js.map → ripgrep-MRW3JRSV.js.map} +0 -0
  169. /package/dist/{skillMarketplace-2IXTVWA6.js.map → skillMarketplace-I6WS3AB4.js.map} +0 -0
  170. /package/dist/{state-M7627Z3G.js.map → state-FFCKZLBN.js.map} +0 -0
  171. /package/dist/{theme-NDLGHEH5.js.map → theme-ALYM3CFD.js.map} +0 -0
  172. /package/dist/{toolPermissionSettings-KVBN66MO.js.map → toolPermissionSettings-6TUFSTN3.js.map} +0 -0
  173. /package/dist/{tools-LHTT7WYX.js.map → tools-IEYQ4SAS.js.map} +0 -0
  174. /package/dist/{userInput-GU6FNIO4.js.map → userInput-4MUAKMGX.js.map} +0 -0
@@ -0,0 +1,51 @@
1
+ import { createRequire as __pybCreateRequire } from "node:module";
2
+ const require = __pybCreateRequire(import.meta.url);
3
+ import {
4
+ REPL
5
+ } from "./chunk-XGFLQLPP.js";
6
+ import "./chunk-HKDUNAZU.js";
7
+ import "./chunk-MQ56NHZY.js";
8
+ import "./chunk-3L5QLWHQ.js";
9
+ import "./chunk-5P7HBXTD.js";
10
+ import "./chunk-TW7VYZCV.js";
11
+ import "./chunk-PPTR7ECF.js";
12
+ import "./chunk-5AM65D7G.js";
13
+ import "./chunk-F4AXICO7.js";
14
+ import "./chunk-HPHRVBGM.js";
15
+ import "./chunk-FGAQGENO.js";
16
+ import "./chunk-JQXGDP2G.js";
17
+ import "./chunk-XKYHFZEC.js";
18
+ import "./chunk-34KB4DEZ.js";
19
+ import "./chunk-TYK67RSX.js";
20
+ import "./chunk-QLLHQ4NC.js";
21
+ import "./chunk-DXS27TBK.js";
22
+ import "./chunk-UNNVICVU.js";
23
+ import "./chunk-M3XZZUER.js";
24
+ import "./chunk-REIICUCF.js";
25
+ import "./chunk-A3BVXXA3.js";
26
+ import "./chunk-OQ7GMNEA.js";
27
+ import "./chunk-3DFBSQIT.js";
28
+ import "./chunk-B6IMQJZM.js";
29
+ import "./chunk-OUXHGDLH.js";
30
+ import "./chunk-45CYYYU7.js";
31
+ import "./chunk-QWIBSCDN.js";
32
+ import "./chunk-MPW3OMAB.js";
33
+ import "./chunk-T4YXQTDG.js";
34
+ import "./chunk-JQW3XPSA.js";
35
+ import "./chunk-UZ34JEUK.js";
36
+ import "./chunk-RKTBVJGG.js";
37
+ import "./chunk-BJSWTHRM.js";
38
+ import "./chunk-GLNNII3K.js";
39
+ import "./chunk-A33Z7A54.js";
40
+ import "./chunk-KFEHHKZ2.js";
41
+ import "./chunk-LGWP73N3.js";
42
+ import "./chunk-R357FMHE.js";
43
+ import "./chunk-2P4E3ZNA.js";
44
+ import "./chunk-RQVLBMP7.js";
45
+ import "./chunk-USNKNXS4.js";
46
+ import "./chunk-X7II6NLY.js";
47
+ import "./chunk-OONY2XEJ.js";
48
+ import "./chunk-I3J4JYES.js";
49
+ export {
50
+ REPL
51
+ };
@@ -12,71 +12,71 @@ import {
12
12
  grantReadPermissionForOriginalDir,
13
13
  hasPermissionsToUseTool,
14
14
  query
15
- } from "./chunk-T5VIUVWS.js";
16
- import "./chunk-LQ3YSDHE.js";
17
- import "./chunk-37VT7CBN.js";
18
- import "./chunk-A4MELTXR.js";
15
+ } from "./chunk-XGFLQLPP.js";
16
+ import "./chunk-HKDUNAZU.js";
17
+ import "./chunk-MQ56NHZY.js";
18
+ import "./chunk-3L5QLWHQ.js";
19
19
  import "./chunk-5P7HBXTD.js";
20
- import "./chunk-EXOVGTTX.js";
20
+ import "./chunk-TW7VYZCV.js";
21
21
  import {
22
22
  ConversationTracker
23
- } from "./chunk-K53ERJZE.js";
23
+ } from "./chunk-PPTR7ECF.js";
24
24
  import {
25
25
  FileSystemConversationPersistence
26
- } from "./chunk-HS72NWQM.js";
26
+ } from "./chunk-5AM65D7G.js";
27
27
  import "./chunk-F4AXICO7.js";
28
- import "./chunk-UBR4EMJG.js";
29
- import "./chunk-JRCCJJTK.js";
30
- import "./chunk-CWEWMSYK.js";
28
+ import "./chunk-HPHRVBGM.js";
29
+ import "./chunk-FGAQGENO.js";
30
+ import "./chunk-JQXGDP2G.js";
31
31
  import {
32
32
  ensureSessionState,
33
33
  getCurrentSessionId,
34
34
  setCurrentSessionId
35
35
  } from "./chunk-XKYHFZEC.js";
36
- import "./chunk-HKC3XNTU.js";
36
+ import "./chunk-34KB4DEZ.js";
37
37
  import {
38
38
  getClients
39
- } from "./chunk-ORTVYWVH.js";
40
- import "./chunk-XYD26HOU.js";
39
+ } from "./chunk-TYK67RSX.js";
40
+ import "./chunk-QLLHQ4NC.js";
41
41
  import {
42
42
  loadToolPermissionContextFromDisk,
43
43
  persistToolPermissionUpdateToDisk
44
- } from "./chunk-TM2IQSS6.js";
44
+ } from "./chunk-DXS27TBK.js";
45
45
  import {
46
46
  applyToolPermissionContextUpdates
47
47
  } from "./chunk-UNNVICVU.js";
48
- import "./chunk-DNJ2EUI4.js";
49
- import "./chunk-6EUA3JLK.js";
48
+ import "./chunk-M3XZZUER.js";
49
+ import "./chunk-REIICUCF.js";
50
50
  import "./chunk-A3BVXXA3.js";
51
51
  import {
52
52
  createAssistantMessage,
53
53
  createUserTurnMessageFromBlocks
54
- } from "./chunk-SFFHKLKV.js";
54
+ } from "./chunk-OQ7GMNEA.js";
55
55
  import "./chunk-3DFBSQIT.js";
56
56
  import "./chunk-B6IMQJZM.js";
57
57
  import "./chunk-OUXHGDLH.js";
58
- import "./chunk-2OX2HGKH.js";
58
+ import "./chunk-45CYYYU7.js";
59
59
  import "./chunk-QWIBSCDN.js";
60
- import "./chunk-X2LEA5WZ.js";
61
- import "./chunk-T3NFIJVE.js";
62
- import "./chunk-66IQQBOM.js";
60
+ import "./chunk-MPW3OMAB.js";
61
+ import "./chunk-T4YXQTDG.js";
62
+ import "./chunk-JQW3XPSA.js";
63
63
  import "./chunk-UZ34JEUK.js";
64
- import "./chunk-PJMRV734.js";
64
+ import "./chunk-RKTBVJGG.js";
65
65
  import "./chunk-BJSWTHRM.js";
66
- import "./chunk-Q6ADAH2V.js";
66
+ import "./chunk-GLNNII3K.js";
67
67
  import {
68
68
  getContext
69
- } from "./chunk-T5T43XFI.js";
69
+ } from "./chunk-A33Z7A54.js";
70
70
  import "./chunk-KFEHHKZ2.js";
71
- import "./chunk-PKMXJDHS.js";
72
- import "./chunk-GAHOCTVO.js";
71
+ import "./chunk-LGWP73N3.js";
72
+ import "./chunk-R357FMHE.js";
73
73
  import {
74
74
  enableConfigs
75
- } from "./chunk-BV4JBKPK.js";
75
+ } from "./chunk-2P4E3ZNA.js";
76
76
  import "./chunk-RQVLBMP7.js";
77
77
  import {
78
78
  initDebugLogger
79
- } from "./chunk-6UJ2IX6O.js";
79
+ } from "./chunk-USNKNXS4.js";
80
80
  import {
81
81
  PRODUCT_COMMAND,
82
82
  initSentry,
@@ -84,10 +84,10 @@ import {
84
84
  resolveXdgDataPath,
85
85
  setCwd,
86
86
  setOriginalCwd
87
- } from "./chunk-GBRPRP4C.js";
87
+ } from "./chunk-X7II6NLY.js";
88
88
  import {
89
89
  MACRO
90
- } from "./chunk-VNJSOVCS.js";
90
+ } from "./chunk-OONY2XEJ.js";
91
91
  import "./chunk-I3J4JYES.js";
92
92
 
93
93
  // src/acp/jsonrpc.ts
@@ -2,14 +2,14 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  getModelManager
5
- } from "./chunk-Q6ADAH2V.js";
6
- import "./chunk-BV4JBKPK.js";
5
+ } from "./chunk-GLNNII3K.js";
6
+ import "./chunk-2P4E3ZNA.js";
7
7
  import "./chunk-RQVLBMP7.js";
8
- import "./chunk-6UJ2IX6O.js";
8
+ import "./chunk-USNKNXS4.js";
9
9
  import {
10
10
  getXdgConfigDir
11
- } from "./chunk-GBRPRP4C.js";
12
- import "./chunk-VNJSOVCS.js";
11
+ } from "./chunk-X7II6NLY.js";
12
+ import "./chunk-OONY2XEJ.js";
13
13
  import "./chunk-I3J4JYES.js";
14
14
 
15
15
  // src/entrypoints/cli/agentsValidate.ts
@@ -344,8 +344,8 @@ async function validateAgentTemplates(args) {
344
344
  let knownToolNames;
345
345
  if (args.checkTools) {
346
346
  try {
347
- const { getTools } = await import("./tools-LHTT7WYX.js");
348
- const { getCurrentProjectConfig } = await import("./config-HVU5BUJR.js");
347
+ const { getTools } = await import("./tools-IEYQ4SAS.js");
348
+ const { getCurrentProjectConfig } = await import("./config-7YD4R22V.js");
349
349
  const allTools = await getTools(getCurrentProjectConfig().enableArchitectTool);
350
350
  knownToolNames = new Set(allTools.map((t) => t.name));
351
351
  } catch {
@@ -4,68 +4,68 @@ import {
4
4
  createConversationTrackerPersistenceTelemetryEmitter,
5
5
  getSystemPrompt,
6
6
  query
7
- } from "./chunk-T5VIUVWS.js";
8
- import "./chunk-LQ3YSDHE.js";
9
- import "./chunk-37VT7CBN.js";
10
- import "./chunk-A4MELTXR.js";
7
+ } from "./chunk-XGFLQLPP.js";
8
+ import "./chunk-HKDUNAZU.js";
9
+ import "./chunk-MQ56NHZY.js";
10
+ import "./chunk-3L5QLWHQ.js";
11
11
  import "./chunk-5P7HBXTD.js";
12
- import "./chunk-EXOVGTTX.js";
12
+ import "./chunk-TW7VYZCV.js";
13
13
  import {
14
14
  ConversationTracker
15
- } from "./chunk-K53ERJZE.js";
15
+ } from "./chunk-PPTR7ECF.js";
16
16
  import {
17
17
  FileSystemConversationPersistence
18
- } from "./chunk-HS72NWQM.js";
18
+ } from "./chunk-5AM65D7G.js";
19
19
  import {
20
20
  beginReplSessionScope
21
21
  } from "./chunk-F4AXICO7.js";
22
- import "./chunk-UBR4EMJG.js";
23
- import "./chunk-JRCCJJTK.js";
24
- import "./chunk-CWEWMSYK.js";
22
+ import "./chunk-HPHRVBGM.js";
23
+ import "./chunk-FGAQGENO.js";
24
+ import "./chunk-JQXGDP2G.js";
25
25
  import "./chunk-XKYHFZEC.js";
26
- import "./chunk-HKC3XNTU.js";
27
- import "./chunk-ORTVYWVH.js";
28
- import "./chunk-XYD26HOU.js";
29
- import "./chunk-TM2IQSS6.js";
26
+ import "./chunk-34KB4DEZ.js";
27
+ import "./chunk-TYK67RSX.js";
28
+ import "./chunk-QLLHQ4NC.js";
29
+ import "./chunk-DXS27TBK.js";
30
30
  import "./chunk-UNNVICVU.js";
31
- import "./chunk-DNJ2EUI4.js";
32
- import "./chunk-6EUA3JLK.js";
31
+ import "./chunk-M3XZZUER.js";
32
+ import "./chunk-REIICUCF.js";
33
33
  import "./chunk-A3BVXXA3.js";
34
34
  import {
35
35
  createUserTurnMessageFromBlocks
36
- } from "./chunk-SFFHKLKV.js";
36
+ } from "./chunk-OQ7GMNEA.js";
37
37
  import "./chunk-3DFBSQIT.js";
38
38
  import "./chunk-B6IMQJZM.js";
39
39
  import {
40
40
  getTotalCost
41
41
  } from "./chunk-OUXHGDLH.js";
42
- import "./chunk-2OX2HGKH.js";
42
+ import "./chunk-45CYYYU7.js";
43
43
  import "./chunk-QWIBSCDN.js";
44
- import "./chunk-X2LEA5WZ.js";
45
- import "./chunk-T3NFIJVE.js";
46
- import "./chunk-66IQQBOM.js";
44
+ import "./chunk-MPW3OMAB.js";
45
+ import "./chunk-T4YXQTDG.js";
46
+ import "./chunk-JQW3XPSA.js";
47
47
  import "./chunk-UZ34JEUK.js";
48
- import "./chunk-PJMRV734.js";
48
+ import "./chunk-RKTBVJGG.js";
49
49
  import "./chunk-BJSWTHRM.js";
50
50
  import {
51
51
  getModelManager
52
- } from "./chunk-Q6ADAH2V.js";
52
+ } from "./chunk-GLNNII3K.js";
53
53
  import {
54
54
  getContext
55
- } from "./chunk-T5T43XFI.js";
55
+ } from "./chunk-A33Z7A54.js";
56
56
  import "./chunk-KFEHHKZ2.js";
57
- import "./chunk-PKMXJDHS.js";
58
- import "./chunk-GAHOCTVO.js";
59
- import "./chunk-BV4JBKPK.js";
57
+ import "./chunk-LGWP73N3.js";
58
+ import "./chunk-R357FMHE.js";
59
+ import "./chunk-2P4E3ZNA.js";
60
60
  import "./chunk-RQVLBMP7.js";
61
- import "./chunk-6UJ2IX6O.js";
61
+ import "./chunk-USNKNXS4.js";
62
62
  import {
63
63
  getMessagesPath,
64
64
  overwriteLog,
65
65
  resolveXdgDataPath,
66
66
  setCwd
67
- } from "./chunk-GBRPRP4C.js";
68
- import "./chunk-VNJSOVCS.js";
67
+ } from "./chunk-X7II6NLY.js";
68
+ import "./chunk-OONY2XEJ.js";
69
69
  import "./chunk-I3J4JYES.js";
70
70
 
71
71
  // src/app/ask.ts
@@ -5,9 +5,9 @@ import {
5
5
  checkAndNotifyUpdate,
6
6
  getLatestVersion,
7
7
  getUpdateCommandSuggestions
8
- } from "./chunk-66GPSPHJ.js";
9
- import "./chunk-GBRPRP4C.js";
10
- import "./chunk-VNJSOVCS.js";
8
+ } from "./chunk-ODHAKZLW.js";
9
+ import "./chunk-X7II6NLY.js";
10
+ import "./chunk-OONY2XEJ.js";
11
11
  import "./chunk-I3J4JYES.js";
12
12
  export {
13
13
  assertMinVersion,
@@ -5,13 +5,13 @@ import {
5
5
  } from "./chunk-RQVLBMP7.js";
6
6
  import {
7
7
  debug
8
- } from "./chunk-6UJ2IX6O.js";
8
+ } from "./chunk-USNKNXS4.js";
9
9
  import {
10
10
  getCwd,
11
11
  getGlobalConfigFilePath,
12
12
  getLegacyGlobalConfigFilePath,
13
13
  logError
14
- } from "./chunk-GBRPRP4C.js";
14
+ } from "./chunk-X7II6NLY.js";
15
15
 
16
16
  // src/core/config/schema.ts
17
17
  function isAutoUpdaterStatus(value) {
@@ -688,7 +688,7 @@ function setModelPointer(pointer, modelName) {
688
688
  }
689
689
  };
690
690
  saveGlobalConfig(updatedConfig);
691
- import("./model-URPSX5FV.js").then(({ reloadModelManager }) => {
691
+ import("./model-PLE3KNNX.js").then(({ reloadModelManager }) => {
692
692
  reloadModelManager();
693
693
  });
694
694
  }
@@ -3,7 +3,7 @@ const require = __pybCreateRequire(import.meta.url);
3
3
 
4
4
  // src/services/ai/llmLazy.ts
5
5
  async function queryLLM(messages, systemPrompt, maxThinkingTokens, tools, signal, options) {
6
- const { queryLLM: inner } = await import("./llm-YTSS25IN.js");
6
+ const { queryLLM: inner } = await import("./llm-UPZIAGPI.js");
7
7
  return inner(
8
8
  messages,
9
9
  systemPrompt,
@@ -14,15 +14,15 @@ async function queryLLM(messages, systemPrompt, maxThinkingTokens, tools, signal
14
14
  );
15
15
  }
16
16
  async function queryQuick(args) {
17
- const { queryQuick: inner } = await import("./llm-YTSS25IN.js");
17
+ const { queryQuick: inner } = await import("./llm-UPZIAGPI.js");
18
18
  return inner(args);
19
19
  }
20
20
  async function verifyApiKey(apiKey, baseURL, provider) {
21
- const { verifyApiKey: inner } = await import("./llm-YTSS25IN.js");
21
+ const { verifyApiKey: inner } = await import("./llm-UPZIAGPI.js");
22
22
  return inner(apiKey, baseURL, provider);
23
23
  }
24
24
  async function fetchAnthropicModels(apiKey, baseURL) {
25
- const { fetchAnthropicModels: inner } = await import("./llm-YTSS25IN.js");
25
+ const { fetchAnthropicModels: inner } = await import("./llm-UPZIAGPI.js");
26
26
  return inner(apiKey, baseURL);
27
27
  }
28
28
 
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-KFEHHKZ2.js";
6
6
  import {
7
7
  resolveXdgDataPath
8
- } from "./chunk-GBRPRP4C.js";
8
+ } from "./chunk-X7II6NLY.js";
9
9
 
10
10
  // src/utils/session/sessionSqlStore.ts
11
11
  import { createRequire } from "node:module";
@@ -2,11 +2,11 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  listAllContentFiles
5
- } from "./chunk-PKMXJDHS.js";
5
+ } from "./chunk-LGWP73N3.js";
6
6
  import {
7
7
  getCwd,
8
8
  logError
9
- } from "./chunk-GBRPRP4C.js";
9
+ } from "./chunk-X7II6NLY.js";
10
10
 
11
11
  // src/utils/fs/file.ts
12
12
  import {
@@ -2,7 +2,7 @@ import { createRequire as __pybCreateRequire } from "node:module";
2
2
  const require = __pybCreateRequire(import.meta.url);
3
3
  import {
4
4
  logError
5
- } from "./chunk-GBRPRP4C.js";
5
+ } from "./chunk-X7II6NLY.js";
6
6
 
7
7
  // src/utils/session/conversationPersistence.ts
8
8
  import {
@@ -8,13 +8,13 @@ import {
8
8
  } from "./chunk-KFEHHKZ2.js";
9
9
  import {
10
10
  ripGrepWithStatus
11
- } from "./chunk-PKMXJDHS.js";
11
+ } from "./chunk-LGWP73N3.js";
12
12
  import {
13
13
  getCurrentProjectConfig,
14
14
  getGlobalConfig,
15
15
  getOrCreateUserID,
16
16
  saveCurrentProjectConfig
17
- } from "./chunk-BV4JBKPK.js";
17
+ } from "./chunk-2P4E3ZNA.js";
18
18
  import {
19
19
  SESSION_ID,
20
20
  env,
@@ -22,10 +22,10 @@ import {
22
22
  getCwd,
23
23
  isContextScanDisabled,
24
24
  logError
25
- } from "./chunk-GBRPRP4C.js";
25
+ } from "./chunk-X7II6NLY.js";
26
26
  import {
27
27
  MACRO
28
- } from "./chunk-VNJSOVCS.js";
28
+ } from "./chunk-OONY2XEJ.js";
29
29
  import {
30
30
  __require
31
31
  } from "./chunk-I3J4JYES.js";
@@ -484,7 +484,7 @@ var ENV_STATS_IGNORE_PATTERNS = [
484
484
  "venv/",
485
485
  "env/"
486
486
  ];
487
- var PROJECT_STRUCTURE_STATS_GUIDANCE = 'Based on current project structure statistics, preliminary complexity analysis: 1 High directory/file ratio \u2192 more fragmented structure, potentially finer hierarchy, higher complexity. 2 Deep max depth \u2192 obvious deep nesting, higher navigation and positioning cost. 3 Many top-level directories \u2192 scattered module entries, need stricter layer confirmation. 4 Large total files \u2192 more likely to trigger output truncation. Processing: Low complexity \u2192 use Glob "dir/*" to get structure clues then proceed to locate; High complexity \u2192 use Glob "dir/*" to get top-level clues first, then use Glob for layered path confirmation.';
487
+ var PROJECT_STRUCTURE_STATS_GUIDANCE = "Based on current project structure statistics, preliminary complexity analysis: 1 High directory/file ratio \u2192 more fragmented structure, potentially finer hierarchy, higher complexity. 2 Deep max depth \u2192 obvious deep nesting, higher navigation and positioning cost. 3 Many top-level directories \u2192 scattered module entries, need stricter layer confirmation. 4 Large total files \u2192 more likely to trigger output truncation. Processing: Low complexity \u2192 read target directory paths for one-level structure clues, then proceed to locate; High complexity \u2192 read top-level directory paths first, then use Glob for layered path confirmation.";
488
488
  var getWorkingDirectoryStructureStatsSnapshot = memoize4(
489
489
  async () => computeWorkingDirectoryStructureStats()
490
490
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/utils/config/style.ts", "../src/context/index.ts", "../src/utils/system/git.ts", "../src/utils/identity/user.ts", "../src/utils/config/rules.ts"],
4
- "sourcesContent": ["import { readFileSync } from 'fs'\nimport { memoize } from 'lodash-es'\nimport { getCwd } from '@utils/state'\nimport { getProjectInstructionFiles } from './projectInstructions'\n\nconst STYLE_PROMPT =\n 'The codebase follows strict style guidelines shown below. All code changes must strictly adhere to these guidelines to maintain consistency and quality.'\n\nexport const getCodeStyle = memoize((): string => {\n const styles: string[] = []\n\n const instructionFiles = getProjectInstructionFiles(getCwd())\n for (const file of instructionFiles) {\n try {\n styles.push(\n `Contents of ${file.absolutePath}:\\n\\n${readFileSync(file.absolutePath, 'utf-8')}`,\n )\n } catch {\n }\n }\n\n if (styles.length === 0) {\n return ''\n }\n\n return `${STYLE_PROMPT}\\n\\n${styles.join('\\n\\n')}`\n})\n", "import {\n getCurrentProjectConfig,\n saveCurrentProjectConfig,\n} from '@utils/config'\nimport { logError } from '@utils/log'\nimport { getCodeStyle } from '@utils/config/style'\nimport { isContextScanDisabled } from '@utils/config/env'\nimport { getCwd } from '@utils/state'\nimport { memoize, omit } from 'lodash-es'\nimport { getIsGit } from '@utils/system/git'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport { isAbsolute, join, relative, resolve, sep } from 'path'\nimport { readFile } from 'fs/promises'\nimport { existsSync, readdirSync } from 'fs'\nimport { getModelManager } from '@utils/model'\nimport { lastX } from '@utils/text/generators'\nimport { getGitEmail } from '@utils/identity/user'\nimport {\n getProjectInstructionFiles,\n readAndConcatProjectInstructionFiles,\n} from '@utils/config/projectInstructions'\nimport { getProjectRules } from '@utils/config/rules'\nimport { ripGrepWithStatus } from '@utils/system/ripgrep'\nimport { minimatch } from 'minimatch'\n\nexport async function getInstructionFilesNote(): Promise<string | null> {\n try {\n if (isContextScanDisabled()) {\n return null\n }\n const cwd = getCwd()\n const instructionFiles = getProjectInstructionFiles(cwd)\n const legacyPath = join(cwd, 'CLAUDE.md')\n const hasLegacy = existsSync(legacyPath)\n\n if (instructionFiles.length === 0 && !hasLegacy) {\n return null\n }\n\n const fileTypes = new Set<string>()\n for (const f of instructionFiles) fileTypes.add(f.filename)\n if (hasLegacy) fileTypes.add('CLAUDE.md (legacy)')\n\n const allFiles = [\n ...instructionFiles.map(f => f.absolutePath),\n ...(hasLegacy ? [legacyPath] : []),\n ]\n\n return `NOTE: Additional project instruction files (${Array.from(fileTypes).join(', ')}) were found. When working in these directories, make sure to read and follow the instructions in the corresponding files:\\n${allFiles\n .map(_ => `- ${_}`)\n .join('\\n')}`\n } catch (error) {\n logError(error)\n return null\n }\n}\n\nexport function setContext(key: string, value: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n { ...projectConfig.context, [key]: value },\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport function removeContext(key: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n projectConfig.context,\n key,\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport const getReadme = memoize(async (): Promise<string | null> => {\n try {\n const readmePath = join(getCwd(), 'README.md')\n if (!existsSync(readmePath)) {\n return null\n }\n const content = await readFile(readmePath, 'utf-8')\n return content\n } catch (e) {\n logError(e)\n return null\n }\n})\n\nexport async function getProjectDocsForCwd(\n cwd: string,\n): Promise<string | null> {\n try {\n const instructionFiles = getProjectInstructionFiles(cwd)\n const legacyPath = join(cwd, 'CLAUDE.md')\n\n const docs = []\n\n if (instructionFiles.length > 0) {\n const { content } = readAndConcatProjectInstructionFiles(\n instructionFiles,\n { includeHeadings: true },\n )\n if (content.trim().length > 0) docs.push(content)\n }\n\n const rules = getProjectRules(cwd)\n if (rules.length > 0) {\n const formattedRules = `\n# Project Rules (MANDATORY)\nThe following content represents the immutable rules for this project.\n<project_rules>\n${rules.join('\\n\\n')}\n</project_rules>\n`.trim()\n docs.unshift(formattedRules)\n }\n\n if (existsSync(legacyPath)) {\n try {\n const content = await readFile(legacyPath, 'utf-8')\n docs.push(\n `# Legacy instructions (CLAUDE.md)\\n\\n${content}`,\n )\n } catch (e) {\n logError(e)\n }\n }\n\n return docs.length > 0 ? docs.join('\\n\\n---\\n\\n') : null\n } catch (e) {\n logError(e)\n return null\n }\n}\n\nexport const getProjectDocs = memoize(async (): Promise<string | null> => {\n return getProjectDocsForCwd(getCwd())\n})\n\nexport const getGitStatus = memoize(async (): Promise<string | null> => {\n if (process.env.NODE_ENV === 'test') {\n return null\n }\n if (!(await getIsGit())) {\n return null\n }\n\n try {\n const [branch, mainBranch, status, log, authorLog] = await Promise.all([\n execFileNoThrow(\n 'git',\n ['branch', '--show-current'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'origin/HEAD'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.replace('origin/', '').trim()),\n execFileNoThrow(\n 'git',\n ['status', '--short'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['log', '--oneline', '-n', '5'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n [\n 'log',\n '--oneline',\n '-n',\n '5',\n '--author',\n (await getGitEmail()) || '',\n ],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n ])\n const statusLines = status.split('\\n').length\n const truncatedStatus =\n statusLines > 200\n ? status.split('\\n').slice(0, 200).join('\\n') +\n '\\n... (truncated because there are more than 200 lines. If you need more information, run \"git status\" using BashTool)'\n : status\n\n return `This is the git status at the start of the conversation. Note that this status is a snapshot in time, and will not update during the conversation.\\nCurrent branch: ${branch}\\n\\nMain branch (you will usually use this for PRs): ${mainBranch}\\n\\nStatus:\\n${truncatedStatus || '(clean)'}\\n\\nRecent commits:\\n${log}\\n\\nYour recent commits:\\n${authorLog || '(no recent commits)'}`\n } catch (error) {\n logError(error)\n return null\n }\n})\n\nexport const getContext = memoize(\n async (): Promise<{\n [k: string]: string\n }> => {\n const codeStyle = getCodeStyle()\n const projectConfig = getCurrentProjectConfig()\n const dontCrawl = projectConfig.dontCrawlDirectory || isContextScanDisabled()\n const [\n gitStatus,\n directoryStructure,\n instructionFilesNote,\n readme,\n projectDocs,\n ] = await Promise.all([\n getGitStatus(),\n dontCrawl ? Promise.resolve('') : getDirectoryStructure(),\n dontCrawl ? Promise.resolve('') : getInstructionFilesNote(),\n getReadme(),\n getProjectDocs(),\n ])\n return {\n ...projectConfig.context,\n ...(directoryStructure ? { directoryStructure } : {}),\n ...(gitStatus ? { gitStatus } : {}),\n ...(codeStyle ? { codeStyle } : {}),\n ...(instructionFilesNote ? { instructionFilesNote } : {}),\n ...(readme ? { readme } : {}),\n ...(projectDocs ? { projectDocs } : {}),\n }\n },\n)\n\nexport const getDirectoryStructure = memoize(\n async function (): Promise<string> {\n if (isContextScanDisabled()) {\n return ''\n }\n let lines: string\n try {\n lines = buildDirectoryStructure()\n } catch (error) {\n logError(error)\n return ''\n }\n\n return `Below is a snapshot of this project's file tree structure at the start of the conversation. This snapshot will NOT update during the conversation.\n\n${lines}`\n },\n)\n\nconst buildDirectoryStructure = (): string => {\n const entries = readdirSync(getCwd(), { withFileTypes: true })\n const directories = entries\n .filter(entry => entry.isDirectory())\n .map(entry => entry.name)\n .sort((a, b) => a.localeCompare(b))\n const files = entries\n .filter(entry => !entry.isDirectory())\n .map(entry => entry.name)\n .sort((a, b) => a.localeCompare(b))\n const root = getCwd()\n const rootLabel = root.endsWith(sep) ? root : `${root}${sep}`\n return renderTopLevelTree(rootLabel, directories, files)\n}\n\ntype WorkingDirectoryStructureStats = {\n topLevelDirectoryCount: number\n topLevelFileCount: number\n totalDirectoryCount: number\n totalFileCount: number\n directoryFileRatio: string\n maxDepth: number\n}\n\nconst ENV_STATS_IGNORE_PATTERNS = [\n 'node_modules/',\n '__pycache__/',\n '.git/',\n 'dist/',\n 'build/',\n 'target/',\n 'bin/',\n 'obj/',\n '.idea/',\n '.vscode/',\n '.zig-cache/',\n 'zig-out',\n '.coverage',\n 'coverage/',\n 'vendor/',\n 'tmp/',\n 'temp/',\n '.cache/',\n 'cache/',\n 'logs/',\n '.venv/',\n 'venv/',\n 'env/',\n]\n\nconst PROJECT_STRUCTURE_STATS_GUIDANCE =\n 'Based on current project structure statistics, preliminary complexity analysis: 1 High directory/file ratio \u2192 more fragmented structure, potentially finer hierarchy, higher complexity. 2 Deep max depth \u2192 obvious deep nesting, higher navigation and positioning cost. 3 Many top-level directories \u2192 scattered module entries, need stricter layer confirmation. 4 Large total files \u2192 more likely to trigger output truncation. Processing: Low complexity \u2192 use Glob \"dir/*\" to get structure clues then proceed to locate; High complexity \u2192 use Glob \"dir/*\" to get top-level clues first, then use Glob for layered path confirmation.'\n\nconst getWorkingDirectoryStructureStatsSnapshot = memoize(\n async (): Promise<WorkingDirectoryStructureStats | null> =>\n computeWorkingDirectoryStructureStats(),\n)\n\nexport function resetWorkingDirectoryStatsCacheForTests(): void {\n ;(getWorkingDirectoryStructureStatsSnapshot as any).cache?.clear?.()\n}\n\nexport async function getWorkingDirectoryStructureStats(): Promise<WorkingDirectoryStructureStats | null> {\n const mode = String(process.env.PYB_ENV_STATS_MODE || 'realtime')\n .trim()\n .toLowerCase()\n if (mode === 'snapshot') {\n return getWorkingDirectoryStructureStatsSnapshot()\n }\n return computeWorkingDirectoryStructureStats()\n}\n\nexport async function getProjectStructureStatisticsBlock(): Promise<string> {\n if (isContextScanDisabled()) return ''\n const stats = await getWorkingDirectoryStructureStats()\n if (!stats) return ''\n const statsLine = `\u5F53\u524D\u9879\u76EE\u7EDF\u8BA1\u4FE1\u606F: \u9876\u5C42\u76EE\u5F55\u6570\uFF1A${stats.topLevelDirectoryCount}\u4E2A\uFF0C\u9876\u5C42\u6587\u4EF6\u6570\uFF1A${stats.topLevelFileCount}\u4E2A\uFF0C\u603B\u76EE\u5F55\u6570\uFF1A${stats.totalDirectoryCount}\u4E2A\uFF0C\u603B\u6587\u4EF6\u6570\uFF1A${stats.totalFileCount}\u4E2A\uFF0C\u603B\u76EE\u5F55/\u603B\u6587\u4EF6\u6BD4\u4F8B=${stats.directoryFileRatio}\uFF0C\u6700\u6DF1\u76EE\u5F55\u5C42\u7EA7=${stats.maxDepth}\u3002\uFF08\u7EDF\u8BA1\u6570\u636E\u4E0D\u5305\u542B\u7A7A\u76EE\u5F55\u4EE5\u53CA\u5E38\u89C1\u975E\u6838\u5FC3\u76EE\u5F55/\u6784\u5EFA\u4EA7\u7269/\u4F9D\u8D56\u7F13\u5B58\u7B49\u6587\u4EF6\u6216\u76EE\u5F55\uFF09`\n return `<context name=\"Project Structure Statistics\">\\n${PROJECT_STRUCTURE_STATS_GUIDANCE}\\n\\n${statsLine}</context>`\n}\n\nconst computeWorkingDirectoryStructureStats = async (): Promise<WorkingDirectoryStructureStats | null> => {\n const cwd = getCwd()\n const abortController = new AbortController()\n const rgIgnoreGlobs = ENV_STATS_IGNORE_PATTERNS.map(pattern => `!${pattern}*`)\n const rgArgs = [\n '--files',\n ...rgIgnoreGlobs.flatMap(pattern => ['--glob', pattern]),\n ]\n const result = await ripGrepWithStatus(rgArgs, cwd, abortController.signal)\n if (result.status !== 'ok') return null\n const matchIgnorePatterns = ENV_STATS_IGNORE_PATTERNS.map(pattern =>\n pattern.endsWith('/') ? `${pattern}**` : pattern,\n )\n const files = result.files\n .filter(Boolean)\n .map(file => {\n const absolutePath = isAbsolute(file) ? file : resolve(cwd, file)\n const relativePath = relative(cwd, absolutePath)\n const normalized = relativePath.split(sep).join('/')\n return { normalized }\n })\n .filter(entry => {\n if (matchIgnorePatterns.length === 0) return true\n return !matchIgnorePatterns.some(pattern =>\n minimatch(entry.normalized, pattern, { dot: true, nocase: false }),\n )\n })\n const totalFileCount = files.length\n const directorySet = getDirectorySet(files.map(entry => entry.normalized))\n let maxDepth = 0\n for (const entry of files) {\n const parts = entry.normalized.split('/').filter(Boolean)\n const depth = Math.max(0, parts.length - 1)\n if (depth > maxDepth) maxDepth = depth\n }\n const ratio =\n totalFileCount === 0\n ? '0.00'\n : (directorySet.size / totalFileCount).toFixed(2)\n const topLevelEntries = readdirSync(cwd, { withFileTypes: true })\n const visibleTopLevel = topLevelEntries.filter(entry => {\n const normalized = entry.isDirectory() ? `${entry.name}/` : entry.name\n if (matchIgnorePatterns.length === 0) return true\n return !matchIgnorePatterns.some(pattern =>\n minimatch(normalized, pattern, { dot: true, nocase: false }),\n )\n })\n const topLevelDirectoryCount = visibleTopLevel.filter(entry =>\n entry.isDirectory(),\n ).length\n const topLevelFileCount = visibleTopLevel.filter(\n entry => !entry.isDirectory(),\n ).length\n return {\n topLevelDirectoryCount,\n topLevelFileCount,\n totalDirectoryCount: directorySet.size,\n totalFileCount,\n directoryFileRatio: ratio,\n maxDepth,\n }\n}\n\nconst getDirectorySet = (paths: string[]) => {\n const directories = new Set<string>()\n for (const entry of paths) {\n const parts = entry.split('/').filter(Boolean)\n if (parts.length <= 1) continue\n for (let i = 0; i < parts.length - 1; i++) {\n directories.add(parts.slice(0, i + 1).join('/'))\n }\n }\n return directories\n}\n\nconst renderTopLevelTree = (\n rootLabel: string,\n directories: string[],\n files: string[],\n): string => {\n const items = [\n ...directories.map(name => ({ name: `${name}${sep}`, isDir: true })),\n ...files.map(name => ({ name, isDir: false })),\n ]\n const lines: string[] = []\n lines.push(rootLabel)\n for (let i = 0; i < items.length; i++) {\n const connector = i === items.length - 1 ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 '\n lines.push(`${connector}${items[i].name}`)\n }\n return lines.join('\\n')\n}\n", "import { memoize } from 'lodash-es'\nimport { execFileNoThrow } from './execFileNoThrow'\n\nexport const getIsGit = memoize(async (): Promise<boolean> => {\n const { code } = await execFileNoThrow('git', [\n 'rev-parse',\n '--is-inside-work-tree',\n ])\n return code === 0\n})\n\nexport const getHead = async (): Promise<string> => {\n const { stdout } = await execFileNoThrow('git', ['rev-parse', 'HEAD'])\n return stdout.trim()\n}\n\nexport const getBranch = async (): Promise<string> => {\n const { stdout } = await execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'HEAD'],\n undefined,\n undefined,\n false,\n )\n return stdout.trim()\n}\n\nexport const getRemoteUrl = async (): Promise<string | null> => {\n const { stdout, code } = await execFileNoThrow(\n 'git',\n ['remote', 'get-url', 'origin'],\n undefined,\n undefined,\n false,\n )\n return code === 0 ? stdout.trim() : null\n}\n\nexport const getIsHeadOnRemote = async (): Promise<boolean> => {\n const { code } = await execFileNoThrow(\n 'git',\n ['rev-parse', '@{u}'],\n undefined,\n undefined,\n false,\n )\n return code === 0\n}\n\nexport const getIsClean = async (): Promise<boolean> => {\n const { stdout } = await execFileNoThrow(\n 'git',\n ['status', '--porcelain'],\n undefined,\n undefined,\n false,\n )\n return stdout.trim().length === 0\n}\n\nexport interface GitRepoState {\n commitHash: string\n branchName: string\n remoteUrl: string | null\n isHeadOnRemote: boolean\n isClean: boolean\n}\n\nexport async function getGitState(): Promise<GitRepoState | null> {\n try {\n const [commitHash, branchName, remoteUrl, isHeadOnRemote, isClean] =\n await Promise.all([\n getHead(),\n getBranch(),\n getRemoteUrl(),\n getIsHeadOnRemote(),\n getIsClean(),\n ])\n\n return {\n commitHash,\n branchName,\n remoteUrl,\n isHeadOnRemote,\n isClean,\n }\n } catch (_) {\n return null\n }\n}\n", "import { getGlobalConfig, getOrCreateUserID } from '@utils/config'\nimport { memoize } from 'lodash-es'\nimport { env } from '@utils/config/env'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport { logError, SESSION_ID } from '@utils/log'\nimport { MACRO } from '@constants/macros'\nexport const getGitEmail = memoize(async (): Promise<string | undefined> => {\n const result = await execFileNoThrow('git', ['config', 'user.email'])\n if (result.code !== 0) {\n logError(`Failed to get git email: ${result.stdout} ${result.stderr}`)\n return undefined\n }\n return result.stdout.trim() || undefined\n})\n\ntype SimpleUser = {\n customIDs?: Record<string, string>\n userID: string\n appVersion?: string\n userAgent?: string\n email?: string\n custom?: Record<string, unknown>\n}\n\nexport const getUser = memoize(async (): Promise<SimpleUser> => {\n const userID = getOrCreateUserID()\n const config = getGlobalConfig()\n const email = undefined\n return {\n customIDs: {\n sessionId: SESSION_ID,\n },\n userID,\n appVersion: MACRO.VERSION,\n userAgent: env.platform,\n email,\n custom: {\n nodeVersion: env.nodeVersion,\n userType: process.env.USER_TYPE,\n organizationUuid: config.oauthAccount?.organizationUuid,\n accountUuid: config.oauthAccount?.accountUuid,\n },\n }\n})\n", "import { existsSync, readdirSync, readFileSync, statSync } from 'fs'\r\nimport { join, relative, resolve } from 'path'\r\nimport matter from 'gray-matter'\r\nimport { minimatch } from 'minimatch'\r\nimport { findGitRoot, getDirsFromGitRootToCwd } from './projectInstructions'\r\nimport { logError } from '@utils/log'\r\n\r\nexport interface RuleFile {\r\n filename: string\r\n content: string\r\n paths?: string[]\r\n}\r\n\r\nfunction getRulesFromDir(dir: string, root: string, cwd: string): string[] {\r\n if (!existsSync(dir)) return []\r\n\r\n const rules: string[] = []\r\n const files = readdirSync(dir)\r\n\r\n for (const file of files) {\r\n if (!file.endsWith('.md')) continue\r\n\r\n const filePath = join(dir, file)\r\n if (!statSync(filePath).isFile()) continue\r\n\r\n try {\r\n const fileContent = readFileSync(filePath, 'utf-8')\r\n // gray-matter by default uses js-yaml.safeLoad which is removed in js-yaml v4.\r\n // We need to provide a custom parser if we want to be safe, or rely on gray-matter's auto-detection if updated.\r\n // However, looking at the error \"Function yaml.safeLoad is removed\", it seems gray-matter 4.0.3 (in package.json)\r\n // might not be fully compatible with js-yaml 4.x out of the box without options?\r\n // Actually, checking gray-matter docs/issues, v4.0.3 should work.\r\n // But the error comes from gray-matter calling yaml.safeLoad.\r\n \r\n // Solution: Pass a custom parser engine to gray-matter\r\n const yaml = require('js-yaml')\r\n const matterOptions = {\r\n engines: {\r\n yaml: {\r\n parse: yaml.load.bind(yaml),\r\n stringify: yaml.dump.bind(yaml)\r\n }\r\n }\r\n }\r\n \r\n const { content, data } = matter(fileContent, matterOptions)\r\n \r\n // User rule: If no paths (YAML frontmatter), it applies globally.\r\n if (!data.paths || !Array.isArray(data.paths) || data.paths.length === 0) {\r\n rules.push(content.trim())\r\n continue\r\n }\r\n\r\n // If paths are specified, check if current context (cwd) matches\r\n // This is a simplification. Ideally we'd check active files, but cwd is a good proxy.\r\n const relCwd = relative(root, cwd)\r\n // On Windows, relative paths might use backslashes, but glob patterns usually expect forward slashes.\r\n // Also ensure we don't have a leading slash unless absolute, but relative returns without leading slash usually.\r\n // However, if relCwd is empty (cwd == root), we want it to match \"**\" but maybe not \"src/**\".\r\n // If relCwd is \"src\", it matches \"src/**\".\r\n \r\n const normalizedRelCwd = relCwd.split('\\\\').join('/')\r\n\r\n // Let's iterate over paths patterns\r\n const hasMatch = data.paths.some((pattern: string) => {\r\n // minimatch(path, pattern)\r\n // If pattern is \"src/**\", and path is \"src\", minimatch(\"src\", \"src/**\") is FALSE.\r\n // We need to check if the path is INSIDE the pattern.\r\n // But the rules say: \"Rules are included when the file being edited matches the path\".\r\n // Since we are approximating by CWD, we should check:\r\n // 1. Is CWD inside the pattern? (e.g. pattern=\"src/**\", cwd=\"src/utils\" -> YES)\r\n // 2. Is CWD the pattern itself? (e.g. pattern=\"src\", cwd=\"src\" -> YES)\r\n // 3. Is the pattern inside CWD? (e.g. pattern=\"src/utils/**\", cwd=\"src\" -> Maybe? If I edit src/index.ts, no. If I edit src/utils/foo.ts, yes.)\r\n \r\n // Let's stick to: CWD must match the pattern OR be a child of the pattern.\r\n // minimatch(\"src/utils\", \"src/**\") -> true\r\n \r\n // Debugging logs in test might help, but let's try to be more robust.\r\n // Maybe \"src\" does NOT match \"src/**\" in minimatch?\r\n // \"src/\" matches \"src/**\"?\r\n \r\n if (minimatch(normalizedRelCwd, pattern)) return true\r\n \r\n // Try appending slash if not empty\r\n if (normalizedRelCwd && minimatch(normalizedRelCwd + '/', pattern)) return true\r\n \r\n return false\r\n })\r\n\r\n if (hasMatch) {\r\n rules.push(content.trim())\r\n }\r\n } catch (e) {\r\n logError(e)\r\n }\r\n }\r\n\r\n return rules\r\n}\r\n\r\nexport function getProjectRules(cwd: string): string[] {\r\n const gitRoot = findGitRoot(cwd)\r\n const root = gitRoot ?? resolve(cwd)\r\n const dirs = getDirsFromGitRootToCwd(root, cwd)\r\n\r\n const rules: string[] = []\r\n\r\n // Iterate from root down to cwd to collect rules from .claude/rules, .cursor/rules and .pyb/rules\r\n for (const dir of dirs) {\r\n // .claude/rules\r\n const claudeRulesDir = join(dir, '.claude', 'rules')\r\n rules.push(...getRulesFromDir(claudeRulesDir, root, cwd))\r\n\r\n // .cursor/rules\r\n const cursorRulesDir = join(dir, '.cursor', 'rules')\r\n rules.push(...getRulesFromDir(cursorRulesDir, root, cwd))\r\n\r\n // .pyb/rules\r\n const pybRulesDir = join(dir, '.pyb', 'rules')\r\n rules.push(...getRulesFromDir(pybRulesDir, root, cwd))\r\n }\r\n\r\n return rules\r\n}\r\n"],
4
+ "sourcesContent": ["import { readFileSync } from 'fs'\nimport { memoize } from 'lodash-es'\nimport { getCwd } from '@utils/state'\nimport { getProjectInstructionFiles } from './projectInstructions'\n\nconst STYLE_PROMPT =\n 'The codebase follows strict style guidelines shown below. All code changes must strictly adhere to these guidelines to maintain consistency and quality.'\n\nexport const getCodeStyle = memoize((): string => {\n const styles: string[] = []\n\n const instructionFiles = getProjectInstructionFiles(getCwd())\n for (const file of instructionFiles) {\n try {\n styles.push(\n `Contents of ${file.absolutePath}:\\n\\n${readFileSync(file.absolutePath, 'utf-8')}`,\n )\n } catch {\n }\n }\n\n if (styles.length === 0) {\n return ''\n }\n\n return `${STYLE_PROMPT}\\n\\n${styles.join('\\n\\n')}`\n})\n", "import {\n getCurrentProjectConfig,\n saveCurrentProjectConfig,\n} from '@utils/config'\nimport { logError } from '@utils/log'\nimport { getCodeStyle } from '@utils/config/style'\nimport { isContextScanDisabled } from '@utils/config/env'\nimport { getCwd } from '@utils/state'\nimport { memoize, omit } from 'lodash-es'\nimport { getIsGit } from '@utils/system/git'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport { isAbsolute, join, relative, resolve, sep } from 'path'\nimport { readFile } from 'fs/promises'\nimport { existsSync, readdirSync } from 'fs'\nimport { getModelManager } from '@utils/model'\nimport { lastX } from '@utils/text/generators'\nimport { getGitEmail } from '@utils/identity/user'\nimport {\n getProjectInstructionFiles,\n readAndConcatProjectInstructionFiles,\n} from '@utils/config/projectInstructions'\nimport { getProjectRules } from '@utils/config/rules'\nimport { ripGrepWithStatus } from '@utils/system/ripgrep'\nimport { minimatch } from 'minimatch'\n\nexport async function getInstructionFilesNote(): Promise<string | null> {\n try {\n if (isContextScanDisabled()) {\n return null\n }\n const cwd = getCwd()\n const instructionFiles = getProjectInstructionFiles(cwd)\n const legacyPath = join(cwd, 'CLAUDE.md')\n const hasLegacy = existsSync(legacyPath)\n\n if (instructionFiles.length === 0 && !hasLegacy) {\n return null\n }\n\n const fileTypes = new Set<string>()\n for (const f of instructionFiles) fileTypes.add(f.filename)\n if (hasLegacy) fileTypes.add('CLAUDE.md (legacy)')\n\n const allFiles = [\n ...instructionFiles.map(f => f.absolutePath),\n ...(hasLegacy ? [legacyPath] : []),\n ]\n\n return `NOTE: Additional project instruction files (${Array.from(fileTypes).join(', ')}) were found. When working in these directories, make sure to read and follow the instructions in the corresponding files:\\n${allFiles\n .map(_ => `- ${_}`)\n .join('\\n')}`\n } catch (error) {\n logError(error)\n return null\n }\n}\n\nexport function setContext(key: string, value: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n { ...projectConfig.context, [key]: value },\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport function removeContext(key: string): void {\n const projectConfig = getCurrentProjectConfig()\n const context = omit(\n projectConfig.context,\n key,\n 'codeStyle',\n 'directoryStructure',\n )\n saveCurrentProjectConfig({ ...projectConfig, context })\n}\n\nexport const getReadme = memoize(async (): Promise<string | null> => {\n try {\n const readmePath = join(getCwd(), 'README.md')\n if (!existsSync(readmePath)) {\n return null\n }\n const content = await readFile(readmePath, 'utf-8')\n return content\n } catch (e) {\n logError(e)\n return null\n }\n})\n\nexport async function getProjectDocsForCwd(\n cwd: string,\n): Promise<string | null> {\n try {\n const instructionFiles = getProjectInstructionFiles(cwd)\n const legacyPath = join(cwd, 'CLAUDE.md')\n\n const docs = []\n\n if (instructionFiles.length > 0) {\n const { content } = readAndConcatProjectInstructionFiles(\n instructionFiles,\n { includeHeadings: true },\n )\n if (content.trim().length > 0) docs.push(content)\n }\n\n const rules = getProjectRules(cwd)\n if (rules.length > 0) {\n const formattedRules = `\n# Project Rules (MANDATORY)\nThe following content represents the immutable rules for this project.\n<project_rules>\n${rules.join('\\n\\n')}\n</project_rules>\n`.trim()\n docs.unshift(formattedRules)\n }\n\n if (existsSync(legacyPath)) {\n try {\n const content = await readFile(legacyPath, 'utf-8')\n docs.push(\n `# Legacy instructions (CLAUDE.md)\\n\\n${content}`,\n )\n } catch (e) {\n logError(e)\n }\n }\n\n return docs.length > 0 ? docs.join('\\n\\n---\\n\\n') : null\n } catch (e) {\n logError(e)\n return null\n }\n}\n\nexport const getProjectDocs = memoize(async (): Promise<string | null> => {\n return getProjectDocsForCwd(getCwd())\n})\n\nexport const getGitStatus = memoize(async (): Promise<string | null> => {\n if (process.env.NODE_ENV === 'test') {\n return null\n }\n if (!(await getIsGit())) {\n return null\n }\n\n try {\n const [branch, mainBranch, status, log, authorLog] = await Promise.all([\n execFileNoThrow(\n 'git',\n ['branch', '--show-current'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'origin/HEAD'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.replace('origin/', '').trim()),\n execFileNoThrow(\n 'git',\n ['status', '--short'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n ['log', '--oneline', '-n', '5'],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n execFileNoThrow(\n 'git',\n [\n 'log',\n '--oneline',\n '-n',\n '5',\n '--author',\n (await getGitEmail()) || '',\n ],\n undefined,\n undefined,\n false,\n ).then(({ stdout }) => stdout.trim()),\n ])\n const statusLines = status.split('\\n').length\n const truncatedStatus =\n statusLines > 200\n ? status.split('\\n').slice(0, 200).join('\\n') +\n '\\n... (truncated because there are more than 200 lines. If you need more information, run \"git status\" using BashTool)'\n : status\n\n return `This is the git status at the start of the conversation. Note that this status is a snapshot in time, and will not update during the conversation.\\nCurrent branch: ${branch}\\n\\nMain branch (you will usually use this for PRs): ${mainBranch}\\n\\nStatus:\\n${truncatedStatus || '(clean)'}\\n\\nRecent commits:\\n${log}\\n\\nYour recent commits:\\n${authorLog || '(no recent commits)'}`\n } catch (error) {\n logError(error)\n return null\n }\n})\n\nexport const getContext = memoize(\n async (): Promise<{\n [k: string]: string\n }> => {\n const codeStyle = getCodeStyle()\n const projectConfig = getCurrentProjectConfig()\n const dontCrawl = projectConfig.dontCrawlDirectory || isContextScanDisabled()\n const [\n gitStatus,\n directoryStructure,\n instructionFilesNote,\n readme,\n projectDocs,\n ] = await Promise.all([\n getGitStatus(),\n dontCrawl ? Promise.resolve('') : getDirectoryStructure(),\n dontCrawl ? Promise.resolve('') : getInstructionFilesNote(),\n getReadme(),\n getProjectDocs(),\n ])\n return {\n ...projectConfig.context,\n ...(directoryStructure ? { directoryStructure } : {}),\n ...(gitStatus ? { gitStatus } : {}),\n ...(codeStyle ? { codeStyle } : {}),\n ...(instructionFilesNote ? { instructionFilesNote } : {}),\n ...(readme ? { readme } : {}),\n ...(projectDocs ? { projectDocs } : {}),\n }\n },\n)\n\nexport const getDirectoryStructure = memoize(\n async function (): Promise<string> {\n if (isContextScanDisabled()) {\n return ''\n }\n let lines: string\n try {\n lines = buildDirectoryStructure()\n } catch (error) {\n logError(error)\n return ''\n }\n\n return `Below is a snapshot of this project's file tree structure at the start of the conversation. This snapshot will NOT update during the conversation.\n\n${lines}`\n },\n)\n\nconst buildDirectoryStructure = (): string => {\n const entries = readdirSync(getCwd(), { withFileTypes: true })\n const directories = entries\n .filter(entry => entry.isDirectory())\n .map(entry => entry.name)\n .sort((a, b) => a.localeCompare(b))\n const files = entries\n .filter(entry => !entry.isDirectory())\n .map(entry => entry.name)\n .sort((a, b) => a.localeCompare(b))\n const root = getCwd()\n const rootLabel = root.endsWith(sep) ? root : `${root}${sep}`\n return renderTopLevelTree(rootLabel, directories, files)\n}\n\ntype WorkingDirectoryStructureStats = {\n topLevelDirectoryCount: number\n topLevelFileCount: number\n totalDirectoryCount: number\n totalFileCount: number\n directoryFileRatio: string\n maxDepth: number\n}\n\nconst ENV_STATS_IGNORE_PATTERNS = [\n 'node_modules/',\n '__pycache__/',\n '.git/',\n 'dist/',\n 'build/',\n 'target/',\n 'bin/',\n 'obj/',\n '.idea/',\n '.vscode/',\n '.zig-cache/',\n 'zig-out',\n '.coverage',\n 'coverage/',\n 'vendor/',\n 'tmp/',\n 'temp/',\n '.cache/',\n 'cache/',\n 'logs/',\n '.venv/',\n 'venv/',\n 'env/',\n]\n\nconst PROJECT_STRUCTURE_STATS_GUIDANCE =\n 'Based on current project structure statistics, preliminary complexity analysis: 1 High directory/file ratio \u2192 more fragmented structure, potentially finer hierarchy, higher complexity. 2 Deep max depth \u2192 obvious deep nesting, higher navigation and positioning cost. 3 Many top-level directories \u2192 scattered module entries, need stricter layer confirmation. 4 Large total files \u2192 more likely to trigger output truncation. Processing: Low complexity \u2192 read target directory paths for one-level structure clues, then proceed to locate; High complexity \u2192 read top-level directory paths first, then use Glob for layered path confirmation.'\n\nconst getWorkingDirectoryStructureStatsSnapshot = memoize(\n async (): Promise<WorkingDirectoryStructureStats | null> =>\n computeWorkingDirectoryStructureStats(),\n)\n\nexport function resetWorkingDirectoryStatsCacheForTests(): void {\n ;(getWorkingDirectoryStructureStatsSnapshot as any).cache?.clear?.()\n}\n\nexport async function getWorkingDirectoryStructureStats(): Promise<WorkingDirectoryStructureStats | null> {\n const mode = String(process.env.PYB_ENV_STATS_MODE || 'realtime')\n .trim()\n .toLowerCase()\n if (mode === 'snapshot') {\n return getWorkingDirectoryStructureStatsSnapshot()\n }\n return computeWorkingDirectoryStructureStats()\n}\n\nexport async function getProjectStructureStatisticsBlock(): Promise<string> {\n if (isContextScanDisabled()) return ''\n const stats = await getWorkingDirectoryStructureStats()\n if (!stats) return ''\n const statsLine = `\u5F53\u524D\u9879\u76EE\u7EDF\u8BA1\u4FE1\u606F: \u9876\u5C42\u76EE\u5F55\u6570\uFF1A${stats.topLevelDirectoryCount}\u4E2A\uFF0C\u9876\u5C42\u6587\u4EF6\u6570\uFF1A${stats.topLevelFileCount}\u4E2A\uFF0C\u603B\u76EE\u5F55\u6570\uFF1A${stats.totalDirectoryCount}\u4E2A\uFF0C\u603B\u6587\u4EF6\u6570\uFF1A${stats.totalFileCount}\u4E2A\uFF0C\u603B\u76EE\u5F55/\u603B\u6587\u4EF6\u6BD4\u4F8B=${stats.directoryFileRatio}\uFF0C\u6700\u6DF1\u76EE\u5F55\u5C42\u7EA7=${stats.maxDepth}\u3002\uFF08\u7EDF\u8BA1\u6570\u636E\u4E0D\u5305\u542B\u7A7A\u76EE\u5F55\u4EE5\u53CA\u5E38\u89C1\u975E\u6838\u5FC3\u76EE\u5F55/\u6784\u5EFA\u4EA7\u7269/\u4F9D\u8D56\u7F13\u5B58\u7B49\u6587\u4EF6\u6216\u76EE\u5F55\uFF09`\n return `<context name=\"Project Structure Statistics\">\\n${PROJECT_STRUCTURE_STATS_GUIDANCE}\\n\\n${statsLine}</context>`\n}\n\nconst computeWorkingDirectoryStructureStats = async (): Promise<WorkingDirectoryStructureStats | null> => {\n const cwd = getCwd()\n const abortController = new AbortController()\n const rgIgnoreGlobs = ENV_STATS_IGNORE_PATTERNS.map(pattern => `!${pattern}*`)\n const rgArgs = [\n '--files',\n ...rgIgnoreGlobs.flatMap(pattern => ['--glob', pattern]),\n ]\n const result = await ripGrepWithStatus(rgArgs, cwd, abortController.signal)\n if (result.status !== 'ok') return null\n const matchIgnorePatterns = ENV_STATS_IGNORE_PATTERNS.map(pattern =>\n pattern.endsWith('/') ? `${pattern}**` : pattern,\n )\n const files = result.files\n .filter(Boolean)\n .map(file => {\n const absolutePath = isAbsolute(file) ? file : resolve(cwd, file)\n const relativePath = relative(cwd, absolutePath)\n const normalized = relativePath.split(sep).join('/')\n return { normalized }\n })\n .filter(entry => {\n if (matchIgnorePatterns.length === 0) return true\n return !matchIgnorePatterns.some(pattern =>\n minimatch(entry.normalized, pattern, { dot: true, nocase: false }),\n )\n })\n const totalFileCount = files.length\n const directorySet = getDirectorySet(files.map(entry => entry.normalized))\n let maxDepth = 0\n for (const entry of files) {\n const parts = entry.normalized.split('/').filter(Boolean)\n const depth = Math.max(0, parts.length - 1)\n if (depth > maxDepth) maxDepth = depth\n }\n const ratio =\n totalFileCount === 0\n ? '0.00'\n : (directorySet.size / totalFileCount).toFixed(2)\n const topLevelEntries = readdirSync(cwd, { withFileTypes: true })\n const visibleTopLevel = topLevelEntries.filter(entry => {\n const normalized = entry.isDirectory() ? `${entry.name}/` : entry.name\n if (matchIgnorePatterns.length === 0) return true\n return !matchIgnorePatterns.some(pattern =>\n minimatch(normalized, pattern, { dot: true, nocase: false }),\n )\n })\n const topLevelDirectoryCount = visibleTopLevel.filter(entry =>\n entry.isDirectory(),\n ).length\n const topLevelFileCount = visibleTopLevel.filter(\n entry => !entry.isDirectory(),\n ).length\n return {\n topLevelDirectoryCount,\n topLevelFileCount,\n totalDirectoryCount: directorySet.size,\n totalFileCount,\n directoryFileRatio: ratio,\n maxDepth,\n }\n}\n\nconst getDirectorySet = (paths: string[]) => {\n const directories = new Set<string>()\n for (const entry of paths) {\n const parts = entry.split('/').filter(Boolean)\n if (parts.length <= 1) continue\n for (let i = 0; i < parts.length - 1; i++) {\n directories.add(parts.slice(0, i + 1).join('/'))\n }\n }\n return directories\n}\n\nconst renderTopLevelTree = (\n rootLabel: string,\n directories: string[],\n files: string[],\n): string => {\n const items = [\n ...directories.map(name => ({ name: `${name}${sep}`, isDir: true })),\n ...files.map(name => ({ name, isDir: false })),\n ]\n const lines: string[] = []\n lines.push(rootLabel)\n for (let i = 0; i < items.length; i++) {\n const connector = i === items.length - 1 ? '\u2514\u2500\u2500 ' : '\u251C\u2500\u2500 '\n lines.push(`${connector}${items[i].name}`)\n }\n return lines.join('\\n')\n}\n", "import { memoize } from 'lodash-es'\nimport { execFileNoThrow } from './execFileNoThrow'\n\nexport const getIsGit = memoize(async (): Promise<boolean> => {\n const { code } = await execFileNoThrow('git', [\n 'rev-parse',\n '--is-inside-work-tree',\n ])\n return code === 0\n})\n\nexport const getHead = async (): Promise<string> => {\n const { stdout } = await execFileNoThrow('git', ['rev-parse', 'HEAD'])\n return stdout.trim()\n}\n\nexport const getBranch = async (): Promise<string> => {\n const { stdout } = await execFileNoThrow(\n 'git',\n ['rev-parse', '--abbrev-ref', 'HEAD'],\n undefined,\n undefined,\n false,\n )\n return stdout.trim()\n}\n\nexport const getRemoteUrl = async (): Promise<string | null> => {\n const { stdout, code } = await execFileNoThrow(\n 'git',\n ['remote', 'get-url', 'origin'],\n undefined,\n undefined,\n false,\n )\n return code === 0 ? stdout.trim() : null\n}\n\nexport const getIsHeadOnRemote = async (): Promise<boolean> => {\n const { code } = await execFileNoThrow(\n 'git',\n ['rev-parse', '@{u}'],\n undefined,\n undefined,\n false,\n )\n return code === 0\n}\n\nexport const getIsClean = async (): Promise<boolean> => {\n const { stdout } = await execFileNoThrow(\n 'git',\n ['status', '--porcelain'],\n undefined,\n undefined,\n false,\n )\n return stdout.trim().length === 0\n}\n\nexport interface GitRepoState {\n commitHash: string\n branchName: string\n remoteUrl: string | null\n isHeadOnRemote: boolean\n isClean: boolean\n}\n\nexport async function getGitState(): Promise<GitRepoState | null> {\n try {\n const [commitHash, branchName, remoteUrl, isHeadOnRemote, isClean] =\n await Promise.all([\n getHead(),\n getBranch(),\n getRemoteUrl(),\n getIsHeadOnRemote(),\n getIsClean(),\n ])\n\n return {\n commitHash,\n branchName,\n remoteUrl,\n isHeadOnRemote,\n isClean,\n }\n } catch (_) {\n return null\n }\n}\n", "import { getGlobalConfig, getOrCreateUserID } from '@utils/config'\nimport { memoize } from 'lodash-es'\nimport { env } from '@utils/config/env'\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\nimport { logError, SESSION_ID } from '@utils/log'\nimport { MACRO } from '@constants/macros'\nexport const getGitEmail = memoize(async (): Promise<string | undefined> => {\n const result = await execFileNoThrow('git', ['config', 'user.email'])\n if (result.code !== 0) {\n logError(`Failed to get git email: ${result.stdout} ${result.stderr}`)\n return undefined\n }\n return result.stdout.trim() || undefined\n})\n\ntype SimpleUser = {\n customIDs?: Record<string, string>\n userID: string\n appVersion?: string\n userAgent?: string\n email?: string\n custom?: Record<string, unknown>\n}\n\nexport const getUser = memoize(async (): Promise<SimpleUser> => {\n const userID = getOrCreateUserID()\n const config = getGlobalConfig()\n const email = undefined\n return {\n customIDs: {\n sessionId: SESSION_ID,\n },\n userID,\n appVersion: MACRO.VERSION,\n userAgent: env.platform,\n email,\n custom: {\n nodeVersion: env.nodeVersion,\n userType: process.env.USER_TYPE,\n organizationUuid: config.oauthAccount?.organizationUuid,\n accountUuid: config.oauthAccount?.accountUuid,\n },\n }\n})\n", "import { existsSync, readdirSync, readFileSync, statSync } from 'fs'\r\nimport { join, relative, resolve } from 'path'\r\nimport matter from 'gray-matter'\r\nimport { minimatch } from 'minimatch'\r\nimport { findGitRoot, getDirsFromGitRootToCwd } from './projectInstructions'\r\nimport { logError } from '@utils/log'\r\n\r\nexport interface RuleFile {\r\n filename: string\r\n content: string\r\n paths?: string[]\r\n}\r\n\r\nfunction getRulesFromDir(dir: string, root: string, cwd: string): string[] {\r\n if (!existsSync(dir)) return []\r\n\r\n const rules: string[] = []\r\n const files = readdirSync(dir)\r\n\r\n for (const file of files) {\r\n if (!file.endsWith('.md')) continue\r\n\r\n const filePath = join(dir, file)\r\n if (!statSync(filePath).isFile()) continue\r\n\r\n try {\r\n const fileContent = readFileSync(filePath, 'utf-8')\r\n // gray-matter by default uses js-yaml.safeLoad which is removed in js-yaml v4.\r\n // We need to provide a custom parser if we want to be safe, or rely on gray-matter's auto-detection if updated.\r\n // However, looking at the error \"Function yaml.safeLoad is removed\", it seems gray-matter 4.0.3 (in package.json)\r\n // might not be fully compatible with js-yaml 4.x out of the box without options?\r\n // Actually, checking gray-matter docs/issues, v4.0.3 should work.\r\n // But the error comes from gray-matter calling yaml.safeLoad.\r\n \r\n // Solution: Pass a custom parser engine to gray-matter\r\n const yaml = require('js-yaml')\r\n const matterOptions = {\r\n engines: {\r\n yaml: {\r\n parse: yaml.load.bind(yaml),\r\n stringify: yaml.dump.bind(yaml)\r\n }\r\n }\r\n }\r\n \r\n const { content, data } = matter(fileContent, matterOptions)\r\n \r\n // User rule: If no paths (YAML frontmatter), it applies globally.\r\n if (!data.paths || !Array.isArray(data.paths) || data.paths.length === 0) {\r\n rules.push(content.trim())\r\n continue\r\n }\r\n\r\n // If paths are specified, check if current context (cwd) matches\r\n // This is a simplification. Ideally we'd check active files, but cwd is a good proxy.\r\n const relCwd = relative(root, cwd)\r\n // On Windows, relative paths might use backslashes, but glob patterns usually expect forward slashes.\r\n // Also ensure we don't have a leading slash unless absolute, but relative returns without leading slash usually.\r\n // However, if relCwd is empty (cwd == root), we want it to match \"**\" but maybe not \"src/**\".\r\n // If relCwd is \"src\", it matches \"src/**\".\r\n \r\n const normalizedRelCwd = relCwd.split('\\\\').join('/')\r\n\r\n // Let's iterate over paths patterns\r\n const hasMatch = data.paths.some((pattern: string) => {\r\n // minimatch(path, pattern)\r\n // If pattern is \"src/**\", and path is \"src\", minimatch(\"src\", \"src/**\") is FALSE.\r\n // We need to check if the path is INSIDE the pattern.\r\n // But the rules say: \"Rules are included when the file being edited matches the path\".\r\n // Since we are approximating by CWD, we should check:\r\n // 1. Is CWD inside the pattern? (e.g. pattern=\"src/**\", cwd=\"src/utils\" -> YES)\r\n // 2. Is CWD the pattern itself? (e.g. pattern=\"src\", cwd=\"src\" -> YES)\r\n // 3. Is the pattern inside CWD? (e.g. pattern=\"src/utils/**\", cwd=\"src\" -> Maybe? If I edit src/index.ts, no. If I edit src/utils/foo.ts, yes.)\r\n \r\n // Let's stick to: CWD must match the pattern OR be a child of the pattern.\r\n // minimatch(\"src/utils\", \"src/**\") -> true\r\n \r\n // Debugging logs in test might help, but let's try to be more robust.\r\n // Maybe \"src\" does NOT match \"src/**\" in minimatch?\r\n // \"src/\" matches \"src/**\"?\r\n \r\n if (minimatch(normalizedRelCwd, pattern)) return true\r\n \r\n // Try appending slash if not empty\r\n if (normalizedRelCwd && minimatch(normalizedRelCwd + '/', pattern)) return true\r\n \r\n return false\r\n })\r\n\r\n if (hasMatch) {\r\n rules.push(content.trim())\r\n }\r\n } catch (e) {\r\n logError(e)\r\n }\r\n }\r\n\r\n return rules\r\n}\r\n\r\nexport function getProjectRules(cwd: string): string[] {\r\n const gitRoot = findGitRoot(cwd)\r\n const root = gitRoot ?? resolve(cwd)\r\n const dirs = getDirsFromGitRootToCwd(root, cwd)\r\n\r\n const rules: string[] = []\r\n\r\n // Iterate from root down to cwd to collect rules from .claude/rules, .cursor/rules and .pyb/rules\r\n for (const dir of dirs) {\r\n // .claude/rules\r\n const claudeRulesDir = join(dir, '.claude', 'rules')\r\n rules.push(...getRulesFromDir(claudeRulesDir, root, cwd))\r\n\r\n // .cursor/rules\r\n const cursorRulesDir = join(dir, '.cursor', 'rules')\r\n rules.push(...getRulesFromDir(cursorRulesDir, root, cwd))\r\n\r\n // .pyb/rules\r\n const pybRulesDir = join(dir, '.pyb', 'rules')\r\n rules.push(...getRulesFromDir(pybRulesDir, root, cwd))\r\n }\r\n\r\n return rules\r\n}\r\n"],
5
5
  "mappings": "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",
6
6
  "names": ["memoize", "memoize", "memoize", "join", "relative", "resolve", "existsSync", "readdirSync", "memoize", "memoize", "readFileSync", "readFileSync", "minimatch", "join", "existsSync", "memoize", "readdirSync", "resolve", "relative"]
7
7
  }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/core/tools/tool.ts"],
4
+ "sourcesContent": ["import { z } from 'zod'\nimport type * as React from 'react'\nimport type { PermissionMode } from '@pyb-types/permissionMode'\nimport type { ToolPermissionContext } from '@pyb-types/toolPermissionContext'\n\nexport type SetToolJSXFn = (\n jsx: {\n jsx: React.ReactNode | null\n shouldHidePromptInput: boolean\n } | null,\n) => void\n\nexport interface ToolUseContext {\n messageId: string | undefined\n toolUseId?: string\n sessionId?: string\n parentSessionId?: string\n childSessionId?: string\n agentId?: string\n agentType?: string\n safeMode?: boolean\n abortController: AbortController\n readFileTimestamps: { [filePath: string]: number }\n options?: {\n commands?: any[]\n tools?: any[]\n verbose?: boolean\n slowAndCapableModel?: string\n safeMode?: boolean\n permissionMode?: PermissionMode\n toolPermissionContext?: ToolPermissionContext\n lastUserPrompt?: string\n forkNumber?: number\n messageLogName?: string\n maxThinkingTokens?: any\n model?: string\n commandAllowedTools?: string[]\n isPybRequest?: boolean\n pybContext?: string\n isCustomCommand?: boolean\n contentInputPath?: 'blocks' | 'string_adapted'\n mcpClients?: any[]\n disableSlashCommands?: boolean\n persistSession?: boolean\n shouldAvoidPermissionPrompts?: boolean\n }\n responseState?: {\n previousResponseId?: string\n conversationId?: string\n responseChainDepth?: number\n }\n}\n\nexport interface ExtendedToolUseContext extends ToolUseContext {\n setToolJSX: SetToolJSXFn\n}\n\nexport interface ValidationResult {\n result: boolean\n message?: string\n errorCode?: number\n meta?: any\n}\n\nexport interface Tool<\n TInput extends z.ZodTypeAny = z.ZodTypeAny,\n TOutput = any,\n> {\n name: string\n description?: string | ((input?: z.infer<TInput>) => Promise<string>)\n inputSchema: TInput\n inputJSONSchema?: Record<string, unknown>\n prompt: (options?: { safeMode?: boolean }) => Promise<string>\n userFacingName?: (input?: z.infer<TInput>) => string\n cachedDescription?: string\n isEnabled: () => Promise<boolean>\n isReadOnly: (input?: z.infer<TInput>) => boolean\n isConcurrencySafe: (input?: z.infer<TInput>) => boolean\n needsPermissions: (input?: z.infer<TInput>) => boolean\n requiresUserInteraction?: (input?: z.infer<TInput>) => boolean\n validateInput?: (\n input: z.infer<TInput>,\n context?: ToolUseContext,\n ) => Promise<ValidationResult>\n renderResultForAssistant: (output: TOutput) => string | any[]\n renderToolUseMessage: (\n input: z.infer<TInput>,\n options: { verbose: boolean },\n ) => string | React.ReactElement | null\n renderToolUseRejectedMessage?: (...args: any[]) => React.ReactElement\n renderToolResultMessage?: (\n output: TOutput,\n options: { verbose: boolean },\n ) => React.ReactNode\n call: (\n input: z.infer<TInput>,\n context: ToolUseContext,\n ) => AsyncGenerator<\n | {\n type: 'result'\n data: TOutput\n resultForAssistant?: string | any[]\n newMessages?: unknown[]\n contextModifier?: {\n modifyContext: (ctx: ToolUseContext) => ToolUseContext\n }\n }\n | {\n type: 'progress'\n content: any\n normalizedMessages?: any[]\n tools?: any[]\n },\n void,\n unknown\n >\n}\n\nexport function getToolDescription(tool: Tool): string {\n if (tool.cachedDescription) {\n return tool.cachedDescription\n }\n\n if (typeof tool.description === 'string') {\n return tool.description\n }\n\n return `Tool: ${tool.name}`\n}\n"],
5
+ "mappings": ";;;;AAsHO,SAAS,mBAAmB,MAAoB;AACrD,MAAI,KAAK,mBAAmB;AAC1B,WAAO,KAAK;AAAA,EACd;AAEA,MAAI,OAAO,KAAK,gBAAgB,UAAU;AACxC,WAAO,KAAK;AAAA,EACd;AAEA,SAAO,SAAS,KAAK,IAAI;AAC3B;",
6
+ "names": []
7
+ }
@@ -8,14 +8,14 @@ import {
8
8
  getSettingsFileCandidates,
9
9
  loadSettingsWithLegacyFallback,
10
10
  saveSettingsToPrimaryAndSyncLegacy
11
- } from "./chunk-66IQQBOM.js";
11
+ } from "./chunk-JQW3XPSA.js";
12
12
  import {
13
13
  getCurrentProjectConfig
14
- } from "./chunk-BV4JBKPK.js";
14
+ } from "./chunk-2P4E3ZNA.js";
15
15
  import {
16
16
  getCwd,
17
17
  logError
18
- } from "./chunk-GBRPRP4C.js";
18
+ } from "./chunk-X7II6NLY.js";
19
19
 
20
20
  // src/utils/permissions/toolPermissionSettings.ts
21
21
  function uniqueStrings(value) {