zidane 7.0.13 → 7.0.15
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/{acp-bTPYx7Sd.js → acp-Bw2b_kka.js} +3 -3
- package/dist/{acp-bTPYx7Sd.js.map → acp-Bw2b_kka.js.map} +1 -1
- package/dist/acp-cli.js +4 -4
- package/dist/acp.d.ts +1 -1
- package/dist/acp.js +1 -1
- package/dist/{agent-DRNT6DbC.js → agent-B_uQo4f1.js} +650 -49
- package/dist/agent-B_uQo4f1.js.map +1 -0
- package/dist/agent.d.ts +1 -1
- package/dist/agent.js +1 -1
- package/dist/{anthropic-Da39cE-d.js → anthropic-QbHqqTkV.js} +2 -2
- package/dist/{anthropic-Da39cE-d.js.map → anthropic-QbHqqTkV.js.map} +1 -1
- package/dist/{approvals-Ch6gmO8H.js → approvals-B9aIQJRQ.js} +287 -45
- package/dist/approvals-B9aIQJRQ.js.map +1 -0
- package/dist/artifacts-CV2hUKnL.js +112 -0
- package/dist/artifacts-CV2hUKnL.js.map +1 -0
- package/dist/{auth-Ddk-rCdG.js → auth-plw6npda.js} +19 -7
- package/dist/auth-plw6npda.js.map +1 -0
- package/dist/chat/pure.d.ts +3 -3
- package/dist/chat/pure.js +1 -1
- package/dist/chat.d.ts +6 -6
- package/dist/chat.js +5 -5
- package/dist/contexts/daytona.d.ts +1 -1
- package/dist/contexts/e2b.d.ts +1 -1
- package/dist/daemon-cli.js +1 -1
- package/dist/eval.d.ts +1 -1
- package/dist/eval.js +1 -1
- package/dist/extensions.d.ts +2 -2
- package/dist/extensions.js +2 -2
- package/dist/headless.d.ts +1 -1
- package/dist/headless.js +2 -2
- package/dist/{index-DFGECPfm.d.ts → index-Dc_zYpEu.d.ts} +351 -2
- package/dist/index-Dc_zYpEu.d.ts.map +1 -0
- package/dist/{index-DP7xYXr9.d.ts → index-Df2CH6bn.d.ts} +92 -7
- package/dist/index-Df2CH6bn.d.ts.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +7 -6
- package/dist/{ipc-C8MCEu1E.js → ipc-T_pPnHkp.js} +2 -2
- package/dist/{ipc-C8MCEu1E.js.map → ipc-T_pPnHkp.js.map} +1 -1
- package/dist/ipc.d.ts +54 -6
- package/dist/ipc.d.ts.map +1 -1
- package/dist/ipc.js +3 -3
- package/dist/mcp.d.ts +1 -1
- package/dist/{oauth-C4GvY_p1.js → oauth-EIBUuSDK.js} +2 -2
- package/dist/{oauth-C4GvY_p1.js.map → oauth-EIBUuSDK.js.map} +1 -1
- package/dist/output/stream-json.d.ts +1 -1
- package/dist/output/terminal.d.ts +1 -1
- package/dist/plugins.d.ts +1 -1
- package/dist/presets.d.ts +2 -2
- package/dist/presets.js +2 -2
- package/dist/providers/anthropic.d.ts +1 -1
- package/dist/providers/anthropic.js +1 -1
- package/dist/providers/arcee.d.ts +1 -1
- package/dist/providers/baseten.d.ts +1 -1
- package/dist/providers/cerebras.d.ts +1 -1
- package/dist/providers/local.d.ts +1 -1
- package/dist/providers/openai-compat.d.ts +1 -1
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openai.js +1 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/xai.d.ts +1 -1
- package/dist/providers/xai.js +2 -2
- package/dist/{providers-BYgyPb15.js → providers-CoK1rZ1p.js} +2 -2
- package/dist/{providers-BYgyPb15.js.map → providers-CoK1rZ1p.js.map} +1 -1
- package/dist/providers.d.ts +1 -1
- package/dist/providers.js +3 -3
- package/dist/restate.d.ts +1 -1
- package/dist/restate.js +1 -1
- package/dist/{server-CGmy4363.js → server-DXM8ZbGi.js} +64 -6
- package/dist/server-DXM8ZbGi.js.map +1 -0
- package/dist/session/sqlite.d.ts +1 -1
- package/dist/session/sqlite.d.ts.map +1 -1
- package/dist/session/sqlite.js +117 -1
- package/dist/session/sqlite.js.map +1 -1
- package/dist/{session-K3icbPH9.js → session-DPZnncaQ.js} +60 -1
- package/dist/session-DPZnncaQ.js.map +1 -0
- package/dist/session.d.ts +2 -2
- package/dist/session.js +3 -2
- package/dist/skills.d.ts +1 -1
- package/dist/{tool-formatters-C-s_-u0v.d.ts → tool-formatters-BgdOYAy9.d.ts} +2 -2
- package/dist/{tool-formatters-C-s_-u0v.d.ts.map → tool-formatters-BgdOYAy9.d.ts.map} +1 -1
- package/dist/tools/fetch-url.d.ts +1 -1
- package/dist/tools/web-search.d.ts +1 -1
- package/dist/tools.d.ts +2 -2
- package/dist/tools.js +2 -2
- package/dist/{transcript-anchors-D1ToF-EW.d.ts → transcript-anchors-CtnwuQJM.d.ts} +3 -3
- package/dist/transcript-anchors-CtnwuQJM.d.ts.map +1 -0
- package/dist/tui.d.ts +3 -3
- package/dist/tui.d.ts.map +1 -1
- package/dist/tui.js +576 -102
- package/dist/tui.js.map +1 -1
- package/dist/{turn-operations-CZLsNgw-.js → turn-operations-DkJ1R0p8.js} +4 -3
- package/dist/turn-operations-DkJ1R0p8.js.map +1 -0
- package/dist/{turn-operations-Bp5-BAki.d.ts → turn-operations-khAvr7KJ.d.ts} +5 -3
- package/dist/turn-operations-khAvr7KJ.d.ts.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/{xai-DILdFGzN.js → xai-CazjStOK.js} +3 -3
- package/dist/{xai-DILdFGzN.js.map → xai-CazjStOK.js.map} +1 -1
- package/docs/EXTENSIONS.md +58 -0
- package/docs/IPC.md +9 -0
- package/docs/TUI.md +2 -0
- package/package.json +1 -1
- package/dist/agent-DRNT6DbC.js.map +0 -1
- package/dist/approvals-Ch6gmO8H.js.map +0 -1
- package/dist/auth-Ddk-rCdG.js.map +0 -1
- package/dist/index-DFGECPfm.d.ts.map +0 -1
- package/dist/index-DP7xYXr9.d.ts.map +0 -1
- package/dist/server-CGmy4363.js.map +0 -1
- package/dist/session-K3icbPH9.js.map +0 -1
- package/dist/transcript-anchors-D1ToF-EW.d.ts.map +0 -1
- package/dist/turn-operations-Bp5-BAki.d.ts.map +0 -1
- package/dist/turn-operations-CZLsNgw-.js.map +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { n as __require } from "./rolldown-runtime-BhDjJH2R.js";
|
|
2
2
|
import { n as THINKING_LEVELS, u as toolResultToText } from "./types-CWgENVLY.js";
|
|
3
|
-
import { A as selectFilesFromSession,
|
|
3
|
+
import { A as selectFilesFromSession, Cn as createDebugLog, D as resolveTasksDir, Dt as isSpawnTool, Et as createSpawnTool, G as summaryToTurn, Gt as glob, Ht as listFiles, It as readFile$1, Jn as OUTPUT_RESERVE_TOKENS, Jt as artifacts_default, Kt as edit, M as compactConversation, Mt as shellKill, O as buildPostCompactAttachments, Pt as shell, Rn as artifactKindLabel, Rt as multiEdit, St as writeFile$1, T as resolvePersistDir, Wn as renderArtifactRow, Wt as grep, Y as EMPTY_EXTENSION_REGISTRY, Yn as effectiveContextWindow, b as migrateSessionArtifactDirs, f as applyCompactSummaryCutoff, ft as filterRegistryPlugins, ln as readKeybindingsRaw, lt as composeExtensionPreset, on as mergeKeybindings, st as buildExtensionPreset, t as createAgent, un as resolveExtensionKeybindings, vt as composePresets, w as resolveMcpWarningsDir, wt as waitTask, yt as definePreset } from "./agent-B_uQo4f1.js";
|
|
4
4
|
import { F as parseCommandInvocation, M as commandBlocksToContent, P as executeCommand, c as SKILL_EDIT_METADATA_KEY, g as readSkillEditMarker, j as commandBlockToEvent, l as ZIDANE_EXTENSION_SKILL_NAME, m as extensionDirForCwd, s as EXTENSION_EDIT_METADATA_KEY, u as ZIDANE_SKILL_EDIT_SKILL_NAME, v as withZidaneExtensionSkill, w as generateStructuredData, y as withZidaneSkillEditSkill } from "./src-DzzhE2YO.js";
|
|
5
|
-
import { a as formatDuration, c as previewLine, i as fmtTokens, l as shortId, s as formatTaskSummary } from "./format-BF745pLL.js";
|
|
5
|
+
import { a as formatDuration, c as previewLine, i as fmtTokens, l as shortId, s as formatTaskSummary, t as ageString } from "./format-BF745pLL.js";
|
|
6
6
|
import { r as createProcessContext } from "./contexts-BSFQVclW.js";
|
|
7
7
|
import { u as errorMessage$1 } from "./errors-DKiMrOKq.js";
|
|
8
8
|
import { L as projectUserPaths, R as findGitRoot$1, x as discoverSkills } from "./skills-PJyiSRCp.js";
|
|
@@ -11,14 +11,14 @@ import { n as defaultPluginDataRoot, p as resolveStorageDirs, r as loadAgentPlug
|
|
|
11
11
|
import { r as createLogger, t as consoleSink } from "./logger--C1VQjwJ.js";
|
|
12
12
|
import { h as McpOAuthProvider, l as normalizeMcpServers, n as connectMcpServers, s as nonOwningMcpView } from "./mcp-BIWa57eY.js";
|
|
13
13
|
import { appendDynamicSection, joinSystemPrompt, splitSystemPrompt } from "./prompt.js";
|
|
14
|
-
import { o as loadSession, t as createSession } from "./session-
|
|
14
|
+
import { o as loadSession, t as createSession } from "./session-DPZnncaQ.js";
|
|
15
15
|
import { n as flattenTurns, r as formatTokenUsage } from "./stats-DAKBEKjc.js";
|
|
16
16
|
import { i as installCacheBreakLogger } from "./cache-telemetry-ehVdWsg2.js";
|
|
17
17
|
import { i as findActiveTriggers, n as collectReferences, o as mergeSuggestions, t as applyInsert } from "./completion-core-BRo86R_L.js";
|
|
18
18
|
import { r as fetchUrl } from "./fetch-url-ma-5_p0p.js";
|
|
19
19
|
import { webSearch } from "./tools/web-search.js";
|
|
20
|
-
import { $t as hasRunReceipt, A as chunkMarkdownForRender, Dt as MAIN_PLAYBOOK_FRAGMENT, Ft as orchestratedBy, It as parseSessionEventXml, K as filterChainFallbacks, Lt as renderProjectsBriefing, Mt as WORKER_REPORT_FRAGMENT, Nt as artifactsFromTurns, Ot as MAIN_SESSION_TITLE, Pt as isMainSession, Q as restoreChainFallbacks, Rt as renderSessionEventXml, Sn as chatReferenceTokensFromText, V as buildRunModel, Vt as sessionEventLabel, Xt as formatRunReceiptLine, _n as resolveApprovalForPayload, bt as promptTurnRefs, en as runReceiptFromRun, gn as parseEditOutcomesFromResult, hn as mergeApprovalAndBodyOutcomes, jt as SESSION_ROLE_KEY, kt as ORCHESTRATED_BY_KEY, ln as previewEditPayload, m as ownerOf, pn as buildEditOutcomesAnnotation, sn as extractEditPayload, u as capTranscriptEvents, vn as rewriteMultiEditHeader, yn as stripEditOutcomesAnnotation } from "./turn-operations-
|
|
21
|
-
import { T as restoreModelOptions, b as modelSupportsReasoning, d as BUILTIN_PROVIDERS, f as anthropicDescriptor, g as getContextWindow, h as enabledModelOptions, i as readCredentials, m as credKeyOf, n as applyApiKeyEnv, r as credentialsPath, t as detectAuth, x as modelsForDescriptor } from "./auth-
|
|
20
|
+
import { $t as hasRunReceipt, A as chunkMarkdownForRender, Dt as MAIN_PLAYBOOK_FRAGMENT, Ft as orchestratedBy, It as parseSessionEventXml, K as filterChainFallbacks, Lt as renderProjectsBriefing, Mt as WORKER_REPORT_FRAGMENT, Nt as artifactsFromTurns, Ot as MAIN_SESSION_TITLE, Pt as isMainSession, Q as restoreChainFallbacks, Rt as renderSessionEventXml, Sn as chatReferenceTokensFromText, V as buildRunModel, Vt as sessionEventLabel, Xt as formatRunReceiptLine, _n as resolveApprovalForPayload, bt as promptTurnRefs, en as runReceiptFromRun, gn as parseEditOutcomesFromResult, hn as mergeApprovalAndBodyOutcomes, jt as SESSION_ROLE_KEY, kt as ORCHESTRATED_BY_KEY, ln as previewEditPayload, m as ownerOf, pn as buildEditOutcomesAnnotation, sn as extractEditPayload, u as capTranscriptEvents, vn as rewriteMultiEditHeader, yn as stripEditOutcomesAnnotation } from "./turn-operations-DkJ1R0p8.js";
|
|
21
|
+
import { T as restoreModelOptions, b as modelSupportsReasoning, d as BUILTIN_PROVIDERS, f as anthropicDescriptor, g as getContextWindow, h as enabledModelOptions, i as readCredentials, m as credKeyOf, n as applyApiKeyEnv, r as credentialsPath, t as detectAuth, x as modelsForDescriptor } from "./auth-plw6npda.js";
|
|
22
22
|
import { basename, delimiter, dirname, isAbsolute, join, posix, relative, resolve, sep } from "node:path";
|
|
23
23
|
import { Buffer } from "node:buffer";
|
|
24
24
|
import { chmodSync, closeSync, cpSync, createReadStream, createWriteStream, existsSync, mkdirSync, mkdtempSync, openSync, readFileSync, readSync, readdirSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
@@ -26,6 +26,7 @@ import { readFile, readdir, stat, writeFile } from "node:fs/promises";
|
|
|
26
26
|
import { spawn } from "node:child_process";
|
|
27
27
|
import { homedir, tmpdir } from "node:os";
|
|
28
28
|
import { createHash, randomUUID } from "node:crypto";
|
|
29
|
+
import { Fzf } from "fzf";
|
|
29
30
|
import { createGunzip } from "node:zlib";
|
|
30
31
|
import { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
31
32
|
import { jsx } from "react/jsx-runtime";
|
|
@@ -102,6 +103,7 @@ function metaFromRow(row) {
|
|
|
102
103
|
runCount: row.runCount,
|
|
103
104
|
...isMainSession(row.metadata) ? { isMain: true } : {},
|
|
104
105
|
...row.projectRoot ? { projectRoot: row.projectRoot } : {},
|
|
106
|
+
...typeof row.artifactCount === "number" ? { artifactCount: row.artifactCount } : {},
|
|
105
107
|
updatedAt: row.updatedAt
|
|
106
108
|
};
|
|
107
109
|
}
|
|
@@ -1838,7 +1840,7 @@ function createTodoReadTool(opts) {
|
|
|
1838
1840
|
* error messages stay symmetric and one fix lands in both places.
|
|
1839
1841
|
*/
|
|
1840
1842
|
function requireSessionAndRun(ctx, toolName) {
|
|
1841
|
-
if (!ctx.session) throw new Error(`${toolName}: no session on tool context
|
|
1843
|
+
if (!ctx.session) throw new Error(`${toolName}: no session on tool context. Todos require a session via createSession().`);
|
|
1842
1844
|
if (!ctx.runId) throw new Error(`${toolName}: no runId on tool context.`);
|
|
1843
1845
|
return {
|
|
1844
1846
|
session: ctx.session,
|
|
@@ -2728,6 +2730,70 @@ function readIfPresent$1(path, source) {
|
|
|
2728
2730
|
};
|
|
2729
2731
|
}
|
|
2730
2732
|
//#endregion
|
|
2733
|
+
//#region src/chat/artifacts-view.ts
|
|
2734
|
+
/** Display order for the built-in kinds; anything else follows alphabetically. */
|
|
2735
|
+
const KIND_ORDER = [
|
|
2736
|
+
"pull_request",
|
|
2737
|
+
"branch",
|
|
2738
|
+
"commit",
|
|
2739
|
+
"file"
|
|
2740
|
+
];
|
|
2741
|
+
/**
|
|
2742
|
+
* Group by kind (built-ins first in a fixed order, then extension kinds
|
|
2743
|
+
* alphabetically); rows inside a group keep the store's newest-first order.
|
|
2744
|
+
*/
|
|
2745
|
+
function groupArtifacts(artifacts, registry) {
|
|
2746
|
+
const byKind = /* @__PURE__ */ new Map();
|
|
2747
|
+
for (const artifact of artifacts) {
|
|
2748
|
+
const list = byKind.get(artifact.kind) ?? [];
|
|
2749
|
+
list.push({
|
|
2750
|
+
artifact,
|
|
2751
|
+
row: renderArtifactRow(artifact, registry)
|
|
2752
|
+
});
|
|
2753
|
+
byKind.set(artifact.kind, list);
|
|
2754
|
+
}
|
|
2755
|
+
return [...byKind.keys()].sort((a, b) => {
|
|
2756
|
+
const ai = KIND_ORDER.indexOf(a);
|
|
2757
|
+
const bi = KIND_ORDER.indexOf(b);
|
|
2758
|
+
if (ai !== -1 || bi !== -1) return (ai === -1 ? KIND_ORDER.length : ai) - (bi === -1 ? KIND_ORDER.length : bi);
|
|
2759
|
+
return a.localeCompare(b);
|
|
2760
|
+
}).map((kind) => ({
|
|
2761
|
+
kind,
|
|
2762
|
+
label: artifactKindLabel(kind, registry),
|
|
2763
|
+
rows: byKind.get(kind)
|
|
2764
|
+
}));
|
|
2765
|
+
}
|
|
2766
|
+
/** `3 PRs · 2 files` style summary; empty string for none. */
|
|
2767
|
+
function summarizeArtifactCounts(artifacts, registry) {
|
|
2768
|
+
return groupArtifacts(artifacts, registry).map((g) => `${g.rows.length} ${pluralizeKind(g.label, g.rows.length)}`).join(" · ");
|
|
2769
|
+
}
|
|
2770
|
+
function pluralizeKind(label, count) {
|
|
2771
|
+
const lower = label.toLowerCase();
|
|
2772
|
+
if (count === 1) return lower;
|
|
2773
|
+
return /(?:s|x|ch|sh)$/.test(lower) ? `${lower}es` : `${lower}s`;
|
|
2774
|
+
}
|
|
2775
|
+
/**
|
|
2776
|
+
* Markdown for a `/artifacts` transcript note. `title` is the scope line
|
|
2777
|
+
* (`this session`, `project /repo`); rows link when they have an `href`.
|
|
2778
|
+
*/
|
|
2779
|
+
function formatArtifactsMarkdown(artifacts, opts) {
|
|
2780
|
+
const where = opts.scope === "project" ? `project ${opts.projectRoot ?? "(none)"}` : "this session";
|
|
2781
|
+
if (artifacts.length === 0) return `### Artifacts · ${where}\n\n_No artifacts yet. Pull requests, branches, commits and created files appear here as the agent produces them._`;
|
|
2782
|
+
return `### Artifacts · ${where}\n\n${groupArtifacts(artifacts, opts.registry).map((group) => {
|
|
2783
|
+
const lines = group.rows.map(({ artifact, row }) => {
|
|
2784
|
+
const parts = [row.href ? `[${row.title}](${row.href})` : `**${row.title}**`];
|
|
2785
|
+
if (row.status) parts.push(`\`${row.status}\``);
|
|
2786
|
+
if (row.subtitle && row.subtitle !== row.title) parts.push(row.subtitle);
|
|
2787
|
+
if (opts.scope === "project") {
|
|
2788
|
+
const title = opts.sessionTitle?.(artifact.sessionId);
|
|
2789
|
+
parts.push(`_${title ?? artifact.sessionId.slice(0, 8)}_`);
|
|
2790
|
+
}
|
|
2791
|
+
return `- ${parts.join(" · ")}`;
|
|
2792
|
+
});
|
|
2793
|
+
return `**${group.label}${group.rows.length === 1 ? "" : "s"}**\n${lines.join("\n")}`;
|
|
2794
|
+
}).join("\n\n")}`;
|
|
2795
|
+
}
|
|
2796
|
+
//#endregion
|
|
2731
2797
|
//#region src/chat/auto-compact.ts
|
|
2732
2798
|
/**
|
|
2733
2799
|
* Build the per-run `behavior.autoCompact` a chat host passes to `agent.run`.
|
|
@@ -3001,7 +3067,7 @@ function detectPackageManager(opts = {}) {
|
|
|
3001
3067
|
"install",
|
|
3002
3068
|
target
|
|
3003
3069
|
],
|
|
3004
|
-
note: "Volta-managed install detected
|
|
3070
|
+
note: "Volta-managed install detected, refreshing via `volta install`."
|
|
3005
3071
|
};
|
|
3006
3072
|
if (inPath(homeSeg(".bun"))) return {
|
|
3007
3073
|
id: "bun",
|
|
@@ -3079,7 +3145,7 @@ function detectPackageManager(opts = {}) {
|
|
|
3079
3145
|
"install",
|
|
3080
3146
|
target
|
|
3081
3147
|
],
|
|
3082
|
-
note: "$VOLTA_HOME set
|
|
3148
|
+
note: "$VOLTA_HOME set, using `volta install`. If the install is not Volta-managed, pass `--package-manager npm`."
|
|
3083
3149
|
};
|
|
3084
3150
|
if (env.BUN_INSTALL) return {
|
|
3085
3151
|
id: "bun",
|
|
@@ -4493,10 +4559,10 @@ function sanitizeJsonWhitespace(text) {
|
|
|
4493
4559
|
function enhanceJsonError(err, text) {
|
|
4494
4560
|
const orig = err instanceof Error ? err : new Error(String(err));
|
|
4495
4561
|
const hints = [];
|
|
4496
|
-
if (text.includes("\xA0")) hints.push("the file contains non-breaking spaces (U+00A0), likely
|
|
4562
|
+
if (text.includes("\xA0")) hints.push("the file contains non-breaking spaces (U+00A0), likely from copy-paste. Replace them with regular spaces");
|
|
4497
4563
|
if (text.charCodeAt(0) === 65279) hints.push("the file starts with a BOM (U+FEFF), which strict JSON.parse rejects");
|
|
4498
4564
|
if (hints.length === 0) return orig;
|
|
4499
|
-
return /* @__PURE__ */ new Error(`${orig.message}
|
|
4565
|
+
return /* @__PURE__ */ new Error(`${orig.message}. ${hints.join("; ")}`);
|
|
4500
4566
|
}
|
|
4501
4567
|
/**
|
|
4502
4568
|
* Strip `enabled: false` entries before normalization — same intent as the
|
|
@@ -4589,7 +4655,7 @@ function discoverProjectMcps(opts = {}) {
|
|
|
4589
4655
|
if (droppedStdio.length > 0) errors.push({
|
|
4590
4656
|
path,
|
|
4591
4657
|
source,
|
|
4592
|
-
message: `${droppedStdio.length} stdio server${droppedStdio.length === 1 ? "" : "s"} (${droppedStdio.join(", ")}) skipped
|
|
4658
|
+
message: `${droppedStdio.length} stdio server${droppedStdio.length === 1 ? "" : "s"} (${droppedStdio.join(", ")}) skipped. Running stdio commands from Ruler files needs “Import configurations from other agents” enabled.`,
|
|
4593
4659
|
informational: true
|
|
4594
4660
|
});
|
|
4595
4661
|
}
|
|
@@ -5290,7 +5356,7 @@ function importClaudeMcps(opts = {}) {
|
|
|
5290
5356
|
if (action === "updated") {
|
|
5291
5357
|
result.failed.push({
|
|
5292
5358
|
name: server.name,
|
|
5293
|
-
error: `overwrote an existing entry in ${target}
|
|
5359
|
+
error: `overwrote an existing entry in ${target}. Restore it from version control if unintended`
|
|
5294
5360
|
});
|
|
5295
5361
|
continue;
|
|
5296
5362
|
}
|
|
@@ -5385,7 +5451,7 @@ function importClaudeSkills(opts = {}) {
|
|
|
5385
5451
|
return result;
|
|
5386
5452
|
}
|
|
5387
5453
|
async function importFromClaudeCode(store, opts = {}) {
|
|
5388
|
-
const summary = { notes: ["CLAUDE.md is
|
|
5454
|
+
const summary = { notes: ["CLAUDE.md is read natively, nothing to import.", "Claude permissions/hooks/plugins have no zidane equivalent, not imported."] };
|
|
5389
5455
|
if (opts.sessions !== false) summary.sessions = await importClaudeSessions(store, opts);
|
|
5390
5456
|
if (opts.mcps !== false) summary.mcps = importClaudeMcps(opts);
|
|
5391
5457
|
if (opts.skills !== false) summary.skills = importClaudeSkills(opts);
|
|
@@ -5531,6 +5597,115 @@ function useCompletion(input, providers, options = {}) {
|
|
|
5531
5597
|
]);
|
|
5532
5598
|
}
|
|
5533
5599
|
//#endregion
|
|
5600
|
+
//#region src/chat/completion-artifacts.ts
|
|
5601
|
+
const ARTIFACTS_COMPLETION_PROVIDER_ID = "artifacts";
|
|
5602
|
+
const DEFAULT_RESULT_LIMIT = 30;
|
|
5603
|
+
/** Kind → short query aliases so `#pr` and `#branch` hit without typing the label. */
|
|
5604
|
+
const KIND_ALIASES = {
|
|
5605
|
+
pull_request: [
|
|
5606
|
+
"pr",
|
|
5607
|
+
"pull",
|
|
5608
|
+
"mr"
|
|
5609
|
+
],
|
|
5610
|
+
branch: ["branch", "br"],
|
|
5611
|
+
commit: ["commit", "sha"],
|
|
5612
|
+
file: ["file", "path"]
|
|
5613
|
+
};
|
|
5614
|
+
function locatorFor(entry) {
|
|
5615
|
+
return entry.row.href ?? entry.artifact.uri;
|
|
5616
|
+
}
|
|
5617
|
+
function haystack(entry) {
|
|
5618
|
+
const aliases = KIND_ALIASES[entry.artifact.kind] ?? [entry.artifact.kind];
|
|
5619
|
+
return [
|
|
5620
|
+
entry.row.title,
|
|
5621
|
+
entry.row.subtitle ?? "",
|
|
5622
|
+
entry.artifact.label,
|
|
5623
|
+
entry.kindLabel,
|
|
5624
|
+
...aliases
|
|
5625
|
+
].join(" ");
|
|
5626
|
+
}
|
|
5627
|
+
function descriptionFor(entry) {
|
|
5628
|
+
const bits = [entry.kindLabel];
|
|
5629
|
+
if (entry.row.status) bits.push(entry.row.status);
|
|
5630
|
+
bits.push(ageString(entry.artifact.updatedAt));
|
|
5631
|
+
const loc = locatorFor(entry);
|
|
5632
|
+
if (loc !== entry.row.title) bits.push(loc);
|
|
5633
|
+
return bits.join(" · ");
|
|
5634
|
+
}
|
|
5635
|
+
function scoreArtifacts(catalog, query, limit = DEFAULT_RESULT_LIMIT) {
|
|
5636
|
+
const q = query.trim().toLowerCase();
|
|
5637
|
+
const fuzzy = q.length > 0 ? new Set(new Fzf(catalog, {
|
|
5638
|
+
selector: haystack,
|
|
5639
|
+
casing: "case-insensitive"
|
|
5640
|
+
}).find(q).map((r) => r.item)) : null;
|
|
5641
|
+
const scored = [];
|
|
5642
|
+
for (const entry of catalog) {
|
|
5643
|
+
if (q.length === 0) {
|
|
5644
|
+
scored.push({
|
|
5645
|
+
entry,
|
|
5646
|
+
rank: 5
|
|
5647
|
+
});
|
|
5648
|
+
continue;
|
|
5649
|
+
}
|
|
5650
|
+
const title = entry.row.title.toLowerCase();
|
|
5651
|
+
const aliases = (KIND_ALIASES[entry.artifact.kind] ?? [entry.artifact.kind]).map((a) => a.toLowerCase());
|
|
5652
|
+
const kindLabel = entry.kindLabel.toLowerCase();
|
|
5653
|
+
if (aliases.some((a) => a === q || a.startsWith(q)) || kindLabel.startsWith(q)) {
|
|
5654
|
+
scored.push({
|
|
5655
|
+
entry,
|
|
5656
|
+
rank: 0
|
|
5657
|
+
});
|
|
5658
|
+
continue;
|
|
5659
|
+
}
|
|
5660
|
+
if (title.startsWith(q)) {
|
|
5661
|
+
scored.push({
|
|
5662
|
+
entry,
|
|
5663
|
+
rank: 1
|
|
5664
|
+
});
|
|
5665
|
+
continue;
|
|
5666
|
+
}
|
|
5667
|
+
if (title.includes(q) || locatorFor(entry).toLowerCase().includes(q)) {
|
|
5668
|
+
scored.push({
|
|
5669
|
+
entry,
|
|
5670
|
+
rank: 2
|
|
5671
|
+
});
|
|
5672
|
+
continue;
|
|
5673
|
+
}
|
|
5674
|
+
if (fuzzy?.has(entry)) scored.push({
|
|
5675
|
+
entry,
|
|
5676
|
+
rank: 4
|
|
5677
|
+
});
|
|
5678
|
+
}
|
|
5679
|
+
scored.sort((a, b) => a.rank - b.rank || b.entry.artifact.updatedAt - a.entry.artifact.updatedAt);
|
|
5680
|
+
return scored.slice(0, limit).map(({ entry }) => {
|
|
5681
|
+
const locator = locatorFor(entry);
|
|
5682
|
+
return {
|
|
5683
|
+
id: `artifact:${entry.artifact.id}`,
|
|
5684
|
+
label: entry.row.title,
|
|
5685
|
+
description: descriptionFor(entry),
|
|
5686
|
+
insertText: `${locator} `,
|
|
5687
|
+
data: {
|
|
5688
|
+
entry,
|
|
5689
|
+
locator
|
|
5690
|
+
}
|
|
5691
|
+
};
|
|
5692
|
+
});
|
|
5693
|
+
}
|
|
5694
|
+
function createArtifactsCompletionProvider(opts) {
|
|
5695
|
+
const limit = opts.limit ?? DEFAULT_RESULT_LIMIT;
|
|
5696
|
+
return {
|
|
5697
|
+
id: ARTIFACTS_COMPLETION_PROVIDER_ID,
|
|
5698
|
+
trigger: "#",
|
|
5699
|
+
label: "Artifacts",
|
|
5700
|
+
suggest(query) {
|
|
5701
|
+
const current = opts.getCatalog();
|
|
5702
|
+
if (current.length > 0 || !opts.ensureCatalog) return scoreArtifacts(current, query, limit);
|
|
5703
|
+
return opts.ensureCatalog().then((loaded) => scoreArtifacts(loaded, query, limit));
|
|
5704
|
+
},
|
|
5705
|
+
parseReferences: () => []
|
|
5706
|
+
};
|
|
5707
|
+
}
|
|
5708
|
+
//#endregion
|
|
5534
5709
|
//#region src/chat/user-config.ts
|
|
5535
5710
|
/**
|
|
5536
5711
|
* User-level config at `~/.{prefix}/config.json`. Holds global flags
|
|
@@ -7372,13 +7547,13 @@ const SETTINGS_TOGGLES = [
|
|
|
7372
7547
|
key: "orchestration",
|
|
7373
7548
|
requires: "useDaemon",
|
|
7374
7549
|
label: "Main session (orchestration)",
|
|
7375
|
-
description: "pin a
|
|
7550
|
+
description: "pin a Main session that creates, steers and reads other sessions and receives their outcomes in its own history. Requires the daemon runtime"
|
|
7376
7551
|
},
|
|
7377
7552
|
{
|
|
7378
7553
|
category: "agent",
|
|
7379
7554
|
key: "useDaemon",
|
|
7380
7555
|
label: "Use daemon runtime (experimental)",
|
|
7381
|
-
description: "
|
|
7556
|
+
description: "run sessions in a shared daemon: runs survive window close and every TUI/GUI window shares the live stream, drafts, queue and settings. Takes effect on the next session activation"
|
|
7382
7557
|
},
|
|
7383
7558
|
{
|
|
7384
7559
|
category: "agent",
|
|
@@ -8894,7 +9069,7 @@ function createBuiltinCommands(opts) {
|
|
|
8894
9069
|
description: "List the available / commands",
|
|
8895
9070
|
run: (ctx) => {
|
|
8896
9071
|
const all = [...opts.getCommands()].sort((a, b) => a.name.localeCompare(b.name));
|
|
8897
|
-
const body = all.length === 0 ? "_No commands are registered._" : all.map((c) => `- **/${c.name}
|
|
9072
|
+
const body = all.length === 0 ? "_No commands are registered._" : all.map((c) => `- **/${c.name}**: ${c.description}`).join("\n");
|
|
8898
9073
|
ctx.emit({ text: `### Commands\n\n${body}` });
|
|
8899
9074
|
}
|
|
8900
9075
|
}];
|
|
@@ -8909,7 +9084,26 @@ function createBuiltinCommands(opts) {
|
|
|
8909
9084
|
detail: { label: "reloading extensions…" }
|
|
8910
9085
|
});
|
|
8911
9086
|
const { active, inactive } = await reload();
|
|
8912
|
-
ctx.emit({ text: `Reloaded
|
|
9087
|
+
ctx.emit({ text: `Reloaded: **${active}** active${inactive > 0 ? `, ${inactive} inactive` : ""}. Agent tools apply on the next run.` });
|
|
9088
|
+
}
|
|
9089
|
+
});
|
|
9090
|
+
}
|
|
9091
|
+
if (opts.artifacts) {
|
|
9092
|
+
const artifacts = opts.artifacts;
|
|
9093
|
+
commands.push({
|
|
9094
|
+
name: "artifacts",
|
|
9095
|
+
description: "List what this session produced (pull requests, branches, commits, files). `/artifacts project` covers every session in this project",
|
|
9096
|
+
completeArgs: (prefix) => ["project", "session"].filter((v) => v.startsWith(prefix.trim())).map((value) => ({ value })),
|
|
9097
|
+
run: async (ctx) => {
|
|
9098
|
+
const scope = ctx.argv[0]?.toLowerCase() === "project" ? "project" : "session";
|
|
9099
|
+
if (artifacts.open?.(scope)) return;
|
|
9100
|
+
const rows = await artifacts.list(scope);
|
|
9101
|
+
ctx.emit({ text: formatArtifactsMarkdown(rows, {
|
|
9102
|
+
scope,
|
|
9103
|
+
...artifacts.projectRoot ? { projectRoot: artifacts.projectRoot() } : {},
|
|
9104
|
+
...artifacts.registry ? { registry: artifacts.registry() } : {},
|
|
9105
|
+
...artifacts.sessionTitle ? { sessionTitle: artifacts.sessionTitle } : {}
|
|
9106
|
+
}) });
|
|
8913
9107
|
}
|
|
8914
9108
|
});
|
|
8915
9109
|
}
|
|
@@ -9063,7 +9257,15 @@ function sessionHostRuntime(run, env, deps) {
|
|
|
9063
9257
|
handle
|
|
9064
9258
|
};
|
|
9065
9259
|
},
|
|
9066
|
-
workspaceAvailable: () => true
|
|
9260
|
+
workspaceAvailable: () => true,
|
|
9261
|
+
artifacts: () => {
|
|
9262
|
+
const session = run.agent.session;
|
|
9263
|
+
return {
|
|
9264
|
+
store: env.store,
|
|
9265
|
+
...session ? { sessionId: session.id } : {},
|
|
9266
|
+
...session?.projectRoot ? { projectRoot: session.projectRoot } : {}
|
|
9267
|
+
};
|
|
9268
|
+
}
|
|
9067
9269
|
};
|
|
9068
9270
|
}
|
|
9069
9271
|
function isThinkingLevel$2(value) {
|
|
@@ -9106,9 +9308,23 @@ function createCommandModule(deps) {
|
|
|
9106
9308
|
* a window attached to the daemon and one running locally resolve the same
|
|
9107
9309
|
* name to the same command.
|
|
9108
9310
|
*/
|
|
9109
|
-
function mergedCommands(extensionCommands) {
|
|
9311
|
+
function mergedCommands(extensionCommands, scope) {
|
|
9110
9312
|
const merged = [];
|
|
9111
|
-
const builtins = createBuiltinCommands({
|
|
9313
|
+
const builtins = createBuiltinCommands({
|
|
9314
|
+
getCommands: () => merged,
|
|
9315
|
+
artifacts: {
|
|
9316
|
+
list: async (mode) => {
|
|
9317
|
+
if (!env.store.listArtifacts || !scope) return [];
|
|
9318
|
+
if (mode === "project") {
|
|
9319
|
+
const root = scope.session.projectRoot;
|
|
9320
|
+
return root ? env.store.listArtifacts({ projectRoot: root }) : [];
|
|
9321
|
+
}
|
|
9322
|
+
return env.store.listArtifacts({ sessionId: scope.session.id });
|
|
9323
|
+
},
|
|
9324
|
+
projectRoot: () => scope?.session.projectRoot,
|
|
9325
|
+
registry: () => scope?.registry
|
|
9326
|
+
}
|
|
9327
|
+
});
|
|
9112
9328
|
const seen = /* @__PURE__ */ new Set();
|
|
9113
9329
|
for (const command of [...extensionCommands, ...builtins]) {
|
|
9114
9330
|
const key = command.name.toLowerCase();
|
|
@@ -9200,12 +9416,15 @@ function createCommandModule(deps) {
|
|
|
9200
9416
|
if (!prompt.startsWith("/")) return { ran: false };
|
|
9201
9417
|
const run = await ensureAgent(opts.sessionId);
|
|
9202
9418
|
const runtimeConfig = await env.runtimeConfig(run.cwd);
|
|
9203
|
-
const commands = mergedCommands(runtimeConfig.extensions.commands
|
|
9419
|
+
const commands = mergedCommands(runtimeConfig.extensions.commands, run.agent.session ? {
|
|
9420
|
+
session: run.agent.session,
|
|
9421
|
+
registry: runtimeConfig.extensions
|
|
9422
|
+
} : void 0);
|
|
9204
9423
|
const invocation = parseCommandInvocation(prompt, commands);
|
|
9205
9424
|
if (!invocation) return { ran: false };
|
|
9206
9425
|
const command = commands.find((c) => c.name === invocation.name);
|
|
9207
9426
|
if (!command) return { ran: false };
|
|
9208
|
-
if (run.agent.isRunning) throw new Error(`/${invocation.name}: a run is
|
|
9427
|
+
if (run.agent.isRunning) throw new Error(`/${invocation.name}: a run is in progress. Wait for it to finish.`);
|
|
9209
9428
|
const session = run.agent.session;
|
|
9210
9429
|
if (!session) throw new Error(`/${invocation.name}: session is not available`);
|
|
9211
9430
|
const sessionId = opts.sessionId;
|
|
@@ -9811,20 +10030,24 @@ function createOrchestration(deps) {
|
|
|
9811
10030
|
return main;
|
|
9812
10031
|
}
|
|
9813
10032
|
/**
|
|
10033
|
+
* Wake preference for the NEXT run of a session, written by the main's
|
|
10034
|
+
* `create` / `send` and CONSUMED when that run ends (see the `run:end`
|
|
10035
|
+
* branch). One assignment, one wake: left in place it would outlive the run
|
|
10036
|
+
* it described, so a session the human also drives would keep waking the
|
|
10037
|
+
* main for turns the main never asked for.
|
|
10038
|
+
*
|
|
10039
|
+
* In-memory on purpose: it describes the main's current assignment, which is
|
|
10040
|
+
* meaningless after a daemon restart (the run it referred to is gone), and
|
|
10041
|
+
* writing it into a live session's metadata would race the agent's saves.
|
|
10042
|
+
* Absent = the default rule: own workers wake, other sessions only report.
|
|
10043
|
+
*/
|
|
10044
|
+
const wakePolicy = /* @__PURE__ */ new Map();
|
|
10045
|
+
/**
|
|
9814
10046
|
* Where a session's events go. EVERY non-main session reports to the main —
|
|
9815
10047
|
* the main is an observer of the whole store, not only of the sessions it
|
|
9816
10048
|
* created — so a chat the human runs elsewhere still shows up in the main's
|
|
9817
10049
|
* history. Returns `null` for the main itself and for unknown ids.
|
|
9818
10050
|
*/
|
|
9819
|
-
/**
|
|
9820
|
-
* Per-session wake preference, set by the main's last `create` / `send` and
|
|
9821
|
-
* kept until the next one overrides it. In-memory on purpose: it describes
|
|
9822
|
-
* the main's CURRENT assignment ("I am / am not waiting on this"), which is
|
|
9823
|
-
* meaningless after a daemon restart (the run it referred to is gone), and
|
|
9824
|
-
* writing it into a live session's metadata would race the agent's saves.
|
|
9825
|
-
* Absent = the default rule: own workers wake, other sessions do not.
|
|
9826
|
-
*/
|
|
9827
|
-
const wakePolicy = /* @__PURE__ */ new Map();
|
|
9828
10051
|
async function reportsTo(sessionId) {
|
|
9829
10052
|
const main = await mainId();
|
|
9830
10053
|
if (!main || sessionId === main) return null;
|
|
@@ -10185,6 +10408,7 @@ function createOrchestration(deps) {
|
|
|
10185
10408
|
}
|
|
10186
10409
|
const target = await reportsTo(signal.sessionId);
|
|
10187
10410
|
if (!target) return;
|
|
10411
|
+
wakePolicy.delete(signal.sessionId);
|
|
10188
10412
|
const summary = await read(signal.sessionId);
|
|
10189
10413
|
const now = Date.now();
|
|
10190
10414
|
const data = deps.liveSession(signal.sessionId) ?? await deps.store.load(signal.sessionId);
|
|
@@ -10884,7 +11108,7 @@ function createChatHost(env) {
|
|
|
10884
11108
|
if (!profile) throw new Error("No agent profiles are registered.");
|
|
10885
11109
|
const pluginCatalog = await pluginsForCwd(cwd, runtimeConfig.prefix, runtimeConfig.pluginScanPaths ?? []);
|
|
10886
11110
|
const liveExtensions = filterRegistryPlugins(runtimeConfig.extensions, settings.enabledPlugins, new Set(pluginCatalog.map((p) => p.name)));
|
|
10887
|
-
const composedPreset = composeExtensionPreset(liveExtensions, profile.preset);
|
|
11111
|
+
const composedPreset = composeExtensionPreset(liveExtensions, composePresets(artifacts_default, profile.preset));
|
|
10888
11112
|
const session = await loadSession(store, sessionId) ?? await createSession({
|
|
10889
11113
|
id: sessionId,
|
|
10890
11114
|
agentId: profile.id,
|
|
@@ -11280,6 +11504,20 @@ function createChatHost(env) {
|
|
|
11280
11504
|
agent
|
|
11281
11505
|
});
|
|
11282
11506
|
});
|
|
11507
|
+
agent.hooks.hook("artifact:recorded", (ctx) => {
|
|
11508
|
+
broadcast({
|
|
11509
|
+
kind: "artifact:recorded",
|
|
11510
|
+
sessionId,
|
|
11511
|
+
artifact: ctx.artifact
|
|
11512
|
+
});
|
|
11513
|
+
});
|
|
11514
|
+
agent.hooks.hook("child:artifact:recorded", (ctx) => {
|
|
11515
|
+
broadcast({
|
|
11516
|
+
kind: "artifact:recorded",
|
|
11517
|
+
sessionId,
|
|
11518
|
+
artifact: ctx.artifact
|
|
11519
|
+
});
|
|
11520
|
+
});
|
|
11283
11521
|
agent.hooks.hook("child:tool:after", (ctx) => {
|
|
11284
11522
|
dropWork(ctx.callId);
|
|
11285
11523
|
const event = {
|
|
@@ -11808,7 +12046,7 @@ function createChatHost(env) {
|
|
|
11808
12046
|
sessionId,
|
|
11809
12047
|
event: {
|
|
11810
12048
|
kind: "info",
|
|
11811
|
-
text:
|
|
12049
|
+
text: `model fallback: ${ctx.from.provider}/${ctx.from.model} failed (${reason}), continuing on ${ctx.to.provider}/${ctx.to.model}`
|
|
11812
12050
|
}
|
|
11813
12051
|
});
|
|
11814
12052
|
});
|
|
@@ -11894,6 +12132,7 @@ function createChatHost(env) {
|
|
|
11894
12132
|
if (!opts.wake) suppressedWake.delete(opts.sessionId);
|
|
11895
12133
|
const commandResult = await commands.runSlashCommand(opts);
|
|
11896
12134
|
if (commandResult.ran) return { runId: commandResult.runId ?? randomUUID() };
|
|
12135
|
+
if (opts.asCommand !== void 0) throw new Error(`unknown command: /${opts.asCommand}. This session's extensions do not provide it (different working directory, or the extension is not installed for it).`);
|
|
11897
12136
|
if (!opts.wake) broadcast({
|
|
11898
12137
|
kind: "event",
|
|
11899
12138
|
sessionId: opts.sessionId,
|
|
@@ -12141,7 +12380,8 @@ function createChatHost(env) {
|
|
|
12141
12380
|
sessionId,
|
|
12142
12381
|
prompt: next.text,
|
|
12143
12382
|
...next.activatedSkills?.length ? { activatedSkills: next.activatedSkills } : {},
|
|
12144
|
-
...next.attachments?.length ? { attachments: next.attachments } : {}
|
|
12383
|
+
...next.attachments?.length ? { attachments: next.attachments } : {},
|
|
12384
|
+
...next.asCommand ? { asCommand: next.asCommand } : {}
|
|
12145
12385
|
}, { ownMarkerExempt: false }).then(() => {
|
|
12146
12386
|
const live = queues.get(sessionId);
|
|
12147
12387
|
const index = live?.findIndex((item) => item.id === next.id) ?? -1;
|
|
@@ -12235,14 +12475,15 @@ function createChatHost(env) {
|
|
|
12235
12475
|
getLiveSession(sessionId) {
|
|
12236
12476
|
return active.get(sessionId)?.agent.session ?? null;
|
|
12237
12477
|
},
|
|
12238
|
-
async queueAdd(sessionId, text, activatedSkills, attachments) {
|
|
12478
|
+
async queueAdd(sessionId, text, activatedSkills, attachments, asCommand) {
|
|
12239
12479
|
const enqueue = () => {
|
|
12240
12480
|
const queue = queues.get(sessionId) ?? [];
|
|
12241
12481
|
queue.push({
|
|
12242
12482
|
id: randomUUID(),
|
|
12243
12483
|
text,
|
|
12244
12484
|
...activatedSkills?.length ? { activatedSkills } : {},
|
|
12245
|
-
...attachments?.length ? { attachments } : {}
|
|
12485
|
+
...attachments?.length ? { attachments } : {},
|
|
12486
|
+
...asCommand ? { asCommand } : {}
|
|
12246
12487
|
});
|
|
12247
12488
|
queues.set(sessionId, queue);
|
|
12248
12489
|
broadcastQueue(sessionId);
|
|
@@ -12254,7 +12495,8 @@ function createChatHost(env) {
|
|
|
12254
12495
|
sessionId,
|
|
12255
12496
|
prompt: text,
|
|
12256
12497
|
...activatedSkills?.length ? { activatedSkills } : {},
|
|
12257
|
-
...attachments?.length ? { attachments } : {}
|
|
12498
|
+
...attachments?.length ? { attachments } : {},
|
|
12499
|
+
...asCommand ? { asCommand } : {}
|
|
12258
12500
|
});
|
|
12259
12501
|
return { delivered: "sent" };
|
|
12260
12502
|
} catch (err) {
|
|
@@ -13601,7 +13843,7 @@ function oauthUsesManualCodePaste(descriptor) {
|
|
|
13601
13843
|
* Throws when the descriptor has no `oauthProvider` configured.
|
|
13602
13844
|
*/
|
|
13603
13845
|
async function runOAuthLogin(descriptor, options) {
|
|
13604
|
-
if (!descriptor.oauthProvider) throw new Error(`OAuth not supported for ${descriptor.label} (${descriptor.key})
|
|
13846
|
+
if (!descriptor.oauthProvider) throw new Error(`OAuth not supported for ${descriptor.label} (${descriptor.key}). Use an API key instead.`);
|
|
13605
13847
|
let deviceFlowActive = false;
|
|
13606
13848
|
const callbacks = {
|
|
13607
13849
|
onAuth: (info) => {
|
|
@@ -13616,7 +13858,7 @@ async function runOAuthLogin(descriptor, options) {
|
|
|
13616
13858
|
return;
|
|
13617
13859
|
}
|
|
13618
13860
|
options.onUrl(info.verificationUri, `Enter code ${info.userCode} to authorize.`);
|
|
13619
|
-
options.onProgress?.(`Device code: ${info.userCode}
|
|
13861
|
+
options.onProgress?.(`Device code: ${info.userCode}. Open ${info.verificationUri}`);
|
|
13620
13862
|
tryOpenBrowser(info.verificationUri);
|
|
13621
13863
|
},
|
|
13622
13864
|
onPrompt: async (prompt) => {
|
|
@@ -13719,14 +13961,14 @@ function normalizeRedirectPaste(pasted, authUrl) {
|
|
|
13719
13961
|
if (!callback) throw new Error("That doesn't look like a URL. Paste the full address your browser tried to reach (starting with http://127.0.0.1).");
|
|
13720
13962
|
if (trimmed.startsWith("/")) {
|
|
13721
13963
|
const merged = new URL(trimmed, callback);
|
|
13722
|
-
if (!merged.searchParams.has("code") && !merged.searchParams.has("error")) throw new Error("That path has no \"code\" parameter
|
|
13964
|
+
if (!merged.searchParams.has("code") && !merged.searchParams.has("error")) throw new Error("That path has no \"code\" parameter. Paste the full address from your browser's URL bar.");
|
|
13723
13965
|
return merged.toString();
|
|
13724
13966
|
}
|
|
13725
13967
|
const target = new URL(callback.toString());
|
|
13726
13968
|
const query = trimmed.startsWith("?") ? trimmed.slice(1) : trimmed;
|
|
13727
13969
|
if (!/^[^=\s]+=*$/.test(query) && query.includes("=")) {
|
|
13728
13970
|
const params = new URLSearchParams(query);
|
|
13729
|
-
if (!params.has("code") && !params.has("error")) throw new Error("That fragment has no \"code\" parameter
|
|
13971
|
+
if (!params.has("code") && !params.has("error")) throw new Error("That fragment has no \"code\" parameter. Paste the full address from your browser, or just the code.");
|
|
13730
13972
|
for (const [key, value] of params) target.searchParams.set(key, value);
|
|
13731
13973
|
return target.toString();
|
|
13732
13974
|
}
|
|
@@ -13771,7 +14013,7 @@ async function fetchOAuthRedirect(pasted, options = {}) {
|
|
|
13771
14013
|
try {
|
|
13772
14014
|
response = await fetch(url.toString(), { signal: ac.signal });
|
|
13773
14015
|
} catch (err) {
|
|
13774
|
-
if (err.name === "AbortError") throw new Error("No response from the local callback server
|
|
14016
|
+
if (err.name === "AbortError") throw new Error("No response from the local callback server. Was the login cancelled?");
|
|
13775
14017
|
throw new Error(`Could not reach the local callback server: ${err.message}`);
|
|
13776
14018
|
} finally {
|
|
13777
14019
|
clearTimeout(timer);
|
|
@@ -15185,7 +15427,7 @@ function normalizePrefix(prefix) {
|
|
|
15185
15427
|
function exportFilename(sessionId, format) {
|
|
15186
15428
|
const ext = format === "json" ? "json" : "md";
|
|
15187
15429
|
const cleaned = sessionId.trim();
|
|
15188
|
-
if (!cleaned || cleaned.includes("/") || cleaned.includes("\\") || cleaned === "." || cleaned === "..") throw new RangeError(`
|
|
15430
|
+
if (!cleaned || cleaned.includes("/") || cleaned.includes("\\") || cleaned === "." || cleaned === "..") throw new RangeError(`Cannot export session: invalid id "${sessionId}"`);
|
|
15189
15431
|
return `${cleaned}.${ext}`;
|
|
15190
15432
|
}
|
|
15191
15433
|
function aggregateUsage(runs) {
|
|
@@ -16225,6 +16467,6 @@ function createApprovalHub(options) {
|
|
|
16225
16467
|
};
|
|
16226
16468
|
}
|
|
16227
16469
|
//#endregion
|
|
16228
|
-
export { supportsOAuth as $,
|
|
16470
|
+
export { supportsOAuth as $, tryOpenBrowser as $n, INTERACTION_GUIDANCE_NO_PROMPTS as $r, runCompaction as $t, useSafeModeQueue as A, createDiscoverySlot as An, DEFAULT_MAX_TODO_ITEMS as Ar, makeRequestInteraction as At, USAGE_CACHE_TTL_MS as B, scoreArtifacts as Bn, isTodoTool as Br, readFileSafe as Bt, resolveSessionExportTarget as C, sumRunCosts as Ci, GRUVBOX_LIGHT as Cn, DEFAULT_AGENT_ID as Cr, InteractionsProvider as Ct, scopeCwd as D, updateToolEventOutcomes as Di, CATPPUCCIN_MOCHA as Dn, accentColor as Dr, createInteractionTools as Dt, resolveSessionCwd as E, toolResultText as Ei, CATPPUCCIN_MACCHIATO as En, PLAN_AGENT as Er, createAutomaticInteractionResponse as Et, matchesSafelistEntry as F, useConfig as Fn, TODO_WRITE_COUNTS_METADATA_KEY as Fr, STALE_RUN_MARKER_MS as Ft, usageChecksOptedOut as G, mcpsWritePath as Gn, setTodosForRun as Gr, modelChainMetadata as Gt, fetchAllProviderUsage as H, countClaudeSessionFiles as Hn, pruneTodosByRun as Hr, serializePreview as Ht, projectsFilePath as I, resolveConfig as In, applyTodosSnapshot as Ir, createChatHost as It, fetchOAuthRedirect as J, buildMcpServers as Jn, ACTIONS_WITH_CARE_DOCTRINE as Jr, buildPluginContributions as Jt, usageSourceFor as K, removeMcpServer as Kn, todoProgressLabel as Kr, sessionModelFallbacks as Kt, readProjects as L, resolveStoragePaths as Ln, createTodoTools as Lr, toTodosSnapshot as Lt, addToSafelist as M, useDiscovery as Mn, TODOS_METADATA_KEY as Mr, serializeInteractionResponse as Mt, getSafelist as N, useDiscoveryOptional as Nn, TODOWRITE_TOOL as Nr, useInteractionsActions as Nt, SafeModeProvider as O, usageByModel as Oi, parseEditorCommand as On, resolveAgentId as Or, isInteractionTool as Ot, isOnSafelist as P, ConfigProvider as Pn, TODO_STATUS_GLYPHS as Pr, useInteractionsQueue as Pt, runOAuthLogin as Q, parseMcpsFile as Qn, INTERACTION_GUIDANCE as Qr, EditOutcomeLedger as Qt, suggestSafelistEntries as R, ARTIFACTS_COMPLETION_PROVIDER_ID as Rn, getArchivedTodosForRun as Rr, createInteractionHub as Rt, renderSession as S, stripSpawnTokensLine as Si, GRUVBOX_DARK as Sn, BUILTIN_AGENTS as Sr, HOST_INTERACTION_ID_PREFIX as St, folderlessCwd as T, toolCallPreview as Ti, CATPPUCCIN_LATTE as Tn, DEFAULT_PERSIST_EXCLUDE_TOOLS as Tr, buildResumedToolResultsTurn as Tt, fetchProviderUsage as U, hasClaudeCodeSetup as Un, sanitizeTodoItems as Ur, createBuiltinCommands as Ut, clearProviderUsageCache as V, useCompletion as Vn, pickActiveRunId as Vr, resolveCwdPath as Vt, providerUsageSupported as W, importFromClaudeCode as Wn, selectActiveTodos as Wr, createMainSession as Wt, redirectUriFromAuthUrl as X, defaultMcpsConfigPaths as Xn, DOING_TASKS_DOCTRINE as Xr, parsePluginScanPathEnv as Xt, normalizeRedirectPaste as Y, dedupMcpServersByName as Yn, COMMUNICATION_DOCTRINE as Yr, discoverProjectPlugins as Yt, oauthUsesManualCodePaste as Z, discoverProjectMcps as Zn, IDENTITY_PREFIX as Zr, attachMcpWarnLog as Zt, buildSpawnEndEvent as _, loadState as _i, BUILTIN_THEMES as _n, groupArtifacts as _r, useMcpAuthState as _t, renderActiveTodoAnchor as a, buildPlanSystem as ai, shortChord as an, findInstalledCompanion as ar, subscribeMcpToolsCache as at, defaultSkillScanPaths as b, saveState as bi, resolveTheme as bn, renderAgentsMdBlock as br, ASK_USER_TOOL as bt, useSelectStyle as c, createChatTurnsReadTool as ci, DEFAULT_SETTINGS as cn, compareSemver as cr, useMcpToolToggleSet as ct, useTheme as d, createStateStore as di, SETTINGS_INPUTS as dn, parseSemver as dr, parentServerName as dt, PLAN_MODE_DOCTRINE as ei, EMPTY_HINTS as en, bootProfileEnabled as er, clearMcpToolsCache as et, discoverSystemMd as f, deriveSessionTitle as fi, SETTINGS_TOGGLES as fn, performInPlaceSelfUpdate as fr, createFileMcpCredentialStore as ft, useStreamBuffer as g, listSessionMeta as gi, useSettings as gn, formatArtifactsMarkdown as gr, useMcpAuthDispatch as gt, userSystemMdPath as h, lastContextSizeFromTurns as hi, enforceSettingsInvariants as hn, chatAutoCompactBehavior as hr, McpAuthProvider as ht, createActiveTodoAnchorHooks as i, buildBuildSystem as ii, buildHints as in, runUpdateCommand as ir, saveMcpToolsCache as it, IMPLICITLY_SAFE_TOOLS as j, DiscoveryProvider as jn, TODOREAD_TOOL as jr, pendingInteractionsFromTurns as jt, useSafeModeActions as k, quoteForShell as kn, singleAgentRegistry as kr, isModelInteraction as kt, useSurfaces as l, DEFAULT_SESSION_TITLE as li, SETTINGS_CATEGORIES as ln, detectLibc as lr, buildVisibleMcpRows as lt, userScopeOverridesLoad as m, getSessionMeta as mi, clampFps as mn, resolvePlatformPackage as mr, patchMcpCredential as mt, createMemoryApprovalsStore as n, SUBAGENT_GUIDANCE as ni, hintsLength as nn, buildUpdateHint as nr, mcpToolsCachePath as nt, ThemeProvider as o, envSection as oi, listProjectFiles as on, checkForUpdate as or, buildToolToggle as ot, renderSystemMdSeed as p, eventsFromTurns as pi, SettingsProvider as pn, performSelfUpdate as pr, mcpCredentialsPath as pt, formatPathForCwd as q, upsertMcpServer as qn, useActiveTodos as qr, runEndNotice as qt, computeTurnAnchors as r, TOKEN_DISCIPLINE_DOCTRINE as ri, truncateTrailing as rn, useUpdateCheck as rr, refreshMcpToolsCatalog as rt, useColors as s, chatReferenceTokensForPrompt as si, useEnabledToggleSet as sn, checkTarballAvailable as sr, useMcpToolToggleMap as st, createApprovalHub as t, PLAN_MODE_DOCTRINE_NO_PROMPTS as ti, clipHintsToWidth as tn, bootTick as tr, loadMcpToolsCache as tt, useSyntaxStyles as u, compactSummaryEvent as ui, SETTINGS_CHOICES as un, detectPackageManager as ur, indexOfServerRow as ut, buildSpawnStartEvent as v, marginTopFor as vi, DEFAULT_THEME as vn, summarizeArtifactCounts as vr, getMcpAuthStatus as vt, writeSessionExport as w, titleFromTurns as wi, CATPPUCCIN_FRAPPE as wn, DEFAULT_BUDGET_EXCLUDE_TOOLS as wr, PRESENT_PLAN_TOOL as wt, discoverProjectSkills as x, serverToolResultSummary as xi, VAPORWAVE_THEME as xn, BUILD_AGENT as xr, AUTOMATIC_INTERACTION_INSTRUCTION as xt, buildSkillsConfig as y, noticeTurnContent as yi, resolveChipColor as yn, discoverAgentsMd as yr, reduceMcpAuth as yt, writeProjects as z, createArtifactsCompletionProvider as zn, getTodosForRun as zr, extractEditPayloadForGate as zt };
|
|
16229
16471
|
|
|
16230
|
-
//# sourceMappingURL=approvals-
|
|
16472
|
+
//# sourceMappingURL=approvals-B9aIQJRQ.js.map
|