@timetotest/cli 0.2.4 → 0.3.1

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.
Files changed (114) hide show
  1. package/README.md +49 -40
  2. package/dist/bin/ttt.js +0 -2
  3. package/dist/bin/ttt.js.map +1 -1
  4. package/dist/package.json +8 -3
  5. package/dist/src/commands/chat/ChatApp.js +249 -67
  6. package/dist/src/commands/chat/ChatApp.js.map +1 -1
  7. package/dist/src/commands/chat/OnboardingApp.js +49 -0
  8. package/dist/src/commands/chat/OnboardingApp.js.map +1 -0
  9. package/dist/src/commands/chat/components/Banner.js +1 -1
  10. package/dist/src/commands/chat/components/Banner.js.map +1 -1
  11. package/dist/src/commands/chat/components/ChatInput.js +61 -22
  12. package/dist/src/commands/chat/components/ChatInput.js.map +1 -1
  13. package/dist/src/commands/chat/components/ChatMessage.js +102 -0
  14. package/dist/src/commands/chat/components/ChatMessage.js.map +1 -0
  15. package/dist/src/commands/chat/components/MessageBubble.js +1 -1
  16. package/dist/src/commands/chat/components/MessageBubble.js.map +1 -1
  17. package/dist/src/commands/chat/components/PermissionPrompt.js +92 -0
  18. package/dist/src/commands/chat/components/PermissionPrompt.js.map +1 -0
  19. package/dist/src/commands/chat/components/StatusIndicator.js +21 -5
  20. package/dist/src/commands/chat/components/StatusIndicator.js.map +1 -1
  21. package/dist/src/commands/chat/components/ToolCallDisplay.js +141 -0
  22. package/dist/src/commands/chat/components/ToolCallDisplay.js.map +1 -0
  23. package/dist/src/commands/chat-ink.js +328 -93
  24. package/dist/src/commands/chat-ink.js.map +1 -1
  25. package/dist/src/commands/login.js +5 -5
  26. package/dist/src/commands/login.js.map +1 -1
  27. package/dist/src/commands/test.js +14 -291
  28. package/dist/src/commands/test.js.map +1 -1
  29. package/dist/src/lib/__tests__/code-mode-integration.test.js +381 -0
  30. package/dist/src/lib/__tests__/code-mode-integration.test.js.map +1 -0
  31. package/dist/src/lib/__tests__/config-manager.test.js +81 -0
  32. package/dist/src/lib/__tests__/config-manager.test.js.map +1 -0
  33. package/dist/src/lib/__tests__/mode-persistence-integration.test.js +75 -0
  34. package/dist/src/lib/__tests__/mode-persistence-integration.test.js.map +1 -0
  35. package/dist/src/lib/__tests__/permission-flow-integration.test.js +145 -0
  36. package/dist/src/lib/__tests__/permission-flow-integration.test.js.map +1 -0
  37. package/dist/src/lib/__tests__/permissions.test.js +132 -0
  38. package/dist/src/lib/__tests__/permissions.test.js.map +1 -0
  39. package/dist/src/lib/agent-orchestrator.js +259 -5
  40. package/dist/src/lib/agent-orchestrator.js.map +1 -1
  41. package/dist/src/lib/config.js +40 -0
  42. package/dist/src/lib/config.js.map +1 -1
  43. package/dist/src/lib/context-compactor.js +310 -0
  44. package/dist/src/lib/context-compactor.js.map +1 -0
  45. package/dist/src/lib/http.js +8 -0
  46. package/dist/src/lib/http.js.map +1 -1
  47. package/dist/src/lib/local-tools/code/__tests__/grep-search.test.js +146 -0
  48. package/dist/src/lib/local-tools/code/__tests__/grep-search.test.js.map +1 -0
  49. package/dist/src/lib/local-tools/code/__tests__/list-directory.test.js +192 -0
  50. package/dist/src/lib/local-tools/code/__tests__/list-directory.test.js.map +1 -0
  51. package/dist/src/lib/local-tools/code/__tests__/read-file.test.js +169 -0
  52. package/dist/src/lib/local-tools/code/__tests__/read-file.test.js.map +1 -0
  53. package/dist/src/lib/local-tools/code/__tests__/run-command.test.js +101 -0
  54. package/dist/src/lib/local-tools/code/__tests__/run-command.test.js.map +1 -0
  55. package/dist/src/lib/local-tools/code/__tests__/search-files.test.js +191 -0
  56. package/dist/src/lib/local-tools/code/__tests__/search-files.test.js.map +1 -0
  57. package/dist/src/lib/local-tools/code/grep-search.js +404 -0
  58. package/dist/src/lib/local-tools/code/grep-search.js.map +1 -0
  59. package/dist/src/lib/local-tools/code/index.js +11 -0
  60. package/dist/src/lib/local-tools/code/index.js.map +1 -0
  61. package/dist/src/lib/local-tools/code/list-directory.js +276 -0
  62. package/dist/src/lib/local-tools/code/list-directory.js.map +1 -0
  63. package/dist/src/lib/local-tools/code/read-file.js +301 -0
  64. package/dist/src/lib/local-tools/code/read-file.js.map +1 -0
  65. package/dist/src/lib/local-tools/code/run-command.js +235 -0
  66. package/dist/src/lib/local-tools/code/run-command.js.map +1 -0
  67. package/dist/src/lib/local-tools/code/search-files.js +297 -0
  68. package/dist/src/lib/local-tools/code/search-files.js.map +1 -0
  69. package/dist/src/lib/local-tools/code/types.js +6 -0
  70. package/dist/src/lib/local-tools/code/types.js.map +1 -0
  71. package/dist/src/lib/permissions.js +94 -0
  72. package/dist/src/lib/permissions.js.map +1 -0
  73. package/dist/src/lib/prompts/builder.js +13 -10
  74. package/dist/src/lib/prompts/builder.js.map +1 -1
  75. package/dist/src/lib/prompts/templates.js +78 -0
  76. package/dist/src/lib/prompts/templates.js.map +1 -1
  77. package/dist/src/lib/session-manager.js.map +1 -1
  78. package/dist/src/lib/testing-mode.js +2 -2
  79. package/dist/src/lib/testing-mode.js.map +1 -1
  80. package/dist/src/lib/tool-executor.js +131 -2
  81. package/dist/src/lib/tool-executor.js.map +1 -1
  82. package/dist/src/lib/tool-registry.js +171 -3
  83. package/dist/src/lib/tool-registry.js.map +1 -1
  84. package/dist/src/lib/tool-result-pruner.js +4 -4
  85. package/dist/src/lib/tool-result-pruner.js.map +1 -1
  86. package/dist/src/lib/tui/ink/components/AppFrame.js +17 -0
  87. package/dist/src/lib/tui/ink/components/AppFrame.js.map +1 -0
  88. package/dist/src/lib/tui/ink/components/CommandPalette.js +24 -0
  89. package/dist/src/lib/tui/ink/components/CommandPalette.js.map +1 -0
  90. package/dist/src/lib/tui/ink/components/Pill.js +19 -0
  91. package/dist/src/lib/tui/ink/components/Pill.js.map +1 -0
  92. package/dist/src/lib/tui/ink/components/TimetoTestLogo.js +30 -0
  93. package/dist/src/lib/tui/ink/components/TimetoTestLogo.js.map +1 -0
  94. package/dist/src/lib/tui/ink/theme.js +13 -6
  95. package/dist/src/lib/tui/ink/theme.js.map +1 -1
  96. package/dist/src/lib/tui/interactive-chat.js +35 -35
  97. package/dist/src/lib/tui/interactive-chat.js.map +1 -1
  98. package/dist/src/lib/tui/print.js +18 -18
  99. package/dist/src/lib/tui/print.js.map +1 -1
  100. package/dist/src/lib/tui/prompt.js +3 -3
  101. package/dist/src/lib/tui/prompt.js.map +1 -1
  102. package/dist/src/lib/tui/status.js +1 -1
  103. package/dist/src/lib/tui/status.js.map +1 -1
  104. package/dist/src/lib/update.js +10 -10
  105. package/dist/src/lib/update.js.map +1 -1
  106. package/package.json +8 -3
  107. package/dist/src/commands/start-test.js +0 -180
  108. package/dist/src/commands/start-test.js.map +0 -1
  109. package/dist/src/commands/stream/StreamApp.js +0 -127
  110. package/dist/src/commands/stream/StreamApp.js.map +0 -1
  111. package/dist/src/commands/stream.js +0 -52
  112. package/dist/src/commands/stream.js.map +0 -1
  113. package/dist/src/commands/test/TestRunApp.js +0 -183
  114. package/dist/src/commands/test/TestRunApp.js.map +0 -1
