auden 0.1.0-alpha.2

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 (219) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/auden-paths.d.ts +8 -0
  4. package/dist/auden-paths.d.ts.map +1 -0
  5. package/dist/auden-paths.js +10 -0
  6. package/dist/auden-paths.js.map +1 -0
  7. package/dist/bin.d.ts +11 -0
  8. package/dist/bin.d.ts.map +1 -0
  9. package/dist/bin.js +13 -0
  10. package/dist/bin.js.map +1 -0
  11. package/dist/chunk.d.ts +3 -0
  12. package/dist/chunk.d.ts.map +1 -0
  13. package/dist/chunk.js +13 -0
  14. package/dist/chunk.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +13 -0
  16. package/dist/commands/doctor.d.ts.map +1 -0
  17. package/dist/commands/doctor.js +125 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/eval/index.d.ts +2 -0
  20. package/dist/commands/eval/index.d.ts.map +1 -0
  21. package/dist/commands/eval/index.js +2 -0
  22. package/dist/commands/eval/index.js.map +1 -0
  23. package/dist/commands/eval/run.d.ts +38 -0
  24. package/dist/commands/eval/run.d.ts.map +1 -0
  25. package/dist/commands/eval/run.js +179 -0
  26. package/dist/commands/eval/run.js.map +1 -0
  27. package/dist/commands/guides/active.d.ts +2 -0
  28. package/dist/commands/guides/active.d.ts.map +1 -0
  29. package/dist/commands/guides/active.js +38 -0
  30. package/dist/commands/guides/active.js.map +1 -0
  31. package/dist/commands/guides/index.d.ts +2 -0
  32. package/dist/commands/guides/index.d.ts.map +1 -0
  33. package/dist/commands/guides/index.js +13 -0
  34. package/dist/commands/guides/index.js.map +1 -0
  35. package/dist/commands/guides/project.d.ts +13 -0
  36. package/dist/commands/guides/project.d.ts.map +1 -0
  37. package/dist/commands/guides/project.js +71 -0
  38. package/dist/commands/guides/project.js.map +1 -0
  39. package/dist/commands/guides/search.d.ts +8 -0
  40. package/dist/commands/guides/search.d.ts.map +1 -0
  41. package/dist/commands/guides/search.js +46 -0
  42. package/dist/commands/guides/search.js.map +1 -0
  43. package/dist/commands/init.d.ts +43 -0
  44. package/dist/commands/init.d.ts.map +1 -0
  45. package/dist/commands/init.js +436 -0
  46. package/dist/commands/init.js.map +1 -0
  47. package/dist/commands/mcp.d.ts +23 -0
  48. package/dist/commands/mcp.d.ts.map +1 -0
  49. package/dist/commands/mcp.js +55 -0
  50. package/dist/commands/mcp.js.map +1 -0
  51. package/dist/commands/pull.d.ts +38 -0
  52. package/dist/commands/pull.d.ts.map +1 -0
  53. package/dist/commands/pull.js +127 -0
  54. package/dist/commands/pull.js.map +1 -0
  55. package/dist/commands/rules/export.d.ts +140 -0
  56. package/dist/commands/rules/export.d.ts.map +1 -0
  57. package/dist/commands/rules/export.js +635 -0
  58. package/dist/commands/rules/export.js.map +1 -0
  59. package/dist/commands/rules/import.d.ts +33 -0
  60. package/dist/commands/rules/import.d.ts.map +1 -0
  61. package/dist/commands/rules/import.js +122 -0
  62. package/dist/commands/rules/import.js.map +1 -0
  63. package/dist/commands/rules/index.d.ts +2 -0
  64. package/dist/commands/rules/index.d.ts.map +1 -0
  65. package/dist/commands/rules/index.js +13 -0
  66. package/dist/commands/rules/index.js.map +1 -0
  67. package/dist/commands/rules/watch.d.ts +43 -0
  68. package/dist/commands/rules/watch.d.ts.map +1 -0
  69. package/dist/commands/rules/watch.js +125 -0
  70. package/dist/commands/rules/watch.js.map +1 -0
  71. package/dist/commands/status.d.ts +2 -0
  72. package/dist/commands/status.d.ts.map +1 -0
  73. package/dist/commands/status.js +61 -0
  74. package/dist/commands/status.js.map +1 -0
  75. package/dist/commands/suggest.d.ts +8 -0
  76. package/dist/commands/suggest.d.ts.map +1 -0
  77. package/dist/commands/suggest.js +43 -0
  78. package/dist/commands/suggest.js.map +1 -0
  79. package/dist/commands/sync.d.ts +23 -0
  80. package/dist/commands/sync.d.ts.map +1 -0
  81. package/dist/commands/sync.js +193 -0
  82. package/dist/commands/sync.js.map +1 -0
  83. package/dist/commands/verdict/index.d.ts +2 -0
  84. package/dist/commands/verdict/index.d.ts.map +1 -0
  85. package/dist/commands/verdict/index.js +11 -0
  86. package/dist/commands/verdict/index.js.map +1 -0
  87. package/dist/commands/verdict/record.d.ts +18 -0
  88. package/dist/commands/verdict/record.d.ts.map +1 -0
  89. package/dist/commands/verdict/record.js +60 -0
  90. package/dist/commands/verdict/record.js.map +1 -0
  91. package/dist/config.d.ts +96 -0
  92. package/dist/config.d.ts.map +1 -0
  93. package/dist/config.js +246 -0
  94. package/dist/config.js.map +1 -0
  95. package/dist/context/pull.d.ts +40 -0
  96. package/dist/context/pull.d.ts.map +1 -0
  97. package/dist/context/pull.js +46 -0
  98. package/dist/context/pull.js.map +1 -0
  99. package/dist/dashboard-health.d.ts +20 -0
  100. package/dist/dashboard-health.d.ts.map +1 -0
  101. package/dist/dashboard-health.js +24 -0
  102. package/dist/dashboard-health.js.map +1 -0
  103. package/dist/eval-provider.d.ts +30 -0
  104. package/dist/eval-provider.d.ts.map +1 -0
  105. package/dist/eval-provider.js +359 -0
  106. package/dist/eval-provider.js.map +1 -0
  107. package/dist/eval-summary.d.ts +24 -0
  108. package/dist/eval-summary.d.ts.map +1 -0
  109. package/dist/eval-summary.js +30 -0
  110. package/dist/eval-summary.js.map +1 -0
  111. package/dist/feedback/extract.d.ts +6 -0
  112. package/dist/feedback/extract.d.ts.map +1 -0
  113. package/dist/feedback/extract.js +580 -0
  114. package/dist/feedback/extract.js.map +1 -0
  115. package/dist/http-retry.d.ts +23 -0
  116. package/dist/http-retry.d.ts.map +1 -0
  117. package/dist/http-retry.js +54 -0
  118. package/dist/http-retry.js.map +1 -0
  119. package/dist/index.d.ts +6 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +33 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/mcp/client.d.ts +70 -0
  124. package/dist/mcp/client.d.ts.map +1 -0
  125. package/dist/mcp/client.js +121 -0
  126. package/dist/mcp/client.js.map +1 -0
  127. package/dist/mcp/scope.d.ts +30 -0
  128. package/dist/mcp/scope.d.ts.map +1 -0
  129. package/dist/mcp/scope.js +64 -0
  130. package/dist/mcp/scope.js.map +1 -0
  131. package/dist/mcp/server.d.ts +57 -0
  132. package/dist/mcp/server.d.ts.map +1 -0
  133. package/dist/mcp/server.js +427 -0
  134. package/dist/mcp/server.js.map +1 -0
  135. package/dist/mcp/write-items.d.ts +34 -0
  136. package/dist/mcp/write-items.d.ts.map +1 -0
  137. package/dist/mcp/write-items.js +59 -0
  138. package/dist/mcp/write-items.js.map +1 -0
  139. package/dist/rules/deletions-client.d.ts +16 -0
  140. package/dist/rules/deletions-client.d.ts.map +1 -0
  141. package/dist/rules/deletions-client.js +40 -0
  142. package/dist/rules/deletions-client.js.map +1 -0
  143. package/dist/rules/diff.d.ts +19 -0
  144. package/dist/rules/diff.d.ts.map +1 -0
  145. package/dist/rules/diff.js +36 -0
  146. package/dist/rules/diff.js.map +1 -0
  147. package/dist/rules/discover.d.ts +81 -0
  148. package/dist/rules/discover.d.ts.map +1 -0
  149. package/dist/rules/discover.js +307 -0
  150. package/dist/rules/discover.js.map +1 -0
  151. package/dist/rules/file-origin.d.ts +16 -0
  152. package/dist/rules/file-origin.d.ts.map +1 -0
  153. package/dist/rules/file-origin.js +31 -0
  154. package/dist/rules/file-origin.js.map +1 -0
  155. package/dist/rules/global-flag.d.ts +12 -0
  156. package/dist/rules/global-flag.d.ts.map +1 -0
  157. package/dist/rules/global-flag.js +15 -0
  158. package/dist/rules/global-flag.js.map +1 -0
  159. package/dist/rules/import-client.d.ts +37 -0
  160. package/dist/rules/import-client.d.ts.map +1 -0
  161. package/dist/rules/import-client.js +98 -0
  162. package/dist/rules/import-client.js.map +1 -0
  163. package/dist/rules/init-pull.d.ts +34 -0
  164. package/dist/rules/init-pull.d.ts.map +1 -0
  165. package/dist/rules/init-pull.js +43 -0
  166. package/dist/rules/init-pull.js.map +1 -0
  167. package/dist/rules/member-files-client.d.ts +17 -0
  168. package/dist/rules/member-files-client.d.ts.map +1 -0
  169. package/dist/rules/member-files-client.js +29 -0
  170. package/dist/rules/member-files-client.js.map +1 -0
  171. package/dist/rules/path-contains.d.ts +9 -0
  172. package/dist/rules/path-contains.d.ts.map +1 -0
  173. package/dist/rules/path-contains.js +17 -0
  174. package/dist/rules/path-contains.js.map +1 -0
  175. package/dist/rules/payload.d.ts +13 -0
  176. package/dist/rules/payload.d.ts.map +1 -0
  177. package/dist/rules/payload.js +35 -0
  178. package/dist/rules/payload.js.map +1 -0
  179. package/dist/rules/pull-bundle.d.ts +13 -0
  180. package/dist/rules/pull-bundle.d.ts.map +1 -0
  181. package/dist/rules/pull-bundle.js +32 -0
  182. package/dist/rules/pull-bundle.js.map +1 -0
  183. package/dist/rules/watch.d.ts +121 -0
  184. package/dist/rules/watch.d.ts.map +1 -0
  185. package/dist/rules/watch.js +457 -0
  186. package/dist/rules/watch.js.map +1 -0
  187. package/dist/skill-template.d.ts +19 -0
  188. package/dist/skill-template.d.ts.map +1 -0
  189. package/dist/skill-template.js +174 -0
  190. package/dist/skill-template.js.map +1 -0
  191. package/dist/sync-batches.d.ts +37 -0
  192. package/dist/sync-batches.d.ts.map +1 -0
  193. package/dist/sync-batches.js +67 -0
  194. package/dist/sync-batches.js.map +1 -0
  195. package/dist/sync-client.d.ts +22 -0
  196. package/dist/sync-client.d.ts.map +1 -0
  197. package/dist/sync-client.js +38 -0
  198. package/dist/sync-client.js.map +1 -0
  199. package/dist/sync-response.d.ts +23 -0
  200. package/dist/sync-response.d.ts.map +1 -0
  201. package/dist/sync-response.js +22 -0
  202. package/dist/sync-response.js.map +1 -0
  203. package/dist/token-verify.d.ts +14 -0
  204. package/dist/token-verify.d.ts.map +1 -0
  205. package/dist/token-verify.js +30 -0
  206. package/dist/token-verify.js.map +1 -0
  207. package/dist/usage/extract.d.ts +31 -0
  208. package/dist/usage/extract.d.ts.map +1 -0
  209. package/dist/usage/extract.js +200 -0
  210. package/dist/usage/extract.js.map +1 -0
  211. package/dist/usage/providers.d.ts +8 -0
  212. package/dist/usage/providers.d.ts.map +1 -0
  213. package/dist/usage/providers.js +23 -0
  214. package/dist/usage/providers.js.map +1 -0
  215. package/dist/verdict-queue.d.ts +50 -0
  216. package/dist/verdict-queue.d.ts.map +1 -0
  217. package/dist/verdict-queue.js +131 -0
  218. package/dist/verdict-queue.js.map +1 -0
  219. package/package.json +72 -0
