@timetotest/cli 0.2.2 → 0.2.4
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 +3 -3
- package/dist/bin/ttt.js +1 -5
- package/dist/bin/ttt.js.map +1 -1
- package/dist/package.json +8 -5
- package/dist/src/commands/chat/ChatApp.js +91 -37
- package/dist/src/commands/chat/ChatApp.js.map +1 -1
- package/dist/src/commands/chat/components/AssistantResponse.js +8 -0
- package/dist/src/commands/chat/components/AssistantResponse.js.map +1 -0
- package/dist/src/commands/chat/components/Banner.js +23 -0
- package/dist/src/commands/chat/components/Banner.js.map +1 -0
- package/dist/src/commands/chat/components/ChatInput.js +95 -0
- package/dist/src/commands/chat/components/ChatInput.js.map +1 -0
- package/dist/src/commands/chat/components/MessageBubble.js +9 -0
- package/dist/src/commands/chat/components/MessageBubble.js.map +1 -0
- package/dist/src/commands/chat/components/StatusIndicator.js +11 -0
- package/dist/src/commands/chat/components/StatusIndicator.js.map +1 -0
- package/dist/src/commands/chat-ink.js +122 -19
- package/dist/src/commands/chat-ink.js.map +1 -1
- package/dist/src/commands/start-test.js +127 -34
- package/dist/src/commands/start-test.js.map +1 -1
- package/dist/src/commands/stream/StreamApp.js +127 -0
- package/dist/src/commands/stream/StreamApp.js.map +1 -0
- package/dist/src/commands/stream.js +43 -8
- package/dist/src/commands/stream.js.map +1 -1
- package/dist/src/commands/test/TestRunApp.js +183 -0
- package/dist/src/commands/test/TestRunApp.js.map +1 -0
- package/dist/src/commands/test.js +236 -25
- package/dist/src/commands/test.js.map +1 -1
- package/dist/src/lib/agent-orchestrator.js +9 -81
- package/dist/src/lib/agent-orchestrator.js.map +1 -1
- package/dist/src/lib/api-types.js +2 -0
- package/dist/src/lib/api-types.js.map +1 -0
- package/dist/src/lib/events.js +0 -3
- package/dist/src/lib/events.js.map +1 -1
- package/dist/src/lib/http.js +4 -5
- package/dist/src/lib/http.js.map +1 -1
- package/dist/src/lib/local-tools/ui/playwright-mcp.js +1 -1
- package/dist/src/lib/socket.js +1 -19
- package/dist/src/lib/socket.js.map +1 -1
- package/dist/src/lib/tool-descriptions.js +2 -2
- package/dist/src/lib/tool-descriptions.js.map +1 -1
- package/dist/src/lib/tool-executor.js +0 -1
- package/dist/src/lib/tool-executor.js.map +1 -1
- package/dist/src/lib/tui/ink/theme.js +21 -0
- package/dist/src/lib/tui/ink/theme.js.map +1 -0
- package/package.json +8 -5
- package/dist/src/commands/ask/AskApp.js +0 -121
- package/dist/src/commands/ask/AskApp.js.map +0 -1
- package/dist/src/commands/ask/components/AssistantResponse.js +0 -31
- package/dist/src/commands/ask/components/AssistantResponse.js.map +0 -1
- package/dist/src/commands/ask/components/Banner.js +0 -15
- package/dist/src/commands/ask/components/Banner.js.map +0 -1
- package/dist/src/commands/ask/components/ChatInput.js +0 -93
- package/dist/src/commands/ask/components/ChatInput.js.map +0 -1
- package/dist/src/commands/ask/components/Divider.js +0 -17
- package/dist/src/commands/ask/components/Divider.js.map +0 -1
- package/dist/src/commands/ask/components/IntroTips.js +0 -19
- package/dist/src/commands/ask/components/IntroTips.js.map +0 -1
- package/dist/src/commands/ask/components/MessageBubble.js +0 -47
- package/dist/src/commands/ask/components/MessageBubble.js.map +0 -1
- package/dist/src/commands/ask/components/SessionInfo.js +0 -20
- package/dist/src/commands/ask/components/SessionInfo.js.map +0 -1
- package/dist/src/commands/ask/components/StatusIndicator.js +0 -67
- package/dist/src/commands/ask/components/StatusIndicator.js.map +0 -1
- package/dist/src/commands/ask-ink.js +0 -380
- package/dist/src/commands/ask-ink.js.map +0 -1
- package/dist/src/commands/ask.js +0 -991
- package/dist/src/commands/ask.js.map +0 -1
- package/dist/src/commands/chat.js +0 -82
- package/dist/src/commands/chat.js.map +0 -1
- package/dist/src/lib/legacy-chat-runner.js +0 -37
- package/dist/src/lib/legacy-chat-runner.js.map +0 -1
- package/dist/src/lib/local-tools/ui/click-element.js +0 -105
- package/dist/src/lib/local-tools/ui/click-element.js.map +0 -1
- package/dist/src/lib/local-tools/ui/dom-rag.js +0 -201
- package/dist/src/lib/local-tools/ui/dom-rag.js.map +0 -1
- package/dist/src/lib/local-tools/ui/find-element.js +0 -31
- package/dist/src/lib/local-tools/ui/find-element.js.map +0 -1
- package/dist/src/lib/local-tools/ui/hover-element.js +0 -94
- package/dist/src/lib/local-tools/ui/hover-element.js.map +0 -1
- package/dist/src/lib/local-tools/ui/manage-tab.js +0 -65
- package/dist/src/lib/local-tools/ui/manage-tab.js.map +0 -1
- package/dist/src/lib/local-tools/ui/navigate.js +0 -35
- package/dist/src/lib/local-tools/ui/navigate.js.map +0 -1
- package/dist/src/lib/local-tools/ui/page-discovery.js +0 -32
- package/dist/src/lib/local-tools/ui/page-discovery.js.map +0 -1
- package/dist/src/lib/local-tools/ui/screenshot.js +0 -19
- package/dist/src/lib/local-tools/ui/screenshot.js.map +0 -1
- package/dist/src/lib/local-tools/ui/search-interactive-elements.js +0 -18
- package/dist/src/lib/local-tools/ui/search-interactive-elements.js.map +0 -1
- package/dist/src/lib/local-tools/ui/selector-resolver.js +0 -153
- package/dist/src/lib/local-tools/ui/selector-resolver.js.map +0 -1
- package/dist/src/lib/local-tools/ui/type-text.js +0 -40
- package/dist/src/lib/local-tools/ui/type-text.js.map +0 -1
- package/dist/src/lib/tui/components/AskIntro.js +0 -6
- package/dist/src/lib/tui/components/AskIntro.js.map +0 -1
- package/dist/src/lib/tui/components/Banner.js +0 -15
- package/dist/src/lib/tui/components/Banner.js.map +0 -1
- package/dist/src/lib/tui/components/Divider.js +0 -17
- package/dist/src/lib/tui/components/Divider.js.map +0 -1
- package/dist/src/lib/tui/components/EventLine.js +0 -110
- package/dist/src/lib/tui/components/EventLine.js.map +0 -1
- package/dist/src/lib/tui/components/Header.js +0 -15
- package/dist/src/lib/tui/components/Header.js.map +0 -1
- package/dist/src/lib/tui/components/InputBox.js +0 -9
- package/dist/src/lib/tui/components/InputBox.js.map +0 -1
- package/dist/src/lib/tui/components/Mapping.js +0 -8
- package/dist/src/lib/tui/components/Mapping.js.map +0 -1
- package/dist/src/lib/tui/components/ProjectList.js +0 -6
- package/dist/src/lib/tui/components/ProjectList.js.map +0 -1
- package/dist/src/lib/tui/components/Spinner.js +0 -20
- package/dist/src/lib/tui/components/Spinner.js.map +0 -1
- package/dist/src/lib/tui/components/StatusBanner.js +0 -12
- package/dist/src/lib/tui/components/StatusBanner.js.map +0 -1
- package/dist/src/lib/tui/components/StatusBar.js +0 -11
- package/dist/src/lib/tui/components/StatusBar.js.map +0 -1
- package/dist/src/lib/tui/components/UserBubble.js +0 -6
- package/dist/src/lib/tui/components/UserBubble.js.map +0 -1
- package/dist/src/lib/tui/components/index.js +0 -16
- package/dist/src/lib/tui/components/index.js.map +0 -1
- package/dist/src/lib/tui/ink-print.js +0 -41
- package/dist/src/lib/tui/ink-print.js.map +0 -1
- package/dist/src/test-agent-flow.js +0 -148
- package/dist/src/test-agent-flow.js.map +0 -1
- package/dist/src/test-browser-session.js +0 -152
- package/dist/src/test-browser-session.js.map +0 -1
- package/dist/src/test-browser-snapshot.js +0 -187
- package/dist/src/test-browser-snapshot.js.map +0 -1
- package/dist/src/test-snapshot-detailed.js +0 -219
- package/dist/src/test-snapshot-detailed.js.map +0 -1
- package/dist/src/test-snapshot-simple.js +0 -85
- package/dist/src/test-snapshot-simple.js.map +0 -1
- package/dist/src/test-snapshot-tabs.js +0 -110
- package/dist/src/test-snapshot-tabs.js.map +0 -1
package/README.md
CHANGED
|
@@ -22,11 +22,11 @@ The CLI launches an AI testing agent that plans and executes tests based on your
|
|
|
22
22
|
```bash
|
|
23
23
|
npm install -g @timetotest/cli
|
|
24
24
|
|
|
25
|
-
# Start an interactive session
|
|
25
|
+
# Start an interactive local session (default)
|
|
26
26
|
ttt
|
|
27
27
|
|
|
28
|
-
#
|
|
29
|
-
ttt test
|
|
28
|
+
# Run a cloud test with a prompt (automatically handles tunnels & project context)
|
|
29
|
+
ttt test "Smoke test the login flow" --url http://localhost:3000
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
## What makes this different
|
package/dist/bin/ttt.js
CHANGED
|
@@ -8,8 +8,6 @@ import { restart } from "../src/commands/restart.js";
|
|
|
8
8
|
import { stream } from "../src/commands/stream.js";
|
|
9
9
|
import { report } from "../src/commands/report.js";
|
|
10
10
|
import { share } from "../src/commands/share.js";
|
|
11
|
-
import { askInk as ask } from "../src/commands/ask-ink.js";
|
|
12
|
-
import { startTest } from "../src/commands/start-test.js";
|
|
13
11
|
import { applyStyledHelpRecursively } from "../src/lib/help.js";
|
|
14
12
|
import { promptForUpdateIfAvailable } from "../src/lib/update.js";
|
|
15
13
|
import { chatInk as chat } from "../src/commands/chat-ink.js";
|
|
@@ -23,12 +21,10 @@ program.addCommand(restart);
|
|
|
23
21
|
program.addCommand(stream);
|
|
24
22
|
program.addCommand(report);
|
|
25
23
|
program.addCommand(share);
|
|
26
|
-
program.addCommand(ask);
|
|
27
|
-
program.addCommand(startTest);
|
|
28
24
|
program.addCommand(chat);
|
|
29
25
|
applyStyledHelpRecursively(program, "ttt");
|
|
30
26
|
await promptForUpdateIfAvailable();
|
|
31
|
-
// Default to `
|
|
27
|
+
// Default to `chat` (local mode) when no subcommand is provided
|
|
32
28
|
if (process.argv.length <= 2) {
|
|
33
29
|
process.argv.push("chat");
|
|
34
30
|
}
|
package/dist/bin/ttt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ttt.js","sourceRoot":"","sources":["../../bin/ttt.ts"],"names":[],"mappings":";AACA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAClC,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAM,IAAI,EAAE,MAAM,EAAC,CAAC;AAC9D,OAAO,EAAC,KAAK,EAAC,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAC,IAAI,EAAC,MAAM,yBAAyB,CAAC;AAC7C,OAAO,EAAC,MAAM,EAAC,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAC,OAAO,EAAC,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAC,MAAM,EAAC,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAC,MAAM,EAAC,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAC,KAAK,EAAC,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"ttt.js","sourceRoot":"","sources":["../../bin/ttt.ts"],"names":[],"mappings":";AACA,OAAO,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAClC,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAM,IAAI,EAAE,MAAM,EAAC,CAAC;AAC9D,OAAO,EAAC,KAAK,EAAC,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAC,IAAI,EAAC,MAAM,yBAAyB,CAAC;AAC7C,OAAO,EAAC,MAAM,EAAC,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAC,OAAO,EAAC,MAAM,4BAA4B,CAAC;AACnD,OAAO,EAAC,MAAM,EAAC,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAC,MAAM,EAAC,MAAM,2BAA2B,CAAC;AACjD,OAAO,EAAC,KAAK,EAAC,MAAM,0BAA0B,CAAC;AAG/C,OAAO,EAAC,0BAA0B,EAAC,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAC,0BAA0B,EAAC,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAC,OAAO,IAAI,IAAI,EAAC,MAAM,6BAA6B,CAAC;AAE5D,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;AAC1D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAExE,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAC1B,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACzB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3B,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAC5B,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3B,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC3B,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAE1B,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AAEzB,0BAA0B,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAE3C,MAAM,0BAA0B,EAAE,CAAC;AACnC,gEAAgE;AAChE,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AACD,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@timetotest/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.4",
|
|
4
4
|
"description": "Time to Test CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -12,15 +12,18 @@
|
|
|
12
12
|
"LICENSE"
|
|
13
13
|
],
|
|
14
14
|
"scripts": {
|
|
15
|
-
"dev": "node dist/bin/ttt.js",
|
|
15
|
+
"dev": "npm run build && node dist/bin/ttt.js",
|
|
16
16
|
"build": "tsc --project tsconfig.json",
|
|
17
17
|
"clean": "rm -rf dist",
|
|
18
|
-
"prepublishOnly": "npm run
|
|
18
|
+
"prepublishOnly": "npm run clean && npm run build",
|
|
19
19
|
"version:patch": "npm version patch -m 'chore(release): %s'",
|
|
20
20
|
"version:minor": "npm version minor -m 'chore(release): %s'",
|
|
21
21
|
"version:major": "npm version major -m 'chore(release): %s'",
|
|
22
|
-
"
|
|
23
|
-
"
|
|
22
|
+
"version:dev": "npm version prerelease --preid dev -m 'chore(release): %s'",
|
|
23
|
+
"publish": "node scripts/publish.mjs",
|
|
24
|
+
"publish:dev": "node scripts/publish.mjs --channel dev",
|
|
25
|
+
"publish:prod": "node scripts/publish.mjs --channel prod",
|
|
26
|
+
"upgrade-and-push": "npm run version:patch && git push && git push --tags && npm run publish"
|
|
24
27
|
},
|
|
25
28
|
"publishConfig": {
|
|
26
29
|
"access": "public"
|
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
import React, { useState, useEffect } from "react";
|
|
2
|
-
import { Box, Text, useApp } from "ink";
|
|
2
|
+
import { Box, Text, useApp, Static } from "ink";
|
|
3
3
|
import os from "node:os";
|
|
4
|
-
import { Banner } from "
|
|
5
|
-
import { ChatInput } from "
|
|
6
|
-
import { MessageBubble } from "
|
|
7
|
-
import { AssistantResponse } from "
|
|
8
|
-
import { StatusIndicator } from "
|
|
4
|
+
import { Banner } from "./components/Banner.js";
|
|
5
|
+
import { ChatInput } from "./components/ChatInput.js";
|
|
6
|
+
import { MessageBubble } from "./components/MessageBubble.js";
|
|
7
|
+
import { AssistantResponse } from "./components/AssistantResponse.js";
|
|
8
|
+
import { StatusIndicator } from "./components/StatusIndicator.js";
|
|
9
9
|
export const ChatApp = ({ user, context, slashCommands, onUserMessage, onSlashCommand, onExit, onCancel, initialMessages = [], }) => {
|
|
10
|
+
// Single source of truth: `slashCommands` comes from `chat-ink.ts`.
|
|
11
|
+
const allSlashCommands = slashCommands;
|
|
10
12
|
const { exit } = useApp();
|
|
11
|
-
|
|
13
|
+
// Initialize messages with banner if empty
|
|
14
|
+
const [messages, setMessages] = useState(() => {
|
|
15
|
+
if (initialMessages.length > 0)
|
|
16
|
+
return initialMessages;
|
|
17
|
+
return [{
|
|
18
|
+
id: "banner",
|
|
19
|
+
type: "banner",
|
|
20
|
+
content: "banner"
|
|
21
|
+
}];
|
|
22
|
+
});
|
|
12
23
|
const [status, setStatus] = useState(null);
|
|
13
|
-
const [showIntro, setShowIntro] = useState(true);
|
|
14
24
|
const [inputDisabled, setInputDisabled] = useState(false);
|
|
15
25
|
const [chatContext, setChatContext] = useState(context);
|
|
16
26
|
// Public methods to update UI from parent
|
|
@@ -18,19 +28,34 @@ export const ChatApp = ({ user, context, slashCommands, onUserMessage, onSlashCo
|
|
|
18
28
|
// Store reference for external updates
|
|
19
29
|
globalThis.__chatAppInterface = {
|
|
20
30
|
addMessage: (message) => {
|
|
21
|
-
|
|
31
|
+
try {
|
|
32
|
+
setMessages((prev) => [...prev, message]);
|
|
33
|
+
}
|
|
34
|
+
catch { }
|
|
22
35
|
},
|
|
23
36
|
setStatus: (statusMsg) => {
|
|
24
|
-
|
|
37
|
+
try {
|
|
38
|
+
setStatus(statusMsg);
|
|
39
|
+
}
|
|
40
|
+
catch { }
|
|
25
41
|
},
|
|
26
42
|
clearStatus: () => {
|
|
27
|
-
|
|
43
|
+
try {
|
|
44
|
+
setStatus(null);
|
|
45
|
+
}
|
|
46
|
+
catch { }
|
|
28
47
|
},
|
|
29
48
|
setInputDisabled: (disabled) => {
|
|
30
|
-
|
|
49
|
+
try {
|
|
50
|
+
setInputDisabled(disabled);
|
|
51
|
+
}
|
|
52
|
+
catch { }
|
|
31
53
|
},
|
|
32
54
|
updateContext: (newContext) => {
|
|
33
|
-
|
|
55
|
+
try {
|
|
56
|
+
setChatContext((prev) => ({ ...prev, ...newContext }));
|
|
57
|
+
}
|
|
58
|
+
catch { }
|
|
34
59
|
},
|
|
35
60
|
};
|
|
36
61
|
return () => {
|
|
@@ -43,9 +68,9 @@ export const ChatApp = ({ user, context, slashCommands, onUserMessage, onSlashCo
|
|
|
43
68
|
const trimmed = value.trim();
|
|
44
69
|
const normalized = trimmed.toLowerCase();
|
|
45
70
|
// Hide intro after first message
|
|
46
|
-
if (showIntro) {
|
|
47
|
-
|
|
48
|
-
}
|
|
71
|
+
// if (showIntro) {
|
|
72
|
+
// setShowIntro(false);
|
|
73
|
+
// }
|
|
49
74
|
// Check for exit commands
|
|
50
75
|
if (normalized === "exit" || normalized === "quit") {
|
|
51
76
|
exit();
|
|
@@ -55,6 +80,25 @@ export const ChatApp = ({ user, context, slashCommands, onUserMessage, onSlashCo
|
|
|
55
80
|
// Check for slash commands
|
|
56
81
|
if (trimmed.startsWith("/")) {
|
|
57
82
|
const [cmd, ...args] = trimmed.slice(1).split(/\s+/);
|
|
83
|
+
// Handle client-side commands
|
|
84
|
+
if (cmd === "clear") {
|
|
85
|
+
setMessages([
|
|
86
|
+
{
|
|
87
|
+
id: "banner",
|
|
88
|
+
type: "banner",
|
|
89
|
+
content: "banner",
|
|
90
|
+
},
|
|
91
|
+
]);
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (cmd === "config") {
|
|
95
|
+
setMessages(prev => [...prev, {
|
|
96
|
+
id: Date.now().toString(),
|
|
97
|
+
type: "system",
|
|
98
|
+
content: `Current Configuration:\nUser: ${user}\nMode: ${chatContext.mode}\nSession ID: ${chatContext.sessionId}`
|
|
99
|
+
}]);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
58
102
|
const result = await onSlashCommand(cmd, args);
|
|
59
103
|
if (result === "exit") {
|
|
60
104
|
exit();
|
|
@@ -72,14 +116,15 @@ export const ChatApp = ({ user, context, slashCommands, onUserMessage, onSlashCo
|
|
|
72
116
|
await onUserMessage(trimmed);
|
|
73
117
|
};
|
|
74
118
|
const handleCancel = () => {
|
|
75
|
-
console.log("Cancelled — the assistant has stopped. Type whenever you're ready.");
|
|
76
119
|
setInputDisabled(false); // Re-enable input after cancellation
|
|
77
120
|
onCancel?.();
|
|
78
121
|
};
|
|
79
122
|
const getSuggestions = (input) => {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
123
|
+
if (!input.startsWith("/"))
|
|
124
|
+
return [];
|
|
125
|
+
const query = input.toLowerCase();
|
|
126
|
+
return allSlashCommands
|
|
127
|
+
.filter((cmd) => cmd.value.toLowerCase().startsWith(query))
|
|
83
128
|
.map((cmd) => ({
|
|
84
129
|
label: cmd.label,
|
|
85
130
|
value: cmd.value,
|
|
@@ -93,33 +138,42 @@ export const ChatApp = ({ user, context, slashCommands, onUserMessage, onSlashCo
|
|
|
93
138
|
: workspacePath;
|
|
94
139
|
const statusLine = `path: ${displayPath} · mode: ${chatContext.mode}`;
|
|
95
140
|
const footerLines = ["Press ESC to stop"];
|
|
96
|
-
return (React.createElement(Box, { flexDirection: "column"
|
|
97
|
-
|
|
98
|
-
React.createElement(Banner, null),
|
|
99
|
-
React.createElement(Box, { marginBottom: 1 },
|
|
100
|
-
React.createElement(Text, null,
|
|
101
|
-
React.createElement(Text, { dimColor: true }, "\u2022"),
|
|
102
|
-
React.createElement(Text, null, " "),
|
|
103
|
-
React.createElement(Text, { color: "gray" }, "Signed in as"),
|
|
104
|
-
React.createElement(Text, null, " "),
|
|
105
|
-
React.createElement(Text, { color: "white" }, user))))),
|
|
106
|
-
messages.map((message, index) => {
|
|
141
|
+
return (React.createElement(Box, { flexDirection: "column" },
|
|
142
|
+
React.createElement(Static, { items: messages }, (message, index) => {
|
|
107
143
|
if (message.type === "user") {
|
|
108
144
|
return (React.createElement(Box, { key: message.id },
|
|
109
145
|
React.createElement(MessageBubble, { message: message.content })));
|
|
110
146
|
}
|
|
111
147
|
else if (message.type === "assistant") {
|
|
112
|
-
return (React.createElement(Box, { key: message.id },
|
|
148
|
+
return (React.createElement(Box, { key: message.id, paddingX: 1 },
|
|
113
149
|
React.createElement(AssistantResponse, { content: message.content, isError: message.isError })));
|
|
114
150
|
}
|
|
115
151
|
else if (message.type === "system") {
|
|
116
|
-
return (React.createElement(Box, { key: message.id, marginTop: index === 0 ? 0 : 1 },
|
|
152
|
+
return (React.createElement(Box, { key: message.id, marginTop: index === 0 ? 0 : 1, paddingX: 1 },
|
|
117
153
|
React.createElement(Text, { color: "gray" }, message.content)));
|
|
118
154
|
}
|
|
119
|
-
|
|
155
|
+
else if (message.type === "banner") {
|
|
156
|
+
return (React.createElement(Box, { key: message.id, paddingX: 0, marginBottom: 1 },
|
|
157
|
+
React.createElement(Box, { flexDirection: "column" },
|
|
158
|
+
React.createElement(Banner, { user: user, mode: chatContext.mode, path: displayPath }),
|
|
159
|
+
React.createElement(Box, { marginTop: 1, flexDirection: "column" },
|
|
160
|
+
React.createElement(Text, { color: "gray" }, "To get started, describe a task or try one of these commands:"),
|
|
161
|
+
React.createElement(Box, { marginTop: 1, flexDirection: "column" }, allSlashCommands
|
|
162
|
+
.filter((cmd) => ["/help", "/progress", "/session", "/clear", "/stop"].includes(cmd.value))
|
|
163
|
+
.map(cmd => (React.createElement(Text, { key: cmd.value },
|
|
164
|
+
React.createElement(Text, { color: "white", bold: true }, cmd.label),
|
|
165
|
+
React.createElement(Text, { color: "gray" },
|
|
166
|
+
" \u2013 ",
|
|
167
|
+
cmd.description)))))))));
|
|
168
|
+
}
|
|
169
|
+
return React.createElement(Box, { key: message.id });
|
|
120
170
|
}),
|
|
121
|
-
|
|
122
|
-
React.createElement(StatusIndicator, { message: status.text, type: status.type }))),
|
|
123
|
-
|
|
171
|
+
React.createElement(Box, { flexDirection: "column" },
|
|
172
|
+
React.createElement(Box, { height: 1 }, status ? (React.createElement(StatusIndicator, { message: status.text, type: status.type })) : (React.createElement(Text, null, " "))),
|
|
173
|
+
React.createElement(Box, { height: 1, paddingX: 1 },
|
|
174
|
+
React.createElement(Text, { color: "gray", dimColor: true }, "100% context left")),
|
|
175
|
+
React.createElement(Box, null,
|
|
176
|
+
React.createElement(ChatInput, { placeholder: "Ask anything or use /help for commands", onSubmit: handleSubmit, onCancel: handleCancel, getSuggestions: getSuggestions, disabled: inputDisabled })),
|
|
177
|
+
React.createElement(Box, { height: 1, paddingX: 1 }, footerLines && footerLines.length > 0 ? (React.createElement(Text, { color: "gray", dimColor: true }, footerLines[0])) : (React.createElement(Text, null, " "))))));
|
|
124
178
|
};
|
|
125
179
|
//# sourceMappingURL=ChatApp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatApp.js","sourceRoot":"","sources":["../../../../src/commands/chat/ChatApp.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAC,QAAQ,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AACjD,OAAO,EAAC,GAAG,EAAE,IAAI,EAAE,MAAM,EAAC,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"ChatApp.js","sourceRoot":"","sources":["../../../../src/commands/chat/ChatApp.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
export const AssistantResponse = ({ content, isError }) => {
|
|
4
|
+
return (React.createElement(Box, { marginBottom: 1, flexDirection: "column" },
|
|
5
|
+
React.createElement(Text, { color: isError ? "red" : "green", bold: true }, "Agent:"),
|
|
6
|
+
React.createElement(Text, null, content)));
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=AssistantResponse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AssistantResponse.js","sourceRoot":"","sources":["../../../../../src/commands/chat/components/AssistantResponse.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,GAAG,EAAE,IAAI,EAAC,MAAM,KAAK,CAAC;AAE9B,MAAM,CAAC,MAAM,iBAAiB,GAGzB,CAAC,EAAC,OAAO,EAAE,OAAO,EAAC,EAAE,EAAE;IAC1B,OAAO,CACL,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ;QAC1C,oBAAC,IAAI,IAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,mBAErC;QACP,oBAAC,IAAI,QAAE,OAAO,CAAQ,CAClB,CACP,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Text, Box } from "ink";
|
|
3
|
+
export const Banner = ({ user, mode, path, version = "v0.63.0" }) => {
|
|
4
|
+
return (React.createElement(Box, { borderStyle: "round", borderColor: "gray", paddingX: 1, flexDirection: "column", marginBottom: 1 },
|
|
5
|
+
React.createElement(Box, { marginBottom: 1 },
|
|
6
|
+
React.createElement(Text, { color: "gray" },
|
|
7
|
+
">_ ",
|
|
8
|
+
React.createElement(Text, { color: "white", bold: true }, "TimetoTest CLI"),
|
|
9
|
+
" ",
|
|
10
|
+
React.createElement(Text, { color: "gray" },
|
|
11
|
+
"(",
|
|
12
|
+
version,
|
|
13
|
+
")"))),
|
|
14
|
+
React.createElement(Box, null,
|
|
15
|
+
React.createElement(Text, { color: "gray" }, "directory: "),
|
|
16
|
+
React.createElement(Text, { color: "white" }, path)),
|
|
17
|
+
React.createElement(Box, null,
|
|
18
|
+
React.createElement(Text, { color: "gray" }, "user: "),
|
|
19
|
+
React.createElement(Text, { color: "white" }, user),
|
|
20
|
+
React.createElement(Text, { color: "gray" }, " \u00B7 mode: "),
|
|
21
|
+
React.createElement(Text, { color: "white" }, mode))));
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=Banner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Banner.js","sourceRoot":"","sources":["../../../../../src/commands/chat/components/Banner.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,IAAI,EAAE,GAAG,EAAC,MAAM,KAAK,CAAC;AAS9B,MAAM,CAAC,MAAM,MAAM,GAA0B,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAG,SAAS,EAAC,EAAE,EAAE;IACvF,OAAO,CACL,oBAAC,GAAG,IACF,WAAW,EAAC,OAAO,EACnB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,aAAa,EAAC,QAAQ,EACtB,YAAY,EAAE,CAAC;QAEf,oBAAC,GAAG,IAAC,YAAY,EAAE,CAAC;YAClB,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;gBACf,KAAK;gBACN,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,2BAEjB;gBAAC,GAAG;gBACX,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM;;oBAAG,OAAO;wBAAS,CAChC,CACH;QAIN,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,kBAAmB;YACrC,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,IAAE,IAAI,CAAQ,CAC7B;QAEN,oBAAC,GAAG;YACF,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,aAAc;YAChC,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,IAAE,IAAI,CAAQ;YACjC,oBAAC,IAAI,IAAC,KAAK,EAAC,MAAM,qBAAiB;YACnC,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,IAAE,IAAI,CAAQ,CAC7B,CACF,CACP,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import React, { useEffect, useState } from "react";
|
|
2
|
+
import { Box, Text, useInput } from "ink";
|
|
3
|
+
import TextInput from "ink-text-input";
|
|
4
|
+
import { inkTheme } from "../../../lib/tui/ink/theme.js";
|
|
5
|
+
export const ChatInput = ({ placeholder, onSubmit, onCancel, getSuggestions, disabled, }) => {
|
|
6
|
+
const [query, setQuery] = useState("");
|
|
7
|
+
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
8
|
+
const [windowStart, setWindowStart] = useState(0);
|
|
9
|
+
const allSuggestions = query.startsWith("/") && getSuggestions ? getSuggestions(query) : [];
|
|
10
|
+
const VISIBLE_ITEMS = 5;
|
|
11
|
+
// Keep indices in bounds and keep the selected item visible.
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (allSuggestions.length === 0) {
|
|
14
|
+
if (selectedIndex !== 0)
|
|
15
|
+
setSelectedIndex(0);
|
|
16
|
+
if (windowStart !== 0)
|
|
17
|
+
setWindowStart(0);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const clampedIndex = Math.min(selectedIndex, allSuggestions.length - 1);
|
|
21
|
+
if (clampedIndex !== selectedIndex) {
|
|
22
|
+
setSelectedIndex(clampedIndex);
|
|
23
|
+
}
|
|
24
|
+
const maxWindowStart = Math.max(0, allSuggestions.length - VISIBLE_ITEMS);
|
|
25
|
+
let nextWindowStart = Math.max(0, Math.min(maxWindowStart, windowStart));
|
|
26
|
+
if (clampedIndex < nextWindowStart) {
|
|
27
|
+
nextWindowStart = clampedIndex;
|
|
28
|
+
}
|
|
29
|
+
else if (clampedIndex >= nextWindowStart + VISIBLE_ITEMS) {
|
|
30
|
+
nextWindowStart = Math.min(maxWindowStart, clampedIndex - VISIBLE_ITEMS + 1);
|
|
31
|
+
}
|
|
32
|
+
if (nextWindowStart !== windowStart) {
|
|
33
|
+
setWindowStart(nextWindowStart);
|
|
34
|
+
}
|
|
35
|
+
}, [allSuggestions.length, selectedIndex, windowStart]);
|
|
36
|
+
const suggestions = allSuggestions.slice(windowStart, windowStart + VISIBLE_ITEMS);
|
|
37
|
+
const remainingCount = Math.max(0, allSuggestions.length - (windowStart + VISIBLE_ITEMS));
|
|
38
|
+
useInput((input, key) => {
|
|
39
|
+
if (key.escape) {
|
|
40
|
+
onCancel?.();
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (disabled) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (allSuggestions.length === 0)
|
|
47
|
+
return;
|
|
48
|
+
if (key.downArrow) {
|
|
49
|
+
const nextIndex = Math.min(selectedIndex + 1, allSuggestions.length - 1);
|
|
50
|
+
setSelectedIndex(nextIndex);
|
|
51
|
+
}
|
|
52
|
+
if (key.upArrow) {
|
|
53
|
+
const prevIndex = Math.max(selectedIndex - 1, 0);
|
|
54
|
+
setSelectedIndex(prevIndex);
|
|
55
|
+
}
|
|
56
|
+
if (key.return) {
|
|
57
|
+
const selected = allSuggestions[selectedIndex];
|
|
58
|
+
if (selected) {
|
|
59
|
+
setQuery(selected.value + " ");
|
|
60
|
+
// Optional: Submit immediately if desired, or just autocomplete
|
|
61
|
+
// onSubmit(selected.value);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
return (React.createElement(Box, { flexDirection: "column" },
|
|
66
|
+
React.createElement(Box, { width: "100%", paddingX: 1, paddingY: 1, backgroundColor: inkTheme.colors.bg.input },
|
|
67
|
+
React.createElement(Box, null,
|
|
68
|
+
React.createElement(Text, { color: "white", bold: true }, "> "),
|
|
69
|
+
disabled ? (React.createElement(Text, { color: "gray" }, query)) : (React.createElement(TextInput, { value: query, onChange: (val) => {
|
|
70
|
+
setQuery(val);
|
|
71
|
+
setSelectedIndex(0);
|
|
72
|
+
setWindowStart(0);
|
|
73
|
+
}, onSubmit: (val) => {
|
|
74
|
+
setQuery("");
|
|
75
|
+
onSubmit(val);
|
|
76
|
+
}, placeholder: placeholder })))),
|
|
77
|
+
suggestions.length > 0 && (React.createElement(Box, { flexDirection: "column", borderStyle: "single", borderColor: "gray", marginTop: 0, paddingX: 1 },
|
|
78
|
+
suggestions.map((suggestion, index) => {
|
|
79
|
+
const globalIndex = windowStart + index;
|
|
80
|
+
const isSelected = globalIndex === selectedIndex;
|
|
81
|
+
return (React.createElement(Text, { key: suggestion.value },
|
|
82
|
+
React.createElement(Text, { color: isSelected ? "cyan" : "white", bold: isSelected },
|
|
83
|
+
isSelected ? "> " : " ",
|
|
84
|
+
suggestion.label),
|
|
85
|
+
" ",
|
|
86
|
+
React.createElement(Text, { color: "gray" },
|
|
87
|
+
"- ",
|
|
88
|
+
suggestion.description)));
|
|
89
|
+
}),
|
|
90
|
+
remainingCount > 0 && (React.createElement(Text, { color: "gray", dimColor: true },
|
|
91
|
+
"... ",
|
|
92
|
+
remainingCount,
|
|
93
|
+
" more (scroll with arrows)"))))));
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=ChatInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatInput.js","sourceRoot":"","sources":["../../../../../src/commands/chat/components/ChatInput.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import { inkTheme } from "../../../lib/tui/ink/theme.js";
|
|
4
|
+
export const MessageBubble = ({ message }) => {
|
|
5
|
+
return (React.createElement(Box, { width: "100%", paddingX: 1, paddingY: 1, marginBottom: 1, backgroundColor: inkTheme.colors.bg.userBubble },
|
|
6
|
+
React.createElement(Text, { color: "white", bold: true }, "> "),
|
|
7
|
+
React.createElement(Text, { color: "white" }, message)));
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=MessageBubble.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageBubble.js","sourceRoot":"","sources":["../../../../../src/commands/chat/components/MessageBubble.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,GAAG,EAAE,IAAI,EAAC,MAAM,KAAK,CAAC;AAC9B,OAAO,EAAC,QAAQ,EAAC,MAAM,+BAA+B,CAAC;AAEvD,MAAM,CAAC,MAAM,aAAa,GAAgC,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE;IACtE,OAAO,CACL,oBAAC,GAAG,IACF,KAAK,EAAC,MAAM,EACZ,QAAQ,EAAE,CAAC,EACX,QAAQ,EAAE,CAAC,EACX,YAAY,EAAE,CAAC,EACf,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU;QAE9C,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,EAAC,IAAI,UAAE,IAAI,CAAQ;QACtC,oBAAC,IAAI,IAAC,KAAK,EAAC,OAAO,IAAE,OAAO,CAAQ,CAChC,CACP,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Box, Text } from "ink";
|
|
3
|
+
import Spinner from "ink-spinner";
|
|
4
|
+
export const StatusIndicator = ({ message, type }) => {
|
|
5
|
+
return (React.createElement(Box, null,
|
|
6
|
+
type === "loading" && (React.createElement(Text, { color: "yellow" },
|
|
7
|
+
React.createElement(Spinner, { type: "dots" }),
|
|
8
|
+
" ")),
|
|
9
|
+
React.createElement(Text, { color: type === "error" ? "red" : "gray" }, message)));
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=StatusIndicator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusIndicator.js","sourceRoot":"","sources":["../../../../../src/commands/chat/components/StatusIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAC,GAAG,EAAE,IAAI,EAAC,MAAM,KAAK,CAAC;AAC9B,OAAO,OAAO,MAAM,aAAa,CAAC;AAElC,MAAM,CAAC,MAAM,eAAe,GAGvB,CAAC,EAAC,OAAO,EAAE,IAAI,EAAC,EAAE,EAAE;IACvB,OAAO,CACL,oBAAC,GAAG;QACD,IAAI,KAAK,SAAS,IAAI,CACrB,oBAAC,IAAI,IAAC,KAAK,EAAC,QAAQ;YAClB,oBAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG;YAAC,GAAG,CACtB,CACR;QACD,oBAAC,IAAI,IAAC,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,IAAG,OAAO,CAAQ,CAC5D,CACP,CAAC;AACJ,CAAC,CAAC"}
|