@librechat/agents 4.0.3 → 4.0.4
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/dist/cjs/main.cjs +8 -0
- package/dist/cjs/tools/GitHubCompare.cjs +181 -0
- package/dist/cjs/tools/GitHubCompare.cjs.map +1 -0
- package/dist/esm/main.mjs +2 -1
- package/dist/esm/tools/GitHubCompare.mjs +175 -0
- package/dist/esm/tools/GitHubCompare.mjs.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/tools/GitHubCompare.d.ts +104 -0
- package/package.json +1 -1
- package/src/index.ts +1 -0
- package/src/tools/GitHubCompare.ts +319 -0
package/dist/cjs/main.cjs
CHANGED
|
@@ -101,6 +101,7 @@ const require_run$1 = require("./run.cjs");
|
|
|
101
101
|
require("./graphs/index.cjs");
|
|
102
102
|
const require_projection = require("./agents/projection.cjs");
|
|
103
103
|
const require_Calculator = require("./tools/Calculator.cjs");
|
|
104
|
+
const require_GitHubCompare = require("./tools/GitHubCompare.cjs");
|
|
104
105
|
const require_SkillTool = require("./tools/SkillTool.cjs");
|
|
105
106
|
const require_ReadFile = require("./tools/ReadFile.cjs");
|
|
106
107
|
const require_skillCatalog = require("./tools/skillCatalog.cjs");
|
|
@@ -256,6 +257,12 @@ exports.FADING_MIN_BUDGET_TOKENS = require_fading.FADING_MIN_BUDGET_TOKENS;
|
|
|
256
257
|
exports.FADING_TIER_VERSION = require_fading.FADING_TIER_VERSION;
|
|
257
258
|
exports.FAILED_EXECUTION_FILE_REMINDER = require_CodeExecutor.FAILED_EXECUTION_FILE_REMINDER;
|
|
258
259
|
exports.FakeChatModel = require_fake.FakeChatModel;
|
|
260
|
+
exports.GitHubCompareTool = require_GitHubCompare.GitHubCompareTool;
|
|
261
|
+
exports.GitHubCompareToolDefinition = require_GitHubCompare.GitHubCompareToolDefinition;
|
|
262
|
+
exports.GitHubCompareToolDescription = require_GitHubCompare.GitHubCompareToolDescription;
|
|
263
|
+
exports.GitHubCompareToolName = require_GitHubCompare.GitHubCompareToolName;
|
|
264
|
+
exports.GitHubCompareToolSchema = require_GitHubCompare.GitHubCompareToolSchema;
|
|
265
|
+
exports.GitHubComparisonError = require_GitHubCompare.GitHubComparisonError;
|
|
259
266
|
exports.Graph = require_Graph.Graph;
|
|
260
267
|
exports.GraphEvents = require_enum.GraphEvents;
|
|
261
268
|
exports.GraphNodeActions = require_enum.GraphNodeActions;
|
|
@@ -501,6 +508,7 @@ exports.cloneMessage = require_cache.cloneMessage;
|
|
|
501
508
|
exports.coalesceAdjacentUserTurns = require_alternation.coalesceAdjacentUserTurns;
|
|
502
509
|
exports.commandAvailabilityEnvCacheKey = require_LocalExecutionEngine.commandAvailabilityEnvCacheKey;
|
|
503
510
|
exports.compactSyntheticProviderContextMessage = require_format.compactSyntheticProviderContextMessage;
|
|
511
|
+
exports.compareGitHubCommits = require_GitHubCompare.compareGitHubCommits;
|
|
504
512
|
exports.composeAbortSignals = require_misc.composeAbortSignals;
|
|
505
513
|
exports.composeEventHandlers = require_events.composeEventHandlers;
|
|
506
514
|
exports.computeAdaptivePieceSize = require_smoother.computeAdaptivePieceSize;
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
const require_intentArg = require("./intentArg.cjs");
|
|
2
|
+
let _langchain_core_tools = require("@langchain/core/tools");
|
|
3
|
+
//#region src/tools/GitHubCompare.ts
|
|
4
|
+
const GitHubCompareToolName = "github_compare";
|
|
5
|
+
const GitHubCompareToolDescription = "Read-only GitHub comparison of two full commit SHAs in a public repository. Returns the merge-base, relation and commit counts without Git, a worktree, or worker admission. Does not fetch code or execute commands. Private repositories and arbitrary URLs are not supported.";
|
|
6
|
+
const GitHubCompareToolSchema = {
|
|
7
|
+
type: "object",
|
|
8
|
+
properties: {
|
|
9
|
+
intent: { ...require_intentArg.INTENT_PROPERTY },
|
|
10
|
+
owner: {
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "GitHub repository owner."
|
|
13
|
+
},
|
|
14
|
+
repo: {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: "GitHub repository name."
|
|
17
|
+
},
|
|
18
|
+
base: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Full lowercase base commit SHA, not a moving branch."
|
|
21
|
+
},
|
|
22
|
+
head: {
|
|
23
|
+
type: "string",
|
|
24
|
+
description: "Full lowercase head commit SHA, not a moving branch."
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
required: [
|
|
28
|
+
"owner",
|
|
29
|
+
"repo",
|
|
30
|
+
"base",
|
|
31
|
+
"head"
|
|
32
|
+
]
|
|
33
|
+
};
|
|
34
|
+
const GitHubCompareToolDefinition = {
|
|
35
|
+
name: GitHubCompareToolName,
|
|
36
|
+
description: GitHubCompareToolDescription,
|
|
37
|
+
parameters: GitHubCompareToolSchema
|
|
38
|
+
};
|
|
39
|
+
var GitHubComparisonError = class extends Error {
|
|
40
|
+
code;
|
|
41
|
+
status;
|
|
42
|
+
constructor(code, message, status) {
|
|
43
|
+
super(message);
|
|
44
|
+
this.code = code;
|
|
45
|
+
this.status = status;
|
|
46
|
+
this.name = "GitHubComparisonError";
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const SHA = /^[a-f0-9]{40}$/;
|
|
50
|
+
const REPO = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,99}$/;
|
|
51
|
+
const MAX_RESPONSE_BYTES = 2 * 1024 * 1024;
|
|
52
|
+
function awaitWithSignal(operation, signal) {
|
|
53
|
+
signal.throwIfAborted();
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
const onAbort = () => {
|
|
56
|
+
signal.removeEventListener("abort", onAbort);
|
|
57
|
+
reject(signal.reason);
|
|
58
|
+
};
|
|
59
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
60
|
+
try {
|
|
61
|
+
operation().then((value) => {
|
|
62
|
+
signal.removeEventListener("abort", onAbort);
|
|
63
|
+
resolve(value);
|
|
64
|
+
}, (error) => {
|
|
65
|
+
signal.removeEventListener("abort", onAbort);
|
|
66
|
+
reject(error);
|
|
67
|
+
});
|
|
68
|
+
} catch (error) {
|
|
69
|
+
signal.removeEventListener("abort", onAbort);
|
|
70
|
+
reject(error);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function cancelBody(response) {
|
|
75
|
+
response.body?.cancel().catch(() => void 0);
|
|
76
|
+
}
|
|
77
|
+
async function readResponse(response, signal) {
|
|
78
|
+
const reader = response.body?.getReader();
|
|
79
|
+
if (reader == null) throw new GitHubComparisonError("INVALID_RESPONSE", "GitHub comparison returned an invalid response.");
|
|
80
|
+
const chunks = [];
|
|
81
|
+
let bytes = 0;
|
|
82
|
+
try {
|
|
83
|
+
for (;;) {
|
|
84
|
+
const item = await awaitWithSignal(() => reader.read(), signal);
|
|
85
|
+
if (item.done) break;
|
|
86
|
+
bytes += item.value.byteLength;
|
|
87
|
+
if (bytes > MAX_RESPONSE_BYTES) throw new GitHubComparisonError("RESPONSE_TOO_LARGE", "GitHub comparison response exceeded its bound.");
|
|
88
|
+
chunks.push(item.value);
|
|
89
|
+
}
|
|
90
|
+
return Buffer.concat(chunks, bytes).toString("utf8");
|
|
91
|
+
} finally {
|
|
92
|
+
reader.cancel().catch(() => void 0);
|
|
93
|
+
reader.releaseLock();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function parseComparison(text, input) {
|
|
97
|
+
let data;
|
|
98
|
+
try {
|
|
99
|
+
data = JSON.parse(text);
|
|
100
|
+
} catch {
|
|
101
|
+
throw new GitHubComparisonError("INVALID_RESPONSE", "GitHub comparison returned an invalid response.");
|
|
102
|
+
}
|
|
103
|
+
const mergeBase = data?.merge_base_commit?.sha;
|
|
104
|
+
const status = data?.status;
|
|
105
|
+
const aheadBy = data?.ahead_by;
|
|
106
|
+
const behindBy = data?.behind_by;
|
|
107
|
+
const totalCommits = data?.total_commits;
|
|
108
|
+
if (data?.base_commit?.sha !== input.base || typeof mergeBase !== "string" || !SHA.test(mergeBase) || status !== "ahead" && status !== "behind" && status !== "identical" && status !== "diverged" || typeof aheadBy !== "number" || !Number.isSafeInteger(aheadBy) || aheadBy < 0 || typeof behindBy !== "number" || !Number.isSafeInteger(behindBy) || behindBy < 0 || typeof totalCommits !== "number" || !Number.isSafeInteger(totalCommits) || totalCommits < 0) throw new GitHubComparisonError("INVALID_RESPONSE", "GitHub comparison returned an invalid response.");
|
|
109
|
+
return {
|
|
110
|
+
base: input.base,
|
|
111
|
+
head: input.head,
|
|
112
|
+
mergeBase,
|
|
113
|
+
status,
|
|
114
|
+
aheadBy,
|
|
115
|
+
behindBy,
|
|
116
|
+
totalCommits
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async function compareGitHubCommits(input, options, signal) {
|
|
120
|
+
signal?.throwIfAborted();
|
|
121
|
+
if (typeof input.owner !== "string" || !REPO.test(input.owner) || typeof input.repo !== "string" || !REPO.test(input.repo) || typeof input.base !== "string" || !SHA.test(input.base) || typeof input.head !== "string" || !SHA.test(input.head)) throw new GitHubComparisonError("INVALID_INPUT", "Supply a repository and full lowercase commit SHAs.");
|
|
122
|
+
const timeoutMs = options.timeoutMs ?? 1e4;
|
|
123
|
+
if (typeof options.fetch !== "function" || !Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 3e4) throw new GitHubComparisonError("INVALID_CONFIGURATION", "Supply a GitHub transport and a timeout between 1 and 30000 ms.");
|
|
124
|
+
const timeout = new AbortController();
|
|
125
|
+
const timer = setTimeout(() => timeout.abort(new DOMException("GitHub comparison timed out.", "TimeoutError")), timeoutMs);
|
|
126
|
+
timer.unref();
|
|
127
|
+
let pendingResponse;
|
|
128
|
+
const requestSignal = signal == null ? timeout.signal : AbortSignal.any([signal, timeout.signal]);
|
|
129
|
+
try {
|
|
130
|
+
const response = await awaitWithSignal(() => options.fetch(`https://api.github.com/repos/${encodeURIComponent(input.owner)}/${encodeURIComponent(input.repo)}/compare/${input.base}...${input.head}?per_page=1&page=2`, {
|
|
131
|
+
method: "GET",
|
|
132
|
+
redirect: "error",
|
|
133
|
+
credentials: "omit",
|
|
134
|
+
signal: requestSignal,
|
|
135
|
+
headers: {
|
|
136
|
+
Accept: "application/vnd.github+json",
|
|
137
|
+
"X-GitHub-Api-Version": "2022-11-28"
|
|
138
|
+
}
|
|
139
|
+
}).then((response) => {
|
|
140
|
+
pendingResponse = response;
|
|
141
|
+
if (requestSignal.aborted) {
|
|
142
|
+
pendingResponse = void 0;
|
|
143
|
+
cancelBody(response);
|
|
144
|
+
requestSignal.throwIfAborted();
|
|
145
|
+
}
|
|
146
|
+
return response;
|
|
147
|
+
}), requestSignal);
|
|
148
|
+
if (!response.ok) throw new GitHubComparisonError("HTTP_ERROR", `GitHub comparison unavailable (HTTP ${response.status}).`, response.status);
|
|
149
|
+
pendingResponse = void 0;
|
|
150
|
+
const text = await readResponse(response, requestSignal);
|
|
151
|
+
requestSignal.throwIfAborted();
|
|
152
|
+
return parseComparison(text, input);
|
|
153
|
+
} catch (error) {
|
|
154
|
+
requestSignal.throwIfAborted();
|
|
155
|
+
if (error instanceof GitHubComparisonError) throw error;
|
|
156
|
+
throw new GitHubComparisonError("TRANSPORT_ERROR", "GitHub comparison transport failed.");
|
|
157
|
+
} finally {
|
|
158
|
+
if (pendingResponse != null) cancelBody(pendingResponse);
|
|
159
|
+
clearTimeout(timer);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
var GitHubCompareTool = class extends _langchain_core_tools.DynamicStructuredTool {
|
|
163
|
+
constructor(options) {
|
|
164
|
+
super({
|
|
165
|
+
name: GitHubCompareToolName,
|
|
166
|
+
description: GitHubCompareToolDescription,
|
|
167
|
+
schema: structuredClone(GitHubCompareToolSchema),
|
|
168
|
+
func: async (input, _manager, config) => JSON.stringify(await compareGitHubCommits(input, options, config?.signal))
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
//#endregion
|
|
173
|
+
exports.GitHubCompareTool = GitHubCompareTool;
|
|
174
|
+
exports.GitHubCompareToolDefinition = GitHubCompareToolDefinition;
|
|
175
|
+
exports.GitHubCompareToolDescription = GitHubCompareToolDescription;
|
|
176
|
+
exports.GitHubCompareToolName = GitHubCompareToolName;
|
|
177
|
+
exports.GitHubCompareToolSchema = GitHubCompareToolSchema;
|
|
178
|
+
exports.GitHubComparisonError = GitHubComparisonError;
|
|
179
|
+
exports.compareGitHubCommits = compareGitHubCommits;
|
|
180
|
+
|
|
181
|
+
//# sourceMappingURL=GitHubCompare.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubCompare.cjs","names":["INTENT_PROPERTY","DynamicStructuredTool"],"sources":["../../../src/tools/GitHubCompare.ts"],"mappings":"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"}
|
package/dist/esm/main.mjs
CHANGED
|
@@ -100,6 +100,7 @@ import { Run, defaultOmitOptions } from "./run.mjs";
|
|
|
100
100
|
import "./graphs/index.mjs";
|
|
101
101
|
import { projectAgentContextUsage } from "./agents/projection.mjs";
|
|
102
102
|
import { Calculator, CalculatorSchema, CalculatorToolDefinition, CalculatorToolDescription, CalculatorToolName } from "./tools/Calculator.mjs";
|
|
103
|
+
import { GitHubCompareTool, GitHubCompareToolDefinition, GitHubCompareToolDescription, GitHubCompareToolName, GitHubCompareToolSchema, GitHubComparisonError, compareGitHubCommits } from "./tools/GitHubCompare.mjs";
|
|
103
104
|
import { SkillToolDefinition, SkillToolDescription, SkillToolName, SkillToolSchema } from "./tools/SkillTool.mjs";
|
|
104
105
|
import { ReadFileToolDefinition, ReadFileToolDescription, ReadFileToolName, ReadFileToolSchema } from "./tools/ReadFile.mjs";
|
|
105
106
|
import { formatSkillCatalog } from "./tools/skillCatalog.mjs";
|
|
@@ -138,4 +139,4 @@ import { createSystemOneReranker } from "./rerank/systemone.mjs";
|
|
|
138
139
|
import { createWebSearchReranker } from "./rerank/search.mjs";
|
|
139
140
|
import "./rerank/index.mjs";
|
|
140
141
|
import { BaseCheckpointSaver, Command, INTERRUPT, MemorySaver, interrupt, isInterrupted } from "@langchain/langgraph";
|
|
141
|
-
export { ACTIVITY_LABEL_RUN_NAME, ACTIVITY_PHASE_LABEL_RUN_NAME, ACTIVITY_PHASE_RUN_NAME, AGENT_MODEL_CALL_RUN_NAME, AIMessage, AIMessageChunk, ANTHROPIC_TOOL_TOKEN_MULTIPLIER, ASK_USER_QUESTION_ID_PATTERN, AgentSession, BASH_SHELL_GUIDANCE, BaseCheckpointSaver, BaseMessage, BaseMessageChunk, BashExecutionToolDefinition, BashExecutionToolDescription, BashExecutionToolName, BashExecutionToolSchema, BashProgrammaticToolCallingDefinition, BashProgrammaticToolCallingDescription, BashProgrammaticToolCallingName, BashProgrammaticToolCallingSchema, BashToolOutputReferencesGuide, CALIBRATION_RATIO_MAX, CALIBRATION_RATIO_MIN, CLOUDFLARE_BASH_CODING_TOOL_NAMES, CLOUDFLARE_CODING_TOOL_NAMES, CODE_API_AUTHORIZATION_ERROR_MESSAGE, CODE_API_CAPABILITY_ERROR_MESSAGE, CODE_API_EXECUTION_FAILED_ERROR_MESSAGE, CODE_API_EXPECTED_PROFILE_HEADER, CODE_API_INVALID_REQUEST_ERROR_MESSAGE, CODE_API_RATE_LIMITED_ERROR_MESSAGE, CODE_API_UNAVAILABLE_ERROR_MESSAGE, CODE_ARTIFACT_PATH_GUIDANCE, CODE_EXECUTION_TOOLS, COMPACTION_SEMANTIC_INDEX_LIMITS, Calculator, CalculatorSchema, CalculatorToolDefinition, CalculatorToolDescription, CalculatorToolName, Callback, ChatModelStreamHandler, CloudflareBashExecutionToolDescription, CloudflareCodeExecutionToolDescription, CodeApiRequestError, CodeExecutionToolDefinition, CodeExecutionToolDescription, CodeExecutionToolName, CodeExecutionToolSchema, Command, CommonEvents, CompileCheckToolName, Constants, ContentTypes, DATE_RANGE, DECISION_PRESETS, DEFAULT_API_KEY_ENV, DEFAULT_CONTEXT_PRUNING_SETTINGS, DEFAULT_COUNTRY_DESCRIPTION, DEFAULT_HOOK_TIMEOUT_MS, DEFAULT_INTRA_TURN_RETAIN_RATIO, DEFAULT_MAX_SEALS, DEFAULT_MAX_STOP_CONTINUATIONS, DEFAULT_MAX_TOOL_CALL_ARG_BYTES, DEFAULT_PREEMPT_RESTART_GRACE_MS, DEFAULT_PROMPT_CACHE_TTL, DEFAULT_QUERY_DESCRIPTION, DEFAULT_RECURSION_LIMIT, DEFAULT_RESERVE_RATIO, DEFAULT_RETAIN_RECENT_TURNS, DEFAULT_STREAM_DELAY, DEFAULT_SUBAGENT_DESCRIPTION, DEFAULT_TOOL_TOKEN_MULTIPLIER, DecisionError, DynamicStructuredTool, EnvVar, EventActorExecutor, FADING_MIN_BUDGET_TOKENS, FADING_TIER_VERSION, FAILED_EXECUTION_FILE_REMINDER, FakeChatModel, Graph, GraphEvents, GraphNodeActions, GraphNodeKeys, HARD_MAX_TOOL_CALL_INPUT_CHARS, HARD_MAX_TOOL_RESULT_CHARS, HARD_MAX_TOTAL_TOOL_OUTPUT_SIZE, HOOK_EVENTS, HOOK_INJECTED_MESSAGES_CAPABLE, HOOK_PREEMPT_BOUNDARY_CAPABLE, HOOK_PREEMPT_RESTART_CAPABLE, HOOK_STOP_CONTINUATION_CAPABLE, HTTP_PROVIDER_ID, HandlerRegistry, HandoffLimitError, HookRegistry, HumanMessage, IMAGE_TOKEN_SAFETY_MARGIN, INSTRUCTIONLESS_HANDOFF_CUE, INTENT_ARG, INTENT_DESCRIPTION, INTENT_LABEL_MARKER, INTENT_PROPERTY, INTERRUPT, InMemorySubagentTaskStore, JsonlSessionStore, LANGFUSE_OBSERVATION_METADATA_ARTIFACT_KEY, LLMStreamHandler, LOCAL_CODING_BUNDLE_NAMES, LOCAL_CODING_TOOL_NAMES, LOCAL_SPAWN_TIMEOUT_MS, LocalBashExecutionToolDescription, LocalCodeExecutionToolDescription, LocalEditFileToolName, LocalEditFileToolSchema, LocalFileCheckpointerImpl, LocalGlobSearchToolName, LocalGlobSearchToolSchema, LocalGrepSearchToolName, LocalGrepSearchToolSchema, LocalListDirectoryToolName, LocalListDirectoryToolSchema, LocalReadFileToolSchema, LocalWriteFileToolName, LocalWriteFileToolSchema, MASKED_RESULT_MIN_CHARS, MAX_ASK_USER_QUESTIONS, MAX_CACHE_SIZE, MAX_PATTERN_LENGTH, MIN_JSON_VALUE_CHARS, MULTI_AGENT_GRAPH_RUN_NAME, ManualSummarizationSkippedError, MemorySaver, ModelEndHandler, MultiAgentGraph, OPENAI_RESPONSES_ACTIVE_REASONING_ID_KEY, OPENAI_RESPONSES_REPLAY_POSITIONS_KEY, ORIGINAL_CONTENT_MAX_CHARS, PREDECESSOR_HANDOFF_CUE, PREEMPT_BOUNDARY_HOOK_TIMEOUT_MS, PRESSURE_THRESHOLD_MASKING, PROVIDER_MESSAGE_PROVENANCE_LIMITS, PROVIDER_MESSAGE_PROVENANCE_VERSION, PROVIDER_TEXT_PROTECTION_VERSION, ProgrammaticToolCallingDefinition, ProgrammaticToolCallingDescription, ProgrammaticToolCallingName, ProgrammaticToolCallingSchema, PromptTemplate, ProviderMessageProjectionInvariantError, ProviderTextProtectionError, Providers, REASONING_LABEL_RUN_NAME, REMOVE_ALL_MESSAGES, REPLY_PRIMER_TOKENS, ReadFileToolDefinition, ReadFileToolDescription, ReadFileToolName, ReadFileToolSchema, Run, Runnable, RunnableCallable, RunnableLambda, RunnableSequence, SDK_STREAM_DISPATCH, STANDARD_GRAPH_RUN_NAME, STATEFUL_BASH_NOTE, STATEFUL_ENV_NOTE, SUBAGENT_CONTEXT_VERSION, SUBAGENT_HOST_ARG_LIMITS, SessionManager, SkillToolDefinition, SkillToolDescription, SkillToolName, SkillToolSchema, StandardGraph, StatefulBashExecutionToolDescription, StatefulCodeExecutionToolDescription, StepTypes, StreamLimitExceededError, StructuredTool, SubagentExecutor, SubagentHostArgumentError, SubagentResolutionError, SubagentToolDefinition, SubagentToolDescription, SubagentToolName, SubagentToolSchema, SystemMessage, TMP_SCRATCH_OUTPUT_REMINDER, TOOL_APPROVAL_EXECUTION_SCOPE_CAPABLE, TOOL_APPROVAL_EXECUTION_SCOPE_CONFIG_KEY, TOOL_INPUT_ELISION_NOTE, TestChatStreamHandler, TestLLMStreamHandler, TitleMethod, TokenEncoderManager, Tool, ToolCallTypes, ToolEndHandler, ToolMessage, ToolNode, ToolSearchToolDefinition, ToolSearchToolDescription, ToolSearchToolName, ToolSearchToolSchema, UnsafeTokenMeasurementError, WebSearchToolDefinition, WebSearchToolDescription, WebSearchToolName, WebSearchToolSchema, _createBashProgramForTests, _resetLocalEngineWarningsForTests, _resetRipgrepCacheForTests, _resetSyntaxCheckProbeCacheForTests, _resetUnrecognizedTriggerWarnings, addBedrockCacheControl, addBedrockTailCacheControl, addCacheControl, addCacheControlToStablePrefixMessages, addCodeApiExecutionProfileHeader, addTailCacheControl, appendCodeSessionFileSummary, appendFailedExecutionFileReminder, appendInstructionlessHandoffCue, appendPredecessorHandoffCue, appendProviderMessageProvenance, appendTmpScratchReminder, applyContextPruning, applyEdit, applyFadingCaps, applyOutcome, applyPreToolUseHooksForBridge, apportionTokenCounts, askUserQuestion, askUserQuestions, attemptInvoke, bashAstFindingsToErrors, booleanQuestion, buildAnthropicCacheControl, buildBashExecutionToolDescription, buildBashExecutionToolSchema, buildBedrockCachePoint, buildChildInputs, buildCodeApiEndpoint, buildCodeApiExecutionErrorMessage, buildCodeApiHttpErrorMessage, buildCodeExecutionToolDescription, buildCodeExecutionToolSchema, buildSandboxRuntimeConfig, buildSubagentHostArgProperties, buildSubagentToolParams, buildSummarizationInstruction, buildSummaryCarrierText, calculateMaxToolCallInputChars, calculateMaxToolResultChars, calculateMaxTotalToolOutputSize, calculateTotalTokens, canSealPreempt, canonicalizeServerName, checkValidNumber, choiceQuestion, clampCalibrationRatio, classifyAttachment, clientExecTimeoutMs, clientFsTimeoutMs, cloneMessage, coalesceAdjacentUserTurns, commandAvailabilityEnvCacheKey, compactSyntheticProviderContextMessage, composeAbortSignals, composeEventHandlers, computeAdaptivePieceSize, constructorChainHasLcName, convertInjectedMessages, convertMessagesToContent, countNestedGroups, countrySchema, createAgentSession, createBashExecutionTool, createBashProgrammaticToolCallingSchema, createBashProgrammaticToolCallingTool, createCloudflareBashExecutionTool, createCloudflareBashProgrammaticToolCallingTool, createCloudflareBridgeRuntime, createCloudflareCodeExecutionTool, createCloudflareCodingToolBundle, createCloudflareCodingTools, createCloudflareExecutionTool, createCloudflareExecutionWorld, createCloudflareLocalExecutionConfig, createCloudflareProgrammaticToolCallingTool, createCloudflareWorkspaceFS, createCodeExecutionTool, createCompileCheckTool, createCompileCheckToolDefinition, createContentAggregator, createDecisionModel, createEventActorExecutor, createFadingTier, createFakeStreamingLLM, createGraph, createHandlers, createHttpDecisionModel, createLocalBashExecutionTool, createLocalBashProgrammaticToolCallingTool, createLocalCodeExecutionTool, createLocalCodingToolBundle, createLocalCodingToolDefinitions, createLocalCodingToolRegistry, createLocalCodingTools, createLocalEditFileTool, createLocalFileCheckpointer, createLocalGlobSearchTool, createLocalGrepSearchTool, createLocalListDirectoryTool, createLocalProgrammaticToolCallingTool, createLocalReadFileTool, createLocalWriteFileTool, createMetadataAggregator, createProgrammaticToolCallingSchema, createProgrammaticToolCallingTool, createPruneMessages, createRemoveAllMessage, createRunHandlers, createSchemaOnlyTool, createSchemaOnlyTools, createSearchTool, createStructuredChatDecisionModel, createSubagentToolDefinition, createSystemOneReranker, createTokenCounter, createToolErrorOwnership, createToolPolicyHook, createToolSearch, createTransport, createWebSearchReranker, createWorkspacePolicyHook, dateSchema, decisionPreset, decisionProviderNames, decodeFile, defaultOmitOptions, deriveMessages, deserializeMessage, dispatchesChatModelStream, dropIncompleteToolStreamContent, emptyOutputMessage, encodeFile, encodingForModel, encodingOfTokenCounter, enforceOriginalContentCap, ensureThinkingBlockInMessages, escapeRegexSpecialChars, estimateAnthropicImageTokens, estimateDocumentBlockTokens, estimateImageBlockTokens, estimateOpenAIImageTokens, estimateTimedMediaBlockTokens, execWithClientTimeout, executeCloudflareBash, executeCloudflareCode, executeHooks, executeLocalBash, executeLocalBashWithArgs, executeLocalCode, executeParallelSearches, executeTools, extractErrorMessage, extractImageDimensions, extractMcpServerName, extractTextFromContent, extractToolDiscoveries, extractUsedBashToolNames, extractUsedToolNames, fadingBudgetTokens, fadingRungForBudget, fadingRungForExchangeChars, fadingRungForResultChars, fetchSessionFiles, filterBashToolsByUsage, filterGraphSubagentResult, filterSubagentResult, filterToolsByUsage, findLastIndex, flattenLegacyContent, foldToolBlocksForToollessAgent, formatAgentMessages, formatAnthropicArtifactContent, formatAnthropicMessage, formatArtifactPayload, formatCloudflareOutput, formatCompletedResponse, formatContentStrings, formatFromLangChain, formatLangChainMessages, formatMediaMessage, formatMessage, formatServerListing, formatSkillCatalog, getAssistantTextPhase, getAvailableMcpServers, getBaseToolName, getBufferString, getChatModelClass, getChunkContent, getCloudflareWorkspaceRoot, getCodeBaseURL, getContextOverflowInfo, getConverseOverrideMessage, getDeferredToolsListing, getExecutionWorld, getLocalCwd, getLocalSessionId, getMaxOutputTokensKey, getMessageCreationContentMetadata, getMessageId, getMessagesWithinTokenLimit, getProviderMessageProvenance, getProviderSourceMessageIds, getReadRoots, getSpawn, getSubagentHostArgumentFailureMessage, getSubagentResolutionFailureMessage, getTokenCountForMessage, getWorkspaceFS, getWorkspaceRoots, getWriteRoots, handleServerToolResult, handleToolCallChunks, handleToolCalls, hasBijectiveProviderContentPartMapping, hasNestedQuantifier, hasNestedQuantifiers, hasNonEmptyTextContent, hasToolSearchInCurrentTurn, hasUnsafeStructuredSerialization, imageAttachmentContent, imagesSchema, initializeModel, inspectProviderMessageProjection, inspectProviderMessageProvenance, inspectProviderSourceMessageIds, interrupt, isAIMessage, isAnthropicLike, isAskUserQuestionsInterrupt, isBaseMessage, isBooleanAnswer, isChoiceAnswer, isContextOverflowError, isDangerousPattern, isDecisionObject, isFadingTier, isFromAnyMcpServer, isFromMcpServer, isGoogleLike, isGraphSubagentConfig, isInformativeFadingTier, isIntentLabelProperty, isInterrupted, isLegacyConvertible, isLegacyFadingTier, isLibreChatOpenAIModel, isLikelyContextOverflowError, isOpenAILike, isPresent, isProgrammaticRunnerAutoBound, isProgrammaticRunnerResolvedDirectly, isReasoningContentBlock, isScoreAnswer, isSyntheticProviderContextMessage, isThinkingEnabled, isToolMessage, isZodSchema, joinKeys, labelContentByAgent, locateEdit, makeIsDeferred, makeRequest, mapChatMessagesToStoredMessages, mapStoredMessagesToChatMessages, markTokenCounterCacheCompatible, maskConsumedToolResults, matchesQuery, maxFadingRung, mergeAggregatedHookResults, mergeDecisionSettings, messagesStateReducer, modifyDeltaProperties, newsSchema, nodeExecutionWorld, normalizeBashToolResultsForReplay, normalizeCodeApiRequestError, normalizeSearchResultData, normalizeServerFilter, normalizeSubagentConfigEntries, normalizeSubagentConfigs, normalizeToBashIdentifier, normalizeToPythonIdentifier, outcomeFieldsFromResult, parseBooleanEnv, parseEnvelope, partitionAndMarkAnthropicToolCache, performLocalSearch, preFlightTruncateToolCallInputs, preFlightTruncateToolResults, prepareBashProgrammaticCode, prepareProviderRequest, probeLocalCommandAvailability, projectAgentContextUsage, projectAnthropicArtifactContent, projectArtifactPayload, projectCacheControlledToolOutputsToText, projectComputerCallOutputsToText, projectOpenAIChatToolMessageContent, projectOpenAIResponsesToolMessageContent, projectOpenAIToolMessageContent, projectOpenRouterToolMessageContent, projectSingleTextToolOutputsToText, projectStructuredToolOutputsToText, projectToolCallInputs, projectToolMessagesForProvider, projectToolStreamContentForProvider, querySchema, readAnswer, readDecisionUsage, readIntent, readOutcomeFields, readTokenMetadataProperty, registerProvider, removePredecessorHandoffCue, repairOrphanedToolMessages, resetIfNotEmpty, resolveBedrockPromptCacheTtl, resolveCloudflareSandbox, resolveCodeApiAuthHeaders, resolveContextPruningSettings, resolveFadingCaps, resolveFadingTier, resolveFetchProxyAgent, resolveIntraTurnRetainTokens, resolveLocalExecutionConfig, resolveLocalExecutionTools, resolveLocalImplementationNames, resolveLocalToolRegistry, resolveLocalToolsForBinding, resolvePromptCacheTtl, resolveProviderMessageProjectionInvariantMode, resolveSearchOutcome, resolveServerFilters, resolveStreamDelay, resolveStreamLimits, resolveSubagentConfigEntries, resolveSubagentConfigs, resolveSubagentHostArgs, resolveToolOutcome, resolveWorkspacePath, resolveWorkspacePathSafe, runBashAstChecks, runPlainExecution, runPostEditSyntaxCheck, sanitizeOrphanToolBlocks, sanitizeRegex, scoreQuestion, seedFadingTier, selectRuntimeSessionHint, separateSummarizationParameters, serializeMessage, serializeToolCallInput, setCommandAvailabilityCacheEntry, setFreshProviderMessageProvenance, setInvalidProviderMessageProvenance, setProviderMessageProvenance, shellQuote, shiftIndexTokenCountMap, shouldBypassProxy, shouldTriggerSummarization, sleep, sliceWithoutSplittingSurrogates, smoothStream, spawnLocalProcess, splitAssistantTextContentByPhase, splitAtRecencyBoundary, stampSyntheticProviderMessage, strictAlternationProviders, stripAnthropicCacheControl, stripBedrockCacheControl, stripCodeSessionFileSummary, stripIntent, summarizeEvent, supportsBedrockToolCache, syncBudgetDerivedFields, toJsonSchema, toWireQuestion, tool, toolResultTypes, toolsCondition, truncateLocalOutput, truncateToolInput, truncateToolResultContent, tryFallbackProviders, unescapeObject, unwrapToolResponse, validateBashCommand, validateCloudflareBashCommand, validateDecisionQuestions, videosSchema, withClientTimeout, withInstructionlessHandoffCue, withIntent, withMessageRole, withoutIntent, wrapPythonForPlainExecution };
|
|
142
|
+
export { ACTIVITY_LABEL_RUN_NAME, ACTIVITY_PHASE_LABEL_RUN_NAME, ACTIVITY_PHASE_RUN_NAME, AGENT_MODEL_CALL_RUN_NAME, AIMessage, AIMessageChunk, ANTHROPIC_TOOL_TOKEN_MULTIPLIER, ASK_USER_QUESTION_ID_PATTERN, AgentSession, BASH_SHELL_GUIDANCE, BaseCheckpointSaver, BaseMessage, BaseMessageChunk, BashExecutionToolDefinition, BashExecutionToolDescription, BashExecutionToolName, BashExecutionToolSchema, BashProgrammaticToolCallingDefinition, BashProgrammaticToolCallingDescription, BashProgrammaticToolCallingName, BashProgrammaticToolCallingSchema, BashToolOutputReferencesGuide, CALIBRATION_RATIO_MAX, CALIBRATION_RATIO_MIN, CLOUDFLARE_BASH_CODING_TOOL_NAMES, CLOUDFLARE_CODING_TOOL_NAMES, CODE_API_AUTHORIZATION_ERROR_MESSAGE, CODE_API_CAPABILITY_ERROR_MESSAGE, CODE_API_EXECUTION_FAILED_ERROR_MESSAGE, CODE_API_EXPECTED_PROFILE_HEADER, CODE_API_INVALID_REQUEST_ERROR_MESSAGE, CODE_API_RATE_LIMITED_ERROR_MESSAGE, CODE_API_UNAVAILABLE_ERROR_MESSAGE, CODE_ARTIFACT_PATH_GUIDANCE, CODE_EXECUTION_TOOLS, COMPACTION_SEMANTIC_INDEX_LIMITS, Calculator, CalculatorSchema, CalculatorToolDefinition, CalculatorToolDescription, CalculatorToolName, Callback, ChatModelStreamHandler, CloudflareBashExecutionToolDescription, CloudflareCodeExecutionToolDescription, CodeApiRequestError, CodeExecutionToolDefinition, CodeExecutionToolDescription, CodeExecutionToolName, CodeExecutionToolSchema, Command, CommonEvents, CompileCheckToolName, Constants, ContentTypes, DATE_RANGE, DECISION_PRESETS, DEFAULT_API_KEY_ENV, DEFAULT_CONTEXT_PRUNING_SETTINGS, DEFAULT_COUNTRY_DESCRIPTION, DEFAULT_HOOK_TIMEOUT_MS, DEFAULT_INTRA_TURN_RETAIN_RATIO, DEFAULT_MAX_SEALS, DEFAULT_MAX_STOP_CONTINUATIONS, DEFAULT_MAX_TOOL_CALL_ARG_BYTES, DEFAULT_PREEMPT_RESTART_GRACE_MS, DEFAULT_PROMPT_CACHE_TTL, DEFAULT_QUERY_DESCRIPTION, DEFAULT_RECURSION_LIMIT, DEFAULT_RESERVE_RATIO, DEFAULT_RETAIN_RECENT_TURNS, DEFAULT_STREAM_DELAY, DEFAULT_SUBAGENT_DESCRIPTION, DEFAULT_TOOL_TOKEN_MULTIPLIER, DecisionError, DynamicStructuredTool, EnvVar, EventActorExecutor, FADING_MIN_BUDGET_TOKENS, FADING_TIER_VERSION, FAILED_EXECUTION_FILE_REMINDER, FakeChatModel, GitHubCompareTool, GitHubCompareToolDefinition, GitHubCompareToolDescription, GitHubCompareToolName, GitHubCompareToolSchema, GitHubComparisonError, Graph, GraphEvents, GraphNodeActions, GraphNodeKeys, HARD_MAX_TOOL_CALL_INPUT_CHARS, HARD_MAX_TOOL_RESULT_CHARS, HARD_MAX_TOTAL_TOOL_OUTPUT_SIZE, HOOK_EVENTS, HOOK_INJECTED_MESSAGES_CAPABLE, HOOK_PREEMPT_BOUNDARY_CAPABLE, HOOK_PREEMPT_RESTART_CAPABLE, HOOK_STOP_CONTINUATION_CAPABLE, HTTP_PROVIDER_ID, HandlerRegistry, HandoffLimitError, HookRegistry, HumanMessage, IMAGE_TOKEN_SAFETY_MARGIN, INSTRUCTIONLESS_HANDOFF_CUE, INTENT_ARG, INTENT_DESCRIPTION, INTENT_LABEL_MARKER, INTENT_PROPERTY, INTERRUPT, InMemorySubagentTaskStore, JsonlSessionStore, LANGFUSE_OBSERVATION_METADATA_ARTIFACT_KEY, LLMStreamHandler, LOCAL_CODING_BUNDLE_NAMES, LOCAL_CODING_TOOL_NAMES, LOCAL_SPAWN_TIMEOUT_MS, LocalBashExecutionToolDescription, LocalCodeExecutionToolDescription, LocalEditFileToolName, LocalEditFileToolSchema, LocalFileCheckpointerImpl, LocalGlobSearchToolName, LocalGlobSearchToolSchema, LocalGrepSearchToolName, LocalGrepSearchToolSchema, LocalListDirectoryToolName, LocalListDirectoryToolSchema, LocalReadFileToolSchema, LocalWriteFileToolName, LocalWriteFileToolSchema, MASKED_RESULT_MIN_CHARS, MAX_ASK_USER_QUESTIONS, MAX_CACHE_SIZE, MAX_PATTERN_LENGTH, MIN_JSON_VALUE_CHARS, MULTI_AGENT_GRAPH_RUN_NAME, ManualSummarizationSkippedError, MemorySaver, ModelEndHandler, MultiAgentGraph, OPENAI_RESPONSES_ACTIVE_REASONING_ID_KEY, OPENAI_RESPONSES_REPLAY_POSITIONS_KEY, ORIGINAL_CONTENT_MAX_CHARS, PREDECESSOR_HANDOFF_CUE, PREEMPT_BOUNDARY_HOOK_TIMEOUT_MS, PRESSURE_THRESHOLD_MASKING, PROVIDER_MESSAGE_PROVENANCE_LIMITS, PROVIDER_MESSAGE_PROVENANCE_VERSION, PROVIDER_TEXT_PROTECTION_VERSION, ProgrammaticToolCallingDefinition, ProgrammaticToolCallingDescription, ProgrammaticToolCallingName, ProgrammaticToolCallingSchema, PromptTemplate, ProviderMessageProjectionInvariantError, ProviderTextProtectionError, Providers, REASONING_LABEL_RUN_NAME, REMOVE_ALL_MESSAGES, REPLY_PRIMER_TOKENS, ReadFileToolDefinition, ReadFileToolDescription, ReadFileToolName, ReadFileToolSchema, Run, Runnable, RunnableCallable, RunnableLambda, RunnableSequence, SDK_STREAM_DISPATCH, STANDARD_GRAPH_RUN_NAME, STATEFUL_BASH_NOTE, STATEFUL_ENV_NOTE, SUBAGENT_CONTEXT_VERSION, SUBAGENT_HOST_ARG_LIMITS, SessionManager, SkillToolDefinition, SkillToolDescription, SkillToolName, SkillToolSchema, StandardGraph, StatefulBashExecutionToolDescription, StatefulCodeExecutionToolDescription, StepTypes, StreamLimitExceededError, StructuredTool, SubagentExecutor, SubagentHostArgumentError, SubagentResolutionError, SubagentToolDefinition, SubagentToolDescription, SubagentToolName, SubagentToolSchema, SystemMessage, TMP_SCRATCH_OUTPUT_REMINDER, TOOL_APPROVAL_EXECUTION_SCOPE_CAPABLE, TOOL_APPROVAL_EXECUTION_SCOPE_CONFIG_KEY, TOOL_INPUT_ELISION_NOTE, TestChatStreamHandler, TestLLMStreamHandler, TitleMethod, TokenEncoderManager, Tool, ToolCallTypes, ToolEndHandler, ToolMessage, ToolNode, ToolSearchToolDefinition, ToolSearchToolDescription, ToolSearchToolName, ToolSearchToolSchema, UnsafeTokenMeasurementError, WebSearchToolDefinition, WebSearchToolDescription, WebSearchToolName, WebSearchToolSchema, _createBashProgramForTests, _resetLocalEngineWarningsForTests, _resetRipgrepCacheForTests, _resetSyntaxCheckProbeCacheForTests, _resetUnrecognizedTriggerWarnings, addBedrockCacheControl, addBedrockTailCacheControl, addCacheControl, addCacheControlToStablePrefixMessages, addCodeApiExecutionProfileHeader, addTailCacheControl, appendCodeSessionFileSummary, appendFailedExecutionFileReminder, appendInstructionlessHandoffCue, appendPredecessorHandoffCue, appendProviderMessageProvenance, appendTmpScratchReminder, applyContextPruning, applyEdit, applyFadingCaps, applyOutcome, applyPreToolUseHooksForBridge, apportionTokenCounts, askUserQuestion, askUserQuestions, attemptInvoke, bashAstFindingsToErrors, booleanQuestion, buildAnthropicCacheControl, buildBashExecutionToolDescription, buildBashExecutionToolSchema, buildBedrockCachePoint, buildChildInputs, buildCodeApiEndpoint, buildCodeApiExecutionErrorMessage, buildCodeApiHttpErrorMessage, buildCodeExecutionToolDescription, buildCodeExecutionToolSchema, buildSandboxRuntimeConfig, buildSubagentHostArgProperties, buildSubagentToolParams, buildSummarizationInstruction, buildSummaryCarrierText, calculateMaxToolCallInputChars, calculateMaxToolResultChars, calculateMaxTotalToolOutputSize, calculateTotalTokens, canSealPreempt, canonicalizeServerName, checkValidNumber, choiceQuestion, clampCalibrationRatio, classifyAttachment, clientExecTimeoutMs, clientFsTimeoutMs, cloneMessage, coalesceAdjacentUserTurns, commandAvailabilityEnvCacheKey, compactSyntheticProviderContextMessage, compareGitHubCommits, composeAbortSignals, composeEventHandlers, computeAdaptivePieceSize, constructorChainHasLcName, convertInjectedMessages, convertMessagesToContent, countNestedGroups, countrySchema, createAgentSession, createBashExecutionTool, createBashProgrammaticToolCallingSchema, createBashProgrammaticToolCallingTool, createCloudflareBashExecutionTool, createCloudflareBashProgrammaticToolCallingTool, createCloudflareBridgeRuntime, createCloudflareCodeExecutionTool, createCloudflareCodingToolBundle, createCloudflareCodingTools, createCloudflareExecutionTool, createCloudflareExecutionWorld, createCloudflareLocalExecutionConfig, createCloudflareProgrammaticToolCallingTool, createCloudflareWorkspaceFS, createCodeExecutionTool, createCompileCheckTool, createCompileCheckToolDefinition, createContentAggregator, createDecisionModel, createEventActorExecutor, createFadingTier, createFakeStreamingLLM, createGraph, createHandlers, createHttpDecisionModel, createLocalBashExecutionTool, createLocalBashProgrammaticToolCallingTool, createLocalCodeExecutionTool, createLocalCodingToolBundle, createLocalCodingToolDefinitions, createLocalCodingToolRegistry, createLocalCodingTools, createLocalEditFileTool, createLocalFileCheckpointer, createLocalGlobSearchTool, createLocalGrepSearchTool, createLocalListDirectoryTool, createLocalProgrammaticToolCallingTool, createLocalReadFileTool, createLocalWriteFileTool, createMetadataAggregator, createProgrammaticToolCallingSchema, createProgrammaticToolCallingTool, createPruneMessages, createRemoveAllMessage, createRunHandlers, createSchemaOnlyTool, createSchemaOnlyTools, createSearchTool, createStructuredChatDecisionModel, createSubagentToolDefinition, createSystemOneReranker, createTokenCounter, createToolErrorOwnership, createToolPolicyHook, createToolSearch, createTransport, createWebSearchReranker, createWorkspacePolicyHook, dateSchema, decisionPreset, decisionProviderNames, decodeFile, defaultOmitOptions, deriveMessages, deserializeMessage, dispatchesChatModelStream, dropIncompleteToolStreamContent, emptyOutputMessage, encodeFile, encodingForModel, encodingOfTokenCounter, enforceOriginalContentCap, ensureThinkingBlockInMessages, escapeRegexSpecialChars, estimateAnthropicImageTokens, estimateDocumentBlockTokens, estimateImageBlockTokens, estimateOpenAIImageTokens, estimateTimedMediaBlockTokens, execWithClientTimeout, executeCloudflareBash, executeCloudflareCode, executeHooks, executeLocalBash, executeLocalBashWithArgs, executeLocalCode, executeParallelSearches, executeTools, extractErrorMessage, extractImageDimensions, extractMcpServerName, extractTextFromContent, extractToolDiscoveries, extractUsedBashToolNames, extractUsedToolNames, fadingBudgetTokens, fadingRungForBudget, fadingRungForExchangeChars, fadingRungForResultChars, fetchSessionFiles, filterBashToolsByUsage, filterGraphSubagentResult, filterSubagentResult, filterToolsByUsage, findLastIndex, flattenLegacyContent, foldToolBlocksForToollessAgent, formatAgentMessages, formatAnthropicArtifactContent, formatAnthropicMessage, formatArtifactPayload, formatCloudflareOutput, formatCompletedResponse, formatContentStrings, formatFromLangChain, formatLangChainMessages, formatMediaMessage, formatMessage, formatServerListing, formatSkillCatalog, getAssistantTextPhase, getAvailableMcpServers, getBaseToolName, getBufferString, getChatModelClass, getChunkContent, getCloudflareWorkspaceRoot, getCodeBaseURL, getContextOverflowInfo, getConverseOverrideMessage, getDeferredToolsListing, getExecutionWorld, getLocalCwd, getLocalSessionId, getMaxOutputTokensKey, getMessageCreationContentMetadata, getMessageId, getMessagesWithinTokenLimit, getProviderMessageProvenance, getProviderSourceMessageIds, getReadRoots, getSpawn, getSubagentHostArgumentFailureMessage, getSubagentResolutionFailureMessage, getTokenCountForMessage, getWorkspaceFS, getWorkspaceRoots, getWriteRoots, handleServerToolResult, handleToolCallChunks, handleToolCalls, hasBijectiveProviderContentPartMapping, hasNestedQuantifier, hasNestedQuantifiers, hasNonEmptyTextContent, hasToolSearchInCurrentTurn, hasUnsafeStructuredSerialization, imageAttachmentContent, imagesSchema, initializeModel, inspectProviderMessageProjection, inspectProviderMessageProvenance, inspectProviderSourceMessageIds, interrupt, isAIMessage, isAnthropicLike, isAskUserQuestionsInterrupt, isBaseMessage, isBooleanAnswer, isChoiceAnswer, isContextOverflowError, isDangerousPattern, isDecisionObject, isFadingTier, isFromAnyMcpServer, isFromMcpServer, isGoogleLike, isGraphSubagentConfig, isInformativeFadingTier, isIntentLabelProperty, isInterrupted, isLegacyConvertible, isLegacyFadingTier, isLibreChatOpenAIModel, isLikelyContextOverflowError, isOpenAILike, isPresent, isProgrammaticRunnerAutoBound, isProgrammaticRunnerResolvedDirectly, isReasoningContentBlock, isScoreAnswer, isSyntheticProviderContextMessage, isThinkingEnabled, isToolMessage, isZodSchema, joinKeys, labelContentByAgent, locateEdit, makeIsDeferred, makeRequest, mapChatMessagesToStoredMessages, mapStoredMessagesToChatMessages, markTokenCounterCacheCompatible, maskConsumedToolResults, matchesQuery, maxFadingRung, mergeAggregatedHookResults, mergeDecisionSettings, messagesStateReducer, modifyDeltaProperties, newsSchema, nodeExecutionWorld, normalizeBashToolResultsForReplay, normalizeCodeApiRequestError, normalizeSearchResultData, normalizeServerFilter, normalizeSubagentConfigEntries, normalizeSubagentConfigs, normalizeToBashIdentifier, normalizeToPythonIdentifier, outcomeFieldsFromResult, parseBooleanEnv, parseEnvelope, partitionAndMarkAnthropicToolCache, performLocalSearch, preFlightTruncateToolCallInputs, preFlightTruncateToolResults, prepareBashProgrammaticCode, prepareProviderRequest, probeLocalCommandAvailability, projectAgentContextUsage, projectAnthropicArtifactContent, projectArtifactPayload, projectCacheControlledToolOutputsToText, projectComputerCallOutputsToText, projectOpenAIChatToolMessageContent, projectOpenAIResponsesToolMessageContent, projectOpenAIToolMessageContent, projectOpenRouterToolMessageContent, projectSingleTextToolOutputsToText, projectStructuredToolOutputsToText, projectToolCallInputs, projectToolMessagesForProvider, projectToolStreamContentForProvider, querySchema, readAnswer, readDecisionUsage, readIntent, readOutcomeFields, readTokenMetadataProperty, registerProvider, removePredecessorHandoffCue, repairOrphanedToolMessages, resetIfNotEmpty, resolveBedrockPromptCacheTtl, resolveCloudflareSandbox, resolveCodeApiAuthHeaders, resolveContextPruningSettings, resolveFadingCaps, resolveFadingTier, resolveFetchProxyAgent, resolveIntraTurnRetainTokens, resolveLocalExecutionConfig, resolveLocalExecutionTools, resolveLocalImplementationNames, resolveLocalToolRegistry, resolveLocalToolsForBinding, resolvePromptCacheTtl, resolveProviderMessageProjectionInvariantMode, resolveSearchOutcome, resolveServerFilters, resolveStreamDelay, resolveStreamLimits, resolveSubagentConfigEntries, resolveSubagentConfigs, resolveSubagentHostArgs, resolveToolOutcome, resolveWorkspacePath, resolveWorkspacePathSafe, runBashAstChecks, runPlainExecution, runPostEditSyntaxCheck, sanitizeOrphanToolBlocks, sanitizeRegex, scoreQuestion, seedFadingTier, selectRuntimeSessionHint, separateSummarizationParameters, serializeMessage, serializeToolCallInput, setCommandAvailabilityCacheEntry, setFreshProviderMessageProvenance, setInvalidProviderMessageProvenance, setProviderMessageProvenance, shellQuote, shiftIndexTokenCountMap, shouldBypassProxy, shouldTriggerSummarization, sleep, sliceWithoutSplittingSurrogates, smoothStream, spawnLocalProcess, splitAssistantTextContentByPhase, splitAtRecencyBoundary, stampSyntheticProviderMessage, strictAlternationProviders, stripAnthropicCacheControl, stripBedrockCacheControl, stripCodeSessionFileSummary, stripIntent, summarizeEvent, supportsBedrockToolCache, syncBudgetDerivedFields, toJsonSchema, toWireQuestion, tool, toolResultTypes, toolsCondition, truncateLocalOutput, truncateToolInput, truncateToolResultContent, tryFallbackProviders, unescapeObject, unwrapToolResponse, validateBashCommand, validateCloudflareBashCommand, validateDecisionQuestions, videosSchema, withClientTimeout, withInstructionlessHandoffCue, withIntent, withMessageRole, withoutIntent, wrapPythonForPlainExecution };
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { INTENT_PROPERTY } from "./intentArg.mjs";
|
|
2
|
+
import { DynamicStructuredTool } from "@langchain/core/tools";
|
|
3
|
+
//#region src/tools/GitHubCompare.ts
|
|
4
|
+
const GitHubCompareToolName = "github_compare";
|
|
5
|
+
const GitHubCompareToolDescription = "Read-only GitHub comparison of two full commit SHAs in a public repository. Returns the merge-base, relation and commit counts without Git, a worktree, or worker admission. Does not fetch code or execute commands. Private repositories and arbitrary URLs are not supported.";
|
|
6
|
+
const GitHubCompareToolSchema = {
|
|
7
|
+
type: "object",
|
|
8
|
+
properties: {
|
|
9
|
+
intent: { ...INTENT_PROPERTY },
|
|
10
|
+
owner: {
|
|
11
|
+
type: "string",
|
|
12
|
+
description: "GitHub repository owner."
|
|
13
|
+
},
|
|
14
|
+
repo: {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: "GitHub repository name."
|
|
17
|
+
},
|
|
18
|
+
base: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "Full lowercase base commit SHA, not a moving branch."
|
|
21
|
+
},
|
|
22
|
+
head: {
|
|
23
|
+
type: "string",
|
|
24
|
+
description: "Full lowercase head commit SHA, not a moving branch."
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
required: [
|
|
28
|
+
"owner",
|
|
29
|
+
"repo",
|
|
30
|
+
"base",
|
|
31
|
+
"head"
|
|
32
|
+
]
|
|
33
|
+
};
|
|
34
|
+
const GitHubCompareToolDefinition = {
|
|
35
|
+
name: GitHubCompareToolName,
|
|
36
|
+
description: GitHubCompareToolDescription,
|
|
37
|
+
parameters: GitHubCompareToolSchema
|
|
38
|
+
};
|
|
39
|
+
var GitHubComparisonError = class extends Error {
|
|
40
|
+
code;
|
|
41
|
+
status;
|
|
42
|
+
constructor(code, message, status) {
|
|
43
|
+
super(message);
|
|
44
|
+
this.code = code;
|
|
45
|
+
this.status = status;
|
|
46
|
+
this.name = "GitHubComparisonError";
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
const SHA = /^[a-f0-9]{40}$/;
|
|
50
|
+
const REPO = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,99}$/;
|
|
51
|
+
const MAX_RESPONSE_BYTES = 2 * 1024 * 1024;
|
|
52
|
+
function awaitWithSignal(operation, signal) {
|
|
53
|
+
signal.throwIfAborted();
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
const onAbort = () => {
|
|
56
|
+
signal.removeEventListener("abort", onAbort);
|
|
57
|
+
reject(signal.reason);
|
|
58
|
+
};
|
|
59
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
60
|
+
try {
|
|
61
|
+
operation().then((value) => {
|
|
62
|
+
signal.removeEventListener("abort", onAbort);
|
|
63
|
+
resolve(value);
|
|
64
|
+
}, (error) => {
|
|
65
|
+
signal.removeEventListener("abort", onAbort);
|
|
66
|
+
reject(error);
|
|
67
|
+
});
|
|
68
|
+
} catch (error) {
|
|
69
|
+
signal.removeEventListener("abort", onAbort);
|
|
70
|
+
reject(error);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
function cancelBody(response) {
|
|
75
|
+
response.body?.cancel().catch(() => void 0);
|
|
76
|
+
}
|
|
77
|
+
async function readResponse(response, signal) {
|
|
78
|
+
const reader = response.body?.getReader();
|
|
79
|
+
if (reader == null) throw new GitHubComparisonError("INVALID_RESPONSE", "GitHub comparison returned an invalid response.");
|
|
80
|
+
const chunks = [];
|
|
81
|
+
let bytes = 0;
|
|
82
|
+
try {
|
|
83
|
+
for (;;) {
|
|
84
|
+
const item = await awaitWithSignal(() => reader.read(), signal);
|
|
85
|
+
if (item.done) break;
|
|
86
|
+
bytes += item.value.byteLength;
|
|
87
|
+
if (bytes > MAX_RESPONSE_BYTES) throw new GitHubComparisonError("RESPONSE_TOO_LARGE", "GitHub comparison response exceeded its bound.");
|
|
88
|
+
chunks.push(item.value);
|
|
89
|
+
}
|
|
90
|
+
return Buffer.concat(chunks, bytes).toString("utf8");
|
|
91
|
+
} finally {
|
|
92
|
+
reader.cancel().catch(() => void 0);
|
|
93
|
+
reader.releaseLock();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
function parseComparison(text, input) {
|
|
97
|
+
let data;
|
|
98
|
+
try {
|
|
99
|
+
data = JSON.parse(text);
|
|
100
|
+
} catch {
|
|
101
|
+
throw new GitHubComparisonError("INVALID_RESPONSE", "GitHub comparison returned an invalid response.");
|
|
102
|
+
}
|
|
103
|
+
const mergeBase = data?.merge_base_commit?.sha;
|
|
104
|
+
const status = data?.status;
|
|
105
|
+
const aheadBy = data?.ahead_by;
|
|
106
|
+
const behindBy = data?.behind_by;
|
|
107
|
+
const totalCommits = data?.total_commits;
|
|
108
|
+
if (data?.base_commit?.sha !== input.base || typeof mergeBase !== "string" || !SHA.test(mergeBase) || status !== "ahead" && status !== "behind" && status !== "identical" && status !== "diverged" || typeof aheadBy !== "number" || !Number.isSafeInteger(aheadBy) || aheadBy < 0 || typeof behindBy !== "number" || !Number.isSafeInteger(behindBy) || behindBy < 0 || typeof totalCommits !== "number" || !Number.isSafeInteger(totalCommits) || totalCommits < 0) throw new GitHubComparisonError("INVALID_RESPONSE", "GitHub comparison returned an invalid response.");
|
|
109
|
+
return {
|
|
110
|
+
base: input.base,
|
|
111
|
+
head: input.head,
|
|
112
|
+
mergeBase,
|
|
113
|
+
status,
|
|
114
|
+
aheadBy,
|
|
115
|
+
behindBy,
|
|
116
|
+
totalCommits
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async function compareGitHubCommits(input, options, signal) {
|
|
120
|
+
signal?.throwIfAborted();
|
|
121
|
+
if (typeof input.owner !== "string" || !REPO.test(input.owner) || typeof input.repo !== "string" || !REPO.test(input.repo) || typeof input.base !== "string" || !SHA.test(input.base) || typeof input.head !== "string" || !SHA.test(input.head)) throw new GitHubComparisonError("INVALID_INPUT", "Supply a repository and full lowercase commit SHAs.");
|
|
122
|
+
const timeoutMs = options.timeoutMs ?? 1e4;
|
|
123
|
+
if (typeof options.fetch !== "function" || !Number.isSafeInteger(timeoutMs) || timeoutMs < 1 || timeoutMs > 3e4) throw new GitHubComparisonError("INVALID_CONFIGURATION", "Supply a GitHub transport and a timeout between 1 and 30000 ms.");
|
|
124
|
+
const timeout = new AbortController();
|
|
125
|
+
const timer = setTimeout(() => timeout.abort(new DOMException("GitHub comparison timed out.", "TimeoutError")), timeoutMs);
|
|
126
|
+
timer.unref();
|
|
127
|
+
let pendingResponse;
|
|
128
|
+
const requestSignal = signal == null ? timeout.signal : AbortSignal.any([signal, timeout.signal]);
|
|
129
|
+
try {
|
|
130
|
+
const response = await awaitWithSignal(() => options.fetch(`https://api.github.com/repos/${encodeURIComponent(input.owner)}/${encodeURIComponent(input.repo)}/compare/${input.base}...${input.head}?per_page=1&page=2`, {
|
|
131
|
+
method: "GET",
|
|
132
|
+
redirect: "error",
|
|
133
|
+
credentials: "omit",
|
|
134
|
+
signal: requestSignal,
|
|
135
|
+
headers: {
|
|
136
|
+
Accept: "application/vnd.github+json",
|
|
137
|
+
"X-GitHub-Api-Version": "2022-11-28"
|
|
138
|
+
}
|
|
139
|
+
}).then((response) => {
|
|
140
|
+
pendingResponse = response;
|
|
141
|
+
if (requestSignal.aborted) {
|
|
142
|
+
pendingResponse = void 0;
|
|
143
|
+
cancelBody(response);
|
|
144
|
+
requestSignal.throwIfAborted();
|
|
145
|
+
}
|
|
146
|
+
return response;
|
|
147
|
+
}), requestSignal);
|
|
148
|
+
if (!response.ok) throw new GitHubComparisonError("HTTP_ERROR", `GitHub comparison unavailable (HTTP ${response.status}).`, response.status);
|
|
149
|
+
pendingResponse = void 0;
|
|
150
|
+
const text = await readResponse(response, requestSignal);
|
|
151
|
+
requestSignal.throwIfAborted();
|
|
152
|
+
return parseComparison(text, input);
|
|
153
|
+
} catch (error) {
|
|
154
|
+
requestSignal.throwIfAborted();
|
|
155
|
+
if (error instanceof GitHubComparisonError) throw error;
|
|
156
|
+
throw new GitHubComparisonError("TRANSPORT_ERROR", "GitHub comparison transport failed.");
|
|
157
|
+
} finally {
|
|
158
|
+
if (pendingResponse != null) cancelBody(pendingResponse);
|
|
159
|
+
clearTimeout(timer);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
var GitHubCompareTool = class extends DynamicStructuredTool {
|
|
163
|
+
constructor(options) {
|
|
164
|
+
super({
|
|
165
|
+
name: GitHubCompareToolName,
|
|
166
|
+
description: GitHubCompareToolDescription,
|
|
167
|
+
schema: structuredClone(GitHubCompareToolSchema),
|
|
168
|
+
func: async (input, _manager, config) => JSON.stringify(await compareGitHubCommits(input, options, config?.signal))
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
//#endregion
|
|
173
|
+
export { GitHubCompareTool, GitHubCompareToolDefinition, GitHubCompareToolDescription, GitHubCompareToolName, GitHubCompareToolSchema, GitHubComparisonError, compareGitHubCommits };
|
|
174
|
+
|
|
175
|
+
//# sourceMappingURL=GitHubCompare.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitHubCompare.mjs","names":[],"sources":["../../../src/tools/GitHubCompare.ts"],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export * from './graphs';
|
|
|
7
7
|
export * from './agents/projection';
|
|
8
8
|
export * from './summarization';
|
|
9
9
|
export * from './tools/Calculator';
|
|
10
|
+
export * from './tools/GitHubCompare';
|
|
10
11
|
export * from './tools/CodeExecutor';
|
|
11
12
|
export * from './tools/BashExecutor';
|
|
12
13
|
export * from './tools/ProgrammaticToolCalling';
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { DynamicStructuredTool } from '@langchain/core/tools';
|
|
2
|
+
export declare const GitHubCompareToolName = "github_compare";
|
|
3
|
+
export declare const GitHubCompareToolDescription = "Read-only GitHub comparison of two full commit SHAs in a public repository. Returns the merge-base, relation and commit counts without Git, a worktree, or worker admission. Does not fetch code or execute commands. Private repositories and arbitrary URLs are not supported.";
|
|
4
|
+
export declare const GitHubCompareToolSchema: {
|
|
5
|
+
readonly type: "object";
|
|
6
|
+
readonly properties: {
|
|
7
|
+
readonly intent: {
|
|
8
|
+
readonly type: "string" | "number" | "integer" | "float" | "boolean" | "array" | "object";
|
|
9
|
+
readonly enum?: string[];
|
|
10
|
+
readonly items?: import("..").JsonSchemaType;
|
|
11
|
+
readonly properties?: Record<string, import("..").JsonSchemaType>;
|
|
12
|
+
readonly required?: string[];
|
|
13
|
+
readonly description?: string;
|
|
14
|
+
readonly pattern?: string;
|
|
15
|
+
readonly maxLength?: number;
|
|
16
|
+
readonly additionalProperties?: boolean | import("..").JsonSchemaType;
|
|
17
|
+
};
|
|
18
|
+
readonly owner: {
|
|
19
|
+
readonly type: "string";
|
|
20
|
+
readonly description: "GitHub repository owner.";
|
|
21
|
+
};
|
|
22
|
+
readonly repo: {
|
|
23
|
+
readonly type: "string";
|
|
24
|
+
readonly description: "GitHub repository name.";
|
|
25
|
+
};
|
|
26
|
+
readonly base: {
|
|
27
|
+
readonly type: "string";
|
|
28
|
+
readonly description: "Full lowercase base commit SHA, not a moving branch.";
|
|
29
|
+
};
|
|
30
|
+
readonly head: {
|
|
31
|
+
readonly type: "string";
|
|
32
|
+
readonly description: "Full lowercase head commit SHA, not a moving branch.";
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
readonly required: readonly ["owner", "repo", "base", "head"];
|
|
36
|
+
};
|
|
37
|
+
export declare const GitHubCompareToolDefinition: {
|
|
38
|
+
readonly name: "github_compare";
|
|
39
|
+
readonly description: "Read-only GitHub comparison of two full commit SHAs in a public repository. Returns the merge-base, relation and commit counts without Git, a worktree, or worker admission. Does not fetch code or execute commands. Private repositories and arbitrary URLs are not supported.";
|
|
40
|
+
readonly parameters: {
|
|
41
|
+
readonly type: "object";
|
|
42
|
+
readonly properties: {
|
|
43
|
+
readonly intent: {
|
|
44
|
+
readonly type: "string" | "number" | "integer" | "float" | "boolean" | "array" | "object";
|
|
45
|
+
readonly enum?: string[];
|
|
46
|
+
readonly items?: import("..").JsonSchemaType;
|
|
47
|
+
readonly properties?: Record<string, import("..").JsonSchemaType>;
|
|
48
|
+
readonly required?: string[];
|
|
49
|
+
readonly description?: string;
|
|
50
|
+
readonly pattern?: string;
|
|
51
|
+
readonly maxLength?: number;
|
|
52
|
+
readonly additionalProperties?: boolean | import("..").JsonSchemaType;
|
|
53
|
+
};
|
|
54
|
+
readonly owner: {
|
|
55
|
+
readonly type: "string";
|
|
56
|
+
readonly description: "GitHub repository owner.";
|
|
57
|
+
};
|
|
58
|
+
readonly repo: {
|
|
59
|
+
readonly type: "string";
|
|
60
|
+
readonly description: "GitHub repository name.";
|
|
61
|
+
};
|
|
62
|
+
readonly base: {
|
|
63
|
+
readonly type: "string";
|
|
64
|
+
readonly description: "Full lowercase base commit SHA, not a moving branch.";
|
|
65
|
+
};
|
|
66
|
+
readonly head: {
|
|
67
|
+
readonly type: "string";
|
|
68
|
+
readonly description: "Full lowercase head commit SHA, not a moving branch.";
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
readonly required: readonly ["owner", "repo", "base", "head"];
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
export interface GitHubComparisonInput {
|
|
75
|
+
owner: string;
|
|
76
|
+
repo: string;
|
|
77
|
+
base: string;
|
|
78
|
+
head: string;
|
|
79
|
+
}
|
|
80
|
+
export interface GitHubComparison {
|
|
81
|
+
base: string;
|
|
82
|
+
head: string;
|
|
83
|
+
mergeBase: string;
|
|
84
|
+
status: 'ahead' | 'behind' | 'identical' | 'diverged';
|
|
85
|
+
aheadBy: number;
|
|
86
|
+
behindBy: number;
|
|
87
|
+
totalCommits: number;
|
|
88
|
+
}
|
|
89
|
+
export interface GitHubCompareOptions {
|
|
90
|
+
/** Caller-owned transport, including proxy and instrumentation policy. */
|
|
91
|
+
fetch: typeof fetch;
|
|
92
|
+
/** Entire request budget, including body reads. Defaults to 10 seconds; maximum 30 seconds. */
|
|
93
|
+
timeoutMs?: number;
|
|
94
|
+
}
|
|
95
|
+
export type GitHubComparisonErrorCode = 'INVALID_INPUT' | 'INVALID_CONFIGURATION' | 'HTTP_ERROR' | 'INVALID_RESPONSE' | 'RESPONSE_TOO_LARGE' | 'TRANSPORT_ERROR';
|
|
96
|
+
export declare class GitHubComparisonError extends Error {
|
|
97
|
+
readonly code: GitHubComparisonErrorCode;
|
|
98
|
+
readonly status?: number | undefined;
|
|
99
|
+
constructor(code: GitHubComparisonErrorCode, message: string, status?: number | undefined);
|
|
100
|
+
}
|
|
101
|
+
export declare function compareGitHubCommits(input: GitHubComparisonInput, options: GitHubCompareOptions, signal?: AbortSignal): Promise<GitHubComparison>;
|
|
102
|
+
export declare class GitHubCompareTool extends DynamicStructuredTool {
|
|
103
|
+
constructor(options: GitHubCompareOptions);
|
|
104
|
+
}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -16,6 +16,7 @@ export * from './summarization';
|
|
|
16
16
|
|
|
17
17
|
/* Tools */
|
|
18
18
|
export * from './tools/Calculator';
|
|
19
|
+
export * from './tools/GitHubCompare';
|
|
19
20
|
export * from './tools/CodeExecutor';
|
|
20
21
|
export * from './tools/BashExecutor';
|
|
21
22
|
export * from './tools/ProgrammaticToolCalling';
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import { DynamicStructuredTool } from '@langchain/core/tools';
|
|
2
|
+
import { INTENT_PROPERTY } from '@/tools/intentArg';
|
|
3
|
+
|
|
4
|
+
export const GitHubCompareToolName = 'github_compare';
|
|
5
|
+
export const GitHubCompareToolDescription =
|
|
6
|
+
'Read-only GitHub comparison of two full commit SHAs in a public repository. Returns the merge-base, relation and commit counts without Git, a worktree, or worker admission. Does not fetch code or execute commands. Private repositories and arbitrary URLs are not supported.';
|
|
7
|
+
export const GitHubCompareToolSchema = {
|
|
8
|
+
type: 'object',
|
|
9
|
+
properties: {
|
|
10
|
+
intent: { ...INTENT_PROPERTY },
|
|
11
|
+
owner: { type: 'string', description: 'GitHub repository owner.' },
|
|
12
|
+
repo: { type: 'string', description: 'GitHub repository name.' },
|
|
13
|
+
base: {
|
|
14
|
+
type: 'string',
|
|
15
|
+
description: 'Full lowercase base commit SHA, not a moving branch.',
|
|
16
|
+
},
|
|
17
|
+
head: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
description: 'Full lowercase head commit SHA, not a moving branch.',
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
required: ['owner', 'repo', 'base', 'head'],
|
|
23
|
+
} as const;
|
|
24
|
+
export const GitHubCompareToolDefinition = {
|
|
25
|
+
name: GitHubCompareToolName,
|
|
26
|
+
description: GitHubCompareToolDescription,
|
|
27
|
+
parameters: GitHubCompareToolSchema,
|
|
28
|
+
} as const;
|
|
29
|
+
|
|
30
|
+
export interface GitHubComparisonInput {
|
|
31
|
+
owner: string;
|
|
32
|
+
repo: string;
|
|
33
|
+
base: string;
|
|
34
|
+
head: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface GitHubComparison {
|
|
38
|
+
base: string;
|
|
39
|
+
head: string;
|
|
40
|
+
mergeBase: string;
|
|
41
|
+
status: 'ahead' | 'behind' | 'identical' | 'diverged';
|
|
42
|
+
aheadBy: number;
|
|
43
|
+
behindBy: number;
|
|
44
|
+
totalCommits: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export interface GitHubCompareOptions {
|
|
48
|
+
/** Caller-owned transport, including proxy and instrumentation policy. */
|
|
49
|
+
fetch: typeof fetch;
|
|
50
|
+
/** Entire request budget, including body reads. Defaults to 10 seconds; maximum 30 seconds. */
|
|
51
|
+
timeoutMs?: number;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export type GitHubComparisonErrorCode =
|
|
55
|
+
| 'INVALID_INPUT'
|
|
56
|
+
| 'INVALID_CONFIGURATION'
|
|
57
|
+
| 'HTTP_ERROR'
|
|
58
|
+
| 'INVALID_RESPONSE'
|
|
59
|
+
| 'RESPONSE_TOO_LARGE'
|
|
60
|
+
| 'TRANSPORT_ERROR';
|
|
61
|
+
|
|
62
|
+
export class GitHubComparisonError extends Error {
|
|
63
|
+
constructor(
|
|
64
|
+
public readonly code: GitHubComparisonErrorCode,
|
|
65
|
+
message: string,
|
|
66
|
+
public readonly status?: number
|
|
67
|
+
) {
|
|
68
|
+
super(message);
|
|
69
|
+
this.name = 'GitHubComparisonError';
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
interface GitHubComparisonResponse {
|
|
74
|
+
base_commit?: { sha?: string };
|
|
75
|
+
merge_base_commit?: { sha?: string };
|
|
76
|
+
status?: GitHubComparison['status'];
|
|
77
|
+
ahead_by?: number;
|
|
78
|
+
behind_by?: number;
|
|
79
|
+
total_commits?: number;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const SHA = /^[a-f0-9]{40}$/;
|
|
83
|
+
const REPO = /^[A-Za-z0-9][A-Za-z0-9_.-]{0,99}$/;
|
|
84
|
+
const MAX_RESPONSE_BYTES = 2 * 1024 * 1024;
|
|
85
|
+
|
|
86
|
+
function awaitWithSignal<T>(
|
|
87
|
+
operation: () => Promise<T>,
|
|
88
|
+
signal: AbortSignal
|
|
89
|
+
): Promise<T> {
|
|
90
|
+
signal.throwIfAborted();
|
|
91
|
+
return new Promise<T>((resolve, reject) => {
|
|
92
|
+
const onAbort = (): void => {
|
|
93
|
+
signal.removeEventListener('abort', onAbort);
|
|
94
|
+
reject(signal.reason);
|
|
95
|
+
};
|
|
96
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
97
|
+
try {
|
|
98
|
+
operation().then(
|
|
99
|
+
(value) => {
|
|
100
|
+
signal.removeEventListener('abort', onAbort);
|
|
101
|
+
resolve(value);
|
|
102
|
+
},
|
|
103
|
+
(error) => {
|
|
104
|
+
signal.removeEventListener('abort', onAbort);
|
|
105
|
+
reject(error);
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
} catch (error) {
|
|
109
|
+
signal.removeEventListener('abort', onAbort);
|
|
110
|
+
reject(error);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function cancelBody(response: Response): void {
|
|
116
|
+
void response.body?.cancel().catch(() => undefined);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
async function readResponse(
|
|
120
|
+
response: Response,
|
|
121
|
+
signal: AbortSignal
|
|
122
|
+
): Promise<string> {
|
|
123
|
+
const reader = response.body?.getReader();
|
|
124
|
+
if (reader == null) {
|
|
125
|
+
throw new GitHubComparisonError(
|
|
126
|
+
'INVALID_RESPONSE',
|
|
127
|
+
'GitHub comparison returned an invalid response.'
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
const chunks: Uint8Array[] = [];
|
|
131
|
+
let bytes = 0;
|
|
132
|
+
try {
|
|
133
|
+
for (;;) {
|
|
134
|
+
const item = await awaitWithSignal(() => reader.read(), signal);
|
|
135
|
+
if (item.done) {
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
bytes += item.value.byteLength;
|
|
139
|
+
if (bytes > MAX_RESPONSE_BYTES) {
|
|
140
|
+
throw new GitHubComparisonError(
|
|
141
|
+
'RESPONSE_TOO_LARGE',
|
|
142
|
+
'GitHub comparison response exceeded its bound.'
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
chunks.push(item.value);
|
|
146
|
+
}
|
|
147
|
+
return Buffer.concat(chunks, bytes).toString('utf8');
|
|
148
|
+
} finally {
|
|
149
|
+
void reader.cancel().catch(() => undefined);
|
|
150
|
+
reader.releaseLock();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function parseComparison(
|
|
155
|
+
text: string,
|
|
156
|
+
input: GitHubComparisonInput
|
|
157
|
+
): GitHubComparison {
|
|
158
|
+
let data: GitHubComparisonResponse | null;
|
|
159
|
+
try {
|
|
160
|
+
data = JSON.parse(text) as GitHubComparisonResponse | null;
|
|
161
|
+
} catch {
|
|
162
|
+
throw new GitHubComparisonError(
|
|
163
|
+
'INVALID_RESPONSE',
|
|
164
|
+
'GitHub comparison returned an invalid response.'
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
const mergeBase = data?.merge_base_commit?.sha;
|
|
168
|
+
const status = data?.status;
|
|
169
|
+
const aheadBy = data?.ahead_by;
|
|
170
|
+
const behindBy = data?.behind_by;
|
|
171
|
+
const totalCommits = data?.total_commits;
|
|
172
|
+
if (
|
|
173
|
+
data?.base_commit?.sha !== input.base ||
|
|
174
|
+
typeof mergeBase !== 'string' ||
|
|
175
|
+
!SHA.test(mergeBase) ||
|
|
176
|
+
(status !== 'ahead' &&
|
|
177
|
+
status !== 'behind' &&
|
|
178
|
+
status !== 'identical' &&
|
|
179
|
+
status !== 'diverged') ||
|
|
180
|
+
typeof aheadBy !== 'number' ||
|
|
181
|
+
!Number.isSafeInteger(aheadBy) ||
|
|
182
|
+
aheadBy < 0 ||
|
|
183
|
+
typeof behindBy !== 'number' ||
|
|
184
|
+
!Number.isSafeInteger(behindBy) ||
|
|
185
|
+
behindBy < 0 ||
|
|
186
|
+
typeof totalCommits !== 'number' ||
|
|
187
|
+
!Number.isSafeInteger(totalCommits) ||
|
|
188
|
+
totalCommits < 0
|
|
189
|
+
) {
|
|
190
|
+
throw new GitHubComparisonError(
|
|
191
|
+
'INVALID_RESPONSE',
|
|
192
|
+
'GitHub comparison returned an invalid response.'
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
base: input.base,
|
|
197
|
+
head: input.head,
|
|
198
|
+
mergeBase,
|
|
199
|
+
status,
|
|
200
|
+
aheadBy,
|
|
201
|
+
behindBy,
|
|
202
|
+
totalCommits,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
export async function compareGitHubCommits(
|
|
207
|
+
input: GitHubComparisonInput,
|
|
208
|
+
options: GitHubCompareOptions,
|
|
209
|
+
signal?: AbortSignal
|
|
210
|
+
): Promise<GitHubComparison> {
|
|
211
|
+
signal?.throwIfAborted();
|
|
212
|
+
if (
|
|
213
|
+
typeof input.owner !== 'string' ||
|
|
214
|
+
!REPO.test(input.owner) ||
|
|
215
|
+
typeof input.repo !== 'string' ||
|
|
216
|
+
!REPO.test(input.repo) ||
|
|
217
|
+
typeof input.base !== 'string' ||
|
|
218
|
+
!SHA.test(input.base) ||
|
|
219
|
+
typeof input.head !== 'string' ||
|
|
220
|
+
!SHA.test(input.head)
|
|
221
|
+
) {
|
|
222
|
+
throw new GitHubComparisonError(
|
|
223
|
+
'INVALID_INPUT',
|
|
224
|
+
'Supply a repository and full lowercase commit SHAs.'
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
const timeoutMs = options.timeoutMs ?? 10000;
|
|
228
|
+
if (
|
|
229
|
+
typeof options.fetch !== 'function' ||
|
|
230
|
+
!Number.isSafeInteger(timeoutMs) ||
|
|
231
|
+
timeoutMs < 1 ||
|
|
232
|
+
timeoutMs > 30000
|
|
233
|
+
) {
|
|
234
|
+
throw new GitHubComparisonError(
|
|
235
|
+
'INVALID_CONFIGURATION',
|
|
236
|
+
'Supply a GitHub transport and a timeout between 1 and 30000 ms.'
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
const timeout = new AbortController();
|
|
240
|
+
const timer = setTimeout(
|
|
241
|
+
() =>
|
|
242
|
+
timeout.abort(
|
|
243
|
+
new DOMException('GitHub comparison timed out.', 'TimeoutError')
|
|
244
|
+
),
|
|
245
|
+
timeoutMs
|
|
246
|
+
);
|
|
247
|
+
timer.unref();
|
|
248
|
+
let pendingResponse: Response | undefined;
|
|
249
|
+
const requestSignal =
|
|
250
|
+
signal == null ? timeout.signal : AbortSignal.any([signal, timeout.signal]);
|
|
251
|
+
try {
|
|
252
|
+
const response = await awaitWithSignal(
|
|
253
|
+
() =>
|
|
254
|
+
options
|
|
255
|
+
.fetch(
|
|
256
|
+
`https://api.github.com/repos/${encodeURIComponent(input.owner)}/${encodeURIComponent(input.repo)}/compare/${input.base}...${input.head}?per_page=1&page=2`,
|
|
257
|
+
{
|
|
258
|
+
method: 'GET',
|
|
259
|
+
redirect: 'error',
|
|
260
|
+
credentials: 'omit',
|
|
261
|
+
signal: requestSignal,
|
|
262
|
+
headers: {
|
|
263
|
+
Accept: 'application/vnd.github+json',
|
|
264
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
265
|
+
},
|
|
266
|
+
}
|
|
267
|
+
)
|
|
268
|
+
.then((response) => {
|
|
269
|
+
pendingResponse = response;
|
|
270
|
+
if (requestSignal.aborted) {
|
|
271
|
+
pendingResponse = undefined;
|
|
272
|
+
cancelBody(response);
|
|
273
|
+
requestSignal.throwIfAborted();
|
|
274
|
+
}
|
|
275
|
+
return response;
|
|
276
|
+
}),
|
|
277
|
+
requestSignal
|
|
278
|
+
);
|
|
279
|
+
if (!response.ok) {
|
|
280
|
+
throw new GitHubComparisonError(
|
|
281
|
+
'HTTP_ERROR',
|
|
282
|
+
`GitHub comparison unavailable (HTTP ${response.status}).`,
|
|
283
|
+
response.status
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
pendingResponse = undefined;
|
|
287
|
+
const text = await readResponse(response, requestSignal);
|
|
288
|
+
requestSignal.throwIfAborted();
|
|
289
|
+
return parseComparison(text, input);
|
|
290
|
+
} catch (error) {
|
|
291
|
+
requestSignal.throwIfAborted();
|
|
292
|
+
if (error instanceof GitHubComparisonError) {
|
|
293
|
+
throw error;
|
|
294
|
+
}
|
|
295
|
+
throw new GitHubComparisonError(
|
|
296
|
+
'TRANSPORT_ERROR',
|
|
297
|
+
'GitHub comparison transport failed.'
|
|
298
|
+
);
|
|
299
|
+
} finally {
|
|
300
|
+
if (pendingResponse != null) {
|
|
301
|
+
cancelBody(pendingResponse);
|
|
302
|
+
}
|
|
303
|
+
clearTimeout(timer);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export class GitHubCompareTool extends DynamicStructuredTool {
|
|
308
|
+
constructor(options: GitHubCompareOptions) {
|
|
309
|
+
super({
|
|
310
|
+
name: GitHubCompareToolName,
|
|
311
|
+
description: GitHubCompareToolDescription,
|
|
312
|
+
schema: structuredClone(GitHubCompareToolSchema),
|
|
313
|
+
func: async (input: GitHubComparisonInput, _manager, config) =>
|
|
314
|
+
JSON.stringify(
|
|
315
|
+
await compareGitHubCommits(input, options, config?.signal)
|
|
316
|
+
),
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
}
|