@@ -0,0 +1,580 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { readFile, readdir } from 'node:fs/promises';
3
+ import { basename, extname, join } from 'node:path';
4
+ import { parseActionEntry, parseExtractedFeedbackBatch } from '@auden.to/protocol';
5
+ import { AUDEN_RUNS_DIR } from '../auden-paths.js';
6
+ const CLAUDE_CODE_SOURCE = 'claude_code';
7
+ const MIN_GUIDE_CONFIDENCE = 0.7;
8
+ const MIN_GUIDE_SESSION_COUNT = 2;
9
+ const MIN_SKILL_CONFIDENCE = 0.68;
10
+ const MIN_SKILL_SESSION_COUNT = 2;
11
+ const SKILL_WINDOW_SIZES = [3, 2, 4];
12
+ const STOPWORDS = new Set([
13
+ 'a',
14
+ 'an',
15
+ 'and',
16
+ 'are',
17
+ 'as',
18
+ 'at',
19
+ 'be',
20
+ 'been',
21
+ 'but',
22
+ 'by',
23
+ 'can',
24
+ 'could',
25
+ 'for',
26
+ 'from',
27
+ 'get',
28
+ 'has',
29
+ 'have',
30
+ 'i',
31
+ 'if',
32
+ 'in',
33
+ 'into',
34
+ 'it',
35
+ 'just',
36
+ 'let',
37
+ 'lets',
38
+ 'me',
39
+ 'my',
40
+ 'now',
41
+ 'of',
42
+ 'on',
43
+ 'or',
44
+ 'our',
45
+ 'please',
46
+ 'really',
47
+ 'should',
48
+ 'so',
49
+ 'that',
50
+ 'the',
51
+ 'their',
52
+ 'then',
53
+ 'this',
54
+ 'to',
55
+ 'up',
56
+ 'use',
57
+ 'using',
58
+ 'we',
59
+ 'with',
60
+ 'you',
61
+ 'your',
62
+ ]);
63
+ const STEM_OVERRIDES = {
64
+ added: 'add',
65
+ adding: 'add',
66
+ avoids: 'avoid',
67
+ classes: 'class',
68
+ explicit: 'explicit',
69
+ files: 'file',
70
+ testing: 'test',
71
+ tests: 'test',
72
+ typed: 'type',
73
+ types: 'type',
74
+ unit: 'test',
75
+ variables: 'var',
76
+ variable: 'var',
77
+ };
78
+ function asRecord(value) {
79
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
80
+ return null;
81
+ }
82
+ return value;
83
+ }
84
+ function collapseWhitespace(value) {
85
+ return value.replace(/\s+/g, ' ').trim();
86
+ }
87
+ function toSentenceCase(value) {
88
+ if (value.length === 0) {
89
+ return value;
90
+ }
91
+ return value[0].toUpperCase() + value.slice(1);
92
+ }
93
+ function normalizeWord(word) {
94
+ const cleaned = word.toLowerCase().replace(/^[^a-z0-9]+|[^a-z0-9]+$/g, '');
95
+ if (!cleaned) {
96
+ return '';
97
+ }
98
+ if (cleaned in STEM_OVERRIDES) {
99
+ return STEM_OVERRIDES[cleaned];
100
+ }
101
+ if (cleaned.endsWith('ing') && cleaned.length > 5) {
102
+ return cleaned.slice(0, -3);
103
+ }
104
+ if (cleaned.endsWith('ed') && cleaned.length > 4) {
105
+ return cleaned.slice(0, -2);
106
+ }
107
+ if (cleaned.endsWith('s') && cleaned.length > 4) {
108
+ return cleaned.slice(0, -1);
109
+ }
110
+ return cleaned;
111
+ }
112
+ function hashId(prefix, value) {
113
+ return `${prefix}-${createHash('sha1').update(value).digest('hex').slice(0, 12)}`;
114
+ }
115
+ function cleanSummary(summary) {
116
+ const trimmed = collapseWhitespace(summary.replace(/^[-*•\d.)\s]+/, ''));
117
+ if (!trimmed) {
118
+ return '';
119
+ }
120
+ const withoutLeadingFiller = trimmed
121
+ .replace(/^(please\s+)?(can|could|would)\s+you\s+/i, '')
122
+ .replace(/^please\s+/i, '')
123
+ .replace(/^i\s+(really\s+)?prefer\s+/i, 'Prefer ')
124
+ .replace(/^(don['’]t|do not|never|stop)\s+/i, 'Avoid ')
125
+ .replace(/^make sure to\s+/i, 'Always ');
126
+ const normalized = toSentenceCase(withoutLeadingFiller
127
+ .replace(/^Avoid add\b/i, 'Avoid adding')
128
+ .replace(/^Avoid use\b/i, 'Avoid using')
129
+ .trim());
130
+ return /[.!?]$/.test(normalized) ? normalized : `${normalized}.`;
131
+ }
132
+ function flattenContent(value, depth = 0) {
133
+ if (depth > 4 || value === null || typeof value === 'undefined') {
134
+ return '';
135
+ }
136
+ if (typeof value === 'string') {
137
+ return collapseWhitespace(value);
138
+ }
139
+ if (Array.isArray(value)) {
140
+ return collapseWhitespace(value
141
+ .map((item) => flattenContent(item, depth + 1))
142
+ .filter(Boolean)
143
+ .join(' '));
144
+ }
145
+ const record = asRecord(value);
146
+ if (!record) {
147
+ return '';
148
+ }
149
+ return collapseWhitespace([
150
+ flattenContent(record['text'], depth + 1),
151
+ flattenContent(record['content'], depth + 1),
152
+ flattenContent(record['message'], depth + 1),
153
+ ]
154
+ .filter(Boolean)
155
+ .join(' '));
156
+ }
157
+ function extractRole(record) {
158
+ const direct = record['role'];
159
+ if (direct === 'user' || direct === 'assistant' || direct === 'system') {
160
+ return direct;
161
+ }
162
+ const nested = asRecord(record['message']);
163
+ const nestedRole = nested?.['role'];
164
+ if (nestedRole === 'user' || nestedRole === 'assistant' || nestedRole === 'system') {
165
+ return nestedRole;
166
+ }
167
+ const sender = record['sender'];
168
+ if (sender === 'user' || sender === 'assistant' || sender === 'system') {
169
+ return sender;
170
+ }
171
+ return null;
172
+ }
173
+ function extractTimestamp(record) {
174
+ for (const key of ['timestamp', 'createdAt', 'created_at', 'time']) {
175
+ const value = record[key];
176
+ if (typeof value === 'string' && value.length > 0) {
177
+ return value;
178
+ }
179
+ }
180
+ const nested = asRecord(record['message']);
181
+ if (nested) {
182
+ return extractTimestamp(nested);
183
+ }
184
+ return undefined;
185
+ }
186
+ function extractSessionId(record, fallback) {
187
+ for (const key of ['sessionId', 'session_id', 'conversationId', 'conversation_id']) {
188
+ const value = record[key];
189
+ if (typeof value === 'string' && value.length > 0) {
190
+ return value;
191
+ }
192
+ }
193
+ const nested = asRecord(record['message']);
194
+ if (nested) {
195
+ return extractSessionId(nested, fallback);
196
+ }
197
+ return fallback;
198
+ }
199
+ function toTranscriptMessage(record) {
200
+ const role = extractRole(record);
201
+ if (!role) {
202
+ return null;
203
+ }
204
+ const text = flattenContent(record['content'] ?? record['text'] ?? record['message']);
205
+ if (!text) {
206
+ return null;
207
+ }
208
+ const timestamp = extractTimestamp(record);
209
+ return {
210
+ role,
211
+ text,
212
+ ...(typeof timestamp === 'string' ? { timestamp } : {}),
213
+ };
214
+ }
215
+ function toActionEntry(record, fallbackSessionId) {
216
+ const toolName = typeof record['toolName'] === 'string'
217
+ ? record['toolName']
218
+ : typeof record['tool_name'] === 'string'
219
+ ? record['tool_name']
220
+ : typeof record['tool'] === 'string'
221
+ ? record['tool']
222
+ : null;
223
+ const command = typeof record['command'] === 'string'
224
+ ? record['command']
225
+ : typeof record['shell_command'] === 'string'
226
+ ? record['shell_command']
227
+ : undefined;
228
+ const filePath = typeof record['filePath'] === 'string'
229
+ ? record['filePath']
230
+ : typeof record['file_path'] === 'string'
231
+ ? record['file_path']
232
+ : typeof record['path'] === 'string'
233
+ ? record['path']
234
+ : undefined;
235
+ if (!toolName && !command && !filePath) {
236
+ return null;
237
+ }
238
+ try {
239
+ return parseActionEntry({
240
+ timestamp: extractTimestamp(record) ?? new Date(0).toISOString(),
241
+ sessionId: extractSessionId(record, fallbackSessionId),
242
+ toolName: toolName ?? (command ? 'Bash' : 'unknown'),
243
+ command,
244
+ filePath,
245
+ });
246
+ }
247
+ catch {
248
+ return null;
249
+ }
250
+ }
251
+ async function collectJsonlFiles(dir) {
252
+ const entries = await readdir(dir, { withFileTypes: true });
253
+ const files = await Promise.all(entries.map(async (entry) => {
254
+ const fullPath = join(dir, entry.name);
255
+ if (entry.isDirectory()) {
256
+ return collectJsonlFiles(fullPath);
257
+ }
258
+ return extname(entry.name) === '.jsonl' ? [fullPath] : [];
259
+ }));
260
+ return files.flat().sort();
261
+ }
262
+ async function readJsonlRecords(path) {
263
+ const raw = await readFile(path, 'utf8');
264
+ return raw
265
+ .split('\n')
266
+ .map((line) => line.trim())
267
+ .filter(Boolean)
268
+ .flatMap((line) => {
269
+ try {
270
+ return [JSON.parse(line)];
271
+ }
272
+ catch {
273
+ return [];
274
+ }
275
+ });
276
+ }
277
+ function sessionMapEntry(sessionMap, sessionId) {
278
+ const existing = sessionMap.get(sessionId);
279
+ if (existing) {
280
+ return existing;
281
+ }
282
+ const created = {
283
+ sessionId,
284
+ source: CLAUDE_CODE_SOURCE,
285
+ messages: [],
286
+ actions: [],
287
+ };
288
+ sessionMap.set(sessionId, created);
289
+ return created;
290
+ }
291
+ async function loadClaudeCodeSessions(options) {
292
+ const sessions = new Map();
293
+ if (options?.transcriptsDir) {
294
+ const transcriptFiles = await collectJsonlFiles(options.transcriptsDir).catch(() => []);
295
+ for (const file of transcriptFiles) {
296
+ const fallbackSessionId = basename(file, extname(file));
297
+ const records = await readJsonlRecords(file);
298
+ for (const recordValue of records) {
299
+ const record = asRecord(recordValue);
300
+ if (!record) {
301
+ continue;
302
+ }
303
+ const sessionId = extractSessionId(record, fallbackSessionId);
304
+ const session = sessionMapEntry(sessions, sessionId);
305
+ const message = toTranscriptMessage(record);
306
+ if (message) {
307
+ session.messages.push(message);
308
+ }
309
+ const action = toActionEntry(record, sessionId);
310
+ if (action) {
311
+ session.actions.push(action);
312
+ }
313
+ }
314
+ }
315
+ }
316
+ const runFiles = await collectJsonlFiles(options?.runsDir ?? AUDEN_RUNS_DIR).catch(() => []);
317
+ for (const file of runFiles) {
318
+ const fallbackSessionId = basename(file, extname(file));
319
+ const records = await readJsonlRecords(file);
320
+ for (const recordValue of records) {
321
+ const record = asRecord(recordValue);
322
+ if (!record) {
323
+ continue;
324
+ }
325
+ const action = toActionEntry(record, fallbackSessionId);
326
+ if (!action) {
327
+ continue;
328
+ }
329
+ const session = sessionMapEntry(sessions, action.sessionId);
330
+ session.actions.push(action);
331
+ }
332
+ }
333
+ return [...sessions.values()]
334
+ .map((session) => ({
335
+ ...session,
336
+ messages: session.messages.sort((a, b) => (a.timestamp ?? '').localeCompare(b.timestamp ?? '')),
337
+ actions: session.actions.sort((a, b) => a.timestamp.localeCompare(b.timestamp)),
338
+ }))
339
+ .filter((session) => session.messages.length > 0 || session.actions.length > 0);
340
+ }
341
+ function splitIntoSentences(text) {
342
+ return text
343
+ .split(/\r?\n|(?<=[.!?])\s+/)
344
+ .map((part) => collapseWhitespace(part))
345
+ .filter((part) => part.length >= 12);
346
+ }
347
+ function detectDirective(text) {
348
+ if (/\b(don['’]t|do not|never|stop|avoid)\b/i.test(text)) {
349
+ return 'avoid';
350
+ }
351
+ if (/\b(prefer|instead of|rather than|use)\b/i.test(text)) {
352
+ return 'prefer';
353
+ }
354
+ if (/\b(always|make sure|remember to)\b/i.test(text)) {
355
+ return 'do';
356
+ }
357
+ return null;
358
+ }
359
+ function looksLikeFeedback(text) {
360
+ return (/\b(don['’]t|do not|never|stop|avoid|prefer|instead of|rather than|always|make sure|remember to|use)\b/i.test(text) && text.length <= 220);
361
+ }
362
+ function tokenizeGuidance(text) {
363
+ const normalized = text
364
+ .toLowerCase()
365
+ .replace(/don['’]t|do not|never|stop/g, 'avoid')
366
+ .replace(/rather than|instead of/g, 'prefer')
367
+ .replace(/make sure to|remember to/g, 'do');
368
+ const tokens = normalized
369
+ .split(/[^a-z0-9]+/)
370
+ .map((token) => normalizeWord(token))
371
+ .filter((token) => token && !STOPWORDS.has(token));
372
+ return new Set(tokens);
373
+ }
374
+ function computeGuidanceStrength(text) {
375
+ let strength = 0.45;
376
+ if (/\b(don['’]t|do not|never|stop|avoid)\b/i.test(text)) {
377
+ strength += 0.2;
378
+ }
379
+ if (/\b(always|must|only|never)\b/i.test(text)) {
380
+ strength += 0.15;
381
+ }
382
+ if (/\b(prefer|instead|rather)\b/i.test(text)) {
383
+ strength += 0.1;
384
+ }
385
+ return Math.min(strength, 0.95);
386
+ }
387
+ function extractGuidanceSignals(session) {
388
+ return session.messages.flatMap((message) => {
389
+ if (message.role !== 'user') {
390
+ return [];
391
+ }
392
+ return splitIntoSentences(message.text).flatMap((sentence) => {
393
+ if (!looksLikeFeedback(sentence)) {
394
+ return [];
395
+ }
396
+ const directive = detectDirective(sentence);
397
+ if (!directive) {
398
+ return [];
399
+ }
400
+ const normalizedTokens = tokenizeGuidance(sentence);
401
+ if (normalizedTokens.size < 2) {
402
+ return [];
403
+ }
404
+ const signal = {
405
+ directive,
406
+ normalizedTokens,
407
+ summary: cleanSummary(sentence).slice(0, 180),
408
+ sessionId: session.sessionId,
409
+ strength: computeGuidanceStrength(sentence),
410
+ ...(message.timestamp ? { timestamp: message.timestamp } : {}),
411
+ };
412
+ return [signal];
413
+ });
414
+ });
415
+ }
416
+ function tokenSimilarity(left, right) {
417
+ const leftValues = [...left];
418
+ const rightValues = [...right];
419
+ const intersectionCount = leftValues.filter((token) => right.has(token)).length;
420
+ const unionCount = new Set([...leftValues, ...rightValues]).size;
421
+ const subsetDenominator = Math.min(leftValues.length, rightValues.length);
422
+ if (unionCount === 0 || subsetDenominator === 0) {
423
+ return 0;
424
+ }
425
+ return Math.max(intersectionCount / unionCount, intersectionCount / subsetDenominator);
426
+ }
427
+ function groupGuidanceSignals(signals) {
428
+ const groups = [];
429
+ for (const signal of signals) {
430
+ const group = groups.find((candidate) => candidate.prototype.directive === signal.directive &&
431
+ tokenSimilarity(candidate.prototype.normalizedTokens, signal.normalizedTokens) >=
432
+ 0.6);
433
+ if (group) {
434
+ group.items.push(signal);
435
+ continue;
436
+ }
437
+ groups.push({ prototype: signal, items: [signal] });
438
+ }
439
+ return groups;
440
+ }
441
+ function toCitation(signal) {
442
+ return {
443
+ sessionId: signal.sessionId,
444
+ timestamp: signal.timestamp,
445
+ summary: signal.summary,
446
+ };
447
+ }
448
+ function buildGuideSuggestions(signals) {
449
+ return groupGuidanceSignals(signals)
450
+ .flatMap(({ prototype, items }) => {
451
+ const sessionCount = new Set(items.map((item) => item.sessionId)).size;
452
+ if (sessionCount < MIN_GUIDE_SESSION_COUNT || items.length < 2) {
453
+ return [];
454
+ }
455
+ const averageStrength = items.reduce((sum, item) => sum + item.strength, 0) / items.length;
456
+ const confidence = Math.min(0.98, 0.36 +
457
+ (sessionCount - 1) * 0.19 +
458
+ Math.min(items.length, 4) * 0.08 +
459
+ averageStrength * 0.16);
460
+ if (confidence < MIN_GUIDE_CONFIDENCE) {
461
+ return [];
462
+ }
463
+ const citations = items
464
+ .slice()
465
+ .sort((a, b) => (a.timestamp ?? '').localeCompare(b.timestamp ?? ''))
466
+ .slice(0, 3)
467
+ .map(toCitation);
468
+ const content = cleanSummary(prototype.summary);
469
+ return [
470
+ {
471
+ id: hashId('guide', `${prototype.directive}:${[...prototype.normalizedTokens].sort().join('|')}`),
472
+ content,
473
+ reasoning: `Observed ${items.length} similar user corrections across ${sessionCount} Claude Code sessions.`,
474
+ triggerType: 'conversational_feedback',
475
+ confidence: Number(confidence.toFixed(2)),
476
+ occurrences: items.length,
477
+ citations,
478
+ source: CLAUDE_CODE_SOURCE,
479
+ },
480
+ ];
481
+ })
482
+ .sort((left, right) => right.confidence - left.confidence);
483
+ }
484
+ function normalizeCommand(command) {
485
+ const rawTokens = collapseWhitespace(command).split(' ');
486
+ const tokens = rawTokens.filter((token) => !token.startsWith('-'));
487
+ const startIndex = tokens.findIndex((token) => !token.includes('='));
488
+ const meaningfulTokens = (startIndex >= 0 ? tokens.slice(startIndex) : tokens).slice(0, 3);
489
+ return collapseWhitespace(meaningfulTokens.join(' ')).toLowerCase();
490
+ }
491
+ function buildSkillObservations(session) {
492
+ const steps = session.actions
493
+ .map((action) => action.command)
494
+ .filter((command) => typeof command === 'string' && command.length > 0)
495
+ .map((command) => normalizeCommand(command))
496
+ .filter(Boolean)
497
+ .filter((command, index, values) => command !== values[index - 1]);
498
+ if (steps.length < 2) {
499
+ return [];
500
+ }
501
+ const observations = [];
502
+ const seenKeys = new Set();
503
+ for (const size of SKILL_WINDOW_SIZES) {
504
+ if (steps.length < size) {
505
+ continue;
506
+ }
507
+ for (let index = 0; index <= steps.length - size; index += 1) {
508
+ const window = steps.slice(index, index + size);
509
+ if (new Set(window).size < 2) {
510
+ continue;
511
+ }
512
+ const key = window.join(' → ');
513
+ if (seenKeys.has(key)) {
514
+ continue;
515
+ }
516
+ seenKeys.add(key);
517
+ const timestamp = session.actions[index]?.timestamp;
518
+ observations.push({
519
+ key,
520
+ steps: window,
521
+ sessionId: session.sessionId,
522
+ ...(typeof timestamp === 'string' ? { timestamp } : {}),
523
+ });
524
+ }
525
+ }
526
+ return observations;
527
+ }
528
+ function buildSkillSuggestions(sessions) {
529
+ const grouped = new Map();
530
+ for (const observation of sessions.flatMap(buildSkillObservations)) {
531
+ const existing = grouped.get(observation.key);
532
+ if (existing) {
533
+ existing.push(observation);
534
+ }
535
+ else {
536
+ grouped.set(observation.key, [observation]);
537
+ }
538
+ }
539
+ return [...grouped.entries()]
540
+ .flatMap(([key, items]) => {
541
+ const sessionCount = new Set(items.map((item) => item.sessionId)).size;
542
+ if (sessionCount < MIN_SKILL_SESSION_COUNT) {
543
+ return [];
544
+ }
545
+ const confidence = Math.min(0.95, 0.34 + (sessionCount - 1) * 0.19 + Math.min(items.length, 4) * 0.09);
546
+ if (confidence < MIN_SKILL_CONFIDENCE) {
547
+ return [];
548
+ }
549
+ const citations = items
550
+ .slice()
551
+ .sort((a, b) => (a.timestamp ?? '').localeCompare(b.timestamp ?? ''))
552
+ .slice(0, 3)
553
+ .map((item) => ({
554
+ sessionId: item.sessionId,
555
+ timestamp: item.timestamp,
556
+ summary: `Workflow: ${item.steps.join(' → ')}`,
557
+ }));
558
+ return [
559
+ {
560
+ id: hashId('skill', key),
561
+ signal: `Repeated workflow: ${key}. Consider a skill that automates or verifies this sequence after the agent finishes.`,
562
+ confidence: Number(confidence.toFixed(2)),
563
+ occurrences: items.length,
564
+ citations,
565
+ source: CLAUDE_CODE_SOURCE,
566
+ },
567
+ ];
568
+ })
569
+ .sort((left, right) => right.confidence - left.confidence);
570
+ }
571
+ export async function extractConversationalFeedback(options) {
572
+ const sessions = await loadClaudeCodeSessions(options);
573
+ const guideSuggestions = buildGuideSuggestions(sessions.flatMap((session) => extractGuidanceSignals(session)));
574
+ const skillSuggestions = buildSkillSuggestions(sessions);
575
+ return parseExtractedFeedbackBatch({
576
+ guideSuggestions,
577
+ skillSuggestions,
578
+ });
579
+ }
580
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/feedback/extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export type RetryOptions = {
2
+ /** Total attempts including the first. Default 4 (1 try + up to 3 retries). */
3
+ maxAttempts?: number;
4
+ /** Delay before the first retry; doubles each subsequent attempt. */
5
+ baseDelayMs?: number;
6
+ /** Ceiling on the pre-jitter backoff delay. */
7
+ maxDelayMs?: number;
8
+ /** Injectable for tests — defaults to a real timer-based sleep. */
9
+ sleepFn?: (ms: number) => Promise<void>;
10
+ /** Called before each retry's sleep, e.g. to log a warning. */
11
+ onRetry?: (attempt: number, delayMs: number, reason: string) => void;
12
+ };
13
+ /**
14
+ * Fetch with bounded retry + exponential backoff, retrying only on transport
15
+ * failures (network error, timeout) and 5xx responses — a 4xx means the
16
+ * request itself is wrong and retrying it would just fail the same way
17
+ * again. Returns the final `Response` even when it's still non-ok once
18
+ * attempts are exhausted, so the caller's existing `!response.ok` handling
19
+ * keeps working unchanged; re-throws the last transport error if every
20
+ * attempt failed without ever getting a response.
21
+ */
22
+ export declare function fetchWithRetry(fetchImpl: typeof fetch, url: string, init: RequestInit, options?: RetryOptions): Promise<Response>;
23
+ //# sourceMappingURL=http-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-retry.d.ts","sourceRoot":"","sources":["../src/http-retry.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mEAAmE;IACnE,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CACrE,CAAA;AAqBD;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,OAAO,KAAK,EACvB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,QAAQ,CAAC,CA+BnB"}