openhorse 0.2.21 → 0.2.23

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 (263) hide show
  1. package/dist/cli.js +25 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/commands/index.d.ts.map +1 -1
  4. package/dist/commands/index.js +189 -49
  5. package/dist/commands/index.js.map +1 -1
  6. package/dist/commands/parser.d.ts.map +1 -1
  7. package/dist/commands/parser.js +8 -3
  8. package/dist/commands/parser.js.map +1 -1
  9. package/dist/commands/types.d.ts +2 -0
  10. package/dist/commands/types.d.ts.map +1 -1
  11. package/dist/commands/types.js.map +1 -1
  12. package/dist/core/cost-tracker.d.ts +45 -5
  13. package/dist/core/cost-tracker.d.ts.map +1 -1
  14. package/dist/core/cost-tracker.js +78 -13
  15. package/dist/core/cost-tracker.js.map +1 -1
  16. package/dist/framework/index.d.ts +1 -1
  17. package/dist/framework/index.d.ts.map +1 -1
  18. package/dist/framework/index.js.map +1 -1
  19. package/dist/framework/query.d.ts +25 -0
  20. package/dist/framework/query.d.ts.map +1 -1
  21. package/dist/framework/query.js +196 -49
  22. package/dist/framework/query.js.map +1 -1
  23. package/dist/framework/store.d.ts +6 -1
  24. package/dist/framework/store.d.ts.map +1 -1
  25. package/dist/framework/store.js +10 -1
  26. package/dist/framework/store.js.map +1 -1
  27. package/dist/harness/capsule.d.ts +1 -0
  28. package/dist/harness/capsule.d.ts.map +1 -1
  29. package/dist/harness/capsule.js +38 -9
  30. package/dist/harness/capsule.js.map +1 -1
  31. package/dist/harness/contract.d.ts +2 -0
  32. package/dist/harness/contract.d.ts.map +1 -1
  33. package/dist/harness/contract.js +78 -14
  34. package/dist/harness/contract.js.map +1 -1
  35. package/dist/harness/index.d.ts +2 -2
  36. package/dist/harness/index.d.ts.map +1 -1
  37. package/dist/harness/index.js +4 -1
  38. package/dist/harness/index.js.map +1 -1
  39. package/dist/harness/ledger.d.ts.map +1 -1
  40. package/dist/harness/ledger.js +6 -2
  41. package/dist/harness/ledger.js.map +1 -1
  42. package/dist/harness/state.d.ts.map +1 -1
  43. package/dist/harness/state.js +37 -7
  44. package/dist/harness/state.js.map +1 -1
  45. package/dist/index.d.ts +2 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/ink-ui/components/StatusLine.d.ts.map +1 -1
  48. package/dist/ink-ui/components/StatusLine.js +0 -2
  49. package/dist/ink-ui/components/StatusLine.js.map +1 -1
  50. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  51. package/dist/ink-ui/screens/ReplScreen.js +12 -5
  52. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  53. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
  54. package/dist/runtime/agent-runtime-controller.js +11 -1
  55. package/dist/runtime/agent-runtime-controller.js.map +1 -1
  56. package/dist/runtime/aggregate-tool-presenter.d.ts +13 -0
  57. package/dist/runtime/aggregate-tool-presenter.d.ts.map +1 -0
  58. package/dist/runtime/aggregate-tool-presenter.js +44 -0
  59. package/dist/runtime/aggregate-tool-presenter.js.map +1 -0
  60. package/dist/runtime/chat-controller.d.ts +9 -2
  61. package/dist/runtime/chat-controller.d.ts.map +1 -1
  62. package/dist/runtime/chat-controller.js +345 -90
  63. package/dist/runtime/chat-controller.js.map +1 -1
  64. package/dist/runtime/rich-text/ansi-parser.d.ts +1 -1
  65. package/dist/runtime/rich-text/ansi-parser.d.ts.map +1 -1
  66. package/dist/runtime/rich-text/ansi-parser.js +93 -55
  67. package/dist/runtime/rich-text/ansi-parser.js.map +1 -1
  68. package/dist/runtime/rich-text/layout.d.ts +2 -11
  69. package/dist/runtime/rich-text/layout.d.ts.map +1 -1
  70. package/dist/runtime/rich-text/layout.js +280 -245
  71. package/dist/runtime/rich-text/layout.js.map +1 -1
  72. package/dist/runtime/rich-text/markdown-parser.js +31 -24
  73. package/dist/runtime/rich-text/markdown-parser.js.map +1 -1
  74. package/dist/runtime/rich-text/types.d.ts +1 -1
  75. package/dist/runtime/rich-text/types.d.ts.map +1 -1
  76. package/dist/runtime/subagents/production.d.ts.map +1 -1
  77. package/dist/runtime/subagents/production.js +28 -3
  78. package/dist/runtime/subagents/production.js.map +1 -1
  79. package/dist/runtime/subagents/result-parser.d.ts.map +1 -1
  80. package/dist/runtime/subagents/result-parser.js +54 -40
  81. package/dist/runtime/subagents/result-parser.js.map +1 -1
  82. package/dist/runtime/subagents/types.d.ts +2 -0
  83. package/dist/runtime/subagents/types.d.ts.map +1 -1
  84. package/dist/runtime/subagents/types.js +5 -1
  85. package/dist/runtime/subagents/types.js.map +1 -1
  86. package/dist/runtime/tool-detail-repository.d.ts +45 -0
  87. package/dist/runtime/tool-detail-repository.d.ts.map +1 -0
  88. package/dist/runtime/tool-detail-repository.js +131 -0
  89. package/dist/runtime/tool-detail-repository.js.map +1 -0
  90. package/dist/runtime/tool-output-presentation.d.ts +89 -0
  91. package/dist/runtime/tool-output-presentation.d.ts.map +1 -0
  92. package/dist/runtime/tool-output-presentation.js +329 -0
  93. package/dist/runtime/tool-output-presentation.js.map +1 -0
  94. package/dist/runtime/ui-events.d.ts +17 -0
  95. package/dist/runtime/ui-events.d.ts.map +1 -1
  96. package/dist/runtime/ui-events.js.map +1 -1
  97. package/dist/runtime/ui-view-model.d.ts +9 -0
  98. package/dist/runtime/ui-view-model.d.ts.map +1 -1
  99. package/dist/runtime/ui-view-model.js +59 -37
  100. package/dist/runtime/ui-view-model.js.map +1 -1
  101. package/dist/services/compact/auto-compact.d.ts +15 -2
  102. package/dist/services/compact/auto-compact.d.ts.map +1 -1
  103. package/dist/services/compact/auto-compact.js +56 -24
  104. package/dist/services/compact/auto-compact.js.map +1 -1
  105. package/dist/services/compact/compact.d.ts +2 -0
  106. package/dist/services/compact/compact.d.ts.map +1 -1
  107. package/dist/services/compact/compact.js +22 -5
  108. package/dist/services/compact/compact.js.map +1 -1
  109. package/dist/services/compact/coordinator.d.ts +26 -0
  110. package/dist/services/compact/coordinator.d.ts.map +1 -0
  111. package/dist/services/compact/coordinator.js +44 -0
  112. package/dist/services/compact/coordinator.js.map +1 -0
  113. package/dist/services/compact/index.d.ts +1 -0
  114. package/dist/services/compact/index.d.ts.map +1 -1
  115. package/dist/services/compact/index.js +3 -1
  116. package/dist/services/compact/index.js.map +1 -1
  117. package/dist/services/compact/summary-generator.d.ts +6 -2
  118. package/dist/services/compact/summary-generator.d.ts.map +1 -1
  119. package/dist/services/compact/summary-generator.js +73 -31
  120. package/dist/services/compact/summary-generator.js.map +1 -1
  121. package/dist/services/config-dir.d.ts +11 -1
  122. package/dist/services/config-dir.d.ts.map +1 -1
  123. package/dist/services/config-dir.js +19 -2
  124. package/dist/services/config-dir.js.map +1 -1
  125. package/dist/services/config.d.ts +4 -2
  126. package/dist/services/config.d.ts.map +1 -1
  127. package/dist/services/config.js +40 -0
  128. package/dist/services/config.js.map +1 -1
  129. package/dist/services/doctor.d.ts +2 -0
  130. package/dist/services/doctor.d.ts.map +1 -1
  131. package/dist/services/doctor.js +8 -1
  132. package/dist/services/doctor.js.map +1 -1
  133. package/dist/services/global-config.d.ts +10 -0
  134. package/dist/services/global-config.d.ts.map +1 -1
  135. package/dist/services/global-config.js.map +1 -1
  136. package/dist/services/llm.d.ts +21 -4
  137. package/dist/services/llm.d.ts.map +1 -1
  138. package/dist/services/llm.js +66 -8
  139. package/dist/services/llm.js.map +1 -1
  140. package/dist/services/model-context.d.ts +36 -0
  141. package/dist/services/model-context.d.ts.map +1 -1
  142. package/dist/services/model-context.js +245 -32
  143. package/dist/services/model-context.js.map +1 -1
  144. package/dist/services/redaction.js +1 -1
  145. package/dist/services/redaction.js.map +1 -1
  146. package/dist/services/session-storage.d.ts +42 -1
  147. package/dist/services/session-storage.d.ts.map +1 -1
  148. package/dist/services/session-storage.js +175 -54
  149. package/dist/services/session-storage.js.map +1 -1
  150. package/dist/services/storage-maintenance.d.ts.map +1 -1
  151. package/dist/services/storage-maintenance.js +3 -2
  152. package/dist/services/storage-maintenance.js.map +1 -1
  153. package/dist/services/usage-state.d.ts +55 -5
  154. package/dist/services/usage-state.d.ts.map +1 -1
  155. package/dist/services/usage-state.js +185 -59
  156. package/dist/services/usage-state.js.map +1 -1
  157. package/dist/services/verification-profile.d.ts.map +1 -1
  158. package/dist/services/verification-profile.js +3 -2
  159. package/dist/services/verification-profile.js.map +1 -1
  160. package/dist/services/workspace-diff.d.ts.map +1 -1
  161. package/dist/services/workspace-diff.js +34 -3
  162. package/dist/services/workspace-diff.js.map +1 -1
  163. package/dist/services/yaml-config.js +1 -1
  164. package/dist/skills/runtime.d.ts +9 -5
  165. package/dist/skills/runtime.d.ts.map +1 -1
  166. package/dist/skills/runtime.js +157 -12
  167. package/dist/skills/runtime.js.map +1 -1
  168. package/dist/terminal-ui/editor.d.ts.map +1 -1
  169. package/dist/terminal-ui/editor.js +14 -3
  170. package/dist/terminal-ui/editor.js.map +1 -1
  171. package/dist/terminal-ui/launch.d.ts +21 -0
  172. package/dist/terminal-ui/launch.d.ts.map +1 -1
  173. package/dist/terminal-ui/launch.js +203 -45
  174. package/dist/terminal-ui/launch.js.map +1 -1
  175. package/dist/terminal-ui/output-queue.d.ts +43 -0
  176. package/dist/terminal-ui/output-queue.d.ts.map +1 -0
  177. package/dist/terminal-ui/output-queue.js +139 -0
  178. package/dist/terminal-ui/output-queue.js.map +1 -0
  179. package/dist/terminal-ui/raw-editor.d.ts +42 -0
  180. package/dist/terminal-ui/raw-editor.d.ts.map +1 -1
  181. package/dist/terminal-ui/raw-editor.js +337 -41
  182. package/dist/terminal-ui/raw-editor.js.map +1 -1
  183. package/dist/tools/bash_security.d.ts.map +1 -1
  184. package/dist/tools/bash_security.js +14 -5
  185. package/dist/tools/bash_security.js.map +1 -1
  186. package/dist/tools/index.d.ts.map +1 -1
  187. package/dist/tools/index.js +176 -73
  188. package/dist/tools/index.js.map +1 -1
  189. package/dist/tools/plan.d.ts.map +1 -1
  190. package/dist/tools/plan.js +7 -0
  191. package/dist/tools/plan.js.map +1 -1
  192. package/dist/tools/web.d.ts +10 -0
  193. package/dist/tools/web.d.ts.map +1 -1
  194. package/dist/tools/web.js +81 -1
  195. package/dist/tools/web.js.map +1 -1
  196. package/dist/tui-core/input-parser.d.ts +9 -2
  197. package/dist/tui-core/input-parser.d.ts.map +1 -1
  198. package/dist/tui-core/input-parser.js +57 -3
  199. package/dist/tui-core/input-parser.js.map +1 -1
  200. package/dist/tui-core/style.d.ts +16 -0
  201. package/dist/tui-core/style.d.ts.map +1 -1
  202. package/dist/tui-core/style.js +22 -1
  203. package/dist/tui-core/style.js.map +1 -1
  204. package/dist/tui-ui/inline-surface.d.ts +69 -12
  205. package/dist/tui-ui/inline-surface.d.ts.map +1 -1
  206. package/dist/tui-ui/inline-surface.js +366 -94
  207. package/dist/tui-ui/inline-surface.js.map +1 -1
  208. package/dist/tui-ui/input-ownership.d.ts +46 -0
  209. package/dist/tui-ui/input-ownership.d.ts.map +1 -0
  210. package/dist/tui-ui/input-ownership.js +74 -0
  211. package/dist/tui-ui/input-ownership.js.map +1 -0
  212. package/dist/tui-ui/launch.d.ts +2 -0
  213. package/dist/tui-ui/launch.d.ts.map +1 -1
  214. package/dist/tui-ui/launch.js +289 -43
  215. package/dist/tui-ui/launch.js.map +1 -1
  216. package/dist/tui-ui/layout.d.ts +52 -2
  217. package/dist/tui-ui/layout.d.ts.map +1 -1
  218. package/dist/tui-ui/layout.js +230 -76
  219. package/dist/tui-ui/layout.js.map +1 -1
  220. package/dist/tui-ui/runner.d.ts +101 -8
  221. package/dist/tui-ui/runner.d.ts.map +1 -1
  222. package/dist/tui-ui/runner.js +843 -51
  223. package/dist/tui-ui/runner.js.map +1 -1
  224. package/dist/tui-ui/state.d.ts +70 -4
  225. package/dist/tui-ui/state.d.ts.map +1 -1
  226. package/dist/tui-ui/state.js +251 -20
  227. package/dist/tui-ui/state.js.map +1 -1
  228. package/dist/tui-ui/theme-profile.d.ts +25 -0
  229. package/dist/tui-ui/theme-profile.d.ts.map +1 -0
  230. package/dist/tui-ui/theme-profile.js +130 -0
  231. package/dist/tui-ui/theme-profile.js.map +1 -0
  232. package/dist/tui-ui/theme.d.ts +13 -0
  233. package/dist/tui-ui/theme.d.ts.map +1 -0
  234. package/dist/tui-ui/theme.js +20 -0
  235. package/dist/tui-ui/theme.js.map +1 -0
  236. package/dist/tui-ui/transcript-cache.d.ts +5 -3
  237. package/dist/tui-ui/transcript-cache.d.ts.map +1 -1
  238. package/dist/tui-ui/transcript-cache.js +16 -9
  239. package/dist/tui-ui/transcript-cache.js.map +1 -1
  240. package/dist/tui-ui/transcript-inspector-layout.d.ts +9 -0
  241. package/dist/tui-ui/transcript-inspector-layout.d.ts.map +1 -0
  242. package/dist/tui-ui/transcript-inspector-layout.js +97 -0
  243. package/dist/tui-ui/transcript-inspector-layout.js.map +1 -0
  244. package/dist/tui-ui/transcript-inspector-surface.d.ts +18 -0
  245. package/dist/tui-ui/transcript-inspector-surface.d.ts.map +1 -0
  246. package/dist/tui-ui/transcript-inspector-surface.js +88 -0
  247. package/dist/tui-ui/transcript-inspector-surface.js.map +1 -0
  248. package/dist/tui-ui/transcript-inspector.d.ts +35 -0
  249. package/dist/tui-ui/transcript-inspector.d.ts.map +1 -0
  250. package/dist/tui-ui/transcript-inspector.js +128 -0
  251. package/dist/tui-ui/transcript-inspector.js.map +1 -0
  252. package/dist/tui-ui/transcript-layout.d.ts +22 -0
  253. package/dist/tui-ui/transcript-layout.d.ts.map +1 -0
  254. package/dist/tui-ui/transcript-layout.js +439 -0
  255. package/dist/tui-ui/transcript-layout.js.map +1 -0
  256. package/dist/ui/status-bar.d.ts +1 -1
  257. package/dist/ui/status-bar.d.ts.map +1 -1
  258. package/dist/ui/status-bar.js +2 -15
  259. package/dist/ui/status-bar.js.map +1 -1
  260. package/dist/ui-v2/components/shell.d.ts.map +1 -1
  261. package/dist/ui-v2/components/shell.js +0 -8
  262. package/dist/ui-v2/components/shell.js.map +1 -1
  263. package/package.json +1 -1
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ /**
3
+ * v0.2.23 — Tool Detail Repository.
4
+ *
5
+ * Read-only interface for accessing tool output details from durable sources
6
+ * (artifacts, session traces). Supports paginated reads with byte-offset
7
+ * limits. Never loads full multi-MB artifacts into memory at once.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.FileToolDetailRepository = void 0;
11
+ const fs_1 = require("fs");
12
+ const tool_artifacts_1 = require("../core/tool-artifacts");
13
+ const config_dir_1 = require("../services/config-dir");
14
+ const redaction_1 = require("../services/redaction");
15
+ const path_1 = require("path");
16
+ // ============================================================================
17
+ // Implementation
18
+ // ============================================================================
19
+ const MAX_PAGE_BYTES = 1024 * 1024; // 1 MB max per page
20
+ const DEFAULT_LIMIT_BYTES = 64 * 1024; // 64 KB default page
21
+ class FileToolDetailRepository {
22
+ async list(projectPath) {
23
+ try {
24
+ const artifacts = (0, tool_artifacts_1.listArtifacts)(projectPath);
25
+ return artifacts.map(a => ({
26
+ callId: artifactIdToCallId(a.id),
27
+ sequence: 0, // sequence not stored in artifact metadata currently
28
+ toolName: a.toolName,
29
+ state: 'success',
30
+ outputBytes: a.outputBytes,
31
+ artifactId: a.id,
32
+ hasArtifact: true,
33
+ }));
34
+ }
35
+ catch {
36
+ return [];
37
+ }
38
+ }
39
+ async read(ref, options, projectPath) {
40
+ const limitBytes = Math.min(options.limitBytes || DEFAULT_LIMIT_BYTES, MAX_PAGE_BYTES);
41
+ const offsetBytes = Math.max(0, options.offsetBytes || 0);
42
+ // Try reading from artifact file on disk.
43
+ if (ref.artifactId) {
44
+ // v0.2.23: reject path traversal in artifact IDs.
45
+ if (ref.artifactId.includes('..') || ref.artifactId.includes('/') || ref.artifactId.includes('\\')) {
46
+ return { content: 'detail unavailable', offsetBytes: 0, totalBytes: 0, redacted: false };
47
+ }
48
+ try {
49
+ const artifactDir = (0, config_dir_1.getProjectArtifactsDir)(projectPath);
50
+ const filePath = (0, path_1.join)(artifactDir, `${ref.artifactId}.txt`);
51
+ if ((0, fs_1.existsSync)(filePath)) {
52
+ const totalBytes = (0, fs_1.statSync)(filePath).size;
53
+ if (offsetBytes >= totalBytes) {
54
+ return { content: '', offsetBytes, totalBytes, redacted: false };
55
+ }
56
+ const requestedBytes = Math.min(limitBytes + 3, totalBytes - offsetBytes);
57
+ const buffer = Buffer.allocUnsafe(requestedBytes);
58
+ const fd = (0, fs_1.openSync)(filePath, 'r');
59
+ let bytesRead = 0;
60
+ try {
61
+ bytesRead = (0, fs_1.readSync)(fd, buffer, 0, requestedBytes, offsetBytes);
62
+ }
63
+ finally {
64
+ (0, fs_1.closeSync)(fd);
65
+ }
66
+ const targetBytes = Math.min(limitBytes, bytesRead);
67
+ const safeBytes = utf8SafePrefixLength(buffer.subarray(0, targetBytes));
68
+ const consumedBytes = safeBytes > 0
69
+ ? safeBytes
70
+ : Math.min(bytesRead, utf8SequenceLength(buffer[0]));
71
+ const rawPage = buffer.subarray(0, consumedBytes).toString('utf8');
72
+ const content = (0, redaction_1.redactTraceText)(rawPage);
73
+ const nextOffset = offsetBytes + consumedBytes;
74
+ return {
75
+ content,
76
+ offsetBytes,
77
+ nextOffsetBytes: nextOffset < totalBytes ? nextOffset : undefined,
78
+ totalBytes,
79
+ redacted: content !== rawPage,
80
+ };
81
+ }
82
+ }
83
+ catch {
84
+ // Fall through to unavailable.
85
+ }
86
+ }
87
+ return {
88
+ content: 'detail unavailable',
89
+ offsetBytes: 0,
90
+ totalBytes: 0,
91
+ redacted: false,
92
+ };
93
+ }
94
+ }
95
+ exports.FileToolDetailRepository = FileToolDetailRepository;
96
+ function artifactIdToCallId(id) {
97
+ // artifact IDs look like "toolName-seq-random" — use as callId fallback.
98
+ return id;
99
+ }
100
+ function utf8SafePrefixLength(buffer) {
101
+ if (buffer.length === 0)
102
+ return 0;
103
+ let lead = buffer.length - 1;
104
+ while (lead >= 0 && (buffer[lead] & 0xc0) === 0x80)
105
+ lead -= 1;
106
+ if (lead < 0)
107
+ return 0;
108
+ const first = buffer[lead];
109
+ const expected = (first & 0x80) === 0
110
+ ? 1
111
+ : (first & 0xe0) === 0xc0
112
+ ? 2
113
+ : (first & 0xf0) === 0xe0
114
+ ? 3
115
+ : (first & 0xf8) === 0xf0
116
+ ? 4
117
+ : 1;
118
+ return buffer.length - lead < expected ? lead : buffer.length;
119
+ }
120
+ function utf8SequenceLength(first) {
121
+ if ((first & 0x80) === 0)
122
+ return 1;
123
+ if ((first & 0xe0) === 0xc0)
124
+ return 2;
125
+ if ((first & 0xf0) === 0xe0)
126
+ return 3;
127
+ if ((first & 0xf8) === 0xf0)
128
+ return 4;
129
+ return 1;
130
+ }
131
+ //# sourceMappingURL=tool-detail-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-detail-repository.js","sourceRoot":"","sources":["../../src/runtime/tool-detail-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * v0.2.23 — Tool Output Presentation Policy.
3
+ *
4
+ * Renderer-neutral pure function that creates a ToolOutputView from raw
5
+ * tool output. Terminal adapter continues to use full output; only TUI
6
+ * applies the adaptive/collapsed/full collapse policy.
7
+ */
8
+ export type ToolOutputViewMode = 'inline' | 'preview' | 'collapsed';
9
+ export type ToolOutputContentKind = 'text' | 'json' | 'diff' | 'log' | 'table' | 'batch' | 'unknown';
10
+ export interface ToolOutputDetailRef {
11
+ callId: string;
12
+ sequence: number;
13
+ turnId?: string;
14
+ artifactId?: string;
15
+ traceSessionId?: string;
16
+ outputBytes: number;
17
+ outputLines: number;
18
+ }
19
+ export interface ToolOutputStepSummary {
20
+ index: number;
21
+ toolName: string;
22
+ state: 'success' | 'error' | 'skipped';
23
+ target?: string;
24
+ summary: string;
25
+ outputBytes: number;
26
+ detailRef?: ToolOutputDetailRef;
27
+ }
28
+ export interface ToolAggregateView {
29
+ version: 1;
30
+ kind: 'batch_read' | 'subtask_batch' | 'generic_batch';
31
+ total: number;
32
+ succeeded: number;
33
+ failed: number;
34
+ skipped: number;
35
+ steps: ToolOutputStepSummary[];
36
+ }
37
+ export interface ToolOutputView {
38
+ mode: ToolOutputViewMode;
39
+ contentKind: ToolOutputContentKind;
40
+ summary: string;
41
+ preview: string;
42
+ previewBytes: number;
43
+ omittedBytes: number;
44
+ omittedLines: number;
45
+ detailRef?: ToolOutputDetailRef;
46
+ aggregate?: ToolAggregateView;
47
+ }
48
+ export type ToolTranscriptViewMode = 'adaptive' | 'collapsed' | 'full';
49
+ export interface ResolvedToolOutputPolicy {
50
+ mode: ToolTranscriptViewMode;
51
+ inlineMaxLines: number;
52
+ inlineMaxBytes: number;
53
+ previewMaxLines: number;
54
+ previewMaxBytes: number;
55
+ errorPreviewMaxLines: number;
56
+ errorPreviewMaxBytes: number;
57
+ }
58
+ export declare const DEFAULT_TOOL_OUTPUT_POLICY: ResolvedToolOutputPolicy;
59
+ export interface CreateToolOutputViewInput {
60
+ toolName: string;
61
+ success: boolean;
62
+ summary?: string;
63
+ rawOutput: string;
64
+ outputBytes: number;
65
+ artifactRef?: {
66
+ id: string;
67
+ outputBytes: number;
68
+ };
69
+ callId: string;
70
+ sequence: number;
71
+ turnId?: string;
72
+ policy: ResolvedToolOutputPolicy;
73
+ }
74
+ export declare function createToolOutputView(input: CreateToolOutputViewInput): ToolOutputView;
75
+ export interface AggregateBatchReadResult {
76
+ steps: Array<{
77
+ tool: string;
78
+ target: string;
79
+ success: boolean;
80
+ summary: string;
81
+ outputBytes: number;
82
+ }>;
83
+ }
84
+ /**
85
+ * Try to parse a known aggregate tool result into a structured view.
86
+ * Returns null if the output doesn't match any known schema.
87
+ */
88
+ export declare function tryParseAggregateOutput(toolName: string, rawOutput: string, detailRef?: ToolOutputDetailRef): ToolAggregateView | null;
89
+ //# sourceMappingURL=tool-output-presentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-output-presentation.d.ts","sourceRoot":"","sources":["../../src/runtime/tool-output-presentation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+ /**
3
+ * v0.2.23 — Tool Output Presentation Policy.
4
+ *
5
+ * Renderer-neutral pure function that creates a ToolOutputView from raw
6
+ * tool output. Terminal adapter continues to use full output; only TUI
7
+ * applies the adaptive/collapsed/full collapse policy.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.DEFAULT_TOOL_OUTPUT_POLICY = void 0;
11
+ exports.createToolOutputView = createToolOutputView;
12
+ exports.tryParseAggregateOutput = tryParseAggregateOutput;
13
+ const redaction_1 = require("../services/redaction");
14
+ exports.DEFAULT_TOOL_OUTPUT_POLICY = {
15
+ mode: 'adaptive',
16
+ inlineMaxLines: 3,
17
+ inlineMaxBytes: 512,
18
+ previewMaxLines: 4,
19
+ previewMaxBytes: 1024,
20
+ errorPreviewMaxLines: 8,
21
+ errorPreviewMaxBytes: 2048,
22
+ };
23
+ // ============================================================================
24
+ // Known noisy aggregate tool names — always collapsed.
25
+ // ============================================================================
26
+ const ALWAYS_COLLAPSE_TOOLS = new Set([
27
+ 'batch_read',
28
+ 'batch_write',
29
+ 'batch_edit',
30
+ ]);
31
+ function createToolOutputView(input) {
32
+ const { toolName, success, summary, rawOutput, outputBytes, callId, sequence, policy } = input;
33
+ const contentKind = classifyContent(toolName, rawOutput);
34
+ const sanitized = sanitizeForPreview(rawOutput);
35
+ const outputLines = countLines(sanitized);
36
+ const detailRef = {
37
+ callId,
38
+ sequence,
39
+ turnId: input.turnId,
40
+ artifactId: input.artifactRef?.id,
41
+ outputBytes,
42
+ outputLines,
43
+ };
44
+ const defaultSummary = (0, redaction_1.redactTraceText)(summary ?? `${success ? '✓' : '✗'} ${toolName}`);
45
+ const aggregate = tryParseAggregateOutput(toolName, rawOutput, detailRef);
46
+ // Full mode: everything inline.
47
+ if (policy.mode === 'full') {
48
+ return {
49
+ mode: 'inline',
50
+ contentKind,
51
+ summary: defaultSummary,
52
+ preview: sanitized,
53
+ previewBytes: outputBytes,
54
+ omittedBytes: 0,
55
+ omittedLines: 0,
56
+ detailRef,
57
+ aggregate: aggregate ?? undefined,
58
+ };
59
+ }
60
+ // Collapsed mode: no preview.
61
+ if (policy.mode === 'collapsed') {
62
+ return {
63
+ mode: 'collapsed',
64
+ contentKind,
65
+ summary: defaultSummary,
66
+ preview: '',
67
+ previewBytes: 0,
68
+ omittedBytes: outputBytes,
69
+ omittedLines: outputLines,
70
+ detailRef,
71
+ aggregate: aggregate ?? undefined,
72
+ };
73
+ }
74
+ // Adaptive mode: decide based on size and tool type.
75
+ const view = computeAdaptiveView({
76
+ toolName,
77
+ success,
78
+ defaultSummary,
79
+ sanitized,
80
+ outputBytes,
81
+ outputLines,
82
+ detailRef,
83
+ policy,
84
+ });
85
+ return aggregate ? { ...view, contentKind: 'batch', aggregate } : view;
86
+ }
87
+ function computeAdaptiveView(input) {
88
+ const { toolName, success, defaultSummary, sanitized, outputBytes, outputLines, detailRef, policy } = input;
89
+ // Empty output.
90
+ if (!sanitized || outputBytes === 0) {
91
+ return {
92
+ mode: 'collapsed',
93
+ contentKind: 'text',
94
+ summary: defaultSummary,
95
+ preview: '',
96
+ previewBytes: 0,
97
+ omittedBytes: 0,
98
+ omittedLines: 0,
99
+ detailRef,
100
+ };
101
+ }
102
+ // Always collapse known noisy tools.
103
+ if (ALWAYS_COLLAPSE_TOOLS.has(toolName)) {
104
+ const preview = truncatePreview(sanitized, policy.previewMaxLines, policy.previewMaxBytes);
105
+ return {
106
+ mode: 'collapsed',
107
+ contentKind: 'batch',
108
+ summary: defaultSummary,
109
+ preview,
110
+ previewBytes: Buffer.byteLength(preview, 'utf8'),
111
+ omittedBytes: Math.max(0, outputBytes - Buffer.byteLength(preview, 'utf8')),
112
+ omittedLines: Math.max(0, outputLines - countLines(preview)),
113
+ detailRef,
114
+ };
115
+ }
116
+ // Error: larger preview.
117
+ if (!success) {
118
+ const maxLines = policy.errorPreviewMaxLines;
119
+ const maxBytes = policy.errorPreviewMaxBytes;
120
+ const preview = truncatePreview(sanitized, maxLines, maxBytes);
121
+ const previewBytes = Buffer.byteLength(preview, 'utf8');
122
+ return {
123
+ mode: 'preview',
124
+ contentKind: classifyContent(toolName, sanitized),
125
+ summary: defaultSummary,
126
+ preview,
127
+ previewBytes,
128
+ omittedBytes: Math.max(0, outputBytes - previewBytes),
129
+ omittedLines: Math.max(0, outputLines - countLines(preview)),
130
+ detailRef,
131
+ };
132
+ }
133
+ // Small output: inline full.
134
+ if (outputLines <= policy.inlineMaxLines && outputBytes <= policy.inlineMaxBytes) {
135
+ return {
136
+ mode: 'inline',
137
+ contentKind: classifyContent(toolName, sanitized),
138
+ summary: defaultSummary,
139
+ preview: sanitized,
140
+ previewBytes: outputBytes,
141
+ omittedBytes: 0,
142
+ omittedLines: 0,
143
+ detailRef,
144
+ };
145
+ }
146
+ // Large output: preview.
147
+ const preview = truncatePreview(sanitized, policy.previewMaxLines, policy.previewMaxBytes);
148
+ const previewBytes = Buffer.byteLength(preview, 'utf8');
149
+ return {
150
+ mode: 'preview',
151
+ contentKind: classifyContent(toolName, sanitized),
152
+ summary: defaultSummary,
153
+ preview,
154
+ previewBytes,
155
+ omittedBytes: Math.max(0, outputBytes - previewBytes),
156
+ omittedLines: Math.max(0, outputLines - countLines(preview)),
157
+ detailRef,
158
+ };
159
+ }
160
+ // ============================================================================
161
+ // Helpers
162
+ // ============================================================================
163
+ function classifyContent(toolName, output) {
164
+ if (ALWAYS_COLLAPSE_TOOLS.has(toolName))
165
+ return 'batch';
166
+ if (!output.trim())
167
+ return 'text';
168
+ const trimmed = output.trimStart();
169
+ if (trimmed.startsWith('{') || trimmed.startsWith('['))
170
+ return 'json';
171
+ if (trimmed.startsWith('diff ') || trimmed.includes('\n@@ '))
172
+ return 'diff';
173
+ return 'text';
174
+ }
175
+ /**
176
+ * Strip terminal control sequences but preserve safe SGR.
177
+ * OSC, cursor movement, erase, and alternate-screen sequences are removed.
178
+ */
179
+ function sanitizeForPreview(text) {
180
+ return (0, redaction_1.redactTraceText)(text)
181
+ .replace(/\x1b\][^\x07\x1b]*(\x07|\x1b\\)/g, '') // OSC
182
+ .replace(/\x1b\[[0-?]*[ -/]*[@-~]/g, match => {
183
+ // Keep only SGR (final 'm').
184
+ if (match.endsWith('m'))
185
+ return match;
186
+ return '';
187
+ })
188
+ .replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g, '');
189
+ }
190
+ function countLines(text) {
191
+ if (!text)
192
+ return 0;
193
+ return text.split('\n').length;
194
+ }
195
+ /**
196
+ * Truncate text to fit within line and byte limits without splitting
197
+ * grapheme clusters or producing lone surrogates.
198
+ */
199
+ function truncatePreview(text, maxLines, maxBytes) {
200
+ if (!text)
201
+ return '';
202
+ // Truncate by lines first.
203
+ const lines = text.split('\n');
204
+ const visibleLines = lines.slice(0, maxLines);
205
+ const result = visibleLines.join('\n');
206
+ // Truncate by bytes.
207
+ let byteCount = 0;
208
+ let output = '';
209
+ for (const char of result) {
210
+ const charBytes = Buffer.byteLength(char, 'utf8');
211
+ if (byteCount + charBytes > maxBytes)
212
+ break;
213
+ output += char;
214
+ byteCount += charBytes;
215
+ }
216
+ // Avoid lone surrogate at boundary.
217
+ if (output.length > 0) {
218
+ const lastCode = output.charCodeAt(output.length - 1);
219
+ if (lastCode >= 0xd800 && lastCode <= 0xdbff) {
220
+ output = output.slice(0, -1);
221
+ }
222
+ }
223
+ return output;
224
+ }
225
+ /**
226
+ * Try to parse a known aggregate tool result into a structured view.
227
+ * Returns null if the output doesn't match any known schema.
228
+ */
229
+ function tryParseAggregateOutput(toolName, rawOutput, detailRef) {
230
+ if (toolName === 'batch_read') {
231
+ return parseBatchReadOutput(rawOutput, detailRef);
232
+ }
233
+ if (toolName === 'subtask' || toolName === 'subtask_batch') {
234
+ return parseSubtaskBatchOutput(rawOutput, detailRef);
235
+ }
236
+ return null;
237
+ }
238
+ function parseBatchReadOutput(rawOutput, parentDetailRef) {
239
+ try {
240
+ const parsed = JSON.parse(rawOutput);
241
+ if (!parsed || typeof parsed !== 'object')
242
+ return null;
243
+ // Expected shape: { success: boolean, output: string, summary: string, steps?: [...] }
244
+ const steps = Array.isArray(parsed.steps) ? parsed.steps : [];
245
+ if (steps.length === 0 && !parsed.summary)
246
+ return null;
247
+ const stepSummaries = steps.map((step, index) => {
248
+ const skipped = step.skipped === true || step.state === 'skipped';
249
+ const success = !skipped && step.success !== false;
250
+ const args = isRecord(step.args) ? step.args : undefined;
251
+ const target = firstString(step.target, args?.path, args?.filePath, args?.directory);
252
+ const output = typeof step.output === 'string' ? step.output : '';
253
+ return {
254
+ index: typeof step.index === 'number' ? step.index : index + 1,
255
+ toolName: String(step.tool ?? step.toolName ?? 'unknown'),
256
+ state: skipped ? 'skipped' : success ? 'success' : 'error',
257
+ target: target ? (0, redaction_1.redactTraceText)(target) : undefined,
258
+ summary: (0, redaction_1.redactTraceText)(String(step.summary ?? summarizeOutput(output))),
259
+ outputBytes: typeof step.outputBytes === 'number'
260
+ ? step.outputBytes
261
+ : Buffer.byteLength(output, 'utf8'),
262
+ detailRef: parentDetailRef,
263
+ };
264
+ });
265
+ const succeeded = stepSummaries.filter(s => s.state === 'success').length;
266
+ const failed = stepSummaries.filter(s => s.state === 'error').length;
267
+ const skipped = stepSummaries.filter(s => s.state === 'skipped').length;
268
+ return {
269
+ version: 1,
270
+ kind: 'batch_read',
271
+ total: stepSummaries.length,
272
+ succeeded,
273
+ failed,
274
+ skipped,
275
+ steps: stepSummaries,
276
+ };
277
+ }
278
+ catch {
279
+ return null;
280
+ }
281
+ }
282
+ function parseSubtaskBatchOutput(rawOutput, parentDetailRef) {
283
+ try {
284
+ const parsed = JSON.parse(rawOutput);
285
+ if (!isRecord(parsed) || !Array.isArray(parsed.results))
286
+ return null;
287
+ const steps = parsed.results.map((value, index) => {
288
+ const result = isRecord(value) ? value : {};
289
+ const status = String(result.status ?? 'completed');
290
+ const state = status === 'skipped'
291
+ ? 'skipped'
292
+ : status === 'completed' || status === 'success'
293
+ ? 'success'
294
+ : 'error';
295
+ const summary = typeof result.summary === 'string' ? result.summary : status;
296
+ return {
297
+ index: index + 1,
298
+ toolName: String(result.role ?? 'subtask'),
299
+ state,
300
+ target: typeof result.id === 'string' ? (0, redaction_1.redactTraceText)(result.id) : undefined,
301
+ summary: (0, redaction_1.redactTraceText)(summarizeOutput(summary)),
302
+ outputBytes: Buffer.byteLength(summary, 'utf8'),
303
+ detailRef: parentDetailRef,
304
+ };
305
+ });
306
+ return {
307
+ version: 1,
308
+ kind: 'subtask_batch',
309
+ total: steps.length,
310
+ succeeded: steps.filter(step => step.state === 'success').length,
311
+ failed: steps.filter(step => step.state === 'error').length,
312
+ skipped: steps.filter(step => step.state === 'skipped').length,
313
+ steps,
314
+ };
315
+ }
316
+ catch {
317
+ return null;
318
+ }
319
+ }
320
+ function isRecord(value) {
321
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
322
+ }
323
+ function firstString(...values) {
324
+ return values.find(value => typeof value === 'string' && value.trim().length > 0);
325
+ }
326
+ function summarizeOutput(output) {
327
+ return output.split(/\r?\n/u).find(line => line.trim())?.trim().slice(0, 160) ?? '';
328
+ }
329
+ //# sourceMappingURL=tool-output-presentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-output-presentation.js","sourceRoot":"","sources":["../../src/runtime/tool-output-presentation.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import type { OpenHorseRuntime } from '../init';
2
2
  import type { Store } from '../framework/store';
