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,8 +1,12 @@
1
1
  /**
2
2
  * Auto-stale detection for Kanban Task Watcher
3
3
  * Automatically transitions abandoned tasks based on time thresholds
4
+ *
5
+ * CONVERTED: Using Knex.js with DatabaseAdapter (async/await)
4
6
  */
5
- import { getConfigBool, getConfigInt } from '../database.js';
7
+ import { getConfigBool, getConfigInt, getAdapter } from '../database.js';
8
+ import { calculateTaskArchiveCutoff } from './retention.js';
9
+ import { detectVCS } from './vcs-adapter.js';
6
10
  /**
7
11
  * Task status IDs (matching schema)
8
12
  */
@@ -10,20 +14,33 @@ const TASK_STATUS = {
10
14
  TODO: 1,
11
15
  IN_PROGRESS: 2,
12
16
  WAITING_REVIEW: 3,
17
+ BLOCKED: 4,
18
+ DONE: 5,
19
+ ARCHIVED: 6,
13
20
  };
14
21
  /**
15
- * Configuration keys for task stale detection
22
+ * Configuration keys for task stale detection and review
16
23
  */
17
24
  const CONFIG_KEYS = {
18
25
  TASK_STALE_HOURS_IN_PROGRESS: 'task_stale_hours_in_progress',
19
26
  TASK_STALE_HOURS_WAITING_REVIEW: 'task_stale_hours_waiting_review',
20
27
  TASK_AUTO_STALE_ENABLED: 'task_auto_stale_enabled',
28
+ REVIEW_IDLE_MINUTES: 'review_idle_minutes',
29
+ REVIEW_REQUIRE_ALL_FILES_MODIFIED: 'review_require_all_files_modified',
30
+ REVIEW_REQUIRE_TESTS_PASS: 'review_require_tests_pass',
31
+ REVIEW_REQUIRE_COMPILE: 'review_require_compile',
32
+ GIT_AUTO_COMPLETE_ENABLED: 'git_auto_complete_enabled',
33
+ REQUIRE_ALL_FILES_COMMITTED: 'require_all_files_committed',
34
+ STALE_REVIEW_NOTIFICATION_HOURS: 'stale_review_notification_hours',
21
35
  };
22
36
  /**
23
37
  * Default configuration values
38
+ *
39
+ * STALE_HOURS_IN_PROGRESS: 18 hours (supports multi-day tasks and lunch breaks)
40
+ * STALE_HOURS_WAITING_REVIEW: 24 hours (1 day wait for review feedback)
24
41
  */
25
42
  const DEFAULTS = {
26
- STALE_HOURS_IN_PROGRESS: 2,
43
+ STALE_HOURS_IN_PROGRESS: 18,
27
44
  STALE_HOURS_WAITING_REVIEW: 24,
28
45
  AUTO_STALE_ENABLED: true,
29
46
  };
