openhorse 0.2.6 → 0.2.9

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 (185) hide show
  1. package/README.md +2 -2
  2. package/README.zh-CN.md +10 -1
  3. package/dist/cli.d.ts +1 -1
  4. package/dist/cli.js +9 -16
  5. package/dist/cli.js.map +1 -1
  6. package/dist/commands/index.d.ts.map +1 -1
  7. package/dist/commands/index.js +69 -24
  8. package/dist/commands/index.js.map +1 -1
  9. package/dist/commands/types.d.ts +7 -28
  10. package/dist/commands/types.d.ts.map +1 -1
  11. package/dist/commands/types.js.map +1 -1
  12. package/dist/core/checkpoint.d.ts +42 -0
  13. package/dist/core/checkpoint.d.ts.map +1 -0
  14. package/dist/core/checkpoint.js +222 -0
  15. package/dist/core/checkpoint.js.map +1 -0
  16. package/dist/core/tool-artifacts.d.ts.map +1 -1
  17. package/dist/core/tool-artifacts.js +19 -15
  18. package/dist/core/tool-artifacts.js.map +1 -1
  19. package/dist/framework/index.d.ts +1 -0
  20. package/dist/framework/index.d.ts.map +1 -1
  21. package/dist/framework/index.js +5 -1
  22. package/dist/framework/index.js.map +1 -1
  23. package/dist/framework/tool-serializer.d.ts +21 -0
  24. package/dist/framework/tool-serializer.d.ts.map +1 -0
  25. package/dist/framework/tool-serializer.js +68 -0
  26. package/dist/framework/tool-serializer.js.map +1 -0
  27. package/dist/framework/tool.d.ts +5 -1
  28. package/dist/framework/tool.d.ts.map +1 -1
  29. package/dist/framework/tool.js.map +1 -1
  30. package/dist/harness/context-harness.d.ts.map +1 -1
  31. package/dist/harness/context-harness.js +5 -0
  32. package/dist/harness/context-harness.js.map +1 -1
  33. package/dist/harness/evidence.d.ts +5 -0
  34. package/dist/harness/evidence.d.ts.map +1 -1
  35. package/dist/harness/evidence.js +23 -0
  36. package/dist/harness/evidence.js.map +1 -1
  37. package/dist/harness/index.d.ts +1 -1
  38. package/dist/harness/index.d.ts.map +1 -1
  39. package/dist/harness/index.js +2 -1
  40. package/dist/harness/index.js.map +1 -1
  41. package/dist/harness/intent.d.ts.map +1 -1
  42. package/dist/harness/intent.js +8 -0
  43. package/dist/harness/intent.js.map +1 -1
  44. package/dist/harness/types.d.ts +4 -1
  45. package/dist/harness/types.d.ts.map +1 -1
  46. package/dist/ink-ui/App.d.ts +2 -2
  47. package/dist/ink-ui/App.d.ts.map +1 -1
  48. package/dist/ink-ui/components/PixelHorseBanner.d.ts +2 -2
  49. package/dist/ink-ui/components/PixelHorseBanner.d.ts.map +1 -1
  50. package/dist/ink-ui/components/StatusLine.d.ts +2 -2
  51. package/dist/ink-ui/components/StatusLine.d.ts.map +1 -1
  52. package/dist/ink-ui/launch.d.ts +2 -2
  53. package/dist/ink-ui/launch.d.ts.map +1 -1
  54. package/dist/ink-ui/launch.js.map +1 -1
  55. package/dist/ink-ui/screens/ReplScreen.d.ts +2 -2
  56. package/dist/ink-ui/screens/ReplScreen.d.ts.map +1 -1
  57. package/dist/ink-ui/screens/ReplScreen.js +4 -2
  58. package/dist/ink-ui/screens/ReplScreen.js.map +1 -1
  59. package/dist/memory/storage.d.ts +2 -0
  60. package/dist/memory/storage.d.ts.map +1 -1
  61. package/dist/memory/storage.js +56 -32
  62. package/dist/memory/storage.js.map +1 -1
  63. package/dist/memory/vector-store.d.ts +23 -3
  64. package/dist/memory/vector-store.d.ts.map +1 -1
  65. package/dist/memory/vector-store.js +107 -37
  66. package/dist/memory/vector-store.js.map +1 -1
  67. package/dist/print-ui/launch.d.ts +44 -2
  68. package/dist/print-ui/launch.d.ts.map +1 -1
  69. package/dist/print-ui/launch.js +12 -0
  70. package/dist/print-ui/launch.js.map +1 -1
  71. package/dist/runtime/agent-runtime-controller.d.ts +3 -1
  72. package/dist/runtime/agent-runtime-controller.d.ts.map +1 -1
  73. package/dist/runtime/agent-runtime-controller.js +12 -1
  74. package/dist/runtime/agent-runtime-controller.js.map +1 -1
  75. package/dist/runtime/agent-runtime-protocol.d.ts +7 -1
  76. package/dist/runtime/agent-runtime-protocol.d.ts.map +1 -1
  77. package/dist/runtime/agent-runtime-protocol.js +12 -0
  78. package/dist/runtime/agent-runtime-protocol.js.map +1 -1
  79. package/dist/runtime/chat-controller.d.ts +4 -1
  80. package/dist/runtime/chat-controller.d.ts.map +1 -1
  81. package/dist/runtime/chat-controller.js +16 -0
  82. package/dist/runtime/chat-controller.js.map +1 -1
  83. package/dist/runtime/ui-events.d.ts +29 -2
  84. package/dist/runtime/ui-events.d.ts.map +1 -1
  85. package/dist/runtime/ui-events.js +34 -0
  86. package/dist/runtime/ui-events.js.map +1 -1
  87. package/dist/services/concurrent-sessions.d.ts.map +1 -1
  88. package/dist/services/concurrent-sessions.js +6 -7
  89. package/dist/services/concurrent-sessions.js.map +1 -1
  90. package/dist/services/config-dir.d.ts +29 -6
  91. package/dist/services/config-dir.d.ts.map +1 -1
  92. package/dist/services/config-dir.js +118 -17
  93. package/dist/services/config-dir.js.map +1 -1
  94. package/dist/services/config.d.ts +9 -2
  95. package/dist/services/config.d.ts.map +1 -1
  96. package/dist/services/config.js +22 -7
  97. package/dist/services/config.js.map +1 -1
  98. package/dist/services/doctor.d.ts.map +1 -1
  99. package/dist/services/doctor.js +140 -4
  100. package/dist/services/doctor.js.map +1 -1
  101. package/dist/services/format.d.ts +2 -0
  102. package/dist/services/format.d.ts.map +1 -0
  103. package/dist/services/format.js +20 -0
  104. package/dist/services/format.js.map +1 -0
  105. package/dist/services/global-config.d.ts +3 -3
  106. package/dist/services/global-config.d.ts.map +1 -1
  107. package/dist/services/session-storage.d.ts.map +1 -1
  108. package/dist/services/session-storage.js +42 -89
  109. package/dist/services/session-storage.js.map +1 -1
  110. package/dist/services/storage-maintenance.d.ts +53 -0
  111. package/dist/services/storage-maintenance.d.ts.map +1 -0
  112. package/dist/services/storage-maintenance.js +369 -0
  113. package/dist/services/storage-maintenance.js.map +1 -0
  114. package/dist/terminal-ui/launch.d.ts +30 -2
  115. package/dist/terminal-ui/launch.d.ts.map +1 -1
  116. package/dist/terminal-ui/launch.js +6 -14
  117. package/dist/terminal-ui/launch.js.map +1 -1
  118. package/dist/tools/index.js +9 -9
  119. package/dist/tools/index.js.map +1 -1
  120. package/dist/tui-ui/launch.d.ts +2 -2
  121. package/dist/tui-ui/launch.d.ts.map +1 -1
  122. package/dist/tui-ui/launch.js +2 -0
  123. package/dist/tui-ui/launch.js.map +1 -1
  124. package/dist/tui-ui/layout.d.ts.map +1 -1
  125. package/dist/tui-ui/layout.js +2 -13
  126. package/dist/tui-ui/layout.js.map +1 -1
  127. package/dist/tui-ui/state.d.ts +13 -1
  128. package/dist/tui-ui/state.d.ts.map +1 -1
  129. package/dist/tui-ui/state.js +13 -0
  130. package/dist/tui-ui/state.js.map +1 -1
  131. package/dist/ui/command-panel.d.ts +1 -1
  132. package/dist/ui/command-panel.d.ts.map +1 -1
  133. package/dist/ui/command-panel.js +37 -34
  134. package/dist/ui/command-panel.js.map +1 -1
  135. package/dist/ui/file-completion.d.ts +1 -1
  136. package/dist/ui/file-completion.d.ts.map +1 -1
  137. package/dist/ui/file-completion.js +4 -4
  138. package/dist/ui/file-completion.js.map +1 -1
  139. package/dist/ui/shared/command-palette.d.ts +3 -0
  140. package/dist/ui/shared/command-palette.d.ts.map +1 -0
  141. package/dist/ui/shared/command-palette.js +54 -0
  142. package/dist/ui/shared/command-palette.js.map +1 -0
  143. package/dist/ui/shared/command-suggestions.d.ts +19 -0
  144. package/dist/ui/shared/command-suggestions.d.ts.map +1 -0
  145. package/dist/ui/shared/command-suggestions.js +67 -0
  146. package/dist/ui/shared/command-suggestions.js.map +1 -0
  147. package/dist/ui/shared/input-frame.d.ts +19 -0
  148. package/dist/ui/shared/input-frame.d.ts.map +1 -0
  149. package/dist/ui/shared/input-frame.js +74 -0
  150. package/dist/ui/shared/input-frame.js.map +1 -0
  151. package/dist/ui/shared/text.d.ts +5 -0
  152. package/dist/ui/shared/text.d.ts.map +1 -0
  153. package/dist/ui/shared/text.js +55 -0
  154. package/dist/ui/shared/text.js.map +1 -0
  155. package/dist/ui/shared/types.d.ts +27 -0
  156. package/dist/ui/shared/types.d.ts.map +1 -0
  157. package/dist/ui/shared/types.js +3 -0
  158. package/dist/ui/shared/types.js.map +1 -0
  159. package/dist/ui/user-input.js +2 -2
  160. package/dist/ui/user-input.js.map +1 -1
  161. package/dist/ui-v2/components/command-palette.d.ts +1 -5
  162. package/dist/ui-v2/components/command-palette.d.ts.map +1 -1
  163. package/dist/ui-v2/components/command-palette.js +15 -54
  164. package/dist/ui-v2/components/command-palette.js.map +1 -1
  165. package/dist/ui-v2/components/shell.d.ts +1 -14
  166. package/dist/ui-v2/components/shell.d.ts.map +1 -1
  167. package/dist/ui-v2/components/shell.js +4 -55
  168. package/dist/ui-v2/components/shell.js.map +1 -1
  169. package/dist/ui-v2/runtime/text.d.ts +1 -7
  170. package/dist/ui-v2/runtime/text.d.ts.map +1 -1
  171. package/dist/ui-v2/runtime/text.js +15 -55
  172. package/dist/ui-v2/runtime/text.js.map +1 -1
  173. package/dist/ui-v2/state/sessions.d.ts +1 -1
  174. package/dist/ui-v2/state/sessions.d.ts.map +1 -1
  175. package/dist/ui-v2/state/sessions.js +5 -18
  176. package/dist/ui-v2/state/sessions.js.map +1 -1
  177. package/dist/ui-v2/state/suggestions.d.ts +1 -21
  178. package/dist/ui-v2/state/suggestions.d.ts.map +1 -1
  179. package/dist/ui-v2/state/suggestions.js +15 -67
  180. package/dist/ui-v2/state/suggestions.js.map +1 -1
  181. package/dist/ui-v2/types.d.ts +1 -32
  182. package/dist/ui-v2/types.d.ts.map +1 -1
  183. package/dist/ui-v2/types.js +15 -6
  184. package/dist/ui-v2/types.js.map +1 -1
  185. package/package.json +4 -1
