openhorse 0.1.22 → 0.2.0

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 (143) hide show
  1. package/README.md +76 -427
  2. package/dist/cli.d.ts +1 -3
  3. package/dist/cli.d.ts.map +1 -1
  4. package/dist/cli.js +125 -1028
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/index.d.ts.map +1 -1
  7. package/dist/commands/index.js +91 -19
  8. package/dist/commands/index.js.map +1 -1
  9. package/dist/commands/types.d.ts +1 -0
  10. package/dist/commands/types.d.ts.map +1 -1
  11. package/dist/commands/types.js.map +1 -1
  12. package/dist/framework/index.d.ts +2 -2
  13. package/dist/framework/index.d.ts.map +1 -1
  14. package/dist/framework/index.js +6 -1
  15. package/dist/framework/index.js.map +1 -1
  16. package/dist/framework/query.d.ts +2 -0
  17. package/dist/framework/query.d.ts.map +1 -1
  18. package/dist/framework/query.js +5 -2
  19. package/dist/framework/query.js.map +1 -1
  20. package/dist/harness/assembler.d.ts +14 -2
  21. package/dist/harness/assembler.d.ts.map +1 -1
  22. package/dist/harness/assembler.js +167 -32
  23. package/dist/harness/assembler.js.map +1 -1
  24. package/dist/harness/capsule.d.ts +2 -1
  25. package/dist/harness/capsule.d.ts.map +1 -1
  26. package/dist/harness/capsule.js +64 -0
  27. package/dist/harness/capsule.js.map +1 -1
  28. package/dist/harness/context-harness.d.ts +23 -3
  29. package/dist/harness/context-harness.d.ts.map +1 -1
  30. package/dist/harness/context-harness.js +97 -7
  31. package/dist/harness/context-harness.js.map +1 -1
  32. package/dist/harness/contract.d.ts +2 -2
  33. package/dist/harness/contract.d.ts.map +1 -1
  34. package/dist/harness/contract.js +7 -3
  35. package/dist/harness/contract.js.map +1 -1
  36. package/dist/harness/evidence.d.ts +15 -0
  37. package/dist/harness/evidence.d.ts.map +1 -0
  38. package/dist/harness/evidence.js +171 -0
  39. package/dist/harness/evidence.js.map +1 -0
  40. package/dist/harness/index.d.ts +9 -3
  41. package/dist/harness/index.d.ts.map +1 -1
  42. package/dist/harness/index.js +15 -1
  43. package/dist/harness/index.js.map +1 -1
  44. package/dist/harness/intent.d.ts +4 -0
  45. package/dist/harness/intent.d.ts.map +1 -0
  46. package/dist/harness/intent.js +139 -0
  47. package/dist/harness/intent.js.map +1 -0
  48. package/dist/harness/state.d.ts +12 -0
  49. package/dist/harness/state.d.ts.map +1 -0
  50. package/dist/harness/state.js +84 -0
  51. package/dist/harness/state.js.map +1 -0
  52. package/dist/harness/turn-summary.d.ts +25 -0
  53. package/dist/harness/turn-summary.d.ts.map +1 -0
  54. package/dist/harness/turn-summary.js +120 -0
  55. package/dist/harness/turn-summary.js.map +1 -0
  56. package/dist/harness/types.d.ts +103 -0
  57. package/dist/harness/types.d.ts.map +1 -1
  58. package/dist/index.d.ts +2 -2
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +6 -1
  61. package/dist/index.js.map +1 -1
  62. package/dist/ink-ui/App.d.ts +6 -0
  63. package/dist/ink-ui/App.d.ts.map +1 -0
  64. package/dist/ink-ui/App.js +12 -0
  65. package/dist/ink-ui/App.js.map +1 -0
  66. package/dist/ink-ui/components/Markdown.d.ts +9 -0
  67. package/dist/ink-ui/components/Markdown.d.ts.map +1 -0
  68. package/dist/ink-ui/components/Markdown.js +188 -0
  69. package/dist/ink-ui/components/Markdown.js.map +1 -0
  70. package/dist/ink-ui/components/PixelHorseBanner.d.ts +8 -0
  71. package/dist/ink-ui/components/PixelHorseBanner.d.ts.map +1 -0
  72. package/dist/ink-ui/components/PixelHorseBanner.js +97 -0
  73. package/dist/ink-ui/components/PixelHorseBanner.js.map +1 -0
  74. package/dist/ink-ui/components/PromptInput.d.ts +9 -0
  75. package/dist/ink-ui/components/PromptInput.d.ts.map +1 -0
  76. package/dist/ink-ui/components/PromptInput.js +24 -0
  77. package/dist/ink-ui/components/PromptInput.js.map +1 -0
  78. package/dist/ink-ui/components/SelectList.d.ts +15 -0
  79. package/dist/ink-ui/components/SelectList.d.ts.map +1 -0
  80. package/dist/ink-ui/components/SelectList.js +39 -0
  81. package/dist/ink-ui/components/SelectList.js.map +1 -0
  82. package/dist/ink-ui/components/StatusLine.d.ts +9 -0
  83. package/dist/ink-ui/components/StatusLine.d.ts.map +1 -0
  84. package/dist/ink-ui/components/StatusLine.js +71 -0
  85. package/dist/ink-ui/components/StatusLine.js.map +1 -0
  86. package/dist/ink-ui/components/TerminalCursor.d.ts +13 -0
  87. package/dist/ink-ui/components/TerminalCursor.d.ts.map +1 -0
  88. package/dist/ink-ui/components/TerminalCursor.js +74 -0
  89. package/dist/ink-ui/components/TerminalCursor.js.map +1 -0
  90. package/dist/ink-ui/components/Transcript.d.ts +8 -0
  91. package/dist/ink-ui/components/Transcript.d.ts.map +1 -0
  92. package/dist/ink-ui/components/Transcript.js +29 -0
  93. package/dist/ink-ui/components/Transcript.js.map +1 -0
  94. package/dist/ink-ui/controllers/chat-controller.d.ts +15 -0
  95. package/dist/ink-ui/controllers/chat-controller.d.ts.map +1 -0
  96. package/dist/ink-ui/controllers/chat-controller.js +410 -0
  97. package/dist/ink-ui/controllers/chat-controller.js.map +1 -0
  98. package/dist/ink-ui/launch.d.ts +3 -0
  99. package/dist/ink-ui/launch.d.ts.map +1 -0
  100. package/dist/ink-ui/launch.js +14 -0
  101. package/dist/ink-ui/launch.js.map +1 -0
  102. package/dist/ink-ui/runtime/prompt-layout.d.ts +11 -0
  103. package/dist/ink-ui/runtime/prompt-layout.d.ts.map +1 -0
  104. package/dist/ink-ui/runtime/prompt-layout.js +51 -0
  105. package/dist/ink-ui/runtime/prompt-layout.js.map +1 -0
  106. package/dist/ink-ui/screens/ReplScreen.d.ts +14 -0
  107. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -0
  108. package/dist/ink-ui/screens/ReplScreen.js +470 -0
  109. package/dist/ink-ui/screens/ReplScreen.js.map +1 -0
  110. package/dist/ink-ui/types.d.ts +43 -0
  111. package/dist/ink-ui/types.d.ts.map +1 -0
  112. package/dist/ink-ui/types.js +3 -0
  113. package/dist/ink-ui/types.js.map +1 -0
  114. package/dist/services/compact/auto-compact.d.ts +3 -1
  115. package/dist/services/compact/auto-compact.d.ts.map +1 -1
  116. package/dist/services/compact/auto-compact.js +10 -0
  117. package/dist/services/compact/auto-compact.js.map +1 -1
  118. package/dist/services/compact/compact.d.ts +5 -1
  119. package/dist/services/compact/compact.d.ts.map +1 -1
  120. package/dist/services/compact/compact.js +11 -1
  121. package/dist/services/compact/compact.js.map +1 -1
  122. package/dist/services/config-dir.d.ts +2 -0
  123. package/dist/services/config-dir.d.ts.map +1 -1
  124. package/dist/services/config-dir.js +5 -0
  125. package/dist/services/config-dir.js.map +1 -1
  126. package/dist/services/config.js +2 -2
  127. package/dist/services/config.js.map +1 -1
  128. package/dist/services/global-config.d.ts +1 -1
  129. package/dist/services/global-config.d.ts.map +1 -1
  130. package/dist/services/session-storage.d.ts +4 -1
  131. package/dist/services/session-storage.d.ts.map +1 -1
  132. package/dist/services/session-storage.js +76 -6
  133. package/dist/services/session-storage.js.map +1 -1
  134. package/dist/tools/mcp.js +1 -1
  135. package/dist/ui-v2/components/session-picker.d.ts +2 -0
  136. package/dist/ui-v2/components/session-picker.d.ts.map +1 -1
  137. package/dist/ui-v2/components/session-picker.js +34 -5
  138. package/dist/ui-v2/components/session-picker.js.map +1 -1
  139. package/dist/ui-v2/state/sessions.d.ts +1 -0
  140. package/dist/ui-v2/state/sessions.d.ts.map +1 -1
  141. package/dist/ui-v2/state/sessions.js +18 -0
  142. package/dist/ui-v2/state/sessions.js.map +1 -1
  143. package/package.json +5 -1
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getPromptCursorPosition = getPromptCursorPosition;
7
+ exports.getCursorRestoreDelays = getCursorRestoreDelays;
8
+ exports.TerminalCursor = TerminalCursor;
9
+ const react_1 = require("react");
10
+ const ink_1 = require("ink");
11
+ const string_width_1 = __importDefault(require("string-width"));
12
+ const prompt_layout_1 = require("../runtime/prompt-layout");
13
+ const NORMAL_RESTORE_DELAYS_MS = [0, 16];
14
+ const STICKY_RESTORE_DELAYS_MS = [0, 16, 64];
15
+ const STICKY_RESTORE_INTERVAL_MS = 120;
16
+ function getPromptCursorPosition(value, terminalHeight, terminalWidth) {
17
+ const lines = value.length > 0 ? value.split('\n') : [''];
18
+ const maxTextWidth = (0, prompt_layout_1.promptTextWidth)(terminalWidth);
19
+ const rows = lines.map(line => (0, prompt_layout_1.splitByVisualWidth)(line, maxTextWidth).length);
20
+ const totalInputRows = rows.reduce((sum, rowCount) => sum + rowCount, 0);
21
+ const activeLine = lines[lines.length - 1] ?? '';
22
+ const previousRows = rows.slice(0, -1).reduce((sum, rowCount) => sum + rowCount, 0);
23
+ const activeChunks = (0, prompt_layout_1.splitByVisualWidth)(activeLine, maxTextWidth);
24
+ const wrapRow = Math.max(0, activeChunks.length - 1);
25
+ const activeChunk = activeChunks[activeChunks.length - 1] ?? '';
26
+ const columnInContent = 2 + (0, string_width_1.default)(activeChunk);
27
+ return {
28
+ row: Math.max(1, terminalHeight - totalInputRows + previousRows + wrapRow),
29
+ column: Math.max(1, 3 + columnInContent),
30
+ };
31
+ }
32
+ function writePromptCursor(stream, value, terminalHeight, terminalWidth) {
33
+ const position = getPromptCursorPosition(value, terminalHeight, terminalWidth);
34
+ stream.write(`\x1b[?25h\x1b[${position.row};${position.column}H`);
35
+ }
36
+ function getCursorRestoreDelays(sticky = false) {
37
+ return sticky ? STICKY_RESTORE_DELAYS_MS : NORMAL_RESTORE_DELAYS_MS;
38
+ }
39
+ function TerminalCursor({ value, terminalHeight, terminalWidth, sticky = false }) {
40
+ const { stdout } = (0, ink_1.useStdout)();
41
+ const latestRef = (0, react_1.useRef)({
42
+ stream: stdout ?? process.stdout,
43
+ value,
44
+ terminalHeight,
45
+ terminalWidth,
46
+ });
47
+ latestRef.current = {
48
+ stream: stdout ?? process.stdout,
49
+ value,
50
+ terminalHeight,
51
+ terminalWidth,
52
+ };
53
+ // Ink leaves the terminal cursor after the last rendered text. During streaming
54
+ // the footer can flush after the input box, so restore the cursor in a few
55
+ // closely-spaced passes rather than racing Ink with a single setTimeout(0).
56
+ (0, react_1.useEffect)(() => {
57
+ const timers = getCursorRestoreDelays(sticky).map(delay => setTimeout(() => {
58
+ const latest = latestRef.current;
59
+ writePromptCursor(latest.stream, latest.value, latest.terminalHeight, latest.terminalWidth);
60
+ }, delay));
61
+ return () => timers.forEach(timer => clearTimeout(timer));
62
+ });
63
+ (0, react_1.useEffect)(() => {
64
+ if (!sticky)
65
+ return undefined;
66
+ const interval = setInterval(() => {
67
+ const latest = latestRef.current;
68
+ writePromptCursor(latest.stream, latest.value, latest.terminalHeight, latest.terminalWidth);
69
+ }, STICKY_RESTORE_INTERVAL_MS);
70
+ return () => clearInterval(interval);
71
+ }, [sticky]);
72
+ return null;
73
+ }
74
+ //# sourceMappingURL=TerminalCursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TerminalCursor.js","sourceRoot":"","sources":["../../../src/ink-ui/components/TerminalCursor.tsx"],"names":[],"mappings":";;;;;AAgBA,0DAoBC;AAYD,wDAEC;AAED,wCAwCC;AA5FD,iCAA0C;AAC1C,6BAAgC;AAChC,gEAAuC;AACvC,4DAA+E;AAS/E,MAAM,wBAAwB,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzC,MAAM,wBAAwB,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAC7C,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAEvC,SAAgB,uBAAuB,CACrC,KAAa,EACb,cAAsB,EACtB,aAAqB;IAErB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,IAAA,+BAAe,EAAC,aAAa,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAA,kCAAkB,EAAC,IAAI,EAAE,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;IAC9E,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;IACpF,MAAM,YAAY,GAAG,IAAA,kCAAkB,EAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAChE,MAAM,eAAe,GAAG,CAAC,GAAG,IAAA,sBAAW,EAAC,WAAW,CAAC,CAAC;IAErD,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,GAAG,cAAc,GAAG,YAAY,GAAG,OAAO,CAAC;QAC1E,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,eAAe,CAAC;KACzC,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,MAA0B,EAC1B,KAAa,EACb,cAAsB,EACtB,aAAqB;IAErB,MAAM,QAAQ,GAAG,uBAAuB,CAAC,KAAK,EAAE,cAAc,EAAE,aAAa,CAAC,CAAC;IAC/E,MAAM,CAAC,KAAK,CAAC,iBAAiB,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;AACpE,CAAC;AAED,SAAgB,sBAAsB,CAAC,MAAM,GAAG,KAAK;IACnD,OAAO,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,wBAAwB,CAAC;AACtE,CAAC;AAED,SAAgB,cAAc,CAAC,EAAE,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,GAAG,KAAK,EAAuB;IAC1G,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,eAAS,GAAE,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAA,cAAM,EAAC;QACvB,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM;QAChC,KAAK;QACL,cAAc;QACd,aAAa;KACd,CAAC,CAAC;IAEH,SAAS,CAAC,OAAO,GAAG;QAClB,MAAM,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM;QAChC,KAAK;QACL,cAAc;QACd,aAAa;KACd,CAAC;IAEF,gFAAgF;IAChF,2EAA2E;IAC3E,4EAA4E;IAC5E,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE;YACzE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;YACjC,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAC9F,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;QAEX,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAE9B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;YAChC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;YACjC,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAC9F,CAAC,EAAE,0BAA0B,CAAC,CAAC;QAE/B,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { TranscriptEntry } from '../types';
2
+ export interface TranscriptProps {
3
+ entries: TranscriptEntry[];
4
+ maxItems?: number;
5
+ width?: number;
6
+ }
7
+ export declare function Transcript({ entries, maxItems, width }: TranscriptProps): JSX.Element;
8
+ //# sourceMappingURL=Transcript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transcript.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/components/Transcript.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAIhD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAoBD,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,QAAa,EAAE,KAAU,EAAE,EAAE,eAAe,GAAG,GAAG,CAAC,OAAO,CA8B/F"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Transcript = Transcript;
7
+ const react_1 = __importDefault(require("react"));
8
+ const ink_1 = require("ink");
9
+ const string_width_1 = __importDefault(require("string-width"));
10
+ const prompt_layout_1 = require("../runtime/prompt-layout");
11
+ const Markdown_1 = require("./Markdown");
12
+ const USER_BACKGROUND = '#50545c';
13
+ function padLine(line, width) {
14
+ const padding = Math.max(0, width - (0, string_width_1.default)(line));
15
+ return line + ' '.repeat(padding);
16
+ }
17
+ function transcriptLines(entry, width) {
18
+ const rawLines = entry.content.split('\n');
19
+ if (entry.role !== 'user' && entry.role !== 'command') {
20
+ return rawLines.map(line => line || ' ');
21
+ }
22
+ return rawLines.flatMap(line => (0, prompt_layout_1.splitByVisualWidth)(line || ' ', width).map(chunk => padLine(chunk, width)));
23
+ }
24
+ function Transcript({ entries, maxItems = 20, width = 80 }) {
25
+ const visible = entries.slice(Math.max(0, entries.length - maxItems));
26
+ const contentWidth = Math.max(1, width - 2);
27
+ return (react_1.default.createElement(ink_1.Box, { flexDirection: "column", flexGrow: 1 }, visible.length === 0 ? (react_1.default.createElement(ink_1.Text, { color: "gray" }, "OpenHorse is ready.")) : (visible.map(entry => (react_1.default.createElement(ink_1.Box, { key: entry.id, flexDirection: "column", marginBottom: 1 }, entry.role === 'assistant' || entry.role === 'system' || entry.role === 'status' ? (react_1.default.createElement(Markdown_1.Markdown, { width: contentWidth }, entry.content)) : (transcriptLines(entry, contentWidth).map((line, index) => (react_1.default.createElement(ink_1.Text, { key: index, color: entry.role === 'error' ? 'red' : entry.role === 'tool' ? 'gray' : undefined, backgroundColor: entry.role === 'user' || entry.role === 'command' ? USER_BACKGROUND : undefined, wrap: "truncate" }, line))))))))));
28
+ }
29
+ //# sourceMappingURL=Transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Transcript.js","sourceRoot":"","sources":["../../../src/ink-ui/components/Transcript.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { OpenHorseInkRuntime, UiEventSink } from '../types';
2
+ export interface RunInputOptions {
3
+ abortSignal?: AbortSignal;
4
+ }
5
+ export declare class InkChatController {
6
+ private readonly runtime;
7
+ private readonly events;
8
+ constructor(runtime: OpenHorseInkRuntime, events: UiEventSink);
9
+ runInput(input: string, options?: RunInputOptions): Promise<void>;
10
+ private createCommandContext;
11
+ private runChat;
12
+ }
13
+ export declare function loadSessionIntoRuntime(runtime: OpenHorseInkRuntime, sessionId: string): string;
14
+ export declare function closeSession(runtime: OpenHorseInkRuntime): void;
15
+ //# sourceMappingURL=chat-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-controller.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/controllers/chat-controller.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AA0DjE,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,mBAAmB,EAC5B,MAAM,EAAE,WAAW;IAGhC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA4E3E,OAAO,CAAC,oBAAoB;YAyBd,OAAO;CAqPtB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAK9F;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAQ/D"}
@@ -0,0 +1,410 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InkChatController = void 0;
4
+ exports.loadSessionIntoRuntime = loadSessionIntoRuntime;
5
+ exports.closeSession = closeSession;
6
+ const commands_1 = require("../../commands");
7
+ const parser_1 = require("../../commands/parser");
8
+ const session_storage_1 = require("../../services/session-storage");
9
+ const config_1 = require("../../services/config");
10
+ const framework_1 = require("../../framework");
11
+ const harness_1 = require("../../harness");
12
+ const tools_1 = require("../../tools");
13
+ const skills_1 = require("../../skills");
14
+ const ANSI_PATTERN = /\x1b\[[0-9;?]*[A-Za-z]/g;
15
+ function stripAnsi(text) {
16
+ return text.replace(ANSI_PATTERN, '');
17
+ }
18
+ function isAbortError(error, abortSignal) {
19
+ if (abortSignal?.aborted)
20
+ return true;
21
+ if (error instanceof Error) {
22
+ return error.name === 'AbortError' || error.message.toLowerCase().includes('aborted');
23
+ }
24
+ return false;
25
+ }
26
+ function compactToolArgs(args) {
27
+ for (const key of ['path', 'command', 'pattern']) {
28
+ const value = args[key];
29
+ if (typeof value === 'string') {
30
+ return value.length > 56 ? `${value.slice(0, 53)}...` : value;
31
+ }
32
+ }
33
+ const firstString = Object.values(args).find(value => typeof value === 'string');
34
+ if (typeof firstString === 'string') {
35
+ return firstString.length > 56 ? `${firstString.slice(0, 53)}...` : firstString;
36
+ }
37
+ return '';
38
+ }
39
+ function toolSummary(name, args, success, duration) {
40
+ const details = compactToolArgs(args);
41
+ const suffix = details ? ` ${details}` : '';
42
+ return `${success ? '✓' : '✗'} ${name}${suffix} (${duration}ms)`;
43
+ }
44
+ async function captureConsoleOutput(fn) {
45
+ const lines = [];
46
+ const originalLog = console.log;
47
+ const originalError = console.error;
48
+ const originalWarn = console.warn;
49
+ const capture = (...args) => {
50
+ lines.push(stripAnsi(args.map(arg => typeof arg === 'string' ? arg : JSON.stringify(arg)).join(' ')));
51
+ };
52
+ console.log = capture;
53
+ console.error = capture;
54
+ console.warn = capture;
55
+ try {
56
+ const result = await fn();
57
+ return { result, output: lines.join('\n').trim() };
58
+ }
59
+ finally {
60
+ console.log = originalLog;
61
+ console.error = originalError;
62
+ console.warn = originalWarn;
63
+ }
64
+ }
65
+ class InkChatController {
66
+ constructor(runtime, events) {
67
+ this.runtime = runtime;
68
+ this.events = events;
69
+ }
70
+ async runInput(input, options = {}) {
71
+ const text = input.trim();
72
+ if (!text)
73
+ return;
74
+ const parsed = (0, parser_1.parseInput)(text);
75
+ if (!parsed.isCommand) {
76
+ await this.runChat(text, options.abortSignal);
77
+ return;
78
+ }
79
+ if (parsed.name === 'clear') {
80
+ this.events.clearTranscript();
81
+ this.events.setStatus('View cleared. Conversation context is preserved.');
82
+ return;
83
+ }
84
+ if (parsed.name === 'exit' || parsed.name === 'quit' || parsed.name === 'q') {
85
+ await this.runtime.shutdown();
86
+ return;
87
+ }
88
+ const command = (0, commands_1.findCommand)(parsed.name);
89
+ if (!command) {
90
+ if ((0, skills_1.hasMatchingSkill)(text)) {
91
+ await this.runChat(text, options.abortSignal);
92
+ return;
93
+ }
94
+ const suggestions = (0, parser_1.buildCommandSuggestions)(parsed.name);
95
+ this.events.append({
96
+ role: 'error',
97
+ title: 'unknown command',
98
+ content: suggestions.length > 0
99
+ ? `Unknown command: /${parsed.name}\nDid you mean: ${suggestions.map(item => `/${item}`).join(', ')}?`
100
+ : `Unknown command: /${parsed.name}`,
101
+ });
102
+ return;
103
+ }
104
+ const ctx = this.createCommandContext(options.abortSignal);
105
+ const { result, output } = await captureConsoleOutput(() => command.execute(ctx, parsed.args));
106
+ if (output) {
107
+ this.events.append({
108
+ role: result.success ? 'system' : 'error',
109
+ title: `/${command.name}`,
110
+ content: output,
111
+ });
112
+ }
113
+ if (result.output) {
114
+ this.events.append({
115
+ role: result.success ? 'system' : 'error',
116
+ title: `/${command.name}`,
117
+ content: result.output,
118
+ });
119
+ }
120
+ if (result.error) {
121
+ this.events.append({
122
+ role: 'error',
123
+ title: `/${command.name}`,
124
+ content: result.error,
125
+ });
126
+ }
127
+ if (result.sessionPicker) {
128
+ this.events.showSessionPicker(result.sessionPicker);
129
+ return;
130
+ }
131
+ if (result.continueAsChat) {
132
+ await this.runChat(result.chatInput ?? parsed.args, options.abortSignal);
133
+ }
134
+ }
135
+ createCommandContext(abortSignal) {
136
+ return {
137
+ cwd: this.runtime.cwd,
138
+ config: this.runtime.config,
139
+ store: this.runtime.store,
140
+ llm: this.runtime.llm,
141
+ runtime: this.runtime.runtime,
142
+ sessionId: this.runtime.getSession()?.id,
143
+ ensureSession: this.runtime.ensureSession,
144
+ setSession: session => this.runtime.setSession(session),
145
+ getSession: this.runtime.getSession,
146
+ abortSignal,
147
+ writeOutput: text => {
148
+ if (text.trim()) {
149
+ this.events.append({ role: 'system', content: text });
150
+ }
151
+ },
152
+ writeLine: text => {
153
+ if (text?.trim()) {
154
+ this.events.append({ role: 'system', content: text });
155
+ }
156
+ },
157
+ };
158
+ }
159
+ async runChat(input, abortSignal) {
160
+ if (!input) {
161
+ this.events.append({ role: 'error', content: 'Usage: /chat <message>' });
162
+ return;
163
+ }
164
+ if (!this.runtime.llm || !(0, config_1.isConfigured)(this.runtime.config)) {
165
+ this.events.append({
166
+ role: 'error',
167
+ content: 'LLM is not configured. Set OPENHORSE_API_KEY in ~/.openhorse/openhorse.json or environment.',
168
+ });
169
+ return;
170
+ }
171
+ const activeSession = this.runtime.getSession() ?? this.runtime.ensureSession() ?? (0, session_storage_1.loadSessionMeta)(this.runtime.getSession()?.id ?? '');
172
+ const sessionId = activeSession?.id;
173
+ const runtimeTools = (0, tools_1.getRuntimeTools)();
174
+ const skillResolution = (0, skills_1.resolveSkillsForTurn)({
175
+ cwd: this.runtime.cwd,
176
+ input,
177
+ tools: runtimeTools,
178
+ projectPath: activeSession?.projectPath,
179
+ sessionId,
180
+ });
181
+ const appliedSkillNames = skillResolution.skills.map(skill => skill.name);
182
+ if (sessionId) {
183
+ (0, session_storage_1.appendSessionMessage)(sessionId, {
184
+ role: 'user',
185
+ content: input,
186
+ timestamp: Date.now(),
187
+ appliedSkills: appliedSkillNames.length > 0 ? appliedSkillNames : undefined,
188
+ });
189
+ }
190
+ this.runtime.store.addMessage({ role: 'user', content: input });
191
+ const snapshot = this.runtime.store.getSnapshot();
192
+ const harness = (0, harness_1.createContextHarness)({
193
+ cwd: this.runtime.cwd,
194
+ modelId: this.runtime.llm.getModel(),
195
+ state: snapshot.harnessState,
196
+ config: {
197
+ enabled: true,
198
+ driftGuard: 'warn',
199
+ completionGate: true,
200
+ },
201
+ });
202
+ const intent = harness.updateContractFromUserInput(input);
203
+ harness.recordAppliedSkills(skillResolution.skills);
204
+ const promptCtx = {
205
+ cwd: this.runtime.cwd,
206
+ platform: process.platform,
207
+ nodeVersion: process.version,
208
+ tools: skillResolution.tools,
209
+ memoryContent: snapshot.memoryContent,
210
+ skillsContent: snapshot.skillsContent,
211
+ activeSkillsContent: skillResolution.promptInjection,
212
+ };
213
+ const systemPrompt = (0, framework_1.getSystemPrompt)(promptCtx);
214
+ const messages = [{ role: 'system', content: systemPrompt }, ...snapshot.conversationHistory];
215
+ let assistantEntryId = null;
216
+ let assistantText = '';
217
+ let finalContent = '';
218
+ let finalUsage;
219
+ let finalModel = '';
220
+ const sessionMessagesToRecord = [];
221
+ let lastToolCallId = '';
222
+ let lastToolArgs = {};
223
+ const streamCallbacks = {
224
+ onChunk: chunk => {
225
+ if (abortSignal?.aborted)
226
+ return;
227
+ assistantText += chunk;
228
+ if (!assistantEntryId) {
229
+ assistantEntryId = this.events.append({
230
+ role: 'assistant',
231
+ content: assistantText,
232
+ });
233
+ }
234
+ else {
235
+ this.events.update(assistantEntryId, { content: assistantText });
236
+ }
237
+ },
238
+ };
239
+ const toolExecutor = async (name, args, signal) => {
240
+ if (!skillResolution.tools.some(tool => tool.name === name)) {
241
+ return JSON.stringify({
242
+ success: false,
243
+ error: skillResolution.toolScopeActive
244
+ ? `Tool ${name} is not available for the active skill scope. Available tools: ${skillResolution.tools.map(tool => tool.name).join(', ') || 'none'}`
245
+ : `Tool ${name} is not available.`,
246
+ });
247
+ }
248
+ return (0, tools_1.executeTool)(name, args, signal);
249
+ };
250
+ try {
251
+ for await (const event of (0, framework_1.query)({
252
+ messages,
253
+ tools: skillResolution.tools,
254
+ toolExecutor,
255
+ llm: this.runtime.llm,
256
+ streamCallbacks,
257
+ costTracker: snapshot.costTracker,
258
+ permissionMode: snapshot.permissionMode,
259
+ toolConfirmation: this.runtime.config.toolConfirmation,
260
+ toolContext: {
261
+ cwd: this.runtime.cwd,
262
+ config: {
263
+ name: this.runtime.config.name,
264
+ mode: this.runtime.config.mode,
265
+ },
266
+ },
267
+ abortSignal,
268
+ harness,
269
+ input,
270
+ })) {
271
+ switch (event.type) {
272
+ case 'request_start':
273
+ this.events.setStatus(`Turn ${event.turn}...`);
274
+ break;
275
+ case 'assistant_tool_calls':
276
+ sessionMessagesToRecord.push({
277
+ role: 'assistant',
278
+ content: event.content || '',
279
+ timestamp: Date.now(),
280
+ tool_calls: event.toolCalls,
281
+ });
282
+ break;
283
+ case 'tool_call':
284
+ lastToolCallId = event.callId;
285
+ lastToolArgs = event.args;
286
+ this.events.append({
287
+ role: 'tool',
288
+ title: 'tool',
289
+ content: `Running ${event.name}${compactToolArgs(event.args) ? ` ${compactToolArgs(event.args)}` : ''}`,
290
+ });
291
+ break;
292
+ case 'tool_result': {
293
+ let toolSuccess = event.success;
294
+ let toolError = event.error;
295
+ try {
296
+ const parsed = JSON.parse(event.result);
297
+ toolSuccess = parsed.success !== false;
298
+ toolError = parsed.error;
299
+ }
300
+ catch {
301
+ toolSuccess = false;
302
+ toolError = 'Invalid JSON result';
303
+ }
304
+ this.events.append({
305
+ role: toolSuccess ? 'tool' : 'error',
306
+ title: 'tool',
307
+ content: [
308
+ toolSummary(event.name, lastToolArgs, toolSuccess, event.duration),
309
+ toolError ? `Error: ${toolError}` : '',
310
+ ].filter(Boolean).join('\n'),
311
+ });
312
+ sessionMessagesToRecord.push({
313
+ role: 'tool',
314
+ content: event.result,
315
+ timestamp: Date.now(),
316
+ toolCallId: lastToolCallId,
317
+ });
318
+ break;
319
+ }
320
+ case 'strategy_exhausted':
321
+ this.events.append({ role: 'status', content: event.suggestion });
322
+ break;
323
+ case 'message':
324
+ finalContent = event.content;
325
+ if (event.content && assistantText.length === 0) {
326
+ assistantText = event.content;
327
+ assistantEntryId = this.events.append({
328
+ role: 'assistant',
329
+ content: event.content,
330
+ });
331
+ }
332
+ if (event.content) {
333
+ sessionMessagesToRecord.push({
334
+ role: 'assistant',
335
+ content: event.content,
336
+ timestamp: Date.now(),
337
+ });
338
+ }
339
+ break;
340
+ case 'complete':
341
+ finalContent = event.content;
342
+ finalUsage = event.usage;
343
+ finalModel = event.model;
344
+ break;
345
+ }
346
+ }
347
+ const wasAborted = abortSignal?.aborted === true;
348
+ if (wasAborted) {
349
+ this.events.setStatus('Interrupted.');
350
+ return;
351
+ }
352
+ if (finalContent) {
353
+ this.runtime.store.addMessage({ role: 'assistant', content: finalContent });
354
+ }
355
+ if (sessionId && sessionMessagesToRecord.length > 0) {
356
+ (0, session_storage_1.appendSessionMessages)(sessionId, sessionMessagesToRecord);
357
+ }
358
+ if (finalUsage) {
359
+ this.runtime.store.setTokenUsage(finalUsage);
360
+ }
361
+ harness.ingestTurn({
362
+ userInput: input,
363
+ assistantContent: finalContent,
364
+ sessionMessages: sessionMessagesToRecord,
365
+ intent,
366
+ });
367
+ const harnessState = harness.toJSON();
368
+ this.runtime.store.setState({ harnessState });
369
+ if (sessionId) {
370
+ (0, session_storage_1.updateSessionSkills)(sessionId, appliedSkillNames);
371
+ (0, session_storage_1.updateSessionHarnessState)(sessionId, harnessState);
372
+ const recordedMessages = (0, session_storage_1.readSessionMessages)(sessionId);
373
+ if (recordedMessages.length > 0) {
374
+ (0, session_storage_1.updateSessionSummary)(sessionId, recordedMessages);
375
+ }
376
+ }
377
+ this.events.setStatus(finalModel ? `Completed with ${finalModel}` : 'Completed');
378
+ }
379
+ catch (error) {
380
+ if (isAbortError(error, abortSignal)) {
381
+ this.events.setStatus('Interrupted.');
382
+ return;
383
+ }
384
+ const message = error instanceof Error ? error.message : String(error);
385
+ this.events.append({ role: 'error', content: message });
386
+ const history = this.runtime.store.getSnapshot().conversationHistory;
387
+ if (history.length > 0) {
388
+ this.runtime.store.setState({ conversationHistory: history.slice(0, -1) });
389
+ }
390
+ }
391
+ }
392
+ }
393
+ exports.InkChatController = InkChatController;
394
+ function loadSessionIntoRuntime(runtime, sessionId) {
395
+ const history = (0, session_storage_1.loadSessionHistory)(sessionId);
396
+ runtime.store.setState({ conversationHistory: history });
397
+ runtime.store.setState({ harnessState: (0, session_storage_1.loadSessionHarnessState)(sessionId) ?? (0, session_storage_1.loadSessionMeta)(sessionId)?.harnessState });
398
+ return `Restored ${history.length} messages`;
399
+ }
400
+ function closeSession(runtime) {
401
+ const session = runtime.getSession();
402
+ if (!session)
403
+ return;
404
+ const messages = (0, session_storage_1.readSessionMessages)(session.id);
405
+ if (messages.length > 0) {
406
+ (0, session_storage_1.updateSessionSummary)(session.id, messages);
407
+ }
408
+ (0, session_storage_1.endSession)(session.id);
409
+ }
410
+ //# sourceMappingURL=chat-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-controller.js","sourceRoot":"","sources":["../../../src/ink-ui/controllers/chat-controller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { OpenHorseInkRuntime } from './types';
2
+ export declare function launchInkUI(runtime: OpenHorseInkRuntime): Promise<void>;
3
+ //# sourceMappingURL=launch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/ink-ui/launch.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,wBAAsB,WAAW,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7E"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.launchInkUI = launchInkUI;
7
+ const react_1 = __importDefault(require("react"));
8
+ const ink_1 = require("ink");
9
+ const App_1 = require("./App");
10
+ async function launchInkUI(runtime) {
11
+ const instance = (0, ink_1.render)(react_1.default.createElement(App_1.App, { runtime: runtime }), { exitOnCtrlC: false });
12
+ await instance.waitUntilExit();
13
+ }
14
+ //# sourceMappingURL=launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/ink-ui/launch.tsx"],"names":[],"mappings":";;;;;AAKA,kCAGC;AARD,kDAA0B;AAC1B,6BAA6B;AAC7B,+BAA4B;AAGrB,KAAK,UAAU,WAAW,CAAC,OAA4B;IAC5D,MAAM,QAAQ,GAAG,IAAA,YAAM,EAAC,8BAAC,SAAG,IAAC,OAAO,EAAE,OAAO,GAAI,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;AACjC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export interface PromptVisualLine {
2
+ logicalIndex: number;
3
+ wrapIndex: number;
4
+ content: string;
5
+ }
6
+ export declare function promptContentWidth(width: number): number;
7
+ export declare function promptTextWidth(width: number): number;
8
+ export declare function splitByVisualWidth(text: string, maxWidth: number): string[];
9
+ export declare function getPromptVisualLines(value: string, width: number): PromptVisualLine[];
10
+ export declare function formatPromptVisualLine(visualLine: PromptVisualLine, width: number): string;
11
+ //# sourceMappingURL=prompt-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-layout.d.ts","sourceRoot":"","sources":["../../../src/ink-ui/runtime/prompt-layout.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAkB3E;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAWrF;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAK1F"}