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
package/dist/utils/cleanup.js
CHANGED
|
@@ -1,79 +1,86 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Programmatic cleanup utilities for old messages and file changes
|
|
3
3
|
* Replaces the automatic triggers with weekend-aware logic
|
|
4
|
+
*
|
|
5
|
+
* CONVERTED: Using Knex.js with DatabaseAdapter (async/await)
|
|
4
6
|
*/
|
|
5
7
|
import { calculateMessageCutoff, calculateFileChangeCutoff } from './retention.js';
|
|
6
8
|
/**
|
|
7
9
|
* Perform automatic cleanup of old data
|
|
8
10
|
* Deletes old messages, file changes, and activity logs based on m_config settings
|
|
9
11
|
*
|
|
10
|
-
* @param
|
|
12
|
+
* @param adapter - Database adapter instance
|
|
13
|
+
* @param trx - Optional transaction
|
|
11
14
|
* @returns Object with counts of deleted records
|
|
12
15
|
*/
|
|
13
|
-
export function performAutoCleanup(
|
|
14
|
-
const messageCutoff = calculateMessageCutoff(
|
|
15
|
-
const fileChangeCutoff = calculateFileChangeCutoff(
|
|
16
|
-
const messagesDeleted = cleanupMessages(
|
|
17
|
-
const fileChangesDeleted = cleanupFileChanges(
|
|
16
|
+
export async function performAutoCleanup(adapter, trx) {
|
|
17
|
+
const messageCutoff = await calculateMessageCutoff(adapter);
|
|
18
|
+
const fileChangeCutoff = await calculateFileChangeCutoff(adapter);
|
|
19
|
+
const messagesDeleted = await cleanupMessages(adapter, messageCutoff, trx);
|
|
20
|
+
const fileChangesDeleted = await cleanupFileChanges(adapter, fileChangeCutoff, trx);
|
|
18
21
|
// Activity log uses same retention as messages (constraint #4)
|
|
19
|
-
const activityLogsDeleted = cleanupActivityLogs(
|
|
22
|
+
const activityLogsDeleted = await cleanupActivityLogs(adapter, messageCutoff, trx);
|
|
20
23
|
return { messagesDeleted, fileChangesDeleted, activityLogsDeleted };
|
|
21
24
|
}
|
|
22
25
|
/**
|
|
23
26
|
* Delete old messages before the cutoff timestamp
|
|
24
27
|
*
|
|
25
|
-
* @param
|
|
28
|
+
* @param adapter - Database adapter instance
|
|
26
29
|
* @param cutoffTimestamp - Unix timestamp (seconds) for cutoff
|
|
30
|
+
* @param trx - Optional transaction
|
|
27
31
|
* @returns Number of messages deleted
|
|
28
32
|
*/
|
|
29
|
-
export function cleanupMessages(
|
|
30
|
-
const
|
|
31
|
-
return
|
|
33
|
+
export async function cleanupMessages(adapter, cutoffTimestamp, trx) {
|
|
34
|
+
const knex = trx || adapter.getKnex();
|
|
35
|
+
return await knex('t_agent_messages').where('ts', '<', cutoffTimestamp).delete();
|
|
32
36
|
}
|
|
33
37
|
/**
|
|
34
38
|
* Delete old file changes before the cutoff timestamp
|
|
35
39
|
*
|
|
36
|
-
* @param
|
|
40
|
+
* @param adapter - Database adapter instance
|
|
37
41
|
* @param cutoffTimestamp - Unix timestamp (seconds) for cutoff
|
|
42
|
+
* @param trx - Optional transaction
|
|
38
43
|
* @returns Number of file changes deleted
|
|
39
44
|
*/
|
|
40
|
-
export function cleanupFileChanges(
|
|
41
|
-
const
|
|
42
|
-
return
|
|
45
|
+
export async function cleanupFileChanges(adapter, cutoffTimestamp, trx) {
|
|
46
|
+
const knex = trx || adapter.getKnex();
|
|
47
|
+
return await knex('t_file_changes').where('ts', '<', cutoffTimestamp).delete();
|
|
43
48
|
}
|
|
44
49
|
/**
|
|
45
50
|
* Delete old activity logs before the cutoff timestamp
|
|
46
51
|
* Activity logs use the same retention as messages (constraint #4)
|
|
47
52
|
*
|
|
48
|
-
* @param
|
|
53
|
+
* @param adapter - Database adapter instance
|
|
49
54
|
* @param cutoffTimestamp - Unix timestamp (seconds) for cutoff
|
|
55
|
+
* @param trx - Optional transaction
|
|
50
56
|
* @returns Number of activity logs deleted
|
|
51
57
|
*/
|
|
52
|
-
export function cleanupActivityLogs(
|
|
53
|
-
const
|
|
54
|
-
return
|
|
58
|
+
export async function cleanupActivityLogs(adapter, cutoffTimestamp, trx) {
|
|
59
|
+
const knex = trx || adapter.getKnex();
|
|
60
|
+
return await knex('t_activity_log').where('ts', '<', cutoffTimestamp).delete();
|
|
55
61
|
}
|
|
56
62
|
/**
|
|
57
63
|
* Cleanup with custom retention periods (overrides config)
|
|
58
64
|
*
|
|
59
|
-
* @param
|
|
65
|
+
* @param adapter - Database adapter instance
|
|
60
66
|
* @param messageHours - Message retention in hours (optional)
|
|
61
67
|
* @param fileChangeDays - File change retention in days (optional)
|
|
68
|
+
* @param trx - Optional transaction
|
|
62
69
|
* @returns Object with counts of deleted records
|
|
63
70
|
*/
|
|
64
|
-
export function cleanupWithCustomRetention(
|
|
71
|
+
export async function cleanupWithCustomRetention(adapter, messageHours, fileChangeDays, trx) {
|
|
65
72
|
let messagesDeleted = 0;
|
|
66
73
|
let fileChangesDeleted = 0;
|
|
67
74
|
let activityLogsDeleted = 0;
|
|
68
75
|
if (messageHours !== undefined) {
|
|
69
76
|
const messageCutoff = Math.floor(Date.now() / 1000) - (messageHours * 3600);
|
|
70
|
-
messagesDeleted = cleanupMessages(
|
|
77
|
+
messagesDeleted = await cleanupMessages(adapter, messageCutoff, trx);
|
|
71
78
|
// Activity log uses same retention as messages (constraint #4)
|
|
72
|
-
activityLogsDeleted = cleanupActivityLogs(
|
|
79
|
+
activityLogsDeleted = await cleanupActivityLogs(adapter, messageCutoff, trx);
|
|
73
80
|
}
|
|
74
81
|
if (fileChangeDays !== undefined) {
|
|
75
82
|
const fileChangeCutoff = Math.floor(Date.now() / 1000) - (fileChangeDays * 86400);
|
|
76
|
-
fileChangesDeleted = cleanupFileChanges(
|
|
83
|
+
fileChangesDeleted = await cleanupFileChanges(adapter, fileChangeCutoff, trx);
|
|
77
84
|
}
|
|
78
85
|
return { messagesDeleted, fileChangesDeleted, activityLogsDeleted };
|
|
79
86
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/utils/cleanup.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/utils/cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debug Logger for MCP Shared Context Server
|
|
3
|
+
*
|
|
4
|
+
* Enables debug logging when specified via CLI arg, environment variable, or config file.
|
|
5
|
+
* Priority: CLI arg > Environment variable > Config file
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* node dist/index.js --debug-log=/path/to/debug.log
|
|
9
|
+
* SQLEW_DEBUG=/path/to/debug.log node dist/index.js
|
|
10
|
+
* OR set debug.log_path in .sqlew/config.toml
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Initialize debug logger
|
|
14
|
+
* @param debugLogPath - Log path (already resolved with priority: CLI > env > config)
|
|
15
|
+
*/
|
|
16
|
+
export declare function initDebugLogger(debugLogPath?: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Write debug log entry
|
|
19
|
+
* @param level - Log level (INFO, WARN, ERROR, DEBUG)
|
|
20
|
+
* @param message - Log message
|
|
21
|
+
* @param data - Optional data to log
|
|
22
|
+
*/
|
|
23
|
+
export declare function debugLog(level: 'INFO' | 'WARN' | 'ERROR' | 'DEBUG', message: string, data?: any): void;
|
|
24
|
+
/**
|
|
25
|
+
* Log MCP tool call
|
|
26
|
+
*/
|
|
27
|
+
export declare function debugLogToolCall(toolName: string, action: string, params: any): void;
|
|
28
|
+
/**
|
|
29
|
+
* Log MCP tool response
|
|
30
|
+
*/
|
|
31
|
+
export declare function debugLogToolResponse(toolName: string, action: string, success: boolean, result?: any, error?: any): void;
|
|
32
|
+
/**
|
|
33
|
+
* Log error with stack trace
|
|
34
|
+
*/
|
|
35
|
+
export declare function debugLogError(context: string, error: any): void;
|
|
36
|
+
/**
|
|
37
|
+
* Close debug logger
|
|
38
|
+
*/
|
|
39
|
+
export declare function closeDebugLogger(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Check if debug logging is enabled
|
|
42
|
+
*/
|
|
43
|
+
export declare function isDebugEnabled(): boolean;
|
|
44
|
+
//# sourceMappingURL=debug-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-logger.d.ts","sourceRoot":"","sources":["../../src/utils/debug-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAmC3D;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAoBtG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,IAAI,CAEpF;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,CAMxH;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI,CAK/D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAQvC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debug Logger for MCP Shared Context Server
|
|
3
|
+
*
|
|
4
|
+
* Enables debug logging when specified via CLI arg, environment variable, or config file.
|
|
5
|
+
* Priority: CLI arg > Environment variable > Config file
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* node dist/index.js --debug-log=/path/to/debug.log
|
|
9
|
+
* SQLEW_DEBUG=/path/to/debug.log node dist/index.js
|
|
10
|
+
* OR set debug.log_path in .sqlew/config.toml
|
|
11
|
+
*/
|
|
12
|
+
import * as fs from 'fs';
|
|
13
|
+
import * as path from 'path';
|
|
14
|
+
let debugEnabled = false;
|
|
15
|
+
let debugStream = null;
|
|
16
|
+
let currentLogPath = null;
|
|
17
|
+
/**
|
|
18
|
+
* Initialize debug logger
|
|
19
|
+
* @param debugLogPath - Log path (already resolved with priority: CLI > env > config)
|
|
20
|
+
*/
|
|
21
|
+
export function initDebugLogger(debugLogPath) {
|
|
22
|
+
if (!debugLogPath) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
currentLogPath = debugLogPath;
|
|
26
|
+
try {
|
|
27
|
+
// Ensure directory exists
|
|
28
|
+
const logDir = path.dirname(debugLogPath);
|
|
29
|
+
if (!fs.existsSync(logDir)) {
|
|
30
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
31
|
+
}
|
|
32
|
+
// Create write stream (append mode)
|
|
33
|
+
debugStream = fs.createWriteStream(debugLogPath, { flags: 'a' });
|
|
34
|
+
debugEnabled = true;
|
|
35
|
+
// Detect source (for logging purposes)
|
|
36
|
+
const cliArg = process.argv.find(arg => arg.startsWith('--debug-log'));
|
|
37
|
+
const envVar = process.env.SQLEW_DEBUG;
|
|
38
|
+
const source = cliArg ? 'CLI Argument' : envVar ? 'Environment Variable' : 'Config File';
|
|
39
|
+
const sourceDetail = cliArg ? '--debug-log' : envVar ? 'SQLEW_DEBUG' : 'debug.log_path';
|
|
40
|
+
debugLog('INFO', '='.repeat(80));
|
|
41
|
+
debugLog('INFO', `MCP Shared Context Server Debug Log Started`);
|
|
42
|
+
debugLog('INFO', `Timestamp: ${new Date().toISOString()}`);
|
|
43
|
+
debugLog('INFO', `Process ID: ${process.pid}`);
|
|
44
|
+
debugLog('INFO', `Debug Log Path: ${debugLogPath}`);
|
|
45
|
+
debugLog('INFO', `Source: ${source} (${sourceDetail})`);
|
|
46
|
+
debugLog('INFO', '='.repeat(80));
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
console.error(`Failed to initialize debug logger: ${error}`);
|
|
50
|
+
debugEnabled = false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Write debug log entry
|
|
55
|
+
* @param level - Log level (INFO, WARN, ERROR, DEBUG)
|
|
56
|
+
* @param message - Log message
|
|
57
|
+
* @param data - Optional data to log
|
|
58
|
+
*/
|
|
59
|
+
export function debugLog(level, message, data) {
|
|
60
|
+
if (!debugEnabled || !debugStream) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const timestamp = new Date().toISOString();
|
|
64
|
+
let logEntry = `[${timestamp}] [${level}] ${message}`;
|
|
65
|
+
try {
|
|
66
|
+
if (data !== undefined) {
|
|
67
|
+
const dataStr = typeof data === 'string'
|
|
68
|
+
? data
|
|
69
|
+
: JSON.stringify(data);
|
|
70
|
+
logEntry += ` | Data: ${dataStr}`;
|
|
71
|
+
}
|
|
72
|
+
debugStream.write(logEntry + '\n');
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
console.error(`Failed to write debug log: ${error}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Log MCP tool call
|
|
80
|
+
*/
|
|
81
|
+
export function debugLogToolCall(toolName, action, params) {
|
|
82
|
+
debugLog('DEBUG', `Tool Call: ${toolName}.${action}`, { params });
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Log MCP tool response
|
|
86
|
+
*/
|
|
87
|
+
export function debugLogToolResponse(toolName, action, success, result, error) {
|
|
88
|
+
debugLog(success ? 'DEBUG' : 'ERROR', `Tool Response: ${toolName}.${action} ${success ? 'SUCCESS' : 'FAILED'}`, success ? result : error);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Log error with stack trace
|
|
92
|
+
*/
|
|
93
|
+
export function debugLogError(context, error) {
|
|
94
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
95
|
+
const stack = error instanceof Error ? error.stack : undefined;
|
|
96
|
+
debugLog('ERROR', `${context}: ${errorMessage}`, { stack });
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Close debug logger
|
|
100
|
+
*/
|
|
101
|
+
export function closeDebugLogger() {
|
|
102
|
+
if (debugStream) {
|
|
103
|
+
debugLog('INFO', 'MCP Shared Context Server Debug Log Ended');
|
|
104
|
+
debugLog('INFO', '='.repeat(80));
|
|
105
|
+
debugStream.end();
|
|
106
|
+
debugStream = null;
|
|
107
|
+
debugEnabled = false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Check if debug logging is enabled
|
|
112
|
+
*/
|
|
113
|
+
export function isDebugEnabled() {
|
|
114
|
+
return debugEnabled;
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=debug-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"debug-logger.js","sourceRoot":"","sources":["../../src/utils/debug-logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File pruning utilities for v3.5.0 Auto-Pruning feature
|
|
3
|
+
* Automatically removes non-existent watched files with audit trail
|
|
4
|
+
*/
|
|
5
|
+
import { Database } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Prune non-existent files from a task's watch list
|
|
8
|
+
* Records pruned files to audit table for project archaeology
|
|
9
|
+
*
|
|
10
|
+
* Quality gate enforcement:
|
|
11
|
+
* - If ALL watched files are non-existent → throw error (prevents zero-work completion)
|
|
12
|
+
* - If SOME watched files are non-existent → prune them and continue
|
|
13
|
+
*
|
|
14
|
+
* @param db - Database instance
|
|
15
|
+
* @param taskId - Task ID to prune files for
|
|
16
|
+
* @param projectRoot - Project root directory (default: process.cwd())
|
|
17
|
+
* @returns Object with pruned count and remaining count
|
|
18
|
+
* @throws Error if ALL files are non-existent (safety check)
|
|
19
|
+
*/
|
|
20
|
+
export declare function pruneNonExistentFiles(db: Database, taskId: number, projectRoot?: string): {
|
|
21
|
+
prunedCount: number;
|
|
22
|
+
remainingCount: number;
|
|
23
|
+
prunedPaths: string[];
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Get pruned files for a task
|
|
27
|
+
*
|
|
28
|
+
* @param db - Database instance
|
|
29
|
+
* @param taskId - Task ID
|
|
30
|
+
* @param limit - Maximum number of records (default: 100)
|
|
31
|
+
* @returns Array of pruned file records
|
|
32
|
+
*/
|
|
33
|
+
export declare function getPrunedFiles(db: Database, taskId: number, limit?: number): Array<{
|
|
34
|
+
id: number;
|
|
35
|
+
file_path: string;
|
|
36
|
+
pruned_at: string;
|
|
37
|
+
linked_decision: string | null;
|
|
38
|
+
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Link a pruned file to a decision (for WHY reasoning)
|
|
41
|
+
*
|
|
42
|
+
* @param db - Database instance
|
|
43
|
+
* @param prunedFileId - Pruned file record ID
|
|
44
|
+
* @param decisionKey - Decision key to link
|
|
45
|
+
* @throws Error if pruned file or decision not found
|
|
46
|
+
*/
|
|
47
|
+
export declare function linkPrunedFileToDecision(db: Database, prunedFileId: number, decisionKey: string): void;
|
|
48
|
+
/**
|
|
49
|
+
* Get all pruned files across all tasks (for audit purposes)
|
|
50
|
+
*
|
|
51
|
+
* @param db - Database instance
|
|
52
|
+
* @param filters - Optional filters
|
|
53
|
+
* @returns Array of pruned file records with task info
|
|
54
|
+
*/
|
|
55
|
+
export declare function getAllPrunedFiles(db: Database, filters?: {
|
|
56
|
+
taskId?: number;
|
|
57
|
+
linkedDecision?: string;
|
|
58
|
+
since?: number;
|
|
59
|
+
limit?: number;
|
|
60
|
+
offset?: number;
|
|
61
|
+
}): Array<{
|
|
62
|
+
id: number;
|
|
63
|
+
task_id: number;
|
|
64
|
+
task_title: string;
|
|
65
|
+
file_path: string;
|
|
66
|
+
pruned_at: string;
|
|
67
|
+
linked_decision: string | null;
|
|
68
|
+
}>;
|
|
69
|
+
//# sourceMappingURL=file-pruning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-pruning.d.ts","sourceRoot":"","sources":["../../src/utils/file-pruning.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIvC;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,GAAE,MAAsB,GAClC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAoExE;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAY,GAClB,KAAK,CAAC;IACP,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC,CAoBD;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,QAAQ,EACZ,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,IAAI,CAiCN;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,EACZ,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GACA,KAAK,CAAC;IACP,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAChC,CAAC,CAoDD"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File pruning utilities for v3.5.0 Auto-Pruning feature
|
|
3
|
+
* Automatically removes non-existent watched files with audit trail
|
|
4
|
+
*/
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { join } from 'path';
|
|
7
|
+
/**
|
|
8
|
+
* Prune non-existent files from a task's watch list
|
|
9
|
+
* Records pruned files to audit table for project archaeology
|
|
10
|
+
*
|
|
11
|
+
* Quality gate enforcement:
|
|
12
|
+
* - If ALL watched files are non-existent → throw error (prevents zero-work completion)
|
|
13
|
+
* - If SOME watched files are non-existent → prune them and continue
|
|
14
|
+
*
|
|
15
|
+
* @param db - Database instance
|
|
16
|
+
* @param taskId - Task ID to prune files for
|
|
17
|
+
* @param projectRoot - Project root directory (default: process.cwd())
|
|
18
|
+
* @returns Object with pruned count and remaining count
|
|
19
|
+
* @throws Error if ALL files are non-existent (safety check)
|
|
20
|
+
*/
|
|
21
|
+
export function pruneNonExistentFiles(db, taskId, projectRoot = process.cwd()) {
|
|
22
|
+
// 1. Get all watched files for this task
|
|
23
|
+
const watchedFiles = db.prepare(`
|
|
24
|
+
SELECT f.id as file_id, f.path
|
|
25
|
+
FROM t_task_file_links tfl
|
|
26
|
+
JOIN m_files f ON tfl.file_id = f.id
|
|
27
|
+
WHERE tfl.task_id = ?
|
|
28
|
+
`).all(taskId);
|
|
29
|
+
if (watchedFiles.length === 0) {
|
|
30
|
+
// No watched files - nothing to prune
|
|
31
|
+
return { prunedCount: 0, remainingCount: 0, prunedPaths: [] };
|
|
32
|
+
}
|
|
33
|
+
// 2. Check which files exist on filesystem
|
|
34
|
+
const existingFiles = [];
|
|
35
|
+
const nonExistentFiles = [];
|
|
36
|
+
for (const file of watchedFiles) {
|
|
37
|
+
const fullPath = join(projectRoot, file.path);
|
|
38
|
+
if (existsSync(fullPath)) {
|
|
39
|
+
existingFiles.push(file);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
nonExistentFiles.push(file);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// 3. Safety check: If ALL files are non-existent, block the operation
|
|
46
|
+
if (nonExistentFiles.length === watchedFiles.length) {
|
|
47
|
+
throw new Error(`Cannot prune files for task #${taskId}: ALL ${watchedFiles.length} watched files are non-existent. ` +
|
|
48
|
+
`This indicates no work was done. Please verify watched files or mark task as invalid.`);
|
|
49
|
+
}
|
|
50
|
+
// 4. If no files need pruning, return early
|
|
51
|
+
if (nonExistentFiles.length === 0) {
|
|
52
|
+
return {
|
|
53
|
+
prunedCount: 0,
|
|
54
|
+
remainingCount: watchedFiles.length,
|
|
55
|
+
prunedPaths: [],
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
// 5. Prune non-existent files in a transaction
|
|
59
|
+
db.transaction(() => {
|
|
60
|
+
const insertPruned = db.prepare(`
|
|
61
|
+
INSERT INTO t_task_pruned_files (task_id, file_path, pruned_ts)
|
|
62
|
+
VALUES (?, ?, unixepoch())
|
|
63
|
+
`);
|
|
64
|
+
const deleteLink = db.prepare(`
|
|
65
|
+
DELETE FROM t_task_file_links
|
|
66
|
+
WHERE task_id = ? AND file_id = ?
|
|
67
|
+
`);
|
|
68
|
+
// Record each pruned file to audit table and remove link
|
|
69
|
+
for (const file of nonExistentFiles) {
|
|
70
|
+
insertPruned.run(taskId, file.path);
|
|
71
|
+
deleteLink.run(taskId, file.file_id);
|
|
72
|
+
}
|
|
73
|
+
})();
|
|
74
|
+
return {
|
|
75
|
+
prunedCount: nonExistentFiles.length,
|
|
76
|
+
remainingCount: existingFiles.length,
|
|
77
|
+
prunedPaths: nonExistentFiles.map(f => f.path),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get pruned files for a task
|
|
82
|
+
*
|
|
83
|
+
* @param db - Database instance
|
|
84
|
+
* @param taskId - Task ID
|
|
85
|
+
* @param limit - Maximum number of records (default: 100)
|
|
86
|
+
* @returns Array of pruned file records
|
|
87
|
+
*/
|
|
88
|
+
export function getPrunedFiles(db, taskId, limit = 100) {
|
|
89
|
+
const rows = db.prepare(`
|
|
90
|
+
SELECT
|
|
91
|
+
tpf.id,
|
|
92
|
+
tpf.file_path,
|
|
93
|
+
datetime(tpf.pruned_ts, 'unixepoch') as pruned_at,
|
|
94
|
+
k.key as linked_decision
|
|
95
|
+
FROM t_task_pruned_files tpf
|
|
96
|
+
LEFT JOIN m_context_keys k ON tpf.linked_decision_key_id = k.id
|
|
97
|
+
WHERE tpf.task_id = ?
|
|
98
|
+
ORDER BY tpf.pruned_ts DESC
|
|
99
|
+
LIMIT ?
|
|
100
|
+
`).all(taskId, limit);
|
|
101
|
+
return rows;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Link a pruned file to a decision (for WHY reasoning)
|
|
105
|
+
*
|
|
106
|
+
* @param db - Database instance
|
|
107
|
+
* @param prunedFileId - Pruned file record ID
|
|
108
|
+
* @param decisionKey - Decision key to link
|
|
109
|
+
* @throws Error if pruned file or decision not found
|
|
110
|
+
*/
|
|
111
|
+
export function linkPrunedFileToDecision(db, prunedFileId, decisionKey) {
|
|
112
|
+
// 1. Get decision key_id
|
|
113
|
+
const decision = db.prepare(`
|
|
114
|
+
SELECT k.id as key_id
|
|
115
|
+
FROM m_context_keys k
|
|
116
|
+
WHERE k.key = ? AND EXISTS (
|
|
117
|
+
SELECT 1 FROM t_decisions d WHERE d.key_id = k.id
|
|
118
|
+
)
|
|
119
|
+
`).get(decisionKey);
|
|
120
|
+
if (!decision) {
|
|
121
|
+
throw new Error(`Decision not found: ${decisionKey}`);
|
|
122
|
+
}
|
|
123
|
+
// 2. Check if pruned file exists
|
|
124
|
+
const prunedFile = db.prepare(`
|
|
125
|
+
SELECT id FROM t_task_pruned_files WHERE id = ?
|
|
126
|
+
`).get(prunedFileId);
|
|
127
|
+
if (!prunedFile) {
|
|
128
|
+
throw new Error(`Pruned file record not found: ${prunedFileId}`);
|
|
129
|
+
}
|
|
130
|
+
// 3. Update the link
|
|
131
|
+
const result = db.prepare(`
|
|
132
|
+
UPDATE t_task_pruned_files
|
|
133
|
+
SET linked_decision_key_id = ?
|
|
134
|
+
WHERE id = ?
|
|
135
|
+
`).run(decision.key_id, prunedFileId);
|
|
136
|
+
if (result.changes === 0) {
|
|
137
|
+
throw new Error(`Failed to link pruned file #${prunedFileId} to decision ${decisionKey}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get all pruned files across all tasks (for audit purposes)
|
|
142
|
+
*
|
|
143
|
+
* @param db - Database instance
|
|
144
|
+
* @param filters - Optional filters
|
|
145
|
+
* @returns Array of pruned file records with task info
|
|
146
|
+
*/
|
|
147
|
+
export function getAllPrunedFiles(db, filters) {
|
|
148
|
+
let query = `
|
|
149
|
+
SELECT
|
|
150
|
+
tpf.id,
|
|
151
|
+
tpf.task_id,
|
|
152
|
+
t.title as task_title,
|
|
153
|
+
tpf.file_path,
|
|
154
|
+
datetime(tpf.pruned_ts, 'unixepoch') as pruned_at,
|
|
155
|
+
k.key as linked_decision
|
|
156
|
+
FROM t_task_pruned_files tpf
|
|
157
|
+
JOIN t_tasks t ON tpf.task_id = t.id
|
|
158
|
+
LEFT JOIN m_context_keys k ON tpf.linked_decision_key_id = k.id
|
|
159
|
+
WHERE 1=1
|
|
160
|
+
`;
|
|
161
|
+
const params = [];
|
|
162
|
+
if (filters?.taskId !== undefined) {
|
|
163
|
+
query += ' AND tpf.task_id = ?';
|
|
164
|
+
params.push(filters.taskId);
|
|
165
|
+
}
|
|
166
|
+
if (filters?.linkedDecision) {
|
|
167
|
+
query += ' AND k.key = ?';
|
|
168
|
+
params.push(filters.linkedDecision);
|
|
169
|
+
}
|
|
170
|
+
if (filters?.since !== undefined) {
|
|
171
|
+
query += ' AND tpf.pruned_ts >= ?';
|
|
172
|
+
params.push(filters.since);
|
|
173
|
+
}
|
|
174
|
+
query += ' ORDER BY tpf.pruned_ts DESC';
|
|
175
|
+
if (filters?.limit) {
|
|
176
|
+
query += ' LIMIT ?';
|
|
177
|
+
params.push(filters.limit);
|
|
178
|
+
}
|
|
179
|
+
if (filters?.offset) {
|
|
180
|
+
query += ' OFFSET ?';
|
|
181
|
+
params.push(filters.offset);
|
|
182
|
+
}
|
|
183
|
+
return db.prepare(query).all(...params);
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=file-pruning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-pruning.js","sourceRoot":"","sources":["../../src/utils/file-pruning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Help Action Usage Tracking
|
|
3
|
+
*
|
|
4
|
+
* Lightweight logging system to track help/example action invocations
|
|
5
|
+
* for understanding usage patterns and optimizing documentation.
|
|
6
|
+
*
|
|
7
|
+
* Data collected:
|
|
8
|
+
* - tool_name: Which MCP tool invoked help/example
|
|
9
|
+
* - action_name: "help" or "example"
|
|
10
|
+
* - timestamp: When the action was invoked
|
|
11
|
+
* - token_count: Estimated tokens in request + response
|
|
12
|
+
*
|
|
13
|
+
* Storage: Temporary log file in .sqlew/tmp/help-usage.log
|
|
14
|
+
* Format: JSON lines (one JSON object per line for easy parsing)
|
|
15
|
+
* Retention: Manual cleanup after 1-2 week analysis period
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Help action invocation record
|
|
19
|
+
*/
|
|
20
|
+
export interface HelpUsageRecord {
|
|
21
|
+
tool_name: string;
|
|
22
|
+
action_name: 'help' | 'example';
|
|
23
|
+
timestamp: string;
|
|
24
|
+
token_count: number;
|
|
25
|
+
context?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Log a help action invocation
|
|
29
|
+
* Appends JSON line to log file for analysis
|
|
30
|
+
*
|
|
31
|
+
* @param record - Help usage record to log
|
|
32
|
+
*/
|
|
33
|
+
export declare function logHelpUsage(record: HelpUsageRecord): void;
|
|
34
|
+
/**
|
|
35
|
+
* Estimate token count for help/example action
|
|
36
|
+
* Rough estimation based on response length
|
|
37
|
+
*
|
|
38
|
+
* @param toolName - Name of the MCP tool
|
|
39
|
+
* @param actionName - "help" or "example"
|
|
40
|
+
* @param responseLength - Length of response text
|
|
41
|
+
* @returns Estimated token count (request + response)
|
|
42
|
+
*/
|
|
43
|
+
export declare function estimateHelpTokens(toolName: string, actionName: 'help' | 'example', responseLength: number): number;
|
|
44
|
+
/**
|
|
45
|
+
* Track help action and return the help content
|
|
46
|
+
* Convenience wrapper that logs and returns content
|
|
47
|
+
*
|
|
48
|
+
* @param toolName - Name of the MCP tool
|
|
49
|
+
* @param actionName - "help" or "example"
|
|
50
|
+
* @param content - Help content to return
|
|
51
|
+
* @param context - Optional context about what triggered help
|
|
52
|
+
* @returns The help content (pass-through)
|
|
53
|
+
*/
|
|
54
|
+
export declare function trackAndReturnHelp(toolName: string, actionName: 'help' | 'example', content: string, context?: string): string;
|
|
55
|
+
//# sourceMappingURL=help-tracking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help-tracking.d.ts","sourceRoot":"","sources":["../../src/utils/help-tracking.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAkBD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAW1D;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,cAAc,EAAE,MAAM,GACrB,MAAM,CAQR;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAYR"}
|