@@ -0,0 +1,49 @@
1
+ import React, { useState } from "react";
2
+ import { Box, Text, useApp, useInput } from "ink";
3
+ import SelectInput from "ink-select-input";
4
+ import { TimetoTestLogo } from "../../lib/tui/ink/components/TimetoTestLogo.js";
5
+ import { inkTheme } from "../../lib/tui/ink/theme.js";
6
+ const ITEMS = [
7
+ {
8
+ label: "Login / Sign Up",
9
+ value: "login",
10
+ },
11
+ {
12
+ label: "Exit",
13
+ value: "exit",
14
+ },
15
+ ];
16
+ export const OnboardingApp = ({ onLogin, onExit, }) => {
17
+ const { exit } = useApp();
18
+ const [activeItem, setActiveItem] = useState(ITEMS[0]);
19
+ // Handle global key presses (like ctrl+c)
20
+ useInput((input, key) => {
21
+ if (key.ctrl && input === "c") {
22
+ onExit();
23
+ exit();
24
+ }
25
+ });
26
+ const handleSelect = (item) => {
27
+ if (item.value === "login") {
28
+ onLogin();
29
+ }
30
+ else {
31
+ onExit();
32
+ exit();
33
+ }
34
+ };
35
+ return (React.createElement(Box, { flexDirection: "column", width: "100%", height: "100%" },
36
+ React.createElement(Box, { flexDirection: "column", flexGrow: 1, overflow: "hidden" },
37
+ React.createElement(TimetoTestLogo, null),
38
+ React.createElement(Box, { flexDirection: "column", paddingX: 2, marginTop: 1 },
39
+ React.createElement(Text, { color: inkTheme.colors.text.secondary }, "Welcome to Time to Test CLI. Please authenticate to continue.")),
40
+ React.createElement(Box, { flexDirection: "column", paddingX: 2, marginTop: 2 },
41
+ React.createElement(SelectInput, { items: ITEMS, onSelect: handleSelect, indicatorComponent: ({ isSelected }) => (React.createElement(Text, { color: isSelected ? inkTheme.colors.text.accent : undefined }, isSelected ? "> " : " ")), itemComponent: ({ isSelected, label }) => (React.createElement(Text, { color: isSelected ? inkTheme.colors.text.accent : undefined }, label)) }))),
42
+ React.createElement(Box, { paddingX: 2, paddingY: 1, borderStyle: "single", borderColor: inkTheme.colors.border.default, borderBottom: false, borderLeft: false, borderRight: false },
43
+ React.createElement(Box, { flexGrow: 1 },
44
+ React.createElement(Text, { color: inkTheme.colors.text.muted, dimColor: true }, "Use arrow keys to select \u2022 Enter to confirm")),
45
+ React.createElement(Text, { color: inkTheme.colors.text.muted, dimColor: true },
46
+ React.createElement(Text, { bold: true }, "ctrl+c"),
47
+ " exit"))));
48
+ };
49
+ //# sourceMappingURL=OnboardingApp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OnboardingApp.js","sourceRoot":"","sources":["../../../../src/commands/chat/OnboardingApp.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import { Text, Box } from "ink";
3
- export const Banner = ({ user, mode, path, version = "v0.63.0" }) => {
3
+ export const Banner = ({ user, mode, path, version = "v0.3.1" }) => {
4
4
  return (React.createElement(Box, { borderStyle: "round", borderColor: "gray", paddingX: 1, flexDirection: "column", marginBottom: 1 },
5
5
  React.createElement(Box, { marginBottom: 1 },
6
6
  React.createElement(Text, { color: "gray" },
@@ -1 +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"}
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,QAAQ,EAAC,EAAE,EAAE;IACtF,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"}
@@ -2,11 +2,10 @@ import React, { useEffect, useState } from "react";
2
2
  import { Box, Text, useInput } from "ink";
3
3
  import TextInput from "ink-text-input";
4
4
  import { inkTheme } from "../../../lib/tui/ink/theme.js";
5
- export const ChatInput = ({ placeholder, onSubmit, onCancel, getSuggestions, disabled, }) => {
6
- const [query, setQuery] = useState("");
5
+ export const ChatInput = ({ placeholder, value, onChange, onSubmit, onCancel, getSuggestions, disabled, onHistoryUp, onHistoryDown, testingMode, directory, hintsRight, onToggleMode, }) => {
7
6
  const [selectedIndex, setSelectedIndex] = useState(0);
8
7
  const [windowStart, setWindowStart] = useState(0);
9
- const allSuggestions = query.startsWith("/") && getSuggestions ? getSuggestions(query) : [];
8
+ const allSuggestions = value.startsWith("/") && getSuggestions ? getSuggestions(value) : [];
10
9
  const VISIBLE_ITEMS = 5;
11
10
  // Keep indices in bounds and keep the selected item visible.
12
11
  useEffect(() => {
@@ -40,11 +39,27 @@ export const ChatInput = ({ placeholder, onSubmit, onCancel, getSuggestions, dis
40
39
  onCancel?.();
41
40
  return;
42
41
  }
42
+ if (key.ctrl && input === "c") {
43
+ onCancel?.();
44
+ return;
45
+ }
43
46
  if (disabled) {
44
47
  return;
45
48
  }
46
- if (allSuggestions.length === 0)
49
+ if (key.tab) {
50
+ onToggleMode?.();
47
51
  return;
52
+ }
53
+ // History navigation when not showing suggestions.
54
+ if (allSuggestions.length === 0) {
55
+ if (key.upArrow) {
56
+ onHistoryUp?.();
57
+ }
58
+ else if (key.downArrow) {
59
+ onHistoryDown?.();
60
+ }
61
+ return;
62
+ }
48
63
  if (key.downArrow) {
49
64
  const nextIndex = Math.min(selectedIndex + 1, allSuggestions.length - 1);
50
65
  setSelectedIndex(nextIndex);
@@ -56,38 +71,62 @@ export const ChatInput = ({ placeholder, onSubmit, onCancel, getSuggestions, dis
56
71
  if (key.return) {
57
72
  const selected = allSuggestions[selectedIndex];
58
73
  if (selected) {
59
- setQuery(selected.value + " ");
74
+ onChange(selected.value + " ");
60
75
  // Optional: Submit immediately if desired, or just autocomplete
61
- // onSubmit(selected.value);
76
+ // onSubmit(selected.value);
62
77
  }
63
78
  }
64
79
  });
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 },
80
+ return (React.createElement(Box, { flexDirection: "column", overflow: "hidden" },
81
+ React.createElement(Box, { flexDirection: "row" },
82
+ React.createElement(Box, { width: 1, backgroundColor: "#0ea5e9" }),
83
+ React.createElement(Box, { flexGrow: 1, minWidth: 0, paddingX: 2, paddingY: 1, backgroundColor: "#333333", overflow: "hidden" }, disabled ? (React.createElement(Text, { color: inkTheme.colors.text.muted }, value)) : (React.createElement(TextInput, { value: value, onChange: (val) => {
84
+ onChange(val);
85
+ setSelectedIndex(0);
86
+ setWindowStart(0);
87
+ }, onSubmit: (val) => {
88
+ onChange("");
89
+ onSubmit(val);
90
+ }, placeholder: placeholder })))),
91
+ React.createElement(Box, { flexDirection: "row" },
92
+ React.createElement(Box, { width: 1, backgroundColor: "#0ea5e9" }),
93
+ React.createElement(Box, { flexDirection: "row", flexGrow: 1, minWidth: 0, paddingX: 2, paddingBottom: 1, backgroundColor: "#333333", overflow: "hidden" },
94
+ React.createElement(Box, { flexGrow: 1 },
95
+ React.createElement(Text, { color: testingMode === "ui" ? "#3b82f6" : inkTheme.colors.text.muted, dimColor: testingMode !== "ui", bold: testingMode === "ui" }, "UI"),
96
+ React.createElement(Text, { color: inkTheme.colors.text.muted }, " / "),
97
+ React.createElement(Text, { color: testingMode === "api" ? "#3b82f6" : inkTheme.colors.text.muted, dimColor: testingMode !== "api", bold: testingMode === "api" }, "API"),
98
+ React.createElement(Text, { color: inkTheme.colors.text.muted }, " / "),
99
+ React.createElement(Text, { color: testingMode === "code" ? "#22c55e" : inkTheme.colors.text.muted, dimColor: testingMode !== "code", bold: testingMode === "code" }, "Code")),
100
+ React.createElement(Text, { color: inkTheme.colors.text.muted, dimColor: true }, hintsRight ??
101
+ (testingMode === "code" ? (React.createElement(Text, null,
102
+ React.createElement(Text, { bold: true, color: inkTheme.colors.text.primary }, "tab"),
103
+ " mode \u2022 read_file \u2022 grep_search \u2022 run_command")) : (React.createElement(Text, null,
104
+ React.createElement(Text, { bold: true, color: inkTheme.colors.text.primary }, "tab"),
105
+ " mode \u2022 ",
106
+ React.createElement(Text, { bold: true, color: inkTheme.colors.text.primary }, "ctrl+k"),
107
+ " commands")))))),
108
+ React.createElement(Box, { paddingX: 2, marginTop: 1, marginBottom: 1 },
109
+ React.createElement(Box, { flexGrow: 1 },
110
+ React.createElement(Text, { color: inkTheme.colors.text.muted, dimColor: true }, directory)),
111
+ React.createElement(Text, { color: inkTheme.colors.text.muted, dimColor: true },
112
+ React.createElement(Text, { bold: true }, "esc"),
113
+ " stop agent")),
114
+ suggestions.length > 0 && (React.createElement(Box, { flexDirection: "column", borderStyle: "single", borderColor: inkTheme.colors.border.default, paddingX: 1 },
78
115
  suggestions.map((suggestion, index) => {
79
116
  const globalIndex = windowStart + index;
80
117
  const isSelected = globalIndex === selectedIndex;
81
118
  return (React.createElement(Text, { key: suggestion.value },
82
- React.createElement(Text, { color: isSelected ? "cyan" : "white", bold: isSelected },
119
+ React.createElement(Text, { color: isSelected
120
+ ? inkTheme.colors.text.accent
121
+ : inkTheme.colors.text.primary, bold: isSelected },
83
122
  isSelected ? "> " : " ",
84
123
  suggestion.label),
85
124
  " ",
86
- React.createElement(Text, { color: "gray" },
125
+ React.createElement(Text, { color: inkTheme.colors.text.muted },
87
126
  "- ",
88
127
  suggestion.description)));
89
128
  }),
90
- remainingCount > 0 && (React.createElement(Text, { color: "gray", dimColor: true },
129
+ remainingCount > 0 && (React.createElement(Text, { color: inkTheme.colors.text.muted, dimColor: true },
91
130
  "... ",
92
131
  remainingCount,
93
132
  " more (scroll with arrows)"))))));
@@ -1 +1 @@
1
- {"version":3,"file":"ChatInput.js","sourceRoot":"","sources":["../../../../../src/commands/chat/components/ChatInput.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChatInput.js","sourceRoot":"","sources":["../../../../../src/commands/chat/components/ChatInput.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import React from "react";
2
+ import { Box, Text } from "ink";
3
+ import { inkTheme } from "../../../lib/tui/ink/theme.js";
4
+ function parseInlineMarkdown(text) {
5
+ const parts = [];
6
+ let lastIndex = 0;
7
+ const regex = /(\*\*|__)(.*?)\1|(\*|_)(.*?)\3|(`)(.*?)\5/g;
8
+ let match;
9
+ while ((match = regex.exec(text)) !== null) {
10
+ if (match.index > lastIndex) {
11
+ const plainText = text.slice(lastIndex, match.index);
12
+ parts.push(React.createElement(Text, { key: `text-${lastIndex}` }, plainText));
13
+ }
14
+ if (match[1]) {
15
+ // Bold
16
+ parts.push(React.createElement(Text, { key: `bold-${match.index}`, bold: true, color: "white" }, match[2]));
17
+ }
18
+ else if (match[3]) {
19
+ // Italics
20
+ parts.push(React.createElement(Text, { key: `italic-${match.index}`, italic: true }, match[4]));
21
+ }
22
+ else if (match[5]) {
23
+ // Inline Code
24
+ parts.push(React.createElement(Text, { key: `code-${match.index}`, color: "#3b82f6", bold: true }, ` ${match[6]} `));
25
+ }
26
+ lastIndex = regex.lastIndex;
27
+ }
28
+ if (lastIndex < text.length) {
29
+ parts.push(React.createElement(Text, { key: `text-end-${lastIndex}` }, text.slice(lastIndex)));
30
+ }
31
+ return React.createElement(Text, null, parts);
32
+ }
33
+ function renderMessageBlocks(content) {
34
+ const blocks = [];
35
+ const lines = content.split("\n");
36
+ let currentCodeBlock = null;
37
+ let currentLanguage = "";
38
+ for (let i = 0; i < lines.length; i++) {
39
+ const line = lines[i];
40
+ if (line.trim().startsWith("```")) {
41
+ if (currentCodeBlock !== null) {
42
+ // End code block
43
+ blocks.push(React.createElement(Box, { key: `code-block-${i}`, flexDirection: "column", paddingX: 1, borderStyle: "round", borderColor: "#404040" },
44
+ currentLanguage ? (React.createElement(Box, { marginBottom: 0 },
45
+ React.createElement(Text, { color: "#0ea5e9", bold: true, dimColor: true }, currentLanguage.toUpperCase()))) : null,
46
+ React.createElement(Text, { color: "#e5e5e5" }, currentCodeBlock.join("\n"))));
47
+ currentCodeBlock = null;
48
+ }
49
+ else {
50
+ // Start code block
51
+ currentCodeBlock = [];
52
+ currentLanguage = line.trim().slice(3).trim();
53
+ }
54
+ }
55
+ else if (currentCodeBlock !== null) {
56
+ currentCodeBlock.push(line);
57
+ }
58
+ else {
59
+ if (line.trim()) {
60
+ blocks.push(React.createElement(Box, { key: `text-line-${i}` },
61
+ React.createElement(Text, { color: inkTheme.colors.text.secondary }, parseInlineMarkdown(line))));
62
+ }
63
+ }
64
+ }
65
+ if (currentCodeBlock !== null) {
66
+ blocks.push(React.createElement(Box, { key: "unclosed-code-block", flexDirection: "column", paddingX: 1, borderStyle: "round", borderColor: "#404040" },
67
+ React.createElement(Text, { color: "#e5e5e5" }, currentCodeBlock.join("\n"))));
68
+ }
69
+ return React.createElement(React.Fragment, null, blocks);
70
+ }
71
+ function renderAssistantContent(content) {
72
+ // Check if content contains code blocks - only use block renderer for those
73
+ const hasCodeBlocks = content.includes("```");
74
+ if (hasCodeBlocks) {
75
+ return renderMessageBlocks(content);
76
+ }
77
+ // For simple text, just return Text directly with inline markdown
78
+ return (React.createElement(Text, { color: inkTheme.colors.text.secondary }, parseInlineMarkdown(content)));
79
+ }
80
+ export function ChatMessage(props) {
81
+ const { type, content, isError } = props;
82
+ const isUser = type === "user";
83
+ const isSystem = type === "system";
84
+ // Define accent color for the left bar
85
+ const leftBarColor = isSystem
86
+ ? inkTheme.colors.border.default
87
+ : isUser
88
+ ? "#0ea5e9"
89
+ : isError
90
+ ? "#ef4444"
91
+ : inkTheme.colors.border.default;
92
+ // Define text color
93
+ const textColor = isSystem
94
+ ? inkTheme.colors.text.muted
95
+ : inkTheme.colors.text.secondary;
96
+ // Render content
97
+ const messageContent = isUser || isSystem ? (React.createElement(Text, { color: textColor, dimColor: isSystem }, content)) : (renderAssistantContent(content));
98
+ return (React.createElement(Box, { flexDirection: "row", marginBottom: 1, overflow: "hidden" },
99
+ React.createElement(Box, { width: 1, backgroundColor: leftBarColor }),
100
+ React.createElement(Box, { flexGrow: 1, minWidth: 0, paddingX: 2, paddingY: 1, backgroundColor: isSystem ? undefined : inkTheme.colors.bg.elevated, overflow: "hidden" }, messageContent)));
101
+ }
102
+ //# sourceMappingURL=ChatMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatMessage.js","sourceRoot":"","sources":["../../../../../src/commands/chat/components/ChatMessage.tsx"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ import React from "react";
2
2
  import { Box, Text } from "ink";
3
3
  import { inkTheme } from "../../../lib/tui/ink/theme.js";
4
4
  export const MessageBubble = ({ message }) => {
5
- return (React.createElement(Box, { width: "100%", paddingX: 1, paddingY: 1, marginBottom: 1, backgroundColor: inkTheme.colors.bg.userBubble },
5
+ return (React.createElement(Box, { flexGrow: 1, paddingX: 1, paddingY: 1, marginBottom: 1, backgroundColor: inkTheme.colors.bg.userBubble },
6
6
  React.createElement(Text, { color: "white", bold: true }, "> "),
7
7
  React.createElement(Text, { color: "white" }, message)));
8
8
  };
@@ -1 +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"}
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,QAAQ,EAAE,CAAC,EACX,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,92 @@
1
+ import React, { useState } from "react";
2
+ import { Box, Text, useInput } from "ink";
3
+ import { inkTheme } from "../../../lib/tui/ink/theme.js";
4
+ const OPTIONS = [
5
+ { value: "deny", label: "No, do something else", hint: "deny this action" },
6
+ { value: "allow_once", label: "Only this time", hint: "allow once" },
7
+ {
8
+ value: "allow_session",
9
+ label: "Allow for this conversation",
10
+ hint: "allow all similar actions",
11
+ },
12
+ ];
13
+ export const PermissionPrompt = ({ request, onResponse, }) => {
14
+ const [selectedIndex, setSelectedIndex] = useState(0);
15
+ useInput((input, key) => {
16
+ if (key.upArrow) {
17
+ setSelectedIndex((prev) => Math.max(0, prev - 1));
18
+ }
19
+ else if (key.downArrow) {
20
+ setSelectedIndex((prev) => Math.min(OPTIONS.length - 1, prev + 1));
21
+ }
22
+ else if (key.return) {
23
+ onResponse(OPTIONS[selectedIndex].value);
24
+ }
25
+ else if (key.escape) {
26
+ onResponse("deny");
27
+ }
28
+ });
29
+ const getCategoryIcon = () => {
30
+ switch (request.category) {
31
+ case "run_command":
32
+ return "⚡";
33
+ case "file_write":
34
+ return "📝";
35
+ case "file_delete":
36
+ return "🗑️";
37
+ default:
38
+ return "⚠️";
39
+ }
40
+ };
41
+ const getCategoryLabel = () => {
42
+ switch (request.category) {
43
+ case "run_command":
44
+ return "Run Command";
45
+ case "file_write":
46
+ return "Write File";
47
+ case "file_delete":
48
+ return "Delete File";
49
+ default:
50
+ return "Permission Required";
51
+ }
52
+ };
53
+ const getDetails = () => {
54
+ const { details } = request;
55
+ if (details.command) {
56
+ const cmd = details.args?.length
57
+ ? `${details.command} ${details.args.join(" ")}`
58
+ : details.command;
59
+ return cmd;
60
+ }
61
+ if (details.path) {
62
+ return details.path;
63
+ }
64
+ return request.description;
65
+ };
66
+ return (React.createElement(Box, { flexDirection: "column", borderStyle: "round", borderColor: "#f59e0b", paddingX: 2, paddingY: 1, marginY: 1 },
67
+ React.createElement(Box, { marginBottom: 1 },
68
+ React.createElement(Text, { color: "#f59e0b", bold: true },
69
+ getCategoryIcon(),
70
+ " ",
71
+ getCategoryLabel())),
72
+ React.createElement(Box, { marginBottom: 1 },
73
+ React.createElement(Text, { color: inkTheme.colors.text.secondary }, "The agent wants to perform this action:")),
74
+ React.createElement(Box, { backgroundColor: inkTheme.colors.bg.elevated, paddingX: 1, marginBottom: 1 },
75
+ React.createElement(Text, { color: inkTheme.colors.text.primary, wrap: "truncate-end" }, getDetails())),
76
+ React.createElement(Box, { flexDirection: "column", marginTop: 1 }, OPTIONS.map((option, index) => {
77
+ const isSelected = index === selectedIndex;
78
+ return (React.createElement(Box, { key: option.value },
79
+ React.createElement(Text, { color: isSelected
80
+ ? inkTheme.colors.text.accent
81
+ : inkTheme.colors.text.primary, bold: isSelected },
82
+ isSelected ? "❯ " : " ",
83
+ option.label),
84
+ React.createElement(Text, { color: inkTheme.colors.text.muted },
85
+ " (",
86
+ option.hint,
87
+ ")")));
88
+ })),
89
+ React.createElement(Box, { marginTop: 1 },
90
+ React.createElement(Text, { color: inkTheme.colors.text.muted, dimColor: true }, "\u2191\u2193 navigate \u2022 enter select \u2022 esc deny"))));
91
+ };
92
+ //# sourceMappingURL=PermissionPrompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionPrompt.js","sourceRoot":"","sources":["../../../../../src/commands/chat/components/PermissionPrompt.tsx"],"names":[],"mappings":"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"}
@@ -1,11 +1,27 @@
1
- import React from "react";
1
+ import React, { useState, useEffect } from "react";
2
2
  import { Box, Text } from "ink";
3
3
  import Spinner from "ink-spinner";
4
4
  export const StatusIndicator = ({ message, type }) => {
5
+ const [pulse, setPulse] = useState(true);
6
+ useEffect(() => {
7
+ if (type !== "loading")
8
+ return;
9
+ const interval = setInterval(() => {
10
+ setPulse((p) => !p);
11
+ }, 800);
12
+ return () => clearInterval(interval);
13
+ }, [type]);
14
+ const color = type === "error"
15
+ ? "#ef4444"
16
+ : type === "success"
17
+ ? "#22c55e"
18
+ : type === "loading"
19
+ ? "#3b82f6"
20
+ : "gray";
5
21
  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)));
22
+ type === "loading" && (React.createElement(Box, { marginRight: 1 },
23
+ React.createElement(Text, { color: "#0ea5e9" },
24
+ React.createElement(Spinner, { type: "dots" })))),
25
+ React.createElement(Text, { color: color, dimColor: type === "loading" && !pulse }, message)));
10
26
  };
11
27
  //# sourceMappingURL=StatusIndicator.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"StatusIndicator.js","sourceRoot":"","sources":["../../../../../src/commands/chat/components/StatusIndicator.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAC,QAAQ,EAAE,SAAS,EAAC,MAAM,OAAO,CAAC;AACjD,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,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEzC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO;QAC/B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC,EAAE,GAAG,CAAC,CAAC;QACR,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,KAAK,GACT,IAAI,KAAK,OAAO;QACd,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,IAAI,KAAK,SAAS;YAClB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,IAAI,KAAK,SAAS;gBAClB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,MAAM,CAAC;IAEjB,OAAO,CACL,oBAAC,GAAG;QACD,IAAI,KAAK,SAAS,IAAI,CACrB,oBAAC,GAAG,IAAC,WAAW,EAAE,CAAC;YACjB,oBAAC,IAAI,IAAC,KAAK,EAAC,SAAS;gBACnB,oBAAC,OAAO,IAAC,IAAI,EAAC,MAAM,GAAG,CAClB,CACH,CACP;QACD,oBAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,IACvD,OAAO,CACH,CACH,CACP,CAAC;AACJ,CAAC,CAAC"}