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