newcraw 1.0.0

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 (188) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +692 -0
  3. package/README.zh-CN.md +338 -0
  4. package/cli-acp.js +82 -0
  5. package/cli.js +105 -0
  6. package/dist/REPL-74GZVSMY.js +42 -0
  7. package/dist/REPL-74GZVSMY.js.map +7 -0
  8. package/dist/acp-A55ZRIPP.js +1357 -0
  9. package/dist/acp-A55ZRIPP.js.map +7 -0
  10. package/dist/agentsValidate-XWFIEHJ2.js +373 -0
  11. package/dist/agentsValidate-XWFIEHJ2.js.map +7 -0
  12. package/dist/ask-4ACYU23S.js +126 -0
  13. package/dist/ask-4ACYU23S.js.map +7 -0
  14. package/dist/autoUpdater-O2WHHSGP.js +17 -0
  15. package/dist/autoUpdater-O2WHHSGP.js.map +7 -0
  16. package/dist/chunk-2UO3BFZH.js +16 -0
  17. package/dist/chunk-2UO3BFZH.js.map +7 -0
  18. package/dist/chunk-3C73U2IU.js +2970 -0
  19. package/dist/chunk-3C73U2IU.js.map +7 -0
  20. package/dist/chunk-3U5X4VWP.js +2613 -0
  21. package/dist/chunk-3U5X4VWP.js.map +7 -0
  22. package/dist/chunk-755HIAI3.js +95 -0
  23. package/dist/chunk-755HIAI3.js.map +7 -0
  24. package/dist/chunk-7ZFLZNOW.js +21 -0
  25. package/dist/chunk-7ZFLZNOW.js.map +7 -0
  26. package/dist/chunk-A44DGORI.js +49 -0
  27. package/dist/chunk-A44DGORI.js.map +7 -0
  28. package/dist/chunk-AXWJI6N5.js +11 -0
  29. package/dist/chunk-AXWJI6N5.js.map +7 -0
  30. package/dist/chunk-B26ZUMJI.js +515 -0
  31. package/dist/chunk-B26ZUMJI.js.map +7 -0
  32. package/dist/chunk-BHNQGSLO.js +96 -0
  33. package/dist/chunk-BHNQGSLO.js.map +7 -0
  34. package/dist/chunk-BUI6KGVA.js +164 -0
  35. package/dist/chunk-BUI6KGVA.js.map +7 -0
  36. package/dist/chunk-DY5D4SS7.js +936 -0
  37. package/dist/chunk-DY5D4SS7.js.map +7 -0
  38. package/dist/chunk-EENI5HG7.js +498 -0
  39. package/dist/chunk-EENI5HG7.js.map +7 -0
  40. package/dist/chunk-EXPWPWA4.js +654 -0
  41. package/dist/chunk-EXPWPWA4.js.map +7 -0
  42. package/dist/chunk-FHOCKJOW.js +766 -0
  43. package/dist/chunk-FHOCKJOW.js.map +7 -0
  44. package/dist/chunk-GPKVTIYJ.js +191 -0
  45. package/dist/chunk-GPKVTIYJ.js.map +7 -0
  46. package/dist/chunk-H5BCUDEN.js +794 -0
  47. package/dist/chunk-H5BCUDEN.js.map +7 -0
  48. package/dist/chunk-INJSFEKL.js +47 -0
  49. package/dist/chunk-INJSFEKL.js.map +7 -0
  50. package/dist/chunk-JX5ZQYTQ.js +12 -0
  51. package/dist/chunk-JX5ZQYTQ.js.map +7 -0
  52. package/dist/chunk-KQSHIOZK.js +24 -0
  53. package/dist/chunk-KQSHIOZK.js.map +7 -0
  54. package/dist/chunk-L6WKZEK4.js +1609 -0
  55. package/dist/chunk-L6WKZEK4.js.map +7 -0
  56. package/dist/chunk-LC4CL3YJ.js +124 -0
  57. package/dist/chunk-LC4CL3YJ.js.map +7 -0
  58. package/dist/chunk-MXSB7IOZ.js +1097 -0
  59. package/dist/chunk-MXSB7IOZ.js.map +7 -0
  60. package/dist/chunk-N5OHRWG2.js +249 -0
  61. package/dist/chunk-N5OHRWG2.js.map +7 -0
  62. package/dist/chunk-NQE3GGE3.js +19 -0
  63. package/dist/chunk-NQE3GGE3.js.map +7 -0
  64. package/dist/chunk-QF6YDTME.js +139 -0
  65. package/dist/chunk-QF6YDTME.js.map +7 -0
  66. package/dist/chunk-QTX7AJFQ.js +240 -0
  67. package/dist/chunk-QTX7AJFQ.js.map +7 -0
  68. package/dist/chunk-S3ZAJPYZ.js +515 -0
  69. package/dist/chunk-S3ZAJPYZ.js.map +7 -0
  70. package/dist/chunk-S5Y5IF2H.js +735 -0
  71. package/dist/chunk-S5Y5IF2H.js.map +7 -0
  72. package/dist/chunk-SBE6Y327.js +836 -0
  73. package/dist/chunk-SBE6Y327.js.map +7 -0
  74. package/dist/chunk-T25Z3JMG.js +17 -0
  75. package/dist/chunk-T25Z3JMG.js.map +7 -0
  76. package/dist/chunk-T6VKT5FR.js +196 -0
  77. package/dist/chunk-T6VKT5FR.js.map +7 -0
  78. package/dist/chunk-TSGGSPYD.js +151 -0
  79. package/dist/chunk-TSGGSPYD.js.map +7 -0
  80. package/dist/chunk-TY3CCSAT.js +24 -0
  81. package/dist/chunk-TY3CCSAT.js.map +7 -0
  82. package/dist/chunk-U224EQOS.js +34 -0
  83. package/dist/chunk-U224EQOS.js.map +7 -0
  84. package/dist/chunk-U7S4MEYP.js +95 -0
  85. package/dist/chunk-U7S4MEYP.js.map +7 -0
  86. package/dist/chunk-ULVAAZ2U.js +30517 -0
  87. package/dist/chunk-ULVAAZ2U.js.map +7 -0
  88. package/dist/chunk-WWLFALT7.js +128 -0
  89. package/dist/chunk-WWLFALT7.js.map +7 -0
  90. package/dist/chunk-XJQATPV7.js +23 -0
  91. package/dist/chunk-XJQATPV7.js.map +7 -0
  92. package/dist/chunk-XMGUQHMF.js +72 -0
  93. package/dist/chunk-XMGUQHMF.js.map +7 -0
  94. package/dist/chunk-XOMW5QTV.js +472 -0
  95. package/dist/chunk-XOMW5QTV.js.map +7 -0
  96. package/dist/chunk-Y7VZUSIM.js +1256 -0
  97. package/dist/chunk-Y7VZUSIM.js.map +7 -0
  98. package/dist/chunk-YVNBXMIP.js +511 -0
  99. package/dist/chunk-YVNBXMIP.js.map +7 -0
  100. package/dist/chunk-YYPJWXSA.js +145 -0
  101. package/dist/chunk-YYPJWXSA.js.map +7 -0
  102. package/dist/cli-BW34VKCN.js +3917 -0
  103. package/dist/cli-BW34VKCN.js.map +7 -0
  104. package/dist/commands-4CNZZBTE.js +46 -0
  105. package/dist/commands-4CNZZBTE.js.map +7 -0
  106. package/dist/config-XKRCXCSS.js +81 -0
  107. package/dist/config-XKRCXCSS.js.map +7 -0
  108. package/dist/context-T5CR3RP6.js +30 -0
  109. package/dist/context-T5CR3RP6.js.map +7 -0
  110. package/dist/costTracker-2G3ZI2JF.js +19 -0
  111. package/dist/costTracker-2G3ZI2JF.js.map +7 -0
  112. package/dist/customCommands-OCUMXZDN.js +25 -0
  113. package/dist/customCommands-OCUMXZDN.js.map +7 -0
  114. package/dist/env-DYDNFB4D.js +22 -0
  115. package/dist/env-DYDNFB4D.js.map +7 -0
  116. package/dist/index.js +34 -0
  117. package/dist/index.js.map +7 -0
  118. package/dist/kodeAgentSessionId-KTGFX2BE.js +13 -0
  119. package/dist/kodeAgentSessionId-KTGFX2BE.js.map +7 -0
  120. package/dist/kodeAgentSessionLoad-ZKR2VGHO.js +18 -0
  121. package/dist/kodeAgentSessionLoad-ZKR2VGHO.js.map +7 -0
  122. package/dist/kodeAgentSessionResume-NFZCTIBZ.js +16 -0
  123. package/dist/kodeAgentSessionResume-NFZCTIBZ.js.map +7 -0
  124. package/dist/kodeAgentStreamJson-VIXFTYL5.js +13 -0
  125. package/dist/kodeAgentStreamJson-VIXFTYL5.js.map +7 -0
  126. package/dist/kodeAgentStreamJsonSession-6CKTK6AF.js +131 -0
  127. package/dist/kodeAgentStreamJsonSession-6CKTK6AF.js.map +7 -0
  128. package/dist/kodeAgentStructuredStdio-SI5C7AAD.js +10 -0
  129. package/dist/kodeAgentStructuredStdio-SI5C7AAD.js.map +7 -0
  130. package/dist/kodeHooks-5RXJRDCY.js +36 -0
  131. package/dist/kodeHooks-5RXJRDCY.js.map +7 -0
  132. package/dist/llm-QJA3QMXR.js +3118 -0
  133. package/dist/llm-QJA3QMXR.js.map +7 -0
  134. package/dist/llmLazy-VCEV22DK.js +15 -0
  135. package/dist/llmLazy-VCEV22DK.js.map +7 -0
  136. package/dist/loader-CKNYMPCZ.js +28 -0
  137. package/dist/loader-CKNYMPCZ.js.map +7 -0
  138. package/dist/mcp-2SZTOKZX.js +49 -0
  139. package/dist/mcp-2SZTOKZX.js.map +7 -0
  140. package/dist/mentionProcessor-O7NWOH6S.js +211 -0
  141. package/dist/mentionProcessor-O7NWOH6S.js.map +7 -0
  142. package/dist/messages-PRKIHXMK.js +65 -0
  143. package/dist/messages-PRKIHXMK.js.map +7 -0
  144. package/dist/model-WG6RA25G.js +30 -0
  145. package/dist/model-WG6RA25G.js.map +7 -0
  146. package/dist/openai-VQLYFQ6B.js +29 -0
  147. package/dist/openai-VQLYFQ6B.js.map +7 -0
  148. package/dist/outputStyles-VQ57E3B6.js +28 -0
  149. package/dist/outputStyles-VQ57E3B6.js.map +7 -0
  150. package/dist/package.json +4 -0
  151. package/dist/pluginRuntime-NWOLU73K.js +218 -0
  152. package/dist/pluginRuntime-NWOLU73K.js.map +7 -0
  153. package/dist/pluginValidation-R7B6QQ6T.js +17 -0
  154. package/dist/pluginValidation-R7B6QQ6T.js.map +7 -0
  155. package/dist/prompts-W4V4Y67M.js +48 -0
  156. package/dist/prompts-W4V4Y67M.js.map +7 -0
  157. package/dist/query-GFFKKURO.js +50 -0
  158. package/dist/query-GFFKKURO.js.map +7 -0
  159. package/dist/responsesStreaming-2AIT6GHG.js +10 -0
  160. package/dist/responsesStreaming-2AIT6GHG.js.map +7 -0
  161. package/dist/ripgrep-SVBVC46X.js +17 -0
  162. package/dist/ripgrep-SVBVC46X.js.map +7 -0
  163. package/dist/skillMarketplace-5Z7Y6FTD.js +37 -0
  164. package/dist/skillMarketplace-5Z7Y6FTD.js.map +7 -0
  165. package/dist/state-X3R7BV7A.js +16 -0
  166. package/dist/state-X3R7BV7A.js.map +7 -0
  167. package/dist/theme-4VA64EWF.js +14 -0
  168. package/dist/theme-4VA64EWF.js.map +7 -0
  169. package/dist/toolPermissionContext-I3IXPVED.js +17 -0
  170. package/dist/toolPermissionContext-I3IXPVED.js.map +7 -0
  171. package/dist/toolPermissionSettings-35DJQEKG.js +18 -0
  172. package/dist/toolPermissionSettings-35DJQEKG.js.map +7 -0
  173. package/dist/tools-USOBTPOI.js +47 -0
  174. package/dist/tools-USOBTPOI.js.map +7 -0
  175. package/dist/userInput-NID2UYXG.js +312 -0
  176. package/dist/userInput-NID2UYXG.js.map +7 -0
  177. package/dist/uuid-VA3KVASX.js +9 -0
  178. package/dist/uuid-VA3KVASX.js.map +7 -0
  179. package/dist/yoga.wasm +0 -0
  180. package/package.json +135 -0
  181. package/scripts/binary-utils.cjs +61 -0
  182. package/scripts/cli-acp-wrapper.cjs +82 -0
  183. package/scripts/cli-wrapper.cjs +105 -0
  184. package/scripts/postinstall.js +144 -0
  185. package/web/dist/assets/index-COAJqX1Z.css +1 -0
  186. package/web/dist/assets/index-CzS_4LmC.js +179 -0
  187. package/web/dist/index.html +14 -0
  188. package/yoga.wasm +0 -0