@@ -32,61 +49,319 @@ const DEFAULTS = {
32
49
  *
33
50
  * Detection logic:
34
51
  * - Tasks in `in_progress` with `updated_ts` older than threshold → move to `waiting_review`
35
- * - Tasks in `waiting_review` with `updated_ts` older than threshold → move to `todo`
36
52
  *
37
- * @param db - Database instance
53
+ * @param adapter - Database adapter instance
38
54
  * @returns Count of transitioned tasks
39
55
  */
40
- export function detectAndTransitionStaleTasks(db) {
56
+ export async function detectAndTransitionStaleTasks(adapter) {
57
+ const actualAdapter = adapter ?? getAdapter();
58
+ const knex = actualAdapter.getKnex();
41
59
  // 1. Check if auto-stale is enabled
42
- const isEnabled = getConfigBool(db, CONFIG_KEYS.TASK_AUTO_STALE_ENABLED, DEFAULTS.AUTO_STALE_ENABLED);
60
+ const isEnabled = await getConfigBool(actualAdapter, CONFIG_KEYS.TASK_AUTO_STALE_ENABLED, DEFAULTS.AUTO_STALE_ENABLED);
43
61
  if (!isEnabled) {
44
62
  return 0;
45
63
  }
46
64
  // 2. Get threshold configs (in hours)
47
- const inProgressThresholdHours = getConfigInt(db, CONFIG_KEYS.TASK_STALE_HOURS_IN_PROGRESS, DEFAULTS.STALE_HOURS_IN_PROGRESS);
48
- const waitingReviewThresholdHours = getConfigInt(db, CONFIG_KEYS.TASK_STALE_HOURS_WAITING_REVIEW, DEFAULTS.STALE_HOURS_WAITING_REVIEW);
65
+ const inProgressThresholdHours = await getConfigInt(actualAdapter, CONFIG_KEYS.TASK_STALE_HOURS_IN_PROGRESS, DEFAULTS.STALE_HOURS_IN_PROGRESS);
66
+ const waitingReviewThresholdHours = await getConfigInt(actualAdapter, CONFIG_KEYS.TASK_STALE_HOURS_WAITING_REVIEW, DEFAULTS.STALE_HOURS_WAITING_REVIEW);
49
67
  // Convert hours to seconds for timestamp comparison
50
68
  const inProgressThresholdSeconds = inProgressThresholdHours * 3600;
51
69
  const waitingReviewThresholdSeconds = waitingReviewThresholdHours * 3600;
52
70
  let totalTransitioned = 0;
53
71
  // 3. Transition stale tasks in a transaction
54
- const updateStmt = db.transaction(() => {
72
+ await actualAdapter.transaction(async (trx) => {
55
73
  // 3a. Find and transition in_progress tasks older than threshold to waiting_review
56
- const inProgressTransitioned = db.prepare(`
57
- UPDATE t_tasks
58
- SET status_id = ?,
59
- updated_ts = unixepoch()
60
- WHERE status_id = ?
61
- AND updated_ts < unixepoch() - ?
62
- `).run(TASK_STATUS.WAITING_REVIEW, TASK_STATUS.IN_PROGRESS, inProgressThresholdSeconds);
63
- totalTransitioned += inProgressTransitioned.changes;
64
- // 3b. Find and transition waiting_review tasks older than threshold to todo
65
- const waitingReviewTransitioned = db.prepare(`
66
- UPDATE t_tasks
67
- SET status_id = ?,
68
- updated_ts = unixepoch()
69
- WHERE status_id = ?
70
- AND updated_ts < unixepoch() - ?
71
- `).run(TASK_STATUS.TODO, TASK_STATUS.WAITING_REVIEW, waitingReviewThresholdSeconds);
72
- totalTransitioned += waitingReviewTransitioned.changes;
74
+ const currentTs = Math.floor(Date.now() / 1000);
75
+ const cutoffTs = currentTs - inProgressThresholdSeconds;
76
+ const inProgressTransitioned = await trx('t_tasks')
77
+ .where('status_id', TASK_STATUS.IN_PROGRESS)
78
+ .where('updated_ts', '<', cutoffTs)
79
+ .update({
80
+ status_id: TASK_STATUS.WAITING_REVIEW,
81
+ updated_ts: currentTs
82
+ });
83
+ totalTransitioned += inProgressTransitioned;
73
84
  });
74
- // Execute the transaction
75
- updateStmt();
76
85
  // 4. Return count of transitioned tasks
77
86
  return totalTransitioned;
78
87
  }
79
88
  /**
80
89
  * Get current auto-stale configuration
81
90
  *
82
- * @param db - Database instance
91
+ * @param adapter - Database adapter instance
83
92
  * @returns Current configuration values
84
93
  */
85
- export function getStaleDetectionConfig(db) {
94
+ export async function getStaleDetectionConfig(adapter) {
95
+ const actualAdapter = adapter ?? getAdapter();
86
96
  return {
87
- enabled: getConfigBool(db, CONFIG_KEYS.TASK_AUTO_STALE_ENABLED, DEFAULTS.AUTO_STALE_ENABLED),
88
- inProgressThresholdHours: getConfigInt(db, CONFIG_KEYS.TASK_STALE_HOURS_IN_PROGRESS, DEFAULTS.STALE_HOURS_IN_PROGRESS),
89
- waitingReviewThresholdHours: getConfigInt(db, CONFIG_KEYS.TASK_STALE_HOURS_WAITING_REVIEW, DEFAULTS.STALE_HOURS_WAITING_REVIEW),
97
+ enabled: await getConfigBool(actualAdapter, CONFIG_KEYS.TASK_AUTO_STALE_ENABLED, DEFAULTS.AUTO_STALE_ENABLED),
98
+ inProgressThresholdHours: await getConfigInt(actualAdapter, CONFIG_KEYS.TASK_STALE_HOURS_IN_PROGRESS, DEFAULTS.STALE_HOURS_IN_PROGRESS),
99
+ waitingReviewThresholdHours: await getConfigInt(actualAdapter, CONFIG_KEYS.TASK_STALE_HOURS_WAITING_REVIEW, DEFAULTS.STALE_HOURS_WAITING_REVIEW),
90
100
  };
91
101
  }
102
+ /**
103
+ * Auto-archive old done tasks
104
+ * Archives tasks in 'done' status older than configured threshold
105
+ * Uses weekend-aware retention logic (consistent with messages/files)
106
+ *
107
+ * Default: 48 hours (2 days)
108
+ * Weekend-aware: Task done Friday → archives Tuesday (skip Sat/Sun)
109
+ *
110
+ * @param adapter - Database adapter instance
111
+ * @returns Count of archived tasks
112
+ */
113
+ export async function autoArchiveOldDoneTasks(adapter) {
114
+ const actualAdapter = adapter ?? getAdapter();
115
+ const knex = actualAdapter.getKnex();
116
+ // Calculate cutoff timestamp using weekend-aware retention logic
117
+ const cutoffTimestamp = await calculateTaskArchiveCutoff(actualAdapter);
118
+ // Archive done tasks older than cutoff
119
+ const currentTs = Math.floor(Date.now() / 1000);
120
+ const archivedCount = await knex('t_tasks')
121
+ .where('status_id', TASK_STATUS.DONE)
122
+ .where('updated_ts', '<', cutoffTimestamp)
123
+ .update({
124
+ status_id: TASK_STATUS.ARCHIVED,
125
+ updated_ts: currentTs
126
+ });
127
+ return archivedCount;
128
+ }
129
+ /**
130
+ * Detect and complete tasks in waiting_review or in_progress when all watched files are committed
131
+ *
132
+ * VCS-aware auto-complete strategy (v3.4.0+):
133
+ * - Find all tasks in `waiting_review` or `in_progress` status with watched files
134
+ * - For each task, check if ALL watched files have been committed since task creation
135
+ * - Query VCS history to determine committed files
136
+ * - If all files committed → transition to `done` (VCS commit = implicit approval)
137
+ * - Supports multiple VCS: Git, Mercurial, SVN
138
+ * - Gracefully handle non-VCS repos (skip auto-complete)
139
+ *
140
+ * @param adapter - Database adapter instance
141
+ * @returns Count of auto-completed tasks
142
+ */
143
+ export async function detectAndCompleteReviewedTasks(adapter) {
144
+ const actualAdapter = adapter ?? getAdapter();
145
+ const knex = actualAdapter.getKnex();
146
+ // 1. Check if auto-complete is enabled
147
+ const isEnabled = await getConfigBool(actualAdapter, CONFIG_KEYS.GIT_AUTO_COMPLETE_ENABLED, true);
148
+ if (!isEnabled) {
149
+ return 0;
150
+ }
151
+ const requireAllFilesCommitted = await getConfigBool(actualAdapter, CONFIG_KEYS.REQUIRE_ALL_FILES_COMMITTED, true);
152
+ // 2. Find all waiting_review and in_progress tasks
153
+ const candidateTasks = await knex('t_tasks as t')
154
+ .join('m_task_statuses as s', 't.status_id', 's.id')
155
+ .whereIn('s.name', ['waiting_review', 'in_progress'])
156
+ .select('t.id', 't.created_ts', 's.name as status_name');
157
+ if (candidateTasks.length === 0) {
158
+ return 0;
159
+ }
160
+ let completed = 0;
161
+ const projectRoot = process.cwd();
162
+ // 3. Detect VCS type
163
+ const vcsAdapter = await detectVCS(projectRoot);
164
+ if (!vcsAdapter) {
165
+ // Not a VCS repository - skip VCS-aware completion
166
+ console.error(' ℹ Not a VCS repository (Git/Mercurial/SVN) - skipping VCS-aware auto-complete');
167
+ return 0;
168
+ }
169
+ console.error(` ℹ VCS detected: ${vcsAdapter.getVCSType()}`);
170
+ // 4. For each candidate task, check if all watched files are committed
171
+ for (const task of candidateTasks) {
172
+ try {
173
+ // Get watched files for this task
174
+ const watchedFiles = await knex('t_task_file_links as tfl')
175
+ .join('m_files as f', 'tfl.file_id', 'f.id')
176
+ .where('tfl.task_id', task.id)
177
+ .select('f.path');
178
+ if (watchedFiles.length === 0) {
179
+ // No watched files - skip this task
180
+ continue;
181
+ }
182
+ const filePaths = watchedFiles.map(f => f.path);
183
+ // Query VCS history for commits since task creation
184
+ // Convert Unix timestamp to ISO 8601 format for VCS adapters
185
+ const sinceTimestamp = new Date(task.created_ts * 1000).toISOString();
186
+ let committedFiles;
187
+ try {
188
+ const committedFilesList = await vcsAdapter.getCommittedFilesSince(sinceTimestamp);
189
+ committedFiles = new Set(committedFilesList);
190
+ }
191
+ catch (error) {
192
+ // VCS query failed - skip this task
193
+ console.error(` ⏸ Task #${task.id}: ${vcsAdapter.getVCSType()} query failed - ${error instanceof Error ? error.message : String(error)}`);
194
+ continue;
195
+ }
196
+ // Check if all watched files are committed
197
+ const uncommittedFiles = [];
198
+ for (const filePath of filePaths) {
199
+ if (!committedFiles.has(filePath)) {
200
+ uncommittedFiles.push(filePath);
201
+ }
202
+ }
203
+ // Determine if task should auto-complete
204
+ const shouldComplete = requireAllFilesCommitted
205
+ ? uncommittedFiles.length === 0 // ALL files must be committed
206
+ : committedFiles.size > 0 && uncommittedFiles.length < filePaths.length; // At least SOME files committed
207
+ if (shouldComplete) {
208
+ // All watched files committed - transition to done
209
+ const currentTs = Math.floor(Date.now() / 1000);
210
+ await knex('t_tasks')
211
+ .where({ id: task.id })
212
+ .update({
213
+ status_id: TASK_STATUS.DONE,
214
+ updated_ts: currentTs
215
+ });
216
+ completed++;
217
+ console.error(` ✓ Task #${task.id}: ${task.status_name} → done (all ${filePaths.length} watched files committed)`);
218
+ }
219
+ else if (uncommittedFiles.length > 0) {
220
+ console.error(` ⏸ Task #${task.id}: ${uncommittedFiles.length} of ${filePaths.length} files not yet committed`);
221
+ }
222
+ }
223
+ catch (error) {
224
+ console.error(` ✗ Error checking task #${task.id} for git commits:`, error);
225
+ continue;
226
+ }
227
+ }
228
+ return completed;
229
+ }
230
+ /**
231
+ * Detect and auto-complete tasks in waiting_review when all watched files are staged
232
+ * (v3.5.2 - Two-step Git-aware workflow: staging → done)
233
+ *
234
+ * Logic:
235
+ * - Find all tasks in waiting_review status
236
+ * - Check if ALL watched files are staged (git add)
237
+ * - If yes → transition to done
238
+ * - Respects git_auto_complete_on_stage config
239
+ *
240
+ * @param db - Database instance
241
+ * @returns Count of auto-completed tasks
242
+ */
243
+ export async function detectAndCompleteOnStaging(adapter) {
244
+ const actualAdapter = adapter ?? getAdapter();
245
+ const knex = actualAdapter.getKnex();
246
+ // TODO: Convert this function to use Knex.js
247
+ // For now, return 0 as this function is not used by tasks.ts
248
+ console.warn('detectAndCompleteOnStaging not yet fully converted to Knex.js');
249
+ return 0;
250
+ }
251
+ /**
252
+ * Detect and auto-archive tasks in done when all watched files are committed
253
+ * (v3.5.2 - Two-step Git-aware workflow: commit → archived)
254
+ *
255
+ * Logic:
256
+ * - Find all tasks in done status
257
+ * - Check if ALL watched files are committed (git commit)
258
+ * - If yes → transition to archived
259
+ * - Respects git_auto_archive_on_commit config
260
+ *
261
+ * @param db - Database instance
262
+ * @returns Count of auto-archived tasks
263
+ */
264
+ export async function detectAndArchiveOnCommit(adapter) {
265
+ const actualAdapter = adapter ?? getAdapter();
266
+ const knex = actualAdapter.getKnex();
267
+ // 1. Check if auto-archive on commit is enabled
268
+ const isEnabled = await getConfigBool(actualAdapter, 'git_auto_archive_on_commit', true);
269
+ if (!isEnabled) {
270
+ return 0;
271
+ }
272
+ const requireAllFilesCommitted = await getConfigBool(actualAdapter, 'require_all_files_committed_for_archive', true);
273
+ // 2. Find all done tasks
274
+ const candidateTasks = await knex('t_tasks as t')
275
+ .join('m_task_statuses as s', 't.status_id', 's.id')
276
+ .where('s.name', 'done')
277
+ .select('t.id', 't.created_ts');
278
+ if (candidateTasks.length === 0) {
279
+ return 0;
280
+ }
281
+ let archived = 0;
282
+ const projectRoot = process.cwd();
283
+ // 3. Detect VCS type
284
+ const vcsAdapter = await detectVCS(projectRoot);
285
+ if (!vcsAdapter) {
286
+ // Not a VCS repository - skip VCS-aware archiving
287
+ return 0;
288
+ }
289
+ // 4. For each candidate task, check if all watched files are committed
290
+ for (const task of candidateTasks) {
291
+ try {
292
+ // Get watched files for this task
293
+ const watchedFiles = await knex('t_task_file_links as tfl')
294
+ .join('m_files as f', 'tfl.file_id', 'f.id')
295
+ .where('tfl.task_id', task.id)
296
+ .select('f.path');
297
+ if (watchedFiles.length === 0) {
298
+ // No watched files - skip this task
299
+ continue;
300
+ }
301
+ const filePaths = watchedFiles.map(f => f.path);
302
+ // Query VCS history for commits since task creation
303
+ // Convert Unix timestamp to ISO 8601 format for VCS adapters
304
+ const sinceTimestamp = new Date(task.created_ts * 1000).toISOString();
305
+ let committedFiles;
306
+ try {
307
+ const committedFilesList = await vcsAdapter.getCommittedFilesSince(sinceTimestamp);
308
+ committedFiles = new Set(committedFilesList);
309
+ }
310
+ catch (error) {
311
+ // VCS query failed - skip this task
312
+ console.error(` ⏸ Task #${task.id}: ${vcsAdapter.getVCSType()} commit query failed - ${error instanceof Error ? error.message : String(error)}`);
313
+ continue;
314
+ }
315
+ // Check if all watched files are committed
316
+ const uncommittedFiles = [];
317
+ for (const filePath of filePaths) {
318
+ if (!committedFiles.has(filePath)) {
319
+ uncommittedFiles.push(filePath);
320
+ }
321
+ }
322
+ // Determine if task should auto-archive
323
+ const shouldArchive = requireAllFilesCommitted
324
+ ? uncommittedFiles.length === 0 // ALL files must be committed
325
+ : committedFiles.size > 0 && uncommittedFiles.length < filePaths.length; // At least SOME files committed
326
+ if (shouldArchive) {
327
+ // All watched files committed - transition to archived
328
+ const currentTs = Math.floor(Date.now() / 1000);
329
+ await knex('t_tasks')
330
+ .where({ id: task.id })
331
+ .update({
332
+ status_id: TASK_STATUS.ARCHIVED,
333
+ updated_ts: currentTs
334
+ });
335
+ archived++;
336
+ console.error(` 📦 Task #${task.id}: done → archived (all ${filePaths.length} watched files committed)`);
337
+ }
338
+ }
339
+ catch (error) {
340
+ console.error(` ✗ Error checking task #${task.id} for commits:`, error);
341
+ continue;
342
+ }
343
+ }
344
+ return archived;
345
+ }
346
+ /**
347
+ * Detect and transition in_progress tasks to waiting_review based on quality gates
348
+ * Database-backed approach that survives restarts
349
+ *
350
+ * Quality gates:
351
+ * - Task has been idle (no updates) for configured time (default 3 minutes)
352
+ * - All watched files have been modified at least once
353
+ * - TypeScript compiles without errors (if .ts files)
354
+ * - Tests pass (if test files exist)
355
+ *
356
+ * @param db - Database instance
357
+ * @returns Count of transitioned tasks
358
+ */
359
+ export async function detectAndTransitionToReview(adapter) {
360
+ const actualAdapter = adapter ?? getAdapter();
361
+ const knex = actualAdapter.getKnex();
362
+ // TODO: Convert this function to use Knex.js
363
+ // For now, return 0 as this function is not used by tasks.ts
364
+ console.warn('detectAndTransitionToReview not yet fully converted to Knex.js');
365
+ return 0;
366
+ }
92
367
  //# sourceMappingURL=task-stale-detection.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"task-stale-detection.js","sourceRoot":"","sources":["../../src/utils/task-stale-detection.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,IAAI,EAAE,CAAC;IACP,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,CAAC;CACT,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,GAAG;IAClB,4BAA4B,EAAE,8BAA8B;IAC5D,+BAA+B,EAAE,iCAAiC;IAClE,uBAAuB,EAAE,yBAAyB;CAC1C,CAAC;AAEX;;GAEG;AACH,MAAM,QAAQ,GAAG;IACf,uBAAuB,EAAE,CAAC;IAC1B,0BAA0B,EAAE,EAAE;IAC9B,kBAAkB,EAAE,IAAI;CAChB,CAAC;AAEX;;;;;;;;;GASG;AACH,MAAM,UAAU,6BAA6B,CAAC,EAAY;IACxD,oCAAoC;IACpC,MAAM,SAAS,GAAG,aAAa,CAC7B,EAAE,EACF,WAAW,CAAC,uBAAuB,EACnC,QAAQ,CAAC,kBAAkB,CAC5B,CAAC;IAEF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,CAAC;IACX,CAAC;IAED,sCAAsC;IACtC,MAAM,wBAAwB,GAAG,YAAY,CAC3C,EAAE,EACF,WAAW,CAAC,4BAA4B,EACxC,QAAQ,CAAC,uBAAuB,CACjC,CAAC;IAEF,MAAM,2BAA2B,GAAG,YAAY,CAC9C,EAAE,EACF,WAAW,CAAC,+BAA+B,EAC3C,QAAQ,CAAC,0BAA0B,CACpC,CAAC;IAEF,oDAAoD;IACpD,MAAM,0BAA0B,GAAG,wBAAwB,GAAG,IAAI,CAAC;IACnE,MAAM,6BAA6B,GAAG,2BAA2B,GAAG,IAAI,CAAC;IAEzE,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAE1B,6CAA6C;IAC7C,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;QACrC,mFAAmF;QACnF,MAAM,sBAAsB,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;KAMzC,CAAC,CAAC,GAAG,CACJ,WAAW,CAAC,cAAc,EAC1B,WAAW,CAAC,WAAW,EACvB,0BAA0B,CAC3B,CAAC;QAEF,iBAAiB,IAAI,sBAAsB,CAAC,OAAO,CAAC;QAEpD,4EAA4E;QAC5E,MAAM,yBAAyB,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;KAM5C,CAAC,CAAC,GAAG,CACJ,WAAW,CAAC,IAAI,EAChB,WAAW,CAAC,cAAc,EAC1B,6BAA6B,CAC9B,CAAC;QAEF,iBAAiB,IAAI,yBAAyB,CAAC,OAAO,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,UAAU,EAAE,CAAC;IAEb,wCAAwC;IACxC,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,EAAY;IAKlD,OAAO;QACL,OAAO,EAAE,aAAa,CACpB,EAAE,EACF,WAAW,CAAC,uBAAuB,EACnC,QAAQ,CAAC,kBAAkB,CAC5B;QACD,wBAAwB,EAAE,YAAY,CACpC,EAAE,EACF,WAAW,CAAC,4BAA4B,EACxC,QAAQ,CAAC,uBAAuB,CACjC;QACD,2BAA2B,EAAE,YAAY,CACvC,EAAE,EACF,WAAW,CAAC,+BAA+B,EAC3C,QAAQ,CAAC,0BAA0B,CACpC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"task-stale-detection.js","sourceRoot":"","sources":["../../src/utils/task-stale-detection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
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 declare function estimateTokens(data: string | object): number;
17
+ /**
18
+ * Add token metadata to response object
19
+ *
20
+ * @param data - Response data
21
+ * @returns Response with token metadata
22
+ */
23
+ export declare function addTokenMetadata<T extends object>(data: T): T & {
24
+ _token_info: {
25
+ estimated_tokens: number;
26
+ actual_chars: number;
27
+ };
28
+ };
29
+ /**
30
+ * Token ranges for different query types
31
+ */
32
+ export declare const TOKEN_RANGES: {
33
+ readonly help_action: {
34
+ readonly min: 50;
35
+ readonly max: 100;
36
+ readonly legacy: 2000;
37
+ };
38
+ readonly help_params: {
39
+ readonly min: 30;
40
+ readonly max: 80;
41
+ readonly legacy: 1500;
42
+ };
43
+ readonly help_tool: {
44
+ readonly min: 100;
45
+ readonly max: 200;
46
+ readonly legacy: 5000;
47
+ };
48
+ readonly help_use_case: {
49
+ readonly min: 150;
50
+ readonly max: 200;
51
+ readonly legacy: 300;
52
+ };
53
+ readonly help_list_use_cases: {
54
+ readonly min: 100;
55
+ readonly max: 300;
56
+ readonly legacy: 500;
57
+ };
58
+ readonly help_next_actions: {
59
+ readonly min: 30;
60
+ readonly max: 50;
61
+ readonly legacy: 100;
62
+ };
63
+ };
64
+ /**
65
+ * Calculate token efficiency percentage
66
+ *
67
+ * @param current - Current token count
68
+ * @param legacy - Legacy token count
69
+ * @returns Efficiency gain percentage
70
+ */
71
+ export declare function calculateEfficiencyGain(current: number, legacy: number): number;
72
+ //# sourceMappingURL=token-estimation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-estimation.d.ts","sourceRoot":"","sources":["../../src/utils/token-estimation.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAgB5D;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,WAAW,EAAE;QAAE,gBAAgB,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAWnI;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOf,CAAC;AAEX;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAG/E"}
@@ -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"}