@made-by-moonlight/athene-core 0.9.1

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 (285) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +241 -0
  3. package/dist/activity-events.d.ts +42 -0
  4. package/dist/activity-events.d.ts.map +1 -0
  5. package/dist/activity-events.js +192 -0
  6. package/dist/activity-events.js.map +1 -0
  7. package/dist/activity-log.d.ts +71 -0
  8. package/dist/activity-log.d.ts.map +1 -0
  9. package/dist/activity-log.js +203 -0
  10. package/dist/activity-log.js.map +1 -0
  11. package/dist/activity-signal.d.ts +20 -0
  12. package/dist/activity-signal.d.ts.map +1 -0
  13. package/dist/activity-signal.js +91 -0
  14. package/dist/activity-signal.js.map +1 -0
  15. package/dist/agent-report.d.ts +148 -0
  16. package/dist/agent-report.d.ts.map +1 -0
  17. package/dist/agent-report.js +516 -0
  18. package/dist/agent-report.js.map +1 -0
  19. package/dist/agent-selection.d.ts +31 -0
  20. package/dist/agent-selection.d.ts.map +1 -0
  21. package/dist/agent-selection.js +69 -0
  22. package/dist/agent-selection.js.map +1 -0
  23. package/dist/agent-workspace-hooks.d.ts +74 -0
  24. package/dist/agent-workspace-hooks.d.ts.map +1 -0
  25. package/dist/agent-workspace-hooks.js +988 -0
  26. package/dist/agent-workspace-hooks.js.map +1 -0
  27. package/dist/atomic-write.d.ts +6 -0
  28. package/dist/atomic-write.d.ts.map +1 -0
  29. package/dist/atomic-write.js +49 -0
  30. package/dist/atomic-write.js.map +1 -0
  31. package/dist/cleanup-stack.d.ts +37 -0
  32. package/dist/cleanup-stack.d.ts.map +1 -0
  33. package/dist/cleanup-stack.js +45 -0
  34. package/dist/cleanup-stack.js.map +1 -0
  35. package/dist/code-review-manager.d.ts +118 -0
  36. package/dist/code-review-manager.d.ts.map +1 -0
  37. package/dist/code-review-manager.js +719 -0
  38. package/dist/code-review-manager.js.map +1 -0
  39. package/dist/code-review-store.d.ts +114 -0
  40. package/dist/code-review-store.d.ts.map +1 -0
  41. package/dist/code-review-store.js +346 -0
  42. package/dist/code-review-store.js.map +1 -0
  43. package/dist/config-generator.d.ts +84 -0
  44. package/dist/config-generator.d.ts.map +1 -0
  45. package/dist/config-generator.js +295 -0
  46. package/dist/config-generator.js.map +1 -0
  47. package/dist/config.d.ts +55 -0
  48. package/dist/config.d.ts.map +1 -0
  49. package/dist/config.js +852 -0
  50. package/dist/config.js.map +1 -0
  51. package/dist/daemon-children.d.ts +55 -0
  52. package/dist/daemon-children.d.ts.map +1 -0
  53. package/dist/daemon-children.js +435 -0
  54. package/dist/daemon-children.js.map +1 -0
  55. package/dist/dashboard-notifications.d.ts +42 -0
  56. package/dist/dashboard-notifications.d.ts.map +1 -0
  57. package/dist/dashboard-notifications.js +123 -0
  58. package/dist/dashboard-notifications.js.map +1 -0
  59. package/dist/events-db.d.ts +39 -0
  60. package/dist/events-db.d.ts.map +1 -0
  61. package/dist/events-db.js +185 -0
  62. package/dist/events-db.js.map +1 -0
  63. package/dist/feature-flags.d.ts +2 -0
  64. package/dist/feature-flags.d.ts.map +1 -0
  65. package/dist/feature-flags.js +9 -0
  66. package/dist/feature-flags.js.map +1 -0
  67. package/dist/feedback-tools.d.ts +97 -0
  68. package/dist/feedback-tools.d.ts.map +1 -0
  69. package/dist/feedback-tools.js +161 -0
  70. package/dist/feedback-tools.js.map +1 -0
  71. package/dist/file-lock.d.ts +5 -0
  72. package/dist/file-lock.d.ts.map +1 -0
  73. package/dist/file-lock.js +59 -0
  74. package/dist/file-lock.js.map +1 -0
  75. package/dist/format-automated-comments.d.ts +18 -0
  76. package/dist/format-automated-comments.d.ts.map +1 -0
  77. package/dist/gh-trace.d.ts +57 -0
  78. package/dist/gh-trace.d.ts.map +1 -0
  79. package/dist/gh-trace.js +320 -0
  80. package/dist/gh-trace.js.map +1 -0
  81. package/dist/git-activity.d.ts +10 -0
  82. package/dist/git-activity.d.ts.map +1 -0
  83. package/dist/git-activity.js +30 -0
  84. package/dist/git-activity.js.map +1 -0
  85. package/dist/global-config.d.ts +1085 -0
  86. package/dist/global-config.d.ts.map +1 -0
  87. package/dist/global-config.js +1067 -0
  88. package/dist/global-config.js.map +1 -0
  89. package/dist/index.d.ts +91 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +59 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/key-value.d.ts +7 -0
  94. package/dist/key-value.d.ts.map +1 -0
  95. package/dist/key-value.js +24 -0
  96. package/dist/key-value.js.map +1 -0
  97. package/dist/lifecycle-manager.d.ts +22 -0
  98. package/dist/lifecycle-manager.d.ts.map +1 -0
  99. package/dist/lifecycle-manager.js +2813 -0
  100. package/dist/lifecycle-manager.js.map +1 -0
  101. package/dist/lifecycle-state.d.ts +28 -0
  102. package/dist/lifecycle-state.d.ts.map +1 -0
  103. package/dist/lifecycle-state.js +446 -0
  104. package/dist/lifecycle-state.js.map +1 -0
  105. package/dist/lifecycle-status-decisions.d.ts +85 -0
  106. package/dist/lifecycle-status-decisions.d.ts.map +1 -0
  107. package/dist/lifecycle-status-decisions.js +262 -0
  108. package/dist/lifecycle-status-decisions.js.map +1 -0
  109. package/dist/lifecycle-transition.d.ts +81 -0
  110. package/dist/lifecycle-transition.d.ts.map +1 -0
  111. package/dist/lifecycle-transition.js +207 -0
  112. package/dist/lifecycle-transition.js.map +1 -0
  113. package/dist/metadata.d.ts +54 -0
  114. package/dist/metadata.d.ts.map +1 -0
  115. package/dist/metadata.js +484 -0
  116. package/dist/metadata.js.map +1 -0
  117. package/dist/migration/storage-v2.d.ts +76 -0
  118. package/dist/migration/storage-v2.d.ts.map +1 -0
  119. package/dist/migration/storage-v2.js +1614 -0
  120. package/dist/migration/storage-v2.js.map +1 -0
  121. package/dist/notification-data.d.ts +135 -0
  122. package/dist/notification-data.d.ts.map +1 -0
  123. package/dist/notification-data.js +204 -0
  124. package/dist/notification-data.js.map +1 -0
  125. package/dist/notification-observability.d.ts +21 -0
  126. package/dist/notification-observability.d.ts.map +1 -0
  127. package/dist/notification-observability.js +154 -0
  128. package/dist/notification-observability.js.map +1 -0
  129. package/dist/notifier-resolution.d.ts +14 -0
  130. package/dist/notifier-resolution.d.ts.map +1 -0
  131. package/dist/notifier-resolution.js +23 -0
  132. package/dist/notifier-resolution.js.map +1 -0
  133. package/dist/observability.d.ts +100 -0
  134. package/dist/observability.d.ts.map +1 -0
  135. package/dist/observability.js +535 -0
  136. package/dist/observability.js.map +1 -0
  137. package/dist/opencode-agents-md.d.ts +3 -0
  138. package/dist/opencode-agents-md.d.ts.map +1 -0
  139. package/dist/opencode-agents-md.js +40 -0
  140. package/dist/opencode-agents-md.js.map +1 -0
  141. package/dist/opencode-config.d.ts +2 -0
  142. package/dist/opencode-config.d.ts.map +1 -0
  143. package/dist/opencode-config.js +17 -0
  144. package/dist/opencode-config.js.map +1 -0
  145. package/dist/opencode-session-id.d.ts +2 -0
  146. package/dist/opencode-session-id.d.ts.map +1 -0
  147. package/dist/opencode-session-id.js +12 -0
  148. package/dist/opencode-session-id.js.map +1 -0
  149. package/dist/opencode-shared.d.ts +80 -0
  150. package/dist/opencode-shared.d.ts.map +1 -0
  151. package/dist/opencode-shared.js +202 -0
  152. package/dist/opencode-shared.js.map +1 -0
  153. package/dist/orchestrator-prompt.d.ts +19 -0
  154. package/dist/orchestrator-prompt.d.ts.map +1 -0
  155. package/dist/orchestrator-prompt.js +130 -0
  156. package/dist/orchestrator-prompt.js.map +1 -0
  157. package/dist/orchestrator-session-strategy.d.ts +5 -0
  158. package/dist/orchestrator-session-strategy.d.ts.map +1 -0
  159. package/dist/orchestrator-session-strategy.js +13 -0
  160. package/dist/orchestrator-session-strategy.js.map +1 -0
  161. package/dist/paths.d.ts +145 -0
  162. package/dist/paths.d.ts.map +1 -0
  163. package/dist/paths.js +288 -0
  164. package/dist/paths.js.map +1 -0
  165. package/dist/platform.d.ts +32 -0
  166. package/dist/platform.d.ts.map +1 -0
  167. package/dist/platform.js +211 -0
  168. package/dist/platform.js.map +1 -0
  169. package/dist/plugin-registry.d.ts +15 -0
  170. package/dist/plugin-registry.d.ts.map +1 -0
  171. package/dist/plugin-registry.js +499 -0
  172. package/dist/plugin-registry.js.map +1 -0
  173. package/dist/portfolio-projects.d.ts +7 -0
  174. package/dist/portfolio-projects.d.ts.map +1 -0
  175. package/dist/portfolio-projects.js +65 -0
  176. package/dist/portfolio-projects.js.map +1 -0
  177. package/dist/portfolio-registry.d.ts +42 -0
  178. package/dist/portfolio-registry.d.ts.map +1 -0
  179. package/dist/portfolio-registry.js +311 -0
  180. package/dist/portfolio-registry.js.map +1 -0
  181. package/dist/portfolio-routing.d.ts +5 -0
  182. package/dist/portfolio-routing.d.ts.map +1 -0
  183. package/dist/portfolio-routing.js +24 -0
  184. package/dist/portfolio-routing.js.map +1 -0
  185. package/dist/portfolio-session-service.d.ts +15 -0
  186. package/dist/portfolio-session-service.d.ts.map +1 -0
  187. package/dist/portfolio-session-service.js +206 -0
  188. package/dist/portfolio-session-service.js.map +1 -0
  189. package/dist/process-cache.d.ts +32 -0
  190. package/dist/process-cache.d.ts.map +1 -0
  191. package/dist/process-cache.js +44 -0
  192. package/dist/process-cache.js.map +1 -0
  193. package/dist/project-resolver.d.ts +5 -0
  194. package/dist/project-resolver.d.ts.map +1 -0
  195. package/dist/project-resolver.js +20 -0
  196. package/dist/project-resolver.js.map +1 -0
  197. package/dist/prompt-builder.d.ts +42 -0
  198. package/dist/prompt-builder.d.ts.map +1 -0
  199. package/dist/prompt-builder.js +182 -0
  200. package/dist/prompt-builder.js.map +1 -0
  201. package/dist/prompts/orchestrator.md.js +4 -0
  202. package/dist/prompts/orchestrator.md.js.map +1 -0
  203. package/dist/query-activity-events.d.ts +42 -0
  204. package/dist/query-activity-events.d.ts.map +1 -0
  205. package/dist/query-activity-events.js +170 -0
  206. package/dist/query-activity-events.js.map +1 -0
  207. package/dist/recovery/actions.d.ts +7 -0
  208. package/dist/recovery/actions.d.ts.map +1 -0
  209. package/dist/recovery/index.d.ts +8 -0
  210. package/dist/recovery/index.d.ts.map +1 -0
  211. package/dist/recovery/logger.d.ts +12 -0
  212. package/dist/recovery/logger.d.ts.map +1 -0
  213. package/dist/recovery/manager.d.ts +24 -0
  214. package/dist/recovery/manager.d.ts.map +1 -0
  215. package/dist/recovery/scanner.d.ts +11 -0
  216. package/dist/recovery/scanner.d.ts.map +1 -0
  217. package/dist/recovery/types.d.ts +170 -0
  218. package/dist/recovery/types.d.ts.map +1 -0
  219. package/dist/recovery/validator.d.ts +8 -0
  220. package/dist/recovery/validator.d.ts.map +1 -0
  221. package/dist/report-watcher.d.ts +93 -0
  222. package/dist/report-watcher.d.ts.map +1 -0
  223. package/dist/report-watcher.js +182 -0
  224. package/dist/report-watcher.js.map +1 -0
  225. package/dist/scm-webhook-utils.d.ts +6 -0
  226. package/dist/scm-webhook-utils.d.ts.map +1 -0
  227. package/dist/scm-webhook-utils.js +36 -0
  228. package/dist/scm-webhook-utils.js.map +1 -0
  229. package/dist/session-manager.d.ts +22 -0
  230. package/dist/session-manager.d.ts.map +1 -0
  231. package/dist/session-manager.js +3077 -0
  232. package/dist/session-manager.js.map +1 -0
  233. package/dist/spawn-target.d.ts +23 -0
  234. package/dist/spawn-target.d.ts.map +1 -0
  235. package/dist/spawn-target.js +39 -0
  236. package/dist/spawn-target.js.map +1 -0
  237. package/dist/storage-key.d.ts +9 -0
  238. package/dist/storage-key.d.ts.map +1 -0
  239. package/dist/storage-key.js +59 -0
  240. package/dist/storage-key.js.map +1 -0
  241. package/dist/tmux.d.ts +39 -0
  242. package/dist/tmux.d.ts.map +1 -0
  243. package/dist/tmux.js +141 -0
  244. package/dist/tmux.js.map +1 -0
  245. package/dist/types.d.ts +1496 -0
  246. package/dist/types.d.ts.map +1 -0
  247. package/dist/types.js +215 -0
  248. package/dist/types.js.map +1 -0
  249. package/dist/update-cache.d.ts +59 -0
  250. package/dist/update-cache.d.ts.map +1 -0
  251. package/dist/update-cache.js +77 -0
  252. package/dist/update-cache.js.map +1 -0
  253. package/dist/utils/metadata-flatten.d.ts +3 -0
  254. package/dist/utils/metadata-flatten.d.ts.map +1 -0
  255. package/dist/utils/metadata-flatten.js +18 -0
  256. package/dist/utils/metadata-flatten.js.map +1 -0
  257. package/dist/utils/pr.d.ts +7 -0
  258. package/dist/utils/pr.d.ts.map +1 -0
  259. package/dist/utils/pr.js +97 -0
  260. package/dist/utils/pr.js.map +1 -0
  261. package/dist/utils/session-from-metadata.d.ts +16 -0
  262. package/dist/utils/session-from-metadata.d.ts.map +1 -0
  263. package/dist/utils/session-from-metadata.js +87 -0
  264. package/dist/utils/session-from-metadata.js.map +1 -0
  265. package/dist/utils/session-id.d.ts +4 -0
  266. package/dist/utils/session-id.d.ts.map +1 -0
  267. package/dist/utils/session-id.js +9 -0
  268. package/dist/utils/session-id.js.map +1 -0
  269. package/dist/utils/validation.d.ts +9 -0
  270. package/dist/utils/validation.d.ts.map +1 -0
  271. package/dist/utils/validation.js +45 -0
  272. package/dist/utils/validation.js.map +1 -0
  273. package/dist/utils.d.ts +65 -0
  274. package/dist/utils.d.ts.map +1 -0
  275. package/dist/utils.js +189 -0
  276. package/dist/utils.js.map +1 -0
  277. package/dist/version-compare.d.ts +27 -0
  278. package/dist/version-compare.d.ts.map +1 -0
  279. package/dist/version-compare.js +121 -0
  280. package/dist/version-compare.js.map +1 -0
  281. package/dist/windows-pty-registry.d.ts +27 -0
  282. package/dist/windows-pty-registry.d.ts.map +1 -0
  283. package/dist/windows-pty-registry.js +109 -0
  284. package/dist/windows-pty-registry.js.map +1 -0
  285. package/package.json +110 -0
