zidane 5.12.3 → 5.12.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/README.md +6 -5
- package/dist/{agent-Dt3mALPV.d.ts → agent-CVTAoYS0.d.ts} +33 -2
- package/dist/agent-CVTAoYS0.d.ts.map +1 -0
- package/dist/chat/pure.d.ts +3 -3
- package/dist/chat.d.ts +6 -6
- package/dist/chat.js +2 -2
- package/dist/contexts/e2b.d.ts +1 -1
- package/dist/eval.d.ts +1 -1
- package/dist/eval.js +1 -1
- package/dist/{headless-B5DioBQc.js → headless-DM5JeUiE.js} +3 -3
- package/dist/{headless-B5DioBQc.js.map → headless-DM5JeUiE.js.map} +1 -1
- package/dist/headless.d.ts +1 -1
- package/dist/headless.js +1 -1
- package/dist/{index-Do7IZGW5.d.ts → index-BuIaw3r3.d.ts} +2 -2
- package/dist/{index-Do7IZGW5.d.ts.map → index-BuIaw3r3.d.ts.map} +1 -1
- package/dist/{index-BDRh3kup.d.ts → index-Gin_mFQJ.d.ts} +2 -2
- package/dist/{index-BDRh3kup.d.ts.map → index-Gin_mFQJ.d.ts.map} +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +5 -5
- package/dist/{logger-C2E41UWq.d.ts → logger-CYtWKlBF.d.ts} +2 -2
- package/dist/{logger-C2E41UWq.d.ts.map → logger-CYtWKlBF.d.ts.map} +1 -1
- package/dist/mcp.d.ts +1 -1
- package/dist/output/stream-json.d.ts +2 -2
- package/dist/output/stream-json.js +1 -1
- package/dist/output/terminal.d.ts +2 -2
- package/dist/{presets-BclGpr8z.js → presets-BorC0fVx.js} +2 -2
- package/dist/{presets-BclGpr8z.js.map → presets-BorC0fVx.js.map} +1 -1
- package/dist/presets.d.ts +2 -2
- package/dist/presets.js +1 -1
- package/dist/{providers-psx2_0LB.js → providers-C_zClj1S.js} +338 -8
- package/dist/providers-C_zClj1S.js.map +1 -0
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +2 -2
- package/dist/restate.d.ts +1 -1
- package/dist/session/sqlite.d.ts +1 -1
- package/dist/session.d.ts +1 -1
- package/dist/skills.d.ts +2 -2
- package/dist/{tool-formatters-COmtAwgF.d.ts → tool-formatters-Chwpa2Ix.d.ts} +2 -2
- package/dist/tool-formatters-Chwpa2Ix.d.ts.map +1 -0
- package/dist/tools/fetch-url.d.ts +1 -1
- package/dist/tools/web-search.d.ts +1 -1
- package/dist/{tools-CDRigwVk.js → tools-BlMV33N1.js} +45 -2
- package/dist/tools-BlMV33N1.js.map +1 -0
- package/dist/tools.d.ts +2 -2
- package/dist/tools.js +1 -1
- package/dist/{transcript-anchors-DtUXs5ZT.js → transcript-anchors-D2zBge6D.js} +4 -4
- package/dist/{transcript-anchors-DtUXs5ZT.js.map → transcript-anchors-D2zBge6D.js.map} +1 -1
- package/dist/{transcript-anchors-DLa8m9_E.d.ts → transcript-anchors-LMTpzn6r.d.ts} +5 -5
- package/dist/{transcript-anchors-DLa8m9_E.d.ts.map → transcript-anchors-LMTpzn6r.d.ts.map} +1 -1
- package/dist/tui.d.ts +3 -3
- package/dist/tui.js +3 -3
- package/dist/{turn-operations-ifKg5muR.d.ts → turn-operations-DyOAiVE3.d.ts} +3 -3
- package/dist/{turn-operations-ifKg5muR.d.ts.map → turn-operations-DyOAiVE3.d.ts.map} +1 -1
- package/dist/types.d.ts +2 -2
- package/package.json +1 -1
- package/dist/agent-Dt3mALPV.d.ts.map +0 -1
- package/dist/providers-psx2_0LB.js.map +0 -1
- package/dist/tool-formatters-COmtAwgF.d.ts.map +0 -1
- package/dist/tools-CDRigwVk.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { A as PERSISTENCE_PREVIEW_BYTES, C as stableStringify, D as TOOL_USE_SKIPPED_MESSAGE, E as TOOL_USE_CANCELLED_MESSAGE, F as resolvePersistDir, I as resolveTasksDir, M as cleanupPersistedSession, N as maybePersistToolResult, O as validateToolArgs, S as normalizeShellCommand, T as SHELL_CASCADE_CANCEL_MESSAGE, _ as createSkillsReadTool, a as multiEdit, b as defaultRepeatGuardNormalize, c as grep, d as createAgent, g as createSkillsRunScriptTool, h as createSkillsUseTool, j as buildPersistedStub, k as PERSISTED_STUB_PREFIX, l as glob, n as createSpawnTool, p as waitTask, s as createInteractionTool, u as edit, v as createShellTool, w as INTERRUPT_MESSAGE_FOR_TOOL_USE, x as defaultRepeatGuardTracked } from "./tools-
|
|
1
|
+
import { A as PERSISTENCE_PREVIEW_BYTES, C as stableStringify, D as TOOL_USE_SKIPPED_MESSAGE, E as TOOL_USE_CANCELLED_MESSAGE, F as resolvePersistDir, I as resolveTasksDir, M as cleanupPersistedSession, N as maybePersistToolResult, O as validateToolArgs, S as normalizeShellCommand, T as SHELL_CASCADE_CANCEL_MESSAGE, _ as createSkillsReadTool, a as multiEdit, b as defaultRepeatGuardNormalize, c as grep, d as createAgent, g as createSkillsRunScriptTool, h as createSkillsUseTool, j as buildPersistedStub, k as PERSISTED_STUB_PREFIX, l as glob, n as createSpawnTool, p as waitTask, s as createInteractionTool, u as edit, v as createShellTool, w as INTERRUPT_MESSAGE_FOR_TOOL_USE, x as defaultRepeatGuardTracked } from "./tools-BlMV33N1.js";
|
|
2
2
|
import { n as estimateTokens, r as utf8ByteLength, t as BYTES_PER_TOKEN } from "./utils-ngQzYzZD.js";
|
|
3
|
-
import {
|
|
3
|
+
import { a as local, f as arcee, i as openai, l as cerebras, m as applyAnthropicCacheBreakpoints, p as anthropic, r as openrouter, t as xai, u as baseten } from "./providers-C_zClj1S.js";
|
|
4
4
|
import { a as AgentToolNotAllowedError, f as matchesContextExceeded, i as AgentProviderError, l as errorMessage, m as toTypedError, n as AgentBudgetExceededError, o as AgentToolPairingError, r as AgentContextExceededError, s as CONTEXT_EXCEEDED_MESSAGE_PATTERNS, t as AgentAbortedError } from "./errors-BpPfMo_4.js";
|
|
5
5
|
import { A as joinSystemPrompt, C as sanitizeToolSchema, D as appendDynamicSection, E as SYSTEM_PROMPT_BOUNDARY, M as replaceDynamicSection, N as splitSystemPrompt, O as appendStaticSection, a as detectTurnInterruption, b as openaiCompat, c as filterUnresolvedToolUses, d as remintDuplicateToolCallIds, g as OpenAICompatHttpError, h as toWireMessages, i as autoDetectAndConvert, j as renderSystemForWire, k as hasSystemPromptBoundary, l as fromAnthropic, m as toOpenAI, n as SYNTHETIC_TOOL_RESULT_PLACEHOLDER, o as ensureEndsWithUserMessage, p as toAnthropic, r as TOOL_USE_INTERRUPTED_MARKER, s as ensureToolResultPairing, t as ORPHANED_TOOL_RESULT_MARKER, u as fromOpenAI, v as classifyOpenAICompatError, w as sanitizeToolSpecs, y as mapOAIFinishReason } from "./messages-9wyCuvLF.js";
|
|
6
6
|
import { a as toolOutputByteLength, i as toolOutputBudgetByteLength, o as toolResultToText } from "./types-DxHDaqN7.js";
|
|
@@ -10,8 +10,8 @@ import { _ as validateResourcePath, a as writeSkillsToDisk, b as validateSkillNa
|
|
|
10
10
|
import { a as resultToString, c as McpOAuthProvider, i as normalizeMcpServers, l as createMemoryMcpCredentialStore, n as connectMcpServers, r as normalizeMcpBlocks, u as hasAuthorizationHeader } from "./mcp-Bnnrt_Ps.js";
|
|
11
11
|
import { i as statsByModel, n as flattenTurns } from "./stats-DAKBEKjc.js";
|
|
12
12
|
import { C as CompactPromptTooLongError, S as CompactInvalidInputError, _ as anchorPreviewFor, a as selectFilesFromSession, b as summaryToTurn, c as BASE_INSTRUCTIONS, d as buildCompactPrompt, f as buildFromCompactPrompt, g as ANCHOR_PREVIEW_MAX_CHARS, h as buildUpToCompactPrompt, i as selectFilesFromReadState, l as NO_TOOLS_PREAMBLE, m as buildTailCompactPrompt, n as startOAuthCallback, o as selectRecentFiles, p as buildFullCompactPrompt, r as buildPostCompactAttachments, s as compactConversation, t as loginMcpServer, u as TRAILER, v as sliceForCompaction, x as truncateHeadForPtlRetry, y as stripImagesFromTurns } from "./login-94imBv_3.js";
|
|
13
|
-
import { i as basic_default, n as definePreset, r as basicTools } from "./presets-
|
|
14
|
-
import { a as headlessEventToJsonl, c as runHeadless, d as createRunSummaryCollector, l as transcriptToOpenAIMessages } from "./headless-
|
|
13
|
+
import { i as basic_default, n as definePreset, r as basicTools } from "./presets-BorC0fVx.js";
|
|
14
|
+
import { a as headlessEventToJsonl, c as runHeadless, d as createRunSummaryCollector, l as transcriptToOpenAIMessages } from "./headless-DM5JeUiE.js";
|
|
15
15
|
import { a as createMemoryStore, i as createRemoteStore, o as createFileMapStore, r as loadSession, t as createSession } from "./session-CB23Ne0_.js";
|
|
16
16
|
import { EFFICIENCY_METRICS, EvalMetricError, artifactPath, buildEvalRunSummary, buildRegisteredEvals, buildTrajectory, clearRegisteredEvals, computeEvalTagScores, createEvalAgent, createEvalRunReporter, createReusableExecutionContext, defineEval, defineMetrics, efficiencyMetricValues, emitEfficiencyMetrics, fileContains, fileContentQuality, fileExists, fileExistsOneOf, finalizeEvalMetrics, formatEvalCaseSummary, formatEvalRunSummary, formatTrajectoryLine, functionalityMetric, llmJudge, normalizeMetric, registerEvalTests, relativeArtifactPath, runEvalCase, statusCompleted } from "./eval.js";
|
|
17
17
|
import { i as jsonSink, n as createLogger, r as createLoggingHooks, t as consoleSink } from "./logger-Ktm-lj1s.js";
|
|
@@ -1266,6 +1266,6 @@ function zodToJsonSchema(jsonSchema) {
|
|
|
1266
1266
|
return rest;
|
|
1267
1267
|
}
|
|
1268
1268
|
//#endregion
|
|
1269
|
-
export { ANCHOR_PREVIEW_MAX_CHARS, AgentAbortedError, AgentBudgetExceededError, AgentContextExceededError, AgentProviderError, AgentToolNotAllowedError, AgentToolPairingError, BASE_INSTRUCTIONS, BYTES_PER_TOKEN, CONTEXT_EXCEEDED_MESSAGE_PATTERNS, CompactInvalidInputError, CompactPromptTooLongError, EFFICIENCY_METRICS, EvalMetricError, GEN_AI_ATTRIBUTES, IMPLICITLY_ALLOWED_SKILL_TOOLS, INTERRUPT_MESSAGE_FOR_TOOL_USE, McpOAuthProvider, NO_TOOLS_PREAMBLE, ORPHANED_TOOL_RESULT_MARKER, OpenAICompatHttpError, PERSISTED_STUB_PREFIX, PERSISTENCE_PREVIEW_BYTES, SHELL_CASCADE_CANCEL_MESSAGE, SYNTHETIC_TOOL_RESULT_PLACEHOLDER, SYSTEM_PROMPT_BOUNDARY, TOOL_USE_CANCELLED_MESSAGE, TOOL_USE_INTERRUPTED_MARKER, TOOL_USE_SKIPPED_MESSAGE, TRAILER, anchorPreviewFor, anthropic, appendDynamicSection, appendStaticSection, applyAnthropicCacheBreakpoints, arcee, artifactPath, autoDetectAndConvert, baseten, basic_default as basic, basicTools, buildCatalog, buildCompactPrompt, buildEvalRunSummary, buildFromCompactPrompt, buildFullCompactPrompt, buildPersistedStub, buildPostCompactAttachments, buildRegisteredEvals, buildTailCompactPrompt, buildTrajectory, buildUpToCompactPrompt, cerebras, classifyOpenAICompatError, cleanupPersistedSession, clearRegisteredEvals, compactConversation, computeEvalTagScores, connectMcpServers, consoleSink, createAgent, createEvalAgent, createEvalRunReporter, createFileMapStore, createInteractionTool, createLogger, createLoggingHooks, createMemoryMcpCredentialStore, createMemoryStore, createMetricsHooks, createProcessContext, createRemoteStore, createReusableExecutionContext, createRunSummaryCollector, createSandboxContext, createSession, createShellTool, createSkillActivationState, createSkillsReadTool, createSkillsRunScriptTool, createSkillsUseTool, createSpawnTool, createTracingHooks, defaultRepeatGuardNormalize, defaultRepeatGuardTracked, defineEval, defineMetrics, definePreset, defineSkill, detectTurnInterruption, diffCacheDimensions, discoverSkills, edit, efficiencyMetricValues, emitEfficiencyMetrics, ensureEndsWithUserMessage, ensureToolResultPairing, errorMessage, estimateTokens, fileContains, fileContentQuality, fileExists, fileExistsOneOf, filterUnresolvedToolUses, finalizeEvalMetrics, flattenTurns, fnv1a32, formatEvalCaseSummary, formatEvalRunSummary, formatTrajectoryLine, fromAnthropic, fromOpenAI, functionalityMetric, getReadState, glob, grep, hasAuthorizationHeader, hasSystemPromptBoundary, headlessEventToJsonl, installAllowedToolsGate, installCacheBreakLogger, interpolateShellCommands, isToolAllowedByUnion, joinSystemPrompt, jsonSink, llmJudge, loadSession, local, loginMcpServer, mapOAIFinishReason, matchesAllowedTool, matchesContextExceeded, maybePersistToolResult, multiEdit, normalizeMcpBlocks, normalizeMcpServers, normalizeMetric, normalizeShellCommand, openai, openaiCompat, openrouter, parseAllowedToolPattern, parseSkillFile, readStateKey, registerEvalTests, relativeArtifactPath, remintDuplicateToolCallIds, renderSystemForWire, replaceDynamicSection, resolveDetachedTasksCapability, resolvePersistDir, resolveReadStateMap, resolveSkills, resolveTasksDir, resultToString, runEvalCase, runHeadless, sanitizeToolSchema, sanitizeToolSpecs, selectFilesFromReadState, selectFilesFromSession, selectRecentFiles, sliceForCompaction, snapshotCacheDimensions, splitSystemPrompt, stableStringify, startOAuthCallback, statsByModel, statusCompleted, stripImagesFromTurns, stripShellInterpolations, summaryToTurn, toAnthropic, toOpenAI, toTypedError, toWireMessages, toolOutputBudgetByteLength, toolOutputByteLength, toolResultToText, transcriptToOpenAIMessages, truncateHeadForPtlRetry, utf8ByteLength, validateResourcePath, validateResourcePathReal, validateSkillForWrite, validateSkillName, validateToolArgs, waitTask, writeSkillToDisk, writeSkillsToDisk, zodToJsonSchema };
|
|
1269
|
+
export { ANCHOR_PREVIEW_MAX_CHARS, AgentAbortedError, AgentBudgetExceededError, AgentContextExceededError, AgentProviderError, AgentToolNotAllowedError, AgentToolPairingError, BASE_INSTRUCTIONS, BYTES_PER_TOKEN, CONTEXT_EXCEEDED_MESSAGE_PATTERNS, CompactInvalidInputError, CompactPromptTooLongError, EFFICIENCY_METRICS, EvalMetricError, GEN_AI_ATTRIBUTES, IMPLICITLY_ALLOWED_SKILL_TOOLS, INTERRUPT_MESSAGE_FOR_TOOL_USE, McpOAuthProvider, NO_TOOLS_PREAMBLE, ORPHANED_TOOL_RESULT_MARKER, OpenAICompatHttpError, PERSISTED_STUB_PREFIX, PERSISTENCE_PREVIEW_BYTES, SHELL_CASCADE_CANCEL_MESSAGE, SYNTHETIC_TOOL_RESULT_PLACEHOLDER, SYSTEM_PROMPT_BOUNDARY, TOOL_USE_CANCELLED_MESSAGE, TOOL_USE_INTERRUPTED_MARKER, TOOL_USE_SKIPPED_MESSAGE, TRAILER, anchorPreviewFor, anthropic, appendDynamicSection, appendStaticSection, applyAnthropicCacheBreakpoints, arcee, artifactPath, autoDetectAndConvert, baseten, basic_default as basic, basicTools, buildCatalog, buildCompactPrompt, buildEvalRunSummary, buildFromCompactPrompt, buildFullCompactPrompt, buildPersistedStub, buildPostCompactAttachments, buildRegisteredEvals, buildTailCompactPrompt, buildTrajectory, buildUpToCompactPrompt, cerebras, classifyOpenAICompatError, cleanupPersistedSession, clearRegisteredEvals, compactConversation, computeEvalTagScores, connectMcpServers, consoleSink, createAgent, createEvalAgent, createEvalRunReporter, createFileMapStore, createInteractionTool, createLogger, createLoggingHooks, createMemoryMcpCredentialStore, createMemoryStore, createMetricsHooks, createProcessContext, createRemoteStore, createReusableExecutionContext, createRunSummaryCollector, createSandboxContext, createSession, createShellTool, createSkillActivationState, createSkillsReadTool, createSkillsRunScriptTool, createSkillsUseTool, createSpawnTool, createTracingHooks, defaultRepeatGuardNormalize, defaultRepeatGuardTracked, defineEval, defineMetrics, definePreset, defineSkill, detectTurnInterruption, diffCacheDimensions, discoverSkills, edit, efficiencyMetricValues, emitEfficiencyMetrics, ensureEndsWithUserMessage, ensureToolResultPairing, errorMessage, estimateTokens, fileContains, fileContentQuality, fileExists, fileExistsOneOf, filterUnresolvedToolUses, finalizeEvalMetrics, flattenTurns, fnv1a32, formatEvalCaseSummary, formatEvalRunSummary, formatTrajectoryLine, fromAnthropic, fromOpenAI, functionalityMetric, getReadState, glob, grep, hasAuthorizationHeader, hasSystemPromptBoundary, headlessEventToJsonl, installAllowedToolsGate, installCacheBreakLogger, interpolateShellCommands, isToolAllowedByUnion, joinSystemPrompt, jsonSink, llmJudge, loadSession, local, loginMcpServer, mapOAIFinishReason, matchesAllowedTool, matchesContextExceeded, maybePersistToolResult, multiEdit, normalizeMcpBlocks, normalizeMcpServers, normalizeMetric, normalizeShellCommand, openai, openaiCompat, openrouter, parseAllowedToolPattern, parseSkillFile, readStateKey, registerEvalTests, relativeArtifactPath, remintDuplicateToolCallIds, renderSystemForWire, replaceDynamicSection, resolveDetachedTasksCapability, resolvePersistDir, resolveReadStateMap, resolveSkills, resolveTasksDir, resultToString, runEvalCase, runHeadless, sanitizeToolSchema, sanitizeToolSpecs, selectFilesFromReadState, selectFilesFromSession, selectRecentFiles, sliceForCompaction, snapshotCacheDimensions, splitSystemPrompt, stableStringify, startOAuthCallback, statsByModel, statusCompleted, stripImagesFromTurns, stripShellInterpolations, summaryToTurn, toAnthropic, toOpenAI, toTypedError, toWireMessages, toolOutputBudgetByteLength, toolOutputByteLength, toolResultToText, transcriptToOpenAIMessages, truncateHeadForPtlRetry, utf8ByteLength, validateResourcePath, validateResourcePathReal, validateSkillForWrite, validateSkillName, validateToolArgs, waitTask, writeSkillToDisk, writeSkillsToDisk, xai, zodToJsonSchema };
|
|
1270
1270
|
|
|
1271
1271
|
//# sourceMappingURL=index.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { r as AgentHooks } from "./agent-
|
|
1
|
+
import { r as AgentHooks } from "./agent-CVTAoYS0.js";
|
|
2
2
|
import { Hookable } from "hookable";
|
|
3
3
|
|
|
4
4
|
//#region src/logger.d.ts
|
|
@@ -99,4 +99,4 @@ interface LoggingHookSet {
|
|
|
99
99
|
declare function createLoggingHooks(options: LoggingHooksOptions): LoggingHookSet;
|
|
100
100
|
//#endregion
|
|
101
101
|
export { Logger as a, consoleSink as c, jsonSink as d, LogSink as i, createLogger as l, LogLevel as n, LoggingHookSet as o, LogRecord as r, LoggingHooksOptions as s, ConsoleSinkOptions as t, createLoggingHooks as u };
|
|
102
|
-
//# sourceMappingURL=logger-
|
|
102
|
+
//# sourceMappingURL=logger-CYtWKlBF.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger-
|
|
1
|
+
{"version":3,"file":"logger-CYtWKlBF.d.ts","names":[],"sources":["../src/logger.ts"],"mappings":";;;;KAgCY,QAAA;AAAA,UAEK,SAAA;EACf,KAAA,EAAO,QAAA;EAUiB;EARxB,SAAA;EAWqB;EATrB,OAAA;EAUiC;EARjC,KAAA,EAAO,MAAM;AAAA;AAAA,UAGE,OAAA;EACf,IAAA,GAAO,MAAA,EAAQ,SAAS;AAAA;AAAA,UAGT,MAAA;EACf,KAAA,GAAQ,OAAA,UAAiB,KAAA,GAAQ,MAAA;EACjC,IAAA,GAAO,OAAA,UAAiB,KAAA,GAAQ,MAAA;EAChC,IAAA,GAAO,OAAA,UAAiB,KAAA,GAAQ,MAAA;EAChC,KAAA,GAAQ,OAAA,UAAiB,KAAA,GAAQ,MAAA;EAHzB;;;;;EASR,IAAA,GAAO,KAAA,EAAO,MAAA,sBAA4B,MAAA;EARlB;;;;EAAA,SAaf,cAAA,EAAgB,QAAA,CAAS,MAAA;AAAA;;;;;iBAWpB,YAAA,CACd,IAAA,EAAM,OAAA,EACN,cAAA,GAAgB,QAAA,CAAS,MAAA,qBACxB,MAAA;AAAA,UA6Bc,kBAAA;EAhD2B;;;;;EAsD1C,QAAA,GAAW,QAAQ;EAtCL;EAwCd,MAAA;IAAW,KAAA,GAAQ,KAAA;EAAA;AAAA;;;;;;;;iBAiBL,WAAA,CAAY,OAAA,GAAS,kBAAA,GAA0B,OAAO;;;;AAtD7D;iBA2EO,QAAA,CAAS,OAAA,GAAS,kBAAA,GAA0B,OAAO;AAAA,UAqBlD,mBAAA;EACf,MAAA,EAAQ,MAAA;EA9DW;;;;;EAoEnB,KAAA,GAAQ,QAAQ;EAlEgB;AAAA;AAiBlC;;;;;EAyDE,gBAAA;AAAA;AAAA,UAGe,cAAA;EACf,OAAA,GAAU,KAAA,EAAO,QAAQ,CAAC,UAAA;AAAA;;;;;;;;AAxCuC;AAqBnE;;;;;;iBAoCgB,kBAAA,CAAmB,OAAA,EAAS,mBAAA,GAAsB,cAAc"}
|
package/dist/mcp.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { _ as normalizeMcpServers, f as ConnectMcpServersOptions, g as normalizeMcpBlocks, h as connectMcpServers, ln as
|
|
1
|
+
import { _ as normalizeMcpServers, dn as McpToolSchema, f as ConnectMcpServersOptions, g as normalizeMcpBlocks, h as connectMcpServers, ln as McpServerConfig, m as attachStderrWarnPump, p as McpConnection, v as resultToString } from "./agent-CVTAoYS0.js";
|
|
2
2
|
export { ConnectMcpServersOptions, McpConnection, type McpServerConfig, type McpToolSchema, attachStderrWarnPump, connectMcpServers, normalizeMcpBlocks, normalizeMcpServers, resultToString };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { t as Agent } from "../agent-
|
|
2
|
-
import { An as HeadlessOutputFormat, En as FormattedHeadlessTurnEvent, On as HeadlessEvent, Tn as FormattedHeadlessResult, jn as HeadlessResult } from "../index-
|
|
1
|
+
import { t as Agent } from "../agent-CVTAoYS0.js";
|
|
2
|
+
import { An as HeadlessOutputFormat, En as FormattedHeadlessTurnEvent, On as HeadlessEvent, Tn as FormattedHeadlessResult, jn as HeadlessResult } from "../index-Gin_mFQJ.js";
|
|
3
3
|
|
|
4
4
|
//#region src/output/stream-json.d.ts
|
|
5
5
|
type StreamJsonOutputFormat = HeadlessOutputFormat;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { i as formattedHeadlessTurnEventToJsonl, n as formatHeadlessResult, o as installHeadlessEventAdapter, r as formatHeadlessTurnEvent } from "../headless-
|
|
1
|
+
import { i as formattedHeadlessTurnEventToJsonl, n as formatHeadlessResult, o as installHeadlessEventAdapter, r as formatHeadlessTurnEvent } from "../headless-DM5JeUiE.js";
|
|
2
2
|
//#region src/output/stream-json.ts
|
|
3
3
|
function resolveFormatOptions(options) {
|
|
4
4
|
return {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { r as AgentHooks, t as Agent } from "../agent-
|
|
2
|
-
import { t as Preset } from "../index-
|
|
1
|
+
import { r as AgentHooks, t as Agent } from "../agent-CVTAoYS0.js";
|
|
2
|
+
import { t as Preset } from "../index-Gin_mFQJ.js";
|
|
3
3
|
|
|
4
4
|
//#region src/output/terminal.d.ts
|
|
5
5
|
interface TerminalOutputOptions {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as multiEdit, i as readFile, n as createSpawnTool, o as listFiles, p as waitTask, r as shellKill, t as writeFile, u as edit, y as shell } from "./tools-
|
|
1
|
+
import { a as multiEdit, i as readFile, n as createSpawnTool, o as listFiles, p as waitTask, r as shellKill, t as writeFile, u as edit, y as shell } from "./tools-BlMV33N1.js";
|
|
2
2
|
//#region src/presets/basic.ts
|
|
3
3
|
/**
|
|
4
4
|
* Core tools available in every basic preset (without spawn).
|
|
@@ -110,4 +110,4 @@ function composePresets(...presets) {
|
|
|
110
110
|
//#endregion
|
|
111
111
|
export { basic_default as i, definePreset as n, basicTools as r, composePresets as t };
|
|
112
112
|
|
|
113
|
-
//# sourceMappingURL=presets-
|
|
113
|
+
//# sourceMappingURL=presets-BorC0fVx.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presets-
|
|
1
|
+
{"version":3,"file":"presets-BorC0fVx.js","names":[],"sources":["../src/presets/basic.ts","../src/presets/index.ts"],"sourcesContent":["import { definePreset } from '.'\nimport { edit, listFiles, multiEdit, readFile, shell, shellKill, waitTask, writeFile } from '../tools'\nimport { createSpawnTool } from '../tools/spawn'\n\n/**\n * Core tools available in every basic preset (without spawn).\n *\n * `edit` and `multi_edit` ship in the basic set because surgical edits are the\n * default modality for production agents — `write_file` is for full overwrites.\n * `glob` and `grep` are exported but opt-in: not every agent needs codebase\n * search, and shipping them by default would force `tool:gate` work onto\n * consumers that prefer the model to use `shell` + classic Unix tools.\n */\nexport const basicTools = { shell, shellKill, waitTask, readFile, writeFile, listFiles, edit, multiEdit }\n\nexport default definePreset({\n name: 'basic',\n system: 'You are a helpful assistant with access to shell, file reading, file writing, surgical and multi-edit tools, directory listing, and sub-agent spawning. Prefer `edit` / `multi_edit` for in-place changes and `write_file` for full file overwrites. Use them to accomplish tasks in the project directory.',\n // `tools` is a getter so each access (every `{ ...basic }` spread into\n // `createAgent`) mints a FRESH spawn tool. `createSpawnTool()` carries\n // per-instance state (running children, concurrency counter, child-stats\n // accumulator); a module-level singleton instance would be shared by every\n // agent in the process, breaking concurrent rollouts.\n //\n // `persist: true` shares the parent's session with every child agent — child\n // turns land in `session.turns` tagged with their own `runId`, and the run\n // itself is recorded in `session.runs` with `parentRunId` + `depth`. That's\n // what lets a reloaded TUI session reconstruct the full subagent tree (see\n // `eventsFromTurns` in `tui/store.ts`). Hosts that want children in-memory\n // only can construct their own preset with `createSpawnTool()`.\n get tools() {\n return { ...basicTools, spawn: createSpawnTool({ persist: true }) }\n },\n})\n","import type { AgentHooks, AgentOptions } from '../agent'\n\nexport type { AgentHookMap } from '../agent'\n\n/**\n * A preset is a reusable slice of `AgentOptions` — spread it into `createAgent()`\n * to configure tools, a default system prompt, aliases, behavior defaults, and\n * agent-lifetime hooks.\n *\n * `provider`, `execution`, `session`, and internal fields are excluded so presets\n * remain shareable and composable.\n *\n * ```ts\n * import { basic } from 'zidane/presets'\n * createAgent({ ...basic, provider })\n * ```\n *\n * ### Composing multiple presets\n *\n * Bare `...spread` is shallow — `{ ...a, ...b }` overwrites every key `b`\n * defines, including `hooks`. Use {@link composePresets} when you want\n * field-aware merging (per-event hook concat, tools shallow-merge, etc.):\n *\n * ```ts\n * createAgent({ ...composePresets(basic, telemetry, mine), provider })\n * ```\n */\nexport type Preset = Omit<Partial<AgentOptions>, 'provider' | 'execution' | 'session' | 'mcpConnector'>\n\n/**\n * Identity helper for type inference when defining a preset.\n */\nexport function definePreset(config: Preset): Preset {\n return config\n}\n\n/**\n * Field-aware composition of presets. Right-most preset wins for scalar fields;\n * objects shallow-merge; arrays and hook handler lists concatenate. Designed so\n * stacking presets does the obvious thing without the spread-collision footgun:\n *\n * - `name`, `system`, `eager`, `skills` → last-defined wins\n * - `tools`, `toolAliases`, `behavior` → shallow-merge (later keys override)\n * - `behavior.dedupTools`, `behavior.toolBudgets` → **deep-merge** (per-tool-name; later wins on collision)\n * - `mcpServers` → concat with last-wins on `name` collision\n * - `hooks` → per-event concat; every handler fires\n *\n * `hooks` always emerges as `event → handler[]` so downstream registration\n * (in `createAgent`) sees a uniform shape. Order of handlers within an event\n * follows preset order: earlier presets register first.\n *\n * `mcpServers` is deduped by `name` because shipping two servers with the same\n * name would trip the connector at runtime — a later preset overriding an\n * earlier preset's `github` server is the practical intent.\n *\n * `behavior.dedupTools` and `behavior.toolBudgets` get the same per-key deep-merge\n * because they are tool-name-keyed records — a preset that ships a dedup hasher\n * for one tool should not erase a hasher another preset ships for a different\n * tool. Last-wins still applies on a per-tool collision so a downstream preset\n * can override an upstream preset's policy for one specific tool. Other\n * `behavior` fields keep last-wins semantics.\n */\nexport function composePresets(...presets: Preset[]): Preset {\n const out: Preset = {}\n const hooksByEvent: { [K in keyof AgentHooks]?: AgentHooks[K][] } = {}\n // Keep mcpServers in source-order on first sight, but allow later\n // declarations to override earlier ones with the same `name`. A `Map`\n // keyed by name gives O(1) override + stable iteration.\n const mcpByName = new Map<string, NonNullable<Preset['mcpServers']>[number]>()\n\n for (const p of presets) {\n if (p.name !== undefined)\n out.name = p.name\n if (p.system !== undefined)\n out.system = p.system\n if (p.eager !== undefined)\n out.eager = p.eager\n if (p.skills !== undefined)\n out.skills = p.skills\n if (p.tools)\n out.tools = { ...out.tools, ...p.tools }\n if (p.toolAliases)\n out.toolAliases = { ...out.toolAliases, ...p.toolAliases }\n if (p.behavior) {\n // Top-level shallow-merge first; then deep-merge the two tool-name-keyed\n // sub-records so per-tool entries from earlier presets aren't clobbered.\n const merged: NonNullable<Preset['behavior']> = { ...out.behavior, ...p.behavior }\n if (out.behavior?.dedupTools || p.behavior.dedupTools) {\n merged.dedupTools = { ...out.behavior?.dedupTools, ...p.behavior.dedupTools }\n }\n if (out.behavior?.toolBudgets || p.behavior.toolBudgets) {\n merged.toolBudgets = { ...out.behavior?.toolBudgets, ...p.behavior.toolBudgets }\n }\n out.behavior = merged\n }\n if (p.mcpServers) {\n for (const server of p.mcpServers)\n mcpByName.set(server.name, server)\n }\n if (p.hooks) {\n for (const [event, handler] of Object.entries(p.hooks)) {\n if (handler === undefined)\n continue\n const list = Array.isArray(handler) ? handler : [handler]\n const key = event as keyof AgentHooks\n // Safe cast: we read the loose `AgentHookMap` shape (handler-or-array)\n // and re-emit only as arrays. Each `list` element matches the event's\n // handler signature by construction (the input was typed `AgentHookMap`).\n const bucket = (hooksByEvent[key] ??= []) as unknown[]\n bucket.push(...(list as unknown[]))\n }\n }\n }\n\n if (mcpByName.size > 0)\n out.mcpServers = [...mcpByName.values()]\n\n if (Object.keys(hooksByEvent).length > 0)\n out.hooks = hooksByEvent\n\n return out\n}\n\nexport { default as basic, basicTools } from './basic'\n"],"mappings":";;;;;;;;;;;AAaA,MAAa,aAAa;CAAE;CAAO;CAAW;CAAU;CAAU;CAAW;CAAW;CAAM;AAAU;AAExG,IAAA,gBAAe,aAAa;CAC1B,MAAM;CACN,QAAQ;CAaR,IAAI,QAAQ;EACV,OAAO;GAAE,GAAG;GAAY,OAAO,gBAAgB,EAAE,SAAS,KAAK,CAAC;EAAE;CACpE;AACF,CAAC;;;;;;ACDD,SAAgB,aAAa,QAAwB;CACnD,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,SAAgB,eAAe,GAAG,SAA2B;CAC3D,MAAM,MAAc,CAAC;CACrB,MAAM,eAA8D,CAAC;CAIrE,MAAM,4BAAY,IAAI,IAAuD;CAE7E,KAAK,MAAM,KAAK,SAAS;EACvB,IAAI,EAAE,SAAS,KAAA,GACb,IAAI,OAAO,EAAE;EACf,IAAI,EAAE,WAAW,KAAA,GACf,IAAI,SAAS,EAAE;EACjB,IAAI,EAAE,UAAU,KAAA,GACd,IAAI,QAAQ,EAAE;EAChB,IAAI,EAAE,WAAW,KAAA,GACf,IAAI,SAAS,EAAE;EACjB,IAAI,EAAE,OACJ,IAAI,QAAQ;GAAE,GAAG,IAAI;GAAO,GAAG,EAAE;EAAM;EACzC,IAAI,EAAE,aACJ,IAAI,cAAc;GAAE,GAAG,IAAI;GAAa,GAAG,EAAE;EAAY;EAC3D,IAAI,EAAE,UAAU;GAGd,MAAM,SAA0C;IAAE,GAAG,IAAI;IAAU,GAAG,EAAE;GAAS;GACjF,IAAI,IAAI,UAAU,cAAc,EAAE,SAAS,YACzC,OAAO,aAAa;IAAE,GAAG,IAAI,UAAU;IAAY,GAAG,EAAE,SAAS;GAAW;GAE9E,IAAI,IAAI,UAAU,eAAe,EAAE,SAAS,aAC1C,OAAO,cAAc;IAAE,GAAG,IAAI,UAAU;IAAa,GAAG,EAAE,SAAS;GAAY;GAEjF,IAAI,WAAW;EACjB;EACA,IAAI,EAAE,YACJ,KAAK,MAAM,UAAU,EAAE,YACrB,UAAU,IAAI,OAAO,MAAM,MAAM;EAErC,IAAI,EAAE,OACJ,KAAK,MAAM,CAAC,OAAO,YAAY,OAAO,QAAQ,EAAE,KAAK,GAAG;GACtD,IAAI,YAAY,KAAA,GACd;GACF,MAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;GACxD,MAAM,MAAM;GAKZ,CADgB,aAAa,SAAS,CAAC,GAChC,KAAK,GAAI,IAAkB;EACpC;CAEJ;CAEA,IAAI,UAAU,OAAO,GACnB,IAAI,aAAa,CAAC,GAAG,UAAU,OAAO,CAAC;CAEzC,IAAI,OAAO,KAAK,YAAY,EAAE,SAAS,GACrC,IAAI,QAAQ;CAEd,OAAO;AACT"}
|
package/dist/presets.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { n as AgentHookMap } from "./agent-
|
|
2
|
-
import { a as basicTools, i as _default, n as composePresets, r as definePreset, t as Preset } from "./index-
|
|
1
|
+
import { n as AgentHookMap } from "./agent-CVTAoYS0.js";
|
|
2
|
+
import { a as basicTools, i as _default, n as composePresets, r as definePreset, t as Preset } from "./index-Gin_mFQJ.js";
|
|
3
3
|
export { type AgentHookMap, Preset, _default as basic, basicTools, composePresets, definePreset };
|
package/dist/presets.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { i as basic_default, n as definePreset, r as basicTools, t as composePresets } from "./presets-
|
|
1
|
+
import { i as basic_default, n as definePreset, r as basicTools, t as composePresets } from "./presets-BorC0fVx.js";
|
|
2
2
|
export { basic_default as basic, basicTools, composePresets, definePreset };
|
|
@@ -9,6 +9,7 @@ import { homedir } from "node:os";
|
|
|
9
9
|
import { getOAuthApiKey } from "@earendil-works/pi-ai/oauth";
|
|
10
10
|
import { mkdir, open, rename, rm } from "node:fs/promises";
|
|
11
11
|
import { streamOpenAICodexResponses } from "@earendil-works/pi-ai/openai-codex-responses";
|
|
12
|
+
import { createServer } from "node:http";
|
|
12
13
|
//#region src/chat/anthropic-models.ts
|
|
13
14
|
/**
|
|
14
15
|
* Anthropic "fast mode" — `speed: "fast"` on the Messages API. ~2.5× output
|
|
@@ -1426,10 +1427,10 @@ function createCursorOAuthProvider() {
|
|
|
1426
1427
|
}
|
|
1427
1428
|
//#endregion
|
|
1428
1429
|
//#region src/providers/cursor.ts
|
|
1429
|
-
const DEFAULT_MODEL$
|
|
1430
|
+
const DEFAULT_MODEL$2 = "claude-4.6-sonnet";
|
|
1430
1431
|
const NOT_IMPLEMENTED_MESSAGE = "Cursor OAuth login works, but inference over Cursor is not implemented yet. Cursor uses a protobuf/HTTP-2 agent protocol (not an OpenAI-compatible API), so the streaming transport still needs to be ported. Use another provider for now.";
|
|
1431
1432
|
function cursor(params) {
|
|
1432
|
-
const defaultModel = params?.defaultModel || DEFAULT_MODEL$
|
|
1433
|
+
const defaultModel = params?.defaultModel || DEFAULT_MODEL$2;
|
|
1433
1434
|
const base = openaiCompat({
|
|
1434
1435
|
name: "cursor",
|
|
1435
1436
|
apiKey: params?.apiKey ?? "oauth",
|
|
@@ -1502,13 +1503,13 @@ function local(params) {
|
|
|
1502
1503
|
//#endregion
|
|
1503
1504
|
//#region src/providers/openai.ts
|
|
1504
1505
|
const PROVIDER_ID = "openai-codex";
|
|
1505
|
-
const DEFAULT_MODEL = "gpt-5.5";
|
|
1506
|
+
const DEFAULT_MODEL$1 = "gpt-5.5";
|
|
1506
1507
|
const lookupModel = getModel;
|
|
1507
1508
|
function resolveModel(modelId) {
|
|
1508
1509
|
const model = lookupModel(PROVIDER_ID, modelId);
|
|
1509
1510
|
if (model) return model;
|
|
1510
|
-
const fallback = lookupModel(PROVIDER_ID, DEFAULT_MODEL);
|
|
1511
|
-
if (!fallback) throw new Error(`OpenAI Codex model registry is missing the default model: ${DEFAULT_MODEL}`);
|
|
1511
|
+
const fallback = lookupModel(PROVIDER_ID, DEFAULT_MODEL$1);
|
|
1512
|
+
if (!fallback) throw new Error(`OpenAI Codex model registry is missing the default model: ${DEFAULT_MODEL$1}`);
|
|
1512
1513
|
return {
|
|
1513
1514
|
...fallback,
|
|
1514
1515
|
id: modelId,
|
|
@@ -1867,7 +1868,7 @@ function applyPayloadOverrides(payload, options) {
|
|
|
1867
1868
|
return body;
|
|
1868
1869
|
}
|
|
1869
1870
|
function openai(params) {
|
|
1870
|
-
const defaultModel = params?.defaultModel || DEFAULT_MODEL;
|
|
1871
|
+
const defaultModel = params?.defaultModel || DEFAULT_MODEL$1;
|
|
1871
1872
|
const baseCredentials = extractRuntimeCredentials(params);
|
|
1872
1873
|
let runtimeCredentials = baseCredentials ? {
|
|
1873
1874
|
...baseCredentials,
|
|
@@ -2025,6 +2026,335 @@ function openrouter(params) {
|
|
|
2025
2026
|
});
|
|
2026
2027
|
}
|
|
2027
2028
|
//#endregion
|
|
2028
|
-
|
|
2029
|
+
//#region src/chat/oauth-page/xai.ts
|
|
2030
|
+
/** pi-ai / zidane OAuth provider id. Also the credentials-file key. */
|
|
2031
|
+
const XAI_OAUTH_PROVIDER_ID = "xai-oauth";
|
|
2032
|
+
const DEFAULT_BASE_URL = "https://api.x.ai/v1";
|
|
2033
|
+
const DISCOVERY_URL = `https://auth.x.ai/.well-known/openid-configuration`;
|
|
2034
|
+
/** Public client id used by the Grok CLI OAuth surface. */
|
|
2035
|
+
const CLIENT_ID = process.env.PI_XAI_OAUTH_CLIENT_ID || "b1a00492-073a-47ea-816f-4c329264a828";
|
|
2036
|
+
const SCOPE = process.env.PI_XAI_OAUTH_SCOPE || "openid profile email offline_access grok-cli:access api:access";
|
|
2037
|
+
/** xAI matches the registered loopback IP exactly — `localhost` is rejected. */
|
|
2038
|
+
const CALLBACK_HOST = process.env.PI_XAI_OAUTH_CALLBACK_HOST || "127.0.0.1";
|
|
2039
|
+
const CALLBACK_PORT = Number.parseInt(process.env.PI_XAI_OAUTH_CALLBACK_PORT || "56121", 10);
|
|
2040
|
+
const CALLBACK_PATH = "/callback";
|
|
2041
|
+
const PROVIDER_NAME = "xAI Grok";
|
|
2042
|
+
/** Refresh slightly early so requests don't race expiry. */
|
|
2043
|
+
const REFRESH_SKEW_MS = 12e4;
|
|
2044
|
+
const CALLBACK_TIMEOUT_MS = 18e4;
|
|
2045
|
+
/** Resolve the xAI API base URL (env override → default). */
|
|
2046
|
+
function xaiBaseUrl() {
|
|
2047
|
+
return (process.env.PI_XAI_BASE_URL || process.env.XAI_BASE_URL || DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
2048
|
+
}
|
|
2049
|
+
function base64Url(bytes) {
|
|
2050
|
+
let binary = "";
|
|
2051
|
+
for (const b of bytes) binary += String.fromCharCode(b);
|
|
2052
|
+
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
2053
|
+
}
|
|
2054
|
+
function randomToken(byteLength = 16) {
|
|
2055
|
+
return base64Url(crypto.getRandomValues(new Uint8Array(byteLength)));
|
|
2056
|
+
}
|
|
2057
|
+
/**
|
|
2058
|
+
* Refuse any OIDC endpoint that isn't HTTPS on an xAI origin.
|
|
2059
|
+
*
|
|
2060
|
+
* The discovery doc is cached long-term in `credentials.json`. A single MITM
|
|
2061
|
+
* during initial login could otherwise pin a malicious `token_endpoint` that
|
|
2062
|
+
* receives every subsequent refresh token. Validating scheme + host keeps the
|
|
2063
|
+
* endpoint on `x.ai` / `*.x.ai`.
|
|
2064
|
+
*/
|
|
2065
|
+
function validateEndpoint(value, field) {
|
|
2066
|
+
let url;
|
|
2067
|
+
try {
|
|
2068
|
+
url = new URL(value);
|
|
2069
|
+
} catch {
|
|
2070
|
+
throw new Error(`xAI OAuth discovery returned an invalid ${field}: ${value}`);
|
|
2071
|
+
}
|
|
2072
|
+
if (url.protocol !== "https:") throw new Error(`xAI OAuth ${field} must use HTTPS: ${value}`);
|
|
2073
|
+
const host = url.hostname.toLowerCase();
|
|
2074
|
+
if (host !== "x.ai" && !host.endsWith(".x.ai")) throw new Error(`Refusing non-xAI OAuth ${field}: ${value}`);
|
|
2075
|
+
return url.toString();
|
|
2076
|
+
}
|
|
2077
|
+
async function discover() {
|
|
2078
|
+
let response;
|
|
2079
|
+
try {
|
|
2080
|
+
response = await fetch(DISCOVERY_URL, {
|
|
2081
|
+
headers: { Accept: "application/json" },
|
|
2082
|
+
signal: AbortSignal.timeout(15e3)
|
|
2083
|
+
});
|
|
2084
|
+
} catch (cause) {
|
|
2085
|
+
throw new Error(`xAI OIDC discovery failed: ${cause instanceof Error ? cause.message : String(cause)}`);
|
|
2086
|
+
}
|
|
2087
|
+
if (!response.ok) throw new Error(`xAI OIDC discovery returned ${response.status}`);
|
|
2088
|
+
const payload = await response.json();
|
|
2089
|
+
return {
|
|
2090
|
+
authorization_endpoint: validateEndpoint(String(payload.authorization_endpoint ?? ""), "authorization_endpoint"),
|
|
2091
|
+
token_endpoint: validateEndpoint(String(payload.token_endpoint ?? ""), "token_endpoint")
|
|
2092
|
+
};
|
|
2093
|
+
}
|
|
2094
|
+
/**
|
|
2095
|
+
* Start the loopback callback server on `127.0.0.1:56121`. Falls back to an
|
|
2096
|
+
* OS-assigned port if 56121 is taken — xAI accepts any loopback port as long
|
|
2097
|
+
* as the `redirect_uri` we send on the authorize URL matches the listener.
|
|
2098
|
+
*/
|
|
2099
|
+
async function startXaiCallbackServer(renderPage) {
|
|
2100
|
+
let settle;
|
|
2101
|
+
let settled = false;
|
|
2102
|
+
const callbackPromise = new Promise((resolve) => {
|
|
2103
|
+
settle = (value) => {
|
|
2104
|
+
if (settled) return;
|
|
2105
|
+
settled = true;
|
|
2106
|
+
resolve(value);
|
|
2107
|
+
};
|
|
2108
|
+
});
|
|
2109
|
+
const server = createServer((req, res) => {
|
|
2110
|
+
try {
|
|
2111
|
+
const origin = req.headers.origin;
|
|
2112
|
+
if (origin === "https://accounts.x.ai" || origin === "https://auth.x.ai") {
|
|
2113
|
+
res.setHeader("Access-Control-Allow-Origin", origin);
|
|
2114
|
+
res.setHeader("Access-Control-Allow-Methods", "GET, OPTIONS");
|
|
2115
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type");
|
|
2116
|
+
res.setHeader("Access-Control-Allow-Private-Network", "true");
|
|
2117
|
+
res.setHeader("Vary", "Origin");
|
|
2118
|
+
}
|
|
2119
|
+
if (req.method === "OPTIONS") {
|
|
2120
|
+
res.statusCode = 204;
|
|
2121
|
+
res.end();
|
|
2122
|
+
return;
|
|
2123
|
+
}
|
|
2124
|
+
const url = new URL(req.url ?? "/", `http://${CALLBACK_HOST}`);
|
|
2125
|
+
if (url.pathname !== CALLBACK_PATH) {
|
|
2126
|
+
res.statusCode = 404;
|
|
2127
|
+
res.end("Not found");
|
|
2128
|
+
return;
|
|
2129
|
+
}
|
|
2130
|
+
const result = {
|
|
2131
|
+
code: url.searchParams.get("code") ?? void 0,
|
|
2132
|
+
state: url.searchParams.get("state") ?? void 0,
|
|
2133
|
+
error: url.searchParams.get("error") ?? void 0,
|
|
2134
|
+
errorDescription: url.searchParams.get("error_description") ?? void 0
|
|
2135
|
+
};
|
|
2136
|
+
res.statusCode = result.error ? 400 : 200;
|
|
2137
|
+
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
2138
|
+
res.end(renderPage(result.error ? {
|
|
2139
|
+
kind: "error",
|
|
2140
|
+
provider: PROVIDER_NAME,
|
|
2141
|
+
message: `${PROVIDER_NAME} authentication did not complete.`,
|
|
2142
|
+
details: result.errorDescription ?? result.error
|
|
2143
|
+
} : {
|
|
2144
|
+
kind: "success",
|
|
2145
|
+
provider: PROVIDER_NAME,
|
|
2146
|
+
message: "xAI authentication completed. You can close this window."
|
|
2147
|
+
}));
|
|
2148
|
+
settle?.(result);
|
|
2149
|
+
} catch {
|
|
2150
|
+
res.statusCode = 500;
|
|
2151
|
+
res.end("Internal error");
|
|
2152
|
+
}
|
|
2153
|
+
});
|
|
2154
|
+
const listen = (port) => new Promise((resolve, reject) => {
|
|
2155
|
+
server.once("error", reject);
|
|
2156
|
+
server.listen(port, CALLBACK_HOST, () => {
|
|
2157
|
+
server.removeListener("error", reject);
|
|
2158
|
+
const addr = server.address();
|
|
2159
|
+
resolve(typeof addr === "object" && addr ? addr.port : port);
|
|
2160
|
+
});
|
|
2161
|
+
});
|
|
2162
|
+
let actualPort;
|
|
2163
|
+
try {
|
|
2164
|
+
actualPort = await listen(CALLBACK_PORT);
|
|
2165
|
+
} catch {
|
|
2166
|
+
actualPort = await listen(0);
|
|
2167
|
+
}
|
|
2168
|
+
return {
|
|
2169
|
+
redirectUri: `http://${CALLBACK_HOST}:${actualPort}${CALLBACK_PATH}`,
|
|
2170
|
+
waitForCallback: (timeoutMs) => Promise.race([callbackPromise, new Promise((resolve) => setTimeout(resolve, timeoutMs, {
|
|
2171
|
+
error: "timeout",
|
|
2172
|
+
errorDescription: "Timed out waiting for the xAI OAuth callback."
|
|
2173
|
+
}))]),
|
|
2174
|
+
close: () => {
|
|
2175
|
+
try {
|
|
2176
|
+
server.close();
|
|
2177
|
+
} catch {}
|
|
2178
|
+
}
|
|
2179
|
+
};
|
|
2180
|
+
}
|
|
2181
|
+
function expiryFromPayload(payload) {
|
|
2182
|
+
const expiresIn = typeof payload.expires_in === "number" ? payload.expires_in : Number(payload.expires_in ?? 3600);
|
|
2183
|
+
return Date.now() + expiresIn * 1e3 - REFRESH_SKEW_MS;
|
|
2184
|
+
}
|
|
2185
|
+
async function exchangeCode(tokenEndpoint, code, redirectUri, verifier, discovery) {
|
|
2186
|
+
const response = await fetch(tokenEndpoint, {
|
|
2187
|
+
method: "POST",
|
|
2188
|
+
headers: {
|
|
2189
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
2190
|
+
"Accept": "application/json"
|
|
2191
|
+
},
|
|
2192
|
+
body: new URLSearchParams({
|
|
2193
|
+
grant_type: "authorization_code",
|
|
2194
|
+
client_id: CLIENT_ID,
|
|
2195
|
+
code,
|
|
2196
|
+
redirect_uri: redirectUri,
|
|
2197
|
+
code_verifier: verifier
|
|
2198
|
+
}),
|
|
2199
|
+
signal: AbortSignal.timeout(3e4)
|
|
2200
|
+
});
|
|
2201
|
+
if (!response.ok) throw new Error(`xAI token exchange failed: ${response.status} ${await response.text().catch(() => "")}`);
|
|
2202
|
+
const payload = await response.json();
|
|
2203
|
+
const access = String(payload.access_token ?? "");
|
|
2204
|
+
const refresh = String(payload.refresh_token ?? "");
|
|
2205
|
+
if (!access) throw new Error("xAI token exchange did not return an access_token.");
|
|
2206
|
+
if (!refresh) throw new Error("xAI token exchange did not return a refresh_token.");
|
|
2207
|
+
return {
|
|
2208
|
+
access,
|
|
2209
|
+
refresh,
|
|
2210
|
+
expires: expiryFromPayload(payload),
|
|
2211
|
+
tokenEndpoint,
|
|
2212
|
+
discovery
|
|
2213
|
+
};
|
|
2214
|
+
}
|
|
2215
|
+
async function loginXai(renderPage, callbacks) {
|
|
2216
|
+
const discovery = await discover();
|
|
2217
|
+
const { verifier, challenge } = await generatePkce();
|
|
2218
|
+
const state = randomToken();
|
|
2219
|
+
const nonce = randomToken();
|
|
2220
|
+
const server = await startXaiCallbackServer(renderPage);
|
|
2221
|
+
try {
|
|
2222
|
+
const authUrl = new URL(discovery.authorization_endpoint);
|
|
2223
|
+
authUrl.searchParams.set("response_type", "code");
|
|
2224
|
+
authUrl.searchParams.set("client_id", CLIENT_ID);
|
|
2225
|
+
authUrl.searchParams.set("redirect_uri", server.redirectUri);
|
|
2226
|
+
authUrl.searchParams.set("scope", SCOPE);
|
|
2227
|
+
authUrl.searchParams.set("code_challenge", challenge);
|
|
2228
|
+
authUrl.searchParams.set("code_challenge_method", "S256");
|
|
2229
|
+
authUrl.searchParams.set("state", state);
|
|
2230
|
+
authUrl.searchParams.set("nonce", nonce);
|
|
2231
|
+
authUrl.searchParams.set("plan", "generic");
|
|
2232
|
+
authUrl.searchParams.set("referrer", "zidane");
|
|
2233
|
+
callbacks.onAuth({
|
|
2234
|
+
url: authUrl.toString(),
|
|
2235
|
+
instructions: `Sign in to xAI and approve access. If the browser is on another machine, the callback listener is ${server.redirectUri}.`
|
|
2236
|
+
});
|
|
2237
|
+
const result = await server.waitForCallback(CALLBACK_TIMEOUT_MS);
|
|
2238
|
+
if (result.error) throw new Error(result.errorDescription ?? result.error);
|
|
2239
|
+
if (result.state !== state) throw new Error("xAI OAuth state mismatch — possible CSRF. Please retry.");
|
|
2240
|
+
if (!result.code) throw new Error("xAI OAuth callback did not include an authorization code.");
|
|
2241
|
+
callbacks.onProgress?.("Exchanging authorization code for tokens...");
|
|
2242
|
+
return await exchangeCode(discovery.token_endpoint, result.code, server.redirectUri, verifier, discovery);
|
|
2243
|
+
} finally {
|
|
2244
|
+
server.close();
|
|
2245
|
+
}
|
|
2246
|
+
}
|
|
2247
|
+
async function refreshXaiToken(credentials) {
|
|
2248
|
+
const xai = credentials;
|
|
2249
|
+
if (!credentials.refresh) throw new Error("xAI credentials are missing a refresh token — re-login required.");
|
|
2250
|
+
const tokenEndpoint = xai.tokenEndpoint ?? xai.discovery?.token_endpoint ?? (await discover()).token_endpoint;
|
|
2251
|
+
validateEndpoint(tokenEndpoint, "token_endpoint");
|
|
2252
|
+
const response = await fetch(tokenEndpoint, {
|
|
2253
|
+
method: "POST",
|
|
2254
|
+
headers: {
|
|
2255
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
2256
|
+
"Accept": "application/json"
|
|
2257
|
+
},
|
|
2258
|
+
body: new URLSearchParams({
|
|
2259
|
+
grant_type: "refresh_token",
|
|
2260
|
+
client_id: CLIENT_ID,
|
|
2261
|
+
refresh_token: credentials.refresh
|
|
2262
|
+
}),
|
|
2263
|
+
signal: AbortSignal.timeout(3e4)
|
|
2264
|
+
});
|
|
2265
|
+
if (!response.ok) throw new Error(`xAI token refresh failed: ${response.status} ${await response.text().catch(() => "")}`);
|
|
2266
|
+
const payload = await response.json();
|
|
2267
|
+
const access = String(payload.access_token ?? "");
|
|
2268
|
+
if (!access) throw new Error("xAI token refresh did not return an access_token.");
|
|
2269
|
+
return {
|
|
2270
|
+
...xai,
|
|
2271
|
+
access,
|
|
2272
|
+
refresh: String(payload.refresh_token ?? credentials.refresh),
|
|
2273
|
+
expires: expiryFromPayload(payload),
|
|
2274
|
+
tokenEndpoint
|
|
2275
|
+
};
|
|
2276
|
+
}
|
|
2277
|
+
/**
|
|
2278
|
+
* Build an xAI `OAuthProviderInterface`. Shape matches Anthropic / Codex /
|
|
2279
|
+
* Cursor so it drops into `BUILTIN_PROVIDERS` and `src/auth.ts` unchanged.
|
|
2280
|
+
*
|
|
2281
|
+
* `usesCallbackServer: true` — the loopback flow has a real callback server,
|
|
2282
|
+
* so the TUI doesn't need to prompt for a manual code paste.
|
|
2283
|
+
*/
|
|
2284
|
+
function createXaiOAuthProvider(renderPage) {
|
|
2285
|
+
return {
|
|
2286
|
+
id: XAI_OAUTH_PROVIDER_ID,
|
|
2287
|
+
name: "xAI Grok (SuperGrok / X Premium+)",
|
|
2288
|
+
usesCallbackServer: true,
|
|
2289
|
+
login: (callbacks) => loginXai(renderPage, callbacks),
|
|
2290
|
+
refreshToken: refreshXaiToken,
|
|
2291
|
+
getApiKey: (credentials) => credentials.access
|
|
2292
|
+
};
|
|
2293
|
+
}
|
|
2294
|
+
//#endregion
|
|
2295
|
+
//#region src/providers/xai.ts
|
|
2296
|
+
const DEFAULT_MODEL = "grok-4.3";
|
|
2297
|
+
function xai(params) {
|
|
2298
|
+
const defaultModel = params?.defaultModel || DEFAULT_MODEL;
|
|
2299
|
+
const baseURL = xaiBaseUrl();
|
|
2300
|
+
const capabilities = params?.capabilities ?? {
|
|
2301
|
+
vision: true,
|
|
2302
|
+
imageInToolResult: false
|
|
2303
|
+
};
|
|
2304
|
+
const baseCredentials = extractRuntimeCredentials(params);
|
|
2305
|
+
let runtimeCredentials = baseCredentials;
|
|
2306
|
+
const staticKey = params?.apiKey ?? process.env.XAI_API_KEY;
|
|
2307
|
+
const isOAuth = baseCredentials !== void 0 || !staticKey || isOAuthAccessToken(staticKey);
|
|
2308
|
+
/**
|
|
2309
|
+
* Build the openai-compat delegate for a resolved bearer. Cheap — the factory
|
|
2310
|
+
* only wires closures — so we re-create it per turn with the freshly resolved
|
|
2311
|
+
* (possibly refreshed) OAuth token rather than baking a stale key in once.
|
|
2312
|
+
*/
|
|
2313
|
+
function delegateFor(apiKey) {
|
|
2314
|
+
return openaiCompat({
|
|
2315
|
+
name: "xai",
|
|
2316
|
+
apiKey,
|
|
2317
|
+
baseURL,
|
|
2318
|
+
defaultModel,
|
|
2319
|
+
capabilities,
|
|
2320
|
+
extraHeaders: params?.extraHeaders
|
|
2321
|
+
});
|
|
2322
|
+
}
|
|
2323
|
+
const skeleton = delegateFor("placeholder-resolved-at-stream");
|
|
2324
|
+
return {
|
|
2325
|
+
...skeleton,
|
|
2326
|
+
name: "xai",
|
|
2327
|
+
meta: {
|
|
2328
|
+
...skeleton.meta,
|
|
2329
|
+
defaultModel,
|
|
2330
|
+
isOAuth
|
|
2331
|
+
},
|
|
2332
|
+
async stream(options, callbacks) {
|
|
2333
|
+
return delegateFor(await resolveOAuthApiKey({
|
|
2334
|
+
provider: "xai",
|
|
2335
|
+
providerId: XAI_OAUTH_PROVIDER_ID,
|
|
2336
|
+
params: runtimeCredentials ? {
|
|
2337
|
+
...params,
|
|
2338
|
+
...runtimeCredentials
|
|
2339
|
+
} : params,
|
|
2340
|
+
envKey: "XAI_API_KEY",
|
|
2341
|
+
missingError: "No xAI credentials found. Set XAI_API_KEY or run `bun run auth --xai` first.",
|
|
2342
|
+
refreshError: (reason) => `xAI OAuth token refresh failed. Run \`bun run auth --xai\` again. ${reason}`
|
|
2343
|
+
}, {
|
|
2344
|
+
...callbacks,
|
|
2345
|
+
async onOAuthRefresh(ctx) {
|
|
2346
|
+
if (ctx.source === "params") runtimeCredentials = {
|
|
2347
|
+
access: ctx.credentials.access,
|
|
2348
|
+
refresh: ctx.credentials.refresh,
|
|
2349
|
+
expires: ctx.credentials.expires
|
|
2350
|
+
};
|
|
2351
|
+
await callbacks.onOAuthRefresh?.(ctx);
|
|
2352
|
+
}
|
|
2353
|
+
})).stream(options, callbacks);
|
|
2354
|
+
}
|
|
2355
|
+
};
|
|
2356
|
+
}
|
|
2357
|
+
//#endregion
|
|
2358
|
+
export { ANTHROPIC_EXTRA_MODELS as _, local as a, generatePkce as c, planBasetenReasoning as d, arcee as f, writeFileAtomicAsync as g, writeFileAtomic as h, openai as i, cerebras as l, applyAnthropicCacheBreakpoints as m, createXaiOAuthProvider as n, cursor as o, anthropic as p, openrouter as r, createCursorOAuthProvider as s, xai as t, baseten as u, FAST_MODE_OPTIONS as v };
|
|
2029
2359
|
|
|
2030
|
-
//# sourceMappingURL=providers-
|
|
2360
|
+
//# sourceMappingURL=providers-C_zClj1S.js.map
|