3
3
  import type { LoopStats } from '../framework';
4
4
  import type { LLMService } from '../services/llm';
5
+ import type { CompactCoordinator } from '../services/compact';
5
6
  import type { OpenHorseCLIConfig } from '../services/config';
6
7
  import type { SessionMeta, SessionTraceEvent } from '../services/session-storage';
7
8
  import type { RuntimeSubtaskEvent } from './subagents/types';
@@ -13,10 +14,19 @@ export interface StructuredToolActivity {
13
14
  state: 'queued' | 'running' | 'success' | 'error' | 'skipped' | 'requested';
14
15
  name: string;
15
16
  detail: string;
17
+ command?: string;
16
18
  duration?: string;
19
+ summary?: string;
20
+ outputBytes?: number;
21
+ /** Structured display body. When present, TUI ignores legacy TranscriptEntry.content. */
22
+ body?: string;
17
23
  error?: string;
18
24
  seq?: number;
19
25
  artifactHint?: string;
26
+ callId?: string;
27
+ turnId?: string;
28
+ /** v0.2.23: Renderer-neutral tool output view for adaptive collapse. */
29
+ outputView?: import('./tool-output-presentation').ToolOutputView;
20
30
  }
21
31
  export interface TranscriptEntry {
22
32
  id: string;
@@ -24,6 +34,7 @@ export interface TranscriptEntry {
24
34
  content: string;
25
35
  title?: string;
26
36
  errorLayer?: ErrorLayer;
37
+ statusTone?: 'neutral' | 'warning';
27
38
  /** Structured tool activity — set by tool event presenter so renderers
28
39
  * consume typed data instead of parsing transcript text. */
29
40
  toolActivity?: StructuredToolActivity;
@@ -106,6 +117,11 @@ export interface RuntimeSessionRestoredEvent {
106
117
  restoredMessages: number;
107
118
  messageCount?: number;
108
119
  summary?: string;
120
+ summaryGeneratedAt?: number;
121
+ summarySource?: 'llm' | 'heuristic' | 'resume_heuristic';
122
+ summaryCoveredMessages?: number;
123
+ checkpointId?: string;
124
+ transcriptMessages?: number;
109
125
  }
110
126
  export type RuntimeLoopStats = LoopStats;
111
127
  export type RuntimeTraceEvent = SessionTraceEvent;
@@ -138,6 +154,7 @@ export interface OpenHorseUiRuntime extends RuntimeSessionAccessors {
138
154
  config: OpenHorseCLIConfig;
139
155
  store: Store;
140
156
  llm: LLMService | null;
157
+ compactCoordinator?: CompactCoordinator;
141
158
  runtime: OpenHorseRuntime;
142
159
  isConfigured: boolean;
143
160
  mcpReady?: Promise<void>;