sqlew 3.2.5 → 3.6.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 (291) hide show
  1. package/CHANGELOG.md +288 -1011
  2. package/README.md +80 -263
  3. package/assets/config.example.toml +97 -0
  4. package/assets/schema.sql +6 -1
  5. package/dist/adapters/index.d.ts +11 -0
  6. package/dist/adapters/index.d.ts.map +1 -0
  7. package/dist/adapters/index.js +21 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/adapters/mysql-adapter.d.ts +31 -0
  10. package/dist/adapters/mysql-adapter.d.ts.map +1 -0
  11. package/dist/adapters/mysql-adapter.js +63 -0
  12. package/dist/adapters/mysql-adapter.js.map +1 -0
  13. package/dist/adapters/postgresql-adapter.d.ts +31 -0
  14. package/dist/adapters/postgresql-adapter.d.ts.map +1 -0
  15. package/dist/adapters/postgresql-adapter.js +63 -0
  16. package/dist/adapters/postgresql-adapter.js.map +1 -0
  17. package/dist/adapters/sqlite-adapter.d.ts +37 -0
  18. package/dist/adapters/sqlite-adapter.d.ts.map +1 -0
  19. package/dist/adapters/sqlite-adapter.js +129 -0
  20. package/dist/adapters/sqlite-adapter.js.map +1 -0
  21. package/dist/adapters/types.d.ts +33 -0
  22. package/dist/adapters/types.d.ts.map +1 -0
  23. package/dist/adapters/types.js +2 -0
  24. package/dist/adapters/types.js.map +1 -0
  25. package/dist/cli.js +55 -54
  26. package/dist/cli.js.map +1 -1
  27. package/dist/config/example-generator.d.ts +11 -0
  28. package/dist/config/example-generator.d.ts.map +1 -0
  29. package/dist/config/example-generator.js +48 -0
  30. package/dist/config/example-generator.js.map +1 -0
  31. package/dist/config/loader.d.ts +46 -0
  32. package/dist/config/loader.d.ts.map +1 -0
  33. package/dist/config/loader.js +155 -0
  34. package/dist/config/loader.js.map +1 -0
  35. package/dist/config/types.d.ts +86 -0
  36. package/dist/config/types.d.ts.map +1 -0
  37. package/dist/config/types.js +28 -0
  38. package/dist/config/types.js.map +1 -0
  39. package/dist/constants.d.ts +9 -0
  40. package/dist/constants.d.ts.map +1 -1
  41. package/dist/constants.js +10 -0
  42. package/dist/constants.js.map +1 -1
  43. package/dist/database.d.ts +44 -122
  44. package/dist/database.d.ts.map +1 -1
  45. package/dist/database.js +145 -349
  46. package/dist/database.js.map +1 -1
  47. package/dist/index.js +223 -175
  48. package/dist/index.js.map +1 -1
  49. package/dist/knexfile.d.ts +6 -0
  50. package/dist/knexfile.d.ts.map +1 -0
  51. package/dist/knexfile.js +85 -0
  52. package/dist/knexfile.js.map +1 -0
  53. package/dist/migrations/add-help-system-tables.d.ts +35 -0
  54. package/dist/migrations/add-help-system-tables.d.ts.map +1 -0
  55. package/dist/migrations/add-help-system-tables.js +206 -0
  56. package/dist/migrations/add-help-system-tables.js.map +1 -0
  57. package/dist/migrations/add-token-tracking.d.ts +28 -0
  58. package/dist/migrations/add-token-tracking.d.ts.map +1 -0
  59. package/dist/migrations/add-token-tracking.js +108 -0
  60. package/dist/migrations/add-token-tracking.js.map +1 -0
  61. package/dist/migrations/add-v3.5.0-pruned-files.d.ts +26 -0
  62. package/dist/migrations/add-v3.5.0-pruned-files.d.ts.map +1 -0
  63. package/dist/migrations/add-v3.5.0-pruned-files.js +107 -0
  64. package/dist/migrations/add-v3.5.0-pruned-files.js.map +1 -0
  65. package/dist/migrations/index.d.ts +26 -12
  66. package/dist/migrations/index.d.ts.map +1 -1
  67. package/dist/migrations/index.js +162 -20
  68. package/dist/migrations/index.js.map +1 -1
  69. package/dist/migrations/knex/20251025020452_create_master_tables.d.ts +4 -0
  70. package/dist/migrations/knex/20251025020452_create_master_tables.d.ts.map +1 -0
  71. package/dist/migrations/knex/20251025020452_create_master_tables.js +65 -0
  72. package/dist/migrations/knex/20251025020452_create_master_tables.js.map +1 -0
  73. package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts +4 -0
  74. package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts.map +1 -0
  75. package/dist/migrations/knex/20251025021152_create_transaction_tables.js +235 -0
  76. package/dist/migrations/knex/20251025021152_create_transaction_tables.js.map +1 -0
  77. package/dist/migrations/knex/20251025021351_create_indexes.d.ts +4 -0
  78. package/dist/migrations/knex/20251025021351_create_indexes.d.ts.map +1 -0
  79. package/dist/migrations/knex/20251025021351_create_indexes.js +62 -0
  80. package/dist/migrations/knex/20251025021351_create_indexes.js.map +1 -0
  81. package/dist/migrations/knex/20251025021416_seed_master_data.d.ts +4 -0
  82. package/dist/migrations/knex/20251025021416_seed_master_data.d.ts.map +1 -0
  83. package/dist/migrations/knex/20251025021416_seed_master_data.js +58 -0
  84. package/dist/migrations/knex/20251025021416_seed_master_data.js.map +1 -0
  85. package/dist/migrations/knex/20251025070349_create_views.d.ts +4 -0
  86. package/dist/migrations/knex/20251025070349_create_views.d.ts.map +1 -0
  87. package/dist/migrations/knex/20251025070349_create_views.js +143 -0
  88. package/dist/migrations/knex/20251025070349_create_views.js.map +1 -0
  89. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts +4 -0
  90. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
  91. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js +15 -0
  92. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
  93. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts +8 -0
  94. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
  95. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js +12 -0
  96. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js.map +1 -0
  97. package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts +19 -0
  98. package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts.map +1 -0
  99. package/dist/migrations/knex/20251025090000_create_help_system_tables.js +115 -0
  100. package/dist/migrations/knex/20251025090000_create_help_system_tables.js.map +1 -0
  101. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts +13 -0
  102. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
  103. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js +377 -0
  104. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
  105. package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts +15 -0
  106. package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts.map +1 -0
  107. package/dist/migrations/knex/20251025100000_seed_help_metadata.js +253 -0
  108. package/dist/migrations/knex/20251025100000_seed_help_metadata.js.map +1 -0
  109. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts +16 -0
  110. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
  111. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js +276 -0
  112. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js.map +1 -0
  113. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts +8 -0
  114. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
  115. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js +64 -0
  116. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
  117. package/dist/migrations/seed-help-data.d.ts +48 -0
  118. package/dist/migrations/seed-help-data.d.ts.map +1 -0
  119. package/dist/migrations/seed-help-data.js +1466 -0
  120. package/dist/migrations/seed-help-data.js.map +1 -0
  121. package/dist/migrations/seed-tool-metadata.d.ts +24 -0
  122. package/dist/migrations/seed-tool-metadata.d.ts.map +1 -0
  123. package/dist/migrations/seed-tool-metadata.js +392 -0
  124. package/dist/migrations/seed-tool-metadata.js.map +1 -0
  125. package/dist/migrations/v3.6.0-help-system-refactor.d.ts +46 -0
  126. package/dist/migrations/v3.6.0-help-system-refactor.d.ts.map +1 -0
  127. package/dist/migrations/v3.6.0-help-system-refactor.js +223 -0
  128. package/dist/migrations/v3.6.0-help-system-refactor.js.map +1 -0
  129. package/dist/schema.d.ts.map +1 -1
  130. package/dist/schema.js +2 -0
  131. package/dist/schema.js.map +1 -1
  132. package/dist/tests/git-aware-completion.test.d.ts +6 -0
  133. package/dist/tests/git-aware-completion.test.d.ts.map +1 -0
  134. package/dist/tests/git-aware-completion.test.js +160 -0
  135. package/dist/tests/git-aware-completion.test.js.map +1 -0
  136. package/dist/tests/help-system.test.d.ts +23 -0
  137. package/dist/tests/help-system.test.d.ts.map +1 -0
  138. package/dist/tests/help-system.test.js +374 -0
  139. package/dist/tests/help-system.test.js.map +1 -0
  140. package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts +6 -0
  141. package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts.map +1 -0
  142. package/dist/tests/tasks.auto-pruning-decision-link.test.js +264 -0
  143. package/dist/tests/tasks.auto-pruning-decision-link.test.js.map +1 -0
  144. package/dist/tests/tasks.auto-pruning-partial.test.d.ts +6 -0
  145. package/dist/tests/tasks.auto-pruning-partial.test.d.ts.map +1 -0
  146. package/dist/tests/tasks.auto-pruning-partial.test.js +285 -0
  147. package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -0
  148. package/dist/tests/tasks.auto-pruning-persistence.test.d.ts +6 -0
  149. package/dist/tests/tasks.auto-pruning-persistence.test.d.ts.map +1 -0
  150. package/dist/tests/tasks.auto-pruning-persistence.test.js +250 -0
  151. package/dist/tests/tasks.auto-pruning-persistence.test.js.map +1 -0
  152. package/dist/tests/tasks.auto-pruning-safety.test.d.ts +12 -0
  153. package/dist/tests/tasks.auto-pruning-safety.test.d.ts.map +1 -0
  154. package/dist/tests/tasks.auto-pruning-safety.test.js +217 -0
  155. package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -0
  156. package/dist/tests/tasks.dependencies.test.js +338 -307
  157. package/dist/tests/tasks.dependencies.test.js.map +1 -1
  158. package/dist/tests/tasks.link-file-backward-compat.test.d.ts +6 -0
  159. package/dist/tests/tasks.link-file-backward-compat.test.d.ts.map +1 -0
  160. package/dist/tests/tasks.link-file-backward-compat.test.js +247 -0
  161. package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -0
  162. package/dist/tests/tasks.watch-files-action.test.d.ts +6 -0
  163. package/dist/tests/tasks.watch-files-action.test.d.ts.map +1 -0
  164. package/dist/tests/tasks.watch-files-action.test.js +372 -0
  165. package/dist/tests/tasks.watch-files-action.test.js.map +1 -0
  166. package/dist/tests/tasks.watch-files-parameter.test.d.ts +6 -0
  167. package/dist/tests/tasks.watch-files-parameter.test.d.ts.map +1 -0
  168. package/dist/tests/tasks.watch-files-parameter.test.js +260 -0
  169. package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -0
  170. package/dist/tests/two-step-git-completion.test.d.ts +6 -0
  171. package/dist/tests/two-step-git-completion.test.d.ts.map +1 -0
  172. package/dist/tests/two-step-git-completion.test.js +326 -0
  173. package/dist/tests/two-step-git-completion.test.js.map +1 -0
  174. package/dist/tests/vcs-staging.test.d.ts +6 -0
  175. package/dist/tests/vcs-staging.test.d.ts.map +1 -0
  176. package/dist/tests/vcs-staging.test.js +137 -0
  177. package/dist/tests/vcs-staging.test.js.map +1 -0
  178. package/dist/tools/config.d.ts +9 -4
  179. package/dist/tools/config.d.ts.map +1 -1
  180. package/dist/tools/config.js +16 -12
  181. package/dist/tools/config.js.map +1 -1
  182. package/dist/tools/constraints.d.ts +9 -3
  183. package/dist/tools/constraints.d.ts.map +1 -1
  184. package/dist/tools/constraints.js +66 -45
  185. package/dist/tools/constraints.js.map +1 -1
  186. package/dist/tools/context.d.ts +35 -16
  187. package/dist/tools/context.d.ts.map +1 -1
  188. package/dist/tools/context.js +374 -314
  189. package/dist/tools/context.js.map +1 -1
  190. package/dist/tools/files.d.ts +11 -4
  191. package/dist/tools/files.d.ts.map +1 -1
  192. package/dist/tools/files.js +173 -91
  193. package/dist/tools/files.js.map +1 -1
  194. package/dist/tools/help-queries.d.ts +130 -0
  195. package/dist/tools/help-queries.d.ts.map +1 -0
  196. package/dist/tools/help-queries.js +393 -0
  197. package/dist/tools/help-queries.js.map +1 -0
  198. package/dist/tools/messaging.d.ts +13 -6
  199. package/dist/tools/messaging.d.ts.map +1 -1
  200. package/dist/tools/messaging.js +217 -129
  201. package/dist/tools/messaging.js.map +1 -1
  202. package/dist/tools/tasks.d.ts +42 -12
  203. package/dist/tools/tasks.d.ts.map +1 -1
  204. package/dist/tools/tasks.js +809 -347
  205. package/dist/tools/tasks.js.map +1 -1
  206. package/dist/tools/utils.d.ts +13 -5
  207. package/dist/tools/utils.d.ts.map +1 -1
  208. package/dist/tools/utils.js +92 -115
  209. package/dist/tools/utils.js.map +1 -1
  210. package/dist/types.d.ts +4 -0
  211. package/dist/types.d.ts.map +1 -1
  212. package/dist/utils/activity-logging.d.ts +114 -0
  213. package/dist/utils/activity-logging.d.ts.map +1 -0
  214. package/dist/utils/activity-logging.js +162 -0
  215. package/dist/utils/activity-logging.js.map +1 -0
  216. package/dist/utils/batch.d.ts +2 -2
  217. package/dist/utils/batch.d.ts.map +1 -1
  218. package/dist/utils/batch.js +8 -8
  219. package/dist/utils/batch.js.map +1 -1
  220. package/dist/utils/cleanup.d.ts +21 -13
  221. package/dist/utils/cleanup.d.ts.map +1 -1
  222. package/dist/utils/cleanup.js +31 -24
  223. package/dist/utils/cleanup.js.map +1 -1
  224. package/dist/utils/debug-logger.d.ts +44 -0
  225. package/dist/utils/debug-logger.d.ts.map +1 -0
  226. package/dist/utils/debug-logger.js +116 -0
  227. package/dist/utils/debug-logger.js.map +1 -0
  228. package/dist/utils/file-pruning.d.ts +69 -0
  229. package/dist/utils/file-pruning.d.ts.map +1 -0
  230. package/dist/utils/file-pruning.js +185 -0
  231. package/dist/utils/file-pruning.js.map +1 -0
  232. package/dist/utils/help-tracking.d.ts +55 -0
  233. package/dist/utils/help-tracking.d.ts.map +1 -0
  234. package/dist/utils/help-tracking.js +88 -0
  235. package/dist/utils/help-tracking.js.map +1 -0
  236. package/dist/utils/quality-checks.d.ts +60 -0
  237. package/dist/utils/quality-checks.d.ts.map +1 -0
  238. package/dist/utils/quality-checks.js +228 -0
  239. package/dist/utils/quality-checks.js.map +1 -0
  240. package/dist/utils/retention.d.ts +13 -5
  241. package/dist/utils/retention.d.ts.map +1 -1
  242. package/dist/utils/retention.js +20 -8
  243. package/dist/utils/retention.js.map +1 -1
  244. package/dist/utils/task-stale-detection.d.ts +77 -7
  245. package/dist/utils/task-stale-detection.d.ts.map +1 -1
  246. package/dist/utils/task-stale-detection.js +309 -34
  247. package/dist/utils/task-stale-detection.js.map +1 -1
  248. package/dist/utils/token-estimation.d.ts +72 -0
  249. package/dist/utils/token-estimation.d.ts.map +1 -0
  250. package/dist/utils/token-estimation.js +71 -0
  251. package/dist/utils/token-estimation.js.map +1 -0
  252. package/dist/utils/token-logging.d.ts +48 -0
  253. package/dist/utils/token-logging.d.ts.map +1 -0
  254. package/dist/utils/token-logging.js +112 -0
  255. package/dist/utils/token-logging.js.map +1 -0
  256. package/dist/utils/vcs-adapter.d.ts +68 -0
  257. package/dist/utils/vcs-adapter.d.ts.map +1 -0
  258. package/dist/utils/vcs-adapter.js +187 -0
  259. package/dist/utils/vcs-adapter.js.map +1 -0
  260. package/dist/utils/view-queries.d.ts +34 -0
  261. package/dist/utils/view-queries.d.ts.map +1 -0
  262. package/dist/utils/view-queries.js +192 -0
  263. package/dist/utils/view-queries.js.map +1 -0
  264. package/dist/watcher/file-watcher.d.ts +54 -4
  265. package/dist/watcher/file-watcher.d.ts.map +1 -1
  266. package/dist/watcher/file-watcher.js +329 -33
  267. package/dist/watcher/file-watcher.js.map +1 -1
  268. package/dist/watcher/gitignore-parser.d.ts +70 -0
  269. package/dist/watcher/gitignore-parser.d.ts.map +1 -0
  270. package/dist/watcher/gitignore-parser.js +191 -0
  271. package/dist/watcher/gitignore-parser.js.map +1 -0
  272. package/dist/watcher/index.d.ts +1 -0
  273. package/dist/watcher/index.d.ts.map +1 -1
  274. package/dist/watcher/index.js +1 -0
  275. package/dist/watcher/index.js.map +1 -1
  276. package/docs/AI_AGENT_GUIDE.md +1 -1
  277. package/docs/ARCHITECTURE.md +12 -0
  278. package/docs/AUTO_FILE_TRACKING.md +486 -82
  279. package/docs/BEST_PRACTICES.md +56 -448
  280. package/docs/CONFIGURATION.md +908 -0
  281. package/docs/GIT_AWARE_AUTO_COMPLETE.md +645 -0
  282. package/docs/MIGRATION_v3.3.md +602 -0
  283. package/docs/MIGRATION_v3.6.0.md +170 -0
  284. package/docs/SHARED_CONCEPTS.md +65 -209
  285. package/docs/TASK_ACTIONS.md +12 -0
  286. package/docs/TASK_OVERVIEW.md +125 -24
  287. package/docs/TASK_PRUNING.md +589 -0
  288. package/docs/TASK_SYSTEM.md +83 -13
  289. package/docs/TOOL_REFERENCE.md +94 -6
  290. package/docs/TOOL_SELECTION.md +41 -248
  291. package/package.json +21 -7
