@namzu/cli 0.0.2 → 0.1.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/LICENSE.md +110 -0
- package/dist/bin.js +4 -32
- package/dist/bin.js.map +1 -1
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +124 -0
- package/dist/cli.js.map +1 -0
- package/dist/cli.test.d.ts +2 -0
- package/dist/cli.test.d.ts.map +1 -0
- package/dist/cli.test.js +94 -0
- package/dist/cli.test.js.map +1 -0
- package/dist/commands/doctor.d.ts +6 -0
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +10 -0
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/providers.d.ts +17 -0
- package/dist/commands/providers.d.ts.map +1 -0
- package/dist/commands/providers.js +274 -0
- package/dist/commands/providers.js.map +1 -0
- package/dist/commands/registry.d.ts +11 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +28 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/run.d.ts +14 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +73 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/stubs.d.ts +12 -0
- package/dist/commands/stubs.d.ts.map +1 -0
- package/dist/commands/stubs.js +32 -0
- package/dist/commands/stubs.js.map +1 -0
- package/dist/commands/tools.d.ts +16 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +161 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/commands/types.d.ts +25 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +2 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/config/load.d.ts +25 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +92 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/load.test.d.ts +2 -0
- package/dist/config/load.test.d.ts.map +1 -0
- package/dist/config/load.test.js +57 -0
- package/dist/config/load.test.js.map +1 -0
- package/dist/config/schema.d.ts +29 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +13 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/doctor/registry.d.ts.map +1 -1
- package/dist/doctor/registry.js +3 -1
- package/dist/doctor/registry.js.map +1 -1
- package/dist/doctor/registry.test.js +4 -1
- package/dist/doctor/registry.test.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/clawtool/agents.d.ts +31 -0
- package/dist/integrations/clawtool/agents.d.ts.map +1 -0
- package/dist/integrations/clawtool/agents.js +30 -0
- package/dist/integrations/clawtool/agents.js.map +1 -0
- package/dist/integrations/clawtool/agents.test.d.ts +2 -0
- package/dist/integrations/clawtool/agents.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/agents.test.js +79 -0
- package/dist/integrations/clawtool/agents.test.js.map +1 -0
- package/dist/integrations/clawtool/auth.d.ts +26 -0
- package/dist/integrations/clawtool/auth.d.ts.map +1 -0
- package/dist/integrations/clawtool/auth.js +56 -0
- package/dist/integrations/clawtool/auth.js.map +1 -0
- package/dist/integrations/clawtool/auth.test.d.ts +2 -0
- package/dist/integrations/clawtool/auth.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/auth.test.js +40 -0
- package/dist/integrations/clawtool/auth.test.js.map +1 -0
- package/dist/integrations/clawtool/binary.d.ts +25 -0
- package/dist/integrations/clawtool/binary.d.ts.map +1 -0
- package/dist/integrations/clawtool/binary.js +50 -0
- package/dist/integrations/clawtool/binary.js.map +1 -0
- package/dist/integrations/clawtool/binary.test.d.ts +2 -0
- package/dist/integrations/clawtool/binary.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/binary.test.js +42 -0
- package/dist/integrations/clawtool/binary.test.js.map +1 -0
- package/dist/integrations/clawtool/daemon.d.ts +37 -0
- package/dist/integrations/clawtool/daemon.d.ts.map +1 -0
- package/dist/integrations/clawtool/daemon.js +109 -0
- package/dist/integrations/clawtool/daemon.js.map +1 -0
- package/dist/integrations/clawtool/daemon.test.d.ts +11 -0
- package/dist/integrations/clawtool/daemon.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/daemon.test.js +118 -0
- package/dist/integrations/clawtool/daemon.test.js.map +1 -0
- package/dist/integrations/clawtool/dispatch.d.ts +33 -0
- package/dist/integrations/clawtool/dispatch.d.ts.map +1 -0
- package/dist/integrations/clawtool/dispatch.js +155 -0
- package/dist/integrations/clawtool/dispatch.js.map +1 -0
- package/dist/integrations/clawtool/dispatch.test.d.ts +2 -0
- package/dist/integrations/clawtool/dispatch.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/dispatch.test.js +138 -0
- package/dist/integrations/clawtool/dispatch.test.js.map +1 -0
- package/dist/integrations/clawtool/index.d.ts +11 -0
- package/dist/integrations/clawtool/index.d.ts.map +1 -0
- package/dist/integrations/clawtool/index.js +10 -0
- package/dist/integrations/clawtool/index.js.map +1 -0
- package/dist/integrations/clawtool/mcp.d.ts +51 -0
- package/dist/integrations/clawtool/mcp.d.ts.map +1 -0
- package/dist/integrations/clawtool/mcp.js +156 -0
- package/dist/integrations/clawtool/mcp.js.map +1 -0
- package/dist/integrations/clawtool/mcp.test.d.ts +2 -0
- package/dist/integrations/clawtool/mcp.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/mcp.test.js +126 -0
- package/dist/integrations/clawtool/mcp.test.js.map +1 -0
- package/dist/integrations/clawtool/paths.d.ts +8 -0
- package/dist/integrations/clawtool/paths.d.ts.map +1 -0
- package/dist/integrations/clawtool/paths.js +19 -0
- package/dist/integrations/clawtool/paths.js.map +1 -0
- package/dist/integrations/clawtool/peers.d.ts +67 -0
- package/dist/integrations/clawtool/peers.d.ts.map +1 -0
- package/dist/integrations/clawtool/peers.js +150 -0
- package/dist/integrations/clawtool/peers.js.map +1 -0
- package/dist/integrations/clawtool/plugin.d.ts +42 -0
- package/dist/integrations/clawtool/plugin.d.ts.map +1 -0
- package/dist/integrations/clawtool/plugin.js +38 -0
- package/dist/integrations/clawtool/plugin.js.map +1 -0
- package/dist/integrations/clawtool/state.d.ts +11 -0
- package/dist/integrations/clawtool/state.d.ts.map +1 -0
- package/dist/integrations/clawtool/state.js +41 -0
- package/dist/integrations/clawtool/state.js.map +1 -0
- package/dist/integrations/clawtool/state.test.d.ts +2 -0
- package/dist/integrations/clawtool/state.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/state.test.js +38 -0
- package/dist/integrations/clawtool/state.test.js.map +1 -0
- package/dist/integrations/clawtool/tooling.d.ts +50 -0
- package/dist/integrations/clawtool/tooling.d.ts.map +1 -0
- package/dist/integrations/clawtool/tooling.js +89 -0
- package/dist/integrations/clawtool/tooling.js.map +1 -0
- package/dist/integrations/clawtool/tooling.test.d.ts +2 -0
- package/dist/integrations/clawtool/tooling.test.d.ts.map +1 -0
- package/dist/integrations/clawtool/tooling.test.js +58 -0
- package/dist/integrations/clawtool/tooling.test.js.map +1 -0
- package/dist/integrations/clawtool/types.d.ts +41 -0
- package/dist/integrations/clawtool/types.d.ts.map +1 -0
- package/dist/integrations/clawtool/types.js +9 -0
- package/dist/integrations/clawtool/types.js.map +1 -0
- package/dist/integrations/clipboard/image.d.ts +18 -0
- package/dist/integrations/clipboard/image.d.ts.map +1 -0
- package/dist/integrations/clipboard/image.js +88 -0
- package/dist/integrations/clipboard/image.js.map +1 -0
- package/dist/integrations/providers/discover.d.ts +68 -0
- package/dist/integrations/providers/discover.d.ts.map +1 -0
- package/dist/integrations/providers/discover.js +108 -0
- package/dist/integrations/providers/discover.js.map +1 -0
- package/dist/integrations/providers/discover.test.d.ts +2 -0
- package/dist/integrations/providers/discover.test.d.ts.map +1 -0
- package/dist/integrations/providers/discover.test.js +120 -0
- package/dist/integrations/providers/discover.test.js.map +1 -0
- package/dist/integrations/providers/index.d.ts +10 -0
- package/dist/integrations/providers/index.d.ts.map +1 -0
- package/dist/integrations/providers/index.js +12 -0
- package/dist/integrations/providers/index.js.map +1 -0
- package/dist/integrations/providers/keychain.d.ts +44 -0
- package/dist/integrations/providers/keychain.d.ts.map +1 -0
- package/dist/integrations/providers/keychain.js +154 -0
- package/dist/integrations/providers/keychain.js.map +1 -0
- package/dist/integrations/providers/keychain.test.d.ts +2 -0
- package/dist/integrations/providers/keychain.test.d.ts.map +1 -0
- package/dist/integrations/providers/keychain.test.js +21 -0
- package/dist/integrations/providers/keychain.test.js.map +1 -0
- package/dist/integrations/providers/mask.d.ts +7 -0
- package/dist/integrations/providers/mask.d.ts.map +1 -0
- package/dist/integrations/providers/mask.js +14 -0
- package/dist/integrations/providers/mask.js.map +1 -0
- package/dist/integrations/providers/mask.test.d.ts +2 -0
- package/dist/integrations/providers/mask.test.d.ts.map +1 -0
- package/dist/integrations/providers/mask.test.js +20 -0
- package/dist/integrations/providers/mask.test.js.map +1 -0
- package/dist/integrations/providers/oauth.d.ts +28 -0
- package/dist/integrations/providers/oauth.d.ts.map +1 -0
- package/dist/integrations/providers/oauth.js +65 -0
- package/dist/integrations/providers/oauth.js.map +1 -0
- package/dist/integrations/providers/oauth.test.d.ts +2 -0
- package/dist/integrations/providers/oauth.test.d.ts.map +1 -0
- package/dist/integrations/providers/oauth.test.js +86 -0
- package/dist/integrations/providers/oauth.test.js.map +1 -0
- package/dist/integrations/providers/preferences.d.ts +43 -0
- package/dist/integrations/providers/preferences.d.ts.map +1 -0
- package/dist/integrations/providers/preferences.js +111 -0
- package/dist/integrations/providers/preferences.js.map +1 -0
- package/dist/integrations/providers/preferences.test.d.ts +2 -0
- package/dist/integrations/providers/preferences.test.d.ts.map +1 -0
- package/dist/integrations/providers/preferences.test.js +68 -0
- package/dist/integrations/providers/preferences.test.js.map +1 -0
- package/dist/integrations/providers/registry.d.ts +31 -0
- package/dist/integrations/providers/registry.d.ts.map +1 -0
- package/dist/integrations/providers/registry.js +79 -0
- package/dist/integrations/providers/registry.js.map +1 -0
- package/dist/integrations/providers/schema.d.ts +73 -0
- package/dist/integrations/providers/schema.d.ts.map +1 -0
- package/dist/integrations/providers/schema.js +70 -0
- package/dist/integrations/providers/schema.js.map +1 -0
- package/dist/integrations/providers/schema.test.d.ts +2 -0
- package/dist/integrations/providers/schema.test.d.ts.map +1 -0
- package/dist/integrations/providers/schema.test.js +43 -0
- package/dist/integrations/providers/schema.test.js.map +1 -0
- package/dist/integrations/providers/secrets.d.ts +37 -0
- package/dist/integrations/providers/secrets.d.ts.map +1 -0
- package/dist/integrations/providers/secrets.js +69 -0
- package/dist/integrations/providers/secrets.js.map +1 -0
- package/dist/integrations/providers/store.d.ts +32 -0
- package/dist/integrations/providers/store.d.ts.map +1 -0
- package/dist/integrations/providers/store.js +133 -0
- package/dist/integrations/providers/store.js.map +1 -0
- package/dist/integrations/providers/store.test.d.ts +2 -0
- package/dist/integrations/providers/store.test.d.ts.map +1 -0
- package/dist/integrations/providers/store.test.js +127 -0
- package/dist/integrations/providers/store.test.js.map +1 -0
- package/dist/integrations/sessions/store.d.ts +40 -0
- package/dist/integrations/sessions/store.d.ts.map +1 -0
- package/dist/integrations/sessions/store.js +90 -0
- package/dist/integrations/sessions/store.js.map +1 -0
- package/dist/integrations/subagents/runtime.d.ts +37 -0
- package/dist/integrations/subagents/runtime.d.ts.map +1 -0
- package/dist/integrations/subagents/runtime.js +183 -0
- package/dist/integrations/subagents/runtime.js.map +1 -0
- package/dist/integrations/trust/store.d.ts +16 -0
- package/dist/integrations/trust/store.d.ts.map +1 -0
- package/dist/integrations/trust/store.js +59 -0
- package/dist/integrations/trust/store.js.map +1 -0
- package/dist/integrations/trust/store.test.d.ts +2 -0
- package/dist/integrations/trust/store.test.d.ts.map +1 -0
- package/dist/integrations/trust/store.test.js +50 -0
- package/dist/integrations/trust/store.test.js.map +1 -0
- package/dist/integrations/updates.d.ts +27 -0
- package/dist/integrations/updates.d.ts.map +1 -0
- package/dist/integrations/updates.js +99 -0
- package/dist/integrations/updates.js.map +1 -0
- package/dist/memory/store.d.ts +29 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +74 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/store.test.d.ts +2 -0
- package/dist/memory/store.test.d.ts.map +1 -0
- package/dist/memory/store.test.js +63 -0
- package/dist/memory/store.test.js.map +1 -0
- package/dist/output/formatter.d.ts +30 -0
- package/dist/output/formatter.d.ts.map +1 -0
- package/dist/output/formatter.js +16 -0
- package/dist/output/formatter.js.map +1 -0
- package/dist/output/formatter.test.d.ts +2 -0
- package/dist/output/formatter.test.d.ts.map +1 -0
- package/dist/output/formatter.test.js +88 -0
- package/dist/output/formatter.test.js.map +1 -0
- package/dist/output/index.d.ts +5 -0
- package/dist/output/index.d.ts.map +1 -0
- package/dist/output/index.js +22 -0
- package/dist/output/index.js.map +1 -0
- package/dist/output/json.d.ts +13 -0
- package/dist/output/json.d.ts.map +1 -0
- package/dist/output/json.js +51 -0
- package/dist/output/json.js.map +1 -0
- package/dist/output/text.d.ts +13 -0
- package/dist/output/text.d.ts.map +1 -0
- package/dist/output/text.js +36 -0
- package/dist/output/text.js.map +1 -0
- package/dist/output/yaml.d.ts +13 -0
- package/dist/output/yaml.d.ts.map +1 -0
- package/dist/output/yaml.js +26 -0
- package/dist/output/yaml.js.map +1 -0
- package/dist/skills/store.d.ts +49 -0
- package/dist/skills/store.d.ts.map +1 -0
- package/dist/skills/store.js +109 -0
- package/dist/skills/store.js.map +1 -0
- package/dist/skills/store.test.d.ts +2 -0
- package/dist/skills/store.test.d.ts.map +1 -0
- package/dist/skills/store.test.js +80 -0
- package/dist/skills/store.test.js.map +1 -0
- package/dist/tui/App.d.ts +18 -0
- package/dist/tui/App.d.ts.map +1 -0
- package/dist/tui/App.js +742 -0
- package/dist/tui/App.js.map +1 -0
- package/dist/tui/Composer.d.ts +17 -0
- package/dist/tui/Composer.d.ts.map +1 -0
- package/dist/tui/Composer.js +123 -0
- package/dist/tui/Composer.js.map +1 -0
- package/dist/tui/LiveActivity.d.ts +22 -0
- package/dist/tui/LiveActivity.d.ts.map +1 -0
- package/dist/tui/LiveActivity.js +46 -0
- package/dist/tui/LiveActivity.js.map +1 -0
- package/dist/tui/Markdown.d.ts +18 -0
- package/dist/tui/Markdown.d.ts.map +1 -0
- package/dist/tui/Markdown.js +68 -0
- package/dist/tui/Markdown.js.map +1 -0
- package/dist/tui/PermissionOverlay.d.ts +14 -0
- package/dist/tui/PermissionOverlay.d.ts.map +1 -0
- package/dist/tui/PermissionOverlay.js +22 -0
- package/dist/tui/PermissionOverlay.js.map +1 -0
- package/dist/tui/Picker.d.ts +20 -0
- package/dist/tui/Picker.d.ts.map +1 -0
- package/dist/tui/Picker.js +72 -0
- package/dist/tui/Picker.js.map +1 -0
- package/dist/tui/ResumePicker.d.ts +12 -0
- package/dist/tui/ResumePicker.d.ts.map +1 -0
- package/dist/tui/ResumePicker.js +26 -0
- package/dist/tui/ResumePicker.js.map +1 -0
- package/dist/tui/StatusBar.d.ts +22 -0
- package/dist/tui/StatusBar.d.ts.map +1 -0
- package/dist/tui/StatusBar.js +73 -0
- package/dist/tui/StatusBar.js.map +1 -0
- package/dist/tui/Transcript.d.ts +29 -0
- package/dist/tui/Transcript.d.ts.map +1 -0
- package/dist/tui/Transcript.js +105 -0
- package/dist/tui/Transcript.js.map +1 -0
- package/dist/tui/TrustPrompt.d.ts +11 -0
- package/dist/tui/TrustPrompt.d.ts.map +1 -0
- package/dist/tui/TrustPrompt.js +13 -0
- package/dist/tui/TrustPrompt.js.map +1 -0
- package/dist/tui/agent.d.ts +163 -0
- package/dist/tui/agent.d.ts.map +1 -0
- package/dist/tui/agent.js +684 -0
- package/dist/tui/agent.js.map +1 -0
- package/dist/tui/agent.test.d.ts +2 -0
- package/dist/tui/agent.test.d.ts.map +1 -0
- package/dist/tui/agent.test.js +225 -0
- package/dist/tui/agent.test.js.map +1 -0
- package/dist/tui/index.d.ts +7 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +29 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/logo.d.ts +23 -0
- package/dist/tui/logo.d.ts.map +1 -0
- package/dist/tui/logo.js +35 -0
- package/dist/tui/logo.js.map +1 -0
- package/dist/tui/markdownParser.d.ts +45 -0
- package/dist/tui/markdownParser.d.ts.map +1 -0
- package/dist/tui/markdownParser.js +127 -0
- package/dist/tui/markdownParser.js.map +1 -0
- package/dist/tui/markdownParser.test.d.ts +2 -0
- package/dist/tui/markdownParser.test.d.ts.map +1 -0
- package/dist/tui/markdownParser.test.js +90 -0
- package/dist/tui/markdownParser.test.js.map +1 -0
- package/dist/tui/mentions.d.ts +22 -0
- package/dist/tui/mentions.d.ts.map +1 -0
- package/dist/tui/mentions.js +59 -0
- package/dist/tui/mentions.js.map +1 -0
- package/dist/tui/mentions.test.d.ts +2 -0
- package/dist/tui/mentions.test.d.ts.map +1 -0
- package/dist/tui/mentions.test.js +35 -0
- package/dist/tui/mentions.test.js.map +1 -0
- package/dist/tui/slashCommands.d.ts +64 -0
- package/dist/tui/slashCommands.d.ts.map +1 -0
- package/dist/tui/slashCommands.js +153 -0
- package/dist/tui/slashCommands.js.map +1 -0
- package/dist/tui/slashCommands.test.d.ts +2 -0
- package/dist/tui/slashCommands.test.d.ts.map +1 -0
- package/dist/tui/slashCommands.test.js +114 -0
- package/dist/tui/slashCommands.test.js.map +1 -0
- package/dist/tui/theme.d.ts +34 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +32 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/types.d.ts +27 -0
- package/dist/tui/types.d.ts.map +1 -0
- package/dist/tui/types.js +7 -0
- package/dist/tui/types.js.map +1 -0
- package/package.json +67 -57
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* `/resume` picker — a list of recent conversations in this folder (from
|
|
4
|
+
* the SDK session store). Presentational; App owns ↑/↓/enter/esc and the
|
|
5
|
+
* selected index.
|
|
6
|
+
*/
|
|
7
|
+
import { Box, Text } from 'ink';
|
|
8
|
+
import { theme } from './theme.js';
|
|
9
|
+
export function ResumePicker({ conversations, selected }) {
|
|
10
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.border.focus, paddingX: 1, children: [_jsx(Text, { color: theme.accent.user, bold: true, children: "Resume a conversation" }), _jsx(Box, { flexDirection: "column", paddingTop: 1, children: conversations.map((c, i) => (_jsxs(Box, { children: [_jsx(Box, { width: 2, flexShrink: 0, children: _jsx(Text, { color: theme.accent.user, children: i === selected ? '›' : ' ' }) }), _jsx(Box, { flexGrow: 1, children: _jsx(Text, { color: i === selected ? theme.text.primary : theme.text.secondary, bold: i === selected, wrap: "truncate-end", children: c.title }) }), _jsxs(Text, { color: theme.text.muted, children: [" ", relativeTime(c.updatedAt)] })] }, c.id))) }), _jsx(Box, { paddingTop: 1, children: _jsx(Text, { color: theme.text.muted, children: "\u2191\u2193 navigate \u00B7 enter resume \u00B7 esc cancel" }) })] }));
|
|
11
|
+
}
|
|
12
|
+
function relativeTime(iso) {
|
|
13
|
+
const then = Date.parse(iso);
|
|
14
|
+
if (Number.isNaN(then))
|
|
15
|
+
return '';
|
|
16
|
+
const mins = Math.round((Date.now() - then) / 60000);
|
|
17
|
+
if (mins < 1)
|
|
18
|
+
return 'just now';
|
|
19
|
+
if (mins < 60)
|
|
20
|
+
return `${mins}m ago`;
|
|
21
|
+
const hours = Math.round(mins / 60);
|
|
22
|
+
if (hours < 24)
|
|
23
|
+
return `${hours}h ago`;
|
|
24
|
+
return `${Math.round(hours / 24)}d ago`;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=ResumePicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResumePicker.js","sourceRoot":"","sources":["../../src/tui/ResumePicker.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAG/B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAOlC,MAAM,UAAU,YAAY,CAAC,EAAE,aAAa,EAAE,QAAQ,EAAqB;IAC1E,OAAO,CACN,MAAC,GAAG,IACH,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAC/B,QAAQ,EAAE,CAAC,aAEX,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,4CAE7B,EACP,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,YACvC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAC5B,MAAC,GAAG,eACH,KAAC,GAAG,IAAC,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,YAC3B,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,YAAG,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAQ,GAC9D,EACN,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,YACf,KAAC,IAAI,IACJ,KAAK,EAAE,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EACjE,IAAI,EAAE,CAAC,KAAK,QAAQ,EACpB,IAAI,EAAC,cAAc,YAElB,CAAC,CAAC,KAAK,GACF,GACF,EACN,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,kBAAI,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,IAAQ,KAbzD,CAAC,CAAC,EAAE,CAcR,CACN,CAAC,GACG,EACN,KAAC,GAAG,IAAC,UAAU,EAAE,CAAC,YACjB,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,4EAAgD,GACxE,IACD,CACN,CAAA;AACF,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAC5B,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAA;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,CAAA;IACpD,IAAI,IAAI,GAAG,CAAC;QAAE,OAAO,UAAU,CAAA;IAC/B,IAAI,IAAI,GAAG,EAAE;QAAE,OAAO,GAAG,IAAI,OAAO,CAAA;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,EAAE,CAAC,CAAA;IACnC,IAAI,KAAK,GAAG,EAAE;QAAE,OAAO,GAAG,KAAK,OAAO,CAAA;IACtC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,OAAO,CAAA;AACxC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-line status footer.
|
|
3
|
+
*
|
|
4
|
+
* Layout: `cwd · provider · model · state hint` (provider/model elided
|
|
5
|
+
* when null). A `│` divider separates the metadata cluster from the hint
|
|
6
|
+
* so the eye can find the help-text without parsing the whole line.
|
|
7
|
+
*/
|
|
8
|
+
export interface StatusBarProps {
|
|
9
|
+
readonly cwd: string;
|
|
10
|
+
readonly provider: string | null;
|
|
11
|
+
readonly model: string | null;
|
|
12
|
+
readonly state: 'idle' | 'thinking' | 'tool' | 'awaiting-permission';
|
|
13
|
+
readonly hint?: string;
|
|
14
|
+
readonly usage?: {
|
|
15
|
+
totalTokens: number;
|
|
16
|
+
costUsd: number;
|
|
17
|
+
} | null;
|
|
18
|
+
/** Model context window (tokens) — drives the context-fill gauge. */
|
|
19
|
+
readonly contextWindow?: number | null;
|
|
20
|
+
}
|
|
21
|
+
export declare function StatusBar({ cwd, provider, model, state, hint, usage, contextWindow, }: StatusBarProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
//# sourceMappingURL=StatusBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBar.d.ts","sourceRoot":"","sources":["../../src/tui/StatusBar.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,qBAAqB,CAAA;IACpE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAA;IAChE,qEAAqE;IACrE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACtC;AAED,wBAAgB,SAAS,CAAC,EACzB,GAAG,EACH,QAAQ,EACR,KAAK,EACL,KAAK,EACL,IAAI,EACJ,KAAK,EACL,aAAa,GACb,EAAE,cAAc,2CAkChB"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* One-line status footer.
|
|
4
|
+
*
|
|
5
|
+
* Layout: `cwd · provider · model · state hint` (provider/model elided
|
|
6
|
+
* when null). A `│` divider separates the metadata cluster from the hint
|
|
7
|
+
* so the eye can find the help-text without parsing the whole line.
|
|
8
|
+
*/
|
|
9
|
+
import { Text } from 'ink';
|
|
10
|
+
import { theme } from './theme.js';
|
|
11
|
+
export function StatusBar({ cwd, provider, model, state, hint, usage, contextWindow, }) {
|
|
12
|
+
const segments = [shortenCwd(cwd)];
|
|
13
|
+
if (provider)
|
|
14
|
+
segments.push(provider);
|
|
15
|
+
if (model)
|
|
16
|
+
segments.push(model);
|
|
17
|
+
if (usage && usage.totalTokens > 0)
|
|
18
|
+
segments.push(formatUsage(usage));
|
|
19
|
+
const gauge = usage && usage.totalTokens > 0 && contextWindow && contextWindow > 0
|
|
20
|
+
? buildGauge(usage.totalTokens / contextWindow)
|
|
21
|
+
: null;
|
|
22
|
+
const stateLabel = stateGlyph(state);
|
|
23
|
+
// A single Text with `truncate-end` keeps the footer to exactly one line
|
|
24
|
+
// on narrow terminals (it shrinks with an ellipsis instead of wrapping),
|
|
25
|
+
// while nested Text spans preserve per-segment color.
|
|
26
|
+
return (_jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { color: theme.text.muted, children: segments.join(' · ') }), gauge ? (_jsxs(_Fragment, { children: [_jsx(Text, { color: theme.text.muted, children: " \u00B7 ctx " }), _jsxs(Text, { color: gauge.color, children: [gauge.bar, " ", gauge.pct, "%"] })] })) : null, _jsx(Text, { color: theme.text.muted, children: " \u2502 " }), _jsx(Text, { color: colorForState(state), children: stateLabel }), hint ? (_jsxs(_Fragment, { children: [_jsx(Text, { color: theme.text.muted, children: " \u2502 " }), _jsx(Text, { color: theme.text.secondary, children: hint })] })) : null] }));
|
|
27
|
+
}
|
|
28
|
+
function stateGlyph(state) {
|
|
29
|
+
switch (state) {
|
|
30
|
+
case 'idle':
|
|
31
|
+
return '● idle';
|
|
32
|
+
case 'thinking':
|
|
33
|
+
return '◐ thinking';
|
|
34
|
+
case 'tool':
|
|
35
|
+
return '◑ tool';
|
|
36
|
+
case 'awaiting-permission':
|
|
37
|
+
return '◓ approve?';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function colorForState(state) {
|
|
41
|
+
switch (state) {
|
|
42
|
+
case 'idle':
|
|
43
|
+
return theme.status.ok;
|
|
44
|
+
case 'thinking':
|
|
45
|
+
return theme.accent.system;
|
|
46
|
+
case 'tool':
|
|
47
|
+
case 'awaiting-permission':
|
|
48
|
+
return theme.status.warn;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function formatUsage(usage) {
|
|
52
|
+
const tok = usage.totalTokens >= 1000
|
|
53
|
+
? `${(usage.totalTokens / 1000).toFixed(1)}k tok`
|
|
54
|
+
: `${usage.totalTokens} tok`;
|
|
55
|
+
return usage.costUsd > 0 ? `${tok} · $${usage.costUsd.toFixed(2)}` : tok;
|
|
56
|
+
}
|
|
57
|
+
const GAUGE_WIDTH = 8;
|
|
58
|
+
/** Build an 8-cell context-fill bar, greener when empty → red as it fills. */
|
|
59
|
+
function buildGauge(frac) {
|
|
60
|
+
const clamped = Math.max(0, Math.min(1, frac));
|
|
61
|
+
const filled = Math.round(clamped * GAUGE_WIDTH);
|
|
62
|
+
const bar = '█'.repeat(filled) + '░'.repeat(GAUGE_WIDTH - filled);
|
|
63
|
+
const color = clamped < 0.7 ? theme.status.ok : clamped < 0.9 ? theme.status.warn : theme.status.error;
|
|
64
|
+
return { bar, pct: Math.round(clamped * 100), color };
|
|
65
|
+
}
|
|
66
|
+
function shortenCwd(cwd) {
|
|
67
|
+
const home = process.env.HOME;
|
|
68
|
+
if (home && cwd.startsWith(home)) {
|
|
69
|
+
return `~${cwd.slice(home.length)}`;
|
|
70
|
+
}
|
|
71
|
+
return cwd;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=StatusBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../src/tui/StatusBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conversation transcript. Borderless and edge-to-edge: each message is a
|
|
3
|
+
* two-column row — a fixed glyph gutter plus the content — so wrapped
|
|
4
|
+
* lines hang-indent under the text and the role reads from the glyph +
|
|
5
|
+
* color alone (no separate label line). A pending assistant message shows
|
|
6
|
+
* a braille spinner in the gutter while the agent works.
|
|
7
|
+
*/
|
|
8
|
+
import type { ReactNode } from 'react';
|
|
9
|
+
import type { TranscriptMessage } from './types.js';
|
|
10
|
+
export interface TranscriptProps {
|
|
11
|
+
/** Finalized messages — rendered once via <Static> (printed to scrollback). */
|
|
12
|
+
readonly messages: readonly TranscriptMessage[];
|
|
13
|
+
/** The in-progress streaming message, re-rendered live below the static log. */
|
|
14
|
+
readonly pending: TranscriptMessage | null;
|
|
15
|
+
readonly state: 'idle' | 'thinking' | 'tool' | 'awaiting-permission';
|
|
16
|
+
/** When true, collapsed tool diffs/output are shown in full (Ctrl+O). */
|
|
17
|
+
readonly expanded: boolean;
|
|
18
|
+
/** Bump to reset the static log (e.g. /clear, /resume). */
|
|
19
|
+
readonly resetKey: number;
|
|
20
|
+
/**
|
|
21
|
+
* Header (banner) printed once as the first <Static> row. It must live
|
|
22
|
+
* inside <Static> — Ink writes static output to scrollback *above* the
|
|
23
|
+
* live region, so a banner kept in the live tree would be pushed down as
|
|
24
|
+
* the transcript grows. As the first static row it pins to the top.
|
|
25
|
+
*/
|
|
26
|
+
readonly header?: ReactNode;
|
|
27
|
+
}
|
|
28
|
+
export declare function Transcript({ messages, pending, state, expanded, resetKey, header, }: TranscriptProps): import("react/jsx-runtime").JSX.Element;
|
|
29
|
+
//# sourceMappingURL=Transcript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Transcript.d.ts","sourceRoot":"","sources":["../../src/tui/Transcript.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD,MAAM,WAAW,eAAe;IAC/B,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAA;IAC/C,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,qBAAqB,CAAA;IACpE,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAC3B;AAcD,wBAAgB,UAAU,CAAC,EAC1B,QAAQ,EACR,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,MAAM,GACN,EAAE,eAAe,2CAkDjB"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Conversation transcript. Borderless and edge-to-edge: each message is a
|
|
4
|
+
* two-column row — a fixed glyph gutter plus the content — so wrapped
|
|
5
|
+
* lines hang-indent under the text and the role reads from the glyph +
|
|
6
|
+
* color alone (no separate label line). A pending assistant message shows
|
|
7
|
+
* a braille spinner in the gutter while the agent works.
|
|
8
|
+
*/
|
|
9
|
+
import { Box, Static, Text } from 'ink';
|
|
10
|
+
import { useEffect, useState } from 'react';
|
|
11
|
+
import { Markdown } from './Markdown.js';
|
|
12
|
+
import { theme } from './theme.js';
|
|
13
|
+
const COLLAPSE_LINES = 6;
|
|
14
|
+
const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
|
|
15
|
+
export function Transcript({ messages, pending, state, expanded, resetKey, header, }) {
|
|
16
|
+
const spinner = useSpinner(state !== 'idle');
|
|
17
|
+
// The banner is row 0 so it prints to the very top of scrollback; messages
|
|
18
|
+
// follow it. <Static> renders each row exactly once and never re-renders it,
|
|
19
|
+
// keeping memory + per-frame work bounded (the whole transcript was
|
|
20
|
+
// previously re-rendered on every spinner tick / token, which OOM'd long
|
|
21
|
+
// sessions) and removing flicker.
|
|
22
|
+
const rows = [
|
|
23
|
+
...(header ? [{ kind: 'header' }] : []),
|
|
24
|
+
...messages.map((message, i) => ({
|
|
25
|
+
kind: 'message',
|
|
26
|
+
message,
|
|
27
|
+
prev: messages[i - 1],
|
|
28
|
+
})),
|
|
29
|
+
];
|
|
30
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Static, { items: rows, children: (row) => row.kind === 'header' ? (_jsx(Box, { children: header }, "header")) : (_jsx(MessageRow, { message: row.message, prev: row.prev, spinner: "", expanded: expanded }, row.message.id)) }, resetKey), pending ? (_jsx(MessageRow, { message: pending, prev: messages[messages.length - 1], spinner: spinner, expanded: expanded })) : null, messages.length === 0 && !pending ? (_jsx(Box, { paddingY: 1, children: _jsxs(Text, { color: theme.text.muted, children: ["Type a message to begin \u00B7 ", _jsx(Text, { color: theme.text.secondary, children: "/help" }), " for commands"] }) })) : null] }));
|
|
31
|
+
}
|
|
32
|
+
function MessageRow({ message, prev, spinner, expanded, }) {
|
|
33
|
+
const glyph = message.pending ? spinner : (message.glyph ?? glyphForRole(message.role));
|
|
34
|
+
// The `⎿` tool-result gutter is rendered dim so the call line leads.
|
|
35
|
+
const glyphColor = message.glyphColor ?? (glyph === '⎿' ? theme.text.muted : glyphColorForRole(message.role));
|
|
36
|
+
// One blank line before each entry, except the first and `⎿` result rows,
|
|
37
|
+
// which hug the `⏺` tool call above them (Claude-Code-style grouping).
|
|
38
|
+
const gap = !prev || message.glyph === '⎿' ? 0 : 1;
|
|
39
|
+
return (_jsxs(Box, { flexDirection: "column", marginTop: gap, children: [_jsxs(Box, { flexDirection: "row", children: [_jsx(Box, { width: 2, flexShrink: 0, children: _jsx(Text, { color: glyphColor, bold: true, children: glyph }) }), _jsx(Box, { flexGrow: 1, children: message.role === 'assistant' && message.content.length > 0 ? (_jsx(Markdown, { text: message.content, color: contentColorForRole(message.role) })) : (_jsxs(Text, { color: contentColorForRole(message.role), wrap: "wrap", children: [message.content, message.meta ? _jsxs(Text, { color: theme.text.muted, children: [" \u00B7 ", message.meta] }) : null, message.pending && message.content.length === 0 ? (_jsx(Text, { color: theme.text.muted, children: "\u2026" })) : null] })) })] }), message.detail && message.detail.length > 0 ? (_jsx(DetailBlock, { lines: message.detail, expanded: expanded })) : null] }));
|
|
40
|
+
}
|
|
41
|
+
/** Collapsible tool diff / output, aligned under the content gutter. */
|
|
42
|
+
function DetailBlock({ lines, expanded, }) {
|
|
43
|
+
const shown = expanded ? lines : lines.slice(0, COLLAPSE_LINES);
|
|
44
|
+
const hidden = lines.length - shown.length;
|
|
45
|
+
// A dim left rule (`▏`) under the gutter frames the output as a block,
|
|
46
|
+
// the way Claude Code / Warp set tool output apart from the prose.
|
|
47
|
+
const Rule = () => (_jsx(Box, { width: 2, flexShrink: 0, children: _jsx(Text, { color: theme.text.muted, children: "\u258F" }) }));
|
|
48
|
+
return (_jsxs(Box, { flexDirection: "column", paddingLeft: 1, children: [shown.map((line, i) => (_jsxs(Box, { flexDirection: "row", children: [_jsx(Rule, {}), _jsx(Box, { flexGrow: 1, children: _jsx(Text, { color: detailLineColor(line), wrap: "wrap", children: line.length > 0 ? line : ' ' }) })] }, `d-${i}`))), hidden > 0 ? (_jsxs(Box, { flexDirection: "row", children: [_jsx(Rule, {}), _jsxs(Text, { color: theme.text.muted, children: ["\u2026 +", hidden, " lines (ctrl+o to expand)"] })] })) : null] }));
|
|
49
|
+
}
|
|
50
|
+
function detailLineColor(line) {
|
|
51
|
+
if (line.startsWith('+'))
|
|
52
|
+
return theme.status.ok;
|
|
53
|
+
if (line.startsWith('-'))
|
|
54
|
+
return theme.status.error;
|
|
55
|
+
return theme.text.muted;
|
|
56
|
+
}
|
|
57
|
+
function useSpinner(active) {
|
|
58
|
+
const [frame, setFrame] = useState(0);
|
|
59
|
+
useEffect(() => {
|
|
60
|
+
if (!active)
|
|
61
|
+
return;
|
|
62
|
+
const interval = setInterval(() => {
|
|
63
|
+
setFrame((f) => (f + 1) % SPINNER_FRAMES.length);
|
|
64
|
+
}, 80);
|
|
65
|
+
return () => clearInterval(interval);
|
|
66
|
+
}, [active]);
|
|
67
|
+
return SPINNER_FRAMES[frame] ?? '⠋';
|
|
68
|
+
}
|
|
69
|
+
function glyphForRole(role) {
|
|
70
|
+
switch (role) {
|
|
71
|
+
case 'user':
|
|
72
|
+
return '>';
|
|
73
|
+
case 'assistant':
|
|
74
|
+
return '✦';
|
|
75
|
+
case 'system':
|
|
76
|
+
return '·';
|
|
77
|
+
case 'tool':
|
|
78
|
+
return '⚙';
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function glyphColorForRole(role) {
|
|
82
|
+
switch (role) {
|
|
83
|
+
case 'user':
|
|
84
|
+
return theme.accent.user;
|
|
85
|
+
case 'assistant':
|
|
86
|
+
return theme.accent.assistant;
|
|
87
|
+
case 'system':
|
|
88
|
+
return theme.text.muted;
|
|
89
|
+
case 'tool':
|
|
90
|
+
return theme.accent.tool;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function contentColorForRole(role) {
|
|
94
|
+
switch (role) {
|
|
95
|
+
case 'user':
|
|
96
|
+
return theme.text.primary;
|
|
97
|
+
case 'assistant':
|
|
98
|
+
return theme.text.primary;
|
|
99
|
+
case 'system':
|
|
100
|
+
return theme.text.secondary;
|
|
101
|
+
case 'tool':
|
|
102
|
+
return theme.text.secondary;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=Transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Transcript.js","sourceRoot":"","sources":["../../src/tui/Transcript.tsx"],"names":[],"mappings":";AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAEvC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAsBlC,MAAM,cAAc,GAAG,CAAC,CAAA;AAExB,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAU,CAAA;AAUlF,MAAM,UAAU,UAAU,CAAC,EAC1B,QAAQ,EACR,OAAO,EACP,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,MAAM,GACW;IACjB,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,KAAK,MAAM,CAAC,CAAA;IAE5C,2EAA2E;IAC3E,6EAA6E;IAC7E,oEAAoE;IACpE,yEAAyE;IACzE,kCAAkC;IAClC,MAAM,IAAI,GAAgB;QACzB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChD,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,IAAI,EAAE,SAAkB;YACxB,OAAO;YACP,IAAI,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;SACrB,CAAC,CAAC;KACH,CAAA;IACD,OAAO,CACN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aAC1B,KAAC,MAAM,IAAgB,KAAK,EAAE,IAAI,YAChC,CAAC,GAAG,EAAE,EAAE,CACR,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CACvB,KAAC,GAAG,cAAe,MAAM,IAAhB,QAAQ,CAAe,CAChC,CAAC,CAAC,CAAC,CACH,KAAC,UAAU,IAEV,OAAO,EAAE,GAAG,CAAC,OAAO,EACpB,IAAI,EAAE,GAAG,CAAC,IAAI,EACd,OAAO,EAAC,EAAE,EACV,QAAQ,EAAE,QAAQ,IAJb,GAAG,CAAC,OAAO,CAAC,EAAE,CAKlB,CACF,IAZU,QAAQ,CAcZ,EACR,OAAO,CAAC,CAAC,CAAC,CACV,KAAC,UAAU,IACV,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,EACnC,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,GACjB,CACF,CAAC,CAAC,CAAC,IAAI,EACP,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CACpC,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,gDACF,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,sBAAc,qBACnE,GACF,CACN,CAAC,CAAC,CAAC,IAAI,IACH,CACN,CAAA;AACF,CAAC;AAED,SAAS,UAAU,CAAC,EACnB,OAAO,EACP,IAAI,EACJ,OAAO,EACP,QAAQ,GAMR;IACA,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IACvF,qEAAqE;IACrE,MAAM,UAAU,GACf,OAAO,CAAC,UAAU,IAAI,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3F,0EAA0E;IAC1E,uEAAuE;IACvE,MAAM,GAAG,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAClD,OAAO,CACN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,GAAG,aACzC,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACvB,KAAC,GAAG,IAAC,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,YAC3B,KAAC,IAAI,IAAC,KAAK,EAAE,UAAU,EAAE,IAAI,kBAC3B,KAAK,GACA,GACF,EACN,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,YACd,OAAO,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC7D,KAAC,QAAQ,IAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAI,CAC7E,CAAC,CAAC,CAAC,CACH,MAAC,IAAI,IAAC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAC,MAAM,aACzD,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,yBAAM,OAAO,CAAC,IAAI,IAAQ,CAAC,CAAC,CAAC,IAAI,EAC7E,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAClD,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,uBAAU,CACvC,CAAC,CAAC,CAAC,IAAI,IACF,CACP,GACI,IACD,EACL,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAC9C,KAAC,WAAW,IAAC,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,GAAI,CAC1D,CAAC,CAAC,CAAC,IAAI,IACH,CACN,CAAA;AACF,CAAC;AAED,wEAAwE;AACxE,SAAS,WAAW,CAAC,EACpB,KAAK,EACL,QAAQ,GAIR;IACA,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAA;IAC1C,uEAAuE;IACvE,mEAAmE;IACnE,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,CAClB,KAAC,GAAG,IAAC,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,YAC3B,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,uBAAU,GAClC,CACN,CAAA;IACD,OAAO,CACN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,WAAW,EAAE,CAAC,aACxC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACvB,MAAC,GAAG,IAAgB,aAAa,EAAC,KAAK,aACtC,KAAC,IAAI,KAAG,EACR,KAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,YACf,KAAC,IAAI,IAAC,KAAK,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAC,MAAM,YAC7C,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GACvB,GACF,KANG,KAAK,CAAC,EAAE,CAOZ,CACN,CAAC,EACD,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACb,MAAC,GAAG,IAAC,aAAa,EAAC,KAAK,aACvB,KAAC,IAAI,KAAG,EACR,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,yBAAM,MAAM,iCAAiC,IACrE,CACN,CAAC,CAAC,CAAC,IAAI,IACH,CACN,CAAA;AACF,CAAC;AAED,SAAS,eAAe,CAAC,IAAY;IACpC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,CAAA;IAChD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAA;IACnD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAA;AACxB,CAAC;AAED,SAAS,UAAU,CAAC,MAAe;IAClC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAS,CAAC,CAAC,CAAA;IAC7C,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,MAAM;YAAE,OAAM;QACnB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YACjC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAA;QACjD,CAAC,EAAE,EAAE,CAAC,CAAA;QACN,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IACrC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAA;IACZ,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,GAAG,CAAA;AACpC,CAAC;AAED,SAAS,YAAY,CAAC,IAA+B;IACpD,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,MAAM;YACV,OAAO,GAAG,CAAA;QACX,KAAK,WAAW;YACf,OAAO,GAAG,CAAA;QACX,KAAK,QAAQ;YACZ,OAAO,GAAG,CAAA;QACX,KAAK,MAAM;YACV,OAAO,GAAG,CAAA;IACZ,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAA+B;IACzD,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,MAAM;YACV,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAA;QACzB,KAAK,WAAW;YACf,OAAO,KAAK,CAAC,MAAM,CAAC,SAAS,CAAA;QAC9B,KAAK,QAAQ;YACZ,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAA;QACxB,KAAK,MAAM;YACV,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAA;IAC1B,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB,CAAC,IAA+B;IAC3D,QAAQ,IAAI,EAAE,CAAC;QACd,KAAK,MAAM;YACV,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAA;QAC1B,KAAK,WAAW;YACf,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAA;QAC1B,KAAK,QAAQ;YACZ,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAA;QAC5B,KAAK,MAAM;YACV,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAA;IAC7B,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trust-folder gate, shown on launch when the working directory hasn't
|
|
3
|
+
* been trusted before. namzu can read, run commands in, and edit files in
|
|
4
|
+
* this folder, so the user confirms first (Claude-Code style). The parent
|
|
5
|
+
* (App) owns the keypress handling; this component is presentational.
|
|
6
|
+
*/
|
|
7
|
+
export interface TrustPromptProps {
|
|
8
|
+
readonly cwd: string;
|
|
9
|
+
}
|
|
10
|
+
export declare function TrustPrompt({ cwd }: TrustPromptProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
//# sourceMappingURL=TrustPrompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrustPrompt.d.ts","sourceRoot":"","sources":["../../src/tui/TrustPrompt.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,EAAE,gBAAgB,2CAmCpD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Trust-folder gate, shown on launch when the working directory hasn't
|
|
4
|
+
* been trusted before. namzu can read, run commands in, and edit files in
|
|
5
|
+
* this folder, so the user confirms first (Claude-Code style). The parent
|
|
6
|
+
* (App) owns the keypress handling; this component is presentational.
|
|
7
|
+
*/
|
|
8
|
+
import { Box, Text } from 'ink';
|
|
9
|
+
import { theme } from './theme.js';
|
|
10
|
+
export function TrustPrompt({ cwd }) {
|
|
11
|
+
return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: theme.status.warn, paddingX: 2, paddingY: 1, children: [_jsx(Text, { color: theme.status.warn, bold: true, children: "Do you trust the files in this folder?" }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: theme.accent.user, children: cwd }) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: theme.text.secondary, children: "namzu can read, run commands in, and edit files in this folder." }), _jsx(Text, { color: theme.text.secondary, children: "Only continue if you trust its contents." })] }), _jsx(Box, { marginTop: 1, children: _jsxs(Text, { color: theme.text.muted, children: [_jsx(Text, { color: theme.status.ok, bold: true, children: "y" }), ' ', "trust this folder \u00B7", ' ', _jsx(Text, { color: theme.status.error, bold: true, children: "n" }), ' ', "exit"] }) })] }));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=TrustPrompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TrustPrompt.js","sourceRoot":"","sources":["../../src/tui/TrustPrompt.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAE/B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAMlC,MAAM,UAAU,WAAW,CAAC,EAAE,GAAG,EAAoB;IACpD,OAAO,CACN,MAAC,GAAG,IACH,aAAa,EAAC,QAAQ,EACtB,WAAW,EAAC,OAAO,EACnB,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAC9B,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,aAEX,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,6DAE7B,EACP,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAChB,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,YAAG,GAAG,GAAQ,GACvC,EACN,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACxC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,gFAE1B,EACP,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,SAAS,yDAAiD,IAC7E,EACN,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YAChB,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,aAC5B,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,wBAE3B,EAAC,GAAG,8BACS,GAAG,EACvB,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,wBAE9B,EAAC,GAAG,YAEL,GACF,IACD,CACN,CAAA;AACF,CAAC"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TUI agent session — provider-direct, tool-enabled.
|
|
3
|
+
*
|
|
4
|
+
* Reads the picker selection (preferences.json), looks up the chosen
|
|
5
|
+
* provider in the declarative registry, lazy-loads the matching
|
|
6
|
+
* `@namzu/<type>` package, constructs the SDK provider, builds a
|
|
7
|
+
* `ToolRegistry` of the SDK builtin tools (bash / read / write / edit /
|
|
8
|
+
* glob / grep / …), and exposes `send(messages, signal?) →
|
|
9
|
+
* AsyncIterable<AgentEvent>` over the SDK agent loop `query()`.
|
|
10
|
+
*
|
|
11
|
+
* Unlike the earlier `chatStream()`-only adapter, this drives the full
|
|
12
|
+
* tool-execution loop: the model can call tools, their results are fed
|
|
13
|
+
* back, and the loop iterates until the turn settles. We translate the
|
|
14
|
+
* SDK's `RunEvent` stream into the TUI's smaller `AgentEvent` vocabulary
|
|
15
|
+
* (text deltas + tool start/end + done/error).
|
|
16
|
+
*
|
|
17
|
+
* The TUI owns conversation history and passes the full `Message[]` on
|
|
18
|
+
* every turn (stateless session). Empty / partial states (no
|
|
19
|
+
* credentials, no preferences, no matching detected provider) return an
|
|
20
|
+
* `emptySession()` whose `send()` yields a single error event so the UI
|
|
21
|
+
* renders an actionable hint rather than crashing.
|
|
22
|
+
*/
|
|
23
|
+
import { type Message, type ProjectId, type ResumeHandler, type RunEvent, type SessionId, type TenantId, type ThreadId, type ToolCallSummary } from '@namzu/sdk';
|
|
24
|
+
import { type DetectedProvider, type Preferences } from '../integrations/providers/index.js';
|
|
25
|
+
export type AgentEvent = {
|
|
26
|
+
readonly kind: 'delta';
|
|
27
|
+
readonly text: string;
|
|
28
|
+
} | {
|
|
29
|
+
readonly kind: 'tool-start';
|
|
30
|
+
/** SDK tool-use id — stable across this call's start/end (for tracking). */
|
|
31
|
+
readonly toolUseId: string;
|
|
32
|
+
readonly toolName: string;
|
|
33
|
+
readonly summary: string;
|
|
34
|
+
/** Diff / content preview shown (collapsible) under the call. */
|
|
35
|
+
readonly detail?: readonly string[];
|
|
36
|
+
} | {
|
|
37
|
+
readonly kind: 'tool-end';
|
|
38
|
+
readonly toolUseId: string;
|
|
39
|
+
readonly toolName: string;
|
|
40
|
+
readonly isError: boolean;
|
|
41
|
+
readonly summary: string;
|
|
42
|
+
/** Output lines shown (collapsible) under the result. */
|
|
43
|
+
readonly detail?: readonly string[];
|
|
44
|
+
} | {
|
|
45
|
+
readonly kind: 'usage';
|
|
46
|
+
readonly totalTokens: number;
|
|
47
|
+
readonly costUsd: number;
|
|
48
|
+
} | {
|
|
49
|
+
readonly kind: 'task';
|
|
50
|
+
readonly subject: string;
|
|
51
|
+
readonly status: string;
|
|
52
|
+
} | {
|
|
53
|
+
readonly kind: 'done';
|
|
54
|
+
readonly finishReason?: string;
|
|
55
|
+
} | {
|
|
56
|
+
readonly kind: 'error';
|
|
57
|
+
readonly message: string;
|
|
58
|
+
};
|
|
59
|
+
/** A single tool the model wants to run, surfaced to the user for approval. */
|
|
60
|
+
export interface PermissionToolCall {
|
|
61
|
+
readonly id: string;
|
|
62
|
+
readonly name: string;
|
|
63
|
+
readonly summary: string;
|
|
64
|
+
readonly isDestructive: boolean;
|
|
65
|
+
/** Optional multi-line preview (e.g. content to write, edit diff). */
|
|
66
|
+
readonly preview?: readonly string[];
|
|
67
|
+
}
|
|
68
|
+
export interface PermissionRequest {
|
|
69
|
+
readonly toolCalls: readonly PermissionToolCall[];
|
|
70
|
+
}
|
|
71
|
+
export type PermissionDecision = {
|
|
72
|
+
readonly kind: 'approve';
|
|
73
|
+
} | {
|
|
74
|
+
readonly kind: 'approve-all';
|
|
75
|
+
} | {
|
|
76
|
+
readonly kind: 'reject';
|
|
77
|
+
readonly feedback?: string;
|
|
78
|
+
};
|
|
79
|
+
export type PermissionFn = (req: PermissionRequest) => Promise<PermissionDecision>;
|
|
80
|
+
export interface SendOptions {
|
|
81
|
+
readonly signal?: AbortSignal;
|
|
82
|
+
/**
|
|
83
|
+
* Called before a batch of non-read-only tools runs. Resolves with the
|
|
84
|
+
* user's decision. When omitted, every tool batch is auto-approved
|
|
85
|
+
* (non-interactive behavior).
|
|
86
|
+
*/
|
|
87
|
+
readonly onPermission?: PermissionFn;
|
|
88
|
+
/**
|
|
89
|
+
* Extra system context to inject for this turn (e.g. active skills),
|
|
90
|
+
* merged after the persistent memory block.
|
|
91
|
+
*/
|
|
92
|
+
readonly extraSystem?: string;
|
|
93
|
+
}
|
|
94
|
+
export interface AgentSession {
|
|
95
|
+
readonly hasProvider: boolean;
|
|
96
|
+
readonly providerSummary: string | null;
|
|
97
|
+
readonly modelSummary: string | null;
|
|
98
|
+
readonly toolNames: readonly string[];
|
|
99
|
+
/** Count of clawtool tools registered deferred (loadable via search_tools). */
|
|
100
|
+
readonly deferredToolCount: number;
|
|
101
|
+
readonly errorHint: string | null;
|
|
102
|
+
send(messages: readonly Message[], opts?: SendOptions): AsyncIterable<AgentEvent>;
|
|
103
|
+
}
|
|
104
|
+
export interface AgentSessionContext {
|
|
105
|
+
readonly preferences: Preferences | null;
|
|
106
|
+
readonly needsRepickReason: string | null;
|
|
107
|
+
readonly detected: readonly DetectedProvider[];
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Read preferences + run discovery once. Returned context drives the
|
|
111
|
+
* App's lifecycle decision: ready / picker / unhealthy.
|
|
112
|
+
*/
|
|
113
|
+
export declare function probeAgentSession(): Promise<AgentSessionContext>;
|
|
114
|
+
export declare function createAgentSession(prefs: Preferences, detected: readonly DetectedProvider[], scope?: RunScope): Promise<AgentSession>;
|
|
115
|
+
export interface RunScope {
|
|
116
|
+
sessionId: SessionId;
|
|
117
|
+
readonly threadId: ThreadId;
|
|
118
|
+
readonly projectId: ProjectId;
|
|
119
|
+
readonly tenantId: TenantId;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Bridge the SDK's HITL `tool_review` request to the TUI's permission
|
|
123
|
+
* callback. Read-only batches (nothing destructive) run silently; batches
|
|
124
|
+
* with a destructive call prompt the user unless they've already chosen
|
|
125
|
+
* "approve all" for the session. Plans and iteration checkpoints are
|
|
126
|
+
* auto-continued (the TUI doesn't use plan mode).
|
|
127
|
+
*/
|
|
128
|
+
export declare function makeResumeHandler(approval: {
|
|
129
|
+
all: boolean;
|
|
130
|
+
}, onPermission: PermissionFn | undefined): ResumeHandler;
|
|
131
|
+
/**
|
|
132
|
+
* A batch needs explicit approval when any call mutates state: flagged
|
|
133
|
+
* destructive by the SDK, or simply not on the read-only allowlist.
|
|
134
|
+
*/
|
|
135
|
+
export declare function batchNeedsPrompt(toolCalls: readonly ToolCallSummary[]): boolean;
|
|
136
|
+
/**
|
|
137
|
+
* Translate one SDK `RunEvent` into the TUI's `AgentEvent` vocabulary, or
|
|
138
|
+
* `null` for events the chat surface doesn't render (iteration markers,
|
|
139
|
+
* token usage, checkpoints, plan/task lifecycle, …). Pure — unit-tested.
|
|
140
|
+
*/
|
|
141
|
+
export declare function toAgentEvent(event: RunEvent): AgentEvent | null;
|
|
142
|
+
/**
|
|
143
|
+
* Multi-line preview of a mutating tool's effect, shown in the permission
|
|
144
|
+
* overlay so the user approves with sight of what changes. `write` shows
|
|
145
|
+
* the leading content lines; `edit` shows a minimal -old / +new diff;
|
|
146
|
+
* everything else has no preview (the one-line summary suffices). Pure —
|
|
147
|
+
* unit-tested.
|
|
148
|
+
*/
|
|
149
|
+
export declare function previewToolInput(toolName: string, input: unknown): readonly string[] | undefined;
|
|
150
|
+
/**
|
|
151
|
+
* Diff / content shown under a tool CALL (`⏺`): an `edit` renders a
|
|
152
|
+
* `- old` / `+ new` diff, a `write` renders the content. Other tools show
|
|
153
|
+
* nothing at call time (their output appears under the result instead).
|
|
154
|
+
*/
|
|
155
|
+
export declare function toolStartDetail(toolName: string, input: unknown): readonly string[] | undefined;
|
|
156
|
+
/**
|
|
157
|
+
* Output shown under a tool RESULT (`⎿`). For `edit`/`write` the diff was
|
|
158
|
+
* already shown at call time, so the result stays a one-line confirmation;
|
|
159
|
+
* every other tool (read/bash/grep/…) shows its captured output here — JSON
|
|
160
|
+
* results are pretty-printed / unwrapped so they don't read as a raw blob.
|
|
161
|
+
*/
|
|
162
|
+
export declare function toolEndDetail(toolName: string, result: string): readonly string[] | undefined;
|
|
163
|
+
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/tui/agent.ts"],"names":[],"mappings":"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"}
|