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.
- package/LICENSE +201 -0
- package/README.md +692 -0
- package/README.zh-CN.md +338 -0
- package/cli-acp.js +82 -0
- package/cli.js +105 -0
- package/dist/REPL-74GZVSMY.js +42 -0
- package/dist/REPL-74GZVSMY.js.map +7 -0
- package/dist/acp-A55ZRIPP.js +1357 -0
- package/dist/acp-A55ZRIPP.js.map +7 -0
- package/dist/agentsValidate-XWFIEHJ2.js +373 -0
- package/dist/agentsValidate-XWFIEHJ2.js.map +7 -0
- package/dist/ask-4ACYU23S.js +126 -0
- package/dist/ask-4ACYU23S.js.map +7 -0
- package/dist/autoUpdater-O2WHHSGP.js +17 -0
- package/dist/autoUpdater-O2WHHSGP.js.map +7 -0
- package/dist/chunk-2UO3BFZH.js +16 -0
- package/dist/chunk-2UO3BFZH.js.map +7 -0
- package/dist/chunk-3C73U2IU.js +2970 -0
- package/dist/chunk-3C73U2IU.js.map +7 -0
- package/dist/chunk-3U5X4VWP.js +2613 -0
- package/dist/chunk-3U5X4VWP.js.map +7 -0
- package/dist/chunk-755HIAI3.js +95 -0
- package/dist/chunk-755HIAI3.js.map +7 -0
- package/dist/chunk-7ZFLZNOW.js +21 -0
- package/dist/chunk-7ZFLZNOW.js.map +7 -0
- package/dist/chunk-A44DGORI.js +49 -0
- package/dist/chunk-A44DGORI.js.map +7 -0
- package/dist/chunk-AXWJI6N5.js +11 -0
- package/dist/chunk-AXWJI6N5.js.map +7 -0
- package/dist/chunk-B26ZUMJI.js +515 -0
- package/dist/chunk-B26ZUMJI.js.map +7 -0
- package/dist/chunk-BHNQGSLO.js +96 -0
- package/dist/chunk-BHNQGSLO.js.map +7 -0
- package/dist/chunk-BUI6KGVA.js +164 -0
- package/dist/chunk-BUI6KGVA.js.map +7 -0
- package/dist/chunk-DY5D4SS7.js +936 -0
- package/dist/chunk-DY5D4SS7.js.map +7 -0
- package/dist/chunk-EENI5HG7.js +498 -0
- package/dist/chunk-EENI5HG7.js.map +7 -0
- package/dist/chunk-EXPWPWA4.js +654 -0
- package/dist/chunk-EXPWPWA4.js.map +7 -0
- package/dist/chunk-FHOCKJOW.js +766 -0
- package/dist/chunk-FHOCKJOW.js.map +7 -0
- package/dist/chunk-GPKVTIYJ.js +191 -0
- package/dist/chunk-GPKVTIYJ.js.map +7 -0
- package/dist/chunk-H5BCUDEN.js +794 -0
- package/dist/chunk-H5BCUDEN.js.map +7 -0
- package/dist/chunk-INJSFEKL.js +47 -0
- package/dist/chunk-INJSFEKL.js.map +7 -0
- package/dist/chunk-JX5ZQYTQ.js +12 -0
- package/dist/chunk-JX5ZQYTQ.js.map +7 -0
- package/dist/chunk-KQSHIOZK.js +24 -0
- package/dist/chunk-KQSHIOZK.js.map +7 -0
- package/dist/chunk-L6WKZEK4.js +1609 -0
- package/dist/chunk-L6WKZEK4.js.map +7 -0
- package/dist/chunk-LC4CL3YJ.js +124 -0
- package/dist/chunk-LC4CL3YJ.js.map +7 -0
- package/dist/chunk-MXSB7IOZ.js +1097 -0
- package/dist/chunk-MXSB7IOZ.js.map +7 -0
- package/dist/chunk-N5OHRWG2.js +249 -0
- package/dist/chunk-N5OHRWG2.js.map +7 -0
- package/dist/chunk-NQE3GGE3.js +19 -0
- package/dist/chunk-NQE3GGE3.js.map +7 -0
- package/dist/chunk-QF6YDTME.js +139 -0
- package/dist/chunk-QF6YDTME.js.map +7 -0
- package/dist/chunk-QTX7AJFQ.js +240 -0
- package/dist/chunk-QTX7AJFQ.js.map +7 -0
- package/dist/chunk-S3ZAJPYZ.js +515 -0
- package/dist/chunk-S3ZAJPYZ.js.map +7 -0
- package/dist/chunk-S5Y5IF2H.js +735 -0
- package/dist/chunk-S5Y5IF2H.js.map +7 -0
- package/dist/chunk-SBE6Y327.js +836 -0
- package/dist/chunk-SBE6Y327.js.map +7 -0
- package/dist/chunk-T25Z3JMG.js +17 -0
- package/dist/chunk-T25Z3JMG.js.map +7 -0
- package/dist/chunk-T6VKT5FR.js +196 -0
- package/dist/chunk-T6VKT5FR.js.map +7 -0
- package/dist/chunk-TSGGSPYD.js +151 -0
- package/dist/chunk-TSGGSPYD.js.map +7 -0
- package/dist/chunk-TY3CCSAT.js +24 -0
- package/dist/chunk-TY3CCSAT.js.map +7 -0
- package/dist/chunk-U224EQOS.js +34 -0
- package/dist/chunk-U224EQOS.js.map +7 -0
- package/dist/chunk-U7S4MEYP.js +95 -0
- package/dist/chunk-U7S4MEYP.js.map +7 -0
- package/dist/chunk-ULVAAZ2U.js +30517 -0
- package/dist/chunk-ULVAAZ2U.js.map +7 -0
- package/dist/chunk-WWLFALT7.js +128 -0
- package/dist/chunk-WWLFALT7.js.map +7 -0
- package/dist/chunk-XJQATPV7.js +23 -0
- package/dist/chunk-XJQATPV7.js.map +7 -0
- package/dist/chunk-XMGUQHMF.js +72 -0
- package/dist/chunk-XMGUQHMF.js.map +7 -0
- package/dist/chunk-XOMW5QTV.js +472 -0
- package/dist/chunk-XOMW5QTV.js.map +7 -0
- package/dist/chunk-Y7VZUSIM.js +1256 -0
- package/dist/chunk-Y7VZUSIM.js.map +7 -0
- package/dist/chunk-YVNBXMIP.js +511 -0
- package/dist/chunk-YVNBXMIP.js.map +7 -0
- package/dist/chunk-YYPJWXSA.js +145 -0
- package/dist/chunk-YYPJWXSA.js.map +7 -0
- package/dist/cli-BW34VKCN.js +3917 -0
- package/dist/cli-BW34VKCN.js.map +7 -0
- package/dist/commands-4CNZZBTE.js +46 -0
- package/dist/commands-4CNZZBTE.js.map +7 -0
- package/dist/config-XKRCXCSS.js +81 -0
- package/dist/config-XKRCXCSS.js.map +7 -0
- package/dist/context-T5CR3RP6.js +30 -0
- package/dist/context-T5CR3RP6.js.map +7 -0
- package/dist/costTracker-2G3ZI2JF.js +19 -0
- package/dist/costTracker-2G3ZI2JF.js.map +7 -0
- package/dist/customCommands-OCUMXZDN.js +25 -0
- package/dist/customCommands-OCUMXZDN.js.map +7 -0
- package/dist/env-DYDNFB4D.js +22 -0
- package/dist/env-DYDNFB4D.js.map +7 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +7 -0
- package/dist/kodeAgentSessionId-KTGFX2BE.js +13 -0
- package/dist/kodeAgentSessionId-KTGFX2BE.js.map +7 -0
- package/dist/kodeAgentSessionLoad-ZKR2VGHO.js +18 -0
- package/dist/kodeAgentSessionLoad-ZKR2VGHO.js.map +7 -0
- package/dist/kodeAgentSessionResume-NFZCTIBZ.js +16 -0
- package/dist/kodeAgentSessionResume-NFZCTIBZ.js.map +7 -0
- package/dist/kodeAgentStreamJson-VIXFTYL5.js +13 -0
- package/dist/kodeAgentStreamJson-VIXFTYL5.js.map +7 -0
- package/dist/kodeAgentStreamJsonSession-6CKTK6AF.js +131 -0
- package/dist/kodeAgentStreamJsonSession-6CKTK6AF.js.map +7 -0
- package/dist/kodeAgentStructuredStdio-SI5C7AAD.js +10 -0
- package/dist/kodeAgentStructuredStdio-SI5C7AAD.js.map +7 -0
- package/dist/kodeHooks-5RXJRDCY.js +36 -0
- package/dist/kodeHooks-5RXJRDCY.js.map +7 -0
- package/dist/llm-QJA3QMXR.js +3118 -0
- package/dist/llm-QJA3QMXR.js.map +7 -0
- package/dist/llmLazy-VCEV22DK.js +15 -0
- package/dist/llmLazy-VCEV22DK.js.map +7 -0
- package/dist/loader-CKNYMPCZ.js +28 -0
- package/dist/loader-CKNYMPCZ.js.map +7 -0
- package/dist/mcp-2SZTOKZX.js +49 -0
- package/dist/mcp-2SZTOKZX.js.map +7 -0
- package/dist/mentionProcessor-O7NWOH6S.js +211 -0
- package/dist/mentionProcessor-O7NWOH6S.js.map +7 -0
- package/dist/messages-PRKIHXMK.js +65 -0
- package/dist/messages-PRKIHXMK.js.map +7 -0
- package/dist/model-WG6RA25G.js +30 -0
- package/dist/model-WG6RA25G.js.map +7 -0
- package/dist/openai-VQLYFQ6B.js +29 -0
- package/dist/openai-VQLYFQ6B.js.map +7 -0
- package/dist/outputStyles-VQ57E3B6.js +28 -0
- package/dist/outputStyles-VQ57E3B6.js.map +7 -0
- package/dist/package.json +4 -0
- package/dist/pluginRuntime-NWOLU73K.js +218 -0
- package/dist/pluginRuntime-NWOLU73K.js.map +7 -0
- package/dist/pluginValidation-R7B6QQ6T.js +17 -0
- package/dist/pluginValidation-R7B6QQ6T.js.map +7 -0
- package/dist/prompts-W4V4Y67M.js +48 -0
- package/dist/prompts-W4V4Y67M.js.map +7 -0
- package/dist/query-GFFKKURO.js +50 -0
- package/dist/query-GFFKKURO.js.map +7 -0
- package/dist/responsesStreaming-2AIT6GHG.js +10 -0
- package/dist/responsesStreaming-2AIT6GHG.js.map +7 -0
- package/dist/ripgrep-SVBVC46X.js +17 -0
- package/dist/ripgrep-SVBVC46X.js.map +7 -0
- package/dist/skillMarketplace-5Z7Y6FTD.js +37 -0
- package/dist/skillMarketplace-5Z7Y6FTD.js.map +7 -0
- package/dist/state-X3R7BV7A.js +16 -0
- package/dist/state-X3R7BV7A.js.map +7 -0
- package/dist/theme-4VA64EWF.js +14 -0
- package/dist/theme-4VA64EWF.js.map +7 -0
- package/dist/toolPermissionContext-I3IXPVED.js +17 -0
- package/dist/toolPermissionContext-I3IXPVED.js.map +7 -0
- package/dist/toolPermissionSettings-35DJQEKG.js +18 -0
- package/dist/toolPermissionSettings-35DJQEKG.js.map +7 -0
- package/dist/tools-USOBTPOI.js +47 -0
- package/dist/tools-USOBTPOI.js.map +7 -0
- package/dist/userInput-NID2UYXG.js +312 -0
- package/dist/userInput-NID2UYXG.js.map +7 -0
- package/dist/uuid-VA3KVASX.js +9 -0
- package/dist/uuid-VA3KVASX.js.map +7 -0
- package/dist/yoga.wasm +0 -0
- package/package.json +135 -0
- package/scripts/binary-utils.cjs +61 -0
- package/scripts/cli-acp-wrapper.cjs +82 -0
- package/scripts/cli-wrapper.cjs +105 -0
- package/scripts/postinstall.js +144 -0
- package/web/dist/assets/index-COAJqX1Z.css +1 -0
- package/web/dist/assets/index-CzS_4LmC.js +179 -0
- package/web/dist/index.html +14 -0
- 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": ";;;;;;;;;AAAA,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB;AACzB,OAAO,WAAW;AAClB,SAAS,aAAa;AAMtB,IAAM,IAAI,MAAM,iBAAiB;AAEjC,SAAS,YAAY,OAAoC;AACvD,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO,CAAC,KAAK,QAAQ,OAAO,IAAI,EAAE,SAAS,MAAM,KAAK,EAAE,YAAY,CAAC;AACvE;AAEA,SAAS,4BAAoC;AAC3C,QAAM,WAAW,QAAQ,IAAI;AAC7B,MAAI,UAAU;AACZ,QAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,YAAM,IAAI,MAAM,kDAAkD,QAAQ,EAAE;AAAA,IAC9E;AACA,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,YAAY,QAAQ,IAAI,mBAAmB;AACjE,MAAI,CAAC,eAAe;AAClB,UAAM,EAAE,IAAI,IAAI,qBAAqB,MAAM,CAAC,CAAC;AAC7C,MAAE,kCAAkC,GAAG,EAAE;AACzC,QAAI,QAAQ,MAAM;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,CAAC,UAAU,CAAC,WAAW,MAAM,GAAG;AAClC,UAAM,IAAI;AAAA,MACR;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,EAAE,KAAK,IAAI;AAAA,IACb;AAAA,EACF;AAEA,IAAE,sCAAsC,MAAM;AAC9C,SAAO;AACT;AAEO,IAAM,iBAAiB,QAAQ,MAAc,0BAA0B,CAAC;AAE/E,eAAsB,QACpB,MACA,QACA,aACA,SACmB;AACnB,QAAM,2BAA2B;AACjC,QAAM,KAAK,eAAe;AAC1B,IAAE,yBAAyB,IAAI,QAAQ,IAAI;AAE3C,MAAI,SAAS,SAAS,YAAY,MAAM;AACtC,UAAM,MAAM,MAAM,CAAC,IAAI,GAAG,MAAM,MAAM,CAAC;AACvC,UAAM,SAAS,MAAM,SAAS,YAAY,EAAE,KAAK,KAAK,aAAa,KAAQ;AAAA,MACzE,SAAS,QAAQ;AAAA,IACnB,CAAC;AACD,QAAI,OAAO,SAAS,EAAG,QAAO,CAAC;AAC/B,QAAI,OAAO,SAAS,GAAG;AACrB,eAAS,iCAAiC,OAAO,IAAI,KAAK,OAAO,MAAM,EAAE;AACzE,aAAO,CAAC;AAAA,IACV;AACA,WAAO,OAAO,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO;AAAA,EACxD;AAEA,SAAO,IAAI,QAAQ,aAAW;AAC5B;AAAA,MACE;AAAA,MACA,CAAC,GAAG,MAAM,MAAM;AAAA,MAChB;AAAA,QACE,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAAA,MACA,CAAC,OAAO,WAAW;AACjB,YAAI,OAAO;AACT,cAAI,MAAM,SAAS,GAAG;AACpB,cAAE,qBAAqB,KAAK;AAC5B,qBAAS,KAAK;AAAA,UAChB;AACA,kBAAQ,CAAC,CAAC;AAAA,QACZ,OAAO;AACL,YAAE,6BAA6B,MAAM;AACrC,kBAAQ,OAAO,KAAK,EAAE,MAAM,IAAI,EAAE,OAAO,OAAO,CAAC;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,eAAsB,oBACpB,MACA,aACA,OACmB;AACnB,MAAI;AACF,MAAE,kCAAkC,IAAI;AACxC,YAAQ,MAAM,QAAQ,CAAC,MAAM,KAAK,IAAI,GAAG,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK;AAAA,EAC7E,SAAS,GAAG;AACV,MAAE,kCAAkC,CAAC;AAErC,aAAS,CAAC;AACV,WAAO,CAAC;AAAA,EACV;AACF;AAEA,IAAI,uBAAuB;AAC3B,eAAe,6BAA4C;AACzD,MAAI,QAAQ,aAAa,YAAY,sBAAsB;AACzD;AAAA,EACF;AAEA,yBAAuB;AAEvB,IAAE,uCAAuC;AACzC,QAAM,SACJ,MAAM;AAAA,IACJ;AAAA,IACA,CAAC,OAAO,MAAM,eAAe,CAAC;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF,GACA,OAAO,MAAM,IAAI;AAEnB,QAAM,cAAc,MAAM,KAAK,UAAQ,KAAK,SAAS,eAAe,CAAC;AACrE,MAAI,CAAC,aAAa;AAChB,MAAE,4BAA4B;AAC9B;AAAA,EACF;AAEA,MAAI;AACF,MAAE,iBAAiB;AACnB,UAAM,aAAa,MAAM,gBAAgB,YAAY;AAAA,MACnD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB,CAAC;AAED,QAAI,WAAW,SAAS,GAAG;AACzB,QAAE,8BAA8B,UAAU;AAC1C;AAAA,QACE,2BAA2B,WAAW,MAAM,IAAI,WAAW,MAAM;AAAA,MACnE;AAAA,IACF;AAEA,MAAE,qBAAqB;AACvB,UAAM,mBAAmB,MAAM,gBAAgB,SAAS;AAAA,MACtD;AAAA,MACA;AAAA,MACA,eAAe;AAAA,IACjB,CAAC;AAED,QAAI,iBAAiB,SAAS,GAAG;AAC/B,QAAE,mCAAmC,gBAAgB;AACrD;AAAA,QACE,gCAAgC,iBAAiB,MAAM,IAAI,iBAAiB,MAAM;AAAA,MACpF;AAAA,IACF;AAAA,EACF,SAAS,GAAG;AACV,MAAE,0BAA0B,CAAC;AAC7B,aAAS,CAAC;AAAA,EACZ;AACF;AAEO,SAAS,gCAAsC;AACpD;AAAC,EAAC,eAAuB,OAAO,QAAQ;AACxC,yBAAuB;AACzB;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|