@@ -1,79 +1,86 @@
1
1
  /**
2
2
  * Programmatic cleanup utilities for old messages and file changes
3
3
  * Replaces the automatic triggers with weekend-aware logic
4
+ *
5
+ * CONVERTED: Using Knex.js with DatabaseAdapter (async/await)
4
6
  */
5
7
  import { calculateMessageCutoff, calculateFileChangeCutoff } from './retention.js';
6
8
  /**
7
9
  * Perform automatic cleanup of old data
8
10
  * Deletes old messages, file changes, and activity logs based on m_config settings
9
11
  *
10
- * @param db - Database instance
12
+ * @param adapter - Database adapter instance
13
+ * @param trx - Optional transaction
11
14
  * @returns Object with counts of deleted records
12
15
  */
13
- export function performAutoCleanup(db) {
14
- const messageCutoff = calculateMessageCutoff(db);
15
- const fileChangeCutoff = calculateFileChangeCutoff(db);
16
- const messagesDeleted = cleanupMessages(db, messageCutoff);
17
- const fileChangesDeleted = cleanupFileChanges(db, fileChangeCutoff);
16
+ export async function performAutoCleanup(adapter, trx) {
17
+ const messageCutoff = await calculateMessageCutoff(adapter);
18
+ const fileChangeCutoff = await calculateFileChangeCutoff(adapter);
19
+ const messagesDeleted = await cleanupMessages(adapter, messageCutoff, trx);
20
+ const fileChangesDeleted = await cleanupFileChanges(adapter, fileChangeCutoff, trx);
18
21
  // Activity log uses same retention as messages (constraint #4)
19
- const activityLogsDeleted = cleanupActivityLogs(db, messageCutoff);
22
+ const activityLogsDeleted = await cleanupActivityLogs(adapter, messageCutoff, trx);
20
23
  return { messagesDeleted, fileChangesDeleted, activityLogsDeleted };
21
24
  }
22
25
  /**
23
26
  * Delete old messages before the cutoff timestamp
24
27
  *
25
- * @param db - Database instance
28
+ * @param adapter - Database adapter instance
26
29
  * @param cutoffTimestamp - Unix timestamp (seconds) for cutoff
30
+ * @param trx - Optional transaction
27
31
  * @returns Number of messages deleted
28
32
  */
29
- export function cleanupMessages(db, cutoffTimestamp) {
30
- const result = db.prepare('DELETE FROM t_agent_messages WHERE ts < ?').run(cutoffTimestamp);
31
- return result.changes;
33
+ export async function cleanupMessages(adapter, cutoffTimestamp, trx) {
34
+ const knex = trx || adapter.getKnex();
35
+ return await knex('t_agent_messages').where('ts', '<', cutoffTimestamp).delete();
32
36
  }
33
37
  /**
34
38
  * Delete old file changes before the cutoff timestamp
35
39
  *
36
- * @param db - Database instance
40
+ * @param adapter - Database adapter instance
37
41
  * @param cutoffTimestamp - Unix timestamp (seconds) for cutoff
42
+ * @param trx - Optional transaction
38
43
  * @returns Number of file changes deleted
39
44
  */
40
- export function cleanupFileChanges(db, cutoffTimestamp) {
41
- const result = db.prepare('DELETE FROM t_file_changes WHERE ts < ?').run(cutoffTimestamp);
42
- return result.changes;
45
+ export async function cleanupFileChanges(adapter, cutoffTimestamp, trx) {
46
+ const knex = trx || adapter.getKnex();
47
+ return await knex('t_file_changes').where('ts', '<', cutoffTimestamp).delete();
43
48
  }
44
49
  /**
45
50
  * Delete old activity logs before the cutoff timestamp
46
51
  * Activity logs use the same retention as messages (constraint #4)
47
52
  *
48
- * @param db - Database instance
53
+ * @param adapter - Database adapter instance
49
54
  * @param cutoffTimestamp - Unix timestamp (seconds) for cutoff
55
+ * @param trx - Optional transaction
50
56
  * @returns Number of activity logs deleted
51
57
  */
52
- export function cleanupActivityLogs(db, cutoffTimestamp) {
53
- const result = db.prepare('DELETE FROM t_activity_log WHERE ts < ?').run(cutoffTimestamp);
54
- return result.changes;
58
+ export async function cleanupActivityLogs(adapter, cutoffTimestamp, trx) {
59
+ const knex = trx || adapter.getKnex();
60
+ return await knex('t_activity_log').where('ts', '<', cutoffTimestamp).delete();
55
61
  }
56
62
  /**
57
63
  * Cleanup with custom retention periods (overrides config)
58
64
  *
59
- * @param db - Database instance
65
+ * @param adapter - Database adapter instance
60
66
  * @param messageHours - Message retention in hours (optional)
61
67
  * @param fileChangeDays - File change retention in days (optional)
68
+ * @param trx - Optional transaction
62
69
  * @returns Object with counts of deleted records
63
70
  */
64
- export function cleanupWithCustomRetention(db, messageHours, fileChangeDays) {
71
+ export async function cleanupWithCustomRetention(adapter, messageHours, fileChangeDays, trx) {
65
72
  let messagesDeleted = 0;
66
73
  let fileChangesDeleted = 0;
67
74
  let activityLogsDeleted = 0;
68
75
  if (messageHours !== undefined) {
69
76
  const messageCutoff = Math.floor(Date.now() / 1000) - (messageHours * 3600);
70
- messagesDeleted = cleanupMessages(db, messageCutoff);
77
+ messagesDeleted = await cleanupMessages(adapter, messageCutoff, trx);
71
78
  // Activity log uses same retention as messages (constraint #4)
72
- activityLogsDeleted = cleanupActivityLogs(db, messageCutoff);
79
+ activityLogsDeleted = await cleanupActivityLogs(adapter, messageCutoff, trx);
73
80
  }
74
81
  if (fileChangeDays !== undefined) {
75
82
  const fileChangeCutoff = Math.floor(Date.now() / 1000) - (fileChangeDays * 86400);
76
- fileChangesDeleted = cleanupFileChanges(db, fileChangeCutoff);
83
+ fileChangesDeleted = await cleanupFileChanges(adapter, fileChangeCutoff, trx);
77
84
  }
78
85
  return { messagesDeleted, fileChangesDeleted, activityLogsDeleted };
79
86
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/utils/cleanup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAEnF;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAY;IAC7C,MAAM,aAAa,GAAG,sBAAsB,CAAC,EAAE,CAAC,CAAC;IACjD,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAEvD,MAAM,eAAe,GAAG,eAAe,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAC3D,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACpE,+DAA+D;IAC/D,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAEnE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC;AACtE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,EAAY,EAAE,eAAuB;IACnE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAY,EAAE,eAAuB;IACtE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC1F,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAY,EAAE,eAAuB;IACvE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC1F,OAAO,MAAM,CAAC,OAAO,CAAC;AACxB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CACxC,EAAY,EACZ,YAAqB,EACrB,cAAuB;IAEvB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,kBAAkB,GAAG,CAAC,CAAC;IAC3B,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAE5B,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;QAC5E,eAAe,GAAG,eAAe,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACrD,+DAA+D;QAC/D,mBAAmB,GAAG,mBAAmB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,GAAG,KAAK,CAAC,CAAC;QAClF,kBAAkB,GAAG,kBAAkB,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/utils/cleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Debug Logger for MCP Shared Context Server
3
+ *
4
+ * Enables debug logging when specified via CLI arg, environment variable, or config file.
5
+ * Priority: CLI arg > Environment variable > Config file
6
+ *
7
+ * Usage:
8
+ * node dist/index.js --debug-log=/path/to/debug.log
9
+ * SQLEW_DEBUG=/path/to/debug.log node dist/index.js
10
+ * OR set debug.log_path in .sqlew/config.toml
11
+ */
12
+ /**
13
+ * Initialize debug logger
14
+ * @param debugLogPath - Log path (already resolved with priority: CLI > env > config)
15
+ */
16
+ export declare function initDebugLogger(debugLogPath?: string): void;
17
+ /**
18
+ * Write debug log entry
19
+ * @param level - Log level (INFO, WARN, ERROR, DEBUG)
20
+ * @param message - Log message
21
+ * @param data - Optional data to log
22
+ */
23
+ export declare function debugLog(level: 'INFO' | 'WARN' | 'ERROR' | 'DEBUG', message: string, data?: any): void;
24
+ /**
25
+ * Log MCP tool call
26
+ */
27
+ export declare function debugLogToolCall(toolName: string, action: string, params: any): void;
28
+ /**
29
+ * Log MCP tool response
30
+ */
31
+ export declare function debugLogToolResponse(toolName: string, action: string, success: boolean, result?: any, error?: any): void;
32
+ /**
33
+ * Log error with stack trace
34
+ */
35
+ export declare function debugLogError(context: string, error: any): void;
36
+ /**
37
+ * Close debug logger
38
+ */
39
+ export declare function closeDebugLogger(): void;
40
+ /**
41
+ * Check if debug logging is enabled
42
+ */
43
+ export declare function isDebugEnabled(): boolean;
44
+ //# sourceMappingURL=debug-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-logger.d.ts","sourceRoot":"","sources":["../../src/utils/debug-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAmC3D;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAoBtG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAEpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,CAMxH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAK/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAQvC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Debug Logger for MCP Shared Context Server
3
+ *
4
+ * Enables debug logging when specified via CLI arg, environment variable, or config file.
5
+ * Priority: CLI arg > Environment variable > Config file
6
+ *
7
+ * Usage:
8
+ * node dist/index.js --debug-log=/path/to/debug.log
9
+ * SQLEW_DEBUG=/path/to/debug.log node dist/index.js
10
+ * OR set debug.log_path in .sqlew/config.toml
11
+ */
12
+ import * as fs from 'fs';
13
+ import * as path from 'path';
14
+ let debugEnabled = false;
15
+ let debugStream = null;
16
+ let currentLogPath = null;
17
+ /**
18
+ * Initialize debug logger
19
+ * @param debugLogPath - Log path (already resolved with priority: CLI > env > config)
20
+ */
21
+ export function initDebugLogger(debugLogPath) {
22
+ if (!debugLogPath) {
23
+ return;
24
+ }
25
+ currentLogPath = debugLogPath;
26
+ try {
27
+ // Ensure directory exists
28
+ const logDir = path.dirname(debugLogPath);
29
+ if (!fs.existsSync(logDir)) {
30
+ fs.mkdirSync(logDir, { recursive: true });
31
+ }
32
+ // Create write stream (append mode)
33
+ debugStream = fs.createWriteStream(debugLogPath, { flags: 'a' });
34
+ debugEnabled = true;
35
+ // Detect source (for logging purposes)
36
+ const cliArg = process.argv.find(arg => arg.startsWith('--debug-log'));
37
+ const envVar = process.env.SQLEW_DEBUG;
38
+ const source = cliArg ? 'CLI Argument' : envVar ? 'Environment Variable' : 'Config File';
39
+ const sourceDetail = cliArg ? '--debug-log' : envVar ? 'SQLEW_DEBUG' : 'debug.log_path';
40
+ debugLog('INFO', '='.repeat(80));
41
+ debugLog('INFO', `MCP Shared Context Server Debug Log Started`);
42
+ debugLog('INFO', `Timestamp: ${new Date().toISOString()}`);
43
+ debugLog('INFO', `Process ID: ${process.pid}`);
44
+ debugLog('INFO', `Debug Log Path: ${debugLogPath}`);
45
+ debugLog('INFO', `Source: ${source} (${sourceDetail})`);
46
+ debugLog('INFO', '='.repeat(80));
47
+ }
48
+ catch (error) {
49
+ console.error(`Failed to initialize debug logger: ${error}`);
50
+ debugEnabled = false;
51
+ }
52
+ }
53
+ /**
54
+ * Write debug log entry
55
+ * @param level - Log level (INFO, WARN, ERROR, DEBUG)
56
+ * @param message - Log message
57
+ * @param data - Optional data to log
58
+ */
59
+ export function debugLog(level, message, data) {
60
+ if (!debugEnabled || !debugStream) {
61
+ return;
62
+ }
63
+ const timestamp = new Date().toISOString();
64
+ let logEntry = `[${timestamp}] [${level}] ${message}`;
65
+ try {
66
+ if (data !== undefined) {
67
+ const dataStr = typeof data === 'string'
68
+ ? data
69
+ : JSON.stringify(data);
70
+ logEntry += ` | Data: ${dataStr}`;
71
+ }
72
+ debugStream.write(logEntry + '\n');
73
+ }
74
+ catch (error) {
75
+ console.error(`Failed to write debug log: ${error}`);
76
+ }
77
+ }
78
+ /**
79
+ * Log MCP tool call
80
+ */
81
+ export function debugLogToolCall(toolName, action, params) {
82
+ debugLog('DEBUG', `Tool Call: ${toolName}.${action}`, { params });
83
+ }
84
+ /**
85
+ * Log MCP tool response
86
+ */
87
+ export function debugLogToolResponse(toolName, action, success, result, error) {
88
+ debugLog(success ? 'DEBUG' : 'ERROR', `Tool Response: ${toolName}.${action} ${success ? 'SUCCESS' : 'FAILED'}`, success ? result : error);
89
+ }
90
+ /**
91
+ * Log error with stack trace
92
+ */
93
+ export function debugLogError(context, error) {
94
+ const errorMessage = error instanceof Error ? error.message : String(error);
95
+ const stack = error instanceof Error ? error.stack : undefined;
96
+ debugLog('ERROR', `${context}: ${errorMessage}`, { stack });
97
+ }
98
+ /**
99
+ * Close debug logger
100
+ */
101
+ export function closeDebugLogger() {
102
+ if (debugStream) {
103
+ debugLog('INFO', 'MCP Shared Context Server Debug Log Ended');
104
+ debugLog('INFO', '='.repeat(80));
105
+ debugStream.end();
106
+ debugStream = null;
107
+ debugEnabled = false;
108
+ }
109
+ }
110
+ /**
111
+ * Check if debug logging is enabled
112
+ */
113
+ export function isDebugEnabled() {
114
+ return debugEnabled;
115
+ }
116
+ //# sourceMappingURL=debug-logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-logger.js","sourceRoot":"","sources":["../../src/utils/debug-logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * File pruning utilities for v3.5.0 Auto-Pruning feature
3
+ * Automatically removes non-existent watched files with audit trail
4
+ */
5
+ import { Database } from '../types.js';
6
+ /**
7
+ * Prune non-existent files from a task's watch list
8
+ * Records pruned files to audit table for project archaeology
9
+ *
10
+ * Quality gate enforcement:
11
+ * - If ALL watched files are non-existent → throw error (prevents zero-work completion)
12
+ * - If SOME watched files are non-existent → prune them and continue
13
+ *
14
+ * @param db - Database instance
15
+ * @param taskId - Task ID to prune files for
16
+ * @param projectRoot - Project root directory (default: process.cwd())
17
+ * @returns Object with pruned count and remaining count
18
+ * @throws Error if ALL files are non-existent (safety check)
19
+ */
20
+ export declare function pruneNonExistentFiles(db: Database, taskId: number, projectRoot?: string): {
21
+ prunedCount: number;
22
+ remainingCount: number;
23
+ prunedPaths: string[];
24
+ };
25
+ /**
26
+ * Get pruned files for a task
27
+ *
28
+ * @param db - Database instance
29
+ * @param taskId - Task ID
30
+ * @param limit - Maximum number of records (default: 100)
31
+ * @returns Array of pruned file records
32
+ */
33
+ export declare function getPrunedFiles(db: Database, taskId: number, limit?: number): Array<{
34
+ id: number;
35
+ file_path: string;
36
+ pruned_at: string;
37
+ linked_decision: string | null;
38
+ }>;
39
+ /**
40
+ * Link a pruned file to a decision (for WHY reasoning)
41
+ *
42
+ * @param db - Database instance
43
+ * @param prunedFileId - Pruned file record ID
44
+ * @param decisionKey - Decision key to link
45
+ * @throws Error if pruned file or decision not found
46
+ */
47
+ export declare function linkPrunedFileToDecision(db: Database, prunedFileId: number, decisionKey: string): void;
48
+ /**
49
+ * Get all pruned files across all tasks (for audit purposes)
50
+ *
51
+ * @param db - Database instance
52
+ * @param filters - Optional filters
53
+ * @returns Array of pruned file records with task info
54
+ */
55
+ export declare function getAllPrunedFiles(db: Database, filters?: {
56
+ taskId?: number;
57
+ linkedDecision?: string;
58
+ since?: number;
59
+ limit?: number;
60
+ offset?: number;
61
+ }): Array<{
62
+ id: number;
63
+ task_id: number;
64
+ task_title: string;
65
+ file_path: string;
66
+ pruned_at: string;
67
+ linked_decision: string | null;
68
+ }>;
69
+ //# sourceMappingURL=file-pruning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-pruning.d.ts","sourceRoot":"","sources":["../../src/utils/file-pruning.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIvC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,GAAE,MAAsB,GAClC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAoExE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAY,GAClB,KAAK,CAAC;IACP,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC,CAoBD;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,QAAQ,EACZ,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,IAAI,CAiCN;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,EACZ,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,KAAK,CAAC;IACP,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC,CAoDD"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * File pruning utilities for v3.5.0 Auto-Pruning feature
3
+ * Automatically removes non-existent watched files with audit trail
4
+ */
5
+ import { existsSync } from 'fs';
6
+ import { join } from 'path';
7
+ /**
8
+ * Prune non-existent files from a task's watch list
9
+ * Records pruned files to audit table for project archaeology
10
+ *
11
+ * Quality gate enforcement:
12
+ * - If ALL watched files are non-existent → throw error (prevents zero-work completion)
13
+ * - If SOME watched files are non-existent → prune them and continue
14
+ *
15
+ * @param db - Database instance
16
+ * @param taskId - Task ID to prune files for
17
+ * @param projectRoot - Project root directory (default: process.cwd())
18
+ * @returns Object with pruned count and remaining count
19
+ * @throws Error if ALL files are non-existent (safety check)
20
+ */
21
+ export function pruneNonExistentFiles(db, taskId, projectRoot = process.cwd()) {
22
+ // 1. Get all watched files for this task
23
+ const watchedFiles = db.prepare(`
24
+ SELECT f.id as file_id, f.path
25
+ FROM t_task_file_links tfl
26
+ JOIN m_files f ON tfl.file_id = f.id
27
+ WHERE tfl.task_id = ?
28
+ `).all(taskId);
29
+ if (watchedFiles.length === 0) {
30
+ // No watched files - nothing to prune
31
+ return { prunedCount: 0, remainingCount: 0, prunedPaths: [] };
32
+ }
33
+ // 2. Check which files exist on filesystem
34
+ const existingFiles = [];
35
+ const nonExistentFiles = [];
36
+ for (const file of watchedFiles) {
37
+ const fullPath = join(projectRoot, file.path);
38
+ if (existsSync(fullPath)) {
39
+ existingFiles.push(file);
40
+ }
41
+ else {
42
+ nonExistentFiles.push(file);
43
+ }
44
+ }
45
+ // 3. Safety check: If ALL files are non-existent, block the operation
46
+ if (nonExistentFiles.length === watchedFiles.length) {
47
+ throw new Error(`Cannot prune files for task #${taskId}: ALL ${watchedFiles.length} watched files are non-existent. ` +
48
+ `This indicates no work was done. Please verify watched files or mark task as invalid.`);
49
+ }
50
+ // 4. If no files need pruning, return early
51
+ if (nonExistentFiles.length === 0) {
52
+ return {
53
+ prunedCount: 0,
54
+ remainingCount: watchedFiles.length,
55
+ prunedPaths: [],
56
+ };
57
+ }
58
+ // 5. Prune non-existent files in a transaction
59
+ db.transaction(() => {
60
+ const insertPruned = db.prepare(`
61
+ INSERT INTO t_task_pruned_files (task_id, file_path, pruned_ts)
62
+ VALUES (?, ?, unixepoch())
63
+ `);
64
+ const deleteLink = db.prepare(`
65
+ DELETE FROM t_task_file_links
66
+ WHERE task_id = ? AND file_id = ?
67
+ `);
68
+ // Record each pruned file to audit table and remove link
69
+ for (const file of nonExistentFiles) {
70
+ insertPruned.run(taskId, file.path);
71
+ deleteLink.run(taskId, file.file_id);
72
+ }
73
+ })();
74
+ return {
75
+ prunedCount: nonExistentFiles.length,
76
+ remainingCount: existingFiles.length,
77
+ prunedPaths: nonExistentFiles.map(f => f.path),
78
+ };
79
+ }
80
+ /**
81
+ * Get pruned files for a task
82
+ *
83
+ * @param db - Database instance
84
+ * @param taskId - Task ID
85
+ * @param limit - Maximum number of records (default: 100)
86
+ * @returns Array of pruned file records
87
+ */
88
+ export function getPrunedFiles(db, taskId, limit = 100) {
89
+ const rows = db.prepare(`
90
+ SELECT
91
+ tpf.id,
92
+ tpf.file_path,
93
+ datetime(tpf.pruned_ts, 'unixepoch') as pruned_at,
94
+ k.key as linked_decision
95
+ FROM t_task_pruned_files tpf
96
+ LEFT JOIN m_context_keys k ON tpf.linked_decision_key_id = k.id
97
+ WHERE tpf.task_id = ?
98
+ ORDER BY tpf.pruned_ts DESC
99
+ LIMIT ?
100
+ `).all(taskId, limit);
101
+ return rows;
102
+ }
103
+ /**
104
+ * Link a pruned file to a decision (for WHY reasoning)
105
+ *
106
+ * @param db - Database instance
107
+ * @param prunedFileId - Pruned file record ID
108
+ * @param decisionKey - Decision key to link
109
+ * @throws Error if pruned file or decision not found
110
+ */
111
+ export function linkPrunedFileToDecision(db, prunedFileId, decisionKey) {
112
+ // 1. Get decision key_id
113
+ const decision = db.prepare(`
114
+ SELECT k.id as key_id
115
+ FROM m_context_keys k
116
+ WHERE k.key = ? AND EXISTS (
117
+ SELECT 1 FROM t_decisions d WHERE d.key_id = k.id
118
+ )
119
+ `).get(decisionKey);
120
+ if (!decision) {
121
+ throw new Error(`Decision not found: ${decisionKey}`);
122
+ }
123
+ // 2. Check if pruned file exists
124
+ const prunedFile = db.prepare(`
125
+ SELECT id FROM t_task_pruned_files WHERE id = ?
126
+ `).get(prunedFileId);
127
+ if (!prunedFile) {
128
+ throw new Error(`Pruned file record not found: ${prunedFileId}`);
129
+ }
130
+ // 3. Update the link
131
+ const result = db.prepare(`
132
+ UPDATE t_task_pruned_files
133
+ SET linked_decision_key_id = ?
134
+ WHERE id = ?
135
+ `).run(decision.key_id, prunedFileId);
136
+ if (result.changes === 0) {
137
+ throw new Error(`Failed to link pruned file #${prunedFileId} to decision ${decisionKey}`);
138
+ }
139
+ }
140
+ /**
141
+ * Get all pruned files across all tasks (for audit purposes)
142
+ *
143
+ * @param db - Database instance
144
+ * @param filters - Optional filters
145
+ * @returns Array of pruned file records with task info
146
+ */
147
+ export function getAllPrunedFiles(db, filters) {
148
+ let query = `
149
+ SELECT
150
+ tpf.id,
151
+ tpf.task_id,
152
+ t.title as task_title,
153
+ tpf.file_path,
154
+ datetime(tpf.pruned_ts, 'unixepoch') as pruned_at,
155
+ k.key as linked_decision
156
+ FROM t_task_pruned_files tpf
157
+ JOIN t_tasks t ON tpf.task_id = t.id
158
+ LEFT JOIN m_context_keys k ON tpf.linked_decision_key_id = k.id
159
+ WHERE 1=1
160
+ `;
161
+ const params = [];
162
+ if (filters?.taskId !== undefined) {
163
+ query += ' AND tpf.task_id = ?';
164
+ params.push(filters.taskId);
165
+ }
166
+ if (filters?.linkedDecision) {
167
+ query += ' AND k.key = ?';
168
+ params.push(filters.linkedDecision);
169
+ }
170
+ if (filters?.since !== undefined) {
171
+ query += ' AND tpf.pruned_ts >= ?';
172
+ params.push(filters.since);
173
+ }
174
+ query += ' ORDER BY tpf.pruned_ts DESC';
175
+ if (filters?.limit) {
176
+ query += ' LIMIT ?';
177
+ params.push(filters.limit);
178
+ }
179
+ if (filters?.offset) {
180
+ query += ' OFFSET ?';
181
+ params.push(filters.offset);
182
+ }
183
+ return db.prepare(query).all(...params);
184
+ }
185
+ //# sourceMappingURL=file-pruning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-pruning.js","sourceRoot":"","sources":["../../src/utils/file-pruning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Help Action Usage Tracking
3
+ *
4
+ * Lightweight logging system to track help/example action invocations
5
+ * for understanding usage patterns and optimizing documentation.
6
+ *
7
+ * Data collected:
8
+ * - tool_name: Which MCP tool invoked help/example
9
+ * - action_name: "help" or "example"
10
+ * - timestamp: When the action was invoked
11
+ * - token_count: Estimated tokens in request + response
12
+ *
13
+ * Storage: Temporary log file in .sqlew/tmp/help-usage.log
14
+ * Format: JSON lines (one JSON object per line for easy parsing)
15
+ * Retention: Manual cleanup after 1-2 week analysis period
16
+ */
17
+ /**
18
+ * Help action invocation record
19
+ */
20
+ export interface HelpUsageRecord {
21
+ tool_name: string;
22
+ action_name: 'help' | 'example';
23
+ timestamp: string;
24
+ token_count: number;
25
+ context?: string;
26
+ }
27
+ /**
28
+ * Log a help action invocation
29
+ * Appends JSON line to log file for analysis
30
+ *
31
+ * @param record - Help usage record to log
32
+ */
33
+ export declare function logHelpUsage(record: HelpUsageRecord): void;
34
+ /**
35
+ * Estimate token count for help/example action
36
+ * Rough estimation based on response length
37
+ *
38
+ * @param toolName - Name of the MCP tool
39
+ * @param actionName - "help" or "example"
40
+ * @param responseLength - Length of response text
41
+ * @returns Estimated token count (request + response)
42
+ */
43
+ export declare function estimateHelpTokens(toolName: string, actionName: 'help' | 'example', responseLength: number): number;
44
+ /**
45
+ * Track help action and return the help content
46
+ * Convenience wrapper that logs and returns content
47
+ *
48
+ * @param toolName - Name of the MCP tool
49
+ * @param actionName - "help" or "example"
50
+ * @param content - Help content to return
51
+ * @param context - Optional context about what triggered help
52
+ * @returns The help content (pass-through)
53
+ */
54
+ export declare function trackAndReturnHelp(toolName: string, actionName: 'help' | 'example', content: string, context?: string): string;
55
+ //# sourceMappingURL=help-tracking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-tracking.d.ts","sourceRoot":"","sources":["../../src/utils/help-tracking.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAW1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,cAAc,EAAE,MAAM,GACrB,MAAM,CAQR;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAYR"}