@markusylisiurunen/tau 0.1.2

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 (106) hide show
  1. package/README.md +228 -0
  2. package/dist/app.js +1140 -0
  3. package/dist/app.js.map +1 -0
  4. package/dist/bash_commands.js +81 -0
  5. package/dist/bash_commands.js.map +1 -0
  6. package/dist/cli.js +147 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/clipboard.js +16 -0
  9. package/dist/clipboard.js.map +1 -0
  10. package/dist/commands.js +76 -0
  11. package/dist/commands.js.map +1 -0
  12. package/dist/config.js +39 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/content_loader.js +241 -0
  15. package/dist/content_loader.js.map +1 -0
  16. package/dist/debug-ui.js +134 -0
  17. package/dist/debug-ui.js.map +1 -0
  18. package/dist/main.js +85 -0
  19. package/dist/main.js.map +1 -0
  20. package/dist/personas.js +227 -0
  21. package/dist/personas.js.map +1 -0
  22. package/dist/prompts.js +261 -0
  23. package/dist/prompts.js.map +1 -0
  24. package/dist/session/message_accumulator.js +56 -0
  25. package/dist/session/message_accumulator.js.map +1 -0
  26. package/dist/session/session_engine.js +290 -0
  27. package/dist/session/session_engine.js.map +1 -0
  28. package/dist/subagents/explore.js +42 -0
  29. package/dist/subagents/explore.js.map +1 -0
  30. package/dist/subagents/registry.js +30 -0
  31. package/dist/subagents/registry.js.map +1 -0
  32. package/dist/subagents/subagent_engine.js +147 -0
  33. package/dist/subagents/subagent_engine.js.map +1 -0
  34. package/dist/subagents/types.js +2 -0
  35. package/dist/subagents/types.js.map +1 -0
  36. package/dist/terminal.js +115 -0
  37. package/dist/terminal.js.map +1 -0
  38. package/dist/tools/bash.js +334 -0
  39. package/dist/tools/bash.js.map +1 -0
  40. package/dist/tools/edit.js +199 -0
  41. package/dist/tools/edit.js.map +1 -0
  42. package/dist/tools/registry.js +15 -0
  43. package/dist/tools/registry.js.map +1 -0
  44. package/dist/tools/task.js +202 -0
  45. package/dist/tools/task.js.map +1 -0
  46. package/dist/tools/write.js +89 -0
  47. package/dist/tools/write.js.map +1 -0
  48. package/dist/types.js +9 -0
  49. package/dist/types.js.map +1 -0
  50. package/dist/ui/assistant_message.js +87 -0
  51. package/dist/ui/assistant_message.js.map +1 -0
  52. package/dist/ui/bash_execution.js +127 -0
  53. package/dist/ui/bash_execution.js.map +1 -0
  54. package/dist/ui/chat_container.js +90 -0
  55. package/dist/ui/chat_container.js.map +1 -0
  56. package/dist/ui/components/dynamic_border.js +11 -0
  57. package/dist/ui/components/dynamic_border.js.map +1 -0
  58. package/dist/ui/components/one_line_segments.js +79 -0
  59. package/dist/ui/components/one_line_segments.js.map +1 -0
  60. package/dist/ui/components/padded_container.js +24 -0
  61. package/dist/ui/components/padded_container.js.map +1 -0
  62. package/dist/ui/custom_editor.js +53 -0
  63. package/dist/ui/custom_editor.js.map +1 -0
  64. package/dist/ui/file_execution.js +189 -0
  65. package/dist/ui/file_execution.js.map +1 -0
  66. package/dist/ui/footer.js +56 -0
  67. package/dist/ui/footer.js.map +1 -0
  68. package/dist/ui/queued_messages.js +31 -0
  69. package/dist/ui/queued_messages.js.map +1 -0
  70. package/dist/ui/session_divider.js +17 -0
  71. package/dist/ui/session_divider.js.map +1 -0
  72. package/dist/ui/session_summary.js +30 -0
  73. package/dist/ui/session_summary.js.map +1 -0
  74. package/dist/ui/slash_autocomplete.js +177 -0
  75. package/dist/ui/slash_autocomplete.js.map +1 -0
  76. package/dist/ui/system_message.js +8 -0
  77. package/dist/ui/system_message.js.map +1 -0
  78. package/dist/ui/task_execution.js +190 -0
  79. package/dist/ui/task_execution.js.map +1 -0
  80. package/dist/ui/theme.js +108 -0
  81. package/dist/ui/theme.js.map +1 -0
  82. package/dist/ui/tool_output.js +24 -0
  83. package/dist/ui/tool_output.js.map +1 -0
  84. package/dist/ui/user_message.js +14 -0
  85. package/dist/ui/user_message.js.map +1 -0
  86. package/dist/utils/color.js +13 -0
  87. package/dist/utils/color.js.map +1 -0
  88. package/dist/utils/context.js +108 -0
  89. package/dist/utils/context.js.map +1 -0
  90. package/dist/utils/fork.js +41 -0
  91. package/dist/utils/fork.js.map +1 -0
  92. package/dist/utils/format.js +35 -0
  93. package/dist/utils/format.js.map +1 -0
  94. package/dist/utils/fuzzy.js +48 -0
  95. package/dist/utils/fuzzy.js.map +1 -0
  96. package/dist/utils/git.js +21 -0
  97. package/dist/utils/git.js.map +1 -0
  98. package/dist/utils/messages.js +41 -0
  99. package/dist/utils/messages.js.map +1 -0
  100. package/dist/utils/never.js +4 -0
  101. package/dist/utils/never.js.map +1 -0
  102. package/dist/utils/project_files.js +96 -0
  103. package/dist/utils/project_files.js.map +1 -0
  104. package/dist/utils/truncate.js +299 -0
  105. package/dist/utils/truncate.js.map +1 -0
  106. package/package.json +37 -0
