sqlew 3.5.3 → 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 (227) hide show
  1. package/CHANGELOG.md +247 -1772
  2. package/README.md +70 -304
  3. package/assets/config.example.toml +97 -0
  4. package/dist/adapters/index.d.ts +11 -0
  5. package/dist/adapters/index.d.ts.map +1 -0
  6. package/dist/adapters/index.js +21 -0
  7. package/dist/adapters/index.js.map +1 -0
  8. package/dist/adapters/mysql-adapter.d.ts +31 -0
  9. package/dist/adapters/mysql-adapter.d.ts.map +1 -0
  10. package/dist/adapters/mysql-adapter.js +63 -0
  11. package/dist/adapters/mysql-adapter.js.map +1 -0
  12. package/dist/adapters/postgresql-adapter.d.ts +31 -0
  13. package/dist/adapters/postgresql-adapter.d.ts.map +1 -0
  14. package/dist/adapters/postgresql-adapter.js +63 -0
  15. package/dist/adapters/postgresql-adapter.js.map +1 -0
  16. package/dist/adapters/sqlite-adapter.d.ts +37 -0
  17. package/dist/adapters/sqlite-adapter.d.ts.map +1 -0
  18. package/dist/adapters/sqlite-adapter.js +129 -0
  19. package/dist/adapters/sqlite-adapter.js.map +1 -0
  20. package/dist/adapters/types.d.ts +33 -0
  21. package/dist/adapters/types.d.ts.map +1 -0
  22. package/dist/adapters/types.js +2 -0
  23. package/dist/adapters/types.js.map +1 -0
  24. package/dist/cli.js +55 -54
  25. package/dist/cli.js.map +1 -1
  26. package/dist/config/example-generator.d.ts +11 -0
  27. package/dist/config/example-generator.d.ts.map +1 -0
  28. package/dist/config/example-generator.js +48 -0
  29. package/dist/config/example-generator.js.map +1 -0
  30. package/dist/config/loader.d.ts.map +1 -1
  31. package/dist/config/loader.js +4 -0
  32. package/dist/config/loader.js.map +1 -1
  33. package/dist/config/types.d.ts +9 -0
  34. package/dist/config/types.d.ts.map +1 -1
  35. package/dist/config/types.js.map +1 -1
  36. package/dist/database.d.ts +44 -122
  37. package/dist/database.d.ts.map +1 -1
  38. package/dist/database.js +145 -416
  39. package/dist/database.js.map +1 -1
  40. package/dist/index.js +215 -185
  41. package/dist/index.js.map +1 -1
  42. package/dist/knexfile.d.ts +6 -0
  43. package/dist/knexfile.d.ts.map +1 -0
  44. package/dist/knexfile.js +85 -0
  45. package/dist/knexfile.js.map +1 -0
  46. package/dist/migrations/add-help-system-tables.d.ts +35 -0
  47. package/dist/migrations/add-help-system-tables.d.ts.map +1 -0
  48. package/dist/migrations/add-help-system-tables.js +206 -0
  49. package/dist/migrations/add-help-system-tables.js.map +1 -0
  50. package/dist/migrations/add-token-tracking.d.ts +28 -0
  51. package/dist/migrations/add-token-tracking.d.ts.map +1 -0
  52. package/dist/migrations/add-token-tracking.js +108 -0
  53. package/dist/migrations/add-token-tracking.js.map +1 -0
  54. package/dist/migrations/index.d.ts +25 -12
  55. package/dist/migrations/index.d.ts.map +1 -1
  56. package/dist/migrations/index.js +147 -20
  57. package/dist/migrations/index.js.map +1 -1
  58. package/dist/migrations/knex/20251025020452_create_master_tables.d.ts +4 -0
  59. package/dist/migrations/knex/20251025020452_create_master_tables.d.ts.map +1 -0
  60. package/dist/migrations/knex/20251025020452_create_master_tables.js +65 -0
  61. package/dist/migrations/knex/20251025020452_create_master_tables.js.map +1 -0
  62. package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts +4 -0
  63. package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts.map +1 -0
  64. package/dist/migrations/knex/20251025021152_create_transaction_tables.js +235 -0
  65. package/dist/migrations/knex/20251025021152_create_transaction_tables.js.map +1 -0
  66. package/dist/migrations/knex/20251025021351_create_indexes.d.ts +4 -0
  67. package/dist/migrations/knex/20251025021351_create_indexes.d.ts.map +1 -0
  68. package/dist/migrations/knex/20251025021351_create_indexes.js +62 -0
  69. package/dist/migrations/knex/20251025021351_create_indexes.js.map +1 -0
  70. package/dist/migrations/knex/20251025021416_seed_master_data.d.ts +4 -0
  71. package/dist/migrations/knex/20251025021416_seed_master_data.d.ts.map +1 -0
  72. package/dist/migrations/knex/20251025021416_seed_master_data.js +58 -0
  73. package/dist/migrations/knex/20251025021416_seed_master_data.js.map +1 -0
  74. package/dist/migrations/knex/20251025070349_create_views.d.ts +4 -0
  75. package/dist/migrations/knex/20251025070349_create_views.d.ts.map +1 -0
  76. package/dist/migrations/knex/20251025070349_create_views.js +143 -0
  77. package/dist/migrations/knex/20251025070349_create_views.js.map +1 -0
  78. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts +4 -0
  79. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
  80. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js +15 -0
  81. package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
  82. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts +8 -0
  83. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
  84. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js +12 -0
  85. package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js.map +1 -0
  86. package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts +19 -0
  87. package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts.map +1 -0
  88. package/dist/migrations/knex/20251025090000_create_help_system_tables.js +115 -0
  89. package/dist/migrations/knex/20251025090000_create_help_system_tables.js.map +1 -0
  90. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts +13 -0
  91. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
  92. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js +377 -0
  93. package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
  94. package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts +15 -0
  95. package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts.map +1 -0
  96. package/dist/migrations/knex/20251025100000_seed_help_metadata.js +253 -0
  97. package/dist/migrations/knex/20251025100000_seed_help_metadata.js.map +1 -0
  98. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts +16 -0
  99. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
  100. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js +276 -0
  101. package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js.map +1 -0
  102. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts +8 -0
  103. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
  104. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js +64 -0
  105. package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
  106. package/dist/migrations/seed-help-data.d.ts +48 -0
  107. package/dist/migrations/seed-help-data.d.ts.map +1 -0
  108. package/dist/migrations/seed-help-data.js +1466 -0
  109. package/dist/migrations/seed-help-data.js.map +1 -0
  110. package/dist/migrations/seed-tool-metadata.d.ts +24 -0
  111. package/dist/migrations/seed-tool-metadata.d.ts.map +1 -0
  112. package/dist/migrations/seed-tool-metadata.js +392 -0
  113. package/dist/migrations/seed-tool-metadata.js.map +1 -0
  114. package/dist/migrations/v3.6.0-help-system-refactor.d.ts +46 -0
  115. package/dist/migrations/v3.6.0-help-system-refactor.d.ts.map +1 -0
  116. package/dist/migrations/v3.6.0-help-system-refactor.js +223 -0
  117. package/dist/migrations/v3.6.0-help-system-refactor.js.map +1 -0
  118. package/dist/schema.d.ts.map +1 -1
  119. package/dist/schema.js +2 -0
  120. package/dist/schema.js.map +1 -1
  121. package/dist/tests/git-aware-completion.test.js +89 -70
  122. package/dist/tests/git-aware-completion.test.js.map +1 -1
  123. package/dist/tests/help-system.test.d.ts +23 -0
  124. package/dist/tests/help-system.test.d.ts.map +1 -0
  125. package/dist/tests/help-system.test.js +374 -0
  126. package/dist/tests/help-system.test.js.map +1 -0
  127. package/dist/tests/tasks.auto-pruning-decision-link.test.js +92 -78
  128. package/dist/tests/tasks.auto-pruning-decision-link.test.js.map +1 -1
  129. package/dist/tests/tasks.auto-pruning-partial.test.js +106 -95
  130. package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -1
  131. package/dist/tests/tasks.auto-pruning-persistence.test.js +115 -97
  132. package/dist/tests/tasks.auto-pruning-persistence.test.js.map +1 -1
  133. package/dist/tests/tasks.auto-pruning-safety.test.js +124 -103
  134. package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -1
  135. package/dist/tests/tasks.dependencies.test.js +338 -307
  136. package/dist/tests/tasks.dependencies.test.js.map +1 -1
  137. package/dist/tests/tasks.link-file-backward-compat.test.js +116 -104
  138. package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -1
  139. package/dist/tests/tasks.watch-files-action.test.js +122 -101
  140. package/dist/tests/tasks.watch-files-action.test.js.map +1 -1
  141. package/dist/tests/tasks.watch-files-parameter.test.js +105 -94
  142. package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -1
  143. package/dist/tests/two-step-git-completion.test.js +176 -133
  144. package/dist/tests/two-step-git-completion.test.js.map +1 -1
  145. package/dist/tests/vcs-staging.test.js +1 -1
  146. package/dist/tests/vcs-staging.test.js.map +1 -1
  147. package/dist/tools/config.d.ts +9 -6
  148. package/dist/tools/config.d.ts.map +1 -1
  149. package/dist/tools/config.js +16 -14
  150. package/dist/tools/config.js.map +1 -1
  151. package/dist/tools/constraints.d.ts +10 -7
  152. package/dist/tools/constraints.d.ts.map +1 -1
  153. package/dist/tools/constraints.js +66 -48
  154. package/dist/tools/constraints.js.map +1 -1
  155. package/dist/tools/context.d.ts +36 -33
  156. package/dist/tools/context.d.ts.map +1 -1
  157. package/dist/tools/context.js +374 -330
  158. package/dist/tools/context.js.map +1 -1
  159. package/dist/tools/files.d.ts +12 -9
  160. package/dist/tools/files.d.ts.map +1 -1
  161. package/dist/tools/files.js +173 -95
  162. package/dist/tools/files.js.map +1 -1
  163. package/dist/tools/help-queries.d.ts +130 -0
  164. package/dist/tools/help-queries.d.ts.map +1 -0
  165. package/dist/tools/help-queries.js +393 -0
  166. package/dist/tools/help-queries.js.map +1 -0
  167. package/dist/tools/messaging.d.ts +14 -11
  168. package/dist/tools/messaging.d.ts.map +1 -1
  169. package/dist/tools/messaging.js +217 -133
  170. package/dist/tools/messaging.js.map +1 -1
  171. package/dist/tools/tasks.d.ts +18 -16
  172. package/dist/tools/tasks.d.ts.map +1 -1
  173. package/dist/tools/tasks.js +513 -439
  174. package/dist/tools/tasks.js.map +1 -1
  175. package/dist/tools/utils.d.ts +14 -11
  176. package/dist/tools/utils.d.ts.map +1 -1
  177. package/dist/tools/utils.js +86 -121
  178. package/dist/tools/utils.js.map +1 -1
  179. package/dist/utils/activity-logging.d.ts +114 -0
  180. package/dist/utils/activity-logging.d.ts.map +1 -0
  181. package/dist/utils/activity-logging.js +162 -0
  182. package/dist/utils/activity-logging.js.map +1 -0
  183. package/dist/utils/batch.d.ts +2 -2
  184. package/dist/utils/batch.d.ts.map +1 -1
  185. package/dist/utils/batch.js +8 -8
  186. package/dist/utils/batch.js.map +1 -1
  187. package/dist/utils/cleanup.d.ts +21 -13
  188. package/dist/utils/cleanup.d.ts.map +1 -1
  189. package/dist/utils/cleanup.js +31 -24
  190. package/dist/utils/cleanup.js.map +1 -1
  191. package/dist/utils/debug-logger.d.ts +44 -0
  192. package/dist/utils/debug-logger.d.ts.map +1 -0
  193. package/dist/utils/debug-logger.js +116 -0
  194. package/dist/utils/debug-logger.js.map +1 -0
  195. package/dist/utils/help-tracking.d.ts +55 -0
  196. package/dist/utils/help-tracking.d.ts.map +1 -0
  197. package/dist/utils/help-tracking.js +88 -0
  198. package/dist/utils/help-tracking.js.map +1 -0
  199. package/dist/utils/retention.d.ts +7 -7
  200. package/dist/utils/retention.d.ts.map +1 -1
  201. package/dist/utils/retention.js +12 -12
  202. package/dist/utils/retention.js.map +1 -1
  203. package/dist/utils/task-stale-detection.d.ts +15 -13
  204. package/dist/utils/task-stale-detection.d.ts.map +1 -1
  205. package/dist/utils/task-stale-detection.js +100 -302
  206. package/dist/utils/task-stale-detection.js.map +1 -1
  207. package/dist/utils/token-estimation.d.ts +72 -0
  208. package/dist/utils/token-estimation.d.ts.map +1 -0
  209. package/dist/utils/token-estimation.js +71 -0
  210. package/dist/utils/token-estimation.js.map +1 -0
  211. package/dist/utils/token-logging.d.ts +48 -0
  212. package/dist/utils/token-logging.d.ts.map +1 -0
  213. package/dist/utils/token-logging.js +112 -0
  214. package/dist/utils/token-logging.js.map +1 -0
  215. package/dist/utils/view-queries.d.ts +34 -0
  216. package/dist/utils/view-queries.d.ts.map +1 -0
  217. package/dist/utils/view-queries.js +192 -0
  218. package/dist/utils/view-queries.js.map +1 -0
  219. package/dist/watcher/file-watcher.d.ts.map +1 -1
  220. package/dist/watcher/file-watcher.js +25 -11
  221. package/dist/watcher/file-watcher.js.map +1 -1
  222. package/docs/BEST_PRACTICES.md +56 -448
  223. package/docs/MIGRATION_v3.6.0.md +170 -0
  224. package/docs/SHARED_CONCEPTS.md +63 -208
  225. package/docs/TASK_OVERVIEW.md +2 -2
  226. package/docs/TOOL_SELECTION.md +41 -248
  227. package/package.json +16 -4
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Token Estimation Utility
3
+ *
4
+ * Provides token count estimation for help system responses.
5
+ * Uses a simple heuristic: ~4 characters per token (GPT-style tokenization)
6
+ *
7
+ * This is an approximation for measuring token efficiency gains.
8
+ * Actual token counts may vary based on tokenizer used.
9
+ */
10
+ /**
11
+ * Estimate token count for a string or object
12
+ *
13
+ * @param data - String or object to estimate token count for
14
+ * @returns Estimated token count
15
+ */
16
+ export function estimateTokens(data) {
17
+ let text;
18
+ if (typeof data === 'string') {
19
+ text = data;
20
+ }
21
+ else {
22
+ // Convert object to JSON string
23
+ text = JSON.stringify(data);
24
+ }
25
+ // Simple heuristic: ~4 characters per token
26
+ // This is a conservative estimate for GPT-style tokenization
27
+ const charCount = text.length;
28
+ const tokenCount = Math.ceil(charCount / 4);
29
+ return tokenCount;
30
+ }
31
+ /**
32
+ * Add token metadata to response object
33
+ *
34
+ * @param data - Response data
35
+ * @returns Response with token metadata
36
+ */
37
+ export function addTokenMetadata(data) {
38
+ const estimated_tokens = estimateTokens(data);
39
+ const actual_chars = JSON.stringify(data).length;
40
+ return {
41
+ ...data,
42
+ _token_info: {
43
+ estimated_tokens,
44
+ actual_chars
45
+ }
46
+ };
47
+ }
48
+ /**
49
+ * Token ranges for different query types
50
+ */
51
+ export const TOKEN_RANGES = {
52
+ help_action: { min: 50, max: 100, legacy: 2000 },
53
+ help_params: { min: 30, max: 80, legacy: 1500 },
54
+ help_tool: { min: 100, max: 200, legacy: 5000 },
55
+ help_use_case: { min: 150, max: 200, legacy: 300 },
56
+ help_list_use_cases: { min: 100, max: 300, legacy: 500 },
57
+ help_next_actions: { min: 30, max: 50, legacy: 100 }
58
+ };
59
+ /**
60
+ * Calculate token efficiency percentage
61
+ *
62
+ * @param current - Current token count
63
+ * @param legacy - Legacy token count
64
+ * @returns Efficiency gain percentage
65
+ */
66
+ export function calculateEfficiencyGain(current, legacy) {
67
+ if (legacy === 0)
68
+ return 0;
69
+ return Math.round((1 - current / legacy) * 100);
70
+ }
71
+ //# sourceMappingURL=token-estimation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimation.js","sourceRoot":"","sources":["../../src/utils/token-estimation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAAqB;IAClD,IAAI,IAAY,CAAC;IAEjB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,GAAG,IAAI,CAAC;IACd,CAAC;SAAM,CAAC;QACN,gCAAgC;QAChC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED,4CAA4C;IAC5C,6DAA6D;IAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAE5C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAmB,IAAO;IACxD,MAAM,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IAEjD,OAAO;QACL,GAAG,IAAI;QACP,WAAW,EAAE;YACX,gBAAgB;YAChB,YAAY;SACb;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAChD,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IAC/C,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAC/C,aAAa,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IAClD,mBAAmB,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IACxD,iBAAiB,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;CAC5C,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,MAAc;IACrE,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3B,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Token Logging Utility
3
+ *
4
+ * Logs token usage to database for measuring help system efficiency.
5
+ */
6
+ import { Database } from 'better-sqlite3';
7
+ export interface TokenLogEntry {
8
+ query_type: string;
9
+ tool_name?: string;
10
+ action_name?: string;
11
+ estimated_tokens: number;
12
+ actual_chars: number;
13
+ }
14
+ /**
15
+ * Log token usage to database
16
+ *
17
+ * @param db - Database connection
18
+ * @param entry - Token log entry
19
+ */
20
+ export declare function logTokenUsage(db: Database, entry: TokenLogEntry): void;
21
+ /**
22
+ * Get token usage statistics for a query type
23
+ *
24
+ * @param db - Database connection
25
+ * @param query_type - Type of query
26
+ * @returns Statistics object
27
+ */
28
+ export declare function getTokenStats(db: Database, query_type: string): {
29
+ total_queries: number;
30
+ avg_tokens: number;
31
+ min_tokens: number;
32
+ max_tokens: number;
33
+ total_tokens: number;
34
+ } | null;
35
+ /**
36
+ * Get all token usage statistics
37
+ *
38
+ * @param db - Database connection
39
+ * @returns Map of query type to statistics
40
+ */
41
+ export declare function getAllTokenStats(db: Database): Map<string, {
42
+ total_queries: number;
43
+ avg_tokens: number;
44
+ min_tokens: number;
45
+ max_tokens: number;
46
+ total_tokens: number;
47
+ }>;
48
+ //# sourceMappingURL=token-logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-logging.d.ts","sourceRoot":"","sources":["../../src/utils/token-logging.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI,CA8BtE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG;IAC/D,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,IAAI,CA0CP;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE;IAC1D,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CA8CD"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Token Logging Utility
3
+ *
4
+ * Logs token usage to database for measuring help system efficiency.
5
+ */
6
+ /**
7
+ * Log token usage to database
8
+ *
9
+ * @param db - Database connection
10
+ * @param entry - Token log entry
11
+ */
12
+ export function logTokenUsage(db, entry) {
13
+ try {
14
+ // Check if table exists (migration may not have run yet)
15
+ const tableExists = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='t_help_token_usage'").get();
16
+ if (!tableExists) {
17
+ // Silently skip if table doesn't exist
18
+ return;
19
+ }
20
+ const stmt = db.prepare(`
21
+ INSERT INTO t_help_token_usage
22
+ (query_type, tool_name, action_name, estimated_tokens, actual_chars)
23
+ VALUES
24
+ (?, ?, ?, ?, ?)
25
+ `);
26
+ stmt.run(entry.query_type, entry.tool_name || null, entry.action_name || null, entry.estimated_tokens, entry.actual_chars);
27
+ }
28
+ catch (error) {
29
+ // Silently fail - logging should not break functionality
30
+ console.error('Warning: Failed to log token usage:', error instanceof Error ? error.message : String(error));
31
+ }
32
+ }
33
+ /**
34
+ * Get token usage statistics for a query type
35
+ *
36
+ * @param db - Database connection
37
+ * @param query_type - Type of query
38
+ * @returns Statistics object
39
+ */
40
+ export function getTokenStats(db, query_type) {
41
+ try {
42
+ const tableExists = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='t_help_token_usage'").get();
43
+ if (!tableExists) {
44
+ return null;
45
+ }
46
+ const result = db.prepare(`
47
+ SELECT
48
+ COUNT(*) as total_queries,
49
+ AVG(estimated_tokens) as avg_tokens,
50
+ MIN(estimated_tokens) as min_tokens,
51
+ MAX(estimated_tokens) as max_tokens,
52
+ SUM(estimated_tokens) as total_tokens
53
+ FROM t_help_token_usage
54
+ WHERE query_type = ?
55
+ `).get(query_type);
56
+ if (!result || result.total_queries === 0) {
57
+ return null;
58
+ }
59
+ return {
60
+ total_queries: result.total_queries,
61
+ avg_tokens: Math.round(result.avg_tokens),
62
+ min_tokens: result.min_tokens,
63
+ max_tokens: result.max_tokens,
64
+ total_tokens: result.total_tokens
65
+ };
66
+ }
67
+ catch (error) {
68
+ console.error('Warning: Failed to get token stats:', error instanceof Error ? error.message : String(error));
69
+ return null;
70
+ }
71
+ }
72
+ /**
73
+ * Get all token usage statistics
74
+ *
75
+ * @param db - Database connection
76
+ * @returns Map of query type to statistics
77
+ */
78
+ export function getAllTokenStats(db) {
79
+ const stats = new Map();
80
+ try {
81
+ const tableExists = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='t_help_token_usage'").get();
82
+ if (!tableExists) {
83
+ return stats;
84
+ }
85
+ const results = db.prepare(`
86
+ SELECT
87
+ query_type,
88
+ COUNT(*) as total_queries,
89
+ AVG(estimated_tokens) as avg_tokens,
90
+ MIN(estimated_tokens) as min_tokens,
91
+ MAX(estimated_tokens) as max_tokens,
92
+ SUM(estimated_tokens) as total_tokens
93
+ FROM t_help_token_usage
94
+ GROUP BY query_type
95
+ ORDER BY query_type
96
+ `).all();
97
+ for (const row of results) {
98
+ stats.set(row.query_type, {
99
+ total_queries: row.total_queries,
100
+ avg_tokens: Math.round(row.avg_tokens),
101
+ min_tokens: row.min_tokens,
102
+ max_tokens: row.max_tokens,
103
+ total_tokens: row.total_tokens
104
+ });
105
+ }
106
+ }
107
+ catch (error) {
108
+ console.error('Warning: Failed to get all token stats:', error instanceof Error ? error.message : String(error));
109
+ }
110
+ return stats;
111
+ }
112
+ //# sourceMappingURL=token-logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-logging.js","sourceRoot":"","sources":["../../src/utils/token-logging.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { Knex } from 'knex';
2
+ /**
3
+ * View query functions - replacements for SQL views
4
+ * These provide portable query builders that work across databases
5
+ */
6
+ /**
7
+ * v_tagged_decisions - Decisions with metadata (tags, layers, scopes)
8
+ */
9
+ export declare function getTaggedDecisions(knex: Knex): Promise<any[]>;
10
+ /**
11
+ * v_active_context - Recently active decisions (last hour)
12
+ */
13
+ export declare function getActiveContext(knex: Knex): Promise<any[]>;
14
+ /**
15
+ * v_layer_summary - Aggregated stats per layer
16
+ */
17
+ export declare function getLayerSummary(knex: Knex): Promise<any[]>;
18
+ /**
19
+ * v_unread_messages_by_priority - Unread messages grouped by priority
20
+ */
21
+ export declare function getUnreadMessagesByPriority(knex: Knex): Promise<any[]>;
22
+ /**
23
+ * v_recent_file_changes - Recent file changes with layer info
24
+ */
25
+ export declare function getRecentFileChanges(knex: Knex): Promise<any[]>;
26
+ /**
27
+ * v_tagged_constraints - Active constraints with tags
28
+ */
29
+ export declare function getTaggedConstraints(knex: Knex): Promise<any[]>;
30
+ /**
31
+ * v_task_board - Metadata-only task queries (v3.0.0)
32
+ */
33
+ export declare function getTaskBoard(knex: Knex): Promise<any[]>;
34
+ //# sourceMappingURL=view-queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-queries.d.ts","sourceRoot":"","sources":["../../src/utils/view-queries.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B;;;GAGG;AAEH;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAmCnE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAkBjE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAehE;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAiB5E;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAqBrE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CA4BrE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CA6B7D"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * View query functions - replacements for SQL views
3
+ * These provide portable query builders that work across databases
4
+ */
5
+ /**
6
+ * v_tagged_decisions - Decisions with metadata (tags, layers, scopes)
7
+ */
8
+ export async function getTaggedDecisions(knex) {
9
+ // Use subqueries for tag/scope aggregation (SQLite GROUP_CONCAT)
10
+ const result = await knex('t_decisions as d')
11
+ .join('m_context_keys as k', 'd.key_id', 'k.id')
12
+ .leftJoin('m_layers as l', 'd.layer_id', 'l.id')
13
+ .leftJoin('m_agents as a', 'd.agent_id', 'a.id')
14
+ .select([
15
+ 'k.key',
16
+ 'd.value',
17
+ 'd.version',
18
+ knex.raw(`CASE d.status
19
+ WHEN 1 THEN 'active'
20
+ WHEN 2 THEN 'deprecated'
21
+ ELSE 'draft'
22
+ END as status`),
23
+ 'l.name as layer',
24
+ 'a.name as decided_by',
25
+ knex.raw(`datetime(d.ts, 'unixepoch') as updated`),
26
+ // Tags subquery
27
+ knex.raw(`(
28
+ SELECT GROUP_CONCAT(t2.name, ',')
29
+ FROM t_decision_tags dt2
30
+ JOIN m_tags t2 ON dt2.tag_id = t2.id
31
+ WHERE dt2.decision_key_id = d.key_id
32
+ ) as tags`),
33
+ // Scopes subquery
34
+ knex.raw(`(
35
+ SELECT GROUP_CONCAT(s2.name, ',')
36
+ FROM t_decision_scopes ds2
37
+ JOIN m_scopes s2 ON ds2.scope_id = s2.id
38
+ WHERE ds2.decision_key_id = d.key_id
39
+ ) as scopes`),
40
+ ]);
41
+ return result;
42
+ }
43
+ /**
44
+ * v_active_context - Recently active decisions (last hour)
45
+ */
46
+ export async function getActiveContext(knex) {
47
+ const oneHourAgo = knex.raw('unixepoch() - 3600');
48
+ return knex('t_decisions as d')
49
+ .join('m_context_keys as k', 'd.key_id', 'k.id')
50
+ .leftJoin('m_layers as l', 'd.layer_id', 'l.id')
51
+ .leftJoin('m_agents as a', 'd.agent_id', 'a.id')
52
+ .where('d.ts', '>=', oneHourAgo)
53
+ .andWhere('d.status', 1) // active only
54
+ .select([
55
+ 'k.key',
56
+ 'd.value',
57
+ 'd.version',
58
+ 'l.name as layer',
59
+ 'a.name as decided_by',
60
+ knex.raw(`datetime(d.ts, 'unixepoch') as updated`),
61
+ ])
62
+ .orderBy('d.ts', 'desc');
63
+ }
64
+ /**
65
+ * v_layer_summary - Aggregated stats per layer
66
+ */
67
+ export async function getLayerSummary(knex) {
68
+ const oneHourAgo = knex.raw('unixepoch() - 3600');
69
+ return knex('m_layers as l')
70
+ .leftJoin('t_decisions as d', 'l.id', 'd.layer_id')
71
+ .leftJoin('t_constraints as c', 'l.id', 'c.layer_id')
72
+ .leftJoin('t_file_changes as f', 'l.id', 'f.layer_id')
73
+ .select([
74
+ 'l.name as layer',
75
+ knex.raw('COUNT(DISTINCT d.key_id) as decision_count'),
76
+ knex.raw('COUNT(DISTINCT CASE WHEN c.active = 1 THEN c.id END) as constraint_count'),
77
+ knex.raw(`COUNT(DISTINCT CASE WHEN f.ts >= ${oneHourAgo.toQuery()} THEN f.id END) as recent_changes`),
78
+ ])
79
+ .groupBy('l.id', 'l.name')
80
+ .orderBy('l.name');
81
+ }
82
+ /**
83
+ * v_unread_messages_by_priority - Unread messages grouped by priority
84
+ */
85
+ export async function getUnreadMessagesByPriority(knex) {
86
+ return knex('t_agent_messages as m')
87
+ .leftJoin('m_agents as a', 'm.from_agent_id', 'a.id')
88
+ .where('m.read', false)
89
+ .select([
90
+ knex.raw(`CASE m.priority
91
+ WHEN 1 THEN 'low'
92
+ WHEN 2 THEN 'medium'
93
+ WHEN 3 THEN 'high'
94
+ ELSE 'critical'
95
+ END as priority`),
96
+ 'm.message',
97
+ 'a.name as from_agent',
98
+ knex.raw(`datetime(m.ts, 'unixepoch') as sent_at`),
99
+ ])
100
+ .orderBy('m.priority', 'desc')
101
+ .orderBy('m.ts', 'desc');
102
+ }
103
+ /**
104
+ * v_recent_file_changes - Recent file changes with layer info
105
+ */
106
+ export async function getRecentFileChanges(knex) {
107
+ const oneHourAgo = knex.raw('unixepoch() - 3600');
108
+ return knex('t_file_changes as fc')
109
+ .join('m_files as f', 'fc.file_id', 'f.id')
110
+ .leftJoin('m_layers as l', 'fc.layer_id', 'l.id')
111
+ .leftJoin('m_agents as a', 'fc.agent_id', 'a.id')
112
+ .where('fc.ts', '>=', oneHourAgo)
113
+ .select([
114
+ 'f.path',
115
+ knex.raw(`CASE fc.change_type
116
+ WHEN 1 THEN 'created'
117
+ WHEN 2 THEN 'modified'
118
+ ELSE 'deleted'
119
+ END as change_type`),
120
+ 'l.name as layer',
121
+ 'a.name as changed_by',
122
+ 'fc.description',
123
+ knex.raw(`datetime(fc.ts, 'unixepoch') as changed_at`),
124
+ ])
125
+ .orderBy('fc.ts', 'desc');
126
+ }
127
+ /**
128
+ * v_tagged_constraints - Active constraints with tags
129
+ */
130
+ export async function getTaggedConstraints(knex) {
131
+ return knex('t_constraints as c')
132
+ .join('m_constraint_categories as cat', 'c.category_id', 'cat.id')
133
+ .leftJoin('m_layers as l', 'c.layer_id', 'l.id')
134
+ .leftJoin('m_agents as a', 'c.agent_id', 'a.id')
135
+ .where('c.active', true)
136
+ .select([
137
+ 'cat.name as category',
138
+ 'c.constraint_text',
139
+ knex.raw(`CASE c.priority
140
+ WHEN 1 THEN 'low'
141
+ WHEN 2 THEN 'medium'
142
+ WHEN 3 THEN 'high'
143
+ ELSE 'critical'
144
+ END as priority`),
145
+ 'l.name as layer',
146
+ 'a.name as added_by',
147
+ knex.raw(`datetime(c.ts, 'unixepoch') as added_at`),
148
+ // Tags subquery
149
+ knex.raw(`(
150
+ SELECT GROUP_CONCAT(t2.name, ',')
151
+ FROM t_constraint_tags ct2
152
+ JOIN m_tags t2 ON ct2.tag_id = t2.id
153
+ WHERE ct2.constraint_id = c.id
154
+ ) as tags`),
155
+ ])
156
+ .orderBy('c.priority', 'desc')
157
+ .orderBy('c.ts', 'desc');
158
+ }
159
+ /**
160
+ * v_task_board - Metadata-only task queries (v3.0.0)
161
+ */
162
+ export async function getTaskBoard(knex) {
163
+ return knex('t_tasks as t')
164
+ .join('m_task_statuses as ts', 't.status_id', 'ts.id')
165
+ .leftJoin('m_layers as l', 't.layer_id', 'l.id')
166
+ .leftJoin('m_agents as a', 't.assigned_agent_id', 'a.id')
167
+ .select([
168
+ 't.id as task_id',
169
+ 't.title',
170
+ 'ts.name as status',
171
+ knex.raw(`CASE t.priority
172
+ WHEN 1 THEN 'low'
173
+ WHEN 2 THEN 'medium'
174
+ WHEN 3 THEN 'high'
175
+ ELSE 'critical'
176
+ END as priority`),
177
+ 'l.name as layer',
178
+ 'a.name as assigned_to',
179
+ knex.raw(`datetime(t.created_ts, 'unixepoch') as created`),
180
+ knex.raw(`datetime(t.updated_ts, 'unixepoch') as updated`),
181
+ // Tags subquery
182
+ knex.raw(`(
183
+ SELECT GROUP_CONCAT(tag.name, ',')
184
+ FROM t_task_tags tt
185
+ JOIN m_tags tag ON tt.tag_id = tag.id
186
+ WHERE tt.task_id = t.id
187
+ ) as tags`),
188
+ ])
189
+ .orderBy('t.priority', 'desc')
190
+ .orderBy('t.updated_ts', 'desc');
191
+ }
192
+ //# sourceMappingURL=view-queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-queries.js","sourceRoot":"","sources":["../../src/utils/view-queries.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../../src/watcher/file-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAwBH;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;IACnD,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,gBAAgB,CAAuC;IAC/D,OAAO,CAAC,oBAAoB,CAA+B;IAE3D,OAAO;IAMP;;OAEG;WACW,WAAW,IAAI,WAAW;IAOxC;;OAEG;IACH,OAAO,CAAC,KAAK;IASb;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsFnC;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkClC;;OAEG;IACI,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IA4BrG;;OAEG;IACI,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAoB7D;;OAEG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgB3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;OAIG;IACU,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUhD;;OAEG;YACW,kBAAkB;IAyBhC;;OAEG;YACW,gBAAgB;IAsF9B;;;;;OAKG;YACW,oBAAoB;IAsClC;;OAEG;YACW,uBAAuB;IA2FrC;;OAEG;YACW,iBAAiB;IAqC/B;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;;;;;OASG;YACW,0BAA0B;IA4GxC;;OAEG;IACI,SAAS,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB;CAOF"}
1
+ {"version":3,"file":"file-watcher.d.ts","sourceRoot":"","sources":["../../src/watcher/file-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAqCH;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA4B;IACnD,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAkC;IAC3D,OAAO,CAAC,gBAAgB,CAAuC;IAC/D,OAAO,CAAC,oBAAoB,CAA+B;IAE3D,OAAO;IAMP;;OAEG;WACW,WAAW,IAAI,WAAW;IAOxC;;OAEG;IACH,OAAO,CAAC,KAAK;IASb;;OAEG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsFnC;;OAEG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAkClC;;OAEG;IACI,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI;IA4BrG;;OAEG;IACI,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAoB7D;;OAEG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAgB3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAatB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IAUvB;;;;OAIG;IACU,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUhD;;OAEG;YACW,kBAAkB;IAyBhC;;OAEG;YACW,gBAAgB;IAuF9B;;;;;OAKG;YACW,oBAAoB;IAsClC;;OAEG;YACW,uBAAuB;IA2FrC;;OAEG;YACW,iBAAiB;IAqC/B;;OAEG;IACH,OAAO,CAAC,aAAa;IAkBrB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAQzB;;;;;;;;;OASG;YACW,0BAA0B;IA6GxC;;OAEG;IACI,SAAS,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,MAAM,CAAC;KACtB;CAOF"}
@@ -11,7 +11,8 @@
11
11
  * - Respects .gitignore patterns and built-in ignore rules
12
12
  */
13
13
  import chokidar from 'chokidar';
14
- import { getDatabase, getConfigInt, getConfigBool } from '../database.js';
14
+ import { getAdapter, getConfigInt, getConfigBool } from '../database.js';
15
+ import { SQLiteAdapter } from '../adapters/index.js';
15
16
  import { basename, join } from 'path';
16
17
  import { existsSync } from 'fs';
17
18
  import { execSync } from 'child_process';
@@ -21,6 +22,17 @@ import { checkReadyForReview } from '../utils/quality-checks.js';
21
22
  import { CONFIG_KEYS } from '../constants.js';
22
23
  import { detectAndCompleteReviewedTasks, detectAndCompleteOnStaging, detectAndArchiveOnCommit } from '../utils/task-stale-detection.js';
23
24
  import { detectVCS } from '../utils/vcs-adapter.js';
25
+ /**
26
+ * Helper to get raw better-sqlite3 Database instance from adapter
27
+ * For legacy code that uses db.prepare() directly
28
+ */
29
+ function getRawDb() {
30
+ const adapter = getAdapter();
31
+ if (adapter instanceof SQLiteAdapter) {
32
+ return adapter.getRawDatabase();
33
+ }
34
+ throw new Error('File watcher only supported for SQLite adapter');
35
+ }
24
36
  /**
25
37
  * FileWatcher class - Singleton pattern
26
38
  */
@@ -313,7 +325,8 @@ export class FileWatcher {
313
325
  return;
314
326
  }
315
327
  console.error(`\nšŸ“ File changed: ${basename(normalizedPath)}`);
316
- const db = getDatabase();
328
+ const adapter = getAdapter();
329
+ const db = getRawDb();
317
330
  // Process each task linked to this file
318
331
  for (const mapping of mappings) {
319
332
  const { taskId, taskTitle, currentStatus } = mapping;
@@ -365,7 +378,7 @@ export class FileWatcher {
365
378
  await this.checkAcceptanceCriteria(taskId, taskTitle, mapping);
366
379
  // After debounce period, check if task is ready for review
367
380
  // Use setTimeout to check after idle period
368
- const idleMinutes = getConfigInt(db, CONFIG_KEYS.REVIEW_IDLE_MINUTES, 15);
381
+ const idleMinutes = await getConfigInt(adapter, CONFIG_KEYS.REVIEW_IDLE_MINUTES, 15);
369
382
  setTimeout(async () => {
370
383
  await this.checkAndTransitionToReview(taskId);
371
384
  }, idleMinutes * 60 * 1000);
@@ -383,7 +396,7 @@ export class FileWatcher {
383
396
  */
384
397
  async handleVCSIndexChange(filePath) {
385
398
  console.error('\nšŸ”„ VCS index changed - checking for tasks ready to auto-transition');
386
- const db = getDatabase();
399
+ const db = getAdapter();
387
400
  try {
388
401
  // Step 1: Check for staged files → complete tasks (waiting_review → done)
389
402
  const stagingCompleted = await detectAndCompleteOnStaging(db);
@@ -418,7 +431,7 @@ export class FileWatcher {
418
431
  * Check acceptance criteria and auto-complete task if all pass
419
432
  */
420
433
  async checkAcceptanceCriteria(taskId, taskTitle, mapping) {
421
- const db = getDatabase();
434
+ const db = getRawDb();
422
435
  try {
423
436
  // Get acceptance criteria JSON
424
437
  const taskDetails = db.prepare(`
@@ -490,7 +503,7 @@ export class FileWatcher {
490
503
  * Load existing task-file links from database
491
504
  */
492
505
  async loadTaskFileLinks() {
493
- const db = getDatabase();
506
+ const db = getRawDb();
494
507
  try {
495
508
  // Query all active tasks with file links
496
509
  const query = `
@@ -556,7 +569,8 @@ export class FileWatcher {
556
569
  * @param taskId - Task ID to check
557
570
  */
558
571
  async checkAndTransitionToReview(taskId) {
559
- const db = getDatabase();
572
+ const adapter = getAdapter();
573
+ const db = getRawDb();
560
574
  try {
561
575
  // Get current task status
562
576
  const task = db.prepare(`
@@ -574,10 +588,10 @@ export class FileWatcher {
574
588
  return;
575
589
  }
576
590
  // Read configuration
577
- const idleMinutes = getConfigInt(db, CONFIG_KEYS.REVIEW_IDLE_MINUTES, 15);
578
- const requireAllFilesModified = getConfigBool(db, CONFIG_KEYS.REVIEW_REQUIRE_ALL_FILES_MODIFIED, true);
579
- const requireTestsPass = getConfigBool(db, CONFIG_KEYS.REVIEW_REQUIRE_TESTS_PASS, true);
580
- const requireCompile = getConfigBool(db, CONFIG_KEYS.REVIEW_REQUIRE_COMPILE, true);
591
+ const idleMinutes = await getConfigInt(adapter, CONFIG_KEYS.REVIEW_IDLE_MINUTES, 15);
592
+ const requireAllFilesModified = await getConfigBool(adapter, CONFIG_KEYS.REVIEW_REQUIRE_ALL_FILES_MODIFIED, true);
593
+ const requireTestsPass = await getConfigBool(adapter, CONFIG_KEYS.REVIEW_REQUIRE_TESTS_PASS, true);
594
+ const requireCompile = await getConfigBool(adapter, CONFIG_KEYS.REVIEW_REQUIRE_COMPILE, true);
581
595
  // Check idle time
582
596
  const lastModified = this.lastModifiedTimes.get(taskId);
583
597
  if (!lastModified) {