sqlew 3.6.10 → 3.7.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 +318 -0
- package/README.md +54 -39
- package/assets/config.example.toml +93 -0
- package/assets/kanban-visualizer.png +0 -0
- package/assets/sample-agents/sqlew-architect.md +32 -13
- package/assets/sample-agents/sqlew-researcher.md +70 -17
- package/assets/sample-agents/sqlew-scrum-master.md +60 -25
- package/assets/schema.sql +2 -2
- package/dist/adapters/auth/auth-factory.d.ts +86 -0
- package/dist/adapters/auth/auth-factory.d.ts.map +1 -0
- package/dist/adapters/auth/auth-factory.js +103 -0
- package/dist/adapters/auth/auth-factory.js.map +1 -0
- package/dist/adapters/auth/auth-types.d.ts +30 -0
- package/dist/adapters/auth/auth-types.d.ts.map +1 -0
- package/dist/adapters/auth/auth-types.js +30 -0
- package/dist/adapters/auth/auth-types.js.map +1 -0
- package/dist/adapters/auth/base-auth-provider.d.ts +327 -0
- package/dist/adapters/auth/base-auth-provider.d.ts.map +1 -0
- package/dist/adapters/auth/base-auth-provider.js +111 -0
- package/dist/adapters/auth/base-auth-provider.js.map +1 -0
- package/dist/adapters/auth/direct-auth-provider.d.ts +356 -0
- package/dist/adapters/auth/direct-auth-provider.d.ts.map +1 -0
- package/dist/adapters/auth/direct-auth-provider.js +406 -0
- package/dist/adapters/auth/direct-auth-provider.js.map +1 -0
- package/dist/adapters/base-adapter.d.ts +638 -0
- package/dist/adapters/base-adapter.d.ts.map +1 -0
- package/dist/adapters/base-adapter.js +557 -0
- package/dist/adapters/base-adapter.js.map +1 -0
- package/dist/adapters/index.d.ts +13 -2
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +27 -5
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/mysql-adapter.d.ts +547 -6
- package/dist/adapters/mysql-adapter.d.ts.map +1 -1
- package/dist/adapters/mysql-adapter.js +651 -32
- package/dist/adapters/mysql-adapter.js.map +1 -1
- package/dist/adapters/postgresql-adapter.d.ts +15 -4
- package/dist/adapters/postgresql-adapter.d.ts.map +1 -1
- package/dist/adapters/postgresql-adapter.js +19 -2
- package/dist/adapters/postgresql-adapter.js.map +1 -1
- package/dist/adapters/sqlite-adapter.d.ts +35 -5
- package/dist/adapters/sqlite-adapter.d.ts.map +1 -1
- package/dist/adapters/sqlite-adapter.js +57 -18
- package/dist/adapters/sqlite-adapter.js.map +1 -1
- package/dist/cli/db-dump.d.ts +32 -0
- package/dist/cli/db-dump.d.ts.map +1 -0
- package/dist/cli/db-dump.js +409 -0
- package/dist/cli/db-dump.js.map +1 -0
- package/dist/cli.js +24 -14
- package/dist/cli.js.map +1 -1
- package/dist/config/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025020452_create_master_tables.js +7 -2
- package/dist/config/knex/bootstrap/20251025020452_create_master_tables.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025021152_create_transaction_tables.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025021152_create_transaction_tables.js +49 -50
- package/dist/config/knex/bootstrap/20251025021152_create_transaction_tables.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025021351_create_indexes.d.ts.map +1 -0
- package/dist/config/knex/bootstrap/20251025021351_create_indexes.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025021416_seed_master_data.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025021416_seed_master_data.js +11 -6
- package/dist/config/knex/bootstrap/20251025021416_seed_master_data.js.map +1 -0
- package/dist/config/knex/bootstrap/20251025070349_create_views.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/bootstrap/20251025070349_create_views.js +66 -14
- package/dist/config/knex/bootstrap/20251025070349_create_views.js.map +1 -0
- package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js +22 -0
- package/dist/config/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js.map +1 -0
- package/dist/config/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251025082220_fix_task_dependencies_columns.js.map +1 -0
- package/dist/config/knex/enhancements/20251025090000_create_help_system_tables.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025090000_create_help_system_tables.js +6 -0
- package/dist/config/knex/enhancements/20251025090000_create_help_system_tables.js.map +1 -0
- package/dist/config/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js +6 -0
- package/dist/config/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js.map +1 -0
- package/dist/config/knex/enhancements/20251025100000_seed_help_metadata.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025100000_seed_help_metadata.js +6 -0
- package/dist/config/knex/enhancements/20251025100000_seed_help_metadata.js.map +1 -0
- package/dist/config/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251025100100_seed_remaining_use_cases.js.map +1 -0
- package/dist/config/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js +7 -0
- package/dist/config/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js.map +1 -0
- package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.js +62 -0
- package/dist/config/knex/enhancements/20251027000000_add_agent_reuse_system.js.map +1 -0
- package/dist/config/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js.map +1 -0
- package/dist/config/knex/enhancements/20251027020000_update_agent_reusability.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251027020000_update_agent_reusability.js +6 -0
- package/dist/config/knex/enhancements/20251027020000_update_agent_reusability.js.map +1 -0
- package/dist/config/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +1 -0
- package/dist/{migrations → config}/knex/enhancements/20251028000000_simplify_agent_system.js +6 -0
- package/dist/config/knex/enhancements/20251028000000_simplify_agent_system.js.map +1 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.d.ts +13 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.js +48 -0
- package/dist/config/knex/enhancements/20251031000000_drop_orphaned_message_view.js.map +1 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.d.ts +24 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.js +189 -0
- package/dist/config/knex/enhancements/20251104000003_rename_constraints_created_by_to_agent_id.js.map +1 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.d.ts +16 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.js +65 -0
- package/dist/config/knex/enhancements/20251105000000_add_token_usage_table.js.map +1 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.d.ts +23 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.d.ts.map +1 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.js +118 -0
- package/dist/config/knex/enhancements/20251105000001_rename_decision_context_decided_by_to_agent_id.js.map +1 -0
- package/dist/config/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js.map +1 -0
- package/dist/config/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js.map +1 -0
- package/dist/config/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js.map +1 -0
- package/dist/config/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js.map +1 -0
- package/dist/config/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js.map +1 -0
- package/dist/config/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js.map +1 -0
- package/dist/config/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js.map +1 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts +49 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.d.ts.map +1 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js +864 -0
- package/dist/config/knex/upgrades/20251104000000_add_multi_project_v3_7_0.js.map +1 -0
- package/dist/config/loader.d.ts +19 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +149 -4
- package/dist/config/loader.js.map +1 -1
- package/dist/config/types.d.ts +261 -2
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js.map +1 -1
- package/dist/config/writer.d.ts +65 -0
- package/dist/config/writer.d.ts.map +1 -0
- package/dist/config/writer.js +139 -0
- package/dist/config/writer.js.map +1 -0
- package/dist/database.d.ts +11 -2
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +62 -6
- package/dist/database.js.map +1 -1
- package/dist/index.js +165 -35
- package/dist/index.js.map +1 -1
- package/dist/knexfile.d.ts.map +1 -1
- package/dist/knexfile.js +88 -12
- package/dist/knexfile.js.map +1 -1
- package/dist/tests/all-features.test.js +15 -3
- package/dist/tests/all-features.test.js.map +1 -1
- package/dist/tests/config-loader.test.d.ts +6 -0
- package/dist/tests/config-loader.test.d.ts.map +1 -0
- package/dist/tests/config-loader.test.js +201 -0
- package/dist/tests/config-loader.test.js.map +1 -0
- package/dist/tests/connection-manager-integration.test.d.ts +2 -0
- package/dist/tests/connection-manager-integration.test.d.ts.map +1 -0
- package/dist/tests/connection-manager-integration.test.js +431 -0
- package/dist/tests/connection-manager-integration.test.js.map +1 -0
- package/dist/tests/connection-manager.test.d.ts +2 -0
- package/dist/tests/connection-manager.test.d.ts.map +1 -0
- package/dist/tests/connection-manager.test.js +361 -0
- package/dist/tests/connection-manager.test.js.map +1 -0
- package/dist/tests/dump-import.test.d.ts +15 -0
- package/dist/tests/dump-import.test.d.ts.map +1 -0
- package/dist/tests/dump-import.test.js +430 -0
- package/dist/tests/dump-import.test.js.map +1 -0
- package/dist/tests/migration-idempotency.test.d.ts +2 -0
- package/dist/tests/migration-idempotency.test.d.ts.map +1 -0
- package/dist/tests/migration-idempotency.test.js +330 -0
- package/dist/tests/migration-idempotency.test.js.map +1 -0
- package/dist/tests/migration-upgrade-paths.test.d.ts +2 -0
- package/dist/tests/migration-upgrade-paths.test.d.ts.map +1 -0
- package/dist/tests/migration-upgrade-paths.test.js +248 -0
- package/dist/tests/migration-upgrade-paths.test.js.map +1 -0
- package/dist/tests/multi-project-migration.test.d.ts +17 -0
- package/dist/tests/multi-project-migration.test.d.ts.map +1 -0
- package/dist/tests/multi-project-migration.test.js +399 -0
- package/dist/tests/multi-project-migration.test.js.map +1 -0
- package/dist/tests/multi-project.test.d.ts +5 -0
- package/dist/tests/multi-project.test.d.ts.map +1 -0
- package/dist/tests/multi-project.test.js +238 -0
- package/dist/tests/multi-project.test.js.map +1 -0
- package/dist/tests/schema-migration.test.d.ts +8 -0
- package/dist/tests/schema-migration.test.d.ts.map +1 -0
- package/dist/tests/schema-migration.test.js +108 -0
- package/dist/tests/schema-migration.test.js.map +1 -0
- package/dist/tests/sql-dump-converters.test.d.ts +7 -0
- package/dist/tests/sql-dump-converters.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-converters.test.js +314 -0
- package/dist/tests/sql-dump-converters.test.js.map +1 -0
- package/dist/tests/sql-dump-cross-database.test.d.ts +21 -0
- package/dist/tests/sql-dump-cross-database.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-cross-database.test.js +314 -0
- package/dist/tests/sql-dump-cross-database.test.js.map +1 -0
- package/dist/tests/sql-dump-default-conversions.test.d.ts +8 -0
- package/dist/tests/sql-dump-default-conversions.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-default-conversions.test.js +141 -0
- package/dist/tests/sql-dump-default-conversions.test.js.map +1 -0
- package/dist/tests/sql-dump-fk-constraints.test.d.ts +13 -0
- package/dist/tests/sql-dump-fk-constraints.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-fk-constraints.test.js +381 -0
- package/dist/tests/sql-dump-fk-constraints.test.js.map +1 -0
- package/dist/tests/sql-dump-indexes.test.d.ts +12 -0
- package/dist/tests/sql-dump-indexes.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-indexes.test.js +269 -0
- package/dist/tests/sql-dump-indexes.test.js.map +1 -0
- package/dist/tests/sql-dump-integration.test.d.ts +16 -0
- package/dist/tests/sql-dump-integration.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-integration.test.js +342 -0
- package/dist/tests/sql-dump-integration.test.js.map +1 -0
- package/dist/tests/sql-dump-table-ordering.test.d.ts +8 -0
- package/dist/tests/sql-dump-table-ordering.test.d.ts.map +1 -0
- package/dist/tests/sql-dump-table-ordering.test.js +253 -0
- package/dist/tests/sql-dump-table-ordering.test.js.map +1 -0
- package/dist/tests/tasks.link-file-backward-compat.test.js +11 -1
- package/dist/tests/tasks.link-file-backward-compat.test.js.map +1 -1
- package/dist/tests/tasks.watch-files-action.test.js +11 -1
- package/dist/tests/tasks.watch-files-action.test.js.map +1 -1
- package/dist/tests/type-conversion.test.d.ts +8 -0
- package/dist/tests/type-conversion.test.d.ts.map +1 -0
- package/dist/tests/type-conversion.test.js +312 -0
- package/dist/tests/type-conversion.test.js.map +1 -0
- package/dist/tests/utils/test-helpers.d.ts +93 -0
- package/dist/tests/utils/test-helpers.d.ts.map +1 -0
- package/dist/tests/utils/test-helpers.js +407 -0
- package/dist/tests/utils/test-helpers.js.map +1 -0
- package/dist/tools/config.d.ts +58 -0
- package/dist/tools/config.d.ts.map +1 -0
- package/dist/tools/config.js +281 -0
- package/dist/tools/config.js.map +1 -0
- package/dist/tools/constraints.d.ts.map +1 -1
- package/dist/tools/constraints.js +138 -122
- package/dist/tools/constraints.js.map +1 -1
- package/dist/tools/context.d.ts.map +1 -1
- package/dist/tools/context.js +216 -109
- package/dist/tools/context.js.map +1 -1
- package/dist/tools/files.d.ts.map +1 -1
- package/dist/tools/files.js +123 -102
- package/dist/tools/files.js.map +1 -1
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +581 -518
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/utils.d.ts +5 -0
- package/dist/tools/utils.d.ts.map +1 -1
- package/dist/tools/utils.js +176 -122
- package/dist/tools/utils.js.map +1 -1
- package/dist/types.d.ts +9 -26
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/cleanup.d.ts +3 -0
- package/dist/utils/cleanup.d.ts.map +1 -1
- package/dist/utils/cleanup.js +14 -2
- package/dist/utils/cleanup.js.map +1 -1
- package/dist/utils/connection-manager.d.ts +59 -0
- package/dist/utils/connection-manager.d.ts.map +1 -0
- package/dist/utils/connection-manager.js +178 -0
- package/dist/utils/connection-manager.js.map +1 -0
- package/dist/utils/debug-logger.d.ts +8 -4
- package/dist/utils/debug-logger.d.ts.map +1 -1
- package/dist/utils/debug-logger.js +27 -7
- package/dist/utils/debug-logger.js.map +1 -1
- package/dist/utils/error-handler.d.ts +2 -2
- package/dist/utils/error-handler.d.ts.map +1 -1
- package/dist/utils/error-handler.js +10 -7
- package/dist/utils/error-handler.js.map +1 -1
- package/dist/utils/parameter-validator.d.ts.map +1 -1
- package/dist/utils/parameter-validator.js +36 -15
- package/dist/utils/parameter-validator.js.map +1 -1
- package/dist/utils/project-context.d.ts +111 -0
- package/dist/utils/project-context.d.ts.map +1 -0
- package/dist/utils/project-context.js +187 -0
- package/dist/utils/project-context.js.map +1 -0
- package/dist/utils/sql-dump-converters.d.ts +188 -0
- package/dist/utils/sql-dump-converters.d.ts.map +1 -0
- package/dist/utils/sql-dump-converters.js +311 -0
- package/dist/utils/sql-dump-converters.js.map +1 -0
- package/dist/utils/sql-dump.d.ts +102 -0
- package/dist/utils/sql-dump.d.ts.map +1 -0
- package/dist/utils/sql-dump.js +1550 -0
- package/dist/utils/sql-dump.js.map +1 -0
- package/dist/utils/vcs-adapter.d.ts +42 -0
- package/dist/utils/vcs-adapter.d.ts.map +1 -1
- package/dist/utils/vcs-adapter.js +154 -0
- package/dist/utils/vcs-adapter.js.map +1 -1
- package/docs/BASEADAPTER_IMPLEMENTATION.md +399 -0
- package/docs/DATABASE_AUTH.md +445 -0
- package/docs/DATABASE_MIGRATION.md +247 -0
- package/docs/MULTI_PROJECT_ARCHITECTURE.md +497 -0
- package/package.json +12 -4
- package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025020452_create_master_tables.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021152_create_transaction_tables.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021351_create_indexes.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021351_create_indexes.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021416_seed_master_data.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025021416_seed_master_data.js.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025070349_create_views.d.ts.map +0 -1
- package/dist/migrations/knex/bootstrap/20251025070349_create_views.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js +0 -15
- package/dist/migrations/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025082220_fix_task_dependencies_columns.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090000_create_help_system_tables.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090000_create_help_system_tables.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100000_seed_help_metadata.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100000_seed_help_metadata.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025100100_seed_remaining_use_cases.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.js +0 -34
- package/dist/migrations/knex/enhancements/20251027000000_add_agent_reuse_system.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251027020000_update_agent_reusability.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251027020000_update_agent_reusability.js.map +0 -1
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.d.ts.map +0 -1
- package/dist/migrations/knex/enhancements/20251028000000_simplify_agent_system.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js.map +0 -1
- package/dist/migrations/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts.map +0 -1
- package/dist/migrations/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js.map +0 -1
- /package/dist/{migrations → config}/knex/bootstrap/20251025020452_create_master_tables.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021152_create_transaction_tables.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021351_create_indexes.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021351_create_indexes.js +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025021416_seed_master_data.d.ts +0 -0
- /package/dist/{migrations → config}/knex/bootstrap/20251025070349_create_views.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025081221_add_link_type_to_task_decision_links.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025082220_fix_task_dependencies_columns.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025082220_fix_task_dependencies_columns.js +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025090000_create_help_system_tables.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025090100_seed_help_categories_and_use_cases.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025100000_seed_help_metadata.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025100100_seed_remaining_use_cases.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025100100_seed_remaining_use_cases.js +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251025120000_add_cascade_to_task_dependencies.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027000000_add_agent_reuse_system.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027010000_add_task_constraint_to_decision_context.js +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251027020000_update_agent_reusability.d.ts +0 -0
- /package/dist/{migrations → config}/knex/enhancements/20251028000000_simplify_agent_system.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024010000_upgrade_v1_0_to_v1_1.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024020000_upgrade_v2_0_to_v2_1.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024030000_upgrade_v2_1_to_v3_0.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024040000_upgrade_v3_0_to_v3_2.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024050000_upgrade_v3_2_0_to_v3_2_2.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024060000_upgrade_v3_4_to_v3_5.js +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.d.ts +0 -0
- /package/dist/{migrations → config}/knex/upgrades/20251024070000_upgrade_v3_5_to_v3_6.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tools/context.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/context.js
CHANGED
|
@@ -5,12 +5,14 @@
|
|
|
5
5
|
* CONVERTED: Using Knex.js with DatabaseAdapter (async/await)
|
|
6
6
|
*/
|
|
7
7
|
import { getAdapter, getOrCreateAgent, getOrCreateContextKey, getOrCreateTag, getOrCreateScope, getLayerId, addDecisionContext as dbAddDecisionContext, getDecisionWithContext as dbGetDecisionWithContext, listDecisionContexts as dbListDecisionContexts } from '../database.js';
|
|
8
|
+
import { getProjectContext } from '../utils/project-context.js';
|
|
8
9
|
import { STRING_TO_STATUS, DEFAULT_VERSION, DEFAULT_STATUS } from '../constants.js';
|
|
9
10
|
import { validateRequired, validateStatus } from '../utils/validators.js';
|
|
10
11
|
import { logDecisionSet, logDecisionUpdate, recordDecisionHistory } from '../utils/activity-logging.js';
|
|
11
12
|
import { parseStringArray } from '../utils/param-parser.js';
|
|
12
13
|
import { validateActionParams, validateBatchParams } from '../utils/parameter-validator.js';
|
|
13
|
-
import
|
|
14
|
+
import connectionManager from '../utils/connection-manager.js';
|
|
15
|
+
import { debugLog, debugLogFunctionEntry, debugLogFunctionExit, debugLogTransaction, debugLogCriticalError } from '../utils/debug-logger.js';
|
|
14
16
|
/**
|
|
15
17
|
* Internal helper: Set decision without wrapping in transaction
|
|
16
18
|
* Used by setDecision (with transaction) and setDecisionBatch (manages its own transaction)
|
|
@@ -22,6 +24,8 @@ import { debugLogFunctionEntry, debugLogFunctionExit, debugLogTransaction, debug
|
|
|
22
24
|
*/
|
|
23
25
|
async function setDecisionInternal(params, adapter, trx) {
|
|
24
26
|
const knex = trx || adapter.getKnex();
|
|
27
|
+
// Validate project context (Constraint #29 - fail-fast before mutations)
|
|
28
|
+
const projectId = getProjectContext().getProjectId();
|
|
25
29
|
// Validate required parameters
|
|
26
30
|
const trimmedKey = validateRequired(params.key, 'key');
|
|
27
31
|
if (params.value === undefined || params.value === null) {
|
|
@@ -57,12 +61,13 @@ async function setDecisionInternal(params, adapter, trx) {
|
|
|
57
61
|
const ts = Math.floor(Date.now() / 1000);
|
|
58
62
|
// Check if decision already exists for activity logging
|
|
59
63
|
const existingDecision = await knex(isNumeric ? 't_decisions_numeric' : 't_decisions')
|
|
60
|
-
.where({ key_id: keyId })
|
|
64
|
+
.where({ key_id: keyId, project_id: projectId })
|
|
61
65
|
.first();
|
|
62
66
|
// Insert or update decision based on value type
|
|
63
67
|
const tableName = isNumeric ? 't_decisions_numeric' : 't_decisions';
|
|
64
68
|
const decisionData = {
|
|
65
69
|
key_id: keyId,
|
|
70
|
+
project_id: projectId,
|
|
66
71
|
value: isNumeric ? value : String(value),
|
|
67
72
|
agent_id: agentId,
|
|
68
73
|
layer_id: layerId,
|
|
@@ -71,7 +76,7 @@ async function setDecisionInternal(params, adapter, trx) {
|
|
|
71
76
|
ts: ts
|
|
72
77
|
};
|
|
73
78
|
// Use transaction-aware upsert instead of adapter.upsert to avoid connection pool timeout
|
|
74
|
-
const conflictColumns = ['key_id'];
|
|
79
|
+
const conflictColumns = ['key_id', 'project_id'];
|
|
75
80
|
const updateColumns = Object.keys(decisionData).filter(key => !conflictColumns.includes(key));
|
|
76
81
|
const updateData = updateColumns.reduce((acc, col) => {
|
|
77
82
|
acc[col] = decisionData[col];
|
|
@@ -116,24 +121,36 @@ async function setDecisionInternal(params, adapter, trx) {
|
|
|
116
121
|
if (params.tags && params.tags.length > 0) {
|
|
117
122
|
// Parse tags (handles both arrays and JSON strings from MCP)
|
|
118
123
|
const tags = parseStringArray(params.tags);
|
|
119
|
-
// Clear existing tags
|
|
120
|
-
await knex('t_decision_tags')
|
|
124
|
+
// Clear existing tags for this project
|
|
125
|
+
await knex('t_decision_tags')
|
|
126
|
+
.where({ decision_key_id: keyId, project_id: projectId })
|
|
127
|
+
.delete();
|
|
121
128
|
// Insert new tags
|
|
122
129
|
for (const tagName of tags) {
|
|
123
130
|
const tagId = await getOrCreateTag(adapter, tagName, trx);
|
|
124
|
-
await knex('t_decision_tags').insert({
|
|
131
|
+
await knex('t_decision_tags').insert({
|
|
132
|
+
decision_key_id: keyId,
|
|
133
|
+
tag_id: tagId,
|
|
134
|
+
project_id: projectId
|
|
135
|
+
});
|
|
125
136
|
}
|
|
126
137
|
}
|
|
127
138
|
// Handle m_scopes (many-to-many)
|
|
128
139
|
if (params.scopes && params.scopes.length > 0) {
|
|
129
140
|
// Parse scopes (handles both arrays and JSON strings from MCP)
|
|
130
141
|
const scopes = parseStringArray(params.scopes);
|
|
131
|
-
// Clear existing scopes
|
|
132
|
-
await knex('t_decision_scopes')
|
|
142
|
+
// Clear existing scopes for this project
|
|
143
|
+
await knex('t_decision_scopes')
|
|
144
|
+
.where({ decision_key_id: keyId, project_id: projectId })
|
|
145
|
+
.delete();
|
|
133
146
|
// Insert new scopes
|
|
134
147
|
for (const scopeName of scopes) {
|
|
135
148
|
const scopeId = await getOrCreateScope(adapter, scopeName, trx);
|
|
136
|
-
await knex('t_decision_scopes').insert({
|
|
149
|
+
await knex('t_decision_scopes').insert({
|
|
150
|
+
decision_key_id: keyId,
|
|
151
|
+
scope_id: scopeId,
|
|
152
|
+
project_id: projectId
|
|
153
|
+
});
|
|
137
154
|
}
|
|
138
155
|
}
|
|
139
156
|
return {
|
|
@@ -165,12 +182,14 @@ export async function setDecision(params, adapter) {
|
|
|
165
182
|
const actualAdapter = adapter ?? getAdapter();
|
|
166
183
|
try {
|
|
167
184
|
debugLogTransaction('START', 'setDecision');
|
|
168
|
-
// Use transaction for atomicity
|
|
169
|
-
const result = await
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
185
|
+
// Use transaction for atomicity with connection retry
|
|
186
|
+
const result = await connectionManager.executeWithRetry(async () => {
|
|
187
|
+
return await actualAdapter.transaction(async (trx) => {
|
|
188
|
+
debugLogTransaction('COMMIT', 'setDecision-transaction-begin');
|
|
189
|
+
const internalResult = await setDecisionInternal(params, actualAdapter, trx);
|
|
190
|
+
debugLogTransaction('COMMIT', 'setDecision-transaction-end');
|
|
191
|
+
return internalResult;
|
|
192
|
+
});
|
|
174
193
|
});
|
|
175
194
|
debugLogFunctionExit('setDecision', true, result);
|
|
176
195
|
return result;
|
|
@@ -205,9 +224,31 @@ export async function getContext(params = {}, adapter) {
|
|
|
205
224
|
}
|
|
206
225
|
const actualAdapter = adapter ?? getAdapter();
|
|
207
226
|
const knex = actualAdapter.getKnex();
|
|
227
|
+
// Determine which project to query (current or referenced)
|
|
228
|
+
let projectId;
|
|
229
|
+
if (params._reference_project) {
|
|
230
|
+
// Cross-project query: look up the referenced project
|
|
231
|
+
const refProject = await knex('m_projects')
|
|
232
|
+
.where({ name: params._reference_project })
|
|
233
|
+
.first();
|
|
234
|
+
if (!refProject) {
|
|
235
|
+
throw new Error(`Referenced project "${params._reference_project}" not found`);
|
|
236
|
+
}
|
|
237
|
+
projectId = refProject.id;
|
|
238
|
+
debugLog('INFO', 'Cross-project query', {
|
|
239
|
+
currentProject: getProjectContext().getProjectName(),
|
|
240
|
+
referencedProject: params._reference_project,
|
|
241
|
+
projectId
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
// Normal query: use current project
|
|
246
|
+
projectId = getProjectContext().getProjectId();
|
|
247
|
+
}
|
|
208
248
|
try {
|
|
209
249
|
// Build query dynamically based on filters
|
|
210
|
-
|
|
250
|
+
// NOTE: v_tagged_decisions view will be updated to include project_id filtering
|
|
251
|
+
let query = knex('v_tagged_decisions').where('project_id', projectId);
|
|
211
252
|
// Filter by status
|
|
212
253
|
if (params.status) {
|
|
213
254
|
if (!STRING_TO_STATUS[params.status]) {
|
|
@@ -275,6 +316,8 @@ export async function getDecision(params, adapter) {
|
|
|
275
316
|
}
|
|
276
317
|
const actualAdapter = adapter ?? getAdapter();
|
|
277
318
|
const knex = actualAdapter.getKnex();
|
|
319
|
+
// Validate project context
|
|
320
|
+
const projectId = getProjectContext().getProjectId();
|
|
278
321
|
// Validate parameter
|
|
279
322
|
if (!params.key || params.key.trim() === '') {
|
|
280
323
|
throw new Error('Parameter "key" is required and cannot be empty');
|
|
@@ -282,6 +325,7 @@ export async function getDecision(params, adapter) {
|
|
|
282
325
|
try {
|
|
283
326
|
// If include_context is true, use the context-aware function
|
|
284
327
|
if (params.include_context) {
|
|
328
|
+
// TODO: Update dbGetDecisionWithContext to accept projectId parameter
|
|
285
329
|
const result = await dbGetDecisionWithContext(actualAdapter, params.key);
|
|
286
330
|
if (!result) {
|
|
287
331
|
return {
|
|
@@ -311,7 +355,7 @@ export async function getDecision(params, adapter) {
|
|
|
311
355
|
}
|
|
312
356
|
// Standard query without context (backward compatible)
|
|
313
357
|
const row = await knex('v_tagged_decisions')
|
|
314
|
-
.where({ key: params.key })
|
|
358
|
+
.where({ key: params.key, project_id: projectId })
|
|
315
359
|
.first();
|
|
316
360
|
if (!row) {
|
|
317
361
|
return {
|
|
@@ -346,6 +390,8 @@ export async function searchByTags(params, adapter) {
|
|
|
346
390
|
}
|
|
347
391
|
const actualAdapter = adapter ?? getAdapter();
|
|
348
392
|
const knex = actualAdapter.getKnex();
|
|
393
|
+
// Validate project context
|
|
394
|
+
const projectId = getProjectContext().getProjectId();
|
|
349
395
|
// Validate required parameters
|
|
350
396
|
if (!params.tags || params.tags.length === 0) {
|
|
351
397
|
throw new Error('Parameter "tags" is required and must contain at least one tag');
|
|
@@ -354,7 +400,7 @@ export async function searchByTags(params, adapter) {
|
|
|
354
400
|
// Parse tags (handles both arrays and JSON strings from MCP)
|
|
355
401
|
const tags = parseStringArray(params.tags);
|
|
356
402
|
const matchMode = params.match_mode || 'OR';
|
|
357
|
-
let query = knex('v_tagged_decisions');
|
|
403
|
+
let query = knex('v_tagged_decisions').where('project_id', projectId);
|
|
358
404
|
// Apply tag filtering based on match mode
|
|
359
405
|
if (matchMode === 'AND') {
|
|
360
406
|
// All tags must be present
|
|
@@ -421,6 +467,8 @@ export async function getVersions(params, adapter) {
|
|
|
421
467
|
}
|
|
422
468
|
const actualAdapter = adapter ?? getAdapter();
|
|
423
469
|
const knex = actualAdapter.getKnex();
|
|
470
|
+
// Validate project context
|
|
471
|
+
const projectId = getProjectContext().getProjectId();
|
|
424
472
|
// Validate required parameter
|
|
425
473
|
if (!params.key || params.key.trim() === '') {
|
|
426
474
|
throw new Error('Parameter "key" is required and cannot be empty');
|
|
@@ -442,7 +490,7 @@ export async function getVersions(params, adapter) {
|
|
|
442
490
|
// Query t_decision_history with agent join
|
|
443
491
|
const rows = await knex('t_decision_history as dh')
|
|
444
492
|
.leftJoin('m_agents as a', 'dh.agent_id', 'a.id')
|
|
445
|
-
.where('dh.key_id',
|
|
493
|
+
.where({ 'dh.key_id': keyId, 'dh.project_id': projectId })
|
|
446
494
|
.select('dh.version', 'dh.value', 'a.name as agent_name', knex.raw(`datetime(dh.ts, 'unixepoch') as timestamp`))
|
|
447
495
|
.orderBy('dh.ts', 'desc');
|
|
448
496
|
// Transform to response format
|
|
@@ -481,6 +529,27 @@ export async function searchByLayer(params, adapter) {
|
|
|
481
529
|
}
|
|
482
530
|
const actualAdapter = adapter ?? getAdapter();
|
|
483
531
|
const knex = actualAdapter.getKnex();
|
|
532
|
+
// Determine which project to query (current or referenced)
|
|
533
|
+
let projectId;
|
|
534
|
+
if (params._reference_project) {
|
|
535
|
+
// Cross-project query: look up the referenced project
|
|
536
|
+
const refProject = await knex('m_projects')
|
|
537
|
+
.where({ name: params._reference_project })
|
|
538
|
+
.first();
|
|
539
|
+
if (!refProject) {
|
|
540
|
+
throw new Error(`Referenced project "${params._reference_project}" not found`);
|
|
541
|
+
}
|
|
542
|
+
projectId = refProject.id;
|
|
543
|
+
debugLog('INFO', 'Cross-project searchByLayer', {
|
|
544
|
+
currentProject: getProjectContext().getProjectName(),
|
|
545
|
+
referencedProject: params._reference_project,
|
|
546
|
+
projectId
|
|
547
|
+
});
|
|
548
|
+
}
|
|
549
|
+
else {
|
|
550
|
+
// Normal query: use current project
|
|
551
|
+
projectId = getProjectContext().getProjectId();
|
|
552
|
+
}
|
|
484
553
|
// Validate required parameter
|
|
485
554
|
if (!params.layer || params.layer.trim() === '') {
|
|
486
555
|
throw new Error('Parameter "layer" is required and cannot be empty');
|
|
@@ -502,7 +571,7 @@ export async function searchByLayer(params, adapter) {
|
|
|
502
571
|
if (includeTagsValue) {
|
|
503
572
|
// Use v_tagged_decisions view for full metadata
|
|
504
573
|
rows = await knex('v_tagged_decisions')
|
|
505
|
-
.where({ layer: params.layer, status: statusValue })
|
|
574
|
+
.where({ layer: params.layer, status: statusValue, project_id: projectId })
|
|
506
575
|
.orderBy('updated', 'desc')
|
|
507
576
|
.select('*');
|
|
508
577
|
}
|
|
@@ -515,6 +584,7 @@ export async function searchByLayer(params, adapter) {
|
|
|
515
584
|
.leftJoin('m_agents as a', 'd.agent_id', 'a.id')
|
|
516
585
|
.where('l.name', params.layer)
|
|
517
586
|
.where('d.status', statusInt)
|
|
587
|
+
.where('d.project_id', projectId)
|
|
518
588
|
.select('ck.key', 'd.value', 'd.version', knex.raw(`CASE d.status WHEN 1 THEN 'active' WHEN 2 THEN 'deprecated' WHEN 3 THEN 'draft' END as status`), 'l.name as layer', knex.raw('NULL as tags'), knex.raw('NULL as scopes'), 'a.name as decided_by', knex.raw(`datetime(d.ts, 'unixepoch') as updated`));
|
|
519
589
|
const numericDecisions = knex('t_decisions_numeric as dn')
|
|
520
590
|
.innerJoin('m_context_keys as ck', 'dn.key_id', 'ck.id')
|
|
@@ -522,6 +592,7 @@ export async function searchByLayer(params, adapter) {
|
|
|
522
592
|
.leftJoin('m_agents as a', 'dn.agent_id', 'a.id')
|
|
523
593
|
.where('l.name', params.layer)
|
|
524
594
|
.where('dn.status', statusInt)
|
|
595
|
+
.where('dn.project_id', projectId)
|
|
525
596
|
.select('ck.key', knex.raw('CAST(dn.value AS TEXT) as value'), 'dn.version', knex.raw(`CASE dn.status WHEN 1 THEN 'active' WHEN 2 THEN 'deprecated' WHEN 3 THEN 'draft' END as status`), 'l.name as layer', knex.raw('NULL as tags'), knex.raw('NULL as scopes'), 'a.name as decided_by', knex.raw(`datetime(dn.ts, 'unixepoch') as updated`));
|
|
526
597
|
// Union both queries
|
|
527
598
|
rows = await stringDecisions.union([numericDecisions]).orderBy('updated', 'desc');
|
|
@@ -672,6 +743,8 @@ export async function searchAdvanced(params = {}, adapter) {
|
|
|
672
743
|
validateActionParams('decision', 'search_advanced', params);
|
|
673
744
|
const actualAdapter = adapter ?? getAdapter();
|
|
674
745
|
const knex = actualAdapter.getKnex();
|
|
746
|
+
// Validate project context
|
|
747
|
+
const projectId = getProjectContext().getProjectId();
|
|
675
748
|
try {
|
|
676
749
|
// Parse relative time to Unix timestamp
|
|
677
750
|
const parseRelativeTime = (relativeTime) => {
|
|
@@ -695,7 +768,7 @@ export async function searchAdvanced(params = {}, adapter) {
|
|
|
695
768
|
}
|
|
696
769
|
};
|
|
697
770
|
// Build base query using v_tagged_decisions view
|
|
698
|
-
let query = knex('v_tagged_decisions');
|
|
771
|
+
let query = knex('v_tagged_decisions').where('project_id', projectId);
|
|
699
772
|
// Filter by layers (OR relationship)
|
|
700
773
|
if (params.layers && params.layers.length > 0) {
|
|
701
774
|
query = query.whereIn('layer', params.layers);
|
|
@@ -853,25 +926,27 @@ export async function setDecisionBatch(params, adapter) {
|
|
|
853
926
|
try {
|
|
854
927
|
if (atomic) {
|
|
855
928
|
// Atomic mode: All or nothing
|
|
856
|
-
const results = await
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
929
|
+
const results = await connectionManager.executeWithRetry(async () => {
|
|
930
|
+
return await actualAdapter.transaction(async (trx) => {
|
|
931
|
+
const processedResults = [];
|
|
932
|
+
for (const decision of params.decisions) {
|
|
933
|
+
try {
|
|
934
|
+
const result = await setDecisionInternal(decision, actualAdapter, trx);
|
|
935
|
+
processedResults.push({
|
|
936
|
+
key: decision.key,
|
|
937
|
+
key_id: result.key_id,
|
|
938
|
+
version: result.version,
|
|
939
|
+
success: true,
|
|
940
|
+
error: undefined
|
|
941
|
+
});
|
|
942
|
+
}
|
|
943
|
+
catch (error) {
|
|
944
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
945
|
+
throw new Error(`Batch failed at decision "${decision.key}": ${message}`);
|
|
946
|
+
}
|
|
872
947
|
}
|
|
873
|
-
|
|
874
|
-
|
|
948
|
+
return processedResults;
|
|
949
|
+
});
|
|
875
950
|
});
|
|
876
951
|
return {
|
|
877
952
|
success: true,
|
|
@@ -887,8 +962,10 @@ export async function setDecisionBatch(params, adapter) {
|
|
|
887
962
|
let failed = 0;
|
|
888
963
|
for (const decision of params.decisions) {
|
|
889
964
|
try {
|
|
890
|
-
const result = await
|
|
891
|
-
return await
|
|
965
|
+
const result = await connectionManager.executeWithRetry(async () => {
|
|
966
|
+
return await actualAdapter.transaction(async (trx) => {
|
|
967
|
+
return await setDecisionInternal(decision, actualAdapter, trx);
|
|
968
|
+
});
|
|
892
969
|
});
|
|
893
970
|
results.push({
|
|
894
971
|
key: decision.key,
|
|
@@ -938,6 +1015,8 @@ export async function hasUpdates(params, adapter) {
|
|
|
938
1015
|
validateActionParams('decision', 'has_updates', params);
|
|
939
1016
|
const actualAdapter = adapter ?? getAdapter();
|
|
940
1017
|
const knex = actualAdapter.getKnex();
|
|
1018
|
+
// Validate project context
|
|
1019
|
+
const projectId = getProjectContext().getProjectId();
|
|
941
1020
|
try {
|
|
942
1021
|
// Parse ISO timestamp to Unix epoch
|
|
943
1022
|
const sinceDate = new Date(params.since_timestamp);
|
|
@@ -947,10 +1026,12 @@ export async function hasUpdates(params, adapter) {
|
|
|
947
1026
|
const sinceTs = Math.floor(sinceDate.getTime() / 1000);
|
|
948
1027
|
// Count decisions updated since timestamp (both string and numeric tables)
|
|
949
1028
|
const decisionCount1 = await knex('t_decisions')
|
|
1029
|
+
.where({ project_id: projectId })
|
|
950
1030
|
.where('ts', '>', sinceTs)
|
|
951
1031
|
.count('* as count')
|
|
952
1032
|
.first();
|
|
953
1033
|
const decisionCount2 = await knex('t_decisions_numeric')
|
|
1034
|
+
.where({ project_id: projectId })
|
|
954
1035
|
.where('ts', '>', sinceTs)
|
|
955
1036
|
.count('* as count')
|
|
956
1037
|
.first();
|
|
@@ -973,8 +1054,9 @@ export async function hasUpdates(params, adapter) {
|
|
|
973
1054
|
.first();
|
|
974
1055
|
messagesCount = messageResult?.count || 0;
|
|
975
1056
|
}
|
|
976
|
-
// Count file changes since timestamp
|
|
1057
|
+
// Count file changes since timestamp (project-scoped)
|
|
977
1058
|
const fileResult = await knex('t_file_changes')
|
|
1059
|
+
.where({ project_id: projectId })
|
|
978
1060
|
.where('ts', '>', sinceTs)
|
|
979
1061
|
.count('* as count')
|
|
980
1062
|
.first();
|
|
@@ -1009,10 +1091,12 @@ export async function setFromTemplate(params, adapter) {
|
|
|
1009
1091
|
validateActionParams('decision', 'set_from_template', params);
|
|
1010
1092
|
const actualAdapter = adapter ?? getAdapter();
|
|
1011
1093
|
const knex = actualAdapter.getKnex();
|
|
1094
|
+
// Validate project context
|
|
1095
|
+
const projectId = getProjectContext().getProjectId();
|
|
1012
1096
|
try {
|
|
1013
|
-
// Get template
|
|
1097
|
+
// Get template (templates are project-scoped)
|
|
1014
1098
|
const templateRow = await knex('t_decision_templates')
|
|
1015
|
-
.where({ name: params.template })
|
|
1099
|
+
.where({ name: params.template, project_id: projectId })
|
|
1016
1100
|
.first();
|
|
1017
1101
|
if (!templateRow) {
|
|
1018
1102
|
throw new Error(`Template not found: ${params.template}`);
|
|
@@ -1081,40 +1165,45 @@ export async function createTemplate(params, adapter) {
|
|
|
1081
1165
|
validateActionParams('decision', 'create_template', params);
|
|
1082
1166
|
const actualAdapter = adapter ?? getAdapter();
|
|
1083
1167
|
const knex = actualAdapter.getKnex();
|
|
1168
|
+
// Validate project context (Constraint #29 - fail-fast before mutations)
|
|
1169
|
+
const projectId = getProjectContext().getProjectId();
|
|
1084
1170
|
try {
|
|
1085
|
-
return await
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1171
|
+
return await connectionManager.executeWithRetry(async () => {
|
|
1172
|
+
return await actualAdapter.transaction(async (trx) => {
|
|
1173
|
+
// Validate layer if provided in defaults
|
|
1174
|
+
if (params.defaults.layer) {
|
|
1175
|
+
const layerId = await getLayerId(actualAdapter, params.defaults.layer, trx);
|
|
1176
|
+
if (layerId === null) {
|
|
1177
|
+
throw new Error(`Invalid layer in defaults: ${params.defaults.layer}. Must be one of: presentation, business, data, infrastructure, cross-cutting`);
|
|
1178
|
+
}
|
|
1091
1179
|
}
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1180
|
+
// Validate status if provided in defaults
|
|
1181
|
+
if (params.defaults.status && !STRING_TO_STATUS[params.defaults.status]) {
|
|
1182
|
+
throw new Error(`Invalid status in defaults: ${params.defaults.status}. Must be 'active', 'deprecated', or 'draft'`);
|
|
1183
|
+
}
|
|
1184
|
+
// Get or create agent if creator specified
|
|
1185
|
+
let createdById = null;
|
|
1186
|
+
if (params.created_by) {
|
|
1187
|
+
createdById = await getOrCreateAgent(actualAdapter, params.created_by, trx);
|
|
1188
|
+
}
|
|
1189
|
+
// Serialize defaults and required fields
|
|
1190
|
+
const defaultsJson = JSON.stringify(params.defaults);
|
|
1191
|
+
const requiredFieldsJson = params.required_fields ? JSON.stringify(params.required_fields) : null;
|
|
1192
|
+
// Insert template
|
|
1193
|
+
const [id] = await trx('t_decision_templates').insert({
|
|
1194
|
+
name: params.name,
|
|
1195
|
+
project_id: projectId,
|
|
1196
|
+
defaults: defaultsJson,
|
|
1197
|
+
required_fields: requiredFieldsJson,
|
|
1198
|
+
created_by: createdById
|
|
1199
|
+
});
|
|
1200
|
+
return {
|
|
1201
|
+
success: true,
|
|
1202
|
+
template_id: id,
|
|
1203
|
+
template_name: params.name,
|
|
1204
|
+
message: `Template "${params.name}" created successfully`
|
|
1205
|
+
};
|
|
1111
1206
|
});
|
|
1112
|
-
return {
|
|
1113
|
-
success: true,
|
|
1114
|
-
template_id: id,
|
|
1115
|
-
template_name: params.name,
|
|
1116
|
-
message: `Template "${params.name}" created successfully`
|
|
1117
|
-
};
|
|
1118
1207
|
});
|
|
1119
1208
|
}
|
|
1120
1209
|
catch (error) {
|
|
@@ -1135,9 +1224,12 @@ export async function listTemplates(params = {}, adapter) {
|
|
|
1135
1224
|
validateActionParams('decision', 'list_templates', params);
|
|
1136
1225
|
const actualAdapter = adapter ?? getAdapter();
|
|
1137
1226
|
const knex = actualAdapter.getKnex();
|
|
1227
|
+
// Validate project context
|
|
1228
|
+
const projectId = getProjectContext().getProjectId();
|
|
1138
1229
|
try {
|
|
1139
1230
|
const rows = await knex('t_decision_templates as t')
|
|
1140
1231
|
.leftJoin('m_agents as a', 't.created_by', 'a.id')
|
|
1232
|
+
.where('t.project_id', projectId)
|
|
1141
1233
|
.select('t.id', 't.name', 't.defaults', 't.required_fields', 'a.name as created_by', knex.raw(`datetime(t.ts, 'unixepoch') as created_at`))
|
|
1142
1234
|
.orderBy('t.name', 'asc');
|
|
1143
1235
|
// Parse JSON fields
|
|
@@ -1180,45 +1272,60 @@ export async function hardDeleteDecision(params, adapter) {
|
|
|
1180
1272
|
validateActionParams('decision', 'hard_delete', params);
|
|
1181
1273
|
const actualAdapter = adapter ?? getAdapter();
|
|
1182
1274
|
const knex = actualAdapter.getKnex();
|
|
1275
|
+
// Validate project context (fail-fast)
|
|
1276
|
+
const projectId = getProjectContext().getProjectId();
|
|
1183
1277
|
try {
|
|
1184
|
-
return await
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1278
|
+
return await connectionManager.executeWithRetry(async () => {
|
|
1279
|
+
return await actualAdapter.transaction(async (trx) => {
|
|
1280
|
+
// Get key_id
|
|
1281
|
+
const keyResult = await trx('m_context_keys')
|
|
1282
|
+
.where({ key: params.key })
|
|
1283
|
+
.first('id');
|
|
1284
|
+
if (!keyResult) {
|
|
1285
|
+
// Key doesn't exist - still return success (idempotent)
|
|
1286
|
+
return {
|
|
1287
|
+
success: true,
|
|
1288
|
+
key: params.key,
|
|
1289
|
+
message: `Decision "${params.key}" not found (already deleted or never existed)`
|
|
1290
|
+
};
|
|
1291
|
+
}
|
|
1292
|
+
const keyId = keyResult.id;
|
|
1293
|
+
// SECURITY: All deletes MUST filter by project_id to prevent cross-project deletion
|
|
1294
|
+
// Delete from t_decisions (if exists in this project)
|
|
1295
|
+
const deletedString = await trx('t_decisions')
|
|
1296
|
+
.where({ key_id: keyId, project_id: projectId })
|
|
1297
|
+
.delete();
|
|
1298
|
+
// Delete from t_decisions_numeric (if exists in this project)
|
|
1299
|
+
const deletedNumeric = await trx('t_decisions_numeric')
|
|
1300
|
+
.where({ key_id: keyId, project_id: projectId })
|
|
1301
|
+
.delete();
|
|
1302
|
+
// Delete from t_decision_history (for this project only)
|
|
1303
|
+
const deletedHistory = await trx('t_decision_history')
|
|
1304
|
+
.where({ key_id: keyId, project_id: projectId })
|
|
1305
|
+
.delete();
|
|
1306
|
+
// Delete from t_decision_tags (for this project only)
|
|
1307
|
+
const deletedTags = await trx('t_decision_tags')
|
|
1308
|
+
.where({ decision_key_id: keyId, project_id: projectId })
|
|
1309
|
+
.delete();
|
|
1310
|
+
// Delete from t_decision_scopes (for this project only)
|
|
1311
|
+
const deletedScopes = await trx('t_decision_scopes')
|
|
1312
|
+
.where({ decision_key_id: keyId, project_id: projectId })
|
|
1313
|
+
.delete();
|
|
1314
|
+
// Calculate total deleted records
|
|
1315
|
+
const totalDeleted = deletedString + deletedNumeric + deletedHistory + deletedTags + deletedScopes;
|
|
1316
|
+
if (totalDeleted === 0) {
|
|
1317
|
+
return {
|
|
1318
|
+
success: true,
|
|
1319
|
+
key: params.key,
|
|
1320
|
+
message: `Decision "${params.key}" not found (already deleted or never existed)`
|
|
1321
|
+
};
|
|
1322
|
+
}
|
|
1211
1323
|
return {
|
|
1212
1324
|
success: true,
|
|
1213
1325
|
key: params.key,
|
|
1214
|
-
message: `Decision "${params.key}"
|
|
1326
|
+
message: `Decision "${params.key}" permanently deleted (${totalDeleted} record${totalDeleted === 1 ? '' : 's'})`
|
|
1215
1327
|
};
|
|
1216
|
-
}
|
|
1217
|
-
return {
|
|
1218
|
-
success: true,
|
|
1219
|
-
key: params.key,
|
|
1220
|
-
message: `Decision "${params.key}" permanently deleted (${totalDeleted} record${totalDeleted === 1 ? '' : 's'})`
|
|
1221
|
-
};
|
|
1328
|
+
});
|
|
1222
1329
|
});
|
|
1223
1330
|
}
|
|
1224
1331
|
catch (error) {
|