@@ -0,0 +1,199 @@
1
+ import { readFileSync, writeFileSync } from "node:fs";
2
+ import { Type } from "@sinclair/typebox";
3
+ import { createToolError, createToolSuccess } from "../utils/messages.js";
4
+ const EDIT_DESCRIPTION = [
5
+ "Edit a file by replacing exact text matches.",
6
+ "Finds and replaces exactly one occurrence of oldText with newText.",
7
+ "Fails if the file doesn't exist, if oldText is not found, or if multiple matches exist.",
8
+ ].join(" ");
9
+ const EDIT_PATH_DESCRIPTION = "Absolute or relative path to the file to edit.";
10
+ const EDIT_OLD_TEXT_DESCRIPTION = [
11
+ "The exact text to find and replace, including whitespace and newlines.",
12
+ "Must match exactly one occurrence.",
13
+ "If multiple matches are found, you should re-attempt with a more specific oldText.",
14
+ ].join(" ");
15
+ const EDIT_NEW_TEXT_DESCRIPTION = "The text to replace oldText with.";
16
+ export const EDIT_TOOL = {
17
+ name: "edit",
18
+ description: EDIT_DESCRIPTION,
19
+ parameters: Type.Object({
20
+ path: Type.String({ description: EDIT_PATH_DESCRIPTION }),
21
+ oldText: Type.String({ description: EDIT_OLD_TEXT_DESCRIPTION }),
22
+ newText: Type.String({ description: EDIT_NEW_TEXT_DESCRIPTION }),
23
+ }, { additionalProperties: false }),
24
+ };
25
+ function parseEditArgs(raw) {
26
+ const args = raw;
27
+ const path = typeof args?.path === "string" ? args.path.trim() : "";
28
+ const oldText = typeof args?.oldText === "string" ? args.oldText : "";
29
+ const newText = typeof args?.newText === "string" ? args.newText : "";
30
+ return { path, oldText, newText };
31
+ }
32
+ function countOccurrences(content, search) {
33
+ if (!search)
34
+ return 0;
35
+ let count = 0;
36
+ let pos = 0;
37
+ let index = content.indexOf(search, pos);
38
+ while (index !== -1) {
39
+ count++;
40
+ pos = index + search.length;
41
+ index = content.indexOf(search, pos);
42
+ }
43
+ return count;
44
+ }
45
+ const DIFF_MAX_LINES = 200;
46
+ const DIFF_MAX_BYTES = 40_000;
47
+ function buildSimpleDiff(oldText, newText) {
48
+ const oldLines = oldText.length === 0 ? ["(empty)"] : oldText.split("\n");
49
+ const newLines = newText.length === 0 ? ["(empty)"] : newText.split("\n");
50
+ const diffLines = [];
51
+ for (const line of oldLines) {
52
+ diffLines.push(`- ${line}`);
53
+ }
54
+ for (const line of newLines) {
55
+ diffLines.push(`+ ${line}`);
56
+ }
57
+ const totalLines = diffLines.length;
58
+ let outputLines = diffLines;
59
+ let truncated = false;
60
+ // Truncate by lines first
61
+ if (outputLines.length > DIFF_MAX_LINES) {
62
+ const headCount = Math.floor(DIFF_MAX_LINES / 2);
63
+ const tailCount = DIFF_MAX_LINES - headCount;
64
+ outputLines = [...outputLines.slice(0, headCount), ...outputLines.slice(-tailCount)];
65
+ truncated = true;
66
+ }
67
+ let diff = outputLines.join("\n");
68
+ // Truncate by bytes if needed
69
+ const byteLength = Buffer.byteLength(diff, "utf-8");
70
+ if (byteLength > DIFF_MAX_BYTES) {
71
+ // Simple byte truncation from middle
72
+ const lines = diff.split("\n");
73
+ while (Buffer.byteLength(lines.join("\n"), "utf-8") > DIFF_MAX_BYTES && lines.length > 2) {
74
+ const mid = Math.floor(lines.length / 2);
75
+ lines.splice(mid, 1);
76
+ }
77
+ diff = lines.join("\n");
78
+ truncated = true;
79
+ }
80
+ return {
81
+ diff,
82
+ truncation: {
83
+ truncated,
84
+ totalLines,
85
+ outputLines: diff.split("\n").length,
86
+ },
87
+ };
88
+ }
89
+ function findMatchContext(content, search, contextLines = 2) {
90
+ const index = content.indexOf(search);
91
+ if (index === -1)
92
+ return "";
93
+ const lines = content.split("\n");
94
+ let currentPos = 0;
95
+ let matchLineIndex = 0;
96
+ for (let i = 0; i < lines.length; i++) {
97
+ const lineEnd = currentPos + lines[i].length + 1; // +1 for newline
98
+ if (index < lineEnd) {
99
+ matchLineIndex = i;
100
+ break;
101
+ }
102
+ currentPos = lineEnd;
103
+ }
104
+ const startLine = Math.max(0, matchLineIndex - contextLines);
105
+ const endLine = Math.min(lines.length - 1, matchLineIndex + contextLines);
106
+ const contextSnippet = lines.slice(startLine, endLine + 1).join("\n");
107
+ return `Lines ${startLine + 1}-${endLine + 1}:\n${contextSnippet}`;
108
+ }
109
+ export function createEditToolDefinition() {
110
+ return {
111
+ schema: EDIT_TOOL,
112
+ async dispatch(toolCall, riskLevel) {
113
+ const { path, oldText, newText } = parseEditArgs(toolCall.arguments);
114
+ const blocked = (reason) => {
115
+ const toolResult = createToolError(toolCall, reason);
116
+ const uiEvent = {
117
+ type: "edit_blocked",
118
+ path: path || "(missing path)",
119
+ reason,
120
+ };
121
+ return { kind: "single", toolResult, uiEvent };
122
+ };
123
+ if (riskLevel !== "read-write") {
124
+ return blocked(`Edit tool blocked: requires risk level 'read-write', but current level is '${riskLevel}'. Ask the user to run /risk:read-write.`);
125
+ }
126
+ if (!path) {
127
+ return blocked("Edit tool error: missing 'path' parameter. Provide the file path to edit.");
128
+ }
129
+ if (!oldText) {
130
+ return blocked("Edit tool error: missing 'oldText' parameter. Provide the exact text to find and replace.");
131
+ }
132
+ let content;
133
+ try {
134
+ content = readFileSync(path, "utf-8");
135
+ }
136
+ catch (e) {
137
+ const errorMessage = e instanceof Error ? e.message : String(e);
138
+ if (e.code === "ENOENT") {
139
+ return blocked(`Edit tool error: file not found at '${path}'. Verify the path is correct.`);
140
+ }
141
+ return blocked(`Edit tool error: could not read file: ${errorMessage}`);
142
+ }
143
+ const matchCount = countOccurrences(content, oldText);
144
+ if (matchCount === 0) {
145
+ // Provide helpful context for debugging
146
+ const trimmedOld = oldText.trim();
147
+ const trimmedCount = trimmedOld !== oldText ? countOccurrences(content, trimmedOld) : 0;
148
+ let hint = "";
149
+ if (trimmedCount > 0) {
150
+ hint =
151
+ " Hint: Found matches when ignoring leading/trailing whitespace. Check that your oldText exactly matches the file content including whitespace.";
152
+ }
153
+ else if (oldText.includes("\n")) {
154
+ hint =
155
+ " Hint: Your search contains newlines. Ensure line endings match the file (LF vs CRLF) and indentation is exact.";
156
+ }
157
+ else {
158
+ // Check for partial matches
159
+ const words = oldText.split(/\s+/).filter((w) => w.length > 3);
160
+ const partialMatches = words.filter((w) => content.includes(w));
161
+ if (partialMatches.length > 0 && partialMatches.length < words.length) {
162
+ hint = ` Hint: Some words from oldText were found ('${partialMatches.slice(0, 3).join("', '")}'), but the exact string was not. Check for typos or extra whitespace.`;
163
+ }
164
+ }
165
+ return blocked(`Edit tool error: oldText not found in file.${hint} Read the file first to see its current content.`);
166
+ }
167
+ if (matchCount > 1) {
168
+ const firstMatchContext = findMatchContext(content, oldText);
169
+ return blocked(`Edit tool error: found ${matchCount} matches for oldText, but exactly 1 is required. Make oldText more specific to match only one location.\n\nFirst match context:\n${firstMatchContext}`);
170
+ }
171
+ // Exactly one match -> perform the replacement
172
+ const newContent = content.replace(oldText, newText);
173
+ try {
174
+ writeFileSync(path, newContent, "utf-8");
175
+ const oldLines = oldText.split("\n").length;
176
+ const newLines = newText.split("\n").length;
177
+ const lineDiff = newLines - oldLines;
178
+ const lineDiffStr = lineDiff === 0 ? "" : lineDiff > 0 ? ` (+${lineDiff} lines)` : ` (${lineDiff} lines)`;
179
+ const resultText = `Successfully edited ${path}: replaced ${oldText.length} chars with ${newText.length} chars${lineDiffStr}`;
180
+ const { diff, truncation: diffTruncation } = buildSimpleDiff(oldText, newText);
181
+ const toolResult = createToolSuccess(toolCall, resultText);
182
+ const uiEvent = {
183
+ type: "edit_success",
184
+ path,
185
+ oldLength: oldText.length,
186
+ newLength: newText.length,
187
+ diff,
188
+ diffTruncation,
189
+ };
190
+ return { kind: "single", toolResult, uiEvent };
191
+ }
192
+ catch (e) {
193
+ const errorMessage = e instanceof Error ? e.message : String(e);
194
+ return blocked(`Edit tool error: could not write file: ${errorMessage}`);
195
+ }
196
+ },
197
+ };
198
+ }
199
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/tools/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEtD,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAG1E,MAAM,gBAAgB,GAAG;IACvB,8CAA8C;IAC9C,oEAAoE;IACpE,yFAAyF;CAC1F,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,qBAAqB,GAAG,gDAAgD,CAAC;AAC/E,MAAM,yBAAyB,GAAG;IAChC,wEAAwE;IACxE,oCAAoC;IACpC,oFAAoF;CACrF,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACZ,MAAM,yBAAyB,GAAG,mCAAmC,CAAC;AAEtE,MAAM,CAAC,MAAM,SAAS,GAAS;IAC7B,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,gBAAgB;IAC7B,UAAU,EAAE,IAAI,CAAC,MAAM,CACrB;QACE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC;QACzD,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;QAChE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;KACjE,EACD,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAChC;CACF,CAAC;AAEF,SAAS,aAAa,CAAC,GAAY;IACjC,MAAM,IAAI,GAAG,GAA2E,CAAC;IACzF,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,MAAM,OAAO,GAAG,OAAO,IAAI,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,OAAO,GAAG,OAAO,IAAI,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,MAAc;IACvD,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACzC,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,KAAK,EAAE,CAAC;QACR,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,cAAc,GAAG,GAAG,CAAC;AAC3B,MAAM,cAAc,GAAG,MAAM,CAAC;AAW9B,SAAS,eAAe,CAAC,OAAe,EAAE,OAAe;IACvD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE1E,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5B,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC;IACpC,IAAI,WAAW,GAAG,SAAS,CAAC;IAC5B,IAAI,SAAS,GAAG,KAAK,CAAC;IAEtB,0BAA0B;IAC1B,IAAI,WAAW,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QACxC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;QACjD,MAAM,SAAS,GAAG,cAAc,GAAG,SAAS,CAAC;QAC7C,WAAW,GAAG,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACrF,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,IAAI,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElC,8BAA8B;IAC9B,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACpD,IAAI,UAAU,GAAG,cAAc,EAAE,CAAC;QAChC,qCAAqC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,GAAG,cAAc,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,OAAO;QACL,IAAI;QACJ,UAAU,EAAE;YACV,SAAS;YACT,UAAU;YACV,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM;SACrC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe,EAAE,MAAc,EAAE,eAAuB,CAAC;IACjF,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAE5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,cAAc,GAAG,CAAC,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,iBAAiB;QACpE,IAAI,KAAK,GAAG,OAAO,EAAE,CAAC;YACpB,cAAc,GAAG,CAAC,CAAC;YACnB,MAAM;QACR,CAAC;QACD,UAAU,GAAG,OAAO,CAAC;IACvB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,YAAY,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,cAAc,GAAG,YAAY,CAAC,CAAC;IAE1E,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,OAAO,SAAS,SAAS,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,MAAM,cAAc,EAAE,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,wBAAwB;IACtC,OAAO;QACL,MAAM,EAAE,SAAS;QACjB,KAAK,CAAC,QAAQ,CAAC,QAAkB,EAAE,SAAoB;YACrD,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAErE,MAAM,OAAO,GAAG,CAAC,MAAc,EAAsB,EAAE;gBACrD,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACrD,MAAM,OAAO,GAAgB;oBAC3B,IAAI,EAAE,cAAc;oBACpB,IAAI,EAAE,IAAI,IAAI,gBAAgB;oBAC9B,MAAM;iBACP,CAAC;gBACF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;YACjD,CAAC,CAAC;YAEF,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;gBAC/B,OAAO,OAAO,CACZ,8EAA8E,SAAS,0CAA0C,CAClI,CAAC;YACJ,CAAC;YAED,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,OAAO,CAAC,2EAA2E,CAAC,CAAC;YAC9F,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,OAAO,CACZ,2FAA2F,CAC5F,CAAC;YACJ,CAAC;YAED,IAAI,OAAe,CAAC;YACpB,IAAI,CAAC;gBACH,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAChE,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACnD,OAAO,OAAO,CACZ,uCAAuC,IAAI,gCAAgC,CAC5E,CAAC;gBACJ,CAAC;gBACD,OAAO,OAAO,CAAC,yCAAyC,YAAY,EAAE,CAAC,CAAC;YAC1E,CAAC;YAED,MAAM,UAAU,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAEtD,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;gBACrB,wCAAwC;gBACxC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;gBAClC,MAAM,YAAY,GAAG,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAExF,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;oBACrB,IAAI;wBACF,gJAAgJ,CAAC;gBACrJ,CAAC;qBAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAClC,IAAI;wBACF,iHAAiH,CAAC;gBACtH,CAAC;qBAAM,CAAC;oBACN,4BAA4B;oBAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/D,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;wBACtE,IAAI,GAAG,+CAA+C,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,wEAAwE,CAAC;oBACxK,CAAC;gBACH,CAAC;gBAED,OAAO,OAAO,CACZ,8CAA8C,IAAI,kDAAkD,CACrG,CAAC;YACJ,CAAC;YAED,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC7D,OAAO,OAAO,CACZ,0BAA0B,UAAU,oIAAoI,iBAAiB,EAAE,CAC5L,CAAC;YACJ,CAAC;YAED,+CAA+C;YAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAErD,IAAI,CAAC;gBACH,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;gBAEzC,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;gBAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;gBAC5C,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;gBACrC,MAAM,WAAW,GACf,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,SAAS,CAAC;gBAExF,MAAM,UAAU,GAAG,uBAAuB,IAAI,cAAc,OAAO,CAAC,MAAM,eAAe,OAAO,CAAC,MAAM,SAAS,WAAW,EAAE,CAAC;gBAE9H,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAE/E,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;gBAC3D,MAAM,OAAO,GAAgB;oBAC3B,IAAI,EAAE,cAAc;oBACpB,IAAI;oBACJ,SAAS,EAAE,OAAO,CAAC,MAAM;oBACzB,SAAS,EAAE,OAAO,CAAC,MAAM;oBACzB,IAAI;oBACJ,cAAc;iBACf,CAAC;gBACF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;YACjD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,YAAY,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAChE,OAAO,OAAO,CAAC,0CAA0C,YAAY,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ export class ToolRegistry {
2
+ byName = new Map();
3
+ constructor(definitions) {
4
+ for (const def of definitions) {
5
+ this.byName.set(def.schema.name, def);
6
+ }
7
+ }
8
+ get schemas() {
9
+ return [...this.byName.values()].map((d) => d.schema);
10
+ }
11
+ get(toolName) {
12
+ return this.byName.get(toolName);
13
+ }
14
+ }
15
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AA2GA,MAAM,OAAO,YAAY;IACN,MAAM,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE5D,YAAY,WAA6B;QACvC,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,IAAI,OAAO;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,202 @@
1
+ import { Type } from "@sinclair/typebox";
2
+ import { getSubagentDefinitionFromString } from "../subagents/registry.js";
3
+ import { runSubagentToCompletion } from "../subagents/subagent_engine.js";
4
+ import { createToolError, createToolResult } from "../utils/messages.js";
5
+ const TASK_DESCRIPTION = [
6
+ "Run an isolated sub-agent task to completion and return only its final text output.",
7
+ "Use this to delegate narrow exploration or focused work to a constrained sub-agent.",
8
+ "See your system instructions for available sub-agents, their capabilities, and intended use cases.",
9
+ ].join(" ");
10
+ const TASK_NAME_DESCRIPTION = [
11
+ "Sub-agent name to run.",
12
+ "Available sub-agents depend on the current persona configuration.",
13
+ ].join(" ");
14
+ const TASK_TITLE_DESCRIPTION = [
15
+ "A short human-friendly UI title shown while the task runs.",
16
+ "Do not use title case; all lower-case is preferred except for proper nouns.",
17
+ ].join(" ");
18
+ const TASK_PROMPT_DESCRIPTION = [
19
+ "The prompt to send to the sub-agent.",
20
+ "This is the only input the sub-agent will receive; it must be self-contained and specific.",
21
+ "Include all necessary context and instructions in the prompt for the sub-agent to complete the task successfully.",
22
+ ].join(" ");
23
+ export const TASK_TOOL = {
24
+ name: "task",
25
+ description: TASK_DESCRIPTION,
26
+ parameters: Type.Object({
27
+ name: Type.String({ description: TASK_NAME_DESCRIPTION }),
28
+ title: Type.String({ description: TASK_TITLE_DESCRIPTION }),
29
+ prompt: Type.String({ description: TASK_PROMPT_DESCRIPTION }),
30
+ }, { additionalProperties: false }),
31
+ };
32
+ function parseTaskArgs(raw) {
33
+ const args = raw;
34
+ const name = typeof args?.name === "string" ? args.name.trim() : "";
35
+ const title = typeof args?.title === "string" ? args.title.trim() : "";
36
+ const prompt = typeof args?.prompt === "string" ? args.prompt.trim() : "";
37
+ return { name, title, prompt };
38
+ }
39
+ class AsyncUiEventQueue {
40
+ buffered = [];
41
+ waiting = [];
42
+ closed = false;
43
+ push(event) {
44
+ if (this.closed)
45
+ return;
46
+ const next = this.waiting.shift();
47
+ if (next) {
48
+ next({ value: event, done: false });
49
+ return;
50
+ }
51
+ this.buffered.push(event);
52
+ }
53
+ close() {
54
+ if (this.closed)
55
+ return;
56
+ this.closed = true;
57
+ for (const resolve of this.waiting.splice(0)) {
58
+ resolve({ value: undefined, done: true });
59
+ }
60
+ }
61
+ [Symbol.asyncIterator]() {
62
+ return {
63
+ next: () => {
64
+ if (this.buffered.length > 0) {
65
+ return Promise.resolve({ value: this.buffered.shift(), done: false });
66
+ }
67
+ if (this.closed) {
68
+ return Promise.resolve({ value: undefined, done: true });
69
+ }
70
+ return new Promise((resolve) => this.waiting.push(resolve));
71
+ },
72
+ };
73
+ }
74
+ }
75
+ function getEnabledSubagentConfig(context, definition) {
76
+ const persona = context?.persona;
77
+ const config = persona?.subagents;
78
+ return config?.[definition.name];
79
+ }
80
+ export function createTaskToolDefinition() {
81
+ return {
82
+ schema: TASK_TOOL,
83
+ async dispatch(toolCall, riskLevel, signal, context) {
84
+ const { name, title, prompt } = parseTaskArgs(toolCall.arguments);
85
+ const blocked = (reason, details) => {
86
+ const toolResult = createToolError(toolCall, reason);
87
+ const uiEvent = {
88
+ type: "task_blocked",
89
+ toolCallId: toolCall.id,
90
+ name: details?.name ?? (name || undefined),
91
+ title: details?.title ?? (title || "(task)"),
92
+ reason,
93
+ };
94
+ return { kind: "single", toolResult, uiEvent };
95
+ };
96
+ if (riskLevel === "none") {
97
+ return blocked("Task tool blocked due to risk level being set to 'none'. Ask the user to enable it with /risk:read-only or /risk:read-write.");
98
+ }
99
+ if (!name || !title || !prompt) {
100
+ const missing = [
101
+ !name ? "name" : undefined,
102
+ !title ? "title" : undefined,
103
+ !prompt ? "prompt" : undefined,
104
+ ].filter(Boolean);
105
+ return blocked(`Task tool error: missing required parameter(s): ${missing.join(", ")}.`, {
106
+ title: title || "(task)",
107
+ });
108
+ }
109
+ if (!context?.persona.subagents || Object.keys(context.persona.subagents).length === 0) {
110
+ return blocked("Task tool is not enabled for the current persona.", { name, title });
111
+ }
112
+ const definition = getSubagentDefinitionFromString(name);
113
+ if (!definition) {
114
+ return blocked(`Unknown sub-agent '${name}'.`, { name, title });
115
+ }
116
+ const personaConfig = getEnabledSubagentConfig(context, definition);
117
+ if (!personaConfig) {
118
+ return blocked(`Sub-agent '${definition.name}' is not enabled for the current persona.`, {
119
+ name: definition.name,
120
+ title,
121
+ });
122
+ }
123
+ const uiQueue = new AsyncUiEventQueue();
124
+ let costTotal = 0;
125
+ let turns = 0;
126
+ let toolCalls = 0;
127
+ const pushProgress = (eventText, nextCostTotal, nextTurns, nextToolCalls) => {
128
+ costTotal = nextCostTotal;
129
+ turns = nextTurns;
130
+ toolCalls = nextToolCalls;
131
+ uiQueue.push({
132
+ type: "task_progress",
133
+ toolCallId: toolCall.id,
134
+ name: definition.name,
135
+ title,
136
+ event: eventText,
137
+ costTotal,
138
+ turns,
139
+ toolCalls,
140
+ });
141
+ };
142
+ const run = (async () => {
143
+ let status = "success";
144
+ let finalText = "";
145
+ try {
146
+ // Emit task started event
147
+ pushProgress("task started", 0, 0, 0);
148
+ const result = await runSubagentToCompletion({
149
+ definition,
150
+ personaConfig,
151
+ prompt,
152
+ config: context.config,
153
+ signal: signal ?? new AbortController().signal,
154
+ onProgress: (e) => pushProgress(e.text, e.costTotal, e.turns, e.toolCalls),
155
+ });
156
+ finalText = result.finalText;
157
+ costTotal = result.costTotal;
158
+ }
159
+ catch (err) {
160
+ if (signal?.aborted) {
161
+ status = "aborted";
162
+ finalText = "Task aborted.";
163
+ }
164
+ else {
165
+ status = "error";
166
+ finalText = `Task failed: ${err instanceof Error ? err.message : String(err)}`;
167
+ }
168
+ }
169
+ finally {
170
+ uiQueue.close();
171
+ }
172
+ const toolResult = status === "success"
173
+ ? createToolResult(toolCall, finalText, false)
174
+ : createToolResult(toolCall, finalText, true);
175
+ const uiEvent = {
176
+ type: "task_finished",
177
+ toolCallId: toolCall.id,
178
+ name: definition.name,
179
+ title,
180
+ costTotal,
181
+ turns,
182
+ toolCalls,
183
+ status,
184
+ finalOutput: finalText,
185
+ };
186
+ return { kind: "single", toolResult, uiEvent };
187
+ })();
188
+ return {
189
+ kind: "phased",
190
+ startedUiEvent: {
191
+ type: "task_started",
192
+ toolCallId: toolCall.id,
193
+ name: definition.name,
194
+ title,
195
+ },
196
+ uiEvents: uiQueue,
197
+ run,
198
+ };
199
+ },
200
+ };
201
+ }
202
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/tools/task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { dirname } from "node:path";
3
+ import { Type } from "@sinclair/typebox";
4
+ import { createToolError, createToolSuccess } from "../utils/messages.js";
5
+ const WRITE_DESCRIPTION = [
6
+ "Write content to a file, creating the file if it doesn't exist or overwriting if it does.",
7
+ "Creates parent directories as needed.",
8
+ ].join(" ");
9
+ const WRITE_PATH_DESCRIPTION = "Absolute or relative path to the file to write.";
10
+ const WRITE_CONTENT_DESCRIPTION = "The content to write to the file.";
11
+ export const WRITE_TOOL = {
12
+ name: "write",
13
+ description: WRITE_DESCRIPTION,
14
+ parameters: Type.Object({
15
+ path: Type.String({ description: WRITE_PATH_DESCRIPTION }),
16
+ content: Type.String({ description: WRITE_CONTENT_DESCRIPTION }),
17
+ }, { additionalProperties: false }),
18
+ };
19
+ function parseWriteArgs(raw) {
20
+ const args = raw;
21
+ const path = typeof args?.path === "string" ? args.path.trim() : "";
22
+ const content = typeof args?.content === "string" ? args.content : "";
23
+ return { path, content };
24
+ }
25
+ const PREVIEW_LINES = 16;
26
+ function buildPreview(content) {
27
+ const contentLines = content.split("\n");
28
+ const totalLines = contentLines.length;
29
+ const truncated = totalLines > PREVIEW_LINES;
30
+ const previewLines = truncated ? contentLines.slice(0, PREVIEW_LINES) : contentLines;
31
+ const preview = previewLines.join("\n");
32
+ return {
33
+ preview,
34
+ truncation: {
35
+ truncated,
36
+ totalLines,
37
+ outputLines: previewLines.length,
38
+ },
39
+ };
40
+ }
41
+ export function createWriteToolDefinition() {
42
+ return {
43
+ schema: WRITE_TOOL,
44
+ async dispatch(toolCall, riskLevel) {
45
+ const { path, content } = parseWriteArgs(toolCall.arguments);
46
+ const blocked = (reason) => {
47
+ const toolResult = createToolError(toolCall, reason);
48
+ const uiEvent = {
49
+ type: "write_blocked",
50
+ path: path || "(missing path)",
51
+ reason,
52
+ };
53
+ return { kind: "single", toolResult, uiEvent };
54
+ };
55
+ if (riskLevel !== "read-write") {
56
+ return blocked(`Write tool blocked: requires risk level 'read-write', but current level is '${riskLevel}'. Ask the user to run /risk:read-write.`);
57
+ }
58
+ if (!path) {
59
+ return blocked("Write tool error: missing 'path' parameter. Provide the file path to write to.");
60
+ }
61
+ try {
62
+ const dir = dirname(path);
63
+ if (dir && dir !== ".") {
64
+ mkdirSync(dir, { recursive: true });
65
+ }
66
+ writeFileSync(path, content, "utf-8");
67
+ const bytes = Buffer.byteLength(content, "utf-8");
68
+ const lines = content.split("\n").length;
69
+ const resultText = `Successfully wrote ${bytes} bytes (${lines} lines) to ${path}`;
70
+ const { preview, truncation: previewTruncation } = buildPreview(content);
71
+ const toolResult = createToolSuccess(toolCall, resultText);
72
+ const uiEvent = {
73
+ type: "write_success",
74
+ path,
75
+ bytes,
76
+ lines,
77
+ preview,
78
+ previewTruncation,
79
+ };
80
+ return { kind: "single", toolResult, uiEvent };
81
+ }
82
+ catch (e) {
83
+ const errorMessage = e instanceof Error ? e.message : String(e);
84
+ return blocked(`Write tool failed: ${errorMessage}`);
85
+ }
86
+ },
87
+ };
88
+ }
89
+ //# sourceMappingURL=write.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/tools/write.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,9 @@
1
+ export const REASONING_LEVELS = [
2
+ "none",
3
+ "minimal",
4
+ "low",
5
+ "medium",
6
+ "high",
7
+ "xhigh",
8
+ ];
9
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAiBA,MAAM,CAAC,MAAM,gBAAgB,GAAsB;IACjD,MAAM;IACN,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,OAAO;CACR,CAAC"}
@@ -0,0 +1,87 @@
1
+ import { Container, Markdown, Spacer, Text } from "@mariozechner/pi-tui";
2
+ import { theme } from "./theme.js";
3
+ export class AssistantMessageComponent extends Container {
4
+ contentContainer;
5
+ thoughtsVisible;
6
+ currentMessage = null;
7
+ _hasVisibleText = false;
8
+ get hasVisibleText() {
9
+ return this._hasVisibleText;
10
+ }
11
+ constructor(message, thoughtsVisible = false) {
12
+ super();
13
+ this.contentContainer = new Container();
14
+ this.thoughtsVisible = thoughtsVisible;
15
+ this.addChild(this.contentContainer);
16
+ if (message) {
17
+ this.updateFromMessage(message);
18
+ }
19
+ }
20
+ setThinkingVisibility(visible) {
21
+ this.thoughtsVisible = visible;
22
+ if (this.currentMessage !== null) {
23
+ this.updateFromMessage(this.currentMessage);
24
+ }
25
+ }
26
+ updatePartial(text, thinking) {
27
+ const partial = {
28
+ role: "assistant",
29
+ api: "openai-responses",
30
+ provider: "openai",
31
+ model: "",
32
+ timestamp: Date.now(),
33
+ usage: {
34
+ input: 0,
35
+ output: 0,
36
+ cacheRead: 0,
37
+ cacheWrite: 0,
38
+ totalTokens: 0,
39
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
40
+ },
41
+ stopReason: "stop",
42
+ content: [
43
+ ...(thinking?.trim() ? [{ type: "thinking", thinking }] : []),
44
+ { type: "text", text },
45
+ ],
46
+ };
47
+ this.updateFromMessage(partial);
48
+ }
49
+ updateFromMessage(message) {
50
+ const { palette, markdownTheme } = theme;
51
+ this.currentMessage = message;
52
+ this.contentContainer.clear();
53
+ this._hasVisibleText = false;
54
+ for (let i = 0; i < message.content.length; i++) {
55
+ const content = message.content[i];
56
+ if (this.thoughtsVisible && content.type === "thinking" && content.thinking.trim()) {
57
+ this.contentContainer.addChild(new Markdown(content.thinking.trim(), 1, 0, markdownTheme, {
58
+ color: (t) => palette.thinking(t),
59
+ italic: true,
60
+ }));
61
+ this._hasVisibleText = true;
62
+ const hasTextAfter = message.content
63
+ .slice(i + 1)
64
+ .some((c) => c.type === "text" && c.text.trim());
65
+ if (hasTextAfter) {
66
+ this.contentContainer.addChild(new Spacer(1));
67
+ }
68
+ }
69
+ if (content.type === "text" && content.text.trim()) {
70
+ this.contentContainer.addChild(new Markdown(content.text.trim(), 1, 0, markdownTheme));
71
+ this._hasVisibleText = true;
72
+ }
73
+ }
74
+ if (message.stopReason === "aborted") {
75
+ this.contentContainer.addChild(new Spacer(1));
76
+ this.contentContainer.addChild(new Text(palette.warn("aborted"), 1, 0));
77
+ this._hasVisibleText = true;
78
+ }
79
+ else if (message.stopReason === "error") {
80
+ const errorMsg = message.errorMessage || "unknown error";
81
+ this.contentContainer.addChild(new Spacer(1));
82
+ this.contentContainer.addChild(new Text(palette.error(`error: ${errorMsg}`), 1, 0));
83
+ this._hasVisibleText = true;
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=assistant_message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assistant_message.js","sourceRoot":"","sources":["../../src/ui/assistant_message.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,MAAM,OAAO,yBAA0B,SAAQ,SAAS;IAC9C,gBAAgB,CAAY;IAC5B,eAAe,CAAU;IACzB,cAAc,GAA4B,IAAI,CAAC;IAE/C,eAAe,GAAY,KAAK,CAAC;IAEzC,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,YAAY,OAA0B,EAAE,eAAe,GAAG,KAAK;QAC7D,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,gBAAgB,GAAG,IAAI,SAAS,EAAE,CAAC;QACxC,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QAEvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAErC,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,qBAAqB,CAAC,OAAgB;QACpC,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QAE/B,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;YACjC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,aAAa,CAAC,IAAY,EAAE,QAAiB;QAC3C,MAAM,OAAO,GAAqB;YAChC,IAAI,EAAE,WAAW;YACjB,GAAG,EAAE,kBAAkB;YACvB,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,EAAE;YACT,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,KAAK,EAAE;gBACL,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,CAAC;gBACZ,UAAU,EAAE,CAAC;gBACb,WAAW,EAAE,CAAC;gBACd,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE;aACrE;YACD,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE;gBACP,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAmB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACtE,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE;aAChC;SACF,CAAC;QACF,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED,iBAAiB,CAAC,OAAyB;QACzC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;QAEzC,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;QAC9B,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;YAEpC,IAAI,IAAI,CAAC,eAAe,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnF,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAC5B,IAAI,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE;oBACzD,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;oBACzC,MAAM,EAAE,IAAI;iBACb,CAAC,CACH,CAAC;gBACF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBAE5B,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO;qBACjC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC;qBACZ,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACnD,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;gBACvF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;aAAM,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,IAAI,eAAe,CAAC;YACzD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACpF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;CACF"}