@sortedyuan/maybecode 0.3.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +166 -55
- package/README.zh-CN.md +267 -0
- package/dist/application.d.ts +40 -34
- package/dist/application.d.ts.map +1 -1
- package/dist/application.js +290 -170
- package/dist/application.js.map +1 -1
- package/dist/args.d.ts +2 -2
- package/dist/args.d.ts.map +1 -1
- package/dist/args.js +50 -27
- package/dist/args.js.map +1 -1
- package/dist/bin.js +82 -71
- package/dist/bin.js.map +4 -4
- package/dist/cli/chunk-3IORPKBL.js +3572 -0
- package/dist/cli/chunk-3IORPKBL.js.map +7 -0
- package/dist/cli/{chunk-LVTRXPDS.js → chunk-4B2Z6KW7.js} +1547 -1536
- package/dist/cli/chunk-4B2Z6KW7.js.map +7 -0
- package/dist/cli/{chunk-JT6VBKOM.js → chunk-4WG6JIJJ.js} +127 -33
- package/dist/cli/{chunk-JT6VBKOM.js.map → chunk-4WG6JIJJ.js.map} +3 -3
- package/dist/cli/{chunk-K5JWPNSY.js → chunk-5SLWALZK.js} +3521 -16164
- package/dist/cli/chunk-5SLWALZK.js.map +7 -0
- package/dist/cli/chunk-MNBYXL5Y.js +132 -0
- package/dist/cli/chunk-MNBYXL5Y.js.map +7 -0
- package/dist/cli/{chunk-F4XRPLUM.js → chunk-SLWLUEHQ.js} +226 -86
- package/dist/cli/chunk-SLWLUEHQ.js.map +7 -0
- package/dist/cli/chunk-UQDZ55LQ.js +199 -0
- package/dist/cli/chunk-UQDZ55LQ.js.map +7 -0
- package/dist/cli/{chunk-7ISOHFS7.js → chunk-WMSG5ZTR.js} +717 -388
- package/dist/cli/chunk-WMSG5ZTR.js.map +7 -0
- package/dist/cli/chunk-WVIRS76R.js +4057 -0
- package/dist/cli/chunk-WVIRS76R.js.map +7 -0
- package/dist/cli/{chunk-HOU5ITUK.js → chunk-XTEMRAQW.js} +1 -1
- package/dist/cli/chunk-XTEMRAQW.js.map +7 -0
- package/dist/cli/chunk-Z3BOPBVU.js +91 -0
- package/dist/cli/chunk-Z3BOPBVU.js.map +7 -0
- package/dist/cli/{configured-WHY3GGAJ.js → configured-ACNM6TRQ.js} +10 -9
- package/dist/cli/{file-type-R2T7TBHI.js → file-type-HLHPV7WC.js} +817 -13
- package/dist/cli/file-type-HLHPV7WC.js.map +7 -0
- package/dist/cli/mcp-auth-XD5U7WCV.js +74 -0
- package/dist/cli/mcp-auth-XD5U7WCV.js.map +7 -0
- package/dist/cli/onboarding-WQWCPYEO.js +530 -0
- package/dist/cli/onboarding-WQWCPYEO.js.map +7 -0
- package/dist/cli/onboarding-check-HRRI5OJ7.js +32 -0
- package/dist/cli/onboarding-check-HRRI5OJ7.js.map +7 -0
- package/dist/cli/{retained-tui-VJ3VX4R3.js → retained-tui-QF5VMYLC.js} +788 -332
- package/dist/cli/retained-tui-QF5VMYLC.js.map +7 -0
- package/dist/cli/{sixel-LWTCM76G.js → sixel-ISZ4FZ3U.js} +37 -37
- package/dist/cli/{sixel-LWTCM76G.js.map → sixel-ISZ4FZ3U.js.map} +1 -1
- package/dist/cli/{team-T7G7PPNN.js → team-O2I5BXHM.js} +7 -6
- package/dist/cli/{team-v2-JGBBQ7FR.js → team-v2-YYO2G7DJ.js} +816 -390
- package/dist/cli/team-v2-YYO2G7DJ.js.map +7 -0
- package/dist/cli/{web-server-FOMNPY7Q.js → web-server-SXMH6FGA.js} +55 -19
- package/dist/cli/web-server-SXMH6FGA.js.map +7 -0
- package/dist/cli/{web-ui-COB6PKC5.js → web-ui-UWQUFE4W.js} +7 -6
- package/dist/config-schema.json +337 -0
- package/dist/configured.d.ts +18 -11
- package/dist/configured.d.ts.map +1 -1
- package/dist/configured.js +213 -390
- package/dist/configured.js.map +1 -1
- package/dist/controller.d.ts +19 -18
- package/dist/controller.d.ts.map +1 -1
- package/dist/delegation-commands.d.ts +1 -1
- package/dist/delegation-commands.d.ts.map +1 -1
- package/dist/delegation-commands.js +8 -8
- package/dist/delegation-commands.js.map +1 -1
- package/dist/errors.d.ts +2 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +2 -1
- package/dist/errors.js.map +1 -1
- package/dist/events.d.ts +8 -6
- package/dist/events.d.ts.map +1 -1
- package/dist/fork-picker.d.ts.map +1 -1
- package/dist/fork-picker.js +19 -5
- package/dist/fork-picker.js.map +1 -1
- package/dist/git-request.d.ts +6 -6
- package/dist/git-request.d.ts.map +1 -1
- package/dist/git-request.js +28 -15
- package/dist/git-request.js.map +1 -1
- package/dist/goal-commands.d.ts +1 -1
- package/dist/goal-commands.d.ts.map +1 -1
- package/dist/goal-commands.js +12 -5
- package/dist/goal-commands.js.map +1 -1
- package/dist/index.d.ts +5 -37
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -36
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +2 -7
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +7 -15
- package/dist/instructions.js.map +1 -1
- package/dist/keymap.d.ts +2 -2
- package/dist/keymap.d.ts.map +1 -1
- package/dist/keymap.js +2 -2
- package/dist/keymap.js.map +1 -1
- package/dist/maybecode-config.schema.json +1765 -0
- package/dist/mcp-auth.d.ts +1 -1
- package/dist/mcp-auth.d.ts.map +1 -1
- package/dist/mcp-auth.js +11 -8
- package/dist/mcp-auth.js.map +1 -1
- package/dist/mcp-commands.d.ts.map +1 -1
- package/dist/mcp-commands.js +18 -4
- package/dist/mcp-commands.js.map +1 -1
- package/dist/mcp-interaction-ui.d.ts.map +1 -1
- package/dist/mcp-interaction-ui.js +11 -4
- package/dist/mcp-interaction-ui.js.map +1 -1
- package/dist/media-history.d.ts +1 -1
- package/dist/media-history.d.ts.map +1 -1
- package/dist/media-history.js +8 -2
- package/dist/media-history.js.map +1 -1
- package/dist/model-picker.d.ts.map +1 -1
- package/dist/model-picker.js +10 -11
- package/dist/model-picker.js.map +1 -1
- package/dist/model-transition.d.ts +11 -0
- package/dist/model-transition.d.ts.map +1 -0
- package/dist/model-transition.js +48 -0
- package/dist/model-transition.js.map +1 -0
- package/dist/model.d.ts +2 -2
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +8 -4
- package/dist/model.js.map +1 -1
- package/dist/onboarding-check.d.ts +3 -0
- package/dist/onboarding-check.d.ts.map +1 -0
- package/dist/onboarding-check.js +22 -0
- package/dist/onboarding-check.js.map +1 -0
- package/dist/onboarding.d.ts +6 -0
- package/dist/onboarding.d.ts.map +1 -0
- package/dist/onboarding.js +463 -0
- package/dist/onboarding.js.map +1 -0
- package/dist/plugins/application.d.ts +6 -4
- package/dist/plugins/application.d.ts.map +1 -1
- package/dist/plugins/application.js +106 -52
- package/dist/plugins/application.js.map +1 -1
- package/dist/plugins/instructions.d.ts +1 -1
- package/dist/plugins/instructions.d.ts.map +1 -1
- package/dist/plugins/instructions.js +24 -11
- package/dist/plugins/instructions.js.map +1 -1
- package/dist/plugins/resources.d.ts +2 -2
- package/dist/plugins/resources.d.ts.map +1 -1
- package/dist/plugins/resources.js +22 -12
- package/dist/plugins/resources.js.map +1 -1
- package/dist/policy.d.ts +1 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/policy.js +59 -11
- package/dist/policy.js.map +1 -1
- package/dist/run.d.ts +2 -0
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +38 -33
- package/dist/run.js.map +1 -1
- package/dist/runtime-instructions.d.ts +1 -1
- package/dist/runtime-instructions.d.ts.map +1 -1
- package/dist/runtime-instructions.js +15 -7
- package/dist/runtime-instructions.js.map +1 -1
- package/dist/session-navigation.d.ts +6 -0
- package/dist/session-navigation.d.ts.map +1 -0
- package/dist/session-navigation.js +64 -0
- package/dist/session-navigation.js.map +1 -0
- package/dist/session-picker.d.ts +1 -1
- package/dist/session-picker.d.ts.map +1 -1
- package/dist/session-picker.js +23 -32
- package/dist/session-picker.js.map +1 -1
- package/dist/settings.d.ts +718 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +14 -0
- package/dist/settings.js.map +1 -0
- package/dist/skills.d.ts +1 -1
- package/dist/skills.d.ts.map +1 -1
- package/dist/skills.js +10 -12
- package/dist/skills.js.map +1 -1
- package/dist/slash-commands.d.ts +2 -2
- package/dist/slash-commands.d.ts.map +1 -1
- package/dist/slash-commands.js +149 -67
- package/dist/slash-commands.js.map +1 -1
- package/dist/team-execution.d.ts +10 -0
- package/dist/team-execution.d.ts.map +1 -0
- package/dist/team-execution.js +29 -0
- package/dist/team-execution.js.map +1 -0
- package/dist/team-patches.d.ts.map +1 -1
- package/dist/team-patches.js +149 -52
- package/dist/team-patches.js.map +1 -1
- package/dist/team-plan.d.ts +2 -2
- package/dist/team-plan.d.ts.map +1 -1
- package/dist/team-plan.js +115 -34
- package/dist/team-plan.js.map +1 -1
- package/dist/team-recovery.d.ts +1 -1
- package/dist/team-recovery.d.ts.map +1 -1
- package/dist/team-recovery.js +40 -10
- package/dist/team-recovery.js.map +1 -1
- package/dist/team-v2.d.ts.map +1 -1
- package/dist/team-v2.js +335 -104
- package/dist/team-v2.js.map +1 -1
- package/dist/team-verification.d.ts +4 -2
- package/dist/team-verification.d.ts.map +1 -1
- package/dist/team-verification.js +300 -97
- package/dist/team-verification.js.map +1 -1
- package/dist/team.d.ts +2 -2
- package/dist/team.d.ts.map +1 -1
- package/dist/team.js +172 -62
- package/dist/team.js.map +1 -1
- package/dist/terminal-web.d.ts +1 -0
- package/dist/terminal-web.d.ts.map +1 -1
- package/dist/terminal-web.js +28 -10
- package/dist/terminal-web.js.map +1 -1
- package/dist/ui/actions.d.ts.map +1 -1
- package/dist/ui/actions.js.map +1 -1
- package/dist/ui/retained-tui.d.ts.map +1 -1
- package/dist/ui/retained-tui.js +231 -173
- package/dist/ui/retained-tui.js.map +1 -1
- package/dist/ui/{prototype-view.d.ts → terminal-view.d.ts} +7 -7
- package/dist/ui/terminal-view.d.ts.map +1 -0
- package/dist/ui/{prototype-view.js → terminal-view.js} +185 -98
- package/dist/ui/terminal-view.js.map +1 -0
- package/dist/web-commands.d.ts.map +1 -1
- package/dist/web-commands.js +160 -57
- package/dist/web-commands.js.map +1 -1
- package/dist/web-extension.d.ts.map +1 -1
- package/dist/web-extension.js +14 -4
- package/dist/web-extension.js.map +1 -1
- package/dist/web-server.d.ts.map +1 -1
- package/dist/web-server.js +2 -1
- package/dist/web-server.js.map +1 -1
- package/dist/web-ui.d.ts.map +1 -1
- package/dist/web-ui.js +167 -40
- package/dist/web-ui.js.map +1 -1
- package/dist/workspace-configuration.d.ts +7 -0
- package/dist/workspace-configuration.d.ts.map +1 -0
- package/dist/workspace-configuration.js +134 -0
- package/dist/workspace-configuration.js.map +1 -0
- package/dist/workspace-state.d.ts +20 -0
- package/dist/workspace-state.d.ts.map +1 -0
- package/dist/workspace-state.js +2 -0
- package/dist/workspace-state.js.map +1 -0
- package/dist/workspace.d.ts +26 -43
- package/dist/workspace.d.ts.map +1 -1
- package/dist/workspace.js +261 -323
- package/dist/workspace.js.map +1 -1
- package/package.json +21 -31
- package/dist/cli/chunk-7ISOHFS7.js.map +0 -7
- package/dist/cli/chunk-F4XRPLUM.js.map +0 -7
- package/dist/cli/chunk-H7SNBFO4.js +0 -5522
- package/dist/cli/chunk-H7SNBFO4.js.map +0 -7
- package/dist/cli/chunk-HOU5ITUK.js.map +0 -7
- package/dist/cli/chunk-K5JWPNSY.js.map +0 -7
- package/dist/cli/chunk-LVTRXPDS.js.map +0 -7
- package/dist/cli/chunk-VAZMCNBB.js +0 -686
- package/dist/cli/chunk-VAZMCNBB.js.map +0 -7
- package/dist/cli/chunk-WOFEI42C.js +0 -7820
- package/dist/cli/chunk-WOFEI42C.js.map +0 -7
- package/dist/cli/file-type-R2T7TBHI.js.map +0 -7
- package/dist/cli/mcp-auth-UNRHSIKJ.js +0 -63
- package/dist/cli/mcp-auth-UNRHSIKJ.js.map +0 -7
- package/dist/cli/retained-tui-VJ3VX4R3.js.map +0 -7
- package/dist/cli/team-v2-JGBBQ7FR.js.map +0 -7
- package/dist/cli/tui-SA74DKMA.js +0 -1705
- package/dist/cli/tui-SA74DKMA.js.map +0 -7
- package/dist/cli/web-server-FOMNPY7Q.js.map +0 -7
- package/dist/delegation.d.ts +0 -2
- package/dist/delegation.d.ts.map +0 -1
- package/dist/delegation.js +0 -2
- package/dist/delegation.js.map +0 -1
- package/dist/history-memory.d.ts +0 -2
- package/dist/history-memory.d.ts.map +0 -1
- package/dist/history-memory.js +0 -2
- package/dist/history-memory.js.map +0 -1
- package/dist/subagent-budget.d.ts +0 -2
- package/dist/subagent-budget.d.ts.map +0 -1
- package/dist/subagent-budget.js +0 -2
- package/dist/subagent-budget.js.map +0 -1
- package/dist/subagent-files.d.ts +0 -2
- package/dist/subagent-files.d.ts.map +0 -1
- package/dist/subagent-files.js +0 -2
- package/dist/subagent-files.js.map +0 -1
- package/dist/subagent-host.d.ts +0 -2
- package/dist/subagent-host.d.ts.map +0 -1
- package/dist/subagent-host.js +0 -2
- package/dist/subagent-host.js.map +0 -1
- package/dist/subagent-instructions.d.ts +0 -2
- package/dist/subagent-instructions.d.ts.map +0 -1
- package/dist/subagent-instructions.js +0 -2
- package/dist/subagent-instructions.js.map +0 -1
- package/dist/subagents.d.ts +0 -2
- package/dist/subagents.d.ts.map +0 -1
- package/dist/subagents.js +0 -2
- package/dist/subagents.js.map +0 -1
- package/dist/summarizer.d.ts +0 -2
- package/dist/summarizer.d.ts.map +0 -1
- package/dist/summarizer.js +0 -2
- package/dist/summarizer.js.map +0 -1
- package/dist/tui.d.ts +0 -7
- package/dist/tui.d.ts.map +0 -1
- package/dist/tui.js +0 -1109
- package/dist/tui.js.map +0 -1
- package/dist/ui/prototype-view.d.ts.map +0 -1
- package/dist/ui/prototype-view.js.map +0 -1
- /package/dist/cli/{configured-WHY3GGAJ.js.map → configured-ACNM6TRQ.js.map} +0 -0
- /package/dist/cli/{team-T7G7PPNN.js.map → team-O2I5BXHM.js.map} +0 -0
- /package/dist/cli/{web-ui-COB6PKC5.js.map → web-ui-UWQUFE4W.js.map} +0 -0
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { createRequire as __createRequire } from "node:module"; const require = __createRequire(import.meta.url);
|
|
2
|
-
import {
|
|
3
|
-
getDefaultMaybeCodeDataDirectory,
|
|
4
|
-
loadMayConfig,
|
|
5
|
-
resolveMaybeCodeMcp
|
|
6
|
-
} from "./chunk-WOFEI42C.js";
|
|
7
|
-
import "./chunk-H7SNBFO4.js";
|
|
8
|
-
import "./chunk-VAZMCNBB.js";
|
|
9
|
-
import {
|
|
10
|
-
KeyringMcpCredentialStore,
|
|
11
|
-
MaybeCodeConfigError,
|
|
12
|
-
McpOAuthManager
|
|
13
|
-
} from "./chunk-K5JWPNSY.js";
|
|
14
|
-
import "./chunk-BSBNNF34.js";
|
|
15
|
-
import {
|
|
16
|
-
__name
|
|
17
|
-
} from "./chunk-E732GDOI.js";
|
|
18
|
-
|
|
19
|
-
// apps/maybecode/src/mcp-auth.ts
|
|
20
|
-
import { resolve, join } from "node:path";
|
|
21
|
-
async function runMaybeCodeMcpCommand(command, dependencies) {
|
|
22
|
-
const config = await (dependencies.loadConfig?.(command.configPath) ?? loadMayConfig(command.configPath === void 0 ? {} : { path: command.configPath }));
|
|
23
|
-
const mcp = resolveMaybeCodeMcp(config, resolve(command.workspace ?? process.cwd()));
|
|
24
|
-
const server = mcp === false ? void 0 : mcp.servers.find((entry) => entry.id === command.serverId);
|
|
25
|
-
if (server?.transport !== "streamable-http" || server.auth === void 0) {
|
|
26
|
-
throw new MaybeCodeConfigError(`MCP server "${command.serverId}" is missing, disabled, or not configured for OAuth`);
|
|
27
|
-
}
|
|
28
|
-
const oauth = dependencies.oauth ?? new McpOAuthManager(new KeyringMcpCredentialStore(
|
|
29
|
-
join(getDefaultMaybeCodeDataDirectory(), "mcp-credentials")
|
|
30
|
-
));
|
|
31
|
-
switch (command.action) {
|
|
32
|
-
case "login":
|
|
33
|
-
await oauth.login({
|
|
34
|
-
...server,
|
|
35
|
-
auth: { ...server.auth, scopes: [...server.auth.scopes ?? [], ...command.scopes ?? []] }
|
|
36
|
-
}, {
|
|
37
|
-
onAuthorizationUrl: dependencies.onAuthorizationUrl ?? ((url) => {
|
|
38
|
-
dependencies.write(`Open this URL in your browser to authorize MCP server ${server.id}:
|
|
39
|
-
${url.href}
|
|
40
|
-
Waiting for authorization (Ctrl+C to cancel)...
|
|
41
|
-
`);
|
|
42
|
-
}),
|
|
43
|
-
...dependencies.signal === void 0 ? {} : { signal: dependencies.signal }
|
|
44
|
-
});
|
|
45
|
-
dependencies.write(`MCP server ${server.id}: login complete. Restart an already-running workspace to reconnect.
|
|
46
|
-
`);
|
|
47
|
-
return;
|
|
48
|
-
case "logout": {
|
|
49
|
-
const result = await oauth.logout(server, dependencies.signal);
|
|
50
|
-
dependencies.write(`MCP server ${server.id}: local credentials removed${result.revoked ? "; revocation completed where applicable" : "; remote revocation unavailable or failed \u2014 revoke access at the provider if needed"}.
|
|
51
|
-
`);
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
case "status":
|
|
55
|
-
dependencies.write(`MCP server ${server.id}: ${JSON.stringify(await oauth.status(server))}
|
|
56
|
-
`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
__name(runMaybeCodeMcpCommand, "runMaybeCodeMcpCommand");
|
|
60
|
-
export {
|
|
61
|
-
runMaybeCodeMcpCommand
|
|
62
|
-
};
|
|
63
|
-
//# sourceMappingURL=mcp-auth-UNRHSIKJ.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/mcp-auth.ts"],
|
|
4
|
-
"sourcesContent": ["import { resolve, join } from \"node:path\";\nimport { loadMayConfig, type MayConfig } from \"@sortedyuan/config\";\nimport { KeyringMcpCredentialStore, McpOAuthManager } from \"@sortedyuan/mcp\";\nimport type { MaybeCodeMcpCommand } from \"./args.js\";\nimport { getDefaultMaybeCodeDataDirectory, resolveMaybeCodeMcp } from \"./configured.js\";\nimport { MaybeCodeConfigError } from \"./errors.js\";\n\nexport interface MaybeCodeMcpAuthDependencies {\n readonly write: (text: string) => void;\n readonly oauth?: McpOAuthManager;\n readonly loadConfig?: (path?: string) => Promise<MayConfig>;\n readonly onAuthorizationUrl?: (url: URL) => void | Promise<void>;\n readonly signal?: AbortSignal;\n}\n\n/** Authentication is available before agent/model startup, even for required endpoints. */\nexport async function runMaybeCodeMcpCommand(command: MaybeCodeMcpCommand, dependencies: MaybeCodeMcpAuthDependencies): Promise<void> {\n const config = await (dependencies.loadConfig?.(command.configPath) ??\n loadMayConfig(command.configPath === undefined ? {} : { path: command.configPath }));\n const mcp = resolveMaybeCodeMcp(config, resolve(command.workspace ?? process.cwd()));\n const server = mcp === false ? undefined : mcp.servers.find((entry) => entry.id === command.serverId);\n if (server?.transport !== \"streamable-http\" || server.auth === undefined) {\n throw new MaybeCodeConfigError(`MCP server \"${command.serverId}\" is missing, disabled, or not configured for OAuth`);\n }\n const oauth = dependencies.oauth ?? new McpOAuthManager(new KeyringMcpCredentialStore(\n join(getDefaultMaybeCodeDataDirectory(), \"mcp-credentials\"),\n ));\n switch (command.action) {\n case \"login\":\n await oauth.login({\n ...server,\n auth: { ...server.auth, scopes: [...server.auth.scopes ?? [], ...command.scopes ?? []] },\n }, {\n onAuthorizationUrl: dependencies.onAuthorizationUrl ?? ((url) => {\n dependencies.write(`Open this URL in your browser to authorize MCP server ${server.id}:\\n${url.href}\\nWaiting for authorization (Ctrl+C to cancel)...\\n`);\n }),\n ...(dependencies.signal === undefined ? {} : { signal: dependencies.signal }),\n });\n dependencies.write(`MCP server ${server.id}: login complete. Restart an already-running workspace to reconnect.\\n`);\n return;\n case \"logout\": {\n const result = await oauth.logout(server, dependencies.signal);\n dependencies.write(`MCP server ${server.id}: local credentials removed${result.revoked ? \"; revocation completed where applicable\" : \"; remote revocation unavailable or failed \u2014 revoke access at the provider if needed\"}.\\n`);\n return;\n }\n case \"status\":\n dependencies.write(`MCP server ${server.id}: ${JSON.stringify(await oauth.status(server))}\\n`);\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;AAAA,SAAS,SAAS,YAAY;AAgB9B,eAAsB,uBAAuB,SAA8B,cAA2D;AACpI,QAAM,SAAS,OAAO,aAAa,aAAa,QAAQ,UAAU,KAChE,cAAc,QAAQ,eAAe,SAAY,CAAC,IAAI,EAAE,MAAM,QAAQ,WAAW,CAAC;AACpF,QAAM,MAAM,oBAAoB,QAAQ,QAAQ,QAAQ,aAAa,QAAQ,IAAI,CAAC,CAAC;AACnF,QAAM,SAAS,QAAQ,QAAQ,SAAY,IAAI,QAAQ,KAAK,CAAC,UAAU,MAAM,OAAO,QAAQ,QAAQ;AACpG,MAAI,QAAQ,cAAc,qBAAqB,OAAO,SAAS,QAAW;AACxE,UAAM,IAAI,qBAAqB,eAAe,QAAQ,QAAQ,qDAAqD;AAAA,EACrH;AACA,QAAM,QAAQ,aAAa,SAAS,IAAI,gBAAgB,IAAI;AAAA,IAC1D,KAAK,iCAAiC,GAAG,iBAAiB;AAAA,EAC5D,CAAC;AACD,UAAQ,QAAQ,QAAQ;AAAA,IACtB,KAAK;AACH,YAAM,MAAM,MAAM;AAAA,QAChB,GAAG;AAAA,QACH,MAAM,EAAE,GAAG,OAAO,MAAM,QAAQ,CAAC,GAAG,OAAO,KAAK,UAAU,CAAC,GAAG,GAAG,QAAQ,UAAU,CAAC,CAAC,EAAE;AAAA,MACzF,GAAG;AAAA,QACD,oBAAoB,aAAa,uBAAuB,CAAC,QAAQ;AAC/D,uBAAa,MAAM,yDAAyD,OAAO,EAAE;AAAA,EAAM,IAAI,IAAI;AAAA;AAAA,CAAqD;AAAA,QAC1J;AAAA,QACA,GAAI,aAAa,WAAW,SAAY,CAAC,IAAI,EAAE,QAAQ,aAAa,OAAO;AAAA,MAC7E,CAAC;AACD,mBAAa,MAAM,cAAc,OAAO,EAAE;AAAA,CAAwE;AAClH;AAAA,IACF,KAAK,UAAU;AACb,YAAM,SAAS,MAAM,MAAM,OAAO,QAAQ,aAAa,MAAM;AAC7D,mBAAa,MAAM,cAAc,OAAO,EAAE,8BAA8B,OAAO,UAAU,4CAA4C,0FAAqF;AAAA,CAAK;AAC/N;AAAA,IACF;AAAA,IACA,KAAK;AACH,mBAAa,MAAM,cAAc,OAAO,EAAE,KAAK,KAAK,UAAU,MAAM,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,CAAI;AAAA,EACjG;AACF;AAhCsB;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/ui/retained-tui.ts", "../../src/ui/theme.ts", "../../src/ui/actions.ts", "../../src/ui/prototype-view.ts"],
|
|
4
|
-
"sourcesContent": ["import {\n FullscreenRenderer,\n NodeTerminalDriver,\n TuiRuntime,\n TerminalImages,\n createTerminalClipboard,\n type Clipboard,\n type RuntimeRenderer,\n type RuntimeTerminal,\n} from \"@sortedyuan/tui\";\nimport { TranscriptStore } from \"@sortedyuan/tui/transcript\";\nimport type { ApprovalRequest } from \"@sortedyuan/permissions\";\nimport { userInfo } from \"node:os\";\nimport type { SessionSummary } from \"@sortedyuan/session/catalog\";\nimport type {\n MaybeCodeController,\n MaybeCodeModelProfile,\n MaybeCodeReasoningEffortState,\n} from \"../controller.js\";\nimport {\n createMaybeCodeSlashCommandSuggester,\n executeMaybeCodeSlashCommand,\n formatMaybeCodeMcpStatus,\n parseMaybeCodeSlashCommand,\n type MaybeCodeSlashCommandResult,\n} from \"../slash-commands.js\";\nimport { MaybeCodePrototypeView } from \"./prototype-view.js\";\nimport type { MaybeCodeEvent } from \"../events.js\";\nimport { presentMcpInteraction } from \"../mcp-interaction-ui.js\";\nimport { MaybeCodeTerminalWeb } from \"../terminal-web.js\";\nimport { formatGoal } from \"../goal-commands.js\";\nimport {\n delegationOrder,\n formatDelegationTree,\n renderDelegationTask,\n} from \"../delegation-commands.js\";\nimport type { MaybeCodeKeymapOptions } from \"../keymap.js\";\n\nexport interface RunRetainedTerminalUIOptions {\n readonly terminal?: RuntimeTerminal;\n readonly renderer?: RuntimeRenderer;\n readonly clipboard?: Clipboard;\n readonly keymap?: MaybeCodeKeymapOptions;\n}\n\n/** Experimental retained-screen MaybeCode frontend. */\nexport async function runRetainedTerminalUI(\n app: MaybeCodeController,\n options: RunRetainedTerminalUIOptions = {},\n): Promise<void> {\n const terminal = options.terminal ?? new NodeTerminalDriver();\n const renderer = options.renderer ?? new FullscreenRenderer(terminal);\n const store = new TranscriptStore();\n const displayedSteering = new Set<string>();\n const images = new TerminalImages(undefined, terminal.imageSupport?.protocol, { cellSize: () => terminal.imageSupport?.cellSize });\n try {\n const history = await app.history();\n for (const event of history) if (event.type === \"assistant.completed\" || event.type === \"input.submitted\") await images.prepare(event.message.content);\n for (const event of history) if (event.type === \"tool.completed\" && event.content) await images.prepare(event.content);\n store.loadHistory(history);\n for (const event of history) {\n if (event.type === \"input.submitted\" && event.inputId) displayedSteering.add(event.inputId);\n if (event.type === \"input.steering.delivered\") for (const inputId of event.inputIds) displayedSteering.add(inputId);\n }\n } catch (error) {\n await app.close();\n throw error;\n }\n\n let runtime: TuiRuntime | undefined;\n let closing = false;\n let eventFailure: unknown;\n const pendingRuns = new Set<Promise<void>>();\n const observeRun = (result: Promise<unknown>): void => {\n const pending = result.then(() => undefined, error => {\n if (!closing && !isCancellation(error)) store.appendNotice(\"error\", errorMessage(error));\n }).finally(() => {\n pendingRuns.delete(pending);\n if (!closing) view.setStatus(app.isRunning ? \"Running\" : \"Ready\");\n });\n pendingRuns.add(pending);\n };\n let resolveExit!: () => void;\n const exited = new Promise<void>((resolve) => resolveExit = resolve);\n const finish = (): void => {\n if (closing) return;\n closing = true;\n runtime?.stop();\n resolveExit();\n };\n const web = new MaybeCodeTerminalWeb(app, finish);\n const handleProcessSignal = (): void => {\n if (app.isRunning) app.cancel(\"Interrupted by process signal\");\n finish();\n };\n const view = new MaybeCodePrototypeView({\n isRunning: () => app.isRunning,\n permissionMode: () => app.permissionMode,\n clipboard: options.clipboard ?? createTerminalClipboard({ output: terminal }),\n keymap: options.keymap ?? {\n ...(process.env.MAY_TUI_LEADER === undefined ? {} : { leader: process.env.MAY_TUI_LEADER }),\n },\n images,\n store,\n workspace: app.workspace,\n model: modelLabel(app),\n suggestions: createMaybeCodeSlashCommandSuggester(app),\n recordInput: (value) => !value.trimStart().startsWith(\"/\"),\n onInvalidate: () => runtime?.requestRender(),\n onCancel: () => {\n if (app.isRunning) {\n app.cancel(\"Interrupted\");\n view.setStatus(\"Cancelling\");\n } else {\n finish();\n }\n },\n onSubmit: async (value, accepted) => {\n if (value.trimStart().startsWith(\"/\")) {\n await handleCommand(value, app, store, view, finish, web, observeRun);\n return;\n }\n try {\n const run = await app.submit({ input: value });\n accepted?.();\n observeRun(run.result);\n } catch (error) {\n if (!isCancellation(error)) throw error;\n }\n },\n });\n process.on(\"SIGINT\", handleProcessSignal);\n process.on(\"SIGTERM\", handleProcessSignal);\n void refreshModelLabel(view, app);\n const refreshWorkspace = async () => {\n if (!app.getWorkspaceGit || closing) return;\n try { view.setWorkspaceGit(await app.getWorkspaceGit()); }\n catch (error) { view.setWorkspaceGit({ path: app.workspace, status: \"error\", autoCommit: false, error: errorMessage(error) }); }\n };\n await refreshWorkspace();\n let refreshingWorkspace = false;\n const workspaceTimer = app.getWorkspaceGit ? setInterval(() => {\n if (refreshingWorkspace || closing) return;\n refreshingWorkspace = true; void refreshWorkspace().finally(() => { refreshingWorkspace = false; });\n }, 2_000) : undefined;\n\n runtime = new TuiRuntime({ terminal, renderer, root: view });\n let eventTask: Promise<void> | undefined;\n try {\n runtime.start();\n eventTask = consumeEvents(app, store, view, () => closing, web.events, images, displayedSteering).catch((error) => {\n eventFailure = error;\n store.appendNotice(\"error\", `Event stream failed: ${errorMessage(error)}`);\n finish();\n });\n await exited;\n } finally {\n closing = true;\n if (workspaceTimer) clearInterval(workspaceTimer);\n process.removeListener(\"SIGINT\", handleProcessSignal);\n process.removeListener(\"SIGTERM\", handleProcessSignal);\n runtime.stop();\n view.dispose();\n await web.close();\n await Promise.all(pendingRuns);\n await eventTask;\n }\n if (eventFailure !== undefined) throw eventFailure;\n}\n\nasync function consumeEvents(\n app: MaybeCodeController,\n store: TranscriptStore,\n view: MaybeCodePrototypeView,\n isClosing: () => boolean,\n events: AsyncIterable<MaybeCodeEvent>,\n images: TerminalImages,\n displayedSteering: Set<string>,\n): Promise<void> {\n const approvals = new Set<Promise<void>>();\n const interactions = new Map<string, AbortController>();\n const delegationStatus = new Map<string, string>();\n let lastGoalDisplay = \"\";\n for await (const event of events) {\n if (event.type === \"run.event\") {\n if (event.event.type === \"run.started\") {\n view.setStatus(\"Running\");\n const unread = app.listSteeringInputs?.().filter(input => input.status === \"delivered\" && !displayedSteering.has(input.inputId)) ?? [];\n if (unread.length > 0) {\n const history = await app.history();\n const runId = event.event.runId;\n const runIndex = history.findIndex(item => item.type === \"run.started\" && item.runId === runId);\n const submitted = runIndex < 0 ? undefined : history.slice(0, runIndex).reverse().find(item => item.type === \"input.submitted\");\n if (submitted?.type === \"input.submitted\" && submitted.inputId && unread.some(input => input.inputId === submitted.inputId)) {\n store.appendUser(submitted.message.content.filter(part => part.type === \"text\").map(part => part.text).join(\"\"));\n displayedSteering.add(submitted.inputId);\n }\n }\n }\n if (event.event.type === \"input.received\") {\n for (const input of app.listSteeringInputs?.() ?? []) {\n if (input.status === \"delivered\" && input.runId === event.event.runId) displayedSteering.add(input.inputId);\n }\n }\n // \u4E3B Run \u8BA9\u51FA\u65F6\u5B50\u4EFB\u52A1\u8FD8\u5728\u8FD0\u884C\uFF0C\u72B6\u6001\u4E0D\u80FD\u663E\u793A\u4E3A Ready\u3002\n if (event.event.type === \"run.completed\" || event.event.type === \"run.yielded\" || event.event.type === \"run.cancelled\") {\n view.setStatus(app.isRunning ? \"Delegating\" : \"Ready\");\n }\n if (event.event.type === \"run.failed\") view.setStatus(`Error: ${event.event.error.message}`);\n }\n if (event.type === \"permission-mode.changed\") {\n view.setStatus(event.mode === \"yolo\" ? \"YOLO enabled\" : \"YOLO disabled\");\n }\n if (event.type === \"run.event\" && event.event.type === \"model.completed\") await images.prepare(event.event.message.content);\n if (event.type === \"run.event\" && event.event.type === \"tool.completed\") await images.prepare(event.event.content);\n if (event.type === \"goal.changed\") {\n view.setStatus(`Goal ${event.goal.status}`);\n const display = `${event.goal.id}:${event.goal.status}:${event.goal.progress}`;\n if (display !== lastGoalDisplay) {\n lastGoalDisplay = display;\n store.appendNotice(\"info\", formatGoal(event.goal));\n }\n }\n if (event.type === \"delegation.started\" || event.type === \"delegation.finished\") {\n if (event.type === \"delegation.started\") delegationStatus.clear();\n const label = event.type === \"delegation.started\" ? \"Sub-agent request\" : \"Sub-agent request finished\";\n if (app.delegationNotifications === true) store.appendNotice(\"info\", `${label}\\n${formatDelegationTree(event.state)}`);\n view.setStatus(event.type === \"delegation.started\" ? \"Delegating\" : \"Ready\");\n } else if (event.type === \"delegation.updated\") {\n // \u540C\u4E00\u4EFB\u52A1\u7684\u91CD\u590D\u72B6\u6001\u4E0D\u663E\u793A\u3002\n for (const task of delegationOrder(event.state.tasks)) {\n const previous = delegationStatus.get(task.id);\n delegationStatus.set(task.id, task.status);\n if (app.delegationNotifications !== true || previous === task.status) continue;\n store.appendNotice([\"failed\", \"cancelled\", \"recovery-required\"].includes(task.status) ? \"warning\" : \"info\", renderDelegationTask(task));\n }\n }\n applyMaybeCodeEvent(store, event);\n if (event.type === \"mcp.interaction.requested\") {\n const controller = new AbortController();\n interactions.set(event.request.id, controller);\n const signal = AbortSignal.any([controller.signal, AbortSignal.timeout(Math.max(0, Math.ceil(event.request.expiresAt - Date.now())))]);\n const task = presentMcpInteraction(event.request, app, (prompt, signal) => view.requestMcpInput(prompt, signal), signal)\n .catch(() => { if (!isClosing() && !signal.aborted) {\n store.appendNotice(\"warning\", \"MCP interaction could not be completed\");\n app.cancel(\"User interaction is unavailable\");\n } })\n .finally(() => interactions.delete(event.request.id));\n approvals.add(task); void task.finally(() => approvals.delete(task));\n } else if (event.type === \"mcp.interaction.settled\") interactions.get(event.requestId)?.abort();\n if (event.type === \"model.changed\") {\n void refreshModelLabel(view, app);\n }\n if (event.type === \"session.changed\" && event.resumed) {\n const history = await app.history();\n for (const event of history) if (event.type === \"assistant.completed\" || event.type === \"input.submitted\") await images.prepare(event.message.content);\n for (const event of history) if (event.type === \"tool.completed\" && event.content) await images.prepare(event.content);\n store.loadHistory(history);\n displayedSteering.clear();\n for (const event of history) {\n if (event.type === \"input.submitted\" && event.inputId) displayedSteering.add(event.inputId);\n if (event.type === \"input.steering.delivered\") for (const inputId of event.inputIds) displayedSteering.add(inputId);\n }\n store.appendNotice(\"info\", \"Session resumed\");\n continue;\n }\n if (\n event.type === \"permission.event\" &&\n event.event.type === \"approval.requested\"\n ) {\n const task = presentApproval(app, view, store, event.event.request, isClosing, approvals);\n approvals.add(task);\n void task.finally(() => approvals.delete(task));\n } else if (\n event.type === \"permission.event\" &&\n (event.event.type === \"approval.resolved\" ||\n event.event.type === \"approval.cancelled\")\n ) {\n view.dismissApproval(event.event.requestId);\n }\n if (event.type === \"delegation.event\" && event.event.type === \"permission.event\") {\n // \u5B50\u4EFB\u52A1\u5BA1\u6279\uFF1A\u5305\u5728\u5916\u5C42\u4E8B\u4EF6\u91CC\uFF0C\u540C\u6837\u9700\u8981\u754C\u9762\u4E0E\u8DEF\u7531\u3002\n const inner = event.event.event;\n if (inner.type === \"approval.requested\") {\n store.appendNotice(\"info\", `\u5B50\u4EFB\u52A1 ${event.taskId} \u8BF7\u6C42\u6279\u51C6 ${inner.request.tool.name}`);\n const task = presentApproval(app, view, store, inner.request, isClosing, approvals);\n approvals.add(task);\n void task.finally(() => approvals.delete(task));\n } else if (inner.type === \"approval.resolved\" || inner.type === \"approval.cancelled\") {\n view.dismissApproval(inner.requestId);\n }\n }\n }\n for (const controller of interactions.values()) controller.abort();\n await Promise.all(approvals);\n}\n\n/** \u6253\u5F00\u5BA1\u6279\u5BF9\u8BDD\u6846\u5E76\u628A\u51B3\u5B9A\u4EA4\u56DE\u5BBF\u4E3B\uFF0C\u7531\u5BBF\u4E3B\u8DEF\u7531\u5230\u63D0\u51FA\u8BF7\u6C42\u7684 Session\u3002 */\nfunction presentApproval(\n app: MaybeCodeController,\n view: MaybeCodePrototypeView,\n store: TranscriptStore,\n request: ApprovalRequest,\n isClosing: () => boolean,\n approvals: Set<Promise<void>>,\n): Promise<void> {\n return view.requestApproval(request).then(async (decision) => {\n if (decision !== undefined && !isClosing()) {\n await app.resolveApproval(request.id, decision, decision === \"allow-persistent\" ? { createdBy: `local:${userInfo().username}` } : undefined);\n }\n }).catch((error: unknown) => {\n if (!isClosing()) {\n store.appendNotice(\"error\", `Approval failed: ${errorMessage(error)}`);\n }\n });\n}\n\nfunction applyMaybeCodeEvent(\n store: TranscriptStore,\n event: MaybeCodeEvent,\n): void {\n switch (event.type) {\n case \"run.event\":\n store.applyMayEvent(event.event);\n break;\n case \"delegation.event\":\n // \u5B50 Agent \u7684 Run \u4E0E\u5BA1\u6279\u4E8B\u4EF6\u8FDB\u5165\u540C\u4E00\u4E2A\u8BB0\u5F55\u6D41\uFF0CRun \u8EAB\u4EFD\u5F7C\u6B64\u72EC\u7ACB\u3002\n if (event.event.type === \"run.event\") store.applyMayEvent(event.event.event);\n else if (event.event.type === \"permission.event\") store.applyPermissionEvent(event.event.event);\n break;\n case \"permission.event\":\n store.applyPermissionEvent(event.event);\n break;\n case \"change.preview\":\n store.appendChangePreview(\n event.runId,\n event.step,\n event.toolCallId,\n event.preview,\n );\n break;\n case \"session.changed\":\n store.reset(event.sessionId);\n store.appendNotice(\n \"info\",\n `Session ${event.resumed ? \"resumed\" : \"started\"}: ${event.sessionId}`,\n );\n break;\n case \"model.changed\": {\n const profile = event.model.profile === undefined\n ? \"\"\n : ` profile ${event.model.profile}`;\n store.appendNotice(\n \"info\",\n `Model switched to${profile}: ${event.model.provider}/${event.model.model}`,\n );\n break;\n }\n case \"model.default.changed\":\n store.appendNotice(\"info\", `Default model set to ${event.profile}`);\n break;\n case \"mcp.resource.updated\":\n store.appendNotice(\"info\", `MCP resource updated: ${event.serverId} ${event.uri}`);\n break;\n case \"mcp.resource.watch-closed\":\n store.appendNotice(\"info\", `MCP resource watch closed: ${event.serverId} ${event.uri} (${event.reason})`);\n break;\n case \"mcp.server.connected\":\n store.appendNotice(\n \"info\",\n `MCP server connected: ${event.serverId} ` +\n `(${event.toolNames.length} tools)`,\n );\n break;\n case \"mcp.server.catalog-updated\":\n store.appendNotice(\"info\", `MCP catalog updated: ${event.serverId} (revision ${event.revision})`);\n break;\n case \"mcp.server.failed\":\n store.appendNotice(\n \"warning\",\n `MCP server failed: ${event.serverId}: ${event.diagnostic.message}`,\n );\n break;\n case \"mcp.server.disconnected\":\n store.appendNotice(\"info\", `MCP server disconnected: ${event.serverId}`);\n break;\n case \"context.compacted\":\n store.appendNotice(\n \"info\",\n `Context compacted with ${event.strategy}: ` +\n `${event.before.messageCount} \u2192 ${event.after.messageCount} messages`,\n );\n break;\n case \"context.compaction.failed\":\n store.appendNotice(\n \"warning\",\n `Context compaction failed with ${event.strategy}: ${event.error.message}`,\n );\n break;\n }\n}\n\nasync function handleCommand(\n input: string,\n app: MaybeCodeController,\n store: TranscriptStore,\n view: MaybeCodePrototypeView,\n finish: () => void,\n web: MaybeCodeTerminalWeb,\n observeRun: (result: Promise<unknown>) => void,\n): Promise<void> {\n const parsed = parseMaybeCodeSlashCommand(input);\n if (\n parsed.type === \"command\" &&\n parsed.definition.name === \"/compact\" &&\n parsed.arguments.length === 0\n ) {\n store.appendNotice(\n \"info\",\n \"Pruning old tool results and summarizing context\",\n );\n }\n const result = await executeMaybeCodeSlashCommand(input, app);\n if (result.type === \"web.requested\") {\n store.appendNotice(\"info\", `Web UI \u5DF2\u6253\u5F00\uFF1A${await web.open()}`);\n return;\n }\n await presentCommandResult(result, app, store, view, finish, observeRun);\n}\n\nasync function presentCommandResult(\n result: MaybeCodeSlashCommandResult,\n app: MaybeCodeController,\n store: TranscriptStore,\n view: MaybeCodePrototypeView,\n finish: () => void,\n observeRun: (result: Promise<unknown>) => void,\n): Promise<void> {\n switch (result.type) {\n case \"exit\":\n finish();\n break;\n case \"help\":\n store.appendNotice(\n \"info\",\n [\n ...result.commands.map((command) =>\n `${command.usage} \u2014 ${command.description}`\n ),\n ...view.displayCommands.map((command) =>\n `${command.command} \u2014 ${command.description} (display only)`\n ),\n ].join(\"\\n\"),\n );\n break;\n case \"instructions\":\n store.appendNotice(\"info\", result.instructions.effective);\n break;\n case \"mcp.run-started\":\n case \"skill.run-started\":\n case \"retry.started\":\n observeRun(result.run.result);\n break;\n case \"status\":\n store.appendNotice(\n \"info\",\n `Session: ${app.sessionId}\\nWorkspace: ${app.workspace}\\n` +\n `Permissions: ${app.permissionMode === \"yolo\" ? \"YOLO \u00B7 Auto-approve\" : \"Default\"}\\n` +\n `Model: ${await resolvedModelLabel(app)}${inspectionText(result.inspection)}`,\n );\n break;\n case \"display\":\n case \"mcp.display\":\n store.appendNotice(\"info\", result.text);\n break;\n case \"mcp.status\":\n store.appendNotice(\"info\", formatMaybeCodeMcpStatus(result.servers));\n break;\n case \"context\":\n store.appendNotice(\n \"info\",\n result.inspection === undefined\n ? \"Context inspection is unavailable\"\n : inspectionText(result.inspection).replace(/^\\n/u, \"\"),\n );\n break;\n case \"compacted\":\n store.appendNotice(\n \"info\",\n `Context ${result.result.changed ? \"compacted\" : \"unchanged\"} with ` +\n `${result.result.strategy}: ${result.result.before.messageCount} \u2192 ` +\n `${result.result.after.messageCount} messages`,\n );\n break;\n case \"session.created\":\n store.appendNotice(\"info\", `Created session ${result.sessionId}`);\n break;\n case \"session.selection.requested\":\n await runSessionDialog(view, app, store, result.sessions);\n break;\n case \"fork.selection.requested\": {\n const selection = await view.requestForkSelection(result.points, app.sessionId);\n if (selection) {\n if (!app.forkSession) throw new Error(\"Session \u5206\u652F\u80FD\u529B\u4E0D\u53EF\u7528\u3002\");\n const id = await app.forkSession(selection.pointId, selection.mode);\n store.appendNotice(\"info\", `Session \u5206\u652F\u5DF2\u521B\u5EFA\uFF1A${id}`);\n if (app.getWorkspaceGit) view.setWorkspaceGit(await app.getWorkspaceGit());\n }\n break;\n }\n case \"changes.selection.requested\":\n await view.requestChanges(result.diff, {\n ...(result.diff.runId && app.previewRestore ? { onRestore: async (path: string) => (await app.previewRestore!(result.diff.runId!, [path])).diff } : {}),\n ...(app.restoreFiles ? { onApply: (previewId: string) => app.restoreFiles!(previewId) } : {}),\n });\n break;\n case \"worktrees.display\":\n store.appendNotice(\"info\", result.worktrees.length ? result.worktrees.map(item => `${item.id}\\n${item.path}\\n${item.branch} \u00B7 ${item.status} \u00B7 ${item.commit.slice(0, 12)}`).join(\"\\n\\n\") : \"\u6CA1\u6709\u5DF2\u767B\u8BB0\u7684 worktree\u3002\");\n break;\n case \"session.resumed\":\n store.appendNotice(\"info\", `Resumed session ${result.sessionId}`);\n break;\n case \"model.selection.requested\":\n await runModelDialog(view, app, store, result.models);\n break;\n case \"model.switched\":\n await refreshModelLabel(view, app);\n break;\n case \"model.not-found\":\n store.appendNotice(\n \"warning\",\n `No model profile starts with: ${result.query}`,\n );\n break;\n case \"effort.selection.requested\":\n if (result.state.status !== \"known\") {\n store.appendNotice(\"warning\", reasoningEffortUnavailable(result.state));\n } else {\n await runEffortDialog(view, app, store, result.state);\n }\n break;\n case \"effort.changed\":\n view.setModel(modelLabel(app, result.state));\n store.appendNotice(\"info\", reasoningEffortChanged(result.state));\n break;\n case \"effort.not-found\":\n store.appendNotice(\n \"warning\",\n `No reasoning effort starts with: ${result.query}`,\n );\n break;\n case \"usage\":\n store.appendNotice(\"warning\", `Usage: ${result.usage}`);\n break;\n case \"unknown\":\n store.appendNotice(\"warning\", `Unknown command: ${result.command}`);\n break;\n }\n}\n\nasync function runEffortDialog(\n view: MaybeCodePrototypeView,\n app: MaybeCodeController,\n store: TranscriptStore,\n state: MaybeCodeReasoningEffortState,\n): Promise<void> {\n const effort = await view.requestReasoningEffortSelection(state);\n if (effort === undefined) return;\n try {\n const changed = await app.setReasoningEffort(\n effort === \"default\" ? undefined : effort,\n );\n view.setModel(modelLabel(app, changed));\n store.appendNotice(\"info\", reasoningEffortChanged(changed));\n } catch (error) {\n store.appendNotice(\"error\", errorMessage(error));\n }\n}\n\nasync function runModelDialog(\n view: MaybeCodePrototypeView,\n app: MaybeCodeController,\n store: TranscriptStore,\n initialModels: readonly MaybeCodeModelProfile[],\n): Promise<void> {\n let models = initialModels;\n while (true) {\n const action = await view.requestModelAction(\n models,\n app.modelInfo?.profile,\n );\n if (action === undefined) return;\n try {\n if (action.type === \"switch\") {\n await app.switchModel(action.profile);\n await refreshModelLabel(view, app);\n return;\n }\n await app.setDefaultModel(action.profile);\n models = await app.listModels();\n } catch (error) {\n store.appendNotice(\"error\", errorMessage(error));\n models = await app.listModels();\n }\n }\n}\n\nasync function runSessionDialog(\n view: MaybeCodePrototypeView,\n app: MaybeCodeController,\n store: TranscriptStore,\n initialSessions: readonly SessionSummary[],\n): Promise<void> {\n let sessions = initialSessions;\n while (true) {\n const action = await view.requestSessionAction(sessions, app.sessionId);\n if (action === undefined) return;\n try {\n if (action.type === \"resume\") {\n await app.resumeSession(action.sessionId);\n store.appendNotice(\"info\", `Resumed session ${action.sessionId}`);\n return;\n }\n if (action.type === \"rename\") {\n await app.renameSession(action.sessionId, action.title);\n store.appendNotice(\"info\", `Renamed session to ${action.title}`);\n } else {\n const deleted = await app.deleteSession(action.sessionId);\n store.appendNotice(\n deleted ? \"info\" : \"warning\",\n deleted\n ? `Deleted session ${action.sessionId}`\n : `Session ${action.sessionId} was not found`,\n );\n }\n sessions = await app.listSessions();\n } catch (error) {\n store.appendNotice(\"error\", errorMessage(error));\n sessions = await app.listSessions();\n }\n }\n}\n\nfunction inspectionText(\n inspection: Awaited<ReturnType<MaybeCodeController[\"inspectContext\"]>>,\n): string {\n if (inspection === undefined) return \"\\nContext: unavailable\";\n const window = inspection.contextWindowTokens === undefined\n ? \"\"\n : ` / ${inspection.contextWindowTokens}`;\n return `\\nContext: ~${inspection.effectiveTokens}${window} tokens, ` +\n `${inspection.messageCount} messages`;\n}\n\nfunction modelLabel(\n app: MaybeCodeController,\n effort: MaybeCodeReasoningEffortState | \"loading\" = \"loading\",\n): string {\n if (app.modelInfo === undefined) return \"unknown \u00B7 effort: unknown\";\n const endpoint = `${app.modelInfo.provider}/${app.modelInfo.model}`;\n const model = app.modelInfo.profile === undefined\n ? endpoint\n : `${app.modelInfo.profile} (${endpoint})`;\n return `${model} \u00B7 effort: ${reasoningEffortLabel(effort)}`;\n}\n\nfunction reasoningEffortLabel(\n state: MaybeCodeReasoningEffortState | \"loading\",\n): string {\n if (state === \"loading\") return \"\u2026\";\n if (state.status === \"unsupported\") return \"n/a\";\n if (state.status === \"unknown\") return \"unknown\";\n return state.effectiveEffort ?? state.defaultEffort ?? \"default\";\n}\n\nasync function resolvedModelLabel(app: MaybeCodeController): Promise<string> {\n try {\n return modelLabel(app, await app.getReasoningEffort());\n } catch {\n return modelLabel(app, unknownReasoningEffort());\n }\n}\n\nasync function refreshModelLabel(\n view: MaybeCodePrototypeView,\n app: MaybeCodeController,\n): Promise<void> {\n const identity = modelIdentity(app);\n const label = await resolvedModelLabel(app);\n if (identity === modelIdentity(app)) view.setModel(label);\n}\n\nfunction modelIdentity(app: MaybeCodeController): string {\n const model = app.modelInfo;\n return model === undefined\n ? \"\"\n : `${model.profile ?? \"\"}\\u0000${model.provider}\\u0000${model.model}`;\n}\n\nfunction unknownReasoningEffort(): MaybeCodeReasoningEffortState {\n return {\n status: \"unknown\",\n source: \"unknown\",\n efforts: [],\n overridden: false,\n };\n}\n\nfunction reasoningEffortUnavailable(\n state: MaybeCodeReasoningEffortState,\n): string {\n return state.status === \"unsupported\"\n ? \"The active model does not support effort-based reasoning\"\n : \"Reasoning effort capability is unknown for the active model\";\n}\n\nfunction reasoningEffortChanged(state: MaybeCodeReasoningEffortState): string {\n const effort = state.effectiveEffort ?? \"provider/model default\";\n return `Reasoning effort: ${effort}${state.overridden ? \" (runtime override)\" : \"\"}`;\n}\n\nfunction isCancellation(error: unknown): boolean {\n return error instanceof Error &&\n (error.name === \"AbortError\" ||\n (\"code\" in error && error.code === \"RUN_CANCELLED\"));\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n", "import { DEFAULT_DARK_THEME, type TuiTheme } from \"@sortedyuan/tui\";\n\n/** MaybeCode's restrained dark palette. Applications may replace it later. */\nexport const MAYBECODE_DARK_THEME: TuiTheme = {\n ...DEFAULT_DARK_THEME,\n name: \"maybecode-dark\",\n accent: { foreground: \"#7dd3fc\", bold: true },\n muted: { foreground: \"#94a3b8\" },\n dim: { foreground: \"#64748b\" },\n success: { foreground: \"#86efac\" },\n warning: { foreground: \"#fde047\" },\n error: { foreground: \"#fb7185\" },\n border: { foreground: \"#475569\" },\n borderAccent: { foreground: \"#38bdf8\" },\n selected: { foreground: \"#f8fafc\", background: \"#1e3a5f\", bold: true },\n userMessage: { foreground: \"#f8fafc\", bold: true },\n assistantLabel: { foreground: \"#7dd3fc\", bold: true },\n thinking: { foreground: \"#94a3b8\", italic: true },\n toolTitle: { foreground: \"#93c5fd\", bold: true },\n toolOutput: { foreground: \"#e2e8f0\" },\n toolPending: { foreground: \"#fde047\" },\n toolSuccess: { foreground: \"#86efac\" },\n toolError: { foreground: \"#fb7185\" },\n diffAdded: { foreground: \"#86efac\" },\n diffRemoved: { foreground: \"#fda4af\" },\n diffContext: { foreground: \"#94a3b8\" },\n markdown: {\n heading: { foreground: \"#7dd3fc\", bold: true },\n link: { foreground: \"#93c5fd\", underline: true },\n linkUrl: { foreground: \"#64748b\" },\n code: { foreground: \"#fde68a\" },\n codeBlock: { foreground: \"#e2e8f0\" },\n codeBlockBorder: { foreground: \"#475569\" },\n quote: { foreground: \"#cbd5e1\", italic: true },\n quoteBorder: { foreground: \"#38bdf8\" },\n horizontalRule: { foreground: \"#475569\" },\n listBullet: { foreground: \"#38bdf8\" },\n },\n};\n", "import type { MaybeCodeSlashCommandSuggestion } from \"../slash-commands.js\";\n\nexport interface MaybeCodeUiAction {\n readonly id: string;\n readonly command: `/${string}`;\n readonly description: string;\n readonly run: () => string;\n}\n\nexport type MaybeCodeUiCommandResult =\n | { readonly matched: false }\n | { readonly matched: true; readonly status: string };\n\n/** Instance-scoped display actions; these never enter the agent controller. */\nexport class MaybeCodeUiActionRegistry {\n private readonly actions = new Map<string, MaybeCodeUiAction>();\n private readonly commands = new Map<string, MaybeCodeUiAction>();\n\n register(action: MaybeCodeUiAction): this {\n if (action.id.trim() === \"\") throw new Error(\"UI action id cannot be empty\");\n if (!/^\\/[\\w-]+$/u.test(action.command)) {\n throw new Error(`Invalid UI action command: ${action.command}`);\n }\n if (this.actions.has(action.id)) throw new Error(`Duplicate UI action: ${action.id}`);\n if (this.commands.has(action.command)) {\n throw new Error(`Duplicate UI command: ${action.command}`);\n }\n this.actions.set(action.id, action);\n this.commands.set(action.command, action);\n return this;\n }\n\n listCommands(): readonly {\n readonly command: string;\n readonly description: string;\n }[] {\n return [...this.actions.values()].map((action) => ({\n command: action.command,\n description: action.description,\n }));\n }\n\n execute(id: string): string | undefined {\n return this.actions.get(id)?.run();\n }\n\n executeCommand(input: string): MaybeCodeUiCommandResult {\n const [command = \"\", ...arguments_] = input.trim().split(/\\s+/u);\n const action = this.commands.get(command.toLowerCase());\n if (action === undefined) return { matched: false };\n return arguments_.length === 0\n ? { matched: true, status: action.run() }\n : { matched: true, status: `Usage: ${action.command}` };\n }\n\n suggestions(input: string): readonly MaybeCodeSlashCommandSuggestion[] {\n if (!input.startsWith(\"/\") || /\\s/u.test(input)) return [];\n const prefix = input.toLowerCase();\n return [...this.actions.values()]\n .filter((action) => action.command.startsWith(prefix))\n .map((action) => ({\n value: action.command,\n label: action.command,\n description: action.description,\n }));\n }\n}\n", "import type { KeyStroke, Keymap } from \"@sortedyuan/keybindings\";\nimport type { ApprovalDecision, ApprovalRequest } from \"@sortedyuan/permissions\";\nimport {\n Column,\n Dialog,\n Editor,\n EditorHistory,\n FocusManager,\n Panel,\n ScrollView,\n SelectList,\n Text,\n sanitizeTerminalText,\n styleText,\n type Component,\n type InteractiveComponent,\n type RenderResult,\n type RenderSize,\n type TuiTheme,\n type TerminalImages,\n type PointerEvent,\n type Clipboard,\n type EditorOptions,\n SessionForkPicker,\n WorkspaceDiffViewer,\n workspaceGitLabel,\n type SessionForkSelection,\n} from \"@sortedyuan/tui\";\nimport type { UiForkPoint, UiWorkspaceDiff, UiWorkspaceGit } from \"@sortedyuan/ui-client\";\nimport {\n TranscriptStore,\n TranscriptView,\n} from \"@sortedyuan/tui/transcript\";\nimport type { ToolRendererRegistry } from \"@sortedyuan/tui/tool-renderers\";\nimport type { MaybeCodeSlashCommandSuggestion } from \"../slash-commands.js\";\nimport type { SessionSummary } from \"@sortedyuan/session/catalog\";\nimport type {\n MaybeCodeModelProfile,\n MaybeCodeReasoningEffortState,\n} from \"../controller.js\";\nimport { createMaybeCodeKeymap, MAYBECODE_EDITOR_KEYBINDINGS, type MaybeCodeKeymapOptions } from \"../keymap.js\";\nimport { MAYBECODE_DARK_THEME } from \"./theme.js\";\nimport { MaybeCodeUiActionRegistry } from \"./actions.js\";\n\nexport interface MaybeCodePrototypeViewOptions {\n readonly isRunning?: () => boolean;\n readonly permissionMode?: () => import(\"../policy.js\").MaybeCodePermissionMode;\n readonly clipboard?: Clipboard;\n readonly keymap?: MaybeCodeKeymapOptions;\n readonly images?: TerminalImages;\n readonly store: TranscriptStore;\n readonly workspace: string;\n readonly model?: string;\n readonly theme?: TuiTheme;\n readonly toolRenderers?: ToolRendererRegistry;\n readonly uiActions?: MaybeCodeUiActionRegistry;\n readonly inputHistory?: EditorHistory;\n readonly recordInput?: (value: string) => boolean;\n readonly suggestions?: (\n input: string,\n ) => Promise<readonly MaybeCodeSlashCommandSuggestion[]>;\n readonly onSubmit: (\n value: string,\n accepted?: () => void,\n ) => void | Promise<void>;\n readonly onCancel?: () => void;\n readonly onInvalidate?: () => void;\n}\n\nexport type SessionDialogAction =\n | { readonly type: \"resume\"; readonly sessionId: string }\n | { readonly type: \"rename\"; readonly sessionId: string; readonly title: string }\n | { readonly type: \"delete\"; readonly sessionId: string };\n\nexport type ModelDialogAction =\n | { readonly type: \"switch\"; readonly profile: string }\n | { readonly type: \"set-default\"; readonly profile: string };\n\n/** Retained MaybeCode view shared by the experimental terminal frontend. */\nexport class MaybeCodePrototypeView implements InteractiveComponent {\n private readonly focus = new FocusManager();\n private readonly keymap: Keymap;\n private readonly theme: TuiTheme;\n private readonly transcriptView: TranscriptView;\n private readonly transcript: ScrollView;\n private readonly uiActions: MaybeCodeUiActionRegistry;\n private readonly inputHistory: EditorHistory;\n private readonly editor: Editor;\n private readonly suggestionList: SelectList<MaybeCodeSlashCommandSuggestion>;\n private suggestions: readonly MaybeCodeSlashCommandSuggestion[] = [];\n private suggestionsVisible = false;\n private suggestionVersion = 0;\n private submissionTail: Promise<void> | undefined;\n private submissionEpoch = 0;\n private status = \"Ready\";\n private statusBeforeShortcut: string | undefined;\n private model: string;\n private workspace: string;\n private gitLabel = \"\";\n private readonly unsubscribe: () => void;\n private readonly approvalQueue: PendingApproval[] = [];\n private dialog: Dialog | undefined;\n private lastDialog: Dialog | undefined;\n private disposed = false;\n private pendingClipboard: Promise<void> = Promise.resolve();\n private readonly layout = new Column([]);\n private editorSize: RenderSize = { width: 1, height: 1 };\n private readonly editorRegion: Component = {\n render: size => {\n this.editorSize = size;\n return new Panel(this.editor, {\n borderStyle: this.focus.focusedId === \"editor\" ? this.theme.borderAccent : this.theme.border,\n }).render(size);\n },\n handlePointer: event => {\n if (event.type === \"down\") {\n if (event.button !== 0) return false;\n if (event.x < 1 || event.x >= this.editorSize.width - 1 || event.y < 1 || event.y >= this.editorSize.height - 1) return false;\n this.resetInputContext();\n this.focus.focus(\"editor\");\n this.transcriptView.clearSelection();\n }\n return this.editor.handlePointer({ ...event, x: event.x - 1, y: event.y - 1 });\n },\n };\n private readonly transcriptRegion: Component = {\n render: size => this.transcript.render(size),\n handlePointer: event => {\n if (event.type === \"down\") {\n if (event.button !== 0) return false;\n this.resetInputContext();\n this.editor.clearSelection();\n }\n return this.transcript.handlePointer(event);\n },\n };\n private dialogKind: \"approval\" | \"session\" | \"model\" | \"effort\" | \"mcp\" | \"fork\" | \"changes\" | undefined;\n private resolveVersionDialog: ((selection?: SessionForkSelection) => void) | undefined;\n private readonly mcpQuestions: Array<{ prompt: string; finish(value?: string): void }> = [];\n private resolveSessionDialog: ((action: SessionDialogAction | undefined) => void) | undefined;\n private resolveModelDialog: ((action: ModelDialogAction | undefined) => void) | undefined;\n private resolveEffortDialog: ((effort: string | undefined) => void) | undefined;\n private readonly baseView: InteractiveComponent = {\n render: (size) => this.renderBase(size),\n handleKey: (stroke) => this.handleBaseKey(stroke),\n handlePointer: event => this.layout.handlePointer(event),\n };\n\n constructor(private readonly options: MaybeCodePrototypeViewOptions) {\n this.keymap = createMaybeCodeKeymap(options.keymap);\n this.theme = options.theme ?? MAYBECODE_DARK_THEME;\n this.model = options.model ?? \"model: unknown\";\n this.workspace = options.workspace;\n this.transcriptView = new TranscriptView(options.store, {\n ...(options.images ? { images: options.images } : {}),\n theme: this.theme,\n assistantLabel: \"MaybeCode\",\n selectedToolDetailsHint: \"Enter details\",\n toolDetailsHint: `${this.shortcutHint(\"app.tools.toggle\")} all`,\n ...(options.toolRenderers === undefined ? {} : { toolRenderers: options.toolRenderers }),\n });\n this.transcript = new ScrollView(this.transcriptView, {\n followEnd: true,\n onInvalidate: () => options.onInvalidate?.(),\n });\n this.inputHistory = options.inputHistory ?? new EditorHistory();\n this.uiActions = options.uiActions ?? new MaybeCodeUiActionRegistry()\n .register({\n id: \"tools.toggle\",\n command: \"/details\",\n description: \"Toggle all tool execution details\",\n run: () => {\n this.preserveSelectedToolPosition();\n const visible = this.transcriptView.toggleToolDetails();\n return `Tool details ${visible ? \"shown\" : \"hidden\"}`;\n },\n })\n .register({\n id: \"thinking.toggle\",\n command: \"/thinking\",\n description: \"Toggle reasoning block visibility\",\n run: () => {\n this.preserveSelectedToolPosition();\n const visible = this.transcriptView.toggleReasoning();\n return `Thinking ${visible ? \"shown\" : \"hidden\"}`;\n },\n });\n this.editor = new Editor({\n ...this.editorOptions(),\n history: this.inputHistory,\n placeholder: \"Ask MaybeCode\u2026\",\n promptStyle: this.theme.accent,\n placeholderStyle: this.theme.dim,\n onSubmit: (value) => this.submit(value),\n onChange: (value) => this.refreshSuggestions(value),\n });\n this.suggestionList = new SelectList<MaybeCodeSlashCommandSuggestion>([], {\n selectedStyle: this.theme.selected,\n descriptionStyle: this.theme.muted,\n markerStyle: this.theme.accent,\n emptyLabel: \"No matching commands\",\n });\n this.suggestionList.setFocused(true);\n this.focus.register(\"transcript\", this.transcript);\n this.focus.register(\"editor\", this.editor);\n this.focus.focus(\"editor\");\n this.unsubscribe = options.store.subscribe(() => options.onInvalidate?.());\n }\n\n render(size: RenderSize): RenderResult {\n this.synchronizeDialog();\n return this.dialog?.render(size) ?? this.renderBase(size);\n }\n\n handleKey(stroke: KeyStroke): boolean {\n this.synchronizeDialog();\n if (this.dialog !== undefined) {\n const handled = this.dialog.handleKey(stroke);\n if (handled) return true;\n const shortcut = this.keymap.resolve(stroke, [\"dialog\"]);\n if (shortcut.type === \"action\" && shortcut.action === \"app.interrupt\") {\n this.submissionEpoch++;\n this.options.onCancel?.();\n return true;\n }\n return false;\n }\n return this.handleBaseKey(stroke);\n }\n\n handlePointer(event: PointerEvent): boolean {\n this.synchronizeDialog();\n return this.dialog?.handlePointer(event) ?? this.layout.handlePointer(event);\n }\n\n async waitForPendingClipboard(): Promise<void> {\n await this.pendingClipboard;\n await this.editor.waitForPendingClipboard();\n }\n\n private editorOptions(): Pick<EditorOptions, \"clipboard\" | \"onInvalidate\" | \"onError\" | \"keybindings\"> {\n return {\n keybindings: MAYBECODE_EDITOR_KEYBINDINGS,\n ...(this.options.clipboard === undefined ? {} : { clipboard: this.options.clipboard }),\n onInvalidate: () => this.options.onInvalidate?.(),\n onError: error => this.setStatus(`Error: ${error instanceof Error ? error.message : String(error)}`),\n };\n }\n\n private shortcutHint(action: string): string {\n return this.keymap.keysForAction(action)[0]?.split(\" \").map(key =>\n key.split(\"+\").map(part => part.length === 1 ? part.toUpperCase() : part[0]!.toUpperCase() + part.slice(1)).join(\"+\")\n ).join(\" \") ?? \"\";\n }\n\n private resetInputContext(): void {\n this.keymap.reset();\n this.editor.resetKeybindings();\n this.clearShortcutHint();\n }\n\n private clearShortcutHint(): void {\n if (this.statusBeforeShortcut !== undefined && this.status.startsWith(\"Shortcut: \")) {\n this.status = this.statusBeforeShortcut;\n this.options.onInvalidate?.();\n }\n this.statusBeforeShortcut = undefined;\n }\n\n private synchronizeDialog(): void {\n if (this.lastDialog === this.dialog) return;\n this.lastDialog?.dispose();\n this.lastDialog = this.dialog;\n this.resetInputContext();\n this.transcript.clearPointerSelection();\n this.editor.setFocused(this.dialog === undefined && this.focus.focusedId === \"editor\");\n }\n\n requestApproval(request: ApprovalRequest): Promise<ApprovalDecision | undefined> {\n return new Promise((resolve) => {\n this.approvalQueue.push({ request, resolve });\n if (this.approvalQueue.length === 1) this.openCurrentApproval();\n });\n }\n\n requestMcpInput(prompt: string, signal: AbortSignal): Promise<string | undefined> {\n if (signal.aborted) return Promise.resolve(undefined);\n return new Promise((resolve) => {\n let settled = false;\n const abort = () => pending.finish();\n const pending = { prompt, finish: (value?: string) => {\n if (settled) return;\n settled = true;\n signal.removeEventListener(\"abort\", abort);\n const index = this.mcpQuestions.indexOf(pending);\n if (index >= 0) this.mcpQuestions.splice(index, 1);\n if (index === 0 && this.dialogKind === \"mcp\") {\n this.dialog = undefined; this.dialogKind = undefined; this.openCurrentApproval();\n }\n resolve(value); this.options.onInvalidate?.();\n } };\n this.mcpQuestions.push(pending);\n signal.addEventListener(\"abort\", abort, { once: true });\n this.openCurrentApproval();\n });\n }\n\n dismissApproval(requestId: string): boolean {\n const index = this.approvalQueue.findIndex((item) =>\n item.request.id === requestId\n );\n if (index < 0) return false;\n const [approval] = this.approvalQueue.splice(index, 1);\n approval?.resolve(undefined);\n if (index === 0 && this.dialogKind === \"approval\") {\n this.dialog = undefined;\n this.dialogKind = undefined;\n this.openCurrentApproval();\n }\n this.options.onInvalidate?.();\n return true;\n }\n\n requestSessionAction(\n sessions: readonly SessionSummary[],\n currentSessionId: string,\n ): Promise<SessionDialogAction | undefined> {\n if (this.dialog !== undefined || this.resolveSessionDialog !== undefined) {\n return Promise.reject(new Error(\"Another dialog is already open\"));\n }\n return new Promise((resolve) => {\n this.resolveSessionDialog = resolve;\n const prompt = new SessionPrompt(sessions, currentSessionId, this.theme, (action) => {\n this.dialog = undefined;\n this.dialogKind = undefined;\n const complete = this.resolveSessionDialog;\n this.resolveSessionDialog = undefined;\n complete?.(action);\n this.openCurrentApproval();\n this.options.onInvalidate?.();\n }, this.editorOptions(), this.options.keymap);\n this.dialog = new Dialog(this.baseView, prompt, {\n open: true,\n title: \"Sessions\",\n width: 92,\n height: 18,\n dismissOnEscape: false,\n borderStyle: this.theme.borderAccent,\n titleStyle: this.theme.accent,\n });\n this.dialogKind = \"session\";\n this.synchronizeDialog();\n this.options.onInvalidate?.();\n });\n }\n\n requestModelAction(\n models: readonly MaybeCodeModelProfile[],\n currentProfile: string | undefined,\n ): Promise<ModelDialogAction | undefined> {\n if (this.dialog !== undefined || this.resolveModelDialog !== undefined) {\n return Promise.reject(new Error(\"Another dialog is already open\"));\n }\n return new Promise((resolve) => {\n this.resolveModelDialog = resolve;\n const prompt = new ModelPrompt(\n models,\n currentProfile,\n this.theme,\n (action) => {\n this.dialog = undefined;\n this.dialogKind = undefined;\n const complete = this.resolveModelDialog;\n this.resolveModelDialog = undefined;\n complete?.(action);\n this.openCurrentApproval();\n this.options.onInvalidate?.();\n },\n this.options.keymap,\n );\n this.dialog = new Dialog(this.baseView, prompt, {\n open: true,\n title: \"Models\",\n width: 82,\n height: 16,\n dismissOnEscape: false,\n borderStyle: this.theme.borderAccent,\n titleStyle: this.theme.accent,\n });\n this.dialogKind = \"model\";\n this.synchronizeDialog();\n this.options.onInvalidate?.();\n });\n }\n\n requestReasoningEffortSelection(\n state: MaybeCodeReasoningEffortState,\n ): Promise<string | undefined> {\n if (\n state.status !== \"known\" ||\n this.dialog !== undefined ||\n this.resolveEffortDialog !== undefined\n ) {\n return state.status === \"known\"\n ? Promise.reject(new Error(\"Another dialog is already open\"))\n : Promise.resolve(undefined);\n }\n return new Promise((resolve) => {\n this.resolveEffortDialog = resolve;\n const prompt = new EffortPrompt(state, this.theme, (effort) => {\n this.dialog = undefined;\n this.dialogKind = undefined;\n const complete = this.resolveEffortDialog;\n this.resolveEffortDialog = undefined;\n complete?.(effort);\n this.openCurrentApproval();\n this.options.onInvalidate?.();\n }, this.options.keymap);\n this.dialog = new Dialog(this.baseView, prompt, {\n open: true,\n title: \"Reasoning effort\",\n width: 62,\n height: Math.min(16, state.efforts.length + 7),\n dismissOnEscape: false,\n borderStyle: this.theme.borderAccent,\n titleStyle: this.theme.accent,\n });\n this.dialogKind = \"effort\";\n this.synchronizeDialog();\n this.options.onInvalidate?.();\n });\n }\n\n setStatus(status: string): void {\n if (this.disposed) return;\n this.status = sanitizeTerminalText(status);\n this.options.onInvalidate?.();\n }\n\n setWorkspaceGit(workspace: UiWorkspaceGit): void {\n if (this.disposed) return;\n this.workspace = sanitizeTerminalText(workspace.path);\n this.gitLabel = workspaceGitLabel(workspace);\n this.options.onInvalidate?.();\n }\n\n requestForkSelection(points: readonly UiForkPoint[], currentSessionId: string): Promise<SessionForkSelection | undefined> {\n if (this.dialog) return Promise.reject(new Error(\"Another dialog is already open\"));\n return new Promise(resolve => {\n this.resolveVersionDialog = resolve;\n const picker = new SessionForkPicker(points, { currentSessionId, theme: this.theme, onComplete: selection => this.completeVersionDialog(selection) });\n this.dialog = new Dialog(this.baseView, picker, { open: true, title: \"Session \u5206\u652F\", width: 100, height: 25, dismissOnEscape: false, borderStyle: this.theme.borderAccent, titleStyle: this.theme.accent });\n this.dialogKind = \"fork\"; this.synchronizeDialog(); this.options.onInvalidate?.();\n });\n }\n\n requestChanges(diff: UiWorkspaceDiff, operations: { readonly onRestore?: (path: string) => Promise<UiWorkspaceDiff>; readonly onApply?: (previewId: string) => Promise<void> } = {}): Promise<void> {\n if (this.dialog) return Promise.reject(new Error(\"Another dialog is already open\"));\n return new Promise(resolve => {\n this.resolveVersionDialog = () => resolve();\n const viewer = new WorkspaceDiffViewer(diff, { theme: this.theme, onClose: () => this.completeVersionDialog(), ...operations, onInvalidate: () => this.options.onInvalidate?.() });\n this.dialog = new Dialog(this.baseView, viewer, { open: true, title: \"\u6587\u4EF6\u53D8\u5316\", width: 110, height: 30, dismissOnEscape: false, borderStyle: this.theme.borderAccent, titleStyle: this.theme.accent });\n this.dialogKind = \"changes\"; this.synchronizeDialog(); this.options.onInvalidate?.();\n });\n }\n\n private completeVersionDialog(selection?: SessionForkSelection): void {\n this.dialog = undefined; this.dialogKind = undefined;\n const resolve = this.resolveVersionDialog; this.resolveVersionDialog = undefined;\n resolve?.(selection); this.openCurrentApproval(); this.options.onInvalidate?.();\n }\n\n setModel(model: string): void {\n this.model = sanitizeTerminalText(model);\n this.options.onInvalidate?.();\n }\n\n get displayCommands(): readonly {\n readonly command: string;\n readonly description: string;\n }[] {\n return this.uiActions.listCommands();\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.unsubscribe();\n this.transcript.dispose();\n this.editor.dispose?.();\n this.dialog?.dispose();\n if (this.lastDialog !== this.dialog) this.lastDialog?.dispose();\n this.focus.clear();\n this.dialog = undefined;\n this.dialogKind = undefined;\n for (const question of this.mcpQuestions.splice(0)) question.finish();\n this.resolveSessionDialog?.(undefined);\n this.resolveSessionDialog = undefined;\n this.resolveModelDialog?.(undefined);\n this.resolveModelDialog = undefined;\n this.resolveEffortDialog?.(undefined);\n this.resolveEffortDialog = undefined;\n this.resolveVersionDialog?.();\n this.resolveVersionDialog = undefined;\n this.suggestionVersion += 1;\n for (const approval of this.approvalQueue.splice(0)) {\n approval.resolve(undefined);\n }\n }\n\n private renderBase(size: RenderSize): RenderResult {\n const suggestionHeight = this.suggestionsVisible\n ? Math.min(7, this.suggestions.length + 2)\n : 0;\n this.layout.setItems([\n {\n height: 3,\n component: new HeaderView(\n this.workspace,\n this.model,\n this.theme,\n ),\n },\n { flex: 1, minHeight: 1, component: this.transcriptRegion },\n ...(suggestionHeight === 0\n ? []\n : [{\n height: suggestionHeight,\n component: new Panel(this.suggestionList, {\n title: \" Commands \",\n borderStyle: this.theme.border,\n titleStyle: this.theme.accent,\n }),\n }]),\n {\n height: 4,\n component: this.editorRegion,\n },\n {\n height: 1,\n component: new FooterView(\n this.options.permissionMode?.() === \"yolo\",\n this.status,\n this.focus.focusedId,\n this.transcriptView.toolDetailsMode,\n this.transcriptView.showReasoning,\n this.theme,\n this.shortcutHint(\"app.reply.start\"),\n this.shortcutHint(\"app.tools.toggle\"),\n this.shortcutHint(\"app.thinking.toggle\"),\n this.gitLabel,\n ),\n },\n ]);\n return this.layout.render(size);\n }\n\n private handleBaseKey(stroke: KeyStroke): boolean {\n if (stroke.key === \"wheelup\" || stroke.key === \"wheeldown\") {\n this.resetInputContext();\n this.transcript.scrollBy(stroke.key === \"wheelup\" ? -3 : 3);\n return true;\n }\n if (this.focus.focusedId === \"editor\" && this.editor.hasSelection &&\n stroke.ctrl && stroke.key === \"c\" && this.editor.handleKey(stroke)) {\n this.keymap.reset();\n this.clearShortcutHint();\n return true;\n }\n const shortcut = this.keymap.resolve(stroke, this.transcriptView.hasSelection\n ? [\"global\", \"transcript.selection\"] : [\"global\"]);\n if (shortcut.type === \"pending\") {\n this.statusBeforeShortcut ??= this.status;\n this.status = `Shortcut: ${shortcut.completions.join(\" / \")}`;\n this.options.onInvalidate?.();\n return true;\n }\n this.clearShortcutHint();\n if (shortcut.type === \"action\") {\n if (shortcut.action === \"app.selection.copy\") {\n const text = this.transcriptView.selectedText;\n if (this.options.clipboard === undefined) {\n this.setStatus(\"Error: Clipboard is unavailable\");\n } else {\n this.pendingClipboard = this.options.clipboard.writeText(text).then(\n () => this.setStatus(\"Copied\"),\n error => this.setStatus(`Error: ${error instanceof Error ? error.message : String(error)}`),\n );\n }\n return true;\n }\n if (shortcut.action === \"app.interrupt\") {\n this.submissionEpoch++;\n this.options.onCancel?.();\n return true;\n }\n if (shortcut.action === \"app.focus.next\" || shortcut.action === \"app.focus.previous\") {\n if (!(stroke.key === \"tab\" && this.suggestionsVisible && !stroke.shift)) {\n this.resetInputContext();\n this.transcript.clearPointerSelection();\n this.editor.clearSelection();\n const changed = shortcut.action === \"app.focus.previous\" ? this.focus.focusPrevious() : this.focus.focusNext();\n if (this.focus.focusedId === \"transcript\") this.ensureSelectedToolVisible();\n return changed;\n }\n }\n if (shortcut.action === \"app.reply.start\") {\n if (this.transcriptView.revealLatestReply()) {\n this.transcript.scrollToAnchor(() => this.transcriptView.latestReplyAnchor);\n this.setStatus(\"Reply start\");\n } else {\n this.setStatus(\"No final reply yet\");\n }\n return true;\n }\n if (shortcut.action === \"app.tools.toggle\") {\n this.executeUiAction(\"tools.toggle\");\n return true;\n }\n if (shortcut.action === \"app.thinking.toggle\") {\n this.executeUiAction(\"thinking.toggle\");\n return true;\n }\n }\n if (this.focus.focusedId === \"editor\" && this.editor.value.startsWith(\"/\")) {\n if (stroke.key === \"escape\" && this.suggestionsVisible) {\n this.hideSuggestions();\n return true;\n }\n if (this.suggestionsVisible && isSuggestionNavigation(stroke.key) &&\n stroke.key !== \"home\" && stroke.key !== \"end\" && !stroke.shift && !stroke.ctrl && !stroke.alt) {\n return this.suggestionList.handleKey(stroke);\n }\n if (stroke.key === \"tab\" && !stroke.shift) {\n this.completeSuggestion(false);\n return true;\n }\n if (stroke.key === \"enter\" && this.suggestionsVisible && !stroke.shift && !stroke.ctrl && !stroke.alt && !stroke.meta) {\n this.completeSuggestion(true);\n return true;\n }\n }\n const transcriptInteraction = stroke.key === \"j\" || stroke.key === \"k\" ||\n stroke.key === \"enter\" || stroke.key === \"space\" || stroke.text === \" \";\n const togglesSelectedTool = this.focus.focusedId === \"transcript\" &&\n (stroke.key === \"enter\" || stroke.key === \"space\" || stroke.text === \" \");\n if (togglesSelectedTool) this.preserveSelectedToolPosition();\n const handled = this.focus.dispatch(stroke);\n if (handled && this.focus.focusedId === \"editor\") this.transcript.clearPointerSelection();\n if (handled && this.focus.focusedId === \"transcript\" && transcriptInteraction) {\n this.ensureSelectedToolVisible();\n if (stroke.key === \"enter\" || stroke.key === \"space\" || stroke.text === \" \") {\n this.status = \"Selected tool details toggled\";\n }\n }\n return handled;\n }\n\n private submit(value: string, completeCommand = true): void {\n if (this.disposed || value.trim() === \"\") return;\n this.inputHistory.record(value);\n this.editor.setValue(\"\");\n this.hideSuggestions();\n this.setStatus(\"Running\");\n const epoch = this.submissionEpoch;\n const submit = () => this.disposed || epoch !== this.submissionEpoch ? undefined : this.resolveSubmission(value, completeCommand, epoch);\n const previous = this.submissionTail;\n const pending = (previous ? previous.then(submit) : Promise.resolve(submit()))\n .then(\n (status) => {\n if (epoch === this.submissionEpoch) this.setStatus(status ?? (this.options.isRunning?.() ? \"Running\" : \"Ready\"));\n },\n (error: unknown) => {\n if (this.disposed || epoch !== this.submissionEpoch) return;\n if (this.editor.value === \"\") this.editor.setValue(value);\n this.setStatus(`Error: ${error instanceof Error ? error.message : String(error)}`);\n },\n ).finally(() => {\n if (this.submissionTail === pending) this.submissionTail = undefined;\n });\n this.submissionTail = pending;\n }\n\n private async resolveSubmission(\n value: string,\n completeCommand: boolean,\n epoch: number,\n ): Promise<string | undefined> {\n let submission = value;\n if (completeCommand && value.startsWith(\"/\")) {\n const suggestions = await this.suggestionsFor(value);\n submission = suggestions.length === 1 ? suggestions[0]!.value : value;\n }\n if (this.disposed || epoch !== this.submissionEpoch) return undefined;\n const uiResult = this.uiActions.executeCommand(submission);\n if (uiResult.matched) return uiResult.status;\n this.transcript.scrollToEnd();\n let recorded = false;\n const recordAcceptedInput = (): void => {\n if (recorded) return;\n recorded = true;\n if (this.options.recordInput?.(submission) ?? true) {\n this.options.store.appendUser(submission);\n }\n };\n await this.options.onSubmit(submission, recordAcceptedInput);\n recordAcceptedInput();\n return undefined;\n }\n\n private refreshSuggestions(value: string): void {\n const version = ++this.suggestionVersion;\n if (!value.startsWith(\"/\")) {\n this.hideSuggestions();\n return;\n }\n void this.suggestionsFor(value).then(\n (suggestions) => {\n if (version !== this.suggestionVersion || value !== this.editor.value) return;\n this.suggestions = suggestions;\n this.suggestionList.setItems(suggestions.map((suggestion) => ({\n value: suggestion,\n label: suggestion.label,\n ...(suggestion.description === undefined\n ? {}\n : { description: suggestion.description }),\n })));\n this.suggestionsVisible = suggestions.length > 0;\n this.options.onInvalidate?.();\n },\n () => {\n if (version === this.suggestionVersion) this.hideSuggestions();\n },\n );\n }\n\n private completeSuggestion(execute: boolean): void {\n const selected = this.suggestionList.selectedItem?.value ?? this.suggestions[0];\n if (selected === undefined) return;\n if (execute) {\n this.hideSuggestions();\n this.editor.setValue(\"\");\n this.submit(selected.value, false);\n return;\n }\n const completion = commonPrefix(\n this.editor.value,\n this.suggestions.map((suggestion) => suggestion.value),\n );\n if (completion !== undefined) this.editor.setValue(completion);\n }\n\n private hideSuggestions(): void {\n this.suggestions = [];\n this.suggestionsVisible = false;\n this.suggestionList.setItems([]);\n this.options.onInvalidate?.();\n }\n\n private openCurrentApproval(): void {\n if (this.disposed) return;\n if (this.dialog !== undefined) return;\n const pending = this.approvalQueue[0];\n if (pending === undefined) {\n this.dialog = undefined;\n const question = this.mcpQuestions[0];\n if (question !== undefined) {\n this.dialog = new Dialog(this.baseView, new McpInputPrompt(question.prompt, question.finish, this.editorOptions(), this.options.keymap), {\n open: true, title: \"MCP user interaction \u2014 untrusted server\", width: 92, height: 24,\n dismissOnEscape: false, borderStyle: this.theme.warning, titleStyle: this.theme.warning,\n });\n this.dialogKind = \"mcp\";\n this.synchronizeDialog();\n this.options.onInvalidate?.();\n }\n return;\n }\n const prompt = new ApprovalPrompt(pending.request, this.theme, (decision) => {\n const current = this.approvalQueue.shift();\n this.dialog = undefined;\n this.dialogKind = undefined;\n current?.resolve(decision);\n this.openCurrentApproval();\n this.options.onInvalidate?.();\n }, this.options.keymap);\n this.dialog = new Dialog(this.baseView, prompt, {\n open: true,\n title: `Approval: ${sanitizeTerminalText(pending.request.tool.name)}`,\n width: 72,\n height: pending.request.grantKey === undefined ? 10 : 11,\n dismissOnEscape: false,\n borderStyle: this.theme.warning,\n titleStyle: this.theme.warning,\n });\n this.dialogKind = \"approval\";\n this.synchronizeDialog();\n this.options.onInvalidate?.();\n }\n\n private ensureSelectedToolVisible(): void {\n const anchor = this.transcriptView.selectedToolAnchor;\n if (anchor !== undefined) this.transcript.ensureVisible(anchor, 2);\n }\n\n private preserveSelectedToolPosition(): void {\n const anchor = this.transcriptView.selectedToolAnchor;\n if (anchor === undefined) {\n this.transcript.detachFromEnd();\n return;\n }\n this.transcript.preserveAnchor(\n anchor,\n () => this.transcriptView.selectedToolAnchor,\n );\n }\n\n private executeUiAction(id: string): void {\n const status = this.uiActions.execute(id);\n if (status !== undefined) this.setStatus(status);\n }\n\n private async suggestionsFor(\n value: string,\n ): Promise<readonly MaybeCodeSlashCommandSuggestion[]> {\n const local = this.uiActions.suggestions(value);\n const controller = await (this.options.suggestions?.(value) ?? Promise.resolve([]));\n const seen = new Set<string>();\n return [...local, ...controller].filter((suggestion) => {\n if (seen.has(suggestion.value)) return false;\n seen.add(suggestion.value);\n return true;\n });\n }\n}\n\ninterface PendingApproval {\n readonly request: ApprovalRequest;\n readonly resolve: (decision: ApprovalDecision | undefined) => void;\n}\n\nclass ModelPrompt implements InteractiveComponent {\n private readonly list: SelectList<MaybeCodeModelProfile>;\n private readonly keymap: Keymap;\n private readonly layout = new Column([], { gap: 1 });\n\n constructor(\n models: readonly MaybeCodeModelProfile[],\n currentProfile: string | undefined,\n theme: TuiTheme,\n private readonly complete: (action: ModelDialogAction | undefined) => void,\n keymapOptions: MaybeCodeKeymapOptions = {},\n ) {\n this.keymap = createMaybeCodeKeymap(keymapOptions);\n const currentIndex = models.findIndex((model) =>\n model.name === currentProfile\n );\n this.list = new SelectList(models.map((model) => ({\n value: model,\n label: `${model.name === currentProfile ? \"* \" : \"\"}${model.name}` +\n `${model.isDefault ? \" [default]\" : \"\"}`,\n description: `${model.provider}/${model.model} \u00B7 ${model.adapter}`,\n })), {\n onSelect: item => this.complete({ type: \"switch\", profile: item.value.name }),\n onCancel: () => this.complete(undefined),\n selectedIndex: Math.max(0, currentIndex),\n selectedStyle: theme.selected,\n descriptionStyle: theme.muted,\n markerStyle: theme.accent,\n emptyLabel: \"No model profiles configured\",\n });\n this.list.setFocused(true);\n }\n\n render(size: RenderSize): RenderResult {\n this.layout.setItems([\n { flex: 1, minHeight: 1, component: this.list },\n {\n height: 1,\n component: new Text(`${promptShortcut(this.keymap, \"list.accept\", \"select\")} select \u00B7 ${promptShortcut(this.keymap, \"model.default.set\", \"modelPicker\")} set default \u00B7 ${promptShortcut(this.keymap, \"list.cancel\", \"select\")} close`),\n },\n ]);\n return this.layout.render(size);\n }\n\n handlePointer(event: PointerEvent): boolean { return this.layout.handlePointer(event); }\n\n handleKey(stroke: KeyStroke): boolean {\n const result = this.keymap.resolve(stroke, [\"select\", \"modelPicker\"]);\n if (result.type === \"pending\") return true;\n if (result.type === \"action\" && result.action === \"model.default.set\") {\n const selected = this.list.selectedItem?.value;\n if (selected === undefined) return false;\n this.complete({ type: \"set-default\", profile: selected.name });\n return true;\n }\n return result.type === \"action\" && result.action.startsWith(\"list.\")\n ? this.list.performAction(result.action)\n : false;\n }\n}\n\nclass EffortPrompt implements InteractiveComponent {\n private readonly list: SelectList<string>;\n private readonly keymap: Keymap;\n private readonly layout = new Column([], { gap: 1 });\n\n constructor(\n state: MaybeCodeReasoningEffortState,\n theme: TuiTheme,\n private readonly complete: (effort: string | undefined) => void,\n keymapOptions: MaybeCodeKeymapOptions = {},\n ) {\n this.keymap = createMaybeCodeKeymap(keymapOptions);\n const efforts = [\"default\", ...state.efforts];\n const currentIndex = state.overridden\n ? efforts.indexOf(state.effectiveEffort ?? \"\")\n : 0;\n this.list = new SelectList(efforts.map((effort) => ({\n value: effort,\n label: `${effort === efforts[currentIndex] ? \"* \" : \"\"}${effort}`,\n description: effort === \"default\"\n ? `Clear override \u00B7 default ${state.defaultEffort ?? \"is provider-defined\"}`\n : `Capability source: ${state.source}`,\n })), {\n onSelect: item => this.complete(item.value),\n onCancel: () => this.complete(undefined),\n selectedIndex: Math.max(0, currentIndex),\n selectedStyle: theme.selected,\n descriptionStyle: theme.muted,\n markerStyle: theme.accent,\n });\n this.list.setFocused(true);\n }\n\n render(size: RenderSize): RenderResult {\n this.layout.setItems([\n { flex: 1, minHeight: 1, component: this.list },\n { height: 1, component: new Text(`${promptShortcut(this.keymap, \"list.accept\", \"select\")} select \u00B7 ${promptShortcut(this.keymap, \"list.cancel\", \"select\")} close`) },\n ]);\n return this.layout.render(size);\n }\n\n handlePointer(event: PointerEvent): boolean { return this.layout.handlePointer(event); }\n\n handleKey(stroke: KeyStroke): boolean {\n const result = this.keymap.resolve(stroke, [\"select\"]);\n return result.type === \"action\" ? this.list.performAction(result.action) : result.type === \"pending\";\n }\n}\n\nclass ApprovalPrompt implements InteractiveComponent {\n private readonly choices: SelectList<ApprovalDecision>;\n private readonly keymap: Keymap;\n private readonly layout = new Column([], { gap: 1 });\n\n constructor(\n private readonly request: ApprovalRequest,\n private readonly theme: TuiTheme,\n private readonly decide: (decision: ApprovalDecision) => void,\n keymapOptions: MaybeCodeKeymapOptions = {},\n ) {\n this.keymap = createMaybeCodeKeymap(keymapOptions);\n this.choices = new SelectList([\n { value: \"allow\", label: \"Allow once\", description: promptShortcut(this.keymap, \"approval.allow\", \"approval\") },\n ...(request.grantKey === undefined\n ? []\n : [{\n value: \"allow-session\" as const,\n label: \"Allow matching calls for this session\",\n description: promptShortcut(this.keymap, \"approval.allowSession\", \"approval\"),\n }]),\n { value: \"deny\", label: \"Deny\", description: `${promptShortcut(this.keymap, \"approval.deny\", \"approval\")} / ${promptShortcut(this.keymap, \"list.cancel\", \"select\")}` },\n ...(request.persistent ? [{ value: \"allow-persistent\" as const, label: \"\u4FDD\u5B58\u5141\u8BB8\u89C4\u5219\", description: request.persistent.description }] : []),\n ], {\n onSelect: (item) => this.decide(item.value),\n onCancel: () => this.decide(\"deny\"),\n selectedStyle: this.theme.selected,\n descriptionStyle: this.theme.muted,\n markerStyle: this.theme.accent,\n });\n this.choices.setFocused(true);\n }\n\n render(size: RenderSize): RenderResult {\n const input = truncate(sanitizeTerminalText(stringify(this.request.input)), 1_200);\n this.layout.setItems([\n {\n height: 1,\n component: new Text(\n `Tool: ${sanitizeTerminalText(this.request.tool.name)}`,\n ),\n },\n { flex: 1, minHeight: 1, component: new Text(input) },\n {\n height: (this.request.grantKey === undefined ? 2 : 3) + (this.request.persistent ? 2 : 0),\n component: this.choices,\n },\n ]);\n return this.layout.render(size);\n }\n\n handlePointer(event: PointerEvent): boolean { return this.layout.handlePointer(event); }\n\n handleKey(stroke: KeyStroke): boolean {\n const result = this.keymap.resolve(stroke, [\"select\", \"approval\"]);\n if (result.type === \"pending\") return true;\n if (result.type === \"action\" && result.action === \"approval.allow\") {\n this.decide(\"allow\");\n return true;\n }\n if (result.type === \"action\" && result.action === \"approval.allowSession\" && this.request.grantKey !== undefined) {\n this.decide(\"allow-session\");\n return true;\n }\n if (result.type === \"action\" && result.action === \"approval.deny\") {\n this.decide(\"deny\");\n return true;\n }\n return result.type === \"action\" && result.action.startsWith(\"list.\")\n ? this.choices.performAction(result.action)\n : false;\n }\n}\n\ntype SessionMode = \"browse\" | \"search\" | \"rename\" | \"delete\";\n\nclass SessionPrompt implements InteractiveComponent {\n private mode: SessionMode = \"browse\";\n private query = \"\";\n private status = \"\";\n private readonly list: SelectList<SessionSummary>;\n private readonly input: Editor;\n private readonly keymap: Keymap;\n private readonly layout = new Column([], { gap: 1 });\n private readonly listRegion: Component = {\n render: size => this.list.render(size),\n handlePointer: event => (this.mode === \"browse\" || this.mode === \"search\") && this.list.handlePointer(event),\n };\n\n constructor(\n private readonly sessions: readonly SessionSummary[],\n private readonly currentSessionId: string,\n private readonly theme: TuiTheme,\n private readonly complete: (action: SessionDialogAction | undefined) => void,\n editorOptions: Pick<EditorOptions, \"clipboard\" | \"onInvalidate\" | \"onError\" | \"keybindings\">,\n keymapOptions: MaybeCodeKeymapOptions = {},\n ) {\n this.keymap = createMaybeCodeKeymap(keymapOptions);\n this.list = new SelectList<SessionSummary>([], {\n onSelect: () => this.resumeSelected(),\n onCancel: () => this.complete(undefined),\n selectedStyle: this.theme.selected,\n descriptionStyle: this.theme.muted,\n markerStyle: this.theme.accent,\n emptyLabel: \"No matching sessions\",\n });\n this.list.setFocused(true);\n this.input = new Editor({\n ...editorOptions,\n prompt: \"> \",\n onChange: (value) => {\n if (this.mode !== \"search\") return;\n this.query = value;\n this.refreshList();\n },\n onSubmit: (value) => {\n if (this.mode !== \"rename\") return;\n const session = this.list.selectedItem?.value;\n const title = value.replace(/\\s+/gu, \" \").trim();\n if (session === undefined || title === \"\") {\n this.status = \"Session title cannot be empty\";\n return;\n }\n this.complete({ type: \"rename\", sessionId: session.id, title });\n },\n });\n this.refreshList();\n }\n\n render(size: RenderSize): RenderResult {\n this.layout.setItems([\n { height: 1, component: new Text(this.heading()) },\n { flex: 1, minHeight: 1, component: this.listRegion },\n { height: 2, component: this.footer() },\n ]);\n return this.layout.render(size);\n }\n\n handlePointer(event: PointerEvent): boolean { return this.layout.handlePointer(event); }\n\n dispose(): void { this.input.dispose(); }\n\n handleKey(stroke: KeyStroke): boolean {\n const contexts = this.mode === \"browse\"\n ? [\"select\", \"sessionPicker\"]\n : [this.mode === \"search\" ? \"sessionSearch\" : this.mode === \"rename\" ? \"sessionRename\" : \"sessionDelete\"];\n const result = this.keymap.resolve(stroke, contexts);\n if (result.type === \"pending\") return true;\n if (result.type === \"action\") {\n switch (result.action) {\n case \"list.cancel\":\n if (this.mode !== \"browse\") return this.setMode(\"browse\");\n this.complete(undefined);\n return true;\n case \"list.up\": case \"list.down\": case \"list.pageUp\": case \"list.pageDown\":\n case \"list.home\": case \"list.end\": case \"list.accept\":\n return this.list.performAction(result.action);\n case \"search.start\":\n this.setMode(\"search\");\n this.status = \"Type to filter by id, title, or preview\";\n this.input.setValue(\"\");\n return true;\n case \"search.finish\": return this.resumeSelected();\n case \"session.rename.start\": return this.beginRename();\n case \"session.rename.accept\": this.input.performAction(\"editor.submit\"); return true;\n case \"session.delete.request\": return this.beginDelete();\n case \"session.delete.cancel\": return this.setMode(\"browse\");\n case \"session.delete.accept\": return this.deleteSelected();\n case \"text.clear\": this.input.setValue(\"\"); return true;\n case \"text.backspace\": this.input.performAction(\"editor.backspace\"); return true;\n }\n }\n return (this.mode === \"search\" || this.mode === \"rename\") && this.input.handleKey(stroke);\n }\n\n private footer(): InteractiveComponent {\n if (this.mode === \"search\" || this.mode === \"rename\") return this.input;\n return {\n render: (size) => new Text(\n this.mode === \"delete\"\n ? `${this.status}\\n${promptShortcut(this.keymap, \"session.delete.accept\", \"sessionDelete\")} delete / ${promptShortcut(this.keymap, \"session.delete.cancel\", \"sessionDelete\")} cancel`\n : `${this.status}\\n${promptShortcut(this.keymap, \"list.accept\", \"select\")} resume \u00B7 ${promptShortcut(this.keymap, \"search.start\", \"sessionPicker\")} search \u00B7 ${promptShortcut(this.keymap, \"session.rename.start\", \"sessionPicker\")} rename \u00B7 ${promptShortcut(this.keymap, \"session.delete.request\", \"sessionPicker\")} delete \u00B7 ${promptShortcut(this.keymap, \"list.cancel\", \"select\")} close`,\n ).render(size),\n handleKey: () => false,\n };\n }\n\n private heading(): string {\n if (this.mode === \"search\") return `Search sessions: ${this.query || \"\u2026\"}`;\n if (this.mode === \"rename\") return \"Rename selected session\";\n if (this.mode === \"delete\") return \"Delete selected session?\";\n return `${this.sessions.length} session${this.sessions.length === 1 ? \"\" : \"s\"}`;\n }\n\n private refreshList(): void {\n const query = this.query.trim().toLowerCase();\n const filtered = query === \"\"\n ? this.sessions\n : this.sessions.filter((session) =>\n [session.id, session.title, session.preview]\n .filter((value): value is string => value !== undefined)\n .some((value) => value.toLowerCase().includes(query))\n );\n this.list.setItems(filtered.map((session) => ({\n value: session,\n label: `${session.id === this.currentSessionId ? \"* \" : \"\"}${session.title ?? session.id}`,\n description: session.preview ?? (\n session.turnCount === undefined ? \"No recorded turns\" : `${session.turnCount} turns`\n ),\n })));\n this.status = filtered.length === 0 ? \"No matching sessions\" : this.status;\n }\n\n private resumeSelected(): boolean {\n const session = this.list.selectedItem?.value;\n if (session === undefined) return false;\n this.complete({ type: \"resume\", sessionId: session.id });\n return true;\n }\n\n private beginRename(): boolean {\n const session = this.list.selectedItem?.value;\n if (session === undefined) return false;\n this.setMode(\"rename\");\n this.status = \"Enter a new title\";\n this.input.setValue(session.title ?? \"\");\n return true;\n }\n\n private beginDelete(): boolean {\n const session = this.list.selectedItem?.value;\n if (session === undefined) return false;\n if (session.id === this.currentSessionId) {\n this.status = \"The active session cannot be deleted\";\n return true;\n }\n this.setMode(\"delete\");\n this.status = `Delete ${sanitizeTerminalText(session.title ?? session.id)}?`;\n return true;\n }\n\n private deleteSelected(): boolean {\n const session = this.list.selectedItem?.value;\n if (session === undefined || session.id === this.currentSessionId) {\n return this.setMode(\"browse\");\n }\n this.complete({ type: \"delete\", sessionId: session.id });\n return true;\n }\n\n private setMode(mode: SessionMode): boolean {\n const resetSearch = this.mode === \"search\" && mode !== \"search\";\n this.mode = mode;\n this.status = \"\";\n this.keymap.reset();\n this.input.resetKeybindings();\n this.input.setFocused(mode === \"search\" || mode === \"rename\");\n this.list.setFocused(false);\n this.list.setFocused(mode === \"browse\" || mode === \"search\");\n if (resetSearch) {\n this.query = \"\";\n this.refreshList();\n }\n return true;\n }\n}\n\nclass HeaderView implements Component {\n constructor(\n private readonly workspace: string,\n private readonly model: string,\n private readonly theme: TuiTheme,\n ) {}\n\n render(size: RenderSize): RenderResult {\n const title = `${styleText(\"\u25C6\", this.theme.accent)} ` +\n `${styleText(\"MaybeCode\", this.theme.accent)} ` +\n styleText(sanitizeTerminalText(this.model), this.theme.muted);\n const workspace = `${styleText(\"workspace\", this.theme.dim)} ` +\n styleText(sanitizeTerminalText(this.workspace), this.theme.muted);\n const divider = styleText(\"\u2500\".repeat(size.width), this.theme.border);\n return new Text(`${title}\\n${workspace}\\n${divider}`, { wrap: false }).render(size);\n }\n}\n\nclass FooterView implements Component {\n constructor(\n private readonly yolo: boolean,\n private readonly status: string,\n private readonly focus: string | undefined,\n private readonly details: \"all\" | \"off\" | \"custom\",\n private readonly reasoning: boolean,\n private readonly theme: TuiTheme,\n private readonly replyHint: string,\n private readonly detailsHint: string,\n private readonly thinkingHint: string,\n private readonly gitLabel: string,\n ) {}\n\n render(size: RenderSize): RenderResult {\n const statusStyle = /^error/iu.test(this.status)\n ? this.theme.error\n : /running|cancell/iu.test(this.status)\n ? this.theme.warning\n : this.theme.success;\n const value = (this.gitLabel ? `${styleText(this.gitLabel, this.theme.accent)} ` : \"\") + (this.yolo ? `${styleText(\"YOLO \u00B7 Auto-approve\", this.theme.warning)} ` : \"\") +\n `${styleText(\"\u25CF\", statusStyle)} ${styleText(this.status, statusStyle)} ` +\n `${styleText(this.focus ?? \"none\", this.theme.muted)} ` +\n `${styleText(this.replyHint, this.theme.dim)} reply ` +\n (this.focus === \"transcript\"\n ? `${styleText(\"J/K\", this.theme.dim)} tools ` +\n `${styleText(\"Enter\", this.theme.dim)} toggle ` +\n `${styleText(\"\u2191/\u2193\", this.theme.dim)} scroll ` +\n `${styleText(\"Tab\", this.theme.dim)} editor`\n : `${styleText(this.detailsHint, this.theme.dim)} details:${this.details} ` +\n `${styleText(this.thinkingHint, this.theme.dim)} thinking:${this.reasoning ? \"on\" : \"off\"} ` +\n `${styleText(\"Ctrl+C\", this.theme.dim)} copy/cancel`);\n return new Text(value, { wrap: false }).render(size);\n }\n}\n\nfunction stringify(value: unknown): string {\n if (typeof value === \"string\") return value;\n try {\n return JSON.stringify(value, null, 2) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction truncate(value: string, maximum: number): string {\n return value.length <= maximum ? value : `${value.slice(0, maximum - 1)}\u2026`;\n}\n\nfunction isSuggestionNavigation(key: string): boolean {\n return key === \"up\" || key === \"down\" || key === \"pageup\" ||\n key === \"pagedown\" || key === \"home\" || key === \"end\";\n}\n\nfunction commonPrefix(input: string, values: readonly string[]): string | undefined {\n const candidates = values.filter((value) => value.startsWith(input));\n const first = candidates[0];\n if (first === undefined) return undefined;\n let length = first.length;\n for (const value of candidates.slice(1)) {\n length = Math.min(length, value.length);\n let index = input.length;\n while (index < length && value[index] === first[index]) index += 1;\n length = index;\n }\n return first.slice(0, length);\n}\n\n/** Ephemeral editor, deliberately without EditorHistory or TranscriptStore writes. */\nclass McpInputPrompt implements InteractiveComponent {\n private readonly body: ScrollView;\n private readonly editor: Editor;\n private readonly layout = new Column([]);\n private readonly keymap: Keymap;\n private reviewPageSize = 1;\n constructor(prompt: string, private readonly complete: (value?: string) => void,\n editorOptions: Pick<EditorOptions, \"clipboard\" | \"onInvalidate\" | \"onError\" | \"keybindings\">,\n keymapOptions: MaybeCodeKeymapOptions = {}) {\n this.keymap = createMaybeCodeKeymap(keymapOptions);\n this.body = new ScrollView(new Text(sanitizeTerminalText(prompt)));\n this.body.setFocused(true);\n this.editor = new Editor({ ...editorOptions, prompt: \"> \", onSubmit: (value) => complete(value) });\n this.editor.setFocused(true);\n }\n render(size: RenderSize): RenderResult {\n this.reviewPageSize = Math.max(1, size.height - 5);\n this.layout.setItems([\n { flex: 1, minHeight: 1, component: this.body },\n { height: 4, component: this.editor },\n { height: 1, component: new Text(`${promptShortcut(this.keymap, \"request.pageUp\", \"mcpInput\")}/${promptShortcut(this.keymap, \"request.pageDown\", \"mcpInput\")} review request | Enter continue | ${promptShortcut(this.keymap, \"request.cancel\", \"mcpInput\")} cancel`) },\n ]);\n return this.layout.render(size);\n }\n handlePointer(event: PointerEvent): boolean { return this.layout.handlePointer(event); }\n dispose(): void { this.editor.dispose(); this.body.dispose(); }\n handleKey(stroke: KeyStroke): boolean {\n const result = this.keymap.resolve(stroke, [\"mcpInput\"]);\n if (result.type === \"pending\") return true;\n if (result.type === \"action\") {\n switch (result.action) {\n case \"request.cancel\": this.complete(); return true;\n case \"request.pageUp\": this.body.scrollBy(-this.reviewPageSize); return true;\n case \"request.pageDown\": this.body.scrollBy(this.reviewPageSize); return true;\n case \"request.scrollUp\": this.body.scrollBy(-3); return true;\n case \"request.scrollDown\": this.body.scrollBy(3); return true;\n }\n }\n return this.editor.handleKey(stroke);\n }\n}\n\nfunction promptShortcut(keymap: Keymap, action: string, context: string): string {\n return keymap.keysForAction(action, context).join(\" / \");\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["signal", "event"]
|
|
7
|
-
}
|