@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 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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"}
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@librechat/agents",
3
- "version": "4.0.3",
3
+ "version": "4.0.4",
4
4
  "reova": {
5
5
  "enabled": true,
6
6
  "endpoint": "https://telemetry.reo.dev/data"
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
+ }