pupt 1.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 (240) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +517 -0
  3. package/dist/annotations/annotation-analyzer.d.ts +17 -0
  4. package/dist/annotations/annotation-analyzer.d.ts.map +1 -0
  5. package/dist/annotations/annotation-analyzer.js +145 -0
  6. package/dist/annotations/annotation-analyzer.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +375 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/commands/add.d.ts +2 -0
  12. package/dist/commands/add.d.ts.map +1 -0
  13. package/dist/commands/add.js +149 -0
  14. package/dist/commands/add.js.map +1 -0
  15. package/dist/commands/annotate.d.ts +2 -0
  16. package/dist/commands/annotate.d.ts.map +1 -0
  17. package/dist/commands/annotate.js +223 -0
  18. package/dist/commands/annotate.js.map +1 -0
  19. package/dist/commands/base-command.d.ts +23 -0
  20. package/dist/commands/base-command.d.ts.map +1 -0
  21. package/dist/commands/base-command.js +41 -0
  22. package/dist/commands/base-command.js.map +1 -0
  23. package/dist/commands/edit.d.ts +2 -0
  24. package/dist/commands/edit.d.ts.map +1 -0
  25. package/dist/commands/edit.js +31 -0
  26. package/dist/commands/edit.js.map +1 -0
  27. package/dist/commands/help.d.ts +2 -0
  28. package/dist/commands/help.d.ts.map +1 -0
  29. package/dist/commands/help.js +25 -0
  30. package/dist/commands/help.js.map +1 -0
  31. package/dist/commands/history.d.ts +9 -0
  32. package/dist/commands/history.d.ts.map +1 -0
  33. package/dist/commands/history.js +232 -0
  34. package/dist/commands/history.js.map +1 -0
  35. package/dist/commands/init-refactored.d.ts +19 -0
  36. package/dist/commands/init-refactored.d.ts.map +1 -0
  37. package/dist/commands/init-refactored.js +141 -0
  38. package/dist/commands/init-refactored.js.map +1 -0
  39. package/dist/commands/init.d.ts +2 -0
  40. package/dist/commands/init.d.ts.map +1 -0
  41. package/dist/commands/init.js +124 -0
  42. package/dist/commands/init.js.map +1 -0
  43. package/dist/commands/install.d.ts +10 -0
  44. package/dist/commands/install.d.ts.map +1 -0
  45. package/dist/commands/install.js +224 -0
  46. package/dist/commands/install.js.map +1 -0
  47. package/dist/commands/review.d.ts +3 -0
  48. package/dist/commands/review.d.ts.map +1 -0
  49. package/dist/commands/review.js +158 -0
  50. package/dist/commands/review.js.map +1 -0
  51. package/dist/commands/run.d.ts +28 -0
  52. package/dist/commands/run.d.ts.map +1 -0
  53. package/dist/commands/run.js +340 -0
  54. package/dist/commands/run.js.map +1 -0
  55. package/dist/config/config-manager.d.ts +19 -0
  56. package/dist/config/config-manager.d.ts.map +1 -0
  57. package/dist/config/config-manager.js +386 -0
  58. package/dist/config/config-manager.js.map +1 -0
  59. package/dist/config/migration.d.ts +11 -0
  60. package/dist/config/migration.d.ts.map +1 -0
  61. package/dist/config/migration.js +153 -0
  62. package/dist/config/migration.js.map +1 -0
  63. package/dist/history/enhanced-history-manager.d.ts +25 -0
  64. package/dist/history/enhanced-history-manager.d.ts.map +1 -0
  65. package/dist/history/enhanced-history-manager.js +88 -0
  66. package/dist/history/enhanced-history-manager.js.map +1 -0
  67. package/dist/history/history-manager.d.ts +33 -0
  68. package/dist/history/history-manager.d.ts.map +1 -0
  69. package/dist/history/history-manager.js +176 -0
  70. package/dist/history/history-manager.js.map +1 -0
  71. package/dist/index.d.ts +6 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +6 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/prompts/input-types/file-prompt.d.ts +12 -0
  76. package/dist/prompts/input-types/file-prompt.d.ts.map +1 -0
  77. package/dist/prompts/input-types/file-prompt.js +166 -0
  78. package/dist/prompts/input-types/file-prompt.js.map +1 -0
  79. package/dist/prompts/input-types/file-search-prompt.d.ts +12 -0
  80. package/dist/prompts/input-types/file-search-prompt.d.ts.map +1 -0
  81. package/dist/prompts/input-types/file-search-prompt.js +54 -0
  82. package/dist/prompts/input-types/file-search-prompt.js.map +1 -0
  83. package/dist/prompts/input-types/review-file-prompt.d.ts +4 -0
  84. package/dist/prompts/input-types/review-file-prompt.d.ts.map +1 -0
  85. package/dist/prompts/input-types/review-file-prompt.js +10 -0
  86. package/dist/prompts/input-types/review-file-prompt.js.map +1 -0
  87. package/dist/prompts/prompt-manager.d.ts +12 -0
  88. package/dist/prompts/prompt-manager.d.ts.map +1 -0
  89. package/dist/prompts/prompt-manager.js +102 -0
  90. package/dist/prompts/prompt-manager.js.map +1 -0
  91. package/dist/pupt-1.2.0.tgz +0 -0
  92. package/dist/schemas/config-schema.d.ts +1268 -0
  93. package/dist/schemas/config-schema.d.ts.map +1 -0
  94. package/dist/schemas/config-schema.js +100 -0
  95. package/dist/schemas/config-schema.js.map +1 -0
  96. package/dist/schemas/prompt-schema.d.ts +927 -0
  97. package/dist/schemas/prompt-schema.d.ts.map +1 -0
  98. package/dist/schemas/prompt-schema.js +110 -0
  99. package/dist/schemas/prompt-schema.js.map +1 -0
  100. package/dist/search/file-search-engine.d.ts +36 -0
  101. package/dist/search/file-search-engine.d.ts.map +1 -0
  102. package/dist/search/file-search-engine.js +184 -0
  103. package/dist/search/file-search-engine.js.map +1 -0
  104. package/dist/search/search-engine.d.ts +8 -0
  105. package/dist/search/search-engine.d.ts.map +1 -0
  106. package/dist/search/search-engine.js +52 -0
  107. package/dist/search/search-engine.js.map +1 -0
  108. package/dist/services/auto-annotation-service.d.ts +39 -0
  109. package/dist/services/auto-annotation-service.d.ts.map +1 -0
  110. package/dist/services/auto-annotation-service.js +203 -0
  111. package/dist/services/auto-annotation-service.js.map +1 -0
  112. package/dist/services/file-system-service.d.ts +42 -0
  113. package/dist/services/file-system-service.d.ts.map +1 -0
  114. package/dist/services/file-system-service.js +269 -0
  115. package/dist/services/file-system-service.js.map +1 -0
  116. package/dist/services/git-service.d.ts +27 -0
  117. package/dist/services/git-service.d.ts.map +1 -0
  118. package/dist/services/git-service.js +157 -0
  119. package/dist/services/git-service.js.map +1 -0
  120. package/dist/services/logging-service.d.ts +50 -0
  121. package/dist/services/logging-service.d.ts.map +1 -0
  122. package/dist/services/logging-service.js +203 -0
  123. package/dist/services/logging-service.js.map +1 -0
  124. package/dist/services/output-capture-service.d.ts +25 -0
  125. package/dist/services/output-capture-service.d.ts.map +1 -0
  126. package/dist/services/output-capture-service.js +277 -0
  127. package/dist/services/output-capture-service.js.map +1 -0
  128. package/dist/services/pattern-detector.d.ts +15 -0
  129. package/dist/services/pattern-detector.d.ts.map +1 -0
  130. package/dist/services/pattern-detector.js +219 -0
  131. package/dist/services/pattern-detector.js.map +1 -0
  132. package/dist/services/prompt-service.d.ts +30 -0
  133. package/dist/services/prompt-service.d.ts.map +1 -0
  134. package/dist/services/prompt-service.js +278 -0
  135. package/dist/services/prompt-service.js.map +1 -0
  136. package/dist/services/review-data-builder.d.ts +22 -0
  137. package/dist/services/review-data-builder.d.ts.map +1 -0
  138. package/dist/services/review-data-builder.js +263 -0
  139. package/dist/services/review-data-builder.js.map +1 -0
  140. package/dist/services/suggestion-generator.d.ts +11 -0
  141. package/dist/services/suggestion-generator.d.ts.map +1 -0
  142. package/dist/services/suggestion-generator.js +146 -0
  143. package/dist/services/suggestion-generator.js.map +1 -0
  144. package/dist/services/ui-service.d.ts +49 -0
  145. package/dist/services/ui-service.d.ts.map +1 -0
  146. package/dist/services/ui-service.js +183 -0
  147. package/dist/services/ui-service.js.map +1 -0
  148. package/dist/template/helpers/index.d.ts +4 -0
  149. package/dist/template/helpers/index.d.ts.map +1 -0
  150. package/dist/template/helpers/index.js +132 -0
  151. package/dist/template/helpers/index.js.map +1 -0
  152. package/dist/template/template-context.d.ts +26 -0
  153. package/dist/template/template-context.d.ts.map +1 -0
  154. package/dist/template/template-context.js +65 -0
  155. package/dist/template/template-context.js.map +1 -0
  156. package/dist/template/template-engine.d.ts +13 -0
  157. package/dist/template/template-engine.d.ts.map +1 -0
  158. package/dist/template/template-engine.js +83 -0
  159. package/dist/template/template-engine.js.map +1 -0
  160. package/dist/types/annotations.d.ts +49 -0
  161. package/dist/types/annotations.d.ts.map +1 -0
  162. package/dist/types/annotations.js +2 -0
  163. package/dist/types/annotations.js.map +1 -0
  164. package/dist/types/config.d.ts +49 -0
  165. package/dist/types/config.d.ts.map +1 -0
  166. package/dist/types/config.js +8 -0
  167. package/dist/types/config.js.map +1 -0
  168. package/dist/types/history.d.ts +32 -0
  169. package/dist/types/history.d.ts.map +1 -0
  170. package/dist/types/history.js +2 -0
  171. package/dist/types/history.js.map +1 -0
  172. package/dist/types/patterns.d.ts +24 -0
  173. package/dist/types/patterns.d.ts.map +1 -0
  174. package/dist/types/patterns.js +2 -0
  175. package/dist/types/patterns.js.map +1 -0
  176. package/dist/types/prompt.d.ts +23 -0
  177. package/dist/types/prompt.d.ts.map +1 -0
  178. package/dist/types/prompt.js +2 -0
  179. package/dist/types/prompt.js.map +1 -0
  180. package/dist/types/review.d.ts +76 -0
  181. package/dist/types/review.d.ts.map +1 -0
  182. package/dist/types/review.js +2 -0
  183. package/dist/types/review.js.map +1 -0
  184. package/dist/ui/console-ui.d.ts +35 -0
  185. package/dist/ui/console-ui.d.ts.map +1 -0
  186. package/dist/ui/console-ui.js +83 -0
  187. package/dist/ui/console-ui.js.map +1 -0
  188. package/dist/ui/interactive-search.d.ts +8 -0
  189. package/dist/ui/interactive-search.d.ts.map +1 -0
  190. package/dist/ui/interactive-search.js +29 -0
  191. package/dist/ui/interactive-search.js.map +1 -0
  192. package/dist/utils/date-formatter.d.ts +10 -0
  193. package/dist/utils/date-formatter.d.ts.map +1 -0
  194. package/dist/utils/date-formatter.js +43 -0
  195. package/dist/utils/date-formatter.js.map +1 -0
  196. package/dist/utils/editor.d.ts +13 -0
  197. package/dist/utils/editor.d.ts.map +1 -0
  198. package/dist/utils/editor.js +62 -0
  199. package/dist/utils/editor.js.map +1 -0
  200. package/dist/utils/errors.d.ts +55 -0
  201. package/dist/utils/errors.d.ts.map +1 -0
  202. package/dist/utils/errors.js +248 -0
  203. package/dist/utils/errors.js.map +1 -0
  204. package/dist/utils/file-utils.d.ts +18 -0
  205. package/dist/utils/file-utils.d.ts.map +1 -0
  206. package/dist/utils/file-utils.js +88 -0
  207. package/dist/utils/file-utils.js.map +1 -0
  208. package/dist/utils/git-info.d.ts +8 -0
  209. package/dist/utils/git-info.d.ts.map +1 -0
  210. package/dist/utils/git-info.js +41 -0
  211. package/dist/utils/git-info.js.map +1 -0
  212. package/dist/utils/gitignore.d.ts +10 -0
  213. package/dist/utils/gitignore.d.ts.map +1 -0
  214. package/dist/utils/gitignore.js +72 -0
  215. package/dist/utils/gitignore.js.map +1 -0
  216. package/dist/utils/handlebars-extensions.d.ts +4 -0
  217. package/dist/utils/handlebars-extensions.d.ts.map +1 -0
  218. package/dist/utils/handlebars-extensions.js +87 -0
  219. package/dist/utils/handlebars-extensions.js.map +1 -0
  220. package/dist/utils/logger.d.ts +39 -0
  221. package/dist/utils/logger.d.ts.map +1 -0
  222. package/dist/utils/logger.js +143 -0
  223. package/dist/utils/logger.js.map +1 -0
  224. package/dist/utils/platform.d.ts +9 -0
  225. package/dist/utils/platform.d.ts.map +1 -0
  226. package/dist/utils/platform.js +44 -0
  227. package/dist/utils/platform.js.map +1 -0
  228. package/dist/utils/security.d.ts +5 -0
  229. package/dist/utils/security.d.ts.map +1 -0
  230. package/dist/utils/security.js +57 -0
  231. package/dist/utils/security.js.map +1 -0
  232. package/dist/utils/tool-detection.d.ts +11 -0
  233. package/dist/utils/tool-detection.d.ts.map +1 -0
  234. package/dist/utils/tool-detection.js +32 -0
  235. package/dist/utils/tool-detection.js.map +1 -0
  236. package/dist/utils/trie.d.ts +18 -0
  237. package/dist/utils/trie.d.ts.map +1 -0
  238. package/dist/utils/trie.js +84 -0
  239. package/dist/utils/trie.js.map +1 -0
  240. package/package.json +102 -0