@@ -0,0 +1,53 @@
1
+ export type StorageIssueKind = 'legacy-global-sessions' | 'legacy-global-memory' | 'legacy-hash-project' | 'temp-project' | 'empty-project' | 'missing-project-metadata' | 'invalid-project-metadata' | 'vector-orphan-project';
2
+ export interface StorageIssue {
3
+ kind: StorageIssueKind;
4
+ path?: string;
5
+ projectKey?: string;
6
+ summary: string;
7
+ bytes?: number;
8
+ canCleanup: boolean;
9
+ }
10
+ export interface StorageProjectSummary {
11
+ projectKey: string;
12
+ path: string;
13
+ bytes: number;
14
+ hasMetadata: boolean;
15
+ projectPath?: string;
16
+ sessions: number;
17
+ }
18
+ export interface VectorStorageSummary {
19
+ project: string;
20
+ rows: number;
21
+ orphan: boolean;
22
+ }
23
+ export interface StorageReport {
24
+ configHome: string;
25
+ projectsDir: string;
26
+ projects: StorageProjectSummary[];
27
+ vectorProjects: VectorStorageSummary[];
28
+ issues: StorageIssue[];
29
+ totalBytes: number;
30
+ }
31
+ export interface StorageCleanupOptions {
32
+ dryRun?: boolean;
33
+ includeLegacy?: boolean;
34
+ includeTemp?: boolean;
35
+ includeEmpty?: boolean;
36
+ includeVectorOrphans?: boolean;
37
+ }
38
+ export interface StorageCleanupResult {
39
+ dryRun: boolean;
40
+ deletedPaths: string[];
41
+ skippedPaths: string[];
42
+ vectorDeletedRows: number;
43
+ issues: StorageIssue[];
44
+ }
45
+ export declare function collectStorageReport(): StorageReport;
46
+ export declare function cleanupStorage(options?: StorageCleanupOptions): StorageCleanupResult;
47
+ export declare function repairProjectMetadata(): {
48
+ repaired: string[];
49
+ skipped: string[];
50
+ };
51
+ export declare function formatStorageReport(report: StorageReport): string;
52
+ export declare function formatStorageCleanupResult(result: StorageCleanupResult): string;
53
+ //# sourceMappingURL=storage-maintenance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-maintenance.d.ts","sourceRoot":"","sources":["../../src/services/storage-maintenance.ts"],"names":[],"mappings":"AAoBA,MAAM,MAAM,gBAAgB,GACxB,wBAAwB,GACxB,sBAAsB,GACtB,qBAAqB,GACrB,cAAc,GACd,eAAe,GACf,0BAA0B,GAC1B,0BAA0B,GAC1B,uBAAuB,CAAC;AAE5B,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,gBAAgB,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,qBAAqB,EAAE,CAAC;IAClC,cAAc,EAAE,oBAAoB,EAAE,CAAC;IACvC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAKD,wBAAgB,oBAAoB,IAAI,aAAa,CA2GpD;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,oBAAoB,CAiDxF;AAED,wBAAgB,qBAAqB,IAAI;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA8BjF;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA+BjE;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAmB/E"}
@@ -0,0 +1,369 @@
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.collectStorageReport = collectStorageReport;
7
+ exports.cleanupStorage = cleanupStorage;
8
+ exports.repairProjectMetadata = repairProjectMetadata;
9
+ exports.formatStorageReport = formatStorageReport;
10
+ exports.formatStorageCleanupResult = formatStorageCleanupResult;
11
+ const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
12
+ const fs_1 = require("fs");
13
+ const path_1 = require("path");
14
+ const config_dir_1 = require("./config-dir");
15
+ const format_1 = require("./format");
16
+ const HASH_PROJECT_RE = /^[a-f0-9]{16}$/;
17
+ const TEMP_PROJECT_RE = /^(private-tmp-|private-var-folders-.*openhorse-|tmp-openhorse-|test-project$)/;
18
+ function collectStorageReport() {
19
+ const configHome = (0, config_dir_1.getConfigHome)();
20
+ const projectsDir = (0, config_dir_1.getProjectsDir)();
21
+ const projects = listProjectSummaries(projectsDir);
22
+ const validProjectKeys = new Set(projects
23
+ .filter(project => !HASH_PROJECT_RE.test(project.projectKey) && !TEMP_PROJECT_RE.test(project.projectKey))
24
+ .map(project => project.projectKey));
25
+ const vectorProjects = inspectVectorProjects(configHome, validProjectKeys);
26
+ const issues = [];
27
+ const legacySessions = (0, path_1.join)(configHome, 'sessions');
28
+ const legacyMemory = (0, path_1.join)(configHome, 'memory');
29
+ if ((0, fs_1.existsSync)(legacySessions)) {
30
+ issues.push({
31
+ kind: 'legacy-global-sessions',
32
+ path: legacySessions,
33
+ summary: 'Legacy global sessions directory exists',
34
+ bytes: dirSize(legacySessions),
35
+ canCleanup: true,
36
+ });
37
+ }
38
+ if ((0, fs_1.existsSync)(legacyMemory)) {
39
+ issues.push({
40
+ kind: 'legacy-global-memory',
41
+ path: legacyMemory,
42
+ summary: 'Legacy global memory directory exists',
43
+ bytes: dirSize(legacyMemory),
44
+ canCleanup: true,
45
+ });
46
+ }
47
+ for (const project of projects) {
48
+ if (HASH_PROJECT_RE.test(project.projectKey)) {
49
+ issues.push({
50
+ kind: 'legacy-hash-project',
51
+ path: project.path,
52
+ projectKey: project.projectKey,
53
+ summary: 'Legacy hash project storage directory',
54
+ bytes: project.bytes,
55
+ canCleanup: true,
56
+ });
57
+ continue;
58
+ }
59
+ if (TEMP_PROJECT_RE.test(project.projectKey)) {
60
+ issues.push({
61
+ kind: 'temp-project',
62
+ path: project.path,
63
+ projectKey: project.projectKey,
64
+ summary: 'Test or temporary project storage directory',
65
+ bytes: project.bytes,
66
+ canCleanup: true,
67
+ });
68
+ continue;
69
+ }
70
+ if (project.bytes === 0) {
71
+ issues.push({
72
+ kind: 'empty-project',
73
+ path: project.path,
74
+ projectKey: project.projectKey,
75
+ summary: 'Empty project storage directory',
76
+ bytes: 0,
77
+ canCleanup: true,
78
+ });
79
+ continue;
80
+ }
81
+ if (!project.hasMetadata) {
82
+ issues.push({
83
+ kind: 'missing-project-metadata',
84
+ path: (0, config_dir_1.getProjectMetadataPath)(project.projectPath || project.path),
85
+ projectKey: project.projectKey,
86
+ summary: 'Project metadata file is missing',
87
+ bytes: project.bytes,
88
+ canCleanup: false,
89
+ });
90
+ }
91
+ else if (project.projectPath && (0, config_dir_1.getCanonicalProjectKey)(project.projectPath) !== project.projectKey) {
92
+ issues.push({
93
+ kind: 'invalid-project-metadata',
94
+ path: (0, config_dir_1.getProjectMetadataPath)(project.projectPath),
95
+ projectKey: project.projectKey,
96
+ summary: 'Project metadata does not match the canonical project key',
97
+ bytes: project.bytes,
98
+ canCleanup: false,
99
+ });
100
+ }
101
+ }
102
+ for (const vectorProject of vectorProjects) {
103
+ if (!vectorProject.orphan)
104
+ continue;
105
+ issues.push({
106
+ kind: 'vector-orphan-project',
107
+ projectKey: vectorProject.project,
108
+ summary: `Vector DB has ${vectorProject.rows} row(s) for a missing project`,
109
+ canCleanup: true,
110
+ });
111
+ }
112
+ return {
113
+ configHome,
114
+ projectsDir,
115
+ projects,
116
+ vectorProjects,
117
+ issues,
118
+ totalBytes: dirSize(configHome),
119
+ };
120
+ }
121
+ function cleanupStorage(options = {}) {
122
+ const opts = {
123
+ dryRun: options.dryRun ?? false,
124
+ includeLegacy: options.includeLegacy ?? true,
125
+ includeTemp: options.includeTemp ?? true,
126
+ includeEmpty: options.includeEmpty ?? true,
127
+ includeVectorOrphans: options.includeVectorOrphans ?? true,
128
+ };
129
+ const report = collectStorageReport();
130
+ const deletedPaths = [];
131
+ const skippedPaths = [];
132
+ let vectorDeletedRows = 0;
133
+ for (const issue of report.issues) {
134
+ const shouldDeletePath = (opts.includeLegacy && (issue.kind === 'legacy-global-sessions' || issue.kind === 'legacy-global-memory' || issue.kind === 'legacy-hash-project')) ||
135
+ (opts.includeTemp && issue.kind === 'temp-project') ||
136
+ (opts.includeEmpty && issue.kind === 'empty-project');
137
+ if (shouldDeletePath && issue.path) {
138
+ if (!opts.dryRun) {
139
+ (0, fs_1.rmSync)(issue.path, { recursive: true, force: true });
140
+ }
141
+ deletedPaths.push(issue.path);
142
+ continue;
143
+ }
144
+ if (opts.includeVectorOrphans && issue.kind === 'vector-orphan-project' && issue.projectKey) {
145
+ const deleted = deleteVectorProjectRows(report.configHome, issue.projectKey, opts.dryRun);
146
+ vectorDeletedRows += deleted;
147
+ continue;
148
+ }
149
+ if (issue.canCleanup) {
150
+ skippedPaths.push(issue.path || issue.projectKey || issue.kind);
151
+ }
152
+ }
153
+ if (!opts.dryRun) {
154
+ repairProjectMetadata();
155
+ }
156
+ return {
157
+ dryRun: opts.dryRun,
158
+ deletedPaths,
159
+ skippedPaths,
160
+ vectorDeletedRows,
161
+ issues: report.issues,
162
+ };
163
+ }
164
+ function repairProjectMetadata() {
165
+ const projectsDir = (0, config_dir_1.getProjectsDir)();
166
+ const repaired = [];
167
+ const skipped = [];
168
+ if (!(0, fs_1.existsSync)(projectsDir)) {
169
+ (0, fs_1.mkdirSync)(projectsDir, { recursive: true, mode: 0o700 });
170
+ return { repaired, skipped };
171
+ }
172
+ for (const entry of (0, fs_1.readdirSync)(projectsDir)) {
173
+ if (HASH_PROJECT_RE.test(entry) || TEMP_PROJECT_RE.test(entry)) {
174
+ skipped.push(entry);
175
+ continue;
176
+ }
177
+ const projectDir = (0, path_1.join)(projectsDir, entry);
178
+ if (!safeIsDirectory(projectDir))
179
+ continue;
180
+ const projectPath = inferProjectPath(projectDir);
181
+ if (!projectPath) {
182
+ skipped.push(entry);
183
+ continue;
184
+ }
185
+ (0, config_dir_1.updateProjectMetadata)(projectPath);
186
+ repaired.push(entry);
187
+ }
188
+ return { repaired, skipped };
189
+ }
190
+ function formatStorageReport(report) {
191
+ const lines = [
192
+ 'OpenHorse Storage',
193
+ '─'.repeat(40),
194
+ `Config ${report.configHome}`,
195
+ `Projects ${report.projects.length}`,
196
+ `Size ${(0, format_1.formatBytes)(report.totalBytes)}`,
197
+ `Issues ${report.issues.length}`,
198
+ '',
199
+ ];
200
+ if (report.issues.length === 0) {
201
+ lines.push('✓ Storage layout is clean');
202
+ }
203
+ else {
204
+ for (const issue of report.issues) {
205
+ const size = issue.bytes !== undefined ? ` ${(0, format_1.formatBytes)(issue.bytes)}` : '';
206
+ const target = issue.path || issue.projectKey || '';
207
+ lines.push(`! ${issue.kind}${size}`);
208
+ lines.push(` ${issue.summary}`);
209
+ if (target)
210
+ lines.push(` ${target}`);
211
+ }
212
+ }
213
+ if (report.vectorProjects.length > 0) {
214
+ lines.push('', 'Vector Projects');
215
+ for (const project of report.vectorProjects.slice(0, 12)) {
216
+ lines.push(` ${project.orphan ? '!' : '✓'} ${project.project} ${project.rows} rows`);
217
+ }
218
+ }
219
+ return lines.join('\n');
220
+ }
221
+ function formatStorageCleanupResult(result) {
222
+ const lines = [
223
+ result.dryRun ? 'OpenHorse Storage Cleanup (dry run)' : 'OpenHorse Storage Cleanup',
224
+ '─'.repeat(40),
225
+ `Paths ${result.deletedPaths.length}`,
226
+ `Vector rows ${result.vectorDeletedRows}`,
227
+ ];
228
+ for (const path of result.deletedPaths.slice(0, 20)) {
229
+ lines.push(` ${result.dryRun ? 'would delete' : 'deleted'} ${path}`);
230
+ }
231
+ if (result.deletedPaths.length > 20) {
232
+ lines.push(` ... ${result.deletedPaths.length - 20} more`);
233
+ }
234
+ if (result.skippedPaths.length > 0) {
235
+ lines.push(`Skipped ${result.skippedPaths.length}`);
236
+ }
237
+ return lines.join('\n');
238
+ }
239
+ function listProjectSummaries(projectsDir) {
240
+ if (!(0, fs_1.existsSync)(projectsDir))
241
+ return [];
242
+ const summaries = [];
243
+ for (const projectKey of (0, fs_1.readdirSync)(projectsDir)) {
244
+ const projectDir = (0, path_1.join)(projectsDir, projectKey);
245
+ if (!safeIsDirectory(projectDir))
246
+ continue;
247
+ const projectPath = inferProjectPath(projectDir);
248
+ const metadata = projectPath ? (0, config_dir_1.readProjectMetadata)(projectPath) : null;
249
+ const sessionsDir = (0, path_1.join)(projectDir, 'sessions');
250
+ const sessions = (0, fs_1.existsSync)(sessionsDir)
251
+ ? (0, fs_1.readdirSync)(sessionsDir).filter(file => file.endsWith('.json') && !file.endsWith('.harness.json') && !file.endsWith('.index.json')).length
252
+ : 0;
253
+ summaries.push({
254
+ projectKey,
255
+ path: projectDir,
256
+ bytes: dirSize(projectDir),
257
+ hasMetadata: !!metadata,
258
+ projectPath,
259
+ sessions,
260
+ });
261
+ }
262
+ return summaries.sort((a, b) => b.bytes - a.bytes || a.projectKey.localeCompare(b.projectKey));
263
+ }
264
+ function inferProjectPath(projectDir) {
265
+ const metadataPath = (0, path_1.join)(projectDir, 'project.json');
266
+ try {
267
+ const parsed = JSON.parse((0, fs_1.readFileSync)(metadataPath, 'utf8'));
268
+ if (typeof parsed.projectPath === 'string' && parsed.projectPath) {
269
+ return parsed.projectPath;
270
+ }
271
+ }
272
+ catch {
273
+ // Fall through to session metadata.
274
+ }
275
+ const sessionsDir = (0, path_1.join)(projectDir, 'sessions');
276
+ if (!(0, fs_1.existsSync)(sessionsDir))
277
+ return undefined;
278
+ for (const file of (0, fs_1.readdirSync)(sessionsDir)) {
279
+ if (!file.endsWith('.json') || file.endsWith('.harness.json') || file.endsWith('.index.json'))
280
+ continue;
281
+ try {
282
+ const parsed = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(sessionsDir, file), 'utf8'));
283
+ if (typeof parsed.projectPath === 'string' && parsed.projectPath) {
284
+ return parsed.projectPath;
285
+ }
286
+ }
287
+ catch {
288
+ // Try the next session file.
289
+ }
290
+ }
291
+ return undefined;
292
+ }
293
+ function inspectVectorProjects(configHome, validProjectKeys) {
294
+ const dbPath = (0, path_1.join)(configHome, 'vector.db');
295
+ if (!(0, fs_1.existsSync)(dbPath))
296
+ return [];
297
+ let db = null;
298
+ try {
299
+ db = new better_sqlite3_1.default(dbPath, { readonly: true });
300
+ const hasMemories = db.prepare("SELECT name FROM sqlite_master WHERE name = 'memories'").get();
301
+ if (!hasMemories)
302
+ return [];
303
+ const rows = db.prepare(`
304
+ SELECT COALESCE(project, 'global') as project, COUNT(*) as rows
305
+ FROM memories
306
+ GROUP BY COALESCE(project, 'global')
307
+ ORDER BY rows DESC, project ASC
308
+ `).all();
309
+ return rows.map(row => ({
310
+ project: row.project,
311
+ rows: row.rows,
312
+ orphan: row.project !== 'global' && !validProjectKeys.has(row.project),
313
+ }));
314
+ }
315
+ catch {
316
+ return [];
317
+ }
318
+ finally {
319
+ db?.close();
320
+ }
321
+ }
322
+ function deleteVectorProjectRows(configHome, project, dryRun) {
323
+ const dbPath = (0, path_1.join)(configHome, 'vector.db');
324
+ if (!(0, fs_1.existsSync)(dbPath))
325
+ return 0;
326
+ const db = new better_sqlite3_1.default(dbPath);
327
+ try {
328
+ const hasMemories = db.prepare("SELECT name FROM sqlite_master WHERE name = 'memories'").get();
329
+ if (!hasMemories)
330
+ return 0;
331
+ const ids = db.prepare('SELECT id FROM memories WHERE project = ?').all(project).map(row => row.id);
332
+ if (dryRun || ids.length === 0)
333
+ return ids.length;
334
+ const placeholders = ids.map(() => '?').join(', ');
335
+ if (db.prepare("SELECT name FROM sqlite_master WHERE name = 'vec_memories'").get() && db.prepare("SELECT name FROM sqlite_master WHERE name = 'memory_vectors'").get()) {
336
+ db.prepare(`DELETE FROM vec_memories WHERE rowid IN (SELECT vector_rowid FROM memory_vectors WHERE memory_id IN (${placeholders}))`).run(...ids);
337
+ db.prepare(`DELETE FROM memory_vectors WHERE memory_id IN (${placeholders})`).run(...ids);
338
+ }
339
+ db.prepare(`DELETE FROM memories WHERE id IN (${placeholders})`).run(...ids);
340
+ return ids.length;
341
+ }
342
+ finally {
343
+ db.close();
344
+ }
345
+ }
346
+ function dirSize(target) {
347
+ if (!(0, fs_1.existsSync)(target))
348
+ return 0;
349
+ try {
350
+ const stat = (0, fs_1.statSync)(target);
351
+ if (stat.isFile())
352
+ return stat.size;
353
+ if (!stat.isDirectory())
354
+ return 0;
355
+ return (0, fs_1.readdirSync)(target).reduce((sum, entry) => sum + dirSize((0, path_1.join)(target, entry)), 0);
356
+ }
357
+ catch {
358
+ return 0;
359
+ }
360
+ }
361
+ function safeIsDirectory(target) {
362
+ try {
363
+ return (0, fs_1.statSync)(target).isDirectory();
364
+ }
365
+ catch {
366
+ return false;
367
+ }
368
+ }
369
+ //# sourceMappingURL=storage-maintenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-maintenance.js","sourceRoot":"","sources":["../../src/services/storage-maintenance.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,34 @@
1
- import type { OpenHorseInkRuntime } from '../runtime/ui-events';
1
+ import { type AgentRuntimeInput } from '../runtime/agent-runtime-controller';
2
+ import type { EditPreviewRequest, OpenHorseUiRuntime, SessionPickerRequest, TranscriptAppendEntry, TranscriptEntry, UiEventSink } from '../runtime/ui-events';
3
+ export interface TerminalWriter {
4
+ write(text: string): void;
5
+ }
2
6
  export declare function visibleLength(text: string): number;
