





















@@ -0,0 +1,144 @@
1+import { isPlainObject } from "../utils.js";
2+import { normalizeToolName } from "./tool-policy.js";
3+import type { AnyAgentTool } from "./tools/common.js";
4+5+export const CODE_MODE_EXEC_TOOL_NAME = "exec";
6+export const CODE_MODE_WAIT_TOOL_NAME = "wait";
7+export const CODE_MODE_EXEC_TOOL_KIND = "code_mode_exec";
8+9+export type CodeModeExecToolKind = typeof CODE_MODE_EXEC_TOOL_KIND;
10+export type CodeModeExecToolInputKind = "javascript" | "typescript";
11+export type CodeModeExecHookMetadata = {
12+toolKind: CodeModeExecToolKind;
13+toolInputKind?: CodeModeExecToolInputKind;
14+};
15+16+const codeModeControlTools = new WeakSet<AnyAgentTool>();
17+18+export function markCodeModeControlTool<T extends AnyAgentTool>(tool: T): T {
19+codeModeControlTools.add(tool);
20+return tool;
21+}
22+23+export function isCodeModeControlTool(tool: AnyAgentTool): boolean {
24+return codeModeControlTools.has(tool);
25+}
26+27+function isCodeModeExecTool(tool: AnyAgentTool): boolean {
28+return isCodeModeControlTool(tool) && normalizeToolName(tool.name) === CODE_MODE_EXEC_TOOL_NAME;
29+}
30+31+function resolveCodeModeExecToolInputKind(params: unknown): CodeModeExecToolInputKind | undefined {
32+if (!isPlainObject(params)) {
33+return undefined;
34+}
35+const language = params.language;
36+if (language === undefined || language === "javascript") {
37+return "javascript";
38+}
39+if (language === "typescript") {
40+return "typescript";
41+}
42+return undefined;
43+}
44+45+function normalizeCodeModeExecParams(params: unknown): unknown {
46+if (!isPlainObject(params)) {
47+return params;
48+}
49+const code = params.code;
50+const command = params.command;
51+if (typeof code === "string" && typeof command !== "string") {
52+return { ...params, command: params.code };
53+}
54+if (typeof command === "string" && typeof code !== "string") {
55+return { ...params, code: params.command };
56+}
57+return params;
58+}
59+60+export function getCodeModeExecBeforeHookMetadata(params: {
61+tool: AnyAgentTool;
62+params: unknown;
63+}): CodeModeExecHookMetadata | undefined {
64+if (!isCodeModeExecTool(params.tool)) {
65+return undefined;
66+}
67+const toolInputKind = resolveCodeModeExecToolInputKind(params.params);
68+return {
69+toolKind: CODE_MODE_EXEC_TOOL_KIND,
70+ ...(toolInputKind && { toolInputKind }),
71+};
72+}
73+74+export function getCodeModeExecBeforeHookMetadataForToolKind(params: {
75+toolKind: unknown;
76+params: unknown;
77+}): CodeModeExecHookMetadata | undefined {
78+if (params.toolKind !== CODE_MODE_EXEC_TOOL_KIND) {
79+return undefined;
80+}
81+const toolInputKind = resolveCodeModeExecToolInputKind(params.params);
82+return {
83+toolKind: CODE_MODE_EXEC_TOOL_KIND,
84+ ...(toolInputKind && { toolInputKind }),
85+};
86+}
87+88+export function normalizeCodeModeExecBeforeHookParams(params: {
89+tool: AnyAgentTool;
90+params: unknown;
91+}): unknown {
92+if (!isCodeModeExecTool(params.tool)) {
93+return params.params;
94+}
95+return normalizeCodeModeExecParams(params.params);
96+}
97+98+export function normalizeCodeModeExecBeforeHookParamsForToolKind(params: {
99+toolKind: unknown;
100+params: unknown;
101+}): unknown {
102+if (params.toolKind !== CODE_MODE_EXEC_TOOL_KIND) {
103+return params.params;
104+}
105+return normalizeCodeModeExecParams(params.params);
106+}
107+108+export function reconcileCodeModeExecBeforeHookParams(params: {
109+tool: AnyAgentTool;
110+originalParams: unknown;
111+hookParams: unknown;
112+adjustedParams: unknown;
113+}): unknown {
114+if (
115+!isCodeModeExecTool(params.tool) ||
116+!isPlainObject(params.originalParams) ||
117+!isPlainObject(params.hookParams) ||
118+!isPlainObject(params.adjustedParams)
119+) {
120+return params.adjustedParams;
121+}
122+const hookCode = params.hookParams.code;
123+const hookCommand = params.hookParams.command;
124+if (typeof hookCode !== "string" || hookCode !== hookCommand) {
125+return params.adjustedParams;
126+}
127+128+const adjustedCode = params.adjustedParams.code;
129+const adjustedCommand = params.adjustedParams.command;
130+const adjustedCodeChanged = typeof adjustedCode === "string" && adjustedCode !== hookCode;
131+const adjustedCommandChanged =
132+typeof adjustedCommand === "string" && adjustedCommand !== hookCode;
133+if (adjustedCodeChanged === adjustedCommandChanged) {
134+return params.adjustedParams;
135+}
136+137+if (adjustedCodeChanged) {
138+return { ...params.adjustedParams, command: adjustedCode };
139+}
140+if (adjustedCommandChanged) {
141+return { ...params.adjustedParams, code: adjustedCommand };
142+}
143+return params.adjustedParams;
144+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。