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
@@ -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,68 @@
1
+ /**
2
+ * VCS Adapter Interface
3
+ *
4
+ * Provides abstraction layer for version control systems to support
5
+ * git-aware auto-complete across multiple VCS platforms.
6
+ */
7
+ export interface VCSAdapter {
8
+ /**
9
+ * Check if the current directory is a valid VCS repository
10
+ */
11
+ isRepository(): Promise<boolean>;
12
+ /**
13
+ * Get list of files committed since a given timestamp
14
+ * @param sinceTimestamp ISO 8601 timestamp
15
+ * @returns Array of committed file paths
16
+ */
17
+ getCommittedFilesSince(sinceTimestamp: string): Promise<string[]>;
18
+ /**
19
+ * Get list of files currently staged (ready to commit)
20
+ * @returns Array of staged file paths
21
+ */
22
+ getStagedFiles(): Promise<string[]>;
23
+ /**
24
+ * Get the VCS type name (for logging)
25
+ */
26
+ getVCSType(): string;
27
+ }
28
+ /**
29
+ * Git VCS Adapter
30
+ */
31
+ export declare class GitAdapter implements VCSAdapter {
32
+ private projectRoot;
33
+ constructor(projectRoot: string);
34
+ isRepository(): Promise<boolean>;
35
+ getCommittedFilesSince(sinceTimestamp: string): Promise<string[]>;
36
+ getStagedFiles(): Promise<string[]>;
37
+ getVCSType(): string;
38
+ }
39
+ /**
40
+ * SVN (Subversion) VCS Adapter
41
+ */
42
+ export declare class SVNAdapter implements VCSAdapter {
43
+ private projectRoot;
44
+ constructor(projectRoot: string);
45
+ isRepository(): Promise<boolean>;
46
+ getCommittedFilesSince(sinceTimestamp: string): Promise<string[]>;
47
+ getStagedFiles(): Promise<string[]>;
48
+ getVCSType(): string;
49
+ }
50
+ /**
51
+ * Mercurial (hg) VCS Adapter
52
+ */
53
+ export declare class MercurialAdapter implements VCSAdapter {
54
+ private projectRoot;
55
+ constructor(projectRoot: string);
56
+ isRepository(): Promise<boolean>;
57
+ getCommittedFilesSince(sinceTimestamp: string): Promise<string[]>;
58
+ getStagedFiles(): Promise<string[]>;
59
+ getVCSType(): string;
60
+ }
61
+ /**
62
+ * Auto-detect and create appropriate VCS adapter
63
+ *
64
+ * Detection order: Git → Mercurial → SVN
65
+ * (Most common to least common in modern development)
66
+ */
67
+ export declare function detectVCS(projectRoot: string): Promise<VCSAdapter | null>;
68
+ //# sourceMappingURL=vcs-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vcs-adapter.d.ts","sourceRoot":"","sources":["../../src/utils/vcs-adapter.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjC;;;;OAIG;IACH,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAElE;;;OAGG;IACH,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEpC;;OAEG;IACH,UAAU,IAAI,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,qBAAa,UAAW,YAAW,UAAU;IAC3C,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAIzB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAShC,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAajE,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAiBzC,UAAU,IAAI,MAAM;CAGrB;AAED;;GAEG;AACH,qBAAa,UAAW,YAAW,UAAU;IAC3C,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAIzB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAShC,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAkBjE,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAuBzC,UAAU,IAAI,MAAM;CAGrB;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,UAAU;IACjD,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAIzB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAShC,sBAAsB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAmBjE,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAsBzC,UAAU,IAAI,MAAM;CAGrB;AAED;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAqB/E"}
@@ -0,0 +1,187 @@
1
+ import { promisify } from 'util';
2
+ import { exec } from 'child_process';
3
+ const execAsync = promisify(exec);
4
+ /**
5
+ * Git VCS Adapter
6
+ */
7
+ export class GitAdapter {
8
+ projectRoot;
9
+ constructor(projectRoot) {
10
+ this.projectRoot = projectRoot;
11
+ }
12
+ async isRepository() {
13
+ try {
14
+ await execAsync('git rev-parse --git-dir', { cwd: this.projectRoot });
15
+ return true;
16
+ }
17
+ catch {
18
+ return false;
19
+ }
20
+ }
21
+ async getCommittedFilesSince(sinceTimestamp) {
22
+ const gitCommand = `git log --since="${sinceTimestamp}" --name-only --pretty=format:""`;
23
+ const { stdout } = await execAsync(gitCommand, { cwd: this.projectRoot });
24
+ const committedFiles = stdout
25
+ .split('\n')
26
+ .map(line => line.trim())
27
+ .filter(line => line.length > 0);
28
+ // Remove duplicates
29
+ return [...new Set(committedFiles)];
30
+ }
31
+ async getStagedFiles() {
32
+ try {
33
+ const gitCommand = 'git diff --cached --name-only';
34
+ const { stdout } = await execAsync(gitCommand, { cwd: this.projectRoot });
35
+ const stagedFiles = stdout
36
+ .split('\n')
37
+ .map(line => line.trim())
38
+ .filter(line => line.length > 0);
39
+ return stagedFiles;
40
+ }
41
+ catch {
42
+ // Not in a git repo or error occurred
43
+ return [];
44
+ }
45
+ }
46
+ getVCSType() {
47
+ return 'Git';
48
+ }
49
+ }
50
+ /**
51
+ * SVN (Subversion) VCS Adapter
52
+ */
53
+ export class SVNAdapter {
54
+ projectRoot;
55
+ constructor(projectRoot) {
56
+ this.projectRoot = projectRoot;
57
+ }
58
+ async isRepository() {
59
+ try {
60
+ await execAsync('svn info', { cwd: this.projectRoot });
61
+ return true;
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ async getCommittedFilesSince(sinceTimestamp) {
68
+ // Convert ISO timestamp to SVN revision range
69
+ const date = new Date(sinceTimestamp);
70
+ const svnDate = date.toISOString().split('.')[0] + 'Z';
71
+ // Get log with changed paths since the date
72
+ const svnCommand = `svn log -v --xml -r {${svnDate}}:HEAD`;
73
+ const { stdout } = await execAsync(svnCommand, { cwd: this.projectRoot });
74
+ // Parse XML to extract file paths
75
+ const pathMatches = stdout.matchAll(/<path[^>]*>([^<]+)<\/path>/g);
76
+ const committedFiles = Array.from(pathMatches, match => match[1])
77
+ .map(path => path.replace(/^\//, '')); // Remove leading slash
78
+ // Remove duplicates
79
+ return [...new Set(committedFiles)];
80
+ }
81
+ async getStagedFiles() {
82
+ try {
83
+ // SVN doesn't have a staging area - all changes are "staged"
84
+ // Get modified (M) and added (A) files
85
+ const svnCommand = 'svn status';
86
+ const { stdout } = await execAsync(svnCommand, { cwd: this.projectRoot });
87
+ const stagedFiles = stdout
88
+ .split('\n')
89
+ .filter(line => {
90
+ const trimmed = line.trim();
91
+ return trimmed.startsWith('M ') || trimmed.startsWith('A ');
92
+ })
93
+ .map(line => line.substring(2).trim()) // Remove status prefix
94
+ .filter(path => path.length > 0);
95
+ return stagedFiles;
96
+ }
97
+ catch {
98
+ // Not in an SVN repo or error occurred
99
+ return [];
100
+ }
101
+ }
102
+ getVCSType() {
103
+ return 'SVN';
104
+ }
105
+ }
106
+ /**
107
+ * Mercurial (hg) VCS Adapter
108
+ */
109
+ export class MercurialAdapter {
110
+ projectRoot;
111
+ constructor(projectRoot) {
112
+ this.projectRoot = projectRoot;
113
+ }
114
+ async isRepository() {
115
+ try {
116
+ await execAsync('hg root', { cwd: this.projectRoot });
117
+ return true;
118
+ }
119
+ catch {
120
+ return false;
121
+ }
122
+ }
123
+ async getCommittedFilesSince(sinceTimestamp) {
124
+ // Convert ISO timestamp to Mercurial date format
125
+ const date = new Date(sinceTimestamp);
126
+ const hgDate = date.toISOString().split('T')[0]; // YYYY-MM-DD
127
+ // Get files changed since date
128
+ const hgCommand = `hg log --style default --template "{files}\\n" -d ">${hgDate}"`;
129
+ const { stdout } = await execAsync(hgCommand, { cwd: this.projectRoot });
130
+ const committedFiles = stdout
131
+ .split('\n')
132
+ .flatMap(line => line.split(' '))
133
+ .map(file => file.trim())
134
+ .filter(file => file.length > 0);
135
+ // Remove duplicates
136
+ return [...new Set(committedFiles)];
137
+ }
138
+ async getStagedFiles() {
139
+ try {
140
+ // Get modified (M), added (A), and removed (R) files in working directory
141
+ const hgCommand = 'hg status -m -a -r';
142
+ const { stdout } = await execAsync(hgCommand, { cwd: this.projectRoot });
143
+ const stagedFiles = stdout
144
+ .split('\n')
145
+ .filter(line => {
146
+ const trimmed = line.trim();
147
+ return trimmed.startsWith('M ') || trimmed.startsWith('A ') || trimmed.startsWith('R ');
148
+ })
149
+ .map(line => line.substring(2).trim()) // Remove status prefix
150
+ .filter(path => path.length > 0);
151
+ return stagedFiles;
152
+ }
153
+ catch {
154
+ // Not in a Mercurial repo or error occurred
155
+ return [];
156
+ }
157
+ }
158
+ getVCSType() {
159
+ return 'Mercurial';
160
+ }
161
+ }
162
+ /**
163
+ * Auto-detect and create appropriate VCS adapter
164
+ *
165
+ * Detection order: Git → Mercurial → SVN
166
+ * (Most common to least common in modern development)
167
+ */
168
+ export async function detectVCS(projectRoot) {
169
+ // Try Git first (most common)
170
+ const gitAdapter = new GitAdapter(projectRoot);
171
+ if (await gitAdapter.isRepository()) {
172
+ return gitAdapter;
173
+ }
174
+ // Try Mercurial
175
+ const hgAdapter = new MercurialAdapter(projectRoot);
176
+ if (await hgAdapter.isRepository()) {
177
+ return hgAdapter;
178
+ }
179
+ // Try SVN
180
+ const svnAdapter = new SVNAdapter(projectRoot);
181
+ if (await svnAdapter.isRepository()) {
182
+ return svnAdapter;
183
+ }
184
+ // No VCS detected
185
+ return null;
186
+ }
187
+ //# sourceMappingURL=vcs-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vcs-adapter.js","sourceRoot":"","sources":["../../src/utils/vcs-adapter.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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"}