@@ -0,0 +1,96 @@
1
+ import { createRequire as __newcrawCreateRequire } from "node:module";
2
+ const require = __newcrawCreateRequire(import.meta.url);
3
+ import {
4
+ setRequestStatus
5
+ } from "./chunk-XJQATPV7.js";
6
+
7
+ // src/services/ai/adapters/responsesStreaming.ts
8
+ async function processResponsesStream(stream, startTime, fallbackResponseId) {
9
+ const contentBlocks = [];
10
+ const usage = {
11
+ prompt_tokens: 0,
12
+ completion_tokens: 0
13
+ };
14
+ let responseId = fallbackResponseId;
15
+ const pendingToolCalls = [];
16
+ let hasMarkedStreaming = false;
17
+ for await (const event of stream) {
18
+ if (event.type === "message_start") {
19
+ responseId = event.responseId || responseId;
20
+ continue;
21
+ }
22
+ if (event.type === "text_delta") {
23
+ if (!hasMarkedStreaming) {
24
+ setRequestStatus({ kind: "streaming" });
25
+ hasMarkedStreaming = true;
26
+ }
27
+ const last = contentBlocks[contentBlocks.length - 1];
28
+ if (!last || last.type !== "text") {
29
+ contentBlocks.push({ type: "text", text: event.delta, citations: [] });
30
+ } else {
31
+ last.text += event.delta;
32
+ }
33
+ continue;
34
+ }
35
+ if (event.type === "tool_request") {
36
+ setRequestStatus({ kind: "tool", detail: event.tool?.name });
37
+ pendingToolCalls.push(event.tool);
38
+ continue;
39
+ }
40
+ if (event.type === "usage") {
41
+ usage.prompt_tokens = event.usage.input;
42
+ usage.completion_tokens = event.usage.output;
43
+ usage.promptTokens = event.usage.input;
44
+ usage.completionTokens = event.usage.output;
45
+ usage.totalTokens = event.usage.total ?? event.usage.input + event.usage.output;
46
+ if (event.usage.reasoning !== void 0) {
47
+ usage.reasoningTokens = event.usage.reasoning;
48
+ }
49
+ continue;
50
+ }
51
+ }
52
+ for (const toolCall of pendingToolCalls) {
53
+ let toolArgs = {};
54
+ try {
55
+ toolArgs = toolCall.input ? JSON.parse(toolCall.input) : {};
56
+ } catch {
57
+ }
58
+ contentBlocks.push({
59
+ type: "tool_use",
60
+ id: toolCall.id,
61
+ name: toolCall.name,
62
+ input: toolArgs
63
+ });
64
+ }
65
+ const assistantMessage = {
66
+ type: "assistant",
67
+ message: {
68
+ role: "assistant",
69
+ content: contentBlocks,
70
+ usage: {
71
+ input_tokens: usage.prompt_tokens ?? 0,
72
+ output_tokens: usage.completion_tokens ?? 0,
73
+ prompt_tokens: usage.prompt_tokens ?? 0,
74
+ completion_tokens: usage.completion_tokens ?? 0,
75
+ totalTokens: usage.totalTokens ?? (usage.prompt_tokens || 0) + (usage.completion_tokens || 0),
76
+ reasoningTokens: usage.reasoningTokens
77
+ }
78
+ },
79
+ costUSD: 0,
80
+ durationMs: Date.now() - startTime,
81
+ uuid: `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`,
82
+ responseId
83
+ };
84
+ return {
85
+ assistantMessage,
86
+ rawResponse: {
87
+ id: responseId,
88
+ content: contentBlocks,
89
+ usage
90
+ }
91
+ };
92
+ }
93
+
94
+ export {
95
+ processResponsesStream
96
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/services/ai/adapters/responsesStreaming.ts"],
4
+ "sourcesContent": ["import { StreamingEvent } from './base'\r\nimport { AssistantMessage } from '@query'\r\nimport { setRequestStatus } from '@utils/session/requestStatus'\r\n\r\nexport async function processResponsesStream(\r\n stream: AsyncGenerator<StreamingEvent>,\r\n startTime: number,\r\n fallbackResponseId: string,\r\n): Promise<{ assistantMessage: AssistantMessage; rawResponse: any }> {\r\n const contentBlocks: any[] = []\r\n const usage: any = {\r\n prompt_tokens: 0,\r\n completion_tokens: 0,\r\n }\r\n\r\n let responseId = fallbackResponseId\r\n const pendingToolCalls: any[] = []\r\n let hasMarkedStreaming = false\r\n\r\n for await (const event of stream) {\r\n if (event.type === 'message_start') {\r\n responseId = event.responseId || responseId\r\n continue\r\n }\r\n\r\n if (event.type === 'text_delta') {\r\n if (!hasMarkedStreaming) {\r\n setRequestStatus({ kind: 'streaming' })\r\n hasMarkedStreaming = true\r\n }\r\n const last = contentBlocks[contentBlocks.length - 1]\r\n if (!last || last.type !== 'text') {\r\n contentBlocks.push({ type: 'text', text: event.delta, citations: [] })\r\n } else {\r\n last.text += event.delta\r\n }\r\n continue\r\n }\r\n\r\n if (event.type === 'tool_request') {\r\n setRequestStatus({ kind: 'tool', detail: event.tool?.name })\r\n pendingToolCalls.push(event.tool)\r\n continue\r\n }\r\n\r\n if (event.type === 'usage') {\r\n usage.prompt_tokens = event.usage.input\r\n usage.completion_tokens = event.usage.output\r\n usage.promptTokens = event.usage.input\r\n usage.completionTokens = event.usage.output\r\n usage.totalTokens =\r\n event.usage.total ?? event.usage.input + event.usage.output\r\n if (event.usage.reasoning !== undefined) {\r\n usage.reasoningTokens = event.usage.reasoning\r\n }\r\n continue\r\n }\r\n }\r\n\r\n for (const toolCall of pendingToolCalls) {\r\n let toolArgs = {}\r\n try {\r\n toolArgs = toolCall.input ? JSON.parse(toolCall.input) : {}\r\n } catch {}\r\n\r\n contentBlocks.push({\r\n type: 'tool_use',\r\n id: toolCall.id,\r\n name: toolCall.name,\r\n input: toolArgs,\r\n })\r\n }\r\n\r\n const assistantMessage: AssistantMessage = {\r\n type: 'assistant',\r\n message: {\r\n role: 'assistant',\r\n content: contentBlocks,\r\n usage: {\r\n input_tokens: usage.prompt_tokens ?? 0,\r\n output_tokens: usage.completion_tokens ?? 0,\r\n prompt_tokens: usage.prompt_tokens ?? 0,\r\n completion_tokens: usage.completion_tokens ?? 0,\r\n totalTokens:\r\n usage.totalTokens ??\r\n (usage.prompt_tokens || 0) + (usage.completion_tokens || 0),\r\n reasoningTokens: usage.reasoningTokens,\r\n },\r\n },\r\n costUSD: 0,\r\n durationMs: Date.now() - startTime,\r\n uuid: `${Date.now()}-${Math.random().toString(36).slice(2, 11)}` as any,\r\n responseId,\r\n }\r\n\r\n return {\r\n assistantMessage,\r\n rawResponse: {\r\n id: responseId,\r\n content: contentBlocks,\r\n usage,\r\n },\r\n }\r\n}\r\n"],
5
+ "mappings": ";;;;;;;AAIA,eAAsB,uBACpB,QACA,WACA,oBACmE;AACnE,QAAM,gBAAuB,CAAC;AAC9B,QAAM,QAAa;AAAA,IACjB,eAAe;AAAA,IACf,mBAAmB;AAAA,EACrB;AAEA,MAAI,aAAa;AACjB,QAAM,mBAA0B,CAAC;AACjC,MAAI,qBAAqB;AAEzB,mBAAiB,SAAS,QAAQ;AAChC,QAAI,MAAM,SAAS,iBAAiB;AAClC,mBAAa,MAAM,cAAc;AACjC;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,cAAc;AAC/B,UAAI,CAAC,oBAAoB;AACvB,yBAAiB,EAAE,MAAM,YAAY,CAAC;AACtC,6BAAqB;AAAA,MACvB;AACA,YAAM,OAAO,cAAc,cAAc,SAAS,CAAC;AACnD,UAAI,CAAC,QAAQ,KAAK,SAAS,QAAQ;AACjC,sBAAc,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,OAAO,WAAW,CAAC,EAAE,CAAC;AAAA,MACvE,OAAO;AACL,aAAK,QAAQ,MAAM;AAAA,MACrB;AACA;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,gBAAgB;AACjC,uBAAiB,EAAE,MAAM,QAAQ,QAAQ,MAAM,MAAM,KAAK,CAAC;AAC3D,uBAAiB,KAAK,MAAM,IAAI;AAChC;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,SAAS;AAC1B,YAAM,gBAAgB,MAAM,MAAM;AAClC,YAAM,oBAAoB,MAAM,MAAM;AACtC,YAAM,eAAe,MAAM,MAAM;AACjC,YAAM,mBAAmB,MAAM,MAAM;AACrC,YAAM,cACJ,MAAM,MAAM,SAAS,MAAM,MAAM,QAAQ,MAAM,MAAM;AACvD,UAAI,MAAM,MAAM,cAAc,QAAW;AACvC,cAAM,kBAAkB,MAAM,MAAM;AAAA,MACtC;AACA;AAAA,IACF;AAAA,EACF;AAEA,aAAW,YAAY,kBAAkB;AACvC,QAAI,WAAW,CAAC;AAChB,QAAI;AACF,iBAAW,SAAS,QAAQ,KAAK,MAAM,SAAS,KAAK,IAAI,CAAC;AAAA,IAC5D,QAAQ;AAAA,IAAC;AAET,kBAAc,KAAK;AAAA,MACjB,MAAM;AAAA,MACN,IAAI,SAAS;AAAA,MACb,MAAM,SAAS;AAAA,MACf,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM,mBAAqC;AAAA,IACzC,MAAM;AAAA,IACN,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,QACL,cAAc,MAAM,iBAAiB;AAAA,QACrC,eAAe,MAAM,qBAAqB;AAAA,QAC1C,eAAe,MAAM,iBAAiB;AAAA,QACtC,mBAAmB,MAAM,qBAAqB;AAAA,QAC9C,aACE,MAAM,gBACL,MAAM,iBAAiB,MAAM,MAAM,qBAAqB;AAAA,QAC3D,iBAAiB,MAAM;AAAA,MACzB;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,YAAY,KAAK,IAAI,IAAI;AAAA,IACzB,MAAM,GAAG,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,aAAa;AAAA,MACX,IAAI;AAAA,MACJ,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,164 @@
1
+ import { createRequire as __newcrawCreateRequire } from "node:module";
2
+ const require = __newcrawCreateRequire(import.meta.url);
3
+ import {
4
+ BunShell,
5
+ execFileNoThrow,
6
+ logError
7
+ } from "./chunk-3C73U2IU.js";
8
+
9
+ // src/utils/system/ripgrep.ts
10
+ import { rgPath } from "@vscode/ripgrep";
11
+ import { findActualExecutable } from "spawn-rx";
12
+ import { memoize } from "lodash-es";
13
+ import { existsSync } from "node:fs";
14
+ import { execFile } from "child_process";
15
+ import debug from "debug";
16
+ import { quote } from "shell-quote";
17
+ var d = debug("newcraw:ripgrep");
18
+ function isTruthyEnv(value) {
19
+ if (!value) return false;
20
+ return ["1", "true", "yes", "on"].includes(value.trim().toLowerCase());
21
+ }
22
+ function resolveRipgrepPathOrThrow() {
23
+ const explicit = process.env.NEWCRAW_RIPGREP_PATH;
24
+ if (explicit) {
25
+ if (!existsSync(explicit)) {
26
+ throw new Error(`NEWCRAW_RIPGREP_PATH points to a missing file: ${explicit}`);
27
+ }
28
+ return explicit;
29
+ }
30
+ const preferBundled = isTruthyEnv(process.env.USE_BUILTIN_RIPGREP);
31
+ if (!preferBundled) {
32
+ const { cmd } = findActualExecutable("rg", []);
33
+ d(`ripgrep initially resolved as: ${cmd}`);
34
+ if (cmd !== "rg") {
35
+ return cmd;
36
+ }
37
+ }
38
+ if (!rgPath || !existsSync(rgPath)) {
39
+ throw new Error(
40
+ [
41
+ "ripgrep (rg) was not found on PATH, and @vscode/ripgrep is missing.",
42
+ "Fix:",
43
+ "- Install ripgrep: https://github.com/BurntSushi/ripgrep",
44
+ "- Or reinstall newcraw (ensure dependencies are present)"
45
+ ].join("\n")
46
+ );
47
+ }
48
+ d("Using @vscode/ripgrep fallback: %s", rgPath);
49
+ return rgPath;
50
+ }
51
+ var getRipgrepPath = memoize(() => resolveRipgrepPathOrThrow());
52
+ async function ripGrep(args, target, abortSignal, options) {
53
+ await codesignRipgrepIfNecessary();
54
+ const rg = getRipgrepPath();
55
+ d("ripgrep called: %s %o", rg, target, args);
56
+ if (options?.sandbox?.enabled === true) {
57
+ const cmd = quote([rg, ...args, target]);
58
+ const result = await BunShell.getInstance().exec(cmd, abortSignal, 1e4, {
59
+ sandbox: options.sandbox
60
+ });
61
+ if (result.code === 1) return [];
62
+ if (result.code !== 0) {
63
+ logError(`ripgrep failed with exit code ${result.code}: ${result.stderr}`);
64
+ return [];
65
+ }
66
+ return result.stdout.trim().split("\n").filter(Boolean);
67
+ }
68
+ return new Promise((resolve) => {
69
+ execFile(
70
+ rg,
71
+ [...args, target],
72
+ {
73
+ maxBuffer: 1e6,
74
+ signal: abortSignal,
75
+ timeout: 1e4
76
+ },
77
+ (error, stdout) => {
78
+ if (error) {
79
+ if (error.code !== 1) {
80
+ d("ripgrep error: %o", error);
81
+ logError(error);
82
+ }
83
+ resolve([]);
84
+ } else {
85
+ d("ripgrep succeeded with %s", stdout);
86
+ resolve(stdout.trim().split("\n").filter(Boolean));
87
+ }
88
+ }
89
+ );
90
+ });
91
+ }
92
+ async function listAllContentFiles(path, abortSignal, limit) {
93
+ try {
94
+ d("listAllContentFiles called: %s", path);
95
+ return (await ripGrep(["-l", ".", path], path, abortSignal)).slice(0, limit);
96
+ } catch (e) {
97
+ d("listAllContentFiles failed: %o", e);
98
+ logError(e);
99
+ return [];
100
+ }
101
+ }
102
+ var alreadyDoneSignCheck = false;
103
+ async function codesignRipgrepIfNecessary() {
104
+ if (process.platform !== "darwin" || alreadyDoneSignCheck) {
105
+ return;
106
+ }
107
+ alreadyDoneSignCheck = true;
108
+ d("checking if ripgrep is already signed");
109
+ const lines = (await execFileNoThrow(
110
+ "codesign",
111
+ ["-vv", "-d", getRipgrepPath()],
112
+ void 0,
113
+ void 0,
114
+ false
115
+ )).stdout.split("\n");
116
+ const needsSigned = lines.find((line) => line.includes("linker-signed"));
117
+ if (!needsSigned) {
118
+ d("seems to be already signed");
119
+ return;
120
+ }
121
+ try {
122
+ d("signing ripgrep");
123
+ const signResult = await execFileNoThrow("codesign", [
124
+ "--sign",
125
+ "-",
126
+ "--force",
127
+ "--preserve-metadata=entitlements,requirements,flags,runtime",
128
+ getRipgrepPath()
129
+ ]);
130
+ if (signResult.code !== 0) {
131
+ d("failed to sign ripgrep: %o", signResult);
132
+ logError(
133
+ `Failed to sign ripgrep: ${signResult.stdout} ${signResult.stderr}`
134
+ );
135
+ }
136
+ d("removing quarantine");
137
+ const quarantineResult = await execFileNoThrow("xattr", [
138
+ "-d",
139
+ "com.apple.quarantine",
140
+ getRipgrepPath()
141
+ ]);
142
+ if (quarantineResult.code !== 0) {
143
+ d("failed to remove quarantine: %o", quarantineResult);
144
+ logError(
145
+ `Failed to remove quarantine: ${quarantineResult.stdout} ${quarantineResult.stderr}`
146
+ );
147
+ }
148
+ } catch (e) {
149
+ d("failed during sign: %o", e);
150
+ logError(e);
151
+ }
152
+ }
153
+ function resetRipgrepPathCacheForTests() {
154
+ ;
155
+ getRipgrepPath.cache?.clear?.();
156
+ alreadyDoneSignCheck = false;
157
+ }
158
+
159
+ export {
160
+ getRipgrepPath,
161
+ ripGrep,
162
+ listAllContentFiles,
163
+ resetRipgrepPathCacheForTests
164
+ };
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/system/ripgrep.ts"],
4
+ "sourcesContent": ["import { rgPath } from '@vscode/ripgrep'\r\nimport { findActualExecutable } from 'spawn-rx'\r\nimport { memoize } from 'lodash-es'\r\nimport { existsSync } from 'node:fs'\r\nimport { execFile } from 'child_process'\r\nimport debug from 'debug'\r\nimport { quote } from 'shell-quote'\r\nimport { logError } from '@utils/log'\r\nimport { execFileNoThrow } from '@utils/system/execFileNoThrow'\r\nimport type { BunShellSandboxOptions } from '@utils/bun/shell'\r\nimport { BunShell } from '@utils/bun/shell'\r\n\r\nconst d = debug('newcraw:ripgrep')\r\n\r\nfunction isTruthyEnv(value: string | undefined): boolean {\r\n if (!value) return false\r\n return ['1', 'true', 'yes', 'on'].includes(value.trim().toLowerCase())\r\n}\r\n\r\nfunction resolveRipgrepPathOrThrow(): string {\r\n const explicit = process.env.NEWCRAW_RIPGREP_PATH\r\n if (explicit) {\r\n if (!existsSync(explicit)) {\r\n throw new Error(`NEWCRAW_RIPGREP_PATH points to a missing file: ${explicit}`)\r\n }\r\n return explicit\r\n }\r\n\r\n const preferBundled = isTruthyEnv(process.env.USE_BUILTIN_RIPGREP)\r\n if (!preferBundled) {\r\n const { cmd } = findActualExecutable('rg', [])\r\n d(`ripgrep initially resolved as: ${cmd}`)\r\n if (cmd !== 'rg') {\r\n return cmd\r\n }\r\n }\r\n\r\n if (!rgPath || !existsSync(rgPath)) {\r\n throw new Error(\r\n [\r\n 'ripgrep (rg) was not found on PATH, and @vscode/ripgrep is missing.',\r\n 'Fix:',\r\n '- Install ripgrep: https://github.com/BurntSushi/ripgrep',\r\n '- Or reinstall newcraw (ensure dependencies are present)',\r\n ].join('\\n'),\r\n )\r\n }\r\n\r\n d('Using @vscode/ripgrep fallback: %s', rgPath)\r\n return rgPath\r\n}\r\n\r\nexport const getRipgrepPath = memoize((): string => resolveRipgrepPathOrThrow())\r\n\r\nexport async function ripGrep(\r\n args: string[],\r\n target: string,\r\n abortSignal: AbortSignal,\r\n options?: { sandbox?: BunShellSandboxOptions },\r\n): Promise<string[]> {\r\n await codesignRipgrepIfNecessary()\r\n const rg = getRipgrepPath()\r\n d('ripgrep called: %s %o', rg, target, args)\r\n\r\n if (options?.sandbox?.enabled === true) {\r\n const cmd = quote([rg, ...args, target])\r\n const result = await BunShell.getInstance().exec(cmd, abortSignal, 10_000, {\r\n sandbox: options.sandbox,\r\n })\r\n if (result.code === 1) return []\r\n if (result.code !== 0) {\r\n logError(`ripgrep failed with exit code ${result.code}: ${result.stderr}`)\r\n return []\r\n }\r\n return result.stdout.trim().split('\\n').filter(Boolean)\r\n }\r\n\r\n return new Promise(resolve => {\r\n execFile(\r\n rg,\r\n [...args, target],\r\n {\r\n maxBuffer: 1_000_000,\r\n signal: abortSignal,\r\n timeout: 10_000,\r\n },\r\n (error, stdout) => {\r\n if (error) {\r\n if (error.code !== 1) {\r\n d('ripgrep error: %o', error)\r\n logError(error)\r\n }\r\n resolve([])\r\n } else {\r\n d('ripgrep succeeded with %s', stdout)\r\n resolve(stdout.trim().split('\\n').filter(Boolean))\r\n }\r\n },\r\n )\r\n })\r\n}\r\n\r\nexport async function listAllContentFiles(\r\n path: string,\r\n abortSignal: AbortSignal,\r\n limit: number,\r\n): Promise<string[]> {\r\n try {\r\n d('listAllContentFiles called: %s', path)\r\n return (await ripGrep(['-l', '.', path], path, abortSignal)).slice(0, limit)\r\n } catch (e) {\r\n d('listAllContentFiles failed: %o', e)\r\n\r\n logError(e)\r\n return []\r\n }\r\n}\r\n\r\nlet alreadyDoneSignCheck = false\r\nasync function codesignRipgrepIfNecessary(): Promise<void> {\r\n if (process.platform !== 'darwin' || alreadyDoneSignCheck) {\r\n return\r\n }\r\n\r\n alreadyDoneSignCheck = true\r\n\r\n d('checking if ripgrep is already signed')\r\n const lines = (\r\n await execFileNoThrow(\r\n 'codesign',\r\n ['-vv', '-d', getRipgrepPath()],\r\n undefined,\r\n undefined,\r\n false,\r\n )\r\n ).stdout.split('\\n')\r\n\r\n const needsSigned = lines.find(line => line.includes('linker-signed'))\r\n if (!needsSigned) {\r\n d('seems to be already signed')\r\n return\r\n }\r\n\r\n try {\r\n d('signing ripgrep')\r\n const signResult = await execFileNoThrow('codesign', [\r\n '--sign',\r\n '-',\r\n '--force',\r\n '--preserve-metadata=entitlements,requirements,flags,runtime',\r\n getRipgrepPath(),\r\n ])\r\n\r\n if (signResult.code !== 0) {\r\n d('failed to sign ripgrep: %o', signResult)\r\n logError(\r\n `Failed to sign ripgrep: ${signResult.stdout} ${signResult.stderr}`,\r\n )\r\n }\r\n\r\n d('removing quarantine')\r\n const quarantineResult = await execFileNoThrow('xattr', [\r\n '-d',\r\n 'com.apple.quarantine',\r\n getRipgrepPath(),\r\n ])\r\n\r\n if (quarantineResult.code !== 0) {\r\n d('failed to remove quarantine: %o', quarantineResult)\r\n logError(\r\n `Failed to remove quarantine: ${quarantineResult.stdout} ${quarantineResult.stderr}`,\r\n )\r\n }\r\n } catch (e) {\r\n d('failed during sign: %o', e)\r\n logError(e)\r\n }\r\n}\r\n\r\nexport function resetRipgrepPathCacheForTests(): void {\r\n ;(getRipgrepPath as any).cache?.clear?.()\r\n alreadyDoneSignCheck = false\r\n}\r\n\r\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }