openhorse 0.1.5

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 (587) hide show
  1. package/README.md +460 -0
  2. package/bin/openhorse +56 -0
  3. package/dist/agents/coder.d.ts +12 -0
  4. package/dist/agents/coder.d.ts.map +1 -0
  5. package/dist/agents/coder.js +48 -0
  6. package/dist/agents/coder.js.map +1 -0
  7. package/dist/agents/leader.d.ts +12 -0
  8. package/dist/agents/leader.d.ts.map +1 -0
  9. package/dist/agents/leader.js +49 -0
  10. package/dist/agents/leader.js.map +1 -0
  11. package/dist/agents/router.d.ts +59 -0
  12. package/dist/agents/router.d.ts.map +1 -0
  13. package/dist/agents/router.js +193 -0
  14. package/dist/agents/router.js.map +1 -0
  15. package/dist/cli-ink.d.ts +7 -0
  16. package/dist/cli-ink.d.ts.map +1 -0
  17. package/dist/cli-ink.js +135 -0
  18. package/dist/cli-ink.js.map +1 -0
  19. package/dist/cli.d.ts +7 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +638 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/commands/index.d.ts +12 -0
  24. package/dist/commands/index.d.ts.map +1 -0
  25. package/dist/commands/index.js +1095 -0
  26. package/dist/commands/index.js.map +1 -0
  27. package/dist/commands/parser.d.ts +26 -0
  28. package/dist/commands/parser.d.ts.map +1 -0
  29. package/dist/commands/parser.js +61 -0
  30. package/dist/commands/parser.js.map +1 -0
  31. package/dist/commands/types.d.ts +61 -0
  32. package/dist/commands/types.d.ts.map +1 -0
  33. package/dist/commands/types.js +32 -0
  34. package/dist/commands/types.js.map +1 -0
  35. package/dist/core/agent.d.ts +66 -0
  36. package/dist/core/agent.d.ts.map +1 -0
  37. package/dist/core/agent.js +55 -0
  38. package/dist/core/agent.js.map +1 -0
  39. package/dist/core/brain.d.ts +41 -0
  40. package/dist/core/brain.d.ts.map +1 -0
  41. package/dist/core/brain.js +92 -0
  42. package/dist/core/brain.js.map +1 -0
  43. package/dist/core/cost-tracker.d.ts +107 -0
  44. package/dist/core/cost-tracker.d.ts.map +1 -0
  45. package/dist/core/cost-tracker.js +199 -0
  46. package/dist/core/cost-tracker.js.map +1 -0
  47. package/dist/core/strategy-tracker.d.ts +61 -0
  48. package/dist/core/strategy-tracker.d.ts.map +1 -0
  49. package/dist/core/strategy-tracker.js +124 -0
  50. package/dist/core/strategy-tracker.js.map +1 -0
  51. package/dist/framework/index.d.ts +20 -0
  52. package/dist/framework/index.d.ts.map +1 -0
  53. package/dist/framework/index.js +29 -0
  54. package/dist/framework/index.js.map +1 -0
  55. package/dist/framework/prompt.d.ts +40 -0
  56. package/dist/framework/prompt.d.ts.map +1 -0
  57. package/dist/framework/prompt.js +112 -0
  58. package/dist/framework/prompt.js.map +1 -0
  59. package/dist/framework/query.d.ts +86 -0
  60. package/dist/framework/query.d.ts.map +1 -0
  61. package/dist/framework/query.js +177 -0
  62. package/dist/framework/query.js.map +1 -0
  63. package/dist/framework/store.d.ts +64 -0
  64. package/dist/framework/store.d.ts.map +1 -0
  65. package/dist/framework/store.js +78 -0
  66. package/dist/framework/store.js.map +1 -0
  67. package/dist/framework/tool-state.d.ts +22 -0
  68. package/dist/framework/tool-state.d.ts.map +1 -0
  69. package/dist/framework/tool-state.js +40 -0
  70. package/dist/framework/tool-state.js.map +1 -0
  71. package/dist/framework/tool.d.ts +88 -0
  72. package/dist/framework/tool.d.ts.map +1 -0
  73. package/dist/framework/tool.js +60 -0
  74. package/dist/framework/tool.js.map +1 -0
  75. package/dist/harness/harness.d.ts +96 -0
  76. package/dist/harness/harness.d.ts.map +1 -0
  77. package/dist/harness/harness.js +224 -0
  78. package/dist/harness/harness.js.map +1 -0
  79. package/dist/harness/safety.d.ts +89 -0
  80. package/dist/harness/safety.d.ts.map +1 -0
  81. package/dist/harness/safety.js +178 -0
  82. package/dist/harness/safety.js.map +1 -0
  83. package/dist/index.d.ts +30 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +57 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/init.d.ts +178 -0
  88. package/dist/init.d.ts.map +1 -0
  89. package/dist/init.js +473 -0
  90. package/dist/init.js.map +1 -0
  91. package/dist/ink/bidi.d.ts +16 -0
  92. package/dist/ink/bidi.d.ts.map +1 -0
  93. package/dist/ink/bidi.js +124 -0
  94. package/dist/ink/bidi.js.map +1 -0
  95. package/dist/ink/clearTerminal.d.ts +14 -0
  96. package/dist/ink/clearTerminal.d.ts.map +1 -0
  97. package/dist/ink/clearTerminal.js +63 -0
  98. package/dist/ink/clearTerminal.js.map +1 -0
  99. package/dist/ink/colorize.d.ts +17 -0
  100. package/dist/ink/colorize.d.ts.map +1 -0
  101. package/dist/ink/colorize.js +208 -0
  102. package/dist/ink/colorize.js.map +1 -0
  103. package/dist/ink/components/App.d.ts +73 -0
  104. package/dist/ink/components/App.d.ts.map +1 -0
  105. package/dist/ink/components/App.js +646 -0
  106. package/dist/ink/components/App.js.map +1 -0
  107. package/dist/ink/components/AppContext.d.ts +12 -0
  108. package/dist/ink/components/AppContext.d.ts.map +1 -0
  109. package/dist/ink/components/AppContext.js +14 -0
  110. package/dist/ink/components/AppContext.js.map +1 -0
  111. package/dist/ink/components/Box.d.ts +44 -0
  112. package/dist/ink/components/Box.d.ts.map +1 -0
  113. package/dist/ink/components/Box.js +191 -0
  114. package/dist/ink/components/Box.js.map +1 -0
  115. package/dist/ink/components/ClockContext.d.ts +9 -0
  116. package/dist/ink/components/ClockContext.d.ts.map +1 -0
  117. package/dist/ink/components/ClockContext.js +146 -0
  118. package/dist/ink/components/ClockContext.js.map +1 -0
  119. package/dist/ink/components/CursorDeclarationContext.d.ts +23 -0
  120. package/dist/ink/components/CursorDeclarationContext.d.ts.map +1 -0
  121. package/dist/ink/components/CursorDeclarationContext.js +6 -0
  122. package/dist/ink/components/CursorDeclarationContext.js.map +1 -0
  123. package/dist/ink/components/ErrorOverview.d.ts +6 -0
  124. package/dist/ink/components/ErrorOverview.d.ts.map +1 -0
  125. package/dist/ink/components/ErrorOverview.js +27 -0
  126. package/dist/ink/components/ErrorOverview.js.map +1 -0
  127. package/dist/ink/components/Newline.d.ts +13 -0
  128. package/dist/ink/components/Newline.d.ts.map +1 -0
  129. package/dist/ink/components/Newline.js +36 -0
  130. package/dist/ink/components/Newline.js.map +1 -0
  131. package/dist/ink/components/NoSelect.d.ts +20 -0
  132. package/dist/ink/components/NoSelect.d.ts.map +1 -0
  133. package/dist/ink/components/NoSelect.js +63 -0
  134. package/dist/ink/components/NoSelect.js.map +1 -0
  135. package/dist/ink/components/RawAnsi.d.ts +17 -0
  136. package/dist/ink/components/RawAnsi.d.ts.map +1 -0
  137. package/dist/ink/components/RawAnsi.js +52 -0
  138. package/dist/ink/components/RawAnsi.js.map +1 -0
  139. package/dist/ink/components/Spacer.d.ts +6 -0
  140. package/dist/ink/components/Spacer.d.ts.map +1 -0
  141. package/dist/ink/components/Spacer.js +26 -0
  142. package/dist/ink/components/Spacer.js.map +1 -0
  143. package/dist/ink/components/StdinContext.d.ts +28 -0
  144. package/dist/ink/components/StdinContext.d.ts.map +1 -0
  145. package/dist/ink/components/StdinContext.js +19 -0
  146. package/dist/ink/components/StdinContext.js.map +1 -0
  147. package/dist/ink/components/TerminalFocusContext.d.ts +10 -0
  148. package/dist/ink/components/TerminalFocusContext.d.ts.map +1 -0
  149. package/dist/ink/components/TerminalFocusContext.js +81 -0
  150. package/dist/ink/components/TerminalFocusContext.js.map +1 -0
  151. package/dist/ink/components/TerminalSizeContext.d.ts +6 -0
  152. package/dist/ink/components/TerminalSizeContext.d.ts.map +1 -0
  153. package/dist/ink/components/TerminalSizeContext.js +6 -0
  154. package/dist/ink/components/TerminalSizeContext.js.map +1 -0
  155. package/dist/ink/components/Text.d.ts +56 -0
  156. package/dist/ink/components/Text.d.ts.map +1 -0
  157. package/dist/ink/components/Text.js +201 -0
  158. package/dist/ink/components/Text.js.map +1 -0
  159. package/dist/ink/constants.d.ts +2 -0
  160. package/dist/ink/constants.d.ts.map +1 -0
  161. package/dist/ink/constants.js +6 -0
  162. package/dist/ink/constants.js.map +1 -0
  163. package/dist/ink/devtools.d.ts +3 -0
  164. package/dist/ink/devtools.d.ts.map +1 -0
  165. package/dist/ink/devtools.js +5 -0
  166. package/dist/ink/devtools.js.map +1 -0
  167. package/dist/ink/dom.d.ts +77 -0
  168. package/dist/ink/dom.d.ts.map +1 -0
  169. package/dist/ink/dom.js +322 -0
  170. package/dist/ink/dom.js.map +1 -0
  171. package/dist/ink/events/click-event.d.ts +32 -0
  172. package/dist/ink/events/click-event.d.ts.map +1 -0
  173. package/dist/ink/events/click-event.js +30 -0
  174. package/dist/ink/events/click-event.js.map +1 -0
  175. package/dist/ink/events/dispatcher.d.ts +41 -0
  176. package/dist/ink/events/dispatcher.d.ts.map +1 -0
  177. package/dist/ink/events/dispatcher.js +181 -0
  178. package/dist/ink/events/dispatcher.js.map +1 -0
  179. package/dist/ink/events/emitter.d.ts +6 -0
  180. package/dist/ink/events/emitter.d.ts.map +1 -0
  181. package/dist/ink/events/emitter.js +36 -0
  182. package/dist/ink/events/emitter.js.map +1 -0
  183. package/dist/ink/events/event-handlers.d.ts +47 -0
  184. package/dist/ink/events/event-handlers.d.ts.map +1 -0
  185. package/dist/ink/events/event-handlers.js +34 -0
  186. package/dist/ink/events/event-handlers.js.map +1 -0
  187. package/dist/ink/events/event.d.ts +6 -0
  188. package/dist/ink/events/event.d.ts.map +1 -0
  189. package/dist/ink/events/event.js +16 -0
  190. package/dist/ink/events/event.js.map +1 -0
  191. package/dist/ink/events/focus-event.d.ts +14 -0
  192. package/dist/ink/events/focus-event.d.ts.map +1 -0
  193. package/dist/ink/events/focus-event.js +20 -0
  194. package/dist/ink/events/focus-event.js.map +1 -0
  195. package/dist/ink/events/input-event.d.ts +31 -0
  196. package/dist/ink/events/input-event.d.ts.map +1 -0
  197. package/dist/ink/events/input-event.js +163 -0
  198. package/dist/ink/events/input-event.js.map +1 -0
  199. package/dist/ink/events/keyboard-event.d.ts +20 -0
  200. package/dist/ink/events/keyboard-event.d.ts.map +1 -0
  201. package/dist/ink/events/keyboard-event.js +44 -0
  202. package/dist/ink/events/keyboard-event.js.map +1 -0
  203. package/dist/ink/events/terminal-event.d.ts +55 -0
  204. package/dist/ink/events/terminal-event.d.ts.map +1 -0
  205. package/dist/ink/events/terminal-event.js +79 -0
  206. package/dist/ink/events/terminal-event.js.map +1 -0
  207. package/dist/ink/events/terminal-focus-event.d.ts +14 -0
  208. package/dist/ink/events/terminal-focus-event.d.ts.map +1 -0
  209. package/dist/ink/events/terminal-focus-event.js +19 -0
  210. package/dist/ink/events/terminal-focus-event.js.map +1 -0
  211. package/dist/ink/focus.d.ts +44 -0
  212. package/dist/ink/focus.d.ts.map +1 -0
  213. package/dist/ink/focus.js +164 -0
  214. package/dist/ink/focus.js.map +1 -0
  215. package/dist/ink/frame.d.ts +95 -0
  216. package/dist/ink/frame.d.ts.map +1 -0
  217. package/dist/ink/frame.js +35 -0
  218. package/dist/ink/frame.js.map +1 -0
  219. package/dist/ink/get-max-width.d.ts +18 -0
  220. package/dist/ink/get-max-width.d.ts.map +1 -0
  221. package/dist/ink/get-max-width.js +26 -0
  222. package/dist/ink/get-max-width.js.map +1 -0
  223. package/dist/ink/hit-test.d.ts +34 -0
  224. package/dist/ink/hit-test.d.ts.map +1 -0
  225. package/dist/ink/hit-test.js +119 -0
  226. package/dist/ink/hit-test.js.map +1 -0
  227. package/dist/ink/hooks/use-animation-frame.d.ts +27 -0
  228. package/dist/ink/hooks/use-animation-frame.d.ts.map +1 -0
  229. package/dist/ink/hooks/use-animation-frame.js +52 -0
  230. package/dist/ink/hooks/use-animation-frame.js.map +1 -0
  231. package/dist/ink/hooks/use-app.d.ts +6 -0
  232. package/dist/ink/hooks/use-app.d.ts.map +1 -0
  233. package/dist/ink/hooks/use-app.js +13 -0
  234. package/dist/ink/hooks/use-app.js.map +1 -0
  235. package/dist/ink/hooks/use-declared-cursor.d.ts +27 -0
  236. package/dist/ink/hooks/use-declared-cursor.d.ts.map +1 -0
  237. package/dist/ink/hooks/use-declared-cursor.js +67 -0
  238. package/dist/ink/hooks/use-declared-cursor.js.map +1 -0
  239. package/dist/ink/hooks/use-input.d.ts +38 -0
  240. package/dist/ink/hooks/use-input.d.ts.map +1 -0
  241. package/dist/ink/hooks/use-input.js +86 -0
  242. package/dist/ink/hooks/use-input.js.map +1 -0
  243. package/dist/ink/hooks/use-interval.d.ts +19 -0
  244. package/dist/ink/hooks/use-interval.d.ts.map +1 -0
  245. package/dist/ink/hooks/use-interval.js +59 -0
  246. package/dist/ink/hooks/use-interval.js.map +1 -0
  247. package/dist/ink/hooks/use-search-highlight.d.ts +31 -0
  248. package/dist/ink/hooks/use-search-highlight.d.ts.map +1 -0
  249. package/dist/ink/hooks/use-search-highlight.js +39 -0
  250. package/dist/ink/hooks/use-search-highlight.js.map +1 -0
  251. package/dist/ink/hooks/use-selection.d.ts +40 -0
  252. package/dist/ink/hooks/use-selection.d.ts.map +1 -0
  253. package/dist/ink/hooks/use-selection.js +68 -0
  254. package/dist/ink/hooks/use-selection.js.map +1 -0
  255. package/dist/ink/hooks/use-stdin.d.ts +6 -0
  256. package/dist/ink/hooks/use-stdin.d.ts.map +1 -0
  257. package/dist/ink/hooks/use-stdin.js +13 -0
  258. package/dist/ink/hooks/use-stdin.js.map +1 -0
  259. package/dist/ink/hooks/use-tab-status.d.ts +14 -0
  260. package/dist/ink/hooks/use-tab-status.d.ts.map +1 -0
  261. package/dist/ink/hooks/use-tab-status.js +61 -0
  262. package/dist/ink/hooks/use-tab-status.js.map +1 -0
  263. package/dist/ink/hooks/use-terminal-focus.d.ts +11 -0
  264. package/dist/ink/hooks/use-terminal-focus.d.ts.map +1 -0
  265. package/dist/ink/hooks/use-terminal-focus.js +22 -0
  266. package/dist/ink/hooks/use-terminal-focus.js.map +1 -0
  267. package/dist/ink/hooks/use-terminal-title.d.ts +13 -0
  268. package/dist/ink/hooks/use-terminal-title.d.ts.map +1 -0
  269. package/dist/ink/hooks/use-terminal-title.js +36 -0
  270. package/dist/ink/hooks/use-terminal-title.js.map +1 -0
  271. package/dist/ink/hooks/use-terminal-viewport.d.ts +30 -0
  272. package/dist/ink/hooks/use-terminal-viewport.d.ts.map +1 -0
  273. package/dist/ink/hooks/use-terminal-viewport.js +81 -0
  274. package/dist/ink/hooks/use-terminal-viewport.js.map +1 -0
  275. package/dist/ink/index.d.ts +54 -0
  276. package/dist/ink/index.d.ts.map +1 -0
  277. package/dist/ink/index.js +111 -0
  278. package/dist/ink/index.js.map +1 -0
  279. package/dist/ink/ink.d.ts +371 -0
  280. package/dist/ink/ink.d.ts.map +1 -0
  281. package/dist/ink/ink.js +1686 -0
  282. package/dist/ink/ink.js.map +1 -0
  283. package/dist/ink/instances.d.ts +4 -0
  284. package/dist/ink/instances.d.ts.map +1 -0
  285. package/dist/ink/instances.js +10 -0
  286. package/dist/ink/instances.js.map +1 -0
  287. package/dist/ink/line-width-cache.d.ts +2 -0
  288. package/dist/ink/line-width-cache.d.ts.map +1 -0
  289. package/dist/ink/line-width-cache.js +23 -0
  290. package/dist/ink/line-width-cache.js.map +1 -0
  291. package/dist/ink/log-update.d.ts +18 -0
  292. package/dist/ink/log-update.d.ts.map +1 -0
  293. package/dist/ink/log-update.js +637 -0
  294. package/dist/ink/log-update.js.map +1 -0
  295. package/dist/ink/measure-element.d.ts +17 -0
  296. package/dist/ink/measure-element.d.ts.map +1 -0
  297. package/dist/ink/measure-element.js +11 -0
  298. package/dist/ink/measure-element.js.map +1 -0
  299. package/dist/ink/measure-text.d.ts +7 -0
  300. package/dist/ink/measure-text.d.ts.map +1 -0
  301. package/dist/ink/measure-text.js +38 -0
  302. package/dist/ink/measure-text.js.map +1 -0
  303. package/dist/ink/node-cache.d.ts +21 -0
  304. package/dist/ink/node-cache.d.ts.map +1 -0
  305. package/dist/ink/node-cache.js +36 -0
  306. package/dist/ink/node-cache.js.map +1 -0
  307. package/dist/ink/optimizer.d.ts +16 -0
  308. package/dist/ink/optimizer.d.ts.map +1 -0
  309. package/dist/ink/optimizer.js +85 -0
  310. package/dist/ink/optimizer.js.map +1 -0
  311. package/dist/ink/output.d.ts +120 -0
  312. package/dist/ink/output.d.ts.map +1 -0
  313. package/dist/ink/output.js +559 -0
  314. package/dist/ink/output.js.map +1 -0
  315. package/dist/ink/parse-keypress.d.ts +112 -0
  316. package/dist/ink/parse-keypress.d.ts.map +1 -0
  317. package/dist/ink/parse-keypress.js +719 -0
  318. package/dist/ink/parse-keypress.js.map +1 -0
  319. package/dist/ink/parse-keypress.test.d.ts +2 -0
  320. package/dist/ink/parse-keypress.test.d.ts.map +1 -0
  321. package/dist/ink/parse-keypress.test.js +37 -0
  322. package/dist/ink/parse-keypress.test.js.map +1 -0
  323. package/dist/ink/reconciler.d.ts +12 -0
  324. package/dist/ink/reconciler.d.ts.map +1 -0
  325. package/dist/ink/reconciler.js +456 -0
  326. package/dist/ink/reconciler.js.map +1 -0
  327. package/dist/ink/render-border.d.ts +25 -0
  328. package/dist/ink/render-border.d.ts.map +1 -0
  329. package/dist/ink/render-border.js +141 -0
  330. package/dist/ink/render-border.js.map +1 -0
  331. package/dist/ink/render-node-to-output.d.ts +46 -0
  332. package/dist/ink/render-node-to-output.d.ts.map +1 -0
  333. package/dist/ink/render-node-to-output.js +1257 -0
  334. package/dist/ink/render-node-to-output.js.map +1 -0
  335. package/dist/ink/render-to-screen.d.ts +47 -0
  336. package/dist/ink/render-to-screen.d.ts.map +1 -0
  337. package/dist/ink/render-to-screen.js +213 -0
  338. package/dist/ink/render-to-screen.js.map +1 -0
  339. package/dist/ink/renderer.d.ts +15 -0
  340. package/dist/ink/renderer.d.ts.map +1 -0
  341. package/dist/ink/renderer.js +169 -0
  342. package/dist/ink/renderer.js.map +1 -0
  343. package/dist/ink/root.d.ts +75 -0
  344. package/dist/ink/root.d.ts.map +1 -0
  345. package/dist/ink/root.js +89 -0
  346. package/dist/ink/root.js.map +1 -0
  347. package/dist/ink/screen.d.ts +270 -0
  348. package/dist/ink/screen.d.ts.map +1 -0
  349. package/dist/ink/screen.js +1194 -0
  350. package/dist/ink/screen.js.map +1 -0
  351. package/dist/ink/searchHighlight.d.ts +21 -0
  352. package/dist/ink/searchHighlight.d.ts.map +1 -0
  353. package/dist/ink/searchHighlight.js +82 -0
  354. package/dist/ink/searchHighlight.js.map +1 -0
  355. package/dist/ink/selection.d.ts +230 -0
  356. package/dist/ink/selection.d.ts.map +1 -0
  357. package/dist/ink/selection.js +814 -0
  358. package/dist/ink/selection.js.map +1 -0
  359. package/dist/ink/squash-text-nodes.d.ts +23 -0
  360. package/dist/ink/squash-text-nodes.d.ts.map +1 -0
  361. package/dist/ink/squash-text-nodes.js +60 -0
  362. package/dist/ink/squash-text-nodes.js.map +1 -0
  363. package/dist/ink/stringWidth.d.ts +2 -0
  364. package/dist/ink/stringWidth.d.ts.map +1 -0
  365. package/dist/ink/stringWidth.js +207 -0
  366. package/dist/ink/stringWidth.js.map +1 -0
  367. package/dist/ink/styles.d.ts +307 -0
  368. package/dist/ink/styles.d.ts.map +1 -0
  369. package/dist/ink/styles.js +302 -0
  370. package/dist/ink/styles.js.map +1 -0
  371. package/dist/ink/supports-hyperlinks.d.ts +14 -0
  372. package/dist/ink/supports-hyperlinks.d.ts.map +1 -0
  373. package/dist/ink/supports-hyperlinks.js +48 -0
  374. package/dist/ink/supports-hyperlinks.js.map +1 -0
  375. package/dist/ink/tabstops.d.ts +2 -0
  376. package/dist/ink/tabstops.d.ts.map +1 -0
  377. package/dist/ink/tabstops.js +43 -0
  378. package/dist/ink/tabstops.js.map +1 -0
  379. package/dist/ink/terminal-focus-state.d.ts +7 -0
  380. package/dist/ink/terminal-focus-state.d.ts.map +1 -0
  381. package/dist/ink/terminal-focus-state.js +43 -0
  382. package/dist/ink/terminal-focus-state.js.map +1 -0
  383. package/dist/ink/terminal-querier.d.ts +130 -0
  384. package/dist/ink/terminal-querier.d.ts.map +1 -0
  385. package/dist/ink/terminal-querier.js +184 -0
  386. package/dist/ink/terminal-querier.js.map +1 -0
  387. package/dist/ink/terminal.d.ts +56 -0
  388. package/dist/ink/terminal.d.ts.map +1 -0
  389. package/dist/ink/terminal.js +249 -0
  390. package/dist/ink/terminal.js.map +1 -0
  391. package/dist/ink/termio/csi.d.ts +166 -0
  392. package/dist/ink/termio/csi.d.ts.map +1 -0
  393. package/dist/ink/termio/csi.js +285 -0
  394. package/dist/ink/termio/csi.js.map +1 -0
  395. package/dist/ink/termio/dec.d.ts +38 -0
  396. package/dist/ink/termio/dec.d.ts.map +1 -0
  397. package/dist/ink/termio/dec.js +59 -0
  398. package/dist/ink/termio/dec.js.map +1 -0
  399. package/dist/ink/termio.d.ts +25 -0
  400. package/dist/ink/termio.d.ts.map +1 -0
  401. package/dist/ink/termio.js +32 -0
  402. package/dist/ink/termio.js.map +1 -0
  403. package/dist/ink/useTerminalNotification.d.ts +27 -0
  404. package/dist/ink/useTerminalNotification.d.ts.map +1 -0
  405. package/dist/ink/useTerminalNotification.js +62 -0
  406. package/dist/ink/useTerminalNotification.js.map +1 -0
  407. package/dist/ink/warn.d.ts +2 -0
  408. package/dist/ink/warn.d.ts.map +1 -0
  409. package/dist/ink/warn.js +14 -0
  410. package/dist/ink/warn.js.map +1 -0
  411. package/dist/ink/widest-line.d.ts +2 -0
  412. package/dist/ink/widest-line.d.ts.map +1 -0
  413. package/dist/ink/widest-line.js +18 -0
  414. package/dist/ink/widest-line.js.map +1 -0
  415. package/dist/ink/wrap-text.d.ts +3 -0
  416. package/dist/ink/wrap-text.d.ts.map +1 -0
  417. package/dist/ink/wrap-text.js +61 -0
  418. package/dist/ink/wrap-text.js.map +1 -0
  419. package/dist/ink/wrapAnsi.d.ts +8 -0
  420. package/dist/ink/wrapAnsi.d.ts.map +1 -0
  421. package/dist/ink/wrapAnsi.js +13 -0
  422. package/dist/ink/wrapAnsi.js.map +1 -0
  423. package/dist/memory/embeddings.d.ts +33 -0
  424. package/dist/memory/embeddings.d.ts.map +1 -0
  425. package/dist/memory/embeddings.js +123 -0
  426. package/dist/memory/embeddings.js.map +1 -0
  427. package/dist/memory/index.d.ts +14 -0
  428. package/dist/memory/index.d.ts.map +1 -0
  429. package/dist/memory/index.js +31 -0
  430. package/dist/memory/index.js.map +1 -0
  431. package/dist/memory/prompts.d.ts +12 -0
  432. package/dist/memory/prompts.d.ts.map +1 -0
  433. package/dist/memory/prompts.js +117 -0
  434. package/dist/memory/prompts.js.map +1 -0
  435. package/dist/memory/semantic-search.d.ts +45 -0
  436. package/dist/memory/semantic-search.d.ts.map +1 -0
  437. package/dist/memory/semantic-search.js +112 -0
  438. package/dist/memory/semantic-search.js.map +1 -0
  439. package/dist/memory/storage.d.ts +79 -0
  440. package/dist/memory/storage.d.ts.map +1 -0
  441. package/dist/memory/storage.js +285 -0
  442. package/dist/memory/storage.js.map +1 -0
  443. package/dist/memory/store.d.ts +103 -0
  444. package/dist/memory/store.d.ts.map +1 -0
  445. package/dist/memory/store.js +226 -0
  446. package/dist/memory/store.js.map +1 -0
  447. package/dist/memory/types.d.ts +40 -0
  448. package/dist/memory/types.d.ts.map +1 -0
  449. package/dist/memory/types.js +71 -0
  450. package/dist/memory/types.js.map +1 -0
  451. package/dist/memory/validation.d.ts +28 -0
  452. package/dist/memory/validation.d.ts.map +1 -0
  453. package/dist/memory/validation.js +147 -0
  454. package/dist/memory/validation.js.map +1 -0
  455. package/dist/memory/vector-store.d.ts +49 -0
  456. package/dist/memory/vector-store.d.ts.map +1 -0
  457. package/dist/memory/vector-store.js +259 -0
  458. package/dist/memory/vector-store.js.map +1 -0
  459. package/dist/screens/REPL.d.ts +21 -0
  460. package/dist/screens/REPL.d.ts.map +1 -0
  461. package/dist/screens/REPL.js +139 -0
  462. package/dist/screens/REPL.js.map +1 -0
  463. package/dist/services/agent-runner.d.ts +68 -0
  464. package/dist/services/agent-runner.d.ts.map +1 -0
  465. package/dist/services/agent-runner.js +186 -0
  466. package/dist/services/agent-runner.js.map +1 -0
  467. package/dist/services/atomic-write.d.ts +12 -0
  468. package/dist/services/atomic-write.d.ts.map +1 -0
  469. package/dist/services/atomic-write.js +27 -0
  470. package/dist/services/atomic-write.js.map +1 -0
  471. package/dist/services/config-dir.d.ts +55 -0
  472. package/dist/services/config-dir.d.ts.map +1 -0
  473. package/dist/services/config-dir.js +136 -0
  474. package/dist/services/config-dir.js.map +1 -0
  475. package/dist/services/config.d.ts +54 -0
  476. package/dist/services/config.d.ts.map +1 -0
  477. package/dist/services/config.js +98 -0
  478. package/dist/services/config.js.map +1 -0
  479. package/dist/services/file-glob.d.ts +26 -0
  480. package/dist/services/file-glob.d.ts.map +1 -0
  481. package/dist/services/file-glob.js +134 -0
  482. package/dist/services/file-glob.js.map +1 -0
  483. package/dist/services/global-config.d.ts +109 -0
  484. package/dist/services/global-config.d.ts.map +1 -0
  485. package/dist/services/global-config.js +211 -0
  486. package/dist/services/global-config.js.map +1 -0
  487. package/dist/services/llm.d.ts +139 -0
  488. package/dist/services/llm.d.ts.map +1 -0
  489. package/dist/services/llm.js +376 -0
  490. package/dist/services/llm.js.map +1 -0
  491. package/dist/services/memory.d.ts +39 -0
  492. package/dist/services/memory.d.ts.map +1 -0
  493. package/dist/services/memory.js +88 -0
  494. package/dist/services/memory.js.map +1 -0
  495. package/dist/services/session-storage.d.ts +136 -0
  496. package/dist/services/session-storage.d.ts.map +1 -0
  497. package/dist/services/session-storage.js +304 -0
  498. package/dist/services/session-storage.js.map +1 -0
  499. package/dist/services/task-manager.d.ts +154 -0
  500. package/dist/services/task-manager.d.ts.map +1 -0
  501. package/dist/services/task-manager.js +288 -0
  502. package/dist/services/task-manager.js.map +1 -0
  503. package/dist/services/yaml-config.d.ts +57 -0
  504. package/dist/services/yaml-config.d.ts.map +1 -0
  505. package/dist/services/yaml-config.js +176 -0
  506. package/dist/services/yaml-config.js.map +1 -0
  507. package/dist/skills/discovery.d.ts +22 -0
  508. package/dist/skills/discovery.d.ts.map +1 -0
  509. package/dist/skills/discovery.js +75 -0
  510. package/dist/skills/discovery.js.map +1 -0
  511. package/dist/skills/index.d.ts +10 -0
  512. package/dist/skills/index.d.ts.map +1 -0
  513. package/dist/skills/index.js +26 -0
  514. package/dist/skills/index.js.map +1 -0
  515. package/dist/skills/loader.d.ts +48 -0
  516. package/dist/skills/loader.d.ts.map +1 -0
  517. package/dist/skills/loader.js +231 -0
  518. package/dist/skills/loader.js.map +1 -0
  519. package/dist/skills/registry.d.ts +37 -0
  520. package/dist/skills/registry.d.ts.map +1 -0
  521. package/dist/skills/registry.js +134 -0
  522. package/dist/skills/registry.js.map +1 -0
  523. package/dist/skills/types.d.ts +89 -0
  524. package/dist/skills/types.d.ts.map +1 -0
  525. package/dist/skills/types.js +24 -0
  526. package/dist/skills/types.js.map +1 -0
  527. package/dist/tools/bash_security.d.ts +64 -0
  528. package/dist/tools/bash_security.d.ts.map +1 -0
  529. package/dist/tools/bash_security.js +291 -0
  530. package/dist/tools/bash_security.js.map +1 -0
  531. package/dist/tools/index.d.ts +23 -0
  532. package/dist/tools/index.d.ts.map +1 -0
  533. package/dist/tools/index.js +965 -0
  534. package/dist/tools/index.js.map +1 -0
  535. package/dist/tools/mcp.d.ts +72 -0
  536. package/dist/tools/mcp.d.ts.map +1 -0
  537. package/dist/tools/mcp.js +422 -0
  538. package/dist/tools/mcp.js.map +1 -0
  539. package/dist/tools/plan.d.ts +18 -0
  540. package/dist/tools/plan.d.ts.map +1 -0
  541. package/dist/tools/plan.js +75 -0
  542. package/dist/tools/plan.js.map +1 -0
  543. package/dist/tools/todo.d.ts +18 -0
  544. package/dist/tools/todo.d.ts.map +1 -0
  545. package/dist/tools/todo.js +153 -0
  546. package/dist/tools/todo.js.map +1 -0
  547. package/dist/tools/web.d.ts +13 -0
  548. package/dist/tools/web.d.ts.map +1 -0
  549. package/dist/tools/web.js +377 -0
  550. package/dist/tools/web.js.map +1 -0
  551. package/dist/ui/box.d.ts +56 -0
  552. package/dist/ui/box.d.ts.map +1 -0
  553. package/dist/ui/box.js +241 -0
  554. package/dist/ui/box.js.map +1 -0
  555. package/dist/ui/command-panel.d.ts +55 -0
  556. package/dist/ui/command-panel.d.ts.map +1 -0
  557. package/dist/ui/command-panel.js +212 -0
  558. package/dist/ui/command-panel.js.map +1 -0
  559. package/dist/ui/file-completion.d.ts +62 -0
  560. package/dist/ui/file-completion.d.ts.map +1 -0
  561. package/dist/ui/file-completion.js +209 -0
  562. package/dist/ui/file-completion.js.map +1 -0
  563. package/dist/ui/markdown.d.ts +12 -0
  564. package/dist/ui/markdown.d.ts.map +1 -0
  565. package/dist/ui/markdown.js +215 -0
  566. package/dist/ui/markdown.js.map +1 -0
  567. package/dist/ui/multiline-input.d.ts +47 -0
  568. package/dist/ui/multiline-input.d.ts.map +1 -0
  569. package/dist/ui/multiline-input.js +94 -0
  570. package/dist/ui/multiline-input.js.map +1 -0
  571. package/dist/ui/status-bar.d.ts +33 -0
  572. package/dist/ui/status-bar.d.ts.map +1 -0
  573. package/dist/ui/status-bar.js +96 -0
  574. package/dist/ui/status-bar.js.map +1 -0
  575. package/dist/ui/stream-markdown.d.ts +35 -0
  576. package/dist/ui/stream-markdown.d.ts.map +1 -0
  577. package/dist/ui/stream-markdown.js +138 -0
  578. package/dist/ui/stream-markdown.js.map +1 -0
  579. package/dist/ui/suggestions.d.ts +35 -0
  580. package/dist/ui/suggestions.d.ts.map +1 -0
  581. package/dist/ui/suggestions.js +118 -0
  582. package/dist/ui/suggestions.js.map +1 -0
  583. package/dist/ui/tool-preview.d.ts +34 -0
  584. package/dist/ui/tool-preview.d.ts.map +1 -0
  585. package/dist/ui/tool-preview.js +128 -0
  586. package/dist/ui/tool-preview.js.map +1 -0
  587. package/package.json +93 -0
package/README.md ADDED
@@ -0,0 +1,460 @@
1
+ # OpenHorse
2
+
3
+ > **OpenHorse — Universal Agent Harness Framework**
4
+ > 一个完整的 Harness Coding CLI Agent
5
+
6
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
+ [![Node.js](https://img.shields.io/badge/node-%3E%3D18.0-green.svg)](https://nodejs.org)
8
+ [![TypeScript](https://img.shields.io/badge/typescript-5.0-blue.svg)](https://www.typescriptlang.org)
9
+
10
+ ---
11
+
12
+ ## 🎯 项目定位
13
+
14
+ **OpenHorse** — 一个完整的 Agent Harness Coding CLI 工具,提供安全边界、工具调用、记忆系统、MCP 协议支持。
15
+
16
+ ### 核心理念
17
+
18
+ | 维度 | 说明 |
19
+ |------|------|
20
+ | **🐴 AI 如马** | 强大的 AI 模型需要引导和约束 |
21
+ | **🪢 OpenHorse 如缰** | 精准控制方向,防止跑偏失控 |
22
+ | **🎯 Harness 系统** | 安全边界、任务约束、结果验证 |
23
+ | **🛠️ 工具调用** | LLM 自动调用工具完成任务 |
24
+ | **🧠 记忆系统** | 分层记忆:Working / Short-term / Long-term |
25
+ | **🔌 MCP 协议** | 支持 MCP 工具扩展 |
26
+
27
+ ---
28
+
29
+ ## ✨ 核心特性
30
+
31
+ | 特性 | 说明 |
32
+ |------|------|
33
+ | **LLM 工具调用** | 支持 20+ 工具:文件读写、搜索、执行命令、网页抓取等 |
34
+ | **多模型支持** | OpenAI、Claude、阿里百炼(GLM/Qwen/Kimi)、自定义 endpoint |
35
+ | **MCP 协议** | 完整支持 MCP Server 连接和工具调用 |
36
+ | **记忆系统** | 用户记忆、项目记忆、会话记忆三层存储 |
37
+ | **会话管理** | 会话持久化、历史恢复、摘要生成 |
38
+ | **安全边界** | Bash 命令白名单、危险模式检测、审计日志 |
39
+ | **Todo/Plan** | 任务列表管理、计划模式切换 |
40
+ | **流式输出** | 实时显示 LLM 响应,支持 Markdown 渲染 |
41
+ | **状态栏** | Token 使用量、成本、MCP 连接状态实时显示 |
42
+
43
+ ---
44
+
45
+ ## 🏗️ 架构设计
46
+
47
+ ```
48
+ ┌─────────────────────────────────────────────────────────┐
49
+ │ CLI 交互层 │
50
+ │ readline + chalk + 流式 Markdown + 状态栏 │
51
+ └────────────────────────────┬────────────────────────────┘
52
+
53
+ ┌────────────────────────────▼────────────────────────────┐
54
+ │ Harness 驾驭层 │
55
+ │ 目标约束 │ 边界检查 │ 结果验证 │ Bash 安全 │ 审计日志 │
56
+ └────────────────────────────┬────────────────────────────┘
57
+
58
+ ┌────────────────────────────▼────────────────────────────┐
59
+ │ Query 查询引擎 │
60
+ │ LLM Stream │ Tool Calling │ Retry/Fallback │ Cost Tracker│
61
+ └──────────┬─────────────────┬─────────────────┬──────────┘
62
+ │ │ │
63
+ ┌──────────▼─────┐ ┌─────────▼─────┐ ┌─────────▼──────────┐
64
+ │ Tools 工具集 │ │ MCP Client │ │ Skills 技能系统 │
65
+ │ File/Bash/Web │ │ Server 连接 │ │ Builtin/User/Proj │
66
+ └─────────────────┘ └───────────────┘ └───────────────────┘
67
+
68
+ ┌────────────────────────────▼────────────────────────────┐
69
+ │ Memory 记忆层 │
70
+ │ User Memory │ Project Memory │ Session Memory │ Semantic│
71
+ └─────────────────────────────────────────────────────────┘
72
+ ```
73
+
74
+ ---
75
+
76
+ ## 🚀 快速开始
77
+
78
+ ### 环境要求
79
+
80
+ - Node.js >= 18.0
81
+ - npm >= 9.0
82
+
83
+ ### 安装与运行
84
+
85
+ ```bash
86
+ # 克隆项目
87
+ git clone https://github.com/Linux2010/openhorse.git
88
+ cd openhorse
89
+
90
+ # 安装依赖
91
+ npm install
92
+
93
+ # 构建
94
+ npm run build
95
+
96
+ # 配置 API Key(任选一种)
97
+ # 方式 1: 环境变量
98
+ export OPENHORSE_API_KEY=your-api-key
99
+
100
+ # 方式 2: .env 文件
101
+ cp .env.example .env
102
+ # 编辑 .env 设置 OPENHORSE_API_KEY
103
+
104
+ # 方式 3: ~/.openhorse/openhorse.json(推荐)
105
+ # 运行后会自动创建配置文件
106
+
107
+ # 启动交互式 CLI
108
+ npm start
109
+
110
+ # 或直接运行
111
+ node dist/cli.js
112
+ ```
113
+
114
+ ### 全局安装
115
+
116
+ ```bash
117
+ # 本地链接
118
+ npm link
119
+
120
+ # 任意目录运行
121
+ openhorse
122
+ ```
123
+
124
+ ---
125
+
126
+ ## 📦 支持的模型
127
+
128
+ ### OpenAI 系列
129
+
130
+ ```bash
131
+ /model gpt-4o # GPT-4 Omni
132
+ /model gpt-3.5-turbo # GPT-3.5
133
+ ```
134
+
135
+ ### Claude 系列
136
+
137
+ ```bash
138
+ /model opus # Claude Opus 4.7
139
+ /model sonnet # Claude Sonnet 4.6
140
+ /model haiku # Claude Haiku 4.5
141
+ ```
142
+
143
+ ### 阿里百炼系列(coding.dashscope.aliyuncs.com)
144
+
145
+ ```bash
146
+ /model qwen # Qwen 3.5 Plus
147
+ /model qwenmax # Qwen 3 Max
148
+ /model coder # Qwen 3 Coder Plus
149
+ /model glm # GLM-5(智谱)
150
+ /model kimi # Kimi K2.5(月之暗面)
151
+ /model minimax # MiniMax M2.5
152
+ ```
153
+
154
+ ### 模型命令
155
+
156
+ ```bash
157
+ /model # 显示当前模型
158
+ /model list # 显示所有可用模型
159
+ /model sonnet # 切换到 Sonnet
160
+ ```
161
+
162
+ ---
163
+
164
+ ## 🛠️ 工具列表
165
+
166
+ OpenHorse 内置 20+ 工具,LLM 可自动调用:
167
+
168
+ ### 文件操作
169
+
170
+ | 工具 | 功能 |
171
+ |------|------|
172
+ | `read_file` | 读取文件内容 |
173
+ | `write_file` | 写入文件 |
174
+ | `edit_file` | 编辑文件(行替换) |
175
+ | `list_files` | 列出目录内容 |
176
+ | `glob` | Glob 模式搜索文件 |
177
+ | `grep` | 正则搜索文件内容 |
178
+
179
+ ### Shell 执行
180
+
181
+ | 工具 | 功能 |
182
+ |------|------|
183
+ | `exec_command` | 执行 shell 命令(带安全检查) |
184
+
185
+ ### 网络工具
186
+
187
+ | 工具 | 功能 |
188
+ |------|------|
189
+ | `web_fetch` | 抓取网页内容 |
190
+ | `web_search` | 网络搜索 |
191
+
192
+ ### 记忆系统
193
+
194
+ | 工具 | 功能 |
195
+ |------|------|
196
+ | `memory_save` | 保存记忆 |
197
+ | `memory_recall` | 搜索记忆 |
198
+ | `memory_forget` | 删除记忆 |
199
+
200
+ ### 任务管理
201
+
202
+ | 工具 | 功能 |
203
+ |------|------|
204
+ | `todo_write` | 创建/更新任务列表 |
205
+ | `enter_plan_mode` | 进入计划模式 |
206
+ | `exit_plan_mode` | 退出计划模式 |
207
+
208
+ ---
209
+
210
+ ## 🔌 MCP 协议支持
211
+
212
+ OpenHorse 完整支持 MCP(Model Context Protocol)协议:
213
+
214
+ ### 配置 MCP Server
215
+
216
+ 创建 `~/.openhorse/mcp.json`:
217
+
218
+ ```json
219
+ {
220
+ "servers": {
221
+ "telegram": {
222
+ "command": "node",
223
+ "args": ["path/to/plugin-telegram/dist/index.js"],
224
+ "env": {}
225
+ },
226
+ "filesystem": {
227
+ "command": "npx",
228
+ "args": ["-y", "@anthropic/mcp-server-filesystem", "/path/to/allowed/dir"]
229
+ }
230
+ }
231
+ }
232
+ ```
233
+
234
+ ### MCP 命令
235
+
236
+ ```bash
237
+ /mcp # 显示 MCP Server 连接状态
238
+ ```
239
+
240
+ 启动时自动连接所有配置的 MCP Server。
241
+
242
+ ---
243
+
244
+ ## 💬 交互命令
245
+
246
+ | 命令 | 别名 | 说明 |
247
+ |------|------|------|
248
+ | `/help` | `/h` | 显示帮助信息 |
249
+ | `/status` | `/s` | 系统状态总览 |
250
+ | `/model` | - | 查看或切换模型 |
251
+ | `/config` | - | 显示当前配置 |
252
+ | `/cost` | - | 显示会话 token 使用量 |
253
+ | `/usage` | `/stats` | 详细使用统计 |
254
+ | `/sessions` | - | 列出最近会话 |
255
+ | `/resume` | - | 恢复上次会话 |
256
+ | `/memory` | - | 记忆系统状态 |
257
+ | `/memory reindex` | - | 重建语义搜索索引 |
258
+ | `/skills` | - | 列出加载的技能 |
259
+ | `/mcp` | - | MCP Server 状态 |
260
+ | `/agents` | - | Agent 列表 |
261
+ | `/safety` | - | 安全检查配置 |
262
+ | `/harness` | - | Harness 配置 |
263
+ | `/task` | - | 任务管理 |
264
+ | `/run` | - | 通过 Agent 执行任务 |
265
+ | `/clear` | - | 清屏 |
266
+ | `/clear-history` | `/reset` | 清除对话历史 |
267
+ | `/exit` | `/q` | 退出 |
268
+
269
+ ---
270
+
271
+ ## 📁 项目结构
272
+
273
+ ```
274
+ openhorse/
275
+ ├── bin/
276
+ │ └── openhorse # CLI 入口
277
+ ├── src/
278
+ │ ├── cli.ts # 命令行交互入口
279
+ │ ├── commands/
280
+ │ │ ├── index.ts # 命令注册表
281
+ │ │ ├── parser.ts # 输入解析
282
+ │ │ └── types.ts # 命令类型定义
283
+ │ ├── core/
284
+ │ │ ├── agent.ts # Agent 基类
285
+ │ │ ├── brain.ts # 决策引擎
286
+ │ │ └── strategy-tracker.ts # 策略追踪
287
+ │ ├── agents/
288
+ │ │ ├── leader.ts # 协调者 Agent
289
+ │ │ ├── coder.ts # 编码 Agent
290
+ │ │ └── router.ts # Agent 路由
291
+ │ ├── framework/
292
+ │ │ ├── store.ts # 状态管理
293
+ │ │ ├── query.ts # 查询引擎
294
+ │ │ └── tool-state.ts # 工具状态管理
295
+ │ ├── harness/
296
+ │ │ ├── safety.ts # 安全边界检查
297
+ │ │ └── bash-safety.ts # Bash 命令安全
298
+ │ │ └── harness.ts # Harness 引擎
299
+ │ ├── memory/
300
+ │ │ ├── storage.ts # 记忆存储
301
+ │ │ ├── semantic-search.ts # 语义搜索
302
+ │ │ ├── embeddings.ts # Embedding 生成
303
+ │ │ └── vector-store.ts # 向量存储
304
+ │ ├── skills/
305
+ │ │ ├── loader.ts # 技能加载器
306
+ │ │ └ registry.ts # 技能注册表
307
+ │ ├── services/
308
+ │ │ ├── llm.ts # LLM 服务(含 Retry/Fallback)
309
+ │ │ ├── config.ts # 配置加载
310
+ │ │ ├── global-config.ts # 全局配置管理
311
+ │ │ ├── session-storage.ts # 会话持久化
312
+ │ │ ├── atomic-write.ts # 原子文件写入
313
+ │ │ ├── agent-runner.ts # Agent 执行器
314
+ │ │ └ task-manager.ts # 任务管理器
315
+ │ │ ├── file-glob.ts # 文件匹配
316
+ │ │ └ mcp-bootstrap.ts # MCP 启动
317
+ │ ├── tools/
318
+ │ │ ├── index.ts # 工具集注册
319
+ │ │ ├── mcp.ts # MCP 客户端(心跳/重连)
320
+ │ │ ├── todo.ts # Todo 工具
321
+ │ │ ├── plan.ts # Plan 工具
322
+ │ │ └ web.ts # Web 工具
323
+ │ │ └ memory.ts # Memory 工具
324
+ │ ├── ui/
325
+ │ │ ├── box.ts # UI 组件(Header/Spinner)
326
+ │ │ ├── markdown.ts # Markdown 渲染
327
+ │ │ ├── status-bar.ts # 状态栏
328
+ │ │ ├── stream-markdown.ts # 流式 Markdown
329
+ │ │ ├── tool-preview.ts # 工具预览卡片
330
+ │ │ └ suggestions.ts # 命令建议
331
+ │ └── index.ts # 公共 API 导出
332
+ ├── tests/
333
+ │ ├── ui.test.ts # UI 组件测试
334
+ │ ├── config.test.ts # 配置测试
335
+ │ └ ...
336
+ ├── docs/
337
+ │ ├── roadmap/ # 版本路线图
338
+ │ │ ├── v0.1.1.md
339
+ │ │ ├── v0.1.2.md
340
+ │ │ ├── v0.1.3.md
341
+ │ │ ├── v0.1.4.md
342
+ │ │ ├── v0.1.4-plus.md
343
+ │ │ └ v0.1.5.md
344
+ │ │ └ ...
345
+ │ ├── architecture.md # 架构设计
346
+ │ ├── harness-design.md # Harness 系统
347
+ │ └ memory-system.md # 记忆系统
348
+ │ └ agent-lifecycle.md # Agent 生命周期
349
+ ├── .env.example # 环境变量模板
350
+ ├── package.json
351
+ └ tsconfig.json
352
+ └ LICENSE
353
+ └ README.md
354
+ ```
355
+
356
+ ---
357
+
358
+ ## 📝 环境变量
359
+
360
+ | 变量 | 默认值 | 说明 |
361
+ |------|--------|------|
362
+ | `OPENHORSE_API_KEY` | - | LLM API Key |
363
+ | `OPENHORSE_API_BASE_URL` | - | LLM API Base URL |
364
+ | `OPENHORSE_MODEL` | `gpt-4o` | 默认模型 |
365
+ | `OPENHORSE_MAX_TOKENS` | `4096` | 最大输出 token |
366
+ | `OPENHORSE_TEMPERATURE` | `0.7` | 温度 |
367
+ | `OPENHORSE_MODE` | `development` | 运行模式 |
368
+ | `OPENHORSE_LOG_LEVEL` | `info` | 日志级别 |
369
+ | `OPENHORSE_EMBEDDING_PROVIDER` | - | Embedding 服务(ollama/openai) |
370
+ | `OPENHORSE_BUDGET_LIMIT` | - | 预算限制(USD) |
371
+
372
+ ---
373
+
374
+ ## 📚 版本历史
375
+
376
+ ### v0.1.5 - CLI 交互体验增强
377
+
378
+ - 状态栏:实时显示 token/cost/MCP 状态
379
+ - 流式 Markdown 渲染:代码块缓冲防断裂
380
+ - 工具预览卡片:工具执行结果可视化
381
+ - UI 组件测试
382
+
383
+ ### v0.1.4-plus - 集成与健壮性
384
+
385
+ - MCP 客户端:心跳、断线重连、自动启动
386
+ - 状态管理:Todo/Plan 状态持久化
387
+ - 语义搜索:Embedding + Vector Store
388
+ - Skills 系统:技能加载与注入
389
+ - 原子写入:防止数据损坏
390
+ - 模型别名:Bailian 模型支持
391
+
392
+ ### v0.1.4 - 工具扩展与 MCP
393
+
394
+ - 20+ 工具:File/Bash/Web/Memory/Todo/Plan
395
+ - MCP 协议支持
396
+ - 多模型支持
397
+
398
+ ### v0.1.1 - v0.1.3 - 基础架构
399
+
400
+ - CLI 交互框架
401
+ - Harness 驾驭系统
402
+ - 记忆系统
403
+ - 会话管理
404
+
405
+ ---
406
+
407
+ ## 🔧 开发
408
+
409
+ ```bash
410
+ # 安装依赖
411
+ npm install
412
+
413
+ # 开发模式(热重载)
414
+ npm run dev
415
+
416
+ # 构建
417
+ npm run build
418
+
419
+ # 运行测试
420
+ npm test
421
+
422
+ # 代码检查
423
+ npm run lint
424
+
425
+ # 格式化
426
+ npm run format
427
+ ```
428
+
429
+ ---
430
+
431
+ ## 📖 Roadmap
432
+
433
+ | 版本 | 目标 |
434
+ |------|------|
435
+ | v0.1.5 | CLI UX:状态栏、流式 Markdown、工具卡片 |
436
+ | v0.1.6 | Agent 增强:Router、多 Agent 协作 |
437
+ | v0.1.7 | Hooks 系统:工具调用前后钩子 |
438
+ | v0.1.8 | Cron 定时任务:定时执行、提醒 |
439
+ | v0.1.9 | VS Code 扩展 |
440
+ | v0.1.10 | Web UI |
441
+
442
+ 详见 `docs/roadmap/` 目录。
443
+
444
+ ---
445
+
446
+ ## 🤝 贡献
447
+
448
+ 欢迎提交 Issue 和 Pull Request!
449
+
450
+ ---
451
+
452
+ ## 📝 许可
453
+
454
+ MIT License - See [LICENSE](LICENSE) for details
455
+
456
+ ---
457
+
458
+ **OpenHorse — Universal Agent Harness Framework.**
459
+
460
+ *"AI 如马,OpenHorse 如缰。"*
package/bin/openhorse ADDED
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env node
2
+
3
+ const path = require('path');
4
+ const os = require('os');
5
+ const fs = require('fs');
6
+
7
+ // ============================================================================
8
+ // Multi-path .env loading
9
+ //
10
+ // Load order (later files do NOT override already-set variables):
11
+ // 1. ~/.openhorse.env (global config, works from any directory)
12
+ // 2. ./.env (project-local override)
13
+ // 3. <package>/.env (fallback for development only)
14
+ // ============================================================================
15
+
16
+ function loadEnvFile(filePath) {
17
+ if (fs.existsSync(filePath)) {
18
+ require('dotenv').config({ path: filePath });
19
+ return true;
20
+ }
21
+ return false;
22
+ }
23
+
24
+ const envFilesLoaded = [];
25
+
26
+ // 1. Global config: ~/.openhorse.env
27
+ const globalEnv = path.join(os.homedir(), '.openhorse.env');
28
+ if (loadEnvFile(globalEnv)) {
29
+ envFilesLoaded.push(globalEnv);
30
+ }
31
+
32
+ // 2. Current working directory: ./.env
33
+ const localEnv = path.join(process.cwd(), '.env');
34
+ if (loadEnvFile(localEnv)) {
35
+ envFilesLoaded.push(localEnv);
36
+ }
37
+
38
+ // 3. Package directory (development fallback)
39
+ const packageEnv = path.join(__dirname, '..', '.env');
40
+ if (loadEnvFile(packageEnv)) {
41
+ envFilesLoaded.push(packageEnv);
42
+ }
43
+
44
+ // ============================================================================
45
+ // Load CLI
46
+ // ============================================================================
47
+
48
+ const distCli = path.join(__dirname, '..', 'dist', 'cli.js');
49
+ const srcCli = path.join(__dirname, '..', 'src', 'cli.ts');
50
+
51
+ if (fs.existsSync(distCli)) {
52
+ require(distCli);
53
+ } else {
54
+ require('ts-node').register({ transpileOnly: true });
55
+ require(srcCli);
56
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * x-agent - Coder Agent (编码专家)
3
+ *
4
+ * 负责代码编写、审查和自动化开发任务
5
+ */
6
+ import { BaseAgent, AgentConfig, Task, TaskResult } from '../core/agent';
7
+ export declare class CoderAgent extends BaseAgent {
8
+ constructor(config?: Partial<AgentConfig>);
9
+ execute(task: Task): Promise<TaskResult>;
10
+ private performCoding;
11
+ }
12
+ //# sourceMappingURL=coder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coder.d.ts","sourceRoot":"","sources":["../../src/agents/coder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEzE,qBAAa,UAAW,SAAQ,SAAS;gBAC3B,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;IAUnC,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;YAwBhC,aAAa;CAO5B"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * x-agent - Coder Agent (编码专家)
4
+ *
5
+ * 负责代码编写、审查和自动化开发任务
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.CoderAgent = void 0;
9
+ const agent_1 = require("../core/agent");
10
+ class CoderAgent extends agent_1.BaseAgent {
11
+ constructor(config) {
12
+ super({
13
+ id: config?.id || 'coder',
14
+ name: config?.name || 'Coder',
15
+ description: config?.description || '编码专家 Agent - 负责代码编写、审查和自动化开发',
16
+ capabilities: config?.capabilities || ['coding', 'code-review', 'debugging', 'refactoring'],
17
+ ...config,
18
+ });
19
+ }
20
+ async execute(task) {
21
+ const startTime = Date.now();
22
+ console.log(`[Coder] Executing coding task: ${task.name}`);
23
+ this.status = 'working';
24
+ this.emit('task-started', task);
25
+ try {
26
+ const result = await this.performCoding(task);
27
+ const duration = Date.now() - startTime;
28
+ this.status = 'idle';
29
+ this.emit('task-completed', { task, result, duration });
30
+ return { success: true, data: result, duration };
31
+ }
32
+ catch (error) {
33
+ const duration = Date.now() - startTime;
34
+ this.status = 'error';
35
+ this.emit('task-failed', { task, error });
36
+ return { success: false, error: String(error), duration };
37
+ }
38
+ }
39
+ async performCoding(task) {
40
+ // 编码逻辑
41
+ return {
42
+ message: `Coding task "${task.name}" completed`,
43
+ timestamp: new Date().toISOString(),
44
+ };
45
+ }
46
+ }
47
+ exports.CoderAgent = CoderAgent;
48
+ //# sourceMappingURL=coder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coder.js","sourceRoot":"","sources":["../../src/agents/coder.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,yCAAyE;AAEzE,MAAa,UAAW,SAAQ,iBAAS;IACvC,YAAY,MAA6B;QACvC,KAAK,CAAC;YACJ,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,OAAO;YACzB,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,OAAO;YAC7B,WAAW,EAAE,MAAM,EAAE,WAAW,IAAI,8BAA8B;YAClE,YAAY,EAAE,MAAM,EAAE,YAAY,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,CAAC;YAC3F,GAAG,MAAM;SACV,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAU;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAEhC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAE9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAExD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAE1C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC5D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,IAAU;QACpC,OAAO;QACP,OAAO;YACL,OAAO,EAAE,gBAAgB,IAAI,CAAC,IAAI,aAAa;YAC/C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC;CACF;AA1CD,gCA0CC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * x-agent - Leader Agent (协调者)
3
+ *
4
+ * 负责任务分发、Agent 管理和整体协调
5
+ */
6
+ import { BaseAgent, AgentConfig, Task, TaskResult } from '../core/agent';
7
+ export declare class LeaderAgent extends BaseAgent {
8
+ constructor(config?: Partial<AgentConfig>);
9
+ execute(task: Task): Promise<TaskResult>;
10
+ private coordinateTask;
11
+ }
12
+ //# sourceMappingURL=leader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leader.d.ts","sourceRoot":"","sources":["../../src/agents/leader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAEzE,qBAAa,WAAY,SAAQ,SAAS;gBAC5B,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC;IAUnC,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC;YAyBhC,cAAc;CAO7B"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /**
3
+ * x-agent - Leader Agent (协调者)
4
+ *
5
+ * 负责任务分发、Agent 管理和整体协调
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.LeaderAgent = void 0;
9
+ const agent_1 = require("../core/agent");
10
+ class LeaderAgent extends agent_1.BaseAgent {
11
+ constructor(config) {
12
+ super({
13
+ id: config?.id || 'leader',
14
+ name: config?.name || 'Leader',
15
+ description: config?.description || '协调者 Agent - 负责任务分发和整体协调',
16
+ capabilities: config?.capabilities || ['task-distribution', 'coordination', 'monitoring'],
17
+ ...config,
18
+ });
19
+ }
20
+ async execute(task) {
21
+ const startTime = Date.now();
22
+ console.log(`[Leader] Executing task: ${task.name}`);
23
+ this.status = 'working';
24
+ this.emit('task-started', task);
25
+ try {
26
+ // Leader 的任务通常是协调和分发
27
+ const result = await this.coordinateTask(task);
28
+ const duration = Date.now() - startTime;
29
+ this.status = 'idle';
30
+ this.emit('task-completed', { task, result, duration });
31
+ return { success: true, data: result, duration };
32
+ }
33
+ catch (error) {
34
+ const duration = Date.now() - startTime;
35
+ this.status = 'error';
36
+ this.emit('task-failed', { task, error });
37
+ return { success: false, error: String(error), duration };
38
+ }
39
+ }
40
+ async coordinateTask(task) {
41
+ // Leader 协调逻辑
42
+ return {
43
+ message: `Task "${task.name}" coordinated by Leader`,
44
+ timestamp: new Date().toISOString(),
45
+ };
46
+ }
47
+ }
48
+ exports.LeaderAgent = LeaderAgent;
49
+ //# sourceMappingURL=leader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"leader.js","sourceRoot":"","sources":["../../src/agents/leader.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,yCAAyE;AAEzE,MAAa,WAAY,SAAQ,iBAAS;IACxC,YAAY,MAA6B;QACvC,KAAK,CAAC;YACJ,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,QAAQ;YAC1B,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,QAAQ;YAC9B,WAAW,EAAE,MAAM,EAAE,WAAW,IAAI,yBAAyB;YAC7D,YAAY,EAAE,MAAM,EAAE,YAAY,IAAI,CAAC,mBAAmB,EAAE,cAAc,EAAE,YAAY,CAAC;YACzF,GAAG,MAAM;SACV,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAU;QACtB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,OAAO,CAAC,GAAG,CAAC,4BAA4B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAEhC,IAAI,CAAC;YACH,qBAAqB;YACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAE/C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YAExD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACxC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YAE1C,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC5D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,IAAU;QACrC,cAAc;QACd,OAAO;YACL,OAAO,EAAE,SAAS,IAAI,CAAC,IAAI,yBAAyB;YACpD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC;CACF;AA3CD,kCA2CC"}