@@ -0,0 +1,223 @@
1
+ import { select, input, editor, confirm } from '@inquirer/prompts';
2
+ import fs from 'fs-extra';
3
+ import path from 'node:path';
4
+ import yaml from 'js-yaml';
5
+ import { v4 as uuidv4 } from 'uuid';
6
+ import { ConfigManager } from '../config/config-manager.js';
7
+ import { HistoryManager } from '../history/history-manager.js';
8
+ import { errors } from '../utils/errors.js';
9
+ import { DateFormats } from '../utils/date-formatter.js';
10
+ import { logger } from '../utils/logger.js';
11
+ export async function annotateCommand(historyNumber) {
12
+ const config = await ConfigManager.load();
13
+ if (!config.annotationDir) {
14
+ throw errors.featureNotEnabled('Annotations', [
15
+ 'Track prompt success/failure',
16
+ 'Add tags for organization',
17
+ 'Record detailed notes'
18
+ ]);
19
+ }
20
+ if (!config.historyDir) {
21
+ throw errors.featureNotEnabled('History tracking', [
22
+ 'Track all your prompts',
23
+ 'Re-run previous prompts',
24
+ 'Add annotations'
25
+ ]);
26
+ }
27
+ const historyManager = new HistoryManager(config.historyDir, config.annotationDir);
28
+ let entry;
29
+ if (historyNumber !== undefined) {
30
+ entry = await historyManager.getHistoryEntry(historyNumber);
31
+ if (!entry) {
32
+ const entries = await historyManager.listHistory();
33
+ throw errors.historyNotFound(historyNumber, entries.length);
34
+ }
35
+ }
36
+ else {
37
+ const historyList = await historyManager.listHistory();
38
+ if (historyList.length === 0) {
39
+ throw new Error('No history entries found. Run some prompts first to build history.');
40
+ }
41
+ const selectedIndex = await select({
42
+ message: 'Select history entry to annotate:',
43
+ choices: historyList.map((item, index) => ({
44
+ name: formatHistoryChoice(item, index + 1),
45
+ value: index
46
+ }))
47
+ });
48
+ entry = historyList[selectedIndex];
49
+ }
50
+ const status = await select({
51
+ message: 'How did this prompt work?',
52
+ choices: [
53
+ { value: 'success', name: '✓ Success' },
54
+ { value: 'failure', name: '✗ Failure' },
55
+ { value: 'partial', name: '~ Partial success' }
56
+ ]
57
+ });
58
+ const tagsInput = await input({
59
+ message: 'Tags (comma-separated, optional):'
60
+ });
61
+ const notes = await editor({
62
+ message: 'Add notes (press enter to open editor):'
63
+ });
64
+ const metadata = {
65
+ historyFile: path.basename(entry.filename),
66
+ timestamp: DateFormats.UTC_DATETIME(new Date()),
67
+ status,
68
+ tags: tagsInput ? tagsInput.split(',').map(t => t.trim()).filter(t => t) : []
69
+ };
70
+ // Enhanced annotation features for non-success statuses
71
+ if (status !== 'success') {
72
+ const addStructuredData = await select({
73
+ message: 'Add structured outcome data?',
74
+ choices: [
75
+ { value: true, name: 'Yes - Add task/test metrics' },
76
+ { value: false, name: 'No - Skip structured data' }
77
+ ]
78
+ });
79
+ if (addStructuredData) {
80
+ metadata.structured_outcome = await collectStructuredOutcome();
81
+ }
82
+ const addIssues = await select({
83
+ message: 'Identify specific issues?',
84
+ choices: [
85
+ { value: true, name: 'Yes - Categorize issues found' },
86
+ { value: false, name: 'No - Skip issue identification' }
87
+ ]
88
+ });
89
+ if (addIssues) {
90
+ metadata.issues_identified = await collectIssues();
91
+ }
92
+ }
93
+ const content = `---
94
+ ${yaml.dump(metadata)}---
95
+
96
+ ## Notes
97
+
98
+ ${notes}
99
+ `;
100
+ const historyBasename = path.basename(entry.filename, '.json');
101
+ const filename = `${historyBasename}-annotation-${uuidv4()}.md`;
102
+ const filepath = path.join(config.annotationDir, filename);
103
+ try {
104
+ await fs.writeFile(filepath, content);
105
+ logger.log(`✅ Annotation saved to ${filepath}`);
106
+ }
107
+ catch (error) {
108
+ const err = error;
109
+ if (err.code === 'EACCES') {
110
+ throw errors.permissionDenied(config.annotationDir);
111
+ }
112
+ throw error;
113
+ }
114
+ }
115
+ function formatHistoryChoice(entry, index) {
116
+ const date = new Date(entry.timestamp);
117
+ const dateStr = `[${DateFormats.LOCAL_DATETIME(date)}]`;
118
+ const title = entry.title || 'Untitled';
119
+ const firstLine = entry.finalPrompt.split('\n')[0];
120
+ const truncated = firstLine.length > 50
121
+ ? firstLine.substring(0, 47) + '...'
122
+ : firstLine;
123
+ return `${index}. ${dateStr} ${title} - ${truncated}`;
124
+ }
125
+ async function collectStructuredOutcome() {
126
+ const tasksCompleted = await input({
127
+ message: 'Tasks completed:',
128
+ validate: (value) => {
129
+ const num = parseInt(value);
130
+ return !isNaN(num) && num >= 0 ? true : 'Please enter a valid number';
131
+ }
132
+ });
133
+ const tasksTotal = await input({
134
+ message: 'Total tasks:',
135
+ validate: (value) => {
136
+ const num = parseInt(value);
137
+ return !isNaN(num) && num >= parseInt(tasksCompleted) ? true : 'Total must be >= completed';
138
+ }
139
+ });
140
+ const testsRun = await input({
141
+ message: 'Tests run:',
142
+ validate: (value) => {
143
+ const num = parseInt(value);
144
+ return !isNaN(num) && num >= 0 ? true : 'Please enter a valid number';
145
+ }
146
+ });
147
+ const testsPassed = await input({
148
+ message: 'Tests passed:',
149
+ validate: (value) => {
150
+ const num = parseInt(value);
151
+ return !isNaN(num) && num >= 0 && num <= parseInt(testsRun) ? true : 'Must be <= tests run';
152
+ }
153
+ });
154
+ const testsFailed = await input({
155
+ message: 'Tests failed:',
156
+ validate: (value) => {
157
+ const num = parseInt(value);
158
+ const passed = parseInt(testsPassed);
159
+ const run = parseInt(testsRun);
160
+ return !isNaN(num) && num >= 0 && (passed + num) <= run ? true : 'Invalid test count';
161
+ }
162
+ });
163
+ const executionTime = await input({
164
+ message: 'Execution time (e.g., 2m30s):',
165
+ default: '0s'
166
+ });
167
+ const verificationPassed = await confirm({
168
+ message: 'Did verification pass?',
169
+ default: false
170
+ });
171
+ return {
172
+ tasks_completed: parseInt(tasksCompleted),
173
+ tasks_total: parseInt(tasksTotal),
174
+ tests_run: parseInt(testsRun),
175
+ tests_passed: parseInt(testsPassed),
176
+ tests_failed: parseInt(testsFailed),
177
+ verification_passed: verificationPassed,
178
+ execution_time: executionTime
179
+ };
180
+ }
181
+ async function collectIssues() {
182
+ const issues = [];
183
+ let addMore = true;
184
+ while (addMore) {
185
+ const category = await select({
186
+ message: 'Issue category:',
187
+ choices: [
188
+ { value: 'verification_gap', name: 'Verification Gap - AI claimed success but verification failed' },
189
+ { value: 'incomplete_task', name: 'Incomplete Task - Stopped before completing all work' },
190
+ { value: 'ambiguous_instruction', name: 'Ambiguous Instruction - Unclear requirements' },
191
+ { value: 'missing_constraint', name: 'Missing Constraint - Important requirement not specified' }
192
+ ]
193
+ });
194
+ const severity = await select({
195
+ message: 'Issue severity:',
196
+ choices: [
197
+ { value: 'low', name: 'Low - Minor inconvenience' },
198
+ { value: 'medium', name: 'Medium - Noticeable impact' },
199
+ { value: 'high', name: 'High - Significant problem' },
200
+ { value: 'critical', name: 'Critical - Complete failure' }
201
+ ]
202
+ });
203
+ const description = await input({
204
+ message: 'Brief description:',
205
+ validate: (value) => value.trim().length > 0 ? true : 'Description required'
206
+ });
207
+ const evidence = await editor({
208
+ message: 'Evidence/details (press enter to open editor):'
209
+ });
210
+ issues.push({
211
+ category,
212
+ severity,
213
+ description: description.trim(),
214
+ evidence: evidence.trim()
215
+ });
216
+ addMore = await confirm({
217
+ message: 'Add another issue?',
218
+ default: false
219
+ });
220
+ }
221
+ return issues;
222
+ }
223
+ //# sourceMappingURL=annotate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotate.js","sourceRoot":"","sources":["../../src/commands/annotate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { Config } from '../types/config.js';
2
+ import { ConsoleUI } from '../ui/console-ui.js';
3
+ import pino from 'pino';
4
+ export interface CommandContext {
5
+ config: Config;
6
+ ui: ConsoleUI;
7
+ logger: pino.Logger;
8
+ }
9
+ export interface CommandOptions {
10
+ verbose?: boolean;
11
+ quiet?: boolean;
12
+ }
13
+ export declare abstract class BaseCommand<TInput, TOutput = void> {
14
+ protected context: CommandContext;
15
+ protected options: CommandOptions;
16
+ constructor(context: CommandContext, options?: CommandOptions);
17
+ execute(): Promise<TOutput>;
18
+ protected abstract get name(): string;
19
+ protected abstract validatePreconditions(): Promise<void>;
20
+ protected abstract collectInput(): Promise<TInput>;
21
+ protected abstract performAction(input: TInput): Promise<TOutput>;
22
+ }
23
+ //# sourceMappingURL=base-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-command.d.ts","sourceRoot":"","sources":["../../src/commands/base-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAY,MAAM,qBAAqB,CAAC;AAE1D,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,8BAAsB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IACtD,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC;IAClC,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC;gBAEtB,OAAO,EAAE,cAAc,EAAE,OAAO,GAAE,cAAmB;IAY3D,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IA2BjC,SAAS,CAAC,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC;IACtC,SAAS,CAAC,QAAQ,CAAC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IACzD,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAClD,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAClE"}
@@ -0,0 +1,41 @@
1
+ import { LogLevel } from '../ui/console-ui.js';
2
+ import { PromptToolError } from '../utils/errors.js';
3
+ export class BaseCommand {
4
+ context;
5
+ options;
6
+ constructor(context, options = {}) {
7
+ this.context = context;
8
+ this.options = options;
9
+ if (options.verbose) {
10
+ context.ui.setLogLevel(LogLevel.DEBUG);
11
+ }
12
+ if (options.quiet) {
13
+ context.ui.setSilent(true);
14
+ }
15
+ }
16
+ async execute() {
17
+ try {
18
+ this.context.logger.info({ command: this.name }, 'Executing command');
19
+ await this.validatePreconditions();
20
+ const input = await this.collectInput();
21
+ const result = await this.performAction(input);
22
+ this.context.logger.info({ command: this.name }, 'Command completed');
23
+ return result;
24
+ }
25
+ catch (error) {
26
+ this.context.logger.error({ command: this.name, error }, 'Command failed');
27
+ if (error instanceof PromptToolError) {
28
+ this.context.ui.error(error);
29
+ if (error.suggestions && error.suggestions.length > 0) {
30
+ this.context.ui.info('Suggestions:');
31
+ error.suggestions.forEach(s => this.context.ui.info(` - ${s.text}`));
32
+ }
33
+ }
34
+ else {
35
+ this.context.ui.error(error);
36
+ }
37
+ throw error;
38
+ }
39
+ }
40
+ }
41
+ //# sourceMappingURL=base-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-command.js","sourceRoot":"","sources":["../../src/commands/base-command.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAcrD,MAAM,OAAgB,WAAW;IACrB,OAAO,CAAiB;IACxB,OAAO,CAAiB;IAElC,YAAY,OAAuB,EAAE,UAA0B,EAAE;QAC/D,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,mBAAmB,CAAC,CAAC;YAEtE,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAE/C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,mBAAmB,CAAC,CAAC;YACtE,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,gBAAgB,CAAC,CAAC;YAE3E,IAAI,KAAK,YAAY,eAAe,EAAE,CAAC;gBACrC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtD,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;oBACrC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxE,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,KAAc,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CAMF"}
@@ -0,0 +1,2 @@
1
+ export declare function editCommand(): Promise<void>;
2
+ //# sourceMappingURL=edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.d.ts","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA4BjD"}
@@ -0,0 +1,31 @@
1
+ import { ConfigManager } from '../config/config-manager.js';
2
+ import { PromptManager } from '../prompts/prompt-manager.js';
3
+ import { InteractiveSearch } from '../ui/interactive-search.js';
4
+ import { editorLauncher } from '../utils/editor.js';
5
+ import { errors } from '../utils/errors.js';
6
+ export async function editCommand() {
7
+ // Load configuration
8
+ const config = await ConfigManager.load();
9
+ // Discover prompts
10
+ const promptManager = new PromptManager(config.promptDirs);
11
+ const prompts = await promptManager.discoverPrompts();
12
+ if (prompts.length === 0) {
13
+ throw errors.noPromptsFound(config.promptDirs);
14
+ }
15
+ // Interactive search
16
+ const search = new InteractiveSearch();
17
+ const selected = await search.selectPrompt(prompts);
18
+ // Find an editor
19
+ const editor = await editorLauncher.findEditor();
20
+ if (!editor) {
21
+ throw errors.noEditor();
22
+ }
23
+ // Open in editor
24
+ try {
25
+ await editorLauncher.openInEditor(editor, selected.path);
26
+ }
27
+ catch (error) {
28
+ throw new Error(`Failed to open editor: ${error instanceof Error ? error.message : String(error)}`);
29
+ }
30
+ }
31
+ //# sourceMappingURL=edit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit.js","sourceRoot":"","sources":["../../src/commands/edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,qBAAqB;IACrB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;IAE1C,mBAAmB;IACnB,MAAM,aAAa,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,eAAe,EAAE,CAAC;IAEtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC;IAED,qBAAqB;IACrB,MAAM,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAEpD,iBAAiB;IACjB,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,UAAU,EAAE,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,MAAM,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,iBAAiB;IACjB,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACtG,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function helpCommand(commandName?: string): Promise<void>;
2
+ //# sourceMappingURL=help.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.d.ts","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBrE"}
@@ -0,0 +1,25 @@
1
+ import { program } from 'commander';
2
+ import { logger } from '../utils/logger.js';
3
+ export async function helpCommand(commandName) {
4
+ if (!commandName) {
5
+ // Show general help (same as pt --help)
6
+ program.outputHelp();
7
+ }
8
+ else {
9
+ // Find the specific command
10
+ const command = program.commands.find(cmd => cmd.name() === commandName);
11
+ if (command) {
12
+ // Show help for specific command (same as pt <command> --help)
13
+ command.outputHelp();
14
+ }
15
+ else {
16
+ logger.error(`Unknown command: ${commandName}`);
17
+ logger.log('\nAvailable commands:');
18
+ program.commands.forEach(cmd => {
19
+ logger.log(` ${cmd.name()}${cmd.description() ? ` - ${cmd.description()}` : ''}`);
20
+ });
21
+ process.exit(1);
22
+ }
23
+ }
24
+ }
25
+ //# sourceMappingURL=help.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help.js","sourceRoot":"","sources":["../../src/commands/help.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAoB;IACpD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,wCAAwC;QACxC,OAAO,CAAC,UAAU,EAAE,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,4BAA4B;QAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,CAAC;QAEzE,IAAI,OAAO,EAAE,CAAC;YACZ,+DAA+D;YAC/D,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,oBAAoB,WAAW,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;gBAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACrF,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface HistoryOptions {
2
+ limit?: number;
3
+ all?: boolean;
4
+ entry?: number;
5
+ result?: number;
6
+ }
7
+ export declare function historyCommand(options: HistoryOptions): Promise<void>;
8
+ export {};
9
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAUA,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAuJ3E"}
@@ -0,0 +1,232 @@
1
+ import chalk from 'chalk';
2
+ import { ConfigManager } from '../config/config-manager.js';
3
+ import { HistoryManager } from '../history/history-manager.js';
4
+ import { errors } from '../utils/errors.js';
5
+ import { logger } from '../utils/logger.js';
6
+ import Handlebars from 'handlebars';
7
+ import path from 'node:path';
8
+ import fs from 'fs-extra';
9
+ export async function historyCommand(options) {
10
+ // Load config
11
+ const config = await ConfigManager.load();
12
+ // Check if history is enabled
13
+ if (!config.historyDir) {
14
+ throw errors.featureNotEnabled('History tracking', [
15
+ 'Track all your prompts',
16
+ 'Re-run previous prompts',
17
+ 'Add annotations'
18
+ ]);
19
+ }
20
+ // Create history manager
21
+ const historyManager = new HistoryManager(config.historyDir, config.annotationDir);
22
+ // If --result is specified, show entry with its output
23
+ if (options.result !== undefined) {
24
+ const entry = await historyManager.getHistoryEntry(options.result);
25
+ if (!entry) {
26
+ logger.log(chalk.red(`History entry ${options.result} not found`));
27
+ const totalCount = await historyManager.getTotalCount();
28
+ if (totalCount > 0) {
29
+ logger.log(chalk.dim(`Available entries: 1-${totalCount}`));
30
+ }
31
+ return;
32
+ }
33
+ // Display full entry details
34
+ logger.log(chalk.bold(`\nHistory Entry #${options.result}:`));
35
+ logger.log(chalk.gray('─'.repeat(80)));
36
+ logger.log(chalk.cyan('Timestamp:') + ` ${formatDate(entry.timestamp)}`);
37
+ logger.log(chalk.cyan('Title:') + ` ${entry.title || 'Untitled'}`);
38
+ logger.log(chalk.cyan('Template:') + ` ${entry.templatePath}`);
39
+ if (Object.keys(entry.variables).length > 0) {
40
+ logger.log(chalk.cyan('\nVariables:'));
41
+ for (const [key, value] of Object.entries(entry.variables)) {
42
+ logger.log(` ${chalk.green(key)}: ${JSON.stringify(value)}`);
43
+ }
44
+ }
45
+ logger.log(chalk.cyan('\nFinal Prompt:'));
46
+ logger.log(chalk.gray('─'.repeat(80)));
47
+ logger.log(entry.finalPrompt);
48
+ logger.log(chalk.gray('─'.repeat(80)));
49
+ // Check if output file exists and display it
50
+ if (entry.execution?.output_file) {
51
+ const outputPath = path.join(config.historyDir, entry.execution.output_file);
52
+ try {
53
+ const outputContent = await fs.readFile(outputPath, 'utf-8');
54
+ logger.log(chalk.cyan('\nCommand Output:'));
55
+ logger.log(chalk.gray('─'.repeat(80)));
56
+ logger.log(outputContent);
57
+ logger.log(chalk.gray('─'.repeat(80)));
58
+ }
59
+ catch {
60
+ logger.log(chalk.yellow('\nOutput file not found or inaccessible'));
61
+ }
62
+ }
63
+ else {
64
+ logger.log(chalk.dim('\nNo output file associated with this entry'));
65
+ }
66
+ logger.log(chalk.dim(`\nHistory file: ${entry.filename}`));
67
+ return;
68
+ }
69
+ // If a specific entry is requested, show its full content
70
+ if (options.entry !== undefined) {
71
+ const entry = await historyManager.getHistoryEntry(options.entry);
72
+ if (!entry) {
73
+ logger.log(chalk.red(`History entry ${options.entry} not found`));
74
+ const totalCount = await historyManager.getTotalCount();
75
+ if (totalCount > 0) {
76
+ logger.log(chalk.dim(`Available entries: 1-${totalCount}`));
77
+ }
78
+ return;
79
+ }
80
+ // Display full entry details
81
+ logger.log(chalk.bold(`\nHistory Entry #${options.entry}:`));
82
+ logger.log(chalk.gray('─'.repeat(80)));
83
+ logger.log(chalk.cyan('Timestamp:') + ` ${formatDate(entry.timestamp)}`);
84
+ logger.log(chalk.cyan('Title:') + ` ${entry.title || 'Untitled'}`);
85
+ logger.log(chalk.cyan('Template:') + ` ${entry.templatePath}`);
86
+ if (Object.keys(entry.variables).length > 0) {
87
+ logger.log(chalk.cyan('\nVariables:'));
88
+ for (const [key, value] of Object.entries(entry.variables)) {
89
+ logger.log(` ${chalk.green(key)}: ${JSON.stringify(value)}`);
90
+ }
91
+ }
92
+ logger.log(chalk.cyan('\nFinal Prompt:'));
93
+ logger.log(chalk.gray('─'.repeat(80)));
94
+ logger.log(entry.finalPrompt);
95
+ logger.log(chalk.gray('─'.repeat(80)));
96
+ logger.log(chalk.dim(`\nHistory file: ${entry.filename}`));
97
+ return;
98
+ }
99
+ // Determine limit
100
+ let limit;
101
+ if (options.all) {
102
+ limit = undefined;
103
+ }
104
+ else if (options.limit) {
105
+ limit = options.limit;
106
+ }
107
+ else {
108
+ limit = 20; // Default limit
109
+ }
110
+ // Get total count of entries for proper numbering
111
+ const totalCount = await historyManager.getTotalCount();
112
+ // Get history entries
113
+ const entries = await historyManager.listHistory(limit);
114
+ // Handle empty history
115
+ if (entries.length === 0) {
116
+ logger.log(chalk.yellow('📋 No history found'));
117
+ logger.log(chalk.dim('\nRun some prompts to build your history:'));
118
+ logger.log(chalk.dim(' • pt - Interactive prompt selection'));
119
+ logger.log(chalk.dim(' • pt run <tool> - Run with specific tool'));
120
+ logger.log(chalk.dim(' • pt run - Run with default tool'));
121
+ return;
122
+ }
123
+ // Display header
124
+ logger.log(chalk.bold('\nPrompt History:'));
125
+ logger.log(chalk.gray('─'.repeat(80)));
126
+ // Calculate starting number based on total count and entries shown
127
+ const startNum = totalCount - entries.length + 1;
128
+ // Display entries
129
+ entries.forEach((entry, index) => {
130
+ const num = startNum + index;
131
+ const date = formatDate(entry.timestamp);
132
+ const title = entry.title || 'Untitled';
133
+ const summary = createAutoSummary(entry);
134
+ logger.log(chalk.cyan(`${num}.`) + chalk.gray(` [${date}] `) + chalk.white(title));
135
+ logger.log(' ' + chalk.gray(summary));
136
+ logger.log('');
137
+ });
138
+ }
139
+ function formatDate(timestamp) {
140
+ const date = new Date(timestamp);
141
+ // Use local time methods to display in user's timezone
142
+ const year = date.getFullYear();
143
+ const month = String(date.getMonth() + 1).padStart(2, '0');
144
+ const day = String(date.getDate()).padStart(2, '0');
145
+ const hours = String(date.getHours()).padStart(2, '0');
146
+ const minutes = String(date.getMinutes()).padStart(2, '0');
147
+ return `${year}-${month}-${day} ${hours}:${minutes}`;
148
+ }
149
+ function processSummaryTemplate(summary, variables) {
150
+ try {
151
+ const template = Handlebars.compile(summary);
152
+ return template(variables);
153
+ }
154
+ catch {
155
+ // If template processing fails, return the raw summary
156
+ return summary;
157
+ }
158
+ }
159
+ function formatVariables(variables) {
160
+ const formatted = [];
161
+ // Skip masked values and empty objects
162
+ const entries = Object.entries(variables).filter(([_, value]) => value !== '***' && value !== undefined && value !== null && value !== '');
163
+ // Format each variable based on its type
164
+ for (const [key, value] of entries) {
165
+ if (typeof value === 'string') {
166
+ // First, normalize the string by collapsing multiple spaces/newlines but preserving structure
167
+ // Replace multiple newlines with a space, but keep single spaces
168
+ const normalized = value
169
+ .replace(/\n+/g, ' ') // Replace newlines with spaces
170
+ .replace(/\s{2,}/g, ' ') // Replace multiple spaces with single space
171
+ .trim();
172
+ // Check if this variable is a file-related input based on its name
173
+ const isFileVariable = key.toLowerCase().includes('file') ||
174
+ key.toLowerCase().includes('path') ||
175
+ key.toLowerCase().includes('dir');
176
+ if (isFileVariable && (normalized.includes('/') || normalized.includes('\\'))) {
177
+ // For file variables, show just the filename
178
+ const filename = normalized.split(/[/\\]/).pop() || normalized;
179
+ formatted.push(`${key}: "${filename}"`);
180
+ }
181
+ else {
182
+ // Escape any quotes in the string to prevent display issues
183
+ const escaped = normalized.replace(/"/g, '\\"');
184
+ // Don't truncate individual variables here - let createAutoSummary handle it
185
+ formatted.push(`${key}: "${escaped}"`);
186
+ }
187
+ }
188
+ else if (typeof value === 'boolean') {
189
+ formatted.push(`${key}: ${value}`);
190
+ }
191
+ else if (typeof value === 'number') {
192
+ formatted.push(`${key}: ${value}`);
193
+ }
194
+ else if (Array.isArray(value)) {
195
+ formatted.push(`${key}: [${value.length} items]`);
196
+ }
197
+ else if (typeof value === 'object') {
198
+ formatted.push(`${key}: {...}`);
199
+ }
200
+ else {
201
+ formatted.push(`${key}: ${String(value)}`);
202
+ }
203
+ }
204
+ return formatted;
205
+ }
206
+ function createAutoSummary(entry) {
207
+ // Account for 3 spaces of indentation in the display
208
+ const maxSummaryLength = 77; // 80 - 3 spaces
209
+ let summary;
210
+ // If there's a summary field, use it
211
+ if (entry.summary) {
212
+ summary = processSummaryTemplate(entry.summary, entry.variables);
213
+ }
214
+ else {
215
+ // Otherwise, show the most relevant user inputs
216
+ const varDisplay = formatVariables(entry.variables);
217
+ if (varDisplay.length > 0) {
218
+ // Show up to 2 variables in a concise format
219
+ summary = varDisplay.slice(0, 2).join(', ');
220
+ }
221
+ else {
222
+ // Fall back to showing a truncated version of the prompt
223
+ summary = entry.finalPrompt.split('\n')[0].trim();
224
+ }
225
+ }
226
+ // Ensure consistent truncation for alignment
227
+ if (summary.length > maxSummaryLength) {
228
+ return summary.substring(0, maxSummaryLength - 3) + '...';
229
+ }
230
+ return summary;
231
+ }
232
+ //# sourceMappingURL=history.js.map