3
7
  export declare function truncateTerminalText(text: string, maxWidth: number): string;
8
+ export declare class TerminalEventSink implements UiEventSink {
9
+ private readonly runtime;
10
+ private readonly writer;
11
+ private readonly entries;
12
+ private readonly printedContent;
13
+ private readonly pendingAssistantOutput;
14
+ private idCounter;
15
+ private pendingPicker;
16
+ private pendingEditPreview;
17
+ constructor(runtime: OpenHorseUiRuntime, writer?: TerminalWriter);
18
+ append(entry: TranscriptAppendEntry): string;
19
+ update(id: string, patch: Partial<Omit<TranscriptEntry, 'id'>>): void;
20
+ finalize(id: string, patch?: Partial<Omit<TranscriptEntry, 'id'>>): void;
21
+ remove(id: string): void;
22
+ replaceTranscript(entries: TranscriptEntry[]): void;
23
+ clearTranscript(): void;
24
+ setStatus(message: string): void;
25
+ showSessionPicker(request: SessionPickerRequest): void;
26
+ showEditPreview(request: EditPreviewRequest): void;
27
+ setProcessing(_processing: boolean): void;
28
+ consumePendingSelection(input: string): string | AgentRuntimeInput | null;
29
+ private printEntry;
30
+ private printAssistantDelta;
31
+ }
4
32
  export declare function parseEditInput(input: string): {
5
33
  isEdit: boolean;
6
34
  initialContent: string;
@@ -19,5 +47,5 @@ export declare class TerminalInputComposer {
19
47
  private reset;
20
48
  }
21
49
  export declare function normalizeTerminalAnswer(input: string): string;
22
- export declare function launchTerminalUI(runtime: OpenHorseInkRuntime): Promise<void>;
50
+ export declare function launchTerminalUI(runtime: OpenHorseUiRuntime): Promise<void>;
23
51
  //# sourceMappingURL=launch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/terminal-ui/launch.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAEV,mBAAmB,EAMpB,MAAM,sBAAsB,CAAC;AAkE9B,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAW3E;AAmOD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAOzF;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,IAAI,CAAyC;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IAEtC,QAAQ,IAAI,OAAO;IAInB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAIlC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB;IA2C7C,OAAO,CAAC,KAAK;CAId;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAwC7D;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAyNlF"}
1
+ {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/terminal-ui/launch.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0B,KAAK,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AAOrG,OAAO,KAAK,EACV,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EAEf,WAAW,EACZ,MAAM,sBAAsB,CAAC;AA0C9B,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAUD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAW3E;AAWD,qBAAa,iBAAkB,YAAW,WAAW;IASjD,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;IATzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsC;IAC9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA6B;IACpE,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,aAAa,CAAqC;IAC1D,OAAO,CAAC,kBAAkB,CAAmC;gBAG1C,OAAO,EAAE,kBAAkB,EAC3B,MAAM,GAAE,cAA2C;IAGtE,MAAM,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM;IAa5C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI;IAQrE,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC,GAAG,IAAI;IAQxE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKxB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI;IAgBnD,eAAe,IAAI,IAAI;IAOvB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAKhC,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI;IAgBtD,eAAe,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAgBlD,aAAa,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI;IAIzC,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAkCzE,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,mBAAmB;CAsB5B;AAgCD,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAOzF;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,IAAI,CAAyC;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IAEtC,QAAQ,IAAI,OAAO;IAInB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAIlC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB;IA2C7C,OAAO,CAAC,KAAK;CAId;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAwC7D;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0NjF"}
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.TerminalInputComposer = void 0;
6
+ exports.TerminalInputComposer = exports.TerminalEventSink = void 0;
7
7
  exports.visibleLength = visibleLength;
8
8
  exports.truncateTerminalText = truncateTerminalText;
9
9
  exports.parseEditInput = parseEditInput;
@@ -13,6 +13,8 @@ const chalk_1 = __importDefault(require("chalk"));
13
13
  const string_width_1 = __importDefault(require("string-width"));
14
14
  const agent_runtime_controller_1 = require("../runtime/agent-runtime-controller");
15
15
  const agent_runtime_protocol_1 = require("../runtime/agent-runtime-protocol");
16
+ const ui_events_1 = require("../runtime/ui-events");
17
+ const format_1 = require("../services/format");
16
18
  const completion_1 = require("./completion");
17
19
  const editor_1 = require("./editor");
18
20
  const raw_editor_1 = require("./raw-editor");
@@ -21,18 +23,6 @@ const DIM = chalk_1.default.hex('#567089');
21
23
  const ERROR = chalk_1.default.hex('#FF7A7A');
22
24
  const TOOL = chalk_1.default.hex('#7FA2B8');
23
25
  const BORDER = chalk_1.default.hex('#38556A');
24
- function formatBytes(bytes) {
25
- if (!Number.isFinite(bytes) || bytes <= 0)
26
- return '0 B';
27
- const units = ['B', 'KB', 'MB', 'GB'];
28
- let value = bytes;
29
- let unit = 0;
30
- while (value >= 1024 && unit < units.length - 1) {
31
- value /= 1024;
32
- unit++;
33
- }
34
- return `${value >= 10 || unit === 0 ? value.toFixed(0) : value.toFixed(1)} ${units[unit]}`;
35
- }
36
26
  function stripTrailingNewlines(text) {
37
27
  return text.replace(/\n+$/g, '');
38
28
  }
@@ -170,7 +160,7 @@ class TerminalEventSink {
170
160
  this.writer.write(`${BORDER('─'.repeat(Math.min(process.stdout.columns || 80, 96)))}\n`);
171
161
  request.sessions.forEach((session, index) => {
172
162
  const id = session.id.slice(0, 8);
173
- const size = formatBytes(session.historySizeBytes ?? 0);
163
+ const size = (0, format_1.formatBytes)(session.historySizeBytes ?? 0);
174
164
  const messages = session.messageCount ?? 0;
175
165
  const project = request.showProject ? ` ${session.projectPath}` : '';
176
166
  this.writer.write(`${String(index + 1).padStart(2, ' ')}. ${ACCENT(id)} ${sessionTitle(session)} ${DIM(`${messages} msgs ${size} ${session.model}${project}`)}\n`);
@@ -263,6 +253,7 @@ class TerminalEventSink {
263
253
  this.pendingAssistantOutput.set(entry.id, pending);
264
254
  }
265
255
  }
256
+ exports.TerminalEventSink = TerminalEventSink;
266
257
  function printBanner(runtime) {
267
258
  const width = Math.min(process.stdout.columns || 88, 112);
268
259
  const line = '─'.repeat(Math.max(20, width - 2));
@@ -444,6 +435,7 @@ async function launchTerminalUI(runtime) {
444
435
  agentController = new agent_runtime_controller_1.AgentRuntimeController({
445
436
  runtime,
446
437
  eventSink,
438
+ uiCapabilities: (0, ui_events_1.resolveUiRendererCapabilities)(undefined, 'terminal'),
447
439
  useRuntimeToolPermissions: true,
448
440
  echoSubmittedInput: false,
449
441
  beforeTurn: () => writer.write('\n'),