@shareai-lab/kode 1.1.16 → 1.1.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Logo.js +5 -1
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/entrypoints/cli.js +57 -37
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/screens/REPL.js +5 -5
- package/dist/screens/REPL.js.map +2 -2
- package/dist/services/openai.js +10 -6
- package/dist/services/openai.js.map +2 -2
- package/dist/tools/TaskTool/TaskTool.js +44 -1
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/utils/generators.js.map +1 -1
- package/package.json +56 -2
package/dist/components/Logo.js
CHANGED
|
@@ -6,6 +6,10 @@ import { getAnthropicApiKey, getGlobalConfig } from "../utils/config.js";
|
|
|
6
6
|
import { getCwd } from "../utils/state.js";
|
|
7
7
|
import { getModelManager } from "../utils/model.js";
|
|
8
8
|
const MIN_LOGO_WIDTH = 50;
|
|
9
|
+
const DEFAULT_UPDATE_COMMANDS = [
|
|
10
|
+
"bun add -g @shareai-lab/kode@latest",
|
|
11
|
+
"npm install -g @shareai-lab/kode@latest"
|
|
12
|
+
];
|
|
9
13
|
function Logo({
|
|
10
14
|
mcpClients,
|
|
11
15
|
isDefaultModel = false,
|
|
@@ -33,7 +37,7 @@ function Logo({
|
|
|
33
37
|
marginRight: 2,
|
|
34
38
|
width
|
|
35
39
|
},
|
|
36
|
-
updateBannerVersion ? /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "New version available: ", updateBannerVersion), /* @__PURE__ */ React.createElement(Text, null, "Run the following command to update:"), /* @__PURE__ */ React.createElement(Text, null, " ", updateBannerCommands?.[0] ??
|
|
40
|
+
updateBannerVersion ? /* @__PURE__ */ React.createElement(Box, { flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: "yellow" }, "New version available: ", updateBannerVersion), /* @__PURE__ */ React.createElement(Text, null, "Run the following command to update:"), /* @__PURE__ */ React.createElement(Text, null, " ", updateBannerCommands?.[0] ?? DEFAULT_UPDATE_COMMANDS[0]), /* @__PURE__ */ React.createElement(Text, null, "Or:"), /* @__PURE__ */ React.createElement(Text, null, " ", updateBannerCommands?.[1] ?? DEFAULT_UPDATE_COMMANDS[1]), process.platform !== "win32" && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, 'Note: you may need to prefix with "sudo" on macOS/Linux.')) : null,
|
|
37
41
|
/* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.kode }, "\u273B"), " Welcome to", " ", /* @__PURE__ */ React.createElement(Text, { bold: true }, PRODUCT_NAME), " ", /* @__PURE__ */ React.createElement(Text, null, "research preview!")),
|
|
38
42
|
/* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Box, { paddingLeft: 2, flexDirection: "column", gap: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText, italic: true }, "/help for help"), /* @__PURE__ */ React.createElement(Text, { color: theme.secondaryText }, "cwd: ", getCwd())), hasOverrides && /* @__PURE__ */ React.createElement(
|
|
39
43
|
Box,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/components/Logo.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Box, Text, Newline } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '../utils/theme'\nimport { PRODUCT_NAME } from '../constants/product'\nimport { getAnthropicApiKey, getGlobalConfig } from '../utils/config'\nimport { getCwd } from '../utils/state'\nimport { AsciiLogo } from './AsciiLogo'\nimport type { WrappedClient } from '../services/mcpClient'\nimport { getModelManager } from '../utils/model'\n\nexport const MIN_LOGO_WIDTH = 50\n\nexport function Logo({\n mcpClients,\n isDefaultModel = false,\n updateBannerVersion,\n updateBannerCommands,\n}: {\n mcpClients: WrappedClient[]\n isDefaultModel?: boolean\n updateBannerVersion?: string | null\n updateBannerCommands?: string[] | null\n}): React.ReactNode {\n const width = Math.max(MIN_LOGO_WIDTH, getCwd().length + 12)\n const theme = getTheme()\n const config = getGlobalConfig()\n\n const modelManager = getModelManager()\n const mainModelName = modelManager.getModelName('main')\n const currentModel = mainModelName || 'No model configured'\n const apiKey = getAnthropicApiKey()\n const hasOverrides = Boolean(\n process.env.ANTHROPIC_API_KEY ||\n process.env.DISABLE_PROMPT_CACHING ||\n process.env.API_TIMEOUT_MS ||\n process.env.MAX_THINKING_TOKENS,\n )\n\n return (\n <Box flexDirection=\"column\">\n <Box\n borderColor={theme.kode}\n borderStyle=\"round\"\n flexDirection=\"column\"\n gap={1}\n paddingLeft={1}\n marginRight={2}\n width={width}\n >\n {updateBannerVersion ? (\n <Box flexDirection=\"column\">\n <Text color=\"yellow\">New version available: {updateBannerVersion}</Text>\n <Text>Run the following command to update:</Text>\n <Text>\n {' '}\n {updateBannerCommands?.[0] ??
|
|
5
|
-
"mappings": "AAAA,SAAS,KAAK,YAAqB;AACnC,YAAY,WAAW;AACvB,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB,uBAAuB;AACpD,SAAS,cAAc;AAGvB,SAAS,uBAAuB;AAEzB,MAAM,iBAAiB;
|
|
4
|
+
"sourcesContent": ["import { Box, Text, Newline } from 'ink'\nimport * as React from 'react'\nimport { getTheme } from '../utils/theme'\nimport { PRODUCT_NAME } from '../constants/product'\nimport { getAnthropicApiKey, getGlobalConfig } from '../utils/config'\nimport { getCwd } from '../utils/state'\nimport { AsciiLogo } from './AsciiLogo'\nimport type { WrappedClient } from '../services/mcpClient'\nimport { getModelManager } from '../utils/model'\n\nexport const MIN_LOGO_WIDTH = 50\n\nconst DEFAULT_UPDATE_COMMANDS = [\n 'bun add -g @shareai-lab/kode@latest',\n 'npm install -g @shareai-lab/kode@latest',\n] as const\n\nexport function Logo({\n mcpClients,\n isDefaultModel = false,\n updateBannerVersion,\n updateBannerCommands,\n}: {\n mcpClients: WrappedClient[]\n isDefaultModel?: boolean\n updateBannerVersion?: string | null\n updateBannerCommands?: string[] | null\n}): React.ReactNode {\n const width = Math.max(MIN_LOGO_WIDTH, getCwd().length + 12)\n const theme = getTheme()\n const config = getGlobalConfig()\n\n const modelManager = getModelManager()\n const mainModelName = modelManager.getModelName('main')\n const currentModel = mainModelName || 'No model configured'\n const apiKey = getAnthropicApiKey()\n const hasOverrides = Boolean(\n process.env.ANTHROPIC_API_KEY ||\n process.env.DISABLE_PROMPT_CACHING ||\n process.env.API_TIMEOUT_MS ||\n process.env.MAX_THINKING_TOKENS,\n )\n\n return (\n <Box flexDirection=\"column\">\n <Box\n borderColor={theme.kode}\n borderStyle=\"round\"\n flexDirection=\"column\"\n gap={1}\n paddingLeft={1}\n marginRight={2}\n width={width}\n >\n {updateBannerVersion ? (\n <Box flexDirection=\"column\">\n <Text color=\"yellow\">New version available: {updateBannerVersion}</Text>\n <Text>Run the following command to update:</Text>\n <Text>\n {' '}\n {updateBannerCommands?.[0] ?? DEFAULT_UPDATE_COMMANDS[0]}\n </Text>\n <Text>Or:</Text>\n <Text>\n {' '}\n {updateBannerCommands?.[1] ?? DEFAULT_UPDATE_COMMANDS[1]}\n </Text>\n {process.platform !== 'win32' && (\n <Text dimColor>\n Note: you may need to prefix with \"sudo\" on macOS/Linux.\n </Text>\n )}\n </Box>\n ) : null}\n <Text>\n <Text color={theme.kode}>\u273B</Text> Welcome to{' '}\n <Text bold>{PRODUCT_NAME}</Text> <Text>research preview!</Text>\n </Text>\n {/* <AsciiLogo /> */}\n\n <>\n <Box paddingLeft={2} flexDirection=\"column\" gap={1}>\n <Text color={theme.secondaryText} italic>\n /help for help\n </Text>\n <Text color={theme.secondaryText}>cwd: {getCwd()}</Text>\n </Box>\n\n {hasOverrides && (\n <Box\n borderColor={theme.secondaryBorder}\n borderStyle=\"single\"\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderTop={true}\n flexDirection=\"column\"\n marginLeft={2}\n marginRight={1}\n paddingTop={1}\n >\n <Box marginBottom={1}>\n <Text color={theme.secondaryText}>Overrides (via env):</Text>\n </Box>\n {process.env.ANTHROPIC_API_KEY && apiKey ? (\n <Text color={theme.secondaryText}>\n \u2022 API Key:{' '}\n <Text bold>sk-ant-\u2026{apiKey!.slice(-width + 25)}</Text>\n </Text>\n ) : null}\n {process.env.DISABLE_PROMPT_CACHING ? (\n <Text color={theme.secondaryText}>\n \u2022 Prompt caching:{' '}\n <Text color={theme.error} bold>\n off\n </Text>\n </Text>\n ) : null}\n {process.env.API_TIMEOUT_MS ? (\n <Text color={theme.secondaryText}>\n \u2022 API timeout:{' '}\n <Text bold>{process.env.API_TIMEOUT_MS}ms</Text>\n </Text>\n ) : null}\n {process.env.MAX_THINKING_TOKENS ? (\n <Text color={theme.secondaryText}>\n \u2022 Max thinking tokens:{' '}\n <Text bold>{process.env.MAX_THINKING_TOKENS}</Text>\n </Text>\n ) : null}\n {process.env.ANTHROPIC_BASE_URL ? (\n <Text color={theme.secondaryText}>\n \u2022 API Base URL:{' '}\n <Text bold>{process.env.ANTHROPIC_BASE_URL}</Text>\n </Text>\n ) : null}\n </Box>\n )}\n </>\n {mcpClients.length ? (\n <Box\n borderColor={theme.secondaryBorder}\n borderStyle=\"single\"\n borderBottom={false}\n borderLeft={false}\n borderRight={false}\n borderTop={true}\n flexDirection=\"column\"\n marginLeft={2}\n marginRight={1}\n paddingTop={1}\n >\n <Box marginBottom={1}>\n <Text color={theme.secondaryText}>MCP Servers:</Text>\n </Box>\n {mcpClients.map((client, idx) => (\n <Box key={idx} width={width - 6}>\n <Text color={theme.secondaryText}>\u2022 {client.name}</Text>\n <Box flexGrow={1} />\n <Text\n bold\n color={\n client.type === 'connected' ? theme.success : theme.error\n }\n >\n {client.type === 'connected' ? 'connected' : 'failed'}\n </Text>\n </Box>\n ))}\n </Box>\n ) : null}\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/components/messages/AssistantToolUseMessage.tsx"],
|
|
4
|
-
"sourcesContent": ["import { Box, Text } from 'ink'\nimport React from 'react'\nimport { logError } from '../../utils/log'\nimport { ToolUseBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Tool } from '../../Tool'\nimport { Cost } from '../Cost'\nimport { ToolUseLoader } from '../ToolUseLoader'\nimport { getTheme } from '../../utils/theme'\nimport { BLACK_CIRCLE } from '../../constants/figures'\nimport { ThinkTool } from '../../tools/ThinkTool/ThinkTool'\nimport { AssistantThinkingMessage } from './AssistantThinkingMessage'\nimport { TaskToolMessage } from './TaskToolMessage'\n\ntype Props = {\n param: ToolUseBlockParam\n costUSD: number\n durationMs: number\n addMargin: boolean\n tools: Tool[]\n debug: boolean\n verbose: boolean\n erroredToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n unresolvedToolUseIDs: Set<string>\n shouldAnimate: boolean\n shouldShowDot: boolean\n}\n\nexport function AssistantToolUseMessage({\n param,\n costUSD,\n durationMs,\n addMargin,\n tools,\n debug,\n verbose,\n erroredToolUseIDs,\n inProgressToolUseIDs,\n unresolvedToolUseIDs,\n shouldAnimate,\n shouldShowDot,\n}: Props): React.ReactNode {\n const tool = tools.find(_ => _.name === param.name)\n if (!tool) {\n logError(`Tool ${param.name} not found`)\n return null\n }\n const isQueued =\n !inProgressToolUseIDs.has(param.id) && unresolvedToolUseIDs.has(param.id)\n // Keeping color undefined makes the OS use the default color regardless of appearance\n const color = isQueued ? getTheme().secondaryText : undefined\n\n //
|
|
5
|
-
"mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,OAAO,WAAW;AAClB,SAAS,gBAAgB;AAGzB,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,gCAAgC;AACzC,SAAS,uBAAuB;AAiBzB,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,OAAO,MAAM,KAAK,OAAK,EAAE,SAAS,MAAM,IAAI;AAClD,MAAI,CAAC,MAAM;AACT,aAAS,QAAQ,MAAM,IAAI,YAAY;AACvC,WAAO;AAAA,EACT;AACA,QAAM,WACJ,CAAC,qBAAqB,IAAI,MAAM,EAAE,KAAK,qBAAqB,IAAI,MAAM,EAAE;AAE1E,QAAM,QAAQ,WAAW,SAAS,EAAE,gBAAgB;AAGpD,MAAI,SAAS,WAAW;
|
|
4
|
+
"sourcesContent": ["import { Box, Text } from 'ink'\nimport React from 'react'\nimport { logError } from '../../utils/log'\nimport { ToolUseBlockParam } from '@anthropic-ai/sdk/resources/index.mjs'\nimport { Tool } from '../../Tool'\nimport { Cost } from '../Cost'\nimport { ToolUseLoader } from '../ToolUseLoader'\nimport { getTheme } from '../../utils/theme'\nimport { BLACK_CIRCLE } from '../../constants/figures'\nimport { ThinkTool } from '../../tools/ThinkTool/ThinkTool'\nimport { AssistantThinkingMessage } from './AssistantThinkingMessage'\nimport { TaskToolMessage } from './TaskToolMessage'\n\ntype Props = {\n param: ToolUseBlockParam\n costUSD: number\n durationMs: number\n addMargin: boolean\n tools: Tool[]\n debug: boolean\n verbose: boolean\n erroredToolUseIDs: Set<string>\n inProgressToolUseIDs: Set<string>\n unresolvedToolUseIDs: Set<string>\n shouldAnimate: boolean\n shouldShowDot: boolean\n}\n\nexport function AssistantToolUseMessage({\n param,\n costUSD,\n durationMs,\n addMargin,\n tools,\n debug,\n verbose,\n erroredToolUseIDs,\n inProgressToolUseIDs,\n unresolvedToolUseIDs,\n shouldAnimate,\n shouldShowDot,\n}: Props): React.ReactNode {\n const tool = tools.find(_ => _.name === param.name)\n if (!tool) {\n logError(`Tool ${param.name} not found`)\n return null\n }\n const isQueued =\n !inProgressToolUseIDs.has(param.id) && unresolvedToolUseIDs.has(param.id)\n // Keeping color undefined makes the OS use the default color regardless of appearance\n const color = isQueued ? getTheme().secondaryText : undefined\n\n // Handle thinking tool with specialized rendering\n if (tool === ThinkTool) {\n const { thought } = ThinkTool.inputSchema.parse(param.input)\n return (\n <AssistantThinkingMessage\n param={{ thinking: thought, signature: '', type: 'thinking' }}\n addMargin={addMargin}\n />\n )\n }\n\n const userFacingToolName = tool.userFacingName ? tool.userFacingName() : tool.name\n return (\n <Box\n flexDirection=\"row\"\n justifyContent=\"space-between\"\n marginTop={addMargin ? 1 : 0}\n width=\"100%\"\n >\n <Box>\n <Box\n flexWrap=\"nowrap\"\n minWidth={userFacingToolName.length + (shouldShowDot ? 2 : 0)}\n >\n {shouldShowDot &&\n (isQueued ? (\n <Box minWidth={2}>\n <Text color={color}>{BLACK_CIRCLE}</Text>\n </Box>\n ) : (\n <ToolUseLoader\n shouldAnimate={shouldAnimate}\n isUnresolved={unresolvedToolUseIDs.has(param.id)}\n isError={erroredToolUseIDs.has(param.id)}\n />\n ))}\n {tool.name === 'Task' && param.input ? (\n <TaskToolMessage\n agentType={String((param.input as any).subagent_type || 'general-purpose')}\n bold={Boolean(!isQueued)}\n children={String(userFacingToolName || '')}\n />\n ) : (\n <Text color={color} bold={!isQueued}>\n {userFacingToolName}\n </Text>\n )}\n </Box>\n <Box flexWrap=\"nowrap\">\n {Object.keys(param.input as { [key: string]: unknown }).length > 0 &&\n (() => {\n const toolMessage = tool.renderToolUseMessage(\n param.input as never,\n {\n verbose,\n },\n )\n\n // If the tool returns a React component, render it directly\n if (React.isValidElement(toolMessage)) {\n return (\n <Box flexDirection=\"row\">\n <Text color={color}>(</Text>\n {toolMessage}\n <Text color={color}>)</Text>\n </Box>\n )\n }\n\n // If it's a string, wrap it in Text\n return <Text color={color}>({toolMessage})</Text>\n })()}\n <Text color={color}>\u2026</Text>\n </Box>\n </Box>\n <Cost costUSD={costUSD} durationMs={durationMs} debug={debug} />\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,KAAK,YAAY;AAC1B,OAAO,WAAW;AAClB,SAAS,gBAAgB;AAGzB,SAAS,YAAY;AACrB,SAAS,qBAAqB;AAC9B,SAAS,gBAAgB;AACzB,SAAS,oBAAoB;AAC7B,SAAS,iBAAiB;AAC1B,SAAS,gCAAgC;AACzC,SAAS,uBAAuB;AAiBzB,SAAS,wBAAwB;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,OAAO,MAAM,KAAK,OAAK,EAAE,SAAS,MAAM,IAAI;AAClD,MAAI,CAAC,MAAM;AACT,aAAS,QAAQ,MAAM,IAAI,YAAY;AACvC,WAAO;AAAA,EACT;AACA,QAAM,WACJ,CAAC,qBAAqB,IAAI,MAAM,EAAE,KAAK,qBAAqB,IAAI,MAAM,EAAE;AAE1E,QAAM,QAAQ,WAAW,SAAS,EAAE,gBAAgB;AAGpD,MAAI,SAAS,WAAW;AACtB,UAAM,EAAE,QAAQ,IAAI,UAAU,YAAY,MAAM,MAAM,KAAK;AAC3D,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAO,EAAE,UAAU,SAAS,WAAW,IAAI,MAAM,WAAW;AAAA,QAC5D;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,QAAM,qBAAqB,KAAK,iBAAiB,KAAK,eAAe,IAAI,KAAK;AAC9E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,gBAAe;AAAA,MACf,WAAW,YAAY,IAAI;AAAA,MAC3B,OAAM;AAAA;AAAA,IAEN,oCAAC,WACC;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,UAAU,mBAAmB,UAAU,gBAAgB,IAAI;AAAA;AAAA,MAE1D,kBACE,WACC,oCAAC,OAAI,UAAU,KACb,oCAAC,QAAK,SAAe,YAAa,CACpC,IAEA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,cAAc,qBAAqB,IAAI,MAAM,EAAE;AAAA,UAC/C,SAAS,kBAAkB,IAAI,MAAM,EAAE;AAAA;AAAA,MACzC;AAAA,MAEH,KAAK,SAAS,UAAU,MAAM,QAC7B;AAAA,QAAC;AAAA;AAAA,UACC,WAAW,OAAQ,MAAM,MAAc,iBAAiB,iBAAiB;AAAA,UACzE,MAAM,QAAQ,CAAC,QAAQ;AAAA,UACvB,UAAU,OAAO,sBAAsB,EAAE;AAAA;AAAA,MAC3C,IAEA,oCAAC,QAAK,OAAc,MAAM,CAAC,YACxB,kBACH;AAAA,IAEJ,GACA,oCAAC,OAAI,UAAS,YACX,OAAO,KAAK,MAAM,KAAmC,EAAE,SAAS,MAC9D,MAAM;AACL,YAAM,cAAc,KAAK;AAAA,QACvB,MAAM;AAAA,QACN;AAAA,UACE;AAAA,QACF;AAAA,MACF;AAGA,UAAI,MAAM,eAAe,WAAW,GAAG;AACrC,eACE,oCAAC,OAAI,eAAc,SACjB,oCAAC,QAAK,SAAc,GAAC,GACpB,aACD,oCAAC,QAAK,SAAc,GAAC,CACvB;AAAA,MAEJ;AAGA,aAAO,oCAAC,QAAK,SAAc,KAAE,aAAY,GAAC;AAAA,IAC5C,GAAG,GACL,oCAAC,QAAK,SAAc,QAAC,CACvB,CACF;AAAA,IACA,oCAAC,QAAK,SAAkB,YAAwB,OAAc;AAAA,EAChE;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/entrypoints/cli.js
CHANGED
|
@@ -102,9 +102,9 @@ async function showSetupScreens(safeMode, print) {
|
|
|
102
102
|
const config = getGlobalConfig();
|
|
103
103
|
if (!config.theme || !config.hasCompletedOnboarding) {
|
|
104
104
|
await clearTerminal();
|
|
105
|
-
const { render
|
|
105
|
+
const { render } = await import("ink");
|
|
106
106
|
await new Promise((resolve) => {
|
|
107
|
-
|
|
107
|
+
render(
|
|
108
108
|
/* @__PURE__ */ React.createElement(
|
|
109
109
|
Onboarding,
|
|
110
110
|
{
|
|
@@ -128,9 +128,12 @@ async function showSetupScreens(safeMode, print) {
|
|
|
128
128
|
grantReadPermissionForOriginalDir();
|
|
129
129
|
resolve();
|
|
130
130
|
};
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
131
|
+
(async () => {
|
|
132
|
+
const { render } = await import("ink");
|
|
133
|
+
render(/* @__PURE__ */ React.createElement(TrustDialog, { onDone }), {
|
|
134
|
+
exitOnCtrlC: false
|
|
135
|
+
});
|
|
136
|
+
})();
|
|
134
137
|
});
|
|
135
138
|
}
|
|
136
139
|
if (process.env.USER_TYPE === "ant") {
|
|
@@ -196,7 +199,11 @@ async function setup(cwd2, safeMode) {
|
|
|
196
199
|
if (autoUpdaterStatus === "not_configured") {
|
|
197
200
|
logEvent("tengu_setup_auto_updater_not_configured", {});
|
|
198
201
|
await new Promise((resolve) => {
|
|
199
|
-
|
|
202
|
+
;
|
|
203
|
+
(async () => {
|
|
204
|
+
const { render } = await import("ink");
|
|
205
|
+
render(/* @__PURE__ */ React.createElement(Doctor, { onDone: () => resolve() }));
|
|
206
|
+
})();
|
|
200
207
|
});
|
|
201
208
|
}
|
|
202
209
|
}
|
|
@@ -322,9 +329,9 @@ ${commandList}`
|
|
|
322
329
|
return { version: null, commands: null };
|
|
323
330
|
})();
|
|
324
331
|
{
|
|
325
|
-
const { render
|
|
332
|
+
const { render } = await import("ink");
|
|
326
333
|
const { REPL } = await import("../screens/REPL.js");
|
|
327
|
-
|
|
334
|
+
render(
|
|
328
335
|
/* @__PURE__ */ React.createElement(
|
|
329
336
|
REPL,
|
|
330
337
|
{
|
|
@@ -726,7 +733,7 @@ ${commandList}`
|
|
|
726
733
|
const reactModule = await import("react");
|
|
727
734
|
const inkjsui = await import("@inkjs/ui");
|
|
728
735
|
const utilsTheme = await import("../utils/theme.js");
|
|
729
|
-
const { render
|
|
736
|
+
const { render } = ink;
|
|
730
737
|
const React2 = reactModule;
|
|
731
738
|
const { MultiSelect } = inkjsui;
|
|
732
739
|
const { Box, Text } = ink;
|
|
@@ -823,7 +830,7 @@ ${commandList}`
|
|
|
823
830
|
))
|
|
824
831
|
), /* @__PURE__ */ React2.createElement(Box, { marginTop: 0, marginLeft: 3 }, /* @__PURE__ */ React2.createElement(Text, { dimColor: true }, "Space to select \xB7 Enter to confirm \xB7 Esc to cancel")), isFinished && /* @__PURE__ */ React2.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React2.createElement(Text, { color: theme.success }, "Successfully imported", " ", importResults.filter((r) => r.success).length, " MCP server to local config.")));
|
|
825
832
|
}
|
|
826
|
-
const { unmount } =
|
|
833
|
+
const { unmount } = render(/* @__PURE__ */ React2.createElement(ClaudeDesktopImport, null));
|
|
827
834
|
setTimeout(() => {
|
|
828
835
|
unmount();
|
|
829
836
|
resolve();
|
|
@@ -865,7 +872,11 @@ ${commandList}`
|
|
|
865
872
|
program.command("doctor").description(`Check the health of your ${PRODUCT_NAME} auto-updater`).action(async () => {
|
|
866
873
|
logEvent("tengu_doctor_command", {});
|
|
867
874
|
await new Promise((resolve) => {
|
|
868
|
-
|
|
875
|
+
;
|
|
876
|
+
(async () => {
|
|
877
|
+
const { render } = await import("ink");
|
|
878
|
+
render(/* @__PURE__ */ React.createElement(Doctor, { onDone: () => resolve(), doctorMode: true }));
|
|
879
|
+
})();
|
|
869
880
|
});
|
|
870
881
|
process.exit(0);
|
|
871
882
|
});
|
|
@@ -900,11 +911,14 @@ ${commandList}`
|
|
|
900
911
|
await setup(cwd2, false);
|
|
901
912
|
logEvent("tengu_view_logs", { number: number?.toString() ?? "" });
|
|
902
913
|
const context2 = {};
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
914
|
+
(async () => {
|
|
915
|
+
const { render } = await import("ink");
|
|
916
|
+
const { unmount } = render(
|
|
917
|
+
/* @__PURE__ */ React.createElement(LogList, { context: context2, type: "messages", logNumber: number }),
|
|
918
|
+
renderContextWithExitOnCtrlC
|
|
919
|
+
);
|
|
920
|
+
context2.unmount = unmount;
|
|
921
|
+
})();
|
|
908
922
|
});
|
|
909
923
|
program.command("resume").description(
|
|
910
924
|
"Resume a previous conversation. Optionally provide a number (0, 1, 2, etc.) or file path to resume a specific conversation."
|
|
@@ -954,9 +968,9 @@ ${commandList}`
|
|
|
954
968
|
const fork = getNextAvailableLogForkNumber(date, forkNumber ?? 1, 0);
|
|
955
969
|
const isDefaultModel = await isDefaultSlowAndCapableModel();
|
|
956
970
|
{
|
|
957
|
-
const { render
|
|
971
|
+
const { render } = await import("ink");
|
|
958
972
|
const { REPL } = await import("../screens/REPL.js");
|
|
959
|
-
|
|
973
|
+
render(
|
|
960
974
|
/* @__PURE__ */ React.createElement(
|
|
961
975
|
REPL,
|
|
962
976
|
{
|
|
@@ -982,20 +996,23 @@ ${commandList}`
|
|
|
982
996
|
}
|
|
983
997
|
} else {
|
|
984
998
|
const context2 = {};
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
+
(async () => {
|
|
1000
|
+
const { render } = await import("ink");
|
|
1001
|
+
const { unmount } = render(
|
|
1002
|
+
/* @__PURE__ */ React.createElement(
|
|
1003
|
+
ResumeConversation,
|
|
1004
|
+
{
|
|
1005
|
+
context: context2,
|
|
1006
|
+
commands: commands2,
|
|
1007
|
+
logs,
|
|
1008
|
+
tools,
|
|
1009
|
+
verbose
|
|
1010
|
+
}
|
|
1011
|
+
),
|
|
1012
|
+
renderContextWithExitOnCtrlC
|
|
1013
|
+
);
|
|
1014
|
+
context2.unmount = unmount;
|
|
1015
|
+
})();
|
|
999
1016
|
}
|
|
1000
1017
|
});
|
|
1001
1018
|
program.command("error").description(
|
|
@@ -1008,11 +1025,14 @@ ${commandList}`
|
|
|
1008
1025
|
await setup(cwd2, false);
|
|
1009
1026
|
logEvent("tengu_view_errors", { number: number?.toString() ?? "" });
|
|
1010
1027
|
const context2 = {};
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1028
|
+
(async () => {
|
|
1029
|
+
const { render } = await import("ink");
|
|
1030
|
+
const { unmount } = render(
|
|
1031
|
+
/* @__PURE__ */ React.createElement(LogList, { context: context2, type: "errors", logNumber: number }),
|
|
1032
|
+
renderContextWithExitOnCtrlC
|
|
1033
|
+
);
|
|
1034
|
+
context2.unmount = unmount;
|
|
1035
|
+
})();
|
|
1016
1036
|
});
|
|
1017
1037
|
const context = program.command("context").description(
|
|
1018
1038
|
`Set static context (eg. ${PRODUCT_COMMAND} context add-file ./src/*.py)`
|