@markusylisiurunen/tau 0.3.59 → 0.3.61
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/code_mode/runtime.js +4 -2
- package/dist/code_mode/runtime.js.map +1 -1
- package/dist/core/config/schema.js.map +1 -1
- package/dist/core/diff_review/review_instructions.js +2 -1
- package/dist/core/diff_review/review_instructions.js.map +1 -1
- package/dist/core/diff_review/tool.js +1 -1
- package/dist/core/diff_review/tool.js.map +1 -1
- package/dist/core/session/compaction.js +8 -7
- package/dist/core/session/compaction.js.map +1 -1
- package/dist/core/static/code_mode/sandbox_runner.mjs +2 -1
- package/dist/core/static/tau_docs/configuration.md +1 -1
- package/dist/core/static/tau_docs/getting-started.md +3 -4
- package/dist/core/static/tau_docs/history.md +1 -1
- package/dist/core/static/tau_docs/index.md +1 -0
- package/dist/core/static/tau_docs/manifest.json +1 -0
- package/dist/core/static/tau_docs/node-sdk.md +6 -0
- package/dist/core/static/tau_docs/nook.md +3 -3
- package/dist/core/static/tau_docs/sdk-diff-review.md +79 -0
- package/dist/core/static/tau_docs/telegram.md +21 -22
- package/dist/core/static/tau_docs/tools.md +4 -4
- package/dist/core/static/tau_docs/troubleshooting.md +2 -2
- package/dist/core/telegram/config.js +20 -2
- package/dist/core/telegram/config.js.map +1 -1
- package/dist/core/telegram/workspace.js +3 -39
- package/dist/core/telegram/workspace.js.map +1 -1
- package/dist/core/version.js +1 -1
- package/dist/diff_tool/app/dist/assets/{angular-html-DoxI_och.js → angular-html-DuYRAXV5.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{angular-ts-C7CUd-D2.js → angular-ts-DgeuYxSF.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{apl-7dieYM-l.js → apl-wxWa3Ydu.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{astro-Czj3O4jM.js → astro-C4ttudxw.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{blade-ClS0E2cC.js → blade-DWkdu_xo.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{c-BKvTh-Jt.js → c-DiBfVf2Z.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{chapel-qvFrfwEr.js → chapel-Bean9Neq.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{cobol-B0vsaB-J.js → cobol-BU20Tg-_.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{coffee-BUlcrU75.js → coffee-BNUM3vlm.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{cpp-CKqEgX1l.js → cpp-BZ8z_KH7.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{crystal-FCqSmIJ_.js → crystal-B5GhOPvy.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{css-zZvYFJFc.js → css-DUSE-ie6.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{edge-BKlbCo1f.js → edge-DzxgXKaz.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{elixir-B2gSxtgZ.js → elixir-ycLoSLHp.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{elm-DFEdzPJz.js → elm-DwDckPwp.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{erb-DSgn8fHS.js → erb-CJOEvUBw.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{git-rebase-CcgDECQr.js → git-rebase-BDL_AWDi.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{glimmer-js-Dwxi4cX2.js → glimmer-js-z-oDGObE.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{glimmer-ts-BnJVER8W.js → glimmer-ts-PtiYCBTb.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{glsl-z7_gU-HN.js → glsl-Bzae6vfC.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{graphql-Dt7V-d3L.js → graphql-BrEGWNkj.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{hack-jVkr6EC8.js → hack-Dn4MCbdB.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{haml-BF7cRiOF.js → haml-m4zNurSd.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{handlebars-DAhNxR3E.js → handlebars-BnDqrwGf.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{html-B7QW5YvU.js → html-BX2wi91g.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{html-derivative-B-vyaE-N.js → html-derivative-DgD5ucSP.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{http-Drkl04RP.js → http-Dp9EXJcu.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{hurl-7gTFrvcN.js → hurl-BeZOac4Y.js} +1 -1
- package/dist/diff_tool/app/dist/assets/index-BV57bp-I.css +1 -0
- package/dist/diff_tool/app/dist/assets/{index-C9CiIimI.js → index-ScvXFe2C.js} +5 -5
- package/dist/diff_tool/app/dist/assets/{java-ZmvXuvs3.js → java-gPCWrEej.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{javascript-C-OECu_Z.js → javascript-McqleDP-.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{jinja-hvkV87CG.js → jinja-IsM9Sv2h.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{jison-eJBDxKI8.js → jison-DwGiYqd_.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{json-BPQU2w0u.js → json-Ct3yo1MZ.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{jsx-C19s5MOj.js → jsx-zWyK7x89.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{julia-CYISvCwi.js → julia-BUDOglEU.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{just-5omBg5pB.js → just-BFEGZnDI.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{latex-B_L85F2z.js → latex-BqtnpXRd.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{liquid-BxbaQPPS.js → liquid-Dp6kE-SV.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{lua-DQA0z-44.js → lua-VsbzDN8O.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{marko-Dj5RV8IH.js → marko-CI82Cfi_.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{mdc-CoHI6VJN.js → mdc-CX8BBCs1.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{nginx-COnrY-gb.js → nginx-C43WH_V_.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{nim-Ccfp0p1j.js → nim-CSnVEePF.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{org-RForNsWm.js → org-Cmyc8nHh.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{perl-DhHRsiUu.js → perl-CozuBSKr.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{php-BlxKhJek.js → php-DQ3CuepV.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{pug-o9YxnGzH.js → pug-BpRKzivp.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{qml-Dzf494vL.js → qml-9RzFciO7.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{r-Dp0OUrF6.js → r-CGfCJAgp.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{razor-gylahu-m.js → razor-5S5yhlXJ.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{regexp-C0rsDjCm.js → regexp-oQnZo4wn.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{rst-D-DRAFtq.js → rst-CjLPbx7h.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{ruby-BnY40vXq.js → ruby-1JWX2ibq.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{sas-BaSo_s7i.js → sas-DaA-thHB.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{scss-BX5R-Yyw.js → scss-CZ0MRiRt.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{shellscript-CpRFVBRj.js → shellscript-BoYsyXZ_.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{shellsession-BGRUDtms.js → shellsession-DPqct_qW.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{soy-C2WL9FSb.js → soy-CCm_-AyN.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{sql-CGmNnOfz.js → sql-Bfu-3tRP.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{stata-CDamV3Uz.js → stata-mJR2kwNh.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{surrealql-BqI4o6tP.js → surrealql-JwQqQzxg.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{svelte-DPaOUioa.js → svelte-Cv-fRyqg.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{templ-aqrZIEoc.js → templ-yxSnbTDs.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{tex-Bjjtfacp.js → tex-CKB2BLjY.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{ts-tags-BGFnsvdQ.js → ts-tags-BI6TUx3p.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{tsx-C_rOxPqZ.js → tsx-BJh43aDa.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{twig-DYqVwCOf.js → twig-CYqEEuwX.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{typescript-CppQYc7K.js → typescript-AdEpX3cM.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{typst-KIbA0FZG.js → typst-ChqNVVBe.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{vue-iOYoJEJi.js → vue-8USuF5fp.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{vue-html-DcZpMui9.js → vue-html-BQzG9utp.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{vue-vine-C6v6c0Lr.js → vue-vine-BqtwbefK.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{xml-zR0RltJO.js → xml-DJ0gKoKh.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{xsl-B9pBLsIV.js → xsl-V1Fg3vOx.js} +1 -1
- package/dist/diff_tool/app/dist/assets/{yaml-sicIihvu.js → yaml-DmkHyU0p.js} +1 -1
- package/dist/diff_tool/app/dist/index.html +2 -2
- package/dist/diff_tool/http_server.js +129 -36
- package/dist/diff_tool/http_server.js.map +1 -1
- package/dist/diff_tool/index.js.map +1 -1
- package/dist/diff_tool/review_state.js +43 -4
- package/dist/diff_tool/review_state.js.map +1 -1
- package/dist/diff_tool/review_state_persistence.js +152 -0
- package/dist/diff_tool/review_state_persistence.js.map +1 -0
- package/dist/host/local_session_host.js +66 -59
- package/dist/host/local_session_host.js.map +1 -1
- package/dist/sdk/diff_review.d.ts +40 -0
- package/dist/sdk/diff_review.js +111 -0
- package/dist/sdk/diff_review.js.map +1 -0
- package/dist/sdk/index.d.ts +1 -0
- package/dist/sdk/index.js +1 -0
- package/dist/sdk/index.js.map +1 -1
- package/dist/sdk/session_tool_execution_backend.d.ts +16 -0
- package/dist/sdk/session_tool_execution_backend.js +157 -0
- package/dist/sdk/session_tool_execution_backend.js.map +1 -0
- package/dist/tui/session_tool_execution_backend.js +1 -156
- package/dist/tui/session_tool_execution_backend.js.map +1 -1
- package/package.json +1 -1
- package/dist/diff_tool/app/dist/assets/index-Az_6lupE.css +0 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { DiffReviewBridge } from "../core/diff_review/bridge.js";
|
|
2
|
+
import { buildDiffReviewInstructions } from "../core/diff_review/review_instructions.js";
|
|
3
|
+
import { captureDiffReviewSnapshot } from "../core/diff_review/snapshot.js";
|
|
4
|
+
import { DiffToolHttpServer } from "../diff_tool/http_server.js";
|
|
5
|
+
import { DiffReviewProtocolClient, parseDiffToolLaunchEnvironment, } from "../diff_tool/protocol_client.js";
|
|
6
|
+
import { createSdkDiffSnapshotDeps, createSdkToolExecutionBackend, } from "./session_tool_execution_backend.js";
|
|
7
|
+
export async function startTauSdkDiffReview(options) {
|
|
8
|
+
options.signal?.throwIfAborted();
|
|
9
|
+
const sessionSnapshot = await options.session.snapshot();
|
|
10
|
+
const cwd = sessionSnapshot.executionEnvironment.cwd;
|
|
11
|
+
const backend = createSdkToolExecutionBackend({
|
|
12
|
+
executionEnvironment: options.session,
|
|
13
|
+
cwd,
|
|
14
|
+
});
|
|
15
|
+
const snapshot = await captureDiffReviewSnapshot({
|
|
16
|
+
cwd,
|
|
17
|
+
source: options.source,
|
|
18
|
+
...(options.signal ? { signal: options.signal } : {}),
|
|
19
|
+
deps: createSdkDiffSnapshotDeps({ backend, cwd }),
|
|
20
|
+
});
|
|
21
|
+
options.signal?.throwIfAborted();
|
|
22
|
+
const ephemeral = await options.session.createEphemeralContext({
|
|
23
|
+
instructions: buildDiffReviewInstructions(snapshot),
|
|
24
|
+
tools: ["bash", "view_image"],
|
|
25
|
+
});
|
|
26
|
+
const bridge = new DiffReviewBridge({
|
|
27
|
+
snapshot,
|
|
28
|
+
contextWindow: sessionSnapshot.bootstrap.model.contextWindow,
|
|
29
|
+
submitThreadMessage: (submitOptions) => options.session.submitEphemeralThread({
|
|
30
|
+
contextId: ephemeral.contextId,
|
|
31
|
+
threadId: submitOptions.threadId,
|
|
32
|
+
...(submitOptions.forkFromThreadId
|
|
33
|
+
? { forkFromThreadId: submitOptions.forkFromThreadId }
|
|
34
|
+
: {}),
|
|
35
|
+
message: submitOptions.message,
|
|
36
|
+
}),
|
|
37
|
+
});
|
|
38
|
+
const unsubscribeEphemeral = options.session.onEphemeral((message) => {
|
|
39
|
+
const event = message.event;
|
|
40
|
+
if (event.type !== "ephemeral-agent.thread-update" || event.contextId !== ephemeral.contextId) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
bridge.applyThreadUpdate(event.threadId, {
|
|
44
|
+
costTotal: event.update.costTotal,
|
|
45
|
+
usage: { ...event.update.usage },
|
|
46
|
+
...(event.update.lastActivityText ? { lastActivityText: event.update.lastActivityText } : {}),
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
let server;
|
|
50
|
+
let removeAbortListener = () => undefined;
|
|
51
|
+
try {
|
|
52
|
+
await bridge.start();
|
|
53
|
+
options.signal?.throwIfAborted();
|
|
54
|
+
const client = new DiffReviewProtocolClient(parseDiffToolLaunchEnvironment(bridge.launchEnvironment));
|
|
55
|
+
const onSubmit = options.onSubmit;
|
|
56
|
+
server = new DiffToolHttpServer({
|
|
57
|
+
client,
|
|
58
|
+
...(options.host !== undefined ? { host: options.host } : {}),
|
|
59
|
+
...(options.port !== undefined ? { port: options.port } : {}),
|
|
60
|
+
...(options.storage ? { storage: options.storage } : {}),
|
|
61
|
+
...(onSubmit
|
|
62
|
+
? {
|
|
63
|
+
onSubmit: async (submission) => {
|
|
64
|
+
await onSubmit({
|
|
65
|
+
review: submission.review,
|
|
66
|
+
diffCommand: submission.context.diffCommand,
|
|
67
|
+
reviewedFiles: submission.files.map((file) => file.path),
|
|
68
|
+
});
|
|
69
|
+
},
|
|
70
|
+
}
|
|
71
|
+
: {}),
|
|
72
|
+
});
|
|
73
|
+
const started = await server.start();
|
|
74
|
+
options.signal?.throwIfAborted();
|
|
75
|
+
const onAbort = () => {
|
|
76
|
+
void bridge.cancel("controller_cancelled");
|
|
77
|
+
};
|
|
78
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
79
|
+
removeAbortListener = () => options.signal?.removeEventListener("abort", onAbort);
|
|
80
|
+
let cleanedUp = false;
|
|
81
|
+
const cleanup = async () => {
|
|
82
|
+
if (cleanedUp)
|
|
83
|
+
return;
|
|
84
|
+
cleanedUp = true;
|
|
85
|
+
removeAbortListener();
|
|
86
|
+
unsubscribeEphemeral();
|
|
87
|
+
await options.session.closeEphemeralContext(ephemeral.contextId).catch(() => undefined);
|
|
88
|
+
await server?.close().catch(() => undefined);
|
|
89
|
+
await bridge.close().catch(() => undefined);
|
|
90
|
+
};
|
|
91
|
+
const result = bridge.result.finally(cleanup);
|
|
92
|
+
return {
|
|
93
|
+
url: started.url,
|
|
94
|
+
result,
|
|
95
|
+
async close() {
|
|
96
|
+
await bridge.cancel("controller_cancelled");
|
|
97
|
+
await result;
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
removeAbortListener();
|
|
103
|
+
unsubscribeEphemeral();
|
|
104
|
+
await server?.close().catch(() => undefined);
|
|
105
|
+
await bridge.cancel("launch_failed").catch(() => undefined);
|
|
106
|
+
await bridge.close().catch(() => undefined);
|
|
107
|
+
await options.session.closeEphemeralContext(ephemeral.contextId).catch(() => undefined);
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=diff_review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff_review.js","sourceRoot":"","sources":["../../src/sdk/diff_review.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export { createTauSdkClient, createTauSdkWebSocketClient } from "./client.js";
|
|
|
8
8
|
export { runTauClientToolCommand, TAU_CLIENT_TOOL_COMMAND_PROTOCOL_VERSION, type TauClientToolCommandDefinition, type TauClientToolCommandHandler, type TauClientToolCommandPresentation, } from "./client_tool_command.js";
|
|
9
9
|
export { type TauClientToolPresentation, type TauClientToolTextTruncationOptions, truncateTauClientToolText, } from "./client_tool_presentation.js";
|
|
10
10
|
export { createTauCodeModeClientTool, type TauSdkCodeModeClientToolOptions, } from "./code_mode.js";
|
|
11
|
+
export { type StartedTauSdkDiffReview, type StartTauSdkDiffReviewOptions, startTauSdkDiffReview, type TauSdkDiffReviewResult, type TauSdkDiffReviewSource, type TauSdkDiffReviewStorage, type TauSdkDiffReviewSubmission, } from "./diff_review.js";
|
|
11
12
|
export { createTauSdkClientFromTransport } from "./session.js";
|
|
12
13
|
export type { TauSdkAutocompletePathsResult, TauSdkClient, TauSdkClientOptions, TauSdkClientTool, TauSdkClientToolContext, TauSdkClientToolDescribeContext, TauSdkClientToolExecutionEnvironment, TauSdkClientToolResult, TauSdkCreateSessionInput, TauSdkDelta, TauSdkDeltaListener, TauSdkEphemeral, TauSdkEphemeralAgentTool, TauSdkEphemeralCloseResult, TauSdkEphemeralCreateResult, TauSdkEphemeralListener, TauSdkEphemeralSubmitResult, TauSdkHostDiagnostic, TauSdkInitializeParams, TauSdkPendingUserMessagesListener, TauSdkPendingUserMessagesMessage, TauSdkPendingUserMessagesState, TauSdkReadyMessage, TauSdkRequestId, TauSdkResolvePromptResult, TauSdkSession, TauSdkSessionCancelPendingMessagesResult, TauSdkSessionClearGoalResult, TauSdkSessionClient, TauSdkSessionCompactResult, TauSdkSessionExecOptions, TauSdkSessionExecResult, TauSdkSessionInterruptResult, TauSdkSessionInterruptSubagentResult, TauSdkSessionProtocolMethod, TauSdkSessionQueueResult, TauSdkSessionRecordResult, TauSdkSessionReloadResult, TauSdkSessionResumeGoalResult, TauSdkSessionRetryResult, TauSdkSessionRewindResult, TauSdkSessionSampleInput, TauSdkSessionSampleResult, TauSdkSessionSetPersonaResult, TauSdkSessionSetReasoningResult, TauSdkSessionSnapshotResult, TauSdkSessionStartGoalResult, TauSdkSessionSteerResult, TauSdkSessionSubmitResult, TauSdkSessionSummary, TauSdkSessionTurnOutcome, TauSdkSessionTurnRecord, TauSdkSessionUnobserveResult, TauSdkSessionUserMessageOptions, TauSdkSubagentActivitiesListener, TauSdkSubagentActivitiesMessage, TauSdkSubagentActivitiesState, TauSdkTransportClientOptions, TauSdkWebSocketClientOptions, } from "./types.js";
|
|
13
14
|
export type { TauSdkUserTextProjection } from "./user_text.js";
|
package/dist/sdk/index.js
CHANGED
|
@@ -5,6 +5,7 @@ export { createTauSdkClient, createTauSdkWebSocketClient } from "./client.js";
|
|
|
5
5
|
export { runTauClientToolCommand, TAU_CLIENT_TOOL_COMMAND_PROTOCOL_VERSION, } from "./client_tool_command.js";
|
|
6
6
|
export { truncateTauClientToolText, } from "./client_tool_presentation.js";
|
|
7
7
|
export { createTauCodeModeClientTool, } from "./code_mode.js";
|
|
8
|
+
export { startTauSdkDiffReview, } from "./diff_review.js";
|
|
8
9
|
export { createTauSdkClientFromTransport } from "./session.js";
|
|
9
10
|
export { getTauUserDisplayText, getTauUserModelText, projectTauUserText } from "./user_text.js";
|
|
10
11
|
export function getTauSdkSessionTurnRecord(snapshot, userHistoryEntryId) {
|
package/dist/sdk/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,+BAA+B,EAC/B,kBAAkB,EAClB,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,yBAAyB,CAAC;AAgBjC,OAAO,EACL,yBAAyB,EACzB,6CAA6C,GAC9C,MAAM,sBAAsB,CAAC;AAY9B,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,iBAAiB,EACjB,iCAAiC,GAClC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EACL,uBAAuB,EACvB,wCAAwC,GAIzC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,yBAAyB,GAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,GAE5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AA+D/D,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEhG,MAAM,UAAU,0BAA0B,CACxC,QAAgE,EAChE,kBAA0B;IAE1B,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;QACtD,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC;QACpC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,QAAgE,EAChE,kBAA0B;IAE1B,MAAM,MAAM,GAAG,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IACxE,OAAO,MAAM,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sdk/index.ts"],"names":[],"mappings":"AAaA,OAAO,EACL,+BAA+B,EAC/B,kBAAkB,EAClB,gCAAgC,EAChC,+BAA+B,GAChC,MAAM,yBAAyB,CAAC;AAgBjC,OAAO,EACL,yBAAyB,EACzB,6CAA6C,GAC9C,MAAM,sBAAsB,CAAC;AAY9B,OAAO,EACL,qBAAqB,EACrB,+BAA+B,EAC/B,iBAAiB,EACjB,iCAAiC,GAClC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EACL,uBAAuB,EACvB,wCAAwC,GAIzC,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,yBAAyB,GAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,GAE5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAGL,qBAAqB,GAKtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,+BAA+B,EAAE,MAAM,cAAc,CAAC;AA+D/D,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEhG,MAAM,UAAU,0BAA0B,CACxC,QAAgE,EAChE,kBAA0B;IAE1B,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;QACtD,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC;QACpC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,QAAgE,EAChE,kBAA0B;IAE1B,MAAM,MAAM,GAAG,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IACxE,OAAO,MAAM,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CoreDeps } from "../core/runtime/deps.js";
|
|
2
|
+
import type { ToolExecutionBackend } from "../core/tools/execution_backend.js";
|
|
3
|
+
import type { TauSdkClientToolExecutionEnvironment } from "./types.js";
|
|
4
|
+
export declare function createSdkToolExecutionBackend(options: {
|
|
5
|
+
executionEnvironment: TauSdkClientToolExecutionEnvironment;
|
|
6
|
+
cwd: string;
|
|
7
|
+
}): ToolExecutionBackend;
|
|
8
|
+
export declare function createSdkDiffSnapshotDeps(options: {
|
|
9
|
+
backend: ToolExecutionBackend;
|
|
10
|
+
cwd: string;
|
|
11
|
+
}): Pick<CoreDeps, "spawn"> & {
|
|
12
|
+
env: Pick<CoreDeps["env"], "env">;
|
|
13
|
+
fs: {
|
|
14
|
+
readFile: (path: string) => Promise<string>;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
import { SESSION_PROTOCOL_MAX_EXEC_STDIN_BYTES } from "../protocol/session_protocol.js";
|
|
3
|
+
const HELPER_TIMEOUT_MS = 10_000;
|
|
4
|
+
const MAX_FILE_BYTES = SESSION_PROTOCOL_MAX_EXEC_STDIN_BYTES;
|
|
5
|
+
const MAX_FILE_READ_CAPTURE_BYTES = 4 * Math.ceil(MAX_FILE_BYTES / 3) + 1024;
|
|
6
|
+
const EXEC_ARGUMENTS_COMMAND = 'exec "$0" "$@"';
|
|
7
|
+
export function createSdkToolExecutionBackend(options) {
|
|
8
|
+
const { executionEnvironment, cwd } = options;
|
|
9
|
+
const runBash = async (command, runOptions = {}) => {
|
|
10
|
+
const result = await executionEnvironment.exec(command, {
|
|
11
|
+
...(runOptions.args !== undefined ? { args: runOptions.args } : {}),
|
|
12
|
+
...(runOptions.env !== undefined ? { env: runOptions.env } : {}),
|
|
13
|
+
...(runOptions.stdin !== undefined ? { stdin: runOptions.stdin } : {}),
|
|
14
|
+
cwd: runOptions.cwd ?? cwd,
|
|
15
|
+
...(runOptions.timeoutMs !== undefined ? { timeoutMs: runOptions.timeoutMs } : {}),
|
|
16
|
+
...(runOptions.maxCaptureBytes !== undefined
|
|
17
|
+
? { maxCaptureBytes: runOptions.maxCaptureBytes }
|
|
18
|
+
: {}),
|
|
19
|
+
...(runOptions.signal ? { signal: runOptions.signal } : {}),
|
|
20
|
+
});
|
|
21
|
+
runOptions.signal?.throwIfAborted();
|
|
22
|
+
return result;
|
|
23
|
+
};
|
|
24
|
+
const runNodeScript = (script, args = [], runOptions = {}) => runBash(EXEC_ARGUMENTS_COMMAND, {
|
|
25
|
+
...runOptions,
|
|
26
|
+
args: ["node", "-e", script, ...args],
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
async dispose() { },
|
|
30
|
+
runBash,
|
|
31
|
+
runNodeScript,
|
|
32
|
+
async readFile(path) {
|
|
33
|
+
const result = await this.readFileBinary(path, { maxBytes: MAX_FILE_BYTES });
|
|
34
|
+
return { path, content: result.content.toString("utf-8") };
|
|
35
|
+
},
|
|
36
|
+
async readFileBinary(path, readOptions = {}) {
|
|
37
|
+
const result = await runNodeHelper(runNodeScript, READ_FILE_BINARY_SCRIPT, [path, String(readOptions.maxBytes ?? MAX_FILE_BYTES)], {
|
|
38
|
+
cwd,
|
|
39
|
+
timeoutMs: HELPER_TIMEOUT_MS,
|
|
40
|
+
maxCaptureBytes: MAX_FILE_READ_CAPTURE_BYTES,
|
|
41
|
+
});
|
|
42
|
+
const parsed = JSON.parse(result);
|
|
43
|
+
return {
|
|
44
|
+
path,
|
|
45
|
+
content: Buffer.from(parsed.contentBase64, "base64"),
|
|
46
|
+
bytes: parsed.bytes,
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
async writeFile(path, content) {
|
|
50
|
+
const result = await writeFile(runNodeScript, cwd, path, Buffer.from(content, "utf-8"));
|
|
51
|
+
return { ...result, lines: content.split("\n").length };
|
|
52
|
+
},
|
|
53
|
+
async writeFileBinary(path, content) {
|
|
54
|
+
return await writeFile(runNodeScript, cwd, path, content);
|
|
55
|
+
},
|
|
56
|
+
async listDir(path) {
|
|
57
|
+
const result = await runNodeHelper(runNodeScript, LIST_DIR_SCRIPT, [path], {
|
|
58
|
+
cwd,
|
|
59
|
+
timeoutMs: HELPER_TIMEOUT_MS,
|
|
60
|
+
});
|
|
61
|
+
return { path, entries: JSON.parse(result) };
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
export function createSdkDiffSnapshotDeps(options) {
|
|
66
|
+
return {
|
|
67
|
+
spawn: async (cmd, args, spawnOptions = {}) => {
|
|
68
|
+
spawnOptions.signal?.throwIfAborted();
|
|
69
|
+
const result = await options.backend.runBash(EXEC_ARGUMENTS_COMMAND, {
|
|
70
|
+
args: [cmd, ...args],
|
|
71
|
+
cwd: spawnOptions.cwd ?? options.cwd,
|
|
72
|
+
...(spawnOptions.env ? { env: definedEnvironment(spawnOptions.env) } : {}),
|
|
73
|
+
...(spawnOptions.timeoutMs !== undefined ? { timeoutMs: spawnOptions.timeoutMs } : {}),
|
|
74
|
+
...(spawnOptions.maxCaptureBytes !== undefined
|
|
75
|
+
? { maxCaptureBytes: spawnOptions.maxCaptureBytes }
|
|
76
|
+
: {}),
|
|
77
|
+
...(spawnOptions.signal ? { signal: spawnOptions.signal } : {}),
|
|
78
|
+
});
|
|
79
|
+
spawnOptions.signal?.throwIfAborted();
|
|
80
|
+
return {
|
|
81
|
+
stdout: result.stdout,
|
|
82
|
+
stderr: result.stderr,
|
|
83
|
+
...(spawnOptions.captureOutput === "combined" ||
|
|
84
|
+
spawnOptions.captureOutput === "combined-and-split"
|
|
85
|
+
? { output: result.output }
|
|
86
|
+
: {}),
|
|
87
|
+
exitCode: result.exitCode,
|
|
88
|
+
captureLimitExceeded: result.truncated,
|
|
89
|
+
timedOut: result.timedOut,
|
|
90
|
+
aborted: result.aborted,
|
|
91
|
+
closeSignal: result.closeSignal,
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
env: { env: () => ({}) },
|
|
95
|
+
fs: {
|
|
96
|
+
readFile: async (path) => (await options.backend.readFile(path)).content,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function definedEnvironment(env) {
|
|
101
|
+
return Object.fromEntries(Object.entries(env).filter((entry) => entry[1] !== undefined));
|
|
102
|
+
}
|
|
103
|
+
async function runNodeHelper(runNodeScript, script, args, options) {
|
|
104
|
+
const result = await runNodeScript(script, args, options);
|
|
105
|
+
if (result.truncated) {
|
|
106
|
+
throw new Error(`${basename(args[0] ?? "helper")} output exceeded the capture limit`);
|
|
107
|
+
}
|
|
108
|
+
if (result.exitCode !== 0) {
|
|
109
|
+
throw new Error(result.stderr.trim() || result.stdout.trim() || `${basename(args[0] ?? "helper")} failed`);
|
|
110
|
+
}
|
|
111
|
+
return result.stdout;
|
|
112
|
+
}
|
|
113
|
+
async function writeFile(runNodeScript, cwd, path, content) {
|
|
114
|
+
if (content.byteLength > MAX_FILE_BYTES) {
|
|
115
|
+
throw new Error(`file exceeds maximum size of ${MAX_FILE_BYTES} bytes`);
|
|
116
|
+
}
|
|
117
|
+
const result = await runNodeHelper(runNodeScript, WRITE_FILE_SCRIPT, [path], {
|
|
118
|
+
cwd,
|
|
119
|
+
timeoutMs: HELPER_TIMEOUT_MS,
|
|
120
|
+
stdin: content,
|
|
121
|
+
});
|
|
122
|
+
return JSON.parse(result);
|
|
123
|
+
}
|
|
124
|
+
const READ_FILE_BINARY_SCRIPT = `
|
|
125
|
+
const fs = require("fs");
|
|
126
|
+
const path = process.argv[1];
|
|
127
|
+
const maxBytes = Number(process.argv[2]);
|
|
128
|
+
const stats = fs.statSync(path);
|
|
129
|
+
if (!stats.isFile()) throw new Error("path is not a file");
|
|
130
|
+
if (stats.size > maxBytes) {
|
|
131
|
+
throw new Error(\`file exceeds maximum size of \${maxBytes} bytes (got \${stats.size} bytes)\`);
|
|
132
|
+
}
|
|
133
|
+
const content = fs.readFileSync(path);
|
|
134
|
+
process.stdout.write(JSON.stringify({
|
|
135
|
+
contentBase64: content.toString("base64"),
|
|
136
|
+
bytes: content.byteLength,
|
|
137
|
+
}));
|
|
138
|
+
`.trim();
|
|
139
|
+
const WRITE_FILE_SCRIPT = `
|
|
140
|
+
const fs = require("fs");
|
|
141
|
+
const path = require("path");
|
|
142
|
+
const file = process.argv[1];
|
|
143
|
+
const content = fs.readFileSync(0);
|
|
144
|
+
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
145
|
+
fs.writeFileSync(file, content);
|
|
146
|
+
process.stdout.write(JSON.stringify({ path: file, bytes: content.byteLength }));
|
|
147
|
+
`.trim();
|
|
148
|
+
const LIST_DIR_SCRIPT = `
|
|
149
|
+
const fs = require("fs");
|
|
150
|
+
const entries = fs.readdirSync(process.argv[1], { withFileTypes: true }).map((entry) => ({
|
|
151
|
+
name: entry.name,
|
|
152
|
+
isDirectory: entry.isDirectory(),
|
|
153
|
+
isSymlink: entry.isSymbolicLink(),
|
|
154
|
+
}));
|
|
155
|
+
process.stdout.write(JSON.stringify(entries));
|
|
156
|
+
`.trim();
|
|
157
|
+
//# sourceMappingURL=session_tool_execution_backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session_tool_execution_backend.js","sourceRoot":"","sources":["../../src/sdk/session_tool_execution_backend.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,157 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import { SESSION_PROTOCOL_MAX_EXEC_STDIN_BYTES } from "../protocol/session_protocol.js";
|
|
3
|
-
const HELPER_TIMEOUT_MS = 10_000;
|
|
4
|
-
const MAX_FILE_BYTES = SESSION_PROTOCOL_MAX_EXEC_STDIN_BYTES;
|
|
5
|
-
const MAX_FILE_READ_CAPTURE_BYTES = 4 * Math.ceil(MAX_FILE_BYTES / 3) + 1024;
|
|
6
|
-
const EXEC_ARGUMENTS_COMMAND = 'exec "$0" "$@"';
|
|
7
|
-
export function createSdkToolExecutionBackend(options) {
|
|
8
|
-
const { executionEnvironment, cwd } = options;
|
|
9
|
-
const runBash = async (command, runOptions = {}) => {
|
|
10
|
-
const result = await executionEnvironment.exec(command, {
|
|
11
|
-
...(runOptions.args !== undefined ? { args: runOptions.args } : {}),
|
|
12
|
-
...(runOptions.env !== undefined ? { env: runOptions.env } : {}),
|
|
13
|
-
...(runOptions.stdin !== undefined ? { stdin: runOptions.stdin } : {}),
|
|
14
|
-
cwd: runOptions.cwd ?? cwd,
|
|
15
|
-
...(runOptions.timeoutMs !== undefined ? { timeoutMs: runOptions.timeoutMs } : {}),
|
|
16
|
-
...(runOptions.maxCaptureBytes !== undefined
|
|
17
|
-
? { maxCaptureBytes: runOptions.maxCaptureBytes }
|
|
18
|
-
: {}),
|
|
19
|
-
...(runOptions.signal ? { signal: runOptions.signal } : {}),
|
|
20
|
-
});
|
|
21
|
-
runOptions.signal?.throwIfAborted();
|
|
22
|
-
return result;
|
|
23
|
-
};
|
|
24
|
-
const runNodeScript = (script, args = [], runOptions = {}) => runBash(EXEC_ARGUMENTS_COMMAND, {
|
|
25
|
-
...runOptions,
|
|
26
|
-
args: ["node", "-e", script, ...args],
|
|
27
|
-
});
|
|
28
|
-
return {
|
|
29
|
-
async dispose() { },
|
|
30
|
-
runBash,
|
|
31
|
-
runNodeScript,
|
|
32
|
-
async readFile(path) {
|
|
33
|
-
const result = await this.readFileBinary(path, { maxBytes: MAX_FILE_BYTES });
|
|
34
|
-
return { path, content: result.content.toString("utf-8") };
|
|
35
|
-
},
|
|
36
|
-
async readFileBinary(path, readOptions = {}) {
|
|
37
|
-
const result = await runNodeHelper(runNodeScript, READ_FILE_BINARY_SCRIPT, [path, String(readOptions.maxBytes ?? MAX_FILE_BYTES)], {
|
|
38
|
-
cwd,
|
|
39
|
-
timeoutMs: HELPER_TIMEOUT_MS,
|
|
40
|
-
maxCaptureBytes: MAX_FILE_READ_CAPTURE_BYTES,
|
|
41
|
-
});
|
|
42
|
-
const parsed = JSON.parse(result);
|
|
43
|
-
return {
|
|
44
|
-
path,
|
|
45
|
-
content: Buffer.from(parsed.contentBase64, "base64"),
|
|
46
|
-
bytes: parsed.bytes,
|
|
47
|
-
};
|
|
48
|
-
},
|
|
49
|
-
async writeFile(path, content) {
|
|
50
|
-
const result = await writeFile(runNodeScript, cwd, path, Buffer.from(content, "utf-8"));
|
|
51
|
-
return { ...result, lines: content.split("\n").length };
|
|
52
|
-
},
|
|
53
|
-
async writeFileBinary(path, content) {
|
|
54
|
-
return await writeFile(runNodeScript, cwd, path, content);
|
|
55
|
-
},
|
|
56
|
-
async listDir(path) {
|
|
57
|
-
const result = await runNodeHelper(runNodeScript, LIST_DIR_SCRIPT, [path], {
|
|
58
|
-
cwd,
|
|
59
|
-
timeoutMs: HELPER_TIMEOUT_MS,
|
|
60
|
-
});
|
|
61
|
-
return { path, entries: JSON.parse(result) };
|
|
62
|
-
},
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
export function createSdkDiffSnapshotDeps(options) {
|
|
66
|
-
return {
|
|
67
|
-
spawn: async (cmd, args, spawnOptions = {}) => {
|
|
68
|
-
spawnOptions.signal?.throwIfAborted();
|
|
69
|
-
const result = await options.backend.runBash(EXEC_ARGUMENTS_COMMAND, {
|
|
70
|
-
args: [cmd, ...args],
|
|
71
|
-
cwd: spawnOptions.cwd ?? options.cwd,
|
|
72
|
-
...(spawnOptions.env ? { env: definedEnvironment(spawnOptions.env) } : {}),
|
|
73
|
-
...(spawnOptions.timeoutMs !== undefined ? { timeoutMs: spawnOptions.timeoutMs } : {}),
|
|
74
|
-
...(spawnOptions.maxCaptureBytes !== undefined
|
|
75
|
-
? { maxCaptureBytes: spawnOptions.maxCaptureBytes }
|
|
76
|
-
: {}),
|
|
77
|
-
...(spawnOptions.signal ? { signal: spawnOptions.signal } : {}),
|
|
78
|
-
});
|
|
79
|
-
spawnOptions.signal?.throwIfAborted();
|
|
80
|
-
return {
|
|
81
|
-
stdout: result.stdout,
|
|
82
|
-
stderr: result.stderr,
|
|
83
|
-
...(spawnOptions.captureOutput === "combined" ||
|
|
84
|
-
spawnOptions.captureOutput === "combined-and-split"
|
|
85
|
-
? { output: result.output }
|
|
86
|
-
: {}),
|
|
87
|
-
exitCode: result.exitCode,
|
|
88
|
-
captureLimitExceeded: result.truncated,
|
|
89
|
-
timedOut: result.timedOut,
|
|
90
|
-
aborted: result.aborted,
|
|
91
|
-
closeSignal: result.closeSignal,
|
|
92
|
-
};
|
|
93
|
-
},
|
|
94
|
-
env: { env: () => ({}) },
|
|
95
|
-
fs: {
|
|
96
|
-
readFile: async (path) => (await options.backend.readFile(path)).content,
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
}
|
|
100
|
-
function definedEnvironment(env) {
|
|
101
|
-
return Object.fromEntries(Object.entries(env).filter((entry) => entry[1] !== undefined));
|
|
102
|
-
}
|
|
103
|
-
async function runNodeHelper(runNodeScript, script, args, options) {
|
|
104
|
-
const result = await runNodeScript(script, args, options);
|
|
105
|
-
if (result.truncated) {
|
|
106
|
-
throw new Error(`${basename(args[0] ?? "helper")} output exceeded the capture limit`);
|
|
107
|
-
}
|
|
108
|
-
if (result.exitCode !== 0) {
|
|
109
|
-
throw new Error(result.stderr.trim() || result.stdout.trim() || `${basename(args[0] ?? "helper")} failed`);
|
|
110
|
-
}
|
|
111
|
-
return result.stdout;
|
|
112
|
-
}
|
|
113
|
-
async function writeFile(runNodeScript, cwd, path, content) {
|
|
114
|
-
if (content.byteLength > MAX_FILE_BYTES) {
|
|
115
|
-
throw new Error(`file exceeds maximum size of ${MAX_FILE_BYTES} bytes`);
|
|
116
|
-
}
|
|
117
|
-
const result = await runNodeHelper(runNodeScript, WRITE_FILE_SCRIPT, [path], {
|
|
118
|
-
cwd,
|
|
119
|
-
timeoutMs: HELPER_TIMEOUT_MS,
|
|
120
|
-
stdin: content,
|
|
121
|
-
});
|
|
122
|
-
return JSON.parse(result);
|
|
123
|
-
}
|
|
124
|
-
const READ_FILE_BINARY_SCRIPT = `
|
|
125
|
-
const fs = require("fs");
|
|
126
|
-
const path = process.argv[1];
|
|
127
|
-
const maxBytes = Number(process.argv[2]);
|
|
128
|
-
const stats = fs.statSync(path);
|
|
129
|
-
if (!stats.isFile()) throw new Error("path is not a file");
|
|
130
|
-
if (stats.size > maxBytes) {
|
|
131
|
-
throw new Error(\`file exceeds maximum size of \${maxBytes} bytes (got \${stats.size} bytes)\`);
|
|
132
|
-
}
|
|
133
|
-
const content = fs.readFileSync(path);
|
|
134
|
-
process.stdout.write(JSON.stringify({
|
|
135
|
-
contentBase64: content.toString("base64"),
|
|
136
|
-
bytes: content.byteLength,
|
|
137
|
-
}));
|
|
138
|
-
`.trim();
|
|
139
|
-
const WRITE_FILE_SCRIPT = `
|
|
140
|
-
const fs = require("fs");
|
|
141
|
-
const path = require("path");
|
|
142
|
-
const file = process.argv[1];
|
|
143
|
-
const content = fs.readFileSync(0);
|
|
144
|
-
fs.mkdirSync(path.dirname(file), { recursive: true });
|
|
145
|
-
fs.writeFileSync(file, content);
|
|
146
|
-
process.stdout.write(JSON.stringify({ path: file, bytes: content.byteLength }));
|
|
147
|
-
`.trim();
|
|
148
|
-
const LIST_DIR_SCRIPT = `
|
|
149
|
-
const fs = require("fs");
|
|
150
|
-
const entries = fs.readdirSync(process.argv[1], { withFileTypes: true }).map((entry) => ({
|
|
151
|
-
name: entry.name,
|
|
152
|
-
isDirectory: entry.isDirectory(),
|
|
153
|
-
isSymlink: entry.isSymbolicLink(),
|
|
154
|
-
}));
|
|
155
|
-
process.stdout.write(JSON.stringify(entries));
|
|
156
|
-
`.trim();
|
|
1
|
+
export { createSdkDiffSnapshotDeps, createSdkToolExecutionBackend, } from "../sdk/session_tool_execution_backend.js";
|
|
157
2
|
//# sourceMappingURL=session_tool_execution_backend.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session_tool_execution_backend.js","sourceRoot":"","sources":["../../src/tui/session_tool_execution_backend.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"session_tool_execution_backend.js","sourceRoot":"","sources":["../../src/tui/session_tool_execution_backend.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,6BAA6B,GAC9B,MAAM,0CAA0C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;tab-size:4;font-family:system-ui,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;line-height:1.15}body{margin:0}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{border-color:currentColor}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:100%;line-height:1.15}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}.btn{border:1px solid var(--border);background:var(--surface);color:var(--text);font-size:var(--font-size-ui);cursor:pointer;white-space:nowrap;border-radius:0;align-items:center;gap:5px;padding:4px 10px;display:inline-flex}.btn:hover{background:var(--surface-hover)}.btn:disabled{opacity:.35;cursor:not-allowed}.btn.primary{background:var(--accent-primary);color:var(--text-inverse);border-color:#0000;font-weight:500}.btn.primary:hover{background:var(--accent-primary-hover)}.btn.ghost{color:var(--text-muted);background:0 0;border-color:#0000}.btn.ghost:hover{background:var(--surface-hover);color:var(--text)}.btn-group{align-items:center;gap:2px;display:inline-flex}.icon-btn{aspect-ratio:1;color:var(--text-muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:0;justify-content:center;align-items:center;width:28px;height:28px;display:inline-flex}.icon-btn:hover{background:var(--surface-hover);color:var(--text)}.icon-btn.active{background:var(--surface-hover);border-color:var(--border);color:var(--text)}.icon-btn.ghost{color:var(--text-muted)}.icon-btn.ghost:hover{color:var(--text)}.text-input-area{border:1px solid var(--border);background:var(--bg);width:100%;color:var(--text);font:inherit;border-radius:0;padding:6px 8px;display:block}.text-input-area:focus{border-color:var(--border-focus);outline:none}@font-face{font-family:JetBrains Mono;font-weight:400;font-style:normal;font-display:swap;src:url(/fonts/JetBrainsMono-Regular.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-weight:500;font-style:normal;font-display:swap;src:url(/fonts/JetBrainsMono-Medium.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-weight:600;font-style:normal;font-display:swap;src:url(/fonts/JetBrainsMono-SemiBold.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-weight:700;font-style:normal;font-display:swap;src:url(/fonts/JetBrainsMono-Bold.woff2)format("woff2")}@font-face{font-family:JetBrains Mono;font-weight:400;font-style:italic;font-display:swap;src:url(/fonts/JetBrainsMono-Italic.woff2)format("woff2")}:root{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--bg:#111;--surface:#121212;--surface-hover:#171717;--file-header-bg:color-mix(in srgb, var(--bg) 97%, var(--text));--file-header-bg-hover:color-mix(in srgb, var(--bg) 95%, var(--text));--border:#1f1f1f;--border-focus:#333;--text:#bdbdbd;--text-muted:#666;--accent-add:#5ae28c;--accent-del:#f86363;--accent-change:#b38bf9;--accent-del-muted:#f87272b8;--accent-del-subtle:#f8727214;--accent-del-subtle-hover:#f8727224;--accent-primary:#e0e0e0;--text-inverse:#090909;--accent-primary-hover:#f0f0f0;--thread-border-muted:#d6d6d626;--thread-border-strong:#d6d6d629;--thread-border-subtle:#d6d6d614;--thread-surface-subtle:#ffffff05;--thread-agent-surface:color-mix(in srgb, var(--accent-add) 4%, transparent);--sidebar-status-add:color-mix(in srgb, var(--accent-add) 55%, var(--text-muted));--sidebar-status-del:color-mix(in srgb, var(--accent-del) 45%, var(--text-muted));--sidebar-status-change:color-mix(in srgb, var(--accent-change) 45%, var(--text-muted));--dialog-backdrop:#000c;--popover-shadow:#00000073;--button-split-border:color-mix(in srgb, var(--text-inverse) 18%, transparent);--code-inline-bg:color-mix(in srgb, var(--accent-add) 7%, transparent);--code-inline-text:color-mix(in srgb, var(--accent-add) 82%, var(--text));--bar-height:48px;--sidebar-width:300px;--content-padding-x:12px;--file-gap:12px;--font-size-ui:1rem;--font-size-lg:1.07143rem;--font-size-sm:.928571rem;--font-size-xs:.857143rem;--font-size-code:.928571rem;--font-weight-ui:400;--font-weight-code:400;--letter-spacing-ui:0;--letter-spacing-code:0;--font-family-ui:system-ui, sans-serif;--font-family-code:"JetBrains Mono", monospace;--line-height-ui:1.5;--diffs-font-family:var(--font-family-code);--diffs-line-height:1.75;font-family:var(--font-family-ui);font-size:14px;font-weight:var(--font-weight-ui);letter-spacing:var(--letter-spacing-ui);line-height:var(--line-height-ui)}*,:before,:after{box-sizing:border-box;margin:0}body{background:var(--bg);color:var(--text);min-height:100vh}button,input,textarea{color:inherit;font:inherit}.app{min-height:100vh}.content{min-height:calc(100vh - var(--bar-height));padding:var(--content-padding-x)}.app.sidebar-open .content{margin-left:var(--sidebar-width)}.submit-popover{background:var(--surface);border:1px solid var(--border);box-shadow:0 18px 48px var(--popover-shadow);z-index:35;flex-direction:column;gap:12px;width:min(420px,100vw - 24px);padding:12px;display:flex;position:fixed}.submit-popover-input{resize:vertical;min-height:calc(7.5em + 1.5rem)}.submit-popover-actions{justify-content:flex-end;align-items:center;gap:6px;display:flex}.empty{color:var(--text-muted);padding:32px 16px}.diff-stats{align-items:center;gap:6px;display:inline-flex}.stat-add{color:var(--accent-add)}.stat-del{color:var(--accent-del)}.brief-dialog-body-wrap{flex:auto;min-height:0;display:block;overflow:auto}.brief-dialog-empty{color:var(--text-muted);padding:1rem;font-size:16px}.brief-dialog-body{padding:1rem;font-size:16px}.dialog-backdrop{background:var(--dialog-backdrop);z-index:40;justify-content:center;align-items:flex-start;padding-block:40px 20px;padding-inline:20px;display:flex;position:fixed;inset:0}.dialog{background:var(--surface);border:1px solid var(--border);flex-direction:column;width:min(760px,100%);min-height:0;max-height:calc(100vh - 60px);display:flex;overflow:hidden}.dialog-header{background:var(--bg);border-bottom:1px solid var(--border);z-index:1;justify-content:space-between;align-items:center;gap:8px;padding:1rem;display:flex;position:sticky;top:0}.dialog-heading{min-width:0}.dialog-title{color:var(--text);font-size:16px}.dialog-actions{flex-shrink:0}.dialog-close{width:24px;height:24px;padding:0}.dialog-body-wrap{flex-direction:column;flex:auto;min-height:0;display:flex;overflow:auto}.markdown-content{--markdown-code-block-border-color:color-mix(in srgb, var(--border) 86%, var(--bg));line-height:var(--line-height-ui);--markdown-code-block-font-size:calc(14 / 15 * 1rem);--markdown-code-block-margin-block:1em;--markdown-code-block-padding:8px 10px;--markdown-heading-letter-spacing:-.01em;--markdown-heading-margin-block:1em .75em;--markdown-heading-size:1.2em;--markdown-heading-weight:650;--markdown-inline-code-font-size:.9375em;--markdown-inline-code-padding-x:5px;--markdown-inline-code-padding-y:1px;--markdown-list-item-gap:.125em;--markdown-list-margin-block:1em;--markdown-list-nested-gap:.25em;--markdown-list-padding:1.5em;--markdown-paragraph-margin-block:1em;--markdown-prose-color:color-mix(in srgb, var(--text) 74%, var(--text-muted));--markdown-blockquote-color:color-mix(in srgb, var(--text) 47%, var(--text-muted));overflow-wrap:anywhere;white-space:normal;width:100%;min-width:0;max-width:100%}.markdown-content>:first-child{margin-block-start:0!important}.markdown-content>:last-child{margin-block-end:0!important}.markdown-content :where(h1,h2,h3,h4,h5,h6){color:var(--text);font-size:var(--markdown-heading-size);font-weight:var(--markdown-heading-weight);letter-spacing:var(--markdown-heading-letter-spacing);margin-block:var(--markdown-heading-margin-block);line-height:1.2}.markdown-content p{margin-block:var(--markdown-paragraph-margin-block)}.markdown-content p,.markdown-content li{color:var(--markdown-prose-color)}.markdown-content code{background:var(--code-inline-bg);color:var(--code-inline-text);font-family:var(--font-family-code);font-size:var(--markdown-inline-code-font-size);font-weight:var(--font-weight-code);letter-spacing:var(--letter-spacing-code);padding-block:var(--markdown-inline-code-padding-y);padding-inline:var(--markdown-inline-code-padding-x)}.markdown-content pre{border:1px solid var(--markdown-code-block-border-color);box-sizing:border-box;contain:inline-size;margin-block:var(--markdown-code-block-margin-block);min-width:0;max-width:100%;padding:var(--markdown-code-block-padding);white-space:pre;overflow-x:auto;background:var(--bg)!important}.markdown-content pre code{color:var(--text-muted);font-size:var(--markdown-code-block-font-size);min-width:0;max-width:100%;white-space:inherit;background:0 0;padding:0;display:block}.markdown-content ul,.markdown-content ol{margin-block:var(--markdown-list-margin-block);padding-left:var(--markdown-list-padding)}.markdown-content :where(h1,h2,h3,h4,h5,h6)+ul,.markdown-content :where(h1,h2,h3,h4,h5,h6)+ol{margin-block-start:0}.markdown-content ul{list-style:outside}.markdown-content ol{list-style:decimal}.markdown-content li+li{margin-top:var(--markdown-list-item-gap)}.markdown-content li::marker{color:var(--text-muted)}.markdown-content li>p{margin:0}.markdown-content li>p+p{margin-top:var(--markdown-list-nested-gap)}.markdown-content li>ul,.markdown-content li>ol{margin-block:var(--markdown-list-nested-gap) 0}.markdown-content blockquote{border-inline-start:2px solid var(--text-muted);color:var(--markdown-blockquote-color);padding-inline-start:.75em}.markdown-content strong{color:var(--text);font-weight:600}.markdown-content hr{border-bottom:0;border-inline:0;border-top:1px solid var(--thread-border-subtle);margin:1.5em 0}.markdown-content a{color:var(--text);text-underline-offset:2px;text-decoration:underline}.checkbox-btn{color:var(--text-muted);cursor:pointer;font-size:var(--font-size-xs);white-space:nowrap;align-items:center;gap:6px;padding:4px 0;display:inline-flex;position:relative}.checkbox-btn:hover{color:var(--text)}.checkbox-input{opacity:0;position:absolute;inset:0}.checkbox-box{border:1px solid var(--text-muted);color:var(--text-inverse);background:0 0;border-radius:0;flex:0 0 14px;justify-content:center;align-items:center;width:14px;height:14px;display:inline-flex}.checkbox-btn:hover .checkbox-box{border-color:var(--text)}.checkbox-input:focus-visible+.checkbox-box{border-color:var(--border-focus)}.checkbox-input:checked+.checkbox-box{background:var(--accent-add);border-color:var(--accent-add);color:var(--text-inverse)}.detached-thread-dialog-body-wrap{flex:auto;min-height:0;font-size:15px;display:flex;overflow:hidden}.detached-thread-dialog-layout{flex-direction:column;flex:auto;min-height:0;display:flex}.detached-thread-dialog-messages{flex:auto;min-height:0;overflow:auto}.detached-thread-dialog-message{padding:1rem}.detached-thread-dialog-message+.detached-thread-dialog-message{border-top:1px solid var(--border)}.detached-thread-dialog-message-assistant{background:var(--thread-agent-surface)}.detached-thread-dialog-message-header{justify-content:flex-start;align-items:center;gap:8px;margin-bottom:.5rem;display:flex}.detached-thread-dialog-role{color:var(--text);font-weight:600;display:inline-block}.detached-thread-dialog-delete{appearance:none;color:var(--text-muted);cursor:pointer;background:0 0;border:none;align-items:center;padding:.125rem;display:inline-flex}.detached-thread-dialog-delete:hover{color:var(--text)}.detached-thread-dialog-thinking{color:var(--text-muted);display:block}.detached-thread-dialog-composer{background:var(--bg);border-top:1px solid var(--border);flex:none;padding:1rem}.detached-thread-dialog-composer .btn,.detached-thread-dialog-composer .checkbox-btn{font-size:15px}.detached-thread-dialog-input{resize:vertical;min-height:96px}.detached-thread-dialog-actions{justify-content:flex-end;align-items:center;gap:8px;margin-top:.5rem;display:flex}.detached-thread-dialog-secondary{border-color:var(--thread-border-subtle);color:var(--text-muted);background:0 0}.detached-thread-dialog-secondary:hover{border-color:var(--border);background:var(--surface-hover);color:var(--text)}.comment-editor{border:1px solid var(--border);border-left:2px solid var(--thread-border-muted);background:var(--surface);box-sizing:border-box;font-size:var(--font-size-ui);border-radius:0;max-width:800px;margin:6px 10px 8px;padding:8px 10px 8px 12px}.comment-input{min-height:56px;font-size:var(--font-size-ui);resize:vertical}.comment-actions{justify-content:flex-end;align-items:center;gap:4px;margin-top:6px;display:flex}.comment-actions .checkbox-btn{font-size:var(--font-size-ui);margin-inline-end:auto}.thread-card{background:var(--surface);border:1px solid var(--border);font-size:var(--font-size-lg);max-width:800px;margin:.25rem}.thread-card.resolved{border-color:var(--thread-border-strong)}.thread-header-row,.thread-collapsed-row{font-size:var(--font-size-sm);padding-block:.375rem;padding-inline:1rem}.thread-toggle{appearance:none;color:var(--text-muted);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:.25rem;margin-block:0;margin-inline:-.5rem;padding-block:.25rem;padding-inline:.5rem;display:inline-flex}.thread-toggle:hover{color:var(--text)}.thread-msg{padding-block:1rem;padding-inline:1rem}.thread-messages>:first-child{padding-block-start:0;padding-inline:1rem}.thread-msg+.thread-msg{border-top:1px solid var(--border)}.thread-msg-assistant{background:var(--thread-agent-surface)}.thread-msg-header{justify-content:flex-start;align-items:center;gap:8px;margin-block-end:.25rem;display:flex}.thread-msg-role{color:var(--text);font-weight:600;display:inline-block}.thread-msg-delete{appearance:none;color:var(--text-muted);cursor:pointer;background:0 0;border:none;align-items:center;padding:.125rem;display:inline-flex}.thread-msg-delete:hover{color:var(--text)}.thread-msg-thinking{color:var(--text-muted);display:block}.thread-footer{background:var(--bg);border-block-start:1px solid var(--border);padding-block:.5rem;padding-inline:1rem}.thread-reply-input{resize:vertical;min-height:calc(4.5em + 1.5rem);padding:.75rem}.thread-actions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:.25rem;display:flex}.thread-reply-input+.thread-actions{margin-block-start:.75rem}.thread-actions .checkbox-btn{font-size:var(--font-size-ui);margin-inline-end:auto}.file-section{border:1px solid var(--border);background:var(--surface);scroll-margin-top:calc(var(--bar-height) + var(--file-gap));border-radius:0}.file-section+.file-section{margin-top:var(--file-gap)}.file-header{top:var(--bar-height);z-index:10;padding:0 var(--content-padding-x);background:var(--file-header-bg);border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;gap:12px;height:36px;display:flex;position:sticky}.file-header:hover{background:var(--file-header-bg-hover)}.file-section.collapsed .file-header{border-bottom:none}.file-toggle{color:var(--text-muted);cursor:pointer;background:0 0;border:none;align-items:center;gap:4px;min-width:0;padding:0;display:flex}.file-toggle:hover{color:var(--text)}.file-path{font-size:var(--font-size-ui);color:var(--text);white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.file-thread-count{color:var(--text-muted);font-size:var(--font-size-xs);flex-shrink:0;align-items:center;gap:4px;margin-left:4px;display:inline-flex}.file-meta{font-size:var(--font-size-ui);flex-shrink:0;align-items:center;gap:10px;display:flex}.viewed-checkbox{font-size:var(--font-size-xs)}.file-body{background:var(--bg);border-bottom-right-radius:8px;border-bottom-left-radius:8px}.diff-view{width:100%;font-size:var(--font-size-code);font-weight:var(--font-weight-code);letter-spacing:var(--letter-spacing-code);display:block}.diff-placeholder{color:var(--text-muted);font-size:var(--font-size-ui);padding:1rem var(--content-padding-x)}.sidebar{background:var(--surface);border-right:1px solid var(--border);bottom:0;left:0;top:var(--bar-height);width:var(--sidebar-width);z-index:15;flex-direction:column;gap:12px;padding-block:12px;display:flex;position:fixed;overflow-y:auto;transform:translate(-100%)}.sidebar.open{transform:translate(0)}.sidebar-section{flex-direction:column;gap:6px;display:flex}.sidebar-section-header{justify-content:space-between;align-items:center;gap:8px;padding-inline:12px;display:flex}.sidebar-section-title{color:var(--text);font-size:var(--font-size-sm);font-weight:500}.sidebar-action{min-height:28px;padding:0 8px}.sidebar-conversations,.sidebar-file-list{flex-direction:column;display:flex}.sidebar-divider{background:var(--border);flex:0 0 1px;height:1px}.sidebar-empty{color:var(--text-muted);font-size:var(--font-size-sm);padding-inline:12px}.sidebar-thread-item{color:var(--text);cursor:pointer;text-align:left;background:0 0;border:none;width:100%;padding-block:4px;padding-inline:12px;display:block}.sidebar-thread-item:hover,.sidebar-thread-item.selected{background:var(--surface-hover)}.sidebar-thread-item.resolved{color:var(--text-muted)}.sidebar-thread-row{justify-content:space-between;align-items:center;gap:8px;width:100%;display:flex}.sidebar-thread-kind{color:currentColor;opacity:.5;flex:none}.sidebar-thread-name{color:currentColor;font-size:var(--font-size-ui);text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;display:block;overflow:hidden}.sidebar-thread-status-dot{background:var(--text-muted);border-radius:999px;flex:0 0 6px;width:6px;height:6px}.sidebar-thread-status-dot.active{background:var(--accent-add)}.sidebar-file-group{flex-direction:column;display:flex}.sidebar-file-directory{color:var(--text-muted);font-family:var(--font-family-code);text-overflow:ellipsis;white-space:nowrap;height:28px;padding:4px 12px;line-height:1.25;overflow:hidden}.sidebar-item{color:var(--text);cursor:pointer;font-family:var(--font-family-code);text-align:left;background:0 0;border:none;width:100%;height:28px;padding:4px 12px 4px 18px;line-height:1.25;display:block}.sidebar-row{justify-content:space-between;align-items:center;gap:8px;width:100%;height:100%;display:flex}.sidebar-item:hover{background:var(--surface-hover)}.sidebar-item.viewed{color:var(--text-muted)}.sidebar-item.viewed .sidebar-file-status,.sidebar-item.viewed .stat-add,.sidebar-item.viewed .stat-del{opacity:.55}.sidebar-file-status{color:var(--text-muted);flex:none}.sidebar-file-status.added{color:var(--sidebar-status-add)}.sidebar-file-status.deleted{color:var(--sidebar-status-del)}.sidebar-file-status.modified,.sidebar-file-status.renamed,.sidebar-file-status.copied,.sidebar-file-status.type-changed,.sidebar-file-status.unmerged{color:var(--sidebar-status-change)}.sidebar-file-name{text-overflow:ellipsis;white-space:nowrap;flex:auto;min-width:0;display:block;overflow:hidden}.sidebar-stats{flex-shrink:0;gap:8px;display:flex}.top-bar{--top-bar-gap:8px;z-index:20;width:100%;max-width:100vw;height:var(--bar-height);background:var(--surface);border-bottom:1px solid var(--border);justify-content:space-between;align-items:center;padding:0 12px;display:flex;position:sticky;top:0;overflow:hidden}.top-bar-left,.top-bar-right{align-items:center;gap:var(--top-bar-gap);min-width:0;display:flex}.top-bar-left{flex:1 1 0;overflow:hidden}.top-bar-right{flex:none}.top-bar-meta{color:var(--text-muted);font-size:var(--font-size-sm)}.top-bar-meta-dim{opacity:.5}.top-bar-status{font-size:var(--font-size-xs)}.top-bar-brief-action{border-color:var(--thread-border-subtle);min-height:26px;color:var(--text);background:0 0;padding:0 8px}.top-bar-brief-action:hover{background:var(--surface-hover)}.top-bar-diff-meta{align-items:center;gap:var(--top-bar-gap);min-width:0;font-size:var(--font-size-sm);flex:1 1 0;display:inline-flex;overflow:hidden}.top-bar-diff-meta .diff-stats{flex:none}.top-bar-diff-command{text-overflow:ellipsis;white-space:nowrap;opacity:.4;flex:auto;min-width:0;overflow:hidden}.top-bar-viewed{align-items:center;gap:var(--top-bar-gap);color:var(--text-muted);font-size:var(--font-size-sm);white-space:nowrap;display:inline-flex}.top-bar-viewed-ring{border-radius:999px;flex:0 0 16px;justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex}.top-bar-viewed-ring-inner{background:var(--surface);border-radius:999px;width:10px;height:10px;display:block}.top-bar-viewed-text{color:var(--text-muted)}.top-bar-toggle{align-items:center;gap:var(--top-bar-gap);color:var(--text-muted);font-size:var(--font-size-xs);cursor:pointer;white-space:nowrap;background:0 0;border:none;padding:2px 0;display:inline-flex}.top-bar-toggle:hover{color:var(--text)}.top-bar-toggle-switch{border:1px solid var(--border);background:var(--surface-hover);border-radius:0;align-items:center;width:24px;height:14px;padding:1px;display:inline-flex}.top-bar-toggle-thumb{background:var(--text-muted);border-radius:0;width:10px;height:10px;display:block}.top-bar-toggle.active{color:var(--text)}.top-bar-toggle.active .top-bar-toggle-switch{background:var(--accent-add);border-color:var(--accent-add)}.top-bar-toggle.active .top-bar-toggle-thumb{background:var(--text-inverse);transform:translate(10px)}.top-bar-action{border:1px solid var(--border);background:var(--surface);min-height:28px;font-size:var(--font-size-ui);gap:6px;padding:0 10px}.top-bar-action:hover{background:var(--surface-hover)}.top-bar-action-primary{color:var(--text-inverse);border-color:var(--accent-primary);background:var(--accent-primary);font-weight:500}.top-bar-action-primary:hover{color:var(--text-inverse);background:var(--accent-primary-hover)}.top-bar-submit-group{display:inline-flex}.top-bar-submit-main{border-right-color:var(--button-split-border)}.top-bar-submit-menu{justify-content:center;min-width:28px;padding-inline:6px}.top-bar-submit-main+.top-bar-submit-menu{border-left:0}.top-bar-action-cancel{min-width:28px;color:var(--accent-del-muted);background:var(--accent-del-subtle);border-color:#0000;justify-content:center;padding:0}.top-bar-action-cancel:hover{color:var(--accent-del);background:var(--accent-del-subtle-hover);border-color:#0000}.toggle-group{border:1px solid var(--border);border-radius:0;display:inline-flex;overflow:hidden}.toggle-group-item{color:var(--text-muted);font-size:var(--font-size-ui);cursor:pointer;background:0 0;border:none;padding:4px 10px}.toggle-group-item.active{background:var(--surface-hover);color:var(--text)}.toggle-group-item:hover:not(.active){color:var(--text)}
|