@@ -0,0 +1,123 @@
1
+ import { existsSync, readFileSync, mkdirSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { atomicWriteFileSync } from './atomic-write.js';
4
+ import { getObservabilityBaseDir } from './paths.js';
5
+
6
+ const DEFAULT_DASHBOARD_NOTIFICATION_LIMIT = 50;
7
+ const MAX_DASHBOARD_NOTIFICATION_LIMIT = 500;
8
+ function normalizeDashboardNotificationLimit(value) {
9
+ const parsed = typeof value === "number"
10
+ ? value
11
+ : typeof value === "string" && value.trim().length > 0
12
+ ? Number.parseInt(value, 10)
13
+ : DEFAULT_DASHBOARD_NOTIFICATION_LIMIT;
14
+ if (!Number.isFinite(parsed))
15
+ return DEFAULT_DASHBOARD_NOTIFICATION_LIMIT;
16
+ return Math.min(MAX_DASHBOARD_NOTIFICATION_LIMIT, Math.max(1, Math.floor(parsed)));
17
+ }
18
+ function getDashboardNotificationStorePath(configPath) {
19
+ return join(getObservabilityBaseDir(configPath), "dashboard-notifications.jsonl");
20
+ }
21
+ function toJsonRecord(value) {
22
+ try {
23
+ const serialized = JSON.parse(JSON.stringify(value ?? {}));
24
+ if (serialized && typeof serialized === "object" && !Array.isArray(serialized)) {
25
+ return serialized;
26
+ }
27
+ }
28
+ catch {
29
+ // Fall through to a small marker below. Notifications should not fail
30
+ // because one event payload contained a non-serializable value.
31
+ }
32
+ return { serializationError: "event data could not be serialized" };
33
+ }
34
+ function serializeAction(action) {
35
+ return {
36
+ label: action.label,
37
+ ...(typeof action.url === "string" ? { url: action.url } : {}),
38
+ ...(typeof action.callbackEndpoint === "string"
39
+ ? { callbackEndpoint: action.callbackEndpoint }
40
+ : {}),
41
+ };
42
+ }
43
+ function createDashboardNotificationRecord(event, actions, receivedAt = new Date()) {
44
+ const receivedAtIso = receivedAt.toISOString();
45
+ return {
46
+ id: `${event.id}:${receivedAtIso}`,
47
+ receivedAt: receivedAtIso,
48
+ event: {
49
+ id: event.id,
50
+ type: event.type,
51
+ priority: event.priority,
52
+ sessionId: event.sessionId,
53
+ projectId: event.projectId,
54
+ timestamp: event.timestamp.toISOString(),
55
+ message: event.message,
56
+ data: toJsonRecord(event.data),
57
+ },
58
+ ...(actions && actions.length > 0 ? { actions: actions.map(serializeAction) } : {}),
59
+ };
60
+ }
61
+ function isDashboardNotificationRecord(value) {
62
+ if (!value || typeof value !== "object")
63
+ return false;
64
+ const candidate = value;
65
+ const event = candidate.event;
66
+ return (typeof candidate.id === "string" &&
67
+ typeof candidate.receivedAt === "string" &&
68
+ event !== undefined &&
69
+ typeof event.id === "string" &&
70
+ typeof event.type === "string" &&
71
+ typeof event.priority === "string" &&
72
+ typeof event.sessionId === "string" &&
73
+ typeof event.projectId === "string" &&
74
+ typeof event.timestamp === "string" &&
75
+ typeof event.message === "string" &&
76
+ event.data !== undefined &&
77
+ typeof event.data === "object" &&
78
+ !Array.isArray(event.data));
79
+ }
80
+ function readDashboardNotificationsFromFile(filePath, limit = DEFAULT_DASHBOARD_NOTIFICATION_LIMIT) {
81
+ if (!existsSync(filePath))
82
+ return [];
83
+ const normalizedLimit = normalizeDashboardNotificationLimit(limit);
84
+ const content = readFileSync(filePath, "utf-8");
85
+ const records = [];
86
+ for (const line of content.split(/\r?\n/)) {
87
+ const trimmed = line.trim();
88
+ if (!trimmed)
89
+ continue;
90
+ try {
91
+ const parsed = JSON.parse(trimmed);
92
+ if (isDashboardNotificationRecord(parsed)) {
93
+ records.push(parsed);
94
+ }
95
+ }
96
+ catch {
97
+ // Ignore malformed lines. A partial write should not break the dashboard.
98
+ }
99
+ }
100
+ return records.slice(-normalizedLimit);
101
+ }
102
+ function readDashboardNotifications(configPath, limit = DEFAULT_DASHBOARD_NOTIFICATION_LIMIT) {
103
+ return readDashboardNotificationsFromFile(getDashboardNotificationStorePath(configPath), limit);
104
+ }
105
+ function writeDashboardNotificationsToFile(filePath, records, limit = DEFAULT_DASHBOARD_NOTIFICATION_LIMIT) {
106
+ const normalizedLimit = normalizeDashboardNotificationLimit(limit);
107
+ const retained = records.slice(-normalizedLimit);
108
+ mkdirSync(dirname(filePath), { recursive: true });
109
+ const content = retained.length > 0 ? `${retained.map((record) => JSON.stringify(record)).join("\n")}\n` : "";
110
+ atomicWriteFileSync(filePath, content);
111
+ }
112
+ function appendDashboardNotificationRecord(filePath, record, limit = DEFAULT_DASHBOARD_NOTIFICATION_LIMIT) {
113
+ const existing = readDashboardNotificationsFromFile(filePath, limit);
114
+ writeDashboardNotificationsToFile(filePath, [...existing, record], limit);
115
+ return record;
116
+ }
117
+ function appendDashboardNotification(configPath, event, actions, options = {}) {
118
+ const record = createDashboardNotificationRecord(event, actions, options.receivedAt);
119
+ return appendDashboardNotificationRecord(getDashboardNotificationStorePath(configPath), record, options.limit);
120
+ }
121
+
122
+ export { DEFAULT_DASHBOARD_NOTIFICATION_LIMIT, MAX_DASHBOARD_NOTIFICATION_LIMIT, appendDashboardNotification, appendDashboardNotificationRecord, createDashboardNotificationRecord, getDashboardNotificationStorePath, normalizeDashboardNotificationLimit, readDashboardNotifications, readDashboardNotificationsFromFile, writeDashboardNotificationsToFile };
123
+ //# sourceMappingURL=dashboard-notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-notifications.js","sources":["../src/dashboard-notifications.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * SQLite database layer for activity event logging.
3
+ *
4
+ * Lazy-initialized singleton. Opens on first call to getDb(), never on import.
5
+ * Returns null if better-sqlite3 is unavailable (native build failure, optional dep).
6
+ * WAL mode + busy_timeout for multi-process concurrent access.
7
+ */
8
+ type BetterSqlite3Database = {
9
+ pragma(source: string, options?: {
10
+ simple?: boolean;
11
+ }): unknown;
12
+ exec(source: string): void;
13
+ prepare(source: string): {
14
+ run(...args: unknown[]): unknown;
15
+ all(...args: unknown[]): unknown[];
16
+ };
17
+ close(): void;
18
+ };
19
+ /** Whether the current process has an initialized FTS5 search table. */
20
+ export declare function isActivityEventsFtsEnabled(): boolean;
21
+ /**
22
+ * Close the cached DB connection and reset module state.
23
+ *
24
+ * On Windows the SQLite handle holds an exclusive file lock; without an
25
+ * explicit close, callers cannot remove `activity-events.db` (or its parent
26
+ * directory) until the process exits. Tests that recreate the AO base dir
27
+ * across runs must call this before `rmSync`.
28
+ */
29
+ export declare function closeDb(): void;
30
+ export declare function formatActivityEventsDbUnavailableWarning(err: unknown): string;
31
+ export declare function emitActivityEventsDbUnavailableWarning(err: unknown): void;
32
+ export declare function __resetActivityEventsDbWarningForTests(): void;
33
+ /**
34
+ * Get the lazily-initialized DB connection.
35
+ * Returns null if better-sqlite3 failed to load or init — callers should treat null as no-op.
36
+ */
37
+ export declare function getDb(): BetterSqlite3Database | null;
38
+ export {};
39
+ //# sourceMappingURL=events-db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-db.d.ts","sourceRoot":"","sources":["../src/events-db.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,KAAK,qBAAqB,GAAG;IAC3B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC;IAChE,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG;QAAE,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAC,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAAA;KAAE,CAAC;IAClG,KAAK,IAAI,IAAI,CAAC;CACf,CAAC;AAmHF,wEAAwE;AACxE,wBAAgB,0BAA0B,IAAI,OAAO,CAEpD;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAW9B;AAmBD,wBAAgB,wCAAwC,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAK7E;AAED,wBAAgB,sCAAsC,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAMzE;AAED,wBAAgB,sCAAsC,IAAI,IAAI,CAE7D;AAED;;;GAGG;AACH,wBAAgB,KAAK,IAAI,qBAAqB,GAAG,IAAI,CAWpD"}
@@ -0,0 +1,185 @@
1
+ import { createRequire } from 'node:module';
2
+ import { mkdirSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { getAoBaseDir } from './paths.js';
5
+
6
+ /**
7
+ * SQLite database layer for activity event logging.
8
+ *
9
+ * Lazy-initialized singleton. Opens on first call to getDb(), never on import.
10
+ * Returns null if better-sqlite3 is unavailable (native build failure, optional dep).
11
+ * WAL mode + busy_timeout for multi-process concurrent access.
12
+ */
13
+ // Use createRequire so we can try/catch on native module load without top-level await.
14
+ const _require = createRequire(import.meta.url);
15
+ let _db = null;
16
+ let _dbFailed = false;
17
+ let _ftsEnabled = false;
18
+ let _dbUnavailableWarningEmitted = false;
19
+ const PRUNE_BATCH_SIZE = 1000;
20
+ function getEventsDbPath() {
21
+ return join(getAoBaseDir(), "activity-events.db");
22
+ }
23
+ function initSchema(db) {
24
+ db.exec(`
25
+ CREATE TABLE IF NOT EXISTS activity_events (
26
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
27
+ ts_epoch INTEGER NOT NULL,
28
+ ts TEXT NOT NULL,
29
+ project_id TEXT,
30
+ session_id TEXT,
31
+ source TEXT NOT NULL,
32
+ type TEXT NOT NULL,
33
+ log_level TEXT NOT NULL DEFAULT 'info',
34
+ summary TEXT NOT NULL,
35
+ data TEXT
36
+ );
37
+
38
+ CREATE INDEX IF NOT EXISTS idx_ae_ts ON activity_events(ts_epoch);
39
+ CREATE INDEX IF NOT EXISTS idx_ae_session ON activity_events(session_id);
40
+ CREATE INDEX IF NOT EXISTS idx_ae_project ON activity_events(project_id);
41
+ CREATE INDEX IF NOT EXISTS idx_ae_type ON activity_events(type);
42
+ CREATE INDEX IF NOT EXISTS idx_ae_source ON activity_events(source);
43
+ `);
44
+ }
45
+ function initFts(db) {
46
+ db.exec(`
47
+ CREATE VIRTUAL TABLE IF NOT EXISTS activity_events_fts USING fts5(
48
+ summary, data,
49
+ content='activity_events',
50
+ content_rowid='id'
51
+ );
52
+
53
+ CREATE TRIGGER IF NOT EXISTS activity_events_ai
54
+ AFTER INSERT ON activity_events
55
+ BEGIN
56
+ INSERT INTO activity_events_fts(rowid, summary, data)
57
+ VALUES (new.id, new.summary, new.data);
58
+ END;
59
+
60
+ CREATE TRIGGER IF NOT EXISTS activity_events_ad
61
+ AFTER DELETE ON activity_events
62
+ BEGIN
63
+ INSERT INTO activity_events_fts(activity_events_fts, rowid, summary, data)
64
+ VALUES ('delete', old.id, old.summary, old.data);
65
+ END;
66
+
67
+ CREATE TRIGGER IF NOT EXISTS activity_events_au
68
+ AFTER UPDATE ON activity_events
69
+ BEGIN
70
+ INSERT INTO activity_events_fts(activity_events_fts, rowid, summary, data)
71
+ VALUES ('delete', old.id, old.summary, old.data);
72
+ INSERT INTO activity_events_fts(rowid, summary, data)
73
+ VALUES (new.id, new.summary, new.data);
74
+ END;
75
+ `);
76
+ // Backfill rows written before FTS was available; triggers only cover future writes.
77
+ db.exec("INSERT INTO activity_events_fts(activity_events_fts) VALUES('rebuild')");
78
+ }
79
+ function pruneOldEvents(db, cutoff) {
80
+ db.prepare(`DELETE FROM activity_events
81
+ WHERE rowid IN (
82
+ SELECT rowid FROM activity_events WHERE ts_epoch < ? LIMIT ?
83
+ )`).run(cutoff, PRUNE_BATCH_SIZE);
84
+ }
85
+ function openDb() {
86
+ const Database = _require("better-sqlite3");
87
+ mkdirSync(getAoBaseDir(), { recursive: true });
88
+ const db = new Database(getEventsDbPath());
89
+ db.pragma("journal_mode = WAL");
90
+ db.pragma("busy_timeout = 3000");
91
+ // WAL + NORMAL gives one checkpoint window of exposure (acceptable for a diagnostic log)
92
+ db.pragma("synchronous = NORMAL");
93
+ const version = db.pragma("user_version", { simple: true });
94
+ initSchema(db);
95
+ if (version < 1) {
96
+ db.pragma("user_version = 1");
97
+ }
98
+ try {
99
+ initFts(db);
100
+ _ftsEnabled = true;
101
+ }
102
+ catch (err) {
103
+ _ftsEnabled = false;
104
+ // eslint-disable-next-line no-console
105
+ console.warn("[ao] activity-events FTS unavailable — writes will continue and search will use a bounded LIKE fallback:", err instanceof Error ? err.message : String(err));
106
+ }
107
+ // 7-day retention using epoch comparison (no text/datetime ambiguity)
108
+ const cutoff = Date.now() - 7 * 24 * 60 * 60 * 1000;
109
+ pruneOldEvents(db, cutoff);
110
+ return db;
111
+ }
112
+ /** Whether the current process has an initialized FTS5 search table. */
113
+ function isActivityEventsFtsEnabled() {
114
+ return _ftsEnabled;
115
+ }
116
+ /**
117
+ * Close the cached DB connection and reset module state.
118
+ *
119
+ * On Windows the SQLite handle holds an exclusive file lock; without an
120
+ * explicit close, callers cannot remove `activity-events.db` (or its parent
121
+ * directory) until the process exits. Tests that recreate the AO base dir
122
+ * across runs must call this before `rmSync`.
123
+ */
124
+ function closeDb() {
125
+ if (_db) {
126
+ try {
127
+ _db.close();
128
+ }
129
+ catch {
130
+ // best-effort: connection may already be closed
131
+ }
132
+ _db = null;
133
+ }
134
+ _dbFailed = false;
135
+ _ftsEnabled = false;
136
+ }
137
+ function isAoEventsInvocation(argv = process.argv) {
138
+ return argv.slice(2).includes("events");
139
+ }
140
+ function isMissingBetterSqlite3Binding(err) {
141
+ const message = err instanceof Error ? err.message : String(err);
142
+ return (message.includes("Could not locate the bindings file") ||
143
+ message.includes("better_sqlite3.node") ||
144
+ message.includes("Cannot find module 'better-sqlite3'"));
145
+ }
146
+ function firstErrorLine(err) {
147
+ return (err instanceof Error ? err.message : String(err)).split(/\r?\n/, 1)[0] ?? "unknown error";
148
+ }
149
+ function formatActivityEventsDbUnavailableWarning(err) {
150
+ if (isMissingBetterSqlite3Binding(err)) {
151
+ return `[ao] activity-events disabled: better-sqlite3 not compiled for Node ${process.version} (ABI v${process.versions.modules}). Run \`pnpm rebuild better-sqlite3\` or use a supported Node version.`;
152
+ }
153
+ return `[ao] activity-events disabled: better-sqlite3 failed to load: ${firstErrorLine(err)}`;
154
+ }
155
+ function emitActivityEventsDbUnavailableWarning(err) {
156
+ if (_dbUnavailableWarningEmitted)
157
+ return;
158
+ if (process.env["AO_DEBUG"] !== "1" && !isAoEventsInvocation())
159
+ return;
160
+ _dbUnavailableWarningEmitted = true;
161
+ // eslint-disable-next-line no-console
162
+ console.warn(formatActivityEventsDbUnavailableWarning(err));
163
+ }
164
+ /**
165
+ * Get the lazily-initialized DB connection.
166
+ * Returns null if better-sqlite3 failed to load or init — callers should treat null as no-op.
167
+ */
168
+ function getDb() {
169
+ if (_dbFailed)
170
+ return null;
171
+ if (_db)
172
+ return _db;
173
+ try {
174
+ _db = openDb();
175
+ return _db;
176
+ }
177
+ catch (err) {
178
+ _dbFailed = true;
179
+ emitActivityEventsDbUnavailableWarning(err);
180
+ return null;
181
+ }
182
+ }
183
+
184
+ export { closeDb, emitActivityEventsDbUnavailableWarning, formatActivityEventsDbUnavailableWarning, getDb, isActivityEventsFtsEnabled };
185
+ //# sourceMappingURL=events-db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-db.js","sources":["../src/events-db.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function isPortfolioEnabled(): boolean;
2
+ //# sourceMappingURL=feature-flags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flags.d.ts","sourceRoot":"","sources":["../src/feature-flags.ts"],"names":[],"mappings":"AAAA,wBAAgB,kBAAkB,IAAI,OAAO,CAI5C"}
@@ -0,0 +1,9 @@
1
+ function isPortfolioEnabled() {
2
+ const value = process.env["AO_ENABLE_PORTFOLIO"];
3
+ if (value === "0" || value === "false")
4
+ return false;
5
+ return true;
6
+ }
7
+
8
+ export { isPortfolioEnabled };
9
+ //# sourceMappingURL=feature-flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flags.js","sources":["../src/feature-flags.ts"],"sourcesContent":[null],"names":[],"mappings":"SAAgB,kBAAkB,GAAA;IAChC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;AAChD,IAAA,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,OAAO;AAAE,QAAA,OAAO,KAAK;AACpD,IAAA,OAAO,IAAI;AACb;;;;"}
@@ -0,0 +1,97 @@
1
+ import { z } from "zod";
2
+ export declare const FEEDBACK_TOOL_NAMES: {
3
+ readonly BUG_REPORT: "bug_report";
4
+ readonly IMPROVEMENT_SUGGESTION: "improvement_suggestion";
5
+ };
6
+ export type FeedbackToolName = (typeof FEEDBACK_TOOL_NAMES)[keyof typeof FEEDBACK_TOOL_NAMES];
7
+ declare const FeedbackInputSchema: z.ZodObject<{
8
+ title: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
9
+ body: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
10
+ evidence: z.ZodArray<z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>, "many">;
11
+ session: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
12
+ source: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
13
+ confidence: z.ZodNumber;
14
+ }, "strict", z.ZodTypeAny, {
15
+ source: string;
16
+ title: string;
17
+ session: string;
18
+ body: string;
19
+ confidence: number;
20
+ evidence: string[];
21
+ }, {
22
+ source: string;
23
+ title: string;
24
+ session: string;
25
+ body: string;
26
+ confidence: number;
27
+ evidence: string[];
28
+ }>;
29
+ export declare const BugReportSchema: z.ZodObject<{
30
+ title: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
31
+ body: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
32
+ evidence: z.ZodArray<z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>, "many">;
33
+ session: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
34
+ source: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
35
+ confidence: z.ZodNumber;
36
+ }, "strict", z.ZodTypeAny, {
37
+ source: string;
38
+ title: string;
39
+ session: string;
40
+ body: string;
41
+ confidence: number;
42
+ evidence: string[];
43
+ }, {
44
+ source: string;
45
+ title: string;
46
+ session: string;
47
+ body: string;
48
+ confidence: number;
49
+ evidence: string[];
50
+ }>;
51
+ export declare const ImprovementSuggestionSchema: z.ZodObject<{
52
+ title: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
53
+ body: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
54
+ evidence: z.ZodArray<z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>, "many">;
55
+ session: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
56
+ source: z.ZodPipeline<z.ZodEffects<z.ZodString, string, string>, z.ZodString>;
57
+ confidence: z.ZodNumber;
58
+ }, "strict", z.ZodTypeAny, {
59
+ source: string;
60
+ title: string;
61
+ session: string;
62
+ body: string;
63
+ confidence: number;
64
+ evidence: string[];
65
+ }, {
66
+ source: string;
67
+ title: string;
68
+ session: string;
69
+ body: string;
70
+ confidence: number;
71
+ evidence: string[];
72
+ }>;
73
+ export type BugReportInput = z.infer<typeof BugReportSchema>;
74
+ export type ImprovementSuggestionInput = z.infer<typeof ImprovementSuggestionSchema>;
75
+ export type FeedbackToolInput = BugReportInput | ImprovementSuggestionInput;
76
+ export interface FeedbackToolContract {
77
+ name: FeedbackToolName;
78
+ description: string;
79
+ schema: typeof FeedbackInputSchema;
80
+ }
81
+ export declare const FEEDBACK_TOOL_CONTRACTS: Record<FeedbackToolName, FeedbackToolContract>;
82
+ export interface PersistedFeedbackReport extends FeedbackToolInput {
83
+ id: string;
84
+ tool: FeedbackToolName;
85
+ createdAt: string;
86
+ dedupeKey: string;
87
+ }
88
+ export declare function validateFeedbackToolInput(tool: FeedbackToolName, input: FeedbackToolInput): FeedbackToolInput;
89
+ export declare function generateFeedbackDedupeKey(tool: FeedbackToolName, input: FeedbackToolInput): string;
90
+ export declare class FeedbackReportStore {
91
+ private readonly reportsDir;
92
+ constructor(reportsDir: string);
93
+ persist(tool: FeedbackToolName, input: FeedbackToolInput): PersistedFeedbackReport;
94
+ list(): PersistedFeedbackReport[];
95
+ }
96
+ export {};
97
+ //# sourceMappingURL=feedback-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-tools.d.ts","sourceRoot":"","sources":["../src/feedback-tools.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,mBAAmB;;;CAGtB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAM9F,QAAA,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;EASd,CAAC;AAEZ,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;EAAsB,CAAC;AACnD,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;EAAsB,CAAC;AAE/D,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAC7D,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AACrF,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,0BAA0B,CAAC;AAE5E,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,gBAAgB,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,mBAAmB,CAAC;CACpC;AAED,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,gBAAgB,EAAE,oBAAoB,CAWlF,CAAC;AAEF,MAAM,WAAW,uBAAwB,SAAQ,iBAAiB;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAMD,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,iBAAiB,GACvB,iBAAiB,CAEnB;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,gBAAgB,EACtB,KAAK,EAAE,iBAAiB,GACvB,MAAM,CAcR;AAiED,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,MAAM;IAE/C,OAAO,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,iBAAiB,GAAG,uBAAuB;IAqBlF,IAAI,IAAI,uBAAuB,EAAE;CAwBlC"}
@@ -0,0 +1,161 @@
1
+ import { randomUUID, createHash } from 'node:crypto';
2
+ import { mkdirSync, existsSync, readdirSync, statSync, readFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { z } from 'zod';
5
+ import { atomicWriteFileSync } from './atomic-write.js';
6
+ import { parseKeyValueContent } from './key-value.js';
7
+
8
+ const FEEDBACK_TOOL_NAMES = {
9
+ BUG_REPORT: "bug_report",
10
+ IMPROVEMENT_SUGGESTION: "improvement_suggestion",
11
+ };
12
+ const normalizeText = (value) => value.trim().replace(/\s+/g, " ");
13
+ const NonEmptyTextSchema = z.string().transform(normalizeText).pipe(z.string().min(1));
14
+ const FeedbackInputSchema = z
15
+ .object({
16
+ title: NonEmptyTextSchema,
17
+ body: NonEmptyTextSchema,
18
+ evidence: z.array(NonEmptyTextSchema).min(1),
19
+ session: NonEmptyTextSchema,
20
+ source: NonEmptyTextSchema,
21
+ confidence: z.number().finite().min(0).max(1),
22
+ })
23
+ .strict();
24
+ const BugReportSchema = FeedbackInputSchema;
25
+ const ImprovementSuggestionSchema = FeedbackInputSchema;
26
+ const FEEDBACK_TOOL_CONTRACTS = {
27
+ bug_report: {
28
+ name: FEEDBACK_TOOL_NAMES.BUG_REPORT,
29
+ description: "Capture reproducible bugs found while working in AO sessions.",
30
+ schema: BugReportSchema,
31
+ },
32
+ improvement_suggestion: {
33
+ name: FEEDBACK_TOOL_NAMES.IMPROVEMENT_SUGGESTION,
34
+ description: "Capture actionable improvement suggestions discovered in AO sessions.",
35
+ schema: ImprovementSuggestionSchema,
36
+ },
37
+ };
38
+ const ReportIdSchema = z.string().regex(/^report_[A-Za-z0-9_-]+$/);
39
+ const ISODateSchema = z.string().datetime({ offset: true });
40
+ const DedupeKeySchema = z.string().regex(/^[a-f0-9]{16}$/);
41
+ function validateFeedbackToolInput(tool, input) {
42
+ return FEEDBACK_TOOL_CONTRACTS[tool].schema.parse(input);
43
+ }
44
+ function generateFeedbackDedupeKey(tool, input) {
45
+ const canonicalEvidence = [...input.evidence]
46
+ .map((item) => normalizeText(item).toLowerCase())
47
+ .sort();
48
+ const canonical = JSON.stringify({
49
+ tool,
50
+ title: normalizeText(input.title).toLowerCase(),
51
+ body: normalizeText(input.body).toLowerCase(),
52
+ session: normalizeText(input.session).toLowerCase(),
53
+ source: normalizeText(input.source).toLowerCase(),
54
+ evidence: canonicalEvidence,
55
+ });
56
+ return createHash("sha256").update(canonical).digest("hex").slice(0, 16);
57
+ }
58
+ function serializeReport(report) {
59
+ const lines = [
60
+ "version=1",
61
+ `id=${report.id}`,
62
+ `tool=${report.tool}`,
63
+ `createdAt=${report.createdAt}`,
64
+ `dedupeKey=${report.dedupeKey}`,
65
+ `title=${report.title}`,
66
+ `body=${report.body}`,
67
+ `session=${report.session}`,
68
+ `source=${report.source}`,
69
+ `confidence=${report.confidence}`,
70
+ ];
71
+ for (const [index, evidenceItem] of report.evidence.entries()) {
72
+ lines.push(`evidence.${index}=${evidenceItem}`);
73
+ }
74
+ return `${lines.join("\n")}\n`;
75
+ }
76
+ function parseReportFile(content) {
77
+ const raw = parseKeyValueContent(content);
78
+ const evidence = Object.entries(raw)
79
+ .filter(([key]) => key.startsWith("evidence."))
80
+ .map(([key, value]) => ({
81
+ index: Number.parseInt(key.split(".")[1] ?? "0", 10),
82
+ value,
83
+ }))
84
+ .sort((a, b) => a.index - b.index)
85
+ .map((item) => item.value);
86
+ const tool = raw["tool"];
87
+ if (tool !== FEEDBACK_TOOL_NAMES.BUG_REPORT &&
88
+ tool !== FEEDBACK_TOOL_NAMES.IMPROVEMENT_SUGGESTION) {
89
+ throw new Error(`Invalid feedback report tool type: ${tool ?? "unknown"}`);
90
+ }
91
+ const parsedInput = FEEDBACK_TOOL_CONTRACTS[tool].schema.parse({
92
+ title: raw["title"] ?? "",
93
+ body: raw["body"] ?? "",
94
+ evidence,
95
+ session: raw["session"] ?? "",
96
+ source: raw["source"] ?? "",
97
+ confidence: Number(raw["confidence"]),
98
+ });
99
+ return {
100
+ id: ReportIdSchema.parse(raw["id"] ?? ""),
101
+ tool,
102
+ createdAt: ISODateSchema.parse(raw["createdAt"] ?? ""),
103
+ dedupeKey: DedupeKeySchema.parse(raw["dedupeKey"] ?? ""),
104
+ ...parsedInput,
105
+ };
106
+ }
107
+ function isReportFileName(fileName) {
108
+ return /^report_[A-Za-z0-9_-]+\.kv$/.test(fileName);
109
+ }
110
+ class FeedbackReportStore {
111
+ reportsDir;
112
+ constructor(reportsDir) {
113
+ this.reportsDir = reportsDir;
114
+ }
115
+ persist(tool, input) {
116
+ const validated = validateFeedbackToolInput(tool, input);
117
+ const createdAt = new Date().toISOString();
118
+ const dedupeKey = generateFeedbackDedupeKey(tool, validated);
119
+ const id = `report_${createdAt.replace(/[:.]/g, "-")}_${randomUUID().slice(0, 8)}`;
120
+ const report = {
121
+ id,
122
+ tool,
123
+ createdAt,
124
+ dedupeKey,
125
+ ...validated,
126
+ };
127
+ mkdirSync(this.reportsDir, { recursive: true });
128
+ const filePath = join(this.reportsDir, `${id}.kv`);
129
+ atomicWriteFileSync(filePath, serializeReport(report));
130
+ return report;
131
+ }
132
+ list() {
133
+ if (!existsSync(this.reportsDir))
134
+ return [];
135
+ const reports = [];
136
+ for (const name of readdirSync(this.reportsDir)) {
137
+ if (!isReportFileName(name))
138
+ continue;
139
+ const reportPath = join(this.reportsDir, name);
140
+ try {
141
+ if (!statSync(reportPath).isFile())
142
+ continue;
143
+ }
144
+ catch {
145
+ continue;
146
+ }
147
+ try {
148
+ const content = readFileSync(reportPath, "utf-8");
149
+ const parsed = parseReportFile(content);
150
+ reports.push(parsed);
151
+ }
152
+ catch {
153
+ continue;
154
+ }
155
+ }
156
+ return reports.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
157
+ }
158
+ }
159
+
160
+ export { BugReportSchema, FEEDBACK_TOOL_CONTRACTS, FEEDBACK_TOOL_NAMES, FeedbackReportStore, ImprovementSuggestionSchema, generateFeedbackDedupeKey, validateFeedbackToolInput };
161
+ //# sourceMappingURL=feedback-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback-tools.js","sources":["../src/feedback-tools.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}