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.
- package/CHANGELOG.md +288 -1011
- package/README.md +80 -263
- package/assets/config.example.toml +97 -0
- package/assets/schema.sql +6 -1
- package/dist/adapters/index.d.ts +11 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +21 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/mysql-adapter.d.ts +31 -0
- package/dist/adapters/mysql-adapter.d.ts.map +1 -0
- package/dist/adapters/mysql-adapter.js +63 -0
- package/dist/adapters/mysql-adapter.js.map +1 -0
- package/dist/adapters/postgresql-adapter.d.ts +31 -0
- package/dist/adapters/postgresql-adapter.d.ts.map +1 -0
- package/dist/adapters/postgresql-adapter.js +63 -0
- package/dist/adapters/postgresql-adapter.js.map +1 -0
- package/dist/adapters/sqlite-adapter.d.ts +37 -0
- package/dist/adapters/sqlite-adapter.d.ts.map +1 -0
- package/dist/adapters/sqlite-adapter.js +129 -0
- package/dist/adapters/sqlite-adapter.js.map +1 -0
- package/dist/adapters/types.d.ts +33 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +2 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/cli.js +55 -54
- package/dist/cli.js.map +1 -1
- package/dist/config/example-generator.d.ts +11 -0
- package/dist/config/example-generator.d.ts.map +1 -0
- package/dist/config/example-generator.js +48 -0
- package/dist/config/example-generator.js.map +1 -0
- package/dist/config/loader.d.ts +46 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +155 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +86 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +28 -0
- package/dist/config/types.js.map +1 -0
- package/dist/constants.d.ts +9 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +10 -0
- package/dist/constants.js.map +1 -1
- package/dist/database.d.ts +44 -122
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +145 -349
- package/dist/database.js.map +1 -1
- package/dist/index.js +223 -175
- package/dist/index.js.map +1 -1
- package/dist/knexfile.d.ts +6 -0
- package/dist/knexfile.d.ts.map +1 -0
- package/dist/knexfile.js +85 -0
- package/dist/knexfile.js.map +1 -0
- package/dist/migrations/add-help-system-tables.d.ts +35 -0
- package/dist/migrations/add-help-system-tables.d.ts.map +1 -0
- package/dist/migrations/add-help-system-tables.js +206 -0
- package/dist/migrations/add-help-system-tables.js.map +1 -0
- package/dist/migrations/add-token-tracking.d.ts +28 -0
- package/dist/migrations/add-token-tracking.d.ts.map +1 -0
- package/dist/migrations/add-token-tracking.js +108 -0
- package/dist/migrations/add-token-tracking.js.map +1 -0
- package/dist/migrations/add-v3.5.0-pruned-files.d.ts +26 -0
- package/dist/migrations/add-v3.5.0-pruned-files.d.ts.map +1 -0
- package/dist/migrations/add-v3.5.0-pruned-files.js +107 -0
- package/dist/migrations/add-v3.5.0-pruned-files.js.map +1 -0
- package/dist/migrations/index.d.ts +26 -12
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +162 -20
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/knex/20251025020452_create_master_tables.d.ts +4 -0
- package/dist/migrations/knex/20251025020452_create_master_tables.d.ts.map +1 -0
- package/dist/migrations/knex/20251025020452_create_master_tables.js +65 -0
- package/dist/migrations/knex/20251025020452_create_master_tables.js.map +1 -0
- package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts +4 -0
- package/dist/migrations/knex/20251025021152_create_transaction_tables.d.ts.map +1 -0
- package/dist/migrations/knex/20251025021152_create_transaction_tables.js +235 -0
- package/dist/migrations/knex/20251025021152_create_transaction_tables.js.map +1 -0
- package/dist/migrations/knex/20251025021351_create_indexes.d.ts +4 -0
- package/dist/migrations/knex/20251025021351_create_indexes.d.ts.map +1 -0
- package/dist/migrations/knex/20251025021351_create_indexes.js +62 -0
- package/dist/migrations/knex/20251025021351_create_indexes.js.map +1 -0
- package/dist/migrations/knex/20251025021416_seed_master_data.d.ts +4 -0
- package/dist/migrations/knex/20251025021416_seed_master_data.d.ts.map +1 -0
- package/dist/migrations/knex/20251025021416_seed_master_data.js +58 -0
- package/dist/migrations/knex/20251025021416_seed_master_data.js.map +1 -0
- package/dist/migrations/knex/20251025070349_create_views.d.ts +4 -0
- package/dist/migrations/knex/20251025070349_create_views.d.ts.map +1 -0
- package/dist/migrations/knex/20251025070349_create_views.js +143 -0
- package/dist/migrations/knex/20251025070349_create_views.js.map +1 -0
- package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts +4 -0
- package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
- package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js +15 -0
- package/dist/migrations/knex/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
- package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts +8 -0
- package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
- package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js +12 -0
- package/dist/migrations/knex/20251025082220_fix_task_dependencies_columns.js.map +1 -0
- package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts +19 -0
- package/dist/migrations/knex/20251025090000_create_help_system_tables.d.ts.map +1 -0
- package/dist/migrations/knex/20251025090000_create_help_system_tables.js +115 -0
- package/dist/migrations/knex/20251025090000_create_help_system_tables.js.map +1 -0
- package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts +13 -0
- package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
- package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js +377 -0
- package/dist/migrations/knex/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
- package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts +15 -0
- package/dist/migrations/knex/20251025100000_seed_help_metadata.d.ts.map +1 -0
- package/dist/migrations/knex/20251025100000_seed_help_metadata.js +253 -0
- package/dist/migrations/knex/20251025100000_seed_help_metadata.js.map +1 -0
- package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts +16 -0
- package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
- package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js +276 -0
- package/dist/migrations/knex/20251025100100_seed_remaining_use_cases.js.map +1 -0
- package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts +8 -0
- package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
- package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js +64 -0
- package/dist/migrations/knex/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
- package/dist/migrations/seed-help-data.d.ts +48 -0
- package/dist/migrations/seed-help-data.d.ts.map +1 -0
- package/dist/migrations/seed-help-data.js +1466 -0
- package/dist/migrations/seed-help-data.js.map +1 -0
- package/dist/migrations/seed-tool-metadata.d.ts +24 -0
- package/dist/migrations/seed-tool-metadata.d.ts.map +1 -0
- package/dist/migrations/seed-tool-metadata.js +392 -0
- package/dist/migrations/seed-tool-metadata.js.map +1 -0
- package/dist/migrations/v3.6.0-help-system-refactor.d.ts +46 -0
- package/dist/migrations/v3.6.0-help-system-refactor.d.ts.map +1 -0
- package/dist/migrations/v3.6.0-help-system-refactor.js +223 -0
- package/dist/migrations/v3.6.0-help-system-refactor.js.map +1 -0
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +2 -0
- package/dist/schema.js.map +1 -1
- package/dist/tests/git-aware-completion.test.d.ts +6 -0
- package/dist/tests/git-aware-completion.test.d.ts.map +1 -0
- package/dist/tests/git-aware-completion.test.js +160 -0
- package/dist/tests/git-aware-completion.test.js.map +1 -0
- package/dist/tests/help-system.test.d.ts +23 -0
- package/dist/tests/help-system.test.d.ts.map +1 -0
- package/dist/tests/help-system.test.js +374 -0
- package/dist/tests/help-system.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts +6 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.js +264 -0
- package/dist/tests/tasks.auto-pruning-decision-link.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-partial.test.d.ts +6 -0
- package/dist/tests/tasks.auto-pruning-partial.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-partial.test.js +285 -0
- package/dist/tests/tasks.auto-pruning-partial.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.d.ts +6 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.js +250 -0
- package/dist/tests/tasks.auto-pruning-persistence.test.js.map +1 -0
- package/dist/tests/tasks.auto-pruning-safety.test.d.ts +12 -0
- package/dist/tests/tasks.auto-pruning-safety.test.d.ts.map +1 -0
- package/dist/tests/tasks.auto-pruning-safety.test.js +217 -0
- package/dist/tests/tasks.auto-pruning-safety.test.js.map +1 -0
- package/dist/tests/tasks.dependencies.test.js +338 -307
- package/dist/tests/tasks.dependencies.test.js.map +1 -1
- package/dist/tests/tasks.link-file-backward-compat.test.d.ts +6 -0
- package/dist/tests/tasks.link-file-backward-compat.test.d.ts.map +1 -0
- package/dist/tests/tasks.link-file-backward-compat.test.js +247 -0
- package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -0
- package/dist/tests/tasks.watch-files-action.test.d.ts +6 -0
- package/dist/tests/tasks.watch-files-action.test.d.ts.map +1 -0
- package/dist/tests/tasks.watch-files-action.test.js +372 -0
- package/dist/tests/tasks.watch-files-action.test.js.map +1 -0
- package/dist/tests/tasks.watch-files-parameter.test.d.ts +6 -0
- package/dist/tests/tasks.watch-files-parameter.test.d.ts.map +1 -0
- package/dist/tests/tasks.watch-files-parameter.test.js +260 -0
- package/dist/tests/tasks.watch-files-parameter.test.js.map +1 -0
- package/dist/tests/two-step-git-completion.test.d.ts +6 -0
- package/dist/tests/two-step-git-completion.test.d.ts.map +1 -0
- package/dist/tests/two-step-git-completion.test.js +326 -0
- package/dist/tests/two-step-git-completion.test.js.map +1 -0
- package/dist/tests/vcs-staging.test.d.ts +6 -0
- package/dist/tests/vcs-staging.test.d.ts.map +1 -0
- package/dist/tests/vcs-staging.test.js +137 -0
- package/dist/tests/vcs-staging.test.js.map +1 -0
- package/dist/tools/config.d.ts +9 -4
- package/dist/tools/config.d.ts.map +1 -1
- package/dist/tools/config.js +16 -12
- package/dist/tools/config.js.map +1 -1
- package/dist/tools/constraints.d.ts +9 -3
- package/dist/tools/constraints.d.ts.map +1 -1
- package/dist/tools/constraints.js +66 -45
- package/dist/tools/constraints.js.map +1 -1
- package/dist/tools/context.d.ts +35 -16
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +374 -314
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/files.d.ts +11 -4
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +173 -91
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/help-queries.d.ts +130 -0
- package/dist/tools/help-queries.d.ts.map +1 -0
- package/dist/tools/help-queries.js +393 -0
- package/dist/tools/help-queries.js.map +1 -0
- package/dist/tools/messaging.d.ts +13 -6
- package/dist/tools/messaging.d.ts.map +1 -1
- package/dist/tools/messaging.js +217 -129
- package/dist/tools/messaging.js.map +1 -1
- package/dist/tools/tasks.d.ts +42 -12
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +809 -347
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/utils.d.ts +13 -5
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +92 -115
- package/dist/tools/utils.js.map +1 -1
- package/dist/types.d.ts +4 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/activity-logging.d.ts +114 -0
- package/dist/utils/activity-logging.d.ts.map +1 -0
- package/dist/utils/activity-logging.js +162 -0
- package/dist/utils/activity-logging.js.map +1 -0
- package/dist/utils/batch.d.ts +2 -2
- package/dist/utils/batch.d.ts.map +1 -1
- package/dist/utils/batch.js +8 -8
- package/dist/utils/batch.js.map +1 -1
- package/dist/utils/cleanup.d.ts +21 -13
- package/dist/utils/cleanup.d.ts.map +1 -1
- package/dist/utils/cleanup.js +31 -24
- package/dist/utils/cleanup.js.map +1 -1
- package/dist/utils/debug-logger.d.ts +44 -0
- package/dist/utils/debug-logger.d.ts.map +1 -0
- package/dist/utils/debug-logger.js +116 -0
- package/dist/utils/debug-logger.js.map +1 -0
- package/dist/utils/file-pruning.d.ts +69 -0
- package/dist/utils/file-pruning.d.ts.map +1 -0
- package/dist/utils/file-pruning.js +185 -0
- package/dist/utils/file-pruning.js.map +1 -0
- package/dist/utils/help-tracking.d.ts +55 -0
- package/dist/utils/help-tracking.d.ts.map +1 -0
- package/dist/utils/help-tracking.js +88 -0
- package/dist/utils/help-tracking.js.map +1 -0
- package/dist/utils/quality-checks.d.ts +60 -0
- package/dist/utils/quality-checks.d.ts.map +1 -0
- package/dist/utils/quality-checks.js +228 -0
- package/dist/utils/quality-checks.js.map +1 -0
- package/dist/utils/retention.d.ts +13 -5
- package/dist/utils/retention.d.ts.map +1 -1
- package/dist/utils/retention.js +20 -8
- package/dist/utils/retention.js.map +1 -1
- package/dist/utils/task-stale-detection.d.ts +77 -7
- package/dist/utils/task-stale-detection.d.ts.map +1 -1
- package/dist/utils/task-stale-detection.js +309 -34
- package/dist/utils/task-stale-detection.js.map +1 -1
- package/dist/utils/token-estimation.d.ts +72 -0
- package/dist/utils/token-estimation.d.ts.map +1 -0
- package/dist/utils/token-estimation.js +71 -0
- package/dist/utils/token-estimation.js.map +1 -0
- package/dist/utils/token-logging.d.ts +48 -0
- package/dist/utils/token-logging.d.ts.map +1 -0
- package/dist/utils/token-logging.js +112 -0
- package/dist/utils/token-logging.js.map +1 -0
- package/dist/utils/vcs-adapter.d.ts +68 -0
- package/dist/utils/vcs-adapter.d.ts.map +1 -0
- package/dist/utils/vcs-adapter.js +187 -0
- package/dist/utils/vcs-adapter.js.map +1 -0
- package/dist/utils/view-queries.d.ts +34 -0
- package/dist/utils/view-queries.d.ts.map +1 -0
- package/dist/utils/view-queries.js +192 -0
- package/dist/utils/view-queries.js.map +1 -0
- package/dist/watcher/file-watcher.d.ts +54 -4
- package/dist/watcher/file-watcher.d.ts.map +1 -1
- package/dist/watcher/file-watcher.js +329 -33
- package/dist/watcher/file-watcher.js.map +1 -1
- package/dist/watcher/gitignore-parser.d.ts +70 -0
- package/dist/watcher/gitignore-parser.d.ts.map +1 -0
- package/dist/watcher/gitignore-parser.js +191 -0
- package/dist/watcher/gitignore-parser.js.map +1 -0
- package/dist/watcher/index.d.ts +1 -0
- package/dist/watcher/index.d.ts.map +1 -1
- package/dist/watcher/index.js +1 -0
- package/dist/watcher/index.js.map +1 -1
- package/docs/AI_AGENT_GUIDE.md +1 -1
- package/docs/ARCHITECTURE.md +12 -0
- package/docs/AUTO_FILE_TRACKING.md +486 -82
- package/docs/BEST_PRACTICES.md +56 -448
- package/docs/CONFIGURATION.md +908 -0
- package/docs/GIT_AWARE_AUTO_COMPLETE.md +645 -0
- package/docs/MIGRATION_v3.3.md +602 -0
- package/docs/MIGRATION_v3.6.0.md +170 -0
- package/docs/SHARED_CONCEPTS.md +65 -209
- package/docs/TASK_ACTIONS.md +12 -0
- package/docs/TASK_OVERVIEW.md +125 -24
- package/docs/TASK_PRUNING.md +589 -0
- package/docs/TASK_SYSTEM.md +83 -13
- package/docs/TOOL_REFERENCE.md +94 -6
- package/docs/TOOL_SELECTION.md +41 -248
- 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:
|
|
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
|
|
53
|
+
* @param adapter - Database adapter instance
|
|
38
54
|
* @returns Count of transitioned tasks
|
|
39
55
|
*/
|
|
40
|
-
export function detectAndTransitionStaleTasks(
|
|
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(
|
|
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(
|
|
48
|
-
const waitingReviewThresholdHours = getConfigInt(
|
|
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
|
-
|
|
72
|
+
await actualAdapter.transaction(async (trx) => {
|
|
55
73
|
// 3a. Find and transition in_progress tasks older than threshold to waiting_review
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
|
91
|
+
* @param adapter - Database adapter instance
|
|
83
92
|
* @returns Current configuration values
|
|
84
93
|
*/
|
|
85
|
-
export function getStaleDetectionConfig(
|
|
94
|
+
export async function getStaleDetectionConfig(adapter) {
|
|
95
|
+
const actualAdapter = adapter ?? getAdapter();
|
|
86
96
|
return {
|
|
87
|
-
enabled: getConfigBool(
|
|
88
|
-
inProgressThresholdHours: getConfigInt(
|
|
89
|
-
waitingReviewThresholdHours: getConfigInt(
|
|
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
